diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8a7a246443..3236b11f1a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -28,8 +28,19 @@ updates: - "go.uber.org/mock" - package-ecosystem: "cargo" + # Enumerated rather than "**/*" because that glob would also pick up + # offchain/Cargo.toml and solana/Cargo.toml, and no job in this repo builds + # either tree yet. A grouped update would edit their lockfiles, merge green + # with nothing compiled, and diverge them from the repos that still release + # them. These five are every directory that has its own lockfile, which is + # what the glob resolved to before the import. Step 4 folds offchain into + # the root workspace, at which point "/" covers it. directories: - - "**/*" + - "/" + - "/sdk/geolocation/testdata/fixtures/generate-fixtures" + - "/sdk/revdist/testdata/fixtures/generate-fixtures" + - "/sdk/serviceability/testdata/fixtures/generate-fixtures" + - "/sdk/telemetry/testdata/fixtures/generate-fixtures" schedule: interval: "monthly" open-pull-requests-limit: 10 diff --git a/CHANGELOG.md b/CHANGELOG.md index b89376c875..36161ed018 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,8 @@ All notable changes to this project will be documented in this file. - CI - The new `release-bump-dry-run` job dry-runs the release version bump on every PR, so a `cargo update --workspace` dependency rebind fails on the PR that causes it instead of a week later at release time, as it did for v0.37.0 (#4213, fixed in #4219). Advisory until its context is added to the `main` ruleset. (#4220) - Add `.cursor/BUGBOT.md` to enable Cursor review. This is an experiment. (malbeclabs/infra#2387) +- Repo + - `doublezero-offchain` and `doublezero-solana` are imported into this repo, with their history and all 126 of their release tags, under new top-level `offchain/` and `solana/` directories. Nothing that was already here moves. Both trees stay excluded from the root Cargo workspace and keep their own `Cargo.toml`, `Cargo.lock` and `rust-toolchain.toml`, so they build exactly as they did in their own repos, and their workflows do not run yet. Imported commit messages are rewritten so that a reference that meant a pull request in a source repo now names that repo explicitly. `.github/dependabot.yml` enumerates its cargo directories instead of globbing them, so no update lands in a tree this repo does not build. The source repos are still the ones that release. (#4240) - CLI - `doublezero connect` with no mode provisions everything the server's AccessPass authorizes in one run — the IBRL tunnel plus a multicast tunnel joined to the groups or purchased feeds the pass grants — instead of requiring the operator to know their entitlements and issue `connect ibrl` and `connect multicast` separately. Each mode is reported on its own line; one the pass does not cover is skipped with the reason rather than failing the run. The two are attempted independently, so a failure in one keeps the other's work and names the command that finishes the rest, and the run exits non-zero if an attempted mode failed or the pass authorized nothing. Epoch expiry still gates unicast only, so an expired pass connects multicast and skips IBRL. The bare form also enables the reconciler up front, so a run that provisions nothing still leaves the daemon managing tunnels, and takes `--tenant`/`--allocate-addr` for its IBRL half (`connect ibrl` keeps its own positional tenant and `-a`). `connect ibrl` and `connect multicast` are unchanged. - `doublezero balance` takes an optional address, so `doublezero balance ` reports that account's balance while the bare form keeps reporting the configured keypair's. Querying another account needs no local keypair. An address that was never funded prints `0 Credits` instead of failing the account lookup. diff --git a/Cargo.toml b/Cargo.toml index ff19ed9120..f39dfc0de1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,10 @@ members = [ ] default-members = [] exclude = [ + # Both trees keep their own workspace, lockfile and toolchain until step 4 + # of the monorepo migration merges them in. + "offchain", + "solana", "sdk/revdist/testdata/fixtures/generate-fixtures", "sdk/serviceability/testdata/fixtures/generate-fixtures", "sdk/telemetry/testdata/fixtures/generate-fixtures", diff --git a/offchain/.githooks/pre-commit b/offchain/.githooks/pre-commit new file mode 100755 index 0000000000..a62ddc6a7d --- /dev/null +++ b/offchain/.githooks/pre-commit @@ -0,0 +1,176 @@ +#!/bin/bash + +# Pre-commit hook: +# 1. Checks CHANGELOG.md is updated when files in a crate/directory change +# 2. Runs Rust checks (fmt, clippy) when Rust files change +# 3. Runs Elixir checks (compile warnings, format, credo, tests) when Elixir files change +# +# To install this hook, run from the repo root: +# git config core.hooksPath .githooks +# +# Or to skip the check for a specific commit: +# git commit --no-verify + +set -e + +# Get list of staged files (excluding deleted files) +STAGED_FILES=$(git diff --cached --name-only --diff-filter=d) + +if [ -z "$STAGED_FILES" ]; then + exit 0 +fi + +# ─── Rust checks ──────────────────────────────────────────────────────────────── +HAS_RUST_CHANGES=false +for file in $STAGED_FILES; do + if [[ "$file" == *.rs ]] || [[ "$file" == "Cargo.toml" ]] || [[ "$file" == "Cargo.lock" ]]; then + HAS_RUST_CHANGES=true + break + fi +done + +if [ "$HAS_RUST_CHANGES" = true ]; then + echo "🦀 Rust changes detected — running checks..." + + echo " → just fmt-check" + if ! just fmt-check 2>&1; then + echo "" + echo "❌ Rust formatting check failed. Run 'just fmt' to fix." + exit 1 + fi + + echo " → just clippy" + if ! just clippy 2>&1; then + echo "" + echo "❌ Clippy found warnings/errors." + exit 1 + fi + + echo "✅ Rust checks passed." + echo "" +fi + +# ─── Elixir checks ───────────────────────────────────────────────────────────── +HAS_ELIXIR_CHANGES=false +for file in $STAGED_FILES; do + if [[ "$file" == scheduler/*.ex ]] || [[ "$file" == scheduler/*.exs ]] || [[ "$file" == scheduler/mix.exs ]] || [[ "$file" == scheduler/mix.lock ]]; then + HAS_ELIXIR_CHANGES=true + break + fi +done + +if [ "$HAS_ELIXIR_CHANGES" = true ]; then + echo "💧 Elixir changes detected — running checks..." + + echo " → just elixir-compile" + if ! just elixir-compile 2>&1; then + echo "" + echo "❌ Elixir compilation has warnings. Fix them before committing." + exit 1 + fi + + echo " → just elixir-fmt-check" + if ! just elixir-fmt-check 2>&1; then + echo "" + echo "❌ Elixir formatting check failed. Run 'just elixir-fmt' to fix." + exit 1 + fi + + echo " → just elixir-credo" + if ! just elixir-credo 2>&1; then + echo "" + echo "❌ Credo found issues." + exit 1 + fi + + echo " → just elixir-test" + if ! just elixir-test 2>&1; then + echo "" + echo "❌ Elixir tests failed." + exit 1 + fi + + echo "✅ Elixir checks passed." + echo "" +fi + +# Determine the base branch to compare against +# Try main first, then master, then fall back to HEAD~1 +if git rev-parse --verify origin/main >/dev/null 2>&1; then + BASE_BRANCH="origin/main" +elif git rev-parse --verify main >/dev/null 2>&1; then + BASE_BRANCH="main" +elif git rev-parse --verify origin/master >/dev/null 2>&1; then + BASE_BRANCH="origin/master" +elif git rev-parse --verify master >/dev/null 2>&1; then + BASE_BRANCH="master" +else + BASE_BRANCH="HEAD~1" +fi + +# Get the merge base (common ancestor) between current branch and base +MERGE_BASE=$(git merge-base HEAD "$BASE_BRANCH" 2>/dev/null || echo "") + +# Get list of files changed in the branch (from merge base to HEAD, plus staged changes) +if [ -n "$MERGE_BASE" ]; then + BRANCH_FILES=$(git diff --name-only "$MERGE_BASE" HEAD 2>/dev/null || echo "") +else + BRANCH_FILES="" +fi + +# Find all directories that have a CHANGELOG.md +CHANGELOG_DIRS=$(find . -name "CHANGELOG.md" -type f | sed 's|/CHANGELOG.md$||' | sed 's|^\./||' | sort -u) + +# Track which changelog directories have changes but no changelog update +MISSING_CHANGELOGS=() + +for changelog_dir in $CHANGELOG_DIRS; do + # Check if any staged file is in this directory (but not the changelog itself) + has_changes=false + changelog_updated_staged=false + changelog_updated_branch=false + + # Check staged files + for file in $STAGED_FILES; do + # Check if file is in this changelog directory + if [[ "$file" == "$changelog_dir/"* ]]; then + if [[ "$file" == "$changelog_dir/CHANGELOG.md" ]]; then + changelog_updated_staged=true + else + has_changes=true + fi + fi + done + + # Check if changelog was updated elsewhere in the branch + for file in $BRANCH_FILES; do + if [[ "$file" == "$changelog_dir/CHANGELOG.md" ]]; then + changelog_updated_branch=true + break + fi + done + + # If there are changes but changelog wasn't updated (in staged or branch), add to missing list + if [ "$has_changes" = true ] && [ "$changelog_updated_staged" = false ] && [ "$changelog_updated_branch" = false ]; then + MISSING_CHANGELOGS+=("$changelog_dir") + fi +done + +# Report missing changelog updates +if [ ${#MISSING_CHANGELOGS[@]} -gt 0 ]; then + echo "" + echo "❌ CHANGELOG.md not updated for the following directories:" + echo "" + for dir in "${MISSING_CHANGELOGS[@]}"; do + echo " • $dir/CHANGELOG.md" + done + echo "" + echo "Please update the relevant CHANGELOG.md file(s) with your changes." + echo "" + echo "To skip this check (use sparingly):" + echo " git commit --no-verify" + echo "" + exit 1 +fi + +exit 0 diff --git a/offchain/.github/pull_request_template.md b/offchain/.github/pull_request_template.md new file mode 100644 index 0000000000..ded953873b --- /dev/null +++ b/offchain/.github/pull_request_template.md @@ -0,0 +1,9 @@ +## Summary of Changes +* Describe what changed in the PR +* Explain why the change is necessary +* Note any metrics that were exposed in this PR +* Is there supporting documentation or external resources that explain the change? +* Is a CHANGELOG.md update needed? + +## Testing Verification +* Show evidence of testing the change diff --git a/offchain/.github/workflows/changelog-reminder.yml b/offchain/.github/workflows/changelog-reminder.yml new file mode 100644 index 0000000000..7d0518e31d --- /dev/null +++ b/offchain/.github/workflows/changelog-reminder.yml @@ -0,0 +1,79 @@ +name: changelog-reminder + +on: + pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] + +jobs: + changelog: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: check-changelogs + run: | + set -euo pipefail + + if echo "${{ toJson(github.event.pull_request.labels.*.name) }}" | grep -q "skip-changelog"; then + echo "skip-changelog label present; passing without requiring changelog updates." + exit 0 + fi + + base_branch="${GITHUB_BASE_REF:-}" + + if [ -z "$base_branch" ]; then + default_remote_head=$(git symbolic-ref --short refs/remotes/origin/HEAD) + base_branch="${default_remote_head#origin/}" + fi + + git fetch origin "$base_branch" + + base_ref="origin/$base_branch" + head_ref="HEAD" + + changed_files=$(git diff --name-only "$base_ref"..."$head_ref") + + projects=( + "crates/contributor-rewards::crates/contributor-rewards/CHANGELOG.md" + "crates/scheduled-command::crates/scheduled-command/CHANGELOG.md" + "crates/sentinel::crates/sentinel/CHANGELOG.md" + "crates/slack-notifier::crates/slack-notifier/CHANGELOG.md" + "crates/solana-admin-cli/passport::crates/solana-admin-cli/passport/CHANGELOG.md" + "crates/solana-admin-cli/revenue-distribution::crates/solana-admin-cli/revenue-distribution/CHANGELOG.md" + "crates/solana-admin-cli/sol-conversion::crates/solana-admin-cli/sol-conversion/CHANGELOG.md" + "crates/solana-cli::crates/solana-cli/CHANGELOG.md" + "crates/solana-client-tools::crates/solana-client-tools/CHANGELOG.md" + "crates/solana-fork::crates/solana-fork/CHANGELOG.md" + "crates/solana-interface/sol-conversion::crates/solana-interface/sol-conversion/CHANGELOG.md" + "crates/validator-debt::crates/validator-debt/CHANGELOG.md" + "scheduler::scheduler/CHANGELOG.md" + ) + + missing=() + + for entry in "${projects[@]}"; do + subdir=${entry%%::*} + changelog=${entry##*::} + + if echo "$changed_files" | grep -q "^${subdir}/"; then + if ! echo "$changed_files" | grep -q "^${changelog}$"; then + missing+=("$subdir (expected ${changelog})") + fi + fi + done + + if [ ${#missing[@]} -eq 0 ]; then + exit 0 + fi + + echo "The following subprojects changed but their changelog was not updated:" + for m in "${missing[@]}"; do + echo " - $m" + done + + echo + echo "If this change intentionally does not require a changelog, add the 'skip-changelog' label to the PR." + exit 1 diff --git a/offchain/.github/workflows/ci.yml b/offchain/.github/workflows/ci.yml new file mode 100644 index 0000000000..592fdebe8b --- /dev/null +++ b/offchain/.github/workflows/ci.yml @@ -0,0 +1,87 @@ +name: CI + +on: + pull_request: + branches: [main] + push: + branches: [main] + tags: ["*"] + +jobs: + rust: + runs-on: ubuntu-latest + steps: + - name: Setup | Cancel previous runs + uses: styfle/cancel-workflow-action@0.12.1 + + - name: Setup | Checkout + uses: actions/checkout@v4 + + - name: Check disk space before cleanup + run: df -h + + - name: Free disk space + run: | + sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL + sudo docker image prune --all --force + sudo docker builder prune -a --force + + - name: Check disk space after cleanup + run: df -h + + - name: Setup | Apt packages + run: sudo apt-get update + + - name: Setup | Rust toolchain from rust-toolchain.toml + run: | + rustup toolchain install + rustup component add llvm-tools-preview + + - name: Setup | Rust cache + uses: Swatinem/rust-cache@v2 + + - name: Setup | Install cargo-nextest + uses: taiki-e/install-action@nextest + + - name: Setup | Install cargo-llvm-cov + uses: taiki-e/install-action@cargo-llvm-cov + + - name: Setup | Just + uses: taiki-e/install-action@just + + - name: Test | CI Pipeline + run: just ci + + # All four release components ship as static musl binaries so they load on + # any Linux regardless of the host glibc version. Build each package + # individually (as goreleaser does, so feature unification matches the + # release) and assert every binary is fully static. + rust-musl-static: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup | Rust toolchain from rust-toolchain.toml + run: rustup toolchain install + - uses: Swatinem/rust-cache@v2 + - name: Install musl toolchain + run: sudo apt-get update && sudo apt-get install -y musl-tools cmake + - name: Build release packages for musl and assert static linkage + env: + CC_x86_64_unknown_linux_musl: musl-gcc + CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER: musl-gcc + run: | + for entry in \ + doublezero-solana-cli:doublezero-solana \ + doublezero-contributor-rewards:doublezero-contributor-rewards \ + doublezero-ledger-sentinel:doublezero-sentinel \ + doublezero-solana-validator-debt:doublezero-solana-validator-debt + do + package="${entry%%:*}" + binary="target/x86_64-unknown-linux-musl/release/${entry##*:}" + cargo build --release --package "$package" --target x86_64-unknown-linux-musl + file "$binary" + if ! file "$binary" | grep -qE "statically linked|static-pie linked"; then + echo "::error::$binary is not statically linked" + exit 1 + fi + done diff --git a/offchain/.github/workflows/local-validator.yml b/offchain/.github/workflows/local-validator.yml new file mode 100644 index 0000000000..a023377241 --- /dev/null +++ b/offchain/.github/workflows/local-validator.yml @@ -0,0 +1,153 @@ +name: local-validator +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + SOLANA_CLI: v3.0.12 + +jobs: + test-doublezero-solana-fork: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Check disk space before cleanup + run: df -h + + - name: Free disk space + run: | + sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL + sudo docker image prune --all --force + sudo docker builder prune -a --force + + - name: Check disk space after cleanup + run: df -h + + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - name: Solana toolchain + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/$SOLANA_CLI/install)" + echo "$HOME/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH + - name: Generate ~/.config/solana/id.json + run: solana-keygen new --silent --no-bip39-passphrase + - name: Generate manager keypair for synthetic ValidatorClientRewards + run: solana-keygen new --silent --no-bip39-passphrase -o manager_keypair.json + - name: Start Solana mainnet-beta fork in background + run: | + MANAGER_PUBKEY=$(solana address -k manager_keypair.json) + cargo run --bin doublezero-solana-fork -- -um --reset --synthetic-validator-client-rewards-manager "$MANAGER_PUBKEY" > /dev/null 2>&1 & + - name: Build `doublezero-solana` + run: cargo build --bin doublezero-solana + - name: Run `doublezero-solana` tests + run: bash sh/test_doublezero_solana_fork.sh + + test-doublezero-solana-validator-debt-fork-current: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Check disk space before cleanup + run: df -h + + - name: Free disk space + run: | + sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL + sudo docker image prune --all --force + sudo docker builder prune -a --force + + - name: Check disk space after cleanup + run: df -h + + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - name: Solana toolchain + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/$SOLANA_CLI/install)" + echo "$HOME/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH + - name: Generate ~/.config/solana/id.json + run: solana-keygen new --silent --no-bip39-passphrase + - name: Start Solana mainnet-beta fork in background + run: cargo run --bin doublezero-solana-fork -- -um --reset --god-mode > /dev/null 2>&1 & + - name: Build `doublezero-revenue-distribution-admin` and `doublezero-solana-validator-debt` + run: cargo build --bin doublezero-revenue-distribution-admin --bin doublezero-solana-validator-debt --bin doublezero-solana + - name: Run `doublezero-solana-validator-debt` tests + run: bash sh/test_validator_debt_fork.sh + +# Commenting out as we may bring this back in the future + # test-full-debt-flow: + # runs-on: ubuntu-latest + # needs: [test-doublezero-solana-validator-debt-fork-current] + # steps: + # - uses: actions/checkout@v4 + + # - name: Check disk space before cleanup + # run: df -h + + # - name: Free disk space + # run: | + # sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL + # sudo docker image prune --all --force + # sudo docker builder prune -a --force + + # - name: Check disk space after cleanup + # run: df -h + + # - uses: dtolnay/rust-toolchain@stable + # - uses: Swatinem/rust-cache@v2 + # - name: Solana toolchain + # run: | + # sh -c "$(curl -sSfL https://release.anza.xyz/$SOLANA_CLI/install)" + # echo "$HOME/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH + # - name: Generate ~/.config/solana/id.json + # run: solana-keygen new --silent --no-bip39-passphrase + # - name: Build binaries + # run: | + # cargo build --bin doublezero-solana \ + # --bin doublezero-solana-validator-debt \ + # --bin doublezero-revenue-distribution-admin \ + # --bin doublezero-solana-fork + # - name: Start Solana mainnet-beta fork in background + # run: cargo run --bin doublezero-solana-fork -- -um --reset --god-mode > /dev/null 2>&1 & + # - name: Run full debt flow test + # run: CI=1 SKIP_FORK_START=1 bash sh/test_full_debt_flow.sh + # timeout-minutes: 10 + # - name: Run Rust integration tests + # run: cargo test --features integration -p doublezero-solana-validator-debt + # timeout-minutes: 5 + + test-doublezero-solana-validator-debt-fork-override-76: + if: false + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Check disk space before cleanup + run: df -h + + - name: Free disk space + run: | + sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL + sudo docker image prune --all --force + sudo docker builder prune -a --force + + - name: Check disk space after cleanup + run: df -h + + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - name: Solana toolchain + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/$SOLANA_CLI/install)" + echo "$HOME/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH + - name: Generate ~/.config/solana/id.json + run: solana-keygen new --silent --no-bip39-passphrase + - name: Start Solana mainnet-beta fork in background + run: cargo run --bin doublezero-solana-fork -- -um --reset --god-mode --next-completed-dz-epoch-override 76 > /dev/null 2>&1 & + - name: Build `doublezero-revenue-distribution-admin` and `doublezero-solana-validator-debt` + run: cargo build --bin doublezero-revenue-distribution-admin --bin doublezero-solana-validator-debt + - name: Run `doublezero-solana-validator-debt` tests + run: bash sh/test_validator_debt_fork.sh diff --git a/offchain/.github/workflows/release.contributor-rewards.yml b/offchain/.github/workflows/release.contributor-rewards.yml new file mode 100644 index 0000000000..81665783be --- /dev/null +++ b/offchain/.github/workflows/release.contributor-rewards.yml @@ -0,0 +1,41 @@ +name: releaser.contributor-rewards + +on: + push: + tags: + - "contributor-rewards/v*.*.*" + +permissions: + contents: write + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: Swatinem/rust-cache@v2 + with: + cache-targets: | + target + target/x86_64-unknown-linux-musl/release + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.92.0 + targets: x86_64-unknown-linux-musl + - name: Install dependencies for rpm packaging and musl static build + run: | + sudo apt update + sudo apt install squashfs-tools rpm musl-tools cmake -y + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + distribution: goreleaser-pro + args: release -f release/.goreleaser.contributor-rewards.yaml --clean + env: + SERVICEABILITY_PROGRAM_ID: devnet + SLACK_WEBHOOK: ${{ secrets.SLACK_BOTS_WEBHOOK }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} + CLOUDSMITH_TOKEN: ${{ secrets.CLOUDSMITH_TOKEN }} diff --git a/offchain/.github/workflows/release.doublezero-solana-cli.yml b/offchain/.github/workflows/release.doublezero-solana-cli.yml new file mode 100644 index 0000000000..daa545177b --- /dev/null +++ b/offchain/.github/workflows/release.doublezero-solana-cli.yml @@ -0,0 +1,41 @@ +name: releaser.doublezero-solana + +on: + push: + tags: + - "doublezero-solana/v*.*.*" + +permissions: + contents: write + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: Swatinem/rust-cache@v2 + with: + cache-targets: | + target + target/x86_64-unknown-linux-musl/release + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.92.0 + targets: x86_64-unknown-linux-musl + - name: Install dependencies for rpm packaging and musl static build + run: | + sudo apt update + sudo apt install squashfs-tools rpm musl-tools cmake -y + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + distribution: goreleaser-pro + args: release -f release/.goreleaser.doublezero-solana-cli.yaml --clean + env: + SERVICEABILITY_PROGRAM_ID: devnet + SLACK_WEBHOOK: ${{ secrets.SLACK_BOTS_WEBHOOK }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} + CLOUDSMITH_TOKEN: ${{ secrets.CLOUDSMITH_TOKEN }} diff --git a/offchain/.github/workflows/release.scheduler.yml b/offchain/.github/workflows/release.scheduler.yml new file mode 100644 index 0000000000..ecd9b1cfdd --- /dev/null +++ b/offchain/.github/workflows/release.scheduler.yml @@ -0,0 +1,84 @@ +name: releaser.offchain-scheduler + +on: + push: + tags: + - "offchain-scheduler/v*.*.*" + +permissions: + contents: write + +jobs: + goreleaser: + runs-on: ubuntu-latest + strategy: + matrix: + platform: [linux/amd64] + steps: + - name: Set platform + run: echo "Running on ${{ matrix.platform }}" + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install dependencies + run: | + sudo apt update + sudo apt-get install -y pkg-config libssl-dev openssl + + - name: Set up Elixir and Erlang + uses: erlef/setup-beam@v1 + with: + elixir-version: "1.19.3" + otp-version: "28.1" + + - name: Cache deps + id: cache-deps + uses: actions/cache@v3 + env: + cache-name: cache-elixir-deps + with: + path: deps + key: mix-${{ env.cache-name }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + mix-${{ env.cache-name }}- + + - name: Cache compiled build + id: cache-build + uses: actions/cache@v3 + env: + cache-name: cache-compiled-build + with: + path: _build + key: mix-${{ env.cache-name }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + mix-${{ env.cache-name }}- + ${{ runner.os }}-mix- + + - name: Install deps + working-directory: scheduler + run: mix deps.get + + - name: Compile (warnings as errors) + working-directory: scheduler + run: mix compile --warnings-as-errors + + - name: Credo + working-directory: scheduler + run: mix credo --strict + + - name: Tests + working-directory: scheduler + run: mix test --cover + + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + distribution: goreleaser-pro + args: release -f release/.goreleaser.doublezero-offchain-scheduler.yaml --clean --verbose + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_BOTS_WEBHOOK }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} + CLOUDSMITH_TOKEN: ${{ secrets.CLOUDSMITH_TOKEN }} + SCHEDULER_HTTP_PORT: 8080 diff --git a/offchain/.github/workflows/release.sentinel.yml b/offchain/.github/workflows/release.sentinel.yml new file mode 100644 index 0000000000..7e4b8e11f9 --- /dev/null +++ b/offchain/.github/workflows/release.sentinel.yml @@ -0,0 +1,40 @@ +name: releaser.sentinel + +on: + push: + tags: + - "sentinel/v*.*.*" + +permissions: + contents: write + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: Swatinem/rust-cache@v2 + with: + cache-targets: | + target + target/x86_64-unknown-linux-musl/release + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.92.0 + targets: x86_64-unknown-linux-musl + - name: Install dependencies for rpm packaging and musl static build + run: | + sudo apt update + sudo apt install squashfs-tools rpm musl-tools cmake -y + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + distribution: goreleaser-pro + args: release -f release/.goreleaser.sentinel.yaml --clean + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_BOTS_WEBHOOK }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} + CLOUDSMITH_TOKEN: ${{ secrets.CLOUDSMITH_TOKEN }} diff --git a/offchain/.github/workflows/release.solana-validator-debt.yml b/offchain/.github/workflows/release.solana-validator-debt.yml new file mode 100644 index 0000000000..ef56333e8d --- /dev/null +++ b/offchain/.github/workflows/release.solana-validator-debt.yml @@ -0,0 +1,40 @@ +name: releaser.solana-validator-debt + +on: + push: + tags: + - "solana-validator-debt/v*.*.*" + +permissions: + contents: write + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: Swatinem/rust-cache@v2 + with: + cache-targets: | + target + target/x86_64-unknown-linux-musl/release + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.92.0 + targets: x86_64-unknown-linux-musl + - name: Install dependencies for rpm packaging and musl static build + run: | + sudo apt update + sudo apt install squashfs-tools rpm musl-tools cmake -y + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + distribution: goreleaser-pro + args: release -f release/.goreleaser.doublezero-solana-validator-debt.yaml --clean + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_BOTS_WEBHOOK }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} + CLOUDSMITH_TOKEN: ${{ secrets.CLOUDSMITH_TOKEN }} diff --git a/offchain/.gitignore b/offchain/.gitignore new file mode 100644 index 0000000000..98bd47f1fe --- /dev/null +++ b/offchain/.gitignore @@ -0,0 +1,62 @@ + +/target +programs/mock-shred-history-program/target + +# IDE +.vscode + +# Secrets +.env +.envrc +.private +config.toml +mainnet-beta.toml +testnet.toml +devnet.toml + +# Local configuration +config/local.toml +config/*.local.toml +config/*.secret.toml + +# DB +*.db +*.wal + +# Cache directories +cache/ +.cache/ + +# Temporary files +*.tmp +*.bak +*.txt +*.log +*.out +dist/ + +# Local test data +forked-accounts/ +test-data/ +test-ledger/ +*.parquet +*.json.gz +*.info +*.py +*.xml +*.diff +*.csv +*.geojson +*.jsonl +*.duckdb +*.sql +*.gz +.DS_Store +*.state +.tool-versions +crates/contributor-rewards/dry-run-output/ +crates/contributor-rewards/mainnet-beta.config.toml +!crates/contributor-rewards/tests/goldens/make-fixture.py +crates/solana-client-tools/target/ +docs/plans +docs/superpowers diff --git a/offchain/CLAUDE.md b/offchain/CLAUDE.md new file mode 100644 index 0000000000..9116b8eb8a --- /dev/null +++ b/offchain/CLAUDE.md @@ -0,0 +1,52 @@ +# DoubleZero Offchain + +## Code conventions + +### Naming and prose + +- Always write "onchain", never "on-chain". +- **No abbreviations for account or variable names — anywhere.** Spell out `validator_client_rewards`, not `vcr`. `validator_publisher_rewards`, not `vpr`. `shred_distribution`, not `sd`. This applies to source variable names, test bindings, code comments, program logs, PR titles, branch names, commit subjects, and any prose in this codebase. Acronyms that are universally known in the Solana/SPL ecosystem are fine — `tx`, `PDA`, `ATA`, `CPI`, `SPL`, `SVM`, `IDL`. Project-specific shorthand is not — write out the full name even if it appears many times in a single function. +- **Bindings that hold a `Pubkey` end in `_key`.** `manager_ata_key`, `program_config_key`, `validator_client_rewards_key`, and `holding_keys` for a collection. Covers locals, function parameters, and struct fields. An address and the account it names are usually both in scope, and a bare `destination` leaves the reader to work out which one they have. `node_id` keeps its spelling, since the name already denotes an address. +- **The `try_` prefix is reserved for functions returning `Result`.** A fallible-looking function returning `bool` or `Option` takes a plain name (`add_requested_feeds(...) -> bool`, not `try_add_requested_feeds`). Giving an existing function a `Result` return means renaming it to `try_`, and its callers with it. Where an existing `try_`-named function returns something else, treat it as a straggler rather than a pattern to copy. +- **Prose in this repo uses no contractions, no emdashes, and no sentence-chaining semicolons, and American spelling throughout.** Write "do not" rather than "don't", a comma or a period or parentheses rather than an emdash, two sentences rather than one joined by a semicolon, and "behavior" rather than "behaviour". This covers code comments, docstrings, READMEs, CHANGELOG entries, commit subjects, and PR and issue bodies. Semicolons inside a list are fine. The rule is for text you write or substantively change. Existing text, including the older parts of this file, is not worth a cleanup pass. + +### Type annotations + +- **Never** define types anywhere the Rust compiler can infer them. This is non-negotiable and applies everywhere — `let` bindings (source and tests), numeric literals, function-call turbofishes, test helpers, struct field initializers, function arguments. If `let x = ...;` compiles, do not write `let x: Foo = ...;`. If `5_000` compiles, do not write `5_000u16` or `5_000_u32`. If `.collect()` compiles, do not write `.collect::>()`. **In particular, do not write `let mut x: u64 = 0;` — write `let mut x = 0;` and let the first usage drive inference.** Only add annotations when the compiler genuinely cannot infer. When in doubt, write without the annotation and add one only if the compiler asks. +- When the compiler does need a type hint, prefer **turbofish on the call site** (`.collect::>()`, `::try_from(x)`) over annotating the `let` binding (`let xs: Vec<_> = ...`). Turbofish documents the type at the point it is needed; a let-binding annotation hides that intent and decays as the surrounding code changes. + +### Numeric literals + +- **Derive a constant in code, not in a comment.** When a constant is a sum of parts (a byte layout, a size reserve), write the sum with one term per line and a comment naming each term, then pin the total with `const _: () = assert!(NAME == 384);`. A literal carrying its arithmetic in a comment cannot be checked: the terms can fail to add up to it, and a term that changes leaves the literal stale with nothing to catch it. Group a long derivation into named block consts, each with its own assertion, and reference one from another where the same cost appears in both. +- **Annotate per literal, never above a run.** A comment above `3 + 1 + 96 + 32` leaves the reader mapping prose onto numbers by position, and gives no way to tell a wrong mapping from a right one. Break the expression across lines so each literal carries its own comment. +- **Do not pre-multiply, and do not repeat a literal that has a meaning.** `96` for three account keys hides both the count and which three, so write `3 * 32` where the items are interchangeable or one `32` per item where each has a name worth checking. A literal appearing in more than one expression is a constant that has not been named yet. +- Prefer a plain literal whose comment names the field over `size_of::()`. Reach for `size_of::()` where the width follows from a type that could plausibly change, or where the term is a composite no short comment makes obvious. +- All of the above apply in tests exactly as in source. + +### Workspace dependencies + +- **Put required features on the `[workspace.dependencies]` entry, not in a per-crate `{ workspace = true, features = [...] }` override.** Cargo unifies features across a build, so a per-crate feature is not isolated to that crate: every user of that dependency in the same build graph gets it anyway. The override buys no isolation and splits the dependency's feature set across manifests. A feature enabled in one member but missing from the workspace entry is the smell. + +### Comments and docstrings + +- **`///` and `//!` docstrings are reserved for the crate's published API.** For structs, enums, type aliases, and constants that live inside a crate with no published rustdoc consumer, do not write `///` rustdoc on the item or on its fields. Field-level comments that just restate the field name are noise. The type and the field's name should carry the meaning. If a field's behavior or rationale is genuinely non-obvious (cross-variant naming, security-relevant invariants, contract between caller and helper), use a single `//` line comment above the field. Function and method docstrings on internal items are not covered by this rule. Those are fine. + + `///` on a `pub` function or method is allowed only when that item is reachable from the crate root through a `pub` module chain (a `pub` item inside a private submodule is not part of the published surface, so it follows the internal rule). `//!` module-level docs are allowed only on `pub` modules and must be one short line. + +### Error handling + +- **Prefer the `anyhow::Context` trait over the `anyhow!` macro.** Reach for `.context("...")` / `.with_context(|| ...)` rather than `.ok_or_else(|| anyhow!("..."))` on `Option` or `.map_err(|e| anyhow!(e))` on `Result`. For a `Result` (or any `Display + Send + Sync + 'static` error), use `.map_err(anyhow::Error::msg)`. `anyhow!` and `bail!` are reserved for cases where you genuinely need to construct a new error from scratch with no Option/Result to attach context to — `ensure!`/`bail!` for invariant violations are fine. + +### Abstraction discipline + +- **Don't extract a helper function for code that only one caller uses.** Inline it. Helpers earn their keep by deduplicating logic across multiple call sites; a single-call-site helper just hides the work at the cost of an extra hop. The exception is when the helper is itself the unit under test (a parser, math routine, fixture builder being directly verified). Applies to source code, test code, and build/tooling scripts alike. +- **Do not add a new workspace crate without explicit ask.** New top-level crates change the workspace layout, bring CI surface area, and force a decision about naming, dependencies, and feature flags. Before proposing one, ask. If the work fits inside an existing crate (even if the crate's purpose stretches slightly), prefer extending the existing crate. The same rule applies to splitting a crate into multiple crates or merging existing crates. + +### Tests + +- **Every test function name starts with `test_`.** Write `#[test] fn test_()`, not `#[test] fn ()`. Applies to `#[test]`, `#[tokio::test]`, unit tests, and integration tests alike. + +### Zero-copy account reads + +- **Read an account through `SolanaConnection::try_fetch_zero_copy_data_with_commitment::`.** It fetches, checks the discriminator, and checks the layout in one call. Reach for `ZeroCopyAccountOwnedData::from_account` only when the `Account` is already in hand, such as one element of a batched `try_fetch_multiple_accounts`, or when an absent account is an outcome the command reports itself rather than an error, since the helper folds absence into `Err`. `checked_from_bytes_with_discriminator` is for the case where only the bytes are in hand. Do not hand-roll the sequence of `get_account_with_commitment`, `.value`, and a discriminator check. +- **A `.with_context` message must be true for every error its call can return.** `try_fetch_zero_copy_data_with_commitment` returns `Err` for a transport failure, an absent account, and undecodable data alike, so a context reading "not initialized" states a diagnosis the code never established, and it is wrong whenever the RPC is unreachable. Name the read that failed and let the cause chain carry which failure it was. diff --git a/offchain/CONTRIBUTING.md b/offchain/CONTRIBUTING.md new file mode 100644 index 0000000000..41da45dded --- /dev/null +++ b/offchain/CONTRIBUTING.md @@ -0,0 +1,23 @@ +### How to Contribute to this repository + +We value contributions from the community and will do everything we +can go get them reviewed in a timely fashion. If you have code to send +our way or a bug to report: + +- **Contributing Code**: If you have new code or a bug fix, fork this + repo, create a logically-named branch, and [submit a PR against this + repo](https://github.com/malbeclabs/doublezero-offchain). Include a + write up of the PR with details on what it does. + +- **Reporting Bugs**: Open an issue [against this + repo](https://github.com/malbeclabs/doublezero-offchain/issues) with as + much detail as you can. At the very least you'll include steps to + reproduce the problem. + +This project is intended to be a safe, welcoming space for +collaboration, and contributors are expected to adhere to the +[Contributor Covenant Code of +Conduct](http://contributor-covenant.org/). + +Above all, thank you for taking the time to be a part of the DoubleZero +Foundation community. diff --git a/offchain/Cargo.lock b/offchain/Cargo.lock new file mode 100644 index 0000000000..124dcdff75 --- /dev/null +++ b/offchain/Cargo.lock @@ -0,0 +1,12274 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common 0.1.7", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "agave-feature-set" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60d1d6cdea1a6102777bc970c96f5eb80635b097b7bbc0ee8770425fb13e6020" +dependencies = [ + "ahash 0.8.12", + "solana-epoch-schedule", + "solana-hash 3.1.0", + "solana-pubkey 3.0.0", + "solana-sha256-hasher", + "solana-svm-feature-set", +] + +[[package]] +name = "agave-io-uring" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3349bc98a1ee30343b32a6b4d7e6f2a7efe7b65a359d1c638e00cdcff1c0ba" +dependencies = [ + "io-uring", + "libc", + "log", + "slab", + "smallvec", +] + +[[package]] +name = "agave-precompiles" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add43fafbff72439a1a9f3323dd8f3d6ff3cffe926c8e3fe9c79980d620664ab" +dependencies = [ + "agave-feature-set", + "bincode 1.3.3", + "digest 0.10.7", + "ed25519-dalek 1.0.1", + "libsecp256k1", + "openssl", + "sha3", + "solana-ed25519-program", + "solana-message", + "solana-precompile-error", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-secp256k1-program", + "solana-secp256r1-program", +] + +[[package]] +name = "agave-reserved-account-keys" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e42f6eada9c1a059c32fa416f7885c3c85ffe07f3f2b95bdd8ddd0749e918d" +dependencies = [ + "agave-feature-set", + "solana-pubkey 3.0.0", + "solana-sdk-ids", +] + +[[package]] +name = "agave-syscalls" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c23bd4d08321e47b656fdeb5c89106d547f6460c84ace049cc4f676074dd1e54" +dependencies = [ + "bincode 1.3.3", + "libsecp256k1", + "num-traits", + "solana-account", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-bn254", + "solana-clock", + "solana-cpi", + "solana-curve25519", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keccak-hasher", + "solana-loader-v3-interface", + "solana-poseidon", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-sha256-hasher", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-type-overrides", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction-context", + "thiserror 2.0.18", +] + +[[package]] +name = "agave-transaction-view" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf111212dc76970e53eeb7e506b73ed8fa42f4de24f8ceced67b0c56bea730d7" +dependencies = [ + "solana-hash 3.1.0", + "solana-message", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-svm-transaction", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy-rlp" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" +dependencies = [ + "arrayvec", + "bytes", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" + +[[package]] +name = "aquamarine" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" +dependencies = [ + "include_dir", + "itertools 0.10.5", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "arc-swap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash 0.8.12", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe 0.6.0", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint 0.4.8", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint 0.4.8", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.8", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe 0.6.0", + "itertools 0.13.0", + "num-bigint 0.4.8", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.118", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint 0.4.8", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.8", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.8", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash 0.8.12", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe 0.6.0", + "fnv", + "hashbrown 0.15.5", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.8", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.8", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.6", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.6", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.6", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "arrow" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd47f2a6ddc39244bd722a27ee5da66c03369d087b9e024eafdb03e98b98ea7" +dependencies = [ + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-csv", + "arrow-data", + "arrow-ipc", + "arrow-json", + "arrow-ord", + "arrow-row", + "arrow-schema", + "arrow-select", + "arrow-string", +] + +[[package]] +name = "arrow-arith" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c7bbd679c5418b8639b92be01f361d60013c4906574b578b77b63c78356594c" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "num-traits", +] + +[[package]] +name = "arrow-array" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8a4ab47b3f3eac60f7fd31b81e9028fda018607bcc63451aca4f2b755269862" +dependencies = [ + "ahash 0.8.12", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "half", + "hashbrown 0.16.1", + "num-complex 0.4.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-buffer" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d18b89b4c4f4811d0858175e79541fe98e33e18db3b011708bc287b1240593f" +dependencies = [ + "bytes", + "half", + "num-bigint 0.4.8", + "num-traits", +] + +[[package]] +name = "arrow-cast" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "722b5c41dd1d14d0a879a1bce92c6fe33f546101bb2acce57a209825edd075b3" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ord", + "arrow-schema", + "arrow-select", + "atoi", + "base64 0.22.1", + "chrono", + "half", + "lexical-core", + "num-traits", + "ryu", +] + +[[package]] +name = "arrow-csv" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27ddb80a4848e03b1655af496d5ac2563a779e5742fcb48f2ca2e089c9cd2197" +dependencies = [ + "arrow-array", + "arrow-cast", + "arrow-schema", + "chrono", + "csv", + "csv-core", + "regex", +] + +[[package]] +name = "arrow-data" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1683705c63dcf0d18972759eda48489028cbbff67af7d6bef2c6b7b74ab778a" +dependencies = [ + "arrow-buffer", + "arrow-schema", + "half", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-ipc" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf72d04c07229fbf4dbebe7145cac37d7cf7ec582fe705c6b92cb314af096ab" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "flatbuffers", +] + +[[package]] +name = "arrow-json" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84a905f41fedfcd7679813c89a61dc369c0f932b27aa8dcc6aa051cc781a97d" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-schema", + "chrono", + "half", + "indexmap", + "itoa", + "lexical-core", + "memchr", + "num-traits", + "ryu", + "serde_core", + "serde_json", + "simdutf8", +] + +[[package]] +name = "arrow-ord" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "082342947d4e5a2bcccf029a0a0397e21cb3bb8421edd9571d34fb5dd2670256" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", +] + +[[package]] +name = "arrow-row" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a931b520a2a5e22033e01a6f2486b4cdc26f9106b759abeebc320f125e94d7" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "half", +] + +[[package]] +name = "arrow-schema" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4cf0d4a6609679e03002167a61074a21d7b1ad9ea65e462b2c0a97f8a3b2bc6" + +[[package]] +name = "arrow-select" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b320d86a9806923663bb0fd9baa65ecaba81cb0cd77ff8c1768b9716b4ef891" +dependencies = [ + "ahash 0.8.12", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "num-traits", +] + +[[package]] +name = "arrow-string" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b493e99162e5764077e7823e50ba284858d365922631c7aaefe9487b1abd02c2" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "memchr", + "num-traits", + "regex", + "regex-syntax", +] + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-compression" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener 5.4.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "aws-config" +version = "1.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33f815b73a3899c03b380d543532e5865f230dce9678d108dc10732a8682275" +dependencies = [ + "aws-credential-types", + "aws-runtime", + "aws-sdk-sso", + "aws-sdk-ssooidc", + "aws-sdk-sts", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-schema", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "hex", + "http 1.4.2", + "sha1 0.10.6", + "time", + "tokio", + "tracing", + "url", + "zeroize", +] + +[[package]] +name = "aws-credential-types" +version = "1.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f20799b373a1be121fe3005fba0c2090af9411573878f224df44b42727fcaf7" +dependencies = [ + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "zeroize", +] + +[[package]] +name = "aws-lc-rs" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", + "pkg-config", +] + +[[package]] +name = "aws-runtime" +version = "1.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c9b9de216a988dd54b754a82a7660cfe14cee4f6782ae4524470972fa0ccb39" +dependencies = [ + "aws-credential-types", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "bytes-utils", + "fastrand", + "http 0.2.12", + "http 1.4.2", + "http-body 0.4.6", + "http-body 1.0.1", + "percent-encoding", + "pin-project-lite", + "tracing", + "uuid", +] + +[[package]] +name = "aws-sdk-s3" +version = "1.137.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2dd7213994e2ff9382ff100403b78c30d1b74cdfcd8fa9d0d1dc3a94a5c4874" +dependencies = [ + "arc-swap", + "aws-credential-types", + "aws-runtime", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-checksums", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-observability", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-smithy-xml", + "aws-types", + "bytes", + "fastrand", + "hex", + "hmac 0.13.0", + "http 0.2.12", + "http 1.4.2", + "http-body 1.0.1", + "lru 0.16.4", + "percent-encoding", + "regex-lite", + "sha2 0.11.0", + "tracing", + "url", +] + +[[package]] +name = "aws-sdk-sso" +version = "1.102.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c82b3ac19f1431854f7ace3a7531674633e286bfdde21976893bfee36fd493b" +dependencies = [ + "arc-swap", + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-observability", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http 0.2.12", + "http 1.4.2", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-ssooidc" +version = "1.104.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321000d2b4c5519ee573f73167f612efd7329322d9b26969ad1979f0427f1913" +dependencies = [ + "arc-swap", + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-observability", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http 0.2.12", + "http 1.4.2", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-sts" +version = "1.107.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0d328ba962af23ecfa3c9f23b98d3d35e325fa218d7f13d17a6bf522f8a560" +dependencies = [ + "arc-swap", + "aws-credential-types", + "aws-runtime", + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-observability", + "aws-smithy-query", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-smithy-xml", + "aws-types", + "fastrand", + "http 0.2.12", + "http 1.4.2", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sigv4" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bae38512beae0ffee7010fc24e7a8a123c53efdfef42a61e80fda4882418dc71" +dependencies = [ + "aws-credential-types", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "crypto-bigint", + "form_urlencoded", + "hex", + "hmac 0.13.0", + "http 0.2.12", + "http 1.4.2", + "p256", + "percent-encoding", + "sha2 0.11.0", + "subtle", + "time", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-async" +version = "1.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffcaf626bdda484571968400c326a244598634dc75fd451325a54ad1a59acfc" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.64.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e8e65f4f81fcccdeb6c3eca2af17ac21d421a1786a26a394aecf421d616d3a" +dependencies = [ + "aws-smithy-http", + "aws-smithy-types", + "bytes", + "crc-fast", + "hex", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "md-5", + "pin-project-lite", + "sha1 0.11.0", + "sha2 0.11.0", + "tracing", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.60.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78d8391e65fcea47c586a22e1a41f173b38615b112b2c6b7a44e80cec3e6b706" +dependencies = [ + "aws-smithy-types", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-http" +version = "0.63.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1ab2dc1c2c3749ead27180d333c42f11be8b0e934058fb4b2258ee8dbe5231" +dependencies = [ + "aws-smithy-eventstream", + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "bytes-utils", + "futures-core", + "futures-util", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + +[[package]] +name = "aws-smithy-http-client" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3ef8931ad1c98aa6a55b4256f847f3116090819844e0dd41ea682cac5dd2d3" +dependencies = [ + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "h2 0.3.27", + "h2 0.4.15", + "http 0.2.12", + "http 1.4.2", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper 1.10.1", + "hyper-rustls 0.24.2", + "hyper-rustls 0.27.9", + "hyper-util", + "pin-project-lite", + "rustls 0.21.12", + "rustls 0.23.41", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tower", + "tracing", +] + +[[package]] +name = "aws-smithy-json" +version = "0.62.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "701a947f4797e52a911e114a898667c746c39feea467bbd1abd7b3721f702ffa" +dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-schema", + "aws-smithy-types", +] + +[[package]] +name = "aws-smithy-observability" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06c2315d173edbf1920da8ba3a7189695827002e4c0fc961973ab1c54abca9c" +dependencies = [ + "aws-smithy-runtime-api", +] + +[[package]] +name = "aws-smithy-query" +version = "0.60.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a56d79744fb3edb5d722ef79d86081e121d3b9422cb209eb03aea6aa4f21ebd" +dependencies = [ + "aws-smithy-types", + "urlencoding", +] + +[[package]] +name = "aws-smithy-runtime" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e6f5caf6fea86f8c2206541ab5857cfcda9013426cdbe8fa0098b9e2d32182" +dependencies = [ + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-http-client", + "aws-smithy-observability", + "aws-smithy-runtime-api", + "aws-smithy-schema", + "aws-smithy-types", + "bytes", + "fastrand", + "http 0.2.12", + "http 1.4.2", + "http-body 0.4.6", + "http-body 1.0.1", + "http-body-util", + "pin-project-lite", + "pin-utils", + "tokio", + "tracing", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9db177daa6ba8afb9ee1aefcf548c907abcf52065e394ee11a92780057fe0e8c" +dependencies = [ + "aws-smithy-async", + "aws-smithy-runtime-api-macros", + "aws-smithy-types", + "bytes", + "http 0.2.12", + "http 1.4.2", + "pin-project-lite", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-runtime-api-macros" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d7396fd9500589e62e460e987ecb671bad374934e55ec3b5f498cc7a8a8a7b7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "aws-smithy-schema" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7442cb268338f0eb8278140a107c046756aa01093d8ef5e99628d34ae09c94f5" +dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-types", + "http 1.4.2", +] + +[[package]] +name = "aws-smithy-types" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b42fcf341259d85ca10fac9a2f6448a8ec691c6955a18e45bc3b71a85fab85" +dependencies = [ + "base64-simd", + "bytes", + "bytes-utils", + "futures-core", + "http 0.2.12", + "http 1.4.2", + "http-body 0.4.6", + "http-body 1.0.1", + "http-body-util", + "itoa", + "num-integer", + "pin-project-lite", + "pin-utils", + "ryu", + "serde", + "time", + "tokio", + "tokio-util 0.7.18", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.60.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce02add1aa3677d022f8adf81dcbe3046a95f17a1b1e8979c145cd21d3d22b3" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-types" +version = "1.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16bf10b03a3c01e6b3b7d47cd964e873ffe9e7d4e80fad16bd4c077cb068531" +dependencies = [ + "aws-credential-types", + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-schema", + "aws-smithy-types", + "rustc_version 0.4.1", + "tracing", +] + +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand", + "gloo-timers", + "tokio", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "borsh" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" +dependencies = [ + "borsh-derive", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8fb4fb5740e4b2c4884ff95f5f32f5e8479db1e8fd8eb49ddbe09eb09bb7c" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "borsh-incremental" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0faa79093f85698e0075c813bf87c52044e832e1f9baa5cb0f126e4c2b2d29dd" +dependencies = [ + "borsh", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" +dependencies = [ + "serde", +] + +[[package]] +name = "bytes-utils" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" +dependencies = [ + "bytes", + "either", +] + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "caps" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1ddba47aba30b6a889298ad0109c3b8dcb0e8fc993b459daa7067d46f865e0" +dependencies = [ + "libc", +] + +[[package]] +name = "cc" +version = "1.2.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d6cac793997bd970000024b2934968efe83b382de4fdcf4fcb46b6ee4ad996" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cfg_eval" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "chrono-humanize" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" +dependencies = [ + "chrono", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", +] + +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compression-codecs" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "config" +version = "0.15.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b85f248a4de22d204ceabc6299d89d2c70fbd7f09fea53c06c852369652d8139" +dependencies = [ + "async-trait", + "convert_case", + "json5", + "pathdiff", + "ron", + "rust-ini", + "serde-untagged", + "serde_core", + "serde_json", + "toml", + "winnow", + "yaml-rust2", +] + +[[package]] +name = "console" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" +dependencies = [ + "encode_unicode", + "libc", + "unicode-width", + "windows-sys 0.61.2", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc-fast" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e75b2483e97a5a7da73ac68a05b629f9c53cff58d8ed1c77866079e18b00dba5" +dependencies = [ + "digest 0.10.7", + "spin", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "croner" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c344b0690c1ad1c7176fe18eb173e0c927008fdaaa256e40dfd43ddd149c0843" +dependencies = [ + "chrono", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "csv" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "csv-core" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rand_core 0.6.4", + "rustc_version 0.4.1", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.118", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", + "rayon", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "deadpool" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be2b1d1d6ec8d846f05e137292d0b89133caf95ef33695424c09568bdd39b1b" +dependencies = [ + "deadpool-runtime", + "lazy_static", + "num_cpus", + "tokio", +] + +[[package]] +name = "deadpool-runtime" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid 0.9.6", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.8", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid 0.9.6", + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid 0.10.2", + "crypto-common 0.2.2", + "ctutils", +] + +[[package]] +name = "dir-diff" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ad16bf5f84253b50d6557681c58c3ab67c47c77d39fed9aeb56e947290bd10" +dependencies = [ + "walkdir", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "doublezero-cli-core" +version = "0.30.0" +source = "git+https://github.com/malbeclabs/doublezero?tag=client%2Fv0.31.0#25ae6ee721991ba8d660279bcc6eec8a72e6c690" +dependencies = [ + "bitflags 2.13.0", + "clap", + "doublezero-config", + "doublezero-program-common", + "eyre", + "serde", + "serde_json", + "solana-sdk", + "tabled 0.20.0", + "thiserror 2.0.18", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "doublezero-config" +version = "0.30.0" +source = "git+https://github.com/malbeclabs/doublezero?tag=client%2Fv0.31.0#25ae6ee721991ba8d660279bcc6eec8a72e6c690" +dependencies = [ + "eyre", + "serde", + "solana-sdk", +] + +[[package]] +name = "doublezero-contributor-rewards" +version = "0.6.1" +dependencies = [ + "anyhow", + "async-trait", + "aws-config", + "aws-sdk-s3", + "backon", + "base64 0.22.1", + "bitvec", + "borsh", + "bytemuck", + "chrono", + "clap", + "config", + "csv", + "dotenvy", + "doublezero-program-common", + "doublezero-program-tools", + "doublezero-record", + "doublezero-revenue-distribution", + "doublezero-serviceability", + "doublezero-solana-client-tools", + "doublezero-solana-sdk", + "doublezero-telemetry", + "doublezero_sdk", + "governor", + "indexmap", + "itertools 0.14.0", + "md5", + "metrics", + "metrics-exporter-prometheus", + "network-shapley", + "rayon", + "rust_decimal", + "serde", + "serde_json", + "slack-notifier", + "solana-account-decoder", + "solana-client", + "solana-commitment-config", + "solana-compute-budget-interface", + "solana-sdk", + "solana-system-interface 3.2.0", + "spl-associated-token-account-interface", + "spl-token-interface", + "svm-hash", + "tabled 0.20.0", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "doublezero-geolocation" +version = "0.30.0" +source = "git+https://github.com/malbeclabs/doublezero?tag=client%2Fv0.31.0#25ae6ee721991ba8d660279bcc6eec8a72e6c690" +dependencies = [ + "borsh", + "borsh-incremental", + "doublezero-config", + "doublezero-program-common", + "doublezero-serviceability", + "solana-bincode", + "solana-loader-v3-interface", + "solana-program", + "solana-sdk-ids", + "solana-system-interface 3.2.0", + "thiserror 2.0.18", +] + +[[package]] +name = "doublezero-ledger-sentinel" +version = "0.2.5" +dependencies = [ + "anyhow", + "async-trait", + "backon", + "base64 0.22.1", + "bincode 1.3.3", + "borsh", + "clap", + "config", + "doublezero-passport", + "doublezero-program-common", + "doublezero-program-tools", + "doublezero-record", + "doublezero-revenue-distribution", + "doublezero-serviceability", + "doublezero_sdk", + "metrics", + "metrics-exporter-prometheus", + "mockall 0.13.1", + "reqwest", + "retainer", + "serde", + "serde_json", + "solana-account-decoder-client-types", + "solana-client", + "solana-commitment-config", + "solana-compute-budget-interface", + "solana-sanitize", + "solana-sdk", + "solana-system-interface 3.2.0", + "solana-transaction-status-client-types", + "spl-associated-token-account-interface", + "spl-token-interface", + "strum 0.27.2", + "thiserror 2.0.18", + "tokio", + "tokio-util 0.7.18", + "tracing", + "tracing-subscriber", + "url", +] + +[[package]] +name = "doublezero-passport" +version = "0.2.0" +source = "git+https://github.com/malbeclabs/doublezero-solana?tag=revenue-distribution%2Fv0.3.7#4368da2c446b799f354aecb6156fc0e77343634b" +dependencies = [ + "borsh", + "bytemuck", + "doublezero-program-tools", + "itertools 0.14.0", + "solana-account-info", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-system-interface 3.2.0", + "solana-sysvar", +] + +[[package]] +name = "doublezero-passport-admin-cli" +version = "0.0.1" +dependencies = [ + "anyhow", + "clap", + "doublezero-passport", + "doublezero-program-tools", + "doublezero-solana-client-tools", + "solana-compute-budget-interface", + "solana-sdk", + "tokio", +] + +[[package]] +name = "doublezero-passport-cli" +version = "0.0.1" +dependencies = [ + "clap", + "doublezero-cli-core", + "doublezero-ledger-sentinel", + "doublezero-solana-client-tools", + "doublezero-solana-sdk", + "doublezero_sdk", + "serde", + "serde_json", + "solana-client", + "solana-compute-budget-interface", + "solana-sdk", + "thiserror 2.0.18", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "doublezero-program-common" +version = "0.30.0" +source = "git+https://github.com/malbeclabs/doublezero?tag=client%2Fv0.31.0#25ae6ee721991ba8d660279bcc6eec8a72e6c690" +dependencies = [ + "borsh", + "byteorder", + "ipnetwork", + "serde", + "solana-program", + "solana-system-interface 3.2.0", +] + +[[package]] +name = "doublezero-program-tools" +version = "0.0.0" +source = "git+https://github.com/malbeclabs/doublezero-solana?tag=revenue-distribution%2Fv0.3.7#4368da2c446b799f354aecb6156fc0e77343634b" +dependencies = [ + "bincode 1.3.3", + "borsh", + "bytemuck", + "ruint", + "sha2-const-stable", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-loader-v3-interface", + "solana-msg", + "solana-program-error", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-system-interface 3.2.0", + "solana-sysvar", + "spl-token-interface", +] + +[[package]] +name = "doublezero-record" +version = "0.30.0" +source = "git+https://github.com/malbeclabs/doublezero?tag=client%2Fv0.31.0#25ae6ee721991ba8d660279bcc6eec8a72e6c690" +dependencies = [ + "bytemuck", + "solana-program", + "solana-system-interface 3.2.0", + "thiserror 2.0.18", +] + +[[package]] +name = "doublezero-revenue-distribution" +version = "0.3.7" +source = "git+https://github.com/malbeclabs/doublezero-solana?tag=revenue-distribution%2Fv0.3.7#4368da2c446b799f354aecb6156fc0e77343634b" +dependencies = [ + "borsh", + "bytemuck", + "doublezero-program-tools", + "ruint", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-system-interface 3.2.0", + "solana-sysvar", + "spl-associated-token-account-interface", + "spl-token-interface", + "svm-hash", +] + +[[package]] +name = "doublezero-revenue-distribution-admin-cli" +version = "0.0.1" +dependencies = [ + "anyhow", + "clap", + "doublezero-solana-client-tools", + "doublezero-solana-sdk", + "solana-compute-budget-interface", + "solana-sdk", + "tokio", +] + +[[package]] +name = "doublezero-scheduled-command" +version = "0.0.1" +dependencies = [ + "anyhow", + "async-trait", + "clap", + "tokio", + "tokio-cron-scheduler", + "tracing", +] + +[[package]] +name = "doublezero-serviceability" +version = "0.30.0" +source = "git+https://github.com/malbeclabs/doublezero?tag=client%2Fv0.31.0#25ae6ee721991ba8d660279bcc6eec8a72e6c690" +dependencies = [ + "bitflags 2.13.0", + "borsh", + "borsh-incremental", + "bytemuck", + "doublezero-program-common", + "ipnetwork", + "serde", + "serde_bytes", + "solana-program", + "solana-system-interface 3.2.0", + "thiserror 2.0.18", +] + +[[package]] +name = "doublezero-sol-conversion-admin-cli" +version = "0.0.1" +dependencies = [ + "anyhow", + "clap", + "doublezero-program-tools", + "doublezero-revenue-distribution", + "doublezero-sol-conversion-interface", + "doublezero-solana-client-tools", + "solana-compute-budget-interface", + "solana-sdk", + "solana-system-interface 3.2.0", + "tokio", +] + +[[package]] +name = "doublezero-sol-conversion-interface" +version = "0.0.1" +dependencies = [ + "borsh", + "bytemuck", + "doublezero-program-tools", + "doublezero-revenue-distribution", + "serde", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-system-interface 3.2.0", + "spl-token-interface", +] + +[[package]] +name = "doublezero-solana-cli" +version = "0.5.10" +dependencies = [ + "anyhow", + "async-trait", + "base64 0.22.1", + "borsh", + "bytemuck", + "chrono", + "clap", + "csv", + "doublezero-cli-core", + "doublezero-config", + "doublezero-contributor-rewards", + "doublezero-ledger-sentinel", + "doublezero-passport-cli", + "doublezero-scheduled-command", + "doublezero-serviceability", + "doublezero-solana-client-tools", + "doublezero-solana-sdk", + "doublezero-solana-validator-debt", + "doublezero_sdk", + "eyre", + "futures", + "humantime", + "itertools 0.14.0", + "libc", + "reqwest", + "serde", + "serde_json", + "slack-notifier", + "solana-account-decoder-client-types", + "solana-client", + "solana-commitment-config", + "solana-compute-budget-interface", + "solana-sdk", + "solana-sdk-ids", + "solana-system-interface 3.2.0", + "solana-transaction-status-client-types", + "spl-associated-token-account-interface", + "spl-token-interface", + "tabled 0.20.0", + "tokio", + "tracing", + "tracing-subscriber", + "url", + "wiremock", +] + +[[package]] +name = "doublezero-solana-client-tools" +version = "0.0.1" +dependencies = [ + "anyhow", + "bincode 1.3.3", + "borsh", + "bs58", + "bytemuck", + "clap", + "doublezero-program-tools", + "doublezero_sdk", + "home", + "leaky-bucket", + "percent-encoding", + "serde_json", + "solana-address-lookup-table-interface", + "solana-client", + "solana-commitment-config", + "solana-compute-budget-interface", + "solana-loader-v3-interface", + "solana-message", + "solana-program-test", + "solana-reward-info", + "solana-rpc-client-types", + "solana-sdk", + "solana-transaction-status-client-types", + "spl-associated-token-account-interface", + "spl-memo-interface", + "spl-token-interface", + "tempfile", + "thiserror 2.0.18", + "tokio", + "tracing", + "tracing-subscriber", + "url", +] + +[[package]] +name = "doublezero-solana-fork-cli" +version = "0.0.1" +dependencies = [ + "anyhow", + "base64 0.22.1", + "borsh", + "bytemuck", + "clap", + "doublezero-solana-client-tools", + "doublezero-solana-sdk", + "serde", + "serde_json", + "solana-account-decoder-client-types", + "solana-client", + "solana-sdk", + "spl-associated-token-account-interface", + "spl-token-interface", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "doublezero-solana-sdk" +version = "0.0.1" +dependencies = [ + "anyhow", + "borsh", + "bytemuck", + "doublezero-passport", + "doublezero-program-tools", + "doublezero-revenue-distribution", + "doublezero-sol-conversion-interface", + "doublezero-solana-client-tools", + "hex", + "serde_json", + "solana-client", + "solana-loader-v3-interface", + "solana-offchain-message", + "solana-program-pack", + "solana-sdk", + "solana-sdk-ids", + "spl-associated-token-account-interface", + "spl-token-interface", + "svm-hash", + "tempfile", +] + +[[package]] +name = "doublezero-solana-validator-debt" +version = "0.1.0-rc6" +dependencies = [ + "anyhow", + "arrow", + "async-trait", + "aws-config", + "aws-sdk-s3", + "backon", + "bincode 1.3.3", + "borsh", + "chrono", + "clap", + "csv", + "dirs", + "doublezero-record", + "doublezero-serviceability", + "doublezero-solana-client-tools", + "doublezero-solana-sdk", + "doublezero_sdk", + "futures", + "leaky-bucket", + "metrics", + "metrics-exporter-prometheus", + "mockall 0.13.1", + "parquet", + "reqwest", + "serde", + "serde_json", + "slack-notifier", + "solana-account-decoder", + "solana-client", + "solana-commitment-config", + "solana-compute-budget-interface", + "solana-reward-info", + "solana-sdk", + "solana-transaction-status-client-types", + "tabled 0.20.0", + "tempfile", + "tokio", + "tracing", + "tracing-subscriber", + "url", +] + +[[package]] +name = "doublezero-telemetry" +version = "0.30.0" +source = "git+https://github.com/malbeclabs/doublezero?tag=client%2Fv0.31.0#25ae6ee721991ba8d660279bcc6eec8a72e6c690" +dependencies = [ + "borsh", + "borsh-incremental", + "doublezero-config", + "doublezero-program-common", + "doublezero-serviceability", + "serde", + "serde_bytes", + "solana-program", +] + +[[package]] +name = "doublezero_sdk" +version = "0.30.0" +source = "git+https://github.com/malbeclabs/doublezero?tag=client%2Fv0.31.0#25ae6ee721991ba8d660279bcc6eec8a72e6c690" +dependencies = [ + "async-trait", + "backon", + "base64 0.22.1", + "bincode 2.0.1", + "borsh", + "bytemuck", + "chrono", + "directories-next", + "dirs-next", + "doublezero-config", + "doublezero-geolocation", + "doublezero-program-common", + "doublezero-record", + "doublezero-serviceability", + "doublezero-telemetry", + "eyre", + "futures", + "log", + "mockall 0.15.0", + "serde", + "serde_json", + "serde_yaml", + "serial_test", + "solana-account-decoder", + "solana-client", + "solana-commitment-config", + "solana-compute-budget-interface", + "solana-loader-v3-interface", + "solana-program", + "solana-pubsub-client", + "solana-rpc-client-api", + "solana-sdk", + "solana-system-interface 3.2.0", + "solana-transaction-status", + "tempfile", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature 2.2.0", + "spki", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature 1.6.4", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature 2.2.0", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek 3.2.0", + "ed25519 1.5.3", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek 4.1.3", + "ed25519 2.2.3", + "rand_core 0.6.4", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", +] + +[[package]] +name = "ed25519-dalek-bip32" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b49a684b133c4980d7ee783936af771516011c8cd15f429dbda77245e282f03" +dependencies = [ + "derivation-path", + "ed25519-dalek 2.2.0", + "hmac 0.12.1", + "sha2 0.10.9", +] + +[[package]] +name = "educe" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +dependencies = [ + "enum-ordinalize 3.1.15", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize 4.4.1", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "enum-ordinalize" +version = "3.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +dependencies = [ + "num-bigint 0.4.8", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "enum-ordinalize" +version = "4.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07f808d588c10e464ea6f7d3eaed500049eff30aaac103460f61828c2d65b3eb" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e528e2d34ba8a67a1a650b86beae8ef69fc5fdb638016f386b973226590432" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "env_filter" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.1", + "pin-project-lite", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastbloom" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef975e30683b2d965054bb0a836f8973857c4ebf6acf274fe46617cd285060d8" +dependencies = [ + "foldhash", + "libm", + "portable-atomic", + "siphasher 1.0.3", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "filetime" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" +dependencies = [ + "cfg-if", + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "five8" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f76610e969fa1784327ded240f1e28a3fd9520c9cec93b636fcf62dd37f772" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_const" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_core" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.6", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "flatbuffers" +version = "25.12.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35f6839d7b3b98adde531effaf34f0c2badc6f4735d26fe74709d8e513a96ef3" +dependencies = [ + "bitflags 2.13.0", + "rustc_version 0.4.1", +] + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fragile" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8878864ba14bb86e818a412bfd6f18f9eabd4ec0f008a28e8f7eb61db532fcf9" +dependencies = [ + "futures-core", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-timer" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "governor" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" +dependencies = [ + "cfg-if", + "dashmap", + "futures", + "futures-timer", + "no-std-compat", + "nonzero_ext", + "parking_lot", + "portable-atomic", + "quanta", + "rand 0.8.6", + "smallvec", + "spinning_top", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util 0.7.18", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.4.2", + "indexmap", + "slab", + "tokio", + "tokio-util 0.7.18", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.12", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "hashlink" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" +dependencies = [ + "hashbrown 0.16.1", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "histogram" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.4.2", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.2", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" + +[[package]] +name = "hybrid-array" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2 0.4.15", + "http 1.4.2", + "http-body 1.0.1", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.32", + "log", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http 1.4.2", + "hyper 1.10.1", + "hyper-util", + "rustls 0.23.41", + "rustls-native-certs", + "tokio", + "tokio-rustls 0.26.4", + "tower-service", + "webpki-roots 1.0.8", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http 1.4.2", + "http-body 1.0.1", + "hyper 1.10.1", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.4", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro 0.6.0", + "rayon", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "indicatif" +version = "0.18.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9433806cd6b4ec1aba79c021c7e4c58fb4c3b9977c085062e611ac929998fb0c" +dependencies = [ + "console", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "io-uring" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9080b15e63775b9a2ac7dca720f7050a8b955e092ea0f6020a4a80f69998cdc0" +dependencies = [ + "bitflags 2.13.0", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "ipnetwork" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf370abdafd54d13e54a620e8c3e1145f28e46cc9d704bc6d94414559df41763" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jiff" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccfe6121cbe750cf81efa362d85c0bde7ea298ec43092d3a193baca59cdbd634" +dependencies = [ + "defmt", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e165e897f662d428f3cd3828a919dbe067c2d42bb1031eede74ef9d27ecdedd2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine 4.6.7", + "jni-macros", + "jni-sys", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "simd_cesu8", + "syn 2.0.118", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.118", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.9", + "signature 2.2.0", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures 0.2.17", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leaky-bucket" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a396bb213c2d09ed6c5495fd082c991b6ab39c9daf4fff59e6727f85c73e4c5" +dependencies = [ + "parking_lot", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libloading" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" +dependencies = [ + "libc", +] + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "num-bigint 0.4.8", + "thiserror 1.0.69", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lru" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" +dependencies = [ + "hashbrown 0.16.1", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lz4" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" +dependencies = [ + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "lz4_flex" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90071f8077f8e40adfc4b7fe9cd495ce316263f19e75c2211eeff3fdf475a3d9" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "md-5" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" +dependencies = [ + "cfg-if", + "digest 0.11.3", +] + +[[package]] +name = "md5" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae960838283323069879657ca3de837e9f7bbb4c7bf6ea7f1b290d5e9476d2e0" + +[[package]] +name = "memchr" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "metrics" +version = "0.24.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89550ee9f79e88fef3119de263694973a8adb26c21d75322164fb8c493039fe2" +dependencies = [ + "portable-atomic", + "rapidhash", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b166dea96003ee2531cf14833efedced545751d800f03535801d833313f8c15" +dependencies = [ + "base64 0.22.1", + "http-body-util", + "hyper 1.10.1", + "hyper-rustls 0.27.9", + "hyper-util", + "indexmap", + "ipnet", + "metrics", + "metrics-util", + "quanta", + "thiserror 2.0.18", + "tokio", + "tracing", +] + +[[package]] +name = "metrics-util" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96f8722f8562635f92f8ed992f26df0532266eb03d5202607c20c0d7e9745e13" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.16.1", + "metrics", + "quanta", + "rand 0.9.4", + "rand_xoshiro 0.7.0", + "rapidhash", + "sketches-ddsketch", +] + +[[package]] +name = "microlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458ed987196f802dc47c69d4c5afcd19002d6c1c5f8f75c76d129bcf2425057a" +dependencies = [ + "log", + "sprs", + "web-time", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "mockall" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "lazy_static", + "mockall_derive 0.11.4", + "predicates 2.1.5", + "predicates-tree", +] + +[[package]] +name = "mockall" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39a6bfcc6c8c7eed5ee98b9c3e33adc726054389233e201c95dab2d41a3839d2" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "mockall_derive 0.13.1", + "predicates 3.1.4", + "predicates-tree", +] + +[[package]] +name = "mockall" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a6ceddfe3ce334925e96bf420fdb2dcee5bed6c632a168ece622676dadeaf8a" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "mockall_derive 0.15.0", + "predicates 3.1.4", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "mockall_derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ca3004c2efe9011bd4e461bd8256445052b9615405b4f7ea43fc8ca5c20898" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "mockall_derive" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cfe16fbe8a314aeec0b861ac24e60b1e123e97634bab045475b9d6a18416fd8" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "modular-bitfield" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" +dependencies = [ + "modular-bitfield-impl", + "static_assertions", +] + +[[package]] +name = "modular-bitfield-impl" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ndarray" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520080814a7a6b4a6e9070823bb24b4531daac8c4627e08ba5de8c5ef2f2752d" +dependencies = [ + "matrixmultiply", + "num-complex 0.4.6", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", +] + +[[package]] +name = "network-shapley" +version = "0.2.0" +source = "git+https://github.com/doublezerofoundation/network-shapley-rs?tag=v0.6.0#cc85bca771d986d170cc695f3be94a0c124e86cd" +dependencies = [ + "borsh", + "csv", + "microlp", + "rayon", + "serde", + "sprs", + "tabled 0.21.0", + "thiserror 2.0.18", + "web-time", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.13.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" + +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex 0.2.4", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" +dependencies = [ + "bitflags 2.13.0", + "cfg-if", + "foreign-types", + "libc", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-src" +version = "300.6.1+3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46eb8fb9fb3b61ce1c0f8a026c4c1a0714d3a9e138e7fbde78753ce2babc3846" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "opentelemetry" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" +dependencies = [ + "async-trait", + "crossbeam-channel", + "futures-channel", + "futures-executor", + "futures-util", + "js-sys", + "lazy_static", + "percent-encoding", + "pin-project", + "rand 0.8.6", + "thiserror 1.0.69", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown 0.14.5", +] + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.9", +] + +[[package]] +name = "papergrid" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6978128c8b51d8f4080631ceb2302ab51e32cc6e8615f735ee2f83fd269ae3f1" +dependencies = [ + "bytecount", + "fnv", + "unicode-width", +] + +[[package]] +name = "papergrid" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0984e668274d34691bc2b262ef0d115de5fa9973bcdee7ae32213f93099153e" +dependencies = [ + "bytecount", + "fnv", + "unicode-width", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "parquet" +version = "57.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e832c6aa20310fc6de7ea5a3f4e20d34fd83e3b43229d32b81ffe5c14d74692" +dependencies = [ + "ahash 0.8.12", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-ipc", + "arrow-schema", + "arrow-select", + "base64 0.22.1", + "brotli", + "bytes", + "chrono", + "flate2", + "futures", + "half", + "hashbrown 0.16.1", + "lz4_flex", + "num-bigint 0.4.8", + "num-integer", + "num-traits", + "paste", + "seq-macro", + "simdutf8", + "snap", + "thrift", + "tokio", + "twox-hash", + "zstd", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pest" +version = "2.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47627dd7305c6a2d6c8c6bcd24c5a4c17dbbf425f4f9c5313e724b38fc9782e9" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b4254325ecad416ab689e27ba51da03ba01a9632bc6e108f5fe7c3c4ad29d58" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c4c0e91ead7a8f7acecbca6f003fc2e8282b1dbe2dd9c9d2f16aba42995e0a7" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "pest_meta" +version = "2.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9744bc48116fee06334924bb5f2bad41eed5e89bd26e29b0b799f9a3f82c210" +dependencies = [ + "pest", +] + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools 0.10.5", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" +dependencies = [ + "anstyle", + "predicates-core", +] + +[[package]] +name = "predicates-core" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" + +[[package]] +name = "predicates-tree" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bitflags 2.13.0", + "num-traits", + "rand 0.9.4", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "quanta" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi 0.11.1+wasi-snapshot-preview1", + "web-sys", + "winapi", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.41", + "socket2 0.6.4", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" +dependencies = [ + "bytes", + "fastbloom", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash", + "rustls 0.23.41", + "rustls-pki-types", + "rustls-platform-verifier", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.4", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rand_xoshiro" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "rapidhash" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da7e78a036ce858e8d55b7e7dc8ba3a88b78350fd2155d3591bbd966b58589e" +dependencies = [ + "rustversion", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "regex" +version = "1.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "hyper 1.10.1", + "hyper-rustls 0.27.9", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.41", + "rustls-native-certs", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls 0.26.4", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.8", +] + +[[package]] +name = "reqwest-middleware" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" +dependencies = [ + "anyhow", + "async-trait", + "http 1.4.2", + "reqwest", + "serde", + "thiserror 1.0.69", + "tower-service", +] + +[[package]] +name = "retainer" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b071fe646a2ab077f74656a4602c16528829c1fafa81946c5e88eaeccf08d5b" +dependencies = [ + "async-io", + "async-lock", + "futures-lite", + "log", + "rand 0.9.4", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac 0.12.1", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "ron" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" +dependencies = [ + "bitflags 2.13.0", + "once_cell", + "serde", + "serde_derive", + "typeid", + "unicode-ident", +] + +[[package]] +name = "ruint" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecb38f82477f20c5c3d62ef52d7c4e536e38ea9b73fb570a20c5cae0e14bcf6" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytemuck", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint 0.4.8", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.6", + "rand 0.9.4", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rust-ini" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + +[[package]] +name = "rust_decimal" +version = "1.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.6", + "rkyv", + "rust_decimal_macros", + "serde", + "serde_json", + "wasm-bindgen", +] + +[[package]] +name = "rust_decimal_macros" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74a5a6f027e892c7a035c6fddb50435a1fbf5a734ffc0c2a9fed4d0221440519" +dependencies = [ + "quote", + "syn 2.0.118", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.28", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustler" +version = "0.37.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875c8fe88089b9bbc0977385e107d35bfae740c6b0734e60a1e9cc82d0017f49" +dependencies = [ + "inventory", + "libloading", + "regex-lite", + "rustler_codegen", +] + +[[package]] +name = "rustler_codegen" +version = "0.37.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb5848e9c4cf3796f190d9b4516523af27f3444a3af1771f20465f6586d40b2" +dependencies = [ + "heck 0.5.0", + "inventory", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" +dependencies = [ + "aws-lc-rs", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.103.13", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.41", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.13", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scheduler_doublezero" +version = "0.0.0" +dependencies = [ + "anyhow", + "doublezero-solana-client-tools", + "doublezero-solana-sdk", + "doublezero-solana-validator-debt", + "reqwest", + "rustler", + "serde_json", + "slack-notifier", + "solana-client", + "solana-commitment-config", + "solana-sdk", + "solana-transaction-status-client-types", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[package]] +name = "seqlock" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5c67b6f14ecc5b86c66fa63d76b5092352678545a8a3cdae80aef5128371910" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "serde_core", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "serial_test" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "699f4197115b8a7e7ff19c9a315a4bd6fffec26cc4626ef45ecaea389e081c6d" +dependencies = [ + "futures-executor", + "futures-util", + "log", + "once_cell", + "parking_lot", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94e153fc76e1c6a068703d6d29c508a0b15c061c4b7e43da59cc097bc342673c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha1" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "sha2-const-stable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version 0.4.1", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "sketches-ddsketch" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6f73aeb92d671e0cc4dca167e59b2deb6387c375391bc99ee743f326994a2b" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slack-notifier" +version = "0.0.1" +dependencies = [ + "anyhow", + "backon", + "chrono", + "reqwest", + "serde", + "serde_json", + "tabled 0.20.0", + "tokio", +] + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "snap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "solana-account" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-sysvar", +] + +[[package]] +name = "solana-account-decoder" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83456ae8d57aff0f051321f8662fd642849bc6ddd1dfbcfac4c1a93a95abc815" +dependencies = [ + "Inflector", + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "bv", + "serde", + "serde_derive", + "serde_json", + "solana-account", + "solana-account-decoder-client-types", + "solana-address-lookup-table-interface", + "solana-clock", + "solana-config-interface", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-instruction", + "solana-loader-v3-interface", + "solana-nonce", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-slot-hashes", + "solana-slot-history", + "solana-stake-interface", + "solana-sysvar", + "solana-vote-interface", + "spl-generic-token", + "spl-token-2022-interface", + "spl-token-group-interface", + "spl-token-interface", + "spl-token-metadata-interface", + "thiserror 2.0.18", + "zstd", +] + +[[package]] +name = "solana-account-decoder-client-types" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30db952cfdee7a817108f0034a1e10ca6ec3e4aebf73b043286069b8c9c2cb9" +dependencies = [ + "base64 0.22.1", + "bs58", + "serde", + "serde_derive", + "serde_json", + "solana-account", + "solana-pubkey 3.0.0", + "zstd", +] + +[[package]] +name = "solana-account-info" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" +dependencies = [ + "bincode 1.3.3", + "serde_core", + "solana-address 2.6.1", + "solana-program-error", + "solana-program-memory", +] + +[[package]] +name = "solana-accounts-db" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4e24246ff12fe39bb7f2d26745d9168caa783d05cc20a53265c747e862dbb94" +dependencies = [ + "agave-io-uring", + "ahash 0.8.12", + "bincode 1.3.3", + "blake3", + "bv", + "bytemuck", + "bytemuck_derive", + "bzip2", + "crossbeam-channel", + "dashmap", + "indexmap", + "io-uring", + "itertools 0.12.1", + "libc", + "log", + "lz4", + "memmap2 0.9.11", + "modular-bitfield", + "num_cpus", + "num_enum", + "rand 0.8.6", + "rayon", + "seqlock", + "serde", + "serde_derive", + "slab", + "smallvec", + "solana-account", + "solana-address-lookup-table-interface", + "solana-bucket-map", + "solana-clock", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-genesis-config", + "solana-hash 3.1.0", + "solana-lattice-hash", + "solana-measure", + "solana-message", + "solana-metrics", + "solana-nohash-hasher", + "solana-pubkey 3.0.0", + "solana-rayon-threadlimit", + "solana-reward-info", + "solana-sha256-hasher", + "solana-slot-hashes", + "solana-svm-transaction", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-time-utils", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "spl-generic-token", + "static_assertions", + "tar", + "tempfile", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-address" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" +dependencies = [ + "solana-address 2.6.1", +] + +[[package]] +name = "solana-address" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39c93e262f671bf402e1040e4a7e40b05d81da5956c7681948c975a0997517bb" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "five8", + "five8_const", + "rand 0.9.4", + "serde", + "serde_derive", + "sha2-const-stable", + "solana-atomic-u64", + "solana-define-syscall 5.1.0", + "solana-nullable", + "solana-program-error", + "solana-sanitize", + "solana-sha256-hasher", + "wincode", +] + +[[package]] +name = "solana-address-lookup-table-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115b4f773acc4f3f3cb986b0d335e9845c0368c82b0940410935bc11ae065578" +dependencies = [ + "bincode 1.3.3", + "bytemuck", + "serde", + "serde_derive", + "solana-clock", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-slot-hashes", +] + +[[package]] +name = "solana-atomic-u64" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "085db4906d89324cef2a30840d59eaecf3d4231c560ec7c9f6614a93c652f501" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-banks-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc887eb35277bce8b8ba8f6ac020a5ab94cc9857920fd9f52a7041a235b476c" +dependencies = [ + "borsh", + "futures", + "solana-account", + "solana-banks-interface", + "solana-clock", + "solana-commitment-config", + "solana-hash 3.1.0", + "solana-message", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-signature", + "solana-sysvar", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "tarpc", + "thiserror 2.0.18", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-banks-interface" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b0bb806697ca9f7e6c9082749a6b6f891d126f7c31d3d84a8264880afec16f" +dependencies = [ + "serde", + "serde_derive", + "solana-account", + "solana-clock", + "solana-commitment-config", + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-signature", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "tarpc", +] + +[[package]] +name = "solana-banks-server" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057ef1b15b16e022338fabd6bd61823eba0a34cf7b082730dfd5c3594f533bed" +dependencies = [ + "agave-feature-set", + "bincode 1.3.3", + "crossbeam-channel", + "futures", + "solana-account", + "solana-banks-interface", + "solana-client", + "solana-clock", + "solana-commitment-config", + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-runtime", + "solana-runtime-transaction", + "solana-send-transaction-service", + "solana-signature", + "solana-svm", + "solana-transaction", + "solana-transaction-error", + "tarpc", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-big-mod-exp" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" +dependencies = [ + "num-bigint 0.4.8", + "num-traits", + "solana-define-syscall 3.0.0", +] + +[[package]] +name = "solana-bincode" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278a1a5bad62cd9da89ac8d4b7ec444e83caa8ae96aa656dfc27684b28d49a5d" +dependencies = [ + "bincode 1.3.3", + "serde_core", + "solana-instruction-error", +] + +[[package]] +name = "solana-blake3-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" +dependencies = [ + "blake3", + "solana-define-syscall 4.0.1", + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-bn254" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ff13a8867fcc7b0f1114764e1bf6191b4551dcaf93729ddc676cd4ec6abc9f" +dependencies = [ + "ark-bn254 0.5.0", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "bytemuck", + "solana-define-syscall 5.1.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-borsh" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" +dependencies = [ + "borsh", +] + +[[package]] +name = "solana-bpf-loader-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e450aab0c6ce825fbad7baf9e64c706d51def4842b7176fb172abfa1307939f" +dependencies = [ + "agave-syscalls", + "bincode 1.3.3", + "qualifier_attr", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-transaction-context", +] + +[[package]] +name = "solana-bucket-map" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "286c8b3d6c7fa13adf2a94015aedba55349f4d762710527b2fb32c4cf4df1803" +dependencies = [ + "bv", + "bytemuck", + "bytemuck_derive", + "memmap2 0.9.11", + "modular-bitfield", + "num_enum", + "rand 0.8.6", + "solana-clock", + "solana-measure", + "solana-pubkey 3.0.0", + "tempfile", +] + +[[package]] +name = "solana-builtins" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9759b566a98e17bb376f49d7b01d210b114fd6bff985c2e6c1704e83a36da20" +dependencies = [ + "agave-feature-set", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-hash 3.1.0", + "solana-loader-v4-program", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", + "solana-zk-elgamal-proof-program", + "solana-zk-token-proof-program", +] + +[[package]] +name = "solana-builtins-default-costs" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b7f80ebad1d995d419719048be643cc4ff4c5699a72f218736917196f03a67" +dependencies = [ + "agave-feature-set", + "ahash 0.8.12", + "log", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-loader-v4-program", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", +] + +[[package]] +name = "solana-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905b9527a1b11dc6c30c71366e66c493a9907f6cefcd3352bac031993b1bf512" +dependencies = [ + "async-trait", + "bincode 1.3.3", + "dashmap", + "futures", + "futures-util", + "indexmap", + "indicatif", + "log", + "quinn", + "rayon", + "solana-account", + "solana-client-traits", + "solana-commitment-config", + "solana-connection-cache", + "solana-epoch-info", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-measure", + "solana-message", + "solana-pubkey 3.0.0", + "solana-pubsub-client", + "solana-quic-client", + "solana-quic-definitions", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", + "solana-signature", + "solana-signer", + "solana-streamer", + "solana-time-utils", + "solana-tpu-client", + "solana-transaction", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-udp-client", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-client-traits" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08618ed587e128105510c54ae3e456b9a06d674d8640db75afe66dad65cb4e02" +dependencies = [ + "solana-account", + "solana-commitment-config", + "solana-epoch-info", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-message", + "solana-pubkey 3.0.0", + "solana-signature", + "solana-signer", + "solana-system-interface 2.0.0", + "solana-transaction", + "solana-transaction-error", +] + +[[package]] +name = "solana-clock" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0acdace90d96e2c9e70d681465b4fe888b6bcf27c354ae9774e9f8a3b72923d" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-cluster-type" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a494cf8eda7d98d9f0144b288bb409c88308d2e86f15cc1045aa77b83304718" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-commitment-config" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1517aa49dcfa9cb793ef90e7aac81346d62ca4a546bb1a754030a033e3972e1c" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-compute-budget" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0949c3244fdbd06f958fdcc9a83ec5778da418fb030a96621aa3cf0597f7acf6" +dependencies = [ + "solana-fee-structure", + "solana-program-runtime", +] + +[[package]] +name = "solana-compute-budget-instruction" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "110a37e3926f56252d5fc79be0d5b2c286aec0c11200c31f817796359e34359b" +dependencies = [ + "agave-feature-set", + "log", + "solana-borsh", + "solana-builtins-default-costs", + "solana-compute-budget", + "solana-compute-budget-interface", + "solana-instruction", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-transaction", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-compute-budget-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8292c436b269ad23cecc8b24f7da3ab07ca111661e25e00ce0e1d22771951ab9" +dependencies = [ + "borsh", + "solana-instruction", + "solana-sdk-ids", +] + +[[package]] +name = "solana-compute-budget-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcabf05e88736a8596072967e192da1883ca9ad1515e198068c13c9233ca7ba6" +dependencies = [ + "solana-program-runtime", +] + +[[package]] +name = "solana-config-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e401ae56aed512821cc7a0adaa412ff97fecd2dff4602be7b1330d2daec0c4" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-account", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-short-vec", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-connection-cache" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ec1735aac392497e3e2d9ef127cf55070086b6969f02c210162427fffefa39" +dependencies = [ + "async-trait", + "bincode 1.3.3", + "crossbeam-channel", + "futures-util", + "indexmap", + "log", + "rand 0.8.6", + "rayon", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-time-utils", + "solana-transaction-error", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-cost-model" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0feb7f49393e353a84da75fdbe437e6fadf1b217ae2524278f1f64034ce7ed4a" +dependencies = [ + "agave-feature-set", + "ahash 0.8.12", + "log", + "solana-bincode", + "solana-borsh", + "solana-builtins-default-costs", + "solana-clock", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-compute-budget-interface", + "solana-fee-structure", + "solana-metrics", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-runtime-transaction", + "solana-sdk-ids", + "solana-svm-transaction", + "solana-system-interface 2.0.0", + "solana-transaction-error", + "solana-vote-program", +] + +[[package]] +name = "solana-cpi" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dea26709d867aada85d0d3617db0944215c8bb28d3745b912de7db13a23280c" +dependencies = [ + "solana-account-info", + "solana-define-syscall 4.0.1", + "solana-instruction", + "solana-program-error", + "solana-pubkey 4.2.0", + "solana-stable-layout", +] + +[[package]] +name = "solana-curve25519" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7e0f6e024ec8f1b141b1fb6388813277bcfaef640e717ebefca26225f687643" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "solana-define-syscall 3.0.0", + "subtle", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-define-syscall" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9697086a4e102d28a156b8d6b521730335d6951bd39a5e766512bbe09007cee" + +[[package]] +name = "solana-define-syscall" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e5b1c0bc1d4a4d10c88a4100499d954c09d3fecfae4912c1a074dff68b1738" + +[[package]] +name = "solana-define-syscall" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e14a4f604117f379840956a8fc8695e4c84f5b0ebed192f31f60d9b85d581d" + +[[package]] +name = "solana-derivation-path" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff71743072690fdbdfcdc37700ae1cb77485aaad49019473a81aee099b1e0b8c" +dependencies = [ + "derivation-path", + "qstring", + "uriparse", +] + +[[package]] +name = "solana-ed25519-program" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1419197f1c06abf760043f6d64ba9d79a03ad5a43f18c7586471937122094da" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "solana-instruction", + "solana-sdk-ids", +] + +[[package]] +name = "solana-epoch-info" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e093c84f6ece620a6b10cd036574b0cd51944231ab32d81f80f76d54aba833e6" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-epoch-rewards" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf7eb4986b0b1d6f562b21f75a836f1a6df6e00c275efcef50aab5c144dc59e" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "solana-hash 4.4.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-epoch-rewards-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee8beac9bff4db9225e57d532d169b0be5e447f1e6601a2f50f27a01bf5518f" +dependencies = [ + "siphasher 0.3.11", + "solana-address 2.6.1", + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-epoch-schedule" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8116e6ffa6002237d5ab5edcbda17f9ba66b6742c45a89c9fb40a94dbacd4c1d" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "solana-program-error", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-epoch-stake" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "027e6d0b9e7daac5b2ac7c3f9ca1b727861121d9ef05084cf435ff736051e7c2" +dependencies = [ + "solana-define-syscall 5.1.0", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-example-mocks" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978855d164845c1b0235d4b4d101cadc55373fffaf0b5b6cfa2194d25b2ed658" +dependencies = [ + "serde", + "serde_derive", + "solana-address-lookup-table-interface", + "solana-clock", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keccak-hasher", + "solana-message", + "solana-nonce", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface 2.0.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-feature-gate-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-account", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-pubkey 4.2.0", + "solana-rent 4.3.0", + "solana-sdk-ids", + "solana-system-interface 3.2.0", +] + +[[package]] +name = "solana-fee" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18995640d5ea221f7f053c3e66f03386567984f867b12c4aa4a6a119bbae4b31" +dependencies = [ + "agave-feature-set", + "solana-fee-structure", + "solana-svm-transaction", +] + +[[package]] +name = "solana-fee-calculator" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef67f01cc6a0c72e99a08d0d484683f995de4c80e9568728fa77d1537f9b7e09" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-fee-structure" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2abdb1223eea8ec64136f39cb1ffcf257e00f915c957c35c0dd9e3f4e700b0" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-genesis-config" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "749eccc960e85c9b33608450093d256006253e1cb436b8380e71777840a3f675" +dependencies = [ + "bincode 1.3.3", + "chrono", + "memmap2 0.5.10", + "serde", + "serde_derive", + "solana-account", + "solana-clock", + "solana-cluster-type", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash 3.1.0", + "solana-inflation", + "solana-keypair", + "solana-poh-config", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sha256-hasher", + "solana-shred-version", + "solana-signer", + "solana-time-utils", +] + +[[package]] +name = "solana-get-sysvar" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef3bc859fc036ed490146793557386cbfae614ebba4adc704c37d94350824ed4" +dependencies = [ + "solana-address 2.6.1", + "solana-define-syscall 5.1.0", + "solana-program-error", +] + +[[package]] +name = "solana-hard-forks" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45406eccad36220e52988b024d8daa93e691e38d5d71ad5fec55410cc9cf427d" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-hash" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "337c246447142f660f778cf6cb582beba8e28deb05b3b24bfb9ffd7c562e5f41" +dependencies = [ + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-hash" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe51db00ac3aa9f950d1e6201a126acfa26e6d81bc4a183ba64ec02effcad883" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "five8", + "serde", + "serde_derive", + "solana-atomic-u64", + "solana-sanitize", +] + +[[package]] +name = "solana-inflation" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf104167e42e747602b88e02b25cacfc5de699c3b7cbba60d3250437e6a22ed" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-instruction" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" +dependencies = [ + "bincode 1.3.3", + "borsh", + "serde", + "serde_derive", + "solana-define-syscall 5.1.0", + "solana-instruction-error", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-instruction-error" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7d34343838343a3755b7dfb1e438d94c6db2263b519cfe3c2257af932b6e93" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-program-error", +] + +[[package]] +name = "solana-instructions-sysvar" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e0732294560e88ecdb2bbc656e67383e9f88c78ec09469cef172f0d28cd1bcd" +dependencies = [ + "bitflags 2.13.0", + "solana-account-info", + "solana-instruction", + "solana-instruction-error", + "solana-program-error", + "solana-sanitize", + "solana-sdk-ids", + "solana-serialize-utils", + "solana-sysvar-id", +] + +[[package]] +name = "solana-keccak-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed1c0d16d6fdeba12291a1f068cdf0d479d9bff1141bf44afd7aa9d485f65ef8" +dependencies = [ + "sha3", + "solana-define-syscall 4.0.1", + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-keypair" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" +dependencies = [ + "ed25519-dalek 2.2.0", + "ed25519-dalek-bip32", + "five8", + "five8_core", + "rand 0.9.4", + "solana-address 2.6.1", + "solana-derivation-path", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", +] + +[[package]] +name = "solana-last-restart-slot" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22474b83d3c7c318e1c3a725784fc2d1d03b728e36369e58ce48769a61ed85e" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-lattice-hash" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e27cbdda66b2379f5122ecfd78695c5815e8109c0f7339d3cf7340ed4d6d64" +dependencies = [ + "base64 0.22.1", + "blake3", + "bs58", + "bytemuck", +] + +[[package]] +name = "solana-loader-v2-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4a6f0ad4fd9c30679bfee2ce3ea6a449cac38049f210480b751f65676dfe82" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", +] + +[[package]] +name = "solana-loader-v3-interface" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e0538d4dbc9022e01616f1c58f2db98ece739c5d5ed4a2ef8737a953e76a2d4" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey 4.2.0", + "solana-sdk-ids", + "solana-system-interface 3.2.0", +] + +[[package]] +name = "solana-loader-v4-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c948b33ff81fa89699911b207059e493defdba9647eaf18f23abdf3674e0fb" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-loader-v4-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ddacd3cff6428639606bf5f4b1d3bf7d9eadd5eedcc22947ba79e3fa48fbe44" +dependencies = [ + "log", + "qualifier_attr", + "solana-account", + "solana-bincode", + "solana-bpf-loader-program", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-transaction-context", +] + +[[package]] +name = "solana-logger" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef7421d1092680d72065edbf5c7605856719b021bf5f173656c71febcdd5d003" +dependencies = [ + "env_logger", + "lazy_static", + "libc", + "log", + "signal-hook", +] + +[[package]] +name = "solana-measure" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54d09ba4775513d877ff3dc22807ace9eee71b5eea78405f073b61e40c34e56" + +[[package]] +name = "solana-message" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" +dependencies = [ + "bincode 1.3.3", + "blake3", + "lazy_static", + "serde", + "serde_derive", + "solana-address 2.6.1", + "solana-hash 4.4.0", + "solana-instruction", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-transaction-error", +] + +[[package]] +name = "solana-metrics" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca6ac7323395b9363be946e308ab8c85769ff501b641f123b64709ca07cc7c3" +dependencies = [ + "crossbeam-channel", + "gethostname", + "log", + "reqwest", + "solana-cluster-type", + "solana-sha256-hasher", + "solana-time-utils", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-msg" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726b7cbbc6be6f1c6f29146ac824343b9415133eee8cce156452ad1db93f8008" +dependencies = [ + "solana-define-syscall 5.1.0", +] + +[[package]] +name = "solana-native-token" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" + +[[package]] +name = "solana-net-utils" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07a6059b386b7a880be65c263115deec3d578edb38510eb83866f1f59972b27" +dependencies = [ + "anyhow", + "bincode 1.3.3", + "bytes", + "itertools 0.12.1", + "log", + "nix", + "rand 0.8.6", + "serde", + "serde_derive", + "socket2 0.6.4", + "solana-serde", + "tokio", + "url", +] + +[[package]] +name = "solana-nohash-hasher" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" + +[[package]] +name = "solana-nonce" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95dbc9f2e33b6c10e231df15cb2a3bff9ea7eab6347f9e316fe75c97fd67bbb" +dependencies = [ + "serde", + "serde_derive", + "solana-fee-calculator", + "solana-hash 4.4.0", + "solana-pubkey 4.2.0", + "solana-sha256-hasher", +] + +[[package]] +name = "solana-nonce-account" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" +dependencies = [ + "solana-account", + "solana-hash 3.1.0", + "solana-nonce", + "solana-sdk-ids", +] + +[[package]] +name = "solana-nullable" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7b49f68ccea949a6ea75f485dbe2e17cf4c1d894ed262371d584269359e1a0" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "solana-offchain-message" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e2a1141a673f72a05cf406b99e4b2b8a457792b7c01afa07b3f00d4e2de393" +dependencies = [ + "num_enum", + "solana-hash 3.1.0", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sanitize", + "solana-sha256-hasher", + "solana-signature", + "solana-signer", +] + +[[package]] +name = "solana-packet" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edf2f25743c95229ac0fdc32f8f5893ef738dbf332c669e9861d33ddb0f469d" +dependencies = [ + "bincode 1.3.3", + "bitflags 2.13.0", + "cfg_eval", + "serde", + "serde_derive", + "serde_with", +] + +[[package]] +name = "solana-perf" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1e71dfb4fa49492f1e94b0526d52f51c41eb01d4bb46097b0c0949ac5210dc" +dependencies = [ + "ahash 0.8.12", + "bincode 1.3.3", + "bv", + "bytes", + "caps", + "curve25519-dalek 4.1.3", + "dlopen2", + "fnv", + "libc", + "log", + "nix", + "rand 0.8.6", + "rayon", + "serde", + "solana-hash 3.1.0", + "solana-message", + "solana-metrics", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-rayon-threadlimit", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-time-utils", +] + +[[package]] +name = "solana-poh-config" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f1fef1f2ff2480fdbcc64bef5e3c47bec6e1647270db88b43f23e3a55f8d9cf" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-poseidon" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71f0626f8c9f3237ba8bbfc90761fa28ce8979b8ea3e08b5019bb495a70f0c7a" +dependencies = [ + "ark-bn254 0.4.0", + "light-poseidon", + "solana-define-syscall 3.0.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-precompile-error" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cafcd950de74c6c39d55dc8ca108bbb007799842ab370ef26cf45a34453c31e1" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-presigner" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f704eaf825be3180832445b9e4983b875340696e8e7239bf2d535b0f86c14a2" +dependencies = [ + "solana-pubkey 3.0.0", + "solana-signature", + "solana-signer", +] + +[[package]] +name = "solana-program" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91b12305dd81045d705f427acd0435a2e46444b65367d7179d7bdcfc3bc5f5eb" +dependencies = [ + "memoffset", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-borsh", + "solana-clock", + "solana-cpi", + "solana-define-syscall 3.0.0", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-epoch-stake", + "solana-example-mocks", + "solana-fee-calculator", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instruction-error", + "solana-instructions-sysvar", + "solana-keccak-hasher", + "solana-last-restart-slot", + "solana-msg", + "solana-native-token", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-serde-varint", + "solana-serialize-utils", + "solana-sha256-hasher", + "solana-short-vec", + "solana-slot-hashes", + "solana-slot-history", + "solana-stable-layout", + "solana-sysvar", + "solana-sysvar-id", +] + +[[package]] +name = "solana-program-entrypoint" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c9b0a1ff494e05f503a08b3d51150b73aa639544631e510279d6375f290997" +dependencies = [ + "solana-account-info", + "solana-define-syscall 4.0.1", + "solana-program-error", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-program-error" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f04fa578707b3612b095f0c8e19b66a1233f7c42ca8082fcb3b745afcc0add6" +dependencies = [ + "borsh", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-program-memory" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4068648649653c2c50546e9a7fb761791b5ab0cda054c771bb5808d3a4b9eb52" +dependencies = [ + "solana-define-syscall 4.0.1", +] + +[[package]] +name = "solana-program-option" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a88006a9b8594088cec9027ab77caaaa258a2aaa2083d3f086c44b42e50aeab" + +[[package]] +name = "solana-program-pack" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7701cb15b90667ae1c89ef4ac35a59c61e66ce58ddee13d729472af7f41d59" +dependencies = [ + "solana-program-error", +] + +[[package]] +name = "solana-program-runtime" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6ad17b62e8c0c4d1129a4f0355e459d722f66d05fa5686aa5c799f1e561cc2" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "itertools 0.12.1", + "log", + "percentage", + "rand 0.8.6", + "serde", + "solana-account", + "solana-clock", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-slot-hashes", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-transaction", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction-context", +] + +[[package]] +name = "solana-program-test" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "154cf61364d8dd7abdf42f482c77801605671b359e201d41bd40728ff97cb147" +dependencies = [ + "agave-feature-set", + "assert_matches", + "async-trait", + "base64 0.22.1", + "bincode 1.3.3", + "chrono-humanize", + "crossbeam-channel", + "log", + "serde", + "solana-account", + "solana-account-info", + "solana-accounts-db", + "solana-banks-client", + "solana-banks-interface", + "solana-banks-server", + "solana-clock", + "solana-cluster-type", + "solana-commitment-config", + "solana-compute-budget", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-genesis-config", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-loader-v3-interface", + "solana-logger", + "solana-message", + "solana-msg", + "solana-native-token", + "solana-poh-config", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-runtime", + "solana-sbpf", + "solana-sdk-ids", + "solana-signer", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm", + "solana-svm-log-collector", + "solana-svm-timings", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "solana-vote-program", + "spl-generic-token", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-pubkey" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" +dependencies = [ + "rand 0.8.6", + "solana-address 1.1.0", +] + +[[package]] +name = "solana-pubkey" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" +dependencies = [ + "solana-address 2.6.1", +] + +[[package]] +name = "solana-pubsub-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d576830da33ab32decfe2b4544fce157241c20de8331f27eca7d902062c2323b" +dependencies = [ + "crossbeam-channel", + "futures-util", + "http 0.2.12", + "log", + "semver 1.0.28", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-clock", + "solana-pubkey 3.0.0", + "solana-rpc-client-types", + "solana-signature", + "thiserror 2.0.18", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ada1c8fa92747e20621d33ea1fb715e97060787863492c6ce8250d0517f7a00" +dependencies = [ + "async-lock", + "async-trait", + "futures", + "itertools 0.12.1", + "log", + "quinn", + "quinn-proto", + "rustls 0.23.41", + "solana-connection-cache", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-pubkey 3.0.0", + "solana-quic-definitions", + "solana-rpc-client-api", + "solana-signer", + "solana-streamer", + "solana-tls-utils", + "solana-transaction-error", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-quic-definitions" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15319accf7d3afd845817aeffa6edd8cc185f135cefbc6b985df29cfd8c09609" +dependencies = [ + "solana-keypair", +] + +[[package]] +name = "solana-rayon-threadlimit" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325993b3a280fb9712164db45521bd62074536a9b768e3f488b432b31df141df" +dependencies = [ + "log", + "num_cpus", +] + +[[package]] +name = "solana-rent" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e860d5499a705369778647e97d760f7670adfb6fc8419dd3d568deccd46d5487" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-rent" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39f0d780bf8e8a1fe8b5b5fce1acad6b209485b86dec246e7523d5e4a8b7c7fc" +dependencies = [ + "solana-sdk-macro", +] + +[[package]] +name = "solana-reward-info" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82be7946105c2ee6be9f9ee7bd18a068b558389221d29efa92b906476102bfcc" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-rpc-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc46e47bda34aee5cc04c794f2b3eaf2e2fccd09742c162aaae34dcd4932b6d" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "futures", + "indicatif", + "log", + "reqwest", + "reqwest-middleware", + "semver 1.0.28", + "serde", + "serde_derive", + "serde_json", + "solana-account", + "solana-account-decoder-client-types", + "solana-clock", + "solana-commitment-config", + "solana-epoch-info", + "solana-epoch-schedule", + "solana-feature-gate-interface", + "solana-hash 3.1.0", + "solana-instruction", + "solana-message", + "solana-pubkey 3.0.0", + "solana-rpc-client-api", + "solana-signature", + "solana-transaction", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-version", + "solana-vote-interface", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fe213690cc657c1f0604d4f0955ca78ff912e3c6df2ed8925479ca850332c44" +dependencies = [ + "anyhow", + "jsonrpc-core", + "reqwest", + "reqwest-middleware", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-clock", + "solana-rpc-client-types", + "solana-signer", + "solana-transaction-error", + "solana-transaction-status-client-types", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feef6cb97e3f48a0fde1cee07c900629fdcd9414fa8abf3aa475f693226d62eb" +dependencies = [ + "solana-account", + "solana-commitment-config", + "solana-hash 3.1.0", + "solana-message", + "solana-nonce", + "solana-pubkey 3.0.0", + "solana-rpc-client", + "solana-sdk-ids", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-rpc-client-types" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcafd3a8a77baef8b8c1725746ba3cbaf6e8a9ef9df0f13599c4b468aa344fcc" +dependencies = [ + "base64 0.22.1", + "bs58", + "semver 1.0.28", + "serde", + "serde_derive", + "serde_json", + "solana-account", + "solana-account-decoder-client-types", + "solana-clock", + "solana-commitment-config", + "solana-fee-calculator", + "solana-inflation", + "solana-pubkey 3.0.0", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-version", + "spl-generic-token", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-runtime" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f61ce070c2a80b9ae53c12217a2c386377e1cc26b60358deb025b05ef93f80" +dependencies = [ + "agave-feature-set", + "agave-precompiles", + "agave-reserved-account-keys", + "agave-syscalls", + "ahash 0.8.12", + "aquamarine", + "arc-swap", + "arrayref", + "assert_matches", + "base64 0.22.1", + "bincode 1.3.3", + "blake3", + "bv", + "bytemuck", + "crossbeam-channel", + "dashmap", + "dir-diff", + "fnv", + "im", + "itertools 0.12.1", + "libc", + "log", + "lz4", + "memmap2 0.9.11", + "mockall 0.11.4", + "modular-bitfield", + "num-derive", + "num-traits", + "num_cpus", + "num_enum", + "percentage", + "qualifier_attr", + "rand 0.8.6", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "serde_with", + "solana-account", + "solana-account-info", + "solana-accounts-db", + "solana-address-lookup-table-interface", + "solana-bpf-loader-program", + "solana-bucket-map", + "solana-builtins", + "solana-client-traits", + "solana-clock", + "solana-cluster-type", + "solana-commitment-config", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-compute-budget-interface", + "solana-cost-model", + "solana-cpi", + "solana-ed25519-program", + "solana-epoch-info", + "solana-epoch-rewards-hasher", + "solana-epoch-schedule", + "solana-feature-gate-interface", + "solana-fee", + "solana-fee-calculator", + "solana-fee-structure", + "solana-genesis-config", + "solana-hard-forks", + "solana-hash 3.1.0", + "solana-inflation", + "solana-instruction", + "solana-keypair", + "solana-lattice-hash", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-measure", + "solana-message", + "solana-metrics", + "solana-native-token", + "solana-nohash-hasher", + "solana-nonce", + "solana-nonce-account", + "solana-packet", + "solana-perf", + "solana-poh-config", + "solana-precompile-error", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rayon-threadlimit", + "solana-rent 3.1.0", + "solana-reward-info", + "solana-runtime-transaction", + "solana-sdk-ids", + "solana-secp256k1-program", + "solana-seed-derivable", + "solana-serde", + "solana-sha256-hasher", + "solana-signature", + "solana-signer", + "solana-slot-hashes", + "solana-slot-history", + "solana-stake-interface", + "solana-stake-program", + "solana-svm", + "solana-svm-callback", + "solana-svm-timings", + "solana-svm-transaction", + "solana-system-interface 2.0.0", + "solana-system-transaction", + "solana-sysvar", + "solana-sysvar-id", + "solana-time-utils", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-unified-scheduler-logic", + "solana-version", + "solana-vote", + "solana-vote-interface", + "solana-vote-program", + "spl-generic-token", + "static_assertions", + "strum 0.24.1", + "strum_macros 0.24.3", + "symlink", + "tar", + "tempfile", + "thiserror 2.0.18", + "zstd", +] + +[[package]] +name = "solana-runtime-transaction" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe17453378bb43c44793f3b5361e14318d5693237682c77ea7b1f749eb1c675" +dependencies = [ + "agave-transaction-view", + "log", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-signature", + "solana-svm-transaction", + "solana-transaction", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-sanitize" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" + +[[package]] +name = "solana-sbpf" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f224d906c14efc7ed7f42bc5fe9588f3f09db8cabe7f6023adda62a69678e1a" +dependencies = [ + "byteorder", + "combine 3.8.1", + "hash32", + "libc", + "log", + "rand 0.8.6", + "rustc-demangle", + "thiserror 2.0.18", + "winapi", +] + +[[package]] +name = "solana-sdk" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f03df7969f5e723ad31b6c9eadccc209037ac4caa34d8dc259316b05c11e82b" +dependencies = [ + "bincode 1.3.3", + "bs58", + "serde", + "solana-account", + "solana-epoch-info", + "solana-epoch-rewards-hasher", + "solana-fee-structure", + "solana-inflation", + "solana-keypair", + "solana-message", + "solana-offchain-message", + "solana-presigner", + "solana-program", + "solana-program-memory", + "solana-pubkey 3.0.0", + "solana-sanitize", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-serde", + "solana-serde-varint", + "solana-short-vec", + "solana-shred-version", + "solana-signature", + "solana-signer", + "solana-time-utils", + "solana-transaction", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-sdk-ids" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" +dependencies = [ + "solana-address 2.6.1", +] + +[[package]] +name = "solana-sdk-macro" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8765316242300c48242d84a41614cb3388229ec353ba464f6fe62a733e41806f" +dependencies = [ + "bs58", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "solana-secp256k1-program" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad4cf8232f7aef9ff2dd95d701f63e3c11909dec2400def5c361be29d24291e7" +dependencies = [ + "digest 0.10.7", + "k256", + "serde", + "serde_derive", + "sha3", + "solana-signature", +] + +[[package]] +name = "solana-secp256k1-recover" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a1ad3ed7846631c88c71c5d2f21a2ecb6b61da333d9be173b6b061b35609ae" +dependencies = [ + "k256", + "solana-define-syscall 5.1.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-secp256r1-program" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445d8e12592631d76fc4dc57858bae66c9fd7cc838c306c62a472547fc9d0ce6" +dependencies = [ + "bytemuck", + "openssl", + "solana-instruction", + "solana-sdk-ids", +] + +[[package]] +name = "solana-seed-derivable" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7bdb72758e3bec33ed0e2658a920f1f35dfb9ed576b951d20d63cb61ecd95c" +dependencies = [ + "solana-derivation-path", +] + +[[package]] +name = "solana-seed-phrase" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc905b200a95f2ea9146e43f2a7181e3aeb55de6bc12afb36462d00a3c7310de" +dependencies = [ + "hmac 0.12.1", + "pbkdf2", + "sha2 0.10.9", +] + +[[package]] +name = "solana-send-transaction-service" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a1818c7704bf16d5cee1d264c75012092ab35ceb1b39da1f79d803afcccde23" +dependencies = [ + "async-trait", + "crossbeam-channel", + "itertools 0.12.1", + "log", + "solana-client", + "solana-clock", + "solana-connection-cache", + "solana-hash 3.1.0", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-nonce-account", + "solana-pubkey 3.0.0", + "solana-quic-definitions", + "solana-runtime", + "solana-signature", + "solana-time-utils", + "solana-tpu-client-next", + "tokio", + "tokio-util 0.7.18", +] + +[[package]] +name = "solana-serde" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709a93cab694c70f40b279d497639788fc2ccbcf9b4aa32273d4b361322c02dd" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-serde-varint" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950e5b83e839dc0f92c66afc124bb8f40e89bc90f0579e8ec5499296d27f54e3" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-serialize-utils" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761357b0853c9623bf12c1d2314b3d6160a85b087b84c45224fb85766d22616b" +dependencies = [ + "solana-instruction-error", + "solana-pubkey 4.2.0", + "solana-sanitize", +] + +[[package]] +name = "solana-sha256-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" +dependencies = [ + "sha2 0.10.9", + "solana-define-syscall 4.0.1", + "solana-hash 4.4.0", +] + +[[package]] +name = "solana-short-vec" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8250a4495aad49ad20556a607da53bdcb20de78da10b65afbf918b7f1de647" +dependencies = [ + "serde_core", +] + +[[package]] +name = "solana-shred-version" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6c79722e299d957958bf33695f7cd1ef6724ff55563c60fd9e3e24487cccde2" +dependencies = [ + "solana-hard-forks", + "solana-hash 4.4.0", + "solana-sha256-hasher", +] + +[[package]] +name = "solana-signature" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0364c7577c3c82a693ce28a1febc8d1b5d1b0a175fdc2114ae6186b69effe1e" +dependencies = [ + "ed25519-dalek 2.2.0", + "five8", + "rand 0.9.4", + "serde", + "serde-big-array", + "serde_derive", + "solana-sanitize", + "wincode", +] + +[[package]] +name = "solana-signer" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520bd6021163ee517f4bdc7ae03ded904f97e11320001ba0b3355f45eb14f558" +dependencies = [ + "solana-pubkey 4.2.0", + "solana-signature", + "solana-transaction-error", +] + +[[package]] +name = "solana-slot-hashes" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7ce2b4b8911bf2db3de7b6266e67bfc21a6a9f8c566fb096d9782ca2ad16ee" +dependencies = [ + "serde", + "serde_derive", + "solana-get-sysvar", + "solana-hash 4.4.0", + "solana-sdk-ids", + "solana-sysvar-id", +] + +[[package]] +name = "solana-slot-history" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40427c04d3e808493cb5e3d1a97cef84d7c15cb6f89b15c5684d0d4027105600" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-get-sysvar", + "solana-sdk-ids", + "solana-sysvar-id", +] + +[[package]] +name = "solana-stable-layout" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" +dependencies = [ + "solana-instruction", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "solana-stake-interface" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-clock", + "solana-cpi", + "solana-instruction", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-sysvar-id", +] + +[[package]] +name = "solana-stake-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "813b38448d59514b29553a450aaf9d8b37d86105a7c77f64f61feef37540fe91" +dependencies = [ + "agave-feature-set", + "bincode 1.3.3", + "log", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-config-interface", + "solana-genesis-config", + "solana-instruction", + "solana-native-token", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-stake-interface", + "solana-svm-log-collector", + "solana-svm-type-overrides", + "solana-sysvar", + "solana-transaction-context", + "solana-vote-interface", +] + +[[package]] +name = "solana-streamer" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f9b5710a67b472c99ab3c11b4b9a0c6325a6b01b22ed200ed144ec548eeaa4" +dependencies = [ + "arc-swap", + "async-channel", + "bytes", + "crossbeam-channel", + "dashmap", + "futures", + "futures-util", + "governor", + "histogram", + "indexmap", + "itertools 0.12.1", + "libc", + "log", + "nix", + "num_cpus", + "pem", + "percentage", + "quinn", + "quinn-proto", + "rand 0.8.6", + "rustls 0.23.41", + "smallvec", + "socket2 0.6.4", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-packet", + "solana-perf", + "solana-pubkey 3.0.0", + "solana-quic-definitions", + "solana-signature", + "solana-signer", + "solana-time-utils", + "solana-tls-utils", + "solana-transaction-error", + "solana-transaction-metrics-tracker", + "thiserror 2.0.18", + "tokio", + "tokio-util 0.7.18", + "x509-parser", +] + +[[package]] +name = "solana-svm" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb1bccdf5c6a0d17fa9a3b1a6b3414f993aeaeeee8ee49702a36b34203d572d" +dependencies = [ + "ahash 0.8.12", + "log", + "percentage", + "serde", + "serde_derive", + "solana-account", + "solana-clock", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instructions-sysvar", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-loader-v4-program", + "solana-message", + "solana-nonce", + "solana-nonce-account", + "solana-program-entrypoint", + "solana-program-pack", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-transaction", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-sysvar-id", + "solana-transaction-context", + "solana-transaction-error", + "spl-generic-token", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-svm-callback" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be2f26d7b6940c76e6b01f437b13972e7bcbedffdaa2923f181b63bd692df92" +dependencies = [ + "solana-account", + "solana-clock", + "solana-precompile-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-feature-set" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7ecbcb61e0686ab5a31a19b58532f322c70e5869d354d18e4f680df1bd7100" + +[[package]] +name = "solana-svm-log-collector" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824cab5bf43604210a59d99ad39f11fedecca2c77806ba43e61799e04383ce67" +dependencies = [ + "log", +] + +[[package]] +name = "solana-svm-measure" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2185a9dd28d4f6f63bd15e727018c6e2ee1e8412416fb7ae7ffcd8f6fa3d4808" + +[[package]] +name = "solana-svm-timings" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c05c5a004c4a2698396ed3be4dd486075a0f99432595eb9b02f2ec0143fd942" +dependencies = [ + "eager", + "enum-iterator", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-transaction" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2df7a0213bc369f1b7e9481495362a92e966bca547d77188b235370910c98866" +dependencies = [ + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-signature", + "solana-transaction", +] + +[[package]] +name = "solana-svm-type-overrides" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c878c6880ebec401133983857f296b71f177afccbc551b3fb0fd1fe39fec9d5" +dependencies = [ + "rand 0.8.6", +] + +[[package]] +name = "solana-system-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-system-interface" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b54965bf0b76fa8e2b35376583efddd4d916618cfe595bf48c7d7b55a9e628" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-address 2.6.1", + "solana-instruction", + "solana-msg", + "solana-program-error", +] + +[[package]] +name = "solana-system-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e399cba7565e4549776426cef7ecd780a7e577febd64546b4083428641e3962" +dependencies = [ + "bincode 1.3.3", + "log", + "serde", + "serde_derive", + "solana-account", + "solana-bincode", + "solana-fee-calculator", + "solana-instruction", + "solana-nonce", + "solana-nonce-account", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-transaction-context", +] + +[[package]] +name = "solana-system-transaction" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31b5699ec533621515e714f1533ee6b3b0e71c463301d919eb59b8c1e249d30" +dependencies = [ + "solana-hash 3.1.0", + "solana-keypair", + "solana-message", + "solana-pubkey 3.0.0", + "solana-signer", + "solana-system-interface 2.0.0", + "solana-transaction", +] + +[[package]] +name = "solana-sysvar" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-define-syscall 4.0.1", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash 4.4.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey 4.2.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", + "solana-sysvar-id", +] + +[[package]] +name = "solana-sysvar-id" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +dependencies = [ + "solana-address 2.6.1", + "solana-sdk-ids", +] + +[[package]] +name = "solana-time-utils" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced92c60aa76ec4780a9d93f3bd64dfa916e1b998eacc6f1c110f3f444f02c9" + +[[package]] +name = "solana-tls-utils" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53980fcde4ee812d26a7bd4cb07ca9b3a111951145c9f0f3533e6d6139dafea0" +dependencies = [ + "rustls 0.23.41", + "solana-keypair", + "solana-pubkey 3.0.0", + "solana-signer", + "x509-parser", +] + +[[package]] +name = "solana-tpu-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00122487e49ad299e5568082cd8753e5be159b09c8a8bebf430ed50d8837efdc" +dependencies = [ + "async-trait", + "bincode 1.3.3", + "futures-util", + "indexmap", + "indicatif", + "log", + "rayon", + "solana-client-traits", + "solana-clock", + "solana-commitment-config", + "solana-connection-cache", + "solana-epoch-schedule", + "solana-measure", + "solana-message", + "solana-net-utils", + "solana-pubkey 3.0.0", + "solana-pubsub-client", + "solana-quic-definitions", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-signature", + "solana-signer", + "solana-transaction", + "solana-transaction-error", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-tpu-client-next" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d9a42530995727ee60cf72fd84d0e8b29eaca38a13c53bf11bb82a523c9bcdb" +dependencies = [ + "async-trait", + "log", + "lru 0.7.8", + "quinn", + "rustls 0.23.41", + "solana-clock", + "solana-connection-cache", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-quic-definitions", + "solana-rpc-client", + "solana-streamer", + "solana-time-utils", + "solana-tls-utils", + "solana-tpu-client", + "thiserror 2.0.18", + "tokio", + "tokio-util 0.7.18", +] + +[[package]] +name = "solana-transaction" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-address 2.6.1", + "solana-hash 4.4.0", + "solana-instruction", + "solana-instruction-error", + "solana-message", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-signer", + "solana-transaction-error", +] + +[[package]] +name = "solana-transaction-context" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acc12cfe0ac1e3d23ddca08cb01123d08c5b98b8b4814eb367ec245122c0d7d1" +dependencies = [ + "bincode 1.3.3", + "serde", + "serde_derive", + "solana-account", + "solana-instruction", + "solana-instructions-sysvar", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", +] + +[[package]] +name = "solana-transaction-error" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a949797bc1ac31836d0070e791083028a8c2e0d493fa4cf51c0bed7a04c65c22" +dependencies = [ + "serde", + "serde_derive", + "solana-instruction-error", + "solana-sanitize", +] + +[[package]] +name = "solana-transaction-metrics-tracker" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4abd1130318189f464bfb814fc9ee7544f76f9f86de219cc5eb4a02a3564743" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "log", + "rand 0.8.6", + "solana-packet", + "solana-perf", + "solana-short-vec", + "solana-signature", +] + +[[package]] +name = "solana-transaction-status" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e90aab95c3326571bae0784d27f1ed63c49d6988501d61b1a8a6a61c265f578" +dependencies = [ + "Inflector", + "agave-reserved-account-keys", + "base64 0.22.1", + "bincode 1.3.3", + "borsh", + "bs58", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-address-lookup-table-interface", + "solana-clock", + "solana-hash 3.1.0", + "solana-instruction", + "solana-loader-v2-interface", + "solana-loader-v3-interface", + "solana-message", + "solana-program-option", + "solana-pubkey 3.0.0", + "solana-reward-info", + "solana-sdk-ids", + "solana-signature", + "solana-stake-interface", + "solana-system-interface 2.0.0", + "solana-transaction", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-vote-interface", + "spl-associated-token-account-interface", + "spl-memo-interface", + "spl-token-2022-interface", + "spl-token-group-interface", + "spl-token-interface", + "spl-token-metadata-interface", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-transaction-status-client-types" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983dcea68b4626b8829098b4046869124fb107e6a67897b1e5964c92b8d31bc" +dependencies = [ + "base64 0.22.1", + "bincode 1.3.3", + "bs58", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-commitment-config", + "solana-instruction", + "solana-message", + "solana-pubkey 3.0.0", + "solana-reward-info", + "solana-signature", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-udp-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f642b80d0c71fead2d794e9cc67dabbc3fc94c6ea9d43be8562c8cb249d83f9a" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-keypair", + "solana-net-utils", + "solana-streamer", + "solana-transaction-error", + "thiserror 2.0.18", + "tokio", +] + +[[package]] +name = "solana-unified-scheduler-logic" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d17226a237a7f3269063827d9752c3f8d7c62487ba49ac848794893527d80c03" +dependencies = [ + "assert_matches", + "solana-pubkey 3.0.0", + "solana-runtime-transaction", + "solana-transaction", + "static_assertions", + "unwrap_none", +] + +[[package]] +name = "solana-version" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff03ccee2881ce60058fda9d256b68fcc3b6ecd467e613a1d7c3d64b78d91083" +dependencies = [ + "agave-feature-set", + "rand 0.8.6", + "semver 1.0.28", + "serde", + "serde_derive", + "solana-sanitize", + "solana-serde-varint", +] + +[[package]] +name = "solana-vote" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1dfa471b3cf5ee27ba535d9256da6628b1fb89c8f1cbba2f3dbf081576fee32" +dependencies = [ + "itertools 0.12.1", + "log", + "serde", + "serde_derive", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-serialize-utils", + "solana-signature", + "solana-signer", + "solana-svm-transaction", + "solana-transaction", + "solana-vote-interface", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-vote-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66631ddbe889dab5ec663294648cd1df395ec9df7a4476e7b3e095604cfdb539" +dependencies = [ + "bincode 1.3.3", + "cfg_eval", + "num-derive", + "num-traits", + "serde", + "serde_derive", + "serde_with", + "solana-clock", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-serde-varint", + "solana-serialize-utils", + "solana-short-vec", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-vote-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f470d8bb37eeed628532ab2c9a2c1f1dc91acf11c2d17c9260157009992dd1" +dependencies = [ + "agave-feature-set", + "bincode 1.3.3", + "log", + "num-derive", + "num-traits", + "serde", + "serde_derive", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-epoch-schedule", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-signer", + "solana-slot-hashes", + "solana-transaction", + "solana-transaction-context", + "solana-vote-interface", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-zero-copy" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea15126ebdc7e270c50d43884369af9f51d2308156d46a18e351522a164844d" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", +] + +[[package]] +name = "solana-zk-elgamal-proof-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3608816af7d734e557997da585ebea22a138d53a06b723d8d9d20e87d4a4cb" +dependencies = [ + "agave-feature-set", + "bytemuck", + "num-derive", + "num-traits", + "solana-instruction", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-sdk", +] + +[[package]] +name = "solana-zk-sdk" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode 1.3.3", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "getrandom 0.2.17", + "itertools 0.12.1", + "js-sys", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.6", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-derivation-path", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "subtle", + "thiserror 2.0.18", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-zk-token-proof-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa8432001b2fc671040f944db567f25b33b3a36a3d8889a93ba86082ca2fc2d" +dependencies = [ + "agave-feature-set", + "bytemuck", + "num-derive", + "num-traits", + "solana-instruction", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-token-sdk", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc229188fab61e2ba16c2a6eb4ed04589c41ade03cf708ae4a5c3db5ae4b01f0" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode 1.3.3", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "itertools 0.12.1", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.6", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-curve25519", + "solana-derivation-path", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "subtle", + "thiserror 2.0.18", + "zeroize", +] + +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" + +[[package]] +name = "spinning_top" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "spl-associated-token-account-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6433917b60441d68d99a17e121d9db0ea15a9a69c0e5afa34649cf5ba12612f" +dependencies = [ + "borsh", + "solana-instruction", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "spl-discriminator" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e597c5ff9ed7c74a54dbc47bae2f06e4db8c98f4356ad280200dc11878266db1" +dependencies = [ + "bytemuck", + "solana-program-error", + "solana-sha256-hasher", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.118", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d1dbc82ab91422345b6df40a79e2b78c7bce1ebb366da323572dd60b7076b67" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.9", + "syn 2.0.118", + "thiserror 1.0.69", +] + +[[package]] +name = "spl-generic-token" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233df81b75ab99b42f002b5cdd6e65a7505ffa930624f7096a7580a56765e9cf" +dependencies = [ + "bytemuck", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "spl-memo-interface" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3745d384b0afee980d43d62b66c27bdcbbd03507732b8d3626d3413cb72084f2" +dependencies = [ + "solana-instruction", + "solana-pubkey 4.2.0", +] + +[[package]] +name = "spl-pod" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9c6e142cdf1e7e77f480053ec9f0ce989890768ddf91f619b50f39d1b456f5" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "num-derive", + "num-traits", + "num_enum", + "solana-program-error", + "solana-program-option", + "solana-pubkey 3.0.0", + "solana-zero-copy", + "solana-zk-sdk", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-2022-interface" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fcd81188211f4b3c8a5eba7fd534c7142f9dd026123b3472492782cc72f4dc6" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-zk-sdk", + "spl-pod", + "spl-token-confidential-transfer-proof-extraction", + "spl-token-confidential-transfer-proof-generation", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-type-length-value", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-extraction" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879a9ebad0d77383d3ea71e7de50503554961ff0f4ef6cbca39ad126e6f6da3a" +dependencies = [ + "bytemuck", + "solana-account-info", + "solana-curve25519", + "solana-instruction", + "solana-instructions-sysvar", + "solana-msg", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-zk-sdk", + "spl-pod", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-generation" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0cd59fce3dc00f563c6fa364d67c3f200d278eae681f4dc250240afcfe044b1" +dependencies = [ + "curve25519-dalek 4.1.3", + "solana-zk-sdk", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841cbd6f2322d02719be4da1affedbe6495b1048b7b985ec9796032564026e22" +dependencies = [ + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-address 2.6.1", + "solana-instruction", + "solana-nullable", + "solana-program-error", + "solana-zero-copy", + "spl-discriminator", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c564ac05a7c8d8b12e988a37d82695b5ba4db376d07ea98bc4882c81f96c7f3" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-instruction", + "solana-program-error", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c467c7c3bd056f8fe60119e7ec34ddd6f23052c2fa8f1f51999098063b72676" +dependencies = [ + "borsh", + "num-derive", + "num-traits", + "solana-borsh", + "solana-instruction", + "solana-program-error", + "solana-pubkey 3.0.0", + "spl-discriminator", + "spl-pod", + "spl-type-length-value", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-type-length-value" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2504631748c48d2a937414d64a12dcac4588d34bd07d355d648619c189d29435" +dependencies = [ + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-account-info", + "solana-program-error", + "solana-zero-copy", + "spl-discriminator", + "thiserror 2.0.18", +] + +[[package]] +name = "sprs" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dca58a33be2188d4edc71534f8bafa826e787cc28ca1c47f31be3423f0d6e55" +dependencies = [ + "ndarray", + "num-complex 0.4.6", + "num-traits", + "smallvec", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros 0.24.3", +] + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svm-hash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5daf24ef00565f2d53ab3fd548b0ac1f19325524061028ba9698902d86bb71" +dependencies = [ + "borsh", + "bytemuck", + "solana-hash 4.4.0", + "solana-sha256-hasher", +] + +[[package]] +name = "symlink" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "tabled" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e39a2ee1fbcd360805a771e1b300f78cc88fec7b8d3e2f71cd37bbf23e725c7d" +dependencies = [ + "papergrid 0.17.0", + "tabled_derive", + "testing_table", +] + +[[package]] +name = "tabled" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5dc662e6da844ad6e428ad16b57967c9d33c82e16bb1c258326c0c078605dff" +dependencies = [ + "papergrid 0.18.0", + "tabled_derive", + "testing_table", +] + +[[package]] +name = "tabled_derive" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea5d1b13ca6cff1f9231ffd62f15eefd72543dab5e468735f1a456728a02846" +dependencies = [ + "heck 0.5.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tarpc" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38a012bed6fb9681d3bf71ffaa4f88f3b4b9ed3198cda6e4c8462d24d4bb80" +dependencies = [ + "anyhow", + "fnv", + "futures", + "humantime", + "opentelemetry", + "pin-project", + "rand 0.8.6", + "serde", + "static_assertions", + "tarpc-plugins", + "thiserror 1.0.69", + "tokio", + "tokio-serde", + "tokio-util 0.6.10", + "tracing", + "tracing-opentelemetry", +] + +[[package]] +name = "tarpc-plugins" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "termtree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + +[[package]] +name = "testing_table" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f8daae29995a24f65619e19d8d31dea5b389f3d853d8bf297bbf607cd0014cc" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "thrift" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" +dependencies = [ + "byteorder", + "integer-encoding", + "ordered-float", +] + +[[package]] +name = "time" +version = "0.3.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.4", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-cron-scheduler" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c71ce8f810abc9fabebccc30302a952f9e89c6cf246fafaf170fef164063141" +dependencies = [ + "chrono", + "croner", + "num-derive", + "num-traits", + "tokio", + "tracing", + "uuid", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.41", + "tokio", +] + +[[package]] +name = "tokio-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" +dependencies = [ + "bincode 1.3.3", + "bytes", + "educe 0.4.23", + "futures-core", + "futures-sink", + "pin-project", + "serde", + "serde_json", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", + "tungstenite", + "webpki-roots 0.25.4", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "serde_core", + "serde_spanned", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "async-compression", + "bitflags 2.13.0", + "bytes", + "futures-core", + "futures-util", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "pin-project-lite", + "tokio", + "tokio-util 0.7.18", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" +dependencies = [ + "once_cell", + "opentelemetry", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 0.2.12", + "httparse", + "log", + "rand 0.8.6", + "rustls 0.21.12", + "sha1 0.10.6", + "thiserror 1.0.69", + "url", + "utf-8", + "webpki-roots 0.24.0", +] + +[[package]] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "unwrap_none" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "461d0c5956fcc728ecc03a3a961e4adc9a7975d86f6f8371389a289517c02ca9" + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "serde", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.118", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +dependencies = [ + "js-sys", + "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-root-certs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" +dependencies = [ + "rustls-webpki 0.101.7", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "webpki-roots" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "wincode" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d967db7705dc29120bb6e8ce5b5a2e27734ed5976d1c904e95bd238d1c3c5a" +dependencies = [ + "pastey", + "proc-macro2", + "quote", + "thiserror 2.0.18", + "wincode-derive", +] + +[[package]] +name = "wincode-derive" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15ab90b719560d0fda79c74550ad1c948d17b118765942838055ebaf34d67071" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +dependencies = [ + "memchr", +] + +[[package]] +name = "wiremock" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08db1edfb05d9b3c1542e521aea074442088292f00b5f28e435c714a98f85031" +dependencies = [ + "assert-json-diff", + "base64 0.22.1", + "deadpool", + "futures", + "http 1.4.2", + "http-body-util", + "hyper 1.10.1", + "hyper-util", + "log", + "once_cell", + "regex", + "serde", + "serde_json", + "tokio", + "url", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs", + "base64 0.13.1", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "yaml-rust2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "631a50d867fafb7093e709d75aaee9e0e0d5deb934021fcea25ac2fe09edc51e" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", + "synstructure 0.13.2", +] + +[[package]] +name = "zerocopy" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75726053136156d419e285b9b7eddaaea9e3fea6ce32eed44a89901f0bd98de1" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4714fd92cf900833d49538023a9b3915155210801d1c1169eba513b2addefd71" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", + "synstructure 0.13.2", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "zlib-rs" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5431d5661c32445236631278f27946e444ddafe4684cac70b185272d4f9c52d5" + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/offchain/Cargo.toml b/offchain/Cargo.toml new file mode 100644 index 0000000000..2bfb99c1ff --- /dev/null +++ b/offchain/Cargo.toml @@ -0,0 +1,207 @@ +[workspace] +exclude = ["programs/mock-shred-subscription-program"] +members = [ + "crates/contributor-rewards", + "crates/scheduled-command", + "crates/sentinel", + "crates/slack-notifier", + "crates/solana-interface/sol-conversion", + "crates/solana-admin-cli/passport", + "crates/solana-admin-cli/revenue-distribution", + "crates/solana-admin-cli/sol-conversion", + "crates/passport-cli", + "crates/solana-cli", + "crates/solana-client-tools", + "crates/solana-fork", + "crates/solana-sdk", + "crates/validator-debt", + "scheduler/native/scheduler_doublezero" +] +resolver = "2" + +[workspace.package] +version = "0.0.1" +edition = "2024" +authors = ["Malbec Labs "] +readme = "README.md" +license = "Apache-2.0" +repository = "https://github.com/malbeclabs/doublezero-offchain" +homepage = "https://github.com/malbeclabs/doublezero-offchain" + +[workspace.dependencies] +anyhow = "1" +arrow = "57" +async-trait = "0.1" +aws-config = "1" +aws-sdk-s3 = "1" +backon = "1" +base64 = "0.22" +bincode = "1" +bitvec = "1" +md5 = "0.8" +borsh = { version = "1", features = ["derive"] } +bs58 = "0.5" +bytemuck = { version = "1", features = ["derive", "min_const_generics"] } +chrono = { version = "0.4", features = ["serde"] } +clap = { version = "4", features = ["derive", "env"] } +config = "0.15" +csv = "1" +dotenvy = "0.15" +eyre = "0.6" +futures = "0.3" +governor = "0.6" +hex = "0.4" +home = "0.5" +humantime = "2" +indexmap = { version = "2", features = ["serde"] } +itertools = "0.14" +libc = "0.2" +leaky-bucket = "1" +metrics = "0.24" +metrics-exporter-prometheus = "0.17" +mockall = "0.13" +parquet = { version = "57", features = [ "async" ] } +percent-encoding = "2" +rayon = "1" +# rustls-tls bundles the webpki Mozilla roots; rustls-tls-native-roots adds the +# host OS certificate store so OS-installed private CAs stay trusted. +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "rustls-tls-native-roots"] } +retainer = "0.4" +rust_decimal = { version = "1", features = ["serde", "macros"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +solana-account-decoder = "3.0" +solana-account-decoder-client-types = "3.0" +solana-address-lookup-table-interface = { version = "3", features = ["bincode", "bytemuck"] } +solana-client = "3.0" +solana-commitment-config = "3.0" +solana-compute-budget-interface = "3.0" +solana-instruction = "3.0" +solana-message = { version = "3.0", features = ["bincode"] } +solana-pubkey = { version = "3.0", features = ["borsh", "bytemuck"] } +solana-reward-info = "3.0" +solana-rpc-client-types = "3.0" +solana-sanitize = "3.0" +# Held to the 3.0 minor: later 3.x releases of the meta-crate remove more +# deprecated re-exports (sysvar, account, message, ...) that this workspace +# still consumes. +solana-sdk = "=3.0" +solana-sdk-ids = "3.0" +solana-system-interface = ">=1,<=3" +solana-transaction-status-client-types = "3.0" +spl-associated-token-account-interface = ">=1,<=2" +spl-memo-interface = ">=1,<=2" +spl-token-interface = ">=1,<=2" +solana-loader-v3-interface = ">=5,<=6" +solana-offchain-message = { version = "3.0", features = ["verify"] } +solana-program-pack = "3.0" +solana-program-test = "=3.0.12" +strum = { version = "0.27", features = ["derive"] } +svm-hash = { version = "0.2", features = ["bytemuck", "borsh"] } +tabled = { version = "0.20", features = ["std", "derive"] } +tempfile = "3" +thiserror = "2" +tokio = { version = "1", default-features = false, features = ["macros", "rt-multi-thread", "signal"] } +tokio-cron-scheduler = "0.14" +tokio-util = "0.7" +tracing = "0.1" +tracing-subscriber = { version = "0.3", default-features = true, features = ["env-filter", "fmt", "registry"] } +url = "2" + +### Dependencies found in github.com/malbeclabs/doublezero-solana + +[workspace.dependencies.doublezero-passport] +features = ["offchain"] +git = "https://github.com/malbeclabs/doublezero-solana" +tag = "revenue-distribution/v0.3.7" + +[workspace.dependencies.doublezero-program-tools] +git = "https://github.com/malbeclabs/doublezero-solana" +tag = "revenue-distribution/v0.3.7" + +[workspace.dependencies.doublezero-revenue-distribution] +git = "https://github.com/malbeclabs/doublezero-solana" +tag = "revenue-distribution/v0.3.7" + +### Dependencies found in github.com/malbeclabs/doublezero + +# RFC-20 CLI core: provides CliContext, OutputFormat, RequirementCheck, the +# render_* output helpers, and the eyre-based error type. The whole SDK family +# is pinned to a single monorepo revision so shared types unify across the +# boundary. client/v0.31.0 is the first released client tag on the Solana 3.0 +# line (past #3830) and carries the EdgeSeat FeedSeat schema (#3954/#4030) +# deployed on testnet, replacing the interim #4030 merge-commit pin. +[workspace.dependencies.doublezero-cli-core] +git = "https://github.com/malbeclabs/doublezero" +tag = "client/v0.31.0" + +# Source of the RFC-20 `Environment` enum consumed by `CliContext`. MUST be +# pinned to the same revision as doublezero-cli-core so the `Environment` type +# unifies across the boundary. +[workspace.dependencies.doublezero-config] +git = "https://github.com/malbeclabs/doublezero" +tag = "client/v0.31.0" + +[workspace.dependencies.doublezero-program-common] +git = "https://github.com/malbeclabs/doublezero" +tag = "client/v0.31.0" + +[workspace.dependencies.doublezero-record] +features = ["no-entrypoint"] +git = "https://github.com/malbeclabs/doublezero" +tag = "client/v0.31.0" + +[workspace.dependencies.doublezero_sdk] +git = "https://github.com/malbeclabs/doublezero" +tag = "client/v0.31.0" + +[workspace.dependencies.doublezero-serviceability] +features = ["no-entrypoint", "serde"] +git = "https://github.com/malbeclabs/doublezero" +tag = "client/v0.31.0" + +[workspace.dependencies.doublezero-telemetry] +features = ["no-entrypoint", "serde"] +git = "https://github.com/malbeclabs/doublezero" +tag = "client/v0.31.0" + +### Other git dependencies + +[workspace.dependencies.network-shapley] +features = ["serde", "borsh"] +git = "https://github.com/doublezerofoundation/network-shapley-rs" +tag = "v0.6.0" + +### Local dependencies + +[workspace.dependencies.doublezero-contributor-rewards] +path = "crates/contributor-rewards" + +[workspace.dependencies.doublezero-scheduled-command] +path = "crates/scheduled-command" + +[workspace.dependencies.doublezero-ledger-sentinel] +path = "crates/sentinel" + +[workspace.dependencies.doublezero-passport-cli] +path = "crates/passport-cli" + +[workspace.dependencies.doublezero-sol-conversion-interface] +features = ["serde"] +path = "crates/solana-interface/sol-conversion" + +[workspace.dependencies.doublezero-solana-client-tools] +path = "crates/solana-client-tools" + +[workspace.dependencies.doublezero-solana-sdk] +path = "crates/solana-sdk" + +[workspace.dependencies.doublezero-solana-validator-debt] +path = "crates/validator-debt" + +[workspace.dependencies.slack-notifier] +path = "crates/slack-notifier" + +[profile.release] +lto = true +codegen-units = 1 diff --git a/offchain/Justfile b/offchain/Justfile new file mode 100644 index 0000000000..50c369114b --- /dev/null +++ b/offchain/Justfile @@ -0,0 +1,89 @@ +# Export required env +export SERVICEABILITY_PROGRAM_ID := "devnet" + +# Fail on warnings +export RUSTFLAGS := "-Dwarnings" + +# Default (list of commands) +default: + just -l + +# Run fmt +fmt: + @rustup component add rustfmt + @cargo fmt --all -- --config imports_granularity=Crate,group_imports=StdExternalCrate + +# Check fmt +fmt-check: + @rustup component add rustfmt + @cargo fmt --all -- --check --config imports_granularity=Crate,group_imports=StdExternalCrate || (echo "Formatting check failed. Please run 'just fmt' to fix formatting issues." && exit 1) + +# Build (release) +build: + cargo build --release + +# Run clippy +clippy: + cargo clippy --all-features --all-targets -- -Dclippy::all + +# Run tests +test: + cargo nextest run + +# Clean +clean: + cargo clean + +# Coverage +cov: + cargo llvm-cov nextest --lcov --output-path lcov.info + +# Coverage check (fail if below threshold) +cov-check: + cargo llvm-cov nextest --fail-under-lines 25 + +# Check Elixir formatting +elixir-fmt-check: + cd scheduler && mix format --check-formatted + +# Format Elixir code +elixir-fmt: + cd scheduler && mix format + +# Compile Elixir with warnings as errors +elixir-compile: + cd scheduler && mix compile --warnings-as-errors + +# Run Credo (strict) +elixir-credo: + cd scheduler && mix credo --strict + +# Run Elixir tests +elixir-test: + cd scheduler && mix test + +# Run CI pipeline +ci: + @just fmt-check + @just clippy + @just test + @just cov-check + +# Run unit tests only (fast, no external dependencies) +test-unit: + cargo nextest run + cd scheduler && mix test --cover + +# Run integration tests (requires local validator) +test-integration: + cargo test --features integration -p doublezero-solana-validator-debt + +# Run end-to-end tests (starts fork, runs full lifecycle) +test-e2e: + bash sh/test_full_debt_flow.sh + +# Run all tests (unit + integration + e2e) +test-all: + @just test-unit + @just test-integration + @just test-e2e diff --git a/offchain/LICENSE b/offchain/LICENSE new file mode 100644 index 0000000000..267d911ad6 --- /dev/null +++ b/offchain/LICENSE @@ -0,0 +1,190 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2025 DoubleZero Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/offchain/README.md b/offchain/README.md new file mode 100644 index 0000000000..1b43859a5b --- /dev/null +++ b/offchain/README.md @@ -0,0 +1,3 @@ +# DoubleZero Offchain + +Offchain components for the DoubleZero Network. diff --git a/offchain/crates/contributor-rewards/.env.example b/offchain/crates/contributor-rewards/.env.example new file mode 100644 index 0000000000..e8803d165b --- /dev/null +++ b/offchain/crates/contributor-rewards/.env.example @@ -0,0 +1,64 @@ +# DoubleZero Rewarder Configuration +# Copy this file to .env and modify as needed +# ALL environment variables are REQUIRED +# NOTICE the `__` dunders + +# Network Configuration (devnet, testnet, mainnet-beta, mainnet) +DZ__NETWORK=testnet + +# Logging +DZ__LOG_LEVEL=info + +# RPC Configuration +DZ__RPC__DZ_URL= +# Solana read client - for reading chain data (leader schedules, epoch info, etc) +DZ__RPC__SOLANA_READ_URL=https://api.mainnet-beta.solana.com +# Solana write client - for writing rewards data (merkle roots) +DZ__RPC__SOLANA_WRITE_URL=https://api.testnet.solana.com +DZ__RPC__COMMITMENT=confirmed +DZ__RPC__RPS_LIMIT=10 + +# Shapley Configuration +DZ__SHAPLEY__OPERATOR_UPTIME=0.98 +DZ__SHAPLEY__CONTIGUITY_BONUS=5.0 +DZ__SHAPLEY__DEMAND_MULTIPLIER=1.2 + +# Program IDs +DZ__PROGRAMS__SERVICEABILITY_PROGRAM_ID= +DZ__PROGRAMS__TELEMETRY_PROGRAM_ID= +# Shred subscription program ID comes from doublezero-solana-sdk. Override with: +# SHRED_SUBSCRIPTION_PROGRAM_ID= + +# Prefix Configuration +DZ__PREFIXES__DEVICE_TELEMETRY=doublezero_device_telemetry_aggregate +DZ__PREFIXES__INTERNET_TELEMETRY=doublezero_internet_telemetry_aggregate +DZ__PREFIXES__CONTRIBUTOR_REWARDS=dz_contributor_rewards +DZ__PREFIXES__REWARD_INPUT=dz_reward_input + +# Internet Telemetry Thresholds +DZ__INET_LOOKBACK__MIN_COVERAGE_THRESHOLD=0.8 +DZ__INET_LOOKBACK__MAX_EPOCHS_LOOKBACK=5 +DZ__INET_LOOKBACK__MIN_SAMPLES_PER_LINK=20 +DZ__INET_LOOKBACK__ENABLE_ACCUMULATOR=true +DZ__INET_LOOKBACK__DEDUP_WINDOW_US=10000000 + +# Telemetry Default Handling +DZ__TELEMETRY_DEFAULTS__MISSING_DATA_THRESHOLD=0.7 +DZ__TELEMETRY_DEFAULTS__PRIVATE_DEFAULT_LATENCY_MS=1000.0 +DZ__TELEMETRY_DEFAULTS__ENABLE_PREVIOUS_EPOCH_LOOKUP=true + +# Scheduler Configuration +DZ__SCHEDULER__INTERVAL_SECONDS=300 +DZ__SCHEDULER__STATE_FILE=/var/lib/doublezero-contributor-rewards/scheduler.state +DZ__SCHEDULER__MAX_CONSECUTIVE_FAILURES=10 +DZ__SCHEDULER__ENABLE_DRY_RUN=false +DZ__SCHEDULER__GRACE_PERIOD_MAX_WAIT_SECONDS=21600 + +# Metrics Configuration (Optional) +# Uncomment to enable Prometheus metrics export +DZ__METRICS__ADDR=127.0.0.1:9090 + +# Slack Notifications (Optional) +# DZ__SLACK__ENABLED=true +# DZ__SLACK__WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL +# DZ__SLACK__CHANNEL_ID=C0XXXXXXXXX diff --git a/offchain/crates/contributor-rewards/CHANGELOG.md b/offchain/crates/contributor-rewards/CHANGELOG.md new file mode 100644 index 0000000000..ccc381ef37 --- /dev/null +++ b/offchain/crates/contributor-rewards/CHANGELOG.md @@ -0,0 +1,146 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- test(contributor-rewards): fix the Shapley golden tests. `assert_close` now treats both values as equal once each is below `1e-6`, so the seven per-city entries that are cancellation noise (values around `1e-12`) no longer sit below their own comparison gate. `UPDATE_GOLDEN` now regenerates only when set to `1`, not on any set value, so a stale exported `UPDATE_GOLDEN=0` can no longer make both tests pass while silently overwriting the goldens. The fixture and goldens rename from `mn-beta` to `mainnet-beta`, matching the no-abbreviations rule +- test(contributor-rewards): extend the Shapley golden to per-city outputs. The aggregate can hide drift when two cities move in opposite directions, so the per-city values are pinned as well +- test(contributor-rewards): pin the aggregated Shapley output for the committed mainnet-beta fixture with a golden file, the crate's first test covering reward values. Drives `PreparedData::from_snapshot`, the same path the scheduler uses for snapshots. Structure (operator set, ordering, counts) is asserted exactly. Values use a 1e-12 relative tolerance, because bit-identical floating point is not guaranteed across architectures and an exact gate would go permanently red on a CI architecture change. Regenerate deliberately with `UPDATE_GOLDEN=1 cargo test -p doublezero-contributor-rewards` +- test(contributor-rewards): add a committed mainnet-beta snapshot fixture (`tests/goldens/mainnet-beta-epoch-129-trimmed.json`) and the script that produces it (`tests/goldens/make-fixture.py`), for a future Shapley golden test. The only previously committed snapshot (testnet) produces zero reward for every operator, so no golden test can assert a real value against it. Exact Shapley computation is O(2^n) in the operator count, so the fixture keeps only the 4 contributors with the most devices and the 6 cities with the most surviving devices among them, which keeps the network connected and the computation fast. It is not a byte-size trim of the full topology (malbeclabs/infra#2392) +- fix(contributor-rewards): migrate the access pass status value `Expired` to `ExpiredDeprecated` when loading a snapshot captured before doublezero-serviceability PR #3831 renamed that enum variant. Without the migration, such a snapshot fails to deserialize (malbeclabs/infra#2392) +- fix(contributor-rewards): the scheduler no longer writes a snapshot it cannot use. A failed leader-schedule fetch was warned and discarded, so an unusable snapshot overwrote the epoch's canonical S3 key and the tick then failed reading it back with "Missing leader schedule". Both producers now propagate the fetch error, and the scheduler validates before saving, which also covers `--dry-run`, where nothing validated at all. Scheduler failures log the full cause chain, and every `EpochFinder` RPC error is stripped of its request URL, in the retry logs and in the error it propagates, since that URL carries the mainnet-beta read endpoint's API key into journald and Loki (malbeclabs/infra#2372) +- fix(contributor-rewards): resolve the Solana epoch for a timestamp from real block times instead of dividing wall clock by a hardcoded 400ms slot duration. The old estimate drifted about 30k slots per day of lookback and picked the wrong epoch near a boundary, and no fixed constant survives the SIMD-0525 rollout. That epoch selects the leader schedule rewards are computed against, so the search now errors rather than returning a wrong answer: a backfill older than the endpoint's ledger retention fails on the `ingestor::demand` path instead of silently mis-estimating (malbeclabs/infra#2317) +- fix(contributor-rewards): `snapshot` validates before writing. It warns and continues when the leader schedule cannot be fetched, but every consumer rejects a snapshot without one, so the command exited 0 having written an unusable file under the canonical name and a `snapshot` then `export-shapley` chain failed a step late. Pre-existing, but reachable now that resolving the Solana epoch depends on block-time reads (malbeclabs/infra#2317) +- migrate to Solana 3.0: workspace `solana-*` crates and `solana-sdk` move to the 3.0 line, `solana-program-test` to 3.0.12, and the doublezero SDK git-deps repin from `client/v0.27.1` to the malbeclabs/doublezero#3830 merge revision (malbeclabs/infra#1853) +- release artifact now builds as a static `x86_64-unknown-linux-musl` binary (malbeclabs/infra#1853) +- TLS for HTTP clients moves from openssl to rustls; trust roots are the bundled webpki Mozilla set plus the host OS certificate store, so OS-installed private CAs remain trusted (malbeclabs/infra#1853) +- refactor(contributor-rewards): use the shared `Wallet` memo helpers from `solana-client-tools` in place of the local `RELAY_MEMO_CU` constant +- fix(contributor-rewards): backfill `User.feed_pk` (zero pubkey) in the snapshot compat migration so snapshots captured before doublezero#4030 still deserialize (malbeclabs/infra#1853) +- fix(contributor-rewards): handle a serviceability account that surfaces as a decode `Err` per-type instead of aborting the whole fetch mid-loop. AccessPass (reward-neutral) decode failures are warned and skipped; every other, reward-bearing type fails the epoch loudly after warning each bad account, since a partial snapshot would feed Shapley a shrunk graph and freeze a skewed merkle. Decode failures increment a `serviceability_decode_errors` metric (labeled by account type) and are surfaced as `DecodeErrors=` in the completion log ([#403](https://github.com/doublezerofoundation/doublezero-offchain/issues/403)) + +## [0.6.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.6.1) - 2026-06-13 + +- chore(contributor-rewards): bump doublezero client to `v0.27.1` ([#388](https://github.com/doublezerofoundation/doublezero-offchain/pull/388)) +- chore(contributor-rewards): converge the doublezero SDK family on `client/v0.25.1`, dropping the duplicate v0.20 lockfile entries; adapt to the v0.25 serviceability layout (flat `Device.interfaces`, renamed `UserStatus::*Deprecated` variants) and extend the snapshot compat migrations to backfill `Device.deprecated_interfaces`, the flat `Interface` projection, and `User.bgp_rtt_ns` ([#379](https://github.com/doublezerofoundation/doublezero-offchain/pull/379)) +- refactor(contributor-rewards): use the shared create-ATA compute-unit helper from `solana-client-tools` ([#386](https://github.com/doublezerofoundation/doublezero-offchain/pull/386)) + +## [0.6.0](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.6.0) - 2026-05-31 + +- fix(contributor-rewards): bump network shapley ([#377](https://github.com/doublezerofoundation/doublezero-offchain/pull/377)) + +## [0.5.5](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.5.5) - 2026-05-20 + +- release(contributor-rewards): prep v0.5.5 ([#371](https://github.com/doublezerofoundation/doublezero-offchain/pull/371)) +- docs(contributor-rewards): document reward calculation methodology ([#370](https://github.com/doublezerofoundation/doublezero-offchain/pull/370)) +- feat(contributor-rewards): add configurable public latency multiplier ([#369](https://github.com/doublezerofoundation/doublezero-offchain/pull/369)) + +## [0.5.4](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.5.4) - 2026-05-18 + +- fix(contributor-rewards) distribution summary reporting ([#366](https://github.com/doublezerofoundation/doublezero-offchain/pull/366)) + +## [0.5.3](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.5.3) - 2026-05-07 + +- fix(contributor-rewards): update shapley input defaults ([#359](https://github.com/doublezerofoundation/doublezero-offchain/pull/359)) + +## [0.5.2](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.5.2) - 2026-05-05 + +- feat(contributor-rewards): make demand parameters configurable ([#358](https://github.com/doublezerofoundation/doublezero-offchain/pull/358)) + +## [0.5.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.5.1) - 2026-05-04 + +- chore(contributor-rewards): bump to v0.5.1 ([#356](https://github.com/doublezerofoundation/doublezero-offchain/pull/356)) +- fix(contributor-rewards): subscriber decoding ([#353](https://github.com/doublezerofoundation/doublezero-offchain/pull/353)) + +## [0.5.0](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.5.0) - 2026-04-24 + +- feat(contributor-rewards): add shred subscription metro price fetching for demand inputs +- feat(contributor-rewards): add support for distribution slack notifications and other minor cleanups ([#285](https://github.com/doublezerofoundation/doublezero-offchain/pull/285)) + +## [0.4.3](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.4.3) - 2026-03-04 + +- fix(contributor-rewards): stop infinite retry when recipient accounts are missing ([#280](https://github.com/doublezerofoundation/doublezero-offchain/pull/280)) + +## [0.4.2](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.4.2) - 2026-03-04 + +- feat(contributor-rewards): add on-chain reward distribution ([#269](https://github.com/doublezerofoundation/doublezero-offchain/pull/269)) + +## [0.4.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.4.1) - 2026-03-03 + +- feat(contributor-rewards): bump network-shapley to v0.4.0 ([#278](https://github.com/doublezerofoundation/doublezero-offchain/pull/278)) + +## [0.4.0](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.4.0) - 2026-03-03 + +- feat: billing sentinel for tenant payment status monitoring ([#265](https://github.com/doublezerofoundation/doublezero-offchain/pull/265)) +- feat(contributor-rewards): add export shapley command ([#234](https://github.com/doublezerofoundation/doublezero-offchain/pull/234)) +- feat(contributor-rewards): add read-rewards command ([#212](https://github.com/doublezerofoundation/doublezero-offchain/pull/212)) + +## [0.3.5](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.3.5) - 2025-11-24 + +- feat(contributor-rewards): add snapshot flag to inspect shapley cmd ([#209](https://github.com/doublezerofoundation/doublezero-offchain/pull/209)) +- fix(contributor-rewards): track shapley output record address for slack notifications ([#208](https://github.com/doublezerofoundation/doublezero-offchain/pull/208)) + +## [0.3.4](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.3.4) - 2025-11-21 + +- feat(contributor-rewards): add support to send slack notifications ([#206](https://github.com/doublezerofoundation/doublezero-offchain/pull/206)) + +## [0.3.3](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.3.3) - 2025-11-20 + +- feat(contributor-rewards): add granular support to skip writes ([#203](https://github.com/doublezerofoundation/doublezero-offchain/pull/203) +- fix(contributor-rewards): add Distribution merkle root check to idempotency ([#202](https://github.com/doublezerofoundation/doublezero-offchain/pull/202)) + +## [0.3.2](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.3.2) - 2025-11-17 + +- fix(contributor-rewards): make scheduler retry infinitely ([#198](https://github.com/doublezerofoundation/doublezero-offchain/pull/198)) + +## [0.3.1-rc1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.3.1-rc1) - 2025-11-11 + +- feat(solana-cli): add `revenue-distribution fetch distribution --view` argument ([#182](https://github.com/doublezerofoundation/doublezero-offchain/pull/182)) +- move binary from /usr/local/bin/ to /usr/bin to comply with package management standards ([#187](https://github.com/doublezerofoundation/doublezero-offchain/pull/187)) +- fix(contributor-rewards): handle grace period for scheduling rewards ([#186](https://github.com/doublezerofoundation/doublezero-offchain/pull/186)) + +## [0.3.0-rc1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.3.0-rc1) - 2025-11-04 + +- fix(contributor-rewards): ci fix to derive default ([#176](https://github.com/doublezerofoundation/doublezero-offchain/pull/176)) +- feat(contributor-rewards): Add S3 storage for snapshots ([#174](https://github.com/doublezerofoundation/doublezero-offchain/pull/174)) + +## [0.2.1-rc1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/contributor-rewards%2Fv0.2.1-rc1) - 2025-10-21 + +### Other + +- testing release-plz integration +- add allow_multiple_ips to access pass args, bump deps ([#158](https://github.com/doublezerofoundation/doublezero-offchain/pull/158)) +- add quadratic penalty for uptime ([#148](https://github.com/doublezerofoundation/doublezero-offchain/pull/148)) +- Fix deps, fix clippy warning ([#145](https://github.com/doublezerofoundation/doublezero-offchain/pull/145)) +- fix reward proportion discrepancies ([#143](https://github.com/doublezerofoundation/doublezero-offchain/pull/143)) +- enhance metrics for shapley computations ([#100](https://github.com/doublezerofoundation/doublezero-offchain/pull/100)) +- Bump stable rust and fixup clippy warnings ([#109](https://github.com/doublezerofoundation/doublezero-offchain/pull/109)) +- handle requests with backup IDs ([#105](https://github.com/doublezerofoundation/doublezero-offchain/pull/105)) +- add support to handle AccessPass ([#92](https://github.com/doublezerofoundation/doublezero-offchain/pull/92)) +- Fix scheduler for dry-run mode ([#97](https://github.com/doublezerofoundation/doublezero-offchain/pull/97)) +- add observability via metrics ([#90](https://github.com/doublezerofoundation/doublezero-offchain/pull/90)) +- add scheduler support ([#86](https://github.com/doublezerofoundation/doublezero-offchain/pull/86)) +- add telemetry rent cmd ([#81](https://github.com/doublezerofoundation/doublezero-offchain/pull/81)) +- add pay debt commands ([#80](https://github.com/doublezerofoundation/doublezero-offchain/pull/80)) +- Modular CLI ([#70](https://github.com/doublezerofoundation/doublezero-offchain/pull/70)) +- Update revenue_distribution payments to debt ([#75](https://github.com/doublezerofoundation/doublezero-offchain/pull/75)) +- rm shapley_input req for writing telem aggs ([#71](https://github.com/doublezerofoundation/doublezero-offchain/pull/71)) +- add release support ([#72](https://github.com/doublezerofoundation/doublezero-offchain/pull/72)) +- Fix Exchange Code Mappings for Public Links ([#63](https://github.com/doublezerofoundation/doublezero-offchain/pull/63)) +- update dependencies and improve access request handling ([#64](https://github.com/doublezerofoundation/doublezero-offchain/pull/64)) +- cleanup settings, add example config, CLI docs ([#60](https://github.com/doublezerofoundation/doublezero-offchain/pull/60)) +- Derive rewards accountant key from ProgramConfig ([#59](https://github.com/doublezerofoundation/doublezero-offchain/pull/59)) +- First pass at CLI polish ([#57](https://github.com/doublezerofoundation/doublezero-offchain/pull/57)) +- Fix internet historical telem data lookup ([#56](https://github.com/doublezerofoundation/doublezero-offchain/pull/56)) +- Add support to post contributor-rewards merkle root ([#50](https://github.com/doublezerofoundation/doublezero-offchain/pull/50)) +- defaults for shapley calculations ([#52](https://github.com/doublezerofoundation/doublezero-offchain/pull/52)) +- Switch all maps to BTreeMap and sets to BTreeSet ([#44](https://github.com/doublezerofoundation/doublezero-offchain/pull/44)) +- Add historical epoch lookup for internet telemetry data ([#33](https://github.com/doublezerofoundation/doublezero-offchain/pull/33)) +- Enhance aggregated telemetry stats ([#30](https://github.com/doublezerofoundation/doublezero-offchain/pull/30)) +- Switch to use indexed merkle leaves ([#31](https://github.com/doublezerofoundation/doublezero-offchain/pull/31)) +- Build public links using exchange based inet telem data ([#23](https://github.com/doublezerofoundation/doublezero-offchain/pull/23)) +- Address review cmt, rm unnecessary import +- Prepare for off-chain components diff --git a/offchain/crates/contributor-rewards/Cargo.toml b/offchain/crates/contributor-rewards/Cargo.toml new file mode 100644 index 0000000000..3c4bd1d50a --- /dev/null +++ b/offchain/crates/contributor-rewards/Cargo.toml @@ -0,0 +1,71 @@ +[package] +name = "doublezero-contributor-rewards" +readme = "README.md" +version = "0.6.1" + +# Workspace inherited keys +edition.workspace = true +authors.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true + +[lib] +name = "doublezero_contributor_rewards" +path = "src/lib.rs" + +[[bin]] +name = "doublezero-contributor-rewards" +path = "src/main.rs" + +[dependencies] +anyhow.workspace = true +async-trait.workspace = true +aws-config.workspace = true +aws-sdk-s3.workspace = true +backon.workspace = true +base64.workspace = true +bitvec.workspace = true +borsh.workspace = true +bytemuck.workspace = true +chrono.workspace = true +clap.workspace = true +config.workspace = true +csv.workspace = true +dotenvy.workspace = true +md5.workspace = true +doublezero-record.workspace = true +doublezero-program-common.workspace = true +doublezero-program-tools.workspace = true +doublezero-revenue-distribution.workspace = true +doublezero_sdk.workspace = true +doublezero-serviceability.workspace = true +doublezero-solana-client-tools.workspace = true +doublezero-solana-sdk.workspace = true +doublezero-telemetry.workspace = true +governor.workspace = true +indexmap.workspace = true +metrics.workspace = true +metrics-exporter-prometheus.workspace = true +network-shapley.workspace = true +itertools.workspace = true +rayon.workspace = true +rust_decimal.workspace = true +serde.workspace = true +serde_json.workspace = true +slack-notifier.workspace = true +solana-account-decoder.workspace = true +solana-client.workspace = true +solana-commitment-config.workspace = true +solana-compute-budget-interface.workspace = true +solana-sdk.workspace = true +solana-system-interface.workspace = true +spl-associated-token-account-interface.workspace = true +spl-token-interface.workspace = true +svm-hash.workspace = true +tabled.workspace = true +tempfile.workspace = true +thiserror.workspace = true +tokio.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true diff --git a/offchain/crates/contributor-rewards/README.md b/offchain/crates/contributor-rewards/README.md new file mode 100644 index 0000000000..ec442b68e1 --- /dev/null +++ b/offchain/crates/contributor-rewards/README.md @@ -0,0 +1,239 @@ +# contributor-rewards + +An off-chain rewards calculation system for the DoubleZero network that uses Shapley values to ensure fair distribution of rewards based on network contributions. + +## Overview + +- Fetches on-chain serviceability and telemetry data from DZ Ledger +- Processes network performance metrics (latency, jitter, packet loss) +- Calculates fair reward distributions using Shapley values +- Generates a Merkle root for on-chain verification + +This ensures that network participants are rewarded proportionally to their actual contribution to network performance and reliability. + +## Reward calculation methodology + +For each DoubleZero epoch, contributor rewards are calculated by turning the observed network state into a `network-shapley` model, computing each contributor's marginal value, and publishing the resulting reward shares for on-chain distribution. + +The rewarder prepares the following inputs: + +- **Devices:** serviceability devices are mapped to Shapley device IDs by metro and assigned to their contributor owners. Device edge capacity comes from physical interface bandwidth. +- **Private links:** activated DoubleZero links are modeled with measured P95 latency, bandwidth, and observed uptime. The `network-shapley` library applies the uptime penalty when it converts private links into effective capacity. +- **Public links:** public internet telemetry is aggregated into city-pair latencies. These links form the public-internet counterfactual against which DoubleZero paths are valued. +- **Demands:** demand rows describe traffic that should be served between cities, including receiver count, traffic per receiver, priority/value, traffic kind, and whether the demand is multicast. +- **City weights:** per-city weights are derived from Solana leader-schedule slot counts for validators in each metro. Per-city Shapley results are aggregated using these weights. + +There are two demand classes: + +1. **Validator-to-validator IBRL traffic.** IBRL demands are generated between validator metros, excluding same-city pairs. The receiver count is the destination city's validator count, traffic per receiver comes from `demand.traffic`, and the priority/value input is `demand.priority`. In production this priority is set to **$20**. This gives validator-to-validator traffic non-zero value even though it generates no immediate revenue, unlike multicast shreds, which generate roughly $30-100 per seat. The value reflects non-monetary protocol benefits such as validator acquisition and a foundation for future business models. +2. **Multicast shred traffic.** Shred demands are generated from validator metros to metros with multicast subscribers and non-zero metro prices. The receiver count is the subscriber count, traffic per receiver comes from `demand.traffic`, and priority comes from the destination metro price. + +For each source city, the rewarder runs `network-shapley` with the full network topology and that city's demands. `network-shapley` validates and consolidates the inputs, adds public-internet nodes and crossovers between private and public paths, builds a flow optimization problem, and solves that problem for every coalition of contributors. Each contributor's Shapley value is its average marginal improvement across coalitions. The rewarder then aggregates per-city values using the city weights, normalizes them into final proportions, converts those proportions into fixed-point reward shares, stores the Shapley output, and posts a Merkle root for distribution. + +### Public internet counterfactual + +All measured public latencies are multiplied by **1.25** to better reflect actual public latencies for meaningful traffic loads. In the current system, public latencies are measured using single-packet pings. In practice, validators send 50-150 Mbps of traffic, which would encounter queuing over the public internet at such volumes, so single-packet pings are measured too low for the true public internet counterfactual. DoubleZero does not face the same problem on its own links because those links are dedicated. + +The protocol cannot yet reliably estimate public internet latencies for large traffic loads directly given the costs of doing so, so it extrapolates from individual pings using a multiplier. We model the loaded-to-baseline latency multiplier on a public-internet path as an independent M/M/1 queue at each router. The queueing-component multiplier is `1 + p/(1-p)` at bottleneck utilization `p`, where `p` ranges between 0 and 1. Ahmed et al. (ICNP 2017) estimates an implied `p` of between 0.3 and 0.5 based on queueing delays in a 510K-client / 33-IXP CDN study. To be conservative for now in the absence of direct DoubleZero evidence — and given that Koneva et al. (2024) validate the M/M/1 envelope as an upper bound on real IXP packet-size distributions — we use `p = 0.2`, i.e. a 1.25x multiplier. + +[1] Ahmed, Shafiq, Bedi, Khakpour. "Peering vs. Transit." ICNP 2017. + +[2] Koneva et al. arXiv:2406.16452, 2024. + +## Fetching snapshots from S3 + +Replace `` with DZ Epoch (50, 51, .. etc) + +```bash +$ wget https://doublezero-contributor-rewards-mn-beta-snapshots.s3.us-east-1.amazonaws.com/mn-epoch--snapshot.json +``` + +## Snapshot Compatibility Matrix + +| DZ Epoch Lower Bound | DZ Epoch Upper Bound | Contributor Rewards Version | +| -------------------- | -------------------- | --------------------------- | +| - | 48 | v0.2.2 | +| 49 | 109 | v0.3.5 | +| 110 | 138 | v0.4.1 | +| 139 | - | v0.5.3 | + +In order to check you can follow these steps (depending on tags/snapshots) as shown in the table above. + +```bash +$ git checkout contributor-rewards/v0.2.2 +$ just build +$ /target/release/doublezero-contributor-rewards -c mainnet-beta.toml inspect shapley -s mn-epoch-47-snapshot.json -f json --output-file 47.json +``` + +## Reward Inspection + +This prints the record addresses for different accounts off of the DZ ledger + +``` +$ /target/release/doublezero-contributor-rewards -c mainnet-beta.toml inspect rewards -e 57 +``` + +## Configuration file reference + +Copy below and put it in `mainnet-beta.toml` + +```toml +# DoubleZero Contributor Rewards - Example Configuration +# +# This file has all available configuration options. +# Copy this file and modify values as needed, or use environment variables (recommended) +# +# Environment variables take precedence over this file. +# Use DZ__ prefix with double underscores for nested values. +# Example: DZ__RPC__DZ_URL=https://api.doublezero.com + +# Network Configuration +# Options: devnet, testnet, mainnet-beta, mainnet +network = "mainnet-beta" + +# Logging level +# Options: trace, debug, info, warn, error +log_level = "info" + +# ========== RPC Configuration ========== +[rpc] +# DoubleZero ledger RPC endpoint +dz_url = "https://doublezero-mainnet-beta.rpcpool.com/db336024-e7a8-46b1-80e5-352dd77060ab" + +# Solana read client - for reading chain data (leader schedules, epoch info) +# Typically points to mainnet for production data +solana_read_url = "https://api.mainnet-beta.solana.com" + +# Solana write client - for writing rewards data (merkle roots) +# Can point to testnet for testing or mainnet for production +solana_write_url = "https://api.mainnet-beta.solana.com" + +# Transaction commitment level +# Options: processed, confirmed, finalized +commitment = "confirmed" + +# Rate limit for RPC requests per second +rps_limit = 10 + +# ========== Shapley Value Parameters ========== +[shapley] +# Base uptime requirement for operators (0.0-1.0) +# Example: 0.98 means 98% uptime required +operator_uptime = 0.98 + +# Bonus multiplier for contiguous network coverage +# Applied when nodes provide continuous coverage across regions +contiguity_bonus = 5.0 + +# Multiplier for demand-based rewards +# Increases rewards in high-demand areas +demand_multiplier = 1.2 + +# ========== Shapley Input Parameters ========== +[input] +# Multiplier applied to public internet latency inputs. +# 1.25 inflates single-packet public latency measurements by 25%. +public_latency_multiplier = 1.25 + +# ========== Demand Generation Parameters ========== +[demand] +# Traffic per receiver in Gbps, used for both IBRL and shred demands +traffic = 0.15 + +# Priority for IBRL validator-to-validator demands +# Shred demand priority remains derived from metro price +priority = 20.0 + +# Demand kind/type values written into Shapley demand rows +kind = 1 +shred_kind = 2 + +# Multicast flags for IBRL and shred demands +multicast_enabled = false +shred_multicast_enabled = true + +# ========== Program IDs ========== +[programs] +# DZ Serviceability program ID +serviceability_program_id = "ser2VaTMAcYTaauMrTSfSrxBaUDq7BLNs2xfUugTAGv" + +# DZ Telemetry program ID +telemetry_program_id = "tE1exJ5VMyoC9ByZeSmgtNzJCFF74G9JAv338sJiqkC" + +# ========== Record Prefixes ========== +[prefixes] +# Prefixes for organizing DZ records on-chain +device_telemetry = "doublezero_device_telemetry_aggregate" +internet_telemetry = "doublezero_internet_telemetry_aggregate" +contributor_rewards = "dz_contributor_rewards" +reward_input = "dz_reward_input" + +# ========== Internet Telemetry Lookback Configuration ========== +[inet_lookback] +# Minimum coverage threshold (0.0-1.0) +# Example: 0.8 means at least 80% of expected links must have data +min_coverage_threshold = 0.8 + +# Maximum number of epochs to look back when current data is insufficient +max_epochs_lookback = 5 + +# Minimum samples per link to consider it valid +min_samples_per_link = 20 + +# Enable lookback accumulator +# When true, combines data from multiple epochs to meet coverage threshold +enable_accumulator = true + +# Deduplication window in microseconds +# Samples within this time window are considered duplicates +dedup_window_us = 10000000 + +# ========== Telemetry Default Handling Configuration ========== +[telemetry_defaults] +# Threshold for missing data (0.0-1.0) +# Example: 0.7 means if >70% of samples are missing, use defaults +missing_data_threshold = 0.7 + +# Default latency for private links when data is missing (in milliseconds) +# Example: 1000.0 means use 1000ms for circuits with insufficient data +private_default_latency_ms = 1000.0 + +# Enable previous epoch lookup for public links +# When true, fetches previous epoch's average when current has insufficient data +enable_previous_epoch_lookup = true + +# ========== Scheduler Configuration ========== +[scheduler] +# Check interval in seconds (how often to check for new epochs) +interval_seconds = 30 + +# Path to worker state file for tracking processed epochs +state_file = "./test.state" + +# Enable dry run mode (no on-chain writes) +enable_dry_run = true + +# snapshot dir +snapshot_dir = "./" + +# old setting +max_consecutive_failures = 10 + +# ========== AWS Configuration (Optional) ========== +[aws] +region = "us-east-1" +bucket = "doublezero-contributor-rewards-mn-beta-snapshots" +access_key_id = "not" +secret_access_key = "required" + +# ========== Metrics Configuration (Optional) ========== +[metrics] +# Address to expose metrics endpoint +# Format: "IP:PORT" or "[IPv6]:PORT" +addr = "127.0.0.1:9090" + +[slack] +enabled = false +webhook_url = "foo" +channel_id = "bar" +``` diff --git a/offchain/crates/contributor-rewards/example.config.toml b/offchain/crates/contributor-rewards/example.config.toml new file mode 100644 index 0000000000..0efe0fc396 --- /dev/null +++ b/offchain/crates/contributor-rewards/example.config.toml @@ -0,0 +1,198 @@ +# DoubleZero Contributor Rewards - Example Configuration +# +# This file has all available configuration options. +# Copy this file and modify values as needed, or use environment variables (recommended) +# +# Environment variables take precedence over this file. +# Use DZ__ prefix with double underscores for nested values. +# Example: DZ__RPC__DZ_URL=https://api.doublezero.com + +# Network Configuration +# Options: devnet, testnet, mainnet-beta, mainnet +network = "testnet" + +# Logging level +# Options: trace, debug, info, warn, error +log_level = "info" + +# ========== RPC Configuration ========== +[rpc] +# DoubleZero ledger RPC endpoint +dz_url = "https://api.doublezero.com" + +# Solana read client - for reading chain data (leader schedules, epoch info) +# Typically points to mainnet for production data +solana_read_url = "https://api.mainnet-beta.solana.com" + +# Solana write client - for writing rewards data (merkle roots) +# Can point to testnet for testing or mainnet for production +solana_write_url = "https://api.testnet.solana.com" + +# Transaction commitment level +# Options: processed, confirmed, finalized +commitment = "confirmed" + +# Rate limit for RPC requests per second +rps_limit = 10 + +# ========== Shapley Value Parameters ========== +[shapley] +# Base uptime requirement for operators (0.0-1.0) +# Example: 0.98 means 98% uptime required +operator_uptime = 0.98 + +# Bonus multiplier for contiguous network coverage +# Applied when nodes provide continuous coverage across regions +contiguity_bonus = 5.0 + +# Multiplier for demand-based rewards +# Increases rewards in high-demand areas +demand_multiplier = 1.2 + +# ========== Shapley Input Parameters ========== +# All fields can be overridden via environment variables: +# DZ__INPUT__PUBLIC_LATENCY_MULTIPLIER +[input] +# Multiplier applied to public internet latency inputs. +# 1.25 inflates single-packet public latency measurements by 25%. +public_latency_multiplier = 1.25 + +# ========== Demand Generation Parameters ========== +# All fields can be overridden via environment variables: +# DZ__DEMAND__TRAFFIC +# DZ__DEMAND__PRIORITY +# DZ__DEMAND__KIND +# DZ__DEMAND__SHRED_KIND +# DZ__DEMAND__MULTICAST_ENABLED +# DZ__DEMAND__SHRED_MULTICAST_ENABLED +[demand] +# Traffic per receiver in Gbps, used for both IBRL and shred demands +traffic = 0.15 + +# Priority for IBRL validator-to-validator demands +# Shred demand priority remains derived from metro price +priority = 20.0 + +# Demand kind/type values written into Shapley demand rows +kind = 1 +shred_kind = 2 + +# Multicast flags for IBRL and shred demands +multicast_enabled = false +shred_multicast_enabled = true + +# ========== Program IDs ========== +[programs] +# DZ Serviceability program ID +serviceability_program_id = "DZServ1111111111111111111111111111111111111" + +# DZ Telemetry program ID +telemetry_program_id = "DZTelem111111111111111111111111111111111111" + +# Shred subscription program ID is sourced from the doublezero-solana-sdk crate. +# To override it (e.g. in dev), set the SHRED_SUBSCRIPTION_PROGRAM_ID env var. + +# ========== Record Prefixes ========== +[prefixes] +# Prefixes for organizing DZ records on-chain +device_telemetry = "doublezero_device_telemetry_aggregate" +internet_telemetry = "doublezero_internet_telemetry_aggregate" +contributor_rewards = "dz_contributor_rewards" +reward_input = "dz_reward_input" + +# ========== Internet Telemetry Lookback Configuration ========== +[inet_lookback] +# Minimum coverage threshold (0.0-1.0) +# Example: 0.8 means at least 80% of expected links must have data +min_coverage_threshold = 0.8 + +# Maximum number of epochs to look back when current data is insufficient +max_epochs_lookback = 5 + +# Minimum samples per link to consider it valid +min_samples_per_link = 20 + +# Enable lookback accumulator +# When true, combines data from multiple epochs to meet coverage threshold +enable_accumulator = true + +# Deduplication window in microseconds +# Samples within this time window are considered duplicates +dedup_window_us = 10000000 + +# ========== Telemetry Default Handling Configuration ========== +[telemetry_defaults] +# Threshold for missing data (0.0-1.0) +# Example: 0.7 means if >70% of samples are missing, use defaults +missing_data_threshold = 0.7 + +# Default latency for private links when data is missing (in milliseconds) +# Example: 1000.0 means use 1000ms for circuits with insufficient data +private_default_latency_ms = 1000.0 + +# Enable previous epoch lookup for public links +# When true, fetches previous epoch's average when current has insufficient data +enable_previous_epoch_lookup = true + +# ========== Scheduler Configuration ========== +[scheduler] +# Check interval in seconds (how often to check for new epochs) +interval_seconds = 300 + +# Path to worker state file for tracking processed epochs +state_file = "/var/lib/doublezero-contributor-rewards/scheduler.state" + +# Directory to store epoch snapshots (only used if storage_backend = "local-file") +snapshot_dir = "/var/lib/doublezero-contributor-rewards/snapshots" + +# Enable dry run mode (no on-chain writes, but snapshots still upload to S3) +enable_dry_run = false + +# Storage backend for snapshots +# Options: s3, local-file +storage_backend = "s3" + +# Maximum time to wait for grace period before posting merkle root (in seconds) +# Default: 21600 (6 hours) +# The on-chain program enforces a grace period after distribution creation +# This setting controls how long the scheduler will wait for that grace period to expire +grace_period_max_wait_seconds = 21600 + +# ========== AWS S3 Configuration (Required if storage_backend = "s3") ========== +# All fields can be overridden via environment variables: +# DZ__AWS__REGION +# DZ__AWS__BUCKET +# DZ__AWS__ACCESS_KEY_ID +# DZ__AWS__SECRET_ACCESS_KEY +# DZ__AWS__ENDPOINT +[aws] +# AWS region (e.g., us-east-1) +# Environment variable: DZ__AWS__REGION +region = "us-east-1" + +# S3 bucket name +# Environment variable: DZ__AWS__BUCKET +# Testnet example: doublezero-contributor-rewards-testnet-snapshots +# Mainnet example: doublezero-contributor-rewards-mn-beta-snapshots +bucket = "doublezero-contributor-rewards-testnet-snapshots" + +# AWS access key ID +# Environment variable: DZ__AWS__ACCESS_KEY_ID +access_key_id = "${DZ__AWS__ACCESS_KEY_ID}" + +# AWS secret access key +# Environment variable: DZ__AWS__SECRET_ACCESS_KEY +secret_access_key = "${DZ__AWS__SECRET_ACCESS_KEY}" + +# Custom S3 endpoint (optional) +# Environment variable: DZ__AWS__ENDPOINT +# For MinIO or other S3-compatible services +# Example for local development: "http://localhost:9000" +# Leave commented out for AWS S3 +# endpoint = "http://localhost:9000" + +# ========== Metrics Configuration (Optional) ========== +[metrics] +# Address to expose metrics endpoint +# Format: "IP:PORT" or "[IPv6]:PORT" +addr = "127.0.0.1:9090" diff --git a/offchain/crates/contributor-rewards/src/calculator/constants.rs b/offchain/crates/contributor-rewards/src/calculator/constants.rs new file mode 100644 index 0000000000..ffad9ce961 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/constants.rs @@ -0,0 +1,20 @@ +// slots in epoch +pub const SLOTS_IN_EPOCH: f64 = 432000.0; + +// bits/sec to Mbps +pub const BPS_TO_MBPS: u64 = 1_000_000; + +// Default edge bandwidth in Mbps - used when contributor hasn't reported bandwidth +pub const FALLBACK_EDGE_BANDWIDTH_MBPS: f64 = 10_000.0; + +// Bandwidth per multicast subscriber seat in Mbps +pub const BANDWIDTH_PER_SUBSCRIBER_SEAT_MBPS: f64 = 150.0; + +// 1s = 1000ms +pub const SEC_TO_MS: f64 = 1000.0; + +// 1s = 10^6 us +pub const SEC_TO_US: f64 = 1_000_000.0; + +// max unit share +pub const MAX_UNIT_SHARE: f64 = 1_000_000_000.0; diff --git a/offchain/crates/contributor-rewards/src/calculator/data_prep.rs b/offchain/crates/contributor-rewards/src/calculator/data_prep.rs new file mode 100644 index 0000000000..efc6b73796 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/data_prep.rs @@ -0,0 +1,374 @@ +use std::collections::BTreeSet; + +use anyhow::{Result, anyhow}; +use network_shapley::types::{Demand, Devices, PrivateLinks, PublicLinks}; +use tracing::{info, warn}; + +use crate::{ + calculator::{ + input::ShapleyInputs, + shapley::handler::{ + DeviceIdMap, PreviousEpochCache, build_demands, build_devices, build_private_links, + build_public_links, + }, + util::{calculate_city_weights, print_devices, print_private_links, print_public_links}, + }, + cli::snapshot::CompleteSnapshot, + ingestor::{ + demand::{self, CityStats}, + fetcher::Fetcher, + internet, + types::FetchData, + }, + processor::{ + internet::{InternetTelemetryProcessor, InternetTelemetryStatMap, print_internet_stats}, + telemetry::{DZDTelemetryProcessor, DZDTelemetryStatMap, print_telemetry_stats}, + }, + settings::Settings, +}; + +pub struct PreparedData { + pub epoch: u64, + pub device_telemetry: DZDTelemetryStatMap, + pub internet_telemetry: InternetTelemetryStatMap, + pub shapley_inputs: Option, +} + +impl PreparedData { + /// Fetches and prepares all data needed for reward calculations. + /// # Args + /// + /// * `fetcher` - `Fetcher` instance (construct via settings) + /// * `epoch` - Optional epoch, uses current - 1 if None + /// * `require_shapley` - Attach shapley_inputs output if set to true + /// + /// # Returns + /// Result + pub async fn new(fetcher: &Fetcher, epoch: Option, require_shapley: bool) -> Result { + // NOTE: Always fetch current epoch's serviceability data first + // This ensures we have the correct exchange_pk -> device -> location mappings + let (fetch_epoch, mut fetch_data) = fetcher.fetch(epoch).await?; + + // Create cache for previous epoch data + let mut previous_epoch_cache = PreviousEpochCache::new(); + if fetcher + .settings + .telemetry_defaults + .enable_previous_epoch_lookup + && fetch_epoch > 1 + { + // Preemptively fetch previous epoch data for default handling + previous_epoch_cache + .fetch_if_needed(fetcher, fetch_epoch) + .await?; + } + + if fetcher.settings.inet_lookback.enable_accumulator { + // Calculate expected internet telemetry links + let expected_inet_samples = expected_inet_links(&fetch_data); + let (inet_epoch, internet_data) = internet::fetch_with_accumulator( + &fetcher.dz_rpc_client, + &fetcher.settings, + fetch_epoch, + expected_inet_samples, + ) + .await?; + + if inet_epoch != fetch_epoch { + warn!( + "Using historical internet telemetry from epoch {} (target was {})", + inet_epoch, fetch_epoch + ); + info!( + "Using serviceability mapping from current epoch {} with telemetry data from epoch {}", + fetch_epoch, inet_epoch + ); + } + + // Update fetch_data with the potentially historical internet data + fetch_data.dz_internet = internet_data; + }; + + // Process device telemetry + let device_telemetry = process_device_telemetry(&fetch_data)?; + + // Process internet telemetry + let internet_telemetry = process_internet_telemetry(&fetch_data)?; + + if !require_shapley { + return Ok(Self { + epoch: fetch_epoch, + device_telemetry, + internet_telemetry, + shapley_inputs: None, + }); + } + + // Build devices + let (devices, device_ids) = build_and_log_devices(&fetcher.settings, &fetch_data)?; + + // Build private links + let private_links = build_and_log_private_links(&fetch_data, &device_ids); + + // Build public links + let public_links = build_and_log_public_links( + &fetcher.settings, + &internet_telemetry, + &fetch_data, + &previous_epoch_cache, + )?; + + // Build demands and city stats + let (demands, city_stats) = build_and_log_demands(fetcher, &fetch_data).await?; + + // Calculate city weights once for consistency + let city_weights = calculate_city_weights(&city_stats); + + // Create ShapleyInputs as single source of truth + let shapley_inputs = ShapleyInputs { + devices, + private_links, + public_links, + demands, + city_stats, + city_weights, + }; + + // Record overall Shapley inputs + metrics::gauge!( + "doublezero_contributor_rewards_shapley_inputs_total", + "kind" => "devices" + ) + .set(shapley_inputs.devices.len() as f64); + metrics::gauge!( + "doublezero_contributor_rewards_shapley_inputs_total", + "kind" => "private_links" + ) + .set(shapley_inputs.private_links.len() as f64); + metrics::gauge!( + "doublezero_contributor_rewards_shapley_inputs_total", + "kind" => "public_links" + ) + .set(shapley_inputs.public_links.len() as f64); + metrics::gauge!( + "doublezero_contributor_rewards_shapley_inputs_total", + "kind" => "demands" + ) + .set(shapley_inputs.demands.len() as f64); + + for (city, weight) in shapley_inputs.city_weights.iter() { + metrics::gauge!( + "doublezero_contributor_rewards_shapley_city_weight", + "city" => city.clone() + ) + .set(*weight); + } + + Ok(Self { + epoch: fetch_epoch, + device_telemetry, + internet_telemetry, + shapley_inputs: Some(shapley_inputs), + }) + } + + /// Create PreparedData from a snapshot file (skip RPC fetching) + /// + /// This enables deterministic reward calculations by using captured historical state. + /// The snapshot must include all necessary data (fetch_data, leader_schedule, etc.) + /// + /// # Arguments + /// * `snapshot` - Complete snapshot containing all epoch data + /// * `settings` - Settings for processing configuration + /// * `require_shapley` - Whether to build shapley inputs + /// + /// # Returns + /// Result + pub fn from_snapshot( + snapshot: &CompleteSnapshot, + settings: &Settings, + require_shapley: bool, + ) -> Result { + let fetch_epoch = snapshot.dz_epoch; + let fetch_data = &snapshot.fetch_data; + + info!("Processing snapshot for epoch {}", fetch_epoch); + + // Process telemetry (same as new()) + let device_telemetry = process_device_telemetry(fetch_data)?; + let internet_telemetry = process_internet_telemetry(fetch_data)?; + + if !require_shapley { + return Ok(Self { + epoch: fetch_epoch, + device_telemetry, + internet_telemetry, + shapley_inputs: None, + }); + } + + // Build devices + let (devices, device_ids) = build_and_log_devices(settings, fetch_data)?; + + // Use empty previous epoch cache since snapshot already has processed data + let previous_epoch_cache = PreviousEpochCache::new(); + + // Build private links + let private_links = build_and_log_private_links(fetch_data, &device_ids); + + // Build public links + let public_links = build_and_log_public_links( + settings, + &internet_telemetry, + fetch_data, + &previous_epoch_cache, + )?; + + // Build demands using snapshot's leader schedule + let leader_schedule = snapshot + .leader_schedule + .as_ref() + .ok_or_else(|| anyhow!("Snapshot missing leader schedule for epoch {}", fetch_epoch))?; + + info!( + "Using leader schedule from snapshot (Solana epoch: {})", + leader_schedule.solana_epoch + ); + + let demand_output = demand::build_with_schedule(settings, fetch_data, leader_schedule)?; + let demands = demand_output.demands; + let city_stats = demand_output.city_stats; + + // Calculate city weights + let city_weights = calculate_city_weights(&city_stats); + + // Create ShapleyInputs + let shapley_inputs = ShapleyInputs { + devices, + private_links, + public_links, + demands, + city_stats, + city_weights, + }; + + // Record metrics + metrics::gauge!( + "doublezero_contributor_rewards_shapley_inputs_total", + "kind" => "devices" + ) + .set(shapley_inputs.devices.len() as f64); + metrics::gauge!( + "doublezero_contributor_rewards_shapley_inputs_total", + "kind" => "private_links" + ) + .set(shapley_inputs.private_links.len() as f64); + metrics::gauge!( + "doublezero_contributor_rewards_shapley_inputs_total", + "kind" => "public_links" + ) + .set(shapley_inputs.public_links.len() as f64); + metrics::gauge!( + "doublezero_contributor_rewards_shapley_inputs_total", + "kind" => "demands" + ) + .set(shapley_inputs.demands.len() as f64); + + for (city, weight) in shapley_inputs.city_weights.iter() { + metrics::gauge!( + "doublezero_contributor_rewards_shapley_city_weight", + "city" => city.clone() + ) + .set(*weight); + } + + Ok(Self { + epoch: fetch_epoch, + device_telemetry, + internet_telemetry, + shapley_inputs: Some(shapley_inputs), + }) + } +} + +/// Process and aggregate device telemetry +fn process_device_telemetry(fetch_data: &FetchData) -> Result { + let stat_map = DZDTelemetryProcessor::process(fetch_data)?; + info!( + "Device Telemetry Aggregates: \n{}", + print_telemetry_stats(&stat_map) + ); + Ok(stat_map) +} + +/// Process and aggregate internet telemetry +fn process_internet_telemetry(fetch_data: &FetchData) -> Result { + let stat_map = InternetTelemetryProcessor::process(fetch_data)?; + info!( + "Internet Telemetry Aggregates: \n{}", + print_internet_stats(&stat_map) + ); + Ok(stat_map) +} + +/// Build devices and log output +fn build_and_log_devices( + settings: &Settings, + fetch_data: &FetchData, +) -> Result<(Devices, DeviceIdMap)> { + let (devices, device_ids) = build_devices(fetch_data, &settings.network)?; + info!("Devices:\n{}", print_devices(&devices)); + Ok((devices, device_ids)) +} + +/// Build private links and log output +fn build_and_log_private_links(fetch_data: &FetchData, device_ids: &DeviceIdMap) -> PrivateLinks { + let private_links = build_private_links(fetch_data, device_ids); + info!("Private Links:\n{}", print_private_links(&private_links)); + private_links +} + +/// Build public links and log output +fn build_and_log_public_links( + settings: &Settings, + internet_stat_map: &InternetTelemetryStatMap, + fetch_data: &FetchData, + previous_epoch_cache: &PreviousEpochCache, +) -> Result { + let public_links = build_public_links( + settings, + internet_stat_map, + fetch_data, + previous_epoch_cache, + )?; + info!("Public Links:\n{}", print_public_links(&public_links)); + Ok(public_links) +} + +/// Build demands and city stats with logging +async fn build_and_log_demands( + fetcher: &Fetcher, + fetch_data: &FetchData, +) -> Result<(Vec, CityStats)> { + build_demands(fetcher, fetch_data).await +} + +/// Calculate expected number of internet telemetry links +/// based on the actual route coverage from internet telemetry data +fn expected_inet_links(fetch_data: &FetchData) -> usize { + // Count unique directional location pairs from the internet telemetry data + // We look at what routes actually exist in the network rather than assuming full connectivity + let mut unique_routes = BTreeSet::new(); + + for sample in &fetch_data.dz_internet.internet_latency_samples { + // Get the exchange PKs from the sample + let origin = sample.origin_exchange_pk; + let target = sample.target_exchange_pk; + let provider = sample.data_provider_name.clone(); + + // Add the directional route (origin, target, provider) + unique_routes.insert((origin, target, provider)); + } + + unique_routes.len() +} diff --git a/offchain/crates/contributor-rewards/src/calculator/distribute.rs b/offchain/crates/contributor-rewards/src/calculator/distribute.rs new file mode 100644 index 0000000000..67081318ad --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/distribute.rs @@ -0,0 +1,578 @@ +use std::collections::HashSet; + +use anyhow::{Result, ensure}; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + payer::{TransactionOutcome, Wallet}, + rpc::DoubleZeroLedgerConnection, +}; +use doublezero_solana_sdk::{ + DOUBLEZERO_MINT_DECIMALS, environment_2z_token_mint_key, + revenue_distribution::{ + ID, + fetch::try_fetch_distribution, + instruction::{RevenueDistributionInstructionData, account::DistributeRewardsAccounts}, + state::{ContributorRewards, Distribution}, + try_is_processed_leaf, + types::{RewardShare, UnitShare32}, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::pubkey::Pubkey; +use spl_associated_token_account_interface::instruction::create_associated_token_account_idempotent; +use tracing::{debug, info, warn}; + +use crate::calculator::{ledger_operations::try_fetch_shapley_output, proof::ShapleyOutputStorage}; + +/// Outcome of a distribution attempt. +#[derive(Debug)] +pub enum DistributionOutcome { + /// Finalization or sweep guards not met — will retry. + NotReady, + /// All contributors distributed (distributed_rewards_count == total_contributors). + Complete { total_contributors: u32 }, + /// Some contributors skipped (missing ContributorRewards accounts onchain). + /// No further progress possible without contributor action. + PartiallyComplete { + total_contributors: u32, + distributed: u32, + skipped: u32, + }, +} + +/// Per-contributor result from a distribution attempt. +#[derive(Debug)] +pub struct ContributorDistributionResult { + pub index: usize, + pub contributor_key: Pubkey, + /// unit_share / UnitShare32::MAX, range 0.0–1.0 + pub proportion: f64, + /// Human-readable 2Z amount (already divided by decimals) + pub reward_tokens: f64, + /// Whether this leaf is processed (includes both pre-existing and newly distributed) + pub distributed: bool, +} + +/// Full summary of a distribution attempt. +#[derive(Debug)] +pub struct DistributionSummary { + pub dz_epoch: u64, + pub outcome: DistributionOutcome, + pub contributors: Vec, +} + +/// Attempt to distribute rewards for the current eligible epoch. +pub async fn try_distribute_epoch_rewards( + wallet: &Wallet, + dz_connection: &DoubleZeroLedgerConnection, + rewards_accountant_key: &Pubkey, + dz_epoch_value: u64, + shapley_prefix: &[u8], +) -> Result { + // Fetch the distribution for this epoch. + let (_, distribution) = try_fetch_distribution(&wallet.connection, dz_epoch_value).await?; + + // Check readiness: rewards must be finalized and tokens swept. + if !distribution.is_rewards_calculation_finalized() { + debug!( + "Distribution for epoch {} is not finalized yet, skipping", + dz_epoch_value + ); + return Ok(DistributionSummary { + dz_epoch: dz_epoch_value, + outcome: DistributionOutcome::NotReady, + contributors: vec![], + }); + } + + if !distribution.has_swept_2z_tokens() { + debug!( + "Distribution for epoch {} has not swept 2Z tokens yet, skipping", + dz_epoch_value + ); + return Ok(DistributionSummary { + dz_epoch: dz_epoch_value, + outcome: DistributionOutcome::NotReady, + contributors: vec![], + }); + } + + let total_contributors = distribution.total_contributors; + + if distribution.distributed_rewards_count == total_contributors { + debug!( + "All {} contributors already distributed for epoch {}, fetching summary", + total_contributors, dz_epoch_value + ); + } else { + info!( + "Distributing rewards for epoch {}: {}/{} already distributed onchain", + dz_epoch_value, distribution.distributed_rewards_count, total_contributors + ); + } + + let network_env = wallet.connection.try_network_environment().await?; + let dz_mint_key = environment_2z_token_mint_key(network_env); + + // Fetch shapley output from DoubleZero Ledger. + let shapley_output = try_fetch_shapley_output( + dz_connection, + shapley_prefix, + rewards_accountant_key, + dz_epoch_value, + ) + .await?; + + let mut newly_distributed_leaf_indices = HashSet::new(); + let mut skipped_leaf_indices = HashSet::new(); + + for (leaf_index, reward_share, is_processed) in + try_distribution_rewards_iter(&distribution, &shapley_output)? + { + if is_processed { + continue; + } + + info!( + "Distributing epoch {} leaf {}, contributor: {}", + dz_epoch_value, leaf_index, reward_share.contributor_key + ); + + let was_distributed = try_distribute_contributor_rewards( + wallet, + &dz_mint_key, + &distribution, + &shapley_output, + leaf_index, + reward_share, + ) + .await?; + + if was_distributed { + newly_distributed_leaf_indices.insert(leaf_index); + } else { + skipped_leaf_indices.insert(leaf_index); + } + } + + let outcome = if skipped_leaf_indices.is_empty() { + DistributionOutcome::Complete { total_contributors } + } else { + DistributionOutcome::PartiallyComplete { + total_contributors, + distributed: distribution.distributed_rewards_count + + newly_distributed_leaf_indices.len() as u32, + skipped: skipped_leaf_indices.len() as u32, + } + }; + + let contributors = try_build_contributor_distribution_results( + &distribution, + &shapley_output, + &newly_distributed_leaf_indices, + )?; + + Ok(DistributionSummary { + dz_epoch: dz_epoch_value, + outcome, + contributors, + }) +} + +fn try_build_contributor_distribution_results( + distribution: &ZeroCopyAccountOwnedData, + shapley_output: &ShapleyOutputStorage, + newly_distributed_leaf_indices: &HashSet, +) -> Result> { + let collected_rewards = distribution.total_collected_2z_tokens(); + let burnable_rewards = distribution + .community_burn_rate + .mul_scalar(collected_rewards); + let distributable_rewards = collected_rewards - burnable_rewards; + let decimals_divisor = f64::powi(10.0, DOUBLEZERO_MINT_DECIMALS as i32); + + try_distribution_rewards_iter(distribution, shapley_output)? + .map(|(index, reward_share, is_processed)| { + let proportion = reward_share.unit_share as f64 / u32::from(UnitShare32::MAX) as f64; + let reward_tokens = reward_share + .checked_unit_share() + .unwrap() + .mul_scalar(distributable_rewards) as f64 + / decimals_divisor; + + Ok(ContributorDistributionResult { + index, + contributor_key: reward_share.contributor_key, + proportion, + reward_tokens, + distributed: is_processed || newly_distributed_leaf_indices.contains(&index), + }) + }) + .collect() +} + +/// Iterate over distribution rewards, yielding (leaf_index, reward_share, is_processed) +/// for each contributor in the shapley output. +pub fn try_distribution_rewards_iter<'a>( + distribution: &ZeroCopyAccountOwnedData, + shapley_output: &'a ShapleyOutputStorage, +) -> Result> { + let start_index = distribution.processed_rewards_start_index as usize; + let end_index = distribution.processed_rewards_end_index as usize; + let processed_leaf_data = &distribution.remaining_data[start_index..end_index]; + + let num_rewards = shapley_output.rewards.len(); + let max_supported_rewards = processed_leaf_data.len() * 8; + + ensure!( + max_supported_rewards >= num_rewards, + "Insufficient processed leaf data for epoch {}: can support {max_supported_rewards} rewards, but got {num_rewards}", + distribution.dz_epoch + ); + + Ok(shapley_output + .rewards + .iter() + .enumerate() + .map(|(index, reward_share)| { + let is_processed = try_is_processed_leaf(processed_leaf_data, index).unwrap(); + (index, reward_share, is_processed) + })) +} + +async fn try_distribute_contributor_rewards( + wallet: &Wallet, + dz_mint_key: &Pubkey, + distribution: &Distribution, + shapley_output: &ShapleyOutputStorage, + leaf_index: usize, + reward_share: &RewardShare, +) -> Result { + const DISTRIBUTE_REWARDS_CU_BASE: u32 = 30_000; + const PER_RECIPIENT_CU: u32 = 12_500; + + let wallet_key = wallet.pubkey(); + + let (contributor_rewards_key, _) = + ContributorRewards::find_address(&reward_share.contributor_key); + + // Fetch contributor reward recipients. + let recipient_shares = match wallet + .connection + .try_fetch_zero_copy_data::(&contributor_rewards_key) + .await + { + Ok(contributor_rewards) => { + let recipient_shares = contributor_rewards + .recipient_shares + .active_iter() + .copied() + .collect::>(); + + if recipient_shares.is_empty() { + warn!( + "No recipients in {contributor_rewards_key} for contributor {}", + reward_share.contributor_key + ); + + return Ok(false); + } + + recipient_shares + } + _ => { + warn!( + "Contributor rewards {contributor_rewards_key} not found for contributor {}", + reward_share.contributor_key + ); + + return Ok(false); + } + }; + + let recipient_keys = recipient_shares + .iter() + .map(|share| &share.recipient_key) + .collect::>(); + + let distribute_rewards_ix = try_build_instruction( + &ID, + DistributeRewardsAccounts::new( + distribution.dz_epoch, + &reward_share.contributor_key, + dz_mint_key, + &wallet_key, + &recipient_keys, + ), + &RevenueDistributionInstructionData::DistributeRewards { + unit_share: reward_share.unit_share, + economic_burn_rate: reward_share.economic_burn_rate(), + proof: shapley_output.generate_merkle_proof(leaf_index)?, + }, + )?; + + // Derive ATA addresses together with their create-ATA compute-unit + // estimates. The address is needed for the existence check below. The CU is + // carried through to the recipients whose ATA must be created. + let (ata_keys, recipient_create_compute_units) = recipient_keys + .iter() + .map(|recipient_key| { + Wallet::ata_address_and_create_compute_units(recipient_key, dz_mint_key) + }) + .unzip::<_, _, Vec<_>, Vec<_>>(); + + // Build instructions to create missing ATAs. We are using idempotent just + // in case there is a race when creating the ATAs. + let (mut instructions, create_ata_compute_units) = wallet + .connection + .get_multiple_accounts(&ata_keys) + .await? + .into_iter() + .zip(recipient_keys.iter()) + .zip(recipient_create_compute_units) + .filter_map( + |((account_info, recipient_key), create_compute_units)| match account_info { + Some(account_info) if account_info.owner == Pubkey::default() => { + Some((recipient_key, create_compute_units)) + } + None => Some((recipient_key, create_compute_units)), + _ => None, + }, + ) + .map(|(recipient_key, create_compute_units)| { + let ix = create_associated_token_account_idempotent( + &wallet_key, + recipient_key, + dz_mint_key, + &spl_token_interface::ID, + ); + + (ix, create_compute_units) + }) + .unzip::<_, _, Vec<_>, Vec<_>>(); + + if !instructions.is_empty() { + warn!("Creating {} ATAs", instructions.len()); + } + + instructions.push(distribute_rewards_ix); + + // Add simple memo to indicate that distributing rewards was relayed. + let (memo_ix, memo_compute_units) = Wallet::build_memo_instruction_with_compute_units(b"Relay"); + instructions.push(memo_ix); + + let compute_unit_limit = DISTRIBUTE_REWARDS_CU_BASE + + recipient_keys.len() as u32 * PER_RECIPIENT_CU + + create_ata_compute_units.iter().sum::() + + memo_compute_units; + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + info!( + "Distribute rewards for epoch {}: {tx_sig}", + distribution.dz_epoch + ); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(true) +} + +#[cfg(test)] +mod tests { + use std::collections::HashSet; + + use doublezero_revenue_distribution::{state::Distribution, types::DoubleZeroEpoch}; + use doublezero_solana_client_tools::account::zero_copy::ZeroCopyAccountOwnedData; + use network_shapley::shapley::{ShapleyOutput, ShapleyValue}; + use solana_sdk::pubkey::Pubkey; + + use super::{try_build_contributor_distribution_results, try_distribution_rewards_iter}; + use crate::calculator::proof::ShapleyOutputStorage; + + fn create_test_shapley_output(num_contributors: usize) -> ShapleyOutput { + let mut output = ShapleyOutput::new(); + for i in 0..num_contributors { + let mut bytes = [0u8; 32]; + bytes[0] = (i + 1) as u8; + bytes[1] = ((i + 1) >> 8) as u8; + let pubkey = Pubkey::new_from_array(bytes); + output.insert( + pubkey.to_string(), + ShapleyValue { + value: 100.0, + proportion: 1.0 / num_contributors as f64, + }, + ); + } + output + } + + fn make_distribution( + epoch: u64, + bitmap: Vec, + total_contributors: u32, + ) -> ZeroCopyAccountOwnedData { + let mut dist = Distribution::default(); + dist.dz_epoch = DoubleZeroEpoch::new(epoch); + dist.processed_rewards_start_index = 0; + dist.processed_rewards_end_index = bitmap.len() as u32; + dist.total_contributors = total_contributors; + + ZeroCopyAccountOwnedData { + mucked_data: Box::new(dist), + remaining_data: bitmap, + } + } + + #[test] + fn test_distribution_rewards_iter_all_unprocessed() { + let shapley = create_test_shapley_output(3); + let shapley_storage = ShapleyOutputStorage::new(42, &shapley).unwrap(); + + // 1 byte = 8 bits, all zeros = all unprocessed + let distribution = make_distribution(42, vec![0x00], 3); + + let results: Vec<_> = try_distribution_rewards_iter(&distribution, &shapley_storage) + .unwrap() + .collect(); + + assert_eq!(results.len(), 3); + for (index, _reward, is_processed) in &results { + assert!(!is_processed, "leaf {} should be unprocessed", index); + } + } + + #[test] + fn test_distribution_rewards_iter_all_processed() { + let shapley = create_test_shapley_output(3); + let shapley_storage = ShapleyOutputStorage::new(42, &shapley).unwrap(); + + // 0xFF = all bits set = all processed + let distribution = make_distribution(42, vec![0xFF], 3); + + let results: Vec<_> = try_distribution_rewards_iter(&distribution, &shapley_storage) + .unwrap() + .collect(); + + assert_eq!(results.len(), 3); + for (index, _reward, is_processed) in &results { + assert!(is_processed, "leaf {} should be processed", index); + } + } + + #[test] + fn test_distribution_rewards_iter_partial() { + let shapley = create_test_shapley_output(3); + let shapley_storage = ShapleyOutputStorage::new(42, &shapley).unwrap(); + + // 0b00000101 = bits 0 and 2 set (leaves 0 and 2 processed, leaf 1 unprocessed) + let distribution = make_distribution(42, vec![0b0000_0101], 3); + + let results: Vec<_> = try_distribution_rewards_iter(&distribution, &shapley_storage) + .unwrap() + .collect(); + + assert_eq!(results.len(), 3); + assert!(results[0].2, "leaf 0 should be processed"); + assert!(!results[1].2, "leaf 1 should be unprocessed"); + assert!(results[2].2, "leaf 2 should be processed"); + } + + #[test] + fn test_distribution_summary_marks_newly_distributed_leaves() { + let shapley = create_test_shapley_output(3); + let shapley_storage = ShapleyOutputStorage::new(42, &shapley).unwrap(); + let distribution = make_distribution(42, vec![0x00], 3); + let newly_distributed_leaf_indices = HashSet::from([0usize, 2usize]); + + let contributors = try_build_contributor_distribution_results( + &distribution, + &shapley_storage, + &newly_distributed_leaf_indices, + ) + .unwrap(); + + assert!(contributors[0].distributed, "leaf 0 was newly distributed"); + assert!(!contributors[1].distributed, "leaf 1 remains undistributed"); + assert!(contributors[2].distributed, "leaf 2 was newly distributed"); + } + + #[test] + fn test_distribution_summary_keeps_previously_processed_leaves() { + let shapley = create_test_shapley_output(3); + let shapley_storage = ShapleyOutputStorage::new(42, &shapley).unwrap(); + let distribution = make_distribution(42, vec![0b0000_0010], 3); + let newly_distributed_leaf_indices = HashSet::from([0usize]); + + let contributors = try_build_contributor_distribution_results( + &distribution, + &shapley_storage, + &newly_distributed_leaf_indices, + ) + .unwrap(); + + assert!(contributors[0].distributed, "leaf 0 was newly distributed"); + assert!(contributors[1].distributed, "leaf 1 was already processed"); + assert!(!contributors[2].distributed, "leaf 2 remains undistributed"); + } + + #[test] + fn test_distribution_rewards_iter_insufficient_bitmap() { + let shapley = create_test_shapley_output(10); + let shapley_storage = ShapleyOutputStorage::new(42, &shapley).unwrap(); + + // Only 1 byte = 8 bits, but 10 contributors need at least 2 bytes + let distribution = make_distribution(42, vec![0x00], 10); + + let result = try_distribution_rewards_iter(&distribution, &shapley_storage); + let err = result.err().expect("should be an error"); + assert!( + err.to_string().contains("Insufficient"), + "error should mention insufficient bitmap" + ); + } + + #[test] + fn test_outcome_all_processed_maps_to_already_complete() { + let shapley = create_test_shapley_output(3); + let storage = ShapleyOutputStorage::new(42, &shapley).unwrap(); + let distribution = make_distribution(42, vec![0xFF], 3); + + let unprocessed_count = try_distribution_rewards_iter(&distribution, &storage) + .unwrap() + .filter(|(_, _, is_processed)| !is_processed) + .count(); + + assert_eq!(unprocessed_count, 0); + } + + #[test] + fn test_distribution_rewards_iter_empty_rewards() { + let shapley_storage = ShapleyOutputStorage { + epoch: 42, + rewards: vec![], + total_unit_shares: 0, + }; + + let distribution = make_distribution(42, vec![], 0); + + let results: Vec<_> = try_distribution_rewards_iter(&distribution, &shapley_storage) + .unwrap() + .collect(); + + assert!(results.is_empty()); + } +} diff --git a/offchain/crates/contributor-rewards/src/calculator/input.rs b/offchain/crates/contributor-rewards/src/calculator/input.rs new file mode 100644 index 0000000000..03a71aee21 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/input.rs @@ -0,0 +1,264 @@ +use std::collections::BTreeMap; + +use anyhow::{Result, bail}; +use borsh::{BorshDeserialize, BorshSerialize}; +use chrono::Utc; +use network_shapley::types::{Demands, Devices, PrivateLinks, PublicLinks}; +use serde::{Deserialize, Serialize}; +use svm_hash::sha2::{Hash, double_hash}; + +use crate::{ingestor::demand::CityStats, settings::ShapleySettings}; + +// Domain separation prefixes for telemetry checksums +const PREFIX_DEVICE_TELEMETRY: &str = "dz_input_device_telemetry"; +const PREFIX_INTERNET_TELEMETRY: &str = "dz_input_internet_telemetry"; +const CHECKSUM_SUFFIX: &[u8] = b"checksum"; + +/// Summary statistics for a city +#[derive(Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize)] +pub struct CitySummary { + pub validator_count: usize, + pub total_stake_proxy: usize, + pub weight: f64, +} + +/// Local struct to encapsulate all shapley related inputs +#[derive(Debug, Clone)] +pub struct ShapleyInputs { + pub devices: Devices, + pub private_links: PrivateLinks, + pub public_links: PublicLinks, + pub demands: Demands, + pub city_stats: CityStats, + pub city_weights: BTreeMap, // Pre-calculated weights for consistency +} + +/// Complete input configuration for reward calculations +/// Stored on-chain for transparency and verification +#[derive(Debug, Clone, BorshSerialize, BorshDeserialize, Serialize, Deserialize)] +pub struct RewardInput { + // Metadata + pub epoch: u64, + pub timestamp: i64, + + // Configuration + pub shapley_settings: ShapleySettings, + + // Full input data for complete transparency + pub devices: Devices, + pub private_links: PrivateLinks, + pub public_links: PublicLinks, + pub demands: Demands, + pub city_summaries: BTreeMap, + + // Checksums for telemetry data verification + // Note: Skipped during serialization because checksums are computed from raw telemetry data + // which may vary across snapshots (different time windows, sampling). These are for runtime + // verification only and not part of the reward calculation state. + #[serde(skip)] + pub device_telemetry_checksum: Hash, + #[serde(skip)] + pub internet_telemetry_checksum: Hash, +} + +/// Helper function to compute epoch-specific checksum +fn compute_epoch_checksum(data: &[u8], prefix: &str, epoch: u64) -> Hash { + double_hash(data, format!("{prefix}{epoch}").as_bytes(), CHECKSUM_SUFFIX) +} + +impl RewardInput { + /// Create a new RewardInput with current timestamp and version + pub fn new( + epoch: u64, + shapley_settings: ShapleySettings, + shapley_inputs: &ShapleyInputs, + device_telemetry_data: &[u8], + internet_telemetry_data: &[u8], + ) -> Self { + let city_stats = &shapley_inputs.city_stats; + + // Use pre-calculated weights from ShapleyInputs for consistency + let city_summaries: BTreeMap = city_stats + .iter() + .map(|(city, stat)| { + // Get weight from pre-calculated weights + let weight = shapley_inputs + .city_weights + .get(city) + .copied() + .unwrap_or(0.0); + ( + city.clone(), + CitySummary { + validator_count: stat.validator_count, + total_stake_proxy: stat.total_stake_proxy, + weight, + }, + ) + }) + .collect(); + + Self { + epoch, + timestamp: Utc::now().timestamp(), + shapley_settings, + // Store full data for complete transparency + devices: shapley_inputs.devices.clone(), + private_links: shapley_inputs.private_links.clone(), + public_links: shapley_inputs.public_links.clone(), + demands: shapley_inputs.demands.clone(), + city_summaries, + // Keep telemetry checksums for verification + device_telemetry_checksum: compute_epoch_checksum( + device_telemetry_data, + PREFIX_DEVICE_TELEMETRY, + epoch, + ), + internet_telemetry_checksum: compute_epoch_checksum( + internet_telemetry_data, + PREFIX_INTERNET_TELEMETRY, + epoch, + ), + } + } + + /// Validate checksums against provided telemetry data + pub fn validate_checksums( + &self, + device_telemetry_data: &[u8], + internet_telemetry_data: &[u8], + ) -> Result<()> { + let device_checksum = + compute_epoch_checksum(device_telemetry_data, PREFIX_DEVICE_TELEMETRY, self.epoch); + if device_checksum != self.device_telemetry_checksum { + bail!("Device telemetry checksum mismatch"); + } + + let internet_checksum = compute_epoch_checksum( + internet_telemetry_data, + PREFIX_INTERNET_TELEMETRY, + self.epoch, + ); + if internet_checksum != self.internet_telemetry_checksum { + bail!("Internet telemetry checksum mismatch"); + } + + Ok(()) + } + + /// Get a summary of the configuration + pub fn summary(&self) -> String { + format!( + "Epoch: {}\n\ + Timestamp: {}\n\ + Devices: {}\n\ + Private Links: {}\n\ + Public Links: {}\n\ + Demands: {}\n\ + Cities: {}\n\ + Shapley Settings:\n\ + - Operator Uptime: {}\n\ + - Contiguity Bonus: {}\n\ + - Demand Multiplier: {}", + self.epoch, + self.timestamp, + self.devices.len(), + self.private_links.len(), + self.public_links.len(), + self.demands.len(), + self.city_summaries.len(), + self.shapley_settings.operator_uptime, + self.shapley_settings.contiguity_bonus, + self.shapley_settings.demand_multiplier, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn create_test_input() -> RewardInput { + let shapley_settings = ShapleySettings { + operator_uptime: 0.98, + contiguity_bonus: 5.0, + demand_multiplier: 1.2, + }; + + let devices = vec![]; + let private_links = vec![]; + let public_links = vec![]; + let demands = vec![]; + let city_stats: crate::ingestor::demand::CityStats = BTreeMap::new(); + let city_weights = crate::calculator::util::calculate_city_weights(&city_stats); + let shapley_inputs = ShapleyInputs { + devices, + private_links, + public_links, + demands, + city_stats, + city_weights, + }; + + RewardInput::new( + 100, + shapley_settings, + &shapley_inputs, + b"test_device_data", + b"test_internet_data", + ) + } + + #[test] + fn test_serialization() { + let input = create_test_input(); + + // Serialize + let serialized = borsh::to_vec(&input).unwrap(); + assert!(!serialized.is_empty()); + + // Deserialize + let deserialized: RewardInput = borsh::from_slice(&serialized).unwrap(); + + // Verify + assert_eq!(input.epoch, deserialized.epoch); + assert_eq!( + input.shapley_settings.operator_uptime, + deserialized.shapley_settings.operator_uptime + ); + } + + #[test] + fn test_checksum_validation() { + let input = create_test_input(); + + // Should pass with correct data + assert!( + input + .validate_checksums(b"test_device_data", b"test_internet_data") + .is_ok() + ); + + // Should fail with incorrect data + assert!( + input + .validate_checksums(b"wrong_device_data", b"test_internet_data") + .is_err() + ); + assert!( + input + .validate_checksums(b"test_device_data", b"wrong_internet_data") + .is_err() + ); + } + + #[test] + fn test_summary() { + let input = create_test_input(); + let summary = input.summary(); + + assert!(summary.contains("Epoch: 100")); + assert!(summary.contains("Operator Uptime: 0.98")); + assert!(summary.contains("Devices: 0")); + } +} diff --git a/offchain/crates/contributor-rewards/src/calculator/keypair_loader.rs b/offchain/crates/contributor-rewards/src/calculator/keypair_loader.rs new file mode 100644 index 0000000000..d730a0b623 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/keypair_loader.rs @@ -0,0 +1,64 @@ +use std::path::PathBuf; + +use anyhow::Result; +use solana_sdk::signature::{Keypair, Signer}; +use thiserror::Error; +use tracing::info; + +#[derive(Error, Debug)] +pub enum KeypairError { + #[error( + "Keypair not provided. Please specify --keypair or set REWARDER_KEYPAIR_PATH environment variable" + )] + NotProvided, + + #[error("Keypair file not found at path: {path}")] + FileNotFound { path: String }, + + #[error("Invalid keypair format in file: {path}")] + InvalidFormat { path: String }, + + #[error("IO error reading keypair file: {0}")] + IoError(#[from] std::io::Error), + + #[error("JSON parsing error: {0}")] + JsonError(#[from] serde_json::Error), +} + +/// Load keypair from CLI argument or environment variable. +/// CLI argument takes precedence over environment variable. +/// No default fallback - keypair must be explicitly provided. +pub fn load_keypair(cli_path: &Option) -> Result { + let keypair_path = if let Some(path) = cli_path { + info!("Using keypair from CLI argument"); + path + } else if let Ok(path_str) = std::env::var("REWARDER_KEYPAIR_PATH") { + info!("Using keypair from REWARDER_KEYPAIR_PATH environment variable"); + &PathBuf::from(path_str) + } else { + return Err(KeypairError::NotProvided.into()); + }; + + if !keypair_path.exists() { + return Err(KeypairError::FileNotFound { + path: keypair_path.display().to_string(), + } + .into()); + } + + let keypair_file = std::fs::read_to_string(keypair_path).map_err(KeypairError::IoError)?; + + let keypair_bytes: Vec = + serde_json::from_str(&keypair_file).map_err(|_e| KeypairError::InvalidFormat { + path: keypair_path.display().to_string(), + })?; + + let keypair = + Keypair::try_from(keypair_bytes.as_slice()).map_err(|_| KeypairError::InvalidFormat { + path: keypair_path.display().to_string(), + })?; + + info!("Loaded keypair with pubkey: {}", keypair.pubkey()); + + Ok(keypair) +} diff --git a/offchain/crates/contributor-rewards/src/calculator/ledger_operations.rs b/offchain/crates/contributor-rewards/src/calculator/ledger_operations.rs new file mode 100644 index 0000000000..6f23fb0350 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/ledger_operations.rs @@ -0,0 +1,1178 @@ +use std::{ + collections::HashMap, fmt, fs, mem::size_of, path::PathBuf, str::FromStr, time::Duration, +}; + +use anyhow::{Context, Result, anyhow, bail}; +use backon::{ExponentialBuilder, Retryable}; +use doublezero_program_tools::zero_copy; +use doublezero_record::{instruction as record_ix, state::RecordData}; +use doublezero_revenue_distribution::state::ProgramConfig; +use doublezero_sdk::record::pubkey::create_record_key; +use doublezero_serviceability::state::{accounttype::AccountType, contributor::Contributor}; +use doublezero_solana_client_tools::rpc::DoubleZeroLedgerConnection; +use solana_client::{ + client_error::ClientError as SolanaClientError, + nonblocking::rpc_client::RpcClient, + rpc_config::RpcProgramAccountsConfig, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::{ + message::Message, pubkey::Pubkey, signature::Keypair, signer::Signer, transaction::Transaction, +}; +use tabled::{Table, Tabled, settings::Style}; +use tracing::{debug, info, warn}; + +use crate::{ + calculator::{ + input::RewardInput, + keypair_loader::load_keypair, + proof::{ShapleyOutputStorage, generate_proof_from_shapley}, + recorder::write_serialized_to_ledger, + }, + ingestor::fetcher::Fetcher, + processor::{ + internet::{InternetTelemetryStatMap, print_internet_stats}, + telemetry::{DZDTelemetryStatMap, print_telemetry_stats}, + }, + settings::Settings, +}; + +/// Fetch the rewards_accountant from ProgramConfig, with optional override +pub async fn get_rewards_accountant( + rpc_client: &RpcClient, + override_pubkey: Option, +) -> Result { + if let Some(pubkey) = override_pubkey { + info!("Using provided rewards_accountant: {}", pubkey); + return Ok(pubkey); + } + + let (program_config_address, _) = ProgramConfig::find_address(); + debug!( + "Fetching rewards_accountant from ProgramConfig PDA: {}", + program_config_address + ); + + let account = rpc_client.get_account(&program_config_address).await?; + + let program_config = + zero_copy::checked_from_bytes_with_discriminator::(&account.data) + .ok_or_else(|| anyhow!("Failed to deserialize ProgramConfig"))? + .0; + + let rewards_accountant = program_config.rewards_accountant_key; + debug!( + "Retrieved rewards_accountant from ProgramConfig: {}", + rewards_accountant + ); + + Ok(rewards_accountant) +} + +/// Validate that a keypair matches the rewards_accountant in ProgramConfig +pub async fn validate_rewards_accountant_keypair( + rpc_client: &RpcClient, + keypair: &Keypair, +) -> Result<()> { + let expected = get_rewards_accountant(rpc_client, None).await?; + let actual = keypair.pubkey(); + + if actual != expected { + bail!("Keypair pubkey {actual} doesn't match ProgramConfig rewards_accountant {expected}",); + } + + info!("Keypair validated: matches rewards_accountant in ProgramConfig"); + Ok(()) +} + +/// Result of a write operation +#[derive(Debug)] +pub enum WriteResult { + Success(String, String), // (description, identifier: address/signature) + Failed(String, String), // (description, error) +} + +/// Summary of all ledger writes +#[derive(Debug, Default)] +pub struct WriteSummary { + pub results: Vec, +} + +impl WriteSummary { + /// Add a successful write result with "N/A" as identifier (backward compatibility) + pub fn add_success(&mut self, description: String) { + self.results + .push(WriteResult::Success(description, "N/A".to_string())); + } + + /// Add a successful write result with a specific identifier (address/signature) + pub fn add_success_with_id(&mut self, description: String, identifier: String) { + self.results + .push(WriteResult::Success(description, identifier)); + } + + pub fn add_failure(&mut self, description: String, error: String) { + self.results.push(WriteResult::Failed(description, error)); + } + + pub fn successful_count(&self) -> usize { + self.results + .iter() + .filter(|r| matches!(r, WriteResult::Success(_, _))) + .count() + } + + pub fn failed_count(&self) -> usize { + self.results + .iter() + .filter(|r| matches!(r, WriteResult::Failed(_, _))) + .count() + } + + pub fn total_count(&self) -> usize { + self.results.len() + } + + pub fn all_successful(&self) -> bool { + self.failed_count() == 0 + } +} + +impl fmt::Display for WriteSummary { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + writeln!(f, "Ledger Write Summary")?; + writeln!(f, "=========================================")?; + writeln!( + f, + "Total: {}/{} successful", + self.successful_count(), + self.total_count() + )?; + + if !self.all_successful() { + writeln!(f, " Failed writes:")?; + for result in &self.results { + if let WriteResult::Failed(desc, error) = result { + writeln!(f, " [FAILED] {desc}: {error}")?; + } + } + } + writeln!(f, " All writes:")?; + for result in &self.results { + match result { + WriteResult::Success(desc, _) => writeln!(f, " [OK] {desc}")?, + WriteResult::Failed(desc, _) => writeln!(f, " [FAILED] {desc}")?, + } + } + + writeln!(f, "=========================================")?; + Ok(()) + } +} + +pub async fn write_serialized_and_track( + rpc_client: &RpcClient, + payer_signer: &Keypair, + seeds: &[&[u8]], + serialized: &[u8], + description: &str, + summary: &mut WriteSummary, + rps_limit: u32, +) { + match write_serialized_to_ledger( + rpc_client, + payer_signer, + seeds, + serialized, + description, + rps_limit, + ) + .await + { + Ok(record_address) => { + info!("[OK] Successfully wrote {}", description); + summary.add_success_with_id(description.to_string(), record_address.to_string()); + } + Err(e) => { + warn!("[FAILED] Failed to write {}: {}", description, e); + summary.add_failure(description.to_string(), e.to_string()); + } + } +} + +// ========== READ OPERATIONS ========== + +/// Read telemetry aggregates from the ledger +pub async fn read_telemetry_aggregates( + settings: &Settings, + epoch: u64, + rewards_accountant: Option, + telemetry_type: &str, + output_csv: Option, +) -> Result<()> { + // Validate type parameter + if telemetry_type != "device" && telemetry_type != "internet" && telemetry_type != "all" { + bail!("Invalid telemetry type '{telemetry_type}'. Must be 'device', 'internet', or 'all'",); + } + + // Create fetcher + let fetcher = Fetcher::from_settings(settings)?; + + // Auto-fetch rewards_accountant if not provided + let rewards_accountant = + get_rewards_accountant(&fetcher.solana_write_client, rewards_accountant).await?; + + let mut device_stats: Option = None; + let mut internet_stats: Option = None; + + // Read device telemetry if requested + if telemetry_type == "device" || telemetry_type == "all" { + let prefix = settings.get_device_telemetry_prefix(); + let epoch_bytes = epoch.to_le_bytes(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + let record_key = create_record_key(&rewards_accountant, seeds); + + debug!("Re-created record_key: {record_key}"); + + let maybe_account = (|| async { + fetcher + .dz_rpc_client + .get_account_with_commitment(&record_key, CommitmentConfig::confirmed()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + match maybe_account.value { + None => bail!("account {record_key} has no data!"), + Some(acc) => { + let stats: DZDTelemetryStatMap = + borsh::from_slice(&acc.data[size_of::()..])?; + device_stats = Some(stats.clone()); + println!( + "Device Telemetry Aggregates:\n{}", + print_telemetry_stats(&stats) + ); + } + } + } + + // Read internet telemetry if requested + if telemetry_type == "internet" || telemetry_type == "all" { + let prefix = settings.get_internet_telemetry_prefix(); + let epoch_bytes = epoch.to_le_bytes(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + let record_key = create_record_key(&rewards_accountant, seeds); + + debug!("Re-created record_key: {record_key}"); + + let maybe_account = (|| async { + fetcher + .dz_rpc_client + .get_account_with_commitment(&record_key, CommitmentConfig::confirmed()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + match maybe_account.value { + None => bail!("account {record_key} has no data!"), + Some(acc) => { + let stats: InternetTelemetryStatMap = + borsh::from_slice(&acc.data[size_of::()..])?; + internet_stats = Some(stats.clone()); + println!( + "Internet Telemetry Aggregates:\n{}", + print_internet_stats(&stats) + ); + } + } + } + + // Export to CSV if requested + if let Some(output_path) = output_csv { + use csv::Writer; + + // Create parent directories if they don't exist + if let Some(parent) = output_path.parent() { + fs::create_dir_all(parent).map_err(|e| { + anyhow!( + "Failed to create output directory {}: {}", + parent.display(), + e + ) + })?; + } + + // Export device telemetry if available + if let Some(device_data) = device_stats { + let device_file = if telemetry_type == "all" { + output_path.with_file_name(format!( + "{}_device.csv", + output_path + .file_stem() + .unwrap_or_default() + .to_string_lossy() + )) + } else { + output_path.clone() + }; + + let mut writer = Writer::from_path(&device_file).map_err(|e| { + anyhow!( + "Failed to create CSV writer for {}: {}", + device_file.display(), + e + ) + })?; + + // Write to CSV + for stats in device_data.values() { + writer + .serialize(stats) + .map_err(|e| anyhow!("Failed to write device telemetry record: {e}"))?; + } + writer + .flush() + .map_err(|e| anyhow!("Failed to flush device telemetry CSV: {e}"))?; + info!("Device telemetry exported to: {}", device_file.display()); + } + + // Export internet telemetry if available + if let Some(internet_data) = internet_stats { + let internet_file = if telemetry_type == "all" { + output_path.with_file_name(format!( + "{}_internet.csv", + output_path + .file_stem() + .unwrap_or_default() + .to_string_lossy() + )) + } else { + output_path.clone() + }; + + let mut writer = Writer::from_path(&internet_file).map_err(|e| { + anyhow!( + "Failed to create CSV writer for {}: {}", + internet_file.display(), + e + ) + })?; + + // Write to CSV + for stats in internet_data.values() { + writer + .serialize(stats) + .map_err(|e| anyhow!("Failed to write internet telemetry record: {e}"))?; + } + writer + .flush() + .map_err(|e| anyhow::anyhow!("Failed to flush internet telemetry CSV: {e}"))?; + info!( + "Internet telemetry exported to: {}", + internet_file.display() + ); + } + } + + Ok(()) +} + +/// Read reward input from the ledger +pub async fn read_reward_input( + settings: &Settings, + epoch: u64, + rewards_accountant: Option, +) -> Result<()> { + // Create fetcher + let fetcher = Fetcher::from_settings(settings)?; + + // Auto-fetch rewards_accountant if not provided + let rewards_accountant = + get_rewards_accountant(&fetcher.solana_write_client, rewards_accountant).await?; + + let prefix = settings.get_reward_input_prefix(); + let epoch_bytes = epoch.to_le_bytes(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + let record_key = create_record_key(&rewards_accountant, seeds); + + debug!("Fetching calculation input from: {}", record_key); + + let maybe_account = (|| async { + fetcher + .dz_rpc_client + .get_account_with_commitment(&record_key, CommitmentConfig::confirmed()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + let input_config = match maybe_account.value { + None => bail!("Calculation input account {record_key} not found for epoch {epoch}",), + Some(acc) => { + let data: RewardInput = borsh::from_slice(&acc.data[size_of::()..])?; + data + } + }; + + // Display the configuration using tabled + + #[derive(Tabled)] + struct RewardInputDisplay { + #[tabled(rename = "Field")] + field: String, + #[tabled(rename = "Value")] + value: String, + } + + let input_data = vec![ + RewardInputDisplay { + field: "Epoch".to_string(), + value: input_config.epoch.to_string(), + }, + RewardInputDisplay { + field: "Timestamp".to_string(), + value: input_config.timestamp.to_string(), + }, + RewardInputDisplay { + field: "Devices".to_string(), + value: input_config.devices.len().to_string(), + }, + RewardInputDisplay { + field: "Private Links".to_string(), + value: input_config.private_links.len().to_string(), + }, + RewardInputDisplay { + field: "Public Links".to_string(), + value: input_config.public_links.len().to_string(), + }, + RewardInputDisplay { + field: "Demands".to_string(), + value: input_config.demands.len().to_string(), + }, + RewardInputDisplay { + field: "Cities".to_string(), + value: input_config.city_summaries.len().to_string(), + }, + RewardInputDisplay { + field: "Operator Uptime".to_string(), + value: input_config.shapley_settings.operator_uptime.to_string(), + }, + RewardInputDisplay { + field: "Contiguity Bonus".to_string(), + value: input_config.shapley_settings.contiguity_bonus.to_string(), + }, + RewardInputDisplay { + field: "Demand Multiplier".to_string(), + value: input_config.shapley_settings.demand_multiplier.to_string(), + }, + ]; + + println!( + "{}", + Table::new(input_data).with(Style::psql().remove_horizontals()) + ); + + Ok(()) +} + +/// JSON output struct for check_contributor_reward +#[derive(serde::Serialize)] +pub struct CheckRewardOutput { + pub epoch: u64, + pub contributor: String, + pub unit_share: u32, + pub merkle_root: String, + pub total_contributors: usize, + pub total_units: u32, + pub verified: bool, +} + +/// Check contributor reward and verify merkle proof dynamically +pub async fn check_contributor_reward( + settings: &Settings, + contributor_pubkey: &Pubkey, + epoch: u64, + rewards_accountant: Option, + json_output: bool, +) -> Result<()> { + let fetcher = Fetcher::from_settings(settings)?; + + // Auto-fetch rewards_accountant if not provided + let rewards_accountant = + get_rewards_accountant(&fetcher.solana_write_client, rewards_accountant).await?; + + let prefix = settings.get_contributor_rewards_prefix(); + + // Fetch the shapley output storage + let shapley_storage = + try_fetch_shapley_output(&fetcher.dz_rpc_client, &prefix, &rewards_accountant, epoch) + .await?; + + // Generate proof dynamically + debug!( + "Generating proof dynamically for contributor: {}", + contributor_pubkey + ); + let (proof, reward, computed_root) = + generate_proof_from_shapley(&shapley_storage, contributor_pubkey)?; + debug!("proof: {:?}", proof); + + // POD-based proof verification is handled by comparing roots + // POD verification - check that the proof is valid by comparing roots + let verification_root = svm_hash::merkle::merkle_root_from_indexed_pod_leaves( + &shapley_storage.rewards, + Some(doublezero_revenue_distribution::types::RewardShare::LEAF_PREFIX), + ) + .unwrap(); + let verification_result = verification_root == computed_root; + + if json_output { + let output = CheckRewardOutput { + epoch, + contributor: reward.contributor_key.to_string(), + unit_share: reward.unit_share, + merkle_root: computed_root.to_string(), + total_contributors: shapley_storage.rewards.len(), + total_units: shapley_storage.total_unit_shares, + verified: verification_result, + }; + println!("{}", serde_json::to_string(&output)?); + } else { + #[derive(Tabled)] + struct RewardVerification { + #[tabled(rename = "Field")] + field: String, + #[tabled(rename = "Value")] + value: String, + } + + let verification_data = vec![ + RewardVerification { + field: "Epoch".to_string(), + value: epoch.to_string(), + }, + RewardVerification { + field: "Contributor Pubkey".to_string(), + value: reward.contributor_key.to_string(), + }, + RewardVerification { + field: "Unit Share".to_string(), + value: format!("{}", reward.unit_share), + }, + RewardVerification { + field: "Merkle Root".to_string(), + value: computed_root.to_string(), + }, + RewardVerification { + field: "Total Contributors".to_string(), + value: shapley_storage.rewards.len().to_string(), + }, + RewardVerification { + field: "Total Units".to_string(), + value: format!( + "{} (should be 1,000,000,000)", + shapley_storage.total_unit_shares + ), + }, + RewardVerification { + field: "Verification Status".to_string(), + value: if verification_result { + "[VALID] Proof verified successfully!".to_string() + } else { + "[INVALID] Proof verification failed!".to_string() + }, + }, + ]; + + println!( + "{}", + Table::new(verification_data).with(Style::psql().remove_horizontals()) + ); + } + + if !verification_result { + bail!("Merkle proof verification failed"); + } + + Ok(()) +} + +/// JSON output struct for a single reward entry +#[derive(serde::Serialize)] +pub struct RewardEntry { + pub contributor: String, + pub unit_share: u32, +} + +/// JSON output struct for read_all_rewards +#[derive(serde::Serialize)] +pub struct AllRewardsOutput { + pub epoch: u64, + pub merkle_root: String, + pub total_contributors: usize, + pub total_units: u32, + pub rewards: Vec, +} + +fn format_unit_share_proportion(unit_share: u32, total_units: u32) -> String { + let proportion = if total_units == 0 { + 0.0 + } else { + unit_share as f64 / total_units as f64 * 100.0 + }; + + format!("{proportion:.4}%") +} + +/// Print a rewards summary table (epoch, merkle root, contributors, unit shares) +pub fn print_rewards_summary( + shapley_storage: &ShapleyOutputStorage, + merkle_root: &solana_sdk::hash::Hash, + contributor_labels: &HashMap, +) { + #[derive(Tabled)] + struct SummaryRow { + #[tabled(rename = "Field")] + field: String, + #[tabled(rename = "Value")] + value: String, + } + + let summary_data = vec![ + SummaryRow { + field: "Epoch".to_string(), + value: shapley_storage.epoch.to_string(), + }, + SummaryRow { + field: "Merkle Root".to_string(), + value: format!("{merkle_root:?}"), + }, + SummaryRow { + field: "Total Contributors".to_string(), + value: shapley_storage.rewards.len().to_string(), + }, + SummaryRow { + field: "Total Units".to_string(), + value: shapley_storage.total_unit_shares.to_string(), + }, + ]; + + println!( + "{}", + Table::new(summary_data).with(Style::psql().remove_horizontals()) + ); + + #[derive(Tabled)] + struct RewardRow { + #[tabled(rename = "Contributor")] + contributor: String, + #[tabled(rename = "Pubkey")] + pubkey: String, + #[tabled(rename = "Unit Share")] + unit_share: u32, + #[tabled(rename = "Proportion")] + proportion: String, + } + + let reward_rows: Vec = shapley_storage + .rewards + .iter() + .map(|r| { + let contributor = contributor_labels + .get(&r.contributor_key) + .cloned() + .unwrap_or_else(|| r.contributor_key.to_string()); + RewardRow { + contributor, + pubkey: r.contributor_key.to_string(), + unit_share: r.unit_share, + proportion: format_unit_share_proportion( + r.unit_share, + shapley_storage.total_unit_shares, + ), + } + }) + .collect(); + + println!(); + println!( + "{}", + Table::new(reward_rows).with(Style::psql().remove_horizontals()) + ); +} + +/// Read all contributor rewards for an epoch +pub async fn read_all_rewards( + settings: &Settings, + epoch: u64, + rewards_accountant: Option, + json_output: bool, +) -> Result<()> { + let fetcher = Fetcher::from_settings(settings)?; + + // Auto-fetch rewards_accountant if not provided + let rewards_accountant = + get_rewards_accountant(&fetcher.solana_write_client, rewards_accountant).await?; + + let prefix = settings.get_contributor_rewards_prefix(); + + // Fetch the shapley output storage + let shapley_storage = + try_fetch_shapley_output(&fetcher.dz_rpc_client, &prefix, &rewards_accountant, epoch) + .await?; + + // Compute merkle root + let merkle_root = shapley_storage.compute_merkle_root()?; + + if json_output { + let rewards: Vec = shapley_storage + .rewards + .iter() + .map(|r| RewardEntry { + contributor: r.contributor_key.to_string(), + unit_share: r.unit_share, + }) + .collect(); + + let output = AllRewardsOutput { + epoch, + merkle_root: format!("{merkle_root:?}"), + total_contributors: shapley_storage.rewards.len(), + total_units: shapley_storage.total_unit_shares, + rewards, + }; + println!("{}", serde_json::to_string(&output)?); + } else { + let dz_connection = DoubleZeroLedgerConnection::new(settings.rpc.dz_url.clone()); + let labels = try_fetch_contributor_labels( + &dz_connection, + &settings.programs.serviceability_program_id, + ) + .await + .unwrap_or_default(); + + print_rewards_summary(&shapley_storage, &merkle_root, &labels); + } + + Ok(()) +} + +/// Read shapley output storage from the ledger +pub async fn read_shapley_output( + settings: &Settings, + epoch: u64, + rewards_accountant: Option, +) -> Result { + let fetcher = Fetcher::from_settings(settings)?; + + // Auto-fetch rewards_accountant if not provided + let rewards_accountant = + get_rewards_accountant(&fetcher.solana_write_client, rewards_accountant).await?; + + let prefix = settings.get_contributor_rewards_prefix(); + + try_fetch_shapley_output(&fetcher.dz_rpc_client, &prefix, &rewards_accountant, epoch).await +} + +pub async fn try_fetch_shapley_output( + dz_rpc_client: &DoubleZeroLedgerConnection, + prefix: &[u8], + accountant_key: &Pubkey, + epoch: u64, +) -> Result { + debug!("Fetching shapley output for epoch {epoch} recorded by {accountant_key}"); + + let shapley_record = dz_rpc_client + .try_fetch_borsh_record_with_commitment( + accountant_key, + &[prefix, &epoch.to_le_bytes(), b"shapley_output"], + CommitmentConfig::confirmed(), + ) + .await?; + + Ok(shapley_record.data) +} + +/// NOTE: This is mostly just for debugging +/// Realloc a record account +pub async fn realloc_record( + settings: &Settings, + r#type: &str, + epoch: u64, + size: u64, + keypair_path: Option, + dry_run: bool, +) -> Result<()> { + // Load keypair + let payer_signer = load_keypair(&keypair_path)?; + + // Create fetcher for RPC client + let fetcher = Fetcher::from_settings(settings)?; + + // Validate keypair matches ProgramConfig + validate_rewards_accountant_keypair(&fetcher.solana_write_client, &payer_signer).await?; + + // Determine the prefix and compute the record address based on record type + let epoch_bytes = epoch.to_le_bytes(); + let record_key = match r#type { + "device-telemetry" => { + let prefix = settings.get_device_telemetry_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + create_record_key(&payer_signer.pubkey(), seeds) + } + "internet-telemetry" => { + let prefix = settings.get_internet_telemetry_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + create_record_key(&payer_signer.pubkey(), seeds) + } + "reward-input" => { + let prefix = settings.get_reward_input_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + create_record_key(&payer_signer.pubkey(), seeds) + } + "contributor-rewards" => { + let prefix = settings.get_contributor_rewards_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes, b"shapley_output"]; + create_record_key(&payer_signer.pubkey(), seeds) + } + _ => bail!( + "Invalid record type. Must be one of: device-telemetry, internet-telemetry, reward-input, contributor-rewards" + ), + }; + + info!("Reallocating record account: {}", record_key); + info!("Record type: {}, Epoch: {}", r#type, epoch); + + // Check if the account exists + let maybe_account = (|| async { + fetcher + .dz_rpc_client + .get_account_with_commitment(&record_key, CommitmentConfig::confirmed()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + if maybe_account.value.is_none() { + bail!("Record account {record_key} does not exist"); + } + + // Create realloc instruction + let realloc_ix = record_ix::reallocate(&record_key, &payer_signer.pubkey(), size); + + // Create and send transaction + let recent_blockhash = (|| async { fetcher.dz_rpc_client.get_latest_blockhash().await }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + let message = Message::new(&[realloc_ix], Some(&payer_signer.pubkey())); + let transaction = Transaction::new(&[&payer_signer], message, recent_blockhash); + + if !dry_run { + let signature = (|| async { + fetcher + .dz_rpc_client + .send_and_confirm_transaction_with_spinner_and_commitment( + &transaction, + CommitmentConfig::confirmed(), + ) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + info!("Transaction signature: {}", signature); + info!("Account realloc successful!"); + } else { + info!("DRY-RUN mode, would have sent {:#?}", transaction) + } + + Ok(()) +} + +/// NOTE: This is mostly just for debugging +/// Close a record account and reclaim lamports +pub async fn close_record( + settings: &Settings, + r#type: &str, + epoch: u64, + keypair_path: Option, + dry_run: bool, +) -> Result<()> { + // Load keypair + let payer_signer = load_keypair(&keypair_path)?; + + // Create fetcher for RPC client + let fetcher = Fetcher::from_settings(settings)?; + + // Validate keypair matches ProgramConfig + validate_rewards_accountant_keypair(&fetcher.solana_write_client, &payer_signer).await?; + + // Determine the prefix and compute the record address based on record type + let epoch_bytes = epoch.to_le_bytes(); + let record_key = match r#type { + "device-telemetry" => { + let prefix = settings.get_device_telemetry_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + create_record_key(&payer_signer.pubkey(), seeds) + } + "internet-telemetry" => { + let prefix = settings.get_internet_telemetry_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + create_record_key(&payer_signer.pubkey(), seeds) + } + "reward-input" => { + let prefix = settings.get_reward_input_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + create_record_key(&payer_signer.pubkey(), seeds) + } + "contributor-rewards" => { + let prefix = settings.get_contributor_rewards_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes, b"shapley_output"]; + create_record_key(&payer_signer.pubkey(), seeds) + } + _ => bail!( + "Invalid record type. Must be one of: device-telemetry, internet-telemetry, reward-input, contributor-rewards" + ), + }; + + info!("Closing record account: {}", record_key); + info!("Record type: {}, Epoch: {}", r#type, epoch); + + // Check if the account exists + let maybe_account = (|| async { + fetcher + .dz_rpc_client + .get_account_with_commitment(&record_key, CommitmentConfig::confirmed()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + if maybe_account.value.is_none() { + bail!("Record account {record_key} does not exist"); + } + + // Create close instruction + let close_ix = record_ix::close_account( + &record_key, + &payer_signer.pubkey(), + &payer_signer.pubkey(), // Return lamports to payer + ); + + // Create and send transaction + let recent_blockhash = (|| async { fetcher.dz_rpc_client.get_latest_blockhash().await }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + let message = Message::new(&[close_ix], Some(&payer_signer.pubkey())); + let transaction = Transaction::new(&[&payer_signer], message, recent_blockhash); + + if !dry_run { + let signature = (|| async { + fetcher + .dz_rpc_client + .send_and_confirm_transaction_with_spinner_and_commitment( + &transaction, + CommitmentConfig::confirmed(), + ) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + info!("Transaction signature: {}", signature); + info!("Account closed successfully!"); + } else { + info!("DRY-RUN mode, would have sent {:#?}", transaction) + } + + Ok(()) +} + +/// Inspect record accounts for a given epoch +pub async fn inspect_records( + settings: &Settings, + epoch: u64, + rewards_accountant: Option, + record_type: Option, +) -> Result<()> { + let fetcher = Fetcher::from_settings(settings)?; + + // Auto-fetch rewards_accountant if not provided + let rewards_accountant = + get_rewards_accountant(&fetcher.solana_write_client, rewards_accountant).await?; + let epoch_bytes = epoch.to_le_bytes(); + + // Define all record types to inspect + let record_types = if let Some(specific_type) = record_type { + vec![specific_type] + } else { + vec![ + "device-telemetry".to_string(), + "internet-telemetry".to_string(), + "reward-input".to_string(), + "contributor-rewards".to_string(), + ] + }; + + #[derive(Tabled)] + struct RecordInfo { + #[tabled(rename = "Type")] + record_type: String, + #[tabled(rename = "Address")] + address: String, + #[tabled(rename = "Data Size (bytes)")] + data_size: String, + #[tabled(rename = "Header Size (bytes)")] + header_size: String, + #[tabled(rename = "Status")] + status: String, + } + + let header_size = size_of::(); + let mut records = Vec::new(); + + for r_type in record_types { + let record_key = match r_type.as_str() { + "device-telemetry" => { + let prefix = settings.get_device_telemetry_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + create_record_key(&rewards_accountant, seeds) + } + "internet-telemetry" => { + let prefix = settings.get_internet_telemetry_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + create_record_key(&rewards_accountant, seeds) + } + "reward-input" => { + let prefix = settings.get_reward_input_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes]; + create_record_key(&rewards_accountant, seeds) + } + "contributor-rewards" => { + let prefix = settings.get_contributor_rewards_prefix(); + let seeds: &[&[u8]] = &[&prefix, &epoch_bytes, b"shapley_output"]; + create_record_key(&rewards_accountant, seeds) + } + _ => bail!("Unknown record type: {r_type}"), + }; + + // Try to fetch the account + let maybe_account = (|| async { + fetcher + .dz_rpc_client + .get_account_with_commitment(&record_key, CommitmentConfig::confirmed()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + let (data_size, status) = match maybe_account.value { + None => (0, "Not found".to_string()), + Some(acc) => { + let data_size = acc.data.len(); + let actual_size = data_size - header_size; + if actual_size == 0 { + (actual_size, "Empty".to_string()) + } else { + (actual_size, "Non Empty".to_string()) + } + } + }; + + records.push(RecordInfo { + record_type: r_type, + address: record_key.to_string(), + data_size: data_size.to_string(), + header_size: header_size.to_string(), + status, + }); + } + + println!( + "{}", + Table::new(records).with(Style::psql().remove_horizontals()) + ); + + Ok(()) +} + +/// Fetch contributor labels (owner → code) from the DZ Ledger serviceability program. +pub async fn try_fetch_contributor_labels( + dz_connection: &DoubleZeroLedgerConnection, + serviceability_program_id: &str, +) -> Result> { + let program_pubkey = Pubkey::from_str(serviceability_program_id).with_context(|| { + format!("Invalid serviceability program ID: {serviceability_program_id}") + })?; + + let config = RpcProgramAccountsConfig { + filters: Some(vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded( + 0, + &[AccountType::Contributor as u8], + ))]), + ..Default::default() + }; + + let accounts = dz_connection + .get_program_accounts_with_config(&program_pubkey, config) + .await + .context("Failed to fetch contributor accounts")?; + + accounts + .into_iter() + .map(|(key, account_info)| { + let contributor = Contributor::try_from(&account_info.data[..]) + .with_context(|| format!("Failed to deserialize contributor account {key}"))?; + Ok((contributor.owner, contributor.code)) + }) + .collect::>>() +} + +#[cfg(test)] +mod tests { + use super::format_unit_share_proportion; + + #[test] + fn formats_unit_share_proportion() { + assert_eq!(format_unit_share_proportion(250, 1000), "25.0000%"); + assert_eq!(format_unit_share_proportion(1, 3), "33.3333%"); + } + + #[test] + fn formats_zero_total_units_as_zero_percent() { + assert_eq!(format_unit_share_proportion(1, 0), "0.0000%"); + } +} diff --git a/offchain/crates/contributor-rewards/src/calculator/mod.rs b/offchain/crates/contributor-rewards/src/calculator/mod.rs new file mode 100644 index 0000000000..494eaa320c --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/mod.rs @@ -0,0 +1,17 @@ +pub mod constants; +pub mod data_prep; +pub mod distribute; +pub mod input; +pub mod keypair_loader; +pub mod ledger_operations; +pub mod orchestrator; +pub mod proof; +pub mod recorder; +pub mod revenue_distribution; +pub mod shapley; +pub mod util; +pub mod write_config; + +// Re-export for access +pub use distribute::{DistributionOutcome, DistributionSummary}; +pub use write_config::WriteConfig; diff --git a/offchain/crates/contributor-rewards/src/calculator/orchestrator.rs b/offchain/crates/contributor-rewards/src/calculator/orchestrator.rs new file mode 100644 index 0000000000..dec0019297 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/orchestrator.rs @@ -0,0 +1,551 @@ +use std::{collections::HashMap, path::PathBuf, time::Instant}; + +use anyhow::{Result, bail}; +use doublezero_solana_client_tools::rpc::DoubleZeroLedgerConnection; +use solana_sdk::pubkey::Pubkey; +use tracing::{info, warn}; + +use crate::{ + calculator::{ + WriteConfig, data_prep::PreparedData, input::RewardInput, keypair_loader::load_keypair, + ledger_operations, proof::ShapleyOutputStorage, + revenue_distribution::post_rewards_merkle_root, shapley::evaluator::compute_shapley_values, + }, + cli::snapshot::CompleteSnapshot, + ingestor::fetcher::Fetcher, + settings::Settings, +}; + +#[derive(Debug, Clone)] +pub struct Orchestrator { + pub settings: Settings, +} + +impl Orchestrator { + pub fn new(settings: &Settings) -> Self { + Self { + settings: settings.clone(), + } + } + + pub fn settings(&self) -> &Settings { + &self.settings + } + + pub async fn calculate_rewards( + &self, + epoch: Option, + keypair_path: Option, + snapshot_path: Option, + dry_run: bool, + write_config: WriteConfig, + ) -> Result { + let epoch_start = Instant::now(); + + // Create write summary to track all operations + let mut summary = ledger_operations::WriteSummary::default(); + + // Prepare all data - either from snapshot or from RPC + let prep_data = if let Some(snapshot_file) = snapshot_path { + info!("Loading data from snapshot: {:?}", snapshot_file); + let snapshot = CompleteSnapshot::load_from_file(&snapshot_file)?; + info!( + "Snapshot loaded: epoch {}, created at {}", + snapshot.dz_epoch, snapshot.metadata.created_at + ); + PreparedData::from_snapshot(&snapshot, &self.settings, true)? + } else { + let fetcher = Fetcher::from_settings(&self.settings)?; + PreparedData::new(&fetcher, epoch, true).await? + }; + + // Create fetcher for ledger writes (needed even in snapshot mode for non-dry-run) + let fetcher = Fetcher::from_settings(&self.settings)?; + + let fetch_epoch = prep_data.epoch; + let fetch_epoch_bytes = fetch_epoch.to_le_bytes(); + let device_telemetry = prep_data.device_telemetry; + let internet_telemetry = prep_data.internet_telemetry; + + // Track current epoch being processed + metrics::gauge!("doublezero_contributor_rewards_current_epoch").set(fetch_epoch as f64); + + let Some(shapley_inputs) = prep_data.shapley_inputs else { + bail!("Shapley inputs required for reward calculation but were not prepared") + }; + + let device_telemetry_bytes = borsh::to_vec(&device_telemetry)?; + let internet_telemetry_bytes = borsh::to_vec(&internet_telemetry)?; + + let input_config = RewardInput::new( + fetch_epoch, + self.settings.shapley.clone(), + &shapley_inputs, + &device_telemetry_bytes, + &internet_telemetry_bytes, + ); + + let device_payload_bytes = device_telemetry_bytes.len(); + let internet_payload_bytes = internet_telemetry_bytes.len(); + + // Fetch contributor labels for human-readable display. + let dz_connection = DoubleZeroLedgerConnection::new(self.settings.rpc.dz_url.clone()); + let pubkey_labels = ledger_operations::try_fetch_contributor_labels( + &dz_connection, + &self.settings.programs.serviceability_program_id, + ) + .await + .unwrap_or_default(); + + // Build string-keyed map for shapley evaluator (which uses pubkey strings as keys). + let string_labels: HashMap = pubkey_labels + .iter() + .map(|(k, v)| (k.to_string(), v.clone())) + .collect(); + + // Compute Shapley values using shared function + let start_time = Instant::now(); + let compute_result = + compute_shapley_values(&shapley_inputs, &self.settings.shapley, &string_labels)?; + let elapsed = start_time.elapsed(); + + // Track total Shapley computation time + metrics::histogram!("doublezero_contributor_rewards_shapley_total_duration") + .record(elapsed.as_secs_f64()); + + info!("Shapley computation completed in {:.2?}", elapsed); + + // Process results if we have any + let shapley_output = compute_result.aggregated_output; + if !shapley_output.is_empty() { + // Construct merkle tree from shapley output + let shapley_storage = ShapleyOutputStorage::new(fetch_epoch, &shapley_output)?; + let merkle_root = shapley_storage.compute_merkle_root()?; + info!("merkle_root: {:#?}", merkle_root); + + // Print rewards summary table + ledger_operations::print_rewards_summary( + &shapley_storage, + &merkle_root, + &pubkey_labels, + ); + + // Record payload sizes to monitor ledger write growth + let reward_input_bytes = borsh::to_vec(&input_config)?; + let shapley_storage_bytes = borsh::to_vec(&shapley_storage)?; + let reward_input_len = reward_input_bytes.len(); + let shapley_storage_len = shapley_storage_bytes.len(); + + metrics::gauge!( + "doublezero_contributor_rewards_ledger_write_bytes", + "type" => "device" + ) + .set(device_payload_bytes as f64); + metrics::gauge!( + "doublezero_contributor_rewards_ledger_write_bytes", + "type" => "internet" + ) + .set(internet_payload_bytes as f64); + metrics::gauge!( + "doublezero_contributor_rewards_ledger_write_bytes", + "type" => "reward" + ) + .set(reward_input_len as f64); + metrics::gauge!( + "doublezero_contributor_rewards_ledger_write_bytes", + "type" => "shapley" + ) + .set(shapley_storage_len as f64); + + // Perform batch writes to ledger + if !dry_run && write_config.any_writes_enabled() { + // Only load keypair if at least one write operation is enabled + let payer_signer = load_keypair(&keypair_path)?; + + // Validate keypair matches ProgramConfig + ledger_operations::validate_rewards_accountant_keypair( + &fetcher.solana_write_client, + &payer_signer, + ) + .await?; + + let ledger_start = Instant::now(); + + // Write device telemetry + if !write_config.should_skip_device_telemetry() { + let device_prefix = self.settings.prefixes.device_telemetry.as_bytes(); + ledger_operations::write_serialized_and_track( + &fetcher.dz_rpc_client, + &payer_signer, + &[device_prefix, &fetch_epoch_bytes], + &device_telemetry_bytes, + "device telemetry aggregates", + &mut summary, + self.settings.rpc.rps_limit, + ) + .await; + } else { + info!("[SKIP] Device telemetry write (--skip-device-telemetry)"); + } + + // Write internet telemetry + if !write_config.should_skip_internet_telemetry() { + let internet_prefix = self.settings.prefixes.internet_telemetry.as_bytes(); + ledger_operations::write_serialized_and_track( + &fetcher.dz_rpc_client, + &payer_signer, + &[internet_prefix, &fetch_epoch_bytes], + &internet_telemetry_bytes, + "internet telemetry aggregates", + &mut summary, + self.settings.rpc.rps_limit, + ) + .await; + } else { + info!("[SKIP] Internet telemetry write (--skip-internet-telemetry)"); + } + + // Write reward input + if !write_config.should_skip_reward_input() { + let reward_prefix = self.settings.prefixes.reward_input.as_bytes(); + ledger_operations::write_serialized_and_track( + &fetcher.dz_rpc_client, + &payer_signer, + &[reward_prefix, &fetch_epoch_bytes], + &reward_input_bytes, + "reward calculation input", + &mut summary, + self.settings.rpc.rps_limit, + ) + .await; + } else { + info!("[SKIP] Reward input write (--skip-reward-input)"); + } + + // Write shapley output storage instead of individual proofs + if !write_config.should_skip_shapley_output() { + let prefix = &self.settings.get_contributor_rewards_prefix(); + ledger_operations::write_serialized_and_track( + &fetcher.dz_rpc_client, + &payer_signer, + &[prefix, &fetch_epoch_bytes, b"shapley_output"], + &shapley_storage_bytes, + "shapley output storage", + &mut summary, + self.settings.rpc.rps_limit, + ) + .await; + } else { + info!("[SKIP] Shapley output storage write (--skip-shapley-output)"); + } + + // Post merkle root to revenue distribution program + if !write_config.should_skip_merkle_root() { + info!( + "Posting merkle root for epoch {}: {:?}", + fetch_epoch, merkle_root + ); + + match post_rewards_merkle_root( + &fetcher.solana_write_client, + &payer_signer, + fetch_epoch, + shapley_storage.total_contributors() as u32, + merkle_root, + self.settings.scheduler.grace_period_max_wait_seconds, + ) + .await + { + Ok(signature) => { + info!( + "[OK] Successfully posted merkle root to revenue distribution program" + ); + summary.add_success_with_id( + "merkle root posting".to_string(), + signature.to_string(), + ); + } + Err(e) => { + warn!("[FAILED] Failed to post merkle root: {}", e); + summary.add_failure("merkle root posting".to_string(), e.to_string()); + } + } + } else { + info!("[SKIP] Merkle root posting (--skip-merkle-root)"); + } + + // Track ledger operation metrics + metrics::histogram!("doublezero_contributor_rewards_ledger_write_duration") + .record(ledger_start.elapsed().as_secs_f64()); + + if summary.failed_count() > 0 { + metrics::counter!("doublezero_contributor_rewards_ledger_writes_failure") + .increment(summary.failed_count() as u64); + } + if summary.successful_count() > 0 { + metrics::counter!("doublezero_contributor_rewards_ledger_writes_success") + .increment(summary.successful_count() as u64); + } + + // Log final summary + info!("{}", summary); + + // Return error if not all successful + if !summary.all_successful() { + bail!( + "Some writes failed: {}/{} successful", + summary.successful_count(), + summary.total_count() + ); + } + } else if dry_run { + // Populate mock data in summary for Slack testing in dry-run mode + summary.add_success_with_id( + "device telemetry aggregates".to_string(), + "DRY-RUN-DEVICE-RECORD-ADDRESS".to_string(), + ); + summary.add_success_with_id( + "internet telemetry aggregates".to_string(), + "DRY-RUN-INTERNET-RECORD-ADDRESS".to_string(), + ); + summary.add_success_with_id( + "reward calculation input".to_string(), + "DRY-RUN-REWARD-INPUT-RECORD-ADDRESS".to_string(), + ); + summary.add_success_with_id( + "shapley output storage".to_string(), + "DRY-RUN-SHAPLEY-OUTPUT-RECORD-ADDRESS".to_string(), + ); + summary.add_success_with_id( + "merkle root posting".to_string(), + "DRY-RUN-MERKLE-ROOT-SIGNATURE".to_string(), + ); + + info!( + "DRY-RUN: Would perform batch writes for epoch {}", + fetch_epoch + ); + info!(" - Device telemetry: {} bytes", device_payload_bytes); + info!(" - Internet telemetry: {} bytes", internet_payload_bytes); + info!(" - Reward input: {} bytes", reward_input_len); + info!( + " - Shapley output storage: {} bytes ({} contributors)", + shapley_storage_len, + shapley_storage.total_contributors() + ); + info!(" - Merkle root to post: {:?}", merkle_root); + info!(" - Would post merkle root to revenue distribution program"); + } else { + // All writes are skipped via skip flags + info!( + "All writes skipped for epoch {} (skip flags enabled)", + fetch_epoch + ); + info!( + " - Device telemetry: {} bytes [SKIPPED]", + device_payload_bytes + ); + info!( + " - Internet telemetry: {} bytes [SKIPPED]", + internet_payload_bytes + ); + info!(" - Reward input: {} bytes [SKIPPED]", reward_input_len); + info!( + " - Shapley output storage: {} bytes ({} contributors) [SKIPPED]", + shapley_storage_len, + shapley_storage.total_contributors() + ); + info!(" - Merkle root to post: {:?} [SKIPPED]", merkle_root); + } + } + + // Track epoch processing completion + metrics::counter!("doublezero_contributor_rewards_epochs_processed").increment(1); + metrics::gauge!("doublezero_contributor_rewards_last_successful_epoch") + .set(fetch_epoch as f64); + metrics::histogram!("doublezero_contributor_rewards_epoch_processing_duration") + .record(epoch_start.elapsed().as_secs_f64()); + + Ok(summary) + } + + pub async fn read_telemetry_aggregates( + &self, + epoch: u64, + rewards_accountant: Option, + telemetry_type: &str, + output_csv: Option, + ) -> Result<()> { + ledger_operations::read_telemetry_aggregates( + &self.settings, + epoch, + rewards_accountant, + telemetry_type, + output_csv, + ) + .await + } + + pub async fn check_contributor_reward( + &self, + contributor: &Pubkey, + epoch: u64, + rewards_accountant: Option, + json_output: bool, + ) -> Result<()> { + ledger_operations::check_contributor_reward( + &self.settings, + contributor, + epoch, + rewards_accountant, + json_output, + ) + .await + } + + pub async fn read_all_rewards( + &self, + epoch: u64, + rewards_accountant: Option, + json_output: bool, + ) -> Result<()> { + ledger_operations::read_all_rewards(&self.settings, epoch, rewards_accountant, json_output) + .await + } + + pub async fn read_reward_input( + &self, + epoch: u64, + rewards_accountant: Option, + ) -> Result<()> { + ledger_operations::read_reward_input(&self.settings, epoch, rewards_accountant).await + } + + pub async fn realloc_record( + &self, + r#type: String, + epoch: u64, + size: u64, + keypair: Option, + dry_run: bool, + ) -> Result<()> { + ledger_operations::realloc_record(&self.settings, &r#type, epoch, size, keypair, dry_run) + .await + } + + pub async fn close_record( + &self, + r#type: String, + epoch: u64, + keypair_path: Option, + dry_run: bool, + ) -> Result<()> { + ledger_operations::close_record(&self.settings, &r#type, epoch, keypair_path, dry_run).await + } + + pub async fn write_telemetry_aggregates( + &self, + epoch: Option, + keypair_path: Option, + dry_run: bool, + telemetry_type: String, + ) -> Result<()> { + let fetcher = Fetcher::from_settings(&self.settings)?; + + // NOTE: Prepare telemetry data + // This is same as calculate_rewards but without shapley_inputs + let prep_data = PreparedData::new(&fetcher, epoch, false).await?; + let fetch_epoch = prep_data.epoch; + let device_telemetry = prep_data.device_telemetry; + let internet_telemetry = prep_data.internet_telemetry; + + info!( + "Writing telemetry aggregates for epoch {} (type: {})", + fetch_epoch, telemetry_type + ); + + if !dry_run { + let payer_signer = load_keypair(&keypair_path)?; + + // Validate keypair matches ProgramConfig + ledger_operations::validate_rewards_accountant_keypair( + &fetcher.solana_write_client, + &payer_signer, + ) + .await?; + + let mut summary = ledger_operations::WriteSummary::default(); + + // Write device telemetry if requested + if telemetry_type == "device" || telemetry_type == "all" { + let device_prefix = self.settings.prefixes.device_telemetry.as_bytes(); + ledger_operations::write_serialized_and_track( + &fetcher.dz_rpc_client, + &payer_signer, + &[device_prefix, &fetch_epoch.to_le_bytes()], + &borsh::to_vec(&device_telemetry)?, + "device telemetry aggregates", + &mut summary, + self.settings.rpc.rps_limit, + ) + .await; + } + + // Write internet telemetry if requested + if telemetry_type == "internet" || telemetry_type == "all" { + let inet_prefix = self.settings.prefixes.internet_telemetry.as_bytes(); + ledger_operations::write_serialized_and_track( + &fetcher.dz_rpc_client, + &payer_signer, + &[inet_prefix, &fetch_epoch.to_le_bytes()], + &borsh::to_vec(&internet_telemetry)?, + "internet telemetry aggregates", + &mut summary, + self.settings.rpc.rps_limit, + ) + .await; + } + + // Log final summary + info!("{}", summary); + + // Return error if not all successful + if !summary.all_successful() { + bail!( + "Some writes failed: {}/{} successful", + summary.successful_count(), + summary.total_count() + ); + } + } else { + info!( + "DRY-RUN: Would write telemetry aggregates for epoch {}", + fetch_epoch + ); + if telemetry_type == "device" || telemetry_type == "all" { + info!( + " - Device telemetry: {} bytes", + borsh::to_vec(&device_telemetry)?.len() + ); + } + if telemetry_type == "internet" || telemetry_type == "all" { + info!( + " - Internet telemetry: {} bytes", + borsh::to_vec(&internet_telemetry)?.len() + ); + } + } + + Ok(()) + } + + pub async fn inspect_records( + &self, + epoch: u64, + rewards_accountant: Option, + record_type: Option, + ) -> Result<()> { + ledger_operations::inspect_records(&self.settings, epoch, rewards_accountant, record_type) + .await + } +} diff --git a/offchain/crates/contributor-rewards/src/calculator/proof.rs b/offchain/crates/contributor-rewards/src/calculator/proof.rs new file mode 100644 index 0000000000..5c096ac9c0 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/proof.rs @@ -0,0 +1,515 @@ +use std::str::FromStr; + +use anyhow::{Context, Result, anyhow, bail}; +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_revenue_distribution::types::{RewardShare, UnitShare32}; +use network_shapley::shapley::ShapleyOutput; +use solana_sdk::pubkey::Pubkey; +use svm_hash::{ + merkle::{MerkleProof, merkle_root_from_indexed_pod_leaves}, + sha2::Hash, +}; + +use crate::calculator::constants::MAX_UNIT_SHARE; + +/// Storage structure for consolidated shapley output +/// This is what gets stored on-chain instead of individual proofs +#[derive(Debug, Clone, BorshDeserialize, BorshSerialize)] +pub struct ShapleyOutputStorage { + pub epoch: u64, + pub rewards: Vec, + pub total_unit_shares: u32, // Should equal 1_000_000_000 for validation +} + +impl ShapleyOutputStorage { + pub fn new(epoch: u64, shapley_output: &ShapleyOutput) -> Result { + if shapley_output.is_empty() { + bail!("Empty Shapley output"); + } + + let mut rewards = Vec::new(); + let mut total_unit_shares = UnitShare32::default(); + + for (operator_pubkey_str, val) in shapley_output.iter() { + // Parse the operator string as a Pubkey + let contributor_key = Pubkey::from_str(operator_pubkey_str) + .with_context(|| format!("Invalid pubkey string '{operator_pubkey_str}'"))?; + + // Clamp to valid range for conversion; negative shares are dropped here, but retained for + // logging/analysis prior to this step. + let proportion = val.proportion.clamp(0.0, 1.0); + + // Convert to fixed-point shares, biasing downward so the accumulated total never exceeds + // MAX_UNIT_SHARE. Any remainder is reconciled later when we top up the first reward. + let scaled = f64::floor(proportion * MAX_UNIT_SHARE); + let unit_share = UnitShare32::new(scaled.min(MAX_UNIT_SHARE) as u32) + .context("Invalid unit share")?; + total_unit_shares = total_unit_shares + .checked_add(unit_share) + .context("Total unit shares overflow")?; + + // Unwrapping is safe because we know the proportion is valid. + rewards.push( + RewardShare::new( + contributor_key, + unit_share.into(), + false, // should_block + 0, + ) + .unwrap(), + ); + } + + // Reconcile rounding errors from float-to-fixed conversion. + // Due to floating point precision, the sum might be slightly less than MAX. + // We add the difference to the first reward to ensure the total equals exactly + // 1_000_000_000 (100%), which is required by the on-chain contract. + rewards[0].unit_share += u32::from(UnitShare32::MAX.saturating_sub(total_unit_shares)); + + Ok(Self { + epoch, + rewards, + total_unit_shares: total_unit_shares.into(), + }) + } + + /// Compute the merkle root for all contributor rewards using POD serialization + pub fn compute_merkle_root(&self) -> Result { + merkle_root_from_indexed_pod_leaves(&self.rewards, Some(RewardShare::LEAF_PREFIX)) + .with_context(|| format!("Failed to compute merkle root for epoch {}", self.epoch)) + } + + /// Generate a proof for a specific contributor by index + pub fn generate_merkle_proof(&self, contributor_index: usize) -> Result { + if contributor_index >= self.rewards.len() { + bail!( + "Invalid contributor index {} for epoch {}. Total contributors: {}", + contributor_index, + self.epoch, + self.rewards.len() + ); + } + + MerkleProof::from_indexed_pod_leaves( + &self.rewards, + contributor_index as u32, + Some(RewardShare::LEAF_PREFIX), + ) + .with_context(|| { + format!( + "Failed to generate proof for contributor {} at epoch {}", + contributor_index, self.epoch + ) + }) + } + + /// Get reward detail by index (for verification) + pub fn get_reward(&self, index: usize) -> Option<&RewardShare> { + self.rewards.get(index) + } + + /// Get all rewards (for display) + pub fn rewards(&self) -> &[RewardShare] { + &self.rewards + } + + pub fn epoch(&self) -> u64 { + self.epoch + } + + /// Total number of contributors + pub fn total_contributors(&self) -> usize { + self.rewards.len() + } + + /// Check if there are no contributors + pub fn is_empty(&self) -> bool { + self.rewards.is_empty() + } +} + +/// Generate a merkle proof dynamically from stored shapley output +pub fn generate_proof_from_shapley( + shapley_storage: &ShapleyOutputStorage, + contributor_pubkey: &Pubkey, +) -> Result<(MerkleProof, RewardShare, Hash)> { + // Find the contributor in the rewards list + let mut contributor_index = None; + let mut contributor_reward = None; + + for (index, reward) in shapley_storage.rewards.iter().enumerate() { + if reward.contributor_key == *contributor_pubkey { + contributor_index = Some(index); + contributor_reward = Some(*reward); + break; + } + } + + let index = contributor_index + .ok_or_else(|| anyhow!("Contributor {contributor_pubkey} not found in shapley output",))?; + let reward = contributor_reward.unwrap(); + + // Use POD-based merkle proof generation + let proof = MerkleProof::from_indexed_pod_leaves( + &shapley_storage.rewards, + index as u32, + Some(RewardShare::LEAF_PREFIX), + ) + .ok_or_else(|| anyhow!("Failed to generate proof for contributor at index {index}",))?; + + // Compute the root for verification using POD + let root = merkle_root_from_indexed_pod_leaves( + &shapley_storage.rewards, + Some(RewardShare::LEAF_PREFIX), + ) + .ok_or_else(|| anyhow!("Failed to compute merkle root"))?; + + Ok((proof, reward, root)) +} + +// Deprecated functions have been removed - use generate_proof_from_shapley instead + +#[cfg(test)] +mod tests { + use network_shapley::shapley::ShapleyValue; + + use super::*; + + fn create_test_shapley_output() -> ShapleyOutput { + let mut output = ShapleyOutput::new(); + output.insert( + "11111111111111111111111111111112".to_string(), // Alice pubkey + ShapleyValue { + value: 100.0, + proportion: 0.5, + }, + ); + output.insert( + "11111111111111111111111111111113".to_string(), // Bob pubkey + ShapleyValue { + value: 50.0, + proportion: 0.25, + }, + ); + output.insert( + "11111111111111111111111111111114".to_string(), // Charlie pubkey + ShapleyValue { + value: 50.0, + proportion: 0.25, + }, + ); + output + } + + fn create_single_contributor_output() -> ShapleyOutput { + let mut output = ShapleyOutput::new(); + output.insert( + "11111111111111111111111111111115".to_string(), // Solo pubkey + ShapleyValue { + value: 200.0, + proportion: 1.0, + }, + ); + output + } + + fn create_empty_output() -> ShapleyOutput { + ShapleyOutput::new() + } + + #[test] + fn test_merkle_tree_creation() { + let output = create_test_shapley_output(); + let tree = ShapleyOutputStorage::new(123, &output).unwrap(); + + assert_eq!(tree.epoch(), 123); + assert_eq!(tree.total_contributors(), 3); + assert!(!tree.is_empty()); + + // Check rewards are properly stored + let rewards = tree.rewards(); + assert_eq!(rewards.len(), 3); + + // Find each contributor in rewards by their pubkey + let alice_pubkey = Pubkey::from_str("11111111111111111111111111111112").unwrap(); + let alice = rewards + .iter() + .find(|r| r.contributor_key == alice_pubkey) + .unwrap(); + assert_eq!(alice.unit_share, 500_000_000); // 0.5 * 1_000_000_000 + + let bob_pubkey = Pubkey::from_str("11111111111111111111111111111113").unwrap(); + let bob = rewards + .iter() + .find(|r| r.contributor_key == bob_pubkey) + .unwrap(); + assert_eq!(bob.unit_share, 250_000_000); // 0.25 * 1_000_000_000 + } + + #[test] + fn test_single_contributor_tree() { + let output = create_single_contributor_output(); + let tree = ShapleyOutputStorage::new(456, &output).unwrap(); + + assert_eq!(tree.total_contributors(), 1); + assert!(!tree.is_empty()); + + let root = tree.compute_merkle_root().unwrap(); + assert_ne!(root, Hash::default()); + + // Verify proof generation succeeds for the single contributor + tree.generate_merkle_proof(0).unwrap(); + } + + #[test] + fn test_empty_tree() { + let output = create_empty_output(); + // Empty tree will fail validation because proportions sum to 0, not 1_000_000_000 + let result = ShapleyOutputStorage::new(789, &output); + assert!(result.is_err()); + assert_eq!(result.unwrap_err().to_string(), "Empty Shapley output") + } + + #[test] + fn test_merkle_root_computation() { + let output = create_test_shapley_output(); + let tree = ShapleyOutputStorage::new(100, &output).unwrap(); + + let root1 = tree.compute_merkle_root().unwrap(); + let root2 = tree.compute_merkle_root().unwrap(); + + // Root should be deterministic + assert_eq!(root1, root2); + + // Root should not be default/zero + assert_ne!(root1, Hash::default()); + } + + #[test] + fn test_proof_generation_and_verification() { + let output = create_test_shapley_output(); + let tree = ShapleyOutputStorage::new(200, &output).unwrap(); + let root = tree.compute_merkle_root().unwrap(); + + // Test proof generation for each contributor + for i in 0..tree.total_contributors() { + // Verify proof generation succeeds for each contributor + tree.generate_merkle_proof(i).unwrap(); + } + + // Verify root remains consistent + let verified_root = tree.compute_merkle_root().unwrap(); + assert_eq!(verified_root, root, "Root verification failed"); + } + + #[test] + fn test_invalid_proof_index() { + let output = create_test_shapley_output(); + let tree = ShapleyOutputStorage::new(300, &output).unwrap(); + + // Try to generate proof for invalid index + let result = tree.generate_merkle_proof(100); + assert!(result.is_err()); + assert!( + result + .unwrap_err() + .to_string() + .contains("Invalid contributor index") + ); + } + + #[test] + fn test_proof_serialization_deserialization() { + let output = create_test_shapley_output(); + let tree = ShapleyOutputStorage::new(400, &output).unwrap(); + let root = tree.compute_merkle_root().unwrap(); + + // Generate and serialize proof + let proof = tree.generate_merkle_proof(0).unwrap(); + let proof_bytes = borsh::to_vec(&proof).unwrap(); + + // Verify proof can be deserialized + let _: MerkleProof = borsh::from_slice(&proof_bytes).unwrap(); + + // Verify tree root remains consistent + assert_eq!(tree.compute_merkle_root().unwrap(), root); + } + + #[test] + fn test_generate_proof_from_shapley() { + let output = create_test_shapley_output(); + let tree = ShapleyOutputStorage::new(600, &output).unwrap(); + + // Create ShapleyOutputStorage + let shapley_storage = ShapleyOutputStorage { + epoch: 600, + rewards: tree.rewards().to_vec(), + total_unit_shares: tree.rewards().iter().map(|r| r.unit_share).sum(), + }; + + // Test generating proof for Alice + let alice_pubkey = Pubkey::from_str("11111111111111111111111111111112").unwrap(); + let (_, reward, root) = + generate_proof_from_shapley(&shapley_storage, &alice_pubkey).unwrap(); + + assert_eq!(reward.contributor_key, alice_pubkey); + assert_eq!(reward.unit_share, 500_000_000); // 0.5 * 1_000_000_000 + + // Verify the root matches expected + assert_eq!( + root, + merkle_root_from_indexed_pod_leaves( + &shapley_storage.rewards, + Some(RewardShare::LEAF_PREFIX) + ) + .unwrap() + ); + + // Test for non-existent contributor + let fake_pubkey = Pubkey::from_str("11111111111111111111111111111199").unwrap(); + let result = generate_proof_from_shapley(&shapley_storage, &fake_pubkey); + assert!(result.is_err()); + assert!(result.unwrap_err().to_string().contains("not found")); + } + + #[test] + fn test_different_epochs_different_roots() { + let output = create_test_shapley_output(); + + let tree1 = ShapleyOutputStorage::new(700, &output).unwrap(); + let tree2 = ShapleyOutputStorage::new(701, &output).unwrap(); + + let root1 = tree1.compute_merkle_root().unwrap(); + let root2 = tree2.compute_merkle_root().unwrap(); + + // Different epochs should not affect root (only rewards matter) + assert_eq!(root1, root2); + } + + #[test] + fn test_modified_reward_invalidates_proof() { + let output = create_test_shapley_output(); + let tree = ShapleyOutputStorage::new(800, &output).unwrap(); + let root = tree.compute_merkle_root().unwrap(); + + // Get first contributor's reward + let mut reward = *tree.get_reward(0).unwrap(); + + // Generate proof before modification + tree.generate_merkle_proof(0).unwrap(); + + // Modify reward unit_share + reward.unit_share += 1; + + // Create a modified rewards list + let mut modified_rewards = tree.rewards.clone(); + modified_rewards[0] = reward; + + // Verify modified reward produces different root + let modified_root = + merkle_root_from_indexed_pod_leaves(&modified_rewards, Some(RewardShare::LEAF_PREFIX)) + .unwrap(); + + assert_ne!( + modified_root, root, + "Modified reward should produce different root" + ); + } + + #[test] + fn test_merkle_root_with_many_contributors() { + let mut output = ShapleyOutput::new(); + + // Create 100 contributors using deterministic pubkeys + for i in 0..100 { + // Generate a deterministic pubkey for each contributor + let mut bytes = [0u8; 32]; + bytes[0] = i as u8; + bytes[1] = (i >> 8) as u8; + let pubkey = Pubkey::new_from_array(bytes); + output.insert( + pubkey.to_string(), + ShapleyValue { + value: (i as f64) * 10.0, + proportion: (i as f64) / 4950.0, // Sum of 0..100 = 4950 + }, + ); + } + + let tree = ShapleyOutputStorage::new(900, &output).unwrap(); + assert_eq!(tree.total_contributors(), 100); + + let root = tree.compute_merkle_root().unwrap(); + + // Verify proof generation succeeds for various indices + for i in [0, 25, 50, 75, 99] { + tree.generate_merkle_proof(i).unwrap(); + } + + // Verify root remains consistent + let computed_root = tree.compute_merkle_root().unwrap(); + assert_eq!(computed_root, root, "Root verification failed"); + } + + #[test] + fn test_zero_value_rewards() { + let mut output = ShapleyOutput::new(); + output.insert( + "11111111111111111111111111111116".to_string(), // Zero pubkey + ShapleyValue { + value: 0.0, + proportion: 0.0, + }, + ); + output.insert( + "11111111111111111111111111111117".to_string(), // NonZero pubkey + ShapleyValue { + value: 100.0, + proportion: 1.0, + }, + ); + + let tree = ShapleyOutputStorage::new(1000, &output).unwrap(); + let root = tree.compute_merkle_root().unwrap(); + + // Verify proof generation succeeds for both contributors + for i in 0..tree.total_contributors() { + tree.generate_merkle_proof(i).unwrap(); + } + + // Verify root remains consistent + let computed_root = tree.compute_merkle_root().unwrap(); + assert_eq!(computed_root, root); + } + + #[test] + fn test_negative_value_rewards() { + let mut output = ShapleyOutput::new(); + output.insert( + "11111111111111111111111111111118".to_string(), // Negative pubkey + ShapleyValue { + value: -50.0, + proportion: -0.5, + }, + ); + output.insert( + "11111111111111111111111111111119".to_string(), // Positive pubkey + ShapleyValue { + value: 100.0, + proportion: 1.0, + }, + ); + + let tree = ShapleyOutputStorage::new(1100, &output).unwrap(); + let root = tree.compute_merkle_root().unwrap(); + + // Verify proof generation succeeds even with negative values + for i in 0..tree.total_contributors() { + tree.generate_merkle_proof(i).unwrap(); + } + + // Verify root remains consistent + let computed_root = tree.compute_merkle_root().unwrap(); + assert_eq!(computed_root, root); + } +} diff --git a/offchain/crates/contributor-rewards/src/calculator/recorder.rs b/offchain/crates/contributor-rewards/src/calculator/recorder.rs new file mode 100644 index 0000000000..dbaa3f3993 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/recorder.rs @@ -0,0 +1,238 @@ +use std::{num::NonZeroU32, time::Duration}; + +use anyhow::Result; +use backon::{ExponentialBuilder, Retryable}; +use doublezero_record::{ + ID as RECORD_PROGRAM_ID, instruction as record_instruction, state::RecordData, +}; +use governor::{Quota, RateLimiter}; +use solana_client::{ + client_error::ClientError as SolanaClientError, nonblocking::rpc_client::RpcClient, + rpc_config::RpcSendTransactionConfig, +}; +use solana_commitment_config::{CommitmentConfig, CommitmentLevel}; +use solana_sdk::{ + hash::hashv, + instruction::Instruction, + message::{VersionedMessage, v0::Message}, + pubkey::Pubkey, + signature::Keypair, + signer::Signer, + transaction::VersionedTransaction, +}; +use solana_system_interface::instruction as system_instruction; +use tracing::info; + +pub async fn try_create_record( + rpc_client: &RpcClient, + payer_signer: &Keypair, + seeds: &[&[u8]], + space: usize, +) -> Result { + // We need to incorporate the header of the record account. + let total_space = space + size_of::(); + + let payer_key = payer_signer.pubkey(); + + let seed_str = create_record_seed_string(seeds); + + let record_key = + doublezero_sdk::record::pubkey::create_record_key(&payer_signer.pubkey(), seeds); + + let maybe_account = (|| async { + rpc_client + .get_account_with_commitment(&record_key, CommitmentConfig::confirmed()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + if maybe_account.value.is_some() { + info!("Found existing record_key: {record_key}"); + return Ok(record_key); + } + + // Instead of calling the create-with-seed instruction, we will make + // creating the record account robust by calling each of: + // - allocate-with-seed + // - assign-with-seed + // - transfer + // + // There is a (low) risk that a malicious actor could send lamports to the + // record account before we try to create it. So we might as well mitigate + // this risk by using some more compute units to create the account + // robustly (and we know that CU do not cost anything on DZ Ledger since + // priority fees are not required to land transactions). + + let allocate_ix = system_instruction::allocate_with_seed( + &record_key, + &payer_key, + &seed_str, + total_space as u64, + &RECORD_PROGRAM_ID, + ); + + let assign_ix = system_instruction::assign_with_seed( + &record_key, + &payer_key, + &seed_str, + &RECORD_PROGRAM_ID, + ); + + let initialize_ix = record_instruction::initialize(&record_key, &payer_key); + + // Ordinarily in this create account workflow, we would check the lamports + // on the account and send the difference between the rent exemption amount + // and the current balance. But the presumption is this account has not + // been created yet, so we should be okay to send the full rent exemption + // amount. + let rent_exemption_lamports = (|| async { + rpc_client + .get_minimum_balance_for_rent_exemption(total_space) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + let transfer_ix = + system_instruction::transfer(&payer_key, &record_key, rent_exemption_lamports); + + let transaction = new_transaction( + rpc_client, + &[allocate_ix, assign_ix, transfer_ix, initialize_ix], + &[payer_signer], + ) + .await?; + + // We want to confirm this transaction because we want to ensure that the + // account is created before we write to it. + let tx_sig = rpc_client + .send_and_confirm_transaction(&transaction) + .await?; + info!("Create record tx: {tx_sig}"); + info!("Record Key: {record_key}"); + Ok(record_key) +} + +pub async fn write_record_chunks( + rpc_client: &RpcClient, + payer_signer: &Keypair, + record_key: &Pubkey, + data: &[u8], + rps_limit: u32, +) -> Result<()> { + // One byte more and the transaction is too large. + // CHUNK_SIZE is set to 1,013 bytes to stay well within Solana's transaction size limits. + // This ensures each chunk + transaction overhead remains under the maximum transaction size, + // avoiding rejection due to tx size boundaries. + const CHUNK_SIZE: usize = 1_013; + + let payer_key = payer_signer.pubkey(); + + let num_chunks = data.len() / CHUNK_SIZE + 1; + + // Create rate limiter from settings + let rate_limiter = RateLimiter::direct(Quota::per_second( + NonZeroU32::new(rps_limit).expect("RPS limit must be > 0"), + )); + for (i, chunk) in data.chunks(CHUNK_SIZE).enumerate() { + // Apply rate limiting before sending each chunk + rate_limiter.until_ready().await; + + let chunk_len = chunk.len(); + let offset = i * CHUNK_SIZE; + + let write_ix = record_instruction::write(record_key, &payer_key, offset as u64, chunk); + let transaction = new_transaction(rpc_client, &[write_ix], &[payer_signer]).await?; + + let tx_sig = rpc_client + .send_transaction_with_config( + &transaction, + RpcSendTransactionConfig { + // TODO: We should be able to get away with skipping + // preflight all together. We do not need to simulate each + // write instruction. + skip_preflight: false, + preflight_commitment: Some(CommitmentLevel::Processed), + ..Default::default() + }, + ) + .await?; + + info!( + "Write record chunk {}/{} to {}; tx: {tx_sig}", + i + 1, + num_chunks, + offset + chunk_len + ); + } + + Ok(()) +} + +/// Convenience method to create a versioned transaction with instructions and +/// signers. This method assumes the first signer is the transaction payer. +pub async fn new_transaction( + rpc_client: &RpcClient, + instructions: &[Instruction], + signers: &[&Keypair], +) -> Result { + // NOTE: Fetching the latest blockhash can fail, so there should be a retry + // mechanism here. + // + // But another solution would be to have a separate thread that periodically + // fetches the latest blockhash and caches it. Blockhashes are good for up + // to 100 (or more?) slots. + let recent_blockhash = (|| async { rpc_client.get_latest_blockhash().await }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + let message = Message::try_compile(&signers[0].pubkey(), instructions, &[], recent_blockhash)?; + + VersionedTransaction::try_new(VersionedMessage::V0(message), signers).map_err(Into::into) +} + +pub fn create_record_seed_string(seeds: &[&[u8]]) -> String { + // The full string is 44-bytes. + let mut seed = hashv(seeds).to_string(); + + // Because create-with-seed only supports 32-byte seeds, we need to + // truncate the above seed. Using this seed is safe because the likelihood + // of a collision with another seed truncated to 32 bytes is extremely low. + seed.truncate(32); + + seed +} + +pub async fn write_serialized_to_ledger( + rpc_client: &RpcClient, + payer_signer: &Keypair, + seeds: &[&[u8]], + serialized: &[u8], + data_type: &str, + rps_limit: u32, +) -> Result { + info!( + "Writing {} to ledger ({} bytes)", + data_type, + serialized.len() + ); + + // Create the record account + let record_key = try_create_record(rpc_client, payer_signer, seeds, serialized.len()).await?; + + // Write the data in chunks + write_record_chunks(rpc_client, payer_signer, &record_key, serialized, rps_limit).await?; + + info!("Successfully wrote {} to {}", data_type, record_key); + Ok(record_key) +} diff --git a/offchain/crates/contributor-rewards/src/calculator/revenue_distribution.rs b/offchain/crates/contributor-rewards/src/calculator/revenue_distribution.rs new file mode 100644 index 0000000000..98aeef5972 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/revenue_distribution.rs @@ -0,0 +1,160 @@ +use std::time::{Duration, Instant}; + +use anyhow::{Context, Result, anyhow, bail}; +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + ID as REVENUE_DISTRIBUTION_PROGRAM_ID, + instruction::{ + RevenueDistributionInstructionData, account::ConfigureDistributionRewardsAccounts, + }, + state::Distribution, + types::DoubleZeroEpoch, +}; +use doublezero_solana_client_tools::rpc::try_fetch_zero_copy_data_with_commitment; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::{ + message::{VersionedMessage, v0::Message}, + signature::{Keypair, Signature, Signer}, + transaction::VersionedTransaction, +}; +use svm_hash::sha2::Hash; +use tokio::time::sleep; +use tracing::{info, warn}; + +/// Check if calculation is allowed for a given distribution based on current block timestamp +async fn check_calculation_allowed( + rpc_client: &RpcClient, + distribution: &Distribution, +) -> Result { + // Get current slot and its block time from Solana + let current_slot = rpc_client.get_slot().await?; + let current_timestamp = rpc_client.get_block_time(current_slot).await?; + + let is_allowed = distribution + .checked_calculation_allowed_timestamp() + .is_some_and(|allowed_timestamp| current_timestamp >= allowed_timestamp); + + Ok(is_allowed) +} + +/// Wait for the grace period to expire before posting merkle root +/// Returns the Distribution account data for reuse +async fn wait_for_grace_period( + rpc_client: &RpcClient, + epoch: u64, + max_wait_seconds: u64, +) -> Result { + let dz_epoch = DoubleZeroEpoch::new(epoch); + let (distribution_key, _) = Distribution::find_address(dz_epoch); + + info!( + "Checking grace period for epoch {} at address {}", + epoch, distribution_key + ); + + // Fetch Distribution account + let distribution = try_fetch_zero_copy_data_with_commitment::( + rpc_client, + &distribution_key, + rpc_client.commitment(), + ) + .await + .with_context(|| { + format!( + "Distribution account for epoch {} does not exist at {}. \ + It needs to be initialized by validator-debt crate first.", + epoch, distribution_key + ) + })?; + + // Poll until grace period is satisfied + let max_wait = Duration::from_secs(max_wait_seconds); + let poll_interval = Duration::from_secs(60); + let start = Instant::now(); + + loop { + if check_calculation_allowed(rpc_client, &distribution).await? { + info!( + "Grace period satisfied for epoch {} after waiting {:?}", + epoch, + start.elapsed() + ); + return Ok(*distribution); + } + + if start.elapsed() >= max_wait { + bail!( + "Exceeded max wait time ({:?}) for grace period on epoch {}", + max_wait, + epoch + ); + } + + if let Some(allowed_timestamp) = distribution.checked_calculation_allowed_timestamp() { + // Get current Solana block time + let current_slot = rpc_client.get_slot().await?; + let current_timestamp = rpc_client.get_block_time(current_slot).await?; + let wait_seconds = allowed_timestamp - current_timestamp; + + warn!( + "Calculation grace period not satisfied for epoch {}. Waiting approximately {} more seconds (elapsed: {:?})", + epoch, + wait_seconds.max(0), + start.elapsed() + ); + } + + sleep(poll_interval).await; + } +} + +/// Post the contributor rewards merkle root to the revenue distribution program +pub async fn post_rewards_merkle_root( + rpc_client: &RpcClient, + payer_signer: &Keypair, + epoch: u64, + total_contributors: u32, + merkle_root: Hash, + max_wait_seconds: u64, +) -> Result { + info!( + "Posting merkle root for epoch {} with {} contributors to program {}", + epoch, total_contributors, REVENUE_DISTRIBUTION_PROGRAM_ID + ); + + // Wait for grace period and get Distribution account (validates existence and grace period) + let _distribution = wait_for_grace_period(rpc_client, epoch, max_wait_seconds).await?; + + let dz_epoch = DoubleZeroEpoch::new(epoch); + + // Build the ConfigureDistributionRewards instruction with the helper + let ix_data = RevenueDistributionInstructionData::ConfigureDistributionRewards { + total_contributors, + merkle_root, + }; + + let accounts = ConfigureDistributionRewardsAccounts::new(&payer_signer.pubkey(), dz_epoch); + + let ix = try_build_instruction(&REVENUE_DISTRIBUTION_PROGRAM_ID, accounts, &ix_data)?; + + // Build versioned transaction + let recent_blockhash = rpc_client.get_latest_blockhash().await?; + + let message = Message::try_compile(&payer_signer.pubkey(), &[ix], &[], recent_blockhash)?; + + let transaction = + VersionedTransaction::try_new(VersionedMessage::V0(message), &[payer_signer])?; + + // Send transaction + let signature = rpc_client + .send_and_confirm_transaction(&transaction) + .await + .map_err(|e| anyhow!("Failed to post merkle root for epoch {epoch}: {e}"))?; + + info!( + "Successfully posted merkle root for epoch {} with signature: {}", + epoch, signature + ); + + Ok(signature) +} diff --git a/offchain/crates/contributor-rewards/src/calculator/shapley/aggregator.rs b/offchain/crates/contributor-rewards/src/calculator/shapley/aggregator.rs new file mode 100644 index 0000000000..a20f3bd5af --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/shapley/aggregator.rs @@ -0,0 +1,382 @@ +use std::collections::BTreeMap; + +use anyhow::Result; +use network_shapley::shapley::{ShapleyOutput, ShapleyValue}; +use tabled::{builder::Builder as TableBuilder, settings::Style}; +use tracing::info; + +/// Aggregates per-city Shapley outputs using pre-calculated stake-share weights +/// +/// # Arguments +/// * `per_city_outputs` - Map of city to list of (operator, raw_value) tuples +/// * `city_weights` - Pre-calculated normalized weights for each city +/// +/// # Returns +/// Vec of consolidated outputs sorted by value descending +pub fn aggregate_shapley_outputs( + per_city_outputs: &BTreeMap>, + city_weights: &BTreeMap, +) -> Result { + // Log the weights being used in table format + let weights_sum: f64 = city_weights.values().sum(); + + let mut table_rows = vec![vec!["city".to_string(), "weight".to_string()]]; + for (city, weight) in city_weights.iter() { + table_rows.push(vec![city.to_uppercase(), format!("{:.4}", weight)]); + } + table_rows.push(vec!["total".to_string(), format!("{:.4}", weights_sum)]); + + let table = TableBuilder::from(table_rows) + .build() + .with(Style::psql().remove_horizontals()) + .to_string(); + + info!("\n{}", table); + + // Aggregate values for each operator across all cities + let mut operator_values: BTreeMap = BTreeMap::new(); + + for (city, outputs) in per_city_outputs { + let weight = city_weights.get(city).copied().unwrap_or(0.0); + + if weight == 0.0 { + info!("City {} has zero weight, skipping", city); + continue; + } + + for (operator, value) in outputs { + *operator_values.entry(operator.clone()).or_insert(0.0) += value * weight; + } + } + + // Calculate total value for proportion calculation + let total_value: f64 = operator_values.values().sum(); + + // Create consolidated outputs with proportions (stored as decimal 0.0 to 1.0) + let consolidated = operator_values + .into_iter() + .map(|(operator, value)| { + let proportion = if total_value != 0.0 { + value / total_value + } else { + 0.0 + }; + + (operator, ShapleyValue { value, proportion }) + }) + .collect(); + + Ok(consolidated) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{calculator::util::calculate_city_weights, ingestor::demand::CityStat}; + + #[test] + fn test_fra_nyc_weighted_aggregation() { + // Setup: FRA with 60% weight, NYC with 40% weight (by city_price) + let mut city_stats = BTreeMap::new(); + city_stats.insert( + "FRA".to_string(), + CityStat { + validator_count: 2, + total_stake_proxy: 600, + subscriber_count: 0, + city_price: 60, + }, + ); + city_stats.insert( + "NYC".to_string(), + CityStat { + validator_count: 1, + total_stake_proxy: 400, + subscriber_count: 0, + city_price: 40, + }, + ); + + // Per-city Shapley outputs + let mut per_city_outputs = BTreeMap::new(); + per_city_outputs.insert( + "FRA".to_string(), + vec![ + ("OperatorA".to_string(), 100.0), + ("OperatorB".to_string(), 50.0), + ], + ); + per_city_outputs.insert( + "NYC".to_string(), + vec![ + ("OperatorA".to_string(), 80.0), + ("OperatorC".to_string(), 70.0), + ], + ); + + // Aggregate + let city_weights = calculate_city_weights(&city_stats); + let result = aggregate_shapley_outputs(&per_city_outputs, &city_weights).unwrap(); + + // Verify results + // OperatorA: 100*0.6 + 80*0.4 = 60 + 32 = 92 + // OperatorB: 50*0.6 = 30 + // OperatorC: 70*0.4 = 28 + // Total: 150 + assert_eq!(result.len(), 3); + + let op_a = result.get("OperatorA").unwrap(); + assert!((op_a.value - 92.0).abs() < 1e-9); + assert!((op_a.proportion - 92.0 / 150.0).abs() < 1e-9); // 92/150 + + let op_b = result.get("OperatorB").unwrap(); + assert!((op_b.value - 30.0).abs() < 1e-9); + assert!((op_b.proportion - 30.0 / 150.0).abs() < 1e-9); // 30/150 + + let op_c = result.get("OperatorC").unwrap(); + assert!((op_c.value - 28.0).abs() < 1e-9); + assert!((op_c.proportion - 28.0 / 150.0).abs() < 1e-9); // 28/150 + } + + #[test] + fn test_single_city() { + let mut city_stats = BTreeMap::new(); + city_stats.insert( + "LON".to_string(), + CityStat { + validator_count: 3, + total_stake_proxy: 1000, + subscriber_count: 0, + city_price: 0, + }, + ); + + let mut per_city_outputs = BTreeMap::new(); + per_city_outputs.insert( + "LON".to_string(), + vec![("OpX".to_string(), 75.0), ("OpY".to_string(), 25.0)], + ); + + let city_weights = calculate_city_weights(&city_stats); + let result = aggregate_shapley_outputs(&per_city_outputs, &city_weights).unwrap(); + + assert_eq!(result.len(), 2); + + let op_x = result.get("OpX").unwrap(); + assert!((op_x.value - 75.0).abs() < 1e-9); + assert!((op_x.proportion - 0.75).abs() < 1e-9); // 75/100 + + let op_y = result.get("OpY").unwrap(); + assert!((op_y.value - 25.0).abs() < 1e-9); + assert!((op_y.proportion - 0.25).abs() < 1e-9); // 25/100 + } + + #[test] + fn test_missing_operator_in_city() { + let mut city_stats = BTreeMap::new(); + city_stats.insert( + "BER".to_string(), + CityStat { + validator_count: 1, + total_stake_proxy: 500, + subscriber_count: 0, + city_price: 0, + }, + ); + city_stats.insert( + "PAR".to_string(), + CityStat { + validator_count: 1, + total_stake_proxy: 500, + subscriber_count: 0, + city_price: 0, + }, + ); + + let mut per_city_outputs = BTreeMap::new(); + per_city_outputs.insert("BER".to_string(), vec![("OpA".to_string(), 100.0)]); + per_city_outputs.insert("PAR".to_string(), vec![("OpB".to_string(), 100.0)]); + + let city_weights = calculate_city_weights(&city_stats); + let result = aggregate_shapley_outputs(&per_city_outputs, &city_weights).unwrap(); + + assert_eq!(result.len(), 2); + // Each operator gets 50% weight + let op_a = result.get("OpA").unwrap(); + assert!((op_a.value - 50.0).abs() < 1e-9); + assert!((op_a.proportion - 0.5).abs() < 1e-9); // 50/100 + + let op_b = result.get("OpB").unwrap(); + assert!((op_b.value - 50.0).abs() < 1e-9); + assert!((op_b.proportion - 0.5).abs() < 1e-9); // 50/100 + } + + #[test] + fn test_zero_price_city() { + let mut city_stats = BTreeMap::new(); + city_stats.insert( + "MAD".to_string(), + CityStat { + validator_count: 0, + total_stake_proxy: 0, + subscriber_count: 0, + city_price: 0, + }, + ); + city_stats.insert( + "ROM".to_string(), + CityStat { + validator_count: 2, + total_stake_proxy: 1000, + subscriber_count: 10, + city_price: 50, + }, + ); + + let mut per_city_outputs = BTreeMap::new(); + per_city_outputs.insert("MAD".to_string(), vec![("OpIgnored".to_string(), 999.0)]); + per_city_outputs.insert("ROM".to_string(), vec![("OpActive".to_string(), 50.0)]); + + let city_weights = calculate_city_weights(&city_stats); + let result = aggregate_shapley_outputs(&per_city_outputs, &city_weights).unwrap(); + + // MAD should be ignored due to zero city_price weight + assert_eq!(result.len(), 1); + let op_active = result.get("OpActive").unwrap(); + assert!((op_active.value - 50.0).abs() < 1e-9); + assert!((op_active.proportion - 1.0).abs() < 1e-9); + } + + #[test] + fn test_all_zero_values() { + let mut city_stats = BTreeMap::new(); + city_stats.insert( + "ZRH".to_string(), + CityStat { + validator_count: 1, + total_stake_proxy: 500, + subscriber_count: 0, + city_price: 0, + }, + ); + + let mut per_city_outputs = BTreeMap::new(); + per_city_outputs.insert( + "ZRH".to_string(), + vec![("Op1".to_string(), 0.0), ("Op2".to_string(), 0.0)], + ); + + let city_weights = calculate_city_weights(&city_stats); + let result = aggregate_shapley_outputs(&per_city_outputs, &city_weights).unwrap(); + + assert_eq!(result.len(), 2); + let op1 = result.get("Op1").unwrap(); + assert_eq!(op1.value, 0.0); + assert_eq!(op1.proportion, 0.0); + + let op2 = result.get("Op2").unwrap(); + assert_eq!(op2.value, 0.0); + assert_eq!(op2.proportion, 0.0); + } + + #[test] + fn test_negative_values_passthrough() { + let mut city_stats = BTreeMap::new(); + city_stats.insert( + "HEL".to_string(), + CityStat { + validator_count: 1, + total_stake_proxy: 1000, + subscriber_count: 0, + city_price: 0, + }, + ); + + let mut per_city_outputs = BTreeMap::new(); + per_city_outputs.insert( + "HEL".to_string(), + vec![ + ("OpPositive".to_string(), 100.0), + ("OpNegative".to_string(), -50.0), + ], + ); + + let city_weights = calculate_city_weights(&city_stats); + let result = aggregate_shapley_outputs(&per_city_outputs, &city_weights).unwrap(); + + assert_eq!(result.len(), 2); + + let op_pos = result.get("OpPositive").unwrap(); + assert!((op_pos.value - 100.0).abs() < 1e-9); + assert!((op_pos.proportion - 2.0).abs() < 1e-9); // 100/50 + + let op_neg = result.get("OpNegative").unwrap(); + assert!((op_neg.value + 50.0).abs() < 1e-9); + assert!((op_neg.proportion + 1.0).abs() < 1e-9); // -50/50 + } + + #[test] + fn test_proportions_sum_to_100() { + let mut city_stats = BTreeMap::new(); + city_stats.insert( + "AMS".to_string(), + CityStat { + validator_count: 3, + total_stake_proxy: 333, + subscriber_count: 0, + city_price: 0, + }, + ); + city_stats.insert( + "BRU".to_string(), + CityStat { + validator_count: 3, + total_stake_proxy: 333, + subscriber_count: 0, + city_price: 0, + }, + ); + city_stats.insert( + "LUX".to_string(), + CityStat { + validator_count: 3, + total_stake_proxy: 334, + subscriber_count: 0, + city_price: 0, + }, + ); + + let mut per_city_outputs = BTreeMap::new(); + per_city_outputs.insert( + "AMS".to_string(), + vec![ + ("Op1".to_string(), 30.0), + ("Op2".to_string(), 20.0), + ("Op3".to_string(), 10.0), + ], + ); + per_city_outputs.insert( + "BRU".to_string(), + vec![ + ("Op1".to_string(), 25.0), + ("Op2".to_string(), 25.0), + ("Op3".to_string(), 15.0), + ], + ); + per_city_outputs.insert( + "LUX".to_string(), + vec![ + ("Op1".to_string(), 20.0), + ("Op2".to_string(), 30.0), + ("Op3".to_string(), 20.0), + ], + ); + + let city_weights = calculate_city_weights(&city_stats); + let result = aggregate_shapley_outputs(&per_city_outputs, &city_weights).unwrap(); + + // Sum of proportions should be ~1.0 (with tolerance for rounding) + let total_proportion: f64 = result.values().map(|v| v.proportion).sum(); + assert!((total_proportion - 1.0).abs() < 0.01); + } +} diff --git a/offchain/crates/contributor-rewards/src/calculator/shapley/evaluator.rs b/offchain/crates/contributor-rewards/src/calculator/shapley/evaluator.rs new file mode 100644 index 0000000000..f3bed2c486 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/shapley/evaluator.rs @@ -0,0 +1,281 @@ +//! Shared Shapley value computation logic. +//! +//! This module provides the core Shapley computation function used by both +//! `calculate-rewards` and `export shapley` commands. + +use std::collections::{BTreeMap, HashMap}; + +use anyhow::{Context, Result}; +use network_shapley::shapley::{ShapleyInput, ShapleyOutput}; +use rayon::prelude::*; +use tabled::{builder::Builder as TableBuilder, settings::Style}; +use tracing::{info, warn}; + +use crate::{ + calculator::{ + input::ShapleyInputs, shapley::aggregator::aggregate_shapley_outputs, util::print_demands, + }, + settings::ShapleySettings, +}; + +/// Result of Shapley value computation. +#[derive(Debug, Clone)] +pub struct ShapleyComputeResult { + /// Per-city Shapley outputs: city -> [(operator, value)] + pub per_city_outputs: BTreeMap>, + /// Aggregated output with proportions + pub aggregated_output: ShapleyOutput, +} + +/// Compute Shapley values for all cities in parallel. +/// +/// Groups demands by source city, computes per-city Shapley values, +/// and aggregates results using city weights. +/// +/// # Arguments +/// * `shapley_inputs` - Network topology, demands, and city weights +/// * `shapley_settings` - Computation parameters (uptime, bonus, multiplier) +/// +/// # Returns +/// `ShapleyComputeResult` containing per-city and aggregated outputs +pub fn compute_shapley_values( + shapley_inputs: &ShapleyInputs, + shapley_settings: &ShapleySettings, + contributor_labels: &HashMap, +) -> Result { + // Group demands by start city + let mut demands_by_city: BTreeMap> = + BTreeMap::new(); + for demand in shapley_inputs.demands.clone() { + demands_by_city + .entry(demand.start.clone()) + .or_default() + .push(demand); + } + let demand_groups: Vec<(String, Vec)> = + demands_by_city.into_iter().collect(); + + // Collect per-city Shapley outputs in parallel + let per_city_shapley_outputs: BTreeMap> = demand_groups + .par_iter() + .map(|(city, demands)| { + let city_name = city.clone(); + info!( + "City: {city_name}, Demand: \n{}", + print_demands(demands, 1_000_000) + ); + + // Build shapley inputs for this city + let input = ShapleyInput { + private_links: shapley_inputs.private_links.clone(), + devices: shapley_inputs.devices.clone(), + demands: demands.clone(), + public_links: shapley_inputs.public_links.clone(), + operator_uptime: shapley_settings.operator_uptime, + contiguity_bonus: shapley_settings.contiguity_bonus, + demand_multiplier: shapley_settings.demand_multiplier, + }; + + // Compute Shapley values + let output = input + .compute() + .map_err(|err| { + metrics::counter!( + "doublezero_contributor_rewards_shapley_computations_failed", + "city" => city_name.clone() + ) + .increment(1); + warn!(error = ?err, city = %city_name, "Failed to compute Shapley values"); + err + }) + .with_context(|| format!("failed to compute Shapley values for {city_name}"))?; + + // Track successful computation + metrics::counter!( + "doublezero_contributor_rewards_shapley_computations", + "city" => city_name.clone() + ) + .increment(1); + + // Print per-city table + let table = TableBuilder::from(output.clone()) + .build() + .with(Style::psql().remove_horizontals()) + .to_string(); + info!("Shapley Output for {city_name}:\n{}", table); + + // Store raw values for aggregation + let city_values: Vec<(String, f64)> = output + .into_iter() + .map(|(operator, shapley_value)| (operator, shapley_value.value)) + .collect(); + + Ok((city_name, city_values)) + }) + .collect::>>()? + .into_iter() + .collect(); + + let processed_cities = per_city_shapley_outputs.len(); + info!( + "Shapley computation completed for {} cities", + processed_cities + ); + metrics::gauge!("doublezero_contributor_rewards_shapley_cities_processed") + .set(processed_cities as f64); + + // Aggregate consolidated Shapley output + let aggregated_output = + aggregate_shapley_outputs(&per_city_shapley_outputs, &shapley_inputs.city_weights)?; + + // Print aggregated table + let mut table_builder = TableBuilder::default(); + table_builder.push_record(["Operator", "Pubkey", "Value", "Proportion (%)"]); + + for (operator, val) in aggregated_output.iter() { + let label = contributor_labels + .get(operator) + .map(String::as_str) + .unwrap_or(operator); + table_builder.push_record([ + label, + operator, + &val.value.to_string(), + &format!("{:.2}", val.proportion * 100.0), + ]); + } + + let table = table_builder + .build() + .with(Style::psql().remove_horizontals()) + .to_string(); + info!("Shapley Output:\n{}", table); + + let total_value: f64 = aggregated_output.values().map(|val| val.value).sum(); + metrics::gauge!("doublezero_contributor_rewards_shapley_total_value").set(total_value); + metrics::gauge!("doublezero_contributor_rewards_shapley_operator_count") + .set(aggregated_output.len() as f64); + + Ok(ShapleyComputeResult { + per_city_outputs: per_city_shapley_outputs, + aggregated_output, + }) +} + +#[cfg(test)] +mod tests { + use network_shapley::types::{Demand, Device, PrivateLink, PublicLink}; + + use super::*; + use crate::{calculator::util::calculate_city_weights, ingestor::demand::CityStat}; + + fn create_minimal_inputs() -> (ShapleyInputs, ShapleySettings) { + // Create minimal test data with two operators in two cities + let devices = vec![ + Device { + device: "FRA01".to_string(), + edge: 100, + operator: "OperatorA".to_string(), + }, + Device { + device: "NYC01".to_string(), + edge: 100, + operator: "OperatorB".to_string(), + }, + ]; + + let private_links = vec![PrivateLink { + device1: "FRA01".to_string(), + device2: "NYC01".to_string(), + latency: 80.0, + bandwidth: 10.0, + uptime: 1.0, + shared: None, + }]; + + let public_links = vec![PublicLink { + city1: "FRA".to_string(), + city2: "NYC".to_string(), + latency: 100.0, + }]; + + let demands = vec![ + Demand::new("FRA".to_string(), "NYC".to_string(), 1, 1.0, 1.0, 1, false), + Demand::new("NYC".to_string(), "FRA".to_string(), 1, 1.0, 1.0, 1, false), + ]; + + let mut city_stats = BTreeMap::new(); + city_stats.insert( + "FRA".to_string(), + CityStat { + validator_count: 1, + total_stake_proxy: 500, + subscriber_count: 0, + city_price: 0, + }, + ); + city_stats.insert( + "NYC".to_string(), + CityStat { + validator_count: 1, + total_stake_proxy: 500, + subscriber_count: 0, + city_price: 0, + }, + ); + + let city_weights = calculate_city_weights(&city_stats); + + let inputs = ShapleyInputs { + devices, + private_links, + public_links, + demands, + city_stats, + city_weights, + }; + + let settings = ShapleySettings { + operator_uptime: 0.98, + contiguity_bonus: 5.0, + demand_multiplier: 1.2, + }; + + (inputs, settings) + } + + #[test] + fn test_compute_shapley_values_returns_result() { + let (inputs, settings) = create_minimal_inputs(); + let result = compute_shapley_values(&inputs, &settings, &HashMap::new()); + + assert!(result.is_ok(), "Shapley computation should succeed"); + let result = result.unwrap(); + + // Should have per-city outputs for both FRA and NYC + assert_eq!(result.per_city_outputs.len(), 2); + assert!(result.per_city_outputs.contains_key("FRA")); + assert!(result.per_city_outputs.contains_key("NYC")); + + // Should have aggregated output + assert!(!result.aggregated_output.is_empty()); + } + + #[test] + fn test_aggregated_proportions_sum_to_one() { + let (inputs, settings) = create_minimal_inputs(); + let result = compute_shapley_values(&inputs, &settings, &HashMap::new()).unwrap(); + + let total_proportion: f64 = result + .aggregated_output + .values() + .map(|v| v.proportion) + .sum(); + + assert!( + (total_proportion - 1.0).abs() < 1e-9, + "Proportions should sum to ~1.0, got {}", + total_proportion + ); + } +} diff --git a/offchain/crates/contributor-rewards/src/calculator/shapley/handler.rs b/offchain/crates/contributor-rewards/src/calculator/shapley/handler.rs new file mode 100644 index 0000000000..fb51b4171a --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/shapley/handler.rs @@ -0,0 +1,649 @@ +use std::collections::BTreeMap; + +use anyhow::Result; +use doublezero_serviceability::state::{ + device::DeviceStatus as DZDeviceStatus, link::LinkStatus as DZLinkStatus, +}; +use network_shapley::types::{ + Demands, Device, Devices, PrivateLink, PrivateLinks, PublicLink, PublicLinks, +}; +use solana_sdk::pubkey::Pubkey; +use tabled::{Table, Tabled, settings::Style}; +use tracing::{debug, info}; + +use crate::{ + calculator::constants::{BPS_TO_MBPS, FALLBACK_EDGE_BANDWIDTH_MBPS, SEC_TO_MS}, + ingestor::{demand, fetcher::Fetcher, types::FetchData}, + processor::{ + internet::InternetTelemetryStatMap, telemetry::DZDTelemetryStatMap, util::quantile_r_type7, + }, + settings::{Settings, network::Network}, +}; + +// (city1_code, city2_code) +type CityPair = (String, String); +// key: city_pair, val: vec of latencies +type CityPairLatencies = BTreeMap>; +// key: device pubkey, value: shapley-friendly device id +pub type DeviceIdMap = BTreeMap; + +/// Penalty information for a private link with reduced uptime +#[derive(Debug, Clone, Tabled)] +struct LinkPenalty { + #[tabled(rename = "Link")] + link: String, + #[tabled(rename = "Valid Samples %")] + valid_samples_pct: f64, + #[tabled(rename = "True Uptime")] + true_uptime: f64, + #[tabled(rename = "Penalized Uptime")] + penalized_uptime: f64, + #[tabled(rename = "Bandwidth Reduction %")] + bandwidth_reduction_pct: f64, +} + +/// Cache for previous epoch telemetry stats +#[derive(Default)] +pub struct PreviousEpochCache { + pub internet_stats: Option, + pub device_stats: Option, +} + +impl PreviousEpochCache { + pub fn new() -> Self { + Self::default() + } + + /// Fetch and cache previous epoch stats if not already cached + pub async fn fetch_if_needed(&mut self, fetcher: &Fetcher, current_epoch: u64) -> Result<()> { + if self.internet_stats.is_none() || self.device_stats.is_none() { + let previous_epoch = current_epoch.saturating_sub(1); + if previous_epoch == 0 { + info!("No previous epoch available (current epoch is 1)"); + return Ok(()); + } + + info!( + "Fetching previous epoch {} telemetry for default handling", + previous_epoch + ); + + // Fetch previous epoch data + let (_epoch, prev_data) = fetcher.fetch(Some(previous_epoch)).await?; + + // Process the telemetry data + use crate::processor::{ + internet::InternetTelemetryProcessor, telemetry::DZDTelemetryProcessor, + }; + + self.device_stats = Some(DZDTelemetryProcessor::process(&prev_data)?); + self.internet_stats = Some(InternetTelemetryProcessor::process(&prev_data)?); + + info!("Cached previous epoch telemetry stats"); + } + Ok(()) + } + + /// Get previous epoch average for a specific internet circuit + pub fn get_internet_circuit_average(&self, circuit_key: &str) -> Option { + self.internet_stats + .as_ref()? + .get(circuit_key) + .map(|stats| stats.rtt_mean_us) + } + + /// Get previous epoch P95 for a specific device circuit + pub fn get_device_circuit_average(&self, circuit_key: &str) -> Option { + self.device_stats + .as_ref()? + .get(circuit_key) + .map(|stats| stats.rtt_p95_us) + } +} + +pub fn build_devices(fetch_data: &FetchData, network: &Network) -> Result<(Devices, DeviceIdMap)> { + // First, collect all device metadata + // R implementation merges devices with contributors + // which reorders devices by contributor_pk before assigning city-based sequential IDs + + // (device_pk, contributor_pk, city_code, owner, max_mcast_subs, actual_mcast_subs, interface_bandwidth_bps) + let mut device_data: Vec<(Pubkey, Pubkey, String, String, u16, u16, u64)> = Vec::new(); + + for (device_pk, device) in fetch_data.dz_serviceability.devices.iter() { + let Some(contributor) = fetch_data + .dz_serviceability + .contributors + .get(&device.contributor_pk) + else { + continue; + }; + + // Determine the city code for this device using the associated exchange/location + let Some(exchange) = fetch_data + .dz_serviceability + .exchanges + .get(&device.exchange_pk) + else { + continue; + }; + + let city_code = match network { + Network::Testnet | Network::Devnet => exchange + .code + .strip_prefix('x') + .unwrap_or(&exchange.code) + .to_string(), + Network::MainnetBeta | Network::Mainnet => exchange.code.clone(), + }; + + // Sum bandwidth from physical interfaces + let interface_bandwidth_bps: u64 = device + .interfaces + .iter() + .filter(|iface| { + iface.interface_type + == doublezero_serviceability::state::interface::InterfaceType::Physical + }) + .map(|iface| iface.bandwidth) + .sum(); + + device_data.push(( + *device_pk, + device.contributor_pk, + city_code, + contributor.owner.to_string(), + device.max_multicast_subscribers, + device.multicast_subscribers_count, + interface_bandwidth_bps, + )); + } + + // Sort by contributor_pk only (matches R's merge operation) + // R's merge preserves insertion order within each contributor group + device_data.sort_by_key(|item| item.1); + + let mut devices = Vec::new(); + let mut device_ids: DeviceIdMap = DeviceIdMap::new(); + let mut city_counts: BTreeMap = BTreeMap::new(); + + for ( + device_pk, + _contributor_pk, + city_code, + owner, + _max_mcast_subs, + _actual_mcast_subs, + interface_bw_bps, + ) in device_data + { + let city_upper = city_code.to_uppercase(); + let counter = city_counts.entry(city_upper.clone()).or_insert(0); + *counter += 1; + + // Use 2-digit zero-padded numbering to match R implementation + let shapley_id = format!("{}{:02}", city_upper, counter); + + device_ids.insert(device_pk, shapley_id.clone()); + + // Compute edge capacity in Mbps: min(actual_bandwidth, permitted_capacity) + let actual_bandwidth_mbps = if interface_bw_bps == 0 { + FALLBACK_EDGE_BANDWIDTH_MBPS + } else { + interface_bw_bps as f64 / BPS_TO_MBPS as f64 + }; + + // TODO: Revisit this when we have some fidelity on subscriber count number universally + + // Use max(actual_subscribers, max_subscribers) as the subscriber count for + // edge capacity. Many devices on-chain have max_multicast_subscribers = 0 + // but are actively serving subscribers (multicast_subscribers_count > 0). + // This fallback ensures those devices get appropriate edge capacity + // until the on-chain max values are corrected. + // let effective_subs = max_mcast_subs.max(actual_mcast_subs); + // let permitted_capacity_mbps = effective_subs as f64 * BANDWIDTH_PER_SUBSCRIBER_SEAT_MBPS; + // let edge_mbps = actual_bandwidth_mbps.min(permitted_capacity_mbps); + + devices.push(Device { + device: shapley_id, + edge: actual_bandwidth_mbps as u32, + operator: owner, + }); + } + + Ok((devices, device_ids)) +} + +pub async fn build_demands( + fetcher: &Fetcher, + fetch_data: &FetchData, +) -> Result<(Demands, demand::CityStats)> { + let result = demand::build(fetcher, fetch_data).await?; + Ok((result.demands, result.city_stats)) +} + +pub fn build_public_links( + settings: &Settings, + internet_stats: &InternetTelemetryStatMap, + fetch_data: &FetchData, + previous_epoch_cache: &PreviousEpochCache, +) -> Result { + let mut exchange_to_location: BTreeMap = BTreeMap::new(); + + // Build exchange to location mapping from ALL exchanges (not just those with devices) + // This matches R implementation which uses all exchanges + for (exchange_pk, exchange) in fetch_data.dz_serviceability.exchanges.iter() { + let city_code = match settings.network { + Network::MainnetBeta | Network::Mainnet => exchange.code.clone(), + Network::Testnet | Network::Devnet => exchange + .code + .strip_prefix('x') + .unwrap_or(&exchange.code) + .to_string(), + }; + + exchange_to_location.insert(*exchange_pk, city_code.to_uppercase()); + } + + // Group latencies by normalized city pairs + let mut city_pair_latencies = CityPairLatencies::new(); + + for (circuit_key, stats) in internet_stats.iter() { + // Map exchange codes to location codes + // Since we're now only processing valid exchange codes in the processor, + // we should always have a mapping. If not, skip this entry. + // Skipping is safer than defaults. + let origin_location = match exchange_to_location.get(&stats.origin_exchange_pk) { + Some(loc) => loc.clone(), + None => { + debug!( + "No location mapping for exchange: {} (missing device mapping)", + stats.origin_exchange_code + ); + continue; + } + }; + + let target_location = match exchange_to_location.get(&stats.target_exchange_pk) { + Some(loc) => loc.clone(), + None => { + debug!( + "No location mapping for exchange: {} (missing device mapping)", + stats.target_exchange_code + ); + continue; + } + }; + + // Normalize city pair (alphabetical order) + let (city1, city2) = if origin_location <= target_location { + (origin_location, target_location) + } else { + (target_location, origin_location) + }; + + // Check if this circuit has too much missing data + let latency_us = if stats.missing_data_ratio + > settings.telemetry_defaults.missing_data_threshold + { + // Try to get previous epoch average for this circuit + if settings.telemetry_defaults.enable_previous_epoch_lookup { + if let Some(prev_avg) = + previous_epoch_cache.get_internet_circuit_average(circuit_key) + { + info!( + "Circuit {} has {:.1}% missing data, using previous epoch average: {:.2}ms", + stats.circuit, + stats.missing_data_ratio * 100.0, + prev_avg / SEC_TO_MS + ); + prev_avg + } else { + info!( + "Circuit {} has {:.1}% missing data, no previous epoch data available, using current p95: {:.2}ms", + stats.circuit, + stats.missing_data_ratio * 100.0, + stats.rtt_p95_us / SEC_TO_MS + ); + stats.rtt_p95_us + } + } else { + stats.rtt_p95_us + } + } else { + stats.rtt_p95_us + }; + + // Convert from microseconds to milliseconds + let latency_ms = latency_us / SEC_TO_MS; + + city_pair_latencies + .entry((city1, city2)) + .or_default() + .push(latency_ms); + } + + // Calculate mean latency for each city pair + let mut public_links = Vec::new(); + for ((city1, city2), latencies) in city_pair_latencies { + if !latencies.is_empty() { + let mean_latency = latencies.iter().sum::() / latencies.len() as f64; + public_links.push(PublicLink { + city1, + city2, + latency: mean_latency, + }); + } + } + + // Sort by city pairs for consistent output + public_links.sort_by(|a, b| (&a.city1, &a.city2).cmp(&(&b.city1, &b.city2))); + + let public_latency_multiplier = settings.input.public_latency_multiplier; + if (public_latency_multiplier - 1.0).abs() > f64::EPSILON { + info!( + "Applying public latency multiplier: {}", + public_latency_multiplier + ); + for link in &mut public_links { + link.latency *= public_latency_multiplier; + } + } + + Ok(public_links) +} + +pub fn build_private_links(fetch_data: &FetchData, device_ids: &DeviceIdMap) -> PrivateLinks { + let mut private_links = Vec::new(); + let mut penalties = Vec::new(); + + for (link_pk, link) in fetch_data.dz_serviceability.links.iter() { + if link.status != DZLinkStatus::Activated { + continue; + } + + let (from_device, to_device) = match fetch_data.get_link_devices(link) { + (Some(f), Some(t)) + if f.status == DZDeviceStatus::Activated + && t.status == DZDeviceStatus::Activated => + { + (f, t) + } + _ => continue, + }; + + let Some(from_id) = device_ids.get(&link.side_a_pk) else { + continue; + }; + let Some(to_id) = device_ids.get(&link.side_z_pk) else { + continue; + }; + + // Convert bandwidth from bits/sec to Mbps (consistent with edge units) + let bandwidth_mbps = (link.bandwidth / BPS_TO_MBPS) as f64; + + // R implementation combines ALL samples for a link_pk, + // regardless of direction, then computes P95 from the combined samples. + // This matches: samples = unlist(sapply(which(schema == temp$pubkey), function(i) unlist(...))) + let mut combined_samples: Vec = Vec::new(); + let mut total_samples: usize = 0; + + for sample in &fetch_data.dz_telemetry.device_latency_samples { + if sample.link_pk == *link_pk { + // Collect all valid samples, filtering out zeros and near-zero noise + // Matches R implementation: samples[which(samples > 1e-10)] + // Also track total sample count for uptime calculation + for &raw_sample in &sample.samples { + total_samples += 1; + if raw_sample as f64 > 1e-10 { + combined_samples.push(raw_sample as f64); + } + } + } + } + + // R implementation only includes links with >20 valid samples + // Otherwise the link gets NA latency and is dropped + if combined_samples.len() <= 20 { + info!( + "Private circuit {} → {} has only {} valid samples (need >20), skipping link (matches R line 40)", + from_device.code, + to_device.code, + combined_samples.len() + ); + continue; + } + + // Compute P95 from combined samples using R type 7 quantile (linear interpolation) + // Matches R line 40: quantile(samples, 0.95) which defaults to type=7 + combined_samples.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); + // Enforce delay_override_ns as a P95 latency floor: convert the configured + // nanosecond RTT override to microseconds and apply 95% of it when it exceeds + // the telemetry-derived P95. + let mut latency_us = quantile_r_type7(&combined_samples, 0.95); + let override_us = 0.95 * (link.delay_override_ns as f64) / 1000.0; + if override_us > latency_us { + latency_us = override_us; + } + + // Convert latency from microseconds to milliseconds (R divides by 1e3 on line 40) + let latency_ms = latency_us / 1000.0; + + // Calculate true_uptime: percentage of valid samples present (R line 49) + // true_uptime = sum(samples >= 1e-10) / length(samples) + let true_uptime = if total_samples > 0 { + combined_samples.len() as f64 / total_samples as f64 + } else { + 0.0 + }; + + // Collect penalty information for links with reduced uptime. + // The quadratic penalty is applied inside network-shapley-rs (consolidation.rs), + // so we pass raw true_uptime here. Compute penalized value just for logging. + let penalized = penalized_uptime(true_uptime); + if penalized < 1.0 { + penalties.push(LinkPenalty { + link: format!("{} → {}", from_device.code, to_device.code), + valid_samples_pct: true_uptime * 100.0, + true_uptime, + penalized_uptime: penalized, + bandwidth_reduction_pct: (1.0 - penalized) * 100.0, + }); + } + + // Pass raw uptime to network-shapley-rs — it applies the quadratic + // penalty curve internally (matching the Python reference implementation). + private_links.push(PrivateLink::new( + from_id.clone(), + to_id.clone(), + latency_ms, + bandwidth_mbps, + true_uptime, + None, + )); + } + + // Print penalty table if any links were penalized + if !penalties.is_empty() { + info!( + "Private Link Uptime Penalties:\n{}", + Table::new(&penalties) + .with(Style::psql().remove_horizontals()) + .to_string() + ); + } + + private_links +} + +fn penalized_uptime(true_uptime: f64) -> f64 { + // Apply quadratic penalty formula for links with missing data (R line 92) + // uptime = pmin(pmax(-1578.9474 * true_uptime^2 + 3176.3158 * true_uptime - 1596.3684, 0), 1) + // This heavily penalizes links below 98% uptime: + // - 100% uptime -> 1.0 (no penalty) + // - 99% uptime -> 0.658 (~34% bandwidth reduction) + // - 98% uptime -> ~0 (threshold - effectively dropped) + // - <98% uptime -> 0 (link dropped from calculations) + const COEFF_A: f64 = -1578.9474; + const COEFF_B: f64 = 3176.3158; + const CONST_C: f64 = -1596.3684; + let uptime_raw = COEFF_A * true_uptime.powi(2) + COEFF_B * true_uptime + CONST_C; + uptime_raw.clamp(0.0, 1.0) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_penalized_uptime_perfect() { + // 100% uptime should result in no penalty + let result = penalized_uptime(1.0); + assert!( + (result - 1.0).abs() < 0.0001, + "100% uptime should be 1.0, got {}", + result + ); + } + + #[test] + fn test_penalized_uptime_99_percent() { + // 99% uptime should result in penalty (uptime ~0.658) + let result = penalized_uptime(0.99); + assert!( + result > 0.65 && result < 0.67, + "99% uptime should be ~0.658, got {}", + result + ); + + // More precisely, check against expected value + let expected = 0.6579; // Actual value from formula + assert!( + (result - expected).abs() < 0.001, + "99% uptime: expected ~{}, got {}", + expected, + result + ); + } + + #[test] + fn test_penalized_uptime_98_percent() { + // 98% uptime is right at the threshold - essentially drops to 0 + let result = penalized_uptime(0.98); + assert!( + result < 0.001, + "98% uptime should be near 0 (threshold), got {}", + result + ); + } + + #[test] + fn test_penalized_uptime_97_percent() { + // 97% uptime should be effectively dropped (uptime ~0) + let result = penalized_uptime(0.97); + assert!(result < 0.05, "97% uptime should be near 0, got {}", result); + } + + #[test] + fn test_penalized_uptime_below_98_percent() { + // Test various values below 98% - all should be near 0 + for uptime_pct in [0.97, 0.96, 0.95, 0.90, 0.85, 0.80] { + let result = penalized_uptime(uptime_pct); + assert!( + result < 0.1, + "{}% uptime should be heavily penalized (near 0), got {}", + uptime_pct * 100.0, + result + ); + } + } + + #[test] + fn test_penalized_uptime_zero() { + // 0% uptime should be 0 + let result = penalized_uptime(0.0); + assert_eq!(result, 0.0, "0% uptime should be 0.0, got {}", result); + } + + #[test] + fn test_penalized_uptime_clamping_upper() { + // Values that would produce >1.0 should be clamped to 1.0 + // The formula shouldn't produce >1.0 for valid inputs, but test anyway + let result = penalized_uptime(1.0); + assert!( + result <= 1.0, + "Result should never exceed 1.0, got {}", + result + ); + } + + #[test] + fn test_penalized_uptime_clamping_lower() { + // Negative results should be clamped to 0.0 + let result = penalized_uptime(0.5); + assert!( + result >= 0.0, + "Result should never be negative, got {}", + result + ); + } + + #[test] + fn test_penalized_uptime_boundary_98_99() { + // Test the steep gradient between 98% and 99% + let uptime_98 = penalized_uptime(0.98); + let uptime_985 = penalized_uptime(0.985); + let uptime_99 = penalized_uptime(0.99); + + // Should see significant increase from 98% to 99% + assert!( + uptime_99 > uptime_985 && uptime_985 > uptime_98, + "Should see steep gradient: 98%={}, 98.5%={}, 99%={}", + uptime_98, + uptime_985, + uptime_99 + ); + + // The jump should be significant + let jump_98_to_99 = uptime_99 - uptime_98; + assert!( + jump_98_to_99 > 0.3, + "Penalty gradient should be steep (jump > 0.3), got {}", + jump_98_to_99 + ); + } + + #[test] + fn test_penalized_uptime_real_world_example() { + // Test scenario: if a link had only 92.65% valid samples (below 98% threshold) + // Input: true_uptime = 0.9265 (92.65% of samples are valid) + // Expected output: ~0 (link should be effectively dropped) + let true_uptime = 0.9265342099820373; + let result = penalized_uptime(true_uptime); + + // Should be heavily penalized (effectively 0) since below 98% threshold + assert!( + result < 0.001, + "Link with only {:.2}% valid samples should be effectively dropped, got uptime={}", + true_uptime * 100.0, + result + ); + } + + #[test] + fn test_penalized_uptime_monotonic_increasing() { + // Verify the function is monotonic increasing in the range [0.98, 1.0] + let mut prev_result = penalized_uptime(0.98); + for i in 981..=1000 { + let uptime = i as f64 / 1000.0; + let result = penalized_uptime(uptime); + assert!( + result >= prev_result, + "Function should be monotonic increasing from 98% to 100%: at {}%, got {} (prev {})", + uptime * 100.0, + result, + prev_result + ); + prev_result = result; + } + } +} diff --git a/offchain/crates/contributor-rewards/src/calculator/shapley/mod.rs b/offchain/crates/contributor-rewards/src/calculator/shapley/mod.rs new file mode 100644 index 0000000000..3ae95a3fa8 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/shapley/mod.rs @@ -0,0 +1,3 @@ +pub mod aggregator; +pub mod evaluator; +pub mod handler; diff --git a/offchain/crates/contributor-rewards/src/calculator/util.rs b/offchain/crates/contributor-rewards/src/calculator/util.rs new file mode 100644 index 0000000000..314ca736e8 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/util.rs @@ -0,0 +1,138 @@ +use std::collections::BTreeMap; + +use network_shapley::types::{Demand, Device, PrivateLink, PublicLink}; +use tabled::{builder::Builder as TableBuilder, settings::Style}; + +use crate::ingestor::demand::CityStats; + +/// Calculate normalized weights for each city based on leader schedule share +/// +/// Weights by total_stake_proxy (sum of leader schedule lengths) so each source +/// city's Shapley result is scaled by how often it leads. The economic signal +/// (metro price) is already carried in the demand priority field. +/// +/// # Arguments +/// * `city_stats` - Map of city to CityStat containing stake proxy information +/// +/// # Returns +/// BTreeMap mapping city names to their normalized weights (0.0 to 1.0, sum = 1.0) +pub fn calculate_city_weights(city_stats: &CityStats) -> BTreeMap { + let total_stake: f64 = city_stats + .values() + .map(|stat| stat.total_stake_proxy as f64) + .sum(); + + city_stats + .iter() + .map(|(city, stat)| { + let weight = if total_stake > 0.0 { + stat.total_stake_proxy as f64 / total_stake + } else { + 1.0 / city_stats.len() as f64 + }; + (city.clone(), weight) + }) + .collect() +} + +pub fn print_devices(devices: &[Device]) -> String { + let mut printable = vec![vec![ + "device".to_string(), + "bandwidth(Gbps)".to_string(), + "operator".to_string(), + ]]; + + for dev in devices { + let row = vec![ + dev.device.to_string(), + format!("{:.3}", dev.edge as f64 / 1000.0), + dev.operator.to_string(), + ]; + printable.push(row); + } + + TableBuilder::from(printable) + .build() + .with(Style::psql().remove_horizontals()) + .to_string() +} + +pub fn print_public_links(public_links: &[PublicLink]) -> String { + let mut printable = vec![vec![ + "city1".to_string(), + "city2".to_string(), + "latency(ms)".to_string(), + ]]; + + for link in public_links { + let row = vec![ + link.city1.to_string(), + link.city2.to_string(), + link.latency.to_string(), + ]; + printable.push(row); + } + + TableBuilder::from(printable) + .build() + .with(Style::psql().remove_horizontals()) + .to_string() +} + +pub fn print_private_links(private_links: &[PrivateLink]) -> String { + let mut printable = vec![vec![ + "device1".to_string(), + "device2".to_string(), + "latency(ms)".to_string(), + "bandwidth(Gbps)".to_string(), + "uptime".to_string(), + "shared".to_string(), + ]]; + + for pl in private_links { + let row = vec![ + pl.device1.to_string(), + pl.device2.to_string(), + pl.latency.to_string(), + format!("{:.3}", pl.bandwidth / 1000.0), + pl.uptime.to_string(), + format!("{:?}", pl.shared), + ]; + printable.push(row); + } + + TableBuilder::from(printable) + .build() + .with(Style::psql().remove_horizontals()) + .to_string() +} + +pub fn print_demands(demands: &[Demand], k: usize) -> String { + let mut printable = vec![vec![ + "start".to_string(), + "end".to_string(), + "receivers".to_string(), + "traffic".to_string(), + "priority".to_string(), + "type".to_string(), + "multicast".to_string(), + ]]; + + for demand in demands.iter().take(k) { + let row = vec![ + demand.start.to_string(), + demand.end.to_string(), + demand.receivers.to_string(), + demand.traffic.to_string(), + demand.priority.to_string(), + demand.kind.to_string(), + demand.multicast.to_string(), + ]; + printable.push(row); + } + + TableBuilder::from(printable) + .build() + .with(Style::psql().remove_horizontals()) + .to_string() +} diff --git a/offchain/crates/contributor-rewards/src/calculator/write_config.rs b/offchain/crates/contributor-rewards/src/calculator/write_config.rs new file mode 100644 index 0000000000..8b6df0c484 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/calculator/write_config.rs @@ -0,0 +1,250 @@ +//! Configuration for controlling which write operations are performed during reward calculation. + +/// Configuration for controlling which write operations to skip during reward calculation. +/// +/// This struct allows fine-grained control over the 5 write operations that occur when +/// calculating rewards: +/// 1. Device telemetry aggregates -> DZ Ledger +/// 2. Internet telemetry aggregates -> DZ Ledger +/// 3. Reward calculation input -> DZ Ledger +/// 4. Shapley output storage -> DZ Ledger +/// 5. Merkle root posting -> Solana +/// +/// # Examples +/// +/// ``` +/// use doublezero_contributor_rewards::calculator::WriteConfig; +/// +/// // Default: all writes enabled +/// let config = WriteConfig::default(); +/// assert!(!config.all_writes_skipped()); +/// +/// // Skip only device telemetry +/// let config = WriteConfig { +/// skip_device_telemetry: true, +/// ..Default::default() +/// }; +/// assert!(config.should_skip_device_telemetry()); +/// assert!(!config.should_skip_internet_telemetry()); +/// +/// // Skip all writes +/// let config = WriteConfig::skip_all(); +/// assert!(config.all_writes_skipped()); +/// ``` +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] +pub struct WriteConfig { + /// Skip writing device telemetry aggregates to DZ Ledger + pub skip_device_telemetry: bool, + /// Skip writing internet telemetry aggregates to DZ Ledger + pub skip_internet_telemetry: bool, + /// Skip writing reward calculation input to DZ Ledger + pub skip_reward_input: bool, + /// Skip writing shapley output storage to DZ Ledger + pub skip_shapley_output: bool, + /// Skip posting merkle root to Solana + pub skip_merkle_root: bool, +} + +impl WriteConfig { + /// Create a new WriteConfig with all writes enabled. + pub fn new() -> Self { + Self::default() + } + + /// Create a WriteConfig that skips all write operations. + pub fn skip_all() -> Self { + Self { + skip_device_telemetry: true, + skip_internet_telemetry: true, + skip_reward_input: true, + skip_shapley_output: true, + skip_merkle_root: true, + } + } + + /// Create a WriteConfig from CLI arguments. + pub fn from_flags( + skip_device_telemetry: bool, + skip_internet_telemetry: bool, + skip_reward_input: bool, + skip_shapley_output: bool, + skip_merkle_root: bool, + ) -> Self { + Self { + skip_device_telemetry, + skip_internet_telemetry, + skip_reward_input, + skip_shapley_output, + skip_merkle_root, + } + } + + /// Returns true if device telemetry write should be skipped. + pub fn should_skip_device_telemetry(&self) -> bool { + self.skip_device_telemetry + } + + /// Returns true if internet telemetry write should be skipped. + pub fn should_skip_internet_telemetry(&self) -> bool { + self.skip_internet_telemetry + } + + /// Returns true if reward input write should be skipped. + pub fn should_skip_reward_input(&self) -> bool { + self.skip_reward_input + } + + /// Returns true if shapley output storage write should be skipped. + pub fn should_skip_shapley_output(&self) -> bool { + self.skip_shapley_output + } + + /// Returns true if merkle root posting should be skipped. + pub fn should_skip_merkle_root(&self) -> bool { + self.skip_merkle_root + } + + /// Returns true if all write operations are skipped. + pub fn all_writes_skipped(&self) -> bool { + self.skip_device_telemetry + && self.skip_internet_telemetry + && self.skip_reward_input + && self.skip_shapley_output + && self.skip_merkle_root + } + + /// Returns true if at least one write operation is enabled (not skipped). + pub fn any_writes_enabled(&self) -> bool { + !self.all_writes_skipped() + } + + /// Returns the count of write operations that are skipped. + pub fn skipped_count(&self) -> usize { + let mut count = 0; + if self.skip_device_telemetry { + count += 1; + } + if self.skip_internet_telemetry { + count += 1; + } + if self.skip_reward_input { + count += 1; + } + if self.skip_shapley_output { + count += 1; + } + if self.skip_merkle_root { + count += 1; + } + count + } + + /// Returns the count of write operations that are enabled (not skipped). + pub fn enabled_count(&self) -> usize { + 5 - self.skipped_count() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_default_config() { + let config = WriteConfig::default(); + assert!(!config.should_skip_device_telemetry()); + assert!(!config.should_skip_internet_telemetry()); + assert!(!config.should_skip_reward_input()); + assert!(!config.should_skip_shapley_output()); + assert!(!config.should_skip_merkle_root()); + assert!(!config.all_writes_skipped()); + assert!(config.any_writes_enabled()); + assert_eq!(config.skipped_count(), 0); + assert_eq!(config.enabled_count(), 5); + } + + #[test] + fn test_new_config() { + let config = WriteConfig::new(); + assert!(!config.all_writes_skipped()); + assert!(config.any_writes_enabled()); + } + + #[test] + fn test_skip_all() { + let config = WriteConfig::skip_all(); + assert!(config.should_skip_device_telemetry()); + assert!(config.should_skip_internet_telemetry()); + assert!(config.should_skip_reward_input()); + assert!(config.should_skip_shapley_output()); + assert!(config.should_skip_merkle_root()); + assert!(config.all_writes_skipped()); + assert!(!config.any_writes_enabled()); + assert_eq!(config.skipped_count(), 5); + assert_eq!(config.enabled_count(), 0); + } + + #[test] + fn test_from_flags_single_skip() { + let config = WriteConfig::from_flags(true, false, false, false, false); + assert!(config.should_skip_device_telemetry()); + assert!(!config.should_skip_internet_telemetry()); + assert!(!config.all_writes_skipped()); + assert!(config.any_writes_enabled()); + assert_eq!(config.skipped_count(), 1); + assert_eq!(config.enabled_count(), 4); + } + + #[test] + fn test_from_flags_multiple_skips() { + let config = WriteConfig::from_flags(true, true, false, false, false); + assert!(config.should_skip_device_telemetry()); + assert!(config.should_skip_internet_telemetry()); + assert!(!config.should_skip_reward_input()); + assert!(!config.all_writes_skipped()); + assert!(config.any_writes_enabled()); + assert_eq!(config.skipped_count(), 2); + assert_eq!(config.enabled_count(), 3); + } + + #[test] + fn test_all_but_one_skipped() { + let config = WriteConfig::from_flags(true, true, true, true, false); + assert!(!config.should_skip_merkle_root()); + assert!(!config.all_writes_skipped()); + assert!(config.any_writes_enabled()); + assert_eq!(config.skipped_count(), 4); + assert_eq!(config.enabled_count(), 1); + } + + #[test] + fn test_skip_counts() { + // No skips + let config = WriteConfig::default(); + assert_eq!(config.skipped_count(), 0); + assert_eq!(config.enabled_count(), 5); + + // One skip + let config = WriteConfig::from_flags(true, false, false, false, false); + assert_eq!(config.skipped_count(), 1); + assert_eq!(config.enabled_count(), 4); + + // Three skips + let config = WriteConfig::from_flags(true, false, true, true, false); + assert_eq!(config.skipped_count(), 3); + assert_eq!(config.enabled_count(), 2); + + // All skips + let config = WriteConfig::skip_all(); + assert_eq!(config.skipped_count(), 5); + assert_eq!(config.enabled_count(), 0); + } + + #[test] + fn test_clone_and_copy() { + let config1 = WriteConfig::from_flags(true, false, true, false, true); + let config2 = config1; + assert_eq!(config1, config2); + assert_eq!(config1.skipped_count(), config2.skipped_count()); + } +} diff --git a/offchain/crates/contributor-rewards/src/cli/common.rs b/offchain/crates/contributor-rewards/src/cli/common.rs new file mode 100644 index 0000000000..f42ed9ded4 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/cli/common.rs @@ -0,0 +1,156 @@ +use std::{ + fmt, + fs::{File, create_dir_all}, + io::Write, + path::Path, +}; + +use anyhow::Result; +use clap::{Args, ValueEnum}; +use serde::{Deserialize, Serialize}; +use tracing::info; + +use crate::cli::traits::Exportable; + +/// Unified output format for all CLI commands +#[derive(Debug, Clone, Copy, ValueEnum, Serialize, Deserialize)] +pub enum OutputFormat { + #[value(name = "csv")] + Csv, + #[value(name = "json")] + Json, + #[value(name = "json-pretty")] + JsonPretty, +} + +impl fmt::Display for OutputFormat { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Csv => write!(f, "csv"), + Self::Json => write!(f, "json"), + Self::JsonPretty => write!(f, "json-pretty"), + } + } +} + +/// Common output options for CLI commands +#[derive(Args, Debug, Clone)] +pub struct OutputOptions { + /// Output format for exports + #[arg(short = 'f', long, default_value = "json-pretty")] + pub output_format: OutputFormat, + + /// Directory to export files + #[arg(short = 'o', long, value_name = "DIR")] + pub output_dir: Option, + + /// Specific output file path + #[arg(long, value_name = "FILE")] + pub output_file: Option, +} + +impl OutputOptions { + /// Write exportable data to file or stdout + pub fn write(&self, data: &T, default_filename: &str) -> Result<()> { + let content = data.export(self.output_format)?; + + if let Some(ref file_path) = self.output_file { + // Write to specific file + let path = Path::new(file_path); + if let Some(parent) = path.parent() { + create_dir_all(parent)?; + } + let mut file = File::create(path)?; + file.write_all(content.as_bytes())?; + info!("Exported to: {}", path.display()); + } else if let Some(ref dir) = self.output_dir { + // Write to directory with default filename + let dir_path = Path::new(dir); + create_dir_all(dir_path)?; + + let extension = match self.output_format { + OutputFormat::Csv => "csv", + OutputFormat::Json | OutputFormat::JsonPretty => "json", + }; + + let filename = format!("{default_filename}.{extension}"); + let file_path = dir_path.join(filename); + + let mut file = File::create(&file_path)?; + file.write_all(content.as_bytes())?; + info!("Exported to: {}", file_path.display()); + } else { + // Write to stdout + println!("{content}"); + } + + Ok(()) + } +} + +/// Common filter options for telemetry and other data +#[derive(Args, Debug, Clone)] +pub struct FilterOptions { + /// Filter by origin city/location + #[arg(long, value_name = "CITY")] + pub from_city: Option, + + /// Filter by destination city/location + #[arg(long, value_name = "CITY")] + pub to_city: Option, + + /// Filter by city (for single location filtering) + #[arg(long, value_name = "CITY")] + pub city: Option, + + /// Filter by device ID + #[arg(long, value_name = "ID")] + pub device: Option, + + /// Filter by operator/contributor + #[arg(long, value_name = "PUBKEY")] + pub operator: Option, + + /// Maximum number of results to return + #[arg(long, value_name = "NUM")] + pub limit: Option, +} + +/// Common threshold options for analysis +#[derive(Args, Debug, Clone)] +pub struct ThresholdOptions { + /// Latency threshold in milliseconds + #[arg(long, value_name = "MS")] + pub threshold_ms: Option, + + /// Minimum packet loss percentage (0.0-1.0) + #[arg(long, value_name = "PERCENT")] + pub min_packet_loss: Option, + + /// Minimum jitter in milliseconds + #[arg(long, value_name = "MS")] + pub min_jitter: Option, + + /// Minimum uptime percentage (0.0-1.0) + #[arg(long, value_name = "PERCENT")] + pub min_uptime: Option, +} + +/// Helper function to convert a collection to CSV format +pub fn collection_to_csv(records: &[T]) -> Result { + let mut wtr = csv::Writer::from_writer(vec![]); + for record in records { + wtr.serialize(record)?; + } + let data = wtr.into_inner()?; + Ok(String::from_utf8(data)?) +} + +/// Helper function to convert data to JSON format +pub fn to_json_string(data: &T, pretty: bool) -> Result { + if pretty { + Ok(serde_json::to_string_pretty(data)?) + } else { + Ok(serde_json::to_string(data)?) + } +} diff --git a/offchain/crates/contributor-rewards/src/cli/export.rs b/offchain/crates/contributor-rewards/src/cli/export.rs new file mode 100644 index 0000000000..101a7d25b6 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/cli/export.rs @@ -0,0 +1,499 @@ +//! Export commands for exporting Shapley calculation data. + +use std::{ + collections::BTreeMap, + fs::{File, create_dir_all}, + io::Write, + path::{Path, PathBuf}, +}; + +use anyhow::{Result, bail}; +use clap::Subcommand; +use network_shapley::types::{Demand, Demands, Devices, PrivateLinks, PublicLinks}; +use tracing::info; + +use crate::{ + calculator::{ + data_prep::PreparedData, orchestrator::Orchestrator, + shapley::evaluator::compute_shapley_values, + }, + cli::{ + common::{OutputFormat, OutputOptions, collection_to_csv, to_json_string}, + snapshot::CompleteSnapshot, + traits::Exportable, + }, + ingestor::demand::CityStats, + settings::ShapleySettings, +}; + +/// Export commands for data extraction +#[derive(Subcommand, Debug)] +pub enum ExportCommands { + #[command( + about = "Run full Shapley calculation and export inputs, per-city values, and aggregated output", + after_help = r#"Examples: + # Export to stdout as pretty JSON (default) + export shapley -s snapshot.json + + # Export to specific file as compact JSON + export shapley -s snapshot.json -f json --output-file debug.json + + # Export to directory as CSV (creates separate files for inputs and outputs) + export shapley -s snapshot.json -f csv -o ./debug-output/ + + # Export to directory as CSV with demands split by origin city + export shapley -s snapshot.json -f csv -o ./debug-output/ -c + + # Export to directory as JSON (creates single shapley-epoch-N.json) + export shapley -s snapshot.json -f json-pretty -o ./debug-output/"# + )] + Shapley { + /// Path to snapshot file (required) + #[arg(short = 's', long, value_name = "FILE", required = true)] + snapshot: PathBuf, + + /// Output format for exports + #[arg(short = 'f', long, default_value = "json-pretty")] + output_format: OutputFormat, + + /// Directory to export files (required for CSV format) + #[arg(short = 'o', long, value_name = "DIR")] + output_dir: Option, + + /// Specific output file path (JSON formats only) + #[arg(long, value_name = "FILE")] + output_file: Option, + + /// Split demands CSV by origin city (creates separate files per city) + #[arg(short = 'c', long)] + split_by_city: bool, + }, +} + +// ============================================================================ +// Shapley Export Output Structures +// ============================================================================ + +/// Complete Shapley export output containing inputs and computed values +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct ShapleyExportOutput { + pub epoch: u64, + pub shapley_settings: ShapleySettings, + pub inputs: ShapleyExportInputs, + pub per_city_values: BTreeMap>, + pub aggregated_output: Vec, +} + +/// Input data for Shapley calculation +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct ShapleyExportInputs { + pub devices: Devices, + pub private_links: PrivateLinks, + pub public_links: PublicLinks, + pub demands: Demands, + pub city_stats: CityStats, + pub city_weights: BTreeMap, +} + +/// Per-city operator value +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct OperatorValue { + pub operator: String, + pub value: f64, +} + +/// CSV row for per-city Shapley values +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct PerCityShapleyRow { + pub city: String, + pub operator: String, + pub shapley_value: f64, +} + +/// CSV row for aggregated Shapley values +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct AggregatedShapleyRow { + pub operator: String, + pub value: f64, + pub proportion: f64, +} + +impl Exportable for ShapleyExportOutput { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => { + bail!( + "CSV export requires --output-dir to create separate files for inputs and outputs" + ) + } + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} + +/// Handle export commands +pub async fn handle(orchestrator: &Orchestrator, cmd: ExportCommands) -> Result<()> { + match cmd { + ExportCommands::Shapley { + snapshot, + output_format, + output_dir, + output_file, + split_by_city, + } => { + handle_export_shapley( + orchestrator, + snapshot, + output_format, + output_dir, + output_file, + split_by_city, + ) + .await + } + } +} + +// ============================================================================ +// Shapley Export Handler +// ============================================================================ + +async fn handle_export_shapley( + orchestrator: &Orchestrator, + snapshot_path: PathBuf, + output_format: OutputFormat, + output_dir: Option, + output_file: Option, + split_by_city: bool, +) -> Result<()> { + // Validate CSV requires output_dir + if matches!(output_format, OutputFormat::Csv) && output_dir.is_none() { + bail!("CSV format requires --output-dir to create separate files"); + } + + info!("Loading snapshot from: {:?}", snapshot_path); + let snapshot = CompleteSnapshot::load_from_file(&snapshot_path)?; + + // Validate snapshot has leader schedule + if snapshot.leader_schedule.is_none() { + bail!( + "Snapshot {:?} missing leader schedule - cannot compute Shapley values", + snapshot_path + ); + } + + info!( + "Snapshot loaded: epoch {}, created at {}", + snapshot.dz_epoch, snapshot.metadata.created_at + ); + + // Prepare data using shared function + let prep_data = PreparedData::from_snapshot(&snapshot, orchestrator.settings(), true)?; + let epoch = prep_data.epoch; + + let shapley_inputs = prep_data + .shapley_inputs + .ok_or_else(|| anyhow::anyhow!("Failed to prepare Shapley inputs from snapshot"))?; + + info!( + "Prepared Shapley inputs: {} devices, {} private links, {} public links, {} demands", + shapley_inputs.devices.len(), + shapley_inputs.private_links.len(), + shapley_inputs.public_links.len(), + shapley_inputs.demands.len() + ); + + // Compute Shapley values + info!("Computing Shapley values..."); + let compute_result = compute_shapley_values( + &shapley_inputs, + &orchestrator.settings().shapley, + &std::collections::HashMap::new(), + )?; + + // Build per-city values map + let per_city_values: BTreeMap> = compute_result + .per_city_outputs + .iter() + .map(|(city, values)| { + let operator_values: Vec = values + .iter() + .map(|(op, val)| OperatorValue { + operator: op.clone(), + value: *val, + }) + .collect(); + (city.clone(), operator_values) + }) + .collect(); + + // Build aggregated output + let aggregated_output: Vec = compute_result + .aggregated_output + .iter() + .map(|(op, val)| AggregatedShapleyRow { + operator: op.clone(), + value: val.value, + proportion: val.proportion, + }) + .collect(); + + // Build full output + let export_output = ShapleyExportOutput { + epoch, + shapley_settings: orchestrator.settings().shapley.clone(), + inputs: ShapleyExportInputs { + devices: shapley_inputs.devices, + private_links: shapley_inputs.private_links, + public_links: shapley_inputs.public_links, + demands: shapley_inputs.demands, + city_stats: shapley_inputs.city_stats, + city_weights: shapley_inputs.city_weights, + }, + per_city_values, + aggregated_output, + }; + + // Get Solana epoch from snapshot (prefer leader_schedule, fallback to snapshot.solana_epoch) + let solana_epoch = snapshot + .leader_schedule + .as_ref() + .map(|ls| ls.solana_epoch) + .or(snapshot.solana_epoch); + + // Handle output + match output_format { + OutputFormat::Csv => { + // CSV mode - write separate files to output_dir + let dir = output_dir.expect("validated above"); + write_csv_output(&dir, epoch, solana_epoch, &export_output, split_by_city)?; + } + OutputFormat::Json | OutputFormat::JsonPretty => { + let output_options = OutputOptions { + output_format, + output_dir: output_dir.map(|p| p.to_string_lossy().to_string()), + output_file: output_file.map(|p| p.to_string_lossy().to_string()), + }; + let default_filename = format!("shapley-epoch-{epoch}"); + output_options.write(&export_output, &default_filename)?; + } + } + + // Print summary + println!("\nShapley Export Summary:"); + println!("-----------------------"); + println!("Epoch: {epoch}"); + println!("Cities processed: {}", export_output.per_city_values.len()); + println!("Operators: {}", export_output.aggregated_output.len()); + println!("Devices: {}", export_output.inputs.devices.len()); + println!( + "Private Links: {}", + export_output.inputs.private_links.len() + ); + println!("Public Links: {}", export_output.inputs.public_links.len()); + println!("Demands: {}", export_output.inputs.demands.len()); + println!("\nShapley Settings:"); + println!( + " operator_uptime: {}", + export_output.shapley_settings.operator_uptime + ); + println!( + " contiguity_bonus: {}", + export_output.shapley_settings.contiguity_bonus + ); + println!( + " demand_multiplier: {}", + export_output.shapley_settings.demand_multiplier + ); + + Ok(()) +} + +/// Write CSV output files to directory +fn write_csv_output( + dir: &Path, + epoch: u64, + solana_epoch: Option, + output: &ShapleyExportOutput, + split_by_city: bool, +) -> Result<()> { + create_dir_all(dir)?; + + // Write devices.csv + let devices_path = dir.join(format!("devices-epoch-{epoch}.csv")); + let devices_csv = collection_to_csv(&output.inputs.devices)?; + File::create(&devices_path)?.write_all(devices_csv.as_bytes())?; + info!("Exported devices to: {}", devices_path.display()); + + // Write private_links.csv + let private_links_path = dir.join(format!("private-links-epoch-{epoch}.csv")); + let private_links_csv = collection_to_csv(&output.inputs.private_links)?; + File::create(&private_links_path)?.write_all(private_links_csv.as_bytes())?; + info!( + "Exported private links to: {}", + private_links_path.display() + ); + + // Write public_links.csv + let public_links_path = dir.join(format!("public-links-epoch-{epoch}.csv")); + let public_links_csv = collection_to_csv(&output.inputs.public_links)?; + File::create(&public_links_path)?.write_all(public_links_csv.as_bytes())?; + info!("Exported public links to: {}", public_links_path.display()); + + // Write demands.csv (either single file or split by origin city) + if split_by_city { + // Group demands by origin city (start field) + let mut demands_by_city: BTreeMap> = BTreeMap::new(); + for demand in &output.inputs.demands { + demands_by_city + .entry(demand.start.clone()) + .or_default() + .push(demand); + } + + // Write separate CSV file for each origin city + for (city, city_demands) in demands_by_city { + let demands_path = dir.join(format!("demand-{city}-epoch-{epoch}.csv")); + let demands_csv = collection_to_csv(&city_demands)?; + File::create(&demands_path)?.write_all(demands_csv.as_bytes())?; + info!( + "Exported demands for city {} to: {}", + city, + demands_path.display() + ); + } + } else { + // Write single demands.csv file + let demands_path = dir.join(format!("demands-epoch-{epoch}.csv")); + let demands_csv = collection_to_csv(&output.inputs.demands)?; + File::create(&demands_path)?.write_all(demands_csv.as_bytes())?; + info!("Exported demands to: {}", demands_path.display()); + } + + // Write city_stats.csv + let city_stats_rows: Vec = output + .inputs + .city_stats + .iter() + .map(|(city, stat)| CityStatRow { + city: city.clone(), + validator_count: stat.validator_count, + total_stake_proxy: stat.total_stake_proxy, + subscriber_count: stat.subscriber_count, + city_price: stat.city_price, + }) + .collect(); + let city_stats_path = dir.join(format!("city-stats-epoch-{epoch}.csv")); + let city_stats_csv = collection_to_csv(&city_stats_rows)?; + File::create(&city_stats_path)?.write_all(city_stats_csv.as_bytes())?; + info!("Exported city stats to: {}", city_stats_path.display()); + + // Write city_weights.csv + let city_weights_rows: Vec = output + .inputs + .city_weights + .iter() + .map(|(city, weight)| CityWeightRow { + city: city.clone(), + weight: *weight, + }) + .collect(); + let city_weights_path = dir.join(format!("city-weights-epoch-{epoch}.csv")); + let city_weights_csv = collection_to_csv(&city_weights_rows)?; + File::create(&city_weights_path)?.write_all(city_weights_csv.as_bytes())?; + info!("Exported city weights to: {}", city_weights_path.display()); + + // Write shapley_settings.csv + let settings_rows = vec![ShapleySettingsRow { + operator_uptime: output.shapley_settings.operator_uptime, + contiguity_bonus: output.shapley_settings.contiguity_bonus, + demand_multiplier: output.shapley_settings.demand_multiplier, + }]; + let settings_path = dir.join(format!("shapley-settings-epoch-{epoch}.csv")); + let settings_csv = collection_to_csv(&settings_rows)?; + File::create(&settings_path)?.write_all(settings_csv.as_bytes())?; + info!("Exported shapley settings to: {}", settings_path.display()); + + // Write per-city shapley values + let per_city_rows: Vec = output + .per_city_values + .iter() + .flat_map(|(city, values)| { + values.iter().map(|v| PerCityShapleyRow { + city: city.clone(), + operator: v.operator.clone(), + shapley_value: v.value, + }) + }) + .collect(); + let per_city_path = dir.join(format!("per-city-shapley-epoch-{epoch}.csv")); + let per_city_csv = collection_to_csv(&per_city_rows)?; + File::create(&per_city_path)?.write_all(per_city_csv.as_bytes())?; + info!("Exported per-city values to: {}", per_city_path.display()); + + // Write aggregated shapley values + let aggregated_path = dir.join(format!("aggregated-shapley-epoch-{epoch}.csv")); + let aggregated_csv = collection_to_csv(&output.aggregated_output)?; + File::create(&aggregated_path)?.write_all(aggregated_csv.as_bytes())?; + info!( + "Exported aggregated values to: {}", + aggregated_path.display() + ); + + // Write info.csv with Solana epoch and summary statistics + let info_rows = vec![InfoRow { + doublezero_epoch: epoch, + solana_epoch: solana_epoch.unwrap_or(0), + cities_processed: output.per_city_values.len(), + operators: output.aggregated_output.len(), + devices: output.inputs.devices.len(), + private_links: output.inputs.private_links.len(), + public_links: output.inputs.public_links.len(), + demands: output.inputs.demands.len(), + }]; + let info_path = dir.join(format!("info-epoch-{epoch}.csv")); + let info_csv = collection_to_csv(&info_rows)?; + File::create(&info_path)?.write_all(info_csv.as_bytes())?; + info!("Exported info to: {}", info_path.display()); + + Ok(()) +} + +/// CSV row for city statistics +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +struct CityStatRow { + city: String, + validator_count: usize, + total_stake_proxy: usize, + subscriber_count: u16, + city_price: u16, +} + +/// CSV row for city weights +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +struct CityWeightRow { + city: String, + weight: f64, +} + +/// CSV row for shapley settings +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +struct ShapleySettingsRow { + operator_uptime: f64, + contiguity_bonus: f64, + demand_multiplier: f64, +} + +/// CSV row for info information +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +struct InfoRow { + doublezero_epoch: u64, + solana_epoch: u64, + cities_processed: usize, + operators: usize, + devices: usize, + private_links: usize, + public_links: usize, + demands: usize, +} diff --git a/offchain/crates/contributor-rewards/src/cli/impls.rs b/offchain/crates/contributor-rewards/src/cli/impls.rs new file mode 100644 index 0000000000..abdca312a4 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/cli/impls.rs @@ -0,0 +1,65 @@ +use anyhow::{Result, bail}; + +use crate::{ + calculator::input::RewardInput, + cli::{ + common::{OutputFormat, collection_to_csv, to_json_string}, + traits::Exportable, + }, + processor::{internet::InternetTelemetryStats, telemetry::DZDTelemetryStats}, +}; + +// Implement Exportable for processor types + +impl Exportable for InternetTelemetryStats { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => self.to_csv(), + OutputFormat::Json => self.to_json(false), + OutputFormat::JsonPretty => self.to_json(true), + } + } +} + +impl Exportable for Vec { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => collection_to_csv(self), + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} + +impl Exportable for DZDTelemetryStats { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => self.to_csv(), + OutputFormat::Json => self.to_json(false), + OutputFormat::JsonPretty => self.to_json(true), + } + } +} + +impl Exportable for Vec { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => collection_to_csv(self), + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} + +// Implement Exportable for RewardInput +impl Exportable for RewardInput { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => { + bail!("CSV export not supported for RewardInput. Use JSON format.") + } + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} diff --git a/offchain/crates/contributor-rewards/src/cli/inspect.rs b/offchain/crates/contributor-rewards/src/cli/inspect.rs new file mode 100644 index 0000000000..a453c2f734 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/cli/inspect.rs @@ -0,0 +1,365 @@ +use std::{collections::BTreeSet, path::PathBuf}; + +use anyhow::{Result, bail}; +use clap::Subcommand; +use network_shapley::types::{Demand, Demands, Devices, PrivateLinks, PublicLinks}; +use solana_sdk::pubkey::Pubkey; +use tracing::{info, warn}; + +use crate::{ + calculator::{ + orchestrator::Orchestrator, + shapley::handler::{ + PreviousEpochCache, build_devices, build_private_links, build_public_links, + }, + }, + cli::{ + common::{OutputFormat, OutputOptions, to_json_string}, + snapshot::CompleteSnapshot, + traits::Exportable, + }, + ingestor::{demand, fetcher::Fetcher}, + processor::{internet::InternetTelemetryProcessor, telemetry::DZDTelemetryProcessor}, +}; + +/// Inspect commands for analyzing rewards and Shapley calculations +#[derive(Subcommand, Debug)] +pub enum InspectCommands { + #[command( + about = "Inspect and display information about reward record accounts for an epoch", + after_help = r#"Examples: + # Inspect all records for epoch 123 + inspect rewards --epoch 123 + + # Inspect only device telemetry records + inspect rewards --epoch 123 --type device-telemetry + + # Inspect with specific rewards accountant + inspect rewards --epoch 123 --rewards-accountant "# + )] + Rewards { + /// DZ epoch number to inspect records for + #[arg(short, long, value_name = "EPOCH")] + epoch: u64, + + /// Rewards accountant public key (auto-fetched from ProgramConfig if not provided) + #[arg(short = 'r', long, value_name = "PUBKEY")] + rewards_accountant: Option, + + /// Specific record type to inspect (shows all if not specified) + #[arg(short = 't', long, value_name = "TYPE")] + r#type: Option, + }, + + #[command( + about = "Debug and analyze Shapley calculations with real or test demands", + after_help = r#"Examples: + # Debug with real leader schedule (skip user check) + inspect shapley --epoch 9 --skip-users + + # Use test demands for debugging + inspect shapley --epoch 9 --use-test-demands + + # Use snapshot for historical epochs (loads all data from snapshot) + inspect shapley -s mn-epoch-46-snapshot.json + + # Export ShapleyInputs to JSON + inspect shapley --epoch 9 --skip-users --output-format json-pretty --output-dir ./debug/"# + )] + Shapley { + /// DZ epoch to debug + #[arg(short, long, value_name = "EPOCH")] + epoch: Option, + + /// Path to snapshot file (loads all data from snapshot, mutually exclusive with --epoch) + #[arg(short = 's', long, value_name = "FILE")] + snapshot: Option, + + /// Skip serviceability user requirement check + #[arg(long)] + skip_users: bool, + + /// Use uniform test demands instead of real leader schedule + #[arg(long)] + use_test_demands: bool, + + /// Output format for exports + #[arg(short = 'f', long, default_value = "json-pretty")] + output_format: OutputFormat, + + /// Directory to export files + #[arg(short = 'o', long, value_name = "DIR")] + output_dir: Option, + + /// Specific output file path + #[arg(long, value_name = "FILE")] + output_file: Option, + }, +} + +/// Arguments for shapley inspection +struct ShapleyInspectArgs { + epoch: Option, + snapshot: Option, + skip_users: bool, + use_test_demands: bool, + output_format: OutputFormat, + output_dir: Option, + output_file: Option, +} + +/// Container for Shapley inputs using existing types +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct ShapleyInputs { + pub epoch: u64, + pub is_test_data: bool, + pub devices: Devices, + pub private_links: PrivateLinks, + pub public_links: PublicLinks, + pub demands: Demands, + pub cities: Vec, +} + +impl Exportable for ShapleyInputs { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => { + bail!( + "CSV export not supported for complex Shapley inputs. Use JSON format instead." + ) + } + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} + +/// Handle inspect commands +pub async fn handle(orchestrator: &Orchestrator, cmd: InspectCommands) -> Result<()> { + match cmd { + InspectCommands::Rewards { + epoch, + rewards_accountant, + r#type, + } => handle_inspect_rewards(orchestrator, epoch, rewards_accountant, r#type).await, + InspectCommands::Shapley { + epoch, + snapshot, + skip_users, + use_test_demands, + output_format, + output_dir, + output_file, + } => { + let args = ShapleyInspectArgs { + epoch, + snapshot, + skip_users, + use_test_demands, + output_format, + output_dir, + output_file, + }; + handle_inspect_shapley(orchestrator, args).await + } + } +} + +async fn handle_inspect_rewards( + orchestrator: &Orchestrator, + epoch: u64, + rewards_accountant: Option, + r#type: Option, +) -> Result<()> { + orchestrator + .inspect_records(epoch, rewards_accountant, r#type) + .await +} + +async fn handle_inspect_shapley( + orchestrator: &Orchestrator, + args: ShapleyInspectArgs, +) -> Result<()> { + // Validate conflicting flags + if args.use_test_demands && args.snapshot.is_some() { + bail!("Cannot use both --use-test-demands and --snapshot together"); + } + if args.epoch.is_some() && args.snapshot.is_some() { + bail!( + "Cannot use both --epoch and --snapshot together. The snapshot contains its own epoch." + ); + } + + let demand_source = if args.use_test_demands { + "test" + } else if args.snapshot.is_some() { + "snapshot" + } else { + "real" + }; + info!( + "Debugging Shapley calculations with {} demands", + demand_source + ); + + // Load data from snapshot or fetch from network + let (fetch_epoch, fetch_data, snapshot_leader_schedule) = + if let Some(ref snapshot_path) = args.snapshot { + info!("Loading all data from snapshot: {:?}", snapshot_path); + let loaded_snapshot = CompleteSnapshot::load_from_file(snapshot_path)?; + let leader_schedule = loaded_snapshot.leader_schedule.ok_or_else(|| { + anyhow::anyhow!("Snapshot {:?} missing leader schedule", snapshot_path) + })?; + info!( + "Loaded snapshot for DZ epoch {} (Solana epoch: {})", + loaded_snapshot.dz_epoch, leader_schedule.solana_epoch + ); + ( + loaded_snapshot.dz_epoch, + loaded_snapshot.fetch_data, + Some(leader_schedule), + ) + } else { + let fetcher = Fetcher::from_settings(orchestrator.settings())?; + let (epoch, data) = fetcher.fetch(args.epoch).await?; + (epoch, data, None) + }; + + info!("Using data from epoch {}", fetch_epoch); + + // Check for users if not skipping + if !args.skip_users && fetch_data.dz_serviceability.users.is_empty() { + warn!("No users found in serviceability data!"); + bail!( + "No users found. Use --skip-users to proceed anyway or --use-test-demands for testing." + ); + } + + // Process telemetry + let dzd_stats = DZDTelemetryProcessor::process(&fetch_data)?; + let internet_stats = InternetTelemetryProcessor::process(&fetch_data)?; + + info!( + "Processed {} device links and {} internet links", + dzd_stats.len(), + internet_stats.len() + ); + + // Build Shapley inputs using existing types + // Create an empty cache since we're just inspecting, not applying defaults + let previous_epoch_cache = PreviousEpochCache::new(); + + let (devices, device_ids) = build_devices(&fetch_data, &orchestrator.settings().network)?; + let private_links = build_private_links(&fetch_data, &device_ids); + let public_links = build_public_links( + orchestrator.settings(), + &internet_stats, + &fetch_data, + &previous_epoch_cache, + )?; + + // Get unique cities from public links + let mut cities = BTreeSet::new(); + for link in &public_links { + cities.insert(link.city1.clone()); + cities.insert(link.city2.clone()); + } + let cities_vec: Vec = cities.into_iter().collect(); + + info!("Found {} unique cities", cities_vec.len()); + + // Generate demands + let demands = if args.use_test_demands { + info!("Using uniform test demands for debugging"); + generate_uniform_test_demands(&cities_vec)? + } else if let Some(leader_schedule) = snapshot_leader_schedule { + info!( + "Using leader schedule from snapshot (Solana epoch: {})", + leader_schedule.solana_epoch + ); + let demand_output = + demand::build_with_schedule(orchestrator.settings(), &fetch_data, &leader_schedule)?; + info!( + "Generated {} demands from {} cities with validators", + demand_output.demands.len(), + demand_output.city_stats.len() + ); + demand_output.demands + } else { + info!("Fetching real leader schedule from Solana"); + let fetcher = Fetcher::from_settings(orchestrator.settings())?; + let demand_output = demand::build(&fetcher, &fetch_data).await?; + info!( + "Generated {} real demands from {} cities with validators", + demand_output.demands.len(), + demand_output.city_stats.len() + ); + demand_output.demands + }; + + info!("Generated {} demand pairs", demands.len()); + + // Create export structure using existing types + let shapley_inputs = ShapleyInputs { + epoch: fetch_epoch, + is_test_data: args.use_test_demands, + devices, + private_links, + public_links, + demands, + cities: cities_vec.clone(), + }; + + // Export results + let output_options = OutputOptions { + output_format: args.output_format, + output_dir: args.output_dir.map(|p| p.to_string_lossy().to_string()), + output_file: args.output_file.map(|p| p.to_string_lossy().to_string()), + }; + + let default_filename = format!("shapley-inputs-{demand_source}-epoch-{fetch_epoch}"); + output_options.write(&shapley_inputs, &default_filename)?; + + // Print summary + println!("\nShapley Inputs Summary:"); + println!("----------------------"); + println!("Epoch: {fetch_epoch}"); + println!("Demand source: {demand_source}"); + println!("Cities: {}", shapley_inputs.cities.len()); + println!("Devices: {}", shapley_inputs.devices.len()); + println!("Private Links: {}", shapley_inputs.private_links.len()); + println!("Public Links: {}", shapley_inputs.public_links.len()); + println!("Demands: {}", shapley_inputs.demands.len()); + + Ok(()) +} + +/// Generate uniform test demands for debugging - equal traffic between all city pairs +fn generate_uniform_test_demands(cities: &[String]) -> Result { + let mut demands = Vec::new(); + let mut demand_type = 1u32; + + for source in cities { + for destination in cities { + if source != destination { + demands.push(Demand::new( + source.clone(), + destination.clone(), + 1, // receivers + 1.0, // uniform traffic + 1.0, // uniform priority + demand_type, + false, // no multicast for test + )); + } + } + demand_type += 1; + } + + info!( + "Generated {} uniform test demands across {} cities", + demands.len(), + cities.len() + ); + Ok(demands) +} diff --git a/offchain/crates/contributor-rewards/src/cli/mod.rs b/offchain/crates/contributor-rewards/src/cli/mod.rs new file mode 100644 index 0000000000..e5c65053d3 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/cli/mod.rs @@ -0,0 +1,9 @@ +pub mod common; +pub mod export; +pub mod impls; +pub mod inspect; +pub mod rewards; +pub mod scheduler; +pub mod snapshot; +pub mod telemetry; +pub mod traits; diff --git a/offchain/crates/contributor-rewards/src/cli/rewards.rs b/offchain/crates/contributor-rewards/src/cli/rewards.rs new file mode 100644 index 0000000000..6b18a811be --- /dev/null +++ b/offchain/crates/contributor-rewards/src/cli/rewards.rs @@ -0,0 +1,696 @@ +use std::path::PathBuf; + +use anyhow::{Result, ensure}; +use clap::Subcommand; +use doublezero_solana_client_tools::rpc::SolanaConnection; +use doublezero_solana_sdk::revenue_distribution::fetch::{ + SolConversionState, try_fetch_config, try_fetch_distribution, +}; +use slack_notifier::contributor_rewards::{ + DistributionRewardRow, WriteResultInfo, post_contributor_rewards, post_distribution_rewards, +}; +use solana_sdk::pubkey::Pubkey; +use tabled::{builder::Builder as TableBuilder, settings::Style}; +use tracing::{info, warn}; + +use crate::{ + calculator::{ledger_operations::WriteResult, orchestrator::Orchestrator}, + cli::snapshot::CompleteSnapshot, +}; + +/// Reward-related commands +#[derive(Subcommand, Debug)] +pub enum RewardsCommands { + #[command( + about = "Calculate Shapley value-based rewards for network contributors", + after_help = r#"Examples: + # Calculate rewards from snapshot + calculate-rewards --snapshot mn-epoch-27-snapshot.json -k keypair.json + + # Dry run to preview without writing to DZ ledger + calculate-rewards --snapshot mn-epoch-27-snapshot.json --dry-run + + # Skip only device telemetry write (write everything else) + calculate-rewards --snapshot mn-epoch-27-snapshot.json -k keypair.json --skip-device-telemetry + + # Skip multiple writes (e.g., skip telemetry but write rewards) + calculate-rewards --snapshot mn-epoch-27-snapshot.json -k keypair.json --skip-device-telemetry --skip-internet-telemetry + + # Repost only merkle root (skip all DZ Ledger writes) + calculate-rewards --snapshot mn-epoch-27-snapshot.json -k keypair.json --skip-device-telemetry --skip-internet-telemetry --skip-reward-input --skip-shapley-output + + # Create a snapshot first using the snapshot command + snapshot all --epoch 27 --output-file mn-epoch-27-snapshot.json"# + )] + CalculateRewards { + /// Path to epoch snapshot file (REQUIRED for reproducible calculations) + #[arg( + short = 's', + long, + value_name = "FILE", + help = "Snapshot file containing epoch data" + )] + snapshot: PathBuf, + + /// Skip writing to ledger and show what would be written + #[arg(long)] + dry_run: bool, + + /// Path to keypair file for signing transactions + #[arg( + short = 'k', + long, + value_name = "FILE", + required_unless_present = "dry_run" + )] + keypair: Option, + + /// Skip writing device telemetry aggregates to DZ Ledger + #[arg(long)] + skip_device_telemetry: bool, + + /// Skip writing internet telemetry aggregates to DZ Ledger + #[arg(long)] + skip_internet_telemetry: bool, + + /// Skip writing reward calculation input to DZ Ledger + #[arg(long)] + skip_reward_input: bool, + + /// Skip writing shapley output storage to DZ Ledger + #[arg(long)] + skip_shapley_output: bool, + + /// Skip posting merkle root to Solana + #[arg(long)] + skip_merkle_root: bool, + + /// Send Slack notification after completion (requires Slack settings in config) + #[arg(long)] + slack_notify: bool, + }, + #[command( + about = "Read and display telemetry aggregate statistics from the ledger", + after_help = r#"Examples: + # Read all telemetry for epoch 123 + read-telem-agg --epoch 123 + + # Export device telemetry to CSV + read-telem-agg --epoch 123 --type device -o device_stats.csv + + # Read internet telemetry only + read-telem-agg --epoch 123 --type internet"# + )] + ReadTelemAgg { + /// DZ epoch number to read telemetry from + #[arg(short, long, value_name = "EPOCH")] + epoch: u64, + + /// Rewards accountant public key (auto-fetched from ProgramConfig if not provided) + #[arg(short = 'r', long, value_name = "PUBKEY")] + rewards_accountant: Option, + + /// Type of telemetry to read: 'device', 'internet', or 'all' + #[arg(short = 't', long, default_value = "all", value_name = "TYPE")] + r#type: String, + + /// Export results to CSV file + #[arg(short = 'o', long, value_name = "FILE")] + output_csv: Option, + }, + #[command( + about = "Check and verify a specific contributor's reward for an epoch", + after_help = r#"Examples: + # Check reward for a contributor + check-reward --contributor 7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV --epoch 123 + + # Check with explicit rewards accountant + check-reward -c 7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV -e 123 -r + + # Output as JSON + check-reward -c 7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV -e 123 --json"# + )] + CheckReward { + /// Contributor's public key (base58 encoded) + #[arg(short, long, value_name = "PUBKEY")] + contributor: Pubkey, + + /// DZ epoch number to check reward for + #[arg(short, long, value_name = "EPOCH")] + epoch: u64, + + /// Rewards accountant public key (auto-fetched from ProgramConfig if not provided) + #[arg(short = 'r', long, value_name = "PUBKEY")] + rewards_accountant: Option, + + /// Output as JSON instead of table + #[arg(long)] + json: bool, + }, + #[command( + about = "Read and display the reward input configuration for an epoch", + after_help = r#"Examples: + # Read reward input for epoch 123 + read-reward-input --epoch 123 + + # Read with specific rewards accountant + read-reward-input --epoch 123 --rewards-accountant "# + )] + ReadRewardInput { + /// DZ epoch number to read configuration from + #[arg(short, long, value_name = "EPOCH")] + epoch: u64, + + /// Rewards accountant public key (auto-fetched from ProgramConfig if not provided) + #[arg(short = 'r', long, value_name = "PUBKEY")] + rewards_accountant: Option, + }, + #[command( + about = "Read and display all contributor rewards for an epoch", + after_help = r#"Examples: + # Read all rewards for epoch 56 + read-rewards --epoch 56 + + # Read with JSON output + read-rewards --epoch 56 --json + + # Read with specific rewards accountant + read-rewards --epoch 56 --rewards-accountant "# + )] + ReadRewards { + /// DZ epoch number to read rewards from + #[arg(short, long, value_name = "EPOCH")] + epoch: u64, + + /// Rewards accountant public key (auto-fetched from ProgramConfig if not provided) + #[arg(short = 'r', long, value_name = "PUBKEY")] + rewards_accountant: Option, + + /// Output as JSON instead of table + #[arg(long)] + json: bool, + }, + #[command( + about = "Reallocate a record account to change its size", + after_help = r#"Examples: + # Increase device telemetry record size + realloc-record --type device-telemetry --epoch 123 --size 100000 -k keypair.json + + # Dry run to check the operation + realloc-record --type internet-telemetry --epoch 123 --size 50000 --dry-run"# + )] + ReallocRecord { + /// Record type: 'device-telemetry', 'internet-telemetry', 'reward-input', or 'contributor-rewards' + #[arg(short = 't', long, value_name = "TYPE")] + r#type: String, + + /// DZ epoch number of the record to reallocate + #[arg(short, long, value_name = "EPOCH")] + epoch: u64, + + /// New size in bytes for the record account + #[arg(short, long, value_name = "BYTES")] + size: u64, + + /// Skip the actual reallocation and show what would happen + #[arg(long)] + dry_run: bool, + + /// Path to keypair file for signing transactions + #[arg( + short = 'k', + long, + value_name = "FILE", + required_unless_present = "dry_run" + )] + keypair: Option, + }, + #[command( + about = "Close a record account and reclaim its rent", + after_help = r#"Examples: + # Close an old telemetry record + close-record --type device-telemetry --epoch 100 -k keypair.json + + # Dry run to verify the account exists + close-record --type contributor-rewards --epoch 100 --dry-run"# + )] + CloseRecord { + /// Record type: 'device-telemetry', 'internet-telemetry', 'reward-input', or 'contributor-rewards' + #[arg(short = 't', long, value_name = "TYPE")] + r#type: String, + + /// DZ epoch number of the record to close + #[arg(short, long, value_name = "EPOCH")] + epoch: u64, + + /// Skip the actual closure and show what would happen + #[arg(long)] + dry_run: bool, + + /// Path to keypair file for signing transactions + #[arg( + short = 'k', + long, + value_name = "FILE", + required_unless_present = "dry_run" + )] + keypair: Option, + }, + #[command( + about = "Write telemetry aggregate statistics to the ledger without calculating rewards", + after_help = r#"Examples: + # Write all telemetry for previous epoch + write-telem-agg -k keypair.json + + # Write only device telemetry for epoch 123 + write-telem-agg --epoch 123 --type device -k keypair.json + + # Dry run to preview the data + write-telem-agg --epoch 123 --dry-run"# + )] + WriteTelemAgg { + /// DZ epoch to process telemetry for (defaults to previous epoch) + #[arg(short, long, value_name = "EPOCH")] + epoch: Option, + + /// Skip writing to ledger and show what would be written + #[arg(long)] + dry_run: bool, + + /// Type of telemetry to write: 'device', 'internet', or 'all' + #[arg(short = 't', long, default_value = "all", value_name = "TYPE")] + r#type: String, + + /// Path to keypair file for signing transactions + #[arg( + short = 'k', + long, + value_name = "FILE", + required_unless_present = "dry_run" + )] + keypair: Option, + }, + #[command( + about = "Distribute rewards to contributors for a finalized epoch", + long_about = "Three modes of operation:\n\n\ + 1. Readiness check (--dry-run, no keypair): shows distribution status without simulation\n\ + 2. Simulate (--dry-run with keypair): simulates transactions without sending\n\ + 3. Execute (no --dry-run, keypair required): sends real transactions", + after_help = r#"Examples: + # Check distribution readiness (no keypair needed) + distribute-rewards --dry-run + + # Check a specific epoch + distribute-rewards --dry-run -e 27 + + # Simulate distribution (dry-run with keypair) + distribute-rewards --dry-run -k keypair.json -e 27 + + # Execute distribution + distribute-rewards -k keypair.json -e 27"# + )] + DistributeRewards { + /// DZ epoch to distribute rewards for (defaults to current eligible epoch) + #[arg(short = 'e', long, value_name = "EPOCH")] + dz_epoch: Option, + + /// Skip sending transactions and show what would happen + #[arg(long)] + dry_run: bool, + + /// Path to keypair file for signing transactions + #[arg( + short = 'k', + long, + value_name = "FILE", + required_unless_present = "dry_run" + )] + keypair: Option, + }, +} + +/// Handle rewards commands +pub async fn handle(orchestrator: &Orchestrator, cmd: RewardsCommands) -> Result<()> { + match cmd { + RewardsCommands::CalculateRewards { + snapshot, + dry_run, + keypair, + skip_device_telemetry, + skip_internet_telemetry, + skip_reward_input, + skip_shapley_output, + skip_merkle_root, + slack_notify, + } => { + use tracing::warn; + + // Construct WriteConfig from CLI flags + let write_config = crate::calculator::WriteConfig::from_flags( + skip_device_telemetry, + skip_internet_telemetry, + skip_reward_input, + skip_shapley_output, + skip_merkle_root, + ); + + // Validation: Warn if dry-run is combined with skip flags + if dry_run && write_config.skipped_count() > 0 { + warn!( + "Both --dry-run and skip flags specified. --dry-run takes precedence and all writes will be skipped." + ); + } + + // Validation: Warn if all skip flags are set (suggest using --dry-run instead) + if !dry_run && write_config.all_writes_skipped() { + warn!( + "All write operations are skipped via flags. Consider using --dry-run instead for clearer intent." + ); + } + + // Validation: Require keypair if not dry-run and any writes are enabled + if !dry_run && write_config.any_writes_enabled() && keypair.is_none() { + anyhow::bail!( + "Keypair is required when write operations are enabled. \ + Provide --keypair or use --dry-run to skip all writes." + ); + } + + let write_summary = orchestrator + .calculate_rewards(None, keypair, Some(snapshot.clone()), dry_run, write_config) + .await?; + + // Send Slack notification if requested + if slack_notify { + // Load snapshot to get epoch + let snapshot_data = CompleteSnapshot::load_from_file(&snapshot)?; + let epoch = snapshot_data.dz_epoch; + + // Check if Slack is configured + if let Some(slack_settings) = &orchestrator.settings.slack { + if let Some(webhook_url) = &slack_settings.webhook_url { + let network = format!("{:?}", orchestrator.settings.network); + + // Convert WriteSummary to WriteResultInfo + let write_results: Vec = write_summary + .results + .iter() + .map(|result| match result { + WriteResult::Success(description, identifier) => { + WriteResultInfo::Success { + description: description.clone(), + identifier: identifier.clone(), + } + } + WriteResult::Failed(description, error) => { + WriteResultInfo::Failed { + description: description.clone(), + error: error.clone(), + } + } + }) + .collect(); + + // Post notification + match post_contributor_rewards(webhook_url, network, epoch, write_results) + .await + { + Ok(_) => { + info!("[OK] Posted Slack notification for epoch {}", epoch); + } + Err(e) => { + warn!("[WARN] Failed to post Slack notification: {}", e); + } + } + } else { + warn!("[WARN] Slack notification requested but webhook_url not configured"); + } + } else { + warn!("[WARN] Slack notification requested but Slack settings not configured"); + } + } + + Ok(()) + } + RewardsCommands::ReadTelemAgg { + epoch, + rewards_accountant, + r#type, + output_csv, + } => { + orchestrator + .read_telemetry_aggregates(epoch, rewards_accountant, &r#type, output_csv) + .await + } + RewardsCommands::CheckReward { + contributor, + epoch, + rewards_accountant, + json, + } => { + orchestrator + .check_contributor_reward(&contributor, epoch, rewards_accountant, json) + .await + } + RewardsCommands::ReadRewardInput { + epoch, + rewards_accountant, + } => { + orchestrator + .read_reward_input(epoch, rewards_accountant) + .await + } + RewardsCommands::ReadRewards { + epoch, + rewards_accountant, + json, + } => { + orchestrator + .read_all_rewards(epoch, rewards_accountant, json) + .await + } + RewardsCommands::ReallocRecord { + r#type, + epoch, + size, + dry_run, + keypair, + } => { + orchestrator + .realloc_record(r#type, epoch, size, keypair, dry_run) + .await + } + RewardsCommands::CloseRecord { + r#type, + epoch, + dry_run, + keypair, + } => { + orchestrator + .close_record(r#type, epoch, keypair, dry_run) + .await + } + RewardsCommands::WriteTelemAgg { + epoch, + dry_run, + r#type, + keypair, + } => { + orchestrator + .write_telemetry_aggregates(epoch, keypair, dry_run, r#type) + .await + } + RewardsCommands::DistributeRewards { + dz_epoch, + dry_run, + keypair, + } => { + let connection = + SolanaConnection::new(orchestrator.settings.rpc.solana_write_url.clone()); + + let (_, config) = try_fetch_config(&connection).await?; + + let dz_epoch_value = match dz_epoch { + Some(epoch) => { + info!("Will distribute for provided dz_epoch: {epoch}"); + epoch + } + None => { + let sol_conversion_state = SolConversionState::try_fetch(&connection).await?; + let next_sweep = sol_conversion_state + .journal + .1 + .next_dz_epoch_to_sweep_tokens + .value(); + ensure!(next_sweep > 0, "No epochs have been swept yet"); + let dist_epoch = next_sweep - 1; + info!("Will distribute for dz_epoch: {dist_epoch}, next_sweep: {next_sweep}"); + dist_epoch + } + }; + + match (dry_run, keypair) { + // Mode 1: Readiness check only (no keypair, no wallet) + (true, None) => { + let (_, distribution) = + try_fetch_distribution(&connection, dz_epoch_value).await?; + info!("Epoch {dz_epoch_value} readiness:"); + info!( + " Rewards finalized: {}", + distribution.is_rewards_calculation_finalized() + ); + info!(" 2Z tokens swept: {}", distribution.has_swept_2z_tokens()); + info!( + " Progress: {}/{}", + distribution.distributed_rewards_count, distribution.total_contributors + ); + } + // Mode 2 & 3: Simulate or Execute (keypair present) + (dry_run, Some(keypair_path)) => { + use doublezero_solana_client_tools::{ + payer::Wallet, rpc::DoubleZeroLedgerConnection, + }; + + use crate::calculator::{distribute, keypair_loader::load_keypair}; + + let signer = load_keypair(&Some(keypair_path))?; + let dz_connection = + DoubleZeroLedgerConnection::new(orchestrator.settings.rpc.dz_url.clone()); + + let wallet = Wallet { + connection, + signer, + compute_unit_price_ix: None, + verbose: false, + fee_payer: None, + dry_run, + }; + + info!("Distributing rewards for epoch {dz_epoch_value}"); + + let shapley_prefix = orchestrator.settings.get_contributor_rewards_prefix(); + + let summary = distribute::try_distribute_epoch_rewards( + &wallet, + &dz_connection, + &config.rewards_accountant_key, + dz_epoch_value, + &shapley_prefix, + ) + .await?; + + match &summary.outcome { + distribute::DistributionOutcome::Complete { total_contributors } => { + info!( + "Epoch {dz_epoch_value} complete: {total_contributors}/{total_contributors} distributed" + ); + } + distribute::DistributionOutcome::PartiallyComplete { + total_contributors, + distributed, + skipped, + } => { + info!( + "Epoch {dz_epoch_value} partially complete: {distributed}/{total_contributors} distributed, {skipped} skipped (missing ContributorRewards accounts)" + ); + } + distribute::DistributionOutcome::NotReady => { + info!("Distribution not ready for epoch {dz_epoch_value}"); + } + } + + // Fetch contributor labels and build display rows. + if !summary.contributors.is_empty() { + let labels = + crate::calculator::ledger_operations::try_fetch_contributor_labels( + &dz_connection, + &orchestrator.settings.programs.serviceability_program_id, + ) + .await + .unwrap_or_default(); + + let resolve_label = |key: &solana_sdk::pubkey::Pubkey| { + labels.get(key).cloned().unwrap_or_else(|| key.to_string()) + }; + + // Print per-contributor rewards table to stdout. + let mut table_builder = TableBuilder::default(); + table_builder.push_record([ + "dz_epoch".to_string(), + "index".to_string(), + "contributor".to_string(), + "proportion".to_string(), + "reward".to_string(), + "distributed".to_string(), + ]); + for c in &summary.contributors { + table_builder.push_record([ + summary.dz_epoch.to_string(), + c.index.to_string(), + resolve_label(&c.contributor_key), + format!("{:.2}%", 100.0 * c.proportion), + format!("{:.1} 2Z", c.reward_tokens), + if c.distributed { "yes" } else { "no" }.to_string(), + ]); + } + let table = table_builder + .build() + .with(Style::psql().remove_horizontals()) + .to_string(); + println!("\n{table}"); + + // Post Slack notification for completed distributions. + if matches!( + summary.outcome, + distribute::DistributionOutcome::Complete { .. } + | distribute::DistributionOutcome::PartiallyComplete { .. } + ) && let Some(slack_settings) = &orchestrator.settings.slack + && slack_settings.enabled + && let Some(webhook_url) = &slack_settings.webhook_url + { + let network = format!("{:?}", orchestrator.settings.network); + let rows: Vec = summary + .contributors + .iter() + .map(|c| DistributionRewardRow { + index: c.index, + contributor: resolve_label(&c.contributor_key), + proportion: format!("{:.2}%", 100.0 * c.proportion), + reward: format!("{:.1} 2Z", c.reward_tokens), + distributed: if c.distributed { "yes" } else { "no" } + .to_string(), + }) + .collect(); + + match post_distribution_rewards( + webhook_url, + network, + summary.dz_epoch, + rows, + ) + .await + { + Ok(()) => { + info!( + "[OK] Posted distribution Slack notification for epoch {}", + dz_epoch_value + ); + } + Err(e) => { + warn!( + "[WARN] Failed to post distribution Slack notification: {}", + e + ); + } + } + } + } + } + // Unreachable: clap enforces keypair is required unless dry_run + (false, None) => unreachable!(), + } + + Ok(()) + } + } +} diff --git a/offchain/crates/contributor-rewards/src/cli/scheduler.rs b/offchain/crates/contributor-rewards/src/cli/scheduler.rs new file mode 100644 index 0000000000..4f2a9e1c8f --- /dev/null +++ b/offchain/crates/contributor-rewards/src/cli/scheduler.rs @@ -0,0 +1,140 @@ +use std::{path::PathBuf, time::Duration}; + +use anyhow::{Result, bail}; +use clap::Subcommand; +use tracing::info; + +use crate::{calculator::orchestrator::Orchestrator, scheduler::ScheduleWorker, storage}; + +#[derive(Subcommand, Debug)] +pub enum SchedulerCommands { + /// Start the automated rewards scheduler + #[command(about = "Start automated rewards calculation scheduler")] + Start { + /// Path to keypair file for signing transactions + #[clap( + short = 'k', + long, + value_name = "FILE", + help = "Path to keypair file (required unless --dry-run)" + )] + keypair: Option, + + /// Skip writing merkle root to chain (snapshots still uploaded to configured storage) + #[clap( + long, + help = "Run in dry-run mode: creates snapshots and calculates rewards, but skips chain writes" + )] + dry_run: bool, + + /// Check interval in seconds (overrides config file) + #[clap( + short = 'i', + long, + value_name = "SECONDS", + help = "Interval between checks in seconds" + )] + interval: Option, + + /// Path to scheduler state file (overrides config file) + #[clap( + short = 's', + long, + value_name = "FILE", + help = "Path to state file for tracking progress" + )] + state_file: Option, + + /// Override: save snapshots to local directory instead of configured storage + #[clap( + long, + value_name = "DIR", + help = "Override configured storage: save snapshots to local directory" + )] + local_dir: Option, + }, +} + +pub async fn handle(orchestrator: &Orchestrator, cmd: SchedulerCommands) -> Result<()> { + match cmd { + SchedulerCommands::Start { + keypair, + dry_run, + interval, + state_file, + local_dir, + } => { + start_scheduler( + orchestrator, + keypair, + dry_run, + interval, + state_file, + local_dir, + ) + .await + } + } +} + +async fn start_scheduler( + orchestrator: &Orchestrator, + keypair_path: Option, + dry_run_override: bool, + interval_override: Option, + state_file_override: Option, + local_dir_override: Option, +) -> Result<()> { + let settings = orchestrator.settings(); + + // Use CLI args if provided, otherwise fall back to config settings + let interval = interval_override.unwrap_or(settings.scheduler.interval_seconds); + let state_file = + state_file_override.unwrap_or_else(|| PathBuf::from(&settings.scheduler.state_file)); + let dry_run = dry_run_override || settings.scheduler.enable_dry_run; + + // Validate keypair if not in dry-run mode + if !dry_run { + if let Some(ref kp_path) = keypair_path { + if !kp_path.exists() { + bail!("Keypair file not found: {kp_path:?}"); + } + if !kp_path.is_file() { + bail!("Keypair path is not a file: {kp_path:?}"); + } + } else { + bail!( + "Keypair is required when not in dry-run mode. Use --keypair to specify a keypair file or --dry-run to skip" + ); + } + } + + info!("Starting rewards scheduler"); + + // Create storage backend (with optional local override) + let storage = if let Some(local_dir) = local_dir_override { + // Use local filesystem regardless of config + info!("Using local storage override: {:?}", local_dir); + Box::new(storage::local::LocalFileStorage::new(local_dir)) + as Box + } else { + // Use storage backend from config + info!( + "Using configured storage backend: {:?}", + settings.scheduler.storage_backend + ); + storage::create_storage(settings).await? + }; + + // Create and run worker + let worker = ScheduleWorker::new( + orchestrator, + state_file, + storage, + keypair_path, + dry_run, + Duration::from_secs(interval), + ); + + worker.run().await +} diff --git a/offchain/crates/contributor-rewards/src/cli/snapshot.rs b/offchain/crates/contributor-rewards/src/cli/snapshot.rs new file mode 100644 index 0000000000..1e2f92485a --- /dev/null +++ b/offchain/crates/contributor-rewards/src/cli/snapshot.rs @@ -0,0 +1,346 @@ +use std::path::PathBuf; + +use anyhow::{Context, Result, bail}; +use serde::{Deserialize, Serialize}; +use tracing::{info, warn}; + +use crate::{ + calculator::{data_prep::PreparedData, orchestrator::Orchestrator}, + cli::{ + common::{OutputFormat, OutputOptions, to_json_string}, + traits::Exportable, + }, + ingestor::{ + epoch::{EpochFinder, LeaderSchedule}, + fetcher::Fetcher, + types::{FetchData, apply_json_compat_migrations}, + }, + settings::network::Network, + storage, +}; + +/// Snapshot creation arguments +#[derive(Debug)] +pub struct SnapshotArgs { + /// DZ epoch to snapshot (defaults to previous epoch) + pub epoch: Option, + /// Output format for export + pub output_format: OutputFormat, + /// Directory to export files + pub output_dir: Option, + /// Specific output file path + pub output_file: Option, +} + +/// Complete snapshot containing all data +#[derive(Debug, Serialize, Deserialize)] +pub struct CompleteSnapshot { + pub dz_epoch: u64, + pub solana_epoch: Option, + pub fetch_data: FetchData, + pub leader_schedule: Option, + pub metadata: SnapshotMetadata, +} + +/// Metadata about the snapshot +#[derive(Debug, Serialize, Deserialize)] +pub struct SnapshotMetadata { + pub created_at: String, + pub network: String, + pub exchanges_count: usize, + pub locations_count: usize, + pub devices_count: usize, + pub internet_samples_count: usize, + pub device_samples_count: usize, +} + +impl CompleteSnapshot { + /// Save snapshot to file + pub fn save_to_file(&self, path: &std::path::Path) -> Result<()> { + info!("Saving snapshot to: {:?}", path); + + // Serialize snapshot + let contents = serde_json::to_string_pretty(self)?; + + // Write to temporary file first (atomic write pattern) + let temp_path = path.with_extension("tmp"); + + std::fs::write(&temp_path, contents)?; + + // Atomically rename temp file to final location + std::fs::rename(&temp_path, path)?; + + info!("Snapshot saved successfully to: {:?}", path); + Ok(()) + } + + /// Deserialize a snapshot, applying compatibility migrations for older JSON snapshots. + pub fn from_json_str(contents: &str) -> Result { + let mut value: serde_json::Value = serde_json::from_str(contents)?; + apply_json_compat_migrations(&mut value); + Ok(serde_json::from_value(value)?) + } + + /// Deserialize a snapshot, applying compatibility migrations for older JSON snapshots. + pub fn from_json_slice(contents: &[u8]) -> Result { + let mut value: serde_json::Value = serde_json::from_slice(contents)?; + apply_json_compat_migrations(&mut value); + Ok(serde_json::from_value(value)?) + } + + /// Load and validate snapshot from file + pub fn load_from_file(path: &std::path::Path) -> Result { + info!("Loading snapshot from: {:?}", path); + let contents = std::fs::read_to_string(path)?; + let snapshot = Self::from_json_str(&contents)?; + snapshot.validate()?; + info!("Snapshot loaded and validated successfully"); + Ok(snapshot) + } + + /// Validate snapshot completeness and quality + pub fn validate(&self) -> Result<()> { + let mut issues = Vec::new(); + + // Check serviceability completeness + if self.fetch_data.dz_serviceability.devices.is_empty() { + issues.push("No devices in snapshot"); + } + if self.fetch_data.dz_serviceability.contributors.is_empty() { + issues.push("No contributors in snapshot"); + } + if self.fetch_data.dz_serviceability.exchanges.is_empty() { + issues.push("No exchanges in snapshot"); + } + if self.fetch_data.dz_serviceability.users.is_empty() { + issues.push("No users in snapshot"); + } + + // Check telemetry completeness + if self + .fetch_data + .dz_telemetry + .device_latency_samples + .is_empty() + { + issues.push("No device telemetry samples"); + } + if self + .fetch_data + .dz_internet + .internet_latency_samples + .is_empty() + { + issues.push("No internet telemetry samples"); + } + + // Check leader schedule + if self.leader_schedule.is_none() { + issues.push("Missing leader schedule"); + } else if let Some(schedule) = &self.leader_schedule + && schedule.schedule_map.is_empty() + { + issues.push("Leader schedule is empty"); + } + + if !issues.is_empty() { + bail!("Snapshot validation failed:\n - {}", issues.join("\n - ")); + } + + info!("Snapshot validation passed"); + info!(" - Epoch: {}", self.dz_epoch); + info!(" - Devices: {}", self.metadata.devices_count); + info!(" - Device samples: {}", self.metadata.device_samples_count); + info!( + " - Internet samples: {}", + self.metadata.internet_samples_count + ); + info!(" - Exchanges: {}", self.metadata.exchanges_count); + if let Some(schedule) = &self.leader_schedule { + info!(" - Leaders: {}", schedule.schedule_map.len()); + } + + Ok(()) + } +} + +// Implement Exportable traits +impl Exportable for CompleteSnapshot { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => { + bail!( + "CSV export not supported for complete snapshot. Export individual components instead." + ) + } + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} + +impl Exportable for FetchData { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => { + bail!("CSV export not supported for FetchData. Use JSON format instead.") + } + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} + +/// Create a complete snapshot with all processing applied +pub async fn create_snapshot( + orchestrator: &Orchestrator, + epoch: Option, + local_file: Option, + local_dir: Option, +) -> Result<()> { + info!("Creating complete snapshot"); + + // Create fetcher + let fetcher = Fetcher::from_settings(orchestrator.settings())?; + + // Use PreparedData to apply same processing as calculate-rewards + // This includes previous epoch cache lookups and internet telemetry accumulator + let prep_data = PreparedData::new(&fetcher, epoch, false).await?; + let fetch_epoch = prep_data.epoch; + + info!("Processed data for DZ epoch {}", fetch_epoch); + + // Get the fetch_data by re-fetching and applying same internet accumulator logic + let (_, mut fetch_data) = fetcher.fetch(Some(fetch_epoch)).await?; + + // Apply internet accumulator if enabled (same as PreparedData does) + if fetcher.settings.inet_lookback.enable_accumulator { + use std::collections::BTreeSet; + + use crate::ingestor::internet; + + // Calculate expected internet links + let mut unique_routes = BTreeSet::new(); + for sample in &fetch_data.dz_internet.internet_latency_samples { + unique_routes.insert(( + sample.origin_exchange_pk, + sample.target_exchange_pk, + sample.data_provider_name.clone(), + )); + } + let expected_inet_samples = unique_routes.len(); + let (inet_epoch, internet_data) = internet::fetch_with_accumulator( + &fetcher.dz_rpc_client, + &fetcher.settings, + fetch_epoch, + expected_inet_samples, + ) + .await?; + + if inet_epoch != fetch_epoch { + warn!( + "Using historical internet telemetry from epoch {} (target was {})", + inet_epoch, fetch_epoch + ); + } + + fetch_data.dz_internet = internet_data; + } + + let mut epoch_finder = EpochFinder::new( + fetcher.dz_rpc_client.clone(), + fetcher.solana_read_client.clone(), + ); + // Required: validate() below rejects a snapshot without a leader schedule. + // fetch_leader_schedule resolves the Solana epoch itself and reports which one it + // used, so taking the epoch from its result avoids running the chain-verified + // epoch search twice over the same timestamp. + let leader_schedule = epoch_finder + .fetch_leader_schedule(fetch_epoch, fetch_data.start_us) + .await + .with_context(|| format!("Failed to fetch leader schedule for DZ epoch {fetch_epoch}"))?; + + // Create metadata + let metadata = SnapshotMetadata { + created_at: chrono::Utc::now().to_rfc3339(), + network: orchestrator.settings().network.to_string(), + exchanges_count: fetch_data.dz_serviceability.exchanges.len(), + locations_count: fetch_data.dz_serviceability.locations.len(), + devices_count: fetch_data.dz_serviceability.devices.len(), + internet_samples_count: fetch_data.dz_internet.internet_latency_samples.len(), + device_samples_count: fetch_data.dz_telemetry.device_latency_samples.len(), + }; + + // Create complete snapshot + let snapshot = CompleteSnapshot { + dz_epoch: fetch_epoch, + solana_epoch: Some(leader_schedule.solana_epoch), + fetch_data, + leader_schedule: Some(leader_schedule), + metadata, + }; + + info!("Snapshot processing summary:"); + info!( + " - Internet accumulator: {}", + fetcher.settings.inet_lookback.enable_accumulator + ); + info!( + " - Previous epoch lookups: {}", + fetcher + .settings + .telemetry_defaults + .enable_previous_epoch_lookup + ); + info!(" - Devices: {}", snapshot.metadata.devices_count); + info!( + " - Internet samples: {}", + snapshot.metadata.internet_samples_count + ); + info!( + " - Device samples: {}", + snapshot.metadata.device_samples_count + ); + + // Determine network prefix for filename + let network_prefix = match orchestrator.settings().network { + Network::MainnetBeta | Network::Mainnet => "mn", + Network::Testnet => "tn", + Network::Devnet => "dn", + }; + + // Refuse to write a snapshot no consumer can read. Without this the command + // exits 0 having left an unusable file under the canonical name, and the + // failure surfaces a step later in whatever reads it next. + snapshot.validate()?; + + // Export: local override or configured storage + if local_file.is_some() || local_dir.is_some() { + // Save to local filesystem (ignores storage backend config) + info!("Using local file export (override)"); + + let export_options = OutputOptions { + output_format: OutputFormat::JsonPretty, + output_dir: local_dir.map(|p| p.to_string_lossy().to_string()), + output_file: local_file.map(|p| p.to_string_lossy().to_string()), + }; + + let default_filename = format!("{}-epoch-{}-snapshot", network_prefix, fetch_epoch); + export_options.write(&snapshot, &default_filename)?; + } else { + // Use storage backend from config (S3 or local-file) + info!( + "Using configured storage backend: {:?}", + orchestrator.settings().scheduler.storage_backend + ); + + let storage = storage::create_storage(orchestrator.settings()).await?; + let filename = format!("{}-epoch-{}-snapshot.json", network_prefix, fetch_epoch); + let location = storage.save(&snapshot, &filename).await?; + + info!("Snapshot saved to: {}", location); + } + + info!("Snapshot exported successfully"); + Ok(()) +} diff --git a/offchain/crates/contributor-rewards/src/cli/telemetry.rs b/offchain/crates/contributor-rewards/src/cli/telemetry.rs new file mode 100644 index 0000000000..d46ccad1f7 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/cli/telemetry.rs @@ -0,0 +1,1237 @@ +use std::{collections::BTreeMap, str::FromStr}; + +use anyhow::{Result, bail}; +use clap::Subcommand; +use serde::{Deserialize, Serialize}; +use tabled::{Table, Tabled, settings::Style}; +use tracing::info; + +use crate::{ + calculator::orchestrator::Orchestrator, + cli::{ + common::{ + FilterOptions, OutputFormat, OutputOptions, ThresholdOptions, collection_to_csv, + to_json_string, + }, + traits::Exportable, + }, + ingestor::{ + fetcher::Fetcher, + types::{DZDeviceLatencySamples, DZInternetLatencySamples, KeyedAccounts}, + }, + processor::{ + internet::{InternetTelemetryProcessor, InternetTelemetryStats}, + telemetry::{DZDTelemetryProcessor, DZDTelemetryStats}, + }, +}; + +/// Telemetry type selection +#[derive(Debug, Clone, Copy)] +pub enum TelemetryType { + Internet, + Device, + All, +} + +impl FromStr for TelemetryType { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "internet" | "i" => Ok(TelemetryType::Internet), + "device" | "d" => Ok(TelemetryType::Device), + "both" | "all" | "a" => Ok(TelemetryType::All), + _ => Err(format!( + "Invalid telemetry type: '{s}'. Use 'internet' or 'device'" + )), + } + } +} + +/// Telemetry analysis commands +#[derive(Subcommand, Debug)] +pub enum TelemetryCommands { + #[command( + about = "Calculate and display telemetry statistics", + after_help = r#"Examples: + # View internet telemetry stats for epoch 9 + telemetry stats --type internet --epoch 9 + + # View device telemetry stats as CSV + telemetry stats --type device --epoch 9 --output-format csv --output-file device-stats.csv + + # Filter internet stats by city pair + telemetry stats --type internet --epoch 9 --from-city nyc --to-city fra + + # Filter device stats by location + telemetry stats --type device --epoch 9 --city "San Francisco""# + )] + Stats { + /// Telemetry type to analyze (internet or device) + #[arg( + short = 't', + long, + value_name = "TYPE", + help = "Telemetry type: 'internet' or 'device'" + )] + telemetry_type: TelemetryType, + + /// DZ epoch to analyze + #[arg(short, long, value_name = "EPOCH")] + epoch: Option, + + /// Common filter options + #[command(flatten)] + filters: FilterOptions, + + /// Output options + #[command(flatten)] + output: OutputOptions, + }, + + #[command( + about = "Export raw telemetry samples", + after_help = r#"Examples: + # Export all internet samples for epoch 9 + telemetry export --type internet --epoch 9 --output-format json --output-file samples.json + + # Export device samples between specific locations + telemetry export --type device --epoch 9 --city "New York" --output-format csv"# + )] + Export { + /// Telemetry type to export (internet or device) + #[arg( + short = 't', + long, + value_name = "TYPE", + help = "Telemetry type: 'internet' or 'device'" + )] + telemetry_type: TelemetryType, + + /// DZ epoch to export + #[arg(short, long, value_name = "EPOCH")] + epoch: Option, + + /// Common filter options + #[command(flatten)] + filters: FilterOptions, + + /// Output options + #[command(flatten)] + output: OutputOptions, + }, + + #[command( + about = "Analyze telemetry quality and identify problematic connections", + after_help = r#"Examples: + # Find high latency internet links + telemetry analyze --type internet --epoch 9 --threshold-ms 200 + + # Find device links with packet loss + telemetry analyze --type device --epoch 9 --min-packet-loss 0.01 + + # Export analysis results + telemetry analyze --type internet --epoch 9 --output-format csv --output-file issues.csv"# + )] + Analyze { + /// Telemetry type to analyze (internet or device) + #[arg( + short = 't', + long, + value_name = "TYPE", + help = "Telemetry type: 'internet' or 'device'" + )] + telemetry_type: TelemetryType, + + /// DZ epoch to analyze + #[arg(short, long, value_name = "EPOCH")] + epoch: Option, + + /// Analysis thresholds + #[command(flatten)] + thresholds: ThresholdOptions, + + /// Output options + #[command(flatten)] + output: OutputOptions, + }, + + #[command( + about = "Calculate rent requirements for telemetry sample accounts", + after_help = r#"Examples: + # Calculate rent for device telemetry for the last epoch + telemetry rent --type device + + # Calculate rent for internet telemetry for a specific epoch + telemetry rent --type internet --epoch 123 + + # Calculate rent for both types + telemetry rent --type all + + # Export rent analysis as JSON + telemetry rent --type all --epoch 123 --output-format json --output-file rent-analysis.json"# + )] + Rent { + /// Telemetry type to analyze (device, internet, or all) + #[arg( + short = 't', + long, + value_name = "TYPE", + default_value = "all", + help = "Telemetry type: 'device', 'internet', or 'all'" + )] + telemetry_type: TelemetryType, + + /// DZ epoch to analyze (defaults to last epoch) + #[arg(short, long, value_name = "EPOCH")] + epoch: Option, + + /// Output options + #[command(flatten)] + output: OutputOptions, + }, +} + +/// Internet telemetry statistics export +#[derive(Debug, Serialize, Deserialize)] +pub struct InternetStatsExport { + pub epoch: u64, + pub total_links: usize, + pub total_samples: usize, + pub stats: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct InternetLinkStats { + pub from_city: String, + pub to_city: String, + pub samples: usize, + pub mean_latency_ms: f64, + pub median_latency_ms: f64, + pub p95_latency_ms: f64, + pub p99_latency_ms: f64, + pub packet_loss: f64, + pub jitter_ms: f64, +} + +/// Device telemetry statistics export +#[derive(Debug, Serialize, Deserialize)] +pub struct DeviceStatsExport { + pub epoch: u64, + pub total_circuits: usize, + pub total_samples: usize, + pub stats: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct DeviceLinkStats { + pub circuit: String, + pub city: String, + pub exchange: String, + pub samples: usize, + pub mean_latency_ms: f64, + pub median_latency_ms: f64, + pub p95_latency_ms: f64, + pub p99_latency_ms: f64, + pub packet_loss: f64, + pub jitter_ms: f64, + pub uptime: f64, + pub bandwidth_mbps: f64, +} + +/// Link quality analysis results +#[derive(Debug, Serialize, Deserialize)] +pub struct LinkQualityAnalysis { + pub epoch: u64, + pub telemetry_type: String, + pub issues_found: usize, + pub problematic_links: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct ProblematicLink { + pub from_location: String, + pub to_location: String, + pub issue_type: String, + pub severity: String, + pub mean_latency_ms: f64, + pub packet_loss: f64, + pub jitter_ms: f64, + pub samples: usize, +} + +/// Rent analysis for telemetry sample accounts +#[derive(Debug, Serialize, Deserialize)] +pub struct TelemetryRentAnalysis { + pub epoch: u64, + pub device_telemetry: Option, + pub internet_telemetry: Option, + pub combined_summary: RentSummary, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct TelemetryTypeRentAnalysis { + pub telemetry_type: String, + pub total_accounts: usize, + pub total_bytes: usize, + pub lamports_per_byte: u64, + pub total_rent_lamports: u64, + pub total_rent_sol: f64, + pub average_account_size_bytes: usize, + pub account_details: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct RentSummary { + pub total_accounts: usize, + pub total_bytes: usize, + pub total_rent_lamports: u64, + pub total_rent_sol: f64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AccountRentDetail { + pub pubkey: String, + pub size_bytes: usize, + pub rent_lamports: u64, +} + +// Tabled structs for displaying rent information +#[derive(Tabled)] +struct RentSummaryRow { + #[tabled(rename = "Telemetry Type")] + telemetry_type: String, + #[tabled(rename = "Accounts")] + accounts: String, + #[tabled(rename = "Total Size")] + total_size: String, + #[tabled(rename = "Avg Size")] + avg_size: String, + #[tabled(rename = "Rent (SOL)")] + rent_sol: String, +} + +#[derive(Tabled)] +struct RentTotalRow { + #[tabled(rename = "Category")] + category: String, + #[tabled(rename = "Value")] + value: String, +} + +// Implement Exportable traits +impl Exportable for InternetStatsExport { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => collection_to_csv(&self.stats), + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} + +impl Exportable for DeviceStatsExport { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => collection_to_csv(&self.stats), + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} + +impl Exportable for LinkQualityAnalysis { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => collection_to_csv(&self.problematic_links), + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} + +impl Exportable for TelemetryRentAnalysis { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => { + // For CSV, combine all account details from both types + let mut all_details = Vec::new(); + if let Some(ref device) = self.device_telemetry { + all_details.extend(device.account_details.clone()); + } + if let Some(ref internet) = self.internet_telemetry { + all_details.extend(internet.account_details.clone()); + } + collection_to_csv(&all_details) + } + OutputFormat::Json => to_json_string(self, false), + OutputFormat::JsonPretty => to_json_string(self, true), + } + } +} + +/// Handle telemetry commands +pub async fn handle(orchestrator: &Orchestrator, cmd: TelemetryCommands) -> Result<()> { + match cmd { + TelemetryCommands::Stats { + telemetry_type, + epoch, + filters, + output, + } => match telemetry_type { + TelemetryType::Internet => { + handle_internet_stats(orchestrator, epoch, filters, output).await + } + TelemetryType::Device => { + handle_device_stats(orchestrator, epoch, filters, output).await + } + TelemetryType::All => { + handle_internet_stats(orchestrator, epoch, filters.clone(), output.clone()).await?; + handle_device_stats(orchestrator, epoch, filters, output).await + } + }, + TelemetryCommands::Export { + telemetry_type, + epoch, + filters, + output, + } => match telemetry_type { + TelemetryType::Internet => { + handle_internet_export(orchestrator, epoch, filters, output).await + } + TelemetryType::Device => { + handle_device_export(orchestrator, epoch, filters, output).await + } + TelemetryType::All => { + handle_internet_export(orchestrator, epoch, filters.clone(), output.clone()) + .await?; + handle_device_export(orchestrator, epoch, filters, output).await + } + }, + TelemetryCommands::Analyze { + telemetry_type, + epoch, + thresholds, + output, + } => match telemetry_type { + TelemetryType::Internet => { + handle_internet_analyze(orchestrator, epoch, thresholds, output).await + } + TelemetryType::Device => { + handle_device_analyze(orchestrator, epoch, thresholds, output).await + } + TelemetryType::All => { + handle_internet_analyze(orchestrator, epoch, thresholds.clone(), output.clone()) + .await?; + handle_device_analyze(orchestrator, epoch, thresholds, output).await + } + }, + TelemetryCommands::Rent { + telemetry_type, + epoch, + output, + } => handle_telemetry_rent_analysis(orchestrator, telemetry_type, epoch, output).await, + } +} + +async fn handle_internet_stats( + orchestrator: &Orchestrator, + epoch: Option, + filters: FilterOptions, + output: OutputOptions, +) -> Result<()> { + info!("Calculating internet telemetry statistics"); + + // Create fetcher + let fetcher = Fetcher::from_settings(orchestrator.settings())?; + + // Fetch data for epoch + let (fetch_epoch, fetch_data) = fetcher.fetch(epoch).await?; + + info!("Processing telemetry for epoch {}", fetch_epoch); + + // Process internet telemetry + let internet_stats = InternetTelemetryProcessor::process(&fetch_data)?; + + // Filter stats if requested + let filtered_stats: BTreeMap = internet_stats + .into_iter() + .filter(|(key, _)| { + let parts: Vec<&str> = key.split('_').collect(); + if parts.len() != 2 { + return false; + } + let origin = parts[0]; + let target = parts[1]; + + let from_match = filters + .from_city + .as_ref() + .is_none_or(|city| origin.contains(city)); + let to_match = filters + .to_city + .as_ref() + .is_none_or(|city| target.contains(city)); + + from_match && to_match + }) + .collect(); + + // Convert to export format + let mut stats_list = Vec::new(); + for (route, stats) in &filtered_stats { + let parts: Vec<&str> = route.split('_').collect(); + if parts.len() == 2 { + // Extract city codes from exchange codes (remove 'x' prefix) + let from_city = parts[0].trim_start_matches('x').to_string(); + let to_city = parts[1].trim_start_matches('x').to_string(); + + stats_list.push(InternetLinkStats { + from_city, + to_city, + samples: stats.total_samples, + mean_latency_ms: stats.rtt_mean_us / 1000.0, + median_latency_ms: stats.rtt_median_us / 1000.0, + p95_latency_ms: stats.rtt_p95_us / 1000.0, + p99_latency_ms: stats.rtt_p99_us / 1000.0, + packet_loss: stats.packet_loss, + jitter_ms: stats.avg_jitter_us / 1000.0, + }); + } + } + + let stats_export = InternetStatsExport { + epoch: fetch_epoch, + total_links: stats_list.len(), + total_samples: fetch_data.dz_internet.internet_latency_samples.len(), + stats: stats_list, + }; + + // Export based on options + let export_options = OutputOptions { + output_format: output.output_format, + output_dir: output.output_dir.clone(), + output_file: output.output_file.clone(), + }; + + let default_filename = format!("internet-stats-epoch-{fetch_epoch}"); + export_options.write(&stats_export, &default_filename)?; + + info!("Internet telemetry statistics exported successfully"); + Ok(()) +} + +async fn handle_device_stats( + orchestrator: &Orchestrator, + epoch: Option, + filters: FilterOptions, + output: OutputOptions, +) -> Result<()> { + info!("Calculating device telemetry statistics"); + + // Create fetcher + let fetcher = Fetcher::from_settings(orchestrator.settings())?; + + // Fetch data for epoch + let (fetch_epoch, fetch_data) = fetcher.fetch(epoch).await?; + + info!("Processing telemetry for epoch {}", fetch_epoch); + + // Process device telemetry + let device_stats = DZDTelemetryProcessor::process(&fetch_data)?; + + // Get city for filtering (prefer city over from_city) + let city_filter = filters.city.or(filters.from_city); + + // Filter stats if requested + let filtered_stats: BTreeMap = device_stats + .into_iter() + .filter(|(_, stats)| { + // Filter by city if specified + if let Some(ref city) = city_filter + && let Some(location) = fetch_data.get_device_location(&stats.origin_device) + && !location.name.to_lowercase().contains(&city.to_lowercase()) + { + return false; + } + + // Filter by device ID if specified + if let Some(ref device_id) = filters.device + && stats.origin_device.to_string() != *device_id + && stats.target_device.to_string() != *device_id + { + return false; + } + + // Note: exchange filter removed from common FilterOptions + // To re-enable, add exchange field to FilterOptions + + true + }) + .collect(); + + // Convert to export format + let mut stats_list = Vec::new(); + for stats in filtered_stats.values() { + // Get location for origin device + let location = fetch_data + .get_device_location(&stats.origin_device) + .map(|l| l.name.clone()) + .unwrap_or_else(|| "Unknown".to_string()); + + // Get exchange for origin device + let device = fetch_data + .dz_serviceability + .devices + .get(&stats.origin_device); + let exchange = device + .and_then(|d| fetch_data.dz_serviceability.exchanges.get(&d.exchange_pk)) + .map(|e| e.code.clone()) + .unwrap_or_else(|| "Unknown".to_string()); + + stats_list.push(DeviceLinkStats { + circuit: stats.circuit.clone(), + city: location, + exchange, + samples: stats.total_samples, + mean_latency_ms: stats.rtt_mean_us / 1000.0, + median_latency_ms: stats.rtt_median_us / 1000.0, + p95_latency_ms: stats.rtt_p95_us / 1000.0, + p99_latency_ms: stats.rtt_p99_us / 1000.0, + packet_loss: stats.packet_loss, + jitter_ms: stats.avg_jitter_us / 1000.0, + uptime: 1.0, // Default for now + bandwidth_mbps: 1000.0, // Default for now + }); + } + + let stats_export = DeviceStatsExport { + epoch: fetch_epoch, + total_circuits: stats_list.len(), + total_samples: fetch_data.dz_telemetry.device_latency_samples.len(), + stats: stats_list, + }; + + // Export based on options + let export_options = OutputOptions { + output_format: output.output_format, + output_dir: output.output_dir.clone(), + output_file: output.output_file.clone(), + }; + + let default_filename = format!("device-stats-epoch-{fetch_epoch}"); + export_options.write(&stats_export, &default_filename)?; + + info!("Device telemetry statistics exported successfully"); + Ok(()) +} + +async fn handle_internet_export( + orchestrator: &Orchestrator, + epoch: Option, + filters: FilterOptions, + output: OutputOptions, +) -> Result<()> { + info!("Exporting internet telemetry samples"); + + // Create fetcher + let fetcher = Fetcher::from_settings(orchestrator.settings())?; + + // Fetch data for epoch + let (fetch_epoch, fetch_data) = fetcher.fetch(epoch).await?; + + // Filter samples if requested + let samples = if filters.from_city.is_some() || filters.to_city.is_some() { + let exchanges = &fetch_data.dz_serviceability.exchanges; + fetch_data + .dz_internet + .internet_latency_samples + .into_iter() + .filter(|sample| { + let origin_exchange = exchanges.get(&sample.origin_exchange_pk); + let target_exchange = exchanges.get(&sample.target_exchange_pk); + + if let (Some(origin), Some(target)) = (origin_exchange, target_exchange) { + let from_match = filters + .from_city + .as_ref() + .is_none_or(|city| origin.code.contains(city)); + let to_match = filters + .to_city + .as_ref() + .is_none_or(|city| target.code.contains(city)); + from_match && to_match + } else { + false + } + }) + .collect() + } else { + fetch_data.dz_internet.internet_latency_samples + }; + + info!("Exporting {} samples", samples.len()); + + // Export based on options + let export_options = OutputOptions { + output_format: output.output_format, + output_dir: output.output_dir.clone(), + output_file: output.output_file.clone(), + }; + + // Create export wrapper + #[derive(Serialize)] + struct SamplesExport { + epoch: u64, + count: usize, + samples: Vec, + } + + let export_data = SamplesExport { + epoch: fetch_epoch, + count: samples.len(), + samples, + }; + + let default_filename = format!("internet-samples-epoch-{fetch_epoch}"); + + // Manual export since we don't have Exportable for raw samples + let output_str = match output.output_format { + OutputFormat::Csv => { + bail!("Unsupported! Use --output-format json or json-pretty instead.") + } + OutputFormat::Json => to_json_string(&export_data, false)?, + OutputFormat::JsonPretty => to_json_string(&export_data, true)?, + }; + + if let Some(ref file) = export_options.output_file { + std::fs::write(file, output_str)?; + info!("Exported to {}", file); + } else if let Some(ref dir) = export_options.output_dir { + std::fs::create_dir_all(dir)?; + let ext = match export_options.output_format { + OutputFormat::Csv => "csv", + _ => "json", + }; + let path = format!("{dir}/{default_filename}.{ext}"); + std::fs::write(&path, output_str)?; + info!("Exported to {path}"); + } else { + println!("{output_str}"); + } + + Ok(()) +} + +async fn handle_device_export( + orchestrator: &Orchestrator, + epoch: Option, + filters: FilterOptions, + output: OutputOptions, +) -> Result<()> { + info!("Exporting device telemetry samples"); + + // Create fetcher + let fetcher = Fetcher::from_settings(orchestrator.settings())?; + + // Fetch data for epoch + let (fetch_epoch, fetch_data) = fetcher.fetch(epoch).await?; + + // Get city for filtering (prefer city over from_city) + let city_filter = filters.city.or(filters.from_city); + + // Filter samples if requested + let samples = if city_filter.is_some() || filters.device.is_some() { + let _exchanges = &fetch_data.dz_serviceability.exchanges; + fetch_data + .dz_telemetry + .device_latency_samples + .into_iter() + .filter(|sample| { + let device_match = filters.device.as_ref().is_none_or(|id| { + sample.origin_device_pk.to_string() == *id + || sample.target_device_pk.to_string() == *id + }); + + let city_match = city_filter.is_none(); // Skip city filtering for now + + device_match && city_match + }) + .collect() + } else { + fetch_data.dz_telemetry.device_latency_samples + }; + + info!("Exporting {} samples", samples.len()); + + // Export based on options + let export_options = OutputOptions { + output_format: output.output_format, + output_dir: output.output_dir.clone(), + output_file: output.output_file.clone(), + }; + + // Create export wrapper + #[derive(Serialize)] + struct SamplesExport { + epoch: u64, + count: usize, + samples: Vec, + } + + let export_data = SamplesExport { + epoch: fetch_epoch, + count: samples.len(), + samples, + }; + + let default_filename = format!("device-samples-epoch-{fetch_epoch}"); + + // Manual export since we don't have Exportable for raw samples + let output_str = match output.output_format { + OutputFormat::Csv => { + bail!("Unsupported! Use --output-format json or json-pretty instead.") + } + OutputFormat::Json => to_json_string(&export_data, false)?, + OutputFormat::JsonPretty => to_json_string(&export_data, true)?, + }; + + if let Some(ref file) = export_options.output_file { + std::fs::write(file, output_str)?; + info!("Exported to {}", file); + } else if let Some(ref dir) = export_options.output_dir { + std::fs::create_dir_all(dir)?; + let ext = match export_options.output_format { + OutputFormat::Csv => "csv", + _ => "json", + }; + let path = format!("{dir}/{default_filename}.{ext}"); + std::fs::write(&path, output_str)?; + info!("Exported to {path}"); + } else { + println!("{output_str}"); + } + + Ok(()) +} + +async fn handle_internet_analyze( + orchestrator: &Orchestrator, + epoch: Option, + thresholds: ThresholdOptions, + output: OutputOptions, +) -> Result<()> { + info!("Analyzing internet link quality"); + + // Create fetcher + let fetcher = Fetcher::from_settings(orchestrator.settings())?; + + // Fetch data for epoch + let (fetch_epoch, fetch_data) = fetcher.fetch(epoch).await?; + + // Process internet telemetry + let internet_stats = InternetTelemetryProcessor::process(&fetch_data)?; + + // Default thresholds + let latency_threshold = thresholds.threshold_ms.unwrap_or(200.0); + let packet_loss_threshold = thresholds.min_packet_loss.unwrap_or(0.01); + let jitter_threshold = thresholds.min_jitter.unwrap_or(50.0); + + // Find problematic links + let mut problematic_links = Vec::new(); + for (route, stats) in &internet_stats { + let parts: Vec<&str> = route.split('_').collect(); + if parts.len() != 2 { + continue; + } + + let from_city = parts[0].trim_start_matches('x').to_string(); + let to_city = parts[1].trim_start_matches('x').to_string(); + + let mut issues = Vec::new(); + let mut severity = "low"; + + let mean_latency_ms = stats.rtt_mean_us / 1000.0; + let jitter_ms = stats.avg_jitter_us / 1000.0; + + if mean_latency_ms > latency_threshold { + issues.push("high_latency"); + if mean_latency_ms > latency_threshold * 2.0 { + severity = "high"; + } else { + severity = "medium"; + } + } + + if stats.packet_loss > packet_loss_threshold { + issues.push("packet_loss"); + if stats.packet_loss > 0.05 { + severity = "high"; + } else if severity == "low" { + severity = "medium"; + } + } + + if jitter_ms > jitter_threshold { + issues.push("high_jitter"); + if severity == "low" { + severity = "medium"; + } + } + + if !issues.is_empty() { + problematic_links.push(ProblematicLink { + from_location: from_city, + to_location: to_city, + issue_type: issues.join(", "), + severity: severity.to_string(), + mean_latency_ms, + packet_loss: stats.packet_loss, + jitter_ms, + samples: stats.total_samples, + }); + } + } + + // Sort by severity and latency + problematic_links.sort_by(|a, b| { + let sev_order = |s: &str| match s { + "high" => 0, + "medium" => 1, + _ => 2, + }; + sev_order(&a.severity) + .cmp(&sev_order(&b.severity)) + .then(b.mean_latency_ms.partial_cmp(&a.mean_latency_ms).unwrap()) + }); + + let analysis = LinkQualityAnalysis { + epoch: fetch_epoch, + telemetry_type: "internet".to_string(), + issues_found: problematic_links.len(), + problematic_links, + }; + + // Export based on options + let export_options = OutputOptions { + output_format: output.output_format, + output_dir: output.output_dir.clone(), + output_file: output.output_file.clone(), + }; + + let default_filename = format!("internet-analysis-epoch-{fetch_epoch}"); + export_options.write(&analysis, &default_filename)?; + + info!( + "Internet link quality analysis complete: {} issues found", + analysis.issues_found + ); + Ok(()) +} + +async fn handle_device_analyze( + orchestrator: &Orchestrator, + epoch: Option, + thresholds: ThresholdOptions, + output: OutputOptions, +) -> Result<()> { + info!("Analyzing device performance"); + + // Create fetcher + let fetcher = Fetcher::from_settings(orchestrator.settings())?; + + // Fetch data for epoch + let (fetch_epoch, fetch_data) = fetcher.fetch(epoch).await?; + + // Process device telemetry + let device_stats = DZDTelemetryProcessor::process(&fetch_data)?; + + // Default thresholds + let latency_threshold = thresholds.threshold_ms.unwrap_or(100.0); + let _uptime_threshold = thresholds.min_uptime.unwrap_or(0.95); + // Note: min_bandwidth removed from common ThresholdOptions + // To re-enable, add min_bandwidth field to ThresholdOptions + + // Find problematic devices + let mut problematic_links = Vec::new(); + for (route, stats) in &device_stats { + let parts: Vec<&str> = route.split('_').collect(); + if parts.len() != 2 { + continue; + } + + let from_device = parts[0].to_string(); + let to_device = parts[1].to_string(); + + let mut issues = Vec::new(); + let mut severity = "low"; + + let mean_latency_ms = stats.rtt_mean_us / 1000.0; + let jitter_ms = stats.avg_jitter_us / 1000.0; + + if mean_latency_ms > latency_threshold { + issues.push("high_latency"); + if mean_latency_ms > latency_threshold * 2.0 { + severity = "high"; + } else { + severity = "medium"; + } + } + + if stats.packet_loss > 0.01 { + issues.push("packet_loss"); + if stats.packet_loss > 0.05 { + severity = "high"; + } else if severity == "low" { + severity = "medium"; + } + } + + if jitter_ms > 20.0 { + issues.push("high_jitter"); + if severity == "low" { + severity = "medium"; + } + } + + if !issues.is_empty() { + problematic_links.push(ProblematicLink { + from_location: from_device, + to_location: to_device, + issue_type: issues.join(", "), + severity: severity.to_string(), + mean_latency_ms, + packet_loss: stats.packet_loss, + jitter_ms, + samples: stats.total_samples, + }); + } + } + + // Sort by severity and latency + problematic_links.sort_by(|a, b| { + let sev_order = |s: &str| match s { + "high" => 0, + "medium" => 1, + _ => 2, + }; + sev_order(&a.severity) + .cmp(&sev_order(&b.severity)) + .then(b.mean_latency_ms.partial_cmp(&a.mean_latency_ms).unwrap()) + }); + + let analysis = LinkQualityAnalysis { + epoch: fetch_epoch, + telemetry_type: "device".to_string(), + issues_found: problematic_links.len(), + problematic_links, + }; + + // Export based on options + let export_options = OutputOptions { + output_format: output.output_format, + output_dir: output.output_dir.clone(), + output_file: output.output_file.clone(), + }; + + let default_filename = format!("device-analysis-epoch-{fetch_epoch}"); + export_options.write(&analysis, &default_filename)?; + + info!( + "Device performance analysis complete: {} issues found", + analysis.issues_found + ); + Ok(()) +} + +async fn handle_telemetry_rent_analysis( + orchestrator: &Orchestrator, + telemetry_type: TelemetryType, + epoch: Option, + output: OutputOptions, +) -> Result<()> { + const LAMPORTS_PER_BYTE: u64 = 6_960; + const LAMPORTS_PER_SOL: f64 = 1_000_000_000.0; + + info!("Calculating rent requirements for telemetry accounts"); + + // Fetch all data + let fetcher = Fetcher::from_settings(orchestrator.settings())?; + let (fetch_epoch, fetch_data) = fetcher.fetch(epoch).await?; + + // Helper function to analyze account rent + fn analyze_rent(accounts: &KeyedAccounts, telemetry_type: &str) -> TelemetryTypeRentAnalysis { + let mut total_bytes = 0usize; + let mut account_details = Vec::new(); + + for (pubkey, account) in accounts { + let size = account.data.len(); + total_bytes += size; + + account_details.push(AccountRentDetail { + pubkey: pubkey.to_string(), + size_bytes: size, + rent_lamports: size as u64 * LAMPORTS_PER_BYTE, + }); + } + + let total_rent_lamports = total_bytes as u64 * LAMPORTS_PER_BYTE; + let total_rent_sol = total_rent_lamports as f64 / LAMPORTS_PER_SOL; + let avg_size = if accounts.is_empty() { + 0 + } else { + total_bytes / accounts.len() + }; + + TelemetryTypeRentAnalysis { + telemetry_type: telemetry_type.to_string(), + total_accounts: accounts.len(), + total_bytes, + lamports_per_byte: LAMPORTS_PER_BYTE, + total_rent_lamports, + total_rent_sol, + average_account_size_bytes: avg_size, + account_details, + } + } + + // Analyze accounts based on type using the fetched data + let mut device_analysis = None; + let mut internet_analysis = None; + + match telemetry_type { + TelemetryType::Device => { + device_analysis = Some(analyze_rent(&fetch_data.dz_telemetry.accounts, "device")); + } + TelemetryType::Internet => { + internet_analysis = Some(analyze_rent(&fetch_data.dz_internet.accounts, "internet")); + } + TelemetryType::All => { + device_analysis = Some(analyze_rent(&fetch_data.dz_telemetry.accounts, "device")); + internet_analysis = Some(analyze_rent(&fetch_data.dz_internet.accounts, "internet")); + } + } + + // Calculate combined summary + let mut total_accounts = 0; + let mut total_bytes = 0; + let mut total_rent_lamports = 0; + + if let Some(ref device) = device_analysis { + total_accounts += device.total_accounts; + total_bytes += device.total_bytes; + total_rent_lamports += device.total_rent_lamports; + } + + if let Some(ref internet) = internet_analysis { + total_accounts += internet.total_accounts; + total_bytes += internet.total_bytes; + total_rent_lamports += internet.total_rent_lamports; + } + + let combined_summary = RentSummary { + total_accounts, + total_bytes, + total_rent_lamports, + total_rent_sol: total_rent_lamports as f64 / LAMPORTS_PER_SOL, + }; + + let analysis = TelemetryRentAnalysis { + epoch: fetch_epoch, + device_telemetry: device_analysis, + internet_telemetry: internet_analysis, + combined_summary, + }; + + // Display summary + println!(); + println!("Telemetry Accounts Rent Analysis - Epoch {fetch_epoch}"); + println!("=================================================\n"); + + // Build table rows + let mut rows = Vec::new(); + + if let Some(ref device) = analysis.device_telemetry { + rows.push(RentSummaryRow { + telemetry_type: "Device".to_string(), + accounts: format!("{}", device.total_accounts), + total_size: format!( + "{} bytes ({:.2} MB)", + device.total_bytes, + device.total_bytes as f64 / (1024.0 * 1024.0) + ), + avg_size: format!("{} bytes", device.average_account_size_bytes), + rent_sol: format!("{:.6} SOL", device.total_rent_sol), + }); + } + + if let Some(ref internet) = analysis.internet_telemetry { + rows.push(RentSummaryRow { + telemetry_type: "Internet".to_string(), + accounts: format!("{}", internet.total_accounts), + total_size: format!( + "{} bytes ({:.2} MB)", + internet.total_bytes, + internet.total_bytes as f64 / (1024.0 * 1024.0) + ), + avg_size: format!("{} bytes", internet.average_account_size_bytes), + rent_sol: format!("{:.6} SOL", internet.total_rent_sol), + }); + } + + // Display telemetry breakdown table + if !rows.is_empty() { + let table = Table::new(rows) + .with(Style::psql().remove_horizontals()) + .to_string(); + println!("{table}"); + } + + // Display combined summary table + println!("\nCombined Summary:"); + let total_rows = vec![ + RentTotalRow { + category: "Total Accounts".to_string(), + value: format!("{}", analysis.combined_summary.total_accounts), + }, + RentTotalRow { + category: "Total Size".to_string(), + value: format!( + "{} bytes ({:.2} MB)", + analysis.combined_summary.total_bytes, + analysis.combined_summary.total_bytes as f64 / (1024.0 * 1024.0) + ), + }, + RentTotalRow { + category: "Rent per Byte".to_string(), + value: format!("{LAMPORTS_PER_BYTE} lamports"), + }, + RentTotalRow { + category: "Total Rent Required".to_string(), + value: format!( + "{:.6} SOL ({} lamports)", + analysis.combined_summary.total_rent_sol, + analysis.combined_summary.total_rent_lamports + ), + }, + ]; + + let total_table = Table::new(total_rows) + .with(Style::psql().remove_horizontals()) + .to_string(); + println!("{total_table}"); + println!(); + + // Export based on options + let export_options = OutputOptions { + output_format: output.output_format, + output_dir: output.output_dir.clone(), + output_file: output.output_file.clone(), + }; + + let default_filename = format!("telemetry-rent-analysis-epoch-{fetch_epoch}"); + export_options.write(&analysis, &default_filename)?; + + info!("Telemetry accounts rent analysis complete"); + Ok(()) +} diff --git a/offchain/crates/contributor-rewards/src/cli/traits.rs b/offchain/crates/contributor-rewards/src/cli/traits.rs new file mode 100644 index 0000000000..f81a58a718 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/cli/traits.rs @@ -0,0 +1,32 @@ +use anyhow::Result; +use serde::Serialize; + +use crate::cli::common::OutputFormat; + +/// Trait for types that can be exported to various formats +pub trait Exportable { + fn export(&self, format: OutputFormat) -> Result; + + /// Default implementation for CSV export + fn to_csv(&self) -> Result + where + Self: Serialize, + { + let mut wtr = csv::Writer::from_writer(vec![]); + wtr.serialize(self)?; + let data = wtr.into_inner()?; + Ok(String::from_utf8(data)?) + } + + /// Default implementation for JSON export + fn to_json(&self, pretty: bool) -> Result + where + Self: Serialize, + { + if pretty { + Ok(serde_json::to_string_pretty(self)?) + } else { + Ok(serde_json::to_string(self)?) + } + } +} diff --git a/offchain/crates/contributor-rewards/src/ingestor/demand.rs b/offchain/crates/contributor-rewards/src/ingestor/demand.rs new file mode 100644 index 0000000000..fb38582e47 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/ingestor/demand.rs @@ -0,0 +1,353 @@ +use std::collections::BTreeMap; + +use anyhow::{Result, anyhow, bail}; +use doublezero_serviceability::state::user::{User as DZUser, UserStatus, UserType}; +use network_shapley::types::{Demand, Demands}; +use rayon::prelude::*; +use tracing::info; + +use crate::{ + ingestor::{ + epoch::{EpochFinder, LeaderSchedule}, + fetcher::Fetcher, + types::FetchData, + }, + settings::{DemandSettings, Settings, network::Network}, +}; + +// key: location code, val: city stat +pub type CityStats = BTreeMap; + +/// Statistics for validators in a city +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct CityStat { + /// Number of validators in this city + pub validator_count: usize, + /// Sum of all validator stake proxies (leader schedule lengths) in this city + pub total_stake_proxy: usize, + /// Live multicast subscriber count for this city, derived from User accounts + pub subscriber_count: u16, + /// Metro price (whole USDC dollars) for this city + pub city_price: u16, +} + +/// Result of demand building containing both demands and city statistics +pub struct DemandBuildOutput { + pub demands: Demands, + pub city_stats: CityStats, +} + +/// Builds demand tables for network traffic simulation based on validator distribution +/// +/// This function: +/// 1. Filters validators from users who have non-system validator pubkeys +/// 2. Maps validators to their geographic locations +/// 3. Aggregates validators by city with their stake weights +/// 4. Generates demand entries for all city-to-city traffic pairs +pub async fn build(fetcher: &Fetcher, fetch_data: &FetchData) -> Result { + // Get first telemetry sample to extract epoch and timestamp + let first_sample = fetch_data + .dz_telemetry + .device_latency_samples + .first() + .ok_or_else(|| anyhow!("No telemetry data found to determine DZ epoch"))?; + + let dz_epoch = first_sample.epoch; + info!("Building demands for DZ epoch {}", dz_epoch); + + // Get the timestamp from first_sample + let timestamp_us = first_sample.start_timestamp_us; + assert_ne!(0, timestamp_us, "First sample timestamp is 0!"); + + // Create an EpochFinder with explicit RPC clients + let mut epoch_finder = EpochFinder::new( + fetcher.dz_rpc_client.clone(), + fetcher.solana_read_client.clone(), + ); + + // Fetch leader schedule for this DZ epoch + let leader_schedule = epoch_finder + .fetch_leader_schedule(dz_epoch, timestamp_us) + .await?; + + build_with_schedule(&fetcher.settings, fetch_data, &leader_schedule) +} + +/// Builds demands using pre-fetched leader schedule data +/// NOTE: This allows testing without RPC calls +pub fn build_with_schedule( + settings: &Settings, + fetch_data: &FetchData, + leader_schedule: &LeaderSchedule, +) -> Result { + // Process users and collect all (validator_pubkey, user) pairs + // NOTE: Use user.validator_pubkey directly (matching R's approach) + // Multiple users can share the same validator_pubkey, so we keep all pairs + // R includes ALL users, even those with SystemProgram validator (they get 0 slots) + let mut validator_user_pairs: Vec<(String, &DZUser)> = Vec::new(); + + for user in fetch_data.dz_serviceability.users.values() { + validator_user_pairs.push((user.validator_pubkey.to_string(), user)); + } + + info!("Total user-validator pairs: {}", validator_user_pairs.len()); + + if validator_user_pairs.is_empty() { + bail!("Did not find any validators to build demands!") + } + + // Process leaders and build city statistics + let city_stats = + build_city_stats(settings, fetch_data, &validator_user_pairs, leader_schedule)?; + if city_stats.is_empty() { + bail!("Could not build any city_stats!") + } + + // Generate demands + let demands = generate(&city_stats, &settings.demand); + if demands.is_empty() { + bail!("Could not build any demands!") + } + + Ok(DemandBuildOutput { + demands, + city_stats, + }) +} + +/// Build city statistics from fetch data and leader schedule +pub fn build_city_stats( + settings: &Settings, + fetch_data: &FetchData, + validator_user_pairs: &[(String, &DZUser)], + leader_schedule: &LeaderSchedule, +) -> Result { + let mut city_stats = CityStats::new(); + + // Debug: Track what we're processing + let total_validators_in_schedule = leader_schedule.schedule_map.len(); + let total_slots_in_schedule: usize = leader_schedule.schedule_map.values().sum(); + let total_user_validator_pairs = validator_user_pairs.len(); + + info!("=== City Stats Debug ==="); + info!( + "Total validators in leader schedule: {}", + total_validators_in_schedule + ); + info!( + "Total slots in leader schedule: {}", + total_slots_in_schedule + ); + info!("User-validator pairs: {}", total_user_validator_pairs); + + let mut processed_user_validator_pairs = 0; + let mut processed_slots = 0; + let mut pairs_without_device = 0; + + // Process each user-validator pair + // Note: R includes ALL users with devices, even if not in leader_schedule (assigns 0 slots) + for (validator_pubkey, user) in validator_user_pairs { + // Get stake_proxy from leader schedule, default to 0 if not found (matching R's all.x = TRUE) + let stake_proxy = leader_schedule + .schedule_map + .get(validator_pubkey) + .copied() + .unwrap_or(0); + + if let Some(device) = fetch_data.dz_serviceability.devices.get(&user.device_pk) + && let Some(location) = fetch_data + .dz_serviceability + .locations + .get(&device.location_pk) + { + if let Some(exchange) = fetch_data + .dz_serviceability + .exchanges + .get(&device.exchange_pk) + { + let city_code = match settings.network { + Network::Testnet | Network::Devnet => location.code.to_uppercase(), + // On mainnet, the exchange.code directly has the name of the city + Network::MainnetBeta | Network::Mainnet => exchange.code.to_uppercase(), + }; + + let stats = city_stats.entry(city_code).or_insert(CityStat { + validator_count: 0, + total_stake_proxy: 0, + subscriber_count: 0, + city_price: 0, + }); + stats.validator_count += 1; + stats.total_stake_proxy += stake_proxy; + + processed_user_validator_pairs += 1; + processed_slots += stake_proxy; + } + } else { + pairs_without_device += 1; + } + } + + info!( + "Processed user-validator pairs: {}", + processed_user_validator_pairs + ); + info!("Processed slots: {}", processed_slots); + info!("Pairs without device: {}", pairs_without_device); + info!("R expects: 422 user-validator pairs, 97548 slots"); + + // Populate subscriber counts from live User accounts, not from denormalized + // Device counters. Device counters can be stale and, more importantly, can be + // misread by older serviceability decoders when the live account contains a + // newer interface variant before the counter fields. User accounts are the + // source of truth and match the serviceability migration command's tallying. + for user in fetch_data.dz_serviceability.users.values() { + let is_live = !matches!( + user.status, + UserStatus::RejectedDeprecated | UserStatus::Banned | UserStatus::PendingBanDeprecated + ); + if user.user_type != UserType::Multicast || !is_live || user.is_publisher() { + continue; + } + + let Some(device) = fetch_data.dz_serviceability.devices.get(&user.device_pk) else { + continue; + }; + // Need valid contributor and exchange + let Some(_contributor) = fetch_data + .dz_serviceability + .contributors + .get(&device.contributor_pk) + else { + continue; + }; + let Some(exchange) = fetch_data + .dz_serviceability + .exchanges + .get(&device.exchange_pk) + else { + continue; + }; + + let city_code = match settings.network { + Network::Testnet | Network::Devnet => exchange + .code + .strip_prefix('x') + .unwrap_or(&exchange.code) + .to_uppercase(), + Network::MainnetBeta | Network::Mainnet => exchange.code.to_uppercase(), + }; + + let stats = city_stats.entry(city_code).or_insert(CityStat { + validator_count: 0, + total_stake_proxy: 0, + subscriber_count: 0, + city_price: 0, + }); + stats.subscriber_count = stats.subscriber_count.saturating_add(1); + } + + // Populate city prices from metro_prices + for (exchange_pk, price) in fetch_data.metro_prices.iter() { + if let Some(exchange) = fetch_data.dz_serviceability.exchanges.get(exchange_pk) { + let city_code = match settings.network { + Network::Testnet | Network::Devnet => exchange + .code + .strip_prefix('x') + .unwrap_or(&exchange.code) + .to_uppercase(), + Network::MainnetBeta | Network::Mainnet => exchange.code.to_uppercase(), + }; + if let Some(stats) = city_stats.get_mut(&city_code) { + stats.city_price = *price; + } + } + } + + // Log per-city stats + info!("Per-city statistics:"); + let mut sorted_cities: Vec<_> = city_stats.iter().collect(); + sorted_cities.sort_by(|a, b| b.1.total_stake_proxy.cmp(&a.1.total_stake_proxy)); + for (city, stats) in sorted_cities.iter().take(5) { + info!( + " {}: validators={}, slots={}, subscribers={}, price={}", + city, + stats.validator_count, + stats.total_stake_proxy, + stats.subscriber_count, + stats.city_price + ); + } + + Ok(city_stats) +} + +/// Generates demand entries for cities (IBRL + shred rows) +pub fn generate(city_stats: &CityStats, demand_settings: &DemandSettings) -> Demands { + // Source cities: cities with validators (used for both IBRL and shred) + let cities_with_validators: Vec<(&String, &CityStat)> = city_stats + .iter() + .filter(|(_, stats)| stats.validator_count > 0) + .collect(); + + // Shred destination cities: cities with subscribers AND city_price > 0 + let cities_with_subscribers: Vec<(&String, &CityStat)> = city_stats + .iter() + .filter(|(_, stats)| stats.subscriber_count > 0 && stats.city_price > 0) + .collect(); + + // Generate IBRL demands (validator-to-validator, priority = demand_settings.priority) + let ibrl_demands: Vec = cities_with_validators + .par_iter() + .flat_map(|(start_city, _start_stats)| { + let start_city_upper = start_city.to_uppercase(); + cities_with_validators + .iter() + .filter_map(|(end_city, end_stats)| { + if start_city == end_city { + return None; + } + + let end_city_upper = end_city.to_uppercase(); + + Some(Demand { + start: start_city_upper.clone(), + end: end_city_upper, + receivers: end_stats.validator_count as u32, + traffic: demand_settings.traffic, + priority: demand_settings.priority, + kind: demand_settings.kind, + multicast: demand_settings.multicast_enabled, + }) + }) + .collect::>() + }) + .collect(); + + // Generate shred demands (validator-to-subscriber, priority = city_price) + // Note: includes intra-city (start == end) because multicast traffic + // goes over DZ even within a metro, unlike IBRL. + let shred_demands: Vec = cities_with_validators + .par_iter() + .flat_map(|(start_city, _start_stats)| { + let start_city_upper = start_city.to_uppercase(); + cities_with_subscribers + .iter() + .map(|(end_city, end_stats)| Demand { + start: start_city_upper.clone(), + end: end_city.to_uppercase(), + receivers: end_stats.subscriber_count as u32, + traffic: demand_settings.traffic, + priority: end_stats.city_price as f64, + kind: demand_settings.shred_kind, + multicast: demand_settings.shred_multicast_enabled, + }) + .collect::>() + }) + .collect(); + + // Combine both into a single Vec + let mut demands = ibrl_demands; + demands.extend(shred_demands); + demands +} diff --git a/offchain/crates/contributor-rewards/src/ingestor/epoch.rs b/offchain/crates/contributor-rewards/src/ingestor/epoch.rs new file mode 100644 index 0000000000..9c93d5543e --- /dev/null +++ b/offchain/crates/contributor-rewards/src/ingestor/epoch.rs @@ -0,0 +1,866 @@ +//! Epoch calculation utilities for mapping timestamps to Solana epochs +//! +//! This module provides functionality to: +//! - Estimate slots from timestamps +//! - Find epochs corresponding to specific timestamps + +use std::{collections::BTreeMap, sync::Arc, time::Duration}; + +use anyhow::{Context, Result, anyhow, bail, ensure}; +use backon::{ExponentialBuilder, Retryable}; +use chrono::Utc; +use doublezero_solana_client_tools::rpc::DoubleZeroLedgerConnection; +use serde::{Deserialize, Serialize}; +use solana_client::{ + client_error::{ClientError as SolanaClientError, ClientErrorKind}, + nonblocking::rpc_client::RpcClient, + rpc_custom_error::{ + JSON_RPC_SERVER_ERROR_BLOCK_CLEANED_UP, JSON_RPC_SERVER_ERROR_BLOCK_NOT_AVAILABLE, + JSON_RPC_SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED, JSON_RPC_SERVER_ERROR_SLOT_SKIPPED, + }, + rpc_request::RpcError, +}; +use solana_sdk::epoch_schedule::EpochSchedule; +use tracing::{debug, info}; + +use crate::cli::{ + common::{OutputFormat, to_json_string}, + traits::Exportable, +}; + +// Seed slot duration for the epoch search in `find_epoch_at_timestamp`. What +// matters is the direction of the error, not its size, so this is deliberately +// slower than any real cluster rate rather than close to one. +// +// Dividing elapsed wall clock by a value above the real rate under-counts the +// slots elapsed, seeding at or after the epoch being looked for, so the search +// walks backward only and never probes older than the answer's own epoch. A +// value below the real rate probes older than the target instead, which can fall +// outside the endpoint's retention and fail the search for a target that is +// itself readable. The margin costs search steps, roughly one extra epoch of +// backward walk per two days of lookback. +const SEED_SLOT_DURATION_US: u64 = 500_000; + +// 400_000 is mainnet-beta's rate until epoch 1020 (2026-08-21) and the slowest +// any cluster runs; every step of the SIMD-0525 rollout only lowers it. +const _: () = assert!(SEED_SLOT_DURATION_US > 400_000); + +// `getSlot` can name a slot that has no block yet, so the chain tip lookup walks +// backward from it. A tip that needs more than this many slots to find a block is +// a stalled cluster rather than a run of skipped slots. +const MAX_CHAIN_TIP_SEARCH_SLOTS: u64 = 128; + +// How far past an epoch's first slot that epoch's first block may be and still be +// trusted to date the epoch. +// +// `getBlocksWithLimit` steps over a gap in the endpoint's own block history +// without saying that it did, so the slot it returns cannot by itself tell a +// routine run of skipped boundary slots from a node restored from a snapshot +// partway through the epoch. Distance is the tell: dating an epoch by a block +// that far in overstates when the epoch began by the length of the gap, and +// timestamps inside the gap then resolve to the previous epoch and pick up its +// leader schedule. +// +// 432 slots is 0.1% of a mainnet epoch, around two and a half minutes, chosen to +// sit far above any routine skip run and far below a gap worth guessing through. +const MAX_BOUNDARY_SKIP_SLOTS: u64 = 432; + +// Each search step moves the candidate by one epoch. The seed is normally within +// an epoch or two of correct, so this cap exists only to bound a pathological +// seed rather than loop forever. +const MAX_EPOCH_SEARCH_STEPS: usize = 16; + +// key: validator_pk, val: slot count +pub type LeaderScheduleMap = BTreeMap; + +// Wrapper struct for leader scheduler +#[derive(Debug, Serialize, Deserialize)] +pub struct LeaderSchedule { + pub solana_epoch: u64, + pub schedule_map: LeaderScheduleMap, +} + +impl Exportable for LeaderSchedule { + fn export(&self, format: OutputFormat) -> Result { + match format { + OutputFormat::Csv => { + bail!("CSV export not supported for leader schedule. Use JSON format instead.") + } + OutputFormat::Json => to_json_string(&self, false), + OutputFormat::JsonPretty => to_json_string(&self, true), + } + } +} + +/// Report whether an RPC error means the slot has no block to report a time for, +/// as opposed to the request itself failing. +/// +/// `getBlockTime` says this in three ways depending on what the endpoint has +/// behind it, and missing any one of them fails the search on endpoints of that +/// shape: a validator with long term storage answers with a coded skipped-slot +/// error, one without it answers with a JSON `null` that +/// `RpcClient::get_block_time` turns into `RpcError::ForUser("Block Not +/// Found: ...")`, and a slot the endpoint has not rooted yet is reported as +/// block-not-available. +/// +/// `JSON_RPC_SERVER_ERROR_BLOCK_CLEANED_UP` is deliberately excluded, because a +/// pruned ledger means the answer is unknowable rather than absent. See +/// [`is_block_cleaned_up`]. +fn is_block_unavailable(err: &SolanaClientError) -> bool { + match err.kind() { + ClientErrorKind::RpcError(RpcError::RpcResponseError { code, .. }) => matches!( + *code, + JSON_RPC_SERVER_ERROR_SLOT_SKIPPED + | JSON_RPC_SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED + | JSON_RPC_SERVER_ERROR_BLOCK_NOT_AVAILABLE + ), + ClientErrorKind::RpcError(RpcError::ForUser(message)) => { + message.starts_with("Block Not Found") + } + _ => false, + } +} + +/// Report whether an RPC error means the ledger no longer holds the slot. +/// +/// This fails a lookup rather than counting as an absent block, since the block +/// time is gone rather than nonexistent. It is just as settled, so it is not +/// worth retrying either. +fn is_block_cleaned_up(err: &SolanaClientError) -> bool { + matches!( + err.kind(), + ClientErrorKind::RpcError(RpcError::RpcResponseError { + code: JSON_RPC_SERVER_ERROR_BLOCK_CLEANED_UP, + .. + }) + ) +} + +/// Report whether an RPC error is settled, meaning a retry would sleep through +/// the backoff schedule only to be told the same thing. +fn is_settled_block_error(err: &SolanaClientError) -> bool { + is_block_unavailable(err) || is_block_cleaned_up(err) +} + +// `reqwest::Error`, which `ClientErrorKind::Reqwest` is transparent over, prints the +// request URL from both `Debug` and `Display`. On mainnet-beta that URL carries the +// read endpoint's API key, and journald ships to Loki, so logging the error verbatim +// publishes the key on every timeout and every 429. +fn redacted(err: &SolanaClientError) -> String { + let text = format!("{err:?}"); + + match err.kind() { + ClientErrorKind::Reqwest(inner) => match inner.url() { + Some(url) => text.replace(url.as_str(), ""), + None => text, + }, + _ => text, + } +} + +// Redacting only the retry logs is not enough: when the retry gives up, the client +// error itself travels up the chain, and whoever prints that chain prints the URL. +// Every RPC call in this module converts its error through here so the key cannot +// leave, which means dropping the original as a source rather than wrapping it. +fn redacted_error(err: SolanaClientError) -> anyhow::Error { + anyhow::Error::msg(redacted(&err)) +} + +/// Report whether a block at `first_block_slot` is close enough to `first_slot`, +/// the first slot of an epoch, to date when that epoch began. +/// +/// `MAX_BOUNDARY_SKIP_SLOTS` is the real bound. The next epoch's first slot only +/// binds first on a cluster whose epochs are shorter than that budget, such as a +/// local test validator. +fn can_date_epoch_start( + first_slot: u64, + first_block_slot: u64, + next_epoch_first_slot: u64, +) -> bool { + let last_datable_slot = (first_slot + MAX_BOUNDARY_SKIP_SLOTS).min(next_epoch_first_slot); + + first_block_slot < last_datable_slot +} + +#[derive(Debug, PartialEq, Eq)] +enum EpochSearchStep { + Earlier, + Later, + Found, +} + +/// Decide which way the epoch search should move from its current candidate. +/// +/// `epoch_start_time` and `next_epoch_start_time` are the block times of the +/// first block in the candidate epoch and in the epoch after it, in seconds. +/// `None` means that epoch has produced no block yet and so bounds nothing: it +/// rules the candidate out, or, for the next epoch, means the candidate has no +/// upper bound. Accepting the candidate unbounded is only sound because the +/// caller has already established that the target is at or before the chain tip. +/// +/// The lower bound is inclusive and the upper bound is exclusive, so a timestamp +/// falling exactly on an epoch's first block time belongs to that epoch. +fn decide_epoch_search_step( + target_time: i64, + epoch_start_time: Option, + next_epoch_start_time: Option, +) -> EpochSearchStep { + let Some(epoch_start_time) = epoch_start_time else { + return EpochSearchStep::Earlier; + }; + + if target_time < epoch_start_time { + return EpochSearchStep::Earlier; + } + + match next_epoch_start_time { + Some(next_epoch_start_time) if target_time >= next_epoch_start_time => { + EpochSearchStep::Later + } + _ => EpochSearchStep::Found, + } +} + +/// Estimate the slot at a given timestamp based on current slot and time +/// +/// Returns an error if the timestamp is in the future or too far in the past. +pub fn estimate_slot_from_timestamp( + timestamp_us: u64, + current_slot: u64, + current_time_us: u64, +) -> Result { + if timestamp_us > current_time_us { + bail!("Timestamp {timestamp_us} is in the future"); + } + + // Calculate approximate slot at the given timestamp + let time_diff_us = current_time_us - timestamp_us; + let slots_ago = time_diff_us / SEED_SLOT_DURATION_US; + + if slots_ago > current_slot { + bail!("Timestamp {timestamp_us} is too far in the past"); + } + + Ok(current_slot - slots_ago) +} + +/// Helper for finding epochs at specific timestamps +/// +/// This struct manages the epoch schedule and provides methods for +/// converting between timestamps and epochs. It caches the epoch schedule +/// to avoid redundant RPC calls but ONLY within a single execution context. +/// +/// The struct takes explicit RPC clients to make it clear which network +/// is being queried for epoch calculations. +pub struct EpochFinder { + /// DZ network RPC client for getting current slot and timestamps + dz_rpc_client: Arc, + /// Solana network RPC client for getting leader schedules + solana_read_client: Arc, + /// Cached DZ epoch schedule + dz_schedule: Option, + /// Cached Solana epoch schedule + solana_schedule: Option, +} + +impl EpochFinder { + /// Create a new EpochFinder with explicit RPC clients + /// + /// # Arguments + /// * `dz_rpc_client` - RPC client for the DZ network (for timestamps and current slot) + /// * `solana_read_client` - RPC client for Solana network (for leader schedules) + pub fn new( + dz_rpc_client: Arc, + solana_read_client: Arc, + ) -> Self { + Self { + dz_rpc_client, + solana_read_client, + dz_schedule: None, + solana_schedule: None, + } + } + + /// Get the DZ epoch schedule, fetching it if not already cached + pub async fn get_dz_schedule(&mut self) -> Result<&EpochSchedule> { + if self.dz_schedule.is_none() { + let schedule = (|| async { self.dz_rpc_client.get_epoch_schedule().await }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!( + "retrying get_epoch_schedule error: {} with sleeping {:?}", + redacted(err), + dur + ) + }) + .await + .map_err(redacted_error)?; + self.dz_schedule = Some(schedule); + } + + Ok(self + .dz_schedule + .as_ref() + .expect("dz_schedule cannot be none")) + } + + /// Get the Solana epoch schedule, fetching it if not already cached + pub async fn get_solana_schedule(&mut self) -> Result<&EpochSchedule> { + if self.solana_schedule.is_none() { + let schedule = (|| async { self.solana_read_client.get_epoch_schedule().await }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!( + "retrying get_epoch_schedule error: {} with sleeping {:?}", + redacted(err), + dur + ) + }) + .await + .map_err(redacted_error)?; + self.solana_schedule = Some(schedule); + } + + Ok(self + .solana_schedule + .as_ref() + .expect("solana_schedule cannot be none")) + } + + /// Get a slot's block time in seconds, or `Ok(None)` when the slot has no + /// block to report a time for. + /// + /// Transport failures are retried; a slot that produced no block and a pruned + /// ledger are not, since both are settled and retrying only burns the backoff + /// schedule before arriving at the same answer. + async fn try_get_block_time(&self, slot: u64) -> Result> { + let block_time = (|| async { self.solana_read_client.get_block_time(slot).await }) + .retry(&ExponentialBuilder::default().with_jitter()) + .when(|err: &SolanaClientError| !is_settled_block_error(err)) + .notify(|err: &SolanaClientError, dur: Duration| { + info!( + "retrying get_block_time error: {} with sleeping {:?}", + redacted(err), + dur + ) + }) + .await; + + match block_time { + Ok(block_time) => Ok(Some(block_time)), + Err(err) if is_block_unavailable(&err) => Ok(None), + Err(err) => Err(redacted_error(err)) + .with_context(|| format!("Failed to get block time for Solana slot {slot}")), + } + } + + /// Find the block time in seconds of the first block in `epoch`. + /// + /// Returns `Ok(None)` only when the epoch has produced no block, meaning its + /// first slot is past `chain_tip_slot`. Measuring against the chain tip rather + /// than `getSlot` matters because `getSlot` can name a blockless slot, which + /// would make a just-started epoch whose opening slots were all skipped look + /// like an endpoint missing history and fail the search. + /// + /// Every other way of failing to date the epoch is an error rather than a + /// `None`, and `chain_tip_slot` is what makes that sound: it has a block, so + /// an epoch starting at or before it must have one too, leaving missing + /// history as the only reading of an empty answer. Returning `None` there + /// would walk the search backward past the right answer. + /// + /// [`can_date_epoch_start`] guards the one thing `getBlocksWithLimit` will not + /// report, which is that it stepped over a gap in the endpoint's own history. + /// + /// The block time is returned as is, with no back estimation of the skipped + /// slots before it: the first block's time is the epoch's effective start for + /// this purpose, so subtracting an estimate would only add error. This is a + /// deliberate difference from `estimate_block_time_for_skipped_slot` in + /// `validator-debt/src/rpc.rs`, which does subtract one. + async fn try_epoch_start_block_time( + &self, + schedule: &EpochSchedule, + epoch: u64, + chain_tip_slot: u64, + ) -> Result> { + let first_slot = schedule.get_first_slot_in_epoch(epoch); + if first_slot > chain_tip_slot { + return Ok(None); + } + + let first_block_slot = (|| async { + self.solana_read_client + .get_blocks_with_limit(first_slot, 1) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .when(|err: &SolanaClientError| !is_settled_block_error(err)) + .notify(|err: &SolanaClientError, dur: Duration| { + info!( + "retrying get_blocks_with_limit error: {} with sleeping {:?}", + redacted(err), + dur + ) + }) + .await + .map_err(redacted_error) + .with_context(|| format!("Failed to find the first block of Solana epoch {epoch}"))? + .first() + .copied() + .with_context(|| { + format!( + "Solana endpoint reports no block at or after slot {first_slot}, the first slot \ + of epoch {epoch}, even though slot {chain_tip_slot} has one. The endpoint is \ + most likely missing block history for that range" + ) + })?; + + ensure!( + can_date_epoch_start( + first_slot, + first_block_slot, + schedule.get_first_slot_in_epoch(epoch + 1) + ), + "The first block at or after slot {first_slot} is slot {first_block_slot}, more than \ + {MAX_BOUNDARY_SKIP_SLOTS} slots into Solana epoch {epoch}. The endpoint is most \ + likely missing block history there, and dating the epoch by that block would place \ + its start late enough that timestamps inside the gap resolve to the previous epoch" + ); + + let block_time = self + .try_get_block_time(first_block_slot) + .await? + .with_context(|| { + format!( + "Solana slot {first_block_slot} was reported as the first block of epoch \ + {epoch} but has no block time" + ) + })?; + + Ok(Some(block_time)) + } + + /// Find the newest slot at or before `current_slot` that has a block, and + /// return it with its block time in seconds. + /// + /// The walk runs backward because `getSlot` can name a slot with no block yet, + /// whether skipped or not yet caught up to. It resolves on the first probe in + /// the ordinary case. + /// + /// The time bounds how recent a timestamp the search accepts; the slot is what + /// [`Self::try_epoch_start_block_time`] measures against to tell "no block + /// yet" apart from "endpoint is missing history". + async fn try_chain_tip_block(&self, current_slot: u64) -> Result<(u64, i64)> { + let oldest_slot_to_search = current_slot.saturating_sub(MAX_CHAIN_TIP_SEARCH_SLOTS - 1); + + for slot in (oldest_slot_to_search..=current_slot).rev() { + if let Some(block_time) = self.try_get_block_time(slot).await? { + return Ok((slot, block_time)); + } + } + + bail!( + "No block within {MAX_CHAIN_TIP_SEARCH_SLOTS} slots at or before the current slot \ + {current_slot}" + ) + } + + /// Find the Solana epoch that was active at a given timestamp + /// + /// The timestamp seeds a slot estimate, and the epoch that seed lands in is + /// then verified against real block times. The verification is what makes the + /// answer correct: the seed drifts by thousands of slots over a day of + /// lookback and no fixed slot duration survives the SIMD-0525 rollout, so a + /// seeded guess alone picks the wrong epoch near a boundary. That epoch + /// chooses the leader schedule contributor rewards are computed against, so a + /// wrong answer corrupts rewards and an error is the better outcome. + /// + /// The forward step exists despite the backward-biased seed because the local + /// clock, not the chain, decides where the seed lands, so a clock running + /// ahead can still overshoot. + /// + /// A second chain-verified epoch search lives in `validator-debt/src/rpc.rs` + /// (`find_solana_epoch_before_timestamp`). It threads a `leaky-bucket` rate + /// limiter and searches one direction only, so the two are not yet worth + /// unifying, but a fix to the boundary handling here probably belongs there + /// too. + pub async fn find_epoch_at_timestamp(&mut self, timestamp_us: u64) -> Result { + // Get current slot from Solana + let current_slot = (|| async { self.solana_read_client.get_slot().await }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!( + "retrying get_slot error: {} with sleeping {:?}", + redacted(err), + dur + ) + }) + .await + .map_err(redacted_error)?; + + let current_time_us = Utc::now().timestamp_micros() as u64; + + // Also rejects a future or unreachably old timestamp before any RPC + // calls are spent on it. + let estimated_slot = + estimate_slot_from_timestamp(timestamp_us, current_slot, current_time_us)?; + + // Copied rather than borrowed: the borrow is tied to the &mut self that + // the block time lookups below also need. + let schedule = self.get_solana_schedule().await?.clone(); + + let mut candidate_epoch = schedule.get_epoch(estimated_slot); + let target_time = (timestamp_us / 1_000_000) as i64; + + // The seed was only checked against the local clock, which says nothing + // about how far the endpoint has caught up. Since the search accepts an + // unbounded candidate as the answer, a timestamp past the chain tip would + // otherwise resolve to whatever epoch a lagging endpoint sits in. + let (chain_tip_slot, chain_tip_time) = self.try_chain_tip_block(current_slot).await?; + if target_time > chain_tip_time { + bail!( + "Timestamp {timestamp_us} is ahead of the Solana chain tip at slot \ + {chain_tip_slot} (block time {chain_tip_time}), so the epoch containing it is \ + not yet determined" + ); + } + + // Each step reuses the bound it already resolved, so only the far side of + // the move needs a lookup. Halves the round trips of a multi-step walk. + let mut epoch_start_time = self + .try_epoch_start_block_time(&schedule, candidate_epoch, chain_tip_slot) + .await?; + let mut next_epoch_start_time = self + .try_epoch_start_block_time(&schedule, candidate_epoch + 1, chain_tip_slot) + .await?; + + for _ in 0..MAX_EPOCH_SEARCH_STEPS { + match decide_epoch_search_step(target_time, epoch_start_time, next_epoch_start_time) { + EpochSearchStep::Found => { + debug!( + "Mapped timestamp {} to Solana epoch {}", + timestamp_us, candidate_epoch + ); + return Ok(candidate_epoch); + } + EpochSearchStep::Earlier => { + candidate_epoch = candidate_epoch.checked_sub(1).with_context(|| { + format!("Timestamp {timestamp_us} precedes the first Solana epoch") + })?; + next_epoch_start_time = epoch_start_time; + epoch_start_time = self + .try_epoch_start_block_time(&schedule, candidate_epoch, chain_tip_slot) + .await?; + } + EpochSearchStep::Later => { + candidate_epoch += 1; + epoch_start_time = next_epoch_start_time; + next_epoch_start_time = self + .try_epoch_start_block_time(&schedule, candidate_epoch + 1, chain_tip_slot) + .await?; + } + } + } + + bail!( + "Could not resolve timestamp {timestamp_us} to a Solana epoch within \ + {MAX_EPOCH_SEARCH_STEPS} steps, last candidate was epoch {candidate_epoch}" + ) + } + + /// Fetch leader schedule for a DZ epoch + /// + /// This method: + /// 1. Takes a DZ epoch and timestamp as input + /// 2. Maps it to a Solana epoch + /// 3. Gets the first slot of that Solana epoch + /// 4. Fetches the leader schedule using the slot number + /// + /// Returns the leader schedule as a map of validator pubkey to slot count + pub async fn fetch_leader_schedule( + &mut self, + dz_epoch: u64, + timestamp_us: u64, + ) -> Result { + info!("Fetching leader schedule for DZ epoch {}", dz_epoch); + + // Find the corresponding Solana epoch for this timestamp + let solana_epoch = self.find_epoch_at_timestamp(timestamp_us).await?; + + info!( + "DZ epoch {} corresponds to Solana epoch {} (based on timestamp {})", + dz_epoch, solana_epoch, timestamp_us + ); + + // Get Solana epoch schedule + let solana_schedule = self.get_solana_schedule().await?; + + // Get the first slot of the Solana epoch + let first_slot_of_epoch = solana_schedule.get_first_slot_in_epoch(solana_epoch); + + debug!( + "Fetching leader schedule for Solana epoch {} using slot {}", + solana_epoch, first_slot_of_epoch + ); + + // Get leader schedule using slot number (not epoch number) + let leader_schedule = (|| async { + self.solana_read_client + .get_leader_schedule(Some(first_slot_of_epoch)) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!( + "retrying get_leader_schedule error: {} with sleeping {:?}", + redacted(err), + dur + ) + }) + .await + .map_err(redacted_error)? + .ok_or_else(|| anyhow!("No leader schedule found for Solana epoch {solana_epoch}"))?; + + // Convert leader schedule to map of validator -> slot count + let schedule_map: LeaderScheduleMap = leader_schedule + .into_iter() + .map(|(pk, schedule)| (pk, schedule.len())) + .collect(); + + info!( + "Retrieved leader schedule with {} validators", + schedule_map.len() + ); + + Ok(LeaderSchedule { + solana_epoch, + schedule_map, + }) + } +} + +#[cfg(test)] +mod tests { + use solana_client::rpc_request::RpcResponseErrorData; + + use super::*; + + // Points a client at a closed local port so the call fails inside reqwest with the + // URL attached, which is the shape that leaks the API key. + #[tokio::test] + async fn test_redaction_keeps_the_url_out_of_a_propagated_error() { + let err = RpcClient::new("http://127.0.0.1:1/?api-key=SUPERSECRET".to_string()) + .get_slot() + .await + .expect_err("a closed port cannot answer get_slot"); + + // The redaction depends on both of these, so check them rather than letting a + // reqwest change turn the assertions below into a vacuous pass. + assert!(matches!(err.kind(), ClientErrorKind::Reqwest(_)), "{err:?}"); + let ClientErrorKind::Reqwest(inner) = err.kind() else { + unreachable!() + }; + assert!(inner.url().is_some(), "{err:?}"); + + assert!(format!("{err:?}").contains("SUPERSECRET")); + assert!(!redacted(&err).contains("SUPERSECRET")); + + // What the scheduler prints on failure, via `error!("...: {e:#}")`. + let propagated = redacted_error(err); + assert!(!format!("{propagated:#}").contains("SUPERSECRET")); + assert!(!format!("{propagated:?}").contains("SUPERSECRET")); + } + + #[test] + fn test_estimate_slot_from_timestamp() { + let current_slot = 1000000; + let current_time_us = 1_000_000_000_000; // 1 million seconds in microseconds + + // Test normal case - 500 seconds ago (500_000_000 us / 500_000 us per + // slot = 1000 slots) + let timestamp_us = current_time_us - 500_000_000; + let result = estimate_slot_from_timestamp(timestamp_us, current_slot, current_time_us); + assert_eq!(result.unwrap(), 999000); + + // Test future timestamp. find_epoch_at_timestamp seeds its search with + // this call, so this guard is what keeps a future timestamp out of the + // search entirely. + let future_timestamp = current_time_us + 1000; + let result = estimate_slot_from_timestamp(future_timestamp, current_slot, current_time_us); + assert!(result.is_err()); + + // Test too far in the past + let ancient_timestamp = 0; + let result = estimate_slot_from_timestamp(ancient_timestamp, current_slot, current_time_us); + assert!(result.is_err()); + } + + // The epoch's first confirmed block time is the inclusive lower bound, so a + // timestamp landing exactly on it belongs to the candidate epoch. + #[test] + fn test_decide_epoch_search_step_at_epoch_start_is_found() { + assert_eq!( + decide_epoch_search_step(1_700_000_000, Some(1_700_000_000), Some(1_700_100_000)), + EpochSearchStep::Found + ); + } + + // One second earlier belongs to the previous epoch. This is the boundary case + // that a seeded estimate alone got wrong. + #[test] + fn test_decide_epoch_search_step_before_epoch_start_steps_earlier() { + assert_eq!( + decide_epoch_search_step(1_699_999_999, Some(1_700_000_000), Some(1_700_100_000)), + EpochSearchStep::Earlier + ); + } + + // The next epoch's first confirmed block time is the exclusive upper bound, so + // a timestamp landing exactly on it belongs to the next epoch, not this one. + #[test] + fn test_decide_epoch_search_step_at_next_epoch_start_steps_later() { + assert_eq!( + decide_epoch_search_step(1_700_100_000, Some(1_700_000_000), Some(1_700_100_000)), + EpochSearchStep::Later + ); + } + + // Without this the search would fail on every recent timestamp. + #[test] + fn test_decide_epoch_search_step_current_epoch_has_no_upper_bound() { + assert_eq!( + decide_epoch_search_step(1_700_100_000, Some(1_700_000_000), None), + EpochSearchStep::Found + ); + } + + // The caller feeds this step into a checked_sub, so a timestamp older than + // the earliest available block errors rather than underflowing or silently + // returning epoch 0. + #[test] + fn test_decide_epoch_search_step_unstarted_epoch_steps_earlier() { + assert_eq!( + decide_epoch_search_step(1_700_000_000, None, None), + EpochSearchStep::Earlier + ); + } + + fn rpc_response_error(code: i64) -> SolanaClientError { + RpcError::RpcResponseError { + code, + message: "test".to_string(), + data: RpcResponseErrorData::Empty, + } + .into() + } + + // Which shape arrives depends on what the endpoint has behind it, so missing + // any one of them fails every lookup on endpoints of that shape. + #[test] + fn test_is_block_unavailable_covers_every_absent_block_shape() { + assert!(is_block_unavailable(&rpc_response_error( + JSON_RPC_SERVER_ERROR_SLOT_SKIPPED + ))); + assert!(is_block_unavailable(&rpc_response_error( + JSON_RPC_SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED + ))); + assert!(is_block_unavailable(&rpc_response_error( + JSON_RPC_SERVER_ERROR_BLOCK_NOT_AVAILABLE + ))); + // What RpcClient::get_block_time synthesizes from a JSON null response. + assert!(is_block_unavailable( + &RpcError::ForUser("Block Not Found: slot=123".to_string()).into() + )); + } + + // A pruned ledger has to fail the lookup rather than read as an absent block, + // and is not worth retrying either. + #[test] + fn test_is_block_cleaned_up_is_not_an_absent_block() { + let err = rpc_response_error(JSON_RPC_SERVER_ERROR_BLOCK_CLEANED_UP); + assert!(!is_block_unavailable(&err)); + assert!(is_block_cleaned_up(&err)); + // Settled either way, so neither is worth retrying. + assert!(is_settled_block_error(&err)); + } + + // A transport failure is neither, so it stays retryable. + #[test] + fn test_transport_error_is_retryable() { + let err = RpcError::RpcRequestError("connection reset".to_string()).into(); + assert!(!is_block_unavailable(&err)); + assert!(!is_block_cleaned_up(&err)); + assert!(!is_settled_block_error(&err)); + } + + // The ordinary cases: the epoch's own first slot produced a block, or a short + // run of skipped slots pushed the first block a few slots in. + #[test] + fn test_can_date_epoch_start_accepts_a_short_skip_run() { + let first_slot = 432_000; + let next_epoch_first_slot = 864_000; + + assert!(can_date_epoch_start( + first_slot, + first_slot, + next_epoch_first_slot + )); + assert!(can_date_epoch_start( + first_slot, + first_slot + 4, + next_epoch_first_slot + )); + } + + // The budget is exclusive, so the last accepted slot is one below it. + #[test] + fn test_can_date_epoch_start_budget_edge() { + let first_slot = 432_000; + let next_epoch_first_slot = 864_000; + + assert!(can_date_epoch_start( + first_slot, + first_slot + MAX_BOUNDARY_SKIP_SLOTS - 1, + next_epoch_first_slot + )); + assert!(!can_date_epoch_start( + first_slot, + first_slot + MAX_BOUNDARY_SKIP_SLOTS, + next_epoch_first_slot + )); + } + + // A block this far in means getBlocksWithLimit stepped over a history gap. + // Dating the epoch by it would resolve timestamps inside the gap to the + // previous epoch and its leader schedule. + #[test] + fn test_can_date_epoch_start_rejects_a_history_gap() { + let first_slot = 432_000; + let next_epoch_first_slot = 864_000; + + assert!(!can_date_epoch_start( + first_slot, + first_slot + 100_000, + next_epoch_first_slot + )); + } + + // On a cluster whose epochs are shorter than the budget, such as a local test + // validator, the epoch's own end is what binds. Without the `min` the budget + // would accept a block belonging to a later epoch. + #[test] + fn test_can_date_epoch_start_short_epoch_binds_before_the_budget() { + let first_slot = 64; + let next_epoch_first_slot = 96; + + assert!(can_date_epoch_start( + first_slot, + next_epoch_first_slot - 1, + next_epoch_first_slot + )); + assert!(!can_date_epoch_start( + first_slot, + next_epoch_first_slot, + next_epoch_first_slot + )); + } +} diff --git a/offchain/crates/contributor-rewards/src/ingestor/fetcher.rs b/offchain/crates/contributor-rewards/src/ingestor/fetcher.rs new file mode 100644 index 0000000000..e42faddea3 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/ingestor/fetcher.rs @@ -0,0 +1,119 @@ +use std::sync::Arc; + +use anyhow::Result; +use chrono::Utc; +use doublezero_solana_client_tools::rpc::DoubleZeroLedgerConnection; +use doublezero_solana_sdk::shred_subscription::ID as SHRED_SUBSCRIPTION_PROGRAM_ID; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_commitment_config::CommitmentConfig; +use tracing::info; + +use crate::{ + ingestor::{internet, serviceability, shred_subscription, telemetry, types::FetchData}, + settings::Settings, +}; + +/// Combined network and telemetry data +#[derive(Clone)] +pub struct Fetcher { + pub dz_rpc_client: Arc, + pub solana_read_client: Arc, + pub solana_write_client: Arc, + pub settings: Settings, +} + +impl Fetcher { + pub fn from_settings(settings: &Settings) -> Result { + let dz_rpc_client = DoubleZeroLedgerConnection::new_with_commitment( + settings.rpc.dz_url.to_string(), + CommitmentConfig::finalized(), + ); + let solana_read_client = RpcClient::new_with_commitment( + settings.rpc.solana_read_url.to_string(), + CommitmentConfig::finalized(), + ); + let solana_write_client = RpcClient::new_with_commitment( + settings.rpc.solana_write_url.to_string(), + CommitmentConfig::finalized(), + ); + Ok(Self { + dz_rpc_client: Arc::new(dz_rpc_client), + solana_read_client: Arc::new(solana_read_client), + solana_write_client: Arc::new(solana_write_client), + settings: settings.clone(), + }) + } + + /// Fetch all data for the previous epoch + pub async fn fetch(&self, epoch: Option) -> Result<(u64, FetchData)> { + let search_epoch = match epoch { + None => { + // Get DZ epoch info from DZ RPC + let rpc_start = std::time::Instant::now(); + let dz_epoch_info = self.dz_rpc_client.get_epoch_info().await?; + + metrics::histogram!("doublezero_contributor_rewards_rpc_request_duration", "type" => "get_epoch_info") + .record(rpc_start.elapsed().as_secs_f64()); + metrics::counter!("doublezero_contributor_rewards_rpc_requests", "type" => "get_epoch_info") + .increment(1); + + info!("Current dz_epoch: {}", dz_epoch_info.epoch); + let dz_prev_epoch = dz_epoch_info.epoch.saturating_sub(1); + info!("Fetching data for previous DZ epoch: {}", dz_prev_epoch); + dz_prev_epoch + } + Some(e) => e, + }; + + self.with_epoch(search_epoch).await + } + + /// Fetch all data for a specific epoch + async fn with_epoch(&self, epoch: u64) -> Result<(u64, FetchData)> { + info!( + "Using serviceability program: {}", + self.settings.programs.serviceability_program_id + ); + info!( + "Using telemetry program: {}", + self.settings.programs.telemetry_program_id + ); + info!( + "Using shred subscription program: {}", + *SHRED_SUBSCRIPTION_PROGRAM_ID + ); + + // Fetch all data in parallel + let fetch_start = std::time::Instant::now(); + let (serviceability_data, telemetry_data, internet_data, metro_prices) = tokio::try_join!( + serviceability::fetch(&self.dz_rpc_client, &self.settings), + telemetry::fetch(&self.dz_rpc_client, &self.settings, epoch), + internet::fetch(&self.dz_rpc_client, &self.settings, epoch), + shred_subscription::fetch_metro_prices(&self.solana_read_client), + )?; + + metrics::histogram!("doublezero_contributor_rewards_data_fetch_duration", "epoch" => epoch.to_string()) + .record(fetch_start.elapsed().as_secs_f64()); + metrics::counter!("doublezero_contributor_rewards_data_fetches", "epoch" => epoch.to_string()) + .increment(1); + + let (start_us, end_us) = telemetry_data.start_end_us()?; + + info!( + "Epoch {} time range: {} to {} microseconds", + epoch, start_us, end_us + ); + + let data = FetchData { + dz_serviceability: serviceability_data, + dz_telemetry: telemetry_data, + dz_internet: internet_data, + metro_prices, + start_us, + end_us, + fetched_at: Utc::now(), + }; + + Ok((epoch, data)) + } +} diff --git a/offchain/crates/contributor-rewards/src/ingestor/inet_accumulator.rs b/offchain/crates/contributor-rewards/src/ingestor/inet_accumulator.rs new file mode 100644 index 0000000000..fdaa0a5d8a --- /dev/null +++ b/offchain/crates/contributor-rewards/src/ingestor/inet_accumulator.rs @@ -0,0 +1,571 @@ +use std::collections::{BTreeMap, HashMap}; + +use anyhow::Result; +use bitvec::prelude::*; +use solana_sdk::pubkey::Pubkey; +use tracing::{debug, info}; + +use crate::ingestor::types::{DZInternetData, DZInternetLatencySamples}; + +/// Unique identifier for an internet telemetry route +#[derive(Debug, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)] +pub struct RouteKey { + pub origin: Pubkey, + pub target: Pubkey, + pub provider: String, +} + +impl RouteKey { + pub fn new(origin: Pubkey, target: Pubkey, provider: String) -> Self { + Self { + origin, + target, + provider, + } + } +} + +/// Data from a single epoch with coverage metadata +#[derive(Debug, Clone)] +pub struct EpochData { + pub epoch: u64, + pub samples: Vec, + pub coverage_bitmap: BitVec, + pub timestamp_range: (u64, u64), +} + +impl EpochData { + pub fn new(epoch: u64, data: DZInternetData) -> Self { + let mut min_ts = u64::MAX; + let mut max_ts = 0u64; + + // Calculate timestamp range + for sample in &data.internet_latency_samples { + if sample.start_timestamp_us < min_ts { + min_ts = sample.start_timestamp_us; + } + let end_ts = sample.start_timestamp_us + + (sample.sample_count as u64 * sample.sampling_interval_us); + if end_ts > max_ts { + max_ts = end_ts; + } + } + + Self { + epoch, + samples: data.internet_latency_samples, + coverage_bitmap: BitVec::new(), + timestamp_range: (min_ts, max_ts), + } + } +} + +/// Configuration for the lookback accumulator +#[derive(Debug, Clone)] +pub struct InetLookbackConfig { + pub min_coverage_ratio: f64, + pub min_samples_per_route: usize, + pub dedup_window_us: u64, +} + +/// Accumulates internet telemetry data from multiple epochs to meet coverage threshold +pub struct InetLookbackAccumulator { + config: InetLookbackConfig, + epochs: Vec, + route_index: HashMap, + coverage_bitmap: BitVec, + expected_routes: usize, +} + +impl InetLookbackAccumulator { + pub fn new(config: InetLookbackConfig, expected_routes: usize) -> Self { + let coverage_bitmap = bitvec![0; expected_routes]; + + Self { + config, + epochs: Vec::new(), + route_index: HashMap::new(), + coverage_bitmap, + expected_routes, + } + } + + /// Build or update the route index from samples + fn update_route_index(&mut self, samples: &[DZInternetLatencySamples]) { + for sample in samples { + let route_key = RouteKey::new( + sample.origin_exchange_pk, + sample.target_exchange_pk, + sample.data_provider_name.clone(), + ); + + if !self.route_index.contains_key(&route_key) { + let index = self.route_index.len(); + if index < self.expected_routes { + self.route_index.insert(route_key, index); + } + } + } + } + + /// Calculate the coverage gain of adding an epoch's data + pub fn calculate_coverage_gain(&mut self, epoch_data: &EpochData) -> f64 { + if self.expected_routes == 0 { + return 0.0; + } + + // Update route index with new routes + self.update_route_index(&epoch_data.samples); + + // Count new routes that would be covered + let mut new_coverage = 0usize; + + for sample in &epoch_data.samples { + // Check if this sample has enough data points + if sample.samples.len() < self.config.min_samples_per_route { + continue; + } + + let route_key = RouteKey::new( + sample.origin_exchange_pk, + sample.target_exchange_pk, + sample.data_provider_name.clone(), + ); + + if let Some(&index) = self.route_index.get(&route_key) + && index < self.coverage_bitmap.len() + && !self.coverage_bitmap[index] + { + new_coverage += 1; + } + } + + // Calculate coverage gain - no staleness penalty needed + // We're just padding data from previous epochs + new_coverage as f64 / self.expected_routes as f64 + } + + /// Add an epoch's data to the accumulator + pub fn add_epoch(&mut self, mut epoch_data: EpochData) { + info!( + "Adding epoch {} to accumulator (coverage gain calculated)", + epoch_data.epoch + ); + + // Update coverage bitmap for this epoch + let mut epoch_bitmap = bitvec![0; self.expected_routes]; + + for sample in &epoch_data.samples { + if sample.samples.len() < self.config.min_samples_per_route { + continue; + } + + let route_key = RouteKey::new( + sample.origin_exchange_pk, + sample.target_exchange_pk, + sample.data_provider_name.clone(), + ); + + if let Some(&index) = self.route_index.get(&route_key) + && index < epoch_bitmap.len() + { + epoch_bitmap.set(index, true); + self.coverage_bitmap.set(index, true); + } + } + + epoch_data.coverage_bitmap = epoch_bitmap; + self.epochs.push(epoch_data); + } + + /// Get current coverage ratio + pub fn coverage_ratio(&self) -> f64 { + if self.expected_routes == 0 { + return 0.0; + } + + self.coverage_bitmap.count_ones() as f64 / self.expected_routes as f64 + } + + /// Check if coverage threshold is met + pub fn is_threshold_met(&self) -> bool { + self.coverage_ratio() >= self.config.min_coverage_ratio + } + + /// Merge all accumulated epochs into a single DZInternetData + pub fn merge_all(self) -> Result { + if self.epochs.is_empty() { + return Ok(DZInternetData::default()); + } + + info!( + "Merging {} epochs with {:.1}% total coverage", + self.epochs.len(), + self.coverage_ratio() * 100.0 + ); + + // Collect all samples from all epochs + let mut all_samples: Vec = Vec::new(); + + for epoch_data in self.epochs { + all_samples.extend(epoch_data.samples); + } + + // Group samples by route + let mut route_samples: BTreeMap> = BTreeMap::new(); + + for sample in all_samples { + let route_key = RouteKey::new( + sample.origin_exchange_pk, + sample.target_exchange_pk, + sample.data_provider_name.clone(), + ); + route_samples.entry(route_key).or_default().push(sample); + } + + // Merge samples for each route + let mut merged_samples = Vec::new(); + + for (_route_key, mut samples) in route_samples { + if samples.is_empty() { + continue; + } + + // Sort by timestamp + samples.sort_by_key(|s| s.start_timestamp_us); + + // For now, use the most recent epoch's data for each route + // In future, could do more sophisticated timestamp-based merging + if let Some(most_recent) = samples.into_iter().last() { + merged_samples.push(most_recent); + } + } + + debug!("Merged into {} unique route samples", merged_samples.len()); + + Ok(DZInternetData { + internet_latency_samples: merged_samples, + accounts: vec![], + }) + } + + /// Get list of epochs that were accumulated + pub fn get_epochs_used(&self) -> Vec { + self.epochs.iter().map(|e| e.epoch).collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn create_test_samples( + origin: Pubkey, + target: Pubkey, + provider: &str, + num_samples: usize, + epoch: u64, + ) -> DZInternetLatencySamples { + let mut latency_samples = Vec::new(); + for i in 0..num_samples { + latency_samples.push(50000 + (i as u32 * 100)); + } + + DZInternetLatencySamples { + pubkey: Pubkey::new_unique(), + epoch, + data_provider_name: provider.to_string(), + oracle_agent_pk: Pubkey::new_unique(), + origin_exchange_pk: origin, + target_exchange_pk: target, + sampling_interval_us: 1000000, + start_timestamp_us: epoch * 1000000000, + samples: latency_samples, + sample_count: num_samples as u32, + } + } + + #[test] + fn test_route_key_equality() { + let origin = Pubkey::new_unique(); + let target = Pubkey::new_unique(); + + let key1 = RouteKey::new(origin, target, "provider".to_string()); + let key2 = RouteKey::new(origin, target, "provider".to_string()); + let key3 = RouteKey::new(origin, target, "other".to_string()); + + assert_eq!(key1, key2); + assert_ne!(key1, key3); + } + + #[test] + fn test_coverage_ratio_calculation() { + let config = InetLookbackConfig { + min_coverage_ratio: 0.6, + min_samples_per_route: 100, + dedup_window_us: 10_000_000, + }; + let mut acc = InetLookbackAccumulator::new(config, 4); + + assert_eq!(acc.coverage_ratio(), 0.0); + + // Create test data with 2 routes (50% coverage) + let exchange1 = Pubkey::new_unique(); + let exchange2 = Pubkey::new_unique(); + let exchange3 = Pubkey::new_unique(); + + let samples = vec![ + create_test_samples(exchange1, exchange2, "provider", 150, 100), + create_test_samples(exchange2, exchange3, "provider", 150, 100), + ]; + + let data = DZInternetData { + internet_latency_samples: samples, + accounts: vec![], + }; + let epoch_data = EpochData::new(100, data); + + // Calculate gain and add epoch + let gain = acc.calculate_coverage_gain(&epoch_data); + assert!(gain > 0.0); + + acc.add_epoch(epoch_data); + assert_eq!(acc.coverage_ratio(), 0.5); // 2 out of 4 routes + } + + #[test] + fn test_epoch_skipping_bug() { + // Test that we don't skip epochs that have overlapping coverage + // This tests the bug where epoch 79 was skipped when it had same routes as epoch 80 + let config = InetLookbackConfig { + min_coverage_ratio: 0.8, // 80% threshold + min_samples_per_route: 1, + dedup_window_us: 1000, + }; + + // Expected: 4 routes (2 locations * 2 providers) + let mut acc = InetLookbackAccumulator::new(config, 4); + + let loc1 = Pubkey::new_unique(); + let loc2 = Pubkey::new_unique(); + + // Epoch 80: 50% coverage (2 routes from provider1) + let epoch80_samples = vec![ + create_test_samples(loc1, loc2, "provider1", 150, 80), + create_test_samples(loc2, loc1, "provider1", 150, 80), + ]; + let epoch80 = EpochData::new( + 80, + DZInternetData { + internet_latency_samples: epoch80_samples, + accounts: vec![], + }, + ); + + // Epoch 79: Also 50% coverage with SAME routes (provider1) + // This should NOT be skipped even though it adds 0% new coverage + let epoch79_samples = vec![ + create_test_samples(loc1, loc2, "provider1", 150, 79), + create_test_samples(loc2, loc1, "provider1", 150, 79), + ]; + let epoch79 = EpochData::new( + 79, + DZInternetData { + internet_latency_samples: epoch79_samples, + accounts: vec![], + }, + ); + + // Epoch 78: 50% coverage with DIFFERENT routes (provider2) + let epoch78_samples = vec![ + create_test_samples(loc1, loc2, "provider2", 150, 78), + create_test_samples(loc2, loc1, "provider2", 150, 78), + ]; + let epoch78 = EpochData::new( + 78, + DZInternetData { + internet_latency_samples: epoch78_samples, + accounts: vec![], + }, + ); + + // Process epochs in order + let gain80 = acc.calculate_coverage_gain(&epoch80); + assert_eq!(gain80, 0.5, "Epoch 80 should provide 50% coverage"); + acc.add_epoch(epoch80); + assert_eq!(acc.get_epochs_used(), vec![80]); + + let gain79 = acc.calculate_coverage_gain(&epoch79); + assert_eq!( + gain79, 0.0, + "Epoch 79 should provide 0% new coverage (same routes as 80)" + ); + // BUT we should still add it! + acc.add_epoch(epoch79); + assert_eq!( + acc.get_epochs_used(), + vec![80, 79], + "Epoch 79 should be included" + ); + assert_eq!(acc.coverage_ratio(), 0.5, "Coverage should still be 50%"); + + let gain78 = acc.calculate_coverage_gain(&epoch78); + assert_eq!( + gain78, 0.5, + "Epoch 78 should provide 50% new coverage (different provider)" + ); + acc.add_epoch(epoch78); + assert_eq!( + acc.get_epochs_used(), + vec![80, 79, 78], + "All epochs should be included" + ); + assert!(acc.is_threshold_met(), "Should meet 80% threshold"); + assert_eq!(acc.coverage_ratio(), 1.0, "Should have 100% coverage"); + } + + #[test] + fn test_route_index_determinism() { + // Test that route index is built deterministically + // The bug was that route index was built incrementally causing different coverage calculations + let config = InetLookbackConfig { + min_coverage_ratio: 0.8, + min_samples_per_route: 1, + dedup_window_us: 1000, + }; + + let loc1 = Pubkey::new_unique(); + let loc2 = Pubkey::new_unique(); + let loc3 = Pubkey::new_unique(); + + // Create two accumulators with same expected routes + let mut acc1 = InetLookbackAccumulator::new(config.clone(), 6); + let mut acc2 = InetLookbackAccumulator::new(config.clone(), 6); + + // Accumulator 1: Process location pairs in order 1->2, 2->3, 3->1 + let epoch1_samples = vec![ + create_test_samples(loc1, loc2, "provider", 150, 80), + create_test_samples(loc2, loc3, "provider", 150, 80), + create_test_samples(loc3, loc1, "provider", 150, 80), + ]; + let epoch1 = EpochData::new( + 80, + DZInternetData { + internet_latency_samples: epoch1_samples, + accounts: vec![], + }, + ); + + // Accumulator 2: Process same pairs but in different order + let epoch2_samples = vec![ + create_test_samples(loc3, loc1, "provider", 150, 80), + create_test_samples(loc1, loc2, "provider", 150, 80), + create_test_samples(loc2, loc3, "provider", 150, 80), + ]; + let epoch2 = EpochData::new( + 80, + DZInternetData { + internet_latency_samples: epoch2_samples, + accounts: vec![], + }, + ); + + let gain1 = acc1.calculate_coverage_gain(&epoch1); + let gain2 = acc2.calculate_coverage_gain(&epoch2); + + assert_eq!( + gain1, gain2, + "Coverage gain should be same regardless of processing order" + ); + + acc1.add_epoch(epoch1); + acc2.add_epoch(epoch2); + + assert_eq!( + acc1.coverage_ratio(), + acc2.coverage_ratio(), + "Coverage ratio should be same regardless of processing order" + ); + } + + #[test] + fn test_threshold_checking() { + let config = InetLookbackConfig { + min_coverage_ratio: 0.6, + min_samples_per_route: 100, + dedup_window_us: 10_000_000, + }; + + let mut acc = InetLookbackAccumulator::new(config, 10); + + assert!(!acc.is_threshold_met()); + + // Add data to reach 60% coverage (6 routes) + let mut samples = Vec::new(); + for _ in 0..6 { + let origin = Pubkey::new_unique(); + let target = Pubkey::new_unique(); + samples.push(create_test_samples(origin, target, "provider", 150, 100)); + } + + let data = DZInternetData { + internet_latency_samples: samples, + accounts: vec![], + }; + let epoch_data = EpochData::new(100, data); + + acc.calculate_coverage_gain(&epoch_data); + acc.add_epoch(epoch_data); + + assert!(acc.is_threshold_met()); + assert_eq!(acc.coverage_ratio(), 0.6); + } + + #[test] + fn test_merge_multiple_epochs() { + let config = InetLookbackConfig { + min_coverage_ratio: 0.6, + min_samples_per_route: 100, + dedup_window_us: 10_000_000, + }; + + let mut acc = InetLookbackAccumulator::new(config, 10); + + let exchange1 = Pubkey::new_unique(); + let exchange2 = Pubkey::new_unique(); + let exchange3 = Pubkey::new_unique(); + let exchange4 = Pubkey::new_unique(); + + // Epoch 100: routes 1->2 and 2->3 + let epoch1_data = DZInternetData { + internet_latency_samples: vec![ + create_test_samples(exchange1, exchange2, "provider", 150, 100), + create_test_samples(exchange2, exchange3, "provider", 150, 100), + ], + accounts: vec![], + }; + + // Epoch 99: routes 3->4 and 1->4 + let epoch2_data = DZInternetData { + internet_latency_samples: vec![ + create_test_samples(exchange3, exchange4, "provider", 150, 99), + create_test_samples(exchange1, exchange4, "provider", 150, 99), + ], + accounts: vec![], + }; + + let epoch1 = EpochData::new(100, epoch1_data); + let epoch2 = EpochData::new(99, epoch2_data); + + acc.calculate_coverage_gain(&epoch1); + acc.add_epoch(epoch1); + + acc.calculate_coverage_gain(&epoch2); + acc.add_epoch(epoch2); + + let merged = acc.merge_all().unwrap(); + + // Should have 4 unique routes after merging + assert_eq!(merged.internet_latency_samples.len(), 4); + } +} diff --git a/offchain/crates/contributor-rewards/src/ingestor/internet.rs b/offchain/crates/contributor-rewards/src/ingestor/internet.rs new file mode 100644 index 0000000000..3c252960c9 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/ingestor/internet.rs @@ -0,0 +1,266 @@ +use std::{str::FromStr, time::Duration}; + +use anyhow::{Context, Result, bail}; +use backon::{ExponentialBuilder, Retryable}; +use doublezero_telemetry::state::{ + accounttype::AccountType, internet_latency_samples::InternetLatencySamples, +}; +use solana_account_decoder::UiAccountEncoding; +use solana_client::{ + client_error::ClientError as SolanaClientError, + nonblocking::rpc_client::RpcClient, + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::pubkey::Pubkey; +use tracing::{debug, info, warn}; + +use crate::{ + ingestor::{ + inet_accumulator::{EpochData, InetLookbackAccumulator, InetLookbackConfig}, + types::{DZInternetData, DZInternetLatencySamples}, + }, + settings::Settings, +}; + +// Use the correct discriminator value from the AccountType enum +// AccountType::InternetLatencySamples = 4 +const ACCOUNT_TYPE_DISCRIMINATOR: u8 = AccountType::InternetLatencySamples as u8; + +/// Fetch telemetry data for a specific epoch using RPC filtering +pub async fn fetch( + rpc_client: &RpcClient, + settings: &Settings, + epoch: u64, +) -> Result { + let program_id = &settings.programs.telemetry_program_id; + let program_pubkey = Pubkey::from_str(program_id) + .with_context(|| format!("Invalid internet program ID: {program_id}"))?; + + info!( + "Fetching internet data for epoch {} from program {}", + epoch, program_id + ); + + // Use 9-byte filter: account type (1 byte) + epoch (8 bytes) + let mut bytes = vec![ACCOUNT_TYPE_DISCRIMINATOR]; + bytes.extend_from_slice(&epoch.to_le_bytes()); + let filters = vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded(0, &bytes))]; + + let config = RpcProgramAccountsConfig { + filters: Some(filters), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64Zstd), + commitment: Some(CommitmentConfig::finalized()), + ..RpcAccountInfoConfig::default() + }, + ..RpcProgramAccountsConfig::default() + }; + + let accounts = (|| async { + rpc_client + .get_program_accounts_with_config(&program_pubkey, config.clone()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + + info!( + "Found {} internet accounts for epoch {}", + accounts.len(), + epoch + ); + + let mut internet_latency_samples = Vec::new(); + let batch_size = 100; + let mut error_count = 0; + + for (i, chunk) in accounts.chunks(batch_size).enumerate() { + info!( + "Processing internet batch {}/{}", + i + 1, + accounts.len().div_ceil(batch_size) + ); + + for (pubkey, account) in chunk { + match InternetLatencySamples::try_from(&account.data[..]) { + Ok(samples) => { + // Verify epoch matches (should always be true due to RPC filter) + if samples.header.epoch != epoch { + warn!( + "Unexpected epoch mismatch: expected {}, got {}", + epoch, samples.header.epoch + ); + continue; + } + + debug!( + "Processing samples for epoch {}: samples={}, interval={}μs", + epoch, + samples.header.next_sample_index, + samples.header.sampling_interval_microseconds + ); + + let dz_samples = DZInternetLatencySamples::from_raw(*pubkey, &samples); + internet_latency_samples.push(dz_samples); + } + Err(e) => { + warn!("Failed to deserialize internet account {}: {}", pubkey, e); + error_count += 1; + } + } + } + } + + info!( + "Processed {} internet accounts for epoch {} ({} errors)", + internet_latency_samples.len(), + epoch, + error_count + ); + + if internet_latency_samples.is_empty() { + return Ok(DZInternetData::default()); + } + + let total_samples: usize = internet_latency_samples + .iter() + .map(|d| d.samples.len()) + .sum(); + let avg_samples_per_account = total_samples / internet_latency_samples.len(); + + info!( + "DZD internet stats for epoch {epoch}, total_samples={total_samples}, avg_samples_per_account={avg_samples_per_account}", + ); + + Ok(DZInternetData { + internet_latency_samples, + accounts, + }) +} + +/// Fetch internet telemetry data using the lookback accumulator +/// Intelligently combines data from multiple epochs to meet coverage threshold +pub async fn fetch_with_accumulator( + rpc_client: &RpcClient, + settings: &Settings, + target_epoch: u64, + expected_links: usize, +) -> Result<(u64, DZInternetData)> { + let config = InetLookbackConfig { + min_coverage_ratio: settings.inet_lookback.min_coverage_threshold, + min_samples_per_route: settings.inet_lookback.min_samples_per_link, + dedup_window_us: settings.inet_lookback.dedup_window_us, + }; + + let mut accumulator = InetLookbackAccumulator::new(config, expected_links); + + info!( + "Using lookback accumulator for target epoch {} (threshold: {:.0}%)", + target_epoch, + settings.inet_lookback.min_coverage_threshold * 100.0 + ); + + // Try epochs from target_epoch down to (target_epoch - max_lookback + 1) + for i in 0..settings.inet_lookback.max_epochs_lookback { + let current_epoch = target_epoch.saturating_sub(i); + + // Fetch data for this epoch + let data = fetch(rpc_client, settings, current_epoch).await?; + + if data.internet_latency_samples.is_empty() { + warn!( + "Epoch {} has no internet telemetry data. Continuing...", + current_epoch + ); + continue; + } + + let epoch_data = EpochData::new(current_epoch, data); + + // Calculate coverage gain (how many NEW routes this epoch would add) + let gain = accumulator.calculate_coverage_gain(&epoch_data); + let current_coverage = accumulator.coverage_ratio() * 100.0; + + if gain > 0.0 { + info!( + "Epoch {} adds {:.1}% new route coverage (current: {:.1}%)", + current_epoch, + gain * 100.0, + current_coverage + ); + } else { + info!( + "Epoch {} adds no new routes but may pad sample gaps (current: {:.1}%)", + current_epoch, current_coverage + ); + } + + // Always add epoch - even with 0% new routes, it helps fill temporal gaps + // Example: epoch 80 has lax->nyc at times 1000-1200, epoch 79 has lax->nyc at 1400-1600 + // We combine both to get better (not necessarily complete) temporal coverage + accumulator.add_epoch(epoch_data); + + // Check if we've met the route coverage threshold (e.g., 80% of expected routes) + // Note: This is about route coverage, not temporal coverage within routes + if accumulator.is_threshold_met() { + let final_coverage = accumulator.coverage_ratio() * 100.0; + let epochs_used = accumulator.get_epochs_used(); + + info!( + "Route coverage threshold met at {:.1}% using epochs: {:?}", + final_coverage, epochs_used + ); + + // Merge all epochs - combines samples, deduplicates temporal overlaps + // Missing time windows are OK - we don't need 100% temporal coverage + let merged_data = accumulator.merge_all()?; + + // Return the most recent epoch used + let effective_epoch = epochs_used.into_iter().max().unwrap_or(target_epoch); + return Ok((effective_epoch, merged_data)); + } + } + + // Didn't reach threshold, use what we have + let final_coverage = accumulator.coverage_ratio() * 100.0; + let epochs_used = accumulator.get_epochs_used(); + + if !epochs_used.is_empty() { + warn!( + "Coverage threshold not met. Using {:.1}% coverage from epochs: {:?}", + final_coverage, epochs_used + ); + + let merged_data = accumulator.merge_all()?; + let effective_epoch = epochs_used.into_iter().max().unwrap_or(target_epoch); + Ok((effective_epoch, merged_data)) + } else { + bail!( + "No internet telemetry data available within {} epochs of epoch {}", + settings.inet_lookback.max_epochs_lookback, + target_epoch + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_account_type_discriminator() { + // Verify the discriminator value is 4 as expected + assert_eq!( + ACCOUNT_TYPE_DISCRIMINATOR, 4, + "Internet discriminator should be 4 for InternetLatencySamples" + ); + + // Also verify the AccountType enum value + assert_eq!(AccountType::InternetLatencySamples as u8, 4); + } +} diff --git a/offchain/crates/contributor-rewards/src/ingestor/mod.rs b/offchain/crates/contributor-rewards/src/ingestor/mod.rs new file mode 100644 index 0000000000..192b45a17a --- /dev/null +++ b/offchain/crates/contributor-rewards/src/ingestor/mod.rs @@ -0,0 +1,9 @@ +pub mod demand; +pub mod epoch; +pub mod fetcher; +pub mod inet_accumulator; +pub mod internet; +pub mod serviceability; +pub mod shred_subscription; +pub mod telemetry; +pub mod types; diff --git a/offchain/crates/contributor-rewards/src/ingestor/serviceability.rs b/offchain/crates/contributor-rewards/src/ingestor/serviceability.rs new file mode 100644 index 0000000000..eda9c5044a --- /dev/null +++ b/offchain/crates/contributor-rewards/src/ingestor/serviceability.rs @@ -0,0 +1,297 @@ +use std::{ + str::FromStr, + time::{Duration, Instant}, +}; + +use anyhow::{Context, Result, bail}; +use backon::{ExponentialBuilder, Retryable}; +use doublezero_serviceability::state::{ + accesspass::AccessPass, accounttype::AccountType, contributor::Contributor, device::Device, + exchange::Exchange, link::Link, location::Location, multicastgroup::MulticastGroup, user::User, +}; +use solana_account_decoder::UiAccountEncoding; +use solana_client::{ + client_error::ClientError as SolanaClientError, + nonblocking::rpc_client::RpcClient, + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::pubkey::Pubkey; +use tracing::{debug, info, warn}; + +use crate::{ingestor::types::DZServiceabilityData, settings::Settings}; + +/// Account types that we actually process in the rewards calculator +/// We ignore GlobalState, Config, ProgramConfig, and Contributor +const PROCESSED_ACCOUNT_TYPES: &[AccountType] = &[ + AccountType::Location, + AccountType::Exchange, + AccountType::Device, + AccountType::Link, + AccountType::User, + AccountType::MulticastGroup, + AccountType::Contributor, + AccountType::AccessPass, +]; + +pub async fn fetch(rpc_client: &RpcClient, settings: &Settings) -> Result { + // NOTE: This fetches current serviceability state only + // Historical state is not available as serviceability accounts + // don't have timestamp/epoch fields and updates overwrite data. + // This creates a temporal mismatch with historical telemetry data. + let mut serviceability_data = DZServiceabilityData::default(); + let mut total_processed = 0; + let mut total_fetch_errors = 0; + let mut total_decode_failures = 0; + // Reward-bearing types whose decode failures must fail the epoch, paired with + // the offending pubkeys. Collected across the full sweep so every bad account + // is warned before we bail (see the policy note below). + let mut fatal_decode_failures = Vec::new(); + + // Fetch each account type separately with RPC filtering + for account_type in PROCESSED_ACCOUNT_TYPES { + match fetch_by_type(rpc_client, settings, *account_type).await { + Err(e) => { + warn!("Failed to fetch {} accounts: {}", account_type, e); + total_fetch_errors += 1; + } + Ok(accounts) => { + debug!("Processing {} {} accounts", accounts.len(), account_type); + + let (processed, failed_pubkeys) = + decode_accounts(&mut serviceability_data, *account_type, accounts); + total_processed += processed; + total_decode_failures += failed_pubkeys.len(); + + // Policy split: AccessPass is reward-neutral, so a decode failure + // there is skipped (already warned + counted). Every other type is + // reward-bearing — a partial snapshot would feed Shapley a silently + // shrunk graph and freeze a skewed merkle permanently, so those + // decode failures fail the epoch loudly instead. + if !failed_pubkeys.is_empty() && *account_type != AccountType::AccessPass { + fatal_decode_failures.push((*account_type, failed_pubkeys)); + } + } + } + } + + info!( + "Processed {} serviceability accounts, contributors={}, locations={}, exchanges={}, devices={}, links={}, users={}, mcast_groups={}, access_passes={}. Errors={}, DecodeErrors={}", + total_processed, + serviceability_data.contributors.len(), + serviceability_data.locations.len(), + serviceability_data.exchanges.len(), + serviceability_data.devices.len(), + serviceability_data.links.len(), + serviceability_data.users.len(), + serviceability_data.multicast_groups.len(), + serviceability_data.access_passes.len(), + total_fetch_errors, + total_decode_failures, + ); + + if !fatal_decode_failures.is_empty() { + let affected = fatal_decode_failures.len(); + let detail = fatal_decode_failures + .iter() + .map(|(account_type, pubkeys)| { + let count = pubkeys.len(); + let pubkeys = pubkeys + .iter() + .map(|pubkey| pubkey.to_string()) + .collect::>() + .join(", "); + format!("{account_type} ({count}): {pubkeys}") + }) + .collect::>() + .join("; "); + bail!( + "Aborting serviceability snapshot: {affected} reward-bearing account type(s) had undecodable accounts: {detail}" + ); + } + + Ok(serviceability_data) +} + +// Decode every fetched account of one type into `serviceability_data`, warning, +// counting, and skipping each account that fails to decode. Returns the number +// of accounts stored and the pubkeys that failed to decode; the caller decides +// whether those failures are tolerable (AccessPass) or must fail the epoch. +// Kept separate from the RPC fetch so the skip-and-count policy is the tested +// unit rather than a loop re-implemented in a test. +fn decode_accounts( + serviceability_data: &mut DZServiceabilityData, + account_type: AccountType, + accounts: Vec<(Pubkey, Vec)>, +) -> (usize, Vec) { + let mut processed = 0; + let mut failed_pubkeys = Vec::new(); + + for (pubkey, account_data) in accounts { + if account_data.is_empty() { + continue; + } + + let decoded = match account_type { + AccountType::Location => Location::try_from(&account_data[..]).map(|location| { + serviceability_data.locations.insert(pubkey, location); + }), + AccountType::Exchange => Exchange::try_from(&account_data[..]).map(|exchange| { + serviceability_data.exchanges.insert(pubkey, exchange); + }), + AccountType::Device => Device::try_from(&account_data[..]).map(|device| { + serviceability_data.devices.insert(pubkey, device); + }), + AccountType::Link => Link::try_from(&account_data[..]).map(|link| { + serviceability_data.links.insert(pubkey, link); + }), + AccountType::User => User::try_from(&account_data[..]).map(|user| { + serviceability_data.users.insert(pubkey, user); + }), + AccountType::MulticastGroup => { + MulticastGroup::try_from(&account_data[..]).map(|multicast_group| { + serviceability_data + .multicast_groups + .insert(pubkey, multicast_group); + }) + } + AccountType::Contributor => { + Contributor::try_from(&account_data[..]).map(|contributor| { + serviceability_data.contributors.insert(pubkey, contributor); + }) + } + AccountType::AccessPass => AccessPass::try_from(&account_data[..]).map(|access_pass| { + serviceability_data + .access_passes + .insert(pubkey, access_pass); + }), + _ => { + warn!( + "Unexpected account type {:?} in processed list", + account_type + ); + continue; + } + }; + + match decoded { + Ok(()) => processed += 1, + Err(e) => { + warn!( + "Failed to decode {} account {} ({} bytes): {}", + account_type, + pubkey, + account_data.len(), + e + ); + metrics::counter!( + "doublezero_contributor_rewards_serviceability_decode_errors", + "account_type" => account_type.to_string(), + ) + .increment(1); + failed_pubkeys.push(pubkey); + } + } + } + + (processed, failed_pubkeys) +} + +/// Fetch serviceability data by account type using RPC filters +async fn fetch_by_type( + rpc_client: &RpcClient, + settings: &Settings, + account_type: AccountType, +) -> Result)>> { + let program_id = &settings.programs.serviceability_program_id; + let program_pubkey = Pubkey::from_str(program_id) + .with_context(|| format!("Invalid serviceability program ID: {program_id}"))?; + + let filters = vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded( + 0, + &[account_type as u8], + ))]; + + let config = RpcProgramAccountsConfig { + filters: Some(filters), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64Zstd), + commitment: Some(CommitmentConfig::finalized()), + ..RpcAccountInfoConfig::default() + }, + ..RpcProgramAccountsConfig::default() + }; + + let start = Instant::now(); + let accounts = (|| async { + rpc_client + .get_program_accounts_with_config(&program_pubkey, config.clone()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + debug!( + "Fetching serviceability account took: {:?}", + start.elapsed() + ); + + debug!("Found {} {} accounts", accounts.len(), account_type); + // Convert from Vec<(Pubkey, Account)> to Vec<(Pubkey, Vec)> + let accounts_with_data: Vec<(Pubkey, Vec)> = accounts + .into_iter() + .map(|(pubkey, account)| (pubkey, account.data)) + .collect(); + + Ok(accounts_with_data) +} + +#[cfg(test)] +mod tests { + use doublezero_serviceability::state::location::LocationStatus; + + use super::*; + + // A mixed batch (one valid Location, one undecodable account) must store the + // valid account, report exactly one decode failure with its pubkey, and leave + // the garbage account out of the map. + #[test] + fn test_decode_accounts_stores_valid_and_reports_undecodable() { + let mut serviceability_data = DZServiceabilityData::default(); + let valid_pubkey = Pubkey::new_unique(); + let garbage_pubkey = Pubkey::new_unique(); + + let location = Location { + account_type: AccountType::Location, + owner: Pubkey::new_unique(), + index: 1, + bump_seed: 255, + lat: 52.37, + lng: 4.9, + loc_id: 42, + status: LocationStatus::Activated, + code: "ams".to_string(), + name: "Amsterdam".to_string(), + country: "NL".to_string(), + reference_count: 0, + }; + let accounts = vec![ + (valid_pubkey, borsh::to_vec(&location).unwrap()), + // Leading discriminant is not `AccountType::Location`, so this fails + // to decode. + (garbage_pubkey, vec![0xFF, 0x00, 0x00]), + ]; + + let (processed, failed_pubkeys) = + decode_accounts(&mut serviceability_data, AccountType::Location, accounts); + + assert_eq!(processed, 1); + assert_eq!(failed_pubkeys, vec![garbage_pubkey]); + assert_eq!(serviceability_data.locations.len(), 1); + assert!(serviceability_data.locations.contains_key(&valid_pubkey)); + assert!(!serviceability_data.locations.contains_key(&garbage_pubkey)); + } +} diff --git a/offchain/crates/contributor-rewards/src/ingestor/shred_subscription.rs b/offchain/crates/contributor-rewards/src/ingestor/shred_subscription.rs new file mode 100644 index 0000000000..8f3a44c8f7 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/ingestor/shred_subscription.rs @@ -0,0 +1,79 @@ +use std::{collections::BTreeMap, time::Instant}; + +use anyhow::{Context, Result}; +use doublezero_solana_sdk::shred_subscription::{ + ID as SHRED_SUBSCRIPTION_PROGRAM_ID, + state::{METRO_HISTORY_DISCRIMINATOR, parse_metro_history}, +}; +use solana_account_decoder::UiAccountEncoding; +use solana_client::{ + nonblocking::rpc_client::RpcClient, + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::pubkey::Pubkey; +use tracing::{debug, info, warn}; + +/// Fetch metro prices from the shred subscription program's MetroHistory accounts. +/// +/// Returns a map of exchange pubkey to the current USDC price in whole dollars. +pub async fn fetch_metro_prices(rpc_client: &RpcClient) -> Result> { + let discriminator_bytes = borsh::to_vec(&METRO_HISTORY_DISCRIMINATOR) + .context("serializing MetroHistory discriminator")?; + let filters = vec![RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 0, + discriminator_bytes, + ))]; + + let config = RpcProgramAccountsConfig { + filters: Some(filters), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64Zstd), + commitment: Some(CommitmentConfig::finalized()), + ..RpcAccountInfoConfig::default() + }, + ..RpcProgramAccountsConfig::default() + }; + + let program_id = *SHRED_SUBSCRIPTION_PROGRAM_ID; + let start = Instant::now(); + let accounts = rpc_client + .get_program_accounts_with_config(&program_id, config) + .await + .context("Failed to fetch MetroHistory accounts")?; + debug!("Fetching MetroHistory accounts took: {:?}", start.elapsed()); + + let mut metro_prices = BTreeMap::new(); + let mut errors = 0; + + for (pubkey, account) in &accounts { + let Some(info) = parse_metro_history(&account.data) else { + warn!( + "Failed to parse MetroHistory account {} ({} bytes)", + pubkey, + account.data.len() + ); + errors += 1; + continue; + }; + + if info.current_usdc_price > 0 { + metro_prices.insert(info.exchange_key, info.current_usdc_price); + } else { + debug!( + "MetroHistory {} (exchange {}) has zero price, skipping", + pubkey, info.exchange_key + ); + } + } + + info!( + "Fetched {} MetroHistory accounts, {} metro prices extracted, {} errors", + accounts.len(), + metro_prices.len(), + errors, + ); + + Ok(metro_prices) +} diff --git a/offchain/crates/contributor-rewards/src/ingestor/telemetry.rs b/offchain/crates/contributor-rewards/src/ingestor/telemetry.rs new file mode 100644 index 0000000000..07ec83e1f9 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/ingestor/telemetry.rs @@ -0,0 +1,189 @@ +use std::{ + str::FromStr, + time::{Duration, Instant}, +}; + +use anyhow::{Context, Result}; +use backon::{ExponentialBuilder, Retryable}; +use doublezero_telemetry::state::{ + accounttype::AccountType, device_latency_samples::DeviceLatencySamples, +}; +use solana_account_decoder::UiAccountEncoding; +use solana_client::{ + client_error::ClientError as SolanaClientError, + nonblocking::rpc_client::RpcClient, + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::pubkey::Pubkey; +use tracing::{debug, info, warn}; + +use crate::{ + ingestor::types::{DZDTelemetryData, DZDeviceLatencySamples}, + settings::Settings, +}; + +// Use the correct discriminator value from the AccountType enum +// AccountType::DeviceLatencySamples = 3 (not the V0 version which is 1) +const ACCOUNT_TYPE_DISCRIMINATOR: u8 = AccountType::DeviceLatencySamples as u8; + +/// Fetch telemetry data for a specific epoch using RPC filtering +pub async fn fetch( + dz_rpc_client: &RpcClient, + settings: &Settings, + epoch: u64, +) -> Result { + let program_id = &settings.programs.telemetry_program_id; + let program_pubkey = Pubkey::from_str(program_id) + .with_context(|| format!("Invalid telemetry program ID: {program_id}"))?; + + info!( + "Fetching telemetry data for epoch {} from program {}", + epoch, program_id + ); + + // Use 9-byte filter: account type (1 byte) + epoch (8 bytes) + let mut bytes = vec![ACCOUNT_TYPE_DISCRIMINATOR]; + bytes.extend_from_slice(&epoch.to_le_bytes()); + let filters = vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded(0, &bytes))]; + + let config = RpcProgramAccountsConfig { + filters: Some(filters), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64Zstd), + commitment: Some(CommitmentConfig::finalized()), + ..RpcAccountInfoConfig::default() + }, + ..RpcProgramAccountsConfig::default() + }; + + let start = Instant::now(); + let accounts = (|| async { + dz_rpc_client + .get_program_accounts_with_config(&program_pubkey, config.clone()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!("retrying error: {:?} with sleeping {:?}", err, dur) + }) + .await?; + debug!("Fetching telemetry account took: {:?}", start.elapsed()); + + info!( + "Found {} telemetry accounts for epoch {}", + accounts.len(), + epoch + ); + + let mut device_latency_samples = Vec::new(); + let batch_size = 100; + let mut error_count = 0; + + for (i, chunk) in accounts.chunks(batch_size).enumerate() { + info!( + "Processing telemetry batch {}/{}", + i + 1, + accounts.len().div_ceil(batch_size) + ); + + for (pubkey, account) in chunk { + match DeviceLatencySamples::try_from(&account.data[..]) { + Ok(samples) => { + // Verify epoch matches (should always be true due to RPC filter) + if samples.header.epoch != epoch { + warn!( + "Unexpected epoch mismatch: expected {}, got {}", + epoch, samples.header.epoch + ); + continue; + } + + debug!( + "Processing samples for epoch {}: samples={}, interval={}μs", + epoch, + samples.header.next_sample_index, + samples.header.sampling_interval_microseconds + ); + + let dz_samples = DZDeviceLatencySamples::from_raw(*pubkey, &samples); + device_latency_samples.push(dz_samples); + } + Err(e) => { + warn!("Failed to deserialize telemetry account {}: {}", pubkey, e); + error_count += 1; + } + } + } + } + + info!( + "Processed {} telemetry accounts for epoch {} ({} errors)", + device_latency_samples.len(), + epoch, + error_count + ); + + if device_latency_samples.is_empty() { + return Ok(DZDTelemetryData::default()); + } + + let total_samples: usize = device_latency_samples.iter().map(|d| d.samples.len()).sum(); + let avg_samples_per_account = total_samples / device_latency_samples.len(); + + info!( + "DZD Telemetry stats for epoch {epoch}, total_samples={total_samples}, avg_samples_per_account={avg_samples_per_account}", + ); + + Ok(DZDTelemetryData { + device_latency_samples, + accounts, + }) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_account_type_discriminator() { + // Verify the discriminator value is 3 as expected + assert_eq!( + ACCOUNT_TYPE_DISCRIMINATOR, 3, + "Telemetry discriminator should be 3 for DeviceLatencySamples" + ); + + // Also verify the AccountType enum value + assert_eq!(AccountType::DeviceLatencySamples as u8, 3); + } + + #[test] + fn test_epoch_filter_bytes() { + let epoch: u64 = 66; + let _expected_bytes = [ + 3, // discriminator for DeviceLatencySamples + 66, 0, 0, 0, 0, 0, 0, 0, // epoch 66 in little-endian + ]; + + let mut bytes = vec![ACCOUNT_TYPE_DISCRIMINATOR]; + bytes.extend_from_slice(&epoch.to_le_bytes()); + let filters = [RpcFilterType::Memcmp(Memcmp::new_base58_encoded(0, &bytes))]; + + // The filter should contain one Memcmp filter + assert_eq!(filters.len(), 1); + + // TODO: Would need to check the actual bytes in the Memcmp filter + // but that requires accessing the internal structure + } + + #[test] + fn test_v0_discriminator_not_used() { + // Verify we're NOT using the V0 version + assert_ne!( + AccountType::DeviceLatencySamplesV0 as u8, + ACCOUNT_TYPE_DISCRIMINATOR + ); + assert_eq!(AccountType::DeviceLatencySamplesV0 as u8, 1); + } +} diff --git a/offchain/crates/contributor-rewards/src/ingestor/types.rs b/offchain/crates/contributor-rewards/src/ingestor/types.rs new file mode 100644 index 0000000000..975b17f2b3 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/ingestor/types.rs @@ -0,0 +1,546 @@ +use std::{ + collections::BTreeMap, + fmt::{Display, Formatter}, +}; + +use anyhow::{Result, bail}; +use chrono::{DateTime, Utc}; +use doublezero_program_common::serializer; +use doublezero_serviceability::state::{ + accesspass::AccessPass as DZAccessPass, + contributor::Contributor as DZContributor, + device::Device as DZDevice, + exchange::Exchange as DZExchange, + interface::{CURRENT_INTERFACE_SCHEMA_VERSION, INTERFACE_MTU}, + link::Link as DZLink, + location::Location as DZLocation, + multicastgroup::MulticastGroup as DZMulticastGroup, + user::User as DZUser, +}; +use doublezero_telemetry::state::{ + device_latency_samples::DeviceLatencySamples, internet_latency_samples::InternetLatencySamples, +}; +use indexmap::IndexMap; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use solana_sdk::{account::Account, pubkey::Pubkey}; + +pub type KeyedAccounts = Vec<(Pubkey, Account)>; + +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct FetchData { + pub dz_serviceability: DZServiceabilityData, + pub dz_telemetry: DZDTelemetryData, + pub dz_internet: DZInternetData, + /// Metro (city) prices from shred subscription program. + /// Key: exchange pubkey, Value: price in whole USDC dollars. + #[serde( + default, + serialize_with = "serializer::serialize_pubkey_btreemap", + deserialize_with = "serializer::deserialize_pubkey_btreemap" + )] + pub metro_prices: BTreeMap, + pub start_us: u64, + pub end_us: u64, + pub fetched_at: DateTime, +} + +impl Display for FetchData { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "FetchData ({} to {}): locations={}, exchanges={}, devices={}, links={}, users={}, multicast_groups={}, telemetry_samples={}, internet_samples={}, metro_prices={}", + self.start_us, + self.end_us, + self.dz_serviceability.locations.len(), + self.dz_serviceability.exchanges.len(), + self.dz_serviceability.devices.len(), + self.dz_serviceability.links.len(), + self.dz_serviceability.users.len(), + self.dz_serviceability.multicast_groups.len(), + self.dz_telemetry.device_latency_samples.len(), + self.dz_internet.internet_latency_samples.len(), + self.metro_prices.len(), + ) + } +} + +impl FetchData { + pub fn get_device_location(&self, device_pubkey: &Pubkey) -> Option<&DZLocation> { + self.dz_serviceability + .devices + .get(device_pubkey) + .map(|device| device.location_pk) + .and_then(|loc_pk| self.dz_serviceability.locations.get(&loc_pk)) + } + + pub fn get_device_by_code(&self, code: &str) -> Option<&DZDevice> { + self.dz_serviceability + .devices + .values() + .find(|d| d.code == code) + } + + pub fn get_location_by_code(&self, code: &str) -> Option<&DZLocation> { + self.dz_serviceability + .locations + .values() + .find(|l| l.code == code) + } + + pub fn get_link_devices(&self, link: &DZLink) -> (Option<&DZDevice>, Option<&DZDevice>) { + let from_device = self.dz_serviceability.devices.get(&link.side_a_pk); + let to_device = self.dz_serviceability.devices.get(&link.side_z_pk); + (from_device, to_device) + } +} + +/// Apply compatibility migrations to snapshot/fetch-data JSON before deserializing. +/// +/// This keeps snapshots produced by older binaries readable after bumping +/// `doublezero-serviceability` to account layouts with newly serialized fields. +pub fn apply_json_compat_migrations(value: &mut Value) { + if let Some(serviceability) = value.get_mut("dz_serviceability") { + apply_serviceability_json_compat_migrations(serviceability); + } + + if let Some(serviceability) = value + .get_mut("fetch_data") + .and_then(|fetch_data| fetch_data.get_mut("dz_serviceability")) + { + apply_serviceability_json_compat_migrations(serviceability); + } +} + +fn apply_serviceability_json_compat_migrations(serviceability: &mut Value) { + // doublezero-serviceability v0.19 added these Link fields. Historical + // snapshots serialized before that bump do not contain them; default them to + // the same values used by onchain/Borsh deserialization for absent tails. + if let Some(links) = serviceability + .get_mut("links") + .and_then(|links| links.as_object_mut()) + { + for link in links.values_mut().filter_map(|link| link.as_object_mut()) { + link.entry("link_topologies") + .or_insert_with(|| Value::Array(Vec::new())); + link.entry("link_flags") + .or_insert_with(|| Value::Number(0.into())); + } + } + + // doublezero-serviceability v0.20 added durable tunnel/BGP state to User; + // client/v0.25.0 then appended `bgp_rtt_ns`, and #4030 (per-feed EdgeSeat + // billing) appended `feed_pk`. All default to the same values onchain/Borsh + // deserialization uses for absent tails. + if let Some(users) = serviceability + .get_mut("users") + .and_then(|users| users.as_object_mut()) + { + for user in users.values_mut().filter_map(|user| user.as_object_mut()) { + user.entry("tunnel_endpoint") + .or_insert_with(|| Value::String("0.0.0.0".to_string())); + user.entry("tunnel_flags") + .or_insert_with(|| Value::Number(0.into())); + user.entry("bgp_status") + .or_insert_with(|| Value::String("Unknown".to_string())); + user.entry("last_bgp_up_at") + .or_insert_with(|| Value::Number(0.into())); + user.entry("last_bgp_reported_at") + .or_insert_with(|| Value::Number(0.into())); + user.entry("bgp_rtt_ns") + .or_insert_with(|| Value::Number(0.into())); + user.entry("feed_pk") + .or_insert_with(|| Value::String(Pubkey::default().to_string())); + } + } + + // doublezero-serviceability client/v0.27.1 appended per-pass EdgeSeat + // user counters/limits to AccessPass. Historical snapshots serialized + // before that bump do not contain them; default them to the same values used + // by onchain/Borsh deserialization for absent tails. + if let Some(access_passes) = serviceability + .get_mut("access_passes") + .and_then(|access_passes| access_passes.as_object_mut()) + { + for access_pass in access_passes + .values_mut() + .filter_map(|access_pass| access_pass.as_object_mut()) + { + access_pass + .entry("unicast_user_count") + .or_insert_with(|| Value::Number(0.into())); + access_pass + .entry("max_unicast_users") + .or_insert_with(|| Value::Number(1.into())); + access_pass + .entry("multicast_user_count") + .or_insert_with(|| Value::Number(0.into())); + access_pass + .entry("max_multicast_users") + .or_insert_with(|| Value::Number(1.into())); + + // Snapshots captured before doublezero-serviceability#3831 carry the + // pre-rename variant name. + if access_pass.get("status").and_then(Value::as_str) == Some("Expired") { + access_pass.insert( + "status".to_string(), + Value::String("ExpiredDeprecated".to_string()), + ); + } + } + } + + // doublezero-serviceability client/v0.25.0 split a Device's single + // `interfaces` vec into two: a flat `interfaces: Vec` written at + // the end of the on-disk layout, plus a legacy + // `deprecated_interfaces: Vec` (the `{"V1": {...}}` / + // `{"V2": {...}}` enum) kept at the original offset for byte-compatible + // readers. Snapshots captured under <=v0.20 carry only the legacy enum vec + // under `interfaces`, so seed `deprecated_interfaces` from it verbatim and + // then project `interfaces` onto the flat form. The SDK keeps both vecs the + // same length, so seeding from the same source preserves that invariant. + if let Some(devices) = serviceability + .get_mut("devices") + .and_then(|devices| devices.as_object_mut()) + { + for device in devices + .values_mut() + .filter_map(|device| device.as_object_mut()) + { + if !device.contains_key("deprecated_interfaces") { + let legacy = device + .get("interfaces") + .cloned() + .unwrap_or_else(|| Value::Array(Vec::new())); + device.insert("deprecated_interfaces".to_string(), legacy); + } + + if let Some(interfaces) = device + .get_mut("interfaces") + .and_then(|interfaces| interfaces.as_array_mut()) + { + for interface in interfaces.iter_mut() { + migrate_interface_to_flat(interface); + } + } + } + } +} + +/// Project a legacy versioned `Interface` enum element (`{"V1": {...}}` / +/// `{"V2": {...}}`) onto the flat `Interface` struct introduced in +/// doublezero-serviceability client/v0.25.0. Mirrors the defaults stamped by the +/// SDK's `TryFrom<&InterfaceV1>` / `TryFrom<&InterfaceV2> for Interface` impls: +/// a V1 body fans in through V2, gaining `interface_cyoa`/`interface_dia` = +/// `None`, `bandwidth`/`cir` = 0, `mtu` = `INTERFACE_MTU`, `routing_mode` = +/// `Static`; both versions gain `version` = `CURRENT_INTERFACE_SCHEMA_VERSION` +/// and an empty `flex_algo_node_segments`. `size` is the on-disk byte length, +/// which offchain consumers never read (only `interface_type`/`bandwidth` are +/// used), so it is defaulted to 0 rather than recomputed. +fn migrate_interface_to_flat(interface: &mut Value) { + let Some(obj) = interface.as_object() else { + return; + }; + // Already in the flat v0.25 form; nothing to do. + if obj.contains_key("size") { + return; + } + + // Pull out the versioned body and note whether it's V1, which predates the + // CYOA/DIA/bandwidth/routing fields and so needs them backfilled. + let (is_v1, body) = if let Some(body) = obj.get("V1").and_then(Value::as_object) { + (true, body) + } else if let Some(body) = obj.get("V2").and_then(Value::as_object) { + (false, body) + } else { + return; + }; + + let mut flat = body.clone(); + + // V1 predates the CYOA/DIA/bandwidth/routing fields; backfill them with the + // same values the V1 -> V2 conversion uses. + if is_v1 { + flat.entry("interface_cyoa") + .or_insert_with(|| Value::String("None".to_string())); + flat.entry("interface_dia") + .or_insert_with(|| Value::String("None".to_string())); + flat.entry("bandwidth") + .or_insert_with(|| Value::Number(0.into())); + flat.entry("cir").or_insert_with(|| Value::Number(0.into())); + flat.entry("mtu") + .or_insert_with(|| Value::Number(INTERFACE_MTU.into())); + flat.entry("routing_mode") + .or_insert_with(|| Value::String("Static".to_string())); + } + + flat.entry("flex_algo_node_segments") + .or_insert_with(|| Value::Array(Vec::new())); + flat.insert( + "version".to_string(), + Value::Number(CURRENT_INTERFACE_SCHEMA_VERSION.into()), + ); + flat.insert("size".to_string(), Value::Number(0.into())); + + *interface = Value::Object(flat); +} + +/// Struct for all network data +/// +/// Note: Use IndexMap to preserve insertion order during serialization/deserialization. This +/// ensures deterministic JSON output and consistent iteration order, which is critical for +/// snapshot-based reward calculations that must match R implementation exactly. +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct DZServiceabilityData { + #[serde( + serialize_with = "serialize_pubkey_indexmap", + deserialize_with = "deserialize_pubkey_indexmap" + )] + pub locations: IndexMap, + #[serde( + serialize_with = "serialize_pubkey_indexmap", + deserialize_with = "deserialize_pubkey_indexmap" + )] + pub exchanges: IndexMap, + #[serde( + serialize_with = "serialize_pubkey_indexmap", + deserialize_with = "deserialize_pubkey_indexmap" + )] + pub devices: IndexMap, + #[serde( + serialize_with = "serialize_pubkey_indexmap", + deserialize_with = "deserialize_pubkey_indexmap" + )] + pub links: IndexMap, + #[serde( + serialize_with = "serialize_pubkey_indexmap", + deserialize_with = "deserialize_pubkey_indexmap" + )] + pub users: IndexMap, + #[serde( + serialize_with = "serialize_pubkey_indexmap", + deserialize_with = "deserialize_pubkey_indexmap" + )] + pub multicast_groups: IndexMap, + #[serde( + serialize_with = "serialize_pubkey_indexmap", + deserialize_with = "deserialize_pubkey_indexmap" + )] + pub contributors: IndexMap, + #[serde( + serialize_with = "serializer::serialize_pubkey_btreemap", + deserialize_with = "serializer::deserialize_pubkey_btreemap" + )] + pub access_passes: BTreeMap, +} + +/// DB representation of DeviceLatencySamples +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DZDeviceLatencySamples { + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub pubkey: Pubkey, + pub epoch: u64, + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub origin_device_pk: Pubkey, + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub target_device_pk: Pubkey, + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub link_pk: Pubkey, + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub origin_device_location_pk: Pubkey, + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub target_device_location_pk: Pubkey, + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub origin_device_agent_pk: Pubkey, + pub sampling_interval_us: u64, + pub start_timestamp_us: u64, + pub samples: Vec, + pub sample_count: u32, +} + +impl DZDeviceLatencySamples { + pub fn from_raw(pubkey: Pubkey, samples: &DeviceLatencySamples) -> Self { + Self { + pubkey, + epoch: samples.header.epoch, + origin_device_pk: samples.header.origin_device_pk, + target_device_pk: samples.header.target_device_pk, + link_pk: samples.header.link_pk, + origin_device_location_pk: samples.header.origin_device_location_pk, + target_device_location_pk: samples.header.target_device_location_pk, + origin_device_agent_pk: samples.header.origin_device_agent_pk, + sampling_interval_us: samples.header.sampling_interval_microseconds, + start_timestamp_us: samples.header.start_timestamp_microseconds, + samples: samples.samples.clone(), + sample_count: samples.header.next_sample_index, + } + } +} + +/// Telemetry data container +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct DZDTelemetryData { + pub device_latency_samples: Vec, + #[serde(skip)] + pub accounts: KeyedAccounts, +} + +impl DZDTelemetryData { + pub fn start_end_us(&self) -> Result<(u64, u64)> { + let mut min_timestamp = u64::MAX; + let mut max_timestamp = 0u64; + for sample in &self.device_latency_samples { + min_timestamp = min_timestamp.min(sample.start_timestamp_us); + let end_timestamp = sample.start_timestamp_us + + (sample.sample_count as u64 * sample.sampling_interval_us); + max_timestamp = max_timestamp.max(end_timestamp); + } + + if min_timestamp == u64::MAX { + bail!("Incorrect start_us (min_timestamp) for telemetry data!") + } + if max_timestamp == 0u64 { + bail!("Incorrect end_us (max_timestamp) for telemetry data!") + } + + Ok((min_timestamp, max_timestamp)) + } +} + +/// Representation of InternetLatencySamples +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DZInternetLatencySamples { + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub pubkey: Pubkey, + pub epoch: u64, + pub data_provider_name: String, + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub oracle_agent_pk: Pubkey, + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub origin_exchange_pk: Pubkey, + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub target_exchange_pk: Pubkey, + pub sampling_interval_us: u64, + pub start_timestamp_us: u64, + pub samples: Vec, + pub sample_count: u32, +} + +impl DZInternetLatencySamples { + pub fn from_raw(pubkey: Pubkey, samples: &InternetLatencySamples) -> Self { + Self { + pubkey, + epoch: samples.header.epoch, + data_provider_name: samples.header.data_provider_name.to_string(), + oracle_agent_pk: samples.header.oracle_agent_pk, + origin_exchange_pk: samples.header.origin_exchange_pk, + target_exchange_pk: samples.header.target_exchange_pk, + sampling_interval_us: samples.header.sampling_interval_microseconds, + start_timestamp_us: samples.header.start_timestamp_microseconds, + samples: samples.samples.clone(), + sample_count: samples.header.next_sample_index, + } + } +} + +/// Telemetry data container +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct DZInternetData { + pub internet_latency_samples: Vec, + #[serde(skip)] + pub accounts: KeyedAccounts, +} + +/// Custom serializer for IndexMap that preserves insertion order +/// Serializes Pubkey as string keys in JSON +pub fn serialize_pubkey_indexmap( + map: &IndexMap, + serializer: S, +) -> Result +where + S: serde::Serializer, + T: Serialize, +{ + use serde::ser::SerializeMap; + let mut map_ser = serializer.serialize_map(Some(map.len()))?; + for (k, v) in map { + map_ser.serialize_entry(&k.to_string(), v)?; + } + map_ser.end() +} + +/// Custom deserializer for IndexMap that preserves insertion order +/// Deserializes from JSON object with string keys +pub fn deserialize_pubkey_indexmap<'de, D, T>( + deserializer: D, +) -> Result, D::Error> +where + D: serde::Deserializer<'de>, + T: Deserialize<'de>, +{ + use std::marker::PhantomData; + + use serde::de::{Error, MapAccess, Visitor}; + + struct IndexMapVisitor(PhantomData); + + impl<'de, T> Visitor<'de> for IndexMapVisitor + where + T: Deserialize<'de>, + { + type Value = IndexMap; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a map with Pubkey string keys") + } + + fn visit_map(self, mut access: M) -> Result + where + M: MapAccess<'de>, + { + let mut map = IndexMap::with_capacity(access.size_hint().unwrap_or(0)); + while let Some((key_str, value)) = access.next_entry::()? { + let key = key_str + .parse::() + .map_err(|e| Error::custom(format!("Invalid Pubkey: {}", e)))?; + map.insert(key, value); + } + Ok(map) + } + } + + deserializer.deserialize_map(IndexMapVisitor(PhantomData)) +} diff --git a/offchain/crates/contributor-rewards/src/lib.rs b/offchain/crates/contributor-rewards/src/lib.rs new file mode 100644 index 0000000000..9e0b7fd386 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/lib.rs @@ -0,0 +1,7 @@ +pub mod calculator; +pub mod cli; +pub mod ingestor; +pub mod processor; +pub mod scheduler; +pub mod settings; +pub mod storage; diff --git a/offchain/crates/contributor-rewards/src/main.rs b/offchain/crates/contributor-rewards/src/main.rs new file mode 100644 index 0000000000..5535424630 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/main.rs @@ -0,0 +1,207 @@ +// TODO: keeping this for now, remove when 2z-cli is ported + +use std::path::PathBuf; + +use anyhow::Result; +use clap::{Parser, Subcommand}; +use doublezero_contributor_rewards::{ + calculator::orchestrator::Orchestrator, + cli::{export::ExportCommands, inspect::InspectCommands, rewards::RewardsCommands}, + settings::Settings, +}; +use metrics_exporter_prometheus::PrometheusBuilder; +use tracing::{debug, warn}; +use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt}; + +#[derive(Parser, Debug)] +#[command( + name = "contributor-rewards", + about = "Off-chain contributor-rewards calculation for DoubleZero network", + version, + author, + after_help = r#"Configuration: + Configuration can be provided via: + 1. Environment variables with DZ__ prefix (e.g., DZ__RPC__DZ_URL) + 2. .env file in the current directory (see .env.example) + 3. Config file with -c option (see example.config.toml) + +Examples: + # Dry run for a specific epoch + contributor-rewards calculate-rewards --epoch 123 --dry-run + + # Calculate rewards for the previous epoch + contributor-rewards calculate-rewards -k keypair.json + + # Start automated scheduler + contributor-rewards scheduler start --dry-run + + # Read telemetry aggregates + contributor-rewards read-telem-agg --epoch 123 + + # Check a contributor's reward + contributor-rewards check-reward --contributor --epoch 123"# +)] +pub struct Cli { + /// Path to the configuration file (TOML format) + /// + /// If not provided, will attempt to load from environment variables + #[clap(short = 'c', long, value_name = "FILE")] + pub config: Option, + + #[command(subcommand)] + pub command: Commands, +} + +#[derive(Subcommand, Debug)] +pub enum Commands { + #[command(flatten)] + Rewards(RewardsCommands), + /// Inspect rewards and Shapley calculations + Inspect { + #[command(subcommand)] + cmd: InspectCommands, + }, + /// Export Shapley calculation data + Export { + #[command(subcommand)] + cmd: ExportCommands, + }, + /// Create a complete snapshot for deterministic reward calculations + #[command( + long_about = "Creates a complete snapshot with all processing applied (internet accumulator, \ + previous epoch lookups, etc.). By default, uploads to configured storage backend \ + (S3 or local-file from config). Use --local-file or --local-dir to override and save locally.", + after_help = r#"Examples: + # Upload to configured storage backend (S3 or local-file from config) + snapshot --epoch 27 + + # Override: save to specific local file + snapshot --epoch 27 --local-file ./test.json + + # Override: save to local directory with automatic naming + snapshot --epoch 27 --local-dir ./snapshots/ + + # Use with calculate-rewards for deterministic results + snapshot --epoch 27 --local-file snapshot.json + calculate-rewards --snapshot snapshot.json --dry-run"# + )] + Snapshot { + /// DZ epoch to snapshot (defaults to previous epoch) + #[arg(short, long, value_name = "EPOCH")] + epoch: Option, + + /// Override: save snapshot to local file instead of configured storage + #[arg(long, value_name = "FILE", conflicts_with = "local_dir")] + local_file: Option, + + /// Override: save snapshot to local directory instead of configured storage + #[arg(long, value_name = "DIR", conflicts_with = "local_file")] + local_dir: Option, + }, + /// Analyze telemetry data (internet or device) + Telemetry { + #[command(subcommand)] + cmd: doublezero_contributor_rewards::cli::telemetry::TelemetryCommands, + }, + /// Run automated rewards scheduler + Scheduler { + #[command(subcommand)] + cmd: doublezero_contributor_rewards::cli::scheduler::SchedulerCommands, + }, +} + +impl Cli { + pub async fn run(self) -> Result<()> { + let settings = if let Some(config_path) = &self.config { + Settings::from_path(config_path)? + } else { + Settings::from_env()? + }; + init_logging(&settings.log_level)?; + + // Initialize metrics exporter if enabled + if let Some(metrics) = &settings.metrics { + if let Err(e) = PrometheusBuilder::new() + .with_http_listener(metrics.addr) + .install() + { + warn!("Failed to initialize metrics exporter: {e}. Continuing without metrics."); + } else { + export_build_info(); + debug!("Metrics exporter initialized on {}", metrics.addr); + } + } else { + debug!("Metrics export disabled"); + } + + let orchestrator = Orchestrator::new(&settings); + + // Route to module handlers + match self.command { + Commands::Rewards(cmd) => { + doublezero_contributor_rewards::cli::rewards::handle(&orchestrator, cmd).await + } + Commands::Inspect { cmd } => { + doublezero_contributor_rewards::cli::inspect::handle(&orchestrator, cmd).await + } + Commands::Export { cmd } => { + doublezero_contributor_rewards::cli::export::handle(&orchestrator, cmd).await + } + Commands::Snapshot { + epoch, + local_file, + local_dir, + } => { + doublezero_contributor_rewards::cli::snapshot::create_snapshot( + &orchestrator, + epoch, + local_file, + local_dir, + ) + .await + } + Commands::Telemetry { cmd } => { + doublezero_contributor_rewards::cli::telemetry::handle(&orchestrator, cmd).await + } + Commands::Scheduler { cmd } => { + doublezero_contributor_rewards::cli::scheduler::handle(&orchestrator, cmd).await + } + } + } +} + +#[tokio::main] +async fn main() -> Result<()> { + let cli = Cli::parse(); + cli.run().await +} + +fn init_logging(log_level: &str) -> Result<()> { + tracing_subscriber::registry() + .with(EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(log_level))) + .with( + tracing_subscriber::fmt::layer() + .with_target(false) + .with_thread_ids(false) + .with_thread_names(false), + ) + .init(); + + Ok(()) +} + +fn export_build_info() { + let version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")); + let build_commit = option_env!("BUILD_COMMIT").unwrap_or("UNKNOWN"); + let build_date = option_env!("DATE").unwrap_or("UNKNOWN"); + let pkg_version = env!("CARGO_PKG_VERSION"); + + metrics::gauge!( + "doublezero_contributor_rewards_build_info", + "version" => version, + "commit" => build_commit, + "date" => build_date, + "pkg_version" => pkg_version + ) + .set(1.0); +} diff --git a/offchain/crates/contributor-rewards/src/processor/constants.rs b/offchain/crates/contributor-rewards/src/processor/constants.rs new file mode 100644 index 0000000000..227e1d954b --- /dev/null +++ b/offchain/crates/contributor-rewards/src/processor/constants.rs @@ -0,0 +1,6 @@ +// Penalty values for dead links (100% packet loss) + +// Latency (high): 1000ms +pub const PENALTY_RTT_US: f64 = 1_000_000.0; +// Jitter (high): 100ms +pub const PENALTY_JITTER_US: f64 = 100_000.0; diff --git a/offchain/crates/contributor-rewards/src/processor/internet.rs b/offchain/crates/contributor-rewards/src/processor/internet.rs new file mode 100644 index 0000000000..74be2eae5a --- /dev/null +++ b/offchain/crates/contributor-rewards/src/processor/internet.rs @@ -0,0 +1,221 @@ +use std::collections::BTreeMap; + +use anyhow::Result; +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_common::serializer; +use serde::{Deserialize, Serialize}; +use solana_sdk::pubkey::Pubkey; +use tabled::{Table, Tabled, settings::Style}; +use tracing::{debug, warn}; + +use crate::{ + ingestor::types::{DZInternetLatencySamples, FetchData}, + processor::{process::process_internet_samples, util::display_us_as_ms}, +}; + +// Key format: "{origin_code} → {target_code} ({data_provider})" +pub type InternetTelemetryStatMap = BTreeMap; + +#[derive(Debug, Clone, Tabled, Serialize, BorshSerialize, BorshDeserialize, Deserialize)] +pub struct InternetTelemetryStats { + pub circuit: String, + #[tabled(skip)] + pub origin_exchange_code: String, + #[tabled(skip)] + pub target_exchange_code: String, + #[tabled(skip)] + pub data_provider_name: String, + #[tabled(skip)] + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub oracle_agent_pk: Pubkey, + #[tabled(skip)] + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub origin_exchange_pk: Pubkey, + #[tabled(skip)] + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub target_exchange_pk: Pubkey, + #[tabled(display = "display_us_as_ms", rename = "rtt_mean(ms)")] + pub rtt_mean_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_median(ms)")] + pub rtt_median_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_min(ms)")] + pub rtt_min_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_max(ms)")] + pub rtt_max_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_p90(ms)")] + pub rtt_p90_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_p95(ms)")] + pub rtt_p95_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_p99(ms)")] + pub rtt_p99_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_stddev(ms)")] + pub rtt_stddev_us: f64, + #[tabled(display = "display_us_as_ms", rename = "avg_jitter(ms)")] + pub avg_jitter_us: f64, + #[tabled(display = "display_us_as_ms", rename = "ewma_jitter(ms)")] + pub jitter_ewma_us: f64, + #[tabled(display = "display_us_as_ms", rename = "max_jitter(ms)")] + pub max_jitter_us: f64, + #[tabled(rename = "loss_rate")] + pub packet_loss: f64, + #[tabled(rename = "loss_count")] + pub loss_count: u64, + #[tabled(rename = "success_count")] + pub success_count: u64, + #[tabled(rename = "samples")] + pub total_samples: usize, + #[tabled(skip)] + pub missing_data_ratio: f64, +} + +pub struct InternetTelemetryProcessor; + +// Helper function to print stats in table fmt +pub fn print_internet_stats(map: &InternetTelemetryStatMap) -> String { + let stats: Vec = map.values().cloned().collect(); + Table::new(stats) + .with(Style::psql().remove_horizontals()) + .to_string() +} + +impl InternetTelemetryProcessor { + pub fn process(fetch_data: &FetchData) -> Result { + // Build exchange PK to xchange code mapping (internet telemetry uses exchange PKs) + let exchange_pk_to_code: BTreeMap = fetch_data + .dz_serviceability + .exchanges + .iter() + .map(|(pubkey, exch)| (*pubkey, exch.code.to_string())) + .collect(); + + // Filter out ripeatlas samples (R implementation excludes ripeatlas) + let filtered_samples: Vec = fetch_data + .dz_internet + .internet_latency_samples + .iter() + .filter(|sample| sample.data_provider_name != "ripeatlas") + .cloned() + .collect(); + + let total_samples = fetch_data.dz_internet.internet_latency_samples.len(); + let filtered_count = filtered_samples.len(); + if filtered_count < total_samples { + debug!( + "Filtered out {} ripeatlas samples ({} remaining)", + total_samples - filtered_count, + filtered_count + ); + } + + // Process internet telemetry samples (excluding ripeatlas) + let generic_stats = + process_internet_samples(&filtered_samples, fetch_data.start_us, fetch_data.end_us)?; + + debug!( + "Processed {} circuits for internet data", + generic_stats.len() + ); + + // Convert from generic TelemetryStatistics to InternetTelemetryStats + let mut result = BTreeMap::new(); + + // Need to get the first sample from each group to extract oracle agent + let mut sample_by_key: BTreeMap = BTreeMap::new(); + for sample in filtered_samples.iter() { + let key = format!( + "{}:{}:{}", + sample.origin_exchange_pk, sample.target_exchange_pk, sample.data_provider_name + ); + sample_by_key.entry(key).or_insert(sample); + } + + for (circuit_key, stats) in generic_stats { + // Parse circuit key to extract info + let parts: Vec<&str> = circuit_key.split(':').collect(); + if parts.len() != 3 { + continue; + } + + let origin_exchange_pk = parts[0].parse::().ok(); + let target_exchange_pk = parts[1].parse::().ok(); + let data_provider_name = parts[2].to_string(); + + if let (Some(origin_pk), Some(target_pk)) = (origin_exchange_pk, target_exchange_pk) { + // Check if these PKs are actually exchanges (not deprecated location PKs) + // Skip samples using the old location PK format + // This is holdover fix for mixed telem data (but should be safe to keep regardless) + let origin_exchange_code = match exchange_pk_to_code.get(&origin_pk) { + Some(code) => code.clone(), + None => { + debug!( + "Skipping telemetry sample with non-exchange origin PK: {} (likely using deprecated location PK)", + origin_pk + ); + continue; + } + }; + + let target_exchange_code = match exchange_pk_to_code.get(&target_pk) { + Some(code) => code.clone(), + None => { + debug!( + "Skipping telemetry sample with non-exchange target PK: {} (likely using deprecated location PK)", + target_pk + ); + continue; + } + }; + + // Get oracle agent from sample + let oracle_agent_pk = sample_by_key + .get(&circuit_key) + .map(|s| s.oracle_agent_pk) + .unwrap_or_else(|| { + warn!("Could not find sample for circuit key: {}", circuit_key); + Pubkey::default() + }); + + let internet_stats = InternetTelemetryStats { + circuit: format!( + "{origin_exchange_code} → {target_exchange_code} ({data_provider_name})" + ), + origin_exchange_code: origin_exchange_code.to_string(), + target_exchange_code: target_exchange_code.to_string(), + data_provider_name: data_provider_name.to_string(), + oracle_agent_pk, + origin_exchange_pk: origin_pk, + target_exchange_pk: target_pk, + rtt_mean_us: stats.rtt_mean_us, + rtt_median_us: stats.rtt_median_us, + rtt_min_us: stats.rtt_min_us, + rtt_max_us: stats.rtt_max_us, + rtt_p90_us: stats.rtt_p90_us, + rtt_p95_us: stats.rtt_p95_us, + rtt_p99_us: stats.rtt_p99_us, + rtt_stddev_us: stats.rtt_stddev_us, + avg_jitter_us: stats.avg_jitter_us, + jitter_ewma_us: stats.ewma_jitter_us, + max_jitter_us: stats.max_jitter_us, + packet_loss: stats.packet_loss, + loss_count: stats.loss_count, + success_count: stats.success_count, + total_samples: stats.total_samples, + missing_data_ratio: stats.missing_data_ratio, + }; + + result.insert(circuit_key, internet_stats); + } + } + + Ok(result) + } +} diff --git a/offchain/crates/contributor-rewards/src/processor/mod.rs b/offchain/crates/contributor-rewards/src/processor/mod.rs new file mode 100644 index 0000000000..2a2739b715 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/processor/mod.rs @@ -0,0 +1,6 @@ +pub mod constants; +pub mod internet; +pub mod process; +pub mod stats; +pub mod telemetry; +pub mod util; diff --git a/offchain/crates/contributor-rewards/src/processor/process.rs b/offchain/crates/contributor-rewards/src/processor/process.rs new file mode 100644 index 0000000000..816e2d645d --- /dev/null +++ b/offchain/crates/contributor-rewards/src/processor/process.rs @@ -0,0 +1,273 @@ +use std::collections::BTreeMap; + +use anyhow::Result; +use tracing::debug; + +use crate::{ + ingestor::types::{DZDeviceLatencySamples, DZInternetLatencySamples}, + processor::{ + stats::{ + TelemetryStatistics, extract_device_samples_in_range, + extract_internet_samples_in_range, get_device_grouping_key, get_internet_grouping_key, + }, + util::{ + JitterStats, calculate_jitter_statistics, calculate_packet_loss_stats, + calculate_rtt_statistics, + }, + }, +}; + +/// Process device telemetry samples into statistics +pub fn process_device_samples( + samples: &[DZDeviceLatencySamples], + start_us: u64, + end_us: u64, +) -> Result> { + let process_start = std::time::Instant::now(); + + // Group samples by circuit + let mut grouped_samples: BTreeMap> = BTreeMap::new(); + + for sample in samples { + grouped_samples + .entry(get_device_grouping_key(sample)) + .or_default() + .push(sample); + } + + debug!( + "Processing {} groups of device telemetry samples", + grouped_samples.len() + ); + + // Track sample count + metrics::counter!("doublezero_contributor_rewards_telemetry_samples_processed", "type" => "device") + .increment(samples.len() as u64); + + // Process each group + let mut results = BTreeMap::new(); + + for (key, sample_group) in grouped_samples { + let stats = calculate_device_group_statistics(&sample_group, start_us, end_us)?; + results.insert(key, stats); + } + + // Track processing time + metrics::histogram!("doublezero_contributor_rewards_telemetry_processing_duration", "type" => "device") + .record(process_start.elapsed().as_secs_f64()); + + Ok(results) +} + +/// Process internet telemetry samples into statistics +pub fn process_internet_samples( + samples: &[DZInternetLatencySamples], + start_us: u64, + end_us: u64, +) -> Result> { + let process_start = std::time::Instant::now(); + + // Group samples by route + let mut grouped_samples: BTreeMap> = BTreeMap::new(); + + for sample in samples { + grouped_samples + .entry(get_internet_grouping_key(sample)) + .or_default() + .push(sample); + } + + debug!( + "Processing {} groups of internet telemetry samples", + grouped_samples.len() + ); + + // Track sample count + metrics::counter!("doublezero_contributor_rewards_telemetry_samples_processed", "type" => "internet") + .increment(samples.len() as u64); + + // Process each group + let mut results = BTreeMap::new(); + + for (key, sample_group) in grouped_samples { + let stats = calculate_internet_group_statistics(&sample_group, start_us, end_us)?; + results.insert(key, stats); + } + + // Track processing time + metrics::histogram!("doublezero_contributor_rewards_telemetry_processing_duration", "type" => "internet") + .record(process_start.elapsed().as_secs_f64()); + + Ok(results) +} + +/// Calculate statistics for a group of device telemetry samples +fn calculate_device_group_statistics( + samples: &[&DZDeviceLatencySamples], + start_us: u64, + end_us: u64, +) -> Result { + let mut all_values = Vec::new(); + let mut all_raw_samples = Vec::new(); + let mut total_samples_in_range = 0usize; + let mut jitter_indices = Vec::new(); + + // Collect all RTT values and track indices for jitter calculation + for sample in samples { + let (values, start_idx, end_idx) = + extract_device_samples_in_range(sample, start_us, end_us); + + if start_idx < end_idx { + all_values.extend(values); + total_samples_in_range += end_idx - start_idx; + jitter_indices.push((&sample.samples[..], start_idx, end_idx)); + + // Collect raw samples for packet loss calculation + all_raw_samples.extend(&sample.samples[start_idx..end_idx]); + } + } + + calculate_statistics_common( + all_values, + all_raw_samples, + jitter_indices, + total_samples_in_range, + ) +} + +/// Calculate statistics for a group of internet telemetry samples +fn calculate_internet_group_statistics( + samples: &[&DZInternetLatencySamples], + start_us: u64, + end_us: u64, +) -> Result { + let mut all_values = Vec::new(); + let mut all_raw_samples = Vec::new(); + let mut total_samples_in_range = 0usize; + let mut jitter_indices = Vec::new(); + + // Collect all RTT values and track indices for jitter calculation + for sample in samples { + let (values, start_idx, end_idx) = + extract_internet_samples_in_range(sample, start_us, end_us); + + if start_idx < end_idx { + all_values.extend(values); + total_samples_in_range += end_idx - start_idx; + jitter_indices.push((&sample.samples[..], start_idx, end_idx)); + + // Collect raw samples for packet loss calculation + all_raw_samples.extend(&sample.samples[start_idx..end_idx]); + } + } + + calculate_statistics_common( + all_values, + all_raw_samples, + jitter_indices, + total_samples_in_range, + ) +} + +/// Common statistics calculation logic +fn calculate_statistics_common( + all_values: Vec, + all_raw_samples: Vec, + jitter_indices: Vec<(&[u32], usize, usize)>, + total_samples_in_range: usize, +) -> Result { + // Calculate RTT statistics + let rtt_stats = calculate_rtt_statistics(&all_values)?; + + // Calculate jitter statistics + let jitter_stats = calculate_combined_jitter(&jitter_indices)?; + + // Calculate packet loss statistics + let packet_loss_stats = calculate_packet_loss_stats(&all_raw_samples); + + // Calculate missing data ratio + // Total samples includes both successful (non-zero) and failed (zero) samples + let missing_data_ratio = if total_samples_in_range > 0 { + packet_loss_stats.loss_rate + } else { + 1.0 // If no samples, consider it 100% missing + }; + + // Build the statistics + Ok(TelemetryStatistics { + circuit: String::new(), // Will be set by specific implementations + circuit_metadata: Default::default(), // Will be set by specific implementations + // RTT metrics + rtt_mean_us: rtt_stats.mean_us, + rtt_median_us: rtt_stats.median_us, + rtt_min_us: rtt_stats.min_us, + rtt_max_us: rtt_stats.max_us, + rtt_p90_us: rtt_stats.p90_us, + rtt_p95_us: rtt_stats.p95_us, + rtt_p99_us: rtt_stats.p99_us, + rtt_stddev_us: rtt_stats.stddev_us, + rtt_variance_us: rtt_stats.variance_us, + rtt_mad_us: rtt_stats.mad_us, + // Jitter metrics + avg_jitter_us: jitter_stats.avg_jitter_us, + max_jitter_us: jitter_stats.max_jitter_us, + ewma_jitter_us: jitter_stats.ewma_jitter_us, + jitter_delta_stddev_us: jitter_stats.delta_stddev_us, + jitter_peak_to_peak_us: jitter_stats.peak_to_peak_us, + // Packet loss metrics + packet_loss: packet_loss_stats.loss_rate, + success_count: packet_loss_stats.success_count, + loss_count: packet_loss_stats.loss_count, + success_rate: packet_loss_stats.success_rate, + loss_rate: packet_loss_stats.loss_rate, + // Total samples + total_samples: total_samples_in_range, + // Missing data tracking + missing_data_ratio, + }) +} + +/// Calculate combined jitter statistics from multiple sample sets +fn calculate_combined_jitter(jitter_indices: &[(&[u32], usize, usize)]) -> Result { + let mut all_avg_jitters = Vec::new(); + let mut all_max_jitters = Vec::new(); + let mut all_ewma_jitters = Vec::new(); + let mut all_delta_stddevs = Vec::new(); + let mut all_peak_to_peaks = Vec::new(); + + for (samples, start_idx, end_idx) in jitter_indices { + if *end_idx > *start_idx && *start_idx < samples.len() { + let jitter_stats = calculate_jitter_statistics(samples, *start_idx, *end_idx)?; + if jitter_stats.avg_jitter_us > 0.0 || jitter_stats.peak_to_peak_us > 0.0 { + all_avg_jitters.push(jitter_stats.avg_jitter_us); + all_max_jitters.push(jitter_stats.max_jitter_us); + all_ewma_jitters.push(jitter_stats.ewma_jitter_us); + all_delta_stddevs.push(jitter_stats.delta_stddev_us); + all_peak_to_peaks.push(jitter_stats.peak_to_peak_us); + } + } + } + + if all_avg_jitters.is_empty() { + return Ok(JitterStats::new_dead()); + } + + // Calculate overall jitter statistics + let avg_jitter = all_avg_jitters.iter().sum::() / all_avg_jitters.len() as f64; + let max_jitter = all_max_jitters + .iter() + .fold(0.0f64, |max, &val| val.max(max)); + let ewma_jitter = all_ewma_jitters.iter().sum::() / all_ewma_jitters.len() as f64; + let delta_stddev = all_delta_stddevs.iter().sum::() / all_delta_stddevs.len() as f64; + let max_peak_to_peak = all_peak_to_peaks + .iter() + .fold(0.0f64, |max, &val| val.max(max)); + + Ok(JitterStats { + avg_jitter_us: avg_jitter, + max_jitter_us: max_jitter, + ewma_jitter_us: ewma_jitter, + delta_stddev_us: delta_stddev, + peak_to_peak_us: max_peak_to_peak, + }) +} diff --git a/offchain/crates/contributor-rewards/src/processor/stats.rs b/offchain/crates/contributor-rewards/src/processor/stats.rs new file mode 100644 index 0000000000..1c6f7b577c --- /dev/null +++ b/offchain/crates/contributor-rewards/src/processor/stats.rs @@ -0,0 +1,130 @@ +use crate::ingestor::types::{DZDeviceLatencySamples, DZInternetLatencySamples}; + +/// Common statistics structure for telemetry data +#[derive(Debug, Clone, Default)] +pub struct TelemetryStatistics { + pub circuit: String, + pub circuit_metadata: CircuitMetadata, + // RTT metrics + pub rtt_mean_us: f64, + pub rtt_median_us: f64, + pub rtt_min_us: f64, + pub rtt_max_us: f64, + pub rtt_p90_us: f64, + pub rtt_p95_us: f64, + pub rtt_p99_us: f64, + pub rtt_stddev_us: f64, + pub rtt_variance_us: f64, + pub rtt_mad_us: f64, + // Jitter metrics + pub avg_jitter_us: f64, + pub max_jitter_us: f64, + pub ewma_jitter_us: f64, + pub jitter_delta_stddev_us: f64, + pub jitter_peak_to_peak_us: f64, + // Packet loss metrics + pub packet_loss: f64, + pub success_count: u64, + pub loss_count: u64, + pub success_rate: f64, + pub loss_rate: f64, + // Total samples + pub total_samples: usize, + // Missing data tracking + pub missing_data_ratio: f64, +} + +/// Metadata about a circuit/route +#[derive(Debug, Clone, Default)] +pub struct CircuitMetadata { + pub origin: String, + pub target: String, + pub link_type: String, +} + +/// Extract samples within a time range from device telemetry +pub fn extract_device_samples_in_range( + sample: &DZDeviceLatencySamples, + start_us: u64, + end_us: u64, +) -> (Vec, usize, usize) { + extract_samples_common( + &sample.samples, + sample.start_timestamp_us, + sample.sampling_interval_us, + sample.sample_count, + start_us, + end_us, + ) +} + +/// Extract samples within a time range from internet telemetry +pub fn extract_internet_samples_in_range( + sample: &DZInternetLatencySamples, + start_us: u64, + end_us: u64, +) -> (Vec, usize, usize) { + extract_samples_common( + &sample.samples, + sample.start_timestamp_us, + sample.sampling_interval_us, + sample.sample_count, + start_us, + end_us, + ) +} + +/// Common logic for extracting samples within a time range +fn extract_samples_common( + samples: &[u32], + start_timestamp_us: u64, + sampling_interval_us: u64, + sample_count: u32, + start_us: u64, + end_us: u64, +) -> (Vec, usize, usize) { + // Calculate sample indices that fall within the time range + let start_idx = if start_us > start_timestamp_us { + ((start_us - start_timestamp_us) / sampling_interval_us) as usize + } else { + 0 + }; + + let end_timestamp_us = start_timestamp_us + (sample_count as u64 * sampling_interval_us); + let end_idx = if end_us < end_timestamp_us { + ((end_us - start_timestamp_us) / sampling_interval_us) as usize + } else { + sample_count as usize + }; + + // Extract samples within range, filtering out failed samples (zeros and near-zero noise) + // Matches R implementation: samples[which(samples > 1e-10)] + let mut values = Vec::new(); + if start_idx < end_idx && start_idx < samples.len() { + let actual_end_idx = end_idx.min(samples.len()); + for &sample in samples.iter().take(actual_end_idx).skip(start_idx) { + // Only include successful samples (filtering threshold matches R) + if sample as f64 > 1e-10 { + values.push(sample as f64); + } + } + } + + (values, start_idx, end_idx) +} + +/// Get grouping key for device telemetry samples +pub fn get_device_grouping_key(sample: &DZDeviceLatencySamples) -> String { + format!( + "{}:{}:{}", + sample.origin_device_pk, sample.target_device_pk, sample.link_pk + ) +} + +/// Get grouping key for internet telemetry samples +pub fn get_internet_grouping_key(sample: &DZInternetLatencySamples) -> String { + format!( + "{}:{}:{}", + sample.origin_exchange_pk, sample.target_exchange_pk, sample.data_provider_name + ) +} diff --git a/offchain/crates/contributor-rewards/src/processor/telemetry.rs b/offchain/crates/contributor-rewards/src/processor/telemetry.rs new file mode 100644 index 0000000000..1f5a5b5e55 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/processor/telemetry.rs @@ -0,0 +1,168 @@ +use std::collections::BTreeMap; + +use anyhow::Result; +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_common::serializer; +use serde::{Deserialize, Serialize}; +use solana_sdk::pubkey::Pubkey; +use tabled::{Table, Tabled, settings::Style}; +use tracing::debug; + +use crate::{ + ingestor::types::FetchData, + processor::{process::process_device_samples, util::display_us_as_ms}, +}; + +// Key: link_pk +pub type DZDTelemetryStatMap = BTreeMap; + +#[derive(Debug, Clone, Tabled, Serialize, BorshSerialize, BorshDeserialize, Deserialize)] +pub struct DZDTelemetryStats { + pub circuit: String, + #[tabled(skip)] + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub link_pubkey: Pubkey, + #[tabled(skip)] + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub origin_device: Pubkey, + #[tabled(skip)] + #[serde( + serialize_with = "serializer::serialize_pubkey_as_string", + deserialize_with = "serializer::deserialize_pubkey_from_string" + )] + pub target_device: Pubkey, + #[tabled(display = "display_us_as_ms", rename = "rtt_mean(ms)")] + pub rtt_mean_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_median(ms)")] + pub rtt_median_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_min(ms)")] + pub rtt_min_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_max(ms)")] + pub rtt_max_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_p90(ms)")] + pub rtt_p90_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_p95(ms)")] + pub rtt_p95_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_p99(ms)")] + pub rtt_p99_us: f64, + #[tabled(display = "display_us_as_ms", rename = "rtt_stddev(ms)")] + pub rtt_stddev_us: f64, + #[tabled(display = "display_us_as_ms", rename = "avg_jitter(ms)")] + pub avg_jitter_us: f64, + #[tabled(display = "display_us_as_ms", rename = "ewma_jitter(ms)")] + pub jitter_ewma_us: f64, + #[tabled(display = "display_us_as_ms", rename = "max_jitter(ms)")] + pub max_jitter_us: f64, + #[tabled(rename = "loss_rate")] + pub packet_loss: f64, + #[tabled(rename = "loss_count")] + pub loss_count: u64, + #[tabled(rename = "success_count")] + pub success_count: u64, + #[tabled(rename = "samples")] + pub total_samples: usize, + #[tabled(skip)] + pub missing_data_ratio: f64, +} + +pub struct DZDTelemetryProcessor; + +// Helper function to print stats in table fmt +pub fn print_telemetry_stats(map: &DZDTelemetryStatMap) -> String { + let stats: Vec = map.values().cloned().collect(); + Table::new(stats) + .with(Style::psql().remove_horizontals()) + .to_string() +} + +impl DZDTelemetryProcessor { + pub fn process(fetch_data: &FetchData) -> Result { + // Build device pubkey to code mapping + let device_pk_to_code: BTreeMap = fetch_data + .dz_serviceability + .devices + .iter() + .map(|(pubkey, d)| (*pubkey, d.code.to_string())) + .collect(); + + let links = &fetch_data.dz_serviceability.links; + + // Process device telemetry samples + let generic_stats = process_device_samples( + &fetch_data.dz_telemetry.device_latency_samples, + fetch_data.start_us, + fetch_data.end_us, + )?; + + debug!( + "Processed {} circuits for telemetry data", + generic_stats.len() + ); + + // Convert from generic TelemetryStatistics to DZDTelemetryStats + let mut result = DZDTelemetryStatMap::new(); + + for (circuit_key, stats) in generic_stats { + // Parse circuit key to extract pubkeys + let parts: Vec<&str> = circuit_key.split(':').collect(); + if parts.len() != 3 { + continue; + } + + let origin_device_pk = parts[0].parse::().ok(); + let target_device_pk = parts[1].parse::().ok(); + let link_pk = parts[2].parse::().ok(); + + if let (Some(origin_pk), Some(target_pk), Some(link_pk)) = + (origin_device_pk, target_device_pk, link_pk) + { + // Get device codes + let origin_code = device_pk_to_code + .get(&origin_pk) + .cloned() + .unwrap_or_else(|| origin_pk.to_string()); + let target_code = device_pk_to_code + .get(&target_pk) + .cloned() + .unwrap_or_else(|| target_pk.to_string()); + let link_code = links + .get(&link_pk) + .map(|l| l.code.clone()) + .unwrap_or_else(|| link_pk.to_string()); + + let dz_stats = DZDTelemetryStats { + circuit: format!("{origin_code} → {target_code} ({link_code})"), + link_pubkey: link_pk, + origin_device: origin_pk, + target_device: target_pk, + rtt_mean_us: stats.rtt_mean_us, + rtt_median_us: stats.rtt_median_us, + rtt_min_us: stats.rtt_min_us, + rtt_max_us: stats.rtt_max_us, + rtt_p90_us: stats.rtt_p90_us, + rtt_p95_us: stats.rtt_p95_us, + rtt_p99_us: stats.rtt_p99_us, + rtt_stddev_us: stats.rtt_stddev_us, + avg_jitter_us: stats.avg_jitter_us, + jitter_ewma_us: stats.ewma_jitter_us, + max_jitter_us: stats.max_jitter_us, + packet_loss: stats.packet_loss, + loss_count: stats.loss_count, + success_count: stats.success_count, + total_samples: stats.total_samples, + missing_data_ratio: stats.missing_data_ratio, + }; + + result.insert(circuit_key, dz_stats); + } + } + + Ok(result) + } +} diff --git a/offchain/crates/contributor-rewards/src/processor/util.rs b/offchain/crates/contributor-rewards/src/processor/util.rs new file mode 100644 index 0000000000..4ece0f709c --- /dev/null +++ b/offchain/crates/contributor-rewards/src/processor/util.rs @@ -0,0 +1,471 @@ +use std::cmp::Ordering; + +use anyhow::{Result, ensure}; + +use crate::processor::constants::{PENALTY_JITTER_US, PENALTY_RTT_US}; + +#[derive(Debug, Clone, PartialEq)] +pub struct RttStats { + pub mean_us: f64, + pub median_us: f64, + pub min_us: f64, + pub max_us: f64, + pub p90_us: f64, + pub p95_us: f64, + pub p99_us: f64, + pub stddev_us: f64, + pub variance_us: f64, + pub mad_us: f64, +} + +impl RttStats { + pub fn new_dead() -> Self { + Self { + mean_us: PENALTY_RTT_US, + median_us: PENALTY_RTT_US, + min_us: PENALTY_RTT_US, + max_us: PENALTY_RTT_US, + p90_us: PENALTY_RTT_US, + p95_us: PENALTY_RTT_US, + p99_us: PENALTY_RTT_US, + // No variation in dead link + stddev_us: 0.0, + variance_us: 0.0, + mad_us: 0.0, + } + } +} + +#[derive(Debug, Clone, PartialEq)] +pub struct JitterStats { + pub avg_jitter_us: f64, + pub max_jitter_us: f64, + pub ewma_jitter_us: f64, + pub delta_stddev_us: f64, + pub peak_to_peak_us: f64, +} + +impl JitterStats { + pub fn new_dead() -> Self { + Self { + avg_jitter_us: PENALTY_JITTER_US, + max_jitter_us: PENALTY_JITTER_US, + ewma_jitter_us: PENALTY_JITTER_US, + delta_stddev_us: PENALTY_JITTER_US, + peak_to_peak_us: PENALTY_JITTER_US, + } + } +} + +#[derive(Debug, Clone, PartialEq)] +pub struct PacketLossStats { + pub success_count: u64, + pub loss_count: u64, + pub success_rate: f64, + pub loss_rate: f64, +} + +pub fn display_us_as_ms(us: &f64) -> String { + format!("{}", us / 1000.0) +} + +/// Calculate quantile using R's type 7 algorithm (default in R's quantile function) +/// This uses linear interpolation to match R's default behavior exactly +/// +/// R type 7 formula: +/// - h = (n-1) * p (0-based continuous index) +/// - Interpolate linearly between floor(h) and ceil(h) +/// +/// # Arguments +/// * `sorted_values` - Sorted array of values (must be pre-sorted ascending) +/// * `p` - Quantile to compute (0.0 to 1.0) +/// +/// # Returns +/// The interpolated quantile value +pub fn quantile_r_type7(sorted_values: &[f64], p: f64) -> f64 { + let n = sorted_values.len(); + if n == 0 { + return f64::NAN; + } + if n == 1 { + return sorted_values[0]; + } + + // R type 7: h = (n-1) * p (0-based continuous index) + let h = (n - 1) as f64 * p; + let h_floor = h.floor() as usize; + + // Handle edge case where h_floor is at the last index + if h_floor >= n - 1 { + return sorted_values[n - 1]; + } + + // Linear interpolation between h_floor and h_floor + 1 + let lower = sorted_values[h_floor]; + let upper = sorted_values[h_floor + 1]; + let fraction = h - h_floor as f64; + + lower + fraction * (upper - lower) +} + +pub fn calculate_rtt_statistics(values: &[f64]) -> Result { + if values.is_empty() { + return Ok(RttStats::new_dead()); + } + + // Validate all values are finite + ensure!( + values.iter().all(|v| v.is_finite()), + "RTT values must be finite numbers" + ); + + let mut sorted_values = values.to_vec(); + sorted_values.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal)); + + let len = sorted_values.len(); + let n = len as f64; + + // Basic statistics + let min = sorted_values[0]; + let max = sorted_values[len - 1]; + + // Calculate median + let median = if len.is_multiple_of(2) { + (sorted_values[len / 2 - 1] + sorted_values[len / 2]) / 2.0 + } else { + sorted_values[len / 2] + }; + + // Calculate mean and variance using Welford's algorithm (population) + let mut mean = 0.0; + let mut m2 = 0.0; + for (i, &value) in sorted_values.iter().enumerate() { + let delta = value - mean; + mean += delta / (i + 1) as f64; + m2 += delta * (value - mean); + } + let variance = if len > 0 { m2 / n } else { 0.0 }; + let stddev = variance.sqrt(); + + // Calculate percentiles using R's type 7 quantile algorithm (linear interpolation) + // This exactly matches R's default quantile(x, p, type=7) behavior + let p90 = quantile_r_type7(&sorted_values, 0.90); + let p95 = quantile_r_type7(&sorted_values, 0.95); + let p99 = quantile_r_type7(&sorted_values, 0.99); + + // Calculate MAD (Median Absolute Deviation) + let mut deviations: Vec = sorted_values.iter().map(|&v| (v - median).abs()).collect(); + deviations.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal)); + + let mad = if deviations.len().is_multiple_of(2) { + (deviations[deviations.len() / 2 - 1] + deviations[deviations.len() / 2]) / 2.0 + } else { + deviations[deviations.len() / 2] + }; + + Ok(RttStats { + mean_us: mean, + median_us: median, + min_us: min, + max_us: max, + p90_us: p90, + p95_us: p95, + p99_us: p99, + stddev_us: stddev, + variance_us: variance, + mad_us: mad, + }) +} + +pub fn calculate_jitter_statistics( + samples: &[u32], + start_idx: usize, + end_idx: usize, +) -> Result { + ensure!( + start_idx <= end_idx, + "Start index must be less than or equal to end index" + ); + + if start_idx >= end_idx || start_idx >= samples.len() { + return Ok(JitterStats::new_dead()); + } + + let actual_end_idx = end_idx.min(samples.len()); + + // Extract non-zero samples (successful RTT measurements) + let mut ordered: Vec = Vec::new(); + for &sample in samples.iter().take(actual_end_idx).skip(start_idx) { + if sample > 0 { + ordered.push(sample as f64); + } + } + + if ordered.len() < 2 { + return Ok(JitterStats::new_dead()); + } + + // Calculate deltas and absolute deltas (IPDV methodology) + let mut signed_deltas = Vec::new(); + let mut abs_deltas = Vec::new(); + + // Initialize EWMA with first absolute delta + let first_delta = ordered[1] - ordered[0]; + let first_abs = first_delta.abs(); + let mut ewma = first_abs; + let mut max_abs = first_abs; + let mut min_abs = first_abs; + + signed_deltas.push(first_delta); + abs_deltas.push(first_abs); + + // Process remaining samples with EWMA calculation + for i in 2..ordered.len() { + let delta = ordered[i] - ordered[i - 1]; + let abs_delta = delta.abs(); + + signed_deltas.push(delta); + abs_deltas.push(abs_delta); + + // EWMA update with α = 1/16 (matching Go implementation) + ewma += (abs_delta - ewma) / 16.0; + + if abs_delta > max_abs { + max_abs = abs_delta; + } + if abs_delta < min_abs { + min_abs = abs_delta; + } + } + + // Calculate average of absolute deltas + let sum: f64 = abs_deltas.iter().sum(); + let avg = sum / abs_deltas.len() as f64; + + // Calculate peak-to-peak jitter + let peak_to_peak = max_abs - min_abs; + + // Calculate standard deviation of signed deltas + let delta_mean: f64 = signed_deltas.iter().sum::() / signed_deltas.len() as f64; + let delta_variance: f64 = signed_deltas + .iter() + .map(|&d| { + let diff = d - delta_mean; + diff * diff + }) + .sum::() + / signed_deltas.len() as f64; + let delta_stddev = delta_variance.sqrt(); + + Ok(JitterStats { + avg_jitter_us: avg, + max_jitter_us: max_abs, + ewma_jitter_us: ewma, + delta_stddev_us: delta_stddev, + peak_to_peak_us: peak_to_peak, + }) +} + +pub fn calculate_packet_loss(total_expected: usize, total_actual: usize) -> Result { + ensure!( + total_actual <= total_expected, + "Actual packets cannot exceed expected packets" + ); + + if total_expected == 0 { + return Ok(0.0); + } + + let loss = total_expected.saturating_sub(total_actual) as f64; + Ok((loss / total_expected as f64).clamp(0.0, 1.0)) +} + +pub fn calculate_packet_loss_stats(samples: &[u32]) -> PacketLossStats { + let mut success_count = 0u64; + let mut loss_count = 0u64; + + for &sample in samples { + if sample > 0 { + success_count += 1; + } else { + loss_count += 1; + } + } + + let total = success_count + loss_count; + let (success_rate, loss_rate) = if total > 0 { + ( + success_count as f64 / total as f64, + loss_count as f64 / total as f64, + ) + } else { + (0.0, 0.0) + }; + + PacketLossStats { + success_count, + loss_count, + success_rate, + loss_rate, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_rtt_statistics() { + let values = vec![100.0, 200.0, 300.0, 400.0, 500.0]; + let stats = calculate_rtt_statistics(&values).unwrap(); + + assert_eq!(stats.mean_us, 300.0); + assert_eq!(stats.median_us, 300.0); + assert_eq!(stats.min_us, 100.0); + assert_eq!(stats.max_us, 500.0); + // R type 7 quantile with linear interpolation: + // For n=5, p90: h=(5-1)*0.90=3.6, interpolate between index 3 (400) and 4 (500): 400 + 0.6*100 = 460 + // For n=5, p95: h=(5-1)*0.95=3.8, interpolate between index 3 (400) and 4 (500): 400 + 0.8*100 = 480 + // For n=5, p99: h=(5-1)*0.99=3.96, interpolate between index 3 (400) and 4 (500): 400 + 0.96*100 = 496 + assert_eq!(stats.p90_us, 460.0); + assert_eq!(stats.p95_us, 480.0); + assert_eq!(stats.p99_us, 496.0); + // Standard deviation calculation + assert!((stats.stddev_us - 141.421).abs() < 0.01); + assert!((stats.variance_us - 20000.0).abs() < 1.0); + // MAD should be 100 (median of [200, 100, 0, 100, 200]) + assert_eq!(stats.mad_us, 100.0); + } + + #[test] + fn test_empty_rtt_statistics() { + let values = vec![]; + let stats = calculate_rtt_statistics(&values).unwrap(); + + // Empty values should return penalty values for dead links + assert_eq!(stats.mean_us, PENALTY_RTT_US); + assert_eq!(stats.median_us, PENALTY_RTT_US); + assert_eq!(stats.p90_us, PENALTY_RTT_US); + assert_eq!(stats.stddev_us, 0.0); // No variation in dead link + assert_eq!(stats.variance_us, 0.0); // No variation in dead link + assert_eq!(stats.mad_us, 0.0); // No variation in dead link + } + + #[test] + fn test_jitter_statistics() { + let samples = vec![100, 150, 140, 180, 170]; + let stats = calculate_jitter_statistics(&samples, 0, 5).unwrap(); + + // Verify average jitter + let expected_deltas = [50.0, 10.0, 40.0, 10.0]; + let expected_avg = expected_deltas.iter().sum::() / expected_deltas.len() as f64; + assert!((stats.avg_jitter_us - expected_avg).abs() < 0.001); + + // Verify max jitter + assert_eq!(stats.max_jitter_us, 50.0); // 150 - 100 + + // Verify EWMA calculation + // EWMA starts at 50, then updates with each delta + let mut ewma = 50.0; // First delta + ewma += (10.0 - ewma) / 16.0; // Second delta + ewma += (40.0 - ewma) / 16.0; // Third delta + ewma += (10.0 - ewma) / 16.0; // Fourth delta + assert!((stats.ewma_jitter_us - ewma).abs() < 0.001); + } + + #[test] + fn test_ipdv_with_packet_loss() { + // Test with some zero values (packet loss) + let samples = vec![100, 0, 150, 140, 0, 180]; + let stats = calculate_jitter_statistics(&samples, 0, 6).unwrap(); + + // Should only process non-zero samples: [100, 150, 140, 180] + // Deltas: |150-100|=50, |140-150|=10, |180-140|=40 + assert_eq!(stats.max_jitter_us, 50.0); + let expected_avg = (50.0 + 10.0 + 40.0) / 3.0; + assert!((stats.avg_jitter_us - expected_avg).abs() < 0.001); + } + + #[test] + fn test_ipdv_single_sample() { + let samples = vec![100]; + let stats = calculate_jitter_statistics(&samples, 0, 1).unwrap(); + + // Single sample should return penalty values (dead link) since jitter requires 2+ samples + assert_eq!(stats.avg_jitter_us, PENALTY_JITTER_US); + assert_eq!(stats.max_jitter_us, PENALTY_JITTER_US); + assert_eq!(stats.ewma_jitter_us, PENALTY_JITTER_US); + } + + #[test] + fn test_ipdv_two_samples() { + let samples = vec![100, 120]; + let stats = calculate_jitter_statistics(&samples, 0, 2).unwrap(); + + assert_eq!(stats.avg_jitter_us, 20.0); + assert_eq!(stats.max_jitter_us, 20.0); + assert_eq!(stats.ewma_jitter_us, 20.0); // Only one delta, so EWMA = delta + } + + #[test] + fn test_packet_loss() { + assert_eq!(calculate_packet_loss(100, 95).unwrap(), 0.05); + assert_eq!(calculate_packet_loss(100, 100).unwrap(), 0.0); + assert_eq!(calculate_packet_loss(0, 0).unwrap(), 0.0); + } + + #[test] + fn test_invalid_packet_loss() { + // Test that actual > expected returns an error + assert!(calculate_packet_loss(100, 101).is_err()); + } + + #[test] + fn test_packet_loss_stats() { + // Test with mixed success and loss + let samples = vec![100, 0, 150, 0, 200]; + let stats = calculate_packet_loss_stats(&samples); + + assert_eq!(stats.success_count, 3); + assert_eq!(stats.loss_count, 2); + assert_eq!(stats.success_rate, 0.6); + assert_eq!(stats.loss_rate, 0.4); + } + + #[test] + fn test_packet_loss_stats_all_success() { + let samples = vec![100, 150, 200]; + let stats = calculate_packet_loss_stats(&samples); + + assert_eq!(stats.success_count, 3); + assert_eq!(stats.loss_count, 0); + assert_eq!(stats.success_rate, 1.0); + assert_eq!(stats.loss_rate, 0.0); + } + + #[test] + fn test_packet_loss_stats_all_loss() { + let samples = vec![0, 0, 0]; + let stats = calculate_packet_loss_stats(&samples); + + assert_eq!(stats.success_count, 0); + assert_eq!(stats.loss_count, 3); + assert_eq!(stats.success_rate, 0.0); + assert_eq!(stats.loss_rate, 1.0); + } + + #[test] + fn test_invalid_rtt_values() { + let values = vec![100.0, f64::NAN, 300.0]; + assert!(calculate_rtt_statistics(&values).is_err()); + + let values = vec![100.0, f64::INFINITY, 300.0]; + assert!(calculate_rtt_statistics(&values).is_err()); + } + + #[test] + fn test_display_us_as_ms() { + assert_eq!(display_us_as_ms(&1000.0), "1"); + assert_eq!(display_us_as_ms(&1500.0), "1.5"); + } +} diff --git a/offchain/crates/contributor-rewards/src/scheduler/mod.rs b/offchain/crates/contributor-rewards/src/scheduler/mod.rs new file mode 100644 index 0000000000..2e4ecca3ac --- /dev/null +++ b/offchain/crates/contributor-rewards/src/scheduler/mod.rs @@ -0,0 +1,5 @@ +pub mod state; +pub mod worker; + +pub use state::SchedulerState; +pub use worker::ScheduleWorker; diff --git a/offchain/crates/contributor-rewards/src/scheduler/state.rs b/offchain/crates/contributor-rewards/src/scheduler/state.rs new file mode 100644 index 0000000000..9a3b2d9e65 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/scheduler/state.rs @@ -0,0 +1,234 @@ +use std::{fs, io::Write, path::Path}; + +use anyhow::{Context, Result}; +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use tracing::{debug, error, info, warn}; + +/// Worker state persisted to disk +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SchedulerState { + /// Last epoch that was successfully processed + pub last_processed_epoch: Option, + /// Last snapshot location (S3 URL or local path) + #[serde(default)] + pub last_snapshot_location: Option, + /// Number of consecutive failures + pub consecutive_failures: u32, + /// Last time the worker checked for new epochs + pub last_check_time: DateTime, + /// Last time rewards were successfully calculated + pub last_success_time: Option>, + /// Last epoch for which distribution completed fully + #[serde(default)] + pub last_distributed_epoch: Option, + /// Number of consecutive distribution failures + #[serde(default)] + pub consecutive_distribution_failures: u32, +} + +impl Default for SchedulerState { + fn default() -> Self { + Self { + last_processed_epoch: None, + last_snapshot_location: None, + consecutive_failures: 0, + last_check_time: Utc::now(), + last_success_time: None, + last_distributed_epoch: None, + consecutive_distribution_failures: 0, + } + } +} + +impl SchedulerState { + /// Load state from file, or create new if doesn't exist + pub fn load_or_default(path: &Path) -> Result { + if path.exists() { + debug!("Loading worker state from {:?}", path); + let contents = fs::read_to_string(path) + .with_context(|| format!("Failed to read state file: {path:?}"))?; + + // Try to parse the state file + match serde_json::from_str::(&contents) { + Ok(state) => { + info!( + "Loaded worker state: last_processed_epoch={:?}, last_check={:?}", + state.last_processed_epoch, state.last_check_time + ); + Ok(state) + } + Err(e) => { + // State file is corrupted, create backup and start fresh + let backup_path = path.with_extension("state.backup"); + warn!( + "State file corrupted: {}. Creating backup at {:?} and starting fresh", + e, backup_path + ); + + // Try to backup the corrupted file + if let Err(backup_err) = fs::copy(path, &backup_path) { + warn!("Failed to backup corrupted state file: {}", backup_err); + } + + // Return default state + Ok(Self::default()) + } + } + } else { + debug!("No existing worker state found at {:?}, creating new", path); + Ok(Self::default()) + } + } + + /// Save state to file atomically + pub fn save(&self, path: &Path) -> Result<()> { + // Create parent directory if it doesn't exist + if let Some(parent) = path.parent() { + fs::create_dir_all(parent) + .with_context(|| format!("Failed to create directory: {parent:?}"))?; + } + + // Serialize state + let contents = + serde_json::to_string_pretty(self).context("Failed to serialize worker state")?; + + // Write to temporary file first (atomic write pattern) + let temp_path = path.with_extension("state.tmp"); + + // Write to temp file + { + let mut temp_file = fs::OpenOptions::new() + .write(true) + .create(true) + .truncate(true) + .open(&temp_path) + .with_context(|| format!("Failed to create temp file: {temp_path:?}"))?; + + temp_file + .write_all(contents.as_bytes()) + .with_context(|| format!("Failed to write to temp file: {temp_path:?}"))?; + + temp_file + .sync_all() + .with_context(|| format!("Failed to sync temp file: {temp_path:?}"))?; + } + + // Atomically rename temp file to final location + fs::rename(&temp_path, path) + .with_context(|| format!("Failed to rename {temp_path:?} to {path:?}"))?; + + debug!("Saved worker state atomically to {:?}", path); + Ok(()) + } + + /// Update state after successful processing + pub fn mark_success(&mut self, epoch: u64) { + self.last_processed_epoch = Some(epoch); + self.last_success_time = Some(Utc::now()); + self.consecutive_failures = 0; + info!("Marked epoch {} as successfully processed", epoch); + } + + /// Update state after successful snapshot creation + pub fn mark_snapshot_created(&mut self, epoch: u64, snapshot_location: String) { + self.last_snapshot_location = Some(snapshot_location.clone()); + info!( + "Marked snapshot created for epoch {}: {}", + epoch, snapshot_location + ); + } + + /// Update state after check (regardless of outcome) + pub fn mark_check(&mut self) { + self.last_check_time = Utc::now(); + } + + /// Update state after failure + pub fn mark_failure(&mut self) { + self.consecutive_failures += 1; + error!( + "Marked failure, consecutive failures: {}", + self.consecutive_failures + ); + } + + /// Check if we should process a given epoch + pub fn should_process_epoch(&self, epoch: u64) -> bool { + match self.last_processed_epoch { + None => true, // Never processed anything + Some(last) => epoch > last, + } + } + + /// Check if we're in a failure state that should halt processing + pub fn is_in_failure_state(&self, max_failures: u32) -> bool { + self.consecutive_failures >= max_failures + } + + /// Returns true if this epoch hasn't been fully distributed yet. + pub fn should_distribute_epoch(&self, epoch: u64) -> bool { + self.last_distributed_epoch.is_none_or(|last| epoch > last) + } + + /// Record a completed distribution epoch and reset the failure counter. + pub fn mark_distribution_success(&mut self, epoch: u64) { + self.last_distributed_epoch = Some(epoch); + self.consecutive_distribution_failures = 0; + info!("Distribution complete for epoch {epoch}"); + } + + /// Increment the consecutive distribution failure counter. + pub fn mark_distribution_failure(&mut self) { + self.consecutive_distribution_failures += 1; + error!( + "Distribution failure #{}", + self.consecutive_distribution_failures + ); + } +} + +#[cfg(test)] +mod tests { + use super::SchedulerState; + + #[test] + fn test_should_distribute_epoch_when_never_distributed() { + let state = SchedulerState::default(); + assert!(state.should_distribute_epoch(0)); + assert!(state.should_distribute_epoch(42)); + } + + #[test] + fn test_should_distribute_epoch_skips_already_distributed() { + let mut state = SchedulerState::default(); + state.mark_distribution_success(10); + assert!(!state.should_distribute_epoch(10)); + assert!(!state.should_distribute_epoch(9)); + assert!(state.should_distribute_epoch(11)); + } + + #[test] + fn test_mark_distribution_success_resets_failures() { + let mut state = SchedulerState::default(); + state.mark_distribution_failure(); + state.mark_distribution_failure(); + assert_eq!(state.consecutive_distribution_failures, 2); + state.mark_distribution_success(5); + assert_eq!(state.consecutive_distribution_failures, 0); + assert_eq!(state.last_distributed_epoch, Some(5)); + } + + #[test] + fn test_backward_compat_missing_distribution_fields() { + let old_json = r#"{ + "last_processed_epoch": 42, + "consecutive_failures": 0, + "last_check_time": "2026-01-01T00:00:00Z" + }"#; + let state: SchedulerState = serde_json::from_str(old_json).unwrap(); + assert_eq!(state.last_distributed_epoch, None); + assert_eq!(state.consecutive_distribution_failures, 0); + assert_eq!(state.last_processed_epoch, Some(42)); + } +} diff --git a/offchain/crates/contributor-rewards/src/scheduler/worker.rs b/offchain/crates/contributor-rewards/src/scheduler/worker.rs new file mode 100644 index 0000000000..96694f1252 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/scheduler/worker.rs @@ -0,0 +1,877 @@ +use std::{ + fs, + path::PathBuf, + sync::{ + Arc, + atomic::{AtomicBool, Ordering}, + }, + time::{Duration, Instant}, +}; + +use anyhow::{Context, Result, anyhow, bail, ensure}; +use backon::{ExponentialBuilder, Retryable}; +use chrono::Utc; +use doublezero_program_tools::zero_copy; +use doublezero_revenue_distribution::{ + state::{Distribution, ProgramConfig}, + types::DoubleZeroEpoch, +}; +use doublezero_sdk::record::pubkey::create_record_key; +use doublezero_solana_client_tools::{ + payer::Wallet, + rpc::{DoubleZeroLedgerConnection, SolanaConnection, try_fetch_zero_copy_data_with_commitment}, +}; +use doublezero_solana_sdk::revenue_distribution::fetch::{SolConversionState, try_fetch_config}; +use slack_notifier::contributor_rewards::{ + DistributionRewardRow, WriteResultInfo, post_contributor_rewards, post_distribution_rewards, +}; +use solana_client::client_error::ClientError as SolanaClientError; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::pubkey::Pubkey; +use svm_hash::sha2::Hash; +use tempfile::NamedTempFile; +use tokio::{ + signal, + time::{MissedTickBehavior, interval}, +}; +use tracing::{debug, error, info, warn}; + +use crate::{ + calculator::{ + DistributionOutcome, DistributionSummary, WriteConfig, distribute, + keypair_loader::load_keypair, ledger_operations::WriteResult, orchestrator::Orchestrator, + }, + cli::snapshot::{CompleteSnapshot, SnapshotMetadata}, + ingestor::{epoch::EpochFinder, fetcher::Fetcher}, + scheduler::state::SchedulerState, + settings::{aws::StorageBackend, network::Network}, + storage::SnapshotStorage, +}; + +/// Main rewards worker that runs periodically to calculate rewards +pub struct ScheduleWorker { + orchestrator: Orchestrator, + state_file: PathBuf, + snapshot_dir: PathBuf, + storage: Box, + keypair_path: Option, + dry_run: bool, + interval: Duration, +} + +impl ScheduleWorker { + /// Create a new rewards worker + pub fn new( + orchestrator: &Orchestrator, + state_file: PathBuf, + storage: Box, + keypair_path: Option, + dry_run: bool, + interval: Duration, + ) -> Self { + let snapshot_dir = PathBuf::from(&orchestrator.settings.scheduler.snapshot_dir); + Self { + orchestrator: orchestrator.clone(), + state_file, + snapshot_dir, + storage, + keypair_path, + dry_run, + interval, + } + } + + /// Run the worker loop + pub async fn run(self) -> Result<()> { + info!("Starting rewards worker"); + info!("Configuration:"); + info!(" Interval: {:?}", self.interval); + info!(" Dry run: {}", self.dry_run); + info!(" State file: {:?}", self.state_file); + + if self.dry_run { + info!(" Running in DRY RUN mode - no chain writes will occur"); + } else { + info!( + " Keypair: {:?}", + self.keypair_path.as_ref().map(|p| p.display()) + ); + } + + // Load or create worker state + let mut state = SchedulerState::load_or_default(&self.state_file)?; + + // Set up shutdown signal + let shutdown = Arc::new(AtomicBool::new(false)); + let shutdown_clone = shutdown.clone(); + + // Spawn signal handler + tokio::spawn(async move { + let _ = signal::ctrl_c().await; + info!("Received shutdown signal"); + shutdown_clone.store(true, Ordering::Relaxed); + }); + + // Create interval timer + let mut ticker = interval(self.interval); + ticker.set_missed_tick_behavior(MissedTickBehavior::Skip); + + info!("Worker started, entering main loop"); + + // Main worker loop + loop { + // Check for shutdown + if shutdown.load(Ordering::Relaxed) { + info!("Shutting down worker"); + state.save(&self.state_file)?; + break; + } + + // Wait for next tick + ticker.tick().await; + + // Mark that we're checking + state.mark_check(); + + // Process rewards + match self.process_rewards(&mut state).await { + Ok(processed) => { + if processed { + info!("Successfully processed rewards"); + metrics::counter!("doublezero_contributor_rewards_scheduler_success") + .increment(1); + } else { + debug!("No new rewards to process"); + } + // Save state after successful check + state.save(&self.state_file)?; + } + Err(e) => { + error!("Failed to process rewards: {e:#}"); + state.mark_failure(); + state.save(&self.state_file)?; + + metrics::counter!("doublezero_contributor_rewards_scheduler_failure") + .increment(1); + + // Alert every 10 consecutive failures for Grafana monitoring + if state.consecutive_failures > 0 && state.consecutive_failures % 10 == 0 { + error!( + "Worker has failed {} consecutive times, continuing to retry at normal interval", + state.consecutive_failures + ); + } + } + } + + // Try to distribute rewards for the eligible epoch. + if !self.dry_run { + match self.try_get_distribution_epoch().await { + Ok((dz_epoch, rewards_accountant_key)) => { + let calc_epoch = state.last_processed_epoch; + info!( + "Calculation epoch: {:?} | Distribution epoch: {dz_epoch}", + calc_epoch + ); + + if !state.should_distribute_epoch(dz_epoch) { + debug!("Epoch {dz_epoch} already fully distributed, skipping"); + } else { + match self + .try_distribute_rewards(dz_epoch, &rewards_accountant_key) + .await + { + Ok(summary) => match &summary.outcome { + DistributionOutcome::Complete { total_contributors } => { + let total_contributors = *total_contributors; + info!( + "Epoch {dz_epoch} complete: {total_contributors}/{total_contributors} distributed" + ); + state.mark_distribution_success(dz_epoch); + state.save(&self.state_file)?; + metrics::counter!( + "doublezero_contributor_rewards_distribution_success" + ) + .increment(1); + + self.post_distribution_slack_notification(&summary).await; + } + DistributionOutcome::PartiallyComplete { + total_contributors, + distributed, + skipped, + } => { + let (total_contributors, distributed, skipped) = + (*total_contributors, *distributed, *skipped); + info!( + "Epoch {dz_epoch} partially complete: {distributed}/{total_contributors} distributed, {skipped} skipped (missing ContributorRewards accounts)" + ); + state.mark_distribution_success(dz_epoch); + state.save(&self.state_file)?; + metrics::counter!( + "doublezero_contributor_rewards_distribution_success" + ) + .increment(1); + + self.post_distribution_slack_notification(&summary).await; + } + DistributionOutcome::NotReady => { + debug!("Distribution not ready for epoch {dz_epoch}"); + } + }, + Err(e) => { + error!( + "Failed to distribute rewards for epoch {dz_epoch}: {e}" + ); + state.mark_distribution_failure(); + state.save(&self.state_file)?; + metrics::counter!( + "doublezero_contributor_rewards_distribution_failure" + ) + .increment(1); + if state.consecutive_distribution_failures % 10 == 0 { + error!( + "Distribution has failed {} consecutive times", + state.consecutive_distribution_failures + ); + } + } + } + } + } + Err(e) => { + warn!("Failed to fetch distribution epoch: {e}"); + metrics::counter!( + "doublezero_contributor_rewards_distribution_fetch_failure" + ) + .increment(1); + } + } + } + } + + Ok(()) + } + + /// Fetch the config and compute the distribution-eligible epoch. + async fn try_get_distribution_epoch(&self) -> Result<(u64, Pubkey)> { + let connection = + SolanaConnection::new(self.orchestrator.settings.rpc.solana_write_url.clone()); + let (_, config) = try_fetch_config(&connection).await?; + + let sol_conversion_state = SolConversionState::try_fetch(&connection).await?; + let next_sweep = sol_conversion_state + .journal + .1 + .next_dz_epoch_to_sweep_tokens + .value(); + ensure!(next_sweep > 0, "No epochs have been swept yet"); + let dz_epoch_value = next_sweep - 1; + + Ok((dz_epoch_value, config.rewards_accountant_key)) + } + + /// Attempt to distribute rewards for the given epoch. + async fn try_distribute_rewards( + &self, + dz_epoch_value: u64, + rewards_accountant_key: &Pubkey, + ) -> Result { + let signer = load_keypair(&self.keypair_path)?; + let connection = + SolanaConnection::new(self.orchestrator.settings.rpc.solana_write_url.clone()); + let dz_connection = + DoubleZeroLedgerConnection::new(self.orchestrator.settings.rpc.dz_url.clone()); + + let wallet = Wallet { + connection, + signer, + compute_unit_price_ix: None, + verbose: false, + fee_payer: None, + dry_run: false, + }; + + let shapley_prefix = self.orchestrator.settings.get_contributor_rewards_prefix(); + + distribute::try_distribute_epoch_rewards( + &wallet, + &dz_connection, + rewards_accountant_key, + dz_epoch_value, + &shapley_prefix, + ) + .await + } + + /// Post a Slack notification with the per-contributor distribution table. + async fn post_distribution_slack_notification(&self, summary: &DistributionSummary) { + if summary.contributors.is_empty() { + return; + } + + let Some(slack_settings) = &self.orchestrator.settings.slack else { + return; + }; + if !slack_settings.enabled { + return; + } + let Some(webhook_url) = &slack_settings.webhook_url else { + return; + }; + + // Fetch contributor labels for human-readable names. + let dz_connection = + DoubleZeroLedgerConnection::new(self.orchestrator.settings.rpc.dz_url.clone()); + let labels = crate::calculator::ledger_operations::try_fetch_contributor_labels( + &dz_connection, + &self + .orchestrator + .settings + .programs + .serviceability_program_id, + ) + .await + .unwrap_or_default(); + + let network = format!("{:?}", self.orchestrator.settings.network); + let rows: Vec = summary + .contributors + .iter() + .map(|c| { + let contributor = labels + .get(&c.contributor_key) + .cloned() + .unwrap_or_else(|| c.contributor_key.to_string()); + DistributionRewardRow { + index: c.index, + contributor, + proportion: format!("{:.2}%", 100.0 * c.proportion), + reward: format!("{:.1} 2Z", c.reward_tokens), + distributed: if c.distributed { "yes" } else { "no" }.to_string(), + } + }) + .collect(); + + match post_distribution_rewards(webhook_url, network, summary.dz_epoch, rows).await { + Ok(()) => { + info!( + "[OK] Posted distribution Slack notification for epoch {}", + summary.dz_epoch + ); + } + Err(e) => { + warn!( + "[WARN] Failed to post distribution Slack notification: {}", + e + ); + } + } + } + + /// Process rewards for the current epoch if needed + async fn process_rewards(&self, state: &mut SchedulerState) -> Result { + // Get current epoch + let fetcher = Fetcher::from_settings(&self.orchestrator.settings)?; + let epoch_info = (|| async { fetcher.dz_rpc_client.get_epoch_info().await }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!( + "retrying get_epoch_info error: {:?} with sleeping {:?}", + err, dur + ) + }) + .await?; + let current_epoch = epoch_info.epoch; + + // Target epoch is current - 1 (we process the previous completed epoch) + if current_epoch == 0 { + debug!("Current epoch is 0, nothing to process yet"); + return Ok(false); + } + + let target_epoch = current_epoch - 1; + + info!( + "Current epoch: {}, target epoch for processing: {}", + current_epoch, target_epoch + ); + + // Check if we should process this epoch + if !state.should_process_epoch(target_epoch) { + info!( + "Epoch {} already processed (last processed: {:?}), waiting for new epoch", + target_epoch, state.last_processed_epoch + ); + return Ok(false); + } + + info!("Processing rewards for epoch {}", target_epoch); + + // Step 1: Create snapshot for the target epoch + info!("Step 1/2: Creating snapshot for epoch {}", target_epoch); + let (snapshot_location, snapshot_path, _temp_guard) = + match self.create_epoch_snapshot(target_epoch).await { + Ok((location, path, temp_guard)) => { + state.mark_snapshot_created(target_epoch, location.clone()); + state.save(&self.state_file)?; + (location, path, temp_guard) + } + Err(e) => { + // `{:#}` prints the cause chain; plain `{}` prints only the outermost + // context, dropping the reason the fetch failed. + error!("Failed to create snapshot for epoch {target_epoch}: {e:#}"); + metrics::counter!( + "doublezero_contributor_rewards_snapshot_failed", + "reason" => "creation_error" + ) + .increment(1); + return Err(e); + } + }; + // Note: _temp_guard is kept alive here and will be automatically + // cleaned up when it goes out of scope at the end of this function + + if self.dry_run { + info!( + "DRY RUN: Would calculate and write rewards for epoch {}", + target_epoch + ); + info!("DRY RUN: Skipping actual ledger writes"); + info!("DRY RUN: Snapshot saved to: {}", snapshot_location); + info!("DRY RUN: Local path for processing: {:?}", snapshot_path); + + // Mark success even in dry run so we track what we've processed + state.mark_success(target_epoch); + info!( + "DRY RUN: Marked epoch {} as processed (no chain writes)", + target_epoch + ); + } else { + // Check if rewards already exist for this epoch (idempotency, only when not in dry-run) + if self.rewards_exist_for_epoch(&fetcher, target_epoch).await? { + info!( + "Rewards already exist for epoch {}, marking as processed", + target_epoch + ); + state.mark_success(target_epoch); + return Ok(false); + } + + // Step 2: Calculate and write rewards using the snapshot + info!("Step 2/2: Calculating rewards from snapshot"); + let write_summary = self + .orchestrator + .calculate_rewards( + None, + self.keypair_path.clone(), + Some(snapshot_path), + false, + WriteConfig::default(), + ) + .await?; + + // Mark success + state.mark_success(target_epoch); + info!( + "Successfully calculated and wrote rewards for epoch {}", + target_epoch + ); + + // Post Slack notification if enabled + if let Some(slack_settings) = &self.orchestrator.settings.slack + && slack_settings.enabled + && let Some(webhook_url) = &slack_settings.webhook_url + { + // Convert network to string + let network = format!("{:?}", self.orchestrator.settings.network); + + // Convert WriteSummary results to WriteResultInfo + let write_results: Vec = write_summary + .results + .iter() + .map(|result| match result { + WriteResult::Success(description, identifier) => WriteResultInfo::Success { + description: description.clone(), + identifier: identifier.clone(), + }, + WriteResult::Failed(description, error) => WriteResultInfo::Failed { + description: description.clone(), + error: error.clone(), + }, + }) + .collect(); + + // Post notification + match post_contributor_rewards(webhook_url, network, target_epoch, write_results) + .await + { + Ok(_) => { + info!("[OK] Posted Slack notification for epoch {}", target_epoch); + } + Err(e) => { + warn!("[WARN] Failed to post Slack notification: {}", e); + } + } + } + } + + Ok(true) + } + + /// Check if rewards already exist for a given epoch + /// + /// Returns true only if ALL steps are complete: + /// 1. Records exist (contributor rewards OR reward input) + /// 2. Merkle root posted to Distribution account + async fn rewards_exist_for_epoch(&self, fetcher: &Fetcher, epoch: u64) -> Result { + // Check if records exist (either contributor rewards or reward input) + let contributor_rewards_exists = self + .check_contributor_rewards_record(fetcher, epoch) + .await?; + + let reward_input_exists = self.check_reward_input_record(fetcher, epoch).await?; + + let records_exist = contributor_rewards_exists || reward_input_exists; + + // Check if merkle root has been posted + let merkle_root_posted = self.check_distribution_merkle_root(fetcher, epoch).await?; + + // All steps must be complete + let all_complete = records_exist && merkle_root_posted; + + if all_complete { + debug!( + "All rewards steps complete for epoch {}: records_exist={}, merkle_root_posted={}", + epoch, records_exist, merkle_root_posted + ); + } else { + debug!( + "Rewards incomplete for epoch {}: records_exist={}, merkle_root_posted={}", + epoch, records_exist, merkle_root_posted + ); + } + + Ok(all_complete) + } + + /// Check if contributor rewards record exists + async fn check_contributor_rewards_record( + &self, + fetcher: &Fetcher, + epoch: u64, + ) -> Result { + // Get rewards accountant + let rewards_accountant = self.get_rewards_accountant(fetcher).await?; + + // Compute record address + let prefix = self + .orchestrator + .settings + .prefixes + .contributor_rewards + .as_bytes(); + let epoch_bytes = epoch.to_le_bytes(); + let seeds: &[&[u8]] = &[prefix, &epoch_bytes, b"shapley_output"]; + let record_key = create_record_key(&rewards_accountant, seeds); + + debug!("Checking for contributor rewards at: {}", record_key); + + // Check if account exists + let exists = self.account_exists(fetcher, &record_key).await?; + Ok(exists) + } + + /// Check if reward input record exists + async fn check_reward_input_record(&self, fetcher: &Fetcher, epoch: u64) -> Result { + // Get rewards accountant + let rewards_accountant = self.get_rewards_accountant(fetcher).await?; + + // Compute record address + let prefix = self.orchestrator.settings.prefixes.reward_input.as_bytes(); + let epoch_bytes = epoch.to_le_bytes(); + let seeds: &[&[u8]] = &[prefix, &epoch_bytes]; + let record_key = create_record_key(&rewards_accountant, seeds); + + debug!("Checking for reward input at: {}", record_key); + + // Check if account exists + let exists = self.account_exists(fetcher, &record_key).await?; + Ok(exists) + } + + /// Check if merkle root has been posted to Distribution account + async fn check_distribution_merkle_root(&self, fetcher: &Fetcher, epoch: u64) -> Result { + let dz_epoch = DoubleZeroEpoch::new(epoch); + let (distribution_key, _) = Distribution::find_address(dz_epoch); + + debug!( + "Checking for Distribution merkle root at {} for epoch {}", + distribution_key, epoch + ); + + // Try to fetch Distribution account + let distribution_result = (|| async { + try_fetch_zero_copy_data_with_commitment::( + &fetcher.solana_write_client, + &distribution_key, + CommitmentConfig::confirmed(), + ) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err, dur: Duration| { + debug!( + "retrying get Distribution account error: {:?} with sleeping {:?}", + err, dur + ) + }) + .await; + + // If account doesn't exist, merkle root hasn't been posted yet + let distribution = match distribution_result { + Ok(dist) => dist, + Err(_) => { + debug!( + "Distribution account does not exist for epoch {}, merkle root not posted", + epoch + ); + return Ok(false); + } + }; + + // Check if merkle root is non-zero (has been set) + let is_merkle_root_set = distribution.rewards_merkle_root != Hash::default(); + + // Check if total contributors is non-zero + let is_contributors_set = distribution.total_contributors > 0; + + // All done? + let is_done = is_merkle_root_set && is_contributors_set; + + if is_done { + debug!( + "Distribution merkle root exists for epoch {}: root={:?}, contributors={}", + epoch, distribution.rewards_merkle_root, distribution.total_contributors + ); + } else { + debug!( + "Distribution merkle root incomplete for epoch {}: merkle_root_set={}, contributors_set={}", + epoch, is_merkle_root_set, is_contributors_set + ); + } + + Ok(is_done) + } + + /// Get rewards accountant from program config + async fn get_rewards_accountant(&self, fetcher: &Fetcher) -> Result { + let (program_config_address, _) = ProgramConfig::find_address(); + debug!( + "Fetching rewards_accountant from ProgramConfig PDA: {}", + program_config_address + ); + + let account = (|| async { + fetcher + .solana_write_client + .get_account(&program_config_address) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + info!( + "retrying get_account error: {:?} with sleeping {:?}", + err, dur + ) + }) + .await?; + + let program_config = + zero_copy::checked_from_bytes_with_discriminator::(&account.data) + .ok_or_else(|| anyhow!("Failed to deserialize ProgramConfig"))? + .0; + + Ok(program_config.rewards_accountant_key) + } + + /// Check if an account exists on chain + async fn account_exists(&self, fetcher: &Fetcher, pubkey: &Pubkey) -> Result { + let maybe_account = (|| async { + fetcher + .dz_rpc_client + .get_account_with_commitment(pubkey, CommitmentConfig::confirmed()) + .await + }) + .retry(&ExponentialBuilder::default().with_jitter()) + .notify(|err: &SolanaClientError, dur: Duration| { + debug!( + "retrying get_account error: {:?} with sleeping {:?}", + err, dur + ) + }) + .await?; + + Ok(maybe_account.value.is_some()) + } + + /// Create a snapshot for a given epoch and return: + /// - Storage location (S3 URL or local file path) + /// - Local file path for calculate_rewards + /// - Optional temp file guard (for S3 storage - automatically cleaned up when dropped) + async fn create_epoch_snapshot( + &self, + epoch: u64, + ) -> Result<(String, PathBuf, Option)> { + let start = Instant::now(); + + info!( + "Creating snapshot for epoch {} using {} storage", + epoch, + self.storage.storage_type() + ); + + // Create snapshot directory if it doesn't exist (for local file storage) + if matches!( + self.orchestrator.settings.scheduler.storage_backend, + StorageBackend::LocalFile + ) { + fs::create_dir_all(&self.snapshot_dir).map_err(|e| { + anyhow!( + "Failed to create snapshot directory {:?}: {}", + self.snapshot_dir, + e + ) + })?; + } + + // Determine network prefix (mn for mainnet, tn for testnet) + let network_prefix = match self.orchestrator.settings.network { + Network::MainnetBeta | Network::Mainnet => "mn", + Network::Testnet => "tn", + Network::Devnet => "dn", + }; + + // Generate snapshot filename + let filename = format!("{}-epoch-{}-snapshot.json", network_prefix, epoch); + + // Fetch all data for the epoch + info!("Fetching data for epoch {}", epoch); + let fetcher = Fetcher::from_settings(&self.orchestrator.settings)?; + let (fetch_epoch, fetch_data) = fetcher.fetch(Some(epoch)).await?; + + if fetch_epoch != epoch { + bail!( + "Fetched epoch {} does not match target epoch {}", + fetch_epoch, + epoch + ); + } + + // Required: every consumer rejects a snapshot without a leader schedule. + info!("Fetching leader schedule for epoch {}", epoch); + let leader_schedule = EpochFinder::new( + fetcher.dz_rpc_client.clone(), + fetcher.solana_read_client.clone(), + ) + .fetch_leader_schedule(epoch, fetch_data.start_us) + .await + .with_context(|| format!("Failed to fetch leader schedule for DZ epoch {epoch}"))?; + info!( + "Leader schedule fetched successfully for Solana epoch {}", + leader_schedule.solana_epoch + ); + + // Create metadata + let metadata = SnapshotMetadata { + created_at: Utc::now().to_rfc3339(), + network: format!("{:?}", self.orchestrator.settings.network), + exchanges_count: fetch_data.dz_serviceability.exchanges.len(), + locations_count: fetch_data.dz_serviceability.locations.len(), + devices_count: fetch_data.dz_serviceability.devices.len(), + internet_samples_count: fetch_data.dz_internet.internet_latency_samples.len(), + device_samples_count: fetch_data.dz_telemetry.device_latency_samples.len(), + }; + + // Create complete snapshot + let snapshot = CompleteSnapshot { + dz_epoch: epoch, + solana_epoch: Some(leader_schedule.solana_epoch), + fetch_data, + leader_schedule: Some(leader_schedule), + metadata, + }; + + // Validate before saving: storage.save writes the canonical per-epoch key, so + // an incomplete snapshot overwrites a good one, and a dry run never reads it + // back to find out. + snapshot.validate()?; + + // Save snapshot using storage abstraction (S3 or local file) + info!( + "Saving snapshot using {} storage", + self.storage.storage_type() + ); + let snapshot_location = self.storage.save(&snapshot, &filename).await?; + + // For calculate_rewards, we need a local file path + // If using S3, create a temp file; if local storage, use the path directly + let (local_path, temp_file_guard) = + match self.orchestrator.settings.scheduler.storage_backend { + StorageBackend::S3 => { + // Create a named temp file that will be automatically cleaned up when dropped + let temp_file = NamedTempFile::new() + .map_err(|e| anyhow!("Failed to create temp file: {}", e))?; + + let temp_path = temp_file.path().to_path_buf(); + + // Write snapshot to temp file + let json_content = serde_json::to_string_pretty(&snapshot)?; + tokio::fs::write(&temp_path, json_content) + .await + .map_err(|e| anyhow!("Failed to write temp file: {}", e))?; + + info!( + "Created temp file for calculate_rewards: {:?} (will be auto-cleaned)", + temp_path + ); + + (temp_path, Some(temp_file)) + } + StorageBackend::LocalFile => { + // Storage location is already a local path - no temp file needed + (PathBuf::from(&snapshot_location), None) + } + }; + + let duration = start.elapsed(); + + // Estimate size from serialized JSON (for metrics) + let json_bytes = serde_json::to_vec_pretty(&snapshot)?; + let snapshot_size = json_bytes.len() as u64; + + // Record metrics + metrics::histogram!("doublezero_contributor_rewards_snapshot_creation_duration_seconds") + .record(duration.as_secs_f64()); + metrics::gauge!( + "doublezero_contributor_rewards_snapshot_size_bytes", + "epoch" => epoch.to_string() + ) + .set(snapshot_size as f64); + metrics::counter!( + "doublezero_contributor_rewards_snapshot_created", + "epoch" => epoch.to_string() + ) + .increment(1); + metrics::gauge!("doublezero_contributor_rewards_last_snapshot_epoch").set(epoch as f64); + + info!( + "Snapshot created successfully: {} ({:.2} MB, took {:.2}s)", + snapshot_location, + snapshot_size as f64 / 1_048_576.0, + duration.as_secs_f64() + ); + + Ok((snapshot_location, local_path, temp_file_guard)) + } +} diff --git a/offchain/crates/contributor-rewards/src/settings/aws.rs b/offchain/crates/contributor-rewards/src/settings/aws.rs new file mode 100644 index 0000000000..d8f8ca0d9e --- /dev/null +++ b/offchain/crates/contributor-rewards/src/settings/aws.rs @@ -0,0 +1,35 @@ +use serde::{Deserialize, Serialize}; + +/// AWS configuration for S3 snapshot storage +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct AwsSettings { + /// AWS region (e.g., us-east-1) + pub region: String, + + /// S3 bucket name + pub bucket: String, + + /// AWS access key ID + /// Environment variable: DZ__AWS__ACCESS_KEY_ID + pub access_key_id: String, + + /// AWS secret access key + /// Environment variable: DZ__AWS__SECRET_ACCESS_KEY + pub secret_access_key: String, + + /// Custom S3 endpoint (for MinIO or other S3-compatible services) + /// Example: "http://localhost:9000" for local MinIO + /// Leave None for AWS S3 + pub endpoint: Option, +} + +/// Storage backend for snapshots +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[serde(rename_all = "kebab-case")] +pub enum StorageBackend { + /// S3-compatible storage (AWS S3, minio, etc.) + #[default] + S3, + /// Local filesystem storage + LocalFile, +} diff --git a/offchain/crates/contributor-rewards/src/settings/mod.rs b/offchain/crates/contributor-rewards/src/settings/mod.rs new file mode 100644 index 0000000000..55fec6879c --- /dev/null +++ b/offchain/crates/contributor-rewards/src/settings/mod.rs @@ -0,0 +1,532 @@ +pub mod aws; +pub mod network; +pub mod validation; + +use std::{fmt, net::SocketAddr, path::Path}; + +use anyhow::{Context, Result}; +use aws::{AwsSettings, StorageBackend}; +use borsh::{BorshDeserialize, BorshSerialize}; +use config::{Config as ConfigBuilder, Environment, File}; +use network::Network; +use serde::{Deserialize, Serialize}; +use validation::validate_config; + +/// Main settings configuration for contributor-rewards +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Settings { + /// Log level for application logging (e.g., "info", "debug", "warn", "error") + pub log_level: String, + /// Network configuration (mainnet, testnet, devnet, or localnet) + pub network: Network, + /// Shapley value calculation parameters + pub shapley: ShapleySettings, + /// Demand generation parameters + #[serde(default)] + pub demand: DemandSettings, + /// Shapley input preparation parameters + #[serde(default)] + pub input: InputSettings, + /// RPC endpoint configuration + pub rpc: RpcSettings, + /// Solana program IDs + pub programs: ProgramSettings, + /// Prefixes for data organization on-chain + pub prefixes: PrefixSettings, + /// Internet telemetry lookback configuration + pub inet_lookback: InetLookbackSettings, + /// Telemetry default handling configuration + pub telemetry_defaults: TelemetryDefaultSettings, + /// Worker settings + pub scheduler: SchedulerSettings, + /// Metrics settings + pub metrics: Option, + /// AWS S3 configuration for snapshot storage (required when storage_backend = S3) + pub aws: Option, + /// Slack notification settings + #[serde(default)] + pub slack: Option, +} + +/// Shapley value calculation parameters for reward distribution +#[derive(Debug, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize)] +pub struct ShapleySettings { + /// Base uptime requirement for operators (0.0-1.0) + /// e.g., 0.95 means 95% uptime required + pub operator_uptime: f64, + /// Bonus multiplier for contiguous network coverage + /// Applied when nodes provide continuous coverage across regions + pub contiguity_bonus: f64, + /// Multiplier for demand-based rewards + /// Increases rewards in high-demand areas + pub demand_multiplier: f64, +} + +/// Demand generation parameters for Shapley inputs +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[serde(default)] +pub struct DemandSettings { + /// Traffic per receiver in Gbps, used for both IBRL and shred demands + pub traffic: f64, + /// Priority for IBRL validator-to-validator demands + pub priority: f64, + /// Demand kind/type for IBRL demands + pub kind: u32, + /// Multicast flag for IBRL demands + pub multicast_enabled: bool, + /// Demand kind/type for shred demands + pub shred_kind: u32, + /// Multicast flag for shred demands + pub shred_multicast_enabled: bool, +} + +impl Default for DemandSettings { + fn default() -> Self { + Self { + traffic: 0.15, + priority: 0.0, + kind: 1, + multicast_enabled: false, + shred_kind: 2, + shred_multicast_enabled: true, + } + } +} + +/// Shapley input preparation parameters +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[serde(default)] +pub struct InputSettings { + /// Multiplier applied to public internet latency inputs + pub public_latency_multiplier: f64, +} + +impl Default for InputSettings { + fn default() -> Self { + Self { + public_latency_multiplier: 1.0, + } + } +} + +/// RPC endpoint configuration for blockchain interactions +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RpcSettings { + /// DoubleZero ledger RPC URL + pub dz_url: String, + /// Solana read RPC endpoint (for reading chain data like leader schedules) + pub solana_read_url: String, + /// Solana write RPC endpoint (for writing rewards and merkle roots) + pub solana_write_url: String, + /// Transaction commitment level ("confirmed", "finalized", etc.) + pub commitment: String, + /// Rate limit for RPC requests per second + pub rps_limit: u32, +} + +/// Solana program IDs for on-chain interactions +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProgramSettings { + /// DZ Serviceability program ID + pub serviceability_program_id: String, + /// DZ Telemetry program ID + pub telemetry_program_id: String, +} + +/// Prefixes for organizing DZ records on-chain +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PrefixSettings { + /// Prefix for device telemetry record account + pub device_telemetry: String, + /// Prefix for internet telemetry record account + pub internet_telemetry: String, + /// Prefix for contributor rewards record account + pub contributor_rewards: String, + /// Prefix for reward input configuration record account + pub reward_input: String, +} + +/// Configuration for internet telemetry historical data lookback +/// Used when current epoch data is insufficient +#[derive(Debug, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize)] +pub struct InetLookbackSettings { + /// Minimum coverage threshold (0.0-1.0) + /// e.g., 0.7 means at least 70% of expected links must have data + pub min_coverage_threshold: f64, + /// Maximum number of epochs to look back + /// e.g., 5 means check up to 5 previous epochs + pub max_epochs_lookback: u64, + /// Minimum samples per link to consider it valid + /// e.g., 10 means each link needs at least 10 samples + pub min_samples_per_link: usize, + /// Enable lookback accumulator + /// When true, combines data from multiple epochs to meet coverage threshold + /// This should be defaulted to true (false only when testing) + pub enable_accumulator: bool, + /// Deduplication window in microseconds + /// Samples within this time window are considered duplicates + pub dedup_window_us: u64, +} + +/// Telemetry default handling configuration +/// Controls how missing telemetry data is handled per circuit +#[derive(Debug, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize)] +pub struct TelemetryDefaultSettings { + /// Threshold for missing data (0.0-1.0) + /// e.g., 0.7 means if >70% of samples are missing, use defaults + pub missing_data_threshold: f64, + /// Default latency for private links when data is missing (in milliseconds) + /// e.g., 1000.0 means use 1000ms for circuits with insufficient data + pub private_default_latency_ms: f64, + /// Enable previous epoch lookup for public links + /// If true, fetches previous epoch's average when current has insufficient data + pub enable_previous_epoch_lookup: bool, +} + +/// Scheduler configuration for automated rewards calculation +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SchedulerSettings { + /// Check interval in seconds + pub interval_seconds: u64, + /// Path to worker state file + pub state_file: String, + /// Directory to store epoch snapshots + pub snapshot_dir: String, + /// Enable dry run mode for worker + pub enable_dry_run: bool, + /// Storage backend for snapshots + #[serde(default)] + pub storage_backend: StorageBackend, + /// Maximum time to wait for grace period in seconds (default: 21600 = 6 hours) + #[serde(default = "default_grace_period_max_wait_seconds")] + pub grace_period_max_wait_seconds: u64, +} + +fn default_grace_period_max_wait_seconds() -> u64 { + 21600 +} + +/// Metrics configuration for Prometheus +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MetricsSettings { + pub addr: SocketAddr, +} + +/// Slack notification settings for reward cycle completion alerts +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SlackSettings { + /// Enable Slack notifications + pub enabled: bool, + /// Webhook URL + #[serde(default)] + pub webhook_url: Option, + /// Channel ID + #[serde(default)] + pub channel_id: Option, +} + +impl Settings { + /// Load configuration from a specific config file path + pub fn from_path>(path: P) -> Result { + // Construct settings, env vars take priority still + let settings = ConfigBuilder::builder() + .add_source(File::with_name(&path.as_ref().to_string_lossy())) + .add_source( + Environment::with_prefix("DZ") + .separator("__") + .try_parsing(true), + ) + .build() + .context("Failed to build configuration")? + .try_deserialize() + .context("Failed to deserialize configuration")?; + + // Validate the configuration + validate_config(&settings)?; + + Ok(settings) + } + + /// Load configuration from environment variables and optional config file + pub fn from_env() -> Result { + // Load .env file if it exists + // NOTE: It's ok if this fails (file might not exist) + let _ = dotenvy::dotenv(); + + // Construct settings + let settings: Settings = ConfigBuilder::builder() + .add_source( + Environment::with_prefix("DZ") + .separator("__") + .try_parsing(true), + ) + .build() + .context("Failed to build configuration")? + .try_deserialize() + .context("Failed to deserialize configuration")?; + + // Validate the configuration + validate_config(&settings)?; + + Ok(settings) + } + + pub fn get_device_telemetry_prefix(&self) -> Vec { + self.prefixes.device_telemetry.as_bytes().to_vec() + } + + pub fn get_internet_telemetry_prefix(&self) -> Vec { + self.prefixes.internet_telemetry.as_bytes().to_vec() + } + + pub fn get_contributor_rewards_prefix(&self) -> Vec { + self.prefixes.contributor_rewards.as_bytes().to_vec() + } + + pub fn get_reward_input_prefix(&self) -> Vec { + self.prefixes.reward_input.as_bytes().to_vec() + } +} + +impl fmt::Display for Settings { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "Settings {{\n\ + \tNetwork: {:?}\n\ + \tLog Level: {}\n\ + \tDZ RPC URL: {}\n\ + \tSolana Read RPC URL: {}\n\ + \tSolana Write RPC URL: {}\n\ + \tRPS Limit: {}\n\ + \tShapley Operator Uptime: {}\n\ + \tShapley Contiguity Bonus: {}\n\ + \tShapley Demand Multiplier: {}\n\ + \tDemand Traffic: {}\n\ + \tDemand Priority: {}\n\ + \tDemand Kind: {}\n\ + \tDemand Multicast Enabled: {}\n\ + \tDemand Shred Kind: {}\n\ + \tDemand Shred Multicast Enabled: {}\n\ + \tInput Public Latency Multiplier: {}\n\ + }}", + self.network, + self.log_level, + self.rpc.dz_url, + self.rpc.solana_read_url, + self.rpc.solana_write_url, + self.rpc.rps_limit, + self.shapley.operator_uptime, + self.shapley.contiguity_bonus, + self.shapley.demand_multiplier, + self.demand.traffic, + self.demand.priority, + self.demand.kind, + self.demand.multicast_enabled, + self.demand.shred_kind, + self.demand.shred_multicast_enabled, + self.input.public_latency_multiplier, + ) + } +} + +#[cfg(test)] +mod tests { + use std::{io::Write, sync::Mutex}; + + use super::*; + + static ENV_LOCK: Mutex<()> = Mutex::new(()); + + const DEMAND_ENV_KEYS: &[&str] = &[ + "DZ__DEMAND__TRAFFIC", + "DZ__DEMAND__PRIORITY", + "DZ__DEMAND__KIND", + "DZ__DEMAND__SHRED_KIND", + "DZ__DEMAND__MULTICAST_ENABLED", + "DZ__DEMAND__SHRED_MULTICAST_ENABLED", + "DZ__INPUT__PUBLIC_LATENCY_MULTIPLIER", + ]; + + struct DemandEnvCleanup; + + impl Drop for DemandEnvCleanup { + fn drop(&mut self) { + clear_demand_env(); + } + } + + fn clear_demand_env() { + for key in DEMAND_ENV_KEYS { + unsafe { + std::env::remove_var(key); + } + } + } + + fn base_config(extra: &str) -> String { + format!( + r#" +network = "testnet" +log_level = "info" + +[shapley] +operator_uptime = 0.98 +contiguity_bonus = 5.0 +demand_multiplier = 1.2 + +[rpc] +dz_url = "https://test.com" +solana_read_url = "https://test.com" +solana_write_url = "https://test.com" +commitment = "confirmed" +rps_limit = 10 + +[programs] +serviceability_program_id = "test" +telemetry_program_id = "test" + +[prefixes] +device_telemetry = "device" +internet_telemetry = "internet" +contributor_rewards = "rewards" +reward_input = "input" + +[inet_lookback] +min_coverage_threshold = 0.8 +max_epochs_lookback = 5 +min_samples_per_link = 20 +enable_accumulator = true +dedup_window_us = 10000000 + +[telemetry_defaults] +missing_data_threshold = 0.7 +private_default_latency_ms = 1000.0 +enable_previous_epoch_lookup = true + +[scheduler] +interval_seconds = 300 +state_file = "/tmp/test.state" +snapshot_dir = "/tmp/snapshots" +enable_dry_run = false +storage_backend = "local-file" +{extra} +"# + ) + } + + fn write_config(contents: &str) -> tempfile::TempPath { + let mut file = tempfile::Builder::new().suffix(".toml").tempfile().unwrap(); + file.write_all(contents.as_bytes()).unwrap(); + file.flush().unwrap(); + file.into_temp_path() + } + + #[test] + fn demand_settings_default_when_section_missing() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_demand_env(); + let _cleanup = DemandEnvCleanup; + let path = write_config(&base_config("")); + + let settings = Settings::from_path(&path).unwrap(); + + assert_eq!(settings.demand, DemandSettings::default()); + } + + #[test] + fn input_settings_default_when_section_missing() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_demand_env(); + let _cleanup = DemandEnvCleanup; + let path = write_config(&base_config("")); + + let settings = Settings::from_path(&path).unwrap(); + + assert_eq!(settings.input, InputSettings::default()); + } + + #[test] + fn input_settings_toml_section() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_demand_env(); + let _cleanup = DemandEnvCleanup; + let path = write_config(&base_config( + r#" +[input] +public_latency_multiplier = 1.25 +"#, + )); + + let settings = Settings::from_path(&path).unwrap(); + + assert_eq!(settings.input.public_latency_multiplier, 1.25); + } + + #[test] + fn demand_settings_partial_section_uses_defaults() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_demand_env(); + let _cleanup = DemandEnvCleanup; + let path = write_config(&base_config( + r#" +[demand] +traffic = 0.2 +kind = 7 +shred_multicast_enabled = false +"#, + )); + + let settings = Settings::from_path(&path).unwrap(); + + assert_eq!(settings.demand.traffic, 0.2); + assert_eq!(settings.demand.priority, 0.0); + assert_eq!(settings.demand.kind, 7); + assert!(!settings.demand.multicast_enabled); + assert_eq!(settings.demand.shred_kind, 2); + assert!(!settings.demand.shred_multicast_enabled); + } + + #[test] + fn demand_settings_env_overrides_toml() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_demand_env(); + let _cleanup = DemandEnvCleanup; + unsafe { + std::env::set_var("DZ__DEMAND__PRIORITY", "4.25"); + std::env::set_var("DZ__DEMAND__KIND", "9"); + } + let path = write_config(&base_config( + r#" +[demand] +priority = 1.0 +kind = 3 +"#, + )); + + let settings = Settings::from_path(&path).unwrap(); + + assert_eq!(settings.demand.priority, 4.25); + assert_eq!(settings.demand.kind, 9); + } + + #[test] + fn input_settings_env_overrides_toml() { + let _guard = ENV_LOCK.lock().unwrap(); + clear_demand_env(); + let _cleanup = DemandEnvCleanup; + unsafe { + std::env::set_var("DZ__INPUT__PUBLIC_LATENCY_MULTIPLIER", "1.25"); + } + let path = write_config(&base_config( + r#" +[input] +public_latency_multiplier = 1.0 +"#, + )); + + let settings = Settings::from_path(&path).unwrap(); + + assert_eq!(settings.input.public_latency_multiplier, 1.25); + } +} diff --git a/offchain/crates/contributor-rewards/src/settings/network.rs b/offchain/crates/contributor-rewards/src/settings/network.rs new file mode 100644 index 0000000000..415c439f15 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/settings/network.rs @@ -0,0 +1,89 @@ +use std::{fmt, str::FromStr}; + +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[serde(rename_all = "kebab-case")] +pub enum Network { + Devnet, + #[default] + Testnet, + #[serde(rename = "mainnet-beta")] + MainnetBeta, + Mainnet, +} + +impl fmt::Display for Network { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Network::Devnet => write!(f, "devnet"), + Network::Testnet => write!(f, "testnet"), + Network::MainnetBeta => write!(f, "mainnet-beta"), + Network::Mainnet => write!(f, "mainnet"), + } + } +} + +impl FromStr for Network { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "devnet" => Ok(Network::Devnet), + "testnet" => Ok(Network::Testnet), + "mainnet-beta" => Ok(Network::MainnetBeta), + "mainnet" => Ok(Network::Mainnet), + _ => Err(format!( + "Invalid network: {s}. Valid options are: devnet, testnet, mainnet-beta, mainnet" + )), + } + } +} + +impl Network { + /// Get the default RPC endpoint for this network + pub fn default_rpc_endpoint(&self) -> &str { + match self { + Network::Devnet => "https://api.devnet.solana.com", + Network::Testnet => "https://api.testnet.solana.com", + Network::MainnetBeta => "https://api.mainnet-beta.solana.com", + Network::Mainnet => "https://api.mainnet.solana.com", + } + } + + /// Check if this is a production network + pub fn is_production(&self) -> bool { + matches!(self, Network::MainnetBeta | Network::Mainnet) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_network_from_str() { + assert_eq!(Network::from_str("devnet").unwrap(), Network::Devnet); + assert_eq!(Network::from_str("testnet").unwrap(), Network::Testnet); + assert_eq!( + Network::from_str("mainnet-beta").unwrap(), + Network::MainnetBeta + ); + assert_eq!(Network::from_str("mainnet").unwrap(), Network::Mainnet); + assert!(Network::from_str("invalid").is_err()); + } + + #[test] + fn test_network_display() { + assert_eq!(Network::Devnet.to_string(), "devnet"); + assert_eq!(Network::MainnetBeta.to_string(), "mainnet-beta"); + } + + #[test] + fn test_is_production() { + assert!(!Network::Devnet.is_production()); + assert!(!Network::Testnet.is_production()); + assert!(Network::MainnetBeta.is_production()); + assert!(Network::Mainnet.is_production()); + } +} diff --git a/offchain/crates/contributor-rewards/src/settings/validation.rs b/offchain/crates/contributor-rewards/src/settings/validation.rs new file mode 100644 index 0000000000..1756c5153f --- /dev/null +++ b/offchain/crates/contributor-rewards/src/settings/validation.rs @@ -0,0 +1,408 @@ +use std::net::{IpAddr, SocketAddr}; + +use anyhow::{Result, bail}; + +use crate::settings::Settings; + +/// Validate the configuration values +pub fn validate_config(settings: &Settings) -> Result<()> { + // Validate Shapley settings + if settings.shapley.operator_uptime < 0.0 || settings.shapley.operator_uptime > 1.0 { + bail!( + "Shapley operator_uptime must be between 0.0 and 1.0, got {}", + settings.shapley.operator_uptime + ); + } + + if settings.shapley.contiguity_bonus < 0.0 { + bail!( + "Shapley contiguity_bonus must be non-negative, got {}", + settings.shapley.contiguity_bonus + ); + } + + if settings.shapley.demand_multiplier <= 0.0 { + bail!( + "Shapley demand_multiplier must be positive, got {}", + settings.shapley.demand_multiplier + ); + } + + // Validate demand settings + if settings.demand.traffic <= 0.0 { + bail!( + "Demand traffic must be positive, got {}", + settings.demand.traffic + ); + } + + if settings.demand.priority < 0.0 { + bail!( + "Demand priority must be non-negative, got {}", + settings.demand.priority + ); + } + + if settings.demand.kind == 0 { + bail!("Demand kind must be non-zero"); + } + + if settings.demand.shred_kind == 0 { + bail!("Demand shred_kind must be non-zero"); + } + + // Validate input settings + if !settings.input.public_latency_multiplier.is_finite() + || settings.input.public_latency_multiplier <= 0.0 + { + bail!( + "Input public_latency_multiplier must be finite and positive, got {}", + settings.input.public_latency_multiplier + ); + } + + // Validate RPC settings + if settings.rpc.dz_url.is_empty() { + bail!("DZ RPC URL cannot be empty"); + } + if settings.rpc.solana_read_url.is_empty() { + bail!("Solana Read RPC URL cannot be empty"); + } + if settings.rpc.solana_write_url.is_empty() { + bail!("Solana Write RPC URL cannot be empty"); + } + + if !settings.rpc.dz_url.starts_with("http://") && !settings.rpc.dz_url.starts_with("https://") { + bail!("DZ RPC URL must start with http:// or https://"); + } + + if !settings.rpc.solana_read_url.starts_with("http://") + && !settings.rpc.solana_read_url.starts_with("https://") + { + bail!("Solana Read RPC URL must start with http:// or https://"); + } + + if !settings.rpc.solana_write_url.starts_with("http://") + && !settings.rpc.solana_write_url.starts_with("https://") + { + bail!("Solana Write RPC URL must start with http:// or https://"); + } + + if settings.rpc.rps_limit == 0 { + bail!("RPC rate limit must be greater than 0"); + } + + // Validate program IDs + if settings.programs.serviceability_program_id.is_empty() { + bail!("Serviceability program ID cannot be empty"); + } + + if settings.programs.telemetry_program_id.is_empty() { + bail!("Telemetry program ID cannot be empty"); + } + + // Validate log level + let valid_log_levels = ["trace", "debug", "info", "warn", "error"]; + if !valid_log_levels.contains(&settings.log_level.to_lowercase().as_str()) { + bail!( + "Invalid log level '{}'. Valid options are: {:?}", + settings.log_level, + valid_log_levels + ); + } + + // Validate prefixes + if settings.prefixes.device_telemetry.is_empty() { + bail!("Device telemetry prefix cannot be empty"); + } + if settings.prefixes.internet_telemetry.is_empty() { + bail!("Internet telemetry prefix cannot be empty"); + } + if settings.prefixes.contributor_rewards.is_empty() { + bail!("Contributor rewards prefix cannot be empty"); + } + if settings.prefixes.reward_input.is_empty() { + bail!("Reward input prefix cannot be empty"); + } + + // Validate inet lookback settings + if settings.inet_lookback.min_coverage_threshold < 0.0 + || settings.inet_lookback.min_coverage_threshold > 1.0 + { + bail!( + "Inet lookback min_coverage_threshold must be between 0.0 and 1.0, got {}", + settings.inet_lookback.min_coverage_threshold + ); + } + + if settings.inet_lookback.max_epochs_lookback == 0 { + bail!("Inet lookback max_epochs_lookback must be greater than 0"); + } + + if settings.inet_lookback.max_epochs_lookback > 10 { + bail!( + "Inet lookback max_epochs_lookback should not exceed 10 epochs (5 days), got {}", + settings.inet_lookback.max_epochs_lookback + ); + } + + if settings.inet_lookback.dedup_window_us == 0 { + bail!("Inet lookback dedup_window_us must be greater than 0"); + } + + if settings.inet_lookback.min_samples_per_link == 0 { + bail!("Inet lookback min_samples_per_link must be greater than 0"); + } + + // Validate telemetry default settings + if settings.telemetry_defaults.missing_data_threshold < 0.0 + || settings.telemetry_defaults.missing_data_threshold > 1.0 + { + bail!( + "Telemetry defaults missing_data_threshold must be between 0.0 and 1.0, got {}", + settings.telemetry_defaults.missing_data_threshold + ); + } + + if settings.telemetry_defaults.private_default_latency_ms <= 0.0 { + bail!( + "Telemetry defaults private_default_latency_ms must be greater than 0, got {}", + settings.telemetry_defaults.private_default_latency_ms + ); + } + + if let Some(metrics) = &settings.metrics + && !validate_socket_addr(&metrics.addr) + { + bail!("Invalid SocketAddr: {}", metrics.addr) + } + + // Validate Slack settings + if let Some(slack) = &settings.slack { + if slack.enabled && slack.webhook_url.is_none() { + bail!("Slack webhook_url is required when Slack notifications are enabled"); + } + + if let Some(webhook_url) = &slack.webhook_url + && !webhook_url.starts_with("https://hooks.slack.com/") + && !webhook_url.starts_with("http://") + { + bail!( + "Slack webhook_url must be a valid Slack webhook URL (starts with https://hooks.slack.com/)" + ); + } + } + + Ok(()) +} + +fn validate_socket_addr(addr: &SocketAddr) -> bool { + match addr.ip() { + IpAddr::V4(ipv4) => !ipv4.is_broadcast() && !ipv4.is_multicast(), + IpAddr::V6(ipv6) => !ipv6.is_unspecified() && !ipv6.is_multicast(), + } +} + +#[cfg(test)] +mod tests { + use std::{net::SocketAddr, str::FromStr}; + + use super::*; + use crate::settings::{ + DemandSettings, InetLookbackSettings, InputSettings, MetricsSettings, PrefixSettings, + ProgramSettings, RpcSettings, SchedulerSettings, ShapleySettings, TelemetryDefaultSettings, + aws::{AwsSettings, StorageBackend}, + network::Network, + }; + + fn create_valid_config() -> Settings { + Settings { + log_level: "info".to_string(), + network: Network::MainnetBeta, + shapley: ShapleySettings { + operator_uptime: 0.98, + contiguity_bonus: 5.0, + demand_multiplier: 1.2, + }, + demand: DemandSettings::default(), + input: InputSettings::default(), + rpc: RpcSettings { + dz_url: "https://api.mainnet-beta.solana.com".to_string(), + solana_read_url: "https://api.mainnet-beta.solana.com".to_string(), + solana_write_url: "https://api.testnet.solana.com".to_string(), + commitment: "finalized".to_string(), + rps_limit: 10, + }, + programs: ProgramSettings { + serviceability_program_id: "11111111111111111111111111111111".to_string(), + telemetry_program_id: "11111111111111111111111111111111".to_string(), + }, + prefixes: PrefixSettings { + device_telemetry: "doublezero_device_telemetry_aggregate".to_string(), + internet_telemetry: "doublezero_internet_telemetry_aggregate".to_string(), + contributor_rewards: "dz_contributor_rewards".to_string(), + reward_input: "dz_reward_input".to_string(), + }, + inet_lookback: InetLookbackSettings { + min_coverage_threshold: 0.8, + max_epochs_lookback: 5, + min_samples_per_link: 100, + enable_accumulator: true, + dedup_window_us: 10_000_000, + }, + telemetry_defaults: TelemetryDefaultSettings { + missing_data_threshold: 0.7, + private_default_latency_ms: 1000.0, + enable_previous_epoch_lookup: true, + }, + scheduler: SchedulerSettings { + interval_seconds: 300, + state_file: "/var/lib/doublezero-contributor-rewards/scheduler.state".to_string(), + snapshot_dir: "/var/lib/doublezero-contributor-rewards/snapshots".to_string(), + enable_dry_run: false, + storage_backend: StorageBackend::LocalFile, + grace_period_max_wait_seconds: 21600, + }, + metrics: Some(MetricsSettings { + addr: SocketAddr::from_str("127.0.0.1:9090").unwrap(), + }), + aws: Some(AwsSettings { + region: "us-east-1".to_string(), + bucket: "dummy-bucket".to_string(), + access_key_id: "dummy-key".to_string(), + secret_access_key: "dummy-secret".to_string(), + endpoint: None, + }), + slack: None, + } + } + + #[test] + fn test_valid_config() { + let config = create_valid_config(); + assert!(validate_config(&config).is_ok()); + } + + #[test] + fn test_invalid_operator_uptime() { + let mut config = create_valid_config(); + config.shapley.operator_uptime = 1.5; + assert!(validate_config(&config).is_err()); + + config.shapley.operator_uptime = -0.1; + assert!(validate_config(&config).is_err()); + } + + #[test] + fn test_invalid_demand_settings() { + let mut config = create_valid_config(); + config.demand.traffic = 0.0; + assert!(validate_config(&config).is_err()); + + config = create_valid_config(); + config.demand.traffic = -0.1; + assert!(validate_config(&config).is_err()); + + config = create_valid_config(); + config.demand.priority = -0.1; + assert!(validate_config(&config).is_err()); + + config = create_valid_config(); + config.demand.kind = 0; + assert!(validate_config(&config).is_err()); + + config = create_valid_config(); + config.demand.shred_kind = 0; + assert!(validate_config(&config).is_err()); + } + + #[test] + fn test_invalid_input_settings() { + let mut config = create_valid_config(); + config.input.public_latency_multiplier = 0.0; + assert!(validate_config(&config).is_err()); + + config = create_valid_config(); + config.input.public_latency_multiplier = -0.1; + assert!(validate_config(&config).is_err()); + + config = create_valid_config(); + config.input.public_latency_multiplier = f64::INFINITY; + assert!(validate_config(&config).is_err()); + + config = create_valid_config(); + config.input.public_latency_multiplier = f64::NAN; + assert!(validate_config(&config).is_err()); + } + + #[test] + fn test_invalid_rpc_urls() { + let mut config = create_valid_config(); + + // Test empty DZ URL + config.rpc.dz_url = "".to_string(); + assert!(validate_config(&config).is_err()); + config.rpc.dz_url = "https://api.mainnet-beta.solana.com".to_string(); + + // Test empty Solana Read URL + config.rpc.solana_read_url = "".to_string(); + assert!(validate_config(&config).is_err()); + config.rpc.solana_read_url = "https://api.mainnet-beta.solana.com".to_string(); + + // Test empty Solana Write URL + config.rpc.solana_write_url = "".to_string(); + assert!(validate_config(&config).is_err()); + config.rpc.solana_write_url = "https://api.testnet.solana.com".to_string(); + + // Test invalid DZ URL + config.rpc.dz_url = "not-a-url".to_string(); + assert!(validate_config(&config).is_err()); + config.rpc.dz_url = "https://api.mainnet-beta.solana.com".to_string(); + + // Test invalid Solana Read URL + config.rpc.solana_read_url = "not-a-url".to_string(); + assert!(validate_config(&config).is_err()); + config.rpc.solana_read_url = "https://api.mainnet-beta.solana.com".to_string(); + + // Test invalid Solana Write URL + config.rpc.solana_write_url = "not-a-url".to_string(); + assert!(validate_config(&config).is_err()); + } + + #[test] + fn test_invalid_log_level() { + let mut config = create_valid_config(); + config.log_level = "invalid".to_string(); + assert!(validate_config(&config).is_err()); + } + + #[test] + fn test_valid_metrics_address() { + let mut config = create_valid_config(); + + // Test valid addresses + config.metrics = Some(MetricsSettings { + addr: SocketAddr::from_str("127.0.0.1:9090").unwrap(), + }); + assert!(validate_config(&config).is_ok()); + + config.metrics = Some(MetricsSettings { + addr: SocketAddr::from_str("0.0.0.0:8080").unwrap(), + }); + assert!(validate_config(&config).is_ok()); + + config.metrics = Some(MetricsSettings { + addr: SocketAddr::from_str("[::1]:9090").unwrap(), + }); + assert!(validate_config(&config).is_ok()); + } + + #[test] + fn test_metrics_disabled() { + let mut config = create_valid_config(); + + // No metrics configuration should be valid + config.metrics = None; + assert!(validate_config(&config).is_ok()); + } +} diff --git a/offchain/crates/contributor-rewards/src/storage/credentials.rs b/offchain/crates/contributor-rewards/src/storage/credentials.rs new file mode 100644 index 0000000000..5006124850 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/storage/credentials.rs @@ -0,0 +1,63 @@ +use anyhow::{Context, Result}; +use aws_config::BehaviorVersion; +use aws_sdk_s3::config::{Credentials, Region}; +use tracing::info; + +use crate::settings::aws::AwsSettings; + +pub struct CredentialLoader { + config: AwsSettings, +} + +impl CredentialLoader { + pub fn new(config: AwsSettings) -> Self { + Self { config } + } + + pub async fn load_config(&self) -> Result { + info!("Loading AWS configuration"); + + let mut config_builder = aws_sdk_s3::Config::builder() + .region(Region::new(self.config.region.clone())) + .behavior_version(BehaviorVersion::latest()); + + // Set custom endpoint if provided (for minio or other S3-compatible services) + if let Some(endpoint) = &self.config.endpoint { + info!("Using custom S3 endpoint: {}", endpoint); + config_builder = config_builder.endpoint_url(endpoint); + // Force path-style for minio compatibility + config_builder = config_builder.force_path_style(true); + } + + // Use explicit credentials from config (required) + info!("Using AWS credentials from configuration"); + let credentials = Credentials::new( + &self.config.access_key_id, + &self.config.secret_access_key, + None, + None, + "contributor-rewards-config", + ); + + Ok(config_builder.credentials_provider(credentials).build()) + } + + pub async fn validate(&self) -> Result<()> { + let config = self.load_config().await?; + let client = aws_sdk_s3::Client::from_conf(config); + + // Verify credentials by checking bucket exists + client + .head_bucket() + .bucket(&self.config.bucket) + .send() + .await + .context("Failed to validate AWS credentials - cannot access bucket")?; + + info!( + "AWS credentials validated successfully for bucket: {}", + self.config.bucket + ); + Ok(()) + } +} diff --git a/offchain/crates/contributor-rewards/src/storage/local.rs b/offchain/crates/contributor-rewards/src/storage/local.rs new file mode 100644 index 0000000000..92de5c8eb7 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/storage/local.rs @@ -0,0 +1,73 @@ +use std::path::PathBuf; + +use anyhow::{Context, Result}; +use async_trait::async_trait; +use tracing::{info, warn}; + +use crate::{cli::snapshot::CompleteSnapshot, storage::SnapshotStorage}; + +pub struct LocalFileStorage { + base_dir: PathBuf, +} + +impl LocalFileStorage { + pub fn new(base_dir: PathBuf) -> Self { + Self { base_dir } + } + + fn resolve_path(&self, filename: &str) -> PathBuf { + self.base_dir.join(filename) + } +} + +#[async_trait] +impl SnapshotStorage for LocalFileStorage { + async fn save(&self, snapshot: &CompleteSnapshot, filename: &str) -> Result { + let path = self.resolve_path(filename); + info!("Saving snapshot to local file: {:?}", path); + + // Ensure directory exists + if let Some(parent) = path.parent() { + tokio::fs::create_dir_all(parent).await?; + } + + // Write atomically + let contents = serde_json::to_string_pretty(snapshot)?; + let temp_path = path.with_extension("tmp"); + + tokio::fs::write(&temp_path, contents).await?; + tokio::fs::rename(&temp_path, &path).await?; + + info!("Snapshot saved successfully to: {:?}", path); + Ok(path.to_string_lossy().to_string()) + } + + async fn exists(&self, filename: &str) -> Result { + let path = self.resolve_path(filename); + Ok(tokio::fs::try_exists(&path) + .await + .map_err(|e| { + warn!("Failed to check file existence: {}", e); + e + }) + .unwrap_or(false)) + } + + async fn load(&self, filename: &str) -> Result { + let path = self.resolve_path(filename); + info!("Loading snapshot from local file: {:?}", path); + + let contents = tokio::fs::read_to_string(&path) + .await + .context("Failed to read snapshot file")?; + + let snapshot = + CompleteSnapshot::from_json_str(&contents).context("Failed to deserialize snapshot")?; + + Ok(snapshot) + } + + fn storage_type(&self) -> &'static str { + "LocalFile" + } +} diff --git a/offchain/crates/contributor-rewards/src/storage/mod.rs b/offchain/crates/contributor-rewards/src/storage/mod.rs new file mode 100644 index 0000000000..298b72d643 --- /dev/null +++ b/offchain/crates/contributor-rewards/src/storage/mod.rs @@ -0,0 +1,48 @@ +pub mod credentials; +pub mod local; +pub mod s3; + +use std::path::PathBuf; + +use anyhow::{Result, anyhow}; +use async_trait::async_trait; + +use crate::{ + cli::snapshot::CompleteSnapshot, + settings::{Settings, aws::StorageBackend}, +}; + +/// Trait for snapshot storage backends +#[async_trait] +pub trait SnapshotStorage: Send + Sync { + /// Upload/save a snapshot and return its location (path or URL) + async fn save(&self, snapshot: &CompleteSnapshot, filename: &str) -> Result; + + /// Verify a snapshot exists at the given location + async fn exists(&self, filename: &str) -> Result; + + /// Load a snapshot from the given location + async fn load(&self, filename: &str) -> Result; + + /// Get storage type name for logging + fn storage_type(&self) -> &'static str; +} + +/// Factory for creating storage backends +pub async fn create_storage(settings: &Settings) -> Result> { + match settings.scheduler.storage_backend { + StorageBackend::S3 => { + // Create S3 storage + let aws_config = settings.aws.as_ref().ok_or_else(|| { + anyhow!("AWS configuration is required when storage_backend = S3") + })?; + let storage = s3::S3Storage::new(aws_config.clone()).await?; + Ok(Box::new(storage)) + } + StorageBackend::LocalFile => { + // Create local file storage + let path = PathBuf::from(&settings.scheduler.snapshot_dir); + Ok(Box::new(local::LocalFileStorage::new(path))) + } + } +} diff --git a/offchain/crates/contributor-rewards/src/storage/s3.rs b/offchain/crates/contributor-rewards/src/storage/s3.rs new file mode 100644 index 0000000000..8ed0d2eadf --- /dev/null +++ b/offchain/crates/contributor-rewards/src/storage/s3.rs @@ -0,0 +1,173 @@ +use anyhow::{Context, Result, anyhow}; +use async_trait::async_trait; +use aws_sdk_s3::{Client as S3Client, primitives::ByteStream, types::ServerSideEncryption}; +use backon::{ExponentialBuilder, Retryable}; +use tracing::{error, info}; + +use crate::{ + cli::snapshot::CompleteSnapshot, + settings::aws::AwsSettings, + storage::{SnapshotStorage, credentials::CredentialLoader}, +}; + +pub struct S3Storage { + client: S3Client, + bucket: String, +} + +impl S3Storage { + pub async fn new(config: AwsSettings) -> Result { + let bucket = config.bucket.clone(); + + let loader = CredentialLoader::new(config); + let aws_config = loader.load_config().await?; + let client = S3Client::from_conf(aws_config); + + info!("S3 storage initialized, bucket: {}", bucket); + + Ok(Self { client, bucket }) + } + + /// Compute Content-MD5 for integrity verification + fn compute_md5(data: &[u8]) -> String { + let digest = md5::compute(data); + base64::engine::Engine::encode(&base64::engine::general_purpose::STANDARD, digest.as_ref()) + } + + /// Upload with retry logic + async fn upload_with_retry(&self, key: &str, data: Vec, content_md5: &str) -> Result<()> { + let client = self.client.clone(); + let bucket = self.bucket.clone(); + let key = key.to_string(); + let content_md5 = content_md5.to_string(); + + let upload_fn = || async { + client + .put_object() + .bucket(&bucket) + .key(&key) + .body(ByteStream::from(data.clone())) + .content_type("application/json") + .content_md5(&content_md5) + .server_side_encryption(ServerSideEncryption::Aes256) + .send() + .await + .map_err(|e| { + error!("S3 upload failed: {}", e); + anyhow!("S3 upload error: {}", e) + }) + }; + + // Retry with exponential backoff: 1s, 2s, 4s, 8s, 16s + (upload_fn.retry(ExponentialBuilder::default().with_max_times(5))) + .await + .context("Failed to upload snapshot to S3 after retries")?; + + Ok(()) + } + + /// Verify upload succeeded + async fn verify_upload(&self, key: &str, expected_size: usize) -> Result<()> { + let head = self + .client + .head_object() + .bucket(&self.bucket) + .key(key) + .send() + .await + .context("Failed to verify uploaded snapshot")?; + + let actual_size = head.content_length().unwrap_or(0) as usize; + if actual_size != expected_size { + return Err(anyhow!( + "Upload verification failed: expected {} bytes, got {}", + expected_size, + actual_size + )); + } + + info!("Upload verified: {} bytes", actual_size); + Ok(()) + } +} + +#[async_trait] +impl SnapshotStorage for S3Storage { + async fn save(&self, snapshot: &CompleteSnapshot, filename: &str) -> Result { + info!("Uploading snapshot to S3: {}/{}", self.bucket, filename); + + // Serialize to pretty JSON + let json_data = + serde_json::to_vec_pretty(snapshot).context("Failed to serialize snapshot to JSON")?; + + let data_size = json_data.len(); + let content_md5 = Self::compute_md5(&json_data); + + info!( + "Snapshot serialized: {} bytes, MD5: {}", + data_size, content_md5 + ); + + // Upload with retry + self.upload_with_retry(filename, json_data, &content_md5) + .await?; + + // Verify upload + self.verify_upload(filename, data_size).await?; + + let s3_url = format!("https://{}.s3.amazonaws.com/{}", self.bucket, filename); + + info!("Snapshot uploaded successfully: {}", s3_url); + Ok(s3_url) + } + + async fn exists(&self, filename: &str) -> Result { + match self + .client + .head_object() + .bucket(&self.bucket) + .key(filename) + .send() + .await + { + Ok(_) => Ok(true), + Err(e) => { + if e.to_string().contains("NotFound") { + Ok(false) + } else { + Err(anyhow!("Failed to check if snapshot exists: {}", e)) + } + } + } + } + + async fn load(&self, filename: &str) -> Result { + info!("Loading snapshot from S3: {}/{}", self.bucket, filename); + + let response = self + .client + .get_object() + .bucket(&self.bucket) + .key(filename) + .send() + .await + .context("Failed to download snapshot from S3")?; + + let data = response + .body + .collect() + .await + .context("Failed to read snapshot data")? + .into_bytes(); + + let snapshot = CompleteSnapshot::from_json_slice(&data) + .context("Failed to deserialize snapshot from S3")?; + + info!("Snapshot loaded successfully from S3"); + Ok(snapshot) + } + + fn storage_type(&self) -> &'static str { + "S3" + } +} diff --git a/offchain/crates/contributor-rewards/test.config.toml b/offchain/crates/contributor-rewards/test.config.toml new file mode 100644 index 0000000000..de8ca8ec14 --- /dev/null +++ b/offchain/crates/contributor-rewards/test.config.toml @@ -0,0 +1,87 @@ +# DoubleZero Contributor Rewards - Test Configuration with Minio +# +# This configuration file is for local development and testing with minio. +# Start minio with: docker compose up -d (from ai-docs/) + +# Network Configuration +network = "testnet" + +# Logging level +log_level = "info" + +# ========== RPC Configuration ========== +[rpc] +dz_url = "https://api.doublezero.com" +solana_read_url = "https://api.mainnet-beta.solana.com" +solana_write_url = "https://api.testnet.solana.com" +commitment = "confirmed" +rps_limit = 10 + +# ========== Shapley Value Parameters ========== +[shapley] +operator_uptime = 0.98 +contiguity_bonus = 5.0 +demand_multiplier = 1.2 + +# ========== Shapley Input Parameters ========== +[input] +public_latency_multiplier = 1.25 + +# ========== Demand Generation Parameters ========== +[demand] +traffic = 0.15 +priority = 20.0 +kind = 1 +shred_kind = 2 +multicast_enabled = false +shred_multicast_enabled = true + +# ========== Program IDs ========== +[programs] +serviceability_program_id = "DZServ1111111111111111111111111111111111111" +telemetry_program_id = "DZTelem111111111111111111111111111111111111" + +# ========== Record Prefixes ========== +[prefixes] +device_telemetry = "doublezero_device_telemetry_aggregate" +internet_telemetry = "doublezero_internet_telemetry_aggregate" +contributor_rewards = "dz_contributor_rewards" +reward_input = "dz_reward_input" + +# ========== Internet Telemetry Lookback Configuration ========== +[inet_lookback] +min_coverage_threshold = 0.8 +max_epochs_lookback = 5 +min_samples_per_link = 20 +enable_accumulator = true +dedup_window_us = 10000000 + +# ========== Telemetry Default Handling Configuration ========== +[telemetry_defaults] +missing_data_threshold = 0.7 +private_default_latency_ms = 1000.0 +enable_previous_epoch_lookup = true + +# ========== Scheduler Configuration ========== +[scheduler] +interval_seconds = 300 +state_file = "/tmp/doublezero-contributor-rewards-test.state" +snapshot_dir = "/tmp/doublezero-contributor-rewards-snapshots" +enable_dry_run = false +storage_backend = "s3" + +# ========== AWS S3 Configuration (Minio for local testing) ========== +[aws] +region = "us-east-1" + +[aws.testnet] +bucket = "doublezero-contributor-rewards-testnet-snapshots" +access_key_id = "minioadmin" +secret_access_key = "minioadmin" +endpoint = "http://localhost:9000" + +[aws.mainnet-beta] +bucket = "doublezero-contributor-rewards-mn-beta-snapshots" +access_key_id = "minioadmin" +secret_access_key = "minioadmin" +endpoint = "http://localhost:9000" diff --git a/offchain/crates/contributor-rewards/tests/common/mod.rs b/offchain/crates/contributor-rewards/tests/common/mod.rs new file mode 100644 index 0000000000..629da72f93 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/common/mod.rs @@ -0,0 +1,68 @@ +use doublezero_contributor_rewards::settings; + +/// Create test settings with configurable telemetry defaults +pub fn create_test_settings( + missing_threshold: f64, + private_default_ms: f64, + enable_previous: bool, +) -> settings::Settings { + settings::Settings { + log_level: "info".to_string(), + network: settings::network::Network::Testnet, + shapley: settings::ShapleySettings { + operator_uptime: 0.98, + contiguity_bonus: 5.0, + demand_multiplier: 1.2, + }, + demand: settings::DemandSettings::default(), + input: settings::InputSettings::default(), + rpc: settings::RpcSettings { + dz_url: "https://test.com".to_string(), + solana_read_url: "https://test.com".to_string(), + solana_write_url: "https://test.com".to_string(), + commitment: "confirmed".to_string(), + rps_limit: 10, + }, + programs: settings::ProgramSettings { + serviceability_program_id: "test".to_string(), + telemetry_program_id: "test".to_string(), + }, + prefixes: settings::PrefixSettings { + device_telemetry: "device".to_string(), + internet_telemetry: "internet".to_string(), + contributor_rewards: "rewards".to_string(), + reward_input: "input".to_string(), + }, + inet_lookback: settings::InetLookbackSettings { + min_coverage_threshold: 0.8, + max_epochs_lookback: 5, + min_samples_per_link: 20, + enable_accumulator: true, + dedup_window_us: 10000000, + }, + telemetry_defaults: settings::TelemetryDefaultSettings { + missing_data_threshold: missing_threshold, + private_default_latency_ms: private_default_ms, + enable_previous_epoch_lookup: enable_previous, + }, + scheduler: settings::SchedulerSettings { + interval_seconds: 300, + state_file: "/var/lib/doublezero-contributor-rewards/scheduler.state".to_string(), + snapshot_dir: "/tmp/snapshots".to_string(), + enable_dry_run: false, + storage_backend: settings::aws::StorageBackend::LocalFile, + grace_period_max_wait_seconds: 21600, + }, + metrics: Some(settings::MetricsSettings { + addr: "127.0.0.1:9090".parse().unwrap(), + }), + aws: Some(settings::aws::AwsSettings { + region: "us-east-1".to_string(), + bucket: "dummy-bucket".to_string(), + access_key_id: "dummy-key".to_string(), + secret_access_key: "dummy-secret".to_string(), + endpoint: None, + }), + slack: None, + } +} diff --git a/offchain/crates/contributor-rewards/tests/goldens/mainnet-beta-epoch-129-trimmed.json b/offchain/crates/contributor-rewards/tests/goldens/mainnet-beta-epoch-129-trimmed.json new file mode 100644 index 0000000000..a04e32686f --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/goldens/mainnet-beta-epoch-129-trimmed.json @@ -0,0 +1,170333 @@ +{ + "dz_epoch": 129, + "solana_epoch": 950, + "fetch_data": { + "dz_serviceability": { + "locations": { + "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 2, + "bump_seed": 255, + "lat": 41.9289, + "lng": -87.85914, + "loc_id": 12489, + "status": "Activated", + "code": "DRT-ORD13", + "name": "Chicago", + "country": "US", + "reference_count": 2 + }, + "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 31, + "bump_seed": 255, + "lat": 53.33062, + "lng": -6.36265, + "loc_id": 177, + "status": "Activated", + "code": "DRT-DUB2", + "name": "Dublin", + "country": "IE", + "reference_count": 2 + }, + "5FVgFpww2FyftFamYqLEHjoq7AYCVWUWtWaWRxuh6rP4": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 49, + "bump_seed": 254, + "lat": 53.31849, + "lng": -6.44067, + "loc_id": 178, + "status": "Activated", + "code": "EQX-DB2", + "name": "Dublin", + "country": "IE", + "reference_count": 1 + }, + "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 205, + "bump_seed": 255, + "lat": 51.50705, + "lng": -0.00339, + "loc_id": 0, + "status": "Activated", + "code": "TELE-SOU", + "name": "London", + "country": "UK", + "reference_count": 3 + }, + "ELZqQoJv9MMtrt4iq6wjMHpyRmBi8ENzgEa97U9ixPLE": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 222, + "bump_seed": 254, + "lat": 52.1905, + "lng": 20.92211, + "loc_id": 0, + "status": "Activated", + "code": "EQX-WA3", + "name": "Warsaw", + "country": "PL", + "reference_count": 1 + }, + "3BZkwwMNGZG2iSeZr1nxYX4Vxcodcft2zwNVT99BbqNC": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 214, + "bump_seed": 255, + "lat": 59.93844, + "lng": 10.83495, + "loc_id": 0, + "status": "Activated", + "code": "OS-IX", + "name": "Oslo", + "country": "NO", + "reference_count": 1 + }, + "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 1, + "bump_seed": 253, + "lat": 47.61438, + "lng": -122.3386, + "loc_id": 71, + "status": "Activated", + "code": "DRT-SEA10", + "name": "Seattle", + "country": "US", + "reference_count": 4 + }, + "9ySXHhn4zheYB9FJtpCCUQBbj6RqX5NJihkyNEeb1xoN": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 220, + "bump_seed": 253, + "lat": 48.56888, + "lng": 7.78241, + "loc_id": 0, + "status": "Activated", + "code": "SFR-SXB", + "name": "Strasbourg", + "country": "FR", + "reference_count": 1 + }, + "9oBZnBX4BPrSDgQ4Rz8PxYGuMGp7dW4CUyCwPE2ficDZ": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 118, + "bump_seed": 255, + "lat": 45.49888, + "lng": -73.56451, + "loc_id": 11632, + "status": "Activated", + "code": "COL-MTL11", + "name": "Montreal", + "country": "CA", + "reference_count": 1 + }, + "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 44, + "bump_seed": 254, + "lat": 39.02126, + "lng": -77.45178, + "loc_id": 1, + "status": "Activated", + "code": "EQX-DC10", + "name": "Washington DC", + "country": "US", + "reference_count": 3 + }, + "4r2QUtFMiuJmn3VMxs53SgteggrKvM9gk1YuMv1u2Lvn": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 52174, + "bump_seed": 254, + "lat": 40.73683, + "lng": -74.17354, + "loc_id": 350, + "status": "Activated", + "code": "165H-MMR", + "name": "New York", + "country": "US", + "reference_count": 1 + }, + "2aDqcihcejSWManyqqZRJ8rpShaH6a718jmaQjkNTZfZ": { + "account_type": "Location", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "index": 56994, + "bump_seed": 254, + "lat": 50.09699, + "lng": 8.63006, + "loc_id": 0, + "status": "Activated", + "code": "tele-fra", + "name": "Frankfurt", + "country": "DE", + "reference_count": 1 + }, + "BNoP4em7REgS7igJ9cAnYpDW5w9SdRHWB9Bf6oNf3PJ5": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 210, + "bump_seed": 255, + "lat": 40.53618, + "lng": -3.64873, + "loc_id": 0, + "status": "Activated", + "code": "EQX-MD2", + "name": "Madrid", + "country": "ES", + "reference_count": 1 + }, + "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 40, + "bump_seed": 252, + "lat": -23.545988, + "lng": -46.635836, + "loc_id": 1585, + "status": "Activated", + "code": "EQX-SP1", + "name": "Sao Paulo", + "country": "BR", + "reference_count": 2 + }, + "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 208, + "bump_seed": 255, + "lat": 1.29589, + "lng": 103.79093, + "loc_id": 0, + "status": "Activated", + "code": "EQX-SG3", + "name": "Singapore", + "country": "SG", + "reference_count": 2 + }, + "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 6, + "bump_seed": 254, + "lat": 40.77907, + "lng": -74.07238, + "loc_id": 36, + "status": "Activated", + "code": "EQX-NY5", + "name": "New York", + "country": "US", + "reference_count": 2 + }, + "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 30, + "bump_seed": 254, + "lat": 32.99344, + "lng": -96.93168, + "loc_id": 1481, + "status": "Activated", + "code": "CYR1-DFW1", + "name": "Dallas", + "country": "US", + "reference_count": 2 + }, + "Gq3N3ATVoTeATiPdV2mJLLfhn4cSxhPCmjABSC6ZyJNf": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 56060, + "bump_seed": 254, + "lat": 35.6482, + "lng": 139.79264, + "loc_id": 0, + "status": "Activated", + "code": "ATY-CC2", + "name": "Tokyo", + "country": "JP", + "reference_count": 0 + }, + "3xKLEjXi9vThfFnCNdgB2E2uFzeiF8FnaDtt4P6G2H2w": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 3, + "bump_seed": 255, + "lat": 41.99432, + "lng": -87.96195, + "loc_id": 1384, + "status": "Activated", + "code": "DRT-CH1", + "name": "Chicago", + "country": "US", + "reference_count": 1 + }, + "9gQn94Rs72oe9QRZM5i7KgACG6dXjirttbcZV75JxqH8": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 207, + "bump_seed": 254, + "lat": 51.52559, + "lng": -0.63587, + "loc_id": 0, + "status": "Activated", + "code": "EQX-LD7", + "name": "London", + "country": "UK", + "reference_count": 1 + }, + "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 52173, + "bump_seed": 254, + "lat": 35.63258, + "lng": 139.74772, + "loc_id": 0, + "status": "Activated", + "code": "EQX-TY15", + "name": "Tokyo", + "country": "JP", + "reference_count": 1 + }, + "CR9Fqex8eAULhXrXWRUNDKaQW7Wy52B3zGdkZsKfoocR": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 218, + "bump_seed": 255, + "lat": 59.39094, + "lng": 17.87521, + "loc_id": 0, + "status": "Activated", + "code": "EQX-SK3", + "name": "Stockholm", + "country": "SV", + "reference_count": 1 + }, + "7g1K5YyfHmbVSnkHhJTsL2fLiJ1WxFdFD1vUML5WokTz": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 209, + "bump_seed": 254, + "lat": 39.022, + "lng": -77.4609, + "loc_id": 0, + "status": "Activated", + "code": "EQX-DC3", + "name": "Washington DC", + "country": "US", + "reference_count": 1 + }, + "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 202, + "bump_seed": 255, + "lat": 52.39189, + "lng": 4.66524, + "loc_id": 0, + "status": "Activated", + "code": "IM-AMS1", + "name": "Amsterdam", + "country": "NL", + "reference_count": 1 + }, + "8a5WNgBA7hNprZDBSMrMUYB3QjiRfGknrZ2hxSJ3X6F2": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 47, + "bump_seed": 255, + "lat": 35.70876, + "lng": 139.74392, + "loc_id": 3337, + "status": "Activated", + "code": "EQX-TY9", + "name": "Tokyo", + "country": "JP", + "reference_count": 1 + }, + "4nxmDbeTz6DBY6drFnXTKP24NrDtyHsiAEnea6GEqMLz": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 204, + "bump_seed": 255, + "lat": 50.19524, + "lng": 8.63975, + "loc_id": 0, + "status": "Activated", + "code": "IM-FRA2", + "name": "Frankfurt", + "country": "DE", + "reference_count": 0 + }, + "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 28, + "bump_seed": 253, + "lat": 52.35461, + "lng": 4.96195, + "loc_id": 4627, + "status": "Activated", + "code": "EQX-AM4", + "name": "Amsterdam", + "country": "NL", + "reference_count": 3 + }, + "Fx4bTA1DW8nEkS998eRuhQoKKmqevdALcNs8ibCj2RaH": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 37, + "bump_seed": 255, + "lat": 19.11086, + "lng": 72.9013, + "loc_id": 7377, + "status": "Activated", + "code": "EQX-MB2", + "name": "Mumbai", + "country": "IN", + "reference_count": 2 + }, + "DJD3UmMd15dZqq1LTs1hqiyB4eH4PLBmptzAxAPY9phU": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 52170, + "bump_seed": 255, + "lat": 41.85312, + "lng": -87.6183, + "loc_id": 0, + "status": "Activated", + "code": "DRT-ORD10", + "name": "Chicago", + "country": "US", + "reference_count": 1 + }, + "9mSvergSFRj6ij4fQUqn3sZazhwPLC7MhngFxz9BEqWX": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 200, + "bump_seed": 255, + "lat": 50.06018, + "lng": 14.48298, + "loc_id": 0, + "status": "Activated", + "code": "CECO-CZ", + "name": "Prague", + "country": "CZ", + "reference_count": 1 + }, + "6d1k85c2xARsJFdBC9tgRRFH1iWRZnZaJvs9AiRowYo1": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 212, + "bump_seed": 254, + "lat": 48.14653, + "lng": 11.68224, + "loc_id": 0, + "status": "Activated", + "code": "EQX-MU4", + "name": "Munich", + "country": "DE", + "reference_count": 1 + }, + "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 35, + "bump_seed": 255, + "lat": 34.05851, + "lng": -118.23591, + "loc_id": 363, + "status": "Activated", + "code": "CORE-LA2", + "name": "Los Angeles", + "country": "US", + "reference_count": 4 + }, + "BxEPAbcARmCaWct6TAiW1ugYq2edBUga8ToLZ9sf4D12": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 29378, + "bump_seed": 253, + "lat": 41.79675, + "lng": -88.24276, + "loc_id": 3143, + "status": "Activated", + "code": "CYR1-CHI2", + "name": "Chicago", + "country": "US", + "reference_count": 1 + }, + "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 216, + "bump_seed": 254, + "lat": 40.48002, + "lng": -111.90581, + "loc_id": 0, + "status": "Activated", + "code": "DBK-SLC3", + "name": "Salt Lake City", + "country": "US", + "reference_count": 2 + }, + "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 34, + "bump_seed": 255, + "lat": 51.52375, + "lng": -0.63595, + "loc_id": 399, + "status": "Activated", + "code": "EQX-LD4", + "name": "London", + "country": "UK", + "reference_count": 2 + }, + "8sejbB8n2vNYtmHKNQQJWnm17zjBZcDuMfwdb144W1kk": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 33, + "bump_seed": 253, + "lat": 22.362284, + "lng": 114.119218, + "loc_id": 1118, + "status": "Activated", + "code": "EQX-HK2", + "name": "Hong Kong", + "country": "HK", + "reference_count": 2 + }, + "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 29, + "bump_seed": 255, + "lat": 39.02251, + "lng": -77.45023, + "loc_id": 1, + "status": "Activated", + "code": "EQX-DC15", + "name": "Washington DC", + "country": "US", + "reference_count": 2 + }, + "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 7, + "bump_seed": 251, + "lat": 40.7968, + "lng": -74.03088, + "loc_id": 542, + "status": "Activated", + "code": "EQX-NY7", + "name": "New York", + "country": "US", + "reference_count": 2 + }, + "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 32, + "bump_seed": 251, + "lat": 50.14387, + "lng": 8.73993, + "loc_id": 457, + "status": "Activated", + "code": "EQX-FR2", + "name": "Frankfurt", + "country": "DE", + "reference_count": 2 + }, + "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 4, + "bump_seed": 255, + "lat": 41.85368, + "lng": -87.61835, + "loc_id": 7, + "status": "Activated", + "code": "EQX-CH2", + "name": "Chicago", + "country": "US", + "reference_count": 1 + }, + "BhapEuF9xoTgLWNP9iWwziSFYzXwbtSbXNsxJyySMrmf": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 52191, + "bump_seed": 255, + "lat": 34.05878, + "lng": -118.23513, + "loc_id": 0, + "status": "Activated", + "code": "CORE-LA3", + "name": "Los Angeles", + "country": "US", + "reference_count": 1 + }, + "CepfuwR988f64wqmmQoNtsTnSjtMFToo5KUZH6dcjMTX": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 56047, + "bump_seed": 255, + "lat": 35.62226, + "lng": 139.74768, + "loc_id": 0, + "status": "Activated", + "code": "EQX-TY8", + "name": "Tokyo", + "country": "JP", + "reference_count": 1 + }, + "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 48, + "bump_seed": 254, + "lat": 35.65206, + "lng": 139.79813, + "loc_id": 738, + "status": "Activated", + "code": "ATY-CC1", + "name": "Tokyo", + "country": "JP", + "reference_count": 2 + }, + "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 42, + "bump_seed": 255, + "lat": 35.617432, + "lng": 139.748106, + "loc_id": 452, + "status": "Activated", + "code": "EQX-TY2", + "name": "Tokyo", + "country": "JP", + "reference_count": 2 + }, + "BTazDKWWSHUCGw3BGCSampKeTv66Uy1oRv5fF1sdkJmL": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 52172, + "bump_seed": 255, + "lat": 40.45104, + "lng": -80.00534, + "loc_id": 0, + "status": "Activated", + "code": "DBK-PIT1", + "name": "Pittsburgh", + "country": "US", + "reference_count": 1 + }, + "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 36, + "bump_seed": 255, + "lat": 43.33801, + "lng": 5.34767, + "loc_id": 226, + "status": "Activated", + "code": "DRT-MRS2", + "name": "Marseille", + "country": "FR", + "reference_count": 2 + }, + "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 38, + "bump_seed": 253, + "lat": 40.76218, + "lng": -74.024685, + "loc_id": 2636, + "status": "Activated", + "code": "CYX-EWR2", + "name": "New York", + "country": "US", + "reference_count": 2 + }, + "2QmK4Cxj2RZopHeX85QZ4wkJtVyYjf7n2ub5hAKH7eC8": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 56061, + "bump_seed": 251, + "lat": 25.78208, + "lng": -80.19301, + "loc_id": 0, + "status": "Activated", + "code": "EQX-MI1", + "name": "Miami", + "country": "US", + "reference_count": 1 + }, + "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 203, + "bump_seed": 255, + "lat": 50.09878, + "lng": 8.58635, + "loc_id": 0, + "status": "Activated", + "code": "EQX-FR8", + "name": "Frankfurt", + "country": "DE", + "reference_count": 1 + }, + "22fDArnRLgyEiebZMKzbzmCG17zxJ6HPJdzWbzzBFaMW": { + "account_type": "Location", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "index": 57006, + "bump_seed": 255, + "lat": 32.800955, + "lng": -96.81955, + "loc_id": 0, + "status": "Activated", + "code": "eqx-da1", + "name": "Dallas", + "country": "US", + "reference_count": 1 + }, + "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 2878, + "bump_seed": 253, + "lat": 50.13939, + "lng": 8.73994, + "loc_id": 0, + "status": "Activated", + "code": "EQX-FR13", + "name": "Frankfurt", + "country": "DE", + "reference_count": 2 + }, + "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 39, + "bump_seed": 252, + "lat": 37.24189, + "lng": -121.7816, + "loc_id": 6, + "status": "Activated", + "code": "EQX-SV1", + "name": "San Jose", + "country": "US", + "reference_count": 2 + }, + "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 45, + "bump_seed": 255, + "lat": 32.80094, + "lng": -96.81953, + "loc_id": 69, + "status": "Activated", + "code": "EQX-DA3", + "name": "Dallas", + "country": "US", + "reference_count": 1 + }, + "Evgy1NR5x5hcGPSVTZab4gxbWCcHaQVry4Mxd2eCRTJS": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 52171, + "bump_seed": 253, + "lat": 32.80113, + "lng": -96.82091, + "loc_id": 0, + "status": "Activated", + "code": "EQX-DA11", + "name": "Dallas", + "country": "US", + "reference_count": 1 + }, + "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 46, + "bump_seed": 255, + "lat": 43.31078, + "lng": 5.37366, + "loc_id": 226, + "status": "Activated", + "code": "DRT-MRS1", + "name": "Marseille", + "country": "FR", + "reference_count": 2 + }, + "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 41, + "bump_seed": 255, + "lat": 1.29532, + "lng": 103.78986, + "loc_id": 282, + "status": "Activated", + "code": "EQX-SG1", + "name": "Singapore", + "country": "SG", + "reference_count": 2 + }, + "DH7tvE5x4yusyDQcZhNpZmWFaWDdCU7HWVBZ2Fc3BVxt": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 119, + "bump_seed": 255, + "lat": 43.64455, + "lng": -79.38435, + "loc_id": 775, + "status": "Activated", + "code": "COL-TOR1", + "name": "Toronto", + "country": "CA", + "reference_count": 1 + }, + "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 70, + "bump_seed": 255, + "lat": 50.09868, + "lng": 8.63226, + "loc_id": 60, + "status": "Activated", + "code": "EQX-FR5", + "name": "Frankfurt", + "country": "DE", + "reference_count": 4 + }, + "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 43, + "bump_seed": 255, + "lat": 52.3365, + "lng": 4.93188, + "loc_id": 494, + "status": "Activated", + "code": "DRT-AMS18", + "name": "Amsterdam", + "country": "NL", + "reference_count": 1 + }, + "4mB19afVkWkcyGKhVNCk7T58GkMLUGaujXz5iLcZzZvB": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 206, + "bump_seed": 255, + "lat": 51.5245, + "lng": -0.63452, + "loc_id": 0, + "status": "Activated", + "code": "EQX-LD6", + "name": "London", + "country": "UK", + "reference_count": 0 + }, + "E8hhYdAvrYTPk8xxpRsmh1BayVLMwptM2ismsrQJpSmV": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 26165, + "bump_seed": 253, + "lat": 40.48004, + "lng": -111.9045, + "loc_id": 0, + "status": "Activated", + "code": "DBK-SLC2", + "name": "Salt Lake City", + "country": "US", + "reference_count": 1 + }, + "HAhDgmZSUzukS94JSaadMyFjritUWrtwdNPSzp9DFV7h": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 2582, + "bump_seed": 255, + "lat": 55.921, + "lng": 23.29422, + "loc_id": 0, + "status": "Activated", + "code": "Cherry", + "name": "\u0160iauliai", + "country": "LT", + "reference_count": 1 + }, + "Ga9FVdnt99y3idLkthMw2LEJ2QA3WtUBKdM5MUQKnZwq": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 5, + "bump_seed": 251, + "lat": 40.7767, + "lng": -74.07559, + "loc_id": 36, + "status": "Activated", + "code": "EQX-NY2", + "name": "New York", + "country": "US", + "reference_count": 1 + } + }, + "exchanges": { + "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 51, + "bump_seed": 255, + "lat": 50.14387, + "lng": 8.73993, + "bgp_community": 10005, + "unused": 0, + "status": "Activated", + "code": "fra", + "name": "Frankfurt", + "reference_count": 10, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111" + }, + "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 63, + "bump_seed": 252, + "lat": 35.70876, + "lng": 139.74392, + "bgp_community": 10023, + "unused": 0, + "status": "Activated", + "code": "tyo", + "name": "Tokyo", + "reference_count": 7, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111" + }, + "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 58, + "bump_seed": 255, + "lat": 1.29532, + "lng": 103.78986, + "bgp_community": 10017, + "unused": 0, + "status": "Activated", + "code": "sin", + "name": "Singapore", + "reference_count": 4, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111" + }, + "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 60, + "bump_seed": 255, + "lat": 39.02126, + "lng": -77.45178, + "bgp_community": 10024, + "unused": 0, + "status": "Activated", + "code": "was", + "name": "Washington DC", + "reference_count": 6, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111" + }, + "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 8, + "bump_seed": 255, + "lat": 47.61438, + "lng": -122.3386, + "bgp_community": 10016, + "unused": 0, + "status": "Activated", + "code": "sea", + "name": "Seattle", + "reference_count": 4, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111" + }, + "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 9, + "bump_seed": 255, + "lat": 40.77907, + "lng": -74.07238, + "bgp_community": 10012, + "unused": 0, + "status": "Activated", + "code": "nyc", + "name": "New York", + "reference_count": 8, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111" + } + }, + "devices": { + "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z": { + "account_type": "Device", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 126, + "bump_seed": 254, + "location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "device_type": "Transit", + "public_ip": "142.215.184.122", + "status": "Activated", + "code": "dz-ny7-sw02", + "dz_prefixes": [ + "137.239.216.166/31" + ], + "metrics_publisher_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "mgmt_vrf": "mgmt", + "interfaces": [ + { + "V1": { + "status": "Unlinked", + "name": "Ethernet1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Ethernet2", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Ethernet3", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Ethernet4", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet41", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.150/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet42", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.154/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet55/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.148/32", + "node_segment_idx": 68, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.149/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-channel2000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.67/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet52/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.104/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet51/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.0.52/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 5, + "users_count": 0, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "4wusXr7UXdX7b4j6LUVYiW5VU1CRnQkSoQACgq9vM1r9": { + "account_type": "Device", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 56440, + "bump_seed": 255, + "location_pk": "CepfuwR988f64wqmmQoNtsTnSjtMFToo5KUZH6dcjMTX", + "exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "device_type": "Transit", + "public_ip": "119.27.40.34", + "status": "Activated", + "code": "dgt-dzd-tyo-ty8", + "dz_prefixes": [ + "119.27.40.35/32" + ], + "metrics_publisher_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "mgmt_vrf": "MGMT", + "interfaces": [ + { + "V2": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Vpnv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.216/32", + "node_segment_idx": 97, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Ipv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.219/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet1/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.220/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet21/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.226/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 2, + "users_count": 0, + "max_users": 0, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx": { + "account_type": "Device", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 128, + "bump_seed": 254, + "location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "device_type": "Hybrid", + "public_ip": "137.239.200.186", + "status": "Activated", + "code": "dz-dc10-sw01", + "dz_prefixes": [ + "137.239.200.224/28", + "137.239.200.240/29", + "137.239.200.248/30" + ], + "metrics_publisher_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Ethernet1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.155/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet3/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.55/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.152/32", + "node_segment_idx": 69, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.153/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet16/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.57/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet17/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.199/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet18/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.229/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback27", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "137.239.200.224/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet9/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "137.239.200.186/29", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 9, + "users_count": 4, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 4, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 86, + "bump_seed": 255, + "location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "device_type": "Hybrid", + "public_ip": "180.87.28.6", + "status": "Activated", + "code": "tyo001-dz001", + "dz_prefixes": [ + "180.87.28.32/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.42/32", + "node_segment_idx": 25, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.43/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2007", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2007, + "ip_net": "172.16.0.182/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2008", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2008, + "ip_net": "172.16.0.184/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel2000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.18/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "180.87.28.32/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "180.87.28.6/30", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 5, + "users_count": 2, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 2, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX": { + "account_type": "Device", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 11595, + "bump_seed": 254, + "location_pk": "7g1K5YyfHmbVSnkHhJTsL2fLiJ1WxFdFD1vUML5WokTz", + "exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "device_type": "Hybrid", + "public_ip": "216.200.231.186", + "status": "Activated", + "code": "dgt-dzd-ash-dc3", + "dz_prefixes": [ + "216.200.133.128/28" + ], + "metrics_publisher_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.1.45/32", + "node_segment_idx": 41, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.1.52/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet25/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.56/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.54/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet2/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.60/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "216.200.133.128/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet10/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "216.200.231.186/29", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 8, + "users_count": 5, + "max_users": 96, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 3, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 2, + "max_multicast_publishers": 0 + }, + "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 84, + "bump_seed": 255, + "location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "device_type": "Hybrid", + "public_ip": "38.104.167.29", + "status": "Activated", + "code": "nyc001-dz001", + "dz_prefixes": [ + "38.247.16.128/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.36/32", + "node_segment_idx": 21, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.37/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2004", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2004, + "ip_net": "172.16.0.177/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel2000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.126/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Switch1/11/2", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.90/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "38.247.16.128/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "38.104.167.29/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 7, + "users_count": 5, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 3, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 2, + "max_multicast_publishers": 0 + }, + "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 92, + "bump_seed": 255, + "location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "device_type": "Hybrid", + "public_ip": "154.18.0.97", + "status": "Activated", + "code": "tyo002-dz002", + "dz_prefixes": [ + "154.18.64.128/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.70/32", + "node_segment_idx": 40, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.71/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2007", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2007, + "ip_net": "172.16.0.183/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2022", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2022, + "ip_net": "172.16.0.211/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2023", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2023, + "ip_net": "172.16.0.213/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Switch1/11/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.58/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "154.18.64.128/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "154.18.0.97/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 42, + "users_count": 38, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 19, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 19, + "max_multicast_publishers": 0 + }, + "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7": { + "account_type": "Device", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 18969, + "bump_seed": 255, + "location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "device_type": "Hybrid", + "public_ip": "184.104.221.146", + "status": "Activated", + "code": "dgt-dzd-sin-sg3", + "dz_prefixes": [ + "184.104.213.176/28" + ], + "metrics_publisher_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.238/32", + "node_segment_idx": 59, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.239/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet20/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.118/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.124/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "184.104.213.176/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet9/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "184.104.221.146/28", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 24, + "users_count": 22, + "max_users": 96, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 12, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 15, + "max_multicast_publishers": 0 + }, + "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf": { + "account_type": "Device", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 56464, + "bump_seed": 255, + "location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "device_type": "Hybrid", + "public_ip": "67.209.55.48", + "status": "Activated", + "code": "dz100a-sgp1-tsw", + "dz_prefixes": [ + "67.209.55.48/29", + "67.209.55.56/29" + ], + "metrics_publisher_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "mgmt_vrf": "default", + "interfaces": [ + { + "V2": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Vpnv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.222/32", + "node_segment_idx": 98, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Ipv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.223/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet10/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.174/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet3/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.234/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet2/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.238/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "67.209.55.48/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback101", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "67.209.55.56/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet1/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "202.8.11.229/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet4/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "202.8.11.231/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 36, + "users_count": 33, + "max_users": 96, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 18, + "multicast_subscribers_count": 3, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 12, + "max_multicast_publishers": 0 + }, + "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6": { + "account_type": "Device", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 73, + "bump_seed": 254, + "location_pk": "8a5WNgBA7hNprZDBSMrMUYB3QjiRfGknrZ2hxSJ3X6F2", + "exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "device_type": "Hybrid", + "public_ip": "109.61.83.17", + "status": "Activated", + "code": "dz-ty9-sw01", + "dz_prefixes": [ + "79.127.159.32/28", + "79.127.159.48/29", + "79.127.159.56/30" + ], + "metrics_publisher_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Ethernet31/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.166/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet32/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.24/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.164/32", + "node_segment_idx": 74, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.165/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.59/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet17/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.181/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback27", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "79.127.159.32/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet9/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "109.61.83.17/28", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 11, + "users_count": 7, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 4, + "multicast_subscribers_count": 1, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 2, + "max_multicast_publishers": 0 + }, + "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B": { + "account_type": "Device", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 13883, + "bump_seed": 255, + "location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "device_type": "Hybrid", + "public_ip": "193.28.105.130", + "status": "Activated", + "code": "dgt-dzd-fra-fr5", + "dz_prefixes": [ + "193.28.105.144/28" + ], + "metrics_publisher_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.1.72/32", + "node_segment_idx": 53, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.1.86/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.94/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet20/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.96/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet2/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.116/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "193.28.105.144/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet10/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "193.28.105.130/29", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 24, + "users_count": 21, + "max_users": 96, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 15, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 6, + "max_multicast_publishers": 0 + }, + "B1JjhMNjy3HhkXvyYzq6DBNfLfLkvizftzaUrXDf7XEY": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 74, + "bump_seed": 252, + "location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "device_type": "Hybrid", + "public_ip": "38.104.127.117", + "status": "Activated", + "code": "sea001-dz002", + "dz_prefixes": [ + "38.246.201.0/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.7/32", + "node_segment_idx": 4, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.8/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2036", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2036, + "ip_net": "172.16.0.236/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel2000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.11/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "38.104.127.117/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "38.246.201.0/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 2, + "users_count": 0, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe": { + "account_type": "Device", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 132, + "bump_seed": 255, + "location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "device_type": "Hybrid", + "public_ip": "137.239.195.130", + "status": "Activated", + "code": "dz-sea10-sw01", + "dz_prefixes": [ + "137.239.195.160/28", + "137.239.195.176/29", + "137.239.195.184/30" + ], + "metrics_publisher_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Ethernet24/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.168/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet25/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.167/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.160/32", + "node_segment_idx": 72, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.161/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.61/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet26/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.0.98/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet17/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.233/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback27", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "137.239.195.160/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet9/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "137.239.195.130/29", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 6, + "users_count": 1, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 1, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 89, + "bump_seed": 254, + "location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "device_type": "Hybrid", + "public_ip": "38.122.35.137", + "status": "Activated", + "code": "nyc002-dz002", + "dz_prefixes": [ + "38.247.16.192/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.56/32", + "node_segment_idx": 33, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.57/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2006", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2006, + "ip_net": "172.16.0.181/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2010", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2010, + "ip_net": "172.16.0.187/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2014", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2014, + "ip_net": "172.16.0.195/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2017", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2017, + "ip_net": "172.16.0.201/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2027", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2027, + "ip_net": "172.16.0.221/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2032", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2032, + "ip_net": "172.16.0.231/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2033", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2033, + "ip_net": "172.16.0.232/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Switch1/11/2", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.90/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Switch1/11/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.38/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "38.247.16.192/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "38.122.35.137/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 23, + "users_count": 14, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 8, + "multicast_subscribers_count": 1, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 5, + "max_multicast_publishers": 0 + }, + "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi": { + "account_type": "Device", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 66, + "bump_seed": 254, + "location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "device_type": "Hybrid", + "public_ip": "137.239.213.162", + "status": "Activated", + "code": "dz-ny7-sw01", + "dz_prefixes": [ + "137.239.213.192/28", + "137.239.213.208/29", + "137.239.213.216/30" + ], + "metrics_publisher_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Ethernet41", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.144/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet51/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.116/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.1/32", + "node_segment_idx": 1, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.2/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-channel2000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.66/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet52/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.102/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback27", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "137.239.213.192/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet10", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "137.239.213.162/29", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 21, + "users_count": 17, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 13, + "multicast_subscribers_count": 1, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 3, + "max_multicast_publishers": 0 + }, + "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92": { + "account_type": "Device", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 133, + "bump_seed": 255, + "location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "device_type": "Hybrid", + "public_ip": "79.127.170.81", + "status": "Activated", + "code": "dz-sg1-sw01", + "dz_prefixes": [ + "152.233.14.224/28", + "152.233.14.240/29", + "152.233.14.248/30" + ], + "metrics_publisher_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Ethernet1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.13/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet24/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.25/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.162/32", + "node_segment_idx": 73, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.163/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet16/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.119/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet17/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.175/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback27", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "152.233.14.224/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet9/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "79.127.170.81/28", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 34, + "users_count": 30, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 14, + "multicast_subscribers_count": 1, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 15, + "max_multicast_publishers": 0 + }, + "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 67, + "bump_seed": 255, + "location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "device_type": "Hybrid", + "public_ip": "63.243.225.62", + "status": "Activated", + "code": "sea001-dz001", + "dz_prefixes": [ + "63.243.225.224/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.3/32", + "node_segment_idx": 2, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.4/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2034", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2034, + "ip_net": "172.16.0.234/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2035", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2035, + "ip_net": "172.16.0.44/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel2000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.10/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Switch1/11/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.60/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "63.243.225.62/30", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "63.243.225.224/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 5, + "users_count": 1, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 1, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT": { + "account_type": "Device", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 52288, + "bump_seed": 255, + "location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "device_type": "Hybrid", + "public_ip": "198.13.140.16", + "status": "Activated", + "code": "dz100a-fra2-tsw", + "dz_prefixes": [ + "198.13.140.16/29", + "198.13.140.24/29" + ], + "metrics_publisher_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "mgmt_vrf": "default", + "interfaces": [ + { + "V2": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Vpnv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.187/32", + "node_segment_idx": 89, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Ipv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.190/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet9/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.209/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet2/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.215/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet4/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.213/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet10/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.224/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet5/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.165/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet6/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.235/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "198.13.140.16/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback101", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "198.13.140.24/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet1/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "64.130.50.11/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet3/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "64.130.50.13/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 69, + "users_count": 63, + "max_users": 96, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 29, + "multicast_subscribers_count": 9, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 25, + "max_multicast_publishers": 0 + }, + "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3": { + "account_type": "Device", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 185, + "bump_seed": 252, + "location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "device_type": "Transit", + "public_ip": "137.239.213.170", + "status": "Activated", + "code": "dz-ny5-sw01", + "dz_prefixes": [ + "137.239.200.190/31" + ], + "metrics_publisher_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Ethernet1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.91/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Ethernet3/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet31/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.103/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet32/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.105/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Ethernet5/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.15/32", + "node_segment_idx": 6, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.20/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet17/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.69/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet18/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 4, + "users_count": 0, + "max_users": 0, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 91, + "bump_seed": 255, + "location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "device_type": "Hybrid", + "public_ip": "154.18.17.55", + "status": "Activated", + "code": "sin001-dz002", + "dz_prefixes": [ + "209.146.32.160/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.68/32", + "node_segment_idx": 39, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.69/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2009", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2009, + "ip_net": "172.16.0.41/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2021", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2021, + "ip_net": "172.16.0.209/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2030", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2030, + "ip_net": "172.16.0.227/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2031", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2031, + "ip_net": "172.16.0.229/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Switch1/11/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.12/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-channel1000.2037", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2037, + "ip_net": "172.16.1.1/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "209.146.32.160/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "154.18.17.55/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 60, + "users_count": 54, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 33, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 22, + "max_multicast_publishers": 0 + }, + "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4": { + "account_type": "Device", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 9260, + "bump_seed": 255, + "location_pk": "Ga9FVdnt99y3idLkthMw2LEJ2QA3WtUBKdM5MUQKnZwq", + "exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "device_type": "Hybrid", + "public_ip": "209.249.183.218", + "status": "Activated", + "code": "dgt-dzd-nyc-ny2", + "dz_prefixes": [ + "64.124.32.192/28" + ], + "metrics_publisher_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.1.27/32", + "node_segment_idx": 35, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.1.36/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet5/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.39/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.55/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet20/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.68/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet2/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.76/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "64.124.32.192/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet10/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "209.249.183.218/29", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 42, + "users_count": 38, + "max_users": 96, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 19, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 19, + "max_multicast_publishers": 0 + }, + "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 76, + "bump_seed": 255, + "location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "device_type": "Hybrid", + "public_ip": "149.11.228.133", + "status": "Activated", + "code": "fra001-dz002", + "dz_prefixes": [ + "38.246.201.96/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.16/32", + "node_segment_idx": 8, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.17/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2001", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2001, + "ip_net": "172.16.0.171/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2013", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2013, + "ip_net": "172.16.0.193/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2019", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2019, + "ip_net": "172.16.0.204/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2020", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2020, + "ip_net": "172.16.0.206/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Port-channel3000", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.136/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "38.246.201.96/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "149.11.228.133/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 12, + "users_count": 7, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 6, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 1, + "max_multicast_publishers": 0 + }, + "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 82, + "bump_seed": 254, + "location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "device_type": "Hybrid", + "public_ip": "66.198.11.74", + "status": "Activated", + "code": "was001-dz001", + "dz_prefixes": [ + "66.198.11.96/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.32/32", + "node_segment_idx": 18, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.110/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2003", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2003, + "ip_net": "172.16.0.175/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2010", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2010, + "ip_net": "172.16.0.186/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2011", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2011, + "ip_net": "172.16.0.188/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel2000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.124/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Switch1/11/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.54/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "66.198.11.96/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "66.198.11.74/30", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 13, + "users_count": 8, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 5, + "multicast_subscribers_count": 1, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 2, + "max_multicast_publishers": 0 + }, + "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 181, + "bump_seed": 254, + "location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "device_type": "Hybrid", + "public_ip": "213.248.92.111", + "status": "Activated", + "code": "tyo001-dz002", + "dz_prefixes": [ + "202.163.13.32/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.9/32", + "node_segment_idx": 5, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.14/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-channel1000.2009", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2009, + "ip_net": "172.16.0.40/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-channel1000.2035", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2035, + "ip_net": "172.16.0.45/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-channel2000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.19/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "202.163.13.32/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "213.248.92.111/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 21, + "users_count": 18, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 9, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 10, + "max_multicast_publishers": 0 + }, + "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 85, + "bump_seed": 255, + "location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "device_type": "Hybrid", + "public_ip": "4.42.212.122", + "status": "Activated", + "code": "nyc001-dz002", + "dz_prefixes": [ + "4.8.126.96/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.38/32", + "node_segment_idx": 22, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.111/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2016", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2016, + "ip_net": "172.16.0.199/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2032", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2032, + "ip_net": "172.16.0.230/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel2000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.127/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "4.8.126.96/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "4.42.212.122/30", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 49, + "users_count": 46, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 25, + "multicast_subscribers_count": 8, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 13, + "max_multicast_publishers": 0 + }, + "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2": { + "account_type": "Device", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 52190, + "bump_seed": 255, + "location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "device_type": "Hybrid", + "public_ip": "208.91.105.32", + "status": "Activated", + "code": "dz100a-iad1-tsw", + "dz_prefixes": [ + "208.91.105.32/29", + "208.91.105.40/29" + ], + "metrics_publisher_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "mgmt_vrf": "default", + "interfaces": [ + { + "V2": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Vpnv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.173/32", + "node_segment_idx": 84, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Ipv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.178/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet2/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.164/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet10/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.228/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "208.91.105.32/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback101", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "208.91.105.40/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet1/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "208.91.105.49/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet3/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "208.91.105.51/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet4/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 0, + "mtu": 9000, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.255/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 7, + "users_count": 4, + "max_users": 96, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 3, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 1, + "max_multicast_publishers": 0 + }, + "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw": { + "account_type": "Device", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 52303, + "bump_seed": 255, + "location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "device_type": "Hybrid", + "public_ip": "198.13.133.48", + "status": "Activated", + "code": "dz115a-tyo2-tsw", + "dz_prefixes": [ + "198.13.133.48/29", + "198.13.133.56/29" + ], + "metrics_publisher_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "mgmt_vrf": "default", + "interfaces": [ + { + "V2": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Vpnv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.201/32", + "node_segment_idx": 95, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Ipv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.204/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet5/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.180/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet10/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.227/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet2/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.231/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet4/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.239/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "198.13.133.48/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback101", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "198.13.133.56/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet8/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.253/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet1/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "198.13.133.217/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet3/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "198.13.133.219/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 86, + "users_count": 81, + "max_users": 96, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 37, + "multicast_subscribers_count": 7, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 37, + "max_multicast_publishers": 0 + }, + "EfCifrwGAPzCRYR1weRCfJi7C3Q5yRRf65pruvn4jLPQ": { + "account_type": "Device", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 52189, + "bump_seed": 255, + "location_pk": "4r2QUtFMiuJmn3VMxs53SgteggrKvM9gk1YuMv1u2Lvn", + "exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "device_type": "Hybrid", + "public_ip": "141.98.216.64", + "status": "Activated", + "code": "dz100a-ewr1-tsw", + "dz_prefixes": [ + "141.98.216.64/29", + "141.98.216.72/29" + ], + "metrics_publisher_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "mgmt_vrf": "default", + "interfaces": [ + { + "V2": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Vpnv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.170/32", + "node_segment_idx": 82, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Ipv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.176/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "141.98.216.64/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback101", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "141.98.216.72/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet1/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "141.98.216.101/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet4/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "141.98.216.103/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 0, + "users_count": 0, + "max_users": 0, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG": { + "account_type": "Device", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 131, + "bump_seed": 253, + "location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "device_type": "Hybrid", + "public_ip": "89.222.118.225", + "status": "Activated", + "code": "dz-fr5-sw01", + "dz_prefixes": [ + "152.233.6.192/28", + "152.233.6.208/29", + "152.233.6.216/30" + ], + "metrics_publisher_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Unlinked", + "name": "Ethernet1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet24/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.241/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.158/32", + "node_segment_idx": 71, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.159/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet17/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.253/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet18/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.42/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet19/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.231/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet16/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.97/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Ethernet20/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.1.113/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet21/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.225/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback27", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "152.233.6.192/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet22/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.249/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet23/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 2048, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.148/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet9/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "89.222.118.225/28", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + } + ], + "reference_count": 9, + "users_count": 0, + "max_users": 96, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P": { + "account_type": "Device", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 51464, + "bump_seed": 255, + "location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "device_type": "Hybrid", + "public_ip": "198.13.143.16", + "status": "Activated", + "code": "dz100a-sea1-tsw", + "dz_prefixes": [ + "198.13.143.16/29", + "198.13.143.24/29" + ], + "metrics_publisher_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "mgmt_vrf": "default", + "interfaces": [ + { + "V2": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Vpnv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.163/32", + "node_segment_idx": 80, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "Ipv4", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.166/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet2/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.230/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet10/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.232/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet4/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.236/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "198.13.143.16/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback101", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "198.13.143.24/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Activated", + "name": "Ethernet5/1", + "interface_type": "Physical", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "172.16.1.245/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet1/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "198.13.143.9/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Ethernet3/1", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 100000000000, + "cir": 100000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "198.13.143.11/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 5, + "users_count": 1, + "max_users": 96, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 1, + "max_multicast_publishers": 0 + }, + "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58": { + "account_type": "Device", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 83, + "bump_seed": 255, + "location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "device_type": "Hybrid", + "public_ip": "38.88.214.133", + "status": "Activated", + "code": "was001-dz002", + "dz_prefixes": [ + "38.246.201.192/27" + ], + "metrics_publisher_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.34/32", + "node_segment_idx": 20, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.35/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2012", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2012, + "ip_net": "172.16.0.190/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel1000.2013", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 2013, + "ip_net": "172.16.0.192/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Port-Channel2000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "172.16.0.125/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V2": { + "status": "Activated", + "name": "Loopback100", + "interface_type": "Loopback", + "interface_cyoa": "None", + "interface_dia": "None", + "loopback_type": "None", + "bandwidth": 0, + "cir": 0, + "mtu": 1500, + "routing_mode": "Static", + "vlan_id": 0, + "ip_net": "38.246.201.192/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": true + } + }, + { + "V2": { + "status": "Unlinked", + "name": "Switch1/12/3", + "interface_type": "Physical", + "interface_cyoa": "GREOverDIA", + "interface_dia": "DIA", + "loopback_type": "None", + "bandwidth": 10000000000, + "cir": 4000000000, + "mtu": 1500, + "routing_mode": "BGP", + "vlan_id": 0, + "ip_net": "38.88.214.133/31", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 6, + "users_count": 3, + "max_users": 128, + "device_health": "Pending", + "desired_status": "Pending", + "unicast_users_count": 2, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 1, + "max_multicast_publishers": 0 + } + }, + "links": { + "ABXMG7UZcbytdAt5tqMHUC8NBxuKByrLTRN91WXnZbk9": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 142, + "bump_seed": 254, + "side_a_pk": "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj", + "side_z_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 450000, + "jitter_ns": 1000000, + "tunnel_id": 24, + "tunnel_net": "172.16.0.182/31", + "status": "Activated", + "code": "tyo001-dz001:tyo002-dz002", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Port-Channel1000.2007", + "side_z_iface_name": "Port-Channel1000.2007", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "HmMvUfSW9DMYiHAANEXrTYxwX89VUPxnbcWwWWUputnk": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 184, + "bump_seed": 254, + "side_a_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "side_z_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 82032000, + "jitter_ns": 1000000, + "tunnel_id": 56, + "tunnel_net": "172.16.0.44/31", + "status": "Activated", + "code": "sea001-dz001:tyo001-dz002", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Port-Channel1000.2035", + "side_z_iface_name": "Port-channel1000.2035", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "8XjBUfLfujKtrafLXk3SDMgsGL7hh4c3KPn32HVMFojX": { + "account_type": "Link", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 56475, + "bump_seed": 255, + "side_a_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "side_z_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_type": "DZX", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 375000, + "jitter_ns": 10000, + "tunnel_id": 137, + "tunnel_net": "172.16.1.224/31", + "status": "Activated", + "code": "dz100a-fra2-tsw:dz-fr5-sw01", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "side_a_iface_name": "Ethernet10/1", + "side_z_iface_name": "Ethernet21/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "8J4DJUr5wq1wJd8PCbr38jdF1v14ZkHmAQpfaqGWfeVk": { + "account_type": "Link", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 252, + "bump_seed": 254, + "side_a_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "side_z_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "link_type": "WAN", + "bandwidth": 200000000000, + "mtu": 9000, + "delay_ns": 150000, + "jitter_ns": 1000000, + "tunnel_id": 63, + "tunnel_net": "172.16.0.66/31", + "status": "Activated", + "code": "dz-ny7-sw01:dz-ny7-sw02", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "side_a_iface_name": "Port-channel2000", + "side_z_iface_name": "Port-channel2000", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "EY87P4cBAUW8VEJV82QaTmNY1ZB2t51Z9MPL7UUxywtp": { + "account_type": "Link", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 57037, + "bump_seed": 254, + "side_a_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "side_z_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "link_type": "WAN", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 148420000, + "jitter_ns": 10000, + "tunnel_id": 149, + "tunnel_net": "172.16.1.234/31", + "status": "Activated", + "code": "dz100a-sgp1-tsw:dz100a-fra2-tsw", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "side_a_iface_name": "Ethernet3/1", + "side_z_iface_name": "Ethernet6/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Activated" + }, + "DqJ98NLFCUu9fj5jhk9HAV76UE8puArU6NNjQ9Rwp5fj": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 182, + "bump_seed": 255, + "side_a_pk": "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj", + "side_z_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 150000, + "jitter_ns": 1000000, + "tunnel_id": 54, + "tunnel_net": "172.16.0.18/31", + "status": "Activated", + "code": "tyo001-dz001:tyo001-dz002", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Port-Channel2000", + "side_z_iface_name": "Port-channel2000", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "Ca2Aj5RZnbrfWHU5jjSYZdWx7CZfuKoC8dxEEWTgJFx2": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 9485, + "bump_seed": 254, + "side_a_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "side_z_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "link_type": "DZX", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 150000, + "jitter_ns": 1000000, + "tunnel_id": 88, + "tunnel_net": "172.16.1.38/31", + "status": "Activated", + "code": "nyc002-dz002:dgt-dzd-nyc-ny2", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Switch1/11/1", + "side_z_iface_name": "Ethernet5/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "HQNCezuCWzZcMmhFHmPywJPMGZU1WkPwfBL5YMMyW6AM": { + "account_type": "Link", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 129, + "bump_seed": 255, + "side_a_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "side_z_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 5159000, + "jitter_ns": 1000000, + "tunnel_id": 15, + "tunnel_net": "172.16.0.154/31", + "status": "Activated", + "code": "dz-ny7-sw02:dz-dc10-sw01", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "side_a_iface_name": "Ethernet42", + "side_z_iface_name": "Ethernet1/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "JBmy4A7XxuB2dgBFGzRTvK8if1oNQW6Hx3DDGut8D8ZP": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 183, + "bump_seed": 255, + "side_a_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "side_z_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 66788000, + "jitter_ns": 1000000, + "tunnel_id": 55, + "tunnel_net": "172.16.0.40/31", + "status": "SoftDrained", + "code": "tyo001-dz002:sin001-dz002", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Port-channel1000.2009", + "side_z_iface_name": "Port-Channel1000.2009", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "61UDX3zAU7cZWBgyZA3xkBSzXjXhJbTPyNPM2JabWT8u": { + "account_type": "Link", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 262, + "bump_seed": 253, + "side_a_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "side_z_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "link_type": "WAN", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 200000, + "jitter_ns": 10000, + "tunnel_id": 66, + "tunnel_net": "172.16.0.102/31", + "status": "Activated", + "code": "dz-ny7-sw01:dz-ny5-sw01", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "side_a_iface_name": "Ethernet52/1", + "side_z_iface_name": "Ethernet31/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "FmcM3hsb96fgpFQMGHPoTcrKE6K4AKbC1xtaRhDsLkAa": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 116, + "bump_seed": 254, + "side_a_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "side_z_pk": "B1JjhMNjy3HhkXvyYzq6DBNfLfLkvizftzaUrXDf7XEY", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 150000, + "jitter_ns": 1000000, + "tunnel_id": 0, + "tunnel_net": "172.16.0.10/31", + "status": "Activated", + "code": "sea001-dz001:sea001-dz002", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Port-Channel2000", + "side_z_iface_name": "Port-Channel2000", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "GBefoHkadgE4kR6R4goKmeZNGTn6GX5Wr2RpYGFS9AFr": { + "account_type": "Link", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 56486, + "bump_seed": 255, + "side_a_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "side_z_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "link_type": "DZX", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 167000, + "jitter_ns": 10000, + "tunnel_id": 139, + "tunnel_net": "172.16.1.174/31", + "status": "Activated", + "code": "dz100a-sgp1-tsw:dz-sg1-sw01", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "side_a_iface_name": "Ethernet10/1", + "side_z_iface_name": "Ethernet17/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "5j4y3qgt8eqT2bKem13XzFydBN2ti7K9kEdjX5zoBnGM": { + "account_type": "Link", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 11661, + "bump_seed": 255, + "side_a_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "side_z_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "link_type": "WAN", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 5080000, + "jitter_ns": 100000, + "tunnel_id": 93, + "tunnel_net": "172.16.1.54/31", + "status": "Activated", + "code": "dgt-dzd-ash-dc3:dgt-dzd-nyc-ny2", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "side_a_iface_name": "Ethernet1/1", + "side_z_iface_name": "Ethernet1/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "4CHWAfis8nch5fpAgyb69PcZHmt9zZQ94MvDjpAVSty2": { + "account_type": "Link", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 263, + "bump_seed": 254, + "side_a_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "side_z_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "link_type": "WAN", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 200000, + "jitter_ns": 10000, + "tunnel_id": 67, + "tunnel_net": "172.16.0.104/31", + "status": "Activated", + "code": "dz-ny7-sw02:dz-ny5-sw01", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "side_a_iface_name": "Ethernet52/1", + "side_z_iface_name": "Ethernet32/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "6yYfjJHaZMWj828pAchWRCjGApnMVCSqFNa2iPhBE2DE": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 144, + "bump_seed": 254, + "side_a_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "side_z_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 5336000, + "jitter_ns": 1000000, + "tunnel_id": 26, + "tunnel_net": "172.16.0.186/31", + "status": "Activated", + "code": "was001-dz001:nyc002-dz002", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Port-Channel1000.2010", + "side_z_iface_name": "Port-Channel1000.2010", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "Fn2EJucjUakS99N9D4MFcykP7W8uiZ9PmCzBihfBi51s": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 108, + "bump_seed": 255, + "side_a_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "side_z_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 150000, + "jitter_ns": 1000000, + "tunnel_id": 5, + "tunnel_net": "172.16.0.124/31", + "status": "Activated", + "code": "was001-dz001:was001-dz002", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Port-Channel2000", + "side_z_iface_name": "Port-Channel2000", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "GUEVP6ugfbZpC33sYJuB1buTxwDJjEXn8wjxMuq9xpbK": { + "account_type": "Link", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 57045, + "bump_seed": 255, + "side_a_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "side_z_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "link_type": "WAN", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 66894000, + "jitter_ns": 10000, + "tunnel_id": 151, + "tunnel_net": "172.16.1.238/31", + "status": "Activated", + "code": "dz100a-sgp1-tsw:dz115a-tyo2", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "side_a_iface_name": "Ethernet2/1", + "side_z_iface_name": "Ethernet4/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "4jWgCo3rVDa61eaG7kBnRt5fbmnS6sug848XFsgBQC4N": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 250, + "bump_seed": 255, + "side_a_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "side_z_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "link_type": "DZX", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 143000, + "jitter_ns": 1000000, + "tunnel_id": 61, + "tunnel_net": "172.16.0.60/31", + "status": "Activated", + "code": "sea001-dz001:dz-sea10-sw01", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Switch1/11/1", + "side_z_iface_name": "Ethernet1/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "2Ees9RHezZuta2hgVJJXMWMVCDdqAyPyU1DUboUSiAze": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 147, + "bump_seed": 255, + "side_a_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "side_z_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 88298000, + "jitter_ns": 1000000, + "tunnel_id": 29, + "tunnel_net": "172.16.0.192/31", + "status": "Activated", + "code": "was001-dz002:fra001-dz002", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Port-Channel1000.2013", + "side_z_iface_name": "Port-Channel1000.2013", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "5tavj7kq3uBrSP7LbuhT2T2VjngxV9yYU7hufrYXVntm": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 249, + "bump_seed": 255, + "side_a_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "side_z_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "link_type": "DZX", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 482000, + "jitter_ns": 1000000, + "tunnel_id": 60, + "tunnel_net": "172.16.0.58/31", + "status": "Activated", + "code": "tyo002-dz002:dz-ty9-sw01", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Switch1/11/1", + "side_z_iface_name": "Ethernet1/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "CXeafseL5sd9KYmbKQQqmk3MzcGHwdLVLDqLbiKbpz3k": { + "account_type": "Link", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 3223, + "bump_seed": 254, + "side_a_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "side_z_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "link_type": "WAN", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 65447999, + "jitter_ns": 15000, + "tunnel_id": 83, + "tunnel_net": "172.16.1.24/31", + "status": "Activated", + "code": "dz-ty9-sw01:dz-sg1-sw01", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "side_a_iface_name": "Ethernet32/1", + "side_z_iface_name": "Ethernet24/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "AsfPXyjY4dgNkUtepE6LCRzKcXroZ3z8XtR5XEGnc4GG": { + "account_type": "Link", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 57021, + "bump_seed": 253, + "side_a_pk": "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2", + "side_z_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "link_type": "DZX", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 151000, + "jitter_ns": 10000, + "tunnel_id": 146, + "tunnel_net": "172.16.1.228/31", + "status": "Activated", + "code": "dz100a-iad1-tsw:dz-dc10-sw01", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "side_a_iface_name": "Ethernet10/1", + "side_z_iface_name": "Ethernet18/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "bChqyD8NUxeXeTMFq3YBu4WP3XqHkwndPGTEZxmA82k": { + "account_type": "Link", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 16642, + "bump_seed": 254, + "side_a_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "side_z_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_type": "DZX", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 100000, + "jitter_ns": 50000, + "tunnel_id": 108, + "tunnel_net": "172.16.1.96/31", + "status": "Activated", + "code": "dgt-dzd-fra-fr5:dz-fr5-sw01", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "side_a_iface_name": "Ethernet20/1", + "side_z_iface_name": "Ethernet16/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "CqHUSTSccTRMJ4LPGkgfQLA1GmYWTqiR8LQWfqVGUeAt": { + "account_type": "Link", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 11648, + "bump_seed": 252, + "side_a_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "side_z_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "link_type": "DZX", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 250000, + "jitter_ns": 50000, + "tunnel_id": 94, + "tunnel_net": "172.16.1.56/31", + "status": "Activated", + "code": "dgt-dzd-ash-dc3:dz-dc10-sw01", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "side_a_iface_name": "Ethernet25/1", + "side_z_iface_name": "Ethernet16/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "889avwHAHyCvg9c8ALBfC91yQY7w6ncg9pjwdDivRsUZ": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 188, + "bump_seed": 255, + "side_a_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "side_z_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "link_type": "DZX", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 156000, + "jitter_ns": 1000000, + "tunnel_id": 59, + "tunnel_net": "172.16.0.54/31", + "status": "Activated", + "code": "was001-dz001:dz-dc10-sw01", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Switch1/11/1", + "side_z_iface_name": "Ethernet3/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "B7qNZ1r7yXdLoEHb8eGvuPUdsVYoKUVgTPQsYqnqDBBQ": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 264, + "bump_seed": 253, + "side_a_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "side_z_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "link_type": "DZX", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 156000, + "jitter_ns": 1000000, + "tunnel_id": 64, + "tunnel_net": "172.16.0.90/31", + "status": "Activated", + "code": "nyc002-dz002:dz-ny5-sw01", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Switch1/11/2", + "side_z_iface_name": "Ethernet1/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "31N1k5feogjR5zDux9U6opBEjwtuJ6qzqNrmpKRHugvt": { + "account_type": "Link", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 56987, + "bump_seed": 254, + "side_a_pk": "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2", + "side_z_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "link_type": "WAN", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 83264000, + "jitter_ns": 10000, + "tunnel_id": 138, + "tunnel_net": "172.16.1.164/31", + "status": "Activated", + "code": "dz100a-iad1-tsw:dz100a-fra2-tsw", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "side_a_iface_name": "Ethernet2/1", + "side_z_iface_name": "Ethernet5/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "5VjMUTNCDzmrfHkJ7MRftuvQjAmEv4da6WCm1Aqp9zzP": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 166, + "bump_seed": 255, + "side_a_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "side_z_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 136000, + "jitter_ns": 1000000, + "tunnel_id": 48, + "tunnel_net": "172.16.0.230/31", + "status": "Activated", + "code": "nyc001-dz002:nyc002-dz002", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Port-Channel1000.2032", + "side_z_iface_name": "Port-Channel1000.2032", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "BfrMFL2xVwGECppmQBrmCD2VkMfABr8ZtrafNVnohzET": { + "account_type": "Link", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 57034, + "bump_seed": 255, + "side_a_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "side_z_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "link_type": "DZX", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 137000, + "jitter_ns": 10000, + "tunnel_id": 148, + "tunnel_net": "172.16.1.232/31", + "status": "Activated", + "code": "dz100a-sea1-tsw:dz-sea10-sw01", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "side_a_iface_name": "Ethernet10/1", + "side_z_iface_name": "Ethernet17/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "J35vG3xdC7WZ2AQzs295gFktfgRdq9URwdZGCitmDJFB": { + "account_type": "Link", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 19161, + "bump_seed": 254, + "side_a_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "side_z_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "link_type": "DZX", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 100000, + "jitter_ns": 50000, + "tunnel_id": 113, + "tunnel_net": "172.16.1.118/31", + "status": "Activated", + "code": "dgt-dzd-sin-sg3:dz-sg1-sw01", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "side_a_iface_name": "Ethernet20/1", + "side_z_iface_name": "Ethernet16/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "HjqQuQw87zU4bRxfM6zkaei9f5jTjC5LfwCWvjcPJu54": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 172, + "bump_seed": 255, + "side_a_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "side_z_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "link_type": "DZX", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 129000, + "jitter_ns": 1000000, + "tunnel_id": 53, + "tunnel_net": "172.16.0.12/31", + "status": "Activated", + "code": "sin001-dz002:dz-sg1-sw01", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Switch1/11/1", + "side_z_iface_name": "Ethernet1/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "FVWE6sAb2KaHNANJm1CGQjhzWzMLZxqs9Wt7BkDoKiX4": { + "account_type": "Link", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 57017, + "bump_seed": 251, + "side_a_pk": "4wusXr7UXdX7b4j6LUVYiW5VU1CRnQkSoQACgq9vM1r9", + "side_z_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "link_type": "DZX", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 100000, + "jitter_ns": 50000, + "tunnel_id": 145, + "tunnel_net": "172.16.1.226/31", + "status": "Activated", + "code": "dgt-dzd-tyo-ty8:dz115a-tyo2-tsw", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "side_a_iface_name": "Ethernet21/1", + "side_z_iface_name": "Ethernet10/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "9m3X8KaoR6BBmicBtVKxhdXerttxhdT7PYFvT3SnPvos": { + "account_type": "Link", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 134, + "bump_seed": 255, + "side_a_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "side_z_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "link_type": "WAN", + "bandwidth": 50000000000, + "mtu": 9000, + "delay_ns": 82200000, + "jitter_ns": 1000000, + "tunnel_id": 16, + "tunnel_net": "172.16.0.166/31", + "status": "Activated", + "code": "dz-ty9-sw01:dz-sea10-sw01", + "contributor_pk": "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm", + "side_a_iface_name": "Ethernet31/1", + "side_z_iface_name": "Ethernet25/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "7rgqwAbY2iKoHA5xWeUmPZoY63YC6XvocbdHA5FjkzEn": { + "account_type": "Link", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 13564, + "bump_seed": 255, + "side_a_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "side_z_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "link_type": "DZX", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 250000, + "jitter_ns": 50000, + "tunnel_id": 96, + "tunnel_net": "172.16.1.68/31", + "status": "Activated", + "code": "dgt-dzd-nyc-ny2:dz-ny5-sw01", + "contributor_pk": "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y", + "side_a_iface_name": "Ethernet20/1", + "side_z_iface_name": "Ethernet17/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "EXZnmY379HerfKQiUSHKReexZwCzueZg7g9iBTnDxStS": { + "account_type": "Link", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 109, + "bump_seed": 255, + "side_a_pk": "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT", + "side_z_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 150000, + "jitter_ns": 1000000, + "tunnel_id": 6, + "tunnel_net": "172.16.0.126/31", + "status": "Activated", + "code": "nyc001-dz001:nyc001-dz002", + "contributor_pk": "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW", + "side_a_iface_name": "Port-Channel2000", + "side_z_iface_name": "Port-Channel2000", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + }, + "8wQCpckuDYHHQNM2cbLN2KgNjLT9EwbCAuegZuZy8AMr": { + "account_type": "Link", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 57033, + "bump_seed": 255, + "side_a_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "side_z_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "link_type": "WAN", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 88424000, + "jitter_ns": 10000, + "tunnel_id": 147, + "tunnel_net": "172.16.1.230/31", + "status": "Activated", + "code": "dz100a-sea1-tsw:dz115a-tyo2-tsw", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "side_a_iface_name": "Ethernet2/1", + "side_z_iface_name": "Ethernet2/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Activated" + }, + "4akCMp6aQGtbRMSns8exFwtiqaoTAaos785eHvJgx3o2": { + "account_type": "Link", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 57003, + "bump_seed": 255, + "side_a_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "side_z_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "link_type": "DZX", + "bandwidth": 100000000000, + "mtu": 9000, + "delay_ns": 686000, + "jitter_ns": 10000, + "tunnel_id": 140, + "tunnel_net": "172.16.1.180/31", + "status": "Activated", + "code": "dz115a-tyo2-tsw:dz-ty9-sw01", + "contributor_pk": "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4", + "side_a_iface_name": "Ethernet5/1", + "side_z_iface_name": "Ethernet17/1", + "delay_override_ns": 0, + "link_health": "Pending", + "desired_status": "Pending" + } + }, + "users": { + "AbSxgr6v2m3ff6EPRuEjwQNnVuSzRVg555vHbtAa9YnY": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 46878, + "bump_seed": 253, + "user_type": "IBRLWithAllocatedIP", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "43.212.27.94", + "dz_ip": "154.18.64.131", + "tunnel_id": 510, + "tunnel_net": "169.254.6.190/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "J6Jpegnuac7WtaRLMjZWW5k3cCH9rxi3YywB77nXeG91": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 34771, + "bump_seed": 254, + "user_type": "IBRLWithAllocatedIP", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "52.194.229.75", + "dz_ip": "202.163.13.34", + "tunnel_id": 502, + "tunnel_net": "169.254.6.44/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "AKCb95czSSWB8EKiCBZNanx1hroYi8tiJbi72JJXrdJm": { + "account_type": "User", + "owner": "69nT8g5XC8csa6Q8nkSK1JYxAnQq8aW6BCRzaEEy9Fqc", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.123.151", + "dz_ip": "67.213.123.151", + "tunnel_id": 522, + "tunnel_net": "169.254.7.202/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8hAYbagNt7CMBooFfqVJhBgLqLffpjXTWJMk8yybjJsN", + "tunnel_endpoint": "154.18.0.97" + }, + "5GqEW8Z656ZagrZEarxTK8XoEbuKhaFjfJEEkEXSRESd": { + "account_type": "User", + "owner": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "cyoa_type": "GREOverDIA", + "client_ip": "154.16.171.107", + "dz_ip": "148.51.121.15", + "tunnel_id": 507, + "tunnel_net": "169.254.9.76/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "93gu5F4pAh7Af1PU2QC5umWk1owr6NHDAJiQ9jWsBwoU", + "tunnel_endpoint": "216.200.231.186" + }, + "57osEDd6SqXuRTwFvsSDx42KzG88t6oHS4t1ekGSmuoF": { + "account_type": "User", + "owner": "9nxWixzZih86YrKapEiG3AZigQBpoUX9Avn5pS1GWMqX", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.101", + "dz_ip": "148.51.121.67", + "tunnel_id": 551, + "tunnel_net": "169.254.11.248/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "hykfH9jUQqe2yqv3VqVAK5AmMYqrmMWmdwDcbfsm6My", + "tunnel_endpoint": "198.13.133.48" + }, + "D4oZbaZPqdH1njknarzFX1RBPWkEfAcJeYDfHnkTH3Cm": { + "account_type": "User", + "owner": "BgjpXdNJYN4KSp5X32HowKEj1A2eeBcqNSfwyojxj1KJ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.44.152", + "dz_ip": "64.176.44.152", + "tunnel_id": 508, + "tunnel_net": "169.254.10.184/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "A23LfQn6khffj2hGhGfXr6P52W2pxrVcCaHVQLYQgiX2", + "tunnel_endpoint": "213.248.92.111" + }, + "574xUCD8f7WFWAdw49XMfbst2os33WafBQKT5BgdQNrn": { + "account_type": "User", + "owner": "ESwi4y2meazsbLz1WaSx3vy1MCnenL8NsFKq77vNXp1T", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.123.149", + "dz_ip": "148.51.120.123", + "tunnel_id": 524, + "tunnel_net": "169.254.1.64/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "CLsFr1KZVbAyz16iFpwg2e4hiekR1unpwyxfNdjBMaoE", + "tunnel_endpoint": "154.18.64.128" + }, + "3nKLPAe6CK1frLonBgBaZMQKV6uqoG5UcmgDQPDUq7p3": { + "account_type": "User", + "owner": "J2ibtVSFZd11ccVf6CYS7w1MeNiCjQjosDAofhZbaZ6T", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.165.43", + "dz_ip": "148.51.121.128", + "tunnel_id": 523, + "tunnel_net": "169.254.9.104/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y", + "tunnel_endpoint": "184.104.213.176" + }, + "BzhoDjNPcgbJXNv5rKVfTWqfb2SjSgSS4EcFYSttAaQL": { + "account_type": "User", + "owner": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH", + "index": 25855, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.34.106", + "dz_ip": "64.130.34.106", + "tunnel_id": 514, + "tunnel_net": "169.254.3.166/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6896KVqt5CXMqZpp61a9XgjMkJgvisHUzSXUSsTo92NN", + "tunnel_endpoint": "0.0.0.0" + }, + "5uVccUw4y9JLGndUcwECbK1ytb9pSg3umhhBW1j2Bj7w": { + "account_type": "User", + "owner": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.94.5", + "dz_ip": "148.51.120.115", + "tunnel_id": 529, + "tunnel_net": "169.254.9.42/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "tunnel_endpoint": "198.13.133.48" + }, + "27U82RrXJ2xYP8NCTooEXetrcfjSNUNzdwiyofm5f7qr": { + "account_type": "User", + "owner": "EsYHvPULXA74UNHhHzXQaD3GtLsuRimP85bTF6mE1TMb", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "45.76.15.94", + "dz_ip": "45.76.15.94", + "tunnel_id": 510, + "tunnel_net": "169.254.6.166/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "uEhHSnCXvWgtgvVaYscPHjG13G3peMmngQQ2ghC54i3", + "tunnel_endpoint": "64.124.32.192" + }, + "FcCxgDuZudp5pkvsTYxcfu9PXDbEnromFz3KUC6FGfkA": { + "account_type": "User", + "owner": "BiRD59nT2sdvtSzjJSnZ2DtoDK6jzxS8xAPxyaJ5jUX3", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "140.82.63.236", + "dz_ip": "148.51.121.189", + "tunnel_id": 515, + "tunnel_net": "169.254.9.102/31", + "status": "Activated", + "publishers": "7acopWYJ9asXNHKDyXCzaeu5LU91UVSBmPcx7gQSYtuQ", + "subscribers": "7acopWYJ9asXNHKDyXCzaeu5LU91UVSBmPcx7gQSYtuQ", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "8Dr8KsBAx9uRaMmUUM4ZUeYNc7ggcTtSXUEY9DYphDz9": { + "account_type": "User", + "owner": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "index": 0, + "bump_seed": 250, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.247", + "dz_ip": "148.51.120.175", + "tunnel_id": 523, + "tunnel_net": "169.254.8.64/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "tunnel_endpoint": "67.209.55.48" + }, + "Hw41Gu1eFZUVPRHQ2NAAXYEpvRhd5Rk6nQ2CyLHsDcLL": { + "account_type": "User", + "owner": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "66.42.34.34", + "dz_ip": "66.42.34.34", + "tunnel_id": 536, + "tunnel_net": "169.254.0.160/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "tunnel_endpoint": "198.13.133.56" + }, + "99HmzhrtbELmEDof7uZ9rVJNELsXL1aDCLh5hsGCQTYD": { + "account_type": "User", + "owner": "221AUvGiUry1aeMzCHghgakdFHcaWQsqDisyoZSjR3Vi", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.218.125", + "dz_ip": "148.51.120.124", + "tunnel_id": 519, + "tunnel_net": "169.254.6.244/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "ASPKrcFM9M27cHcbuuuJddxPumowE1izViRsNehVjqAb", + "tunnel_endpoint": "64.124.32.192" + }, + "Bng3gS5nMweX3vpxVSSz8g2E3PdsmvFsrZrbP9Nhi6x7": { + "account_type": "User", + "owner": "GTAh4uFkY5rYxDuZ54yQuBXoYdEgALHuSg3dFSKpeQuc", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "167.179.76.114", + "dz_ip": "148.51.120.198", + "tunnel_id": 513, + "tunnel_net": "169.254.7.212/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "9dH6wfdJVgnDcbCUjT8rkmejAzTnGQaFarmLfvBYXANK", + "tunnel_endpoint": "213.248.92.111" + }, + "24gAyP6jpEmpfX7WjTmS7MZfb9D1vK1am5sBFYNSNzgz": { + "account_type": "User", + "owner": "GHUFsW8uJoHeD6BPvFZYYPD8WbTawRyxYeCpqjcaU5wi", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.28.184", + "dz_ip": "45.77.28.184", + "tunnel_id": 517, + "tunnel_net": "169.254.9.186/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CMPSSdrTnRQBiBGTyFpdCc3VMNuLWYWaSkE8Zh5z6gbd", + "tunnel_endpoint": "154.18.64.128" + }, + "51rcF9EcNSJxQ6oHjhG7ZUQGCAwB2bUmdaWsrPTy5bMu": { + "account_type": "User", + "owner": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.26.61", + "dz_ip": "148.51.120.53", + "tunnel_id": 514, + "tunnel_net": "169.254.6.38/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "EUDis6LJeJzDHTEBgfHGQyjHp63XZkGkx4E69xunC2Ej", + "tunnel_endpoint": "213.248.92.111" + }, + "79dUJRzN1BzpKhFFd8bR9XxfDoE2AASRmVf7KpJrNfLP": { + "account_type": "User", + "owner": "3wgfpoQJsqCbuShqP8Kg3tRPN3sVhjWk23EFF8aRFbxf", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "185.191.117.36", + "dz_ip": "185.191.117.36", + "tunnel_id": 513, + "tunnel_net": "169.254.4.66/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Hidb8H1NsDMHa5bFTtGA5hDhf2JefNm6tmr1Gr26ETaW": { + "account_type": "User", + "owner": "2BYpEke9hJ5cUtPMx1mj1xdcyhNbmKPZcD4REcwgstcb", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.142", + "dz_ip": "151.123.174.142", + "tunnel_id": 520, + "tunnel_net": "169.254.2.124/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7MTjmteQHhthwwTZhUzsc2dP4NBvGNRqj8jzdqNxHFGE", + "tunnel_endpoint": "198.13.133.56" + }, + "FoZgL1Djzegtvf6Dws6fCgD7Jq8rBNdGxMjUXSYPNq5y": { + "account_type": "User", + "owner": "ERD31ASEiN2VPXp8kMhAZSpAVKhRwtnseVgBEGPBMwGh", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "154.45.250.109", + "dz_ip": "148.51.122.19", + "tunnel_id": 511, + "tunnel_net": "169.254.8.32/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "iaQNQUwJ3CanN2otpzMsW1DYA7ENeq6wyz5hv1R31k3", + "tunnel_endpoint": "38.122.35.137" + }, + "DRNiopXzRskF6Gh2ogEvtPjBbTgEjgyerNExkmSaHhQd": { + "account_type": "User", + "owner": "5LK4dd3zSdtaKX4Fw54EkPLMU9Pwhv85Xx4xnfhY5ifp", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.130.141", + "dz_ip": "198.13.130.141", + "tunnel_id": 513, + "tunnel_net": "169.254.3.34/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "67.209.55.48" + }, + "CdqDiTammGL4HQSKLwis2ibXyhSKE433MX9sBErgJ5pj": { + "account_type": "User", + "owner": "BNKS5rzaRhoikQbeYntbd6inE1PqecGhqDG5qvg3EEFj", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.207", + "dz_ip": "67.213.122.207", + "tunnel_id": 501, + "tunnel_net": "169.254.0.90/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2AKKnirWVZMhnzuwqpizw9SwfZjGpRFLx2zCCNtPWpbc", + "tunnel_endpoint": "0.0.0.0" + }, + "DPb9b6Wia8iujr9bWTcCd41wP44Y12n4vDYDHNENTex3": { + "account_type": "User", + "owner": "HXxMuyjuXoeNy3fLb71oMvFQix9FxiZH1d6JQTk7v811", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "57.128.72.164", + "dz_ip": "148.51.121.30", + "tunnel_id": 507, + "tunnel_net": "169.254.9.112/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "4XspXDcJy3DWZsVdaXrt8pE1xhcLpXDKkhj9XyjmWWNy", + "tunnel_endpoint": "193.28.105.130" + }, + "Hu8U7VUC8mLLhfA6jQ5gZW8ZCtAx2RudidXcpH1GVa9": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.138.187", + "dz_ip": "198.13.138.187", + "tunnel_id": 556, + "tunnel_net": "169.254.11.120/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "AmxYkNyQNmRZTLDjZwcgGrKVeEkAHuHKWJZvsQtfmdnV": { + "account_type": "User", + "owner": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.83.9", + "dz_ip": "148.51.121.20", + "tunnel_id": 535, + "tunnel_net": "169.254.9.80/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "14JqZ9gCYVHrHp1TLRwFm1nYbNjR8bW5H3TY8gzZjkyR", + "tunnel_endpoint": "198.13.133.56" + }, + "46YfNZTTXuqY4eza3nCSBN18kJKCxLJYFpzDn7rKtckF": { + "account_type": "User", + "owner": "CjjwfyfjkoXew2KYkGHJkAuurA5cGaHi8V5LtrPdZ5Ti", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.97", + "dz_ip": "2.57.215.97", + "tunnel_id": 538, + "tunnel_net": "169.254.9.232/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CtvdyHYt8cMuGVHFarV2RADfoCdnrbd8e9jAsB225uMW", + "tunnel_endpoint": "198.13.133.56" + }, + "BC48ux46rd5jZxw7YJFCHiMCkM6hyZrnbjEyV8HsCZe1": { + "account_type": "User", + "owner": "GTAh4uFkY5rYxDuZ54yQuBXoYdEgALHuSg3dFSKpeQuc", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "167.179.76.114", + "dz_ip": "167.179.76.114", + "tunnel_id": 514, + "tunnel_net": "169.254.7.174/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9dH6wfdJVgnDcbCUjT8rkmejAzTnGQaFarmLfvBYXANK", + "tunnel_endpoint": "154.18.64.128" + }, + "6YLLxaGjWJBXiT3U5LQ7dWSsuaqUB7uh8RKdMAGLgSp9": { + "account_type": "User", + "owner": "DZ8r6dJzbr4NB69rEKCVv1HJQznbp3c3ng1RaZnjx8Qu", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.133.169", + "dz_ip": "148.51.120.184", + "tunnel_id": 532, + "tunnel_net": "169.254.8.114/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "By8MseMKtZQQaQjMHJiyetmc5AC8RZZv8C2ss33ktrHt", + "tunnel_endpoint": "198.13.140.16" + }, + "4BZay3dZz1fVaoQLizhjv4TpcdihSyAx5tfVtc9QvHYn": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 251, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.136.182", + "dz_ip": "198.13.136.182", + "tunnel_id": 541, + "tunnel_net": "169.254.10.230/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "6s4iBfF7kWVXfT1ezcxT5uof8XMEDTUkt6ocxNH1EV5D": { + "account_type": "User", + "owner": "shftkxnsXmqAkmLgz9Mn7bNB5Fr6mKgFc58kFHfVikj", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "23.252.121.146", + "dz_ip": "23.252.121.146", + "tunnel_id": 503, + "tunnel_net": "169.254.4.114/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "86qwWfy5X5T1kkC7WmQ4dRHRFXPYk4NFVgKBRp1e8tfv", + "tunnel_endpoint": "38.247.16.192" + }, + "ARf6nJKnAYrLbiinfz1o3nXY9GuHKii7GD3h5Tb6aR96": { + "account_type": "User", + "owner": "FmA9r56VrQGS61k76fXANcbXrT8KnB9dFRECH3moFh8q", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "167.179.99.201", + "dz_ip": "167.179.99.201", + "tunnel_id": 570, + "tunnel_net": "169.254.11.114/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "HnwMGBAw5PxaX56eSYc969MorEy2NzEMPLkmBkdnJmeq", + "tunnel_endpoint": "198.13.133.56" + }, + "EnNbv7qyBMjT4uBRAY877qGEeyf9RMMZJ1yNhEvUqczq": { + "account_type": "User", + "owner": "GHUFsW8uJoHeD6BPvFZYYPD8WbTawRyxYeCpqjcaU5wi", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "202.182.99.41", + "dz_ip": "148.51.121.17", + "tunnel_id": 511, + "tunnel_net": "169.254.5.186/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "8aAt1RTSxCw3ZqXwityS6gqW32PvMJJp5DPGUwtdwJQk", + "tunnel_endpoint": "202.163.13.32" + }, + "6o7jmS5p5VeySNeq2PN44P4ZfRK332ZxNU9aWiu1DhwK": { + "account_type": "User", + "owner": "5gGfsbAa5J5KkCyQjc8gJjymCddkReCgP6V8B6dmo18Z", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.51.216", + "dz_ip": "64.176.51.216", + "tunnel_id": 518, + "tunnel_net": "169.254.8.230/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7Nn8qBJey7vXtVFMNBbbuN8UkujU8Y6nWzbHVGuf49yV", + "tunnel_endpoint": "202.163.13.32" + }, + "Aekk12xww381KMimhRU7grbUGWFYgjqnnG1ArcWh6EyF": { + "account_type": "User", + "owner": "539tRUjSsrj57iqWFrYfntDbWsLeeDnmhXQJ3x32NmLk", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.103.133", + "dz_ip": "45.32.103.133", + "tunnel_id": 515, + "tunnel_net": "169.254.1.228/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FyrwfMaomErzqrFUXMjCJ7mA4u81DsiDdrzC3MJD6d4j", + "tunnel_endpoint": "152.233.14.224" + }, + "FYFZPmmiPT8M6rD6Ka8SPw5qrUKVGpirhmxwpTtaF6sF": { + "account_type": "User", + "owner": "HoD9f8qmxEW9jXgLawE3zdWCPLKBbGCrL9Y1q4xXWxsj", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "207.148.31.63", + "dz_ip": "207.148.31.63", + "tunnel_id": 521, + "tunnel_net": "169.254.8.10/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "AdSHK6vpQnwHRSw7jXUwjMEytmhFwnynZSENhvpAxL1y", + "tunnel_endpoint": "64.124.32.192" + }, + "DoRqcdvS3zuunqBG8CcCuu9zBKyFHc2W3iGJKiefFE3c": { + "account_type": "User", + "owner": "SaGAgdkowooXBrHihpmE8gsjf1dUG7n5SqnyJxYFnXJ", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "cyoa_type": "GREOverDIA", + "client_ip": "45.250.254.141", + "dz_ip": "148.51.120.138", + "tunnel_id": 500, + "tunnel_net": "169.254.4.60/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "SaGAgdkowooXBrHihpmE8gsjf1dUG7n5SqnyJxYFnXJ", + "tunnel_endpoint": "38.88.214.133" + }, + "F6CYCm5w5S7uK6LigXp8jybTJUNFUsD61zo9mLRiNoqY": { + "account_type": "User", + "owner": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.83.9", + "dz_ip": "64.34.83.9", + "tunnel_id": 534, + "tunnel_net": "169.254.9.74/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "14JqZ9gCYVHrHp1TLRwFm1nYbNjR8bW5H3TY8gzZjkyR", + "tunnel_endpoint": "198.13.133.48" + }, + "9j8sawHHcQXDaFgWuP97rWCeiiiqefvRh8AUxgEFRw3": { + "account_type": "User", + "owner": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.94.5", + "dz_ip": "64.34.94.5", + "tunnel_id": 528, + "tunnel_net": "169.254.8.112/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "tunnel_endpoint": "198.13.133.56" + }, + "GurwVJg3rFXyiVM7Jnov36sAr5qmoerr74HRzJc3gYUx": { + "account_type": "User", + "owner": "HLXKZPQ1XNccxWVJw3ydwtQrGwTAaxxSGKzd6oqJth9Z", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "205.209.125.138", + "dz_ip": "205.209.125.138", + "tunnel_id": 512, + "tunnel_net": "169.254.4.94/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BHin3N7CRHFFPX8X96PrScPgZNc6JCBgD4fYzfGz9VqV", + "tunnel_endpoint": "38.122.35.137" + }, + "3169dTsw89PQacuXHEvyrWYm2r5jECk3QZBLKT7opGZX": { + "account_type": "User", + "owner": "B9Fuytvr8tKqH1KNF7Jk4Yk6Pvg1ciVrtmjusYbwuVv9", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "57.129.36.165", + "dz_ip": "148.51.122.48", + "tunnel_id": 503, + "tunnel_net": "169.254.11.214/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "A9mvukTd77EbRoBX4ydSCFQHdu5bsRFkNXTTRstA8FAC", + "tunnel_endpoint": "193.28.105.130" + }, + "GQkciNaYFzSv4CwbBzYLCBMcJsqFxeGS7KUqbDnjRJQw": { + "account_type": "User", + "owner": "8uymczRPuSMNB2perH3aHq2aAdb9wLjK8hDRkAiuiTyw", + "index": 31178, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "86.54.153.250", + "dz_ip": "86.54.153.250", + "tunnel_id": 532, + "tunnel_net": "169.254.6.14/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DpnqGPi6AGDuza9UZszmzv4akfhsE5g8hLcVbEqiAZL8", + "tunnel_endpoint": "0.0.0.0" + }, + "GcjdwD9sBUWfuJ7FseWA5FGgA4WrQZtncvMgN8tBfCyf": { + "account_type": "User", + "owner": "qmEXyFqyDkuxY3dPdbvFmsidcSs2tDyTFdvkHUVtLac", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.153", + "dz_ip": "208.91.110.153", + "tunnel_id": 525, + "tunnel_net": "169.254.1.144/31", + "status": "Activated", + "publishers": "", + "subscribers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.42.212.122" + }, + "H3K5gaGThQMzLtytMvvhdDbCfZWEbjQRJmTTijmnywMM": { + "account_type": "User", + "owner": "Da6xRJqXLazx2g66nnMK5afW25zDughnejvu7cr1a461", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "69.162.93.121", + "dz_ip": "69.162.93.121", + "tunnel_id": 509, + "tunnel_net": "169.254.4.50/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FzQqaDStQQHs52YKeCnDovwSqvyZBCgs2kJcmvoFZwaS", + "tunnel_endpoint": "0.0.0.0" + }, + "EsWjhQLuQm75FM9naNrjKa7dGJxRZcmf8R3oBhCjk1cF": { + "account_type": "User", + "owner": "4NKEM1s5WCtPcqER4mXfGiStC7PAJLMWnh832tTB4FkG", + "index": 0, + "bump_seed": 250, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.200", + "dz_ip": "148.51.120.236", + "tunnel_id": 528, + "tunnel_net": "169.254.8.162/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "vALigXFg9wnnhVHN16vNxHxXtAXiBv5QjAE6udoniBY", + "tunnel_endpoint": "4.8.126.96" + }, + "8XFfa3XMEeWf4QfzfzETRCrCbMyobmWYnJdSiWT9xqAf": { + "account_type": "User", + "owner": "3dDr9jeiPnMd5BL3GwAzCRuvU9kSsNoDo8uCqhtSkkNr", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.102.114", + "dz_ip": "107.155.102.114", + "tunnel_id": 510, + "tunnel_net": "169.254.2.142/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "209.146.32.160" + }, + "JBgktryjNxRgjYY8PwLmd1J1SL3gbnQsb45azZ2dK6eB": { + "account_type": "User", + "owner": "DURt7rLam3Dhm98nzV9gdbvc5BucoAQYE5HgCgGyYEbi", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.38", + "dz_ip": "148.51.121.176", + "tunnel_id": 548, + "tunnel_net": "169.254.10.44/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "DURt7rLam3Dhm98nzV9gdbvc5BucoAQYE5HgCgGyYEbi", + "tunnel_endpoint": "198.13.140.16" + }, + "6PBv4kBJQfRbnPVaAVnucw9xyTTjua4BkN8yi45w5xYM": { + "account_type": "User", + "owner": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.71", + "dz_ip": "72.46.87.71", + "tunnel_id": 507, + "tunnel_net": "169.254.10.246/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk", + "tunnel_endpoint": "67.209.55.48" + }, + "mmWoi6AAbdQkz7gQ8jY79kbDn2oSZKDDZEQHphpmCCT": { + "account_type": "User", + "owner": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.39.79", + "dz_ip": "148.51.120.137", + "tunnel_id": 516, + "tunnel_net": "169.254.7.156/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9", + "tunnel_endpoint": "198.13.133.56" + }, + "CTnkTb5AdMykhcRH5kbU8Ky1pKNDeawCBGKb5cHYXUH6": { + "account_type": "User", + "owner": "563VDfbQaPuGGGpFYJdXq8TycB7egBiS2CGDdbYCRe52", + "index": 25030, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.164.126", + "dz_ip": "5.199.164.126", + "tunnel_id": 519, + "tunnel_net": "169.254.5.180/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU", + "tunnel_endpoint": "0.0.0.0" + }, + "49TBvhyQQ1XTMKegg1kHa5ttMKhEpqMhWDQqkvtD3KzB": { + "account_type": "User", + "owner": "BWDeCAesUjq5vpCgBoQR2vuDz8fELCESitRhMnUSi92H", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.49.37", + "dz_ip": "64.130.49.37", + "tunnel_id": 557, + "tunnel_net": "169.254.9.12/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "BSJAGJGefhXtEWmvBq96jgzqy1Wi5oEA5Cmowa1L8tsf": { + "account_type": "User", + "owner": "6FW7Uf2CVV2n3RGZfMgyapzKHLN2w24Axk9xDd22zHtp", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.130.138", + "dz_ip": "198.13.130.138", + "tunnel_id": 529, + "tunnel_net": "169.254.7.94/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2wHmVggLzGi8XHiG21RJS1ni6EBuWgTFUnFEiWA93nta": { + "account_type": "User", + "owner": "oWPCJQUE4QP4ii1oCSLmryBaVy4sNyN1NVj16TZtyDe", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "139.180.221.63", + "dz_ip": "139.180.221.63", + "tunnel_id": 521, + "tunnel_net": "169.254.11.30/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "bookoVmqw4QjVj5BbkFacouadx9M7816wyRkfM7A5Lo", + "tunnel_endpoint": "154.18.17.55" + }, + "6hVS8MwuGmLMpdJ1SfegSiV8N913EC1kFbsmHjTiTtRE": { + "account_type": "User", + "owner": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.164", + "dz_ip": "64.130.37.164", + "tunnel_id": 523, + "tunnel_net": "169.254.3.238/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "45KewPQts5ETLLxRyX1hBM1ns1L9JiWiYZZusuURxUMR", + "tunnel_endpoint": "4.8.126.96" + }, + "8WoPkYVAftcjmeR4mNPnXAAjzKVdNsUqS4hGHWC9W4x": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.32.133", + "dz_ip": "148.51.120.1", + "tunnel_id": 524, + "tunnel_net": "169.254.0.18/31", + "status": "Activated", + "publishers": "4UjgqgwyAmq1m7BRaWpfjcpKHPueRN4nunNQU97UoCDv", + "subscribers": "4UjgqgwyAmq1m7BRaWpfjcpKHPueRN4nunNQU97UoCDv, 31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj, 3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX, GbgDsQDhjxdRAzRWgj8KKMqFLiuEPvmQK6H7mSP3uRtZ", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.24" + }, + "HkRVSeWHgkaFGBcEQBQQgbfbBCH7UFZMUWsGLAWe2cLq": { + "account_type": "User", + "owner": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "45.76.11.7", + "dz_ip": "45.76.11.7", + "tunnel_id": 508, + "tunnel_net": "169.254.2.218/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9", + "tunnel_endpoint": "137.239.213.192" + }, + "H6pFugYZ593pW7kWvDZUvvp84ECpTDatqTmD8c3QHgiF": { + "account_type": "User", + "owner": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "202.182.125.207", + "dz_ip": "202.182.125.207", + "tunnel_id": 500, + "tunnel_net": "169.254.4.252/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5z7arq5GmM11pWz5TSxVVDfBugkWtaNRqgbJGGBWNQ6G", + "tunnel_endpoint": "154.18.64.128" + }, + "Dxxh1yCaiKzwx6Tq8LJemW6f1QJjx7aUdoZDjSdG25fb": { + "account_type": "User", + "owner": "BrkfMFtaQpZzfcat8vq7UAmW5CUZMohH6U61hYmB15qb", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "45.250.255.197", + "dz_ip": "148.51.120.117", + "tunnel_id": 519, + "tunnel_net": "169.254.7.194/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "5zm9g3zgAPWzX3wmUB2JtTkcwCqe74NWsTmt5wLFwCKK", + "tunnel_endpoint": "154.18.64.128" + }, + "4aQ7csfBXX6eZ6ddaoSufYt9cciz7wS18aXKdJ9tfdR7": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.15", + "dz_ip": "177.54.154.15", + "tunnel_id": 528, + "tunnel_net": "169.254.3.162/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj, 8J2yRE3q7EuosbnVn5w9uyVWVySKucDHsWht4hAb4CTJ", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "67.209.55.48" + }, + "GWQCoYkdzX4Ug2Vmbi84RhTzp6Bw66L9MhCAcFiAtouf": { + "account_type": "User", + "owner": "EEaFqAtZatV82VNVQVBBvPizxNmNxbvsvxUuvJMcDnA1", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.54.174", + "dz_ip": "64.130.54.174", + "tunnel_id": 501, + "tunnel_net": "169.254.6.116/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "AicQr2zCWBLiBwt2r6o7iTemmtyE7q5pTKyuuupbXEQA", + "tunnel_endpoint": "0.0.0.0" + }, + "BLCq1x6YzD1kX66kmcDov3i2q7bLyy2z7mqCuqAw7Rfc": { + "account_type": "User", + "owner": "7hgdavoCEqBjUngYdZRQdJxbGPM1Hcve4V6Ddd2QVwB5", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.138.249", + "dz_ip": "198.13.138.249", + "tunnel_id": 504, + "tunnel_net": "169.254.4.128/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "78DMusu5uTGF36fGyBkGZgpckseKTQF1A2qc1ygFrgUX": { + "account_type": "User", + "owner": "dztHar6nnqhhF3ZuAP5UsQdTLKTZqff5QoasM5jE16U", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.162.25", + "dz_ip": "148.51.120.10", + "tunnel_id": 505, + "tunnel_net": "169.254.2.74/31", + "status": "Activated", + "publishers": "7yxxsxH1vDs5ZzzxAcALkaE2nxe7Gm9z3Njo192mxjym", + "subscribers": "7yxxsxH1vDs5ZzzxAcALkaE2nxe7Gm9z3Njo192mxjym", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.56" + }, + "6ubaoAZAZ9X5Y6mT154Mxc1i971HReyqJgkmwySjX5bi": { + "account_type": "User", + "owner": "HqjQYyz6eK7wrpGnVuoCNxAzu41J3GmcAj3X6G5gJAPm", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.183", + "dz_ip": "148.51.121.170", + "tunnel_id": 501, + "tunnel_net": "169.254.3.48/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "orbit1bWKxnECKLqjhm5rybTiEC2GEYbecyebgEfM5q", + "tunnel_endpoint": "79.127.159.32" + }, + "HRkb9uVNd1AUWTSKTdYFKsQP9mpE67Yja4HP659Mkdr2": { + "account_type": "User", + "owner": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.57", + "dz_ip": "148.51.121.80", + "tunnel_id": 545, + "tunnel_net": "169.254.2.66/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "tunnel_endpoint": "154.18.17.55" + }, + "9ou3Z1YNRuScpVbQWpgWjsBDs8PwtSUjFVdie3ju7tdJ": { + "account_type": "User", + "owner": "HqjQYyz6eK7wrpGnVuoCNxAzu41J3GmcAj3X6G5gJAPm", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.183", + "dz_ip": "2.57.215.183", + "tunnel_id": 548, + "tunnel_net": "169.254.7.164/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "orbit1bWKxnECKLqjhm5rybTiEC2GEYbecyebgEfM5q", + "tunnel_endpoint": "198.13.133.48" + }, + "BoPncwXXvZeAf9zkhruDzsFok73Yd8CvJkqVqdAuwk6R": { + "account_type": "User", + "owner": "FkhiptLee5P7MutXadcYV2fPRS3Fr3oyoKNwh1wxtexy", + "index": 27996, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "207.90.227.251", + "dz_ip": "207.90.227.251", + "tunnel_id": 506, + "tunnel_net": "169.254.5.246/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7hbRv5e4ybya4ZTsRbo4FhZtf9b6Ndq7PGNGvQqMTbWP": { + "account_type": "User", + "owner": "oWPCJQUE4QP4ii1oCSLmryBaVy4sNyN1NVj16TZtyDe", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "139.180.221.63", + "dz_ip": "148.51.121.226", + "tunnel_id": 527, + "tunnel_net": "169.254.6.246/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "bookoVmqw4QjVj5BbkFacouadx9M7816wyRkfM7A5Lo", + "tunnel_endpoint": "79.127.170.81" + }, + "7yZyCse7NexCznjrJK7BjsYjRsqVAgRzkSawvzbsAvnV": { + "account_type": "User", + "owner": "SBDZzBVbJnDYsbPBe9yAqFcu39mdzkm8UpKK9We38qh", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.9", + "dz_ip": "148.51.121.157", + "tunnel_id": 528, + "tunnel_net": "169.254.7.234/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "sbidYi7fbif6qNsMpwBKvyF5DKcLCbjaegpADsKqNux", + "tunnel_endpoint": "184.104.213.176" + }, + "4PVLZHV49hFkZpp7gRceRsfZJ1N6wSqAv8xVgaJ49Epb": { + "account_type": "User", + "owner": "EptAhyDYcy6xDnqFTpb4zFxhTxNXrXkMXwyk8qTPYNqH", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.45", + "dz_ip": "148.51.122.40", + "tunnel_id": 551, + "tunnel_net": "169.254.5.210/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5", + "tunnel_endpoint": "154.18.17.55" + }, + "Cs7CeYg7syJdYH8MmB71fidDPHX55PErTfWdi54jqF8k": { + "account_type": "User", + "owner": "Hf3HUBVD3yiYwJ9h99NRanRhWbiTqp8yDghfQcQk4Wza", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.182", + "dz_ip": "2.57.215.182", + "tunnel_id": 554, + "tunnel_net": "169.254.9.22/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6Ut1wC8PhVGtMiJYHicbc3LPqSdg1tKKxyLbFXuFvRva", + "tunnel_endpoint": "198.13.133.48" + }, + "GhgHGrCa7h6wML8MaDwkyczsgbzwGgr41JwGUnzW3XoC": { + "account_type": "User", + "owner": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.219.166", + "dz_ip": "45.77.219.166", + "tunnel_id": 524, + "tunnel_net": "169.254.8.106/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "J1XP9dzPzwqQGEBNwMHrE6EaG1aTpjEnS4WAtimDs1Zh", + "tunnel_endpoint": "209.249.183.218" + }, + "82hUbw9jgVzN9v2kem5e3X3SaCXRgjE1YGwfYTnQX5oR": { + "account_type": "User", + "owner": "td2GGWDsCJ6LvjN89oLJvmrDwE14neNrbqQ9s3tVkPy", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.170", + "dz_ip": "64.130.41.170", + "tunnel_id": 510, + "tunnel_net": "169.254.2.16/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.24" + }, + "8bK3MPJN2AS1xUQKSQu7htRtiXs1JEbXGoZBYeJDfE5p": { + "account_type": "User", + "owner": "C9dTbbWEdNeVZjqbnzZKB4DxfuLqWNVnr9mdZfCqBHKQ", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.83.203", + "dz_ip": "148.51.120.121", + "tunnel_id": 521, + "tunnel_net": "169.254.4.140/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "6D1xzrtskRrBrWEF8pHSaZ2w8H5GUoximyrBFs3n4f3Y", + "tunnel_endpoint": "154.18.64.128" + }, + "DyMuV1jUMfKLgz2qWJtbDCbogyET48v3c2WgJsxWiM5g": { + "account_type": "User", + "owner": "Fy7BRtoUrNpGfbegKvsnhst2DTqULvSjtt5X7vM5ogjc", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "cyoa_type": "GREOverDIA", + "client_ip": "144.202.29.140", + "dz_ip": "148.51.121.187", + "tunnel_id": 504, + "tunnel_net": "169.254.6.20/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "D8kuk3qEiVBGwYkuMGKfBDwuRi6jjRkzjAZg45fdaRLx", + "tunnel_endpoint": "66.198.11.74" + }, + "7jmPXpxUgcPX3LkX5gwXrzUotcPot1uXRddgmoGobS9o": { + "account_type": "User", + "owner": "ARx33747AK12mbKQ8rnpFkC9xKnizNVNjL8x57Ki4jYc", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.50", + "dz_ip": "148.51.121.158", + "tunnel_id": 534, + "tunnel_net": "169.254.10.148/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "HE2M3NMPrtD1U9sfQ1K4QQJtEwcyonNLNRZGmpRW8nXm", + "tunnel_endpoint": "154.18.64.128" + }, + "4W42U9PBAccE7HrckXBYBwggMwvz9gZmkYiqDvnjTXEd": { + "account_type": "User", + "owner": "BNyEsi7Lac8FbeTPgqxiQaXGcvunDgmTHp9WotyTYSxs", + "index": 56720, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "207.148.74.12", + "dz_ip": "207.148.74.12", + "tunnel_id": 500, + "tunnel_net": "169.254.6.240/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DTzHoPKRsAA1gBY3jfUh5ciGASiEUr7FtC6Tu4Lz3P9a": { + "account_type": "User", + "owner": "2ziQRMDYEPGoiTvxKJVbC3mfGofNQxHk4Q4SMYs9vzcD", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.94.243", + "dz_ip": "64.34.94.243", + "tunnel_id": 508, + "tunnel_net": "169.254.4.74/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ", + "tunnel_endpoint": "198.13.133.56" + }, + "EWBvGiUitzNqhnyjyTXRtm5kDpaEennm6kXrMVPPn5Se": { + "account_type": "User", + "owner": "S53xTGCd4wCYRYUo3h2HGPRCbuRxY4wPBZhU1hdtPfg", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.133.90", + "dz_ip": "198.13.133.90", + "tunnel_id": 543, + "tunnel_net": "169.254.7.124/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "H9MZT9Skx6abKV3MZn5QmFvUafWVkJgotEUHQgDd8JA6": { + "account_type": "User", + "owner": "ErEdVCQ5y7yTD67w7qDycHF55iVbkcx3MMKU3ewbJ1Gg", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.136.182", + "dz_ip": "198.13.136.182", + "tunnel_id": 528, + "tunnel_net": "169.254.8.44/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "209.249.183.218" + }, + "CT8AxEoetbSGFgScE3a1NJPkBhGM379MVezi5kmfKh2o": { + "account_type": "User", + "owner": "Haee2jdKVDdv1fDNdPjXqJSyuK71VBxuzA4UfnuMCtJ3", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.138.199", + "dz_ip": "198.13.138.199", + "tunnel_id": 514, + "tunnel_net": "169.254.4.248/31", + "status": "Activated", + "publishers": "", + "subscribers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6Tb9wjWY5oGe8m71hHwFE3REUUpeKPVPGkbY1osZBkrp": { + "account_type": "User", + "owner": "ssZbdqVceyPhupmozC8pAEWNC9T984bNBeGRr18DnDz", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.172.174", + "dz_ip": "151.123.172.174", + "tunnel_id": 500, + "tunnel_net": "169.254.4.44/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SscQkTYV2BFQYGGffAmTzvefrFrw6z9GNYiWHstVZ77", + "tunnel_endpoint": "66.198.11.74" + }, + "6gpN29CLWvMspDfJ9e9VTboNTRPMeh25ncK8DLgb38ku": { + "account_type": "User", + "owner": "A4XSeSJb1MEgqF4k3pFzL5cKg5FRehW8cgzZs95ey3dY", + "index": 1357, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "66.165.246.46", + "dz_ip": "66.165.246.46", + "tunnel_id": 501, + "tunnel_net": "169.254.0.210/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BoNKmNCGvoHS4CkKvYRnF21iEpUP827pZjhFGdA4t5as", + "tunnel_endpoint": "0.0.0.0" + }, + "GRriA64SVkMMei1bfeipFgNb2aggc1uhEegr7fqWWNot": { + "account_type": "User", + "owner": "8uB2AtLYxsC3HsVGc7h869MxFg8SRzj1oJ1zrdoULtnb", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.123.223", + "dz_ip": "148.51.120.155", + "tunnel_id": 526, + "tunnel_net": "169.254.8.188/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "CBDXrujwebjw2icFkSAwut4hr4xeFh5Ckdz6UAL9HzWj", + "tunnel_endpoint": "198.13.133.56" + }, + "5d676ZaPLHApR5eHFgHBZS2xFVSHwV94u9KidRmZUmes": { + "account_type": "User", + "owner": "GHUFsW8uJoHeD6BPvFZYYPD8WbTawRyxYeCpqjcaU5wi", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.28.184", + "dz_ip": "148.51.121.52", + "tunnel_id": 533, + "tunnel_net": "169.254.5.166/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj, 8J2yRE3q7EuosbnVn5w9uyVWVySKucDHsWht4hAb4CTJ", + "subscribers": "", + "validator_pubkey": "CMPSSdrTnRQBiBGTyFpdCc3VMNuLWYWaSkE8Zh5z6gbd", + "tunnel_endpoint": "198.13.133.56" + }, + "EadCcdd6eWaeukwGeP4K2m8BVQXJj2rBWk7nrq5uTWby": { + "account_type": "User", + "owner": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.235", + "dz_ip": "177.54.154.235", + "tunnel_id": 517, + "tunnel_net": "169.254.6.218/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "tunnel_endpoint": "184.104.221.146" + }, + "4sxXZvMw1wz75e9MYHGctzDKezL4FGofMyHfnbUhyEd7": { + "account_type": "User", + "owner": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.130.125", + "dz_ip": "198.13.130.125", + "tunnel_id": 533, + "tunnel_net": "169.254.9.172/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT", + "tunnel_endpoint": "209.146.32.160" + }, + "7BoX49224eQie17KY1FG6pQkwcf1Hci7AtiExebK2UqC": { + "account_type": "User", + "owner": "CYuUvZkUYdAZqzgjvk13Y6Z14hgnaD2ysiun4trmRjFu", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "103.244.113.94", + "dz_ip": "103.244.113.94", + "tunnel_id": 519, + "tunnel_net": "169.254.8.192/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "RAuSNo4DRjo83uGhdgg4fPqYBVszi1KsrQGpqcPHK1D", + "tunnel_endpoint": "67.209.55.56" + }, + "Fs5DX1B6gthKkw7XrDdTMsQD1m7cbi7VhkRoyMUxN1hd": { + "account_type": "User", + "owner": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.60.122", + "dz_ip": "198.13.60.122", + "tunnel_id": 509, + "tunnel_net": "169.254.8.62/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BNtHBLo1L2vAG7PBQ6mJvWz7GqVPxBnioXsY2Gjtubrg", + "tunnel_endpoint": "213.248.92.111" + }, + "AmXQNi9sTtSz42m1kKxZYJL1pYVxT1QMUhX9RaTuUN75": { + "account_type": "User", + "owner": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "189.1.171.85", + "dz_ip": "189.1.171.85", + "tunnel_id": 552, + "tunnel_net": "169.254.5.102/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4iWFZJ4NCrkHdaU1zzsbnKdKubce685LecSJJ4cHH9yG", + "tunnel_endpoint": "198.13.140.16" + }, + "C3oYUp3cit8yAJ6Xg8ttMpypQie9C2jPD4mNxWN7Bfvv": { + "account_type": "User", + "owner": "DagrM9XVaGpQGnsJzJ9pTLPvi5dWPDxmircQEkQ9biUF", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "66.42.59.185", + "dz_ip": "66.42.59.185", + "tunnel_id": 537, + "tunnel_net": "169.254.9.226/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "KAoSp3EudGqUBXv46tQoDwbZxSm3iXa9wM2aF4ySbJJ", + "tunnel_endpoint": "209.146.32.160" + }, + "HswrDLrdqm1DG7Tv991xw6koh4PdmvRA9Kn2dc45mXsJ": { + "account_type": "User", + "owner": "9BWFAyyHfKUTw5yjg1sfUaVTqaBrev6VjtCxBqFUPFdY", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.57.44", + "dz_ip": "64.130.57.44", + "tunnel_id": 551, + "tunnel_net": "169.254.5.138/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "caSFeQYTQhPvDiMPoYAoVg1r1cmD7ijZLPdgRUYttak", + "tunnel_endpoint": "198.13.140.24" + }, + "76KufGh5L77BArrioqaejebJByLAzvQRAnKDfVupXcmw": { + "account_type": "User", + "owner": "HXxMuyjuXoeNy3fLb71oMvFQix9FxiZH1d6JQTk7v811", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "57.128.72.164", + "dz_ip": "57.128.72.164", + "tunnel_id": 520, + "tunnel_net": "169.254.3.190/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4XspXDcJy3DWZsVdaXrt8pE1xhcLpXDKkhj9XyjmWWNy", + "tunnel_endpoint": "193.28.105.144" + }, + "FunQMrVHSE6X89ThpauRK2w3psLJP7JgTj2VPiveYRSc": { + "account_type": "User", + "owner": "9R5wgT2h3ECoDfopUnyZtkpLHgBvwtg9ZxjwCookRj8M", + "index": 1092, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "cyoa_type": "GREOverDIA", + "client_ip": "137.220.32.24", + "dz_ip": "137.220.32.24", + "tunnel_id": 500, + "tunnel_net": "169.254.0.78/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EAW9vxqogvdPNapq7QTDpiVTHK6o7begUhPVnf854VTc", + "tunnel_endpoint": "0.0.0.0" + }, + "2gjPMx82QAYeDUm5pHKYtX3aom9JhfwLJyA4fFTZdfCW": { + "account_type": "User", + "owner": "A48xFiZzS2VyPWRLHjw65K2SdBdz4MMcPqaBdiPLmr77", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "cyoa_type": "GREOverDIA", + "client_ip": "66.42.68.193", + "dz_ip": "66.42.68.193", + "tunnel_id": 500, + "tunnel_net": "169.254.5.234/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DEV9B8dDSV6it7AF2h5rzpuFyFM15DRSSUMP8MGQmrR2", + "tunnel_endpoint": "63.243.225.224" + }, + "7Wr4nF1CChJ4M8mqFU26TqTQMpdVt8oWXfTaLTuw4cBa": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.57.133", + "dz_ip": "64.130.57.133", + "tunnel_id": 506, + "tunnel_net": "169.254.2.204/31", + "status": "Activated", + "publishers": "", + "subscribers": "GbgDsQDhjxdRAzRWgj8KKMqFLiuEPvmQK6H7mSP3uRtZ", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "9hJ38gNEcztgaVjV5UTh1NmifdMpS2ppGrpVMAqwAP5N": { + "account_type": "User", + "owner": "2jmJxNH4577eyo2EBrbV7hHTkjmKUuaQRXzK2GQkwUG5", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.50.155", + "dz_ip": "148.51.121.130", + "tunnel_id": 540, + "tunnel_net": "169.254.10.108/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "7qZbLuLp7Wa5sjogZvxVpQTHJjxPubfg2Ywj8ZLAb1yb", + "tunnel_endpoint": "198.13.140.24" + }, + "7JWTWLeXLeKX2zpm7h6dGn5gHKQECdoNyWWuWY1VhYs4": { + "account_type": "User", + "owner": "5LK4dd3zSdtaKX4Fw54EkPLMU9Pwhv85Xx4xnfhY5ifp", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.130.141", + "dz_ip": "198.13.130.141", + "tunnel_id": 508, + "tunnel_net": "169.254.10.12/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "67.209.55.56" + }, + "RGfZMjPU8mGX5bfEiTRa7oB3R1AtUGWQ1S137XVLiqz": { + "account_type": "User", + "owner": "ENBBdAkfEj5FgWwuyxaWAprHaSAUuTainYRCZbMET8se", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.43.180", + "dz_ip": "148.51.121.97", + "tunnel_id": 519, + "tunnel_net": "169.254.10.62/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "SWiz7QwnYPm61pWWUUkMhj4r5pZLP1SvYibdHcB2cov", + "tunnel_endpoint": "198.13.140.24" + }, + "H1vDemCm67Zs5fmYid3FSocZjz1PD4WVB5pgHoqagy2g": { + "account_type": "User", + "owner": "GHxoCXtgHSjFVan4L7sVqBXwScd9sC17uke73WJ2b7w2", + "index": 0, + "bump_seed": 249, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.237", + "dz_ip": "151.123.174.237", + "tunnel_id": 529, + "tunnel_net": "169.254.10.54/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8aPHvzVV91jZF948tykkoF6WfgLHppNfG8Z3V4gCrDix", + "tunnel_endpoint": "154.18.64.128" + }, + "Gk2tqW4GvcS4EpSycy6s5EMkQBBYEuvj7pBQ9jAq3G1n": { + "account_type": "User", + "owner": "5DEH4VUw2HxP8MEpTpXhyHYM2zga7hAgjH8GxxeWf1KL", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.43", + "dz_ip": "72.46.87.43", + "tunnel_id": 552, + "tunnel_net": "169.254.11.230/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "AmjX7CerZbHrU814UeBp2gJC7gANNG3KrP4c3RyD7TSD", + "tunnel_endpoint": "209.146.32.160" + }, + "6e8qMiMRJq3CcJqiS8F8rQCPnb8aw1g3uwJ4xTWCkYxQ": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 26482, + "bump_seed": 255, + "user_type": "IBRLWithAllocatedIP", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "170.64.239.28", + "dz_ip": "152.233.14.226", + "tunnel_id": 523, + "tunnel_net": "169.254.5.228/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Byok1TCbXKMQBESYgtJNT2CCaUYmkiEA3GdbvgZ6ArRL": { + "account_type": "User", + "owner": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.49", + "dz_ip": "67.213.122.49", + "tunnel_id": 548, + "tunnel_net": "169.254.0.50/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "tunnel_endpoint": "154.18.17.55" + }, + "EcRjt5uPwooGxqQUhUGFkyrUVEXBBXWaguzqFnBy7bJ2": { + "account_type": "User", + "owner": "CCohvGjRYik8Kp9JSm5qVLk5MDPpoEJJo1ERWvaerxCF", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.40.170", + "dz_ip": "148.51.121.215", + "tunnel_id": 555, + "tunnel_net": "169.254.11.98/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "privaEdSEmnMPGPoQACUkcDGkFBbTArVvsEGd7C5wUM", + "tunnel_endpoint": "198.13.140.24" + }, + "BGgLs3P5PmE3QT2LqDDhxie3GhrDX8MQh462To1wcf5m": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.138.107", + "dz_ip": "198.13.138.107", + "tunnel_id": 501, + "tunnel_net": "169.254.4.36/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "FS48JACpxEwE2pafaV7GyAfjULza2vX3NGVftTEoHveu": { + "account_type": "User", + "owner": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "45.76.159.29", + "dz_ip": "45.76.159.29", + "tunnel_id": 505, + "tunnel_net": "169.254.7.224/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "tunnel_endpoint": "209.146.32.160" + }, + "7z7VBdZnZjEWa8RJBTyghUNofE5TSdjcjsw35mbEtxkD": { + "account_type": "User", + "owner": "2jmJxNH4577eyo2EBrbV7hHTkjmKUuaQRXzK2GQkwUG5", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.50.155", + "dz_ip": "64.130.50.155", + "tunnel_id": 536, + "tunnel_net": "169.254.10.72/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7qZbLuLp7Wa5sjogZvxVpQTHJjxPubfg2Ywj8ZLAb1yb", + "tunnel_endpoint": "198.13.140.16" + }, + "E6bNFp6mE688u8YYRswjaqEWGRwUrXG3GDHCZYTXB1yg": { + "account_type": "User", + "owner": "9NR8T2KaNPKSMaG1hQc7vqrgmkr7VBjqudDDUkTM5bQM", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "cyoa_type": "GREOverDIA", + "client_ip": "65.49.109.98", + "dz_ip": "148.51.121.255", + "tunnel_id": 503, + "tunnel_net": "169.254.6.46/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "HJHDGgsLBBGStNbu3zRMSTuNuUotzWoLeCSXHPzQmamo", + "tunnel_endpoint": "79.127.159.32" + }, + "54gN325TrSYQZgFsmuACPyJdvmpE4qmUMjyQBasGN9em": { + "account_type": "User", + "owner": "DDB4XQGCCMdPQygsq6kPDz7VdTEWe1APfarNuGS9c8e5", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.109.57", + "dz_ip": "208.91.109.57", + "tunnel_id": 506, + "tunnel_net": "169.254.2.186/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "HEL1USMZKAL2odpNBj2oCjffnFGaYwmbGmyewGv1e2TU", + "tunnel_endpoint": "154.18.64.128" + }, + "8U6hW8YNBgVeUWj3Y3atMmnFyRsmBcbfV5ULCHtdwK1a": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.36.35", + "dz_ip": "64.130.36.35", + "tunnel_id": 544, + "tunnel_net": "169.254.11.212/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "9CCtvfcaUWzBK9bcr6zEb51JSuhyGZ9NcRoovYp28A8p": { + "account_type": "User", + "owner": "5ZENonyCMkJ1yWxvLCHrFfgNXNuLXWFvr7mSvcSek7u7", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "cyoa_type": "GREOverDIA", + "client_ip": "54.91.101.32", + "dz_ip": "54.91.101.32", + "tunnel_id": 501, + "tunnel_net": "169.254.3.62/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "66.198.11.74" + }, + "FCBNCQpknKaAWyNP2gKhbm6p3xRAXbsNXj471RkZxLaT": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.162.28", + "dz_ip": "63.254.162.28", + "tunnel_id": 581, + "tunnel_net": "169.254.11.208/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "7VAcAN4nXk5SnsEvtVuqCiFCuisAtcacDJFj6ExMw67z": { + "account_type": "User", + "owner": "dzt1pRvPJdPwNfLDWaj4UUHw1UW3B1c1JdUq35Jvamq", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.131.97", + "dz_ip": "198.13.131.97", + "tunnel_id": 500, + "tunnel_net": "169.254.1.124/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "67.209.55.48" + }, + "5FDEfCpDnWU3MZBGxrYfiUgvyYjz5dkD2GdekG8LvMTG": { + "account_type": "User", + "owner": "E5SLYWttYhTo393ag7rt1RhbxyTDvwB6dvQA2irDhyro", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "88.216.36.3", + "dz_ip": "148.51.121.238", + "tunnel_id": 560, + "tunnel_net": "169.254.9.120/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "9q16BB7WGmBxf1nJTdxH5zPnBUhtHqdqXqRFjSjuM4k7", + "tunnel_endpoint": "198.13.140.16" + }, + "2VtaeYZwy1rCZu8kE5fYJMcV6m2WtqcprkQbYK8KdJcA": { + "account_type": "User", + "owner": "J2ibtVSFZd11ccVf6CYS7w1MeNiCjQjosDAofhZbaZ6T", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.165.43", + "dz_ip": "5.199.165.43", + "tunnel_id": 512, + "tunnel_net": "169.254.9.196/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y", + "tunnel_endpoint": "184.104.221.146" + }, + "2agswZbBozajNyhUrippgLFRwtmjxwtFpYnrhmAbFfZY": { + "account_type": "User", + "owner": "LTPZgWy6e4q88qhKEfdMeaz1vmetH5eSfREHgbVQ3xm", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.207", + "dz_ip": "148.51.122.17", + "tunnel_id": 537, + "tunnel_net": "169.254.11.100/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "5eQSRzTyF4h6a3aDmSxb3kXootVNsxXXLpniNVstydtJ", + "tunnel_endpoint": "4.8.126.96" + }, + "9rTu21C25pgf3SngpuDM3XbR93xgYED9NssZA133FH27": { + "account_type": "User", + "owner": "FugJZepeGfh1Ruunhep19JC4F3Hr2FL3oKUMezoK8ajp", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.41", + "dz_ip": "148.51.121.174", + "tunnel_id": 503, + "tunnel_net": "169.254.4.62/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "FugJZepeGfh1Ruunhep19JC4F3Hr2FL3oKUMezoK8ajp", + "tunnel_endpoint": "209.249.183.218" + }, + "JDaodMztjb6W22mTpGteSqefUfyn61684XwgNFLbrsy5": { + "account_type": "User", + "owner": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.109.54", + "dz_ip": "208.91.109.54", + "tunnel_id": 501, + "tunnel_net": "169.254.2.22/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "59SLupaJ4ecK9hyeMsvC7ng2fgvdU1M6PaU9skwyF8iQ": { + "account_type": "User", + "owner": "2hSiAzofh9P9GA9EmuysCHKqGMYMpp8iASssVaWYW7gw", + "index": 56314, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "51.89.11.213", + "dz_ip": "51.89.11.213", + "tunnel_id": 509, + "tunnel_net": "169.254.6.6/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7mF8NZJdREuM1uwYcvKffuY9QJBEoHhNp4hZ4NS2fuXW", + "tunnel_endpoint": "0.0.0.0" + }, + "6BrHKX85BavxvR8pnJCPoyDqKhfsRAidFBmBWf33TRUk": { + "account_type": "User", + "owner": "DZphw7yYtc5dQvcCyjWFUiT5WfyrDozGy7DUptB6d1a1", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.102", + "dz_ip": "148.51.121.109", + "tunnel_id": 553, + "tunnel_net": "169.254.10.94/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "7RRFDM57y7JphnVyVYHFP5ys3FwL7AWQSsrGAM7KrT5x", + "tunnel_endpoint": "198.13.133.56" + }, + "9EviosgzW8kkmNxCv5ebn9sViYz5jfXvsfh23hWjoMJK": { + "account_type": "User", + "owner": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.112.35", + "dz_ip": "148.51.120.102", + "tunnel_id": 543, + "tunnel_net": "169.254.11.126/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "6T1otvmENgSy3XK6DBA41KmBno6G5unXTavbCCaNZis5", + "tunnel_endpoint": "4.8.126.96" + }, + "7F2dEzJ5pb3v8Jb2vZ5N2KDHQSdaokJYK5KJ4oQvy8BD": { + "account_type": "User", + "owner": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.164", + "dz_ip": "148.51.120.147", + "tunnel_id": 525, + "tunnel_net": "169.254.8.6/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "45KewPQts5ETLLxRyX1hBM1ns1L9JiWiYZZusuURxUMR", + "tunnel_endpoint": "209.249.183.218" + }, + "54AJRRsfp3bZJnpxrWExYFdxK6CubXEricPS13CsHnCN": { + "account_type": "User", + "owner": "33LkkPLhabvDAhtKqL3KM6gW9MYCF5Tjtn987DHGyDe7", + "index": 57101, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "146.0.225.230", + "dz_ip": "146.0.225.230", + "tunnel_id": 517, + "tunnel_net": "169.254.4.78/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "CVR8JA3GRKwJQqvz3p4p3RcRHAUQuYgMYR9nBWMRnHdB": { + "account_type": "User", + "owner": "BUokhb8pPF9MZuzW3rHLr6jzakgcz3NDq2PZkpiVv3jb", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.40.157", + "dz_ip": "64.130.40.157", + "tunnel_id": 544, + "tunnel_net": "169.254.1.12/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BUokhb8pPF9MZuzW3rHLr6jzakgcz3NDq2PZkpiVv3jb", + "tunnel_endpoint": "198.13.140.24" + }, + "GtxcTS3BAuhzTF5mBN5EPtLoxjeJcdMPha5VegZAzo7b": { + "account_type": "User", + "owner": "DWiFpqeR7vx5eUHvarJHJFN7q1LjN7SUU6wdDVWubyv2", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.32.198", + "dz_ip": "64.130.32.198", + "tunnel_id": 522, + "tunnel_net": "169.254.7.158/31", + "status": "Activated", + "publishers": "", + "subscribers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.24" + }, + "7bvXiFMKyo37ej6qGRAu7tJe6wXMupLiMfX9rDUWT2Qs": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 0, + "bump_seed": 251, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.35.107", + "dz_ip": "64.130.35.107", + "tunnel_id": 530, + "tunnel_net": "169.254.9.176/31", + "status": "Activated", + "publishers": "", + "subscribers": "4UjgqgwyAmq1m7BRaWpfjcpKHPueRN4nunNQU97UoCDv", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "209.249.183.218" + }, + "CHfP3cCj79DStXSNgKXVgTDjE36xLjat8q1eH2oKbrA3": { + "account_type": "User", + "owner": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.32.115", + "dz_ip": "64.130.32.115", + "tunnel_id": 508, + "tunnel_net": "169.254.2.24/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EhaRPBgn299RN7qwEce5Px3hJ8bHHhsFDAnk9wGkgPQA": { + "account_type": "User", + "owner": "BykbUwDn8pWtBUVrAr6ZJjRGRRgekmFEthNfoFUTh8JG", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.83.7", + "dz_ip": "64.34.83.7", + "tunnel_id": 507, + "tunnel_net": "169.254.5.148/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "PAWsME7oYbjt5TRNc11mBa33JhKnQr9AYherdr9YAZ6", + "tunnel_endpoint": "198.13.133.56" + }, + "Gq1Lm6AFgWMEX25B9EqDpHxnsLGNLPML7Vvg1wU7Ut7X": { + "account_type": "User", + "owner": "GwPAVRhXrQmgYhV5Vtn3eNzvCCJhaRjJnzh6x3oi44wT", + "index": 2687, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.80.81", + "dz_ip": "64.34.80.81", + "tunnel_id": 503, + "tunnel_net": "169.254.2.96/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DCdTPyDbXNHrmdv4ZyPPzEfY4mPAqH4hDPtowAteoNgv", + "tunnel_endpoint": "0.0.0.0" + }, + "3M3vXoEgGXACmCd5UDWgYYGiMEqBwTAh1XQdorJ4jBZt": { + "account_type": "User", + "owner": "ooc9bBwcrSKVMWNCojjmvikh8NkSPSgRebm3DWMZeyP", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "139.180.186.123", + "dz_ip": "148.51.120.3", + "tunnel_id": 525, + "tunnel_net": "169.254.4.210/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "meshRrDTME9cL2FSQ9E56EncfkZ7vL8apwcCFsw3o6Y", + "tunnel_endpoint": "154.18.17.55" + }, + "74X8Kik628RtCP3UyRCuzwwGH9yNh45rvCUyfA7mqzpT": { + "account_type": "User", + "owner": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.44.106", + "dz_ip": "148.51.122.11", + "tunnel_id": 577, + "tunnel_net": "169.254.11.186/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty", + "tunnel_endpoint": "198.13.133.48" + }, + "91Ujsdojmu5hKoje6i6UaPC3gpaRxe9GotmHedNv8kU3": { + "account_type": "User", + "owner": "36JU2jhWwaEaipUZSBRNFmy53hFtjTjLtERApWMAXKvF", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.209.55.22", + "dz_ip": "67.209.55.22", + "tunnel_id": 524, + "tunnel_net": "169.254.7.48/31", + "status": "Activated", + "publishers": "", + "subscribers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DHStsdMhVgWA5VCAH72LYgE76k4uaPYkhpXqYjYAfnsS": { + "account_type": "User", + "owner": "D5zXsAfuLKYMs7aQGYKqMeQqLW97xD5xgVXrrsVPU6Zy", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.225.106", + "dz_ip": "148.51.120.194", + "tunnel_id": 527, + "tunnel_net": "169.254.8.148/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "2P9ZYA4vBoBBr56hrEFTmrd5ctuz3r7wtvRYmbgk6jRL", + "tunnel_endpoint": "64.124.32.192" + }, + "UB2FXnhyKzs33ogfdpSRStvjz8qeQcoXKY3tQRfLR8f": { + "account_type": "User", + "owner": "dCENvFQpGSNrrRBiioxwF1ftaXyApiEYF2e8e7tipFV", + "index": 1421, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "15.235.232.142", + "dz_ip": "15.235.232.142", + "tunnel_id": 501, + "tunnel_net": "169.254.0.222/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "idCE5k2BtTpwXdwAC7Var1enT9reut9fWECcxQP7LY7", + "tunnel_endpoint": "0.0.0.0" + }, + "CFXRwXqvEo8FJsYyVwjxGgPzTwxxB5PUU7TCahifbrNK": { + "account_type": "User", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.137.185", + "dz_ip": "148.51.120.7", + "tunnel_id": 500, + "tunnel_net": "169.254.3.60/31", + "status": "Activated", + "publishers": "7yxxsxH1vDs5ZzzxAcALkaE2nxe7Gm9z3Njo192mxjym", + "subscribers": "7yxxsxH1vDs5ZzzxAcALkaE2nxe7Gm9z3Njo192mxjym", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "8QWohCU32JeZx55gBj2oSEpYMDae9Ph6HAVrpDkAbBr2": { + "account_type": "User", + "owner": "SLGwtzChvUByrNZZi9xCBzo14tbmw2YhtU6skbXn7sQ", + "index": 0, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "64.31.28.130", + "dz_ip": "64.31.28.130", + "tunnel_id": 506, + "tunnel_net": "169.254.7.76/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4SsMncJdtKiUcDtukkX15mqei7WiuQ9yvRtQrQW4reWC", + "tunnel_endpoint": "38.122.35.137" + }, + "AcN18GsMJViALWbcP18aELT4wRzCsTkf1zW7R3k78J1r": { + "account_type": "User", + "owner": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.55", + "dz_ip": "206.223.224.55", + "tunnel_id": 525, + "tunnel_net": "169.254.1.22/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "tunnel_endpoint": "67.209.55.48" + }, + "8ZMjUxqMjm47bcZEMaKsGSi8xVWr6cNB5nM2H1gyFFMm": { + "account_type": "User", + "owner": "DZphw7yYtc5dQvcCyjWFUiT5WfyrDozGy7DUptB6d1a1", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.102", + "dz_ip": "2.57.215.102", + "tunnel_id": 552, + "tunnel_net": "169.254.10.114/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7RRFDM57y7JphnVyVYHFP5ys3FwL7AWQSsrGAM7KrT5x", + "tunnel_endpoint": "198.13.133.48" + }, + "6LDH1x4SxWSWHNPdnd7hp399oP4gCeX3mVYXkTLCn47k": { + "account_type": "User", + "owner": "CkbXApnB7BdZNsmcPi7r3xWgFLQePfx2WKqg9W5LjgDF", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.150.249", + "dz_ip": "149.28.150.249", + "tunnel_id": 507, + "tunnel_net": "169.254.5.160/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7CR6whiYULVf1Knj4J5PxUS37opdk8UAx2WnDzBQKiVe", + "tunnel_endpoint": "154.18.17.55" + }, + "GFpx2Yhe3wgum5fChkbmqzp2aUJmwcmnNU4QZq3mYis": { + "account_type": "User", + "owner": "5K9Tp8Nkg2KeGYyWCEAD3ajLM1Z1czhvgoZN7eAyWA2r", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.53", + "dz_ip": "206.223.224.53", + "tunnel_id": 544, + "tunnel_net": "169.254.6.176/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "MBVyz9s72WSfUmbr1S8fgHjDJQkPs1Q4Wxi6A2Mees9", + "tunnel_endpoint": "154.18.17.55" + }, + "9dzdvn3BWLmApHz5SF1xGrfZ8GJ8Wj1jw5yhPo6bEgY4": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.138.178", + "dz_ip": "198.13.138.178", + "tunnel_id": 511, + "tunnel_net": "169.254.2.100/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "HG4DCdqZ9yRtUb5YyLPevmgCRQ1JDPZ35uTqKMGntDqQ": { + "account_type": "User", + "owner": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH", + "index": 26260, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.162.36", + "dz_ip": "63.254.162.36", + "tunnel_id": 501, + "tunnel_net": "169.254.5.196/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2SNDBJfPk4gp47kPBt71crko4dqS4izdXMeVHSkiUYEU", + "tunnel_endpoint": "0.0.0.0" + }, + "E1kcHyk1LmbEo8PFMmaNgcgykWZT8ypXGZ2yPWEXz9UK": { + "account_type": "User", + "owner": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH", + "index": 26259, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.130.131", + "dz_ip": "198.13.130.131", + "tunnel_id": 521, + "tunnel_net": "169.254.5.30/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "E4odJgV9t72tXLTF8VeY2fweHRwaQYieyVND6r3apsSj", + "tunnel_endpoint": "0.0.0.0" + }, + "3nFMRbMYVyBMTW4aP5EXSGpLeC3J92qURFT7MVMhCfe9": { + "account_type": "User", + "owner": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.107", + "dz_ip": "208.91.110.107", + "tunnel_id": 507, + "tunnel_net": "169.254.1.224/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3WzqXuJPRdH5BQH4uzrXbd36ZjnwHvg2bs72wvSRT3E8": { + "account_type": "User", + "owner": "r2rUWLeetQy7vfjprvPo9ncwxKjiJHAzTy4vVAF7LwZ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "160.202.131.151", + "dz_ip": "160.202.131.151", + "tunnel_id": 547, + "tunnel_net": "169.254.9.224/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.24" + }, + "CJj45paVRVpu9HMLrRwCpf3VMJVmw7JkLNiRX9a9xAj5": { + "account_type": "User", + "owner": "CkbXApnB7BdZNsmcPi7r3xWgFLQePfx2WKqg9W5LjgDF", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.150.249", + "dz_ip": "148.51.121.243", + "tunnel_id": 541, + "tunnel_net": "169.254.0.52/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "7CR6whiYULVf1Knj4J5PxUS37opdk8UAx2WnDzBQKiVe", + "tunnel_endpoint": "209.146.32.160" + }, + "88QvxPm4B8pota3hvfkntaYUviwkJrqvzsjgcsdgaYCU": { + "account_type": "User", + "owner": "4EWpQFQPS8PXax26RKdGy5SX4vyYf2jBBtTrUpNk6qFp", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.107.231", + "dz_ip": "208.91.107.231", + "tunnel_id": 504, + "tunnel_net": "169.254.5.38/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "72MoJGta4GmnWFUUUe41SnLudAnPTjKezoiXJu7LNv5j": { + "account_type": "User", + "owner": "H4EgZdjpiidCnW9MWnfWYMfxsZtm8ET1EN9jcfhUXrNX", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.67", + "dz_ip": "67.213.122.67", + "tunnel_id": 540, + "tunnel_net": "169.254.1.214/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2N7v8pDKDYhtBUJBQUgxvysUjgM9s4ULPCmeEiPWTf6Z", + "tunnel_endpoint": "154.18.17.55" + }, + "D63S5Adf8MtZFNop1GkwL8DggvpAayWNLvLuVz48at5J": { + "account_type": "User", + "owner": "Dug99hFphzxrrA3GhS8U1Wxajz1QKaqszJU4PJEAwPDU", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.76", + "dz_ip": "2.57.215.76", + "tunnel_id": 571, + "tunnel_net": "169.254.11.144/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DxisWshp4WHyW5G3ZN1PJ8RAdwUBVvGdN6cQp9eecxT2", + "tunnel_endpoint": "198.13.133.56" + }, + "7ibCJ6bCPjccjhjSmJhh4CAdBncUgquirqEABxAxnCYh": { + "account_type": "User", + "owner": "DDB4XQGCCMdPQygsq6kPDz7VdTEWe1APfarNuGS9c8e5", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.109.57", + "dz_ip": "148.51.121.246", + "tunnel_id": 515, + "tunnel_net": "169.254.1.46/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "HEL1USMZKAL2odpNBj2oCjffnFGaYwmbGmyewGv1e2TU", + "tunnel_endpoint": "202.163.13.32" + }, + "Fnam2UgF7GGzn4S5EJ3Bzt84cCZFmXitMuw1KQAdNiXG": { + "account_type": "User", + "owner": "Ey3DkEVbfBxfWmkTsG7Hqj7jshYf5Zx9H8462Zjjkykf", + "index": 2667, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "cyoa_type": "GREOverDIA", + "client_ip": "45.134.108.141", + "dz_ip": "45.134.108.141", + "tunnel_id": 527, + "tunnel_net": "169.254.2.92/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Ey3DkEVbfBxfWmkTsG7Hqj7jshYf5Zx9H8462Zjjkykf", + "tunnel_endpoint": "0.0.0.0" + }, + "DDRkeSJWcHyK7ag51GxAEUw9xnaTqM6Mx2ZEtskwc1Vs": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.141", + "dz_ip": "64.130.37.141", + "tunnel_id": 504, + "tunnel_net": "169.254.0.234/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4SNKY7GCp7ohY4AawND5Cc2D71sWMWN3Uifo854yvtks", + "tunnel_endpoint": "4.42.212.122" + }, + "EeQWC8Lwnuzofa2MtZr5JqVeh7NTrVoBRMbhoz2zWcu3": { + "account_type": "User", + "owner": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.57", + "dz_ip": "206.223.224.57", + "tunnel_id": 524, + "tunnel_net": "169.254.9.218/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "tunnel_endpoint": "67.209.55.56" + }, + "BQBhrhwiBvuDpexA79ChoGwNpRC6HEEvuWQc5vReki2N": { + "account_type": "User", + "owner": "9oDeND8pBT9xTK87E4vN5JmSH4Ut3iPG1nzJr6XTMVzJ", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "154.47.145.125", + "dz_ip": "154.47.145.125", + "tunnel_id": 501, + "tunnel_net": "169.254.6.96/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "HVXXmNKkmDZbZwj74iL2Y9Wu4SyrchBoxAfFYVAktLrG", + "tunnel_endpoint": "193.28.105.130" + }, + "GGswUsAEcu6kbjPHtQvMztxpFNFQYQpGb1ETy1C1BaEX": { + "account_type": "User", + "owner": "HxGDmKC6w6LLhrSCRq1HaKEJ5wNjQf8XF3UVi891ZZpV", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "137.239.213.222", + "dz_ip": "137.239.213.222", + "tunnel_id": 530, + "tunnel_net": "169.254.4.230/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "C7CZpb8EkodpFsfNZ6rDdAGTyqT2oPiwLWSKQHFmtagj", + "tunnel_endpoint": "0.0.0.0" + }, + "9hK8qzeCtE1UEAg47mGApcf65yxgnmZQDHjPbz75RnxF": { + "account_type": "User", + "owner": "9nxWixzZih86YrKapEiG3AZigQBpoUX9Avn5pS1GWMqX", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.101", + "dz_ip": "2.57.215.101", + "tunnel_id": 544, + "tunnel_net": "169.254.11.246/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "hykfH9jUQqe2yqv3VqVAK5AmMYqrmMWmdwDcbfsm6My", + "tunnel_endpoint": "198.13.133.56" + }, + "CVbN3nvVktAVGbKgXav37pP7A6oDniGyzAuJ9rWRsofc": { + "account_type": "User", + "owner": "DQES9jpMSPrf8jRrPL3XuPWWMjaj4vws99miY7C3BwKQ", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.123.153", + "dz_ip": "148.51.120.172", + "tunnel_id": 528, + "tunnel_net": "169.254.8.102/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "8Nvaxzif1NrdvxNkRetjT8xJvd33EHkKVrfL8EDkgaNy", + "tunnel_endpoint": "154.18.64.128" + }, + "Cy8J9KUKsdZG1z6bV7oJ2k4W47VMtThWJZPhdVmr1HfB": { + "account_type": "User", + "owner": "SBDZzBVbJnDYsbPBe9yAqFcu39mdzkm8UpKK9We38qh", + "index": 17369, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.9", + "dz_ip": "67.213.122.9", + "tunnel_id": 517, + "tunnel_net": "169.254.5.42/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "sbidYi7fbif6qNsMpwBKvyF5DKcLCbjaegpADsKqNux", + "tunnel_endpoint": "0.0.0.0" + }, + "3CEvfnGJhEdcbhKULPxPZP83eGmnaDetw9sXBRFwFbKM": { + "account_type": "User", + "owner": "GG8ejFmhvVDfFNBh2jSDiZmWxK3gxpoWDGtNeVYEySLP", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.162.48", + "dz_ip": "63.254.162.48", + "tunnel_id": 531, + "tunnel_net": "169.254.10.248/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "6vJFcfx3cdz7JMqFCkuj8SpK8F7EVFnUnYyn42o9z1v4": { + "account_type": "User", + "owner": "4SBNw6R5swH6QoeNs7x2VtAZ3xCCtqgptPD1qmyWkVNs", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.111", + "dz_ip": "148.51.120.226", + "tunnel_id": 541, + "tunnel_net": "169.254.3.220/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "7AZ5mrZP4pZ84xYvfFvUQ34wkgW7krgftqTeEik9xa3U", + "tunnel_endpoint": "198.13.133.48" + }, + "AwYjxEjudBDMYHzHTZNgskxqHHNqLHc4mb2JgJ8D3WKp": { + "account_type": "User", + "owner": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.73", + "dz_ip": "67.213.122.73", + "tunnel_id": 531, + "tunnel_net": "169.254.7.110/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW", + "tunnel_endpoint": "209.146.32.160" + }, + "Et51LgZLv1MZ1aCuhhES74yJdtHe4aw6ZTmuxTCBkFDD": { + "account_type": "User", + "owner": "C9dTbbWEdNeVZjqbnzZKB4DxfuLqWNVnr9mdZfCqBHKQ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.83.203", + "dz_ip": "64.34.83.203", + "tunnel_id": 520, + "tunnel_net": "169.254.3.194/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6D1xzrtskRrBrWEF8pHSaZ2w8H5GUoximyrBFs3n4f3Y", + "tunnel_endpoint": "154.18.0.97" + }, + "6jcpR1YBrVvZihEwfREGuZiYzC65LbLSEfmxWxpWabFp": { + "account_type": "User", + "owner": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.30", + "dz_ip": "148.51.120.14", + "tunnel_id": 511, + "tunnel_net": "169.254.3.108/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy", + "tunnel_endpoint": "154.18.0.97" + }, + "BGitnd6n9nMNgACVK3aj37YQabojrrNJ7UpbLaCnsaKn": { + "account_type": "User", + "owner": "LodeuWMHPiPj2PUHUyca2bkpFv9HyzR3gaDBmGJ9TSS", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT", + "cyoa_type": "GREOverDIA", + "client_ip": "192.69.194.213", + "dz_ip": "148.51.121.254", + "tunnel_id": 505, + "tunnel_net": "169.254.4.10/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "LodeuWMHPiPj2PUHUyca2bkpFv9HyzR3gaDBmGJ9TSS", + "tunnel_endpoint": "38.247.16.128" + }, + "DyCkboYboumpGKFg9Ae9rgaaAx8r3rPLN4c6eencV6Su": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.45.98", + "dz_ip": "64.130.45.98", + "tunnel_id": 545, + "tunnel_net": "169.254.11.204/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "Acxy4JKqWXsCgtoGcxdQVUMW14gonjtTcxnQ86JfNbxe": { + "account_type": "User", + "owner": "dztuVuFYWG1tyS9V65aHYBCyBqiK2Ss3VHmZzhUCHWM", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.136.186", + "dz_ip": "148.51.120.9", + "tunnel_id": 509, + "tunnel_net": "169.254.1.94/31", + "status": "Activated", + "publishers": "7yxxsxH1vDs5ZzzxAcALkaE2nxe7Gm9z3Njo192mxjym", + "subscribers": "7yxxsxH1vDs5ZzzxAcALkaE2nxe7Gm9z3Njo192mxjym", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "209.249.183.218" + }, + "DqRKLunrgduDLSydh5XDiEcwD4YnQ9oC2no1WvzL2Zuh": { + "account_type": "User", + "owner": "GBzbTunYrMzcpeyJ6nwCUCupAbvEvE4xJPx9SXjAN1vC", + "index": 0, + "bump_seed": 251, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "207.148.65.229", + "dz_ip": "148.51.121.86", + "tunnel_id": 534, + "tunnel_net": "169.254.10.112/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "KAW1LjxH73tRBd1XsaqsRsgeERFkg4WpdXUSqR4QjkW", + "tunnel_endpoint": "209.146.32.160" + }, + "9ht48gwJQUyVr1wXyJxrbXCmT8GhMaMJzJouiKzdayQt": { + "account_type": "User", + "owner": "3mgPKs5MRnWNJYrxnbf7xiHktKTQGNcyqSuCY25mBWSt", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.233.229", + "dz_ip": "206.223.233.229", + "tunnel_id": 522, + "tunnel_net": "169.254.8.58/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GiYSnFRrXrmkJMC54A1j3K4xT6ZMfx1NSThEe5X2WpDe", + "tunnel_endpoint": "4.42.212.122" + }, + "9QXdj8Zr8chpK8DzwEV1immooUfBbfbekfm6qEMdxDii": { + "account_type": "User", + "owner": "7b5VyivVaadtMkFDbqFVPm3NWywNFueVfoAzt3YMCoJB", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.94.205", + "dz_ip": "64.34.94.205", + "tunnel_id": 510, + "tunnel_net": "169.254.4.242/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6maJ1mXF8jsH39a4yZffXzsshfVX4xPyYiyGk38PnBu8", + "tunnel_endpoint": "198.13.133.48" + }, + "8QvmH2JLQKBiQdmsLZvCc9NUbDgDoWurdxGrasWa6eGP": { + "account_type": "User", + "owner": "J6etcxDdYjPHrtyvDXrbCkx3q9W1UjMj1vy1jBFPJEbK", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.138", + "dz_ip": "64.130.37.138", + "tunnel_id": 505, + "tunnel_net": "169.254.4.158/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "J6etcxDdYjPHrtyvDXrbCkx3q9W1UjMj1vy1jBFPJEbK", + "tunnel_endpoint": "209.249.183.218" + }, + "FCcYihDYCPTyiQ8mu7gs6qbXxobg7MGV1AotxScgDxxr": { + "account_type": "User", + "owner": "9UF7Jm92TjcbiAeKaog33mZ3stuynpQz3VQ2Ejkeok9C", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "173.231.44.202", + "dz_ip": "148.51.121.5", + "tunnel_id": 509, + "tunnel_net": "169.254.9.108/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "HNFk5BU6i45rQeiVvNQThvrnLVyBDMy85pFUhLso1wo7", + "tunnel_endpoint": "38.247.16.192" + }, + "6RrAX8PbpR4TNgnVNaUeigbXstQUNgcycEvbvaF9XDpq": { + "account_type": "User", + "owner": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.112.35", + "dz_ip": "67.213.112.35", + "tunnel_id": 504, + "tunnel_net": "169.254.7.214/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6T1otvmENgSy3XK6DBA41KmBno6G5unXTavbCCaNZis5", + "tunnel_endpoint": "38.247.16.192" + }, + "HSc6eSPiRWiuvAdDiRjSpvqNDJi4PKPXKNjzGpKm5zC7": { + "account_type": "User", + "owner": "Hf3HUBVD3yiYwJ9h99NRanRhWbiTqp8yDghfQcQk4Wza", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.182", + "dz_ip": "148.51.121.68", + "tunnel_id": 555, + "tunnel_net": "169.254.8.236/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "6Ut1wC8PhVGtMiJYHicbc3LPqSdg1tKKxyLbFXuFvRva", + "tunnel_endpoint": "198.13.133.56" + }, + "SRqdFoomcp5QuQny7Jhs5xiYHKaaLTkpty9UvpZPoyo": { + "account_type": "User", + "owner": "FSkkUkQEdKBpjSbaVHci1zyu1HP34YKqd6LZnTbSkL24", + "index": 15785, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "66.135.11.12", + "dz_ip": "66.135.11.12", + "tunnel_id": 502, + "tunnel_net": "169.254.0.100/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Bs19Z9SokV1s46jutN9tqqaCgYf1GsVyyytVfkzwn9qK", + "tunnel_endpoint": "0.0.0.0" + }, + "12vQqRKpUecAGKFzsheAqbnLokVFyw2eArNPUty29Rvq": { + "account_type": "User", + "owner": "Du4jcYA6YN2C3rk8BHCJJs9rgun3RpMi1WV31weBWXS3", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.107.204", + "dz_ip": "45.77.107.204", + "tunnel_id": 516, + "tunnel_net": "169.254.3.10/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "209.249.183.218" + }, + "97anHz2bx1MaZAkJbWBh3KnLKrLXcby9iCF6mcbk1256": { + "account_type": "User", + "owner": "CADuawrj4x74ixX6nSYrkVYzqRnMLDFqh2wsFxF4scww", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.49", + "dz_ip": "206.223.224.49", + "tunnel_id": 509, + "tunnel_net": "169.254.7.102/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4GpHsK4ExBFQNt1jvNbk8hdF9EBm6medNjfHw7g2EazZ", + "tunnel_endpoint": "67.209.55.48" + }, + "AuLquU1koSVLa1u42juh9wmFTHrBpkm4BEUZ1RsddUnW": { + "account_type": "User", + "owner": "An8qqTSgY8sRezCvSdQBxVwkrS9V25zUJiqFYL8pGYhc", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "57.129.84.83", + "dz_ip": "57.129.84.83", + "tunnel_id": 512, + "tunnel_net": "169.254.7.238/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "193.28.105.144" + }, + "5sACMj6g1Zk7pJMkKQPuqCzUvjkMp66fJE2wDxD3CM8P": { + "account_type": "User", + "owner": "LodeuWMHPiPj2PUHUyca2bkpFv9HyzR3gaDBmGJ9TSS", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT", + "cyoa_type": "GREOverDIA", + "client_ip": "192.69.194.213", + "dz_ip": "192.69.194.213", + "tunnel_id": 504, + "tunnel_net": "169.254.3.82/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "LodeuWMHPiPj2PUHUyca2bkpFv9HyzR3gaDBmGJ9TSS", + "tunnel_endpoint": "38.104.167.29" + }, + "AWxkutF1mCmws9oSqMsSQwuX6M8YBkCkXcavtJntzfAF": { + "account_type": "User", + "owner": "FXkgqU7wSB1bGHAvHeLFT5uKBAJqfBB4XTQe3teRfWFn", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.95.90", + "dz_ip": "107.155.95.90", + "tunnel_id": 522, + "tunnel_net": "169.254.11.150/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EH9xqextnMxNzcE7MmzbAdukPPFm34XyKSqngbvudHxS", + "tunnel_endpoint": "67.209.55.56" + }, + "gxFEzgsLPC91Pnimc6cyQxby2hD7nb6fqbv3bDxAH7p": { + "account_type": "User", + "owner": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q", + "index": 3559, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.168.243", + "dz_ip": "45.77.168.243", + "tunnel_id": 515, + "tunnel_net": "169.254.1.14/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q", + "tunnel_endpoint": "0.0.0.0" + }, + "6auezN6bvFdfFQhCuS74CtiijsN1rBrLvEznAWLawQXE": { + "account_type": "User", + "owner": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.57.50", + "dz_ip": "148.51.120.54", + "tunnel_id": 525, + "tunnel_net": "169.254.5.190/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "JupmVLmA8RoyTUbTMMuTtoPWHEiNQobxgTeGTrPNkzT", + "tunnel_endpoint": "198.13.140.24" + }, + "A2SbRAQfT6ZV99nsz4m8iV6LnLgZFhHHoeY7RY2wtJB2": { + "account_type": "User", + "owner": "F6yUWFfTkqTYzbUhWLQsdjQAHMd49BmZUdj1gFNTWmCo", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.61", + "dz_ip": "206.223.224.61", + "tunnel_id": 518, + "tunnel_net": "169.254.0.48/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DnQBmTJyLbBMgJYQLJDqJz25AJModNkyexL5LdVRGnG4", + "tunnel_endpoint": "67.209.55.56" + }, + "FBqScVy8K5UY85urnDR9HRT3hgwMyE7jCQC3fbL7L9eC": { + "account_type": "User", + "owner": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.21", + "dz_ip": "67.213.122.21", + "tunnel_id": 518, + "tunnel_net": "169.254.7.56/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt", + "tunnel_endpoint": "0.0.0.0" + }, + "BnUw9gG6fjaXa35Zfh8k648ZEviouNkC8hUPELcUY5wp": { + "account_type": "User", + "owner": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.223", + "dz_ip": "148.51.120.105", + "tunnel_id": 532, + "tunnel_net": "169.254.7.172/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ", + "tunnel_endpoint": "152.233.14.224" + }, + "HYk56om3cHNhVoei9Q94NTFPVFAArannWtYGkeLF3ARF": { + "account_type": "User", + "owner": "BuoZ7q6faiJNTN24r7Kcj8dp96axs5XPEKXmWGsh2pDE", + "index": 22692, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.215", + "dz_ip": "208.91.110.215", + "tunnel_id": 512, + "tunnel_net": "169.254.5.114/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BuoZ7q6faiJNTN24r7Kcj8dp96axs5XPEKXmWGsh2pDE", + "tunnel_endpoint": "0.0.0.0" + }, + "Di2pyYVyhtMeV4S6be9Gu1SSHkgEGPCDM2oQWBDzEirf": { + "account_type": "User", + "owner": "dzt1pRvPJdPwNfLDWaj4UUHw1UW3B1c1JdUq35Jvamq", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.131.97", + "dz_ip": "148.51.120.11", + "tunnel_id": 502, + "tunnel_net": "169.254.3.4/31", + "status": "Activated", + "publishers": "7yxxsxH1vDs5ZzzxAcALkaE2nxe7Gm9z3Njo192mxjym", + "subscribers": "7yxxsxH1vDs5ZzzxAcALkaE2nxe7Gm9z3Njo192mxjym", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "67.209.55.56" + }, + "3YVaFJpy8r5WDuhGGqDcWk1DcJgWSoX89kUHiqpChczA": { + "account_type": "User", + "owner": "539tRUjSsrj57iqWFrYfntDbWsLeeDnmhXQJ3x32NmLk", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.103.133", + "dz_ip": "148.51.120.50", + "tunnel_id": 538, + "tunnel_net": "169.254.3.240/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "FyrwfMaomErzqrFUXMjCJ7mA4u81DsiDdrzC3MJD6d4j", + "tunnel_endpoint": "154.18.17.55" + }, + "3Enjc4wAzUNDUL74LojCBrAHGWyKMn1imoCmfE1VkY8t": { + "account_type": "User", + "owner": "5djYvy6U2Xj5RegQbgdJMVtp9ymxGhRGbL9AVXTj1st8", + "index": 45074, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "cyoa_type": "GREOverDIA", + "client_ip": "154.29.73.178", + "dz_ip": "154.29.73.178", + "tunnel_id": 502, + "tunnel_net": "169.254.6.144/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "44USuZR7ELAXpPnMpVAqwW8D5DJV47ZY87mjp3QnzERg": { + "account_type": "User", + "owner": "9NR8T2KaNPKSMaG1hQc7vqrgmkr7VBjqudDDUkTM5bQM", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "65.49.109.98", + "dz_ip": "65.49.109.98", + "tunnel_id": 500, + "tunnel_net": "169.254.2.20/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "HJHDGgsLBBGStNbu3zRMSTuNuUotzWoLeCSXHPzQmamo", + "tunnel_endpoint": "0.0.0.0" + }, + "8XLabissHrDYc4XgixQwWj8kQHaTfDeWDbXKWwuncGNQ": { + "account_type": "User", + "owner": "A48xFiZzS2VyPWRLHjw65K2SdBdz4MMcPqaBdiPLmr77", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.251.33", + "dz_ip": "45.32.251.33", + "tunnel_id": 502, + "tunnel_net": "169.254.6.194/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GQiWnDYrzHMALWG9avt5FCu1wisAQHjGY5ve7GMBiPEe", + "tunnel_endpoint": "180.87.28.32" + }, + "CPLJ5Ckwm8MYWSD5Pi53CKuACc2AqQUuMBpRD5oA8Czb": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.131.95", + "dz_ip": "198.13.131.95", + "tunnel_id": 532, + "tunnel_net": "169.254.11.210/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "67.209.55.48" + }, + "4Ay14ca98YCnN5fgpB6bGdeiz8wGBX2mQCeLxSnh1PR8": { + "account_type": "User", + "owner": "9R5wgT2h3ECoDfopUnyZtkpLHgBvwtg9ZxjwCookRj8M", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "cyoa_type": "GREOverDIA", + "client_ip": "137.220.32.24", + "dz_ip": "148.51.120.168", + "tunnel_id": 500, + "tunnel_net": "169.254.8.66/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "EAW9vxqogvdPNapq7QTDpiVTHK6o7begUhPVnf854VTc", + "tunnel_endpoint": "198.13.143.16" + }, + "6mjaXBfuSnZQLfUNT3DVdefsig3s3xPqdQrLx2MoLM7g": { + "account_type": "User", + "owner": "Bq9t5usaaa3eKHjVkbYF4ZMzusVt5UBiP98xdoXZekmB", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.114", + "dz_ip": "148.51.121.241", + "tunnel_id": 562, + "tunnel_net": "169.254.11.140/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "fdzip81euDS8jEZHx5H1mn27zGVMLzkgpQuzYRBfBYG", + "tunnel_endpoint": "198.13.133.56" + }, + "ELVEbcZVWDzpv6wpNoGCwDoaJM5QvbDFEZmFaptcDv4z": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.133.125", + "dz_ip": "198.13.133.125", + "tunnel_id": 574, + "tunnel_net": "169.254.11.168/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "A2hUv7nrBLfxwCywvbepLahbgqAqfGZCJqsBQ9Zyuepf": { + "account_type": "User", + "owner": "rgh2ZRt5ejyQ7saSLPNmYXsNuqwvkn8jzEWWXoAWrhr", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.95.182", + "dz_ip": "148.51.120.26", + "tunnel_id": 506, + "tunnel_net": "169.254.4.192/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "gridqZmeBcsUKT2Mv4M9YFHFN3tVLFb2TCtTcLD1cAd", + "tunnel_endpoint": "67.209.55.48" + }, + "3iUJ1ee1ufFASvEhS88zVai4YBgS7TwSwUfmbX2aJ1p5": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.162.26", + "dz_ip": "63.254.162.26", + "tunnel_id": 580, + "tunnel_net": "169.254.0.82/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "DyU47whn18drSeXkKZzprAB9e9C7u9TyzafymfgSEGs7": { + "account_type": "User", + "owner": "GqUtPyfcg7pa1ZHTBLd6tqdLndDcUFGeBcvhxJbpn2Ce", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.150.33", + "dz_ip": "148.51.120.88", + "tunnel_id": 515, + "tunnel_net": "169.254.0.132/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "Hqr3kookSnMBTC7mHi4vsBsZQ5ih7n1Jx6vKwVjKoZDC", + "tunnel_endpoint": "64.124.32.192" + }, + "GY1459sUb77vPRfiVswoX6Dh9EiPxA5dRfnrmjo1c9CT": { + "account_type": "User", + "owner": "9BWFAyyHfKUTw5yjg1sfUaVTqaBrev6VjtCxBqFUPFdY", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.57.44", + "dz_ip": "148.51.120.220", + "tunnel_id": 554, + "tunnel_net": "169.254.6.252/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "caSFeQYTQhPvDiMPoYAoVg1r1cmD7ijZLPdgRUYttak", + "tunnel_endpoint": "198.13.140.16" + }, + "FpfazBxGXqVkz8LrRiRrr9g3LNYsRZ2f4aHzWV5QEKfj": { + "account_type": "User", + "owner": "FugJZepeGfh1Ruunhep19JC4F3Hr2FL3oKUMezoK8ajp", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.41", + "dz_ip": "208.91.110.41", + "tunnel_id": 506, + "tunnel_net": "169.254.0.106/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FugJZepeGfh1Ruunhep19JC4F3Hr2FL3oKUMezoK8ajp", + "tunnel_endpoint": "4.42.212.122" + }, + "2g5w9W4FG9UZ5FZaTdvcTP4jnkrmy5VyZy5xPxfX4T5P": { + "account_type": "User", + "owner": "HLXKZPQ1XNccxWVJw3ydwtQrGwTAaxxSGKzd6oqJth9Z", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "205.209.125.138", + "dz_ip": "148.51.121.90", + "tunnel_id": 513, + "tunnel_net": "169.254.10.38/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "BHin3N7CRHFFPX8X96PrScPgZNc6JCBgD4fYzfGz9VqV", + "tunnel_endpoint": "38.247.16.192" + }, + "7gb4QohQofkRk3obnjocVW5etneWYvoZY4mxqwTqZMoX": { + "account_type": "User", + "owner": "3mgPKs5MRnWNJYrxnbf7xiHktKTQGNcyqSuCY25mBWSt", + "index": 0, + "bump_seed": 251, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.233.229", + "dz_ip": "148.51.120.177", + "tunnel_id": 526, + "tunnel_net": "169.254.4.156/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "GiYSnFRrXrmkJMC54A1j3K4xT6ZMfx1NSThEe5X2WpDe", + "tunnel_endpoint": "4.8.126.96" + }, + "86Mq8KRKm9oJNfWNs1ydo2UY4SmbGSJ2xUQdeDhyRpNe": { + "account_type": "User", + "owner": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.59", + "dz_ip": "72.46.87.59", + "tunnel_id": 512, + "tunnel_net": "169.254.7.116/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "tunnel_endpoint": "67.209.55.56" + }, + "DyWm7XUnpamQ598sHJMwjhz8WV4ZdtCaCSrypFch9Kgk": { + "account_type": "User", + "owner": "6MDSPxy3iERgJ6tJ5ZymTLFP2QHtC1fUmL5NgpLy5MpC", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2", + "cyoa_type": "GREOverDIA", + "client_ip": "66.118.238.242", + "dz_ip": "66.118.238.242", + "tunnel_id": 502, + "tunnel_net": "169.254.10.180/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "208.91.105.40" + }, + "G9f6DB5VgfZbWZn8UJrKWGedGUhQAUVNVb79H3htYZ25": { + "account_type": "User", + "owner": "giwr6yNF8gMpgXWDt1T4Yya61xk4aCz71npcTs394Cu", + "index": 35137, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.86.171", + "dz_ip": "72.46.86.171", + "tunnel_id": 505, + "tunnel_net": "169.254.6.58/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8u7WxwRZaa2mGQdZQCBqNaEbGj8Yq6q9XNEZCdra7TTc": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.141", + "dz_ip": "148.51.120.24", + "tunnel_id": 524, + "tunnel_net": "169.254.4.90/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "AnJdDKsphYNGCuQ7udZqiET3Nnjb4nfvu26jQssUv1zA": { + "account_type": "User", + "owner": "BtQLtvQG6aeYLGT8cyj3RLfvvS3NLgTqym3eKSFqdDMT", + "index": 0, + "bump_seed": 249, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "139.84.227.17", + "dz_ip": "139.84.227.17", + "tunnel_id": 511, + "tunnel_net": "169.254.7.112/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FoXyHJXdQGK2eHoTjSAzHq4hzxWdJvpGgyzrtPS9eAk", + "tunnel_endpoint": "0.0.0.0" + }, + "7T6MXDwQVuN6KJcHCkMkztajGARgwFckWGygGZ6BgEWt": { + "account_type": "User", + "owner": "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "23.252.121.174", + "dz_ip": "23.252.121.174", + "tunnel_id": 501, + "tunnel_net": "169.254.1.118/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Hi9CBpuiJQLp8UayRKS2Qz8SYu2arZXTcaHqcQdSH3gD", + "tunnel_endpoint": "38.247.16.192" + }, + "8SJtbWAYiVCgUZcpr8WzQESqzfr3WGfwNUnmM8J9DjQz": { + "account_type": "User", + "owner": "oWPCJQUE4QP4ii1oCSLmryBaVy4sNyN1NVj16TZtyDe", + "index": 0, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "139.180.132.226", + "dz_ip": "139.180.132.226", + "tunnel_id": 522, + "tunnel_net": "169.254.0.178/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "bookoVmqw4QjVj5BbkFacouadx9M7816wyRkfM7A5Lo", + "tunnel_endpoint": "0.0.0.0" + }, + "2KFHK2xrtF7KsmyWFGNdZF6vaN6zzqbSZVeudzi3uNSU": { + "account_type": "User", + "owner": "HNEdM9cSf5QCQR2ftyAqcwk6XH1ZrmVh3LG4MVNwFkbF", + "index": 0, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.130.56", + "dz_ip": "198.13.130.56", + "tunnel_id": 504, + "tunnel_net": "169.254.7.180/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "154.18.17.55" + }, + "9wWkNNpZbxpH6kJX568WknuFHxSaMkVotZkUnr5j3z8i": { + "account_type": "User", + "owner": "STKEbHxS7rRMgL1NE99MqV1VjTypnUV5YmE7TqAC4JY", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.133.120", + "dz_ip": "148.51.120.59", + "tunnel_id": 511, + "tunnel_net": "169.254.5.206/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "EBk678aQvc3cUkfGyoehfw21JQfJXjmWuBeopYc89RSV", + "tunnel_endpoint": "198.13.133.56" + }, + "AXaBZvn7jxoW2X9sHhDvpdRxqFqeFrGSXPRo4ug76T98": { + "account_type": "User", + "owner": "4yA8G3Hk9EjFEvu4fU13DG4AG9YJTtGqFqTSxUf2CpUa", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "15.235.232.94", + "dz_ip": "15.235.232.94", + "tunnel_id": 504, + "tunnel_net": "169.254.7.130/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "AZMpyiKtWPcNbU4Cm9RNGki9dpHhjfNpaWMu1jFk5vVo", + "tunnel_endpoint": "0.0.0.0" + }, + "CUgjLha9vwDMeAsTxaqQcSdGFTBaQD9dHhk8Mi6zSNhd": { + "account_type": "User", + "owner": "2BYpEke9hJ5cUtPMx1mj1xdcyhNbmKPZcD4REcwgstcb", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.142", + "dz_ip": "148.51.120.167", + "tunnel_id": 526, + "tunnel_net": "169.254.0.200/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "7MTjmteQHhthwwTZhUzsc2dP4NBvGNRqj8jzdqNxHFGE", + "tunnel_endpoint": "154.18.64.128" + }, + "DT8Hm2AEAwQ8R4JDi8zH65s9bb2yZRx5xr43Vhpk5psX": { + "account_type": "User", + "owner": "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.175.13", + "dz_ip": "148.51.121.64", + "tunnel_id": 535, + "tunnel_net": "169.254.9.78/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC", + "tunnel_endpoint": "154.18.64.128" + }, + "23H15Kh5eKmNTv4VZzwsi4ykKhbZDhu47Qf89CtwkiPU": { + "account_type": "User", + "owner": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.59", + "dz_ip": "148.51.120.109", + "tunnel_id": 503, + "tunnel_net": "169.254.7.184/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "tunnel_endpoint": "152.233.14.224" + }, + "D6LTQxHGuePYtMnakhrQYt4XF4P4yDvNQ2vxZhUF8mss": { + "account_type": "User", + "owner": "ARx33747AK12mbKQ8rnpFkC9xKnizNVNjL8x57Ki4jYc", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.172.78", + "dz_ip": "151.123.172.78", + "tunnel_id": 506, + "tunnel_net": "169.254.2.62/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6c6RrC9TWNgiVXnbZ6hehNuhyh81pZK1yAj5w2nXZTwi", + "tunnel_endpoint": "0.0.0.0" + }, + "EnkrgqoFcWGGRrMhswUsB5u3EEQau4GMyX4bmEjy3PsZ": { + "account_type": "User", + "owner": "A4hyMd3FyvUJSRafDUSwtLLaQcxRP4r1BRC9w2AJ1to2", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.59.234", + "dz_ip": "148.51.121.84", + "tunnel_id": 532, + "tunnel_net": "169.254.11.2/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "A4hyMd3FyvUJSRafDUSwtLLaQcxRP4r1BRC9w2AJ1to2", + "tunnel_endpoint": "209.249.183.218" + }, + "BDRsgNAuw2dviZk9W6n9jvG7iyA3kTbARHribJA6PjZt": { + "account_type": "User", + "owner": "69nT8g5XC8csa6Q8nkSK1JYxAnQq8aW6BCRzaEEy9Fqc", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.123.151", + "dz_ip": "148.51.120.122", + "tunnel_id": 523, + "tunnel_net": "169.254.7.230/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "8hAYbagNt7CMBooFfqVJhBgLqLffpjXTWJMk8yybjJsN", + "tunnel_endpoint": "154.18.64.128" + }, + "8uwqgjbpAbjoVSrXJR4UuqxafkVt2eVUEeTMHRHdamiE": { + "account_type": "User", + "owner": "DMZRKro1R3iEou5tMDpJGRjo4jMCizYUHdum2Sc6xjv", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.56", + "dz_ip": "64.130.41.56", + "tunnel_id": 509, + "tunnel_net": "169.254.2.2/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D2wfmWayBSYE6mhU7NRQkPEnEJ5vpcAP6NNSMKhbQcoz": { + "account_type": "User", + "owner": "39WWybLfDXnmmhfSt4cqAmV7b9S81gFR5kgsJ2REWynv", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "cyoa_type": "GREOverDIA", + "client_ip": "103.106.59.17", + "dz_ip": "103.106.59.17", + "tunnel_id": 507, + "tunnel_net": "169.254.11.68/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "12mZ7YQT1J24tkyF1dr5AEuGEqypdmuL8JzeBsmR1Yct", + "tunnel_endpoint": "66.198.11.74" + }, + "Hqob1k2Z8iNRJ4sdS156PpoKeSQdSNdrVD1A2C7nmdvH": { + "account_type": "User", + "owner": "DZ26oxRWx753Rqso2WUqR5RPY2yWGiuBVoa82zYcRWTF", + "index": 22835, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.42.171", + "dz_ip": "45.32.42.171", + "tunnel_id": 503, + "tunnel_net": "169.254.5.130/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "FW8kQV7GYCC9YoygQj7WJ47gwvjCk3oQmLCHifa9P9md": { + "account_type": "User", + "owner": "6dCYcUDudUWvcHpCessp15rJQp7JvQV3tpELXo29zHHS", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.140.84", + "dz_ip": "148.51.121.123", + "tunnel_id": 550, + "tunnel_net": "169.254.2.216/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "KTMkUG8WCw9FdH44jLMBpc1teGafnYL6SgP4fHHbsNM", + "tunnel_endpoint": "198.13.140.24" + }, + "FtnG9XaxGBQnjvJuzevUWExPKuLtENxBQ9p2vdX4pfro": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.175", + "dz_ip": "64.130.37.175", + "tunnel_id": 510, + "tunnel_net": "169.254.2.194/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj, 8J2yRE3q7EuosbnVn5w9uyVWVySKucDHsWht4hAb4CTJ", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.42.212.122" + }, + "EmYAgJx75VLfMqob1HvSRZBfVdfLQPpFyF89fqUxd8B1": { + "account_type": "User", + "owner": "rgh2ZRt5ejyQ7saSLPNmYXsNuqwvkn8jzEWWXoAWrhr", + "index": 12346, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.95.182", + "dz_ip": "107.155.95.182", + "tunnel_id": 512, + "tunnel_net": "169.254.0.10/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "gridqZmeBcsUKT2Mv4M9YFHFN3tVLFb2TCtTcLD1cAd", + "tunnel_endpoint": "0.0.0.0" + }, + "HHZETq7JjRG56NXvgFzmetHexa3Ut4hvvXQtk6b6KY7D": { + "account_type": "User", + "owner": "MicoB9cA9R6jsicdhzWFjwd9HMkV8FA4o3WxYU6Z2yz", + "index": 23605, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "104.204.141.165", + "dz_ip": "104.204.141.165", + "tunnel_id": 504, + "tunnel_net": "169.254.5.146/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "MicoB9cA9R6jsicdhzWFjwd9HMkV8FA4o3WxYU6Z2yz", + "tunnel_endpoint": "0.0.0.0" + }, + "DtVuP8UG9pXoWvZ2yiTbTWnUzryF8dePyFfKA5aAwaK6": { + "account_type": "User", + "owner": "APaEbMzPskbrJFESuNDj1AZuu6iQhQcWeP79kZjy19Nt", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.94.207", + "dz_ip": "148.51.121.71", + "tunnel_id": 558, + "tunnel_net": "169.254.10.136/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "MCFmmmXdzTKjBEoMggi8JGFJmd856uYSowuH2sCU5kx", + "tunnel_endpoint": "198.13.133.56" + }, + "G5SEMzL5EPE21Gwud42ZGiPVxvHXc7WGyqXvUq187897": { + "account_type": "User", + "owner": "Da6xRJqXLazx2g66nnMK5afW25zDughnejvu7cr1a461", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.130.223", + "dz_ip": "198.13.130.223", + "tunnel_id": 501, + "tunnel_net": "169.254.1.122/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FzQqaDStQQHs52YKeCnDovwSqvyZBCgs2kJcmvoFZwaS", + "tunnel_endpoint": "0.0.0.0" + }, + "ABB9LPYoxXRYLu5VbqVCsbSYVm4TjAkkLP5zbZK5tqhH": { + "account_type": "User", + "owner": "EEaFqAtZatV82VNVQVBBvPizxNmNxbvsvxUuvJMcDnA1", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "208.115.223.234", + "dz_ip": "208.115.223.234", + "tunnel_id": 502, + "tunnel_net": "169.254.7.100/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4TtHDPhgxXBVUK5Aox9HeW7LkonYHJw7z3gwyPVe43Rh", + "tunnel_endpoint": "0.0.0.0" + }, + "CHDAJzxzC2abG8odwGXQ6wGGoJ3jGnFfn7dLxyrNVEVg": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.35.107", + "dz_ip": "64.130.35.107", + "tunnel_id": 529, + "tunnel_net": "169.254.0.92/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.42.212.122" + }, + "6KTFQU3dtZVSUBbT56SXsyybREvgwKtAriL1daC6fkXb": { + "account_type": "User", + "owner": "mrgn4sJJu5GBa5wbKyjuASzhyCifvcedGoLtpKjB3Wf", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.53", + "dz_ip": "148.51.121.186", + "tunnel_id": 549, + "tunnel_net": "169.254.10.236/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "mrgn4sJJu5GBa5wbKyjuASzhyCifvcedGoLtpKjB3Wf", + "tunnel_endpoint": "198.13.140.16" + }, + "F1PqdDAx3HFHD6D8d5EPUawWELGsK11RNLbstinkqLRj": { + "account_type": "User", + "owner": "DWiFpqeR7vx5eUHvarJHJFN7q1LjN7SUU6wdDVWubyv2", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.32.198", + "dz_ip": "64.130.32.198", + "tunnel_id": 516, + "tunnel_net": "169.254.4.188/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "Bf8yTXX2yzkLYAVKsWtWB4vsGdNhAEUKZnBraikf8LRk": { + "account_type": "User", + "owner": "5BQPELVk7Lq1X3gcuvjcB1PH4auJU3PvmkEumHu6tEXJ", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.165.10", + "dz_ip": "148.51.120.170", + "tunnel_id": 505, + "tunnel_net": "169.254.8.52/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7", + "tunnel_endpoint": "79.127.170.81" + }, + "33anJcuLmTqKHk8cYx9ZgckUVFY97pZfjVu64MxTih4R": { + "account_type": "User", + "owner": "563VDfbQaPuGGGpFYJdXq8TycB7egBiS2CGDdbYCRe52", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.164.126", + "dz_ip": "148.51.122.29", + "tunnel_id": 511, + "tunnel_net": "169.254.11.96/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU", + "tunnel_endpoint": "67.209.55.56" + }, + "ZzkqiToiRoBVAzfZY5VkmfHQZgub7cq67a6MUhRMJL5": { + "account_type": "User", + "owner": "CWrQmiqkTKVkP2gZRjuX3n6ofYjhE98k5SgLn5AmPrZZ", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "141.95.45.179", + "dz_ip": "148.51.120.33", + "tunnel_id": 523, + "tunnel_net": "169.254.4.244/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "791bAJ31BxJmU3zVRY2FXmdcsyq6B2JSB2YX2KY72fkb", + "tunnel_endpoint": "193.28.105.130" + }, + "71g2xTb11LLd166nS7ChaEEEV367ExxFa3HEKcrYdiZY": { + "account_type": "User", + "owner": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.63", + "dz_ip": "148.51.121.209", + "tunnel_id": 547, + "tunnel_net": "169.254.7.92/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "tunnel_endpoint": "154.18.17.55" + }, + "AtwaNG2dfcBvEdsoEED7kgaZiEdb5N6oYJaBbg8WUSkc": { + "account_type": "User", + "owner": "SN5Zxu7W1dmHXeYMQC7BdZgWod3WQJuBvUqjTnp6L75", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.44.155", + "dz_ip": "148.51.121.253", + "tunnel_id": 564, + "tunnel_net": "169.254.2.208/31", + "status": "Activated", + "publishers": "7acopWYJ9asXNHKDyXCzaeu5LU91UVSBmPcx7gQSYtuQ", + "subscribers": "7acopWYJ9asXNHKDyXCzaeu5LU91UVSBmPcx7gQSYtuQ", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.56" + }, + "BWUQtpABJ9aPugjpY2mKijYien4sthK5qVNkjcLgrnCg": { + "account_type": "User", + "owner": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.223", + "dz_ip": "177.54.154.223", + "tunnel_id": 515, + "tunnel_net": "169.254.7.144/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ", + "tunnel_endpoint": "184.104.221.146" + }, + "G6Gsd3HyRdHjE1BHTnkex7gRPFy7tH7vN5Tfqw78sLbp": { + "account_type": "User", + "owner": "dztErxGYKG3KpxxxkKGSNpyTDSHtkCEMqTdQzzRCqNR", + "index": 0, + "bump_seed": 249, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.131.99", + "dz_ip": "198.13.131.99", + "tunnel_id": 503, + "tunnel_net": "169.254.2.46/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "67.209.55.56" + }, + "Dvfb3SQ4FvamxHrnWg55izJ4QBJHwrAyiEsc3umCe9Sg": { + "account_type": "User", + "owner": "5K9Tp8Nkg2KeGYyWCEAD3ajLM1Z1czhvgoZN7eAyWA2r", + "index": 0, + "bump_seed": 249, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.53", + "dz_ip": "148.51.120.247", + "tunnel_id": 510, + "tunnel_net": "169.254.6.204/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "MBVyz9s72WSfUmbr1S8fgHjDJQkPs1Q4Wxi6A2Mees9", + "tunnel_endpoint": "67.209.55.48" + }, + "VDVGmUc4NFwAxp7TNxuyD92inBW9x7rYTJ9Cp6tUau6": { + "account_type": "User", + "owner": "BUokhb8pPF9MZuzW3rHLr6jzakgcz3NDq2PZkpiVv3jb", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.40.157", + "dz_ip": "148.51.121.136", + "tunnel_id": 545, + "tunnel_net": "169.254.3.226/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "BUokhb8pPF9MZuzW3rHLr6jzakgcz3NDq2PZkpiVv3jb", + "tunnel_endpoint": "198.13.140.16" + }, + "6TtfQf9iYG7tb4toNZ4Dp7YXyJ15ptr9Fkvmp18bABS2": { + "account_type": "User", + "owner": "BsS2BWy1qeFLFsbahdzH3A5Sfo7DmMQqiYMbYdi4s5yt", + "index": 19719, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.75", + "dz_ip": "2.57.215.75", + "tunnel_id": 502, + "tunnel_net": "169.254.2.166/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3DaPk6TdeGnEBwTR8fEyZSLkdayk6vZXrqGZhAgYK8BV", + "tunnel_endpoint": "0.0.0.0" + }, + "3U3zdzCTV6kKNWA47VRwxsk3KzTW4WFdYTfJgCHqiHeH": { + "account_type": "User", + "owner": "BiGcsiuFCLuiTzXoQgfLdge9sfpwr55YzdT8Kp7bCXmS", + "index": 56525, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.83", + "dz_ip": "64.130.51.83", + "tunnel_id": 518, + "tunnel_net": "169.254.7.10/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BiGcsiuFCLuiTzXoQgfLdge9sfpwr55YzdT8Kp7bCXmS", + "tunnel_endpoint": "0.0.0.0" + }, + "3fbetrSTZZpTH6PTQ2ACMwpAfMzy7A1EnYdspZCXTbsS": { + "account_type": "User", + "owner": "8r64yqzdG7kAGxXGKuAC7rsg9Nw6at9FsvqHNF1fLQNd", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "70.40.184.60", + "dz_ip": "70.40.184.60", + "tunnel_id": 522, + "tunnel_net": "169.254.4.254/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "LFGGGJtnBLvq78DyMz1gTeedM6f8owck76qHThDABBC", + "tunnel_endpoint": "193.28.105.144" + }, + "9p8hX9q4LrY7kGzHjnddQ8bjoxHLzY4AhfKu1qTV1oNv": { + "account_type": "User", + "owner": "9aCLnHrqaAkebz1eDZMDer9EFJxrJcRZG6CnnNbwK3dV", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.40", + "dz_ip": "148.51.121.177", + "tunnel_id": 508, + "tunnel_net": "169.254.10.222/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "9aCLnHrqaAkebz1eDZMDer9EFJxrJcRZG6CnnNbwK3dV", + "tunnel_endpoint": "193.28.105.130" + }, + "Ar9ZLBCUNx3FphNHesJwJgyiisXaeBP2Txv8tUgk7iPZ": { + "account_type": "User", + "owner": "E8JKqZAQtYkWrBqx3H5eWWuky14Z8DNGwq61eqQ5wcp8", + "index": 4736, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "86.54.153.244", + "dz_ip": "86.54.153.244", + "tunnel_id": 505, + "tunnel_net": "169.254.3.0/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "J8AvzvWQWZHbmNq2ZNFwHyX2kDDk3WTBgg8ZHQujRThN", + "tunnel_endpoint": "0.0.0.0" + }, + "5qoVUjaUtJ4kAc2mkEiHE3hmTXWNR782A7QoztsCpMf2": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 0, + "bump_seed": 255, + "user_type": "IBRLWithAllocatedIP", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "174.138.55.92", + "dz_ip": "137.239.213.193", + "tunnel_id": 512, + "tunnel_net": "169.254.1.184/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "137.239.213.162" + }, + "3X3Kq3UjinsTxMiNbdhwmrcSpQZuKR11VKKhrQA6YWRM": { + "account_type": "User", + "owner": "6w8NdGszC9fqZU7eZHhNJEYACDKaFbC8aCbDcDRc1tBa", + "index": 57016, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "104.204.142.221", + "dz_ip": "104.204.142.221", + "tunnel_id": 503, + "tunnel_net": "169.254.7.60/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "E5UXkzUxqEXpeDf3WsrMZHTs2ZSSBpAz7G4hpGwgRGDT", + "tunnel_endpoint": "0.0.0.0" + }, + "JAcrvT5GCUEtBAtZzxheVkksAjEQfTDaUqMW4PkaE2cG": { + "account_type": "User", + "owner": "2X9nDc38gnCH2syJk6tXEq4NRb6XMXaZRre4TCm6UcGS", + "index": 13642, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.239.117.61", + "dz_ip": "64.239.117.61", + "tunnel_id": 508, + "tunnel_net": "169.254.4.198/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6ZMq3iZwg8gsnB4FgHv7AMN1MDZ38roj3Ch4Hz6F5wj1": { + "account_type": "User", + "owner": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.209", + "dz_ip": "72.46.87.209", + "tunnel_id": 530, + "tunnel_net": "169.254.1.236/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EaY74EbVZ6vAwPaPXnuxBb79dsFSTafzHbEm6kqBZRJA", + "tunnel_endpoint": "0.0.0.0" + }, + "9qHVG9xFqoqCJr8wr6NmCwppKJtRPsQEqbTnG6vJX6jz": { + "account_type": "User", + "owner": "FqytUw4CBkD9UEVkBff5RyB2veodrAbNpFXCnCLCzBiM", + "index": 0, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.204", + "dz_ip": "64.130.37.204", + "tunnel_id": 513, + "tunnel_net": "169.254.3.144/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4G3cnXii642riaMqreEMGo8yQGtQNsiaB5utMk6gsze4": { + "account_type": "User", + "owner": "GHUFsW8uJoHeD6BPvFZYYPD8WbTawRyxYeCpqjcaU5wi", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "202.182.99.41", + "dz_ip": "202.182.99.41", + "tunnel_id": 512, + "tunnel_net": "169.254.9.84/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8aAt1RTSxCw3ZqXwityS6gqW32PvMJJp5DPGUwtdwJQk", + "tunnel_endpoint": "213.248.92.111" + }, + "HKnMWWPdNgBRdGSpMcPUSPEDVx5XpVRRupE2kZUrQqrM": { + "account_type": "User", + "owner": "2Xehqi4LzAvnhh2Ef6KcA5dbHvRrszyN1vRE1kZsEMcb", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.172.126", + "dz_ip": "148.51.121.148", + "tunnel_id": 505, + "tunnel_net": "169.254.9.248/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "3psxMyr7rQzywVp1MXKd1XFmFz33NjydzCoJx9t2sMQW", + "tunnel_endpoint": "66.198.11.74" + }, + "EesKABVLYQrU6YyapZr2EKSLB6R1sHAFbaZhFpQx4WkJ": { + "account_type": "User", + "owner": "GwPAVRhXrQmgYhV5Vtn3eNzvCCJhaRjJnzh6x3oi44wT", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.80.81", + "dz_ip": "148.51.121.113", + "tunnel_id": 504, + "tunnel_net": "169.254.10.102/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "DCdTPyDbXNHrmdv4ZyPPzEfY4mPAqH4hDPtowAteoNgv", + "tunnel_endpoint": "137.239.213.192" + }, + "6xxuuAmBseD5ANa68JKfDesGdHgASpGPi1rX1cmPvE6F": { + "account_type": "User", + "owner": "3zLCNmt7Lhm2y44RW9YdZs6epmsDB8BazUUE2LXo9PzC", + "index": 31177, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "86.54.153.249", + "dz_ip": "86.54.153.249", + "tunnel_id": 506, + "tunnel_net": "169.254.6.12/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9wDoL3e2btwQyh44V8q3t1RnKoNRPpVmY2LRJtL8v3MD", + "tunnel_endpoint": "0.0.0.0" + }, + "E8d6sHT2bactGok5xsin83FocTPpxhKwqG5ht4reMTFh": { + "account_type": "User", + "owner": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.221", + "dz_ip": "177.54.154.221", + "tunnel_id": 514, + "tunnel_net": "169.254.9.36/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "tunnel_endpoint": "184.104.221.146" + }, + "5SvHVU6hhbShSfm72exHqynEhUxrwTGkxCEQNtetVw9W": { + "account_type": "User", + "owner": "GBzbTunYrMzcpeyJ6nwCUCupAbvEvE4xJPx9SXjAN1vC", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "207.148.65.229", + "dz_ip": "207.148.65.229", + "tunnel_id": 527, + "tunnel_net": "169.254.10.104/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "KAW1LjxH73tRBd1XsaqsRsgeERFkg4WpdXUSqR4QjkW", + "tunnel_endpoint": "154.18.17.55" + }, + "FXhQVpAzQ2h41CkNN2WnTP6v7G4Qd5KAbnZbHL3U66QA": { + "account_type": "User", + "owner": "BsS2BWy1qeFLFsbahdzH3A5Sfo7DmMQqiYMbYdi4s5yt", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.75", + "dz_ip": "148.51.121.8", + "tunnel_id": 545, + "tunnel_net": "169.254.1.2/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "3DaPk6TdeGnEBwTR8fEyZSLkdayk6vZXrqGZhAgYK8BV", + "tunnel_endpoint": "198.13.133.56" + }, + "FbA53XCscyQHiq8emmJNDBgSoBtshRM7ZKAdzJrE2tXX": { + "account_type": "User", + "owner": "ELGDsZJRUrpbC3uAEPcLMSWtTbRZwabig7R2fBxpwhBQ", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.35.123", + "dz_ip": "64.130.35.123", + "tunnel_id": 538, + "tunnel_net": "169.254.2.140/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EZfmTtmeomuwpyTCqHyHUnxjR59dTuNYrXY4EDtSz2Tx": { + "account_type": "User", + "owner": "8uB2AtLYxsC3HsVGc7h869MxFg8SRzj1oJ1zrdoULtnb", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.123.223", + "dz_ip": "67.213.123.223", + "tunnel_id": 525, + "tunnel_net": "169.254.8.196/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CBDXrujwebjw2icFkSAwut4hr4xeFh5Ckdz6UAL9HzWj", + "tunnel_endpoint": "198.13.133.48" + }, + "7a151QECuGRtpK9F5y1zcH7Pvop8eJ3SBDkDYhY1ixZi": { + "account_type": "User", + "owner": "4xPk1pHXPhDcyNCT6Ze2cHq8pWV96pKhxRKpy48q6Npv", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.50.130", + "dz_ip": "64.176.50.130", + "tunnel_id": 505, + "tunnel_net": "169.254.0.76/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2zykwzzo1pd3H2oSj5j5SRLTvmpa9Nr2S2Bh8tTVd5Tq", + "tunnel_endpoint": "0.0.0.0" + }, + "L44faeQ7VCVU3kVyvq3EQSNFbTLm59jWnLWPWPsmYrW": { + "account_type": "User", + "owner": "Ge43JZ12Z8t93Z6bWLn75VnMwE5ejJZrr7JBbDcGmBV5", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.59.168", + "dz_ip": "64.130.59.168", + "tunnel_id": 520, + "tunnel_net": "169.254.7.108/31", + "status": "Activated", + "publishers": "", + "subscribers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5jjFgqFhKapigPAHWZoizC5DJqU63owMvk5CJJPMTuWP": { + "account_type": "User", + "owner": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT", + "index": 14264, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.59", + "dz_ip": "67.213.122.59", + "tunnel_id": 501, + "tunnel_net": "169.254.0.148/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT", + "tunnel_endpoint": "0.0.0.0" + }, + "2TRCfRMStpc2npaGVXbfXdoNd5Cp8bfrMrMz45VJDf7s": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 46872, + "bump_seed": 255, + "user_type": "IBRLWithAllocatedIP", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "3.28.75.235", + "dz_ip": "184.104.213.177", + "tunnel_id": 503, + "tunnel_net": "169.254.6.178/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2PGv9zPbqc563M6vMukEWo4HNyxxWJneg2tTByEUphFM": { + "account_type": "User", + "owner": "6uw2MvDo5j1bqWimPBFUx3AFjUMSHdm9jZXw3uYyNEAU", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "185.191.117.155", + "dz_ip": "148.51.120.118", + "tunnel_id": 533, + "tunnel_net": "169.254.9.216/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "Ed9WjPnZfAXsPttcqxMwj94qsuXVRyBsyXnDkxFva2Zv", + "tunnel_endpoint": "198.13.140.24" + }, + "39LUEoFz2mJZycuWUt9jx5v9dagPzkQtw5Y6yXDTeu8y": { + "account_type": "User", + "owner": "8uB2AtLYxsC3HsVGc7h869MxFg8SRzj1oJ1zrdoULtnb", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.207", + "dz_ip": "148.51.120.249", + "tunnel_id": 532, + "tunnel_net": "169.254.9.30/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "BTGPbq4KuFENn4CKuaKGqkaDd3TJD3TEgtMjSrsZnMLb", + "tunnel_endpoint": "209.146.32.160" + }, + "DTJnnzWpwanxLCjJXou5XZUhwBZh7r6gzqDgn7HKtS3v": { + "account_type": "User", + "owner": "BgjpXdNJYN4KSp5X32HowKEj1A2eeBcqNSfwyojxj1KJ", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.44.152", + "dz_ip": "148.51.120.130", + "tunnel_id": 510, + "tunnel_net": "169.254.11.108/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "A23LfQn6khffj2hGhGfXr6P52W2pxrVcCaHVQLYQgiX2", + "tunnel_endpoint": "202.163.13.32" + }, + "Cnv5ZQBZo2jEnTteC9yES9aQwhufuYgmtKV6Pk4kLqU7": { + "account_type": "User", + "owner": "39WWybLfDXnmmhfSt4cqAmV7b9S81gFR5kgsJ2REWynv", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.133.78", + "dz_ip": "198.13.133.78", + "tunnel_id": 568, + "tunnel_net": "169.254.9.198/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CEL22Qx7p85qY6gmhCZaYJrrnynJitkVRMQo6qZdT8Ns", + "tunnel_endpoint": "198.13.133.48" + }, + "8Y5zmxABMYVUqR1Y9BE1geKFR83rxxUnnoHPRRYk9TQa": { + "account_type": "User", + "owner": "7k1qZSJCgtAey4Xz9RDUVzazXw1dNnYoHxjyUw3ZRjJu", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.51", + "dz_ip": "64.130.51.51", + "tunnel_id": 531, + "tunnel_net": "169.254.9.70/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ECeaWy82CxpeJQr3EG3XNmYXc9NrVeWDH5ag9Lt6TPVR", + "tunnel_endpoint": "4.8.126.96" + }, + "ASccDV3EUkjHJtCwRGwRQFtan5KjXGhu3uXQGqkKjwPW": { + "account_type": "User", + "owner": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "index": 34755, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.127.237", + "dz_ip": "45.32.127.237", + "tunnel_id": 520, + "tunnel_net": "169.254.6.24/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3GGvoEZXCmwhhJde6qC5h2iCWvZGNK5vdANTgvMttnow", + "tunnel_endpoint": "0.0.0.0" + }, + "6nqTAe8N7WxFmN1bFYLDcrKUuXzCZbUF4HSpzTUiDc5B": { + "account_type": "User", + "owner": "8dz6mnkZC5eavdkyvFAEGSvXdV8vDYtWmtYtj9GcESUG", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.52", + "dz_ip": "148.51.121.175", + "tunnel_id": 531, + "tunnel_net": "169.254.10.26/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "8dz6mnkZC5eavdkyvFAEGSvXdV8vDYtWmtYtj9GcESUG", + "tunnel_endpoint": "198.13.140.24" + }, + "5jajGgpuyZDy2PdebhNWqWxp2T4nyx7iSN32oFtULXEH": { + "account_type": "User", + "owner": "F6yUWFfTkqTYzbUhWLQsdjQAHMd49BmZUdj1gFNTWmCo", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.61", + "dz_ip": "148.51.120.245", + "tunnel_id": 521, + "tunnel_net": "169.254.9.20/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "DnQBmTJyLbBMgJYQLJDqJz25AJModNkyexL5LdVRGnG4", + "tunnel_endpoint": "67.209.55.48" + }, + "54sABLCuWXuwysHtvvK5XerhS4S2N1wPHE55HcbvBvUv": { + "account_type": "User", + "owner": "FzA4HijwuU4mtNBmKng9gVSL5oPHLKsRDFfR4CJqaSc2", + "index": 9386, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "cyoa_type": "GREOverDIA", + "client_ip": "91.134.83.81", + "dz_ip": "91.134.83.81", + "tunnel_id": 501, + "tunnel_net": "169.254.1.56/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GGX3BEoZDqjxcw4AbCdu62ZTMrkpSgmPt81oP2mVuZNS", + "tunnel_endpoint": "0.0.0.0" + }, + "9DS5DJ6XYq4QBLaCn4xapvRSsMfB2486fQDaN9G6oqBa": { + "account_type": "User", + "owner": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.221", + "dz_ip": "148.51.121.212", + "tunnel_id": 529, + "tunnel_net": "169.254.11.60/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "tunnel_endpoint": "184.104.213.176" + }, + "2AzmrkD8CkpQTLuuJwxvshMhctkNhJFw6GgvGq1JmvCz": { + "account_type": "User", + "owner": "9XBTSRHHGBmpV7E1m1mwo6xGwNctEnhGDdEAYWkz6YZs", + "index": 51449, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.130.186", + "dz_ip": "198.13.130.186", + "tunnel_id": 526, + "tunnel_net": "169.254.6.226/31", + "status": "Activated", + "publishers": "", + "subscribers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2zqKPeqm5KitDhPbQ5zGKsuJJD59z1v7JagAG79YMDzi": { + "account_type": "User", + "owner": "8QQLUdfQoZJphGFoVhkDsexsobirRtSNM1D1Z9TVtsYQ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "193.243.164.211", + "dz_ip": "193.243.164.211", + "tunnel_id": 515, + "tunnel_net": "169.254.0.182/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9pBHfuE19q7PRbupJf8CZAMwv6RHjasdyMN9U9du7Nx2", + "tunnel_endpoint": "0.0.0.0" + }, + "EUSze5ZqCaY188W18UWgUtmECRTjS4mMSRAmNf95UAD1": { + "account_type": "User", + "owner": "ZeRoXF8PpC1t7qfmqdthLdeS6gudnTqyHirSnE5ZzgR", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "192.69.194.82", + "dz_ip": "148.51.120.210", + "tunnel_id": 507, + "tunnel_net": "169.254.5.184/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "zeroT6PTAEjipvZuACTh1mbGCqTHgA6i1ped9DcuidX", + "tunnel_endpoint": "38.247.16.192" + }, + "FJuccavQgBzTgRh2ZqXWPnZdqJvPedNRHwpkNPS4mbuP": { + "account_type": "User", + "owner": "EptAhyDYcy6xDnqFTpb4zFxhTxNXrXkMXwyk8qTPYNqH", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.45", + "dz_ip": "72.46.87.45", + "tunnel_id": 550, + "tunnel_net": "169.254.7.254/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5", + "tunnel_endpoint": "209.146.32.160" + }, + "GWg8JJZumoxczrHeQuPFCiwWqEMn2Pt5KTTNF5k42rKV": { + "account_type": "User", + "owner": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.219.166", + "dz_ip": "148.51.120.183", + "tunnel_id": 526, + "tunnel_net": "169.254.8.108/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "J1XP9dzPzwqQGEBNwMHrE6EaG1aTpjEnS4WAtimDs1Zh", + "tunnel_endpoint": "64.124.32.192" + }, + "6Eb6ape65QQvuXqtB3DBXmGerGjcz7QFX62FYjaUEBfU": { + "account_type": "User", + "owner": "3X5nVJtKLednxS8PgM8Ln2TDHariuYJohUEXzWZAvCAt", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.163", + "dz_ip": "2.57.215.163", + "tunnel_id": 504, + "tunnel_net": "169.254.7.50/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9C55JWc5g1Ym9kPbDwL3ncQ4Y9115aJLXhYnC8xuHcTE", + "tunnel_endpoint": "0.0.0.0" + }, + "9LQgDZvSAgs8dcT6CZ6zuUhw4XN8XoCFdyMj8GWHTw9n": { + "account_type": "User", + "owner": "BLvUbmRVZGLzRTVE1DZL4LFdmCGytuizxStwtyhE3Pii", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "185.191.117.70", + "dz_ip": "148.51.120.238", + "tunnel_id": 507, + "tunnel_net": "169.254.8.226/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "81KFsTrzo6iFaA6otL3nJueok3YiBVyCwwiyAFEEKXcR", + "tunnel_endpoint": "198.13.140.16" + }, + "8wTEYVh689dM5U9WqFhKcRnCw2J7P1HNANKbu7NqF8RN": { + "account_type": "User", + "owner": "qmEXyFqyDkuxY3dPdbvFmsidcSs2tDyTFdvkHUVtLac", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.153", + "dz_ip": "208.91.110.153", + "tunnel_id": 504, + "tunnel_net": "169.254.4.190/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "64.124.32.192" + }, + "AMsX9H1jmfxBjyR1KRkTjZqDyBT8V5PrHSj3v1PjPxfe": { + "account_type": "User", + "owner": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.71", + "dz_ip": "148.51.121.133", + "tunnel_id": 526, + "tunnel_net": "169.254.11.88/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk", + "tunnel_endpoint": "67.209.55.56" + }, + "5xu5tiEH57TQAnqqEmYSbtWr79QS9Y44G5bchWYjNAtA": { + "account_type": "User", + "owner": "GgJ5XvybVPmBE3QUZPSqKtCmZAp29YqAUxkinBgTVUZo", + "index": 3374, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.7", + "dz_ip": "177.54.154.7", + "tunnel_id": 513, + "tunnel_net": "169.254.2.158/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DKSy9mQn63487j7oXHxqmykLEYUA3akTHm1QNPgDLGN8", + "tunnel_endpoint": "0.0.0.0" + }, + "E2X38AFLK6m94hTEFjGvTejLvQVbW6sCab3rEdPgJC8E": { + "account_type": "User", + "owner": "D7BoZgf1n3knySTHQ3SzMpacf1RCAfGGwggsX6FZZDXq", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.164.218", + "dz_ip": "148.51.120.169", + "tunnel_id": 502, + "tunnel_net": "169.254.4.184/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "DeXsDvvZzKhVux4YfDFE6p4acJLGzr8yKt5pSTjzZB8t", + "tunnel_endpoint": "152.233.14.224" + }, + "A1jrwwbtV8aFDFtXzxkKZuutDCkSeTqiPwiGf81X8FpQ": { + "account_type": "User", + "owner": "CC6j49ahgWCYWUZJkMjWaXY8qnEMFmiZkALLqxBWqJcD", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.196", + "dz_ip": "64.130.37.196", + "tunnel_id": 533, + "tunnel_net": "169.254.7.168/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "A33drE3wpK472z27uPmkq2jgnDkwvqrRFRbcBQ2WA56a": { + "account_type": "User", + "owner": "4SBNw6R5swH6QoeNs7x2VtAZ3xCCtqgptPD1qmyWkVNs", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.111", + "dz_ip": "2.57.215.111", + "tunnel_id": 537, + "tunnel_net": "169.254.1.200/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7AZ5mrZP4pZ84xYvfFvUQ34wkgW7krgftqTeEik9xa3U", + "tunnel_endpoint": "198.13.133.56" + }, + "GiijafgWenPqNF6JZ7avKd3DPi3NttnyMw18okK7tBxr": { + "account_type": "User", + "owner": "ooc9bBwcrSKVMWNCojjmvikh8NkSPSgRebm3DWMZeyP", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.144.120", + "dz_ip": "149.28.144.120", + "tunnel_id": 535, + "tunnel_net": "169.254.11.42/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "meshRrDTME9cL2FSQ9E56EncfkZ7vL8apwcCFsw3o6Y", + "tunnel_endpoint": "209.146.32.160" + }, + "ABGSM2eFSNUXyFzK3B6UeMAePjBp6NC6FqaJ4EGznrJw": { + "account_type": "User", + "owner": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "index": 14780, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "139.180.186.123", + "dz_ip": "139.180.186.123", + "tunnel_id": 516, + "tunnel_net": "169.254.1.186/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "tunnel_endpoint": "0.0.0.0" + }, + "EdmT2P2AeMejudnR5zBCssBKwsqacukD2HpQU7bZVwJb": { + "account_type": "User", + "owner": "HxmNg4kPUwGhGS7Z9EtdLQKG8Pd9VCg6cDtEsYXLEsoa", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "45.76.103.57", + "dz_ip": "148.51.122.42", + "tunnel_id": 567, + "tunnel_net": "169.254.11.158/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "43Am3PKFeo9cACpqYL5Sk95rpVdxLw3Mc22PqRqZXEW2", + "tunnel_endpoint": "198.13.133.48" + }, + "A4UjRr5coezMkG18wqQaWobkGFvDMqLeiGhpmoBWFJUG": { + "account_type": "User", + "owner": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.233", + "dz_ip": "148.51.121.73", + "tunnel_id": 525, + "tunnel_net": "169.254.9.228/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "tunnel_endpoint": "184.104.213.176" + }, + "Dgr1Jdbyz5jNMuWTdPAQmQZUFDAcWMn2CEEzQxjsRHfT": { + "account_type": "User", + "owner": "gangtCrQg5RmKf5yxvhvZThPugPX58pDSdQ5UuS26vN", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.140", + "dz_ip": "148.51.120.46", + "tunnel_id": 543, + "tunnel_net": "169.254.10.156/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "gangtCrQg5RmKf5yxvhvZThPugPX58pDSdQ5UuS26vN", + "tunnel_endpoint": "198.13.140.24" + }, + "FM28dimRCuii6S5E3UZBtBiCfr6RW3VPGduAfrGxHxrr": { + "account_type": "User", + "owner": "CbR25Feev2a6tzymtjEVofxiyPLmxBPsBvD5czJ5oMJc", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.86.125", + "dz_ip": "72.46.86.125", + "tunnel_id": 500, + "tunnel_net": "169.254.3.78/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4", + "tunnel_endpoint": "109.61.83.17" + }, + "8cqXftenZqwaGTA5pirYfRWoRTr28Cf94GAchM8WdD5P": { + "account_type": "User", + "owner": "J6etcxDdYjPHrtyvDXrbCkx3q9W1UjMj1vy1jBFPJEbK", + "index": 0, + "bump_seed": 251, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.138", + "dz_ip": "148.51.121.235", + "tunnel_id": 514, + "tunnel_net": "169.254.11.90/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj, 8J2yRE3q7EuosbnVn5w9uyVWVySKucDHsWht4hAb4CTJ", + "subscribers": "", + "validator_pubkey": "J6etcxDdYjPHrtyvDXrbCkx3q9W1UjMj1vy1jBFPJEbK", + "tunnel_endpoint": "137.239.213.162" + }, + "G7AV3LtoSPiGTrdV6MDuKs7ETj4hFAPAwhnuNK3btXJU": { + "account_type": "User", + "owner": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.127.237", + "dz_ip": "148.51.120.83", + "tunnel_id": 511, + "tunnel_net": "169.254.6.202/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "3GGvoEZXCmwhhJde6qC5h2iCWvZGNK5vdANTgvMttnow", + "tunnel_endpoint": "152.233.14.224" + }, + "GU2u2uuaQyc2ASQd7ZB9QWXMzM6s7592n723p2V5F6ox": { + "account_type": "User", + "owner": "DQES9jpMSPrf8jRrPL3XuPWWMjaj4vws99miY7C3BwKQ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.123.153", + "dz_ip": "67.213.123.153", + "tunnel_id": 527, + "tunnel_net": "169.254.8.86/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8Nvaxzif1NrdvxNkRetjT8xJvd33EHkKVrfL8EDkgaNy", + "tunnel_endpoint": "154.18.0.97" + }, + "C1XSw7iDhAxe7tY59TWLsjx9YLadAdnChFCfGsqefgiv": { + "account_type": "User", + "owner": "6RakzpEyJ8o7ad9Ywk9ntjeQo6P3tMtpFQzhAksrZ1aY", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.57", + "dz_ip": "148.51.120.228", + "tunnel_id": 508, + "tunnel_net": "169.254.6.198/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj, 8J2yRE3q7EuosbnVn5w9uyVWVySKucDHsWht4hAb4CTJ", + "subscribers": "", + "validator_pubkey": "14GtGcdikcK33tFBhedZ4rYTHcTpWveCxLXvR3Ydx9zS", + "tunnel_endpoint": "184.104.213.176" + }, + "6j7FF5B9RNTzexSVYC2WhbhzTyrsBq81GdVw2frWvADs": { + "account_type": "User", + "owner": "BNKS5rzaRhoikQbeYntbd6inE1PqecGhqDG5qvg3EEFj", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.207", + "dz_ip": "148.51.120.12", + "tunnel_id": 504, + "tunnel_net": "169.254.1.126/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "67.209.55.48" + }, + "pnatGQqMFEdsDsUJuDNZp2JyqmXUMhHqt4wJkZQ6f21": { + "account_type": "User", + "owner": "9NR8T2KaNPKSMaG1hQc7vqrgmkr7VBjqudDDUkTM5bQM", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "113.43.233.3", + "dz_ip": "113.43.233.3", + "tunnel_id": 503, + "tunnel_net": "169.254.2.28/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8AkVj5aAtJ27tYXeq89cnSf68V43NarFHMx2iSDjZv7c", + "tunnel_endpoint": "0.0.0.0" + }, + "Ech2saSFRpkKqXppK9YimC6qZHGjcAWjZ8Vov7yi1x7H": { + "account_type": "User", + "owner": "Fy7BRtoUrNpGfbegKvsnhst2DTqULvSjtt5X7vM5ogjc", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "cyoa_type": "GREOverDIA", + "client_ip": "144.202.29.140", + "dz_ip": "144.202.29.140", + "tunnel_id": 502, + "tunnel_net": "169.254.9.72/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "D8kuk3qEiVBGwYkuMGKfBDwuRi6jjRkzjAZg45fdaRLx", + "tunnel_endpoint": "66.198.11.96" + }, + "2S3LrAEK8hfyp3WyFPosdeHPkCTvbWaPch6tNE5RonSv": { + "account_type": "User", + "owner": "H4EgZdjpiidCnW9MWnfWYMfxsZtm8ET1EN9jcfhUXrNX", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.67", + "dz_ip": "148.51.121.34", + "tunnel_id": 533, + "tunnel_net": "169.254.11.18/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "2N7v8pDKDYhtBUJBQUgxvysUjgM9s4ULPCmeEiPWTf6Z", + "tunnel_endpoint": "152.233.14.224" + }, + "pxzehVrE8SfbXtszJiSYZLK4ZVqArquaDxVJ4AQuXCP": { + "account_type": "User", + "owner": "sEmKhLb1jfzajh6zqgs3ngYf8F7ovxzmgQL7oLnYv6v", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.165.35", + "dz_ip": "148.51.122.44", + "tunnel_id": 530, + "tunnel_net": "169.254.11.190/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "5ghoFEVrsXeAPB6SUmBpZ2xq3KvHEjNMeSaBnxEBXkHV", + "tunnel_endpoint": "67.209.55.48" + }, + "HtZeGkWk9RTzgsXAFfhyBVhwayf5ufNY6WPay1RY3Guu": { + "account_type": "User", + "owner": "DzFn1LG97hQczGVqcLHjjetnMoGyHG7KohJxwPRUxfQD", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "195.231.30.71", + "dz_ip": "195.231.30.71", + "tunnel_id": 562, + "tunnel_net": "169.254.5.118/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GxxXXKqA3gCodmbx5LyeHcZn4AcrVrgutLa4uZ68e6KY", + "tunnel_endpoint": "198.13.140.16" + }, + "6AoFCoorWrf337aGUaC5ojNgst2CHVjAsVba5ntusX7E": { + "account_type": "User", + "owner": "CVgQY4EdCUuMeMU1dxA56Azjm7HRCh5LyGecSe9b62fk", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.86.137", + "dz_ip": "148.51.121.169", + "tunnel_id": 537, + "tunnel_net": "169.254.10.194/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "avnujiRNoSRe9PcET42DPKznyfYnb2LRaZAsqv6REZo", + "tunnel_endpoint": "154.18.0.97" + }, + "3Y65Af5yy6WiWBkgJ3dhDGCmUZx3rdZvau7he1grnwM5": { + "account_type": "User", + "owner": "2YS4G384a65hrT4rLEwUxroLK3aiooHB6Xhyoj9A4YaL", + "index": 36552, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.49.100", + "dz_ip": "64.130.49.100", + "tunnel_id": 507, + "tunnel_net": "169.254.6.70/31", + "status": "Activated", + "publishers": "", + "subscribers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "HQMsRaQjqWBvfG1yztKJfhQNs1dk5tHvG2MWysoUmqdp": { + "account_type": "User", + "owner": "7b5VyivVaadtMkFDbqFVPm3NWywNFueVfoAzt3YMCoJB", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.94.205", + "dz_ip": "148.51.120.45", + "tunnel_id": 512, + "tunnel_net": "169.254.5.36/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "6maJ1mXF8jsH39a4yZffXzsshfVX4xPyYiyGk38PnBu8", + "tunnel_endpoint": "154.18.0.97" + }, + "4ExgyEkfw8F23yKwFjgNcN3FVuRSYLSq8yvKWSx7YuK5": { + "account_type": "User", + "owner": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "202.182.125.207", + "dz_ip": "148.51.121.108", + "tunnel_id": 530, + "tunnel_net": "169.254.10.84/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "5z7arq5GmM11pWz5TSxVVDfBugkWtaNRqgbJGGBWNQ6G", + "tunnel_endpoint": "154.18.0.97" + }, + "2XonSnZUtYmRhehmDi2XMKVwgk7Ha4Dgqn1ajGADVHVH": { + "account_type": "User", + "owner": "9UF7Jm92TjcbiAeKaog33mZ3stuynpQz3VQ2Ejkeok9C", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "173.231.44.202", + "dz_ip": "173.231.44.202", + "tunnel_id": 534, + "tunnel_net": "169.254.8.228/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "HNFk5BU6i45rQeiVvNQThvrnLVyBDMy85pFUhLso1wo7", + "tunnel_endpoint": "209.249.183.218" + }, + "2EBVGFr9MWMtG4owTNYHDJjbA3XiniQx2YPAMtJpQ6C3": { + "account_type": "User", + "owner": "3p1CHgXnD2czQegmip43guXdZ5Ncr73oMNH61hjxNYA6", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.83.99", + "dz_ip": "148.51.121.171", + "tunnel_id": 538, + "tunnel_net": "169.254.10.192/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4", + "tunnel_endpoint": "154.18.64.128" + }, + "ABgbDUkJpqFCnczgD1skJ6WG63WdPEtM11DTYfAdsVLC": { + "account_type": "User", + "owner": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "index": 0, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.26.61", + "dz_ip": "45.32.26.61", + "tunnel_id": 530, + "tunnel_net": "169.254.1.32/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EUDis6LJeJzDHTEBgfHGQyjHp63XZkGkx4E69xunC2Ej", + "tunnel_endpoint": "198.13.133.48" + }, + "9u6WFAhqGSiZTKkVoQDmLWhBuuHdeUvwRdYYZ1YEhF2i": { + "account_type": "User", + "owner": "6uw2MvDo5j1bqWimPBFUx3AFjUMSHdm9jZXw3uYyNEAU", + "index": 0, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "37.61.218.226", + "dz_ip": "37.61.218.226", + "tunnel_id": 520, + "tunnel_net": "169.254.0.218/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Ed9WjPnZfAXsPttcqxMwj94qsuXVRyBsyXnDkxFva2Zv", + "tunnel_endpoint": "198.13.140.16" + }, + "D89oQiUCzz2R8uGtGpxjkVk8tHVtMgyPaAa6PcY977Ru": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.107.71", + "dz_ip": "208.91.107.71", + "tunnel_id": 523, + "tunnel_net": "169.254.8.166/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj, 8J2yRE3q7EuosbnVn5w9uyVWVySKucDHsWht4hAb4CTJ", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "7xuPGJce44TUDnxVaVF1SskPpYyGACwx99iePWkw2sYQ": { + "account_type": "User", + "owner": "FmA9r56VrQGS61k76fXANcbXrT8KnB9dFRECH3moFh8q", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "167.179.99.201", + "dz_ip": "148.51.122.45", + "tunnel_id": 579, + "tunnel_net": "169.254.5.230/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "HnwMGBAw5PxaX56eSYc969MorEy2NzEMPLkmBkdnJmeq", + "tunnel_endpoint": "198.13.133.48" + }, + "J5eDDgQ3CbKaGzq51PoEXnUBc7mberTLv8e6GB6a9CZC": { + "account_type": "User", + "owner": "8uB2AtLYxsC3HsVGc7h869MxFg8SRzj1oJ1zrdoULtnb", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.207", + "dz_ip": "206.223.224.207", + "tunnel_id": 520, + "tunnel_net": "169.254.0.224/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BTGPbq4KuFENn4CKuaKGqkaDd3TJD3TEgtMjSrsZnMLb", + "tunnel_endpoint": "67.209.55.48" + }, + "6RnrkXtVEkEtX7BbqtRzASNkiZUfwszGRF3z4mdpNegt": { + "account_type": "User", + "owner": "7njDoDdCY4c8C71k8Egg9iTrwzXcMxceDcVN4bg5a42v", + "index": 30786, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "104.204.140.94", + "dz_ip": "104.204.140.94", + "tunnel_id": 511, + "tunnel_net": "169.254.6.0/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "fhsM2sxME8cHrrk3qvtMsRRDv5AoLFja7NjNnHeYZxe", + "tunnel_endpoint": "0.0.0.0" + }, + "DUEb2Wvu4GztC5SyKTt5WdGmyzJ8sRRLJXtm6jtAb9nG": { + "account_type": "User", + "owner": "4xPk1pHXPhDcyNCT6Ze2cHq8pWV96pKhxRKpy48q6Npv", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.50.130", + "dz_ip": "148.51.120.120", + "tunnel_id": 507, + "tunnel_net": "169.254.7.218/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "2zykwzzo1pd3H2oSj5j5SRLTvmpa9Nr2S2Bh8tTVd5Tq", + "tunnel_endpoint": "202.163.13.32" + }, + "5z6JoQb7iF28u9FVQqFgvktjyG34qJHruF1Ydj2SXbSJ": { + "account_type": "User", + "owner": "5eJnbUbn2cY21t31uWRUBLdmYkoAvuNRxWgugFJVtZvd", + "index": 3376, + "bump_seed": 253, + "user_type": "IBRLWithAllocatedIP", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "202.8.11.167", + "dz_ip": "209.146.32.161", + "tunnel_id": 514, + "tunnel_net": "169.254.2.162/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "ES39SV5RL4upK94g3p6bcBkQbYPDFMDDFgQnkEU1NNCV": { + "account_type": "User", + "owner": "DZiGTxgDvmBFiNYmukLHYePG2S4CRydoHjQ4kF6vtMJu", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.66", + "dz_ip": "151.123.174.66", + "tunnel_id": 546, + "tunnel_net": "169.254.8.218/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Stakex4B2tpDHPWGvV1dninfiaYCGdakgTknpzPitLh", + "tunnel_endpoint": "198.13.133.48" + }, + "5QiC1RWunzBtQF5oFcYWH64F57mKfqedUbP7DiyP6xX4": { + "account_type": "User", + "owner": "HFF3kp34qnL32vzc5f8nrffTAtudBetaLm4u8da6q5TP", + "index": 19706, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.60", + "dz_ip": "4.8.126.98", + "tunnel_id": 509, + "tunnel_net": "169.254.5.80/31", + "status": "Activated", + "publishers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "eRpEQGxU9vU2WCXf6FKLwMURymKgMMkde6CCmgK7wWb": { + "account_type": "User", + "owner": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.225", + "dz_ip": "148.51.120.106", + "tunnel_id": 516, + "tunnel_net": "169.254.4.22/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD", + "tunnel_endpoint": "184.104.213.176" + }, + "6CUb3TAV3SafYV7rCU8gD3b5WSqBFQSiAifWeb9cCtDz": { + "account_type": "User", + "owner": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.241", + "dz_ip": "148.51.120.165", + "tunnel_id": 502, + "tunnel_net": "169.254.8.84/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "tunnel_endpoint": "184.104.221.146" + }, + "Br8PkDatKfW9B6di2baYrmmvfUx6CttWvYdeqRVSByBP": { + "account_type": "User", + "owner": "C9dTbbWEdNeVZjqbnzZKB4DxfuLqWNVnr9mdZfCqBHKQ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.164", + "dz_ip": "2.57.215.164", + "tunnel_id": 522, + "tunnel_net": "169.254.8.14/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9NhyP9ZMKrFMJVFdJfrpVF62Rz4QJfCULmeYJJGqnhit", + "tunnel_endpoint": "198.13.133.48" + }, + "DETq4nWnwwJrfToxzQuSuY2F51bYoQp4ED1DQqTuxNLZ": { + "account_type": "User", + "owner": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.94.9", + "dz_ip": "148.51.120.141", + "tunnel_id": 518, + "tunnel_net": "169.254.8.2/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "tunnel_endpoint": "198.13.133.56" + }, + "HphVbqcMT72aVmE245278yfzjGpzMVhFpUWvNeFj9PEV": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "202.8.9.28", + "dz_ip": "148.51.120.100", + "tunnel_id": 573, + "tunnel_net": "169.254.9.18/31", + "status": "Activated", + "publishers": "GbgDsQDhjxdRAzRWgj8KKMqFLiuEPvmQK6H7mSP3uRtZ", + "subscribers": "GbgDsQDhjxdRAzRWgj8KKMqFLiuEPvmQK6H7mSP3uRtZ, 4UjgqgwyAmq1m7BRaWpfjcpKHPueRN4nunNQU97UoCDv, 31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "Hg4kPtYmXhuQcAn2aUKKfMLUAH1aMRUpQ8Q12vAXYXQ8": { + "account_type": "User", + "owner": "ESwi4y2meazsbLz1WaSx3vy1MCnenL8NsFKq77vNXp1T", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.123.149", + "dz_ip": "67.213.123.149", + "tunnel_id": 515, + "tunnel_net": "169.254.7.236/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CLsFr1KZVbAyz16iFpwg2e4hiekR1unpwyxfNdjBMaoE", + "tunnel_endpoint": "198.13.133.48" + }, + "61m1vCJLWnjmXcwH9eJ5jbxzMJmCZitozyUYT5s943UB": { + "account_type": "User", + "owner": "GWGHaRxKTHhQMkiEocBzdaD82Ds2X9kRcGrUosK8TyDB", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.194", + "dz_ip": "151.123.174.194", + "tunnel_id": 550, + "tunnel_net": "169.254.10.76/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU", + "tunnel_endpoint": "198.13.133.56" + }, + "8hb6zwvyWR7dug14XHmiBgUEMdtT9uddxz6U1XSG5W5R": { + "account_type": "User", + "owner": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.243", + "dz_ip": "177.54.154.243", + "tunnel_id": 505, + "tunnel_net": "169.254.1.84/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "tunnel_endpoint": "184.104.213.176" + }, + "AHmnPDEsD3JdvLHYQ74TBmqtDBJzk5sCUiP5JNx77vdA": { + "account_type": "User", + "owner": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.242", + "dz_ip": "151.123.174.242", + "tunnel_id": 549, + "tunnel_net": "169.254.0.46/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2QEzJ7KPvhvnhLFw4Qc4wQYg8hpFtVxmyweys6kKA4FB", + "tunnel_endpoint": "198.13.133.56" + }, + "2vmxQ7Sf7LeLevr1QWdMxYFs2Qyjtd8WrgYjAYj3cJ8h": { + "account_type": "User", + "owner": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "66.42.34.34", + "dz_ip": "148.51.121.25", + "tunnel_id": 559, + "tunnel_net": "169.254.9.204/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "tunnel_endpoint": "198.13.133.48" + }, + "8FP2wXWNanyjo3pmBLByfJQ1hRkYPRWhpo4bLxE283tJ": { + "account_type": "User", + "owner": "4jYF1T4CKKTubyzRqHzAtdmKg6BQjYDGurt42E6kTyfr", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "207.246.84.247", + "dz_ip": "207.246.84.247", + "tunnel_id": 535, + "tunnel_net": "169.254.5.108/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5ysfTZ42VT1TjnjzQShZSrix7wdVtjXwssocSeYKDs5d", + "tunnel_endpoint": "64.124.32.192" + }, + "9ZuL8cxNmDpjhZJxqsscsMKZsBX5zU4ZnMJW5fTaKWEw": { + "account_type": "User", + "owner": "SLAY6uN1zZpXBTfbuDDCesNmM5D288xrz8uYvfS3n41", + "index": 50719, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.159.47", + "dz_ip": "177.54.159.47", + "tunnel_id": 501, + "tunnel_net": "169.254.3.14/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SLAY6uN1zZpXBTfbuDDCesNmM5D288xrz8uYvfS3n41", + "tunnel_endpoint": "0.0.0.0" + }, + "DsuYHgXTtigLjALdEarPHVJiEjjoewgV7g4DrRqc5gxb": { + "account_type": "User", + "owner": "2ziQRMDYEPGoiTvxKJVbC3mfGofNQxHk4Q4SMYs9vzcD", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.94.243", + "dz_ip": "148.51.120.38", + "tunnel_id": 509, + "tunnel_net": "169.254.4.96/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ", + "tunnel_endpoint": "198.13.133.48" + }, + "8npZv3e4j3EFLL3QeYkbAX8tBpYPXz6arByyo9vQqG4k": { + "account_type": "User", + "owner": "MicoB9cA9R6jsicdhzWFjwd9HMkV8FA4o3WxYU6Z2yz", + "index": 23612, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "104.204.141.184", + "dz_ip": "104.204.141.184", + "tunnel_id": 505, + "tunnel_net": "169.254.5.152/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "MicobNSLg56V1PYTuKcbxnjfBa7Cqqq9pS6zvTF3cno", + "tunnel_endpoint": "0.0.0.0" + }, + "8HrAMatox2jCJsDmNztooHKtUwmDhe2cGvGEaomAH6ta": { + "account_type": "User", + "owner": "CYuUvZkUYdAZqzgjvk13Y6Z14hgnaD2ysiun4trmRjFu", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "103.244.113.94", + "dz_ip": "148.51.120.239", + "tunnel_id": 530, + "tunnel_net": "169.254.8.232/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "RAuSNo4DRjo83uGhdgg4fPqYBVszi1KsrQGpqcPHK1D", + "tunnel_endpoint": "154.18.17.55" + }, + "8cYuBfjUDSLkxxa2bwESHfrCLPFb2Mc1KewM1pGyx6yA": { + "account_type": "User", + "owner": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "index": 0, + "bump_seed": 249, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.243", + "dz_ip": "148.51.120.94", + "tunnel_id": 510, + "tunnel_net": "169.254.7.44/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "tunnel_endpoint": "184.104.221.146" + }, + "48JiVeNJMgr1yJ5XCH6usD3KJkZPU2wr5pNERi78Y2PK": { + "account_type": "User", + "owner": "FPFXq9ZjDPwhuEHVR2UwbkfiuELYGUVuPv19Xn5Uh9N4", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "15.235.236.119", + "dz_ip": "15.235.236.119", + "tunnel_id": 508, + "tunnel_net": "169.254.0.238/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3icve82hvXEquWEWg2sVKReFXSak2NVxaSTTjP44qKTs", + "tunnel_endpoint": "79.127.170.81" + }, + "6sB3qZS5GJqzi88FkKg4niieTeMiSNJnYT3WXTmYsjHv": { + "account_type": "User", + "owner": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.63", + "dz_ip": "206.223.224.63", + "tunnel_id": 531, + "tunnel_net": "169.254.10.128/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "tunnel_endpoint": "152.233.14.224" + }, + "GD9fa2ytuDtgQABqa5SQW36jzBjhcAmrfWo6uH34u1eK": { + "account_type": "User", + "owner": "UMiZdCdPPeqEDp2KKozxdu1u4LVfihkfxp6Gjw2NPUZ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "70.40.185.181", + "dz_ip": "70.40.185.181", + "tunnel_id": 519, + "tunnel_net": "169.254.1.188/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ZS2auPWueJsZcBaYimynDTxEYaNBX9S4icbbUWKreLN", + "tunnel_endpoint": "0.0.0.0" + }, + "3a6dsJ3k3PsSe5ea2XB1FbjybEsFbp9FgvE4hxBVm2Ra": { + "account_type": "User", + "owner": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.94.9", + "dz_ip": "64.34.94.9", + "tunnel_id": 517, + "tunnel_net": "169.254.1.62/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "tunnel_endpoint": "198.13.133.48" + }, + "GSXUocJrqdSBojNZTdXgf16R59PBVENaKSsapbxr1e5X": { + "account_type": "User", + "owner": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.60.122", + "dz_ip": "148.51.120.154", + "tunnel_id": 525, + "tunnel_net": "169.254.8.26/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "BNtHBLo1L2vAG7PBQ6mJvWz7GqVPxBnioXsY2Gjtubrg", + "tunnel_endpoint": "154.18.64.128" + }, + "AKL1swiVFcxVKKvhNAsvdbGhV6CYnKm7B7UhijiwGkCF": { + "account_type": "User", + "owner": "Hca2MvF3AjbhUuuZnxqs1i1HyPVcHfN3L56cDcKnT8cM", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.40.217", + "dz_ip": "64.130.40.217", + "tunnel_id": 528, + "tunnel_net": "169.254.5.250/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "Di4rYxQDco4juUQzx36MPA96148foY16JiXjmnkWMao7": { + "account_type": "User", + "owner": "E5SLYWttYhTo393ag7rt1RhbxyTDvwB6dvQA2irDhyro", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "88.216.36.3", + "dz_ip": "88.216.36.3", + "tunnel_id": 559, + "tunnel_net": "169.254.4.124/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9q16BB7WGmBxf1nJTdxH5zPnBUhtHqdqXqRFjSjuM4k7", + "tunnel_endpoint": "198.13.140.24" + }, + "EcqD8ze2w7kKwC1eCNRVirRxtxWGB1ekNx9rrab22D54": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.162.58", + "dz_ip": "63.254.162.58", + "tunnel_id": 565, + "tunnel_net": "169.254.6.60/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "8wKqaJ355zsb9DXH61aLFzetLYURRkj38qTFMi2kbZe6": { + "account_type": "User", + "owner": "HoD9f8qmxEW9jXgLawE3zdWCPLKBbGCrL9Y1q4xXWxsj", + "index": 0, + "bump_seed": 251, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "207.148.31.63", + "dz_ip": "148.51.120.144", + "tunnel_id": 522, + "tunnel_net": "169.254.8.22/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "AdSHK6vpQnwHRSw7jXUwjMEytmhFwnynZSENhvpAxL1y", + "tunnel_endpoint": "209.249.183.218" + }, + "EQBQ3fWFLNc2SNjHsNXn5L3Widu48mth95Tk6Z5QbYj3": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.44.135", + "dz_ip": "64.130.44.135", + "tunnel_id": 575, + "tunnel_net": "169.254.7.206/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "9FsEePinkBkH25ARvEytwDy5CpSF2uDu7vKxw3wZMNRA": { + "account_type": "User", + "owner": "CWrQmiqkTKVkP2gZRjuX3n6ofYjhE98k5SgLn5AmPrZZ", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "51.89.11.197", + "dz_ip": "148.51.120.34", + "tunnel_id": 510, + "tunnel_net": "169.254.5.60/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "6M53yM6dsE6hiaHgxWvYa4fsfzQTGyAZn7rM6JrzbqJV", + "tunnel_endpoint": "193.28.105.144" + }, + "4NixSEXsXUrvDikn4pLkF33e5omoRRtyVJ9v8ULnWpqB": { + "account_type": "User", + "owner": "DrtYc35tpe3ZKiVfLtR8gio8YZSb8aQotZbKoKLthTM", + "index": 0, + "bump_seed": 250, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.140.81", + "dz_ip": "148.51.121.119", + "tunnel_id": 538, + "tunnel_net": "169.254.9.222/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "3SmNAy18exGMiwmVEg38B5Uq7hLqVuTfwuo1uMcdk36b", + "tunnel_endpoint": "198.13.140.16" + }, + "HkTqUJ4LWUP86ZuDT4V1wPa7fCYyTWsRFLiCxhUeixba": { + "account_type": "User", + "owner": "221AUvGiUry1aeMzCHghgakdFHcaWQsqDisyoZSjR3Vi", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.218.125", + "dz_ip": "64.176.218.125", + "tunnel_id": 518, + "tunnel_net": "169.254.4.146/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ASPKrcFM9M27cHcbuuuJddxPumowE1izViRsNehVjqAb", + "tunnel_endpoint": "209.249.183.218" + }, + "hKV8LrJC1tLmHVfXUez2isqoLd7LR6drF2Qh3UyQ4Q4": { + "account_type": "User", + "owner": "9zDKGXz7QmA1EcSLpFdcgpPsb45ArYY35ps985hP3ZkT", + "index": 20254, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "202.8.9.19", + "dz_ip": "202.163.13.33", + "tunnel_id": 500, + "tunnel_net": "169.254.5.54/31", + "status": "Activated", + "publishers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4ujxzx8CemY1zs7oFWjxjF9iqXBwTiDc8ymyHMMp4S8b": { + "account_type": "User", + "owner": "oWPCJQUE4QP4ii1oCSLmryBaVy4sNyN1NVj16TZtyDe", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "139.180.132.226", + "dz_ip": "148.51.120.27", + "tunnel_id": 509, + "tunnel_net": "169.254.5.14/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "bookoVmqw4QjVj5BbkFacouadx9M7816wyRkfM7A5Lo", + "tunnel_endpoint": "79.127.170.81" + }, + "GScei2EQ5nnX946ooCv75ReVW6aLpgQk9gGsYhY24w1y": { + "account_type": "User", + "owner": "GgipuMTLa5cuEkmjxYeyMLPZ7vekkxFJqoHcakxjrtJm", + "index": 0, + "bump_seed": 248, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.141", + "dz_ip": "148.51.121.55", + "tunnel_id": 533, + "tunnel_net": "169.254.11.12/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "841mxTUmRDKdN5mes8Kf3VMctk8rcefnD4aBuaPeUNoU", + "tunnel_endpoint": "209.249.183.218" + }, + "Dug2ssQRLyzeM19fZaFC3kZuHPgnLBtTevdNAvEGBCgA": { + "account_type": "User", + "owner": "FPFXq9ZjDPwhuEHVR2UwbkfiuELYGUVuPv19Xn5Uh9N4", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "15.235.231.135", + "dz_ip": "15.235.231.135", + "tunnel_id": 507, + "tunnel_net": "169.254.3.198/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DSRVdh9PQaqAcFtMCbJhyD4yMD5H2EeHNzdbqWctRY4E", + "tunnel_endpoint": "79.127.170.81" + }, + "D4JhqncazKAhUjStfERC99Vs7o9xSZLsxcsRQvfmTzDk": { + "account_type": "User", + "owner": "7tLqkoYrPgUXyAr5VQuHUX4gz5i4UXkWRt3fsn86NLab", + "index": 27998, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "207.90.227.252", + "dz_ip": "207.90.227.252", + "tunnel_id": 505, + "tunnel_net": "169.254.4.178/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9wiLkM3hZL2RNjBt3zB81ycQMHYUz5tugt8QuXmqqfMT": { + "account_type": "User", + "owner": "DzFn1LG97hQczGVqcLHjjetnMoGyHG7KohJxwPRUxfQD", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "195.231.30.71", + "dz_ip": "148.51.120.156", + "tunnel_id": 539, + "tunnel_net": "169.254.3.92/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "GxxXXKqA3gCodmbx5LyeHcZn4AcrVrgutLa4uZ68e6KY", + "tunnel_endpoint": "198.13.140.24" + }, + "AR1CNphWJXLb191o4u5qNjtJiJMfbXKrr9scbtncHahe": { + "account_type": "User", + "owner": "C9dTbbWEdNeVZjqbnzZKB4DxfuLqWNVnr9mdZfCqBHKQ", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.164", + "dz_ip": "148.51.120.224", + "tunnel_id": 527, + "tunnel_net": "169.254.8.140/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "9NhyP9ZMKrFMJVFdJfrpVF62Rz4QJfCULmeYJJGqnhit", + "tunnel_endpoint": "198.13.133.56" + }, + "5qDDhu9qyNSGLRCgXFBMj97dL9rygmxT4F8nxceMtjgs": { + "account_type": "User", + "owner": "HxmNg4kPUwGhGS7Z9EtdLQKG8Pd9VCg6cDtEsYXLEsoa", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "45.76.103.57", + "dz_ip": "45.76.103.57", + "tunnel_id": 524, + "tunnel_net": "169.254.11.124/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "43Am3PKFeo9cACpqYL5Sk95rpVdxLw3Mc22PqRqZXEW2", + "tunnel_endpoint": "198.13.133.56" + }, + "F4ayyrKjHnQ1s4eDW1k8pWcq1koshYZ2gcBepYdSaDRb": { + "account_type": "User", + "owner": "vzzAePScm8ZV5oTnKCmLW2ZPGETo9nt2BXhgvoELM9R", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.11", + "dz_ip": "148.51.120.209", + "tunnel_id": 524, + "tunnel_net": "169.254.8.214/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "GvfaiJUhNCRZGVGumsEF1eHDb8JpAeFAyHSrTifyhrbt", + "tunnel_endpoint": "79.127.170.81" + }, + "7FKrTummECbHzUFpsXPqSg1Rn4rf6qTp19prgf39Tm8M": { + "account_type": "User", + "owner": "HRGp1ti5YvjHy5BBSxq8g35yZwotwMi1zLQRv45pKUdx", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.238", + "dz_ip": "151.123.174.238", + "tunnel_id": 501, + "tunnel_net": "169.254.6.120/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "dddkpiYSdXFPQi59vvQC2FpxM71noMzVTWwDtrFP9op", + "tunnel_endpoint": "180.87.28.6" + }, + "ALnmsUnkyUhkpAsWLUjWWHABNUxiLBTuH93aBEqPc3Qj": { + "account_type": "User", + "owner": "sTEAKPk59EtPPbixCweyv6oRLNCDEE8pnnef6gUfbiW", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "23.252.121.118", + "dz_ip": "23.252.121.118", + "tunnel_id": 502, + "tunnel_net": "169.254.10.58/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BYYyjVc6tv9mFsZ3Y7dMLaqfHQMXjUx5aeudhTXtc6sD", + "tunnel_endpoint": "137.239.213.162" + }, + "3WtF4sYN2CYkCZgsAJTUJjNMzMBcnMygEmnjTX5xsMhU": { + "account_type": "User", + "owner": "2hSiAzofh9P9GA9EmuysCHKqGMYMpp8iASssVaWYW7gw", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "51.89.11.213", + "dz_ip": "148.51.121.50", + "tunnel_id": 514, + "tunnel_net": "169.254.9.162/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "7mF8NZJdREuM1uwYcvKffuY9QJBEoHhNp4hZ4NS2fuXW", + "tunnel_endpoint": "193.28.105.144" + }, + "5EBuv8FDwnQukGHX9UdhyRGi3EiDscmAMbxmLntw3MZS": { + "account_type": "User", + "owner": "J7TsyAisqTqWGDvLGZxNtGNSR93M4hq8QXmAD3qtPnFi", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.251", + "dz_ip": "64.130.37.251", + "tunnel_id": 519, + "tunnel_net": "169.254.7.88/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EqaZQqp14CAPzdhwua42T7A1VcxV8w3GMiBgRSzv1WBd": { + "account_type": "User", + "owner": "EUzFVhfJwSSbovn69Phoyy2fJQ86x6E9B8fDmmv6p2gt", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "45.250.255.183", + "dz_ip": "45.250.255.183", + "tunnel_id": 513, + "tunnel_net": "169.254.0.84/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "154.18.64.128" + }, + "Bgm1cyg3zTTCtL7R8W7yNBHQqhc2baRYrGSXEEttWE9m": { + "account_type": "User", + "owner": "CbR25Feev2a6tzymtjEVofxiyPLmxBPsBvD5czJ5oMJc", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.86.125", + "dz_ip": "148.51.120.40", + "tunnel_id": 504, + "tunnel_net": "169.254.3.160/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4", + "tunnel_endpoint": "154.18.64.128" + }, + "BEUwP4p5ANxamhFawhL5ncrrexTTjK9aaKXR5KqJfJ8t": { + "account_type": "User", + "owner": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.241", + "dz_ip": "177.54.154.241", + "tunnel_id": 515, + "tunnel_net": "169.254.8.76/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "tunnel_endpoint": "67.209.55.48" + }, + "wdeda2f2eFn3tnVzRuAVKL9YySMJGzeUnAgDr2aaNxt": { + "account_type": "User", + "owner": "7NCw54YgSSfNh6FMvDrnnXZQkCs8VQbSAy3MnfFhA7EW", + "index": 24485, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "cyoa_type": "GREOverDIA", + "client_ip": "165.140.84.150", + "dz_ip": "165.140.84.150", + "tunnel_id": 501, + "tunnel_net": "169.254.5.174/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "HW4zorvt6xDwhU36RqjcWNwU8YMj9tiqnAafBKW4cqV", + "tunnel_endpoint": "0.0.0.0" + }, + "EsZXEVxF4gu5cCtpz45rsUC5jZ7YN6GbrkwFB8YzRQbX": { + "account_type": "User", + "owner": "AgTYKsWVqgva4P6XRVZy1n8wsbExqVTaot3n4XnzkiSh", + "index": 6530, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.153", + "dz_ip": "45.139.132.153", + "tunnel_id": 502, + "tunnel_net": "169.254.2.224/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EtoMApqP2h1vVm9XLTTp5HERNezm5btkqrdAGQ9fZRnp", + "tunnel_endpoint": "0.0.0.0" + }, + "5LU8jfoFpNYygQGKAcjRV4Jevzbi3ARTw2VRRcUK29HE": { + "account_type": "User", + "owner": "A7nii4QwFSUaz8zCbiy1xFaapnJTYxLLVVWj9TvaFYC4", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "104.243.45.75", + "dz_ip": "148.51.121.140", + "tunnel_id": 511, + "tunnel_net": "169.254.0.64/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "62cCknMX3Pi3rUTiTt5JtmeYxRWQLuE9M6fyrwTeUYoE", + "tunnel_endpoint": "64.124.32.192" + }, + "HxZUBS6oGdddjdVZgqCqzhvmwMG4wjMyapWrQvF37rEA": { + "account_type": "User", + "owner": "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE", + "index": 1608, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "cyoa_type": "GREOverDIA", + "client_ip": "95.67.53.214", + "dz_ip": "95.67.53.214", + "tunnel_id": 513, + "tunnel_net": "169.254.1.96/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE", + "tunnel_endpoint": "0.0.0.0" + }, + "94KmMbPmfZCxcdVg4YjGDNutCtGZiStNdq1bjkVnrQk8": { + "account_type": "User", + "owner": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn", + "index": 23512, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.135.254", + "dz_ip": "45.139.135.254", + "tunnel_id": 502, + "tunnel_net": "169.254.2.122/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BH6aHw9y4Ejes5KdPYA3ezwERCvJd2zMzGLKze45kfy3", + "tunnel_endpoint": "0.0.0.0" + }, + "FaUnaVQWCqAAL8a3dXDUnP6MVcLsV6dWNciKmmCcdJ3j": { + "account_type": "User", + "owner": "9NR8T2KaNPKSMaG1hQc7vqrgmkr7VBjqudDDUkTM5bQM", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "113.43.233.3", + "dz_ip": "148.51.120.246", + "tunnel_id": 506, + "tunnel_net": "169.254.9.24/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "8AkVj5aAtJ27tYXeq89cnSf68V43NarFHMx2iSDjZv7c", + "tunnel_endpoint": "202.163.13.32" + }, + "5toH83zd9TB8oHk446ojHvmuNorwH587dgFW2JXcgTCm": { + "account_type": "User", + "owner": "sEmKhLb1jfzajh6zqgs3ngYf8F7ovxzmgQL7oLnYv6v", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.165.35", + "dz_ip": "5.199.165.35", + "tunnel_id": 529, + "tunnel_net": "169.254.11.164/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5ghoFEVrsXeAPB6SUmBpZ2xq3KvHEjNMeSaBnxEBXkHV", + "tunnel_endpoint": "67.209.55.56" + }, + "4LwtYC3xiJEnde7WC4FYEy7UKrYh5AnPpZCJKWu7U252": { + "account_type": "User", + "owner": "4yA8G3Hk9EjFEvu4fU13DG4AG9YJTtGqFqTSxUf2CpUa", + "index": 0, + "bump_seed": 251, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "15.235.232.94", + "dz_ip": "148.51.120.35", + "tunnel_id": 510, + "tunnel_net": "169.254.5.140/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "AZMpyiKtWPcNbU4Cm9RNGki9dpHhjfNpaWMu1jFk5vVo", + "tunnel_endpoint": "152.233.14.224" + }, + "3Z6UL6VtY6i8MaWwey4VKt5msuaLJqtoNgH9XhRkU85B": { + "account_type": "User", + "owner": "8qLB45QTdhZnfVpdzGY4dCcMPMpxWt4nov6WB5BP5K77", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "70.40.185.69", + "dz_ip": "70.40.185.69", + "tunnel_id": 513, + "tunnel_net": "169.254.2.202/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3BeharBd3j4sKQp7Qze27JLQLd9AEEwGTX9TC7dXYSNw", + "tunnel_endpoint": "193.28.105.130" + }, + "CWnyBGYFH1g9jxRVGM8DSdopBrHCCubrrML7DDDRFrvH": { + "account_type": "User", + "owner": "dzmTjnSdbPhsVPFcJVsnr6DvkrmUkrvzhXLqxHXPwoU", + "index": 1219, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.19", + "dz_ip": "64.130.51.19", + "tunnel_id": 502, + "tunnel_net": "169.254.0.142/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "dmycoyQrZsMbW3xUtAUkRVTQVDUsBMbjruvmoX5b9v6", + "tunnel_endpoint": "0.0.0.0" + }, + "3hdGHUZCTSnLyBpgpRucDtx1JQJdQa85pNsimQQfDbuT": { + "account_type": "User", + "owner": "A4hyMd3FyvUJSRafDUSwtLLaQcxRP4r1BRC9w2AJ1to2", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.59.234", + "dz_ip": "64.130.59.234", + "tunnel_id": 536, + "tunnel_net": "169.254.11.0/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "A4hyMd3FyvUJSRafDUSwtLLaQcxRP4r1BRC9w2AJ1to2", + "tunnel_endpoint": "4.8.126.96" + }, + "4jQsBH4dcNLZfLSy84SmUX54QFbXvL5UFBUpdTj8AoQy": { + "account_type": "User", + "owner": "GUeWVMZJF72Ds3fLkRPtH9ohHqz9bPPLbBoa1ByU2yVk", + "index": 28094, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.44", + "dz_ip": "208.91.110.44", + "tunnel_id": 511, + "tunnel_net": "169.254.5.252/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CaveyttUBTKttncu1e4RF814XjuoGfYv8cEsiKGDNCPX", + "tunnel_endpoint": "0.0.0.0" + }, + "9NSvTAUko3eLFSo2XM4WXemwXtvCHV4T7hHgGKrKPDCx": { + "account_type": "User", + "owner": "DZLHDYqJGfSqfT7n5GxBY1cDw7iFFSeWeD2Zy4aKZTMZ", + "index": 16824, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.220.116", + "dz_ip": "45.77.220.116", + "tunnel_id": 500, + "tunnel_net": "169.254.5.22/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Dp2mPDpGNBb8nLBNWZve48LrHFiUUEXCAENZYN7VqNvj": { + "account_type": "User", + "owner": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "cyoa_type": "GREOverDIA", + "client_ip": "154.16.171.107", + "dz_ip": "154.16.171.107", + "tunnel_id": 500, + "tunnel_net": "169.254.3.64/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "93gu5F4pAh7Af1PU2QC5umWk1owr6NHDAJiQ9jWsBwoU", + "tunnel_endpoint": "216.200.133.128" + }, + "8ehTCj1Cyn4J9GRWZHWFbsjaNVpDwCKSYgYU8CC2JCKJ": { + "account_type": "User", + "owner": "79jiM1FrLqZpUWt4f1Uo7imRVQ4KiFfKAeb5mhHzJryU", + "index": 0, + "bump_seed": 249, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.46.99", + "dz_ip": "148.51.122.33", + "tunnel_id": 521, + "tunnel_net": "169.254.5.6/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "7PpXQgDb9eCHN1Uudgi77Wm89cRz4T85YgDw83qvaJXd", + "tunnel_endpoint": "198.13.133.48" + }, + "9MJxaPpXLKt8y3RCHd9GoZcvRmk7GMeoCPVaCCNuM86b": { + "account_type": "User", + "owner": "DukHp7f1Us59jjWB6ihyg55cWGqcpz1db7pa5m9zvLLJ", + "index": 7258, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.42.99", + "dz_ip": "212.83.42.99", + "tunnel_id": 549, + "tunnel_net": "169.254.3.116/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7nzTzRZzezmugqE5ZjHRMxarhXunpwZ2PUdjV7uYzt7A", + "tunnel_endpoint": "0.0.0.0" + }, + "ANWCfvjeHiGpBAALYpL1tGEWVv2Wu3p357zjBTycQPGU": { + "account_type": "User", + "owner": "UMiZdCdPPeqEDp2KKozxdu1u4LVfihkfxp6Gjw2NPUZ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.226", + "dz_ip": "64.130.37.226", + "tunnel_id": 508, + "tunnel_net": "169.254.7.74/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DUrordmMASu7Sx8ihhwBrgYqLXxhRCNoetY9HxBmzMVL", + "tunnel_endpoint": "0.0.0.0" + }, + "9eusKZjgUPYX3u7oUoQ4tHGAdUPdaaoNqWg8C3gJzj8P": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.162.48", + "dz_ip": "63.254.162.48", + "tunnel_id": 578, + "tunnel_net": "169.254.11.194/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.56" + }, + "GkfUEFAhWdKzso9jMnCp7gcURQ1ARsvb7DMCS9rtwc1i": { + "account_type": "User", + "owner": "GsSMwTbuSN1Km8kV7V2TPazTqShxbEhZFv9Xuwv5bBXH", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.36", + "dz_ip": "64.130.51.36", + "tunnel_id": 534, + "tunnel_net": "169.254.7.182/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.42.212.122" + }, + "3RvuHG56wmNn4NswXiiixvxpj7neAvHPdjaeagjoLq6i": { + "account_type": "User", + "owner": "5BQPELVk7Lq1X3gcuvjcB1PH4auJU3PvmkEumHu6tEXJ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.165.10", + "dz_ip": "5.199.165.10", + "tunnel_id": 500, + "tunnel_net": "169.254.8.48/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7", + "tunnel_endpoint": "184.104.221.146" + }, + "D4zuTFvo1zkGMtcymYP3gedvGMjR4coxmq1vsHyRbGgQ": { + "account_type": "User", + "owner": "mALL2W6DUgDDtcyurC9v5YTF2CMMeuRwPBkf6tEoG3y", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.227", + "dz_ip": "148.51.120.227", + "tunnel_id": 529, + "tunnel_net": "169.254.5.178/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "mALL2W6DUgDDtcyurC9v5YTF2CMMeuRwPBkf6tEoG3y", + "tunnel_endpoint": "209.146.32.160" + }, + "6UjQAdKpyZ9JZNmSL11YCDHzEczeQE18jmMJ52yyWPFt": { + "account_type": "User", + "owner": "D7biFzvLNfN2HCCw73rcRqNi4gDHG3rSD5cZ9uoLpk2T", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.56.52", + "dz_ip": "64.130.56.52", + "tunnel_id": 500, + "tunnel_net": "169.254.2.252/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ppppoqHcHVzigV6SK4856BAsNxhTAi32hqQQWrziyHE", + "tunnel_endpoint": "0.0.0.0" + }, + "3sS14t9Hg4YTMncN4upmR15EQPQA3KB7aov9nL1hULyb": { + "account_type": "User", + "owner": "7NCw54YgSSfNh6FMvDrnnXZQkCs8VQbSAy3MnfFhA7EW", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "cyoa_type": "GREOverDIA", + "client_ip": "165.140.84.150", + "dz_ip": "148.51.121.31", + "tunnel_id": 509, + "tunnel_net": "169.254.9.138/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "HW4zorvt6xDwhU36RqjcWNwU8YMj9tiqnAafBKW4cqV", + "tunnel_endpoint": "216.200.133.128" + }, + "HhzjoBWKjbopkdW5aukGSfMJW9jYWVUms49XJtNsKNyZ": { + "account_type": "User", + "owner": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "45.76.159.29", + "dz_ip": "148.51.120.101", + "tunnel_id": 528, + "tunnel_net": "169.254.7.250/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "tunnel_endpoint": "154.18.17.55" + }, + "8JVAsZQ8c3Sv4HFwgfTeLGDZHxwu9Hk4m17SfrXtWo9v": { + "account_type": "User", + "owner": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.225", + "dz_ip": "177.54.154.225", + "tunnel_id": 542, + "tunnel_net": "169.254.4.200/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD", + "tunnel_endpoint": "154.18.17.55" + }, + "FAr9jQyjTVJeB2pyjrG4z4mDLwjAPSPJhR5CB34FdL9v": { + "account_type": "User", + "owner": "5gGfsbAa5J5KkCyQjc8gJjymCddkReCgP6V8B6dmo18Z", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.51.216", + "dz_ip": "148.51.121.204", + "tunnel_id": 519, + "tunnel_net": "169.254.11.16/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "7Nn8qBJey7vXtVFMNBbbuN8UkujU8Y6nWzbHVGuf49yV", + "tunnel_endpoint": "213.248.92.111" + }, + "HPNR38DA4MAHFx57Emv8LDEkLLoeLa9dnyQz5J9vaKMN": { + "account_type": "User", + "owner": "FijxN29RupuP6mVeLRmfVomGHFzFGZztw8XFyn3c54i1", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "142.91.100.148", + "dz_ip": "142.91.100.148", + "tunnel_id": 506, + "tunnel_net": "169.254.5.12/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "AfZTWYoFQbzqCMmUBTD7XwxFvjob1FVyCvkaXRryxtKc", + "tunnel_endpoint": "0.0.0.0" + }, + "FKp5vwtZhjyiQwdLQKrXVEbx7xy2HBv51sqpzAEhvhLY": { + "account_type": "User", + "owner": "9zY9CKw4JfSUrjAPCENLJs3bt2o4EPsUq2aGcD1ESU3i", + "index": 1720, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.164.220", + "dz_ip": "5.199.164.220", + "tunnel_id": 509, + "tunnel_net": "169.254.1.132/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5zuNci3TV79w6zLoJZzbZujMvkVZb2FcSPhgv9aT24AK", + "tunnel_endpoint": "0.0.0.0" + }, + "7aDJ74biKdBMKUjHmXUHqJXEcibo57nwUxSrV1vgmoE1": { + "account_type": "User", + "owner": "APaEbMzPskbrJFESuNDj1AZuu6iQhQcWeP79kZjy19Nt", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.94.207", + "dz_ip": "64.34.94.207", + "tunnel_id": 531, + "tunnel_net": "169.254.10.132/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "MCFmmmXdzTKjBEoMggi8JGFJmd856uYSowuH2sCU5kx", + "tunnel_endpoint": "154.18.0.97" + }, + "66E8Fb9cp7ZPpeoQawHdaVNyuYBkDpWVRRWPw4vmyY5s": { + "account_type": "User", + "owner": "DZn2BJoE8NWd86p427wVYbkoyXPqoL7v5UHr68P5XvaK", + "index": 22836, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.159.17", + "dz_ip": "177.54.159.17", + "tunnel_id": 501, + "tunnel_net": "169.254.5.134/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DZa6tshpGyyyZSNtc9ETqyvAYgadc3rjxMY6RJPCNfbE": { + "account_type": "User", + "owner": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.39.79", + "dz_ip": "198.13.39.79", + "tunnel_id": 515, + "tunnel_net": "169.254.1.18/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9", + "tunnel_endpoint": "154.18.0.97" + }, + "FUCCMhDtXboBTs5bjnXDFRmBgEUC7p95k1gqsnMm5GLw": { + "account_type": "User", + "owner": "3xS5mdbJu2U25X31dskSDHsXaWJEprtn3Yoc7Gfebs9k", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.44.82", + "dz_ip": "64.130.44.82", + "tunnel_id": 504, + "tunnel_net": "169.254.4.72/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "2rbnWtVdRLsFzwU7ka6wkCoqobK4BMRfUkbcenxPrTA1": { + "account_type": "User", + "owner": "79jiM1FrLqZpUWt4f1Uo7imRVQ4KiFfKAeb5mhHzJryU", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.46.99", + "dz_ip": "45.32.46.99", + "tunnel_id": 502, + "tunnel_net": "169.254.6.126/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7PpXQgDb9eCHN1Uudgi77Wm89cRz4T85YgDw83qvaJXd", + "tunnel_endpoint": "198.13.133.56" + }, + "BhpaubK6RPCtyauFv7Au1U36EWFrmRiUEHfCiQYfmBvR": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.131.107", + "dz_ip": "198.13.131.107", + "tunnel_id": 531, + "tunnel_net": "169.254.6.192/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "67.209.55.48" + }, + "BKbddWLT4m7XS2S5GotAqryajCjnyVqtRNGvHRfc2nF5": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.59.76", + "dz_ip": "64.130.59.76", + "tunnel_id": 542, + "tunnel_net": "169.254.1.120/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "G2CAXDHbzic8MtJpLCnv25jZfPMaT268Sgxyd679JwqF": { + "account_type": "User", + "owner": "6RakzpEyJ8o7ad9Ywk9ntjeQo6P3tMtpFQzhAksrZ1aY", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "cyoa_type": "GREOverDIA", + "client_ip": "103.219.171.159", + "dz_ip": "38.246.201.97", + "tunnel_id": 503, + "tunnel_net": "169.254.0.80/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "4fvL261MnaYN9rmJAYVDxcpfa355xPq3hSN17ymgbpaS", + "tunnel_endpoint": "0.0.0.0" + }, + "BSW1jovhYjZEPWdtPKMg2BnCHSeKTC8GUxA2meirZKXY": { + "account_type": "User", + "owner": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.49", + "dz_ip": "148.51.120.110", + "tunnel_id": 549, + "tunnel_net": "169.254.7.208/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "tunnel_endpoint": "209.146.32.160" + }, + "7B1A59Bj7MF7JbFC3HwRZXd16RzgkFgJDBHiQvUShEyV": { + "account_type": "User", + "owner": "GcuhoPPxzdysaDGZ52ybYdof2vGYZfbH2yrLpm83HmCQ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "160.202.128.207", + "dz_ip": "160.202.128.207", + "tunnel_id": 500, + "tunnel_net": "169.254.5.28/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9NE6XW88UCGSzUkB8zTwirrtmFRiRmSop7TnbjW1mWpT": { + "account_type": "User", + "owner": "FijxN29RupuP6mVeLRmfVomGHFzFGZztw8XFyn3c54i1", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "142.91.100.148", + "dz_ip": "148.51.120.43", + "tunnel_id": 503, + "tunnel_net": "169.254.4.88/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "AfZTWYoFQbzqCMmUBTD7XwxFvjob1FVyCvkaXRryxtKc", + "tunnel_endpoint": "209.146.32.160" + }, + "FkKtvAczMzRL9V3N4vrhSmpMi7bP2Ha9sA69qCfdLRF6": { + "account_type": "User", + "owner": "B4zFSvtvknsW5uRWh4MUgNcz7wgwrdjEQpmxKWsrrzFp", + "index": 57116, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.121.3", + "dz_ip": "67.213.121.3", + "tunnel_id": 526, + "tunnel_net": "169.254.7.80/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5HCTsoKM7vwjubSZSyVWChaHQ9sNNRB1d2SuvL3eZ6Y6", + "tunnel_endpoint": "198.13.140.16" + }, + "4WzgNMWBRnXTHoexwi9HJhuV6R9Ja1LeoZUEYmiQ1ySy": { + "account_type": "User", + "owner": "SyndicAgdEphcy5xhAKZAomTYhcF8xhC7za2UD9xeug", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "cyoa_type": "GREOverDIA", + "client_ip": "15.204.241.62", + "dz_ip": "15.204.241.62", + "tunnel_id": 502, + "tunnel_net": "169.254.1.212/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CB5NTPpGECA2z8C33VJmM4xLQv999EdMW9Xqv91MDp5x", + "tunnel_endpoint": "0.0.0.0" + }, + "5VW8dH69vVSas5LxkPfj8gJGSckdQmr3JRJeanSEY4Np": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.145", + "dz_ip": "64.130.41.145", + "tunnel_id": 563, + "tunnel_net": "169.254.8.158/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "2WwxZgnbyoKNtwSH5QZ4etru1FE8zTPB2Q8At4h72Fci": { + "account_type": "User", + "owner": "ooc9bBwcrSKVMWNCojjmvikh8NkSPSgRebm3DWMZeyP", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.144.120", + "dz_ip": "148.51.121.231", + "tunnel_id": 539, + "tunnel_net": "169.254.11.66/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "meshRrDTME9cL2FSQ9E56EncfkZ7vL8apwcCFsw3o6Y", + "tunnel_endpoint": "154.18.17.55" + }, + "4ngFQEEzDq1pMVx4qw2ebLUL5Y2onXMmGPU1YQxUuW7E": { + "account_type": "User", + "owner": "4NKEM1s5WCtPcqER4mXfGiStC7PAJLMWnh832tTB4FkG", + "index": 19662, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.200", + "dz_ip": "208.91.110.200", + "tunnel_id": 501, + "tunnel_net": "169.254.5.74/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5yN8YHcmfXLudPUFDXWnz5uuFXJK1jfGHRua7US5PdtS", + "tunnel_endpoint": "0.0.0.0" + }, + "H6Uca886rWST9f7aEERrviCeTFKgF7sAz7pokaorsgXP": { + "account_type": "User", + "owner": "HxGDmKC6w6LLhrSCRq1HaKEJ5wNjQf8XF3UVi891ZZpV", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT", + "cyoa_type": "GREOverDIA", + "client_ip": "137.239.213.222", + "dz_ip": "148.51.121.75", + "tunnel_id": 501, + "tunnel_net": "169.254.9.170/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "C7CZpb8EkodpFsfNZ6rDdAGTyqT2oPiwLWSKQHFmtagj", + "tunnel_endpoint": "38.104.167.29" + }, + "E1ZotPe4MSs79vuTN8vLeGNzUQvMdqwBfbWegyjfy9Q3": { + "account_type": "User", + "owner": "A7nii4QwFSUaz8zCbiy1xFaapnJTYxLLVVWj9TvaFYC4", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "185.150.191.216", + "dz_ip": "185.150.191.216", + "tunnel_id": 512, + "tunnel_net": "169.254.0.150/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4b1onMDEasBh4BuPekQWijx3BYR64hAE1z2jJyeZUkck", + "tunnel_endpoint": "64.124.32.192" + }, + "BXroAFYfDskidWCzvtvqEkBrHzeWyBjcqpgfpU7sgQn4": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.36.36", + "dz_ip": "64.130.36.36", + "tunnel_id": 527, + "tunnel_net": "169.254.9.2/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.42.212.122" + }, + "7K2akULthhzZS7a1gr9qKbFyVhFuh9gEy4vCg3Agynjh": { + "account_type": "User", + "owner": "EXckihF3qmguH5znjhfzLvHsbk2E3nEW2DqNh4MMnDMm", + "index": 0, + "bump_seed": 249, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.47", + "dz_ip": "148.51.121.197", + "tunnel_id": 534, + "tunnel_net": "169.254.10.70/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "EXckihF3qmguH5znjhfzLvHsbk2E3nEW2DqNh4MMnDMm", + "tunnel_endpoint": "198.13.140.16" + }, + "DqDeX6nwFYo2rade1vSvmCaBfFpcfTA5umwNF9TTwfLG": { + "account_type": "User", + "owner": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.46", + "dz_ip": "148.51.120.55", + "tunnel_id": 521, + "tunnel_net": "169.254.6.100/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "6LnYdkv8G7Xgz77CVJxrJLHb2PmaeECRP8HfQQgDJaGZ", + "tunnel_endpoint": "198.13.140.16" + }, + "EF66RYntc1ejEJMZwWFft1MQhDPJj2m4wQb3FFpwShcG": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.230", + "dz_ip": "64.130.41.230", + "tunnel_id": 561, + "tunnel_net": "169.254.2.72/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "2ZEHPza7dj6hHfnYrKGP4rGjLnbKhhkohAeyWzatKhGf": { + "account_type": "User", + "owner": "4PtDzmnSwq4rG9iJzEAQDq71sbm8BBcsYthVrVtHQ7Kp", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.130.124", + "dz_ip": "198.13.130.124", + "tunnel_id": 536, + "tunnel_net": "169.254.8.128/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "154.18.17.55" + }, + "JE2Z5ouwVTwREPA27QegDu2Pezyaivsy2TXx9LDKBCTz": { + "account_type": "User", + "owner": "BerocY9dqjnwR7dRAd7FgMwGbeTcX6yHTcV746a9DSB5", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "139.84.226.199", + "dz_ip": "139.84.226.199", + "tunnel_id": 507, + "tunnel_net": "169.254.6.104/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SaV6UWBaE8M3kwMBfAhQ6Tmvd2qdJRm94NTwLqtoyGd", + "tunnel_endpoint": "0.0.0.0" + }, + "4VwDieH44QQA9DgnG4MkeC6ba16uUqzFXkxkXUfjyqLo": { + "account_type": "User", + "owner": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "189.1.171.85", + "dz_ip": "148.51.121.225", + "tunnel_id": 553, + "tunnel_net": "169.254.3.32/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "4iWFZJ4NCrkHdaU1zzsbnKdKubce685LecSJJ4cHH9yG", + "tunnel_endpoint": "198.13.140.24" + }, + "64uSRK4mHA6FMPmPJaTZPNiACqkZBcgyTAgkahNPZ3wH": { + "account_type": "User", + "owner": "7k1qZSJCgtAey4Xz9RDUVzazXw1dNnYoHxjyUw3ZRjJu", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.51", + "dz_ip": "148.51.121.27", + "tunnel_id": 530, + "tunnel_net": "169.254.9.130/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "ECeaWy82CxpeJQr3EG3XNmYXc9NrVeWDH5ag9Lt6TPVR", + "tunnel_endpoint": "4.42.212.122" + }, + "2TmhyXADY1YyJAfu2dHaMX5UNUZXLfCLSE3jD4oAC4xf": { + "account_type": "User", + "owner": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.69", + "dz_ip": "148.51.121.214", + "tunnel_id": 516, + "tunnel_net": "169.254.11.62/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "tunnel_endpoint": "67.209.55.56" + }, + "Gpr3D9RSYV8BgUFWLniGJ9UDfN2Gx1qktZDwsyUzdZU5": { + "account_type": "User", + "owner": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.224.55", + "dz_ip": "148.51.120.90", + "tunnel_id": 512, + "tunnel_net": "169.254.3.174/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "tunnel_endpoint": "79.127.170.81" + }, + "22yYeEjgtqkTboGgfa2io3rdFwgmrqzafTbmWxMxxcpk": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.162.61", + "dz_ip": "63.254.162.61", + "tunnel_id": 566, + "tunnel_net": "169.254.2.184/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "8SimQ41k9w1AXt9fGn45Agc1zFGMhUmBFYpWxHBtgC1c": { + "account_type": "User", + "owner": "CVgQY4EdCUuMeMU1dxA56Azjm7HRCh5LyGecSe9b62fk", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.86.137", + "dz_ip": "72.46.86.137", + "tunnel_id": 536, + "tunnel_net": "169.254.3.88/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "avnujiRNoSRe9PcET42DPKznyfYnb2LRaZAsqv6REZo", + "tunnel_endpoint": "154.18.64.128" + }, + "CDrCJ7eQSWt63uoHJtYENDWvowXc7aEwVLcYgoNduS22": { + "account_type": "User", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.137.185", + "dz_ip": "198.13.137.185", + "tunnel_id": 518, + "tunnel_net": "169.254.2.82/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.24" + }, + "HViGWNbHEBYFDvViVTjK4MYbWR8jqjrxv1SVT89ndPhz": { + "account_type": "User", + "owner": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.69", + "dz_ip": "67.213.122.69", + "tunnel_id": 514, + "tunnel_net": "169.254.11.34/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "tunnel_endpoint": "67.209.55.48" + }, + "6gukXjRGqchbKJAa2LpVp6e2bSQE8wDpf5LfxWyrr4MZ": { + "account_type": "User", + "owner": "C9dTbbWEdNeVZjqbnzZKB4DxfuLqWNVnr9mdZfCqBHKQ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.233", + "dz_ip": "177.54.154.233", + "tunnel_id": 505, + "tunnel_net": "169.254.4.14/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "gojir4WnhS7VS1JdbnanJMzaMfr4UD7KeX1ixWAHEmw", + "tunnel_endpoint": "67.209.55.48" + }, + "9c9JC3ngfCyTBAJj1qEKRiAb2rKJ6G1X4dXXvnEZsPSs": { + "account_type": "User", + "owner": "6uayBceaFssKHAhLiA3EBhFzqinGKQ5T66RGSopGM5FN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.84", + "dz_ip": "148.51.121.102", + "tunnel_id": 560, + "tunnel_net": "169.254.11.20/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "jUNk9Panm9A8VSeJ1n2S3fVPgcCZiGwYME4d3xgRAFH", + "tunnel_endpoint": "198.13.133.56" + }, + "HYFrtHdjNGrYfjxCxzVHJXTciRyviLKjLYXVR6TE1JzT": { + "account_type": "User", + "owner": "dztuVuFYWG1tyS9V65aHYBCyBqiK2Ss3VHmZzhUCHWM", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.136.186", + "dz_ip": "198.13.136.186", + "tunnel_id": 514, + "tunnel_net": "169.254.2.130/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "64.124.32.192" + }, + "34Hqg6U8x2SUemhY3P8mH1kXdC2APvb6aoRjvFJbmaaG": { + "account_type": "User", + "owner": "A7nii4QwFSUaz8zCbiy1xFaapnJTYxLLVVWj9TvaFYC4", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "185.150.191.216", + "dz_ip": "148.51.121.141", + "tunnel_id": 531, + "tunnel_net": "169.254.0.206/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "4b1onMDEasBh4BuPekQWijx3BYR64hAE1z2jJyeZUkck", + "tunnel_endpoint": "209.249.183.218" + }, + "Ddoiz5pZ2fDFikzfeQ5QXagg1burm8tC6Gg25SZEqjMT": { + "account_type": "User", + "owner": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.44.106", + "dz_ip": "64.130.44.106", + "tunnel_id": 542, + "tunnel_net": "169.254.0.134/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty", + "tunnel_endpoint": "198.13.133.56" + }, + "HF2URjaQ54bfMoYUPTirb5z4nADgni9wVgQSNr2nwX7P": { + "account_type": "User", + "owner": "LTPZgWy6e4q88qhKEfdMeaz1vmetH5eSfREHgbVQ3xm", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.207", + "dz_ip": "64.130.37.207", + "tunnel_id": 517, + "tunnel_net": "169.254.11.50/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5eQSRzTyF4h6a3aDmSxb3kXootVNsxXXLpniNVstydtJ", + "tunnel_endpoint": "4.42.212.122" + }, + "DtMwaD3i1PBsLHt2wmMdXnVs8wSSNN9y9ixfp86foz9j": { + "account_type": "User", + "owner": "5ivRNcK1yThcK3koZR1oikAfuNm6rj1LceMskayoVSzc", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.40.247", + "dz_ip": "148.51.121.203", + "tunnel_id": 541, + "tunnel_net": "169.254.11.32/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "5ivRNcK1yThcK3koZR1oikAfuNm6rj1LceMskayoVSzc", + "tunnel_endpoint": "198.13.140.16" + }, + "9tDSfvK8n2ToyhGCXsPLWXNYb1MfcpjdaKZFGcWaHQS6": { + "account_type": "User", + "owner": "Bq9t5usaaa3eKHjVkbYF4ZMzusVt5UBiP98xdoXZekmB", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.114", + "dz_ip": "151.123.174.114", + "tunnel_id": 561, + "tunnel_net": "169.254.2.226/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "fdzip81euDS8jEZHx5H1mn27zGVMLzkgpQuzYRBfBYG", + "tunnel_endpoint": "198.13.133.48" + }, + "Bo72PofptAfXX3YeQAXyum1TG6ze838isgN1fhFrZWP1": { + "account_type": "User", + "owner": "8jB5e2fHgCFepsJkQUqDuVf7ST3ToHzm33LQcWLHbRqP", + "index": 9212, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "95.173.206.238", + "dz_ip": "95.173.206.238", + "tunnel_id": 503, + "tunnel_net": "169.254.1.0/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "C1ocKDYMCm2ooWptMMnpd5VEB2Nx4UMJgRuYofysyzcA", + "tunnel_endpoint": "0.0.0.0" + }, + "C7BAseR5sajwQ1X2576LrRsAh3dswsoFJxnhSr7q2dPU": { + "account_type": "User", + "owner": "5DEH4VUw2HxP8MEpTpXhyHYM2zga7hAgjH8GxxeWf1KL", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.43", + "dz_ip": "148.51.122.54", + "tunnel_id": 553, + "tunnel_net": "169.254.11.232/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "AmjX7CerZbHrU814UeBp2gJC7gANNG3KrP4c3RyD7TSD", + "tunnel_endpoint": "154.18.17.55" + }, + "5YV7CwbqwEHd9ePGwqeYUaeEFytJYsH7u2QMsVkjQf1W": { + "account_type": "User", + "owner": "3xS5mdbJu2U25X31dskSDHsXaWJEprtn3Yoc7Gfebs9k", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.44.82", + "dz_ip": "64.130.44.82", + "tunnel_id": 514, + "tunnel_net": "169.254.7.46/31", + "status": "Activated", + "publishers": "", + "subscribers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.56" + }, + "8V8ATwgrFBiisuRpb7cCFQVgjCwCZJP5dmiAguFiKU3h": { + "account_type": "User", + "owner": "3p1CHgXnD2czQegmip43guXdZ5Ncr73oMNH61hjxNYA6", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.83.99", + "dz_ip": "64.34.83.99", + "tunnel_id": 532, + "tunnel_net": "169.254.10.174/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4", + "tunnel_endpoint": "198.13.133.56" + }, + "8ADNBUmVfM6krRnoqAjeVdHNJTzBxRRn6bDd188gqpca": { + "account_type": "User", + "owner": "7LgeV5j3xZXrGEsqZ5rQYAPX9oCrt4ZuutohzFrajL6V", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "66.135.22.69", + "dz_ip": "66.135.22.69", + "tunnel_id": 537, + "tunnel_net": "169.254.1.252/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DeepM3FDWaAb7o53rvyZk5YvHLG3FvDiVXJLRY78z51p", + "tunnel_endpoint": "0.0.0.0" + }, + "2prLHuaJ85PnXzibsBYu8WNcyGg1Vf8zNWCC6VoQsSP8": { + "account_type": "User", + "owner": "ERD31ASEiN2VPXp8kMhAZSpAVKhRwtnseVgBEGPBMwGh", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.54.173", + "dz_ip": "148.51.120.68", + "tunnel_id": 503, + "tunnel_net": "169.254.9.250/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "GREEDkgav1ox1jYyd9Anv6exLqKV2vYnxMw5prGwmNKc", + "tunnel_endpoint": "208.91.105.40" + }, + "9o4crp47P9RbZ2DMLiB2HbWiaJKAu54Aoqg2zEtk4hMM": { + "account_type": "User", + "owner": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.30", + "dz_ip": "151.123.174.30", + "tunnel_id": 502, + "tunnel_net": "169.254.5.2/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy", + "tunnel_endpoint": "154.18.64.128" + }, + "AZKwJ8c8k4GuVY9wQUzmtrRrzq1iGfLayM6apfX6Mqv1": { + "account_type": "User", + "owner": "Bv3XfQzj6vu8dFrJsvdBHwbLyejyUYT1xPmTeP4zGEcz", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.241.154", + "dz_ip": "45.77.241.154", + "tunnel_id": 518, + "tunnel_net": "169.254.8.208/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "sTepQGoReJq2tBKStL19DT6nnGHcGiAvFjyYaokLyuM", + "tunnel_endpoint": "152.233.14.224" + }, + "8RpzKBkrnAbmBfSYbL2L2LMqyM6dgDUX7AG5HFReuSs": { + "account_type": "User", + "owner": "uFg697vAkejh5wghe5Q6UzXan4baDabrUBcmgDYfZ7J", + "index": 57059, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "94.158.242.123", + "dz_ip": "94.158.242.123", + "tunnel_id": 512, + "tunnel_net": "169.254.4.236/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "85KYApBi4GVuWNTX2k21LZrEpjAXg79ED1ZRUcpVmYmp", + "tunnel_endpoint": "0.0.0.0" + }, + "6NXFvmZyQprxxhxKSmd5K81CEsjgMUhAHhWDxWiVPKvo": { + "account_type": "User", + "owner": "2Xehqi4LzAvnhh2Ef6KcA5dbHvRrszyN1vRE1kZsEMcb", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.172.126", + "dz_ip": "151.123.172.126", + "tunnel_id": 504, + "tunnel_net": "169.254.8.82/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3psxMyr7rQzywVp1MXKd1XFmFz33NjydzCoJx9t2sMQW", + "tunnel_endpoint": "137.239.200.186" + }, + "BA5PmhTdFDZrXE1TycbkdHkgbkxCcVMPDRgmnBMLPNb1": { + "account_type": "User", + "owner": "BnYN5YzNANLv3c3qWgKhPB5C9nCButYrn6ji4GfFhPrk", + "index": 24106, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "45.134.108.222", + "dz_ip": "45.134.108.222", + "tunnel_id": 506, + "tunnel_net": "169.254.5.122/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DJ2x4C3GfaBJoX4FHd4ziomo34ZViubd2jinuFmsNSgs", + "tunnel_endpoint": "0.0.0.0" + }, + "4FJH2BrzD7LT7RMk84vSGCiuRoSfYzpxW4xPMqKm5Yag": { + "account_type": "User", + "owner": "Dug99hFphzxrrA3GhS8U1Wxajz1QKaqszJU4PJEAwPDU", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.76", + "dz_ip": "148.51.122.37", + "tunnel_id": 572, + "tunnel_net": "169.254.10.196/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "DxisWshp4WHyW5G3ZN1PJ8RAdwUBVvGdN6cQp9eecxT2", + "tunnel_endpoint": "198.13.133.48" + }, + "DgR8TCerCWv6S3oHbWuKie16d3NsUp27Ro6WL6WuYf58": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 46873, + "bump_seed": 253, + "user_type": "IBRLWithAllocatedIP", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "54.238.237.61", + "dz_ip": "154.18.64.130", + "tunnel_id": 509, + "tunnel_net": "169.254.6.180/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6G94QEY3R3Gw7cpdqkdAjdQD7idnZgdhxSEeHagKQxjp": { + "account_type": "User", + "owner": "CtjzeGgbpHzDDDn4r9WJ2CWuDRTq9gwerbUuFXRWvwCD", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.10.209", + "dz_ip": "185.26.10.209", + "tunnel_id": 542, + "tunnel_net": "169.254.10.120/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "H3p16WCia8hmoXUQCh92EdTj1Dh24a7X9khtT42Xqy1E", + "tunnel_endpoint": "198.13.140.24" + }, + "ARSpAonMjxGXXFQtp85Hg8jZUaDwGWoAmtuzGwsUDhXJ": { + "account_type": "User", + "owner": "BrkfMFtaQpZzfcat8vq7UAmW5CUZMohH6U61hYmB15qb", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "45.250.255.197", + "dz_ip": "45.250.255.197", + "tunnel_id": 518, + "tunnel_net": "169.254.1.16/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5zm9g3zgAPWzX3wmUB2JtTkcwCqe74NWsTmt5wLFwCKK", + "tunnel_endpoint": "154.18.0.97" + }, + "EPTKC9pvzsjJ5AZ7k6BgeMZuchBdeBMrPHemfgb6nGeD": { + "account_type": "User", + "owner": "E76tBgcNk8gjhbaEh8bFteSVRUB4WVA2VhvTGySG8hv4", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.34.165", + "dz_ip": "64.130.34.165", + "tunnel_id": 513, + "tunnel_net": "169.254.8.224/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "ANdBzCxxhLBqL9u37vZjii2TQ5Z6j95kLfStphX9GJdm": { + "account_type": "User", + "owner": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.242", + "dz_ip": "148.51.121.242", + "tunnel_id": 563, + "tunnel_net": "169.254.0.8/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "2QEzJ7KPvhvnhLFw4Qc4wQYg8hpFtVxmyweys6kKA4FB", + "tunnel_endpoint": "198.13.133.48" + }, + "FTNTUg1T9aHaEhwzAL9QFoQxxAAWyU5V4GuQkwJ5zXqf": { + "account_type": "User", + "owner": "A48xFiZzS2VyPWRLHjw65K2SdBdz4MMcPqaBdiPLmr77", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.251.33", + "dz_ip": "148.51.121.26", + "tunnel_id": 516, + "tunnel_net": "169.254.8.178/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "GQiWnDYrzHMALWG9avt5FCu1wisAQHjGY5ve7GMBiPEe", + "tunnel_endpoint": "154.18.64.128" + }, + "8LvKp4RNajjAjjRs5wAT4nMdh89xekjVEssAJBpc3YeK": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.57.43", + "dz_ip": "64.130.57.43", + "tunnel_id": 558, + "tunnel_net": "169.254.7.68/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "CJ76PFJskxYXCyqEbPukbLxzqSZx96KuGkC9FutVaBjf": { + "account_type": "User", + "owner": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.21", + "dz_ip": "148.51.121.13", + "tunnel_id": 526, + "tunnel_net": "169.254.2.178/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt", + "tunnel_endpoint": "209.146.32.160" + }, + "Dgb56oHJUZfdCKkgsttsXwF8vf7x4Ef17YqoncQXbgoD": { + "account_type": "User", + "owner": "GgipuMTLa5cuEkmjxYeyMLPZ7vekkxFJqoHcakxjrtJm", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.141", + "dz_ip": "208.91.110.141", + "tunnel_id": 535, + "tunnel_net": "169.254.9.46/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "841mxTUmRDKdN5mes8Kf3VMctk8rcefnD4aBuaPeUNoU", + "tunnel_endpoint": "4.42.212.122" + }, + "FqcHqoopiiYQgSL9KLHGWhVGP4qpvVEAJ4fjVfsugRZ7": { + "account_type": "User", + "owner": "CjjwfyfjkoXew2KYkGHJkAuurA5cGaHi8V5LtrPdZ5Ti", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.97", + "dz_ip": "148.51.120.69", + "tunnel_id": 539, + "tunnel_net": "169.254.9.246/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "CtvdyHYt8cMuGVHFarV2RADfoCdnrbd8e9jAsB225uMW", + "tunnel_endpoint": "198.13.133.48" + }, + "99MeYa9M5sNvWrvcYWuLwUZDCPgPwtqLRkoGGYEc7N9j": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.36.170", + "dz_ip": "64.130.36.170", + "tunnel_id": 538, + "tunnel_net": "169.254.7.154/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "7TWX87QrSkxzWD8XdmAV4hrLPdM9454kChx2jXCfLmNf": { + "account_type": "User", + "owner": "dzmTjnSdbPhsVPFcJVsnr6DvkrmUkrvzhXLqxHXPwoU", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.19", + "dz_ip": "148.51.121.236", + "tunnel_id": 540, + "tunnel_net": "169.254.6.80/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "dmycoyQrZsMbW3xUtAUkRVTQVDUsBMbjruvmoX5b9v6", + "tunnel_endpoint": "4.8.126.96" + }, + "5FdBoEC5YSk5RwMUdtNqShtQe76WrUnCgSWy5YDEzK57": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "206.223.226.183", + "dz_ip": "206.223.226.183", + "tunnel_id": 533, + "tunnel_net": "169.254.9.238/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj, 8J2yRE3q7EuosbnVn5w9uyVWVySKucDHsWht4hAb4CTJ", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "154.18.64.128" + }, + "3s4yVtPm8TLRTqsZwgjkdeNGMhzbUQdmy9Cw9Ykj7vLD": { + "account_type": "User", + "owner": "B9Fuytvr8tKqH1KNF7Jk4Yk6Pvg1ciVrtmjusYbwuVv9", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "57.129.36.165", + "dz_ip": "57.129.36.165", + "tunnel_id": 500, + "tunnel_net": "169.254.11.206/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "A9mvukTd77EbRoBX4ydSCFQHdu5bsRFkNXTTRstA8FAC", + "tunnel_endpoint": "193.28.105.144" + }, + "2AJ4fYXJqxBCNNb8J19fk8UCDbAeEMuQVva1wKpXUVFC": { + "account_type": "User", + "owner": "ETs4Xdyo6a8H93bkacU2Ekyy6MJix6uBjjcCoN8Q7eJ3", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.138.185", + "dz_ip": "198.13.138.185", + "tunnel_id": 529, + "tunnel_net": "169.254.8.98/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "EDWANc2gftvjF1gzTVVerMgndMWA6wXQD3uB69tvDMEP": { + "account_type": "User", + "owner": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.235", + "dz_ip": "148.51.120.87", + "tunnel_id": 527, + "tunnel_net": "169.254.7.148/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "tunnel_endpoint": "184.104.213.176" + }, + "6mHuq4WzX1ubD61Z8S8y5M5TnqmCKzxBGR7CEFZ4Kr4K": { + "account_type": "User", + "owner": "6dCYcUDudUWvcHpCessp15rJQp7JvQV3tpELXo29zHHS", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.140.84", + "dz_ip": "198.13.140.84", + "tunnel_id": 535, + "tunnel_net": "169.254.0.214/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "KTMkUG8WCw9FdH44jLMBpc1teGafnYL6SgP4fHHbsNM", + "tunnel_endpoint": "198.13.140.16" + }, + "ArhmpPA4BVFaoZ6oxu6UzjJb6DhRdDj6jSbnQiZSgunA": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "174.138.55.92", + "dz_ip": "174.138.55.92", + "tunnel_id": 515, + "tunnel_net": "169.254.3.236/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "137.239.213.192" + }, + "EHpsEy7oALu3GLRyBxr1hVdHJpWzPEWSqWPJsg3jqZeQ": { + "account_type": "User", + "owner": "DrtYc35tpe3ZKiVfLtR8gio8YZSb8aQotZbKoKLthTM", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.140.81", + "dz_ip": "198.13.140.81", + "tunnel_id": 537, + "tunnel_net": "169.254.10.106/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3SmNAy18exGMiwmVEg38B5Uq7hLqVuTfwuo1uMcdk36b", + "tunnel_endpoint": "198.13.140.24" + }, + "31wXAdDhFsFA443NhRmzoJdm3CHD7pyGLmL9mQ1E9bsU": { + "account_type": "User", + "owner": "q1AFPJPYcya3KrRNPwmuA2UkyTLea1dCZCtSZ16kJAQ", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "cyoa_type": "GREOverDIA", + "client_ip": "70.40.184.75", + "dz_ip": "70.40.184.75", + "tunnel_id": 521, + "tunnel_net": "169.254.4.26/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE", + "tunnel_endpoint": "193.28.105.130" + }, + "E6kbTvB74QVknbBXstfqaWSz55sRbjPpe4sQ4DGTdacd": { + "account_type": "User", + "owner": "ARx33747AK12mbKQ8rnpFkC9xKnizNVNjL8x57Ki4jYc", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.50", + "dz_ip": "151.123.174.50", + "tunnel_id": 501, + "tunnel_net": "169.254.10.144/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "HE2M3NMPrtD1U9sfQ1K4QQJtEwcyonNLNRZGmpRW8nXm", + "tunnel_endpoint": "154.18.0.97" + }, + "HMPY1GmWyyRU4FJM3uMcTjcsdYWTHgi3Bm5pm2qpxWRK": { + "account_type": "User", + "owner": "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.175.13", + "dz_ip": "151.123.175.13", + "tunnel_id": 508, + "tunnel_net": "169.254.1.66/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC", + "tunnel_endpoint": "154.18.0.97" + }, + "7CiNM9jKNuSF3ZKbaxU6NscsJpkDrpBmgzyE4tsxqc7R": { + "account_type": "User", + "owner": "7LgeV5j3xZXrGEsqZ5rQYAPX9oCrt4ZuutohzFrajL6V", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "66.135.22.69", + "dz_ip": "148.51.120.146", + "tunnel_id": 523, + "tunnel_net": "169.254.6.110/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "DeepM3FDWaAb7o53rvyZk5YvHLG3FvDiVXJLRY78z51p", + "tunnel_endpoint": "64.124.32.192" + }, + "JE5pic6JTPnNncFcGH6v4cJWRKuGVj6i7DPLPUqP4Egq": { + "account_type": "User", + "owner": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.221", + "dz_ip": "148.51.120.52", + "tunnel_id": 543, + "tunnel_net": "169.254.1.68/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "tunnel_endpoint": "154.18.17.55" + }, + "AwFAxTQW7drbrMZXC2eG1ToFqU4J4cFcKoAi5B1pxskC": { + "account_type": "User", + "owner": "7zNycMnTp7uVGHSjBiR3vuLsHDKXe9eapnJR97D9p89K", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.212", + "dz_ip": "64.130.41.212", + "tunnel_id": 515, + "tunnel_net": "169.254.7.192/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "8KAqDeUWGPDJL6YHeVSWfsRGc1N8UMDYpNcQt6upsLtw": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.143", + "dz_ip": "64.130.41.143", + "tunnel_id": 505, + "tunnel_net": "169.254.11.166/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "FUhKSWXz7Efo9FAS6xNbm4QoXYuDhwDi4kNy7kAbdjfT": { + "account_type": "User", + "owner": "GUeWVMZJF72Ds3fLkRPtH9ohHqz9bPPLbBoa1ByU2yVk", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.44", + "dz_ip": "148.51.121.53", + "tunnel_id": 529, + "tunnel_net": "169.254.9.124/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "CaveyttUBTKttncu1e4RF814XjuoGfYv8cEsiKGDNCPX", + "tunnel_endpoint": "209.249.183.218" + }, + "8KzoQzjDhPDmbSv4BK13DLoBD6gDPH8xmK4WadmVTj6G": { + "account_type": "User", + "owner": "dCENvFQpGSNrrRBiioxwF1ftaXyApiEYF2e8e7tipFV", + "index": 0, + "bump_seed": 250, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "15.235.232.142", + "dz_ip": "148.51.121.193", + "tunnel_id": 517, + "tunnel_net": "169.254.11.10/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "idCE5k2BtTpwXdwAC7Var1enT9reut9fWECcxQP7LY7", + "tunnel_endpoint": "152.233.14.224" + }, + "Dd6qntTzxaEMXecSMMbwZBNP8CdauNowkHUNi1WJjKDc": { + "account_type": "User", + "owner": "DURt7rLam3Dhm98nzV9gdbvc5BucoAQYE5HgCgGyYEbi", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.38", + "dz_ip": "64.130.41.38", + "tunnel_id": 530, + "tunnel_net": "169.254.4.8/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DURt7rLam3Dhm98nzV9gdbvc5BucoAQYE5HgCgGyYEbi", + "tunnel_endpoint": "198.13.140.24" + }, + "E1dCAbKpdTjpam9qv6FiV4p51DNcrEoUHe77TQNHEB73": { + "account_type": "User", + "owner": "DZiGTxgDvmBFiNYmukLHYePG2S4CRydoHjQ4kF6vtMJu", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.66", + "dz_ip": "148.51.121.96", + "tunnel_id": 547, + "tunnel_net": "169.254.1.230/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "Stakex4B2tpDHPWGvV1dninfiaYCGdakgTknpzPitLh", + "tunnel_endpoint": "198.13.133.56" + }, + "HvwkndCE5Ze6wjBUpA8yjf25at3cn4tuhDU4DyLwPbzc": { + "account_type": "User", + "owner": "E8JKqZAQtYkWrBqx3H5eWWuky14Z8DNGwq61eqQ5wcp8", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "86.54.153.244", + "dz_ip": "148.51.121.56", + "tunnel_id": 539, + "tunnel_net": "169.254.9.34/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "7iZsaucAX7cCJQXtfBxFcBkTxtE8brKBmjwjH5DiwEw5", + "tunnel_endpoint": "4.42.212.122" + }, + "BMitXL2AQ1sXMeWgH698yUwsVeEMbQ1piMQhumZYAgVp": { + "account_type": "User", + "owner": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.34.21", + "dz_ip": "148.51.120.79", + "tunnel_id": 521, + "tunnel_net": "169.254.7.42/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "tunnel_endpoint": "4.42.212.122" + }, + "DGqW3qTfxToNc7nKXQ9JF3pvFygC54VBDq7Q9jwcWfyg": { + "account_type": "User", + "owner": "GHxoCXtgHSjFVan4L7sVqBXwScd9sC17uke73WJ2b7w2", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.237", + "dz_ip": "148.51.120.207", + "tunnel_id": 532, + "tunnel_net": "169.254.9.254/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "8aPHvzVV91jZF948tykkoF6WfgLHppNfG8Z3V4gCrDix", + "tunnel_endpoint": "154.18.0.97" + }, + "BPNRvSMwU6xSjvBxRXeY1nhLMYNnMR9nSL5F9AFgdpwM": { + "account_type": "User", + "owner": "D7BoZgf1n3knySTHQ3SzMpacf1RCAfGGwggsX6FZZDXq", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.164.218", + "dz_ip": "5.199.164.218", + "tunnel_id": 517, + "tunnel_net": "169.254.4.102/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DeXsDvvZzKhVux4YfDFE6p4acJLGzr8yKt5pSTjzZB8t", + "tunnel_endpoint": "67.209.55.56" + }, + "GdPBvRHpkhCbJWtJ5gVNG3gpstYMqCdbSQ5gbqCDw4xv": { + "account_type": "User", + "owner": "GWGHaRxKTHhQMkiEocBzdaD82Ds2X9kRcGrUosK8TyDB", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.194", + "dz_ip": "148.51.121.101", + "tunnel_id": 576, + "tunnel_net": "169.254.1.190/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj, 8J2yRE3q7EuosbnVn5w9uyVWVySKucDHsWht4hAb4CTJ", + "subscribers": "", + "validator_pubkey": "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU", + "tunnel_endpoint": "198.13.133.48" + }, + "CT4MzF5NRwxrf7JN5GfJj7U9Q76uKDG6ZsWX4ANnDrBJ": { + "account_type": "User", + "owner": "Bv3XfQzj6vu8dFrJsvdBHwbLyejyUYT1xPmTeP4zGEcz", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.241.154", + "dz_ip": "148.51.120.225", + "tunnel_id": 508, + "tunnel_net": "169.254.4.194/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "sTepQGoReJq2tBKStL19DT6nnGHcGiAvFjyYaokLyuM", + "tunnel_endpoint": "209.146.32.160" + }, + "CusBfD58PQVHVj2AqAtNmWHkj93AGUdff269GVntj9jy": { + "account_type": "User", + "owner": "6dCYcUDudUWvcHpCessp15rJQp7JvQV3tpELXo29zHHS", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "66.206.3.122", + "dz_ip": "66.206.3.122", + "tunnel_id": 557, + "tunnel_net": "169.254.2.214/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "53vKTuQsLV3YkSzUr2rXRcLn5Gw3yWakJ6Yb1sYNwby", + "tunnel_endpoint": "198.13.140.16" + }, + "EZiHvKs5xPqLL6soatyRzbL44JLErK1vL62SMNbwDrWc": { + "account_type": "User", + "owner": "8jB5e2fHgCFepsJkQUqDuVf7ST3ToHzm33LQcWLHbRqP", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "95.173.206.238", + "dz_ip": "148.51.121.154", + "tunnel_id": 507, + "tunnel_net": "169.254.2.164/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "C1ocKDYMCm2ooWptMMnpd5VEB2Nx4UMJgRuYofysyzcA", + "tunnel_endpoint": "137.239.213.192" + }, + "GSWCgimUGQzfKCh3XUfbwf4FHEXgBdJKD5P4GALB9TEs": { + "account_type": "User", + "owner": "4jYF1T4CKKTubyzRqHzAtdmKg6BQjYDGurt42E6kTyfr", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "207.246.84.247", + "dz_ip": "148.51.121.206", + "tunnel_id": 536, + "tunnel_net": "169.254.5.202/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "5ysfTZ42VT1TjnjzQShZSrix7wdVtjXwssocSeYKDs5d", + "tunnel_endpoint": "209.249.183.218" + }, + "ASw2WUk7xVfvUwXyzP13mmmh6uGdnCaAmDGJ8GnVzCkT": { + "account_type": "User", + "owner": "2gY5dP4nTHrW4G8kYvrWwTB58mUKdPtunRicXbwAKyyq", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "69.67.151.101", + "dz_ip": "148.51.120.66", + "tunnel_id": 505, + "tunnel_net": "169.254.1.36/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb", + "tunnel_endpoint": "38.247.16.192" + }, + "5jmrSvfrQLUpMHtT76N3WgZA12rzEB7NxMcsrJTUXgFw": { + "account_type": "User", + "owner": "5eJnbUbn2cY21t31uWRUBLdmYkoAvuNRxWgugFJVtZvd", + "index": 3375, + "bump_seed": 251, + "user_type": "IBRLWithAllocatedIP", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.59.233", + "dz_ip": "4.8.126.97", + "tunnel_id": 507, + "tunnel_net": "169.254.2.160/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5z18gzNUs5gqdWPRy82fRSiXqN9U2RmZdHxEXHhHHgCj": { + "account_type": "User", + "owner": "STKEbHxS7rRMgL1NE99MqV1VjTypnUV5YmE7TqAC4JY", + "index": 0, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.133.120", + "dz_ip": "198.13.133.120", + "tunnel_id": 512, + "tunnel_net": "169.254.6.118/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EBk678aQvc3cUkfGyoehfw21JQfJXjmWuBeopYc89RSV", + "tunnel_endpoint": "198.13.133.48" + }, + "Fpbn5RM2u6i7TLxw1cbBNcj3wAWBxUfEfZzfW7Z7LyDt": { + "account_type": "User", + "owner": "FPFXq9ZjDPwhuEHVR2UwbkfiuELYGUVuPv19Xn5Uh9N4", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "15.235.231.135", + "dz_ip": "148.51.122.57", + "tunnel_id": 513, + "tunnel_net": "169.254.11.228/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "152.233.14.224" + }, + "AWidqxfJvy7d2YcvoLkavnXTQrkWdaD52wcBPJcfaWiS": { + "account_type": "User", + "owner": "FSkkUkQEdKBpjSbaVHci1zyu1HP34YKqd6LZnTbSkL24", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "66.135.11.12", + "dz_ip": "148.51.121.83", + "tunnel_id": 501, + "tunnel_net": "169.254.6.54/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "Bs19Z9SokV1s46jutN9tqqaCgYf1GsVyyytVfkzwn9qK", + "tunnel_endpoint": "64.124.32.192" + }, + "BbJEAdnwGVzbqD2jbF5wWBG8dUEvDNvr5RRHrx8bRyy1": { + "account_type": "User", + "owner": "ERD31ASEiN2VPXp8kMhAZSpAVKhRwtnseVgBEGPBMwGh", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "154.45.250.109", + "dz_ip": "154.45.250.109", + "tunnel_id": 510, + "tunnel_net": "169.254.8.30/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "iaQNQUwJ3CanN2otpzMsW1DYA7ENeq6wyz5hv1R31k3", + "tunnel_endpoint": "38.247.16.192" + }, + "ASSCm51K2TpvRpHbZFUGgRmumTzFRmmAFeUC4bM4wbyz": { + "account_type": "User", + "owner": "NU7EUvYwtQWMJcYcSSA7hxju3UpuTQQZEMjtyfi7Fds", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.162.76", + "dz_ip": "63.254.162.76", + "tunnel_id": 503, + "tunnel_net": "169.254.7.128/31", + "status": "Activated", + "publishers": "", + "subscribers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "ERxA3egcPaPnGSmNdFDKMqyqeKd7G6KBdeCgs2AKnuaD": { + "account_type": "User", + "owner": "HRGp1ti5YvjHy5BBSxq8g35yZwotwMi1zLQRv45pKUdx", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "151.123.174.238", + "dz_ip": "148.51.120.75", + "tunnel_id": 513, + "tunnel_net": "169.254.6.214/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "dddkpiYSdXFPQi59vvQC2FpxM71noMzVTWwDtrFP9op", + "tunnel_endpoint": "198.13.133.48" + }, + "DbQat4QU3xbVyhk7c2EBLXNKuMP89LsGL3FfMg83rwPb": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.167", + "dz_ip": "64.130.51.167", + "tunnel_id": 508, + "tunnel_net": "169.254.7.72/31", + "status": "Activated", + "publishers": "", + "subscribers": "GbgDsQDhjxdRAzRWgj8KKMqFLiuEPvmQK6H7mSP3uRtZ, 4UjgqgwyAmq1m7BRaWpfjcpKHPueRN4nunNQU97UoCDv, 31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "38.122.35.137" + }, + "Gvox2zWiY3gAnKFshkFpLhtGyXZPps8GYfu1ZjTM9jvp": { + "account_type": "User", + "owner": "A4XSeSJb1MEgqF4k3pFzL5cKg5FRehW8cgzZs95ey3dY", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "66.165.246.46", + "dz_ip": "148.51.120.127", + "tunnel_id": 520, + "tunnel_net": "169.254.7.240/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "BoNKmNCGvoHS4CkKvYRnF21iEpUP827pZjhFGdA4t5as", + "tunnel_endpoint": "64.124.32.192" + }, + "3fj3Lt7amrWdseumGPkvvMfy1gq2tUNKfFWd2mGrJsXm": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 26480, + "bump_seed": 253, + "user_type": "IBRLWithAllocatedIP", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "206.189.42.167", + "dz_ip": "152.233.14.225", + "tunnel_id": 522, + "tunnel_net": "169.254.5.218/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4e9ZTWrbbaGzrpBbfERaWDwbLii6neiYqGfym4gnvgf8": { + "account_type": "User", + "owner": "39WWybLfDXnmmhfSt4cqAmV7b9S81gFR5kgsJ2REWynv", + "index": 0, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.133.78", + "dz_ip": "148.51.122.26", + "tunnel_id": 569, + "tunnel_net": "169.254.9.16/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "CEL22Qx7p85qY6gmhCZaYJrrnynJitkVRMQo6qZdT8Ns", + "tunnel_endpoint": "198.13.133.56" + }, + "7TipcLJDUoSaPQ93KtBLiJP6C7T4fVsXnk7ZqookW6ey": { + "account_type": "User", + "owner": "FXkgqU7wSB1bGHAvHeLFT5uKBAJqfBB4XTQe3teRfWFn", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.95.90", + "dz_ip": "148.51.122.39", + "tunnel_id": 527, + "tunnel_net": "169.254.11.154/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "EH9xqextnMxNzcE7MmzbAdukPPFm34XyKSqngbvudHxS", + "tunnel_endpoint": "67.209.55.48" + }, + "Czo82cuGJNxVDcTSqJ39rR8SEMgxaLsA4AZqVKoZ5b6s": { + "account_type": "User", + "owner": "dztHar6nnqhhF3ZuAP5UsQdTLKTZqff5QoasM5jE16U", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.162.25", + "dz_ip": "63.254.162.25", + "tunnel_id": 506, + "tunnel_net": "169.254.2.248/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "AUxaRAaK2epFsz1KjTnPkQngoyHFYNUrpu7jMzf1K1uz": { + "account_type": "User", + "owner": "2kNtGczVXdz84Z5dDR7eUHgKHHr6V8AqP8V7twtGPJRK", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "cyoa_type": "GREOverDIA", + "client_ip": "82.21.117.188", + "dz_ip": "82.21.117.188", + "tunnel_id": 505, + "tunnel_net": "169.254.3.110/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "149.11.228.133" + }, + "4TMqRAsRXZVWF68yxGqXaEduTsJWLZGbn2ESZ6RjJ8Sm": { + "account_type": "User", + "owner": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "index": 49844, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.247", + "dz_ip": "72.46.87.247", + "tunnel_id": 525, + "tunnel_net": "169.254.0.130/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "tunnel_endpoint": "0.0.0.0" + }, + "81gTitkM7hEahqArDSm8fsG45FxJqSuV5hwj78k1GJLK": { + "account_type": "User", + "owner": "9o7H5rJ7TFfVEn5qrgerpX5w9M8ttjr1Fjy26efsJ5TA", + "index": 19713, + "bump_seed": 252, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "202.8.11.173", + "dz_ip": "209.146.32.162", + "tunnel_id": 516, + "tunnel_net": "169.254.5.92/31", + "status": "Activated", + "publishers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DkPGi8siDwTxErm9E3Y9JDiCcvZAsZCNxVRtfXU7UqTW": { + "account_type": "User", + "owner": "DagrM9XVaGpQGnsJzJ9pTLPvi5dWPDxmircQEkQ9biUF", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "66.42.59.185", + "dz_ip": "148.51.121.173", + "tunnel_id": 514, + "tunnel_net": "169.254.5.18/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "KAoSp3EudGqUBXv46tQoDwbZxSm3iXa9wM2aF4ySbJJ", + "tunnel_endpoint": "152.233.14.224" + }, + "DnEzbwL5TJvXfFtycbSiLZ8PX3MTHuPtXNHnvZ48frw2": { + "account_type": "User", + "owner": "vzzAePScm8ZV5oTnKCmLW2ZPGETo9nt2BXhgvoELM9R", + "index": 2059, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.11", + "dz_ip": "177.54.154.11", + "tunnel_id": 511, + "tunnel_net": "169.254.2.6/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GvfaiJUhNCRZGVGumsEF1eHDb8JpAeFAyHSrTifyhrbt", + "tunnel_endpoint": "0.0.0.0" + }, + "G3rWZ6MiwzpyMF2o49PJEEqmT3NseBE72sWaijJgdUH": { + "account_type": "User", + "owner": "7xPbXzatmzDH5YMHdEtM4bHPcKRHMq79Fp3u4M3UXDoM", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.35.90", + "dz_ip": "64.130.35.90", + "tunnel_id": 532, + "tunnel_net": "169.254.6.98/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "C3DRPmJWvqy2B7yzAku1rcGvRDP8JkT32C2JsMUHsbjD": { + "account_type": "User", + "owner": "GqUtPyfcg7pa1ZHTBLd6tqdLndDcUFGeBcvhxJbpn2Ce", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.150.33", + "dz_ip": "45.77.150.33", + "tunnel_id": 517, + "tunnel_net": "169.254.1.82/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Hqr3kookSnMBTC7mHi4vsBsZQ5ih7n1Jx6vKwVjKoZDC", + "tunnel_endpoint": "209.249.183.218" + }, + "FugzFgSm4bipZMLsKiYJTXKRQHtqo8TC6ADMyaidBUEX": { + "account_type": "User", + "owner": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "cyoa_type": "GREOverDIA", + "client_ip": "198.13.130.125", + "dz_ip": "148.51.121.195", + "tunnel_id": 506, + "tunnel_net": "169.254.9.164/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj, 8J2yRE3q7EuosbnVn5w9uyVWVySKucDHsWht4hAb4CTJ", + "subscribers": "", + "validator_pubkey": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT", + "tunnel_endpoint": "152.233.14.224" + }, + "9akWbR9J7FKZfD9ff7ugn5EmSDih1vJABrHbRhxPFUxx": { + "account_type": "User", + "owner": "D5zXsAfuLKYMs7aQGYKqMeQqLW97xD5xgVXrrsVPU6Zy", + "index": 53611, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.225.106", + "dz_ip": "149.28.225.106", + "tunnel_id": 536, + "tunnel_net": "169.254.0.180/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2P9ZYA4vBoBBr56hrEFTmrd5ctuz3r7wtvRYmbgk6jRL", + "tunnel_endpoint": "0.0.0.0" + }, + "AhH7zuY8sXChAugFUNEUUsYKbRpjekXjJKeNc1gHoSeW": { + "account_type": "User", + "owner": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.73", + "dz_ip": "148.51.121.213", + "tunnel_id": 546, + "tunnel_net": "169.254.7.152/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW", + "tunnel_endpoint": "154.18.17.55" + }, + "CmwKMep9deVQwLbjs6smQ8edDdasnFSZjTZR1ExGdzCP": { + "account_type": "User", + "owner": "mALL2W6DUgDDtcyurC9v5YTF2CMMeuRwPBkf6tEoG3y", + "index": 5673, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.227", + "dz_ip": "177.54.154.227", + "tunnel_id": 502, + "tunnel_net": "169.254.3.84/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "mALL2W6DUgDDtcyurC9v5YTF2CMMeuRwPBkf6tEoG3y", + "tunnel_endpoint": "0.0.0.0" + }, + "AaC9y9YaULscbG9jbdL7x8sKgPhEe5wh3AaWmdfUWQu8": { + "account_type": "User", + "owner": "SaGAgdkowooXBrHihpmE8gsjf1dUG7n5SqnyJxYFnXJ", + "index": 4215, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "cyoa_type": "GREOverDIA", + "client_ip": "45.250.254.141", + "dz_ip": "45.250.254.141", + "tunnel_id": 500, + "tunnel_net": "169.254.2.128/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SaGAgdkowooXBrHihpmE8gsjf1dUG7n5SqnyJxYFnXJ", + "tunnel_endpoint": "0.0.0.0" + }, + "4m6SQmCfV4ckCnhTSLEciKhnSHMbskKrfafgyWGcayF2": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.57.133", + "dz_ip": "64.130.57.133", + "tunnel_id": 546, + "tunnel_net": "169.254.4.64/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.24" + }, + "CFmajZ2h6gt3ZzQvDRAqCE6N5ZyX4yTHpcBzdGpKrWRt": { + "account_type": "User", + "owner": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.209", + "dz_ip": "148.51.120.98", + "tunnel_id": 513, + "tunnel_net": "169.254.0.128/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "EaY74EbVZ6vAwPaPXnuxBb79dsFSTafzHbEm6kqBZRJA", + "tunnel_endpoint": "184.104.213.176" + }, + "5znWmUfFUifhHB7939DUUE3P25p9Pzi9WsfE9biTkaHM": { + "account_type": "User", + "owner": "BsS2BWy1qeFLFsbahdzH3A5Sfo7DmMQqiYMbYdi4s5yt", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "cyoa_type": "GREOverDIA", + "client_ip": "183.81.168.165", + "dz_ip": "183.81.168.165", + "tunnel_id": 506, + "tunnel_net": "169.254.5.70/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "G7dh7XAmqyP4En53PEue5taAsHcQWEPehsQgKqLS8CLZ", + "tunnel_endpoint": "0.0.0.0" + }, + "DoBX1hNzQ8KCAtiWGXDcG54YhqSvP96eLGAN3wNMEQD8": { + "account_type": "User", + "owner": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.221", + "dz_ip": "67.213.122.221", + "tunnel_id": 523, + "tunnel_net": "169.254.1.58/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "tunnel_endpoint": "209.146.32.160" + }, + "GiUYKAuyLXrDeJLf7Lkp7C3k6uMXb28gTienr1rUPBoZ": { + "account_type": "User", + "owner": "dztWRNcBYCNRasG5RM2ZFkWkBNQhz6qbxMzXKwG7esi", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.59.45", + "dz_ip": "64.130.59.45", + "tunnel_id": 503, + "tunnel_net": "169.254.2.110/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "4.8.126.96" + }, + "Cc9C1E3VvDEFC2Ve2kcs4ge6kcXzZbjcNT6RWE44wDEH": { + "account_type": "User", + "owner": "5ivRNcK1yThcK3koZR1oikAfuNm6rj1LceMskayoVSzc", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.40.247", + "dz_ip": "64.130.40.247", + "tunnel_id": 502, + "tunnel_net": "169.254.5.124/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5ivRNcK1yThcK3koZR1oikAfuNm6rj1LceMskayoVSzc", + "tunnel_endpoint": "198.13.140.24" + }, + "7WnotFq4bPw5w5weF7Z6CgPmWXyjCiR474hEWbsHWQ9P": { + "account_type": "User", + "owner": "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC", + "index": 15198, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "cyoa_type": "GREOverDIA", + "client_ip": "103.66.180.7", + "dz_ip": "103.66.180.7", + "tunnel_id": 506, + "tunnel_net": "169.254.4.182/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC", + "tunnel_endpoint": "0.0.0.0" + }, + "4d3S6yGizHq9T8xXLNP84kShK6a4rpRy5H78RTwSaenK": { + "account_type": "User", + "owner": "BykbUwDn8pWtBUVrAr6ZJjRGRRgekmFEthNfoFUTh8JG", + "index": 0, + "bump_seed": 250, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "cyoa_type": "GREOverDIA", + "client_ip": "64.34.83.7", + "dz_ip": "148.51.120.37", + "tunnel_id": 505, + "tunnel_net": "169.254.5.72/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "PAWsME7oYbjt5TRNc11mBa33JhKnQr9AYherdr9YAZ6", + "tunnel_endpoint": "154.18.0.97" + }, + "CF2ATHJKoWRksqSdE3vbpZoq7dUNxK8mRA8R9CJxcZLE": { + "account_type": "User", + "owner": "A7nii4QwFSUaz8zCbiy1xFaapnJTYxLLVVWj9TvaFYC4", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "104.243.45.75", + "dz_ip": "104.243.45.75", + "tunnel_id": 500, + "tunnel_net": "169.254.2.222/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "62cCknMX3Pi3rUTiTt5JtmeYxRWQLuE9M6fyrwTeUYoE", + "tunnel_endpoint": "209.249.183.218" + }, + "51rwZSe75N81BBQcKZBkcHpDZKbCnGw4xt8pesz7GdtL": { + "account_type": "User", + "owner": "EsYHvPULXA74UNHhHzXQaD3GtLsuRimP85bTF6mE1TMb", + "index": 0, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "45.76.15.94", + "dz_ip": "148.51.121.66", + "tunnel_id": 500, + "tunnel_net": "169.254.9.236/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "uEhHSnCXvWgtgvVaYscPHjG13G3peMmngQQ2ghC54i3", + "tunnel_endpoint": "4.42.212.122" + }, + "B5nd9Lsy2DmCQjENXb4cbXhDjykdV6sLUdC6o36beCSv": { + "account_type": "User", + "owner": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "index": 0, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.34.21", + "dz_ip": "64.130.34.21", + "tunnel_id": 516, + "tunnel_net": "169.254.4.48/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "tunnel_endpoint": "4.8.126.96" + }, + "Bh9Yhg4ScHSG8podfMmx4KNtYrMbKMxG7WoEfij9txPx": { + "account_type": "User", + "owner": "ZeRoXF8PpC1t7qfmqdthLdeS6gudnTqyHirSnE5ZzgR", + "index": 50204, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT", + "cyoa_type": "GREOverDIA", + "client_ip": "192.69.194.82", + "dz_ip": "192.69.194.82", + "tunnel_id": 500, + "tunnel_net": "169.254.0.60/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "zeroT6PTAEjipvZuACTh1mbGCqTHgA6i1ped9DcuidX", + "tunnel_endpoint": "0.0.0.0" + }, + "3sZ7dr83KPCWKK7H22DNixjLBCRvQ6sMJc6ki6uzqa5j": { + "account_type": "User", + "owner": "AVtvZKjk3D1hUQbUKjGDPGm5B7gnxZpEQ9m8GYsXpGiZ", + "index": 0, + "bump_seed": 249, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "63.254.165.83", + "dz_ip": "63.254.165.83", + "tunnel_id": 519, + "tunnel_net": "169.254.8.28/31", + "status": "Activated", + "publishers": "", + "subscribers": "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.133.48" + }, + "7d3dnffieG9o7iuDLjRt8K1RjpBaFyHGaU8uQCtnxaxz": { + "account_type": "User", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "index": 0, + "bump_seed": 254, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.47.247", + "dz_ip": "64.130.47.247", + "tunnel_id": 523, + "tunnel_net": "169.254.4.136/31", + "status": "Activated", + "publishers": "", + "subscribers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "198.13.140.16" + }, + "DGiBw5yHyyVogTvWu7s36NXvwx5uTCGKf5rMbuMdrqP": { + "account_type": "User", + "owner": "3i79MmNHdGB4DJHf96FBvrqEBUCKsescAc1B4FDHoQBJ", + "index": 0, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "cyoa_type": "GREOverDIA", + "client_ip": "216.242.0.102", + "dz_ip": "216.242.0.102", + "tunnel_id": 503, + "tunnel_net": "169.254.7.70/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7zAHbRxEQaNjKnQMjFm7j8LebHSGfzsQDdm2ZpUNPa7G", + "tunnel_endpoint": "0.0.0.0" + }, + "9QkDb8MmwHu9HQH2LBx2bMEoGetyXzyxbqjC8B7UR7uV": { + "account_type": "User", + "owner": "3zLCNmt7Lhm2y44RW9YdZs6epmsDB8BazUUE2LXo9PzC", + "index": 0, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "cyoa_type": "GREOverDIA", + "client_ip": "86.54.153.249", + "dz_ip": "148.51.121.191", + "tunnel_id": 537, + "tunnel_net": "169.254.9.214/31", + "status": "Activated", + "publishers": "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj", + "subscribers": "", + "validator_pubkey": "9wDoL3e2btwQyh44V8q3t1RnKoNRPpVmY2LRJtL8v3MD", + "tunnel_endpoint": "209.249.183.218" + }, + "2rqdcWXQ8E9gBEejhzJkLTcpDWkRcaiESifK3Ex2Y3Ks": { + "account_type": "User", + "owner": "6uayBceaFssKHAhLiA3EBhFzqinGKQ5T66RGSopGM5FN", + "index": 0, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "cyoa_type": "GREOverDIA", + "client_ip": "2.57.215.84", + "dz_ip": "2.57.215.84", + "tunnel_id": 556, + "tunnel_net": "169.254.10.232/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "jUNk9Panm9A8VSeJ1n2S3fVPgcCZiGwYME4d3xgRAFH", + "tunnel_endpoint": "198.13.133.48" + } + }, + "multicast_groups": { + "3eUvZvcpCtsfJ8wqCZvhiyBhbY2Sjn56JcQWpDwsESyX": { + "account_type": "MulticastGroup", + "owner": "44NdeuZfjhHg61grggBUBpCvPSs96ogXFDo1eRNSKj42", + "index": 16750, + "bump_seed": 255, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.2", + "max_bandwidth": 200000000, + "status": "Activated", + "code": "jito-shredstream", + "publisher_count": 9, + "subscriber_count": 22 + }, + "4UjgqgwyAmq1m7BRaWpfjcpKHPueRN4nunNQU97UoCDv": { + "account_type": "MulticastGroup", + "owner": "9XHh7mFq81AuJStwZfeVuHVJWJuNwurs9naHFCcoj8Ce", + "index": 57117, + "bump_seed": 255, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.9", + "max_bandwidth": 200000000, + "status": "Activated", + "code": "mtape", + "publisher_count": 1, + "subscriber_count": 6 + }, + "Cp3qXTYq3AxWjAew5vSYP4Zf83zV8b8aCgs4K6pRP71X": { + "account_type": "MulticastGroup", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 57146, + "bump_seed": 255, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.13", + "max_bandwidth": 150000000, + "status": "Activated", + "code": "rebop-apac", + "publisher_count": 0, + "subscriber_count": 0 + }, + "7yxxsxH1vDs5ZzzxAcALkaE2nxe7Gm9z3Njo192mxjym": { + "account_type": "MulticastGroup", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "index": 47598, + "bump_seed": 255, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.4", + "max_bandwidth": 500000000, + "status": "Activated", + "code": "corvus", + "publisher_count": 14, + "subscriber_count": 14 + }, + "4G9XfXaugW9idkrX5FZYNMmKG2cLMBcMM6spMx2VriH2": { + "account_type": "MulticastGroup", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 57145, + "bump_seed": 253, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.12", + "max_bandwidth": 150000000, + "status": "Activated", + "code": "rebop-eu", + "publisher_count": 0, + "subscriber_count": 0 + }, + "8J2yRE3q7EuosbnVn5w9uyVWVySKucDHsWht4hAb4CTJ": { + "account_type": "MulticastGroup", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 57140, + "bump_seed": 253, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.11", + "max_bandwidth": 100000000, + "status": "Activated", + "code": "rebop", + "publisher_count": 7, + "subscriber_count": 11 + }, + "GbgDsQDhjxdRAzRWgj8KKMqFLiuEPvmQK6H7mSP3uRtZ": { + "account_type": "MulticastGroup", + "owner": "9XHh7mFq81AuJStwZfeVuHVJWJuNwurs9naHFCcoj8Ce", + "index": 57036, + "bump_seed": 255, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.5", + "max_bandwidth": 1000000000, + "status": "Activated", + "code": "mbone", + "publisher_count": 1, + "subscriber_count": 6 + }, + "31fdXyG3x8k5Ache7jKNQsuwaMf44oqYQndoBsT1JfVj": { + "account_type": "MulticastGroup", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 57082, + "bump_seed": 254, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.1", + "max_bandwidth": 100000000, + "status": "Activated", + "code": "edge-solana-shreds", + "publisher_count": 551, + "subscriber_count": 66 + }, + "DqXkCV2fsSZBWrU14a76Yw8rUwyqzy2YviYjxhRSYo6E": { + "account_type": "MulticastGroup", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 57092, + "bump_seed": 255, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.7", + "max_bandwidth": 1000000000, + "status": "Activated", + "code": "mg03", + "publisher_count": 0, + "subscriber_count": 0 + }, + "51gpzVHMBTfD7n9Pv6Z7kG5bBtUuRGL4ThSZ2sn1894y": { + "account_type": "MulticastGroup", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 57144, + "bump_seed": 249, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.3", + "max_bandwidth": 150000, + "status": "Activated", + "code": "hold", + "publisher_count": 0, + "subscriber_count": 0 + }, + "FjNRcrSKAkdsdeyB4T8kLghdscBbmpebFgsHTodRLKcA": { + "account_type": "MulticastGroup", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 57091, + "bump_seed": 255, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.6", + "max_bandwidth": 1000000000, + "status": "Activated", + "code": "mg02", + "publisher_count": 0, + "subscriber_count": 0 + }, + "7acopWYJ9asXNHKDyXCzaeu5LU91UVSBmPcx7gQSYtuQ": { + "account_type": "MulticastGroup", + "owner": "FdDcx5MJYRxykTF3YRuatw4Am7DNvZp2EpbhwD4V4ZMQ", + "index": 57124, + "bump_seed": 255, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.10", + "max_bandwidth": 200000000, + "status": "Activated", + "code": "sentrynet", + "publisher_count": 5, + "subscriber_count": 5 + }, + "7GfKjAfxZWaLZBKn2KwYQECfrFmSQ3EdBshyjMC4TnJg": { + "account_type": "MulticastGroup", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 57147, + "bump_seed": 254, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.14", + "max_bandwidth": 150000000, + "status": "Activated", + "code": "rebop-amer", + "publisher_count": 0, + "subscriber_count": 0 + }, + "8ZmH3bx4k1JNYLyEviNAsCFxRoDoG3Y4ntVCUxu24fUF": { + "account_type": "MulticastGroup", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 228, + "bump_seed": 255, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.0", + "max_bandwidth": 1000000000, + "status": "Activated", + "code": "mg01", + "publisher_count": 0, + "subscriber_count": 0 + }, + "CPPC6YztVx9fZYyuDEqTa88PikimDbbVy1GuZhwVMYJS": { + "account_type": "MulticastGroup", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 57093, + "bump_seed": 254, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.8", + "max_bandwidth": 200000000, + "status": "Activated", + "code": "micro", + "publisher_count": 0, + "subscriber_count": 0 + } + }, + "contributors": { + "268yJVQXH7iiAxLUVwdSyxjxx5yHPn8GreDESHksjrNm": { + "account_type": "Contributor", + "owner": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "index": 65, + "bump_seed": 254, + "status": "Activated", + "code": "glxy", + "reference_count": 30, + "ops_manager_pk": "9jaf1ZmozNGa4L1mfk6CnfgAxG37k8bH6HP3M3BE8vPt" + }, + "E53U5Kk3D31tzekpFbLSbNtVrc23qnqhVhT3CGcvE1ZW": { + "account_type": "Contributor", + "owner": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "index": 64, + "bump_seed": 250, + "status": "Activated", + "code": "jump_", + "reference_count": 95, + "ops_manager_pk": "5DV7P2sK2k3vf51Es6M5YoHTpwCzpqYDwa5KXwptC8yb" + }, + "48cjgdm2R2XvT6KQUwyquGtcddYCvzRVaJkBMzenuiD4": { + "account_type": "Contributor", + "owner": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "index": 47607, + "bump_seed": 255, + "status": "Activated", + "code": "tsw", + "reference_count": 34, + "ops_manager_pk": "11111111111111111111111111111111" + }, + "8uTcvvuxNLBPwS6YMNa1bZ74LupyUALUF5CgK7PjPM9Y": { + "account_type": "Contributor", + "owner": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "index": 7033, + "bump_seed": 255, + "status": "Activated", + "code": "dgt", + "reference_count": 31, + "ops_manager_pk": "AWrnL4WaAyCAtfud6RVz2BptUYfaSF1gmu1ZeAK9sYBR" + } + }, + "access_passes": { + "12F8ErV5edEp2DRaHtQtoYD8XLfQocdDsvqC8CKPJJsX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "8Nvaxzif1NrdvxNkRetjT8xJvd33EHkKVrfL8EDkgaNy" + }, + "client_ip": "185.189.45.172", + "user_payer": "7fNzEmeFmMWSUvEKatSpVscV3aevZ28KYYtuX1gtXeTQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "13YqHAsEEeWcfciYaSgT5rbhTzZQm9QR1B1yR9TfLnE8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HPGuEWVVXm1ovCJUKScSQRoeTMRyyaaax8JXRPg6fTuf" + }, + "client_ip": "208.85.23.4", + "user_payer": "GHUFsW8uJoHeD6BPvFZYYPD8WbTawRyxYeCpqjcaU5wi", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "13mjwpGNRHv3hrQC1facpZTUYucGid3cEnSt97USWqWM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "85KYApBi4GVuWNTX2k21LZrEpjAXg79ED1ZRUcpVmYmp" + }, + "client_ip": "94.158.242.123", + "user_payer": "uFg697vAkejh5wghe5Q6UzXan4baDabrUBcmgDYfZ7J", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "13s6Pnz4ZzY7okNkBEUFVi6M8APFpyrtowj82fc21EVH": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "64.130.41.145", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "14FiJuS7d7DRa2DJfdEdYgqVgwDzUD4iLsRJb6XctTsC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm" + }, + "client_ip": "202.182.99.41", + "user_payer": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "14TUG865ag7WXnzLpPCMJra9VMfpiqaTL62vrzLpCNwr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "FNTPSUuRpDoJx1hwFmB5ncNLLMX42aE83P4hsFYUfNRL" + }, + "client_ip": "88.216.222.158", + "user_payer": "HkimjkHK2PFAsFd5vPcE7YumY1NKrLuf2urUso3QLU2f", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "14q7cnrRzJ4wwmf74KFQEAusshetkaFZLueqc6wgVd7c": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7Nn8qBJey7vXtVFMNBbbuN8UkujU8Y6nWzbHVGuf49yV" + }, + "client_ip": "45.77.56.122", + "user_payer": "8oyMWvAwRMLifLF7PYhFiryX4cMfmrreCHWj1dtumxpZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "14qchcUfKXcCt57khSHH4tJG3CUwr651iEz1DGHSrq6e": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "4k6wgP5WPBKQpsFGtzuXNrjcTE2fKWLj17nDvFeG5zSF" + }, + "client_ip": "84.32.186.148", + "user_payer": "21BRoz7TmbeJ6AHQyZZ1DLAJ4eJ88FDkFKW6r865DHBW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "1FYyVYcCoe2RcKscZZor6EfhCduX1RbfpthqBgCER16": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "173.201.37.63", + "user_payer": "EXt1EXnDwDyHmE4UBN9w6S2NfDi9wF53y2dzSfns6uEd", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Expired", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "1Qpgg2y3N1ScNtXNunx34oa9x9V5kVh1wuzTZXdP1si": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "202.8.8.174", + "user_payer": "Doxiyay6pd8GcSEgKXfXxwXEZFz5C8ZgCnY9efcAu2J8", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "217AAdLvYXnbReXw9xd5rr2iFniKm7FdP4vHEN3BA8JJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "tri1z9PER6SHRG9fByGMgriWSvX5Ne75cU47b3L8JJ5" + }, + "client_ip": "108.171.214.2", + "user_payer": "TRi12sEaDkgoNSsEpep3YF8QPjqz4qM63mc1Z4tQCvD", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "21hKvfKd2wKqGcrbhhKBEh3LuCi4sGjQe4W9wn6G6UFh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EXDYjV2nX8ZGYtKU2BAKXsfBCte5kEj9378hAZnXWbSV" + }, + "client_ip": "64.130.61.161", + "user_payer": "anzaeL7Lsv71HW2mew8YcKGyGqL6qNn3xoNPRrejM73", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "222USmsj3AcZFSbnUu3LoKC1BkPtbKvYSdnhSmp37BWR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "FCogV51pg35BtHUJKoNYdVV6M534hHiRfjHxKYPD8nMK" + }, + "client_ip": "84.32.103.24", + "user_payer": "BLvUbmRVZGLzRTVE1DZL4LFdmCGytuizxStwtyhE3Pii", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "22eHtfsV7MVEJ7Et2My3T8zQ4TKuHvChCCCeym2JPU24": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BiGcsiuFCLuiTzXoQgfLdge9sfpwr55YzdT8Kp7bCXmS" + }, + "client_ip": "64.130.51.83", + "user_payer": "BiGcsiuFCLuiTzXoQgfLdge9sfpwr55YzdT8Kp7bCXmS", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "23ZNRGSX4mkGzSpRx6VwN19uqFELYDjzi1NQDRxoQ9dN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK" + }, + "client_ip": "185.26.10.181", + "user_payer": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "23rC8ijciD6BXMmeQXe5pJWyzWU7i4x8LBSvjUrNK1Vr": { + "account_type": "AccessPass", + "owner": "44NdeuZfjhHg61grggBUBpCvPSs96ogXFDo1eRNSKj42", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "100.89.105.12", + "user_payer": "FMNhfpBAN2fPoaoE3P9qYiK8nMycrLN1kQxb8q1MKN94", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Expired", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "24KCFyDbh71QQPKeB2tAhv76CmwM83pZNpy3ftu3Nxm3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CVgwMrWo9chKEuEPCe6Za9KJe8jamnAcoeWzaMeNubr6" + }, + "client_ip": "169.155.169.82", + "user_payer": "28gufVPADUfVkfB6QJcA2gLWniWg1b4G5YnewxEHicAe", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "24a2iBLqspnHddtNi7CeFunZfWx7jDwmEr18VAXKZSfn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "BeaCHioStqCEFDFxKwAEzyrUPYxqnBPhJ98gDKeEiTPb" + }, + "client_ip": "94.158.242.51", + "user_payer": "4pNdwtJZg98QxhV7rcKsYZiFS9MY27XuNTwXjibgm8Nc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "25gx1trfZ6XMEoujNVPUoszbJ6TeKERkaX6PHDFEftV4": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "74.118.139.99", + "user_payer": "3cb6NAFucJ3rXbHGZYXcv5o6qyoYChfBD9F4wZDi7L3n", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "26wmMswjAWWYX56RRzUzDcVX75oV36gPT5hro5AnT8hS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf" + }, + "client_ip": "38.244.159.143", + "user_payer": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "26zedyrdzFjn4CAdxdxdyGmPmCGE3P4Ed52xbkfXzRYA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GREEDkgav1ox1jYyd9Anv6exLqKV2vYnxMw5prGwmNKc" + }, + "client_ip": "204.16.242.185", + "user_payer": "ERD31ASEiN2VPXp8kMhAZSpAVKhRwtnseVgBEGPBMwGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "27DAXzf8y9LweKTA7ArFZxZB4GiKkSHqBn1vtDEXxhjt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "43Am3PKFeo9cACpqYL5Sk95rpVdxLw3Mc22PqRqZXEW2" + }, + "client_ip": "136.244.93.186", + "user_payer": "HxmNg4kPUwGhGS7Z9EtdLQKG8Pd9VCg6cDtEsYXLEsoa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "27UZLs7aGEeynLz7DiUNfF3TACPbrVPmm8yCGCRrprGU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "14GtGcdikcK33tFBhedZ4rYTHcTpWveCxLXvR3Ydx9zS" + }, + "client_ip": "72.46.87.57", + "user_payer": "6RakzpEyJ8o7ad9Ywk9ntjeQo6P3tMtpFQzhAksrZ1aY", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "28hNHBJREFC8GKkmDB98HR6qUxnvPmSSJXcaivbM1Xtb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9Bhp9JJdDL5WZWgVp1b1EPvqRX9ov4WU7q9oP5RUrHai" + }, + "client_ip": "72.46.87.239", + "user_payer": "L3LYuRHNHiC1fAtQz26RaUBbXoXrfcyARsNBUUHtm2f", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "29Y6p8cRNXwYePYocTsy6e6kgJw4pBaXmNaehE1H2wT2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "LunaowJnt875WWoqDkhHhE93SNYHa6tfFNVn1rqc57c" + }, + "client_ip": "91.237.141.80", + "user_payer": "7U5D3su2SV4ZxrJjX3UmtxFn9ypeNnPREyDtLczBmyQf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2A4sZToH8hDYuk6VSA3nqEndqDYi1vwYRn9638ZokZHE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4vdWYn2KbmQ3Dns5wVBfz4CFQDds4b7CpsC8MHBhHAib" + }, + "client_ip": "80.76.51.108", + "user_payer": "9UF7Jm92TjcbiAeKaog33mZ3stuynpQz3VQ2Ejkeok9C", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2A7AEhtd6TzHLXBPuGdiGTDz9mVeAXVFiAkSZxqoZ44R": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2X4vFVsYnDnntJeAE9ftpAAerc38xDPNc1BJSWje81Xy" + }, + "client_ip": "64.176.69.48", + "user_payer": "A48xFiZzS2VyPWRLHjw65K2SdBdz4MMcPqaBdiPLmr77", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2AHB8qGA7YrTz5gLz2XLqTNsqNrRirqBuDcNF5sq7t6e": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb" + }, + "client_ip": "67.213.115.199", + "user_payer": "Gc5i1TRqaBcQhh8cuFNCK5oRsnKMUarU1iH4pxUMNUps", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2AMn1vqaD8ZPXMZDN3bxh3TrzAWhjSaNRJYNr7dqr4jY": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.59.45", + "user_payer": "CorvusBcMUVWhkSQwP2ufQKMozw5MhYFXRjEF7Y571W4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2B1uZA8bqnKySKQy6Q1v8oY3gTYs2qUQ2rt4c9pmDubF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu" + }, + "client_ip": "64.34.90.159", + "user_payer": "Et6oK3x9M2fvpqkXFTT6viHg8w96wQSqxUrjc5KJ7DPA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2B6qHQNFNtrXyKJCEd9LsyhH7uTDcjD5zYtUCEXjGgqc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BH6aHw9y4Ejes5KdPYA3ezwERCvJd2zMzGLKze45kfy3" + }, + "client_ip": "45.139.135.254", + "user_payer": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2C5T9tezH1tThH3NpdqCCX3c8fUWvUEfDmyFLUEPNtFA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DKSy9mQn63487j7oXHxqmykLEYUA3akTHm1QNPgDLGN8" + }, + "client_ip": "177.54.154.7", + "user_payer": "GgJ5XvybVPmBE3QUZPSqKtCmZAp29YqAUxkinBgTVUZo", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2CDpaPZPNbvkg8jEDG8aGp9JgADhHWE3JveFpTrSK4Gc": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "185.191.117.97", + "user_payer": "astGyVYSLen66wboSaPTf1strHkVErTuSRgoanJXsDz", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2CMw1WeVD6MP73v7oQr4bu9zpUQdc21gvbVPzde23r3f": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "MutT1jxCXbRWJXpXoJK259gLrNfzDezdxS3BSkQAmv1" + }, + "client_ip": "79.127.239.81", + "user_payer": "55iEA5LZs4iGtmuvvpdJ1tDSVTmhLZ3whM3C28XeZydu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2CN7e2S2LXQiWZ7GoFBwKsgGDh1p2oacH7txLYfFiFhw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ" + }, + "client_ip": "46.166.162.134", + "user_payer": "EDvfAgT3FFPnxAnyoeuShVkGncQLTGLUMWdHm3hC2qmo", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2CQ5s23V9zzjAjFUYWJrvAy9gUKMZvm3aEKPvAFCrted": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "1VvLBgaUQMhh1yByB8x1fSByX6YZMuCCHuU5A9pqcGS" + }, + "client_ip": "64.130.43.33", + "user_payer": "STKEbHxS7rRMgL1NE99MqV1VjTypnUV5YmE7TqAC4JY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2Ca5D6JUntUzVQfL2aELJtf6Sb28bjufLLbkSHRjGRZs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8ZQg3K1V1Z2BVJkjmnxpi43WKhjPGXphzu5QmBkJibSP" + }, + "client_ip": "88.211.218.107", + "user_payer": "8JeyzEF34DdmQUJd2S5su5ASFZMwxUniVXh2943V8LsX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2CstoFfVEutVbtRcF7atUAm3XzsmgTUK4zkk3iJdGX7i": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SscQkTYV2BFQYGGffAmTzvefrFrw6z9GNYiWHstVZ77" + }, + "client_ip": "45.77.106.223", + "user_payer": "ssZbdqVceyPhupmozC8pAEWNC9T984bNBeGRr18DnDz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2D6gsPddFqJg7HAFRXjQv8iinyXXcDWNJtMyT5R9iNas": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj" + }, + "client_ip": "103.88.234.125", + "user_payer": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2DdLQW5KTPGoJ8fq2LE4DrtPV3dmwxg6UTejVqiQEsDZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e" + }, + "client_ip": "185.26.11.195", + "user_payer": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2E57N9YxupDMXGUn1c8MSWDbABGi9s3QMf5x1fzWHHH1": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.57.42", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2EAvxNE6ekjJGktnBmgXn1kuDCxBTJbRsfT1qGyr7B5C": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BSGMRbK97DcgLe4u4kfNQnmTVZGVnwdtKQBJqWRBTZxU" + }, + "client_ip": "185.189.44.202", + "user_payer": "EBKY6mSeuSVy4dE9fTNDtM71mi8PYJpDq3Qx8neDYnz3", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2FRWQjtxSwHa5mLsutR9kQsNj7i5oNKPgTCwMxNig8JF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "soLStaCk5TiGCpeLKa9Fvv6f5JQGMa6S3uhLh826e9N" + }, + "client_ip": "45.154.33.67", + "user_payer": "EmE5KsWqFYFyxytrCQWy91aGZy7nGfd96cdPfi7R5YRE", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2FfH8MCtS19s157esVprsJd2vc4wuATYKqzyHZiZNfam": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3SmNAy18exGMiwmVEg38B5Uq7hLqVuTfwuo1uMcdk36b" + }, + "client_ip": "198.13.140.81", + "user_payer": "DrtYc35tpe3ZKiVfLtR8gio8YZSb8aQotZbKoKLthTM", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2GQoERpHP4VDuCFdHnHuXxVDsaEFn8RiqE3dcZBJTpoQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "WUNoB9YQXmXXRcJsjY1G8PfVag5aAfnyGmFd6YwJVwp" + }, + "client_ip": "46.166.162.139", + "user_payer": "WUNoB9YQXmXXRcJsjY1G8PfVag5aAfnyGmFd6YwJVwp", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2Ga6B4NWbyHgG1FmbFw3MSXrVhuseKKYw4E16fXiDu7H": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "D3htsc6iRQJLqCNWcC2xcZgUuvcd1JT8zoYNqraNcTQz" + }, + "client_ip": "84.32.186.110", + "user_payer": "7DtnHdHiAA6JUwhSnCS95sc7gBMHLzcu2wiDDntgE6NB", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2JGGkygdTP78nhVkowKXxeKWhw4kurs7oaTTNdcvodWG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "noMiSMNpN3iGeX3WdF5M2KQdFUQt2RYYpfJ4dN1Ni3k" + }, + "client_ip": "103.28.89.184", + "user_payer": "noMiSMNpN3iGeX3WdF5M2KQdFUQt2RYYpfJ4dN1Ni3k", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2Jd5wFdygXNM9j263jWfnDkScjjig1KNRNuXg3asEAii": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "LimeA3gMLb2SjxrKbP7NsWk1UwTZrw4B6Ctc9dmVU6E" + }, + "client_ip": "185.199.38.133", + "user_payer": "8yfv9TJ7cxTUxkboDq5GQ47r6hvq12q55GBcocQNFoVq", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2K2tNRL26NKWEFBTznjgF9cH3tUKQCurjAxyGWUvVGds": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d" + }, + "client_ip": "193.221.135.100", + "user_payer": "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2Kz2VrQiJuDCX85Q8cUpKdAubhcQzEo9aWVy8Q5zNBmm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "D3htsc6iRQJLqCNWcC2xcZgUuvcd1JT8zoYNqraNcTQz" + }, + "client_ip": "185.191.116.170", + "user_payer": "D3htsc6iRQJLqCNWcC2xcZgUuvcd1JT8zoYNqraNcTQz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2MCYDCgYECTHinSNJerwfSpUJNPKvH4hCzX35aqyg7Kb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Pid6HQnMCFb9izqX9i7X6ePdUPieGmjHoPxC1Jfooix" + }, + "client_ip": "216.238.102.89", + "user_payer": "pdzzu6j8tYN2RwkeEJ6w6fFgHqHPT6mR17qCDBhDXoh", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2MZLArUVKJNd4Y4GnTXocHuPuSdhfSEaZhHmHTcVKdTB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4" + }, + "client_ip": "67.213.117.61", + "user_payer": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2N2BPHhtGLpLnYcUDHxyu1kwtqu2RUucq5UNgFjFHYDA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "JC846fcPP3ASxgCJFk7zHyyDbeU7BMkwr66RD6tWbRfS" + }, + "client_ip": "154.16.171.104", + "user_payer": "E1D2CrTDZyb3dw9Zt35oWKwAT59d4BnhuztxdoM9fptS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2N83v4EL3RoPms9E7gz4sJ1f5J3LHz1TjustBDGTKBA7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4k6wgP5WPBKQpsFGtzuXNrjcTE2fKWLj17nDvFeG5zSF" + }, + "client_ip": "185.191.118.2", + "user_payer": "6W5PcxRRGKZNTDtAZCyTbWefT1xRu6joyJxCzg8GKJuY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2NDRHVp2bdyegvvpbtMcGefoJjFFfKoDvncD9Qy59K9A": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "9JdZLEKhA7k6SxRQ4cJT2Zh5JhRUBJGXcjTNwMtTwSiz" + }, + "client_ip": "185.191.118.99", + "user_payer": "9LFcvnsUyb9eMw7FF4UX6YzhjjmJjGv6UPQ57YpiBjbb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2Rid56BF6PmXvKjiGKJSWxXghCiBXb8Zcc9g4CLyTjfm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9q16BB7WGmBxf1nJTdxH5zPnBUhtHqdqXqRFjSjuM4k7" + }, + "client_ip": "88.216.36.3", + "user_payer": "E5SLYWttYhTo393ag7rt1RhbxyTDvwB6dvQA2irDhyro", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2RtmxdSP84txz9jwNjoUVmqEjouBb9z6MXBxw2xt34qv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "FSyAsxcE7g8pSSEu5nx7Hkz44rMZiYio5Wz8Lszh3Nbi" + }, + "client_ip": "5.187.35.137", + "user_payer": "Dxzu45Qr6R6bSqEUKxXnNGzpbPLRCYf4CTePR2TaFDku", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2S6VytU3LnH77qotQFPftoAUndaZMhWkuCr8GoSKVAkL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "parafiUS6h6oLhCFwhjvEmQJKw8pF1iXsxMJdTq46dS" + }, + "client_ip": "192.41.71.184", + "user_payer": "zz1Lzdhwz4v2Xo1M1S3taQbXZ2EGMRfDstPVVjJb4sp", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2SgdRNB5KbWfsSsATUZMugb7GkujMbZqVbgzp7YBHBxh": { + "account_type": "AccessPass", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "88.211.249.212", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "2SqNVJZHRiDDPP5qPN5scpVKotbuBwYP2BaYKfjaDAVQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5t4shVsKnUqgjmhK3fFNsvyju2E6Rd7cc4S5pmqqEVEW" + }, + "client_ip": "103.88.233.111", + "user_payer": "HwBL75xHHKcXSMNcctq3UqWaEJPDWVQz6NazZJNjWaQc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2SqUjGPVkStpHm1cRuY8D1sHFk2BSrzEggtK5CuvfER2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7MTjmteQHhthwwTZhUzsc2dP4NBvGNRqj8jzdqNxHFGE" + }, + "client_ip": "45.139.134.104", + "user_payer": "2BYpEke9hJ5cUtPMx1mj1xdcyhNbmKPZcD4REcwgstcb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2TRPEzQLtZAk7EmkMnkmH6tCE8vpt9KaVVwhZ78Bhmtp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7MTjmteQHhthwwTZhUzsc2dP4NBvGNRqj8jzdqNxHFGE" + }, + "client_ip": "185.191.118.109", + "user_payer": "2BYpEke9hJ5cUtPMx1mj1xdcyhNbmKPZcD4REcwgstcb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2TWBFmU7pWUKogR6t9ntn2ikomvgz7amTVWag84vpef7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC" + }, + "client_ip": "72.46.84.111", + "user_payer": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2TbhDZ3TwznMNX7p7CMDoxpy6p6Z5n8MXpDHuQhtey9W": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "H3p16WCia8hmoXUQCh92EdTj1Dh24a7X9khtT42Xqy1E" + }, + "client_ip": "185.26.10.209", + "user_payer": "CtjzeGgbpHzDDDn4r9WJ2CWuDRTq9gwerbUuFXRWvwCD", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2Ty6RrtizDyWcnPjYjtCNjxCbizAvkKJ9RzZ2V4aBjMo": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.134.243", + "user_payer": "3Y9yo5arQUx9MQuHCWZBukfx4Ae9kLGcAUdBRnzid7Uc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2UGRCt7mxAqkMuE1Kw6ca6A7rCp8uubMgzivz7k6PXwM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN" + }, + "client_ip": "185.26.10.239", + "user_payer": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2UPa6zgo11nhzdvQ2hy4m3PumhbZhyA4nuqJD8cM7FSn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2vm1syK6EYbpvJmNQJJntt5iHEi4gDDDAfhC3yj3mmxh" + }, + "client_ip": "162.43.190.173", + "user_payer": "2d84AZfSYLfH4ZzwXHxRx1JYwdPLD2axWqNzWCQqBAn9", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2V9paKo5sacvb2ce4krQGpefEhSNucRSCVjmGG71hoU8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH" + }, + "client_ip": "67.213.113.83", + "user_payer": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2VdWrd24XX8mLpNhjFgsqHGgYHbf4dsA8H5CCuJHwfoy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ES1M3tMZ4rMTJ3apE75cHfeGWizDTrMMXy2zKtWkd38R" + }, + "client_ip": "104.204.141.245", + "user_payer": "7ow28Ctn1nJqZJKzZ9ZYUveqDvxMfBYXBJFHK3ZQ1QhY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2VybLPUqUNuuJcPFbeqyYrxu5hUMvQv4vCdbdS68B9dZ": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "82.21.117.188", + "user_payer": "2kNtGczVXdz84Z5dDR7eUHgKHHr6V8AqP8V7twtGPJRK", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2W7fr8JmfYHNu5QivNstR2ZngsRDFdBjKE752vZMhSCH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5XKJwdKB2Hs7pkEXzifAysjSk6q7Rt6k5KfHwmAMPtoQ" + }, + "client_ip": "84.32.103.110", + "user_payer": "7iAphSWfFfriTREQsARoGcfD9qqUqSjZs9BcotDULyrZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2WLrqqwyxm6G4PGB2vfDcTDtFQ8K4VXnY3DS1e11TFKa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "29JPiQnvuTWCMPUs7QCZrzjb1puubzfnGj3d5W6vF8zx" + }, + "client_ip": "103.244.113.239", + "user_payer": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2WTw7ATrUZLsd2SDjQH2WJwwyg3PGJVQb1Uq5J6UFP73": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "148.72.141.244", + "user_payer": "F6WC6QsdgvVtbgf61YZQJYeUW1pCb8QH381RsvDCmFaB", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2WVKNNRfBNmMWefQ5LuwtHRQixUknUL9rYMqBDPyoaSK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DpxYxiZ9KtXYqmQPTyU92dYLAVZM9WeFhv8qJLNv6mqM" + }, + "client_ip": "204.15.240.15", + "user_payer": "5g3BW7oeoEiXJtSZWYJLFdE11JX1BX43mLDPrV2fzrpa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2Wyfe2LhsuEj4wpAbWdxLwDxb9SeurfySGYYfLNBNd9F": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "fdzip81euDS8jEZHx5H1mn27zGVMLzkgpQuzYRBfBYG" + }, + "client_ip": "104.204.140.155", + "user_payer": "Bq9t5usaaa3eKHjVkbYF4ZMzusVt5UBiP98xdoXZekmB", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2XPYD38i6zHkhKCP7Bz735mXJruN66dTu3KWHVfkewYM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CorvusinCRvLS1qYNPHCzLft9wLg1nAfH81cUbtChK8K" + }, + "client_ip": "146.19.172.18", + "user_payer": "Bt2CkyNovDZf1o53cwnNUk4C2jLLj7KtxyXfnqd49oVT", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2XSMJBticp8e8yDJW3U9MowcAeu4Y1mmTTTkeMaTYfnf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9VNgapvXdLGJVDd7Biwbg8bVxH8vDNJX7tCsUiqezDbn" + }, + "client_ip": "70.40.186.70", + "user_payer": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2XpcMqMvm6pFzfg9cdECzeSSAFfPWY93SR6eFo7xuFhp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "Fk5GgQd9ZgQ1RbEeKKKsvWN4VSazEwUJi9VsS1ek7DQk" + }, + "client_ip": "149.12.64.242", + "user_payer": "6yFGGAgYpBxgYPuHW4rv7hJmhKrUiXKyHkpVGaYtKrwE", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2YVHyxmKpY55ybwRpNgqMnTsvw7htX7u1pyg6gduAePV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "D38Ww7FVeab5gnD7d3znDjZwVi77XyXE8MSA3rsBtK7Y" + }, + "client_ip": "64.130.50.117", + "user_payer": "HxGDmKC6w6LLhrSCRq1HaKEJ5wNjQf8XF3UVi891ZZpV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2ZJvnjQDyNBqVQLJiSA53EbedVd8P3SQ5NTcFAEEnLga": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup" + }, + "client_ip": "189.1.171.179", + "user_payer": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2Zb8uS6vqXGRiqS8YM1V9rgjoUnAvdpxCPpqDjsWuz63": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ZoD1XLMhxdMveAJL4x9oab4FhRKP5NThTnSCH19Tdjp" + }, + "client_ip": "141.98.217.103", + "user_payer": "ZoDZCucFALR6XbNnqm7WabtXbNqw5bh9pWymmkJ9KCu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2bgoEdu4rrLXXE5Dpfa9PKGmzMkVfLST5j3vRJpNcdxo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "D3htsc6iRQJLqCNWcC2xcZgUuvcd1JT8zoYNqraNcTQz" + }, + "client_ip": "185.191.117.142", + "user_payer": "Du4jcYA6YN2C3rk8BHCJJs9rgun3RpMi1WV31weBWXS3", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "2bhKZzJt5oWh9FcRRNtHf2mA8m4i7HLsoN1GaXtp6j9s": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ECNnK4VjcKTsABiw8FAp3JCE6tCmYyrEJthYVyMazmxi" + }, + "client_ip": "64.176.34.192", + "user_payer": "CuPQmPd893ACyPre5BpBpNNv5JK7ntuNbFVMECdrL2vu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2bhdwgSc8V3TWSCEY5hFEgAxVaVLcmdrQAzM1DX6Xymc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "F4pPHpCwH9EDDQ1VGVHVBomRqDvBP89KmBKx6HDymTZh" + }, + "client_ip": "67.213.117.241", + "user_payer": "3Gjc9xDUYWnjEDTBenDizYZGoXZtPVvEiJdcZMuiEwud", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2cFg6QwavHgH923ovHU2kDqfMoNtk9XPAUvT4dp1m541": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CvsxqT3uLH3sQSrpQjwKqJbzmCQMUZEB2R4ajraypAWa" + }, + "client_ip": "164.138.249.100", + "user_payer": "9MLpPVxbmtoWtKYZVUiKsYCvkaDMPVttnwoYTe4f6u8g", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2dvRiztxchzZ5ZWLFxPcNViJuByuf7s5ug4zcfDEG7Ev": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CoG8d9Fp2TFJRkAmrPMiPsGhQWHzdTTVoegEp9svRgmJ" + }, + "client_ip": "86.105.224.24", + "user_payer": "AkVkdML6iWaoyUR336h6VyahmtQ67LYjJfd4LgJXyEdV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2ebEmjVyjuvE8R3csYfLGgPwfDzV2uSiPYnWfokN6Kc6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4mzLWNgBX67zVwTykNnq96Z6KQLc8UyV5Q35EfVCDifC" + }, + "client_ip": "185.189.45.78", + "user_payer": "MzeXExjAaRUbX3pUV5hGQ9MJeAv5FAzsC3Es7dwhj4H", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2fvWot5hGcBdLi9ykHatYyi3eqEFwvNkRfNd4Yp2FAaA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2ADdvyuVUdAiHWYuPotBHY655zwhu5NyxT8ixBNbRCMp" + }, + "client_ip": "45.154.33.33", + "user_payer": "EmE5KsWqFYFyxytrCQWy91aGZy7nGfd96cdPfi7R5YRE", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2g9XHYNwodZz3Y3g8Qo9a6wLmkYTSjs9TSy4oEeAS2sP": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "186.233.184.235", + "user_payer": "3Bw6v7EruQvTwoY79h2QjQCs2KBQFzSneBdYUbcXK1Tr", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2gV3dxNSpZ4AEQQVsSJKUCRYEGa3fUKGqNwsBMMwJk6n": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "KTMkUG8WCw9FdH44jLMBpc1teGafnYL6SgP4fHHbsNM" + }, + "client_ip": "198.13.140.84", + "user_payer": "6dCYcUDudUWvcHpCessp15rJQp7JvQV3tpELXo29zHHS", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2gYDeE5nwwY6oEapSf2ywDjxReFmDtHnmRB9ZjtJ5CCQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB" + }, + "client_ip": "45.139.135.26", + "user_payer": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2h8CJ1FpQDGkdgNE7xSvz4H8KaN3rVkvaZTXE6JuVNcn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7" + }, + "client_ip": "103.88.233.59", + "user_payer": "56zeYqKPbVKn8cSqcRNvAk5VXjmkra9CjufoHLR1PDZg", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2hjhFD2MLf7MbkcohtRCbKcCz81HH2n6cjUBrMSHFbRL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "SFundNVpuWk89g211WKUZGkuu4BsKSp7PbnmRsPZLos" + }, + "client_ip": "64.140.171.18", + "user_payer": "SFDZe38ktiSkmDfiqH5BmjkoeAvbS24XBCNgQZTew4P", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2hrytZnqoxXzC9X7XWene8mXV2m7zBnYG4teNx5b5BTo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DURt7rLam3Dhm98nzV9gdbvc5BucoAQYE5HgCgGyYEbi" + }, + "client_ip": "64.130.41.38", + "user_payer": "DURt7rLam3Dhm98nzV9gdbvc5BucoAQYE5HgCgGyYEbi", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2iGNpBiyp9X1y7NXGrnaDFhNDCRSK5Sy854QeJBY2RT6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8Yq98CFAorqAc3CN7XtMVgKLrBc78wsBvjhAbFr4sNQ5" + }, + "client_ip": "204.15.240.12", + "user_payer": "5g3BW7oeoEiXJtSZWYJLFdE11JX1BX43mLDPrV2fzrpa", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2iniboEj1wqLG3mufvircLb5x6TN3s1nt29b5AF8FxX1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS" + }, + "client_ip": "102.211.135.173", + "user_payer": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2itmdZvce445W7VCNf8jgqGefpyeb8scEe9mPUpp2G2b": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Dt1eUXF5tLjVpARZ1HwfLmk6LJqAoqk9ueRmPBwp8ddg" + }, + "client_ip": "91.189.180.218", + "user_payer": "FNFDeXSjgswUhHky7cscKnf4vyfkQou8jZkXmCzv7xxQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2kUYt8XHdT12paajv91a3WkfUidMGCADZDzJxgxCTbcj": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "100.100.113.116", + "user_payer": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2kcWPLbiFTmoJSjXnhCboQUqaisS7XbpcEBiqHuK6DGK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "bxrAptB5ZpZBhoLedJpoGWY5hBjjt3zvVBr2323Rrq6" + }, + "client_ip": "67.213.121.17", + "user_payer": "21ugL9UmuXMMJiymDNRYMAaTtt9xSzZvmcTzu1HtzenR", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2mCyvrfZAyerxzeadXRpwQCjQcVGULuNDsyCz3XK2bDS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "RLMS1pv3YKi7CSUCKTNcFN5fFkXJc2SmCwPhbQpqZJo" + }, + "client_ip": "2.57.215.99", + "user_payer": "G924X7afv1u8jSiXoW8vGXk7Vg4h2ngZSeRFJAFWbaaP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2mMQUEwrVM1hEjQoHAKYsVFnGpBdigFwZDQR4qjWdAgy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu" + }, + "client_ip": "185.26.11.199", + "user_payer": "6ERi1d3xL1PofYUKC5d8tLZvPz3qnaw88euQqkvFy2xk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2mZJUUeegcoaDuGckYx4Ldtf9Vgyvrbt1bXZxA2isiMb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV" + }, + "client_ip": "72.46.84.111", + "user_payer": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2nkPoeXkPbeDszMywmwKyKn3hPXRz1DNMNYBErKcyc4m": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk" + }, + "client_ip": "102.211.135.185", + "user_payer": "6c7Cc5RxiCrvHtgh7d6oUcm3J6qopvkbBp5GaxuX1Nxw", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2nq5WACSAu5h4dCDj8GpDKgkiEqVe8EAnm7BRX1d6NAj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8aPHvzVV91jZF948tykkoF6WfgLHppNfG8Z3V4gCrDix" + }, + "client_ip": "84.32.103.110", + "user_payer": "GHxoCXtgHSjFVan4L7sVqBXwScd9sC17uke73WJ2b7w2", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2nuj3ThJEgNed3BVMeyzBdUqjDjv6FXnccHQvMs2nMM4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BR1aTt4ZZUCwWJDkSYf1hqkYJjo7Mb7Ar8iVTkeSwUB8" + }, + "client_ip": "66.245.195.34", + "user_payer": "HViQEoiH7whMUcv4ctVgnRKPiZVALwMjJH2Cj7R6gsR3", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2oPfnmdZ1rkUNAVY7YMAqRQSagdTiSqs1WHCcCkepFC9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb" + }, + "client_ip": "67.213.115.199", + "user_payer": "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2ovWGJYkdubwYQ8r328QZYzWosiErmC7q5XFXzFtnyyS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BANXwrLTkNHL6vTpKhXn86ySjnbwwGyWf9ExGgwZoiSD" + }, + "client_ip": "72.46.84.121", + "user_payer": "AuiWzyRuxswXmM9mMp8JzXvbwzKzsCXUQvhJyyTZBpyM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2paxeHQqhfnhsXpS51etFZF8utndsL6yFiHh1JBFKdS5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i" + }, + "client_ip": "109.94.97.187", + "user_payer": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2pgUXGduCGT8MyHMjGEvM3qZ3DdBko26ZkHz8NWHakNH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "GiYSnFRrXrmkJMC54A1j3K4xT6ZMfx1NSThEe5X2WpDe" + }, + "client_ip": "206.223.233.229", + "user_payer": "3mgPKs5MRnWNJYrxnbf7xiHktKTQGNcyqSuCY25mBWSt", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2qEGTvDWgPxp8L69EF5XWvLs8RtUG18uDuk2zBzrWZGJ": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "107.155.102.114", + "user_payer": "3dDr9jeiPnMd5BL3GwAzCRuvU9kSsNoDo8uCqhtSkkNr", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2qQn9n7Geoh51fnBePPoZTfn467FZjpLxMJbf8RY1wKb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4" + }, + "client_ip": "5.101.137.205", + "user_payer": "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2rKvNyNbeAWYmBgT39yXgMXnF5RVW9AdAvKnGnt6hcFX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "G1bLKfyNm7zsmmYEL9dyxBvMtxpFcwy2s84bHDj2ZFUY" + }, + "client_ip": "170.23.153.201", + "user_payer": "2ABbPEEr2TvPGMAdWC7M1y8QUwD437z8w4YZbrvU7z2U", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "2rdvzSjrtCK7iAHZT7RPyEAKnmaAmCejj5U6PKxV3wge": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Awes4Tr6TX8JDzEhCZY2QVNimT6iD1zWHzf1vNyGvpLM" + }, + "client_ip": "94.158.242.51", + "user_payer": "EDBBUovWxTSLumyUNTbrp4XyBa8mX1eRSJU1XbQtnZaK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2tpF2Hppg88DYgbMS6m8AR6nNZGbhAZvyXm6q3jr4Txb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "4uH4G6YiD5G8rU3mtPg73C2Uqamrqedy3FboTZcZrh6x" + }, + "client_ip": "5.199.164.88", + "user_payer": "BVxqpXj31UVMqJuhiztN5WxmuJbCj3XWAWwD6xGVqyhs", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2unLuf6SnzZ1kD2NETCd1PXXXVvyoiFyM7vptGm2SVmu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GoRebkiFvdTpmFNJ4KCB18BkG3bAVYRmuHeFUUbbMrcw" + }, + "client_ip": "5.199.172.139", + "user_payer": "AkVkdML6iWaoyUR336h6VyahmtQ67LYjJfd4LgJXyEdV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2xHRx1s38G2KjBgJ51jRTpoHUrgfG6bPNqTGMSDjwYwB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4" + }, + "client_ip": "64.34.83.99", + "user_payer": "3p1CHgXnD2czQegmip43guXdZ5Ncr73oMNH61hjxNYA6", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2ytpf5YFyHyF17KSSHsuxFFskXCVLBVDkRkQiih7sgsy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6NDen7aDi65apHo8m1Vea4nuS6LyjQeM6pDNqcW4Q5Pg" + }, + "client_ip": "45.84.193.3", + "user_payer": "Wwxz6ifCzHBZwM3pRobNXW7XAwmmu99GwE1CFHS95Az", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2z2T4o9Z98V8RxwMHc1xMagaHReoQuz5FBTVX4fTPkkz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "bookoVmqw4QjVj5BbkFacouadx9M7816wyRkfM7A5Lo" + }, + "client_ip": "139.180.132.226", + "user_payer": "oWPCJQUE4QP4ii1oCSLmryBaVy4sNyN1NVj16TZtyDe", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2z4Cf8C8XEqmFBtf4h5rRLa1xJfsXX3Eym4jAQVWrStJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Gd33fENP1XsBimff41s1EWrs2kmqfGQqEJ5CQPQB3Jwy" + }, + "client_ip": "185.189.45.14", + "user_payer": "T2wu5Hc19RLhCG6udxBvj1bzdJeeubPKxvCJw7Yec8s", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "2zsVyqfYyFvNssYCs3F77X9kEgy7rZZjHa5QT1HTiuZi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "4iWFZJ4NCrkHdaU1zzsbnKdKubce685LecSJJ4cHH9yG" + }, + "client_ip": "84.32.64.95", + "user_payer": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "31mYNYa818wzBVV3dWKZT4viwQmxd1dsxg1rx2igxHwe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Bi9kKNxfW2XqgCmLcuhHt6A3x55GuAGmrVZxRHLyVoQ4" + }, + "client_ip": "64.130.63.18", + "user_payer": "Bi9kKNxfW2XqgCmLcuhHt6A3x55GuAGmrVZxRHLyVoQ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "32D95WzHrN22dYATirpCCZ94uxJvMhsfEmiu2S4LNwDK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 247, + "accesspass_type": { + "SolanaValidator": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i" + }, + "client_ip": "185.26.11.195", + "user_payer": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "33Cr8toRUGeG8FCekgMcXSXaVNTGYAnnVojg6kfm5FeR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HrxRx4L93sr7zdGmmbM4FYJqbjN9uumoisQy2xJiT3L2" + }, + "client_ip": "103.28.89.188", + "user_payer": "7g7uRUy23fghiDSRX1d48K8SjbWV3yxe9tjNYyrPHGbr", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "33c9BmB1trzMYoSMe3zmijFnCouUh4BjBfhWF4UkS1Sr": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.41.56", + "user_payer": "jdzEWEeHrSBy9rCr2KG8r638M8chaVZtqoohnuCqPyR", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "35eHC4NYj8u6Crwj3sgXZZV53RL5DgjmhfsWHWfdgNYA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "7AZ5mrZP4pZ84xYvfFvUQ34wkgW7krgftqTeEik9xa3U" + }, + "client_ip": "2.57.215.111", + "user_payer": "4SBNw6R5swH6QoeNs7x2VtAZ3xCCtqgptPD1qmyWkVNs", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "35jzeJphn9AFMhc6eAHDvCf4B6Fzeg7fW8PeoA3x1C6r": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "meshRrDTME9cL2FSQ9E56EncfkZ7vL8apwcCFsw3o6Y" + }, + "client_ip": "64.176.7.65", + "user_payer": "ooc9bBwcrSKVMWNCojjmvikh8NkSPSgRebm3DWMZeyP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "35v7nyD5KiKAj9FMNeP1fjM3vY5wGVbSQtmxRiqdcGac": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EWxtdsTkPkbyL9HZuVvQco3PdEt1VhWnjDQYuGc9R3mF" + }, + "client_ip": "88.216.197.30", + "user_payer": "FgUWvZC4tig9cKG6x4CPWcscGsfBfXGtGcaetp4jThMg", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "36N8LsdfuBLD7wQHKmwQwnT9uAFS3nqYDGwY6sKkxZoB": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "64.130.49.100", + "user_payer": "2YS4G384a65hrT4rLEwUxroLK3aiooHB6Xhyoj9A4YaL", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "36c4Ezzy1XtXvb6gJ6L6SUqmVrXQFrZpaUWohpSycM9f": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DE27y8aLa1JtNorH5bURwLzdLnCT15dwC4JpwPqbzoa7" + }, + "client_ip": "38.88.64.94", + "user_payer": "BD5sHXsvoe5ELVABzoTHjUVWBQj96dnjVhHMieqF1Ehi", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "36kqBKMDJ5jvdMGgakJEYR5XvdWVZ97wsBUsKEYTeLaw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8ZQg3K1V1Z2BVJkjmnxpi43WKhjPGXphzu5QmBkJibSP" + }, + "client_ip": "185.44.207.199", + "user_payer": "8JeyzEF34DdmQUJd2S5su5ASFZMwxUniVXh2943V8LsX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "37xGMdPiQ9sajCGmGx9onxqhBfBBvEVnSRUgBuf5uq57": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "84gC25fbFKYueR9WEfreUysk1n3ZFxLFDDjbyqeqGpoW" + }, + "client_ip": "203.23.178.55", + "user_payer": "84gC25fbFKYueR9WEfreUysk1n3ZFxLFDDjbyqeqGpoW", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "37xU4T6CV4v2oB21PumEx9jv3NqUhzDNhWNJZ5QB6VfS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE" + }, + "client_ip": "212.83.42.36", + "user_payer": "kiq3Yr5yoAUBjaT4yEmvQtnCzaCsRJ26v8aCQgDFicd", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "398pbE2gv2MrV6g4PnQCvWBd6cHmGYfRv9nLoDgwiUGg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8Nvaxzif1NrdvxNkRetjT8xJvd33EHkKVrfL8EDkgaNy" + }, + "client_ip": "84.32.186.133", + "user_payer": "69QYqUebtBsQVaQiLCJsx8ZA3VknShJ2pE3R3PFyoj7c", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "39bjEe2zWkB7uqRvkKuBjhQuHJgeijzURKKgiZc8BaAo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6yFGGAgYpBxgYPuHW4rv7hJmhKrUiXKyHkpVGaYtKrwE" + }, + "client_ip": "149.12.64.220", + "user_payer": "6yFGGAgYpBxgYPuHW4rv7hJmhKrUiXKyHkpVGaYtKrwE", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3AkSsboxVVMysYAgdnTvDBsGTbTdJnQJwunn8tTzt8K9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GPSSYM5HcpuaZbzMMtyCcovXv3BBLm2A8w7QacqExteL" + }, + "client_ip": "38.58.178.8", + "user_payer": "7g7uRUy23fghiDSRX1d48K8SjbWV3yxe9tjNYyrPHGbr", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3AvdBLa5cVsdQHZomKGjpMEHpi6aQq786txiY8qdE21u": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "207.90.225.163", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "3BbWfoaoSm4jqFM8hatcYc2HLEGJomLRY5Bky5tA8XYC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "stacheBmGG5zMKuetUevAbc4m4dLbve1VPcpSur3voH" + }, + "client_ip": "102.211.135.187", + "user_payer": "C3vtrMHPzRJpo3sNtVLM27gGGoWLoK2ubFgMcijFydVP", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "3BnoUDuQFT1aMxEgzXWuAgtfgcEy7uTopNYhutWkUiH5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "15.235.232.94", + "user_payer": "4yA8G3Hk9EjFEvu4fU13DG4AG9YJTtGqFqTSxUf2CpUa", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "3CRLyA36F7hPf3ZsMzjphbH6dr4ytZCGP9YdShSRAZmL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y" + }, + "client_ip": "5.199.164.113", + "user_payer": "J2ibtVSFZd11ccVf6CYS7w1MeNiCjQjosDAofhZbaZ6T", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3Cc2oLP55Wh1f3fzBp2VX8Boy4cSqZF9RmnoG3Up1Hef": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "152.233.30.67", + "user_payer": "dztW5Mziw5eyMEdL7p6ZEVnQXAAWExr6Zjtu9FGGwnA", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "3D1JW9FqYHn72jPbECtvC7EWLctxMCwtpuA37T9NyDYw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "vaoJKVZYPAsqc52T2nNQhABR1gU6Cy2koDKfCQaEiva" + }, + "client_ip": "134.119.192.253", + "user_payer": "BxzrY31r2rmee7cmuaPjKBEgZYTYniobe1MgRJg79ZPD", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3DSEPxnP14VXuAQYt72dGqihCS2qXevKfDApQ8xwhByj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz" + }, + "client_ip": "67.213.113.99", + "user_payer": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3DmwtiUiMdBTVAiaip9Hnv7Zn5ngMoEa6w8MNU9RnT6f": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "MCFmmmXdzTKjBEoMggi8JGFJmd856uYSowuH2sCU5kx" + }, + "client_ip": "5.199.172.140", + "user_payer": "APaEbMzPskbrJFESuNDj1AZuu6iQhQcWeP79kZjy19Nt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3DvCxjrs7bB5noX8L4NrpHQBFX1tAae6L6GG6GaD8Y1L": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AwX7mQUr7iuR3CkchgbafPUz6QzEn6ES7TF2dt6Mh2xy" + }, + "client_ip": "193.243.164.200", + "user_payer": "8QQLUdfQoZJphGFoVhkDsexsobirRtSNM1D1Z9TVtsYQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3ETDfbnX5Y8ypsJDUtDu5mS3rXD3oEj6xBQBmuFR87UV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "SWiz7QwnYPm61pWWUUkMhj4r5pZLP1SvYibdHcB2cov" + }, + "client_ip": "212.83.43.180", + "user_payer": "ENBBdAkfEj5FgWwuyxaWAprHaSAUuTainYRCZbMET8se", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3FFYDannyAC5GxHEMNuDfLrc1QP5tPPAs4MdJJ7NDHQK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4m9EFCfDGk4uKntwf5Ef2q29ZUDhcnnU2WFbBDmPiixn" + }, + "client_ip": "45.129.84.95", + "user_payer": "7G7p8fyPYq8UCDME3enboT9ghG4d7ykfKMWgeQ1PQEo5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3GWBKZwRDrPHP8rrwU1NdwMPJdMcu8y4YBo2VwMfM6vX": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "13.234.35.9", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3GcLZL9QxZX778kozeFajT2LQbArrrFi5RCZBximVGrC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "gridqZmeBcsUKT2Mv4M9YFHFN3tVLFb2TCtTcLD1cAd" + }, + "client_ip": "45.77.241.154", + "user_payer": "rgh2ZRt5ejyQ7saSLPNmYXsNuqwvkn8jzEWWXoAWrhr", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3Gv6KKcYy6581RdpCcb4D9FJqYgcKEfApMdhiEV8JL9e": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8tMuAgQnnG9fy4CeC9ci6VuMPEr42rDCZ6rT1fmtHzAR" + }, + "client_ip": "46.17.96.235", + "user_payer": "3Pfubj3ytkRxFAGwFb5vtacuZJUxko5Du39xie9MBXuC", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3HRuYAEiN6KqPsnASRp4WfzsB3qB7UDAq7HHWX2yFu7Z": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4b1onMDEasBh4BuPekQWijx3BYR64hAE1z2jJyeZUkck" + }, + "client_ip": "185.150.191.216", + "user_payer": "A7nii4QwFSUaz8zCbiy1xFaapnJTYxLLVVWj9TvaFYC4", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3JuCwUDvJn9uy8pnvQoriZzETag9mbyhdnPr7YDHV3NP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BxkAkLR2W3agWtjMXBNvhxmB8vsn7zhjNQcyfost99KY" + }, + "client_ip": "89.42.231.131", + "user_payer": "7G7p8fyPYq8UCDME3enboT9ghG4d7ykfKMWgeQ1PQEo5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3Kp7C5fxRmitpoerSokj7ae8qaYkLffd8Vagox2vtr6X": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9USijQaAfSzw6gWbHNq68VVigmj3HvffDJYhbK4tfquB" + }, + "client_ip": "84.32.103.88", + "user_payer": "HaHbuziDiHUjPtiiCWz8Zin6hdR9LNaaFfRUd8H19zZ2", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3LJaZGCQKbTkTqFwvLyPvK41ju9Vr1qp6jZaJuKTJvyt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk" + }, + "client_ip": "216.18.206.34", + "user_payer": "6c7Cc5RxiCrvHtgh7d6oUcm3J6qopvkbBp5GaxuX1Nxw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3LpoLPjtCXiFuHkrJbrbyVPCLJx8Dh1mPsrpVBnrGYQd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2GuFrgDRVrdAFLZmH2Dcj9kRSKGFgoYxv8n7zdb6sb8e" + }, + "client_ip": "89.42.231.238", + "user_payer": "AWqkGtq9rgpMDc7pTKe62aJuaX8ZvrnZxCpr8nfpDSCK", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3Ly315PGy5zT15Yu5ZBSPCnrdpX9H2Uh2jD1eZXdMmCh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CxNyEfLkPZ8N2LmoznQuGwNVE4FmquE5VpM1NXX365ME" + }, + "client_ip": "192.41.71.180", + "user_payer": "zz1Lzdhwz4v2Xo1M1S3taQbXZ2EGMRfDstPVVjJb4sp", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3MHdxJtWLJ9f1kzmR6PXGKdgMRstSNntL98AkhLPisrR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt" + }, + "client_ip": "67.213.122.21", + "user_payer": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3MLSDSaaUhGcYkqHCwtEYe5S2Zy5eP2vHqQ5s3shdwoV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "MBVyz9s72WSfUmbr1S8fgHjDJQkPs1Q4Wxi6A2Mees9" + }, + "client_ip": "103.88.233.59", + "user_payer": "GK4urAXrXb9MaWMY1pf4yNeVyeewAbboA5q1urFaSV92", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3N2yMGCn3XrqkWgVnrCgN9j76ZMcosM8NpwdTHdpWSub": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU" + }, + "client_ip": "5.199.164.126", + "user_payer": "563VDfbQaPuGGGpFYJdXq8TycB7egBiS2CGDdbYCRe52", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3PG3w4Hq1PZrL2jSn4z7xHLHPWJqrLD9c8L4wgdizBTv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S" + }, + "client_ip": "103.14.27.47", + "user_payer": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3PQRb3ET9sX3HT6tndmsGc7QJHQAYKKu3CHpu8VtnmpU": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "57.129.76.214", + "user_payer": "DZfWvzjaHbF9vJunLMfH7DnoXniVpAhxqX6rw6Y1ewr7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3Q8j6JBrF2aRoW5ppn8SsWVtJ6musJ1SYqwLF1qw7r1h": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "4XspXDcJy3DWZsVdaXrt8pE1xhcLpXDKkhj9XyjmWWNy" + }, + "client_ip": "91.134.83.82", + "user_payer": "HXxMuyjuXoeNy3fLb71oMvFQix9FxiZH1d6JQTk7v811", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3Qrj5c8PA8j5BCJwynFFMUCV1F7pWCxJCTTeZEdNoecK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i" + }, + "client_ip": "162.43.190.159", + "user_payer": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3RVF4k4hjbG5hAoYH9jE4rKkmW3Y6W3iXUrqVtzLNJhj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "kom1oNHyyt84XLGVfi5Jo1qkVkU5xG1sBxPG19rWknE" + }, + "client_ip": "67.213.127.115", + "user_payer": "EVucxMafA7ciqqJ2ndXjqy9KCtxdiWBnEp4j7sZuwVJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3RmeijBVtvNbM5gmkcFUqLN3ce5P52CfPAm3iC8RjRzE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "BwMNAbBwoiYDTHVXQq7SYQqhAuYbXZZdCvJYhQTsMAwH" + }, + "client_ip": "185.209.178.211", + "user_payer": "6L2RMSPbZjFnMFJ3FRgDgTb6A1FEmDydDEmFW7bXZVrk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3RypPepad96zCCCbssgWhPkaGcwTjLpn7zwnhnAJwTUr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4" + }, + "client_ip": "162.43.190.145", + "user_payer": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3SU8TaUcVeU3ZRudj1H6Vd6gpMJaDVG6aySUTssXCafd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "A79u1awz7CqnxmNYEVtzWwSzup3eKPNW6w2Jrd56oZ3y" + }, + "client_ip": "185.26.8.37", + "user_payer": "Hpp3K99JubT3LKFxm98LuRcW9onLck46UqYwNTmkXoTe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3Szt8dfNNRTn6umkKBDGrRrVxkfE7j8TLtR5HtBEFtyu": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "208.82.62.246", + "user_payer": "JiiH5APbGPnP9EiDwojE6uQGmyaGgEGiXNg8wDzCvRP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3TVcwVsNxYaMk4xHWKqXZV86CYcbNPD1QuXc1rqwrKcL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CpdzCVzaR9gjFymmEVE8xHboJFHaDnimRZ448cMBs6Rn" + }, + "client_ip": "5.187.35.136", + "user_payer": "HyLukBGTkGsy4uKVtpefM7ymdxStm9Tzs3J1JwVMjdj3", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3TZ1tWUgghmcKPm7KpkzYnnbGRs2t9PqWKMdrwBK9XpN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AL9SuUeJT9azUSj3REGfV4rJZrymDcNtSnsQVACp6MCy" + }, + "client_ip": "89.42.231.125", + "user_payer": "HyLukBGTkGsy4uKVtpefM7ymdxStm9Tzs3J1JwVMjdj3", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3U7kxtuMRtb6wF6seCSAzLXEvZZmxV9LUiKToYuCAFmw": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "146.19.172.16", + "user_payer": "CorvusBcMUVWhkSQwP2ufQKMozw5MhYFXRjEF7Y571W4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3VnsssdPQ4muBSozNkSSE8Xmibbo4gNi7qZ4WkVP2wnX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "ErZietq4j9LHJs2wawHyXEp8zMRjTYzdeE5FdPqLvkei" + }, + "client_ip": "37.61.218.226", + "user_payer": "6uw2MvDo5j1bqWimPBFUx3AFjUMSHdm9jZXw3uYyNEAU", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3WUmRwbmNkCehqf3RdHeKrTqMXVWTD5zq3iBxDY6cMKC": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.239.117.61", + "user_payer": "2X9nDc38gnCH2syJk6tXEq4NRb6XMXaZRre4TCm6UcGS", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3Z8PxEUYZL1fFdUpSLiqtKB1zNyW8aAopLARMZKdARzs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5" + }, + "client_ip": "136.244.83.254", + "user_payer": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3ZgD9ExQddt777ToLmxK6xWEpZNbidrWudg47be24XSv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "G4GT8z4AKWNoy3x6nuzxW83UfFXLXzrwn7DZQt4GvWdU" + }, + "client_ip": "202.182.99.41", + "user_payer": "DemMMhqhEZRQxFZUj8kvmdPKKEhswAZGr67tiSwqk7iP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3a3c5mJfSPrvifcG9J5ckViZiUyifas44WgiVuw74As4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "73hojLdq1vZDSxeVQEqVFJ4iwLngdvEJPEpEHkSdv6BZ" + }, + "client_ip": "154.60.100.87", + "user_payer": "uFg697vAkejh5wghe5Q6UzXan4baDabrUBcmgDYfZ7J", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3aTSBnvHNsRSu1kmuN47N8iEqmuXX2XqMXqGw7voFF2n": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2K9jUA6Z9M7ZmuMiW5ogrVBoAeeT6kgC93GecbtpV3DZ" + }, + "client_ip": "154.60.100.82", + "user_payer": "4pNdwtJZg98QxhV7rcKsYZiFS9MY27XuNTwXjibgm8Nc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3c2GQPrsCrYTNpkJGNYqqgoxNvMuKtvTfSTL9nSbwECv": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "92.205.32.123", + "user_payer": "BJnRbknXAAdtpjR6SzujvnS32gQkXjpLQvRfnsSdDpeL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3cHsKbvyTWBbJBBAWzD5t8ciiKLN7FtE8tudtr5ZQtsb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "7tqeaFKsg2K9xKnQWe61w71AtCZVMQvG4hbFAiFAngYw" + }, + "client_ip": "84.32.103.89", + "user_payer": "9Ud88H56aFDhbYwTcEyQ9nu8EhyjdPQr6K1gsgfGmJVN", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3cezCDCLFfdG9t9FamtTznnc5EDZQgyMjqtQfcGZ1fAG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Ffwq4hWd1i1fMAUC54MHbHvPu8aAuDrsmew2iQFyfjvu" + }, + "client_ip": "192.69.194.210", + "user_payer": "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3cg4tt3VsJ1ZpiBnCFscEs5ECps4TkFFCBjD9258Noff": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "68oqDzBo94FgfRUAQEs1pf2fdMQ5v4yfFpgGu7rPAqZz" + }, + "client_ip": "95.179.216.107", + "user_payer": "Ey3DkEVbfBxfWmkTsG7Hqj7jshYf5Zx9H8462Zjjkykf", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3cr6TckugiVr5ik4bRNDMyNbmoTDgJArYp1KqQdrQV12": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4k6wgP5WPBKQpsFGtzuXNrjcTE2fKWLj17nDvFeG5zSF" + }, + "client_ip": "84.32.103.10", + "user_payer": "Dj9yNRRBNzLq1opWCzUrXvWnvrQjN19sT3ZLfighJLSo", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3dcqjq1Hfb7ojJavwJyqGjHoBRrVeP1ZqYaHFdFAHvPP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu" + }, + "client_ip": "103.50.32.189", + "user_payer": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3e6QDLpcbDoy5cfvprHeYe5R3GaDioT2NXq4tM5vQyhH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk" + }, + "client_ip": "72.46.84.111", + "user_payer": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3egRR2nCb86eJStgZrqfM9AFFFdP5Dg1PLuNDwswATMJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "AicQr2zCWBLiBwt2r6o7iTemmtyE7q5pTKyuuupbXEQA" + }, + "client_ip": "64.130.54.174", + "user_payer": "EEaFqAtZatV82VNVQVBBvPizxNmNxbvsvxUuvJMcDnA1", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3enGzLkunGSLPpiNhgrCzAMFyNfiwD4Gp7qup8wi2Jm6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "spcti6GQVvinbtHU9UAkbXhjTcBJaba1NVx4tmK4M5F" + }, + "client_ip": "185.52.237.102", + "user_payer": "9ymPgMb7gf8N6b2vHn3W1fzigBxd2RUfsoHmBXd2fqjH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3fG5H69Rch8JsMeuknfYgoqPZaEzehJjxW1hEDVKU5JJ": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.130.124", + "user_payer": "4PtDzmnSwq4rG9iJzEAQDq71sbm8BBcsYthVrVtHQ7Kp", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3fHtSy9mbcJBs37S4o2kF3c4uRAVR2o6J35xRnxmgpsz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj" + }, + "client_ip": "69.67.148.127", + "user_payer": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3fNLSPmHtkBPVu5PagVJzFxQvphmVxAUDsndf45uz3Ac": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7" + }, + "client_ip": "84.32.71.239", + "user_payer": "A1s1kuhM1af7N8pYAqyzkug87MUBsQDATkxZp4Zb15o1", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3fiY2YdjRbCV1Zg5QoxZ5wut6VVk9Pu14iPCYJ8CrT1n": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.239.35.61", + "user_payer": "2PZr1LmhmSp1a7aC1BWy17Uv6ygyRLWcf3wCGhkWsuDr", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3gHjFSrnjobk2fuohZwNiHMeNHiX8nMmSNhL8ksHjtnh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "A4VNSZQaPW7zDbvCGdq3YJFNtjNm2wn1HdcvpzaovsWA" + }, + "client_ip": "155.138.213.71", + "user_payer": "C4b5kp4NoCUwiFAhZADES54nGCtUHAfRfVnCo5NU8vmZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3gR8S8DSRbmyYantY59n8Cx15hKz77Ljcsi9KJET1wQk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "SENDa18d6LsC1f85AJXXMncBxQyFQKSJWZ1jaop5K87" + }, + "client_ip": "185.191.117.75", + "user_payer": "4hkX4mZmnJER1T7raZpdVwTNej3gAeeTSpTKX6HvNGQt", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3gk2kFg67mE41kS1JVKLUvyHYjEwya9LpFQQrdFcY5Qw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DEV9B8dDSV6it7AF2h5rzpuFyFM15DRSSUMP8MGQmrR2" + }, + "client_ip": "66.42.68.193", + "user_payer": "A48xFiZzS2VyPWRLHjw65K2SdBdz4MMcPqaBdiPLmr77", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3hf5UPq7RQZJLt9Zj8LcCvSqAtjG7Pa4nFkUQycpKd2Y": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "NLMSHTjmSiRxGJPs3uaqtsFBC2dTGYwK41U18Nmw5kH" + }, + "client_ip": "185.167.205.3", + "user_payer": "DzFn1LG97hQczGVqcLHjjetnMoGyHG7KohJxwPRUxfQD", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3iAxDp64woP7w5q7MaeaDGPzAhnar2g9V2s9xXdsrfAz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ" + }, + "client_ip": "185.26.11.195", + "user_payer": "TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3iReaWSayBW6A792wSWdp1WyNjakr7c8MfndZZScVbFe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "U82KEYMnuCiZSQbvuCJTZ652HX9NQ63uNSnxyucshrk" + }, + "client_ip": "66.165.233.74", + "user_payer": "FXq1BPbEQoz7fEni2yqfcP5F4w6fPrcebBmQ7ixrFzHa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3iiwzEuQCpZ86geZZB9gBJpSTdvLDVxmh6ih9GCEesjg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "3psxMyr7rQzywVp1MXKd1XFmFz33NjydzCoJx9t2sMQW" + }, + "client_ip": "208.91.110.176", + "user_payer": "4CfRQ8aTeemFXCiHyLdjbgPuDrFnvZKmcxjyEUofy9Gy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3jekkDH1X9Cof9VwTrzX3o66JSfmUxEoLZoMoHy8rgiZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HoxeD2i1Jaq4uxvQDBCUVMP9XMVM1W6V5fKMWp5eyhy5" + }, + "client_ip": "46.229.232.223", + "user_payer": "ActdAKrRbwAADw7D1NQXuZ5Zm9jfP1AJ5kSj4ToLa9yy", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3jiYDfjfGBukVd5FjSFiLDxRw1MoSzhHbYnvnamSHbrf": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.43.52", + "user_payer": "FWEJJUXmbYX7xqgNcdbKmeoQzrs9AMVXk8Tf5MyXUkFG", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3jya4fjPqQxQBCWjbv9KGCdjSPqd8vTjVDF3TtapnHax": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY" + }, + "client_ip": "109.94.97.183", + "user_payer": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3k4iwDU3uXV56S6uVd62XCuhy7HeR4j4f6sLwefiC34K": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "STPTshazcjH6cZMHzQBrggFSPHXYCTRGB7ctqS1AjkH" + }, + "client_ip": "102.211.135.175", + "user_payer": "STPTshazcjH6cZMHzQBrggFSPHXYCTRGB7ctqS1AjkH", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3kQpxMK74P7EaYGTM1gWXEwEUu2S5vM8BufN72FF26iV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "4XspXDcJy3DWZsVdaXrt8pE1xhcLpXDKkhj9XyjmWWNy" + }, + "client_ip": "57.128.72.164", + "user_payer": "HXxMuyjuXoeNy3fLb71oMvFQix9FxiZH1d6JQTk7v811", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3kRufqENSvCB2vNLCKDbknFiWNhew3DceRUnQ7znSAKc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE" + }, + "client_ip": "66.135.11.69", + "user_payer": "kiq3Yr5yoAUBjaT4yEmvQtnCzaCsRJ26v8aCQgDFicd", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3kWGVqj2WGNozuaF2eV5rdYdZiyEg1U7Hbk5cL85Jgnv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DBaSmmAR6qAgsXefFKRYcCnbW2xZ81W9X7NPtChabNWo" + }, + "client_ip": "84.32.71.233", + "user_payer": "9Ud88H56aFDhbYwTcEyQ9nu8EhyjdPQr6K1gsgfGmJVN", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3ka4WqwJJMuSLrwSs77ofp22ReDpE8xJA7p2A4F6gius": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dummy9EC1tDaqEHtcPUsRbbQFswAhkwMcMztc7ADQvB" + }, + "client_ip": "64.130.56.52", + "user_payer": "C54mv9sWeajyVVci1gMhpfTupFESj9KpQz4ek4fGGqgV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3nE17rLQsS5Ygm34omTCAF23Gttr9bbrdpZ2a4dsNtNw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SscQkTYV2BFQYGGffAmTzvefrFrw6z9GNYiWHstVZ77" + }, + "client_ip": "151.123.172.174", + "user_payer": "ssZbdqVceyPhupmozC8pAEWNC9T984bNBeGRr18DnDz", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3nLaA7Pjy4giiBp2oSgA1Sw5gRbtf4HxyZb6r7pCiJnC": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 250, + "accesspass_type": "Prepaid", + "client_ip": "198.13.138.178", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "3nVPF594aBX9GQmD4YGQ5jmymU9LEiyZQjcUK6qTD6Uz": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.61.161", + "user_payer": "HXccB48FSc4YsRy7K8gobg2qdFES777cuurPfK6XDo1q", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3oFa29Q6akrfE3BnmdCGNxotATSsv5PYrjNJXHBQdYFy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HwN6eoEe9N3kwHi66hpQDBMFPk6ASQGthWKPX5MZmisp" + }, + "client_ip": "216.238.110.55", + "user_payer": "7zXB4qbj96s9Fryk9GDrF8vNN7sce65Z6yaLTsHxjppb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3okGPWtUXPXfHnpS3Ggrf9k3wQpPuW3JaVZubdkYmrsM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9Ufm3zGQ5uyxAc6rei6d4iXkkuEhdCZzZ9dpTXquX1yy" + }, + "client_ip": "64.130.40.201", + "user_payer": "GgipuMTLa5cuEkmjxYeyMLPZ7vekkxFJqoHcakxjrtJm", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3q6cXkcoyQmo2Gd92zce2ybxSnydyrScW6jsa54KxX3R": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "164.92.244.134", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "3qL1zDoeU7vc15K8Vcb5BpHn776T4AnTkco6AijXtyXp": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.59.233", + "user_payer": "5eJnbUbn2cY21t31uWRUBLdmYkoAvuNRxWgugFJVtZvd", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3qNqccDi5BspUCAhG13yW6QNELJVTnL9mvsgK9eWinop": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "64.130.41.230", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "3rFC5ytFuEVHiAEG8Lkgxnf9uaC53tfqYmxPNHhZKHtd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4" + }, + "client_ip": "109.94.97.187", + "user_payer": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3s42Qconz9P7H9WAV9JeAr5aYQvv7AM84d687Q3rB5aS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "A4hyMd3FyvUJSRafDUSwtLLaQcxRP4r1BRC9w2AJ1to2" + }, + "client_ip": "64.130.59.234", + "user_payer": "A4hyMd3FyvUJSRafDUSwtLLaQcxRP4r1BRC9w2AJ1to2", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3sj78RqWLezsZT1ffM5P7dm1LgtSpwLnQaa92sSeCAwu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "bay3wXfJsu9ds1zQBoQQ4DUwFGs3NP6q4gca9WM5G1z" + }, + "client_ip": "45.152.160.241", + "user_payer": "HC6Lay8Ax3agYUCexZ8PmT9iUTwzwACo69QLppHDAUcF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3tH2EvgM1vh98f9JB54ZyF1V3PuSrLdodstsh7AVvfmw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "MicobNSLg56V1PYTuKcbxnjfBa7Cqqq9pS6zvTF3cno" + }, + "client_ip": "104.204.141.184", + "user_payer": "MicoB9cA9R6jsicdhzWFjwd9HMkV8FA4o3WxYU6Z2yz", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3u2mARyMB5xhnsfg9M8WD7PRHpz5aiLXXHPWQUHnEYyY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA" + }, + "client_ip": "103.50.32.193", + "user_payer": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3ukkvVAqCEsaH4nbmPq5hNYTf7Cp5yaAkxVK8rZNAaxV": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "152.44.43.130", + "user_payer": "9YGHJEuxtnhhnCinsWB8bCTF5CY2fUXMjU4jmbUDEu5y", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3wJ6aVzJKHvNAgpb3w8CxeqmKEko1rngDV1FBg3hZFZT": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.63.203", + "user_payer": "CorvusJRegS74ZiHbcsxDcknNZ1oT6HDL4oAb7xUFvoW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3xneh4TPb39n8aNBRKb1LEY66Ugr6k7DErBWtBsoxWRW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk" + }, + "client_ip": "109.94.97.187", + "user_payer": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3yLSwjkdnbZT8LUud7t5LRt79w3CGRgC2vDq2UUqmjeZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7Br2mfWaQ9eah93BJCSGpsw7zLxtgQ4QJNKHrjsCtDC2" + }, + "client_ip": "103.219.168.181", + "user_payer": "CPST1r81CWZYFz2Ztc69Y2JKtSXgzCTFydTcpkBoKfUt", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3yrcgxHEtYbtRTSUKAGwgTUkP7Ldaoxt5dTY4NxVQ56x": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "4aRPyjsqqFsf5488a9QAaHJLQJMGwoL5P6wRtLmroe2d" + }, + "client_ip": "146.0.238.23", + "user_payer": "7qAnr6wjpKcKkoUKtvZENgorQCRzUc8svG6KA7TJRDJg", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3zamikmxKAZy4tB8sA7NfpsHi8MbJ9Q4HSraNXU8yi1H": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup" + }, + "client_ip": "185.26.10.181", + "user_payer": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3zbM2ByvTJ5vwzJVd6bzVaa6ovtZTepSu5QAySHYxY5f": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5oDRdAwSMyvNWZaiENWiThxifPGsB3WcVkfVz5uswK2G" + }, + "client_ip": "85.195.110.15", + "user_payer": "2Xehqi4LzAvnhh2Ef6KcA5dbHvRrszyN1vRE1kZsEMcb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "3zyPDW6uYoEw9HnyM2zfHVLSD3CMPh8YutqJWSgH7f2E": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.32.115", + "user_payer": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "41Xf2VGHx26vyHP7hHvvb8SAcP4CKHjDEzn4xn3AyB2C": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GqDCbnafLmKkdqiqf278jDLXqjjZMB2sViZQtR82jPUf" + }, + "client_ip": "144.202.76.34", + "user_payer": "HyfDu3WTsXsiFvUtDy4AgP6iv2TJqVPbT84LGpWWNvJA", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "41tKdiBqoT2PkjnJyh3YRwRQaiSVDpya1JYHzpJKS3Rf": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.42.113", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 231, + 193, + 102, + 84, + 73, + 27, + 224, + 26, + 26, + 207, + 245, + 127, + 47, + 24, + 24, + 143, + 142, + 201, + 203, + 18, + 250, + 154, + 124, + 177, + 79, + 4, + 2, + 93, + 104, + 254, + 177, + 78 + ], + [ + 51, + 174, + 2, + 67, + 109, + 220, + 168, + 226, + 12, + 124, + 251, + 34, + 171, + 48, + 174, + 66, + 239, + 236, + 202, + 29, + 131, + 235, + 61, + 27, + 53, + 22, + 213, + 129, + 76, + 147, + 147, + 153 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "42BoQghLD2SaYwfsAmfpFYYAc9QiT3YFtDVBxygJY9Hy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA" + }, + "client_ip": "185.26.11.195", + "user_payer": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "432DYwykccZLDLhSdMEzVt7Sz6hQBV3BwmXjfRbKZwMz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2XmhZKHmfjku3T3nC9xKhgr5bm1CAmWXqNsNt49mo82C" + }, + "client_ip": "140.82.53.232", + "user_payer": "56apcp6ZpQnRZfy5arcRr88pcgeNUKF9o9YB6m7Y5cbL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "45ATF1pmiwtzzRmJ1u3Jvkz1kKD3jcZnTQ9fMF4YS2cc": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.47.139", + "user_payer": "FyQRgKZj7Ta82U2mKAHFK7rJNpQKYYswMAvQkNwrfw33", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "45FXXhRT4Zju8iua5WRVrNE8gRXQMoLS4XWgvRQoXshs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup" + }, + "client_ip": "72.46.84.111", + "user_payer": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "45wWktytjthNeDBwku2fVp3a1rXqXPWkR7hT61ki7mRe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2Q4PRz58tJNuT45K87H4t1ttre27fbrKeczRuCmd2X6M" + }, + "client_ip": "84.32.103.37", + "user_payer": "3Pfubj3ytkRxFAGwFb5vtacuZJUxko5Du39xie9MBXuC", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "46amtppwoHfECXwRM43ryTE1Cv78bchVK5ihHAVSiUhh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7knvB4bbqHCKuNp3ef2hJWdwqoH6WAUi55NQt6LdRfkx" + }, + "client_ip": "45.135.201.95", + "user_payer": "49MMtDQBXrTa1pkV3oiDGzkKjorqDU4MuGACaMUuHuG2", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "479grdoLfDqCA11t6ZMXjWumdC6TCXmQvKDnrBkHGrtG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk" + }, + "client_ip": "160.202.128.61", + "user_payer": "EWeesrzbwWbyyjcHqjCrBV3QdSaeVQ2W75d3dZStrCc3", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "48hX2GpJHiZML2AxjRf1FKg759TCo713wwsk3uQ39tuw": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.59.76", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "4AHHSww3kedLQz3GrkScvTiU5rWu9XzCWRci4DfDBenn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "G3a3iYZKNLbivothF3twqcaTCEvoPb9uJ2bFc9DNKkBQ" + }, + "client_ip": "64.130.41.61", + "user_payer": "2JSS43aEZb5PW1KcCWtAqNu2QVJVMpy3wVMoJXsh4159", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4AHtNrgpffZR5FFeKxqWkoapjg24WrL4rSrvwg7m59HJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9" + }, + "client_ip": "80.76.51.137", + "user_payer": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4Ac9JFgei3h2usNBUF1mZn8qjiLNHJG8ZgvV6DLonxLP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "RNXnAJV1DeBt6Lytjz4wYzvS3d6bhsfidS5Np4ovwZz" + }, + "client_ip": "195.12.228.203", + "user_payer": "GpnuWtxeXFL1YEyWMdDHbf9Fkz9zhFxeGjryVWsPSCAQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4B1Fp2rUULzy8AmXZ7LdHxPi1DoDtgcHaoF6F3BeH4Fh": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "67.209.52.235", + "user_payer": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4B5LJi7iApL1e7g4gXSN6LaePcGCQXD5QTiRP8Gyi68L": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4" + }, + "client_ip": "185.26.11.195", + "user_payer": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4BFJQ1ru3t9Z785VqNMK6kNGgdHo2ses12DRgMDYLU21": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt" + }, + "client_ip": "45.139.132.25", + "user_payer": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4BuW9Nn1R8mHSstHXCZCqUB2CVBXoePtB86qggfWQyYp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DeXsDvvZzKhVux4YfDFE6p4acJLGzr8yKt5pSTjzZB8t" + }, + "client_ip": "5.199.164.218", + "user_payer": "9oCtqwSAvsVE9Xe3UAkQs6M7LvUvfme5MmczFjUAjjXK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4BzrPqwFyuu5b3M4cJMVcStQc54yokTiFnzbCQiVzBYc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "C5ykgNoc6Qmd9eKGj36HNXCgsoDYkYH5MNDaktuqKVuF" + }, + "client_ip": "217.170.200.162", + "user_payer": "6JxGDBcftAVgo9bV5yTzA5KBbNWRbci2eLf2VYMQKvSF", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4CCdFXgxvcDUx9rfcNwRCpHCzb7zUH376kPdtuiLZfss": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "D8kuk3qEiVBGwYkuMGKfBDwuRi6jjRkzjAZg45fdaRLx" + }, + "client_ip": "144.202.29.140", + "user_payer": "Fy7BRtoUrNpGfbegKvsnhst2DTqULvSjtt5X7vM5ogjc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4CsDCcjggi8JvkPYhDfa6b1kHp3StaQsxiJVVmtLXCY1": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "64.130.63.28", + "user_payer": "FAPz3CDdrxtanNbdJxFSnKpGhiXv4dsLFAYq1J3yBVSt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4D4J2GhRvd7WN83uu456ppEY4PK3gBpd6bpykybSEYCX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "ETcW7iuVraMKLMJayNCCsr9bLvKrJPDczy1CMVMPmXTc" + }, + "client_ip": "185.189.47.157", + "user_payer": "FXkgqU7wSB1bGHAvHeLFT5uKBAJqfBB4XTQe3teRfWFn", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4DhL3sj91be7R5XYCWwLCjNCCS8B2ZKm2m7GkPhmPsT9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "sCANXAaS1a7yB8jz3USvGNLfd8DSc9r7TNzNSKKPkfY" + }, + "client_ip": "185.191.116.232", + "user_payer": "H4nmqwZyELNGqb3F7t2rzpEYydzntxoNb7FS6Pkgnoz4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4EHgvfAv3zJCyWBLKhx9tDhxddi7biJWCPe6D5L5VJow": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "vu1sGn2f1Xim6voHNLt4nLn38zNkYdLasU7hEr1TC2D" + }, + "client_ip": "164.152.161.83", + "user_payer": "84Gbn3k1JuCiD9LhBNYcVUiNU8eu4s1Nab9yT3mMLQJK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4ENnMseVe5TySF8Sqa9MKS88eDGRjSPpYXDNM2Cutcpc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5JKhzp9VimWV9nm6bf55fVuDoSdxZEQMctBaPFUiikoC" + }, + "client_ip": "67.213.119.47", + "user_payer": "CgygyPjoMXUXJJZUBiSKNM94XnkQs7Bf2eJGVfwmiiE8", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4EnvpBjR5mHq7PHPooWSpVoxXwizrL6NUbnQxbR6hvGT": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.35.107", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 51, + 174, + 2, + 67, + 109, + 220, + 168, + 226, + 12, + 124, + 251, + 34, + 171, + 48, + 174, + 66, + 239, + 236, + 202, + 29, + 131, + 235, + 61, + 27, + 53, + 22, + 213, + 129, + 76, + 147, + 147, + 153 + ], + [ + 231, + 193, + 102, + 84, + 73, + 27, + 224, + 26, + 26, + 207, + 245, + 127, + 47, + 24, + 24, + 143, + 142, + 201, + 203, + 18, + 250, + 154, + 124, + 177, + 79, + 4, + 2, + 93, + 104, + 254, + 177, + 78 + ] + ], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 231, + 193, + 102, + 84, + 73, + 27, + 224, + 26, + 26, + 207, + 245, + 127, + 47, + 24, + 24, + 143, + 142, + 201, + 203, + 18, + 250, + 154, + 124, + 177, + 79, + 4, + 2, + 93, + 104, + 254, + 177, + 78 + ], + [ + 51, + 174, + 2, + 67, + 109, + 220, + 168, + 226, + 12, + 124, + 251, + 34, + 171, + 48, + 174, + 66, + 239, + 236, + 202, + 29, + 131, + 235, + 61, + 27, + 53, + 22, + 213, + 129, + 76, + 147, + 147, + 153 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "4Ep2WuWxNUJqieNwJTWrKGkP97K7T27YCJicUwmWEyLL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7qGNnXKW1e3DsqEaSxwxMdBTFsrK73XtWTmkGitRyMQc" + }, + "client_ip": "57.130.9.245", + "user_payer": "EMtZGXt7As3kJgXFSMnWVWWzSh9yCb3s33WKXdQ2rwrC", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4FC4mEzJtnBfdWSPDAHRR9aWzdBpvjhmFWnUgpNxHSC1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SFundNVpuWk89g211WKUZGkuu4BsKSp7PbnmRsPZLos" + }, + "client_ip": "45.139.132.37", + "user_payer": "SFDZe38ktiSkmDfiqH5BmjkoeAvbS24XBCNgQZTew4P", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4FhaKt8e8wzG9mJUQeCRYfnBMK4H3vXtbnWWzDuMxxeV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GHYo6houdKskpduAW6BLaTrkEaYYzvByzrk546aVfMLB" + }, + "client_ip": "64.31.39.111", + "user_payer": "2JSS43aEZb5PW1KcCWtAqNu2QVJVMpy3wVMoJXsh4159", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4FnBwNtWDKx8nMPPPj1KSRqTvFqHGmUZh1gMhps2RSxG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AXkdFG7fMhCH5ye5mksLx2iGh1a9z62Fx3q9s2Va7SZY" + }, + "client_ip": "38.244.189.211", + "user_payer": "GUDk7YkqVHJFKMnximYS4QU4jjGW67v9291CHSk8riPy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4GUFuXvLJARRcdiSSBVcZk3soi1WqhvdiNUoAtpPQ58x": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk" + }, + "client_ip": "185.26.10.239", + "user_payer": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4GspYYaHtdydhW8PspE8hpVQdKAzXgKdxGsXm6muJUDH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DWwZGTzddxgZ9qCQiGzydcdEbjBNkfSL7Y6c6oYBYk8v" + }, + "client_ip": "212.83.43.115", + "user_payer": "9ZMUZt8jRHsTgo38N992NnoH6J2QqA1VtLhR4in6fMsm", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4Hncj9RN35b9Zzex75MGe1ckBR45V644QWFGwbjGFqSk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FdH9QEQBxPQfaF2JpcjgdfcMnDb7rjZkCDRCWLRjTQwj" + }, + "client_ip": "136.244.89.45", + "user_payer": "B5ZWZHrYnPB3DxCtaNaFLipGBadZyb4XFsAzeG11Qouo", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4J31BbcfA28M4xgSaETsBb9hHnDWgQimn47RDUReE7sT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw" + }, + "client_ip": "69.67.148.115", + "user_payer": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4JN3RvKvF7yMC6deLp5FjcED2EohsPq2WjJdB6q7T3wa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "ES1M3tMZ4rMTJ3apE75cHfeGWizDTrMMXy2zKtWkd38R" + }, + "client_ip": "64.130.57.76", + "user_payer": "7ow28Ctn1nJqZJKzZ9ZYUveqDvxMfBYXBJFHK3ZQ1QhY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4JNSKqMjGsmjm3udpjGg8148N65Uj9uVpDQojKi5BF8k": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5pPRHniefFjkiaArbGX3Y8NUysJmQ9tMZg3FrFGwHzSm" + }, + "client_ip": "188.42.129.244", + "user_payer": "r1BBnFNDDXhzR26fHqT2AzEZ8E4C9dcxkudogC2Phkj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4KKQoo1w7bFPmSDgmQLJQdAWqYBe15ex9RP6gkMLTwvi": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "94.158.242.124", + "user_payer": "HmAhB5fFnxkWq7zE8K8oC6RUgxxaPCs5yNRRWgrzTPqd", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "4KkqRisbBWhy5aKjH2zKsSqb7hyUpwxty7Yirk62DUje": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "F3tdN8SoakjEPb743VY18YyKJWYHo6rojV3nkas5YJh8" + }, + "client_ip": "45.139.132.88", + "user_payer": "dzCPvLS7UjGHnjhjCC5HhE8Nupd48EHbzJYW2sLDaPB", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "4Lef5swJae1xUuacmEP2BDLxUbh6DtgaAUmnMSGX4iMv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8n9KRHDRDuZErZwdwzhtsTFJxmHqgCQ4ddZcdk6GMzvQ" + }, + "client_ip": "57.128.72.192", + "user_payer": "8n9KRHDRDuZErZwdwzhtsTFJxmHqgCQ4ddZcdk6GMzvQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4Lx8SZVzwGsop32vHKqcVhuppbz1oV5ap7Mw3VaE3xMk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BeSovDCzhEAfgwDyXBuhmCFKsu5WQ3PaX61GEfteNzXM" + }, + "client_ip": "216.10.30.191", + "user_payer": "BUwJtnNrC5UY8Y9eYXnzjdFmG2gtjT1qmXAZzeoc6ats", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4MEXLBQB6uzor8sppTV7jWWzcGFYuaQEy77gtfvo9ZgA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "LiFiDJwJjW98MB8wxcnXpafKYsuz1hwpUkuszkERiX6" + }, + "client_ip": "189.1.171.191", + "user_payer": "4uht5h5AMPF7tBm7ycciEZmBi7QeqphszvG3E8Nzffjn", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4NDeJ1uP2oqo7uXt43oP9RbPx9JTFtYKEhxGYVSF5mFB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ" + }, + "client_ip": "185.26.11.195", + "user_payer": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4NEo3n3TD6XAVY2ZzCE76pbQhjjZLeDqP31mLeM9UDwR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "JwoMTm8eZxBXnXekfLsRprg3Dtp8r2WGheg1aDP1vkQ" + }, + "client_ip": "151.240.75.10", + "user_payer": "SL9udNQdwUgNwpAxouHgET6WGRHQermEXU5RAcHqjf5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4P7DHe3i7VX7MdfVQgTQrBduHqs77rRHiPCLCpec5ZTF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "GK2YYwmQk58xA2k2SeugY3i334SJVViqTT8sT5wim3Dk" + }, + "client_ip": "64.130.52.168", + "user_payer": "BLopsF19UB1nfE22Nfh7wwcQtx29WjMVZKYHjbLq4HD7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4Pr4Jx7T1bCw9bZHKfVpjkpVTNwdeeUkVWHuMRTYMCPE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "mALL2W6DUgDDtcyurC9v5YTF2CMMeuRwPBkf6tEoG3y" + }, + "client_ip": "177.54.154.227", + "user_payer": "mALL2W6DUgDDtcyurC9v5YTF2CMMeuRwPBkf6tEoG3y", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4Pu9yd8b9pVqwhKNwUeM42N9fo9zCQJZx3rHEzRWgD6t": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2zykwzzo1pd3H2oSj5j5SRLTvmpa9Nr2S2Bh8tTVd5Tq" + }, + "client_ip": "95.179.230.90", + "user_payer": "4xPk1pHXPhDcyNCT6Ze2cHq8pWV96pKhxRKpy48q6Npv", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4QQLacr8CWpB4533z1i7SsR1UBvaWf7CLokav592UPtk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY" + }, + "client_ip": "109.94.97.187", + "user_payer": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4QggHMgjSpwmQZ9JG5j2Q2PW3HNi8mfCxM2Sxmbu6evp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CtvdyHYt8cMuGVHFarV2RADfoCdnrbd8e9jAsB225uMW" + }, + "client_ip": "45.77.168.243", + "user_payer": "CjjwfyfjkoXew2KYkGHJkAuurA5cGaHi8V5LtrPdZ5Ti", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4R7C4EKa8UsycSyqQRH2i9zk5KvdqQErcPmrbntXr6xQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4" + }, + "client_ip": "103.88.234.127", + "user_payer": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4TQh2EokYQVAVL298Cj5SXHUjLwD7sMUHZ6pTvppUamu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV" + }, + "client_ip": "185.26.11.195", + "user_payer": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4TVomvZU2hukCxpf19JrDYiTV9Eoymv1PTEyjbpRiZJj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "C4bgengueVA9cRcprjutgu9XgvgoaaFnCqvpZaPy27xx" + }, + "client_ip": "217.170.192.106", + "user_payer": "C4bgengueVA9cRcprjutgu9XgvgoaaFnCqvpZaPy27xx", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4ThWQPRv9S6M9BLA9xKanHNx6LwUMz35dxRsPYXq4PDz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "DNE5By5x37X5FB3zLrkUsDZYVWaG5uRNcKbgCQd5jUvJ" + }, + "client_ip": "86.105.224.8", + "user_payer": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4TkiKcf8xiWukBEEL5nE4KmAMVjS2LHoYays8VUBurSg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw" + }, + "client_ip": "102.211.135.177", + "user_payer": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4TtksatQdfwExXKzW8hAVTU1o2scQEcLL6JXKLdLrTNp": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "185.191.116.229", + "user_payer": "E7uk7nWXZSbDAnUUyYPDhrWfRYa8LosvJr4zdd2i36Yn", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4U9KUDNa4QB5sndNFjK7hZt5VKHgQEpTYRJNEncEP93J": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GqDCbnafLmKkdqiqf278jDLXqjjZMB2sViZQtR82jPUf" + }, + "client_ip": "45.32.138.46", + "user_payer": "HyfDu3WTsXsiFvUtDy4AgP6iv2TJqVPbT84LGpWWNvJA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4UUX9VwcjAykuCGELznEss4tMHCrY84nvwVSdZhhjB2a": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "45.77.220.116", + "user_payer": "DZLHDYqJGfSqfT7n5GxBY1cDw7iFFSeWeD2Zy4aKZTMZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4UZ388RExZwmnVTimFjxuu8CgTDfxmyrEvcfsWXeAdfH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK" + }, + "client_ip": "189.1.171.179", + "user_payer": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4UkQwL2YhYSz7KFDBMGysP69ssnrEZgxGoaeMvnHXyLk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HwN6eoEe9N3kwHi66hpQDBMFPk6ASQGthWKPX5MZmisp" + }, + "client_ip": "45.134.108.61", + "user_payer": "7zXB4qbj96s9Fryk9GDrF8vNN7sce65Z6yaLTsHxjppb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4V1dXqEk3Mm3XohtW1joAc7haPhdGrCKQkqxpxYQDiBu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ADjyeNzWd8yhEjCVyAqT87eqoyGRbimERQsNhFQcXjop" + }, + "client_ip": "88.216.222.137", + "user_payer": "HYpC5pR64SSU8Bp8fVRchQPmKwkXCx5WbsvTtCRpeK5j", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4VHBjR4TFV18bzHTPx4zz93sAognL91TTXP2YK3Lo1hi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "By8MseMKtZQQaQjMHJiyetmc5AC8RZZv8C2ss33ktrHt" + }, + "client_ip": "45.139.133.169", + "user_payer": "DZ8r6dJzbr4NB69rEKCVv1HJQznbp3c3ng1RaZnjx8Qu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4VbgZ2T6KRyu9q6iSr2e6Hsghz2QaAwpPLuuNYo1yHSv": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.138.178", + "user_payer": "bYiUbaanM7K1eK1wVc3vVFudTvEB3VaWtqiUmVHrCZG", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4VctdD2Foc6HUTyWiTG4LnRuCijgRdMtTP5vY52DHGDK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP" + }, + "client_ip": "160.202.131.45", + "user_payer": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4WVw2qcVF9xNHEnP6BiMqR588zxPWfafYDYFcRicLW8F": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3V2xaccDpFib4DbTksdiveNDmiwpXBqSWyjSof3w1Bg7" + }, + "client_ip": "70.34.243.134", + "user_payer": "G4nfEpqKrSUCrHVH1Ps8vo4Ya8ZoKAn7E5Kkru13AAf3", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4X7tjjzHJm7Hnwu9kQLpf4XQorN8s762HMXd3jAFKeDe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5cz8tWez3WPFuZzkBRahcrRmWiYDcRnxJrt6BQuzMXck" + }, + "client_ip": "72.46.85.155", + "user_payer": "AgqQDxif7swafYP7XJWYChpsmB2zkacHkMZ5rrQAPaa4", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4XtPmAgiVFE69MwHYBD6a9YAwMfbjLwA7pU6nhUkmcHs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP" + }, + "client_ip": "185.26.11.195", + "user_payer": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4YWtpKjgPi2A4zqS5CRtTaFHYBdojrgwPsKmgrRdGvki": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "45.146.160.19", + "user_payer": "BypoPcEJsaBPtBEa8UDb86GycyMcfKCfCMm1ph7xiEVS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4Ye1mCtcxzEnVL353TrvsBJATUFP7hUgtXaw5RCuyFbB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk" + }, + "client_ip": "64.34.85.29", + "user_payer": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4YrE3Lag3eRKMDHLZqnQTWXU9FkxtBNm5zJuMUw78byv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Lake8NXDThihebhxS3Js7mFnj9fthmus93zEdsFNrsL" + }, + "client_ip": "84.32.70.12", + "user_payer": "6Sxv3nwXXbSxi3fGR7dGQBUNhj9K1cgKK3gxsYPZJV3t", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4YyqCnqe52zjzamXs57h8AaSEXVRzt6YiF9QzzbHwD8z": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "stacheBmGG5zMKuetUevAbc4m4dLbve1VPcpSur3voH" + }, + "client_ip": "139.84.238.57", + "user_payer": "CpYjbAWfLZmvq4BeSaGohbxXY5zCR1PZn5NxPTguXnSk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4Yyz2FffmzmhkBc77uyMWxHNdT2V7fagff339xXYoVkH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "bookoVmqw4QjVj5BbkFacouadx9M7816wyRkfM7A5Lo" + }, + "client_ip": "139.180.221.63", + "user_payer": "oWPCJQUE4QP4ii1oCSLmryBaVy4sNyN1NVj16TZtyDe", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4ZkqHQFnN4ZChGKxqdz8TN6PShLkzr395McQ5xjD8Vb6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EH9xqextnMxNzcE7MmzbAdukPPFm34XyKSqngbvudHxS" + }, + "client_ip": "107.155.95.90", + "user_payer": "FXkgqU7wSB1bGHAvHeLFT5uKBAJqfBB4XTQe3teRfWFn", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4bLoGVpRWPp3ZtHa3izPVMQUPdaKdfuAenoTDwPvzj4v": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj" + }, + "client_ip": "103.88.233.43", + "user_payer": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4bYiaY8xKrgeQnfM26U4S4fFUW1jtyAUovHfuPyGN9jH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "6Ut1wC8PhVGtMiJYHicbc3LPqSdg1tKKxyLbFXuFvRva" + }, + "client_ip": "2.57.215.182", + "user_payer": "Hf3HUBVD3yiYwJ9h99NRanRhWbiTqp8yDghfQcQk4Wza", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4bsjSBMefFJsAkqo9XgY9PCBq84CRQEod5yKRYwEQ8k3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7" + }, + "client_ip": "84.32.186.146", + "user_payer": "8L6UenEyovR5hNuv2QcWU5Gbd9gKf58n2WgzXvDL4gTM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4cJdfCWS2cCubvdxCvMUrsrAQk2Dg9D7BaaB7Vm1mtGi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA" + }, + "client_ip": "64.34.94.5", + "user_payer": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4cLnJb5ZLX4Vs94pJFUgH5CEtBmbkAzo2tnZAgzCN2RF": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.250.255.183", + "user_payer": "EUzFVhfJwSSbovn69Phoyy2fJQ86x6E9B8fDmmv6p2gt", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4dXcDDArK4UrKcxtyn5A32qke7vgX21W2BFFbvEZRGU2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ungM4fafkQg1e13MAzwzuvCxtTTiTZ4Xcq7KqnJRyVJ" + }, + "client_ip": "5.187.35.138", + "user_payer": "BnMNcJK5n5s64iwny5RZiaEMcDNWXLghuuRmLxq5pFnF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4dacUbED45n3XF2bk1QSMW93RUEZJ3GJePLcjd2no1FR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8hAYbagNt7CMBooFfqVJhBgLqLffpjXTWJMk8yybjJsN" + }, + "client_ip": "70.40.184.101", + "user_payer": "BgU8X9JSKbHruGKKSBpEgofyuG7YgegsiEQVRrBmrx5R", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4dxBD2vTMRnzWdsoXBqps6aPEoLLuBA8Sdo7DTAU6K7H": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.139.132.87", + "user_payer": "huinBRP3muBuqZLMW8ARjdn4mBnEmFFcxiBzrkQz553", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4eQxtENnMJSz7Kz9ecqqRePD695qt82H8dANBiZxCDZh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "4mtXJ5pUcMMB4t8cLbi7zfDJCHfYLRrQb4qSLmh57sKL" + }, + "client_ip": "202.8.10.166", + "user_payer": "4mtXJ5pUcMMB4t8cLbi7zfDJCHfYLRrQb4qSLmh57sKL", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4fVCjvRtmzhkzV28BTupFx4w5fdG7ZBRJks3pW9v4j6c": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "C1ocKDYMCm2ooWptMMnpd5VEB2Nx4UMJgRuYofysyzcA" + }, + "client_ip": "95.173.206.238", + "user_payer": "8jB5e2fHgCFepsJkQUqDuVf7ST3ToHzm33LQcWLHbRqP", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4fWX6HFCkRzJPpSnvwh7tGrBsFfPWrTc9QvBsLET4jEs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk" + }, + "client_ip": "102.211.135.185", + "user_payer": "6sMB8GQWmQLH7ygqLmCsGdhB9pWp2wNsoA72zEG1qoyu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4fcim94KHTLjq6X76L4bV7mUb6YwkZoNgfqN1wZjb8B8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "fdzip81euDS8jEZHx5H1mn27zGVMLzkgpQuzYRBfBYG" + }, + "client_ip": "151.123.174.114", + "user_payer": "Bq9t5usaaa3eKHjVkbYF4ZMzusVt5UBiP98xdoXZekmB", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4fuDfmm14w1joL12mSRbtEB2X9HPetjMuthBd6ThAebA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ" + }, + "client_ip": "46.166.162.209", + "user_payer": "J7yvYDEHPi3ARDrqwKgk48JY76Z2zSYziCTjJqP5QNRM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4g76YTNXJzrmDoXG3v6apyrebg6Q5fTEQyMmt5X3eA7M": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DDgVWafunwNr1YeJD89SWqotXuwjzyvZRmpapZPshrk" + }, + "client_ip": "66.165.233.58", + "user_payer": "AoTwVCcu7Av3PV4Cr2JEd166Vkeuf1xzSW73i3SatH4z", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4gSLXtFxtL8tjzwbg2XkVDikA4nWNFdjcb9zjdu67pdD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "2N7v8pDKDYhtBUJBQUgxvysUjgM9s4ULPCmeEiPWTf6Z" + }, + "client_ip": "185.191.117.68", + "user_payer": "HUZohbt3whb1kmmjUGUwGSNL1cdhyJUxsgJAWb5XQnff", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4gYKPDZG3x638rsnXqjZjZocT5wafoce5keygT7KBXve": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "174.138.55.92", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "4geYQ6Ekc4eCunCvzD7h16vRBMQS9B9uppRHRZwgeCFU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV" + }, + "client_ip": "67.213.117.61", + "user_payer": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4heMV1m6xVYBmMfdart2BujfxSamGBzi1aaCyRwStmeT": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.55.29", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "4heouibWPKMxzzC1v6pdAwD5o9jN7eFbAA9thNXAJx6B": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4LGr18Jwdv9XKqgKaFQHAsZyu3Z4k7PxZ6CMLerSmj6m" + }, + "client_ip": "64.130.61.142", + "user_payer": "ZoDZCucFALR6XbNnqm7WabtXbNqw5bh9pWymmkJ9KCu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4htzLXDcpSGXzBDMY4o44uk7xYpdaZCdL2bAHgzgbz8U": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS" + }, + "client_ip": "91.242.214.151", + "user_payer": "CWbapfvMikhLzuSruG9Yrm6Nqn2sw9pkoTqYBPYX3cdb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4iDN94QZr7jTyyViv59WCh1a6iaorq1qQxdLbNngn9uc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "nSGZ3tv2UhskkPqiB666yDVj7PTi9qKgDqvjHyw5JgM" + }, + "client_ip": "207.246.76.166", + "user_payer": "374voYegWZ5NCBKjns3Cd4kdgDgmL973Mpxtxw8QpD1e", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4kiWJrm112yvgbM4ntQmaenyU9hkBJTEdE5nZwxbarSK": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "2.57.215.213", + "user_payer": "4KJzzadWk5tfhmARn98MwmWjZjxA2SH3ajJ9NTnoe4Ss", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4mgDVXgpiGV2QEeJ1eMkJKfGbyeEZvcmjhgMYo2Ba43t": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk" + }, + "client_ip": "160.202.131.45", + "user_payer": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4mvS6WrDjWWxdBUpbU4ZLuCNK3hT3tBK8TwP43nWq83s": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BADc8V9fi8KsZfF26K6DgZsywcJYZTX5EW5jypnVCB8d" + }, + "client_ip": "84.32.64.136", + "user_payer": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4opNfjRBKtWCwjttAr4gpT2XgXQRwJZC4cvPfiZRWDsL": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "198.13.131.95", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "4pomqzQqHS4oKDjyaF9W18tCwcaBz3t4cs9TGLQEwtJE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE" + }, + "client_ip": "103.109.101.7", + "user_payer": "HkUrFZKcHv5w8RnoYps1oLSP7HJagKAyjKtvSYZmj2mP", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4pzcVgcSshDbbfVNwDE5fATBtw6AMrGMSzq5sBbyiZjK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "49j9bnkdgVNxLwsZ9h88sPR5MYEmsUyKrrJ6ZW8ijBrb" + }, + "client_ip": "199.247.6.155", + "user_payer": "FzU8ZJmbiEvkCaSgZcT5UKwZqH73Gr1dozmmaeRoxgJn", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4qCJ2L1rCQEvDqWdoyXsYGYZGZNFpjAZt75cWTft8FjF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HFTcVVrX93SJwYHAiiHAssb3c4zXqSsF4mNjg5arGPEj" + }, + "client_ip": "5.187.35.211", + "user_payer": "5am3QqGU5YgLavFCjAvuYnKSYRKa98Q5Fabp72irarBQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4qU3uFqEZcR8WCwYqV9T2FnY4qXSzKdswj1xHudCLBRd": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "185.101.32.6", + "user_payer": "dztFPUmYzYkTGpSYcGfUVLuXRtUUi9ozV6rmA3sP5VX", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "4qdBMrDkN692rVv1y1eAsbBzuH8N16LW7mxNHxv8Gxqf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ArMBx6veRq33ffEP9sxHafiPRgrtzww4XvbwZbSMfXiM" + }, + "client_ip": "45.139.135.150", + "user_payer": "6k4oeLB9fcAuNFnBERKqZXPC2vfnMpaeNnqxU3D3zEKo", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4rA5BCiMsz1xm5A4xgjfR82evxVKdmWVnXPDvmrcD2mZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP" + }, + "client_ip": "177.54.154.225", + "user_payer": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4sEFYQXkxdSbPZMZFgvC5wSMyhfeiExHZ8LWa6Nhs7R5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "DivAGQA9W5CM9kuwYvy3UHnRzPjynioW2m6nKgCLQcMg" + }, + "client_ip": "202.8.10.180", + "user_payer": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4sTmgBPLDuAFySVGVnKixdPcB5Yj8vttqoZMjtd8BDM4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "LodeuWMHPiPj2PUHUyca2bkpFv9HyzR3gaDBmGJ9TSS" + }, + "client_ip": "23.252.121.202", + "user_payer": "LodeuWMHPiPj2PUHUyca2bkpFv9HyzR3gaDBmGJ9TSS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4uRE4Q2A5T8CzGh3L5R6CWaTJFfjuXAgxYj5uqiT8jND": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7mF8NZJdREuM1uwYcvKffuY9QJBEoHhNp4hZ4NS2fuXW" + }, + "client_ip": "51.89.11.213", + "user_payer": "2hSiAzofh9P9GA9EmuysCHKqGMYMpp8iASssVaWYW7gw", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4up47u6HBbVCERc2HxsQNiP2G7WZS4DcsZaErofU45nC": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "198.13.138.187", + "user_payer": "FAbSkJwqdioZqqByjpBcrv34esEtresi7w73r2Qt1Q6R", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4uzBVPwsWuJ49MFJM3Uzgj5tFtw6Ahjq9VWiiDkhYxpe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH" + }, + "client_ip": "64.130.40.195", + "user_payer": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4vWRPayp1i1vWMTTRJd4YcmtwppM4zP9BEvyPDYaqin9": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "164.92.223.240", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4xSh5czBL8hRK8yG9w5jCQdAJNR31byynUM3KiUcBjEi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk" + }, + "client_ip": "64.34.90.215", + "user_payer": "FKVgFUKPkDbwgbMeg984HhaSJVuJ7RX3kDR4AMMcdL5f", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4yPbdhA2eqkEMBLAckRcj6bmg3Ha2bLzhpNeapmyJ1iU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "oPaLtitM6cwpFVzP2rDhLsJLdY2vcbuZiJJyD1TFUKs" + }, + "client_ip": "67.209.52.254", + "user_payer": "oPaLtitM6cwpFVzP2rDhLsJLdY2vcbuZiJJyD1TFUKs", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "4ztjZ9KDAvSS9afLT1fLn8gptoBePWrBU74pZco97YsR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DnQBmTJyLbBMgJYQLJDqJz25AJModNkyexL5LdVRGnG4" + }, + "client_ip": "206.223.224.61", + "user_payer": "F6yUWFfTkqTYzbUhWLQsdjQAHMd49BmZUdj1gFNTWmCo", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "51cdutmkoMxvjqyissKeGVbXGAy6GCegSLBsDWwcAYCg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb" + }, + "client_ip": "69.67.151.101", + "user_payer": "2gY5dP4nTHrW4G8kYvrWwTB58mUKdPtunRicXbwAKyyq", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "51sKXENEZcPKai9Kzqo16Fyexw3qFgTXJ82PS9dMuKun": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.34.87.163", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "528FCUmDte1DoR23CFZrMMhLwB1kojUgyyoudyviTjMA": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "18.207.155.193", + "user_payer": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "52Z1LZAneqgBkpHrxD13fjqeMKGURdQUZkjPik2Whf8N": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "3.28.75.235", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "52t9vrRXxrWsJTYX6CuwLBiMN66zBLJ9tRY8AsXu7m1W": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "DtdSSG8ZJRZVv5Jx7K1MeWp7Zxcu19GD5wQRGRpQ9uMF" + }, + "client_ip": "86.54.152.249", + "user_payer": "3zLCNmt7Lhm2y44RW9YdZs6epmsDB8BazUUE2LXo9PzC", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "535gTJy3FQ6vW7ZNNh7wxLTdcVobENGiJcgk3hVaPacD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "adramSYKBv1yHoZTub4kepcmF5LybPxwyJcsz4fpfi7" + }, + "client_ip": "102.211.135.164", + "user_payer": "7S4quwf8rQVvJHF7zguqcGf5BTFxnVYg86G1SKTpLfPw", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "53H8KoDbA3nfk7EyyqBxGWZ7h2XP2tdSPNfQw125r6DC": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "72.46.84.199", + "user_payer": "xmpuduhgntZtaWHvnZsbGsN4wauoULXVwJ5c9NECucU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "53eHG2jMC1FPamwvJemMnWEM5SsX8SiHFDJsr6fF9mZs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HFSPaT8zL2a75cVW3snNzgjFRPZj1GbKJRF2RJ1qztkZ" + }, + "client_ip": "103.28.89.183", + "user_payer": "7S8ASpAxqLuqcnAh1QGy4aVrtVvPWPtqcrfKbL21b5F9", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "54e3XKZrUbJwfyw1fPyEiTE9C4qidr7LFagKZYJGubw5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Stakex4B2tpDHPWGvV1dninfiaYCGdakgTknpzPitLh" + }, + "client_ip": "104.204.141.238", + "user_payer": "DZiGTxgDvmBFiNYmukLHYePG2S4CRydoHjQ4kF6vtMJu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "54ftLEk7ARHWVtG81upsJPFa6Avq2vD2mvjYbGHS8BEg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC" + }, + "client_ip": "189.1.171.179", + "user_payer": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "54rDB3wyxhz5SFJXkchZuB2Ho5i5CqB7ERPqLdnYXv9U": { + "account_type": "AccessPass", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "85.195.100.119", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "55DiAEyeobHJ89vV4t25bhZBWSFSzyy2TYk4Cb3cRS1c": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CLsFr1KZVbAyz16iFpwg2e4hiekR1unpwyxfNdjBMaoE" + }, + "client_ip": "185.189.45.171", + "user_payer": "73v2NvUHp1bxKfYQ21sNXJbtW13Qca8pUrnFuxb8Tjf5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "55wRzz6wcgReAbr9NJmATg5ye5Y71RmY7CMZcHjqgqCJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BYYyjVc6tv9mFsZ3Y7dMLaqfHQMXjUx5aeudhTXtc6sD" + }, + "client_ip": "23.252.121.118", + "user_payer": "sTEAKPk59EtPPbixCweyv6oRLNCDEE8pnnef6gUfbiW", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "56o4x5bLsaEs8B1EgDwxriq5WTxXEJ7BtxmSMci1nVRb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CKWWob2cNbdpEEVoNd4wxAz72onLwABMux7i44Em5ZKM" + }, + "client_ip": "45.139.132.166", + "user_payer": "ARx33747AK12mbKQ8rnpFkC9xKnizNVNjL8x57Ki4jYc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "56sxeBgqfBumiUuPoY2LFNYVRzW5wrmTU5V4BuHzeiXD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4" + }, + "client_ip": "72.46.84.111", + "user_payer": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "57U2AgtuKGtfunkNjPrGd43De8NyFLssCXkZzp9sENmq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "spur5CDwBvTZszvy1ozGjRc1x2TuDWo3VF4jrq7zgvD" + }, + "client_ip": "195.12.228.206", + "user_payer": "AxcUUJSmvzL75RYYbptDKMXs62pNknvPmpBQj4dqY1hh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "57oXKRLjQuefcz5Bai57Nk3nCCkK3PdMcaM3pVWXth1z": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.43.217", + "user_payer": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "57y3DKsXR47UsXtZt4CmoxvJHkDJGjaeUfEp83pR2nJU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd" + }, + "client_ip": "185.26.11.195", + "user_payer": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5821EPqDoFpSEtbharNdTiaReBo4QXiW64Jb6iApfenQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA" + }, + "client_ip": "103.50.32.189", + "user_payer": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "58988KiYvSu4opqqhhv6L1kVU4RW3cCXmGN69hsdADRE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "7MLcM12ywnhWT5pasrXAW4V6BsDWdZ6iYfGera7hAT8D" + }, + "client_ip": "158.41.67.131", + "user_payer": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "58B4VvZbnfEH5ZCNbLzbQkPDtSi4EiURn6FEFgWB1G4a": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK" + }, + "client_ip": "185.26.11.195", + "user_payer": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "58G8aLQpQbVdUr71hLH4e2ZB54sRC6py9aiSbJDGsFBv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "HLyBoQdXsCcCCXgPMcT6QN64V9zEe43zi4BDoYCramJ3" + }, + "client_ip": "64.130.41.37", + "user_payer": "HLyBoQdXsCcCCXgPMcT6QN64V9zEe43zi4BDoYCramJ3", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "58cJ2u34jwVxHQBkLNdVaNTBo5EyMe55Dv7QDNtTRkBu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "6xFDLX751L7H9d5fQT9sf2SM5RWWE9LDgqz25pPDbWoJ" + }, + "client_ip": "84.32.176.187", + "user_payer": "dzmTjnSdbPhsVPFcJVsnr6DvkrmUkrvzhXLqxHXPwoU", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "58iE3K7SLNMpUSWAhhANtfoNDX6xYJpgwxwX2FYpEfEJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7CR6whiYULVf1Knj4J5PxUS37opdk8UAx2WnDzBQKiVe" + }, + "client_ip": "104.204.140.219", + "user_payer": "CkbXApnB7BdZNsmcPi7r3xWgFLQePfx2WKqg9W5LjgDF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "596eFFcuf8x6tYPujJcTP33j1pXnM4JLA3Aos2Rc3BnN": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.152.160.74", + "user_payer": "HeUV248LvN3edru7wCcbb2zfrWKH1Pp5LNWYpM1iP4Wa", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5A3ssYTntY5s2fbr6o4N1zq6ZYBLZ9t4UeE5CMTcyMYK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "ApbazWeTKGG4Rq3DCopTP89Br6B3R5qZ69qGuHHxwBhw" + }, + "client_ip": "216.10.30.117", + "user_payer": "BUwJtnNrC5UY8Y9eYXnzjdFmG2gtjT1qmXAZzeoc6ats", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5AYhqLuZSgobWE6xJbGW3aA6xy5esJcXFRznhkNFDj6F": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC" + }, + "client_ip": "151.123.175.13", + "user_payer": "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5C8YmBWGRKYPHStFtvwYW41vo5aXipBqvzyLX2MpYVHK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ES1M3tMZ4rMTJ3apE75cHfeGWizDTrMMXy2zKtWkd38R" + }, + "client_ip": "64.130.52.112", + "user_payer": "6HrFLiqhvjY84ZKAfWdtxG18S6x4XRjQ9bjAcdUijA9R", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5CHeyjG8cLJAih9fj3uyyYz9ECD73fgg5Yi6og8EU3fM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE" + }, + "client_ip": "185.191.118.2", + "user_payer": "BLbGa2YfWZfRJsmG12FofALdf5N5irrUh4DcxovgczEm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5CPX4MwVCLT7N8AC1tPMaRnpiB9gWMRmABG7ixFuSM5Q": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP" + }, + "client_ip": "189.1.171.179", + "user_payer": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5DpeGQm3AtXVQrU6tX4W1XiU1HG1hSQ4aTf3QhCrHFkP": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "91.242.214.219", + "user_payer": "FJC3eN2xWezxaCBX3Nogr4RXB45UdccsXvq4sZjEYpRm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5Ejiegjc1UrwyaayJVVVRcsveXSnnJZjEmvmcvcRnKjV": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "45.152.160.131", + "user_payer": "ELNr7FgUoi64bkPL2mSBDEj54EJUjzZi6Afrv59ZaCAG", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5FGwt1zAfxKSBrgFXxUVEug5PBaHRzAQBzgTvbZ1fYKH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CoG8d9Fp2TFJRkAmrPMiPsGhQWHzdTTVoegEp9svRgmJ" + }, + "client_ip": "84.32.103.44", + "user_payer": "AkVkdML6iWaoyUR336h6VyahmtQ67LYjJfd4LgJXyEdV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5FqUnD2vfrezSuYXjhyYbRKnTuVVEeX98Rti4XCrj5ax": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "sf1G9ySUNSWRsiEdc8vuXcBgSeQw93kjr9sgnH3XAik" + }, + "client_ip": "45.139.132.52", + "user_payer": "3JUvxWHccuwH5sdH3QrQjfY2N7EqvipNTRPcoL3ovxML", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5G3hhgcFQdeuRyG1Y66FNMjNLXv6VHUiQRkFiaNEp7Qj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6dT3E3jLe2UYeGWXaGsV5bEj4FSzXtNEAU44FsKvDShb" + }, + "client_ip": "31.132.0.38", + "user_payer": "61QB1Evn9E3noQtpJm4auFYyHSXS5FPgqKtPgwJJfEQk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5GBnMey35JisLQe64iN7mBj8gqiCY6FHRJ2ZcChQZmUn": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.40.6", + "user_payer": "4N99j29yJGrC6P6bgjfMXcD1q45vvcfHhsXMAKqhpqv1", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5HATKyigYqFMDNnb9o9GS4nQhq7C3VC4EMFHNtdFvX6L": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.146.160.40", + "user_payer": "6AqEG6PaySvEXWyUS576zGjmVuSSFBpAgJhMKJ6QPNvv", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5HgGjPNQofN5T85hPatjqnwmQfSVWnVenueysSxdoUge": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4YGgmwyqztpJeAi3pzHQ4Gf9cWrMHCjZaWeWoCK6zz6X" + }, + "client_ip": "217.170.192.166", + "user_payer": "6Lb6R2meGwQS5v6LzAjWZ4pkv4D97kNoE5oRuCaB6jpJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5Jh8vgfdjKjxFq7iBHYhZuq92ALxMvfUz9jAGHFaMncP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q" + }, + "client_ip": "80.76.51.107", + "user_payer": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5JzYfGq3agGPDL3RuLd7it3edAwsHsmiGwyQ3w3J4e4E": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "iaQNQUwJ3CanN2otpzMsW1DYA7ENeq6wyz5hv1R31k3" + }, + "client_ip": "154.45.250.109", + "user_payer": "ERD31ASEiN2VPXp8kMhAZSpAVKhRwtnseVgBEGPBMwGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5JzyHckwjzm5NtZjAyTjiXq3yZTTAtJ8oCBTJz2Ntepe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "sWApqhHGZesK5CiZGTiJcJGEWWDJtFF89FovEDTqBnw" + }, + "client_ip": "108.171.202.234", + "user_payer": "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5KLBDKpDyW6BcusBGfSbX44a5x4AqpxHKothFhMyM2uh": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "198.13.138.187", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "5KLU8apUATddbQvPXWmYX4EqH8PWaxe2wtzsy5BaErxd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "sbidYi7fbif6qNsMpwBKvyF5DKcLCbjaegpADsKqNux" + }, + "client_ip": "67.213.122.9", + "user_payer": "SBDZzBVbJnDYsbPBe9yAqFcu39mdzkm8UpKK9We38qh", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5Kk3r8cWy4FgvvTYS1Ce6965DMHTmaJN6U5oM7amjzrd": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.44.135", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "5Ko4HD8akpJ577jwAAVJi1HW1k4NYGgGhtNCRFz6zfXb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GGX3BEoZDqjxcw4AbCdu62ZTMrkpSgmPt81oP2mVuZNS" + }, + "client_ip": "37.187.82.58", + "user_payer": "FzA4HijwuU4mtNBmKng9gVSL5oPHLKsRDFfR4CJqaSc2", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5Li8M5Q2WrSu6mjaNrDi8R3od7uQyZWmJuc4LKJYzi8C": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.132.49", + "user_payer": "dzthauXK5XpzsTzYhWu3CQdgpuUXgrenrQ7uzrJEaBN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ], + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "5MtFaKDTCcjubdyNr57KyRkJVyVcDLXZ4EGAtVsT3mxP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DvmModZnDRtNfoBoReCUJMdz8ZhG4XZuUAZEBHDrLRKk" + }, + "client_ip": "185.16.38.217", + "user_payer": "HLXKZPQ1XNccxWVJw3ydwtQrGwTAaxxSGKzd6oqJth9Z", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5NvXrotxqi1pnCfp8N54M2e59ei2fyCRECPrKH2Tzt68": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.52.166", + "user_payer": "HVbeEsKckAX14hFGNchFGLVi1Mnr8uZrs16eAFcG8F67", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5PALcPpQkJwcMKifZxsCyBW9yC5bcDtiU86wEjfMrC4w": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HSZv8MAadCzpYc5YYvrWTjTK7Pk8hkA3hUwUHJYYcYQr" + }, + "client_ip": "5.199.170.100", + "user_payer": "6z5qbssHvATWR5rS1dUU8EFjo4kRnGUf7MxQpetRQM8y", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5Pa8ZhKqN3F4bnrESAGiXmHch6jEtASAcZapYWH91KXy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FwmCMWsXZuCm7nYF2KJdGFSE8G5bQkSvsJR4qnzRw5SG" + }, + "client_ip": "64.130.42.83", + "user_payer": "B4zFSvtvknsW5uRWh4MUgNcz7wgwrdjEQpmxKWsrrzFp", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5RWKAr9t8KDb6JWcjb3cqTpNSdiyyBhs5Fda3NNhD2KF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FjYEr2UCeFzNfAKiFrbhG34Zv8LxbmfHYAFhAfc7SLQL" + }, + "client_ip": "86.105.224.73", + "user_payer": "DZETFp32xdxwtzY31TCrMaSvVmqG9Hp6DqQ8z36Qoj9U", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5SV8b8z3BZKDtHuSA6mgArLtXqx1yWwbAe47sxvPBySS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "EUDis6LJeJzDHTEBgfHGQyjHp63XZkGkx4E69xunC2Ej" + }, + "client_ip": "45.76.33.214", + "user_payer": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5SqkMmYi1WmB5x1YH47q9do3zDHphUy8iH427rHBpDmN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ" + }, + "client_ip": "64.34.94.243", + "user_payer": "jdPpekfQgiw37wHbaf3WYW2qxoT6nzffXmiKUPCuR2J", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5TZaegLyGrQzNcWBWNijkbSBym5eBbqSHhZXGvBwsWxA": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.53.251", + "user_payer": "2bQV57fjAczMLV993djEcJTZcgim1c1dxm33JDi43Cma", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5UAzZr2mY1s5e4vvJ2GEs3DkyGaYDL2KbWXK8GfPvQk": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "104.248.20.159", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "5UHf18kbN9P1isJuF5f2gNPVwESzUwJnVPVsbFMxEvdf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "Ey3DkEVbfBxfWmkTsG7Hqj7jshYf5Zx9H8462Zjjkykf" + }, + "client_ip": "216.238.106.175", + "user_payer": "Ey3DkEVbfBxfWmkTsG7Hqj7jshYf5Zx9H8462Zjjkykf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5UXLGVJZfd2XxXgfp7MSCSxDNLfhLRDcGpx9FvJdWvUj": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.50.36", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 51, + 174, + 2, + 67, + 109, + 220, + 168, + 226, + 12, + 124, + 251, + 34, + 171, + 48, + 174, + 66, + 239, + 236, + 202, + 29, + 131, + 235, + 61, + 27, + 53, + 22, + 213, + 129, + 76, + 147, + 147, + 153 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "5UhDAegquoWjTo3yPEWvqqNwN9NzR2PQkg7E8Ta4Ea9E": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb" + }, + "client_ip": "216.18.195.226", + "user_payer": "2gY5dP4nTHrW4G8kYvrWwTB58mUKdPtunRicXbwAKyyq", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5VAuGuEZPsUZab18ww7FkasCUp63dPcqqtMd9gTUTmwL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DpnqGPi6AGDuza9UZszmzv4akfhsE5g8hLcVbEqiAZL8" + }, + "client_ip": "86.54.153.250", + "user_payer": "8uymczRPuSMNB2perH3aHq2aAdb9wLjK8hDRkAiuiTyw", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5VGtbXXa1BSESYa4gUdP3UxL6Trm2g2Rj5rbqVj9S1f9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DZ9PvR27KkwG3aa9M7gNC87th8vdNq8uioRa1xgA9K34" + }, + "client_ip": "64.130.50.131", + "user_payer": "3zLCNmt7Lhm2y44RW9YdZs6epmsDB8BazUUE2LXo9PzC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5VKevbtvTBBEXbr4fwqKLKMCiuUHtyhHYcUBXFHyFJ1m": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5eQSRzTyF4h6a3aDmSxb3kXootVNsxXXLpniNVstydtJ" + }, + "client_ip": "64.130.37.207", + "user_payer": "LTPZgWy6e4q88qhKEfdMeaz1vmetH5eSfREHgbVQ3xm", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5WNfrL9bAoUri3d5jTwAfzHic4EYBk2BGcRh1t5TWWFC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "938SXXTPSEXDvaYTcbnNP3A4Utj9roSM7JgSA6jm5qVp" + }, + "client_ip": "38.244.189.146", + "user_payer": "539tRUjSsrj57iqWFrYfntDbWsLeeDnmhXQJ3x32NmLk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5WcDBe8C35NxipZ2RFKJR6R1gn4JMXWKkaNG6qi9siF8": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "204.74.232.130", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ], + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "5YUa4ZnvZoRHk96PF1SHGEpNoLSppNWLcVMpkpKiW2Gf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE" + }, + "client_ip": "103.70.77.86", + "user_payer": "21AbEzTmZz7kNAEwavMEgq5RCriqV6dGD7rA7J94ye6n", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5Z2pTHg51jigBJdLN2KHLG9Yfn7aqZKmLBJY9rEMhR9M": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BhNnboEZb3mKkVADMH11cYGWCqefAfmhzx5rU4eRTKGY" + }, + "client_ip": "85.195.84.167", + "user_payer": "4WHRrADFWREcbXZCBsj68oU1aJgrWs6FxqdK7fUqi76s", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5ZborP5W5mNsJGTPVWAEb8xGh4iMZCFPeb2Y4PZHNEhe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FCogV51pg35BtHUJKoNYdVV6M534hHiRfjHxKYPD8nMK" + }, + "client_ip": "84.32.103.24", + "user_payer": "4NKEM1s5WCtPcqER4mXfGiStC7PAJLMWnh832tTB4FkG", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5ZcSLyqdr2cMMjcZRoue6eD9GKnqtQzefwHrjVGB7vuh": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.51.36", + "user_payer": "GsSMwTbuSN1Km8kV7V2TPazTqShxbEhZFv9Xuwv5bBXH", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5Zozc8XN5TYHqfJFTeTqPE4NF1dqDUcxeGjRUJYsZRK9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "AXumrMHdEqLZwmAEY3EnAEHTXWSgnJiCkfq6PyA29J4" + }, + "client_ip": "216.242.0.106", + "user_payer": "3i79MmNHdGB4DJHf96FBvrqEBUCKsescAc1B4FDHoQBJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5ZxTFVgSveBFo2KPHk5U9epgyppgUaP9a6YGiQZ7eatU": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "64.130.50.245", + "user_payer": "dztiAk31npKgTcgiqyyNJvaav3tSscc12CVV6tUQMyS", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5a3deX5raN9xQyDeiNtVCwVbGcuUZxginq3aS5BmgPRZ": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.43.70", + "user_payer": "8XTMv5N4YgSLaahcCyQRynw2osEAUwDaJEzXXqL2CcKD", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5c4M7cELDbPDSC5WUPg37XqTTZPSK5GRog6ymfuEGXNR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "E9hD3ikumJx1GVswDjnpCt6Uu4WG5mz1PDWCqdE5uhmo" + }, + "client_ip": "103.109.101.10", + "user_payer": "GUDk7YkqVHJFKMnximYS4QU4jjGW67v9291CHSk8riPy", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5cLhtk5xxkDMpFwHCA87qtafCUF7jk2rXEsVTiWdACV7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk" + }, + "client_ip": "69.67.148.123", + "user_payer": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5d57gDJdrmt2LpHr6LdjTrE87wYDz3YZ7Vg6cTVrt6Ax": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4" + }, + "client_ip": "178.18.119.170", + "user_payer": "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5dKexbQNTEvEfCKtMqACbQtmj9LJcTuuCCWzLMrd4a2B": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "LTP1bMnfq1Z6UctyDXYHo9qcUJ6ReXm9cG2VwQcsHBt" + }, + "client_ip": "70.40.185.182", + "user_payer": "LTPZgWy6e4q88qhKEfdMeaz1vmetH5eSfREHgbVQ3xm", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5eBsCqg3i2DLkk5ohe1crMBXPg8JZwzyfY9DcXQb6w6X": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "43Am3PKFeo9cACpqYL5Sk95rpVdxLw3Mc22PqRqZXEW2" + }, + "client_ip": "45.76.103.57", + "user_payer": "HxmNg4kPUwGhGS7Z9EtdLQKG8Pd9VCg6cDtEsYXLEsoa", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5eL7g9bqkNEHS83n9v4AaCjxkcBcb58Np3qzF2hC3TLu": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "185.19.217.113", + "user_payer": "PxNHKU2whJJzQQ1tQMbdp4vAd7GuFMBGHidt5DpH7tv", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5fMpHnMeKsVv9eYtGhYw4KCudFPWqKPXBV5pdgtMTYrG": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "103.88.233.77", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5gayja4YxkWmT2Jy1qChiV7DnG95CpQRBt4otngehx1G": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "2t53LvZfskcpXkdwLaBnfZLbNgyVHPu2BNFpcRBaEBhM" + }, + "client_ip": "104.204.141.10", + "user_payer": "2t53LvZfskcpXkdwLaBnfZLbNgyVHPu2BNFpcRBaEBhM", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5hg5SEwGzQPprLD99ZXpXpT6tfvWdnaEWuFkoG8XVhsr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o" + }, + "client_ip": "185.26.11.167", + "user_payer": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5iFxPaRgvKNg1Eq14n25bkRtNzjgxgDZECakP18pat59": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2N7v8pDKDYhtBUJBQUgxvysUjgM9s4ULPCmeEiPWTf6Z" + }, + "client_ip": "67.213.122.67", + "user_payer": "H4EgZdjpiidCnW9MWnfWYMfxsZtm8ET1EN9jcfhUXrNX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5iQdyGp3G5JTQazhAvcvMiD6ZrmBkdZBzyzj4JRMb8ta": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "44CKeisDUNVLqsAXVpikbk6sQ9t34h4XwQdzAFLgJSFD" + }, + "client_ip": "207.90.225.252", + "user_payer": "FLVgaCPvSGFguumN9ao188izB4K4rxSWzkHneQMtkwQJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5iZ8r84rZtmJMNjv3A5JJosdefg7DWwe5W9M4E3MAhsz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dmycoyQrZsMbW3xUtAUkRVTQVDUsBMbjruvmoX5b9v6" + }, + "client_ip": "64.130.51.19", + "user_payer": "dzmTjnSdbPhsVPFcJVsnr6DvkrmUkrvzhXLqxHXPwoU", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5jv7BXwA3su7qtx1brZsebGbpiKuQhscYitU5ybLNHhY": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.43.217", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5ksGqv8LU6z4wafSGxP4voAY5mbj8wgWUqr3z8YuDWgq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o" + }, + "client_ip": "67.213.113.83", + "user_payer": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5mzgj9x3MqhJF3i1NPzLFLVCmjY8VCC7PKKbE3hGBU6M": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4GEEKSwuiBHWTff9WaqrDcToZjbX6KYdyB4c578Zxse2" + }, + "client_ip": "45.63.76.143", + "user_payer": "221AUvGiUry1aeMzCHghgakdFHcaWQsqDisyoZSjR3Vi", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5nkp7ygeft7UHFab4RL7jmG7a4xQ9CQutz8BsGidd58A": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CpNnGGhgVATJAbzHUXdrcGfpPiGuZyPka4QUmH7YgavX" + }, + "client_ip": "64.34.90.155", + "user_payer": "AGrV9dPFxW3mTEJHLT2c7kA1whLdV6odDstEZEeJNBsX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5o4LrKfxjknMiUw9Eyo1r8bLS4Fn6ZaJwxDNkH4T89PH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "sLv3zEkjHRGyDYcjr3JF77FGnfWvFSJiySWs6nWwSe8" + }, + "client_ip": "57.129.97.121", + "user_payer": "GgipuMTLa5cuEkmjxYeyMLPZ7vekkxFJqoHcakxjrtJm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5oHNAzUAFHApvuU7TCRMcfdqtyLd82MXNq5VBH6ZXZ3Y": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "2Rv9npqdWE1mLPsT1r2obn3xtKmA5afkxt8GsWeLnKoc" + }, + "client_ip": "64.176.71.133", + "user_payer": "3ncUDx8MktnYLtPMnoHe71XTmzDswDnfERGNNcnwzEwe", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5oZBLE2g7zizwmLUqSZmfZQPXBUg7bb5dXLYv9BUyivG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2" + }, + "client_ip": "67.213.122.45", + "user_payer": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5pU1AwFSFzTmGeHevFKp4fdeHsLAviacN86j96wGZ37S": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.146.160.20", + "user_payer": "93bRWp7XFAT1YANA5iUKXV8Go7cLwa5mj9CTnPPPZ6iR", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5pV5NRi3KTjhyigFsY9pnFjBV6rfivAxssArv3UyrbNz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL" + }, + "client_ip": "185.26.10.193", + "user_payer": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5qHP9bNsemCmrftGbSvbzwR8ondahUpyDyzfX9j7uWne": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "ZoD1XLMhxdMveAJL4x9oab4FhRKP5NThTnSCH19Tdjp" + }, + "client_ip": "64.130.61.142", + "user_payer": "9MNaAVMR3vgXziUo8dyPJ5VArqJd9t6gFmLwgXbV9p9p", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5qWJPvFJZikEFZd2mG9NjQv5tLhrrp3oFKSv2hdwTbrJ": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.57.133", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 231, + 193, + 102, + 84, + 73, + 27, + 224, + 26, + 26, + 207, + 245, + 127, + 47, + 24, + 24, + 143, + 142, + 201, + 203, + 18, + 250, + 154, + 124, + 177, + 79, + 4, + 2, + 93, + 104, + 254, + 177, + 78 + ] + ], + "mgroup_sub_allowlist": [ + [ + 231, + 193, + 102, + 84, + 73, + 27, + 224, + 26, + 26, + 207, + 245, + 127, + 47, + 24, + 24, + 143, + 142, + 201, + 203, + 18, + 250, + 154, + 124, + 177, + 79, + 4, + 2, + 93, + 104, + 254, + 177, + 78 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "5rTKN5FDbxuHTTArokC9Ma2vUrm3ftzttHeWE5PVJA8j": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "185.189.47.15", + "user_payer": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5raZRNrXwkFd2HimibBAcGY8D37LHFu9noij8pMW4czY": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.37.204", + "user_payer": "FqytUw4CBkD9UEVkBff5RyB2veodrAbNpFXCnCLCzBiM", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5rhk54Yu9ynTUdhJefXy19jKfMjmSLyTjFd4dWjW6VEe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "soLStaCk5TiGCpeLKa9Fvv6f5JQGMa6S3uhLh826e9N" + }, + "client_ip": "104.204.142.28", + "user_payer": "EmE5KsWqFYFyxytrCQWy91aGZy7nGfd96cdPfi7R5YRE", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5riUrjxjuEf2F11yetJnTsvZRJDVSBxuqzBx5QnTgaix": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "D9fy9Bhmd4Gi9gCPgfr8CABWurYV8AtCcju5Tqms37tu" + }, + "client_ip": "38.244.189.117", + "user_payer": "A48xFiZzS2VyPWRLHjw65K2SdBdz4MMcPqaBdiPLmr77", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5sMfC79ZyF7gWRa2hSLkrmPLfiWKNvdTg63cWbjDmNFB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "4aETV9RwzD3KWZWBRBWtHkGBVM4vnrcB6wgtRVdaeSPu" + }, + "client_ip": "45.152.160.142", + "user_payer": "EmE5KsWqFYFyxytrCQWy91aGZy7nGfd96cdPfi7R5YRE", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5sn471p2caUQSge9R3DioZrBttZ1Jwf96b1PEycxtFcv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "jUNk9Panm9A8VSeJ1n2S3fVPgcCZiGwYME4d3xgRAFH" + }, + "client_ip": "2.57.215.84", + "user_payer": "6uayBceaFssKHAhLiA3EBhFzqinGKQ5T66RGSopGM5FN", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5t5ScVmD8Y2p7LesqWznuonA9rxDXTMHoGuao2FXLmNq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9wMnPZBcxxxgfytw16mSn7h6s6xoeUn8UrWMPMVJer5E" + }, + "client_ip": "217.170.205.154", + "user_payer": "ChB6C6dmNujAi79XtQLPKLL5SWdNLMShA7KKnrMMFF52", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5tCMnSEAX1G6cnZ52dZyU1wyoNjCSczZ2pF1K6pPJ5fw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EtoMApqP2h1vVm9XLTTp5HERNezm5btkqrdAGQ9fZRnp" + }, + "client_ip": "45.139.132.153", + "user_payer": "AgTYKsWVqgva4P6XRVZy1n8wsbExqVTaot3n4XnzkiSh", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5u1pwCdSshHwYQexWLeR7jauHo32V7oHzWPBPwRA7Zr4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "c3rtoMCHSbFrLRTAdw4iRowKSn4BrDtvSPbuyJwkHwx" + }, + "client_ip": "103.14.27.43", + "user_payer": "L3LYuRHNHiC1fAtQz26RaUBbXoXrfcyARsNBUUHtm2f", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5uLgx6iiSvrqxeQMe53kw9vwDTh3JpiyNaauuv28XEFK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "popscoyTKVksa4TyTXw488b3vvFxM7qQEyTBeMQopKu" + }, + "client_ip": "84.32.63.2", + "user_payer": "GCV7b9bt9TViq3M4n8uYKrfz8HjE6VLU8czEsrgyzkmj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5vbMuYWCDrTCow2N5jSCQg7VojHWUnvLSCHZthJf1KfX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "8GLRbAstsabZuZUx73AoyfGi1FRCWSUhRgMugFyofEz7" + }, + "client_ip": "89.42.231.232", + "user_payer": "8QuLoJmbqnK6vALfEXWtrQhB2RA4RBV6XSd6gAqYUkKA", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5wHhNAKgk4Vf3okvcz69vHafsBhnFvcUAcKJpLLVnTCR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4J9B7e6sJ9mvp2m4iFDeHU6UkSAizAnrRp2pA761jfdp" + }, + "client_ip": "212.83.42.33", + "user_payer": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5wcLQ9WBZFdzXuVceDUPWf1pGJM8nxQq9KnHVavJ4dSA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "meshRrDTME9cL2FSQ9E56EncfkZ7vL8apwcCFsw3o6Y" + }, + "client_ip": "139.180.186.123", + "user_payer": "ooc9bBwcrSKVMWNCojjmvikh8NkSPSgRebm3DWMZeyP", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5xJpSD8K532Akyknv6BUL6PE4EY9rAgRt41QEhtjuYoa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FLwV8tm3pL8pZj6d927VASzPrgW51Gf4nRJuTewrfega" + }, + "client_ip": "64.34.87.157", + "user_payer": "E9agYzEp2gG7u4Abj6dALcU546NMD6pT81kVMEsAfTZR", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5y1zMqM8nq2j3DFj2so1pxDCX3BVi2QfezitamKrRyiV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "5ysfTZ42VT1TjnjzQShZSrix7wdVtjXwssocSeYKDs5d" + }, + "client_ip": "207.246.84.247", + "user_payer": "4jYF1T4CKKTubyzRqHzAtdmKg6BQjYDGurt42E6kTyfr", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5yFb4KSBsaQhzSRfnXVaFVbpEB8Wc8SkTrGFxxwLekLV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "B8mTrtsFHBMCUtM8FMTkUNU8AoveFb6DaroGnp8s5WiA" + }, + "client_ip": "212.83.42.95", + "user_payer": "1Link6hB1NpkCwJt3ZtpQKZszKauhEcKgiWjaU8PRDG", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5yhTvoTTrAqBoH8SxuoGuG1uVuFxoZ24QPQvzBSx9TvR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7zEztPn1B69Qf1rj9sBPkjkh3obgGKupuec4woQ47DDt" + }, + "client_ip": "208.76.223.72", + "user_payer": "CiFCLMt2ZXxvi6jiYnFzeQHUxgrX3bX1CoGkvRCy6Ts1", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5z2J2EBKQ36tKn39h2Qq7pGgHbEJ5fkW1jemjGSoNShS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "7nzTzRZzezmugqE5ZjHRMxarhXunpwZ2PUdjV7uYzt7A" + }, + "client_ip": "89.42.231.105", + "user_payer": "DukHp7f1Us59jjWB6ihyg55cWGqcpz1db7pa5m9zvLLJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5z9gTm3GYrsYnnuvN1WKJ6bxjg4N88oddGTcdSoifHnF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "FwnWx7x99rGwLmipzz8ii15NqcHkKRo2oS1Y7j6LivgZ" + }, + "client_ip": "5.187.35.42", + "user_payer": "Dug99hFphzxrrA3GhS8U1Wxajz1QKaqszJU4PJEAwPDU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "5zUhjoLDFLF8xRhK5XHdHY6Gk8SzY9XsZ1X2JYQbqS2i": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.33.74", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "5zVVNUsKTeen46SZ58P18pDX6QFas4LdBk5hcC1kNm1r": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "PoN1E3VyqwqoGQEhC8ExpkRKTuyhxtGLnHHH3DwbgTU" + }, + "client_ip": "107.155.109.150", + "user_payer": "PoNZQgVSE7X95D1fwiPJBobHYCXBxw3MV8oiT9vSqjf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "615mETWVgHP93kjYyGaFbiRr19MYKUVDpwSTGtVc9RoG": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.40.99", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "61VQmRvTebCbwt9v15sdqWjrSgZiXZ6dE7t9E6FrMc9z": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ADXUz4wzYwkxkwsszs1DU46YsnHqatgjVcoxGjNEPomp" + }, + "client_ip": "64.130.34.155", + "user_payer": "STKEbHxS7rRMgL1NE99MqV1VjTypnUV5YmE7TqAC4JY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "62Rp1GceKJtLg7fqZqVJFFhemZvZPb4RqjUD6LVAZJmT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6896KVqt5CXMqZpp61a9XgjMkJgvisHUzSXUSsTo92NN" + }, + "client_ip": "64.130.34.106", + "user_payer": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "62caEsQPnxifoD8X85m2pqwRK9GXf27VdHaTBgSvCLU3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "5marvipGzf98hxnoJFXsZbGHSXcEQ3yRGJ4ps7D3V4ou" + }, + "client_ip": "216.238.116.244", + "user_payer": "9SJCs6deTuw5AKNVeaUZtoBfoiXYvr3LoeGg6pU4c35R", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "639LSjJUJhEfiChybPvBe1F8UgFDbKYWfEeyA6fg22gg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DJ2x4C3GfaBJoX4FHd4ziomo34ZViubd2jinuFmsNSgs" + }, + "client_ip": "45.134.108.222", + "user_payer": "BnYN5YzNANLv3c3qWgKhPB5C9nCButYrn6ji4GfFhPrk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "63UCSXKyiVFbQLd6cyo62EKjLJii8Zvrq52taMF3e3tw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ES1M3tMZ4rMTJ3apE75cHfeGWizDTrMMXy2zKtWkd38R" + }, + "client_ip": "185.191.117.246", + "user_payer": "7ow28Ctn1nJqZJKzZ9ZYUveqDvxMfBYXBJFHK3ZQ1QhY", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "63h5uJrGqDa8VyDaPo8EjW6xFPySqRHNmFxbT3oiA6Pj": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "198.13.138.185", + "user_payer": "ETs4Xdyo6a8H93bkacU2Ekyy6MJix6uBjjcCoN8Q7eJ3", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "64dnBMTLnTZ11juyxFsfztrkKtA5TgSzEG8T1xifm3W9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf" + }, + "client_ip": "198.13.130.72", + "user_payer": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "64jQbX1ZCVLEGRHDPHz7CQikPvvresSnBnZuTf8ouCnG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "nSGZ3tv2UhskkPqiB666yDVj7PTi9qKgDqvjHyw5JgM" + }, + "client_ip": "45.77.156.249", + "user_payer": "374voYegWZ5NCBKjns3Cd4kdgDgmL973Mpxtxw8QpD1e", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "64yvGx3WwgqzdetxtvoHaoVwo64QGMmYqQeTeSDLz8gU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CLsFr1KZVbAyz16iFpwg2e4hiekR1unpwyxfNdjBMaoE" + }, + "client_ip": "67.213.123.149", + "user_payer": "ESwi4y2meazsbLz1WaSx3vy1MCnenL8NsFKq77vNXp1T", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "65ioxekzigTXFe4BkyKurZ845XazJLXxibhxqHRAeGxn": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "198.13.138.199", + "user_payer": "Haee2jdKVDdv1fDNdPjXqJSyuK71VBxuzA4UfnuMCtJ3", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "66S6WpiCCbWaLQxVn4ySdXWRCZ4bPFM8Fp2zH5j72qKj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt" + }, + "client_ip": "72.46.87.227", + "user_payer": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "66TN1hXa5bEjuuRMV29YNEWynjqs5kw3gzzgXMJRHAjK": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.142.19", + "user_payer": "5mNSjVHcmHVuoYxfZ548B7K6UGfb2xoSgA89tA1efTBe", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "67M1kXN9KVJpoXEdiXjnNp7acqzdgJK239JhekmD9brJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "triFDgRGWmiFdfJ3g2jTFqqZpygPrZcxaEGvaXHrk2p" + }, + "client_ip": "185.229.190.84", + "user_payer": "TRi12sEaDkgoNSsEpep3YF8QPjqz4qM63mc1Z4tQCvD", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "67maBP3moqCRLjYw6JFQv7JA6pUQKiN2Ds2pnsyqBmV3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS" + }, + "client_ip": "102.211.135.173", + "user_payer": "CWbapfvMikhLzuSruG9Yrm6Nqn2sw9pkoTqYBPYX3cdb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "67qtTuBdHGdU4kAWuDhBFxgWZDRiPvDayWFvaFkiphsq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "R2D2imoV8nXk1ngT9v4dEK65We4uLNyUarTBdWbFruq" + }, + "client_ip": "84.32.186.125", + "user_payer": "GnqBH8nSjBfsPBdvHz25qyYxiqdP7vzR1C254X9yRB9U", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "67yKeC4btQyYg4kw344UHCoY7n8JjLDyEqHAwQA2sj2R": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ArMBx6veRq33ffEP9sxHafiPRgrtzww4XvbwZbSMfXiM" + }, + "client_ip": "45.84.193.4", + "user_payer": "6k4oeLB9fcAuNFnBERKqZXPC2vfnMpaeNnqxU3D3zEKo", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "68APS2JxEBC1bjvUfseHBWZZRez36eh4b4jqtFSLYYie": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF" + }, + "client_ip": "189.1.171.179", + "user_payer": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "68UWQCH9jwecaR8UB2zJ86zRCkVsfSmbT2iRk2MfZVBA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 248, + "accesspass_type": { + "SolanaValidator": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe" + }, + "client_ip": "185.26.11.139", + "user_payer": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "68V3zEDVDfxveDg24ZNqPQtWti5pd1KPu4qJqKzGaJ1T": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "hykfH9jUQqe2yqv3VqVAK5AmMYqrmMWmdwDcbfsm6My" + }, + "client_ip": "216.155.157.223", + "user_payer": "9nxWixzZih86YrKapEiG3AZigQBpoUX9Avn5pS1GWMqX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "69AZSZMJh9q1ZupWfjXv4P9BBNpRnEXzNSKoUzCs7Vu4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o" + }, + "client_ip": "72.46.84.111", + "user_payer": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "69KR19zGt3QZDFXhcS6KPmjuZa9tR9k3SYDPfPxCyLZQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "2X7WoaXX9KPqNrNfvguhnwo3rjFPNsfw2t75fGjWRthz" + }, + "client_ip": "185.191.118.3", + "user_payer": "Eakwm8bJyB3831oWS1Dq2GNsv1iUpuj8ZtJ5RtHPQea6", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "69cuRdRhj81Z989KPDzBss9QkFqeCALn9QWfnPb12bbf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "juigBT2qetpYpf1iwgjaiWTjryKkY3uUTVAnRFKkqY6" + }, + "client_ip": "69.2.42.124", + "user_payer": "AgqQDxif7swafYP7XJWYChpsmB2zkacHkMZ5rrQAPaa4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "69evgNqG1BovNSJPUQUUCdFeRta8452FCXRGu6YQmQFa": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.152.160.144", + "user_payer": "8N3FjwC2NLsZ4q93dnjgPEiSfMPQdVNvAdnwMwXnkftj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6AUQGnnwSPHCQ4mZM13PyqsGnqmLNUQQnaKZuxcKEawi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5" + }, + "client_ip": "84.32.186.134", + "user_payer": "5b4u8RdhNUYni3PZcZgBzxYw4mt2TTak5b8oc1mcmb5z", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6BQ3gDJ5CsVv41TP9HodfFDwBkpZiYDwPFQBL38FRCMJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5t4shVsKnUqgjmhK3fFNsvyju2E6Rd7cc4S5pmqqEVEW" + }, + "client_ip": "173.231.22.154", + "user_payer": "HwBL75xHHKcXSMNcctq3UqWaEJPDWVQz6NazZJNjWaQc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6BRyd2xB9PoHaYLyjSQTB9YWB72cZFNKyqQt452JrwU8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "THWsLPufeq9LWs2H9vYPbtFwdxAHbQHvSbT6pztG8x1" + }, + "client_ip": "45.154.33.35", + "user_payer": "6uayBceaFssKHAhLiA3EBhFzqinGKQ5T66RGSopGM5FN", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6BXgcFqPrwW1MkwZKnCaQGv4jUvvoJC5pgxoMdFincwm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DeXsDvvZzKhVux4YfDFE6p4acJLGzr8yKt5pSTjzZB8t" + }, + "client_ip": "5.199.164.218", + "user_payer": "CCAvrwtzbfwDyqwKcXg7zknMAyDMJP5nGADRMyGFt2Xk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6BZRPcFqptFcEU8E4YfF4WjcfCLfbekhz7mcjCsVkgtX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV" + }, + "client_ip": "67.213.117.61", + "user_payer": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6CDNEvbK5jzFpg5rEje4k4C8quz9h1zmGPSGi1rDgrdt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "3RXKQBRv7xKTQeNdLSPhCiD4QcUfxEQ12rtgUkMf5LnS" + }, + "client_ip": "5.199.172.167", + "user_payer": "GMHJp2h8i58u1He6Gcy3JjorsphPkVfTGwPzsBQuDCo9", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6CiTJDyV93nSnbeL1EN6rH9pW5BSXKBDRYkeFhj4bv2X": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.55.14", + "user_payer": "G957WWW86BJPm65QXVzjrfLTFWBecakGB2LdaajE6uj2", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6F1pbJNSZTTqKQgAXw7Gk352kyJthigqenmvfCnySaQG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "JC846fcPP3ASxgCJFk7zHyyDbeU7BMkwr66RD6tWbRfS" + }, + "client_ip": "103.28.89.141", + "user_payer": "E1D2CrTDZyb3dw9Zt35oWKwAT59d4BnhuztxdoM9fptS", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6FXh4doijVCcE4qtZX3PJBU3vZbZNenETr2aLX827dKf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "3DaPk6TdeGnEBwTR8fEyZSLkdayk6vZXrqGZhAgYK8BV" + }, + "client_ip": "89.42.231.233", + "user_payer": "BsS2BWy1qeFLFsbahdzH3A5Sfo7DmMQqiYMbYdi4s5yt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6FfbJxtKj2CS23ZCGvpk7q8bHJywSjphApXXg5bsgdEK": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.32.42.171", + "user_payer": "DZ26oxRWx753Rqso2WUqR5RPY2yWGiuBVoa82zYcRWTF", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6FgbtdM9kzpmTuGJ13xRGZq7goFZf58SZnQFchhNXk3t": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.61.24", + "user_payer": "dzt1CEkAF1rKBty7w9cStBfr48n7RKSK7mdGXe5AqHt", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "6G1wA66CKYpmgba8bvk51FfYvEQSsXpN6dMUR8VB9hmT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "sLv3zEkjHRGyDYcjr3JF77FGnfWvFSJiySWs6nWwSe8" + }, + "client_ip": "162.19.222.39", + "user_payer": "GgipuMTLa5cuEkmjxYeyMLPZ7vekkxFJqoHcakxjrtJm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6GggiSHdwaEY73KBVLQ8YuxDPDWSFdoVZgfTAXZzmLa4": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "185.191.118.43", + "user_payer": "CorvusJVzafrVZ56BwmLwcS335WwSJJXB54YmipCMp1B", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6GvYzhpkZ1FspsfiNCdaSGR19miWrsxDz98oKvxqHRaN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "3x9nibnhgBHWKMRiGnsXJELRBjviQpKyigfrXtKW27KJ" + }, + "client_ip": "104.204.142.125", + "user_payer": "D2QkK7MZNBhsj9ZfvoCtnn3T7wvrkJZxaM3kr4vnbAqC", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6GyH5csBnDoZUgT2k71nozKSzZD5TNTT9kU6Y1dxQNTy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "MCFmmmXdzTKjBEoMggi8JGFJmd856uYSowuH2sCU5kx" + }, + "client_ip": "84.32.64.181", + "user_payer": "APaEbMzPskbrJFESuNDj1AZuu6iQhQcWeP79kZjy19Nt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6H62kjM4cEnsi6vpaVLLoKANzCPPVgCMD2wKjZ8tVWfz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "15.235.231.135", + "user_payer": "FPFXq9ZjDPwhuEHVR2UwbkfiuELYGUVuPv19Xn5Uh9N4", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6HFJE8KxpreWb1VxB1iQ4hoErUKCQVc8HJnHdhBdi2gE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "AY3ydFbbpiFq9rX4Hheq7KQ6UB9rhb8x1wxk1h2mNWmB" + }, + "client_ip": "45.135.201.211", + "user_payer": "ENBBdAkfEj5FgWwuyxaWAprHaSAUuTainYRCZbMET8se", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6HeqZyUJzsUqzdWBc9whajuZyZ6Het9KF45JfeweLSNb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN" + }, + "client_ip": "109.94.97.183", + "user_payer": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6KBSbpD3Yk5EMWAxm69oonRvP3D1LdEVky22PC6iCWfR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "6gnbmed7kzwQVQ7ghsjgEuCoYmGeWciV2qCwni6WS6HU" + }, + "client_ip": "103.167.235.242", + "user_payer": "Cg9YspxfoL2zoSPtnwi91DhHS8RLUDguVWdF9113RFt6", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6Kq5DPmJaTR5BwyT1qEaTDkNbN569ScbpF3XLe4otWZB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "THWsLPufeq9LWs2H9vYPbtFwdxAHbQHvSbT6pztG8x1" + }, + "client_ip": "5.187.35.135", + "user_payer": "6uayBceaFssKHAhLiA3EBhFzqinGKQ5T66RGSopGM5FN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6LBhebDxdPDaVgbiAQXTpwiLh8uBp2pak3R1Q2mLNpK8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD" + }, + "client_ip": "69.67.148.115", + "user_payer": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6LM3n7dAqLQwn7UHxYwzMaCTXkTJmSRta96jUdz69Es9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HM1KjNaXa4w8K4gCXbieoMh5gUTNeUhg9fvdXMKeBW3L" + }, + "client_ip": "64.130.61.68", + "user_payer": "HMZxyTe5guZ14GtMwmxvm9YeeGeHmwX86yvNuwvKyrbb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6LV8NhXmsLwkB5gbPuc4g8wEJ98W1T1hRoK3GH2gb6QY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "Bs19Z9SokV1s46jutN9tqqaCgYf1GsVyyytVfkzwn9qK" + }, + "client_ip": "89.42.231.136", + "user_payer": "FSkkUkQEdKBpjSbaVHci1zyu1HP34YKqd6LZnTbSkL24", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6LbgkVGpHjns2cLE2LHLcrScyo7t1hRtiquET5TyJJVa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5wyxSCzaS3wNgnBUa4PJ6SkR4w9ZoLfEVVFtFXxopLtp" + }, + "client_ip": "185.8.106.209", + "user_payer": "6cfcopD5wh6ZMftYDck1KV64gvmHpFjF6w3rsFVTCkEf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6MPWpuj4nG4SEiNaXxyWnU4UdXtY8QNVd7xc8EbCJGbS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "E99w1XfS4UNM1xUKXWEuDmj8Mduy7u65jm2NCULTspSV" + }, + "client_ip": "216.18.204.162", + "user_payer": "6ZhQ2KsvdbtMRhdczG7G5p6xa5WSZLmTAdUJzreHPWyR", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6MbGLaTE1AbnTwdE7woaru4F4YoPXFXGKefz4f9RzLzM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EDSU3b3yJtHgWPLcAeQL5p8urQid4VS5BUasbCz4eejf" + }, + "client_ip": "198.13.130.77", + "user_payer": "FLVgaCPvSGFguumN9ao188izB4K4rxSWzkHneQMtkwQJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6Mwo6rCun2VybT5ETTbkWc6qcSFEEDULiM9rnFNu2xxz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN" + }, + "client_ip": "103.88.234.125", + "user_payer": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6No618FTURzmyc6MzNagaLxou3sdbDFhtEzJzRpYCB8r": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu" + }, + "client_ip": "67.213.117.61", + "user_payer": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6PkSaR3BtXjLBJJnBq9Z7Zw36kMtkkq7YuTYDCX1GkCT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "5ysfTZ42VT1TjnjzQShZSrix7wdVtjXwssocSeYKDs5d" + }, + "client_ip": "149.28.246.159", + "user_payer": "4jYF1T4CKKTubyzRqHzAtdmKg6BQjYDGurt42E6kTyfr", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6QKNfpWsCJpq6Srx1ypfzv4Z1TxWeWvQ5F2TFjg2o9yY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o" + }, + "client_ip": "185.26.10.181", + "user_payer": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6QLi3g9L4gw7k8LZP1AkP1aMfeLQxjz4JK3cD9XiofxU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2m1A2WM1vte7RWz5xTTw4i1SiXmngVtXhqFERaUjoAAb" + }, + "client_ip": "84.32.186.206", + "user_payer": "BLvUbmRVZGLzRTVE1DZL4LFdmCGytuizxStwtyhE3Pii", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6QMCrkAVKGwBmtCdrBk56SmUQuXkoqUdyFifChK2YQR1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "1Link6hB1NpkCwJt3ZtpQKZszKauhEcKgiWjaU8PRDG" + }, + "client_ip": "45.134.108.88", + "user_payer": "1Link6hB1NpkCwJt3ZtpQKZszKauhEcKgiWjaU8PRDG", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6QkefN7gzLzRL3ZbM6YmiP7GwiefGuaP7m8q9MZXbDpR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4" + }, + "client_ip": "189.1.171.179", + "user_payer": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6QueLa5ZqGDcdZUX4RkMn6882ULrBJUUGgupuEfmNu8C": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Hqr3kookSnMBTC7mHi4vsBsZQ5ih7n1Jx6vKwVjKoZDC" + }, + "client_ip": "45.77.150.33", + "user_payer": "GqUtPyfcg7pa1ZHTBLd6tqdLndDcUFGeBcvhxJbpn2Ce", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6Sa2N5igr3H2a9CHMcGQKGQp2SEdqjWwditixoMAcBiM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HVXXmNKkmDZbZwj74iL2Y9Wu4SyrchBoxAfFYVAktLrG" + }, + "client_ip": "154.47.145.125", + "user_payer": "9oDeND8pBT9xTK87E4vN5JmSH4Ut3iPG1nzJr6XTMVzJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6TAbnpRohqzLV6jJSVKmgD2TtzS9X2e3CPRvGoaZRmWn": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.42.51", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "6TwQzX5xRZesZuJEGTbRWnS4oLHT7vvJXb7Sx14rCHQS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu" + }, + "client_ip": "102.211.135.162", + "user_payer": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6ULV6xE8jWUCWKwZqJm9NGP5pVqcA7f8tVTuADACEjKA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "KoLibrJsbABbtmtFPc7nPvDxT81rc4UPM7mY9xSLjpo" + }, + "client_ip": "62.197.45.33", + "user_payer": "KoLibrJsbABbtmtFPc7nPvDxT81rc4UPM7mY9xSLjpo", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6UpfvaZBZ6ejE2RYAprNU21eS2YqND6NRhDw31LAwwSa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "7cVfgArCheMR6Cs4t6vz5rfnqd56vZq4ndaBrY5xkxXy" + }, + "client_ip": "64.130.42.70", + "user_payer": "EuAHC3S2T9qimVBjJHRYmXephjURHZGMyFsZnUacn6wB", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6VVxo1XhoHsaFkczX5hhkjooQRR2KLA52BgVYc417xiq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "TopjgY7N1fJdnW89S9fX6t7LF61nspgXGL1NpgAKhDG" + }, + "client_ip": "198.13.134.18", + "user_payer": "H3egfHfhKLANLTdMWvn8T5Hrtr3Md5aayZxLiUGxwEmZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6XQUsYJc4FXvLxaWf756opqTJ3c4n99ZGyxxeKeUnvzq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "G1bLKfyNm7zsmmYEL9dyxBvMtxpFcwy2s84bHDj2ZFUY" + }, + "client_ip": "185.44.207.20", + "user_payer": "2ABbPEEr2TvPGMAdWC7M1y8QUwD437z8w4YZbrvU7z2U", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6XnqppCXLER3dpyAqAhoSVdPdzczJLkK6D1kDPE2h54o": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk" + }, + "client_ip": "67.213.121.171", + "user_payer": "EwJA23TUEbcC5DrdEJ8uLXZs5YVsZPTHkkPjpFvTLovC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6Xte35t54k639tpePAQHeXFJor8oBkEEF84UgrrPoWai": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE" + }, + "client_ip": "185.191.118.2", + "user_payer": "9AnJPXuU2Gm1ZUCWGdXxnyhQYGtFiZ7szYgUA7XiPGGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6a3GSoPs5u6XRWw9xXNrAdJm3ZmgdzRPg2nSPC6iWve2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "faiCpbit1D1SZYysWiKXaDRo2JHCoKyD3zeGEVTWsxQ" + }, + "client_ip": "45.139.132.97", + "user_payer": "grptonHnt7YSmJokGK9TJJTBXDT8ca4LSWMHCCfzzPa", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6a3Jj2VaBBbvDkRZrFvWeA6MnVp91YmS4BWYENXBSUzY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2NeqnzhgQBUEyMdWyVAXJjCYA3E2UTYXVdqutSQ27h17" + }, + "client_ip": "45.139.134.38", + "user_payer": "2NeqnzhgQBUEyMdWyVAXJjCYA3E2UTYXVdqutSQ27h17", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6a88BiWLzk6yPo8nJYyLbnohtoHLTYT3ASF93vJD2c5v": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk" + }, + "client_ip": "45.32.127.237", + "user_payer": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6akN9vhfxNm8itGE5JUkBA7kJ99WzCjwrnkiJrp2s9Zq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "sTEAKPk59EtPPbixCweyv6oRLNCDEE8pnnef6gUfbiW" + }, + "client_ip": "151.123.174.174", + "user_payer": "sTEAKPk59EtPPbixCweyv6oRLNCDEE8pnnef6gUfbiW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "6bwRtV6rve4otM8tSaoFY6ecsd5WoY5hruZeh9QWuNdu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GYx8kpp7SsRwtQEEsGQjAxb4hFMMmT91kFJuDeky3YGQ" + }, + "client_ip": "208.91.109.37", + "user_payer": "FBYXRwi7gPnNNQurzZQo3GBQpuN9KtSSifWWU2EinwXV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6cNqt9eDfkzWhWyYmR8Wwr2yvACUoTD5QV8yAEMkV2v5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4" + }, + "client_ip": "67.213.113.101", + "user_payer": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6csBDgAVTemCB98tadyB37qhK2yye6U3Y5nA5B5gSVZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz" + }, + "client_ip": "185.26.11.195", + "user_payer": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6ctcRCgzmL2hfsgDPQUccD9bwEpsAzAJhDpQ3NK51ZTn": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.35.123", + "user_payer": "ELGDsZJRUrpbC3uAEPcLMSWtTbRZwabig7R2fBxpwhBQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6dDVbmuZbLJfsKZ7xeRrh1thimamJDqJQnUR8ESWJ71G": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3dSf3Fddbk8JHBRw25TrVqhz2rUPxZCTwn39u6e6yz7x" + }, + "client_ip": "94.158.242.57", + "user_payer": "EDBBUovWxTSLumyUNTbrp4XyBa8mX1eRSJU1XbQtnZaK", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6dNwoDBSN6HL3kAgRc8CEYZMwAybWNjpuywfeeJ4yvwn": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "198.13.138.107", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "6dmxNj6y8yE2iFxsnAR4mAUtpmSV5uekGu4WUKgjCsko": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "173.231.40.50", + "user_payer": "4i9fgytj7gGGXjWj9Gd3xXbnkXuB7p2AQRyu8kFKpJ35", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6eDHDuE3Emq3VAk7drtmvzgKfg8QFYGg37zhFZigMHtv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "B4AnzER3v1dEgWC7vQixyBviZPQNNYzvFDqvi9z64e2D" + }, + "client_ip": "80.240.16.196", + "user_payer": "GBzbTunYrMzcpeyJ6nwCUCupAbvEvE4xJPx9SXjAN1vC", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6eH6hqnSPwaZvh1vjdRshUAiiqd13hiszdJpAREVUaJ7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ASPKrcFM9M27cHcbuuuJddxPumowE1izViRsNehVjqAb" + }, + "client_ip": "64.176.218.125", + "user_payer": "221AUvGiUry1aeMzCHghgakdFHcaWQsqDisyoZSjR3Vi", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6eNZYU2e9tM8XTUPFqibeJCD485wXQAPDcMk9H5UqFSG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "FFevTkywysWf8PJvH4DZkEp4v9ks9HJPJhZWbhhJiYnr" + }, + "client_ip": "86.105.224.116", + "user_payer": "9pSWUzr5oe3p6P3QnJAWbPQVGodWuH3mwdvpsmvyU2bA", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6f5Ddke1kXPA3UVBttQQqsvCes6KS5Fek97yBCGKX93": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4JahMMrVRS1gimWoXpD5H6KwKc2MrsoTDFMaStMttL1E" + }, + "client_ip": "64.130.50.51", + "user_payer": "AgsGyzwiy4cpCS5FHgNQSRu1wqqmjaYDMY32uwoBtfQW", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6fmeYQVb3WvN1k8mHmni141x9NxjmW4GU6PKmZky78ZU": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.138.187", + "user_payer": "Eaw2Z1HYbekh5UMBqA7mQK3LucGQBiTPeWyMSMMk6sa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6gUBwqqjmfuSuDmsFcHsZvGT8ejArkTzwuqRJ1HwGX1c": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "GLAMiBuunBioazKwNbkGnWP6BM2sfVjehr4goPPGBFAC" + }, + "client_ip": "84.32.103.77", + "user_payer": "DLmpTwh8vFVDz2AJjAwrvuESPvuzEBvbAfabWqTEHtSf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6giKKvVChyDz5bTSG3PLBvCG4uDKruRLbvMUPnPq3zuM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BoNKmNCGvoHS4CkKvYRnF21iEpUP827pZjhFGdA4t5as" + }, + "client_ip": "199.91.64.26", + "user_payer": "A4XSeSJb1MEgqF4k3pFzL5cKg5FRehW8cgzZs95ey3dY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6gjCWoVAiUVgJdj9aMszsN7njWSriRg61BWGHmM12E3e": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP" + }, + "client_ip": "185.26.10.181", + "user_payer": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6hsPS8eHe8JsDQAeFJFo3diFKMXrdncLmrB6pwfLTHzP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e" + }, + "client_ip": "185.26.10.233", + "user_payer": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6iYaWCfYLZt8LM4zMDm88W632hmf7nS3vRBgidfe7C6P": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "Av8EnYrPBnSJHK5e2wmTdnCpSy7nzmBgyFaUKSyLnBfe" + }, + "client_ip": "155.138.134.73", + "user_payer": "Gidha5Gmxuyvidgoixjcefoq9s7UV8fwjxM15ZdeCxH1", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6j15GoXu7sGN9Ft7eCEx7bqzCYoN1SZySeZFDRvpoNoZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu" + }, + "client_ip": "103.50.32.189", + "user_payer": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6k153byVL8HKt4UE3gZZ3whMDa2pYFuAA5m1V7e8hxX1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "ES1M3tMZ4rMTJ3apE75cHfeGWizDTrMMXy2zKtWkd38R" + }, + "client_ip": "64.130.40.195", + "user_payer": "7ow28Ctn1nJqZJKzZ9ZYUveqDvxMfBYXBJFHK3ZQ1QhY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6kNTWjYaVcMSEWh63oLHcjDY39yjehutX9cER7dKpuQd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "PRGNnb8DxVcP2WjSHfVRGgc8SkA5u6dbMwoTVV1BGKN" + }, + "client_ip": "103.28.89.181", + "user_payer": "DZ3wDCu2bVVH9yT2vHxLTRrLUBRRHGmytHc3prK3pRGN", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6mUjEuURqD4LHsmcu8ov42PTuxQ9owyWJuifjbndgLWU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3QRGPexjSS3m5b455FGtxjGjMUarFE1bB4dNKAYbegz1" + }, + "client_ip": "80.251.153.166", + "user_payer": "BsS2BWy1qeFLFsbahdzH3A5Sfo7DmMQqiYMbYdi4s5yt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6mjfDimuwQAUE5upeohdPbCMrXgYTjyu1ziexgyC73pm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu" + }, + "client_ip": "64.34.90.159", + "user_payer": "JBnY4g6U1G1sKs6h1xk76kFvD23qfUVgHrjQc4DBdqgi", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6n8PoL9XcBcn2tL8P3H7SNRxAZVVipFGJJFif7rCssiE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA" + }, + "client_ip": "189.1.171.179", + "user_payer": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6nG4aBedi3jsS8jGMimPTjh9LJAxobykX1spUbvftMNU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2Rv9npqdWE1mLPsT1r2obn3xtKmA5afkxt8GsWeLnKoc" + }, + "client_ip": "64.176.65.173", + "user_payer": "3ncUDx8MktnYLtPMnoHe71XTmzDswDnfERGNNcnwzEwe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6ndiduss3dUjvGcnV8P5eghRb3opsTugoCeA5VQ1ZP4u": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH" + }, + "client_ip": "67.213.117.61", + "user_payer": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6o5ZCFjuHqEMASwHvooKDzkrVuEwhV9y3zFkSQ29WTpr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5XKJwdKB2Hs7pkEXzifAysjSk6q7Rt6k5KfHwmAMPtoQ" + }, + "client_ip": "91.189.180.214", + "user_payer": "7iAphSWfFfriTREQsARoGcfD9qqUqSjZs9BcotDULyrZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6oBwhketKbMHRikM1QXicKyss7rK44Jw1rvMSW7JTs7J": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8Rf7hLczBzGb71rmEjw3h9tTcxGijDiDHL651H9SfSFa" + }, + "client_ip": "104.204.140.38", + "user_payer": "3JrE6cU4ASLbZc9Ad4HcaEqP6YjrWFvgDe6KNRZZyh5d", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6oosVtPWURvmSi7SagemNXvNFUA3eqqraUzgRQiQsB1f": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ppppoqHcHVzigV6SK4856BAsNxhTAi32hqQQWrziyHE" + }, + "client_ip": "38.92.24.106", + "user_payer": "C54mv9sWeajyVVci1gMhpfTupFESj9KpQz4ek4fGGqgV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6otJfxAEYLQGFQPRDxMRzM2mYkJxmotnBvXD5258vkXD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "xiEWmuosThgaUV74svCtxxCqfXdCCEgehqRZD9NX4rb" + }, + "client_ip": "84.32.186.110", + "user_payer": "EYTN9eRR4y4zN2yCR9L8cWvvbWbGTSuNrRT1ixMf6wND", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6oxn5iFTsSRAi8BSPgtTAJxvA6mxLnjmheYgAsJAskqZ": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.47.247", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "6p9pt3wSjZnGYjicEGbeFoHKaNKESQNHzYnuFH5in8Sy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "E99w1XfS4UNM1xUKXWEuDmj8Mduy7u65jm2NCULTspSV" + }, + "client_ip": "103.88.233.83", + "user_payer": "6ZhQ2KsvdbtMRhdczG7G5p6xa5WSZLmTAdUJzreHPWyR", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6pGu2y15vRAwzZzwkbYKnkw58ubxqbdPZ1R1dcFHokeS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GK2YYwmQk58xA2k2SeugY3i334SJVViqTT8sT5wim3Dk" + }, + "client_ip": "84.32.64.75", + "user_payer": "BLopsF19UB1nfE22Nfh7wwcQtx29WjMVZKYHjbLq4HD7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6q2847uiVbYozCgj83pm9YZ3mCgrcT8k8Lv7fKJ7E7Po": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SWApJcN2E5NDQYTwSbat4ejNYGNqJMJgy6HqZMU45i4" + }, + "client_ip": "23.252.121.130", + "user_payer": "BiU1DNow77wGwSXW1bLmkcQe2cuySpkbz7xtbitD9Fmk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6qBDApUV3yYqsq2boD9jT3bqskAxRvsYEQopZiVawui1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY" + }, + "client_ip": "185.26.11.195", + "user_payer": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6qGjuHZVnc2uVhH1YCjCCjKfyHSfxEX3fmgnTKd5ct2W": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "FyLVPAKkgdAy8Gn9jnFYN5yjC1ubQWRkw2EHt2UnC8uA" + }, + "client_ip": "64.130.52.113", + "user_payer": "G6HZzHnxVehHkvvsPPVTsYVjsQY9d6jD9zDPYfhRdgRY", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6qccQHXpkG5k3DxvYipxdgHGXHoxoZu6ZU9ra7yKnSVW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC" + }, + "client_ip": "67.213.122.49", + "user_payer": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6qfKiaHWeGP8LnzSxVMLiixwF1mW6YJaLqWKmsW5Bi47": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 250, + "accesspass_type": "Prepaid", + "client_ip": "64.130.37.201", + "user_payer": "AST8TNXp8pyQX4w9v713rnfVzAXbv7apsAV5eLjepuDZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6qqQRGGaSz4ejGWzVksRdAr8Cpiy8S4NefQwUHZBLVLx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AfZTWYoFQbzqCMmUBTD7XwxFvjob1FVyCvkaXRryxtKc" + }, + "client_ip": "142.91.100.148", + "user_payer": "FijxN29RupuP6mVeLRmfVomGHFzFGZztw8XFyn3c54i1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6rGTre3PNH3nvpecrFtBt5Ny3LKfPLy76pA626ky58Dz": { + "account_type": "AccessPass", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "159.223.46.7", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Expired", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6rSyu8x8QWRC6we2ya3CZjJXiM2kU56hEPL4gkvs35xF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu" + }, + "client_ip": "64.34.90.213", + "user_payer": "Gte3K5BBjEKKCzJn9Ce7Py2n8b9zFAFH3RAfJ1bLYFcG", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6s63F4QuQ5aCabWVygM8ibSzMNj7FwzZwEvcTog5VkFU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "WUNoB9YQXmXXRcJsjY1G8PfVag5aAfnyGmFd6YwJVwp" + }, + "client_ip": "45.84.193.5", + "user_payer": "WUNoB9YQXmXXRcJsjY1G8PfVag5aAfnyGmFd6YwJVwp", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6s6Rnnif9CdDZVV2wi1irmB4T9R3y5ykD6GNWa6NQ9ZS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EvnRmnMrd69kFdbLMxWkTn1icZ7DCceRhvmb2SJXqDo4" + }, + "client_ip": "70.40.187.21", + "user_payer": "GgipuMTLa5cuEkmjxYeyMLPZ7vekkxFJqoHcakxjrtJm", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6sNRXRAQomHnKhkbCqfaGgxpac3QmKyUfRnCPfE5PxtB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC" + }, + "client_ip": "189.1.171.177", + "user_payer": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6uBJZ1teCFhTVXQ7UVTFLUns1MhpajpnS7j52EJ13rnR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BUv44cVtsdvU9z2BfFGk6s5JZZWrmVnq5qCaii5ARyyB" + }, + "client_ip": "64.130.42.88", + "user_payer": "xkN8xAw8kQAvUjcpqnxBM5hYdrXRUJtHotK8WuK649M", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6uXNUhziwVBmFsDoKDTz21cXo3KXoFwTrdAfSeLaaejR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "xLabscif2DLnYg39rQThqi7A9E45L9qiysRZhmZ1ARE" + }, + "client_ip": "103.106.58.21", + "user_payer": "5tBRKpRhJnZ3xcRuLoRznNzApRe8WTF9zzQR8cKGDNqA", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6uXjqwVSChnWngrdDckA3XqaRTpCULc9NHUH96V37HZR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Av8EnYrPBnSJHK5e2wmTdnCpSy7nzmBgyFaUKSyLnBfe" + }, + "client_ip": "64.176.181.86", + "user_payer": "Gidha5Gmxuyvidgoixjcefoq9s7UV8fwjxM15ZdeCxH1", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6uoGETM9hZNDWic7oU1Y8i5srQ4m6LKRxC44YXjdNVXW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd" + }, + "client_ip": "185.26.10.241", + "user_payer": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6vxMVGb7WfxW3V9iJxdoVxip17hZ3XoB6jNozDQNDtfS": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "198.13.137.185", + "user_payer": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "6vymXJCuRNjKERmYf72zn7otShxqXeoxEgN4AxzU1PvY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY" + }, + "client_ip": "185.26.10.181", + "user_payer": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6ws4h7iFhETQRvGMtsdqj5jcYf3Z8g5uzjXrcLMsvNMw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "q1yPXLsYcJhzxhUYLewFDjYmsBh2gDFnYqrZ9VPshrk" + }, + "client_ip": "66.165.251.126", + "user_payer": "GDmqC8jsuvDCbEZHjrKLoUmgj3P66NL8rTEKsNpK94jo", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6xYgyTePAsi8RURt7qdmBcVEPRgJu87KtHeNSgYQk9kD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DeepM3FDWaAb7o53rvyZk5YvHLG3FvDiVXJLRY78z51p" + }, + "client_ip": "66.135.22.69", + "user_payer": "7LgeV5j3xZXrGEsqZ5rQYAPX9oCrt4ZuutohzFrajL6V", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6yGWiaEfikGNvbtXUXb6VbVZvqFc5VxtuCrYTbvLv3eS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "DummYHDp8T9T7EVRczNJynFLEBGD49bvbTDtvj1gF5GZ" + }, + "client_ip": "45.139.134.64", + "user_payer": "HRGp1ti5YvjHy5BBSxq8g35yZwotwMi1zLQRv45pKUdx", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6yiCdCHiqETU4hgrrnanEPQjBupzHHLeBhgpdsNTXSrX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU" + }, + "client_ip": "151.123.174.194", + "user_payer": "GWGHaRxKTHhQMkiEocBzdaD82Ds2X9kRcGrUosK8TyDB", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6zYgjTeGibYgYoZRjQSBm7CvVARSa5N8ZKporx9VWM4G": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA" + }, + "client_ip": "103.219.171.151", + "user_payer": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6zZJwMe4tkR26PM4QP4e8wYSy3DzKKdvE7qgRj69Y7XV": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "185.191.117.36", + "user_payer": "3wgfpoQJsqCbuShqP8Kg3tRPN3sVhjWk23EFF8aRFbxf", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "6zp6RLhhK74NwJd1vgFyfNVwmHPHgRfV8UostUux332c": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GQiWnDYrzHMALWG9avt5FCu1wisAQHjGY5ve7GMBiPEe" + }, + "client_ip": "45.32.251.33", + "user_payer": "A48xFiZzS2VyPWRLHjw65K2SdBdz4MMcPqaBdiPLmr77", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "71KD3n25cATBU5LsGA94ztg6Hg6rWKzTuQX1kCaACXVa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "aRPCpF4Jwatg2HRDcSvXmk1iudxEjANaW5ivQABb3en" + }, + "client_ip": "185.234.13.13", + "user_payer": "EyEjYMDTqfvsyoyhvpwDFXnAsEyDmQq3jJcJAEZEntrD", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "72J7drArwBC4FsELCGayn6NRkF3f5EY6inw2S6HtfZAu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GPSSYM5HcpuaZbzMMtyCcovXv3BBLm2A8w7QacqExteL" + }, + "client_ip": "185.191.117.32", + "user_payer": "7g7uRUy23fghiDSRX1d48K8SjbWV3yxe9tjNYyrPHGbr", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "74SCEd9TxiWQFZ9zdzbk9ZwA7v7hDi8MVKQFSbLHrvAm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8aySXUFrqJz5kath6aVijrkBH8ZtxMWJGhYXwYBpKmHK" + }, + "client_ip": "91.189.181.50", + "user_payer": "3sYyQi8Qjzgc8k8Mush2reWyBbh9g7N3u54Us9WT4wzc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "75M83bJijYtSxirn3ecm5Q9ypPTFTKFekzZgt7mDKnDc": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.36.36", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "75gXc58mcvvDWs6zN49EPn9T62j8SLPx4TzZAkEjwW3G": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "KAoSp3EudGqUBXv46tQoDwbZxSm3iXa9wM2aF4ySbJJ" + }, + "client_ip": "95.179.179.161", + "user_payer": "DagrM9XVaGpQGnsJzJ9pTLPvi5dWPDxmircQEkQ9biUF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "75pk2fvWk3yREj7kpcJdhFrUjoE2pFH1Ta7zw5x75HtF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8Nvaxzif1NrdvxNkRetjT8xJvd33EHkKVrfL8EDkgaNy" + }, + "client_ip": "67.213.123.153", + "user_payer": "DQES9jpMSPrf8jRrPL3XuPWWMjaj4vws99miY7C3BwKQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "76DcvWdW9sidYNuoaQ5otTmE2Bw9UXTQPxwECt77aAoy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE" + }, + "client_ip": "70.40.184.75", + "user_payer": "q1AFPJPYcya3KrRNPwmuA2UkyTLea1dCZCtSZ16kJAQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "76HbqEubFAivGuqjviBNw3oaokUcQoqwWUP2PpTiyc57": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Bs19Z9SokV1s46jutN9tqqaCgYf1GsVyyytVfkzwn9qK" + }, + "client_ip": "66.135.11.12", + "user_payer": "FSkkUkQEdKBpjSbaVHci1zyu1HP34YKqd6LZnTbSkL24", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "76LJxPZU1PeF4sGLkTgyXuVR5dWsHMVbNtMpDb78CZWc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo" + }, + "client_ip": "69.67.148.121", + "user_payer": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "76MshuxjyYaB5f2NQZZmbocB1vettWN8DZNo7vgEmeww": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CBDXrujwebjw2icFkSAwut4hr4xeFh5Ckdz6UAL9HzWj" + }, + "client_ip": "67.213.123.223", + "user_payer": "8uB2AtLYxsC3HsVGc7h869MxFg8SRzj1oJ1zrdoULtnb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "76SfKeqDaooWQW9nzrvKxaPgxzx9drou2xz5xuFcSxKx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3B2mGaZoFwzAnWCoZ4EAKdps4FbYbDKQ48jo8u1XWynU" + }, + "client_ip": "77.81.119.154", + "user_payer": "4TgEHPq1GPiUJdAfyjC4KnxhAQE7v71iGRK5APfgLjjP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "76TH8tStiShS6QoCawXkU9xxs8rtejmvvPEZuAYCEp9F": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH" + }, + "client_ip": "189.1.171.179", + "user_payer": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "77WKiw8CJk5FDvb9hTyMW3fiBSG7Mu1K1LVtBjiWpuug": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q" + }, + "client_ip": "91.232.31.246", + "user_payer": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "78Brh9L3DJG2pxHMDF8VDg7DMZdZUi59g1KEAkrr8hF4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "HwN6eoEe9N3kwHi66hpQDBMFPk6ASQGthWKPX5MZmisp" + }, + "client_ip": "64.176.12.167", + "user_payer": "7zXB4qbj96s9Fryk9GDrF8vNN7sce65Z6yaLTsHxjppb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "78qwE78oV6XTn8UWf8f6Ksvc5mqEGRdqTEAmf8C172fD": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "159.223.46.72", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "79jxnCmBNjuwAVbHD7gfcCXmZX9x6tRRBy8hNNmCNjMC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC" + }, + "client_ip": "185.26.10.181", + "user_payer": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7AREsPkfb2KksmCMKc38MgUSTPt7bNrYCfUT73h4YAHo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "mint13XHZSSxtgHuTSM9qPDEJSbWktpmpM4CZxeLB8f" + }, + "client_ip": "91.189.180.78", + "user_payer": "49MU8SPJy3DutoUh5Z6VEhMQyYMEZMEbheixormFmiQM", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7AgLwNtAapKCAfkbBumtXwSpfk5PTV8XyS9AbHCTgCK4": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "46.166.162.3", + "user_payer": "dztsr3hQo38QVxESHjR1KwFvxrEGVsK4qufMEgb8DuP", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "7BEqjCYDn4EzJxF1G4x3WNuVbxRrvfgeZiZgrJA3PoGc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SoLiDJGk4WkdinyLiRWjkFbgLUhjL3idGJK8H1rUWqH" + }, + "client_ip": "38.92.24.108", + "user_payer": "FYVD7baa4Mzoc7nwrLGGdmnJ6p2BgBmsRUTrDirsAWn1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7C4ND4dQi9JDdUEdt1td6WADDK2xc9S4xaR9k8VPP6FA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7PpXQgDb9eCHN1Uudgi77Wm89cRz4T85YgDw83qvaJXd" + }, + "client_ip": "155.138.217.197", + "user_payer": "79jiM1FrLqZpUWt4f1Uo7imRVQ4KiFfKAeb5mhHzJryU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7DRK4MmaNuU27HzWwq4n7LaT5D9gzhkvwAtbjm8rd61m": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.59.168", + "user_payer": "Ge43JZ12Z8t93Z6bWLn75VnMwE5ejJZrr7JBbDcGmBV5", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "7Dz1hytgHKtKbNRtpLQGiwS6Uhb2ohJVucTJsKZFii9f": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW" + }, + "client_ip": "189.1.171.179", + "user_payer": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7ESp7QucBJuAu4Ut5TyuYFCxyTXHCms7YGvGnz7KiKKw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Av8EnYrPBnSJHK5e2wmTdnCpSy7nzmBgyFaUKSyLnBfe" + }, + "client_ip": "149.248.62.208", + "user_payer": "Gidha5Gmxuyvidgoixjcefoq9s7UV8fwjxM15ZdeCxH1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7Fhua3dAWzChyJuxoG9EQ2nra4sQcNsrYYR2gbkmrxdj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8Yq98CFAorqAc3CN7XtMVgKLrBc78wsBvjhAbFr4sNQ5" + }, + "client_ip": "151.240.75.12", + "user_payer": "5g3BW7oeoEiXJtSZWYJLFdE11JX1BX43mLDPrV2fzrpa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7G1hCEdzMSq8UNdYUrN9EEHMC8kvm7pBa8KPqpsYpncX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "DxisWshp4WHyW5G3ZN1PJ8RAdwUBVvGdN6cQp9eecxT2" + }, + "client_ip": "2.57.215.76", + "user_payer": "Dug99hFphzxrrA3GhS8U1Wxajz1QKaqszJU4PJEAwPDU", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7GZDxa5YkPhAFVY4ZgPt9s5XNjYn71YFjbMLJf22gMHP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "4xf3yGiLUtJSCyxA8vfyWAJ48oDRQCyiJttCDE9xZbSQ" + }, + "client_ip": "86.54.152.245", + "user_payer": "E8JKqZAQtYkWrBqx3H5eWWuky14Z8DNGwq61eqQ5wcp8", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7GvKcGeTB3MVY4jaBMg6jCWRMyKiU6BajqoVahtRPaFu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh" + }, + "client_ip": "45.152.160.176", + "user_payer": "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7GwzKbqKAeP44M1pNU7pa3kcbKSpzC6NfsSDHfEq1Jgd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HM1KjNaXa4w8K4gCXbieoMh5gUTNeUhg9fvdXMKeBW3L" + }, + "client_ip": "64.130.61.68", + "user_payer": "C9dPEiQEiEG1P2uGUznvSp5VjbU2vcYZvbzEYmdfgAyq", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7HQJ3ysBnvphoBAs7ugMRjaig98veP7c6ExiX4iBzKwB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk" + }, + "client_ip": "185.26.11.195", + "user_payer": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7LXNzLaw9JV6xkc7z43Aeqw3EeT2HQX5GRNtByPG8Ya4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DHcuVgDdjvsSEgSrL6NoR9CsgxLGB5VwUd1tbNXWfuAA" + }, + "client_ip": "38.58.179.253", + "user_payer": "6jxte5jrKezgZ8XhnmcXEVEN4xQxbXb1hR4mUg3m6BrB", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7LbmbZL2UnwL8UmHaBsH2pVJXppGYHgqzcen277qnmLi": { + "account_type": "AccessPass", + "owner": "FdDcx5MJYRxykTF3YRuatw4Am7DNvZp2EpbhwD4V4ZMQ", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.44.155", + "user_payer": "SN5Zxu7W1dmHXeYMQC7BdZgWod3WQJuBvUqjTnp6L75", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 97, + 194, + 198, + 142, + 221, + 142, + 165, + 82, + 165, + 186, + 148, + 13, + 187, + 35, + 1, + 24, + 31, + 126, + 211, + 71, + 88, + 115, + 87, + 170, + 218, + 9, + 83, + 106, + 232, + 207, + 124, + 147 + ] + ], + "mgroup_sub_allowlist": [ + [ + 97, + 194, + 198, + 142, + 221, + 142, + 165, + 82, + 165, + 186, + 148, + 13, + 187, + 35, + 1, + 24, + 31, + 126, + 211, + 71, + 88, + 115, + 87, + 170, + 218, + 9, + 83, + 106, + 232, + 207, + 124, + 147 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "7MLwmdKG5Hza9ms8GRjnqUGPh6e9KYAJLCq5hL8yZPxY": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "185.191.118.81", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "7MNxY5xnT6a7mmnotL1W5Ki8T7ZfQAZE8PESJxz4Kb4q": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3B2mGaZoFwzAnWCoZ4EAKdps4FbYbDKQ48jo8u1XWynU" + }, + "client_ip": "77.81.119.154", + "user_payer": "Aqty8rhFciJ7fHjCXPnqkEQyu1LH89dZhm4cUjp9t1E6", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7MVfL5QVejPUSsBQJxrpVdNAknYj73pCECvY288LKBQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "9NhyP9ZMKrFMJVFdJfrpVF62Rz4QJfCULmeYJJGqnhit" + }, + "client_ip": "2.57.215.164", + "user_payer": "C9dTbbWEdNeVZjqbnzZKB4DxfuLqWNVnr9mdZfCqBHKQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7NMnvDssjeGcGFucGi8YG2vNuo2UcjSUcCfL4yf6M3Cp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7QAAWacetcyCRUkvHuDNhKm4nvnqJoytjHnuGNB8arna" + }, + "client_ip": "64.130.43.78", + "user_payer": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7NroD2nKGUo7BZYuf3wM6PBRzsRZq9m17zTUuz4Sv7Fs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BCS95L5JHBWHvWkcEJBEF3BH5QHxKcPeaTgoYmHLvfFh" + }, + "client_ip": "148.72.141.82", + "user_payer": "7JV4wZhRnDJx71oGbypSvmi2gh1S39dGzt43EiyC1D2s", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7NyH81UM43HrBdgWz639aycQPWezRxGkRxwpzYWHxgcr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu" + }, + "client_ip": "160.202.131.29", + "user_payer": "9WEBrQsqiRhwmRyLUTKXa5gUfqRKkDBYxbYbonDqCiKf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7P2HbqsZdtXFimuqXpw8uHqDD5UgNYb1JeZWePS5pfQr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SaGAgdkowooXBrHihpmE8gsjf1dUG7n5SqnyJxYFnXJ" + }, + "client_ip": "45.250.254.141", + "user_payer": "SaGAgdkowooXBrHihpmE8gsjf1dUG7n5SqnyJxYFnXJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7P85WUtDeiUjg2VZZQqwz7K6zoptmDWsjxAhU3qD8ppx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GiYSnFRrXrmkJMC54A1j3K4xT6ZMfx1NSThEe5X2WpDe" + }, + "client_ip": "206.223.233.229", + "user_payer": "7VuRpoYWnrAWe2xH4vgqwUcC3sUTL7vFeQp15mdeEJ2z", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "7PfhPeXzW3DYUKQWH8zF5u1qEAZxHvFuZMSsKMGG32eX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5t4shVsKnUqgjmhK3fFNsvyju2E6Rd7cc4S5pmqqEVEW" + }, + "client_ip": "103.88.233.81", + "user_payer": "HwBL75xHHKcXSMNcctq3UqWaEJPDWVQz6NazZJNjWaQc", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7Pp1vaLf2pGvYeGy7sCNsPZ5F6nrkMPp2B6BM3hhesxX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU" + }, + "client_ip": "185.189.45.170", + "user_payer": "2tDxjfJP1oP8MopsLqGBkS9JzNaH71vtHCdrPBBwoDcR", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7Pr2FVarv4ZeqjUo9HQqJYFVdpZxrFSbTWRUADpg1r5M": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV" + }, + "client_ip": "206.223.224.57", + "user_payer": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7PtMeqSSRVBUFFWXeWQwkeqtGhH7FnDGQmp9cDXB1kPW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7CR6whiYULVf1Knj4J5PxUS37opdk8UAx2WnDzBQKiVe" + }, + "client_ip": "149.28.150.249", + "user_payer": "CkbXApnB7BdZNsmcPi7r3xWgFLQePfx2WKqg9W5LjgDF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7Q884Qozb2UZwgCwPYxu4N57PkaBGr5u8zkRqvTVGJae": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "208.91.109.54", + "user_payer": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7QHhxADbwsd3yPudKWyTojCPEre2teH3QCVychLiLaFP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "STPTshazcjH6cZMHzQBrggFSPHXYCTRGB7ctqS1AjkH" + }, + "client_ip": "139.84.237.69", + "user_payer": "STPTshazcjH6cZMHzQBrggFSPHXYCTRGB7ctqS1AjkH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7QSf8cJkciSSLUUHy1a8vvs24NYgg6RbanyjgSXRMns3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hykfH9jUQqe2yqv3VqVAK5AmMYqrmMWmdwDcbfsm6My" + }, + "client_ip": "45.77.74.20", + "user_payer": "9nxWixzZih86YrKapEiG3AZigQBpoUX9Avn5pS1GWMqX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7QqdJr8vmepXYU2WtQzE1GYNNKUgCcdRdkJGvDLhmzBj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5marvipGzf98hxnoJFXsZbGHSXcEQ3yRGJ4ps7D3V4ou" + }, + "client_ip": "65.20.104.37", + "user_payer": "6wUHddXwjPfCCLuXChAq7FhhfjzQhWDu9XVh5saYAeKU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7QrFL4Tgd2YTRRBZbeAfs594UCV6iMbNVSnip7kDYWge": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5" + }, + "client_ip": "64.130.34.21", + "user_payer": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7RY38H9stQyBBtTfSJfQrF8aT9c6B93vhXbmpNL255Lh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "JupmVLmA8RoyTUbTMMuTtoPWHEiNQobxgTeGTrPNkzT" + }, + "client_ip": "64.130.57.50", + "user_payer": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7TCusxJLbSCA9e1pRbwA6yVSnM94paDqiVUYdrmJTKZM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CB5NTPpGECA2z8C33VJmM4xLQv999EdMW9Xqv91MDp5x" + }, + "client_ip": "15.204.241.62", + "user_payer": "SyndicAgdEphcy5xhAKZAomTYhcF8xhC7za2UD9xeug", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7TNEPwd6gsDYbmCHZNTRiS2pi27E75MvrEzveSjHt2TS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "SwapaydUWaLw1EBBFYbpSHicnT9ktBpNC8H4jf2dBrt" + }, + "client_ip": "23.252.121.170", + "user_payer": "BiU1DNow77wGwSXW1bLmkcQe2cuySpkbz7xtbitD9Fmk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7Uubxh3c6KDb7xxAqCaSYx17UuHT3tDFNF8xRHVCXhhX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4" + }, + "client_ip": "185.191.117.171", + "user_payer": "7w5ufgKMu6rUDfVdekEoVLUnDtJfG1UC545xTksVm2rS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7Uv4Q2dhq3uHFAvDRhvfpAyoG7owofTudUb1EPHAnnw5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dmygEwMFAC3v3npKsFnWRLanNQqx1RrBxZFnKgrwJNi" + }, + "client_ip": "64.130.50.133", + "user_payer": "DZ8r6dJzbr4NB69rEKCVv1HJQznbp3c3ng1RaZnjx8Qu", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7VH3ubMpat1hdADe7x8D8WrfwE7cYrz8geVzBMhkAobL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6dpdFgXyTGFTQkefKNTx6qgqwGEQa9GE1msghJTZoxQJ" + }, + "client_ip": "66.96.84.6", + "user_payer": "4fGYEyHPr21xBVAZn53LNWdite5aQqZmtmd7f3sFHhgj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7VQjAyhgxQu6mbjYzT3ui9YAWTr9FDFpbTvqh8FSWP99": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "LfgXmVo9ytLQR8SyenBMH9JfDvgy7zAV2ve37rLD1Xs" + }, + "client_ip": "146.19.172.17", + "user_payer": "3AbdsruircYD3yvE8rPLpnVpi2F7GyB7twS1UNBXdCq4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7VqnMSzMAC3tPh7k4V7NuhBbFHhpy3CaCrhq5HnAtJ65": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CZanBzZHFzrGY5qKzaX3CNhJ5smHEMTWFFnoeUi4J6dr" + }, + "client_ip": "139.84.154.104", + "user_payer": "Fkhd6WwaLAYGMTpGs1kX7ECQmuQ7Uj3ScurCDtzLBYRA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7WZBfN2rtQ5Wve6gACcRgDZW923D9T2d85CQmpj9sMun": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BhPBj3SYM6JBaj8YaNXXuZT2fWqRpzQNe8V2Jko74B4B" + }, + "client_ip": "72.46.85.155", + "user_payer": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7WmnodS745vLxJrvPxrFhys6MMcgCvoZmBRyZKCtReFr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2fWgM6inyo91kFDzeBTrtFwkABXXMbe4moWi1KA7fabR" + }, + "client_ip": "79.127.239.96", + "user_payer": "HBm2GteK8fQ1fuGG4JAp7A91GSoS8VEnEGskertPgSj4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7X9nvBfmKPupkcfVNYfy9irRqfQy2ZiMvVVnJoSpQL12": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "FoXyHJXdQGK2eHoTjSAzHq4hzxWdJvpGgyzrtPS9eAk" + }, + "client_ip": "139.84.227.71", + "user_payer": "BtQLtvQG6aeYLGT8cyj3RLfvvS3NLgTqym3eKSFqdDMT", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7XpTw118ych1o7WgSkmJ1wq7TQ1FmWJCWGPJJA322J4H": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.138.249", + "user_payer": "7hgdavoCEqBjUngYdZRQdJxbGPM1Hcve4V6Ddd2QVwB5", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7XsFKsg2BA5cgsSnStwHjConkmSrLWHwFwdjn1W94Pnh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "G7dh7XAmqyP4En53PEue5taAsHcQWEPehsQgKqLS8CLZ" + }, + "client_ip": "183.81.168.165", + "user_payer": "BsS2BWy1qeFLFsbahdzH3A5Sfo7DmMQqiYMbYdi4s5yt", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7Y7ZuegLSe5JDT67WJoVtC17zS1kRrVYoG9MwGWpmynx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "anzaeL7Lsv71HW2mew8YcKGyGqL6qNn3xoNPRrejM73" + }, + "client_ip": "104.204.141.59", + "user_payer": "anzaeL7Lsv71HW2mew8YcKGyGqL6qNn3xoNPRrejM73", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7YHSnWivnsetMZoeRe6FweNKYnXtzYRBmCdw2AFCzTig": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8wScMKZYTNR4T3Xk5tz3BNaBYjECckEQ69iNY64E2XSk" + }, + "client_ip": "67.213.121.137", + "user_payer": "98Up7QKU6mDDZbFCyJA2LHXFfwZqeQEt9TiaQ4AGbbDg", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7YZYqZHx3HAqQU6GGCA3PMNtJRonb1RoiXPPfBaN99zn": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "64.130.57.43", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "7ZP1bPgjArA2r5rLhdgDZJz9BuJHNV3Zccg7BJQRyuqq": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "154.29.73.178", + "user_payer": "5djYvy6U2Xj5RegQbgdJMVtp9ymxGhRGbL9AVXTj1st8", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7ZUiVYy1h1DZUcF3KvUdUyjidLmNhC1975o3bbUHrNBU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "revtecFsGSRCdF29atQvchSXrjwBesA9vSisD4fyH5K" + }, + "client_ip": "193.243.164.198", + "user_payer": "A5Ms7H8QyuqUwPDUMY9sFuYQDAS8rQvYJ75gm6fr92gi", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7ai6AggVY9qRZtPs4yLLiv6GUkkCtcAnJawAvMLTCQuP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "cQSE2eYBYrRigKppk1RNTkcN7VFsgxXKBjpA88pgqvA" + }, + "client_ip": "151.123.172.114", + "user_payer": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7caAix6uAtogRbb3bjcnAnQ5QjaK8x8ykVQ3KthCmntm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CtvdyHYt8cMuGVHFarV2RADfoCdnrbd8e9jAsB225uMW" + }, + "client_ip": "103.88.233.93", + "user_payer": "CjjwfyfjkoXew2KYkGHJkAuurA5cGaHi8V5LtrPdZ5Ti", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7dJLqKcQRsYgFpkLinhAFgDxqAgsESLfBLp2yXuqj9EZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj" + }, + "client_ip": "67.213.113.103", + "user_payer": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7dU66mC1JAmnz7CqnFKSQSm4SEYbHHAZvWG6e4Z3ACUH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EbvGVnGdhLFRtGE8oXogcTURZsg6FeyiheC6U5vwWnyu" + }, + "client_ip": "45.152.160.145", + "user_payer": "HC6Lay8Ax3agYUCexZ8PmT9iUTwzwACo69QLppHDAUcF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7dgj9B6vmei6X9MX4zGwk9SVKUNzeZjQmBaVZEDebUuY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Ae4CswYDeaJsgFMtWA4k4R94FPyrYUWpQZTqTbHYUyjJ" + }, + "client_ip": "31.128.58.141", + "user_payer": "C2AisTvMmkECQhary9FgcxVAVmc2h1V96MKpHVWePteL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7eLiNNVzHPxhRUtPvmjhVeSv8SkW12ZYcrvQZfL7hBBZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "JwoMTm8eZxBXnXekfLsRprg3Dtp8r2WGheg1aDP1vkQ" + }, + "client_ip": "37.202.198.10", + "user_payer": "GcrtDuddnXMGD7Tq1e7zaGp3EdXDFHxK7Q59tF6Ks7Qk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7eTtDd7UhtfdWuuLLAh75pRSmJrsVLjC2uQef1LZMaaG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj" + }, + "client_ip": "185.26.10.181", + "user_payer": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7edyo5JWgXoU3aGvJBv3qyRB4msD9B5WG3oZi4hG9L9w": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.47.90", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "7erNhKcdqw6urnhNaoJnCrtqDbGmXXyrkggB1ksgNwCu": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "177.54.155.1", + "user_payer": "9bahs5MsPph2TqLW2Q5hmbPgJTsqSuQgqBCEAHWfjwQ9", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7fZpDEW7WFWc2H3abDYRvf8X1KydJdQhWTga5RCTZ9Yg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "Ed9WjPnZfAXsPttcqxMwj94qsuXVRyBsyXnDkxFva2Zv" + }, + "client_ip": "185.191.117.155", + "user_payer": "6uw2MvDo5j1bqWimPBFUx3AFjUMSHdm9jZXw3uYyNEAU", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7ffSx6wVn4dQjdVA2yXT9Ah8LzpqtBFjV1QeaGrynAT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "CZanBzZHFzrGY5qKzaX3CNhJ5smHEMTWFFnoeUi4J6dr" + }, + "client_ip": "103.28.89.185", + "user_payer": "Fkhd6WwaLAYGMTpGs1kX7ECQmuQ7Uj3ScurCDtzLBYRA", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7fgQKaETTEDfi5hNg7A9QBhNB197ry8wfScAkyWdmvny": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "RNXnAJV1DeBt6Lytjz4wYzvS3d6bhsfidS5Np4ovwZz" + }, + "client_ip": "138.226.224.67", + "user_payer": "GpnuWtxeXFL1YEyWMdDHbf9Fkz9zhFxeGjryVWsPSCAQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7gV4ZojgYXwwaq18dvbBw3ytgf1TnMNbBaf4uHQZZ9jA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "LiFiDJwJjW98MB8wxcnXpafKYsuz1hwpUkuszkERiX6" + }, + "client_ip": "185.209.178.97", + "user_payer": "477C1TJncPZZn3phJdxXLjNJFkJAZMc8rhqvsws4KU2E", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7giUtHpeXmJjNVSeVcQaA8ZUGGvpu3tnziDqt8P5q5NJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7Nn8qBJey7vXtVFMNBbbuN8UkujU8Y6nWzbHVGuf49yV" + }, + "client_ip": "64.176.51.216", + "user_payer": "6ZnfjNZfsNoyxAiCNtHP6huarie5uJVaj2b1ZgyS25UC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7gs2KoAfwwgaForN8MnhkJZ2MbsN9tnxbtHP114YQUJY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC" + }, + "client_ip": "177.54.147.76", + "user_payer": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7h51EfDB3ho82FyBkPynQd7V9NeGvT9MpNmyiRdwRAgn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AT8aMVcj9gonmRxj1iaU9T2yJJX9m9mrR3G4EXFDh2nq" + }, + "client_ip": "64.130.40.10", + "user_payer": "dz4WsVpG97nvK7PG8CLbDE3ri5D86Ar3fzpeHqBhDBM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7hB6rDfvE2H2AFNsPYmtfZc1PwRQEJ6ZQofBjX3wV43s": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "6dtVKjb6vRwNAekki2FXhKv8WTNzQ3xW6HWMCNWqtoDy" + }, + "client_ip": "38.244.189.66", + "user_payer": "nob1eSPtUzPeQmze3L8Kpz2uzxqSwxWkpsGESDDgbVW", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7hBYgKzoB3t3pQvDxnJLqqhC42T41CRQpnJaSuZFVsuU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ALp2GdA1eJV8vZHMHazCtTxNXe3BLUSco9LDASgjDs8R" + }, + "client_ip": "89.42.231.229", + "user_payer": "E1D2CrTDZyb3dw9Zt35oWKwAT59d4BnhuztxdoM9fptS", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7hbAMdfrAHa5DtMpbafHXDt73Cz9EBXGdCFqA5ttJbyC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "etherUisfbmZze6spQmtv3MD2VUCEfqJV1xjVcN6nbc" + }, + "client_ip": "216.18.201.106", + "user_payer": "7j2LygCdSJZUgjmtVhsme9rEKmEzx5NqfAkvEXoXzsgL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7iLpXuJU29qqnB7DzALBbX5vp2Lx9sxy7PWvzcyiRSrR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh" + }, + "client_ip": "70.40.185.139", + "user_payer": "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7iVpPEs5T4XXq3ieEWVmwKcrDmSUR9b6hxHxdugG1yfi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Cu9Ls6dsTL6cxFHZdStHwVSh1uy2ynXz8qPJMS5FRq86" + }, + "client_ip": "46.229.232.134", + "user_payer": "BC23QRZ9UQmqXjZfubTq6rMaF7szTX3djiqcUXsszsph", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7jfHYLnMJtxbjXwvmKjFusgRCZnp5FUhYNiWDRTZLKzd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk" + }, + "client_ip": "67.213.127.125", + "user_payer": "EwJA23TUEbcC5DrdEJ8uLXZs5YVsZPTHkkPjpFvTLovC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "7k2D322Nwwg8pCXmjav5hczPZZrTdr48xzoN935Cv2re": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CLsFr1KZVbAyz16iFpwg2e4hiekR1unpwyxfNdjBMaoE" + }, + "client_ip": "185.189.45.176", + "user_payer": "9XrYXeJzEyMZNzbj3ZVadBXVXZnXVd7pWAbYURuZxV34", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7k4pnPo1h1Vgfe76oNEUbYn2bkJToyiaoQLfTF4eD8CP": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.61.157", + "user_payer": "dztgYqNpUPXB64jt5HmiJCbWCGsPQf2D4WssicoZusQ", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Expired", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7kbJsveeDphKS4zVDDaeYxbQ7yKzQMVA7NaqRYojJKbd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HbQwCgDvVZF5pMdGZMdX2poPU43RyF1TxQLz6LFMqYRF" + }, + "client_ip": "62.197.45.149", + "user_payer": "HbQwCgDvVZF5pMdGZMdX2poPU43RyF1TxQLz6LFMqYRF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7mDfMgbv8aRVaZqD7n2Cww3VZAJMkm2cFLwWhX7YjRT2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "4SsMncJdtKiUcDtukkX15mqei7WiuQ9yvRtQrQW4reWC" + }, + "client_ip": "64.31.28.130", + "user_payer": "SLGwtzChvUByrNZZi9xCBzo14tbmw2YhtU6skbXn7sQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7mPzssCfcQFvd6C1hrucYB59GZ59mFaYRoPxHYiv1LYt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA" + }, + "client_ip": "185.26.10.181", + "user_payer": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7mrLeQXX6dqQHLioLB2yy8rqsB9w33LE2ED5YfsqzJcj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EaY74EbVZ6vAwPaPXnuxBb79dsFSTafzHbEm6kqBZRJA" + }, + "client_ip": "72.46.87.209", + "user_payer": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7mvXPVSmJMSYa8Ngregmi7gm7pzdB89dFA5jf3EeJ1XT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6c6RrC9TWNgiVXnbZ6hehNuhyh81pZK1yAj5w2nXZTwi" + }, + "client_ip": "151.123.172.78", + "user_payer": "ARx33747AK12mbKQ8rnpFkC9xKnizNVNjL8x57Ki4jYc", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7ndppP5Q6Eu7aJFQrwT3zgcjd4cCrST7TY1xvYuuLM61": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "207.90.227.251", + "user_payer": "FkhiptLee5P7MutXadcYV2fPRS3Fr3oyoKNwh1wxtexy", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7ntP3NrPmtNX32c6NaJvxchuB1GUsvgbWKyAmwkwkWfC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "rXAgC11Dt8YmNtvjoAvqZKrDkZa746kvXxqZUTcsH1n" + }, + "client_ip": "136.244.89.45", + "user_payer": "DagrM9XVaGpQGnsJzJ9pTLPvi5dWPDxmircQEkQ9biUF", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7nwSENHwwzwHQ71JUEe7XHuXjVYaA6Wi1HwpF1Btwj5j": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "38.58.179.138", + "user_payer": "42pRNpUqS1QyV2JTGUE2jWJ8hgTd2XRAu6Z3nzxSBhMS", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7o9c5Zf1SxQEKL6nEauQq8yq2HM89u5CGUAaPXh1jC8z": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5" + }, + "client_ip": "67.213.122.211", + "user_payer": "3cG2jECJGUoPzdsdpZUUw834tCseWkibvRxvNQzJKerK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7ogrPtBgVgWFoASiF9GT1e4Y9htWSRTPYVVhCH3DnZv7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AwcMVMvmT1aCETVYV42WE1cSMCyNp4vZqVjLsvs6dM4o" + }, + "client_ip": "15.235.67.254", + "user_payer": "5qS2FZCkFzLkk6jSA8wGV8RxbcoKFxnfAUPtDJS7R2mo", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7ozzA3GRkUr754RTuHZQ6LQHQdMdTCFT7Hngk9TaPkGz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "9T6SNsBimjCRJpkEjiVsc8AcxTBa1XVA7RjnBGGfWP23" + }, + "client_ip": "103.28.89.186", + "user_payer": "6cfcopD5wh6ZMftYDck1KV64gvmHpFjF6w3rsFVTCkEf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7pSG7ybpmMJkA1C625S87PpyfNUR5jSwRaR8VzH6RU6z": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "E5UXkzUxqEXpeDf3WsrMZHTs2ZSSBpAz7G4hpGwgRGDT" + }, + "client_ip": "104.204.142.221", + "user_payer": "6w8NdGszC9fqZU7eZHhNJEYACDKaFbC8aCbDcDRc1tBa", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7pWjdruTYtr2TH6Q1PhP2cBqxCYECapsuTxPUGTHaLai": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.76.78.124", + "user_payer": "DZEjUbMyUfH7niusGZkWEZMngiNe2mdzHkze39zq1JLi", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7qTyVUtVBNGLBhQnByp3ErB7fn1qxDqF8nS2pF1Z72uS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "gojir4WnhS7VS1JdbnanJMzaMfr4UD7KeX1ixWAHEmw" + }, + "client_ip": "177.54.154.233", + "user_payer": "C9dTbbWEdNeVZjqbnzZKB4DxfuLqWNVnr9mdZfCqBHKQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7qnWyjLbsGc2y174uCQ3GMKFQchRAPBzUGqA6TWmXmaC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe" + }, + "client_ip": "185.26.11.195", + "user_payer": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7qvz3CNYVeB6aetA3Smv5HgnpLuKUKMwmUb5FTQCykBH": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "185.191.117.11", + "user_payer": "EP89QTpAMrydD1VN4X9eQWG1FaRfPbLbdxVfSwfs44Xz", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7rdSpYEbNeRXjA7GizLqr9TgrSaqBU5Npkd3cPXZuJE8": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "206.189.166.187", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "7tDpTBjK4CyV9cZsreMwxwv7bSzcFdUGqvUjwDKwhtWz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm" + }, + "client_ip": "45.77.136.52", + "user_payer": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7tr7oN9GtteY3yCrWvvHziSr9g4DMDbzuZq97vBMWyaz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu" + }, + "client_ip": "185.26.10.181", + "user_payer": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7vCYBQDjxc5s3dddy9VURJfGzuFhDkx3qxB9dbxHbLmp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8mpMpmjDveCFcbgB5vW1jtuLzcsgU9a66zVTySjWe6ug" + }, + "client_ip": "89.42.231.122", + "user_payer": "dbzB9po4W4nRHtpHKFScUonqRJFVWgLaTGCuG3WZCpt", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7wSzZHXgsNddsNMcjeLebU9JcRH7FMtjrfRb4zisoQxS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "G3KFVu5J8to65ZvLitmZ5cYZ8kvfnivmUKqHHs9CSpcJ" + }, + "client_ip": "81.29.134.74", + "user_payer": "DZETFp32xdxwtzY31TCrMaSvVmqG9Hp6DqQ8z36Qoj9U", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7wcknw8pCN3VNRHnugqyiAY7QX72J8s6fwVYPeBJiqE2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "AmjX7CerZbHrU814UeBp2gJC7gANNG3KrP4c3RyD7TSD" + }, + "client_ip": "72.46.87.43", + "user_payer": "5DEH4VUw2HxP8MEpTpXhyHYM2zga7hAgjH8GxxeWf1KL", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7x5VNg3dUmzwH2GXMbasQk45fhdqp4VF8c4rtDqd568d": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "209.250.249.58", + "user_payer": "DZGhCY32mnq8mSuhmFRCLBF4zU96iZPAhrzniFRVjk1z", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7xdbMTcFGpRZHSh7ZGPny18qyYAm36Eo5tuWzbQSFFD4": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.46.84", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "7z9DBSSBes6W8bJSqKsM1Zmc8zPtYwyZthVFrhuhVUrU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "8augxYLUge2iWmitQMwbcBL5VQEpsM6aJdRofhwpnzyw" + }, + "client_ip": "103.167.235.222", + "user_payer": "FamdxUGG1RJ2MaLi18VSWgKtc8s6V4o9sDmjmk4imy6P", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7zJue3nid8Qo14xL1ei2872b17TwnWnchHtQVD2XsByb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9nNvcyNnEwVaFndubeEz9Ea8QXPnEvjF6yxw2CeHBwFv" + }, + "client_ip": "74.63.225.151", + "user_payer": "EdN9iNEm2bVyLaZ2fp83BAMGSbJ8RBaXKchXsLmmPtGL", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7zMSCA2PtbJZ9pNoN59Yhsjc19RejXGsXCnsPbjZ9UJB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HE2M3NMPrtD1U9sfQ1K4QQJtEwcyonNLNRZGmpRW8nXm" + }, + "client_ip": "151.123.174.50", + "user_payer": "ARx33747AK12mbKQ8rnpFkC9xKnizNVNjL8x57Ki4jYc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7zb1HtvndziTtwC2PdN83q8Vxg6AYrSqYK4Jixribzif": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BkwGGSKc1PZVPGv7eWPHYxFkvSF4pwQNgR6WdvqJ2U8o" + }, + "client_ip": "185.189.44.139", + "user_payer": "D2gnQuqG8tNVLNL52WeC9VLwfnE6zv4NF49yintVPsZc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "7zrzNmeMfnfutfxJ6LiK1xyv1fC7NdmLRibG1kYnzKao": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 249, + "accesspass_type": "Prepaid", + "client_ip": "104.192.80.223", + "user_payer": "7BrKiSWWr8GTFFATY1kZH7tPfavPrscseT6Dr8y66mnL", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "81y9KNUj7cGS1qkDrhyWXGJMN3mjL2VxkmU1C5bb8wjr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "pitch9cMruwjDtAnisNS4mwZUPhMsBztNEGu2weMg55" + }, + "client_ip": "109.94.97.191", + "user_payer": "E8XDVg2poFCXPHjQKZajj6yxGQKG7ECuEyG4ALNCJn59", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "822uCaPYXHaJ2ignQ15xfZLPAYRmfF9CAK7AkhxoZwGL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL" + }, + "client_ip": "139.84.228.251", + "user_payer": "6ERi1d3xL1PofYUKC5d8tLZvPz3qnaw88euQqkvFy2xk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "82QEzW8kbsf1jYpFjh3dpFA5PEv2BDJb3PNiy15vaQkS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4" + }, + "client_ip": "38.50.164.17", + "user_payer": "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "83fRPxo66GBGETrZKi9D7FpVmN2noT6ecUgDGb5qKTij": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "198.13.131.97", + "user_payer": "dzt1pRvPJdPwNfLDWaj4UUHw1UW3B1c1JdUq35Jvamq", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "84MxQQpf7isFunkXqadMsaW53CUnhh5td7cmHpzCe2dJ": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.52.233", + "user_payer": "4F538VD5etoFVv61srs9Fyqv6j6PG9pB2rkh6VFnaoSo", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "84RNgsDxo1E2ZfqDnrZwwuWk861MZBQe7TbQUdfhftDB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj" + }, + "client_ip": "160.202.131.45", + "user_payer": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "84XKokcGhF9a5NBBCrCQqYnRCc7t5HrTAjdF6S61XwpF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FzQqaDStQQHs52YKeCnDovwSqvyZBCgs2kJcmvoFZwaS" + }, + "client_ip": "69.162.93.121", + "user_payer": "Da6xRJqXLazx2g66nnMK5afW25zDughnejvu7cr1a461", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "84cDkzwrFHuRpH1WC8ugGrrLufRRH5yf4N9DuRcDJjmg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw" + }, + "client_ip": "160.202.131.45", + "user_payer": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "84dfSJk8VMc1p2gkAK1gKXgLMKaYJAfVJ6yRn1hmN54Z": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "63.254.162.25", + "user_payer": "dztHar6nnqhhF3ZuAP5UsQdTLKTZqff5QoasM5jE16U", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "855ystxD6wR2WTbPYoYqu9GLkcwfDFrTBbyzkA8nxE8q": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9" + }, + "client_ip": "45.76.11.7", + "user_payer": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "85JWCq28sTWU4eA6t8bY3XfsfKbG6qbiEUFpE7xDSQx3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "MFLKSo4XDfrBf4FByx76zYM2dXSWcigag7ec2bCHTR4" + }, + "client_ip": "64.176.10.117", + "user_payer": "2d84AZfSYLfH4ZzwXHxRx1JYwdPLD2axWqNzWCQqBAn9", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "86WJijGGVaLBw1D16ui1yhaxhZ2ZDTiD2JKZZcyur2Xn": { + "account_type": "AccessPass", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "104.74.232.130", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Expired", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "86Y4933SzxBe5fftxxGMjq3YumkPHERU9xnWBL1CX3tX": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "146.0.231.81", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "872njfzSTAciJSEj7ez3YRUVtknU7HMi1VgnLmiHjpvC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA" + }, + "client_ip": "69.67.148.127", + "user_payer": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "88NZkxqc1kCzba5NJctMfjWdgdpKThNt2KvmmUzHKrhr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "gotasRuLTuJNZDtLHmaDJpEUjCWZqkHcuwbLhkgCwCX" + }, + "client_ip": "103.14.27.33", + "user_payer": "gotasRuLTuJNZDtLHmaDJpEUjCWZqkHcuwbLhkgCwCX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "89MZGPNbznaMKPfid3B7tkBNDdkwhnycSveEHPRNwvWf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BUv44cVtsdvU9z2BfFGk6s5JZZWrmVnq5qCaii5ARyyB" + }, + "client_ip": "64.130.43.211", + "user_payer": "xkN8xAw8kQAvUjcpqnxBM5hYdrXRUJtHotK8WuK649M", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "89kN3oJ3Tkee2HJ4cCrytC24CjAKKVFQeUBc6rYsnxi8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5zm9g3zgAPWzX3wmUB2JtTkcwCqe74NWsTmt5wLFwCKK" + }, + "client_ip": "185.191.117.121", + "user_payer": "BaBbdz183945js72ZMkfRNoaTCrv9EdGVvUbRnD6vdW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "89zqGvqphnFacTLvTkP6QgtSfhijEWF8SQiv2vmKfrab": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q" + }, + "client_ip": "45.77.168.243", + "user_payer": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8BBbBtAQvjkZjJagTtVaf4A4z1WMpXsqpSzkfhBETqwR": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.41.56", + "user_payer": "DMZRKro1R3iEou5tMDpJGRjo4jMCizYUHdum2Sc6xjv", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8BRUaX9qzHFV3e7fHFsneYktjfsj8CmieRWHc5hJAhFZ": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.35.124", + "user_payer": "LUZjpo73X5VSztNryi3GvcaykRhRUbgbeuRg1hsVW6Y", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8BUZLsc3iFTFvqe6SNNVwTttG4xfYSkD9BH2cHfBprSs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo" + }, + "client_ip": "185.26.10.181", + "user_payer": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8BedAUH5GdxFUJ6y7dXD6nE4G9Ldz5wHwtA5omBpVaCz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2D1Mm3Y2LZMXMym9VNrbixmstkzrS8V1RWmagNsmdqmu" + }, + "client_ip": "185.19.218.3", + "user_payer": "GHUFsW8uJoHeD6BPvFZYYPD8WbTawRyxYeCpqjcaU5wi", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8DBnDa5KrQg5JeY2QCyUzoveY1o36Q4s3sp5V57Nmszg": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "109.94.99.129", + "user_payer": "UCyNTxWfBkwBqtga6BXbGiDUW3xyUotRujykoXrtVMA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8DQ34sFrHabG3QV9cDjkSUzhjXmPJRzhYr7CgGr96ZSy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ECNnK4VjcKTsABiw8FAp3JCE6tCmYyrEJthYVyMazmxi" + }, + "client_ip": "103.28.89.133", + "user_payer": "CuPQmPd893ACyPre5BpBpNNv5JK7ntuNbFVMECdrL2vu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8ENVV3FBcK3fwNpbki1GBxhHKfsrhRWviQTd6Bu1YL5A": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4SsMncJdtKiUcDtukkX15mqei7WiuQ9yvRtQrQW4reWC" + }, + "client_ip": "64.31.28.130", + "user_payer": "EaibwFTprLH4SD6h6NVLQQvYjEqBmBcvWDvQavzh5DR8", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8EPGPBZAVq6u5Swrgo7ycfVKfYaKauUsso1yxMnkzarW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo" + }, + "client_ip": "177.54.154.241", + "user_payer": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8F97VLGGoQVnp8t1Ei5AjhrLbBVTfRspJHrkXEmu5LXm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH" + }, + "client_ip": "185.26.11.159", + "user_payer": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8Hx9qSkwhhCMasFvXcD7hnbKPtWdJLLHEJDSdYoyoi3t": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "SWiz7QwnYPm61pWWUUkMhj4r5pZLP1SvYibdHcB2cov" + }, + "client_ip": "62.113.194.220", + "user_payer": "ENBBdAkfEj5FgWwuyxaWAprHaSAUuTainYRCZbMET8se", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8Hy3j28ci3o2FGG4iH59UuT45Dw9DGwCLBupBqsWuDx3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV" + }, + "client_ip": "185.26.10.241", + "user_payer": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8KB4pmZhu5e2WknfwDXQr1Ct1pmULUjbW5pJCYtALLBq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "G1rimRnvVV2n19om6Un2wukQbgh6ifSG7ABQru7jUHX1" + }, + "client_ip": "185.101.32.94", + "user_payer": "3sYyQi8Qjzgc8k8Mush2reWyBbh9g7N3u54Us9WT4wzc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8KDZJS7dpBJ1sAWLZucdDiuoSDVuYBVCYT9ReQM9MoNJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN" + }, + "client_ip": "189.1.171.179", + "user_payer": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8KPPaJ8tv5DyLdD8jvPRTioxwrZCHzG3dwjikqN2D4RT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9" + }, + "client_ip": "189.1.171.179", + "user_payer": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8KqfKZ8v5YFTXdS8FpseRZq4oJAcggLgHSaiwyFEjR5v": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DSRVdh9PQaqAcFtMCbJhyD4yMD5H2EeHNzdbqWctRY4E" + }, + "client_ip": "141.94.154.184", + "user_payer": "3Dw3EDSRWqS68jAdBa4siB57qzKQnFA6G8QvdDvZ9jwr", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8L1N7Z3QTXdLcuStPfC5kdHz23Js7VwFCHKGeJDVz7nf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk" + }, + "client_ip": "67.213.121.169", + "user_payer": "EwJA23TUEbcC5DrdEJ8uLXZs5YVsZPTHkkPjpFvTLovC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8LJqYWaQKj7y1sT2nBGN4GZDfNFYnU3XjJPUgRyiZF7c": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE" + }, + "client_ip": "185.191.118.2", + "user_payer": "H1QBG3ySwr31cWaZmpJkpLzNrZhM2e7hQMJdcrysuqgC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8LP6G3bApynFvP1fpfoX8njn8Gne9wD9qeGxndZxKHLu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2N7v8pDKDYhtBUJBQUgxvysUjgM9s4ULPCmeEiPWTf6Z" + }, + "client_ip": "185.189.45.205", + "user_payer": "6DJV7cCS63GZEVzbjyXrfyHdG8TxzSxkRaxd2bxVxQ7J", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8Lmkmuq5ukUqQe3BgEE9WyfRZqp6thzxmF3yfHdk55S6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "C5QUnBdfje5h71BoydgKEwFjkjRqpJqHr3jaMs9EsQeD" + }, + "client_ip": "5.199.172.132", + "user_payer": "9Ud88H56aFDhbYwTcEyQ9nu8EhyjdPQr6K1gsgfGmJVN", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8MMpQFj1aDEvehM7jEywWBP4kPJpNEPXq1ETFwTQg6dP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "HTd3xRHaaUQta2n8X8nHYocfqKi8RBs6vUK9tUp5Z2HM" + }, + "client_ip": "38.129.137.238", + "user_payer": "4NKEM1s5WCtPcqER4mXfGiStC7PAJLMWnh832tTB4FkG", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8MyFQX56NA8jCZarqGsvXZjjMqPZNEiCZYUHMhL7TY6E": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3BeharBd3j4sKQp7Qze27JLQLd9AEEwGTX9TC7dXYSNw" + }, + "client_ip": "108.61.128.20", + "user_payer": "8qLB45QTdhZnfVpdzGY4dCcMPMpxWt4nov6WB5BP5K77", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8NN3Xr5DP2p3BwzqQYNmbupCKUqC8PcJb8SJYBakbHQH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "35eUL661QMWtjCVecwTdZYxFuoCajk1TTYNM2j6dLW6C" + }, + "client_ip": "136.244.108.105", + "user_payer": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8NWF3UeeLSTLWkyVbSdsfurSK2reHcAmvdygzJNdc77": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S" + }, + "client_ip": "67.213.122.49", + "user_payer": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8NrXZnQTQFH5by2mP73871JYKMqrrfB4quKEKSEZnx3q": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk" + }, + "client_ip": "46.166.162.141", + "user_payer": "EwJA23TUEbcC5DrdEJ8uLXZs5YVsZPTHkkPjpFvTLovC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8PEDa7q8m6JmVxi4agf8oz8jY4NutUJj7hm1MV3qKRAz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV" + }, + "client_ip": "189.1.171.179", + "user_payer": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8PihTg47wj1UTzMLdYLjijLhxiJwsh5DHirXtoqzJVAs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DeepM3FDWaAb7o53rvyZk5YvHLG3FvDiVXJLRY78z51p" + }, + "client_ip": "45.152.160.125", + "user_payer": "7LgeV5j3xZXrGEsqZ5rQYAPX9oCrt4ZuutohzFrajL6V", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8Q9APC4UJ8HXC8QY59G7nT4zSJMVRhUvCG8EGG9ssXY5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH" + }, + "client_ip": "162.43.190.149", + "user_payer": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8QP8z2uWmioWekGbFrvoteiMX14Mx2Esubytmfx1gbC7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8Q7K2irCbYfEG5ZWyBceiytbL1u977gXqw7UaHZ55Awo" + }, + "client_ip": "45.76.138.170", + "user_payer": "A7bisryMhTuH51MBDG3Ud7egauuqsxQFzEkBRAWJUHRy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8Qgv1VkZRq5zvqCCBnaTsAYVqq3QAUTSwBDMdJaSuqE6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EpJyGLZY3uq6oeD8EiSL6toKG51LeHznq8Pdm1PkZ9QL" + }, + "client_ip": "45.152.160.9", + "user_payer": "h9EuEofXz641zAqu5jYDoKULJoEiYWKV5FJVm2swH2i", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8QkVDWpzjYEj9MWF3F1vtdbc67iUKVZ5azTVZuAQvSaP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BUokhb8pPF9MZuzW3rHLr6jzakgcz3NDq2PZkpiVv3jb" + }, + "client_ip": "64.130.40.157", + "user_payer": "BUokhb8pPF9MZuzW3rHLr6jzakgcz3NDq2PZkpiVv3jb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8QuBXVZDPxyrrEsEdvSY1jFTdDxcBd2gLZ6nzQ8FwRFw": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "195.12.227.232", + "user_payer": "2gPTPVtkQs8ZKHGyZAZnDR6rVwVxmZUdz4zdR5daaG3x", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8QyZ7VEoJd9M76rbNpHJog9LXrWLaNr2QiSFJA1WXmuk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2UBhtRuyr9nvWsUnrbWrvJiYWEU8TVBD4PLYQJKiRa9H" + }, + "client_ip": "45.134.108.188", + "user_payer": "BP5APdHoz9TykrzkoZm3Q8fBxUgc7METBAAx1nw3vvfe", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8RA553fnuxZ1pzbNBSN6mafZRxGF7Lq1z3fqHwwyP864": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8uoLVazHESi2zHydLYvqSHPHFEZP5ECZo7vbn6HTN8vr" + }, + "client_ip": "108.171.202.238", + "user_payer": "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8RBwaUHEEGiJZd4xatJbWBT2LGNxqxPuvLiSYUnMU89r": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "62cCknMX3Pi3rUTiTt5JtmeYxRWQLuE9M6fyrwTeUYoE" + }, + "client_ip": "104.243.45.75", + "user_payer": "A7nii4QwFSUaz8zCbiy1xFaapnJTYxLLVVWj9TvaFYC4", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8RFMHi5hWnSWsS8XNTRAngqtmgKXUKxezHdpmjEN6tJj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Crg1X8FftV44NmwfFvgREjanBQmyyS7NEu6duLU7Cyy6" + }, + "client_ip": "5.187.35.48", + "user_payer": "BJjRL2rKwV2gxNWcWkFVy2q38TRpd7bWBHEws4fvNMBF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8STjxSohEgGZfjg8WLGcUMczUcJd393ZbmtqiUyzbz1H": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ" + }, + "client_ip": "103.50.32.189", + "user_payer": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8Sb3jevhTSeofX7nJ7WqfVpMHywJ7BXP1sMKRiVmS3d": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2UBhtRuyr9nvWsUnrbWrvJiYWEU8TVBD4PLYQJKiRa9H" + }, + "client_ip": "45.134.108.188", + "user_payer": "7pKxBKPds8pCd3bCzKEUx7sH1TWB46TMY4KXvrWXrBKG", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8TMUttdJMEcsGAPqj8TQ5ceKBmLxWQxDsqUN6QeJjJ7r": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HLXxkmjb47spcmbbKi3UCfZ2qmFY29t8MN562AEmh2Qh" + }, + "client_ip": "89.222.171.196", + "user_payer": "HLXKZPQ1XNccxWVJw3ydwtQrGwTAaxxSGKzd6oqJth9Z", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8TR3KQtd9MjHNNaJ3MSQ7hnzgrUE75V7gF8p72es7FSc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm" + }, + "client_ip": "102.211.135.175", + "user_payer": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8Ty952pf9zhqKBkgSU8Hc8S2QXni1RFmhxPZjyjoasp2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5" + }, + "client_ip": "84.32.186.141", + "user_payer": "669TwzrNazwqPHFT2maBH44TRXVaq3TdarEZKU3BneT2", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8VBRyxSYHw7HZSYCP5i4NgznpDVZokci3EGJPh1UP1hw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8RPSEttM1o1jYxRaBDUecx4f6FcZyvk5NnJ3qYPosMQh" + }, + "client_ip": "146.0.229.103", + "user_payer": "DZVh4EDpA7xd8FDM3QTmDZyffxG7X6Dn2TvdoSk9Ferb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8VkPeUGURTTQiaKgN7pDGiHcjHumShmRPN1E7kxFELmm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GREEDkgav1ox1jYyd9Anv6exLqKV2vYnxMw5prGwmNKc" + }, + "client_ip": "64.31.3.138", + "user_payer": "ERD31ASEiN2VPXp8kMhAZSpAVKhRwtnseVgBEGPBMwGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8W8xZ7SsgjbD9DBJPQWA4jfGxVopEofdPvCAhmnp9Pqy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw" + }, + "client_ip": "185.26.10.241", + "user_payer": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8WCZ2UoHnpH3P6R8Jh9tifVApEtf9uHWREybJmLCC9Yz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3BeharBd3j4sKQp7Qze27JLQLd9AEEwGTX9TC7dXYSNw" + }, + "client_ip": "185.189.47.170", + "user_payer": "8qLB45QTdhZnfVpdzGY4dCcMPMpxWt4nov6WB5BP5K77", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8XEKucjiNR7afxgNiTxAV8Ms27Ht6G67BJZ1v5FCj4Bs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "9dH6wfdJVgnDcbCUjT8rkmejAzTnGQaFarmLfvBYXANK" + }, + "client_ip": "45.77.208.196", + "user_payer": "GTAh4uFkY5rYxDuZ54yQuBXoYdEgALHuSg3dFSKpeQuc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8XP2pWDEpwzpUB5qr7EEFBrPiRfeyuJaahPpfeWHedT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "fhsM2sxME8cHrrk3qvtMsRRDv5AoLFja7NjNnHeYZxe" + }, + "client_ip": "104.204.140.94", + "user_payer": "7njDoDdCY4c8C71k8Egg9iTrwzXcMxceDcVN4bg5a42v", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8XXhf7GVWk4XzrCL8cq6c2TPsDkWyHW8SB6YLgQsmfGK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "9q16BB7WGmBxf1nJTdxH5zPnBUhtHqdqXqRFjSjuM4k7" + }, + "client_ip": "84.32.49.3", + "user_payer": "E5SLYWttYhTo393ag7rt1RhbxyTDvwB6dvQA2irDhyro", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8Y9jExr34HbaVSsvYNDmPN3cFqeXExnGYGjhUfbkkbCf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2uxEHizFmmnLekKG2LZJwxNabhpymEYfdVCpgDxjt87m" + }, + "client_ip": "200.69.14.231", + "user_payer": "9PdEoNkcGh43W1xoD7EiAz8YmPgBT1Hqeud3zKiQkyNF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8Z2ZLuJF7zFEY4Njk1cn5fvWGUqQLcKCJbxzLqgUpoF1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8AkVj5aAtJ27tYXeq89cnSf68V43NarFHMx2iSDjZv7c" + }, + "client_ip": "113.43.233.3", + "user_payer": "9NR8T2KaNPKSMaG1hQc7vqrgmkr7VBjqudDDUkTM5bQM", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "8ZrTWRZR6KqE4TUgzM7SbQuySUGChziU3RS9H7RiQypw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6NDen7aDi65apHo8m1Vea4nuS6LyjQeM6pDNqcW4Q5Pg" + }, + "client_ip": "108.171.210.194", + "user_payer": "4Dy5N7pwNSYVYwV3KMFkF4op63S1Bw4foFmZwwFqL65G", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8ZuQVPHWn9CDUtML2ez7PBwAy2KBgB6qBDQBkymAJDis": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "DnQBmTJyLbBMgJYQLJDqJz25AJModNkyexL5LdVRGnG4" + }, + "client_ip": "84.32.186.145", + "user_payer": "A9cYDanszpSncwewPKzWr2seWPSeuHsefqkbYyECo6vz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8b1rm7i7b1UGRWqDZ7aoehyDyNArwQyni8BCQ9rJ894T": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.53.73", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8c7bWmJ9KqyhNrSvnBouiU25xBwchyxJapuHCcxosJJ9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9of8PnAQi5hZc4EBpu4s8icVtHMMmaomxkk9npS5LTtY" + }, + "client_ip": "70.40.185.181", + "user_payer": "THEZtHf3GrUrjQCccu975jMjJ4sWJwTUCNayx2h18HW", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8cToTUqdPYpj4NJSFanWRzGop2bCAYDdnHKCSaAHww1y": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.63.203", + "user_payer": "dzt4y7xvS21wwLWvgPkXLviyJLgvVmqYdZhtgxZLqwe", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8cwf69AWg2nuC5TKauP5eKzSyCwt2SKmJM7A9MkFW6Jo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5z7arq5GmM11pWz5TSxVVDfBugkWtaNRqgbJGGBWNQ6G" + }, + "client_ip": "202.182.125.207", + "user_payer": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8djf3iQHUp3bfdUWGS9qz3uLSPg7btTSkgXXkxG5Ht3N": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ES1M3tMZ4rMTJ3apE75cHfeGWizDTrMMXy2zKtWkd38R" + }, + "client_ip": "64.130.52.112", + "user_payer": "7ow28Ctn1nJqZJKzZ9ZYUveqDvxMfBYXBJFHK3ZQ1QhY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8e4YNjGkpwAUVP1WzovASxebVYxZbBWSyoVUMzGFUWP4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW" + }, + "client_ip": "67.213.122.73", + "user_payer": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8e964uLi5ZLwNY5xT2AhGnYjWpDNVwP9hX89h5yHriRm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo" + }, + "client_ip": "185.26.11.195", + "user_payer": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8eFtDnbPFBQh2yTNrM3sJgkQD3AArVkDs4BH3tAMuEvD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BCS95L5JHBWHvWkcEJBEF3BH5QHxKcPeaTgoYmHLvfFh" + }, + "client_ip": "92.204.243.211", + "user_payer": "5DiB7LqS6sPzoGo4TqDGRP4BHnF9hRWd5WinBcDK4wyh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8fDUd9JmSVWfr6BTb5LSyrQkR3yNippdiCEkhwui6Ata": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7Pqst9Krkdrm72uMpTbGFY6rfsVxJfE8p1uLbvcCAf1b" + }, + "client_ip": "192.248.189.197", + "user_payer": "GBzbTunYrMzcpeyJ6nwCUCupAbvEvE4xJPx9SXjAN1vC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8fg36bN1y4EzapPdUpuLtLM129tMXxYk4R8Z3qczFQac": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2VKu11f8zc3huqDQUN6WJTFpX32PgHpXXjf72P6YvYMd" + }, + "client_ip": "178.250.154.158", + "user_payer": "8vjsxi5AXmk7DrHo3JVq4fSdkckSxmcDTyLW2zqTABZh", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8gzQ29DJ4uu9S4FTFwqnvDPccxWRSsJrc9at5LCXmFov": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2" + }, + "client_ip": "177.54.154.243", + "user_payer": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8hbSio3JRcwonnbMV1CsecVtsKMNpyQNMGa1X2sPMJhb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS" + }, + "client_ip": "64.34.90.157", + "user_payer": "PB12U42qpsa7FgCjcPtq3j4jU1X6o5C4HNxvFvLw7xE", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8hx4wDw8tqAUdHboZvDYYzrsaTfQ1hJy8LLzEMzjT6Km": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6YWjdH5YkXVkkd4HMekcW6Ah4bNNAAdBXmNRNwLeSZKt" + }, + "client_ip": "162.19.112.132", + "user_payer": "2hSiAzofh9P9GA9EmuysCHKqGMYMpp8iASssVaWYW7gw", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8iWP2witNbt2DNH1y48UiB9jphW5RGXuzyY1FZB79F8o": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "9maF99FLLAMh5v5JKG1ZyRZVBVsT5VkZnAJzDvduCpJa" + }, + "client_ip": "64.130.41.52", + "user_payer": "9maF99FLLAMh5v5JKG1ZyRZVBVsT5VkZnAJzDvduCpJa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8iaNdtjdkQLFu1ndfDPauwZeEe5qCVkpggwnWZN7E859": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6GghMq7VgYNSbz8X49Fnx8zbR7cWKQGm8eEkAYR6DPfZ" + }, + "client_ip": "64.130.32.201", + "user_payer": "4rh9cPWb19AHLW8up8gf6YeKHuWjkxnSBgNZt8oUUK6A", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8j2pcJE1Jtk4cNtjBqgcsbvPuUSsm7bUGHh6LBvYnyPf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EsFHNhyoRYepKmncntSKRCT9iA4knapqg8V38JC64P9v" + }, + "client_ip": "45.77.136.52", + "user_payer": "539tRUjSsrj57iqWFrYfntDbWsLeeDnmhXQJ3x32NmLk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8kfRyzdjVUDoQrqrw9hyQuiJJdU7EAmT3UA47VTNa9yx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "uEhHSnCXvWgtgvVaYscPHjG13G3peMmngQQ2ghC54i3" + }, + "client_ip": "45.76.15.94", + "user_payer": "EsYHvPULXA74UNHhHzXQaD3GtLsuRimP85bTF6mE1TMb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8oLK1PGzbEbQfheyUAr64rrz44y2rdxKhFobu5FApdBg": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "82.27.90.27", + "user_payer": "61dZ7QnAEmG5HSmxYGhvUCnQ9SCBdfcyCZzxqj5csSB4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8oaxNfxeW3PSXPabrRKS1UmF2q5mnMiovsVGDyN6hsqY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC" + }, + "client_ip": "189.1.171.179", + "user_payer": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8ozbrpRFBJFT7RvycNXhNu5t7kmeEsBHcZMsjUs6G4S3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SaV6UWBaE8M3kwMBfAhQ6Tmvd2qdJRm94NTwLqtoyGd" + }, + "client_ip": "139.84.226.199", + "user_payer": "BerocY9dqjnwR7dRAd7FgMwGbeTcX6yHTcV746a9DSB5", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8pfd43FpP8GytpmyCckZeKF5oFpW5DgDZKG1uvimAMiQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "7qZbLuLp7Wa5sjogZvxVpQTHJjxPubfg2Ywj8ZLAb1yb" + }, + "client_ip": "64.130.50.155", + "user_payer": "2jmJxNH4577eyo2EBrbV7hHTkjmKUuaQRXzK2GQkwUG5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8pibz9nUEx4M4hMRF8x87FCsTD5rF3hvPmqnLR6X5xXo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "A23LfQn6khffj2hGhGfXr6P52W2pxrVcCaHVQLYQgiX2" + }, + "client_ip": "64.176.44.152", + "user_payer": "BgjpXdNJYN4KSp5X32HowKEj1A2eeBcqNSfwyojxj1KJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8psixfQ2r6kdXWiFxorFyvujYToxsUEVR8GtbehjiwdF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5jv7YcrVThq2xf1vmyp89bmY69QH3RQiaFum6iKmx72d" + }, + "client_ip": "66.42.111.81", + "user_payer": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8pynJ5o7K5eYhYt3sMfYSWqZDYXL7s7MFpJtMyXXmsgr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2vsFftsRCU7NQEvjSzv1xig6bUNfrmhZUsPdf31Ayt6M" + }, + "client_ip": "24.152.39.78", + "user_payer": "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8q7ebcyxFsZfiWcLiQz7K9mDPQLX7AU696MsvFTVz6G9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9" + }, + "client_ip": "207.246.75.232", + "user_payer": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "8qVuqHE2mxR4h8P1g5m6LCCCnuruKCjwnKsk8f67Bsx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "E4gxPbXHYtRzSSsQRTzf6HYSgJzyJJTRJD4GktYV9rav" + }, + "client_ip": "170.39.213.213", + "user_payer": "HMZxyTe5guZ14GtMwmxvm9YeeGeHmwX86yvNuwvKyrbb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8qjMGPBpsGPP7wwKwNvvCJK1huSYce7wyxUZH5FvjuDw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "G1bLKfyNm7zsmmYEL9dyxBvMtxpFcwy2s84bHDj2ZFUY" + }, + "client_ip": "88.211.219.71", + "user_payer": "2ABbPEEr2TvPGMAdWC7M1y8QUwD437z8w4YZbrvU7z2U", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8ryXyVmrLgDCJLxJFENCZQ1oWLSvvFxifXaLAagMpxrn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk" + }, + "client_ip": "186.233.187.47", + "user_payer": "9aGUNsjqW2b1RtkXfksc3ZvDLv6EdrACg1qCRXKKzmZU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8sKeEYaHP6nRrx6Uai2WzpLmnmo5YHGSYJeDuTXccNuM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "791bAJ31BxJmU3zVRY2FXmdcsyq6B2JSB2YX2KY72fkb" + }, + "client_ip": "141.95.45.179", + "user_payer": "CWrQmiqkTKVkP2gZRjuX3n6ofYjhE98k5SgLn5AmPrZZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8tJdmgk92sCyeLWBcDZbb1wgfepnkChZMTxoRF8o42gv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm" + }, + "client_ip": "66.96.84.2", + "user_payer": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8tgJiwLmrg4xiDyuACuBMx1HeRprtaL7MN5r8jC4uheC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ" + }, + "client_ip": "67.213.113.97", + "user_payer": "TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8the9e6rjZdcAiJDBcmVv4spsxfdCKCxcAr1UUncosjJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "CJDex8P4iBCPTSzRNcr9kHaXjn1igWEM62kRWhXngaTb" + }, + "client_ip": "154.16.171.104", + "user_payer": "7NCw54YgSSfNh6FMvDrnnXZQkCs8VQbSAy3MnfFhA7EW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8u9mMbaRUe3pQxuWHKCJtCKnzYvwcnLhZ3nHDCpcH2fv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DRRmKG3tHUjHD6GG7VWxvLAmcv3iMX6cNiDxRbuWGAox" + }, + "client_ip": "189.1.171.199", + "user_payer": "6uw2MvDo5j1bqWimPBFUx3AFjUMSHdm9jZXw3uYyNEAU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8uFKLjDDjJHXZrsGjWx6LMmdYP33zmqsApWiWdREjc4L": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EUDis6LJeJzDHTEBgfHGQyjHp63XZkGkx4E69xunC2Ej" + }, + "client_ip": "108.61.179.181", + "user_payer": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8uHjgwecPW4bDPxKriw4MmJmsg77m5yP8x8NT3jQ7frE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "novaeuhY2JH2WHhc9KVTHDx2cyJZdXJC6faf4CtARZn" + }, + "client_ip": "102.211.135.171", + "user_payer": "FQm3giBLRhpzuQ52Lpmhuz3RautGXcsTJyGeXSBCVsVc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8unYijJhcUuM4pBv4UQ2f88iX98XyNPADsRzQpmDiRTB": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.41.59", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 231, + 193, + 102, + 84, + 73, + 27, + 224, + 26, + 26, + 207, + 245, + 127, + 47, + 24, + 24, + 143, + 142, + 201, + 203, + 18, + 250, + 154, + 124, + 177, + 79, + 4, + 2, + 93, + 104, + 254, + 177, + 78 + ], + [ + 51, + 174, + 2, + 67, + 109, + 220, + 168, + 226, + 12, + 124, + 251, + 34, + 171, + 48, + 174, + 66, + 239, + 236, + 202, + 29, + 131, + 235, + 61, + 27, + 53, + 22, + 213, + 129, + 76, + 147, + 147, + 153 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "8v8icvJNcMPQnZoZhzAeX6Ch1P87eqna8RucorU89Zf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "puffinQSvKFriPbyE5atyx1ptfnyytovbzxybr1jsyy" + }, + "client_ip": "45.139.132.119", + "user_payer": "pfDZjJUvm66mAnpRguLp27eJXRMbbf8EVycpgL38Squ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8vF4c7xkhHbxc5bve42yWtyMJN9mk31XgKxN6dZf1d1a": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GREEDkgav1ox1jYyd9Anv6exLqKV2vYnxMw5prGwmNKc" + }, + "client_ip": "64.130.54.173", + "user_payer": "ERD31ASEiN2VPXp8kMhAZSpAVKhRwtnseVgBEGPBMwGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8vFgYiVHytMLCXiiRiXhYNd18qRLpXQmb4F8TQP433yQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3dSf3Fddbk8JHBRw25TrVqhz2rUPxZCTwn39u6e6yz7x" + }, + "client_ip": "94.158.242.57", + "user_payer": "4pNdwtJZg98QxhV7rcKsYZiFS9MY27XuNTwXjibgm8Nc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8vaRznk9gXZmfWGdUScvDVfujCdWFPUHSgTdbVz7Qjce": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "B1nPbPJPduTqahGk4RyVkeVMyoMS6xB479PbDq1noPir" + }, + "client_ip": "37.72.171.14", + "user_payer": "FXkgqU7wSB1bGHAvHeLFT5uKBAJqfBB4XTQe3teRfWFn", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8vn1MFCcKB4kLSrdPABeZg5zzV3W1CTnASicgjNiyq7M": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Fy7RCjDdFLG8wLn7TBKbccaKwYX1FetdSoVDREdUHf5o" + }, + "client_ip": "45.76.47.10", + "user_payer": "C6AMt2f625JUfgL2CMFjVBMcGMep9ufzydi4ZBbqWnB3", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8voK3W22LZUrMaw9uv8rvu3jZywy4MmuoGusmqjNbBZH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GqDCbnafLmKkdqiqf278jDLXqjjZMB2sViZQtR82jPUf" + }, + "client_ip": "45.77.5.176", + "user_payer": "HyfDu3WTsXsiFvUtDy4AgP6iv2TJqVPbT84LGpWWNvJA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8wDBM6jJqWcQGKqpHEfcZ1ZPqRce8mm2Ahxe255yDFpF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "F3tdN8SoakjEPb743VY18YyKJWYHo6rojV3nkas5YJh8" + }, + "client_ip": "173.231.57.146", + "user_payer": "dzCPvLS7UjGHnjhjCC5HhE8Nupd48EHbzJYW2sLDaPB", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8x1EkZbAGbCunUTr9cUwe2EXdS4h1eCLSmcRgahbh2cS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf" + }, + "client_ip": "5.61.209.4", + "user_payer": "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "8xcDv3Ww7TjrHceR7bVUCFYYWBDtTUJ3UqEEZb7bE32d": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "43.204.187.239", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "8xcLWopPUwjk9zEaog22AJqZk71k6fhDVDRkz4uEEosd": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "161.35.58.190", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "918ffCnbjMdRY2eXuzgg86Zs1LWmQheEkezN7SzyV1vW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2mJM8EEU9xfD53yzycPe3jruGPdr1YFvG4M1bVd17dsy" + }, + "client_ip": "185.191.118.100", + "user_payer": "6L2RMSPbZjFnMFJ3FRgDgTb6A1FEmDydDEmFW7bXZVrk", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "91ATHWCqTfyCmqMjYcfNJNvQk2N7XXm7CbBHp1Mfz2wW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CpuDNi3iVoHXbaT8gHpzKe6rqeBasoYjEKi21q7NRVJS" + }, + "client_ip": "45.77.190.93", + "user_payer": "EVzUdFvu69RH3p9oFybmaKgT2i516DHi8or8z4TKFmf9", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "92MzA1z92HZuwjHRzQBAwS7idCRKsmrGN4npMfP2ebez": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL" + }, + "client_ip": "206.223.224.63", + "user_payer": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "92fVyXn1uF4N9F6zmHBhBuyFHc65XmhHN97wo8Mh7n7X": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "86qwWfy5X5T1kkC7WmQ4dRHRFXPYk4NFVgKBRp1e8tfv" + }, + "client_ip": "23.252.121.146", + "user_payer": "shftkxnsXmqAkmLgz9Mn7bNB5Fr6mKgFc58kFHfVikj", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "949ghHqG6fjnd6wfqiTZBYXcyJsPfyTaw9Q9BT4qggoh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "778nW5D6RNk3UXjQq8Dp75aYixDtx7zoe3g2PnL3EXC3" + }, + "client_ip": "45.134.108.141", + "user_payer": "Ey3DkEVbfBxfWmkTsG7Hqj7jshYf5Zx9H8462Zjjkykf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "94Jtm8m3nCz3PNjbPP2o3XzpmevKcNuoQzCrY43NHJgk": { + "account_type": "AccessPass", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "138.197.196.120", + "user_payer": "3w2Ft53Zv5uPMCQ125dyAnaDnRCqy89MeS58gixsKChP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "95G4VhyextyuPFa3fkLDcZrGoyMoCX1yvgbfTCCC6Piu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o" + }, + "client_ip": "162.43.190.153", + "user_payer": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "95Nejw8LTwWqzk9Uc5a7yc8H3tx5T1SAR9FE26dGjnVA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN" + }, + "client_ip": "109.94.97.13", + "user_payer": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "95aTpmAsqK2V76V18ou7zyMLebb1fXNfsip1GqbWL2us": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "63.254.162.26", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "95gTdbRNEJLbEdiGY8ArdCFrg3PCPZkNz4dqroxQbbaw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CpNnGGhgVATJAbzHUXdrcGfpPiGuZyPka4QUmH7YgavX" + }, + "client_ip": "64.130.47.23", + "user_payer": "CpNnGGhgVATJAbzHUXdrcGfpPiGuZyPka4QUmH7YgavX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "963cn9A79m6WhKdb4oVBnUTxBcqdMh3bmVpBRz7yTjQG": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 249, + "accesspass_type": "Prepaid", + "client_ip": "72.46.86.87", + "user_payer": "LUZhwE5Rht8hJBDPrBPPXcDqqpYJqSBjdmvGfYjqfGN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "96P9EodP2p5SwS1819g4g3y4KcM4xKJesyDJeAStasWc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SscQkTYV2BFQYGGffAmTzvefrFrw6z9GNYiWHstVZ77" + }, + "client_ip": "140.82.30.22", + "user_payer": "ssZbdqVceyPhupmozC8pAEWNC9T984bNBeGRr18DnDz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "96PKBac4aK7XheMdCLT97MHHiohjG4LN4FkmZzTmrGhE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ES1M3tMZ4rMTJ3apE75cHfeGWizDTrMMXy2zKtWkd38R" + }, + "client_ip": "84.32.103.44", + "user_payer": "6HrFLiqhvjY84ZKAfWdtxG18S6x4XRjQ9bjAcdUijA9R", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "96jVtb8b8dZ8RL6sRKVcSmJaimiw5ZVJoC6x3W8iGCtN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP" + }, + "client_ip": "177.54.154.241", + "user_payer": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "97pPqjvNvPyMJAjoswFa9YeD3wrbZSoZCtQAAC982ucP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6dT3E3jLe2UYeGWXaGsV5bEj4FSzXtNEAU44FsKvDShb" + }, + "client_ip": "38.50.164.218", + "user_payer": "61QB1Evn9E3noQtpJm4auFYyHSXS5FPgqKtPgwJJfEQk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "98YPNCYjQsP8f4isVZLT3QyjXKNQRAr7Q9RkoxXR2P2q": { + "account_type": "AccessPass", + "owner": "FdDcx5MJYRxykTF3YRuatw4Am7DNvZp2EpbhwD4V4ZMQ", + "bump_seed": 250, + "accesspass_type": "Prepaid", + "client_ip": "140.82.63.236", + "user_payer": "BiRD59nT2sdvtSzjJSnZ2DtoDK6jzxS8xAPxyaJ5jUX3", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 97, + 194, + 198, + 142, + 221, + 142, + 165, + 82, + 165, + 186, + 148, + 13, + 187, + 35, + 1, + 24, + 31, + 126, + 211, + 71, + 88, + 115, + 87, + 170, + 218, + 9, + 83, + 106, + 232, + 207, + 124, + 147 + ] + ], + "mgroup_sub_allowlist": [ + [ + 97, + 194, + 198, + 142, + 221, + 142, + 165, + 82, + 165, + 186, + 148, + 13, + 187, + 35, + 1, + 24, + 31, + 126, + 211, + 71, + 88, + 115, + 87, + 170, + 218, + 9, + 83, + 106, + 232, + 207, + 124, + 147 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "98gKEGRNWdQW1xQpNzhorwXVnSDqQ6DxNMH1bC63GtUy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj" + }, + "client_ip": "67.213.127.33", + "user_payer": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "98vnZoR5v4zr9QEBFWseyCXrkkMRy8UMjxjTERhq6sB9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EAW9vxqogvdPNapq7QTDpiVTHK6o7begUhPVnf854VTc" + }, + "client_ip": "137.220.32.24", + "user_payer": "9R5wgT2h3ECoDfopUnyZtkpLHgBvwtg9ZxjwCookRj8M", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "99BRbmVXjJ8iLmLxoQuheDkXS4gXeRp55q6qSAwX2SHu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy" + }, + "client_ip": "151.123.174.30", + "user_payer": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "99D2E8BFstxyZfZYL6WTUfyFHqPqcFVdDP2wMiCezPS8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4" + }, + "client_ip": "185.26.10.241", + "user_payer": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "99UCx3r2P913RVCqquGP6NawcysKXKXymFL8GTmtvffh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DB7DNWMVQASMFxcjkwdr4w4eg3NmfjWTk2rqFMMbrPLA" + }, + "client_ip": "79.127.227.22", + "user_payer": "FH2JRSJsPxKYYxXY1qha26tmohiodsXYvH2NHNLVP6Jd", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9Az4mdmCktcZuzM3QGf41xFso6bPB5UXXeQJoRFertz7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9" + }, + "client_ip": "185.26.10.181", + "user_payer": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9BRnCetiyG7RAd1ykoCrWhXGHDRVMeEMSKD5fWKivrN5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5" + }, + "client_ip": "65.20.109.223", + "user_payer": "4icJ8M4vGAcAfrYrEjysqJaygNrd55bpDTnXhwvwmeHe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9CXF4uKVrAcMPVpKGinnbSWugdFUPn9UEEwYBmoqkbZg": { + "account_type": "AccessPass", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "3.22.165.224", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "9DU3JTLVVjKyngDqbwj2H3breCdjiL1ttars2tvhU7K7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4aRPyjsqqFsf5488a9QAaHJLQJMGwoL5P6wRtLmroe2d" + }, + "client_ip": "38.244.189.154", + "user_payer": "7qAnr6wjpKcKkoUKtvZENgorQCRzUc8svG6KA7TJRDJg", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9DV9A1gKHmVxXzeJZtLaKwMqLWD9AQLanG8yesXCXRHs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "4mzLWNgBX67zVwTykNnq96Z6KQLc8UyV5Q35EfVCDifC" + }, + "client_ip": "91.200.42.68", + "user_payer": "MzeXExjAaRUbX3pUV5hGQ9MJeAv5FAzsC3Es7dwhj4H", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9DbYidENEUa3N2r7ExdiNTEpuBpqftq77B5eDrJ2DEev": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ACTGYsH7bHbaSP7z9N86oLPHBThAELbGfTboc1VoFeZz" + }, + "client_ip": "57.129.136.65", + "user_payer": "6L2RMSPbZjFnMFJ3FRgDgTb6A1FEmDydDEmFW7bXZVrk", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9DiAWM5Fo5c2gmaqZuhq5m12RKmk82gusgixpiyp5GYz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7o8oMi26Wf541YTEfTAqstnAnq9QR3v6YzwAjQYRtdWf" + }, + "client_ip": "45.152.160.204", + "user_payer": "C9dTbbWEdNeVZjqbnzZKB4DxfuLqWNVnr9mdZfCqBHKQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9DwcpcqJpvnfFJbQyH1D8uwbReHSTtjfEQxjyiSYtjCa": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 250, + "accesspass_type": "Prepaid", + "client_ip": "198.13.131.107", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "9E5eexcXDMtigPMWf9j5PPQsTbH5c2F5j5zybYpc7Wnb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "kyzzzgRymGpePUsLyr48kQHt53kh5CSfRH1qfvz1xgj" + }, + "client_ip": "45.139.132.124", + "user_payer": "HRGp1ti5YvjHy5BBSxq8g35yZwotwMi1zLQRv45pKUdx", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9EH5DtumbaPvdQZZ3q4YMXVUpQb1i43gAEewfYyqtc7J": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "54.238.237.61", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9ExdXG7utcjCG1FD45it1ipQNvR6HJeQThATR4Rcbuf7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "JD549HsbJHeEKKUrKgg4Fj2iyv2RGjsV7NTZjZUrHybB" + }, + "client_ip": "64.130.32.167", + "user_payer": "8uymczRPuSMNB2perH3aHq2aAdb9wLjK8hDRkAiuiTyw", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9FADBNZMbxaPjNpqey5Auzxh833AjTaRvzb9z7V5B5Nq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "VALiDcyCpujxjJAZDK2av2TpMAigpSodzj2ApqgR4e6" + }, + "client_ip": "70.40.184.205", + "user_payer": "VALiDcyCpujxjJAZDK2av2TpMAigpSodzj2ApqgR4e6", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9G7CpxcUtuCjER7sNwVjH3uQ3JmsYFiNR68ZLW5iP8Qy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "AjGby82yXeYgj3kmng9y3c4nQpZFmiPpJKecLJTHbfbP" + }, + "client_ip": "216.155.157.223", + "user_payer": "5AZ1wBpCtkWjQpjBoxXctq7WPtUnA9KdgkE8bF3J4vXw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9Hj4wcr7HEScbYcUYLHugZ1PgMovABQtEWmj8ojwp1Cs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "38NRALQDS1dkWHK9RzCZjMSK7156TY4CQApcoRakEBxc" + }, + "client_ip": "149.248.53.46", + "user_payer": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9JLtZpJQ2rBu27yh1DsrDkzFBvTzbx5oX9GsDiaB3HKT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5HCTsoKM7vwjubSZSyVWChaHQ9sNNRB1d2SuvL3eZ6Y6" + }, + "client_ip": "67.213.121.3", + "user_payer": "B4zFSvtvknsW5uRWh4MUgNcz7wgwrdjEQpmxKWsrrzFp", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9JNtthgf2ep9QSDJiWy2dbUjaaz9LHwx8uaoKrchQpVt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "F6kVwubXEfZZo6e4Kozrtg7WoWk5wTRmrC8pwoxSLa7S" + }, + "client_ip": "88.216.222.171", + "user_payer": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9KK2GdSvgPP9WQVSeGziLEPvC44mLjw2spS1EDZ57vF9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9" + }, + "client_ip": "185.26.11.195", + "user_payer": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9KMhqe6uEP81nufVPEAT2Mkq1m9jCVMd4Rn7s9NNBsqK": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.34.28", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9KbrhTo1QK7npKAw1kKxPncYYkTtY5buS8hFuK6o96pJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GQqxGEmi6aMBZtcfmfmC5Jgx33X57ksvNYoo8bMH52T9" + }, + "client_ip": "149.28.215.157", + "user_payer": "GQqxGEmi6aMBZtcfmfmC5Jgx33X57ksvNYoo8bMH52T9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9LaKw8ZWve5uyzUsjDkQbJfgZPisD8nFAfAChrJSrSxE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DZVySotZvrvJyVAcgjFtUDm93zoCaq9wBruMAUz83CWW" + }, + "client_ip": "208.91.110.214", + "user_payer": "DZVh4EDpA7xd8FDM3QTmDZyffxG7X6Dn2TvdoSk9Ferb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9NBZjkDzbaNn3DVBWrB3RGuae9Z7tMKUeunrNHSXgVNW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "novaeuhY2JH2WHhc9KVTHDx2cyJZdXJC6faf4CtARZn" + }, + "client_ip": "186.233.187.105", + "user_payer": "CC3zZGidZm2NCNDyoH3YPPmhXtoF3tDUNCyKUzvNDkHv", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9PgqN6eD5qyvQfcgmw6VQFFo5PsJbC9NK81PBmc9ajX7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "HnVNed7gA4jhS4Yv9rhw44ZD6JKFFppvpJ12yuTep1ER" + }, + "client_ip": "64.130.43.220", + "user_payer": "SLGwtzChvUByrNZZi9xCBzo14tbmw2YhtU6skbXn7sQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9QkSM6jH9gXTZW2Ay3QNvX8RygS7tmuL1MSihYqD1ucq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "E9hD3ikumJx1GVswDjnpCt6Uu4WG5mz1PDWCqdE5uhmo" + }, + "client_ip": "104.204.140.253", + "user_payer": "GUDk7YkqVHJFKMnximYS4QU4jjGW67v9291CHSk8riPy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9RrbzvCrx47k35UEwEmqg39tZZnXCniAemPpk6saZS5Y": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "63.178.8.5", + "user_payer": "5ZENonyCMkJ1yWxvLCHrFfgNXNuLXWFvr7mSvcSek7u7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "9RvnX4jfk1sd9A7xDhY3puSC5RifFdER5AU6gvNokuo": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "45.146.160.3", + "user_payer": "3AmWtYzqj6Cw8Gd9uEmsT92YEA3xynLbmDNsLRZGMzo9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9RxunsQAUMxqkti2riaAQNuwAEA88xBpswEJPW6Syunb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2kVZVTY8FMRZ3WuHzyqNz8qd4Ytbba9f9DaesUm5WLvR" + }, + "client_ip": "208.85.23.142", + "user_payer": "AgEosY2kAXbzCodTBhfL1LtGhKEGMHi633pCDBJeryHS", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9S979wJn5pAjCpYTJuq9H1YBTEseKRykS8z4qEyAgc7C": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EXckihF3qmguH5znjhfzLvHsbk2E3nEW2DqNh4MMnDMm" + }, + "client_ip": "64.130.41.47", + "user_payer": "EXckihF3qmguH5znjhfzLvHsbk2E3nEW2DqNh4MMnDMm", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9TP4JsM4kKgSGRo7YppfBkgVyuuHmJRaaWRJpvFSFp2o": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF" + }, + "client_ip": "160.202.131.45", + "user_payer": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9VQf4xRbC5sLKKRVDZJsZ4pshfjRqd2eNvyHWTygbiC7": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.131.99", + "user_payer": "dztErxGYKG3KpxxxkKGSNpyTDSHtkCEMqTdQzzRCqNR", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9Vjwk5HpnoSSaaWtWjWzRDTvqEwAMKXgFBiVz4ia4ybS": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "45.59.162.124", + "user_payer": "7xQeUorRF2rBWM4YTcdrsEbeswQXGR8X3FAhKchnKvCW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9Vo1gWVNLLn8vS1raJtnoRGNBhYxz2D6qxVXdmJ81ipA": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 249, + "accesspass_type": "Prepaid", + "client_ip": "57.129.84.83", + "user_payer": "An8qqTSgY8sRezCvSdQBxVwkrS9V25zUJiqFYL8pGYhc", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9W2DAFs6VbknP9Eq1t3YLV6GzMAAPYzLx2NPPfn1ihj2": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "185.191.118.89", + "user_payer": "H8s7u91vpoEPqJPpXueg9n8kAbKqCxhsVzVEiyPVdDkk", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9WhRBA27rK8rzFNq3xRSXKtXdcoi3bZwURt4xR6LKioB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB" + }, + "client_ip": "139.180.186.123", + "user_payer": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9Yjnrfc93h9Uy6JRwhivwatkCJAwSoX8u9LJVoVJkCJ5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9WzPWqKSqbE5PT9hMsmCDFjzpurAXEYCE9qrpVWp28KR" + }, + "client_ip": "84.32.103.81", + "user_payer": "4bREhmfsXL33JpS2UHuk5ousfU7TS5bSWj6ho73iNQYY", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9YmMXKktdFLxokiHR4u68ee31apxTG81mF6KtLsiezQt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6NDen7aDi65apHo8m1Vea4nuS6LyjQeM6pDNqcW4Q5Pg" + }, + "client_ip": "108.171.210.194", + "user_payer": "FmsRM4M4dZMtGZGDY7WPzLWGuBKyesoVzCt5M6C3aE68", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9ZRtu5veWa3fWvgQd2UvZthemVCnXUNEcEr4A8nZdCpN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "uxqVAFQfox97HazsPtkKiwhypQH6jEGXkQBHDtXshrk" + }, + "client_ip": "66.165.233.102", + "user_payer": "Fv3PWrpL8osCHa55ssBDA6D4fdPxBZKR7MhyeiJZYPsK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9ZcBJiVUnjW73UKEtA8RZXGg7hS254HHgBBbmJxBeFG9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8augxYLUge2iWmitQMwbcBL5VQEpsM6aJdRofhwpnzyw" + }, + "client_ip": "80.76.51.118", + "user_payer": "FamdxUGG1RJ2MaLi18VSWgKtc8s6V4o9sDmjmk4imy6P", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9aFnWmHuHf4oJFemyZGDhyVYzn3oirxqCVYTas8N9xCv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "JD549HsbJHeEKKUrKgg4Fj2iyv2RGjsV7NTZjZUrHybB" + }, + "client_ip": "86.54.152.247", + "user_payer": "8uymczRPuSMNB2perH3aHq2aAdb9wLjK8hDRkAiuiTyw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9aL2ETkzTGU2yk6nRZTNnBT2QU2BtcaTGoLiT9mm7ohs": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.57.77", + "user_payer": "65u9B7c1xZ1n3FE9ZrXGFDW7eEpSN8YNS7sVJDW1DevV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9axaxZ6d2FV87cEMsgoseRmzao34HLSbND5tF3hYJcw8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6k1YkmTKwPRUhChnxA9ryJmbtuQMbro4xFTL6mL9jycB" + }, + "client_ip": "199.231.161.170", + "user_payer": "4iVehRK4P8BTXum94xxwubaTiQgYYRL7a4ZCunyoLttT", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9bTeJ5rceUM6Z8Ud2XtFtuPxn7j7wNeg6pQX4aNWN28Z": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ" + }, + "client_ip": "46.166.162.209", + "user_payer": "B5YCdqmsVeETDue2GQp42dxbiSqKvWqndXjUyj18fSus", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9bwWsZTwUTD3RJ9e7UHgzDH4R6uq7LbUVTG2d9xzkUbD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk" + }, + "client_ip": "185.26.11.195", + "user_payer": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9cLVTcKs835ZJt8AZrcRby31wkijeR8iNgKDnXdq1jq3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "A23LfQn6khffj2hGhGfXr6P52W2pxrVcCaHVQLYQgiX2" + }, + "client_ip": "64.176.66.222", + "user_payer": "BgjpXdNJYN4KSp5X32HowKEj1A2eeBcqNSfwyojxj1KJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9cjehjgzegQxus3LVb59kLw7D1PKtRTy367pQJuoXoxE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "9USijQaAfSzw6gWbHNq68VVigmj3HvffDJYhbK4tfquB" + }, + "client_ip": "84.32.64.4", + "user_payer": "HaHbuziDiHUjPtiiCWz8Zin6hdR9LNaaFfRUd8H19zZ2", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9dzvKXnrwx6AGFAvK9sD7crzvG18FJAetaBoYA1s3NPT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2K9jUA6Z9M7ZmuMiW5ogrVBoAeeT6kgC93GecbtpV3DZ" + }, + "client_ip": "154.60.100.82", + "user_payer": "EDBBUovWxTSLumyUNTbrp4XyBa8mX1eRSJU1XbQtnZaK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9f5rCt63c6ACRwB3VX963kjJyfbZQgwFgrJmwHhSWqnV": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.50.62", + "user_payer": "5inQpgodpNrpCPyz4i91pfA4ecWsPUVwT8FaYW3pxNkh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9fbZrajyvQRqxhaLFTMC5nMWsrm5oV7SrrpvgnqtiG4v": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "NLMSHTjmSiRxGJPs3uaqtsFBC2dTGYwK41U18Nmw5kH" + }, + "client_ip": "62.113.193.196", + "user_payer": "DzFn1LG97hQczGVqcLHjjetnMoGyHG7KohJxwPRUxfQD", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9fdkNxnEt2UkTiKnbvmD4RJYwMwQdDKvrrXdddYEes4g": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe" + }, + "client_ip": "189.1.171.179", + "user_payer": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9g9EWekHQvp4WYrtFcCs9EFqzES3DVqGjFbeqihnjjwp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "tarCpiqTgLoXdUUQUrec5pp2GA5r6kaSV7Hu7UtZBKi" + }, + "client_ip": "103.219.170.123", + "user_payer": "9nxWixzZih86YrKapEiG3AZigQBpoUX9Avn5pS1GWMqX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9k98tKP1zaEjfeds4a9NoHpcWfmk1MCYTPqt5ds8Wopg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "7G4RfctwLLgqG4ZWfCirU8dfJd87mKQWgB4EHQRv8i7v" + }, + "client_ip": "5.61.209.10", + "user_payer": "7DDUAs9DjsvfJyD5XC1KyfCxyS8x6Fm7FLBdCaFUrbXL", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9kr7yeaVjwxGTk5Ktr5z48BUqkFbDx8MTwBjA17PGU9w": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5zm9g3zgAPWzX3wmUB2JtTkcwCqe74NWsTmt5wLFwCKK" + }, + "client_ip": "185.191.117.121", + "user_payer": "2778PEsMaHBFVBLJwHKEAbgsvMsmCVFdx9Z9T3XHpaNu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9m7Ti4nYVxMd3GVXgdcuvi6pKeuobTRVDq2NfyyBpQer": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6NF7MuxNEFtVEKC6sKNuj1wTfLLNg7LwvjTZar4bGdB2" + }, + "client_ip": "67.213.127.249", + "user_payer": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9m8vX73cKQjY2xmd3TtFkCny2hVYKvSHR4QKkitaqWfr": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.133.90", + "user_payer": "S53xTGCd4wCYRYUo3h2HGPRCbuRxY4wPBZhU1hdtPfg", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "9mKMnyi2sJFRVj8PZ5RwhRu4rwG2cVPPRVtb6Q9P3Q39": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ReFiqMfGnc7tW8WQtFFcJRPZSDAWDBnAsdoFYF2QnfR" + }, + "client_ip": "103.106.58.73", + "user_payer": "EcdCLCZY9LxYMCnZYna5kaLvE3NTNNtVRMzgYjbQ9CcW", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9mMVNAVMYF9ULSBR3oyvtzKhakjYKdDsqJxx7HFDJKNV": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "160.202.129.17", + "user_payer": "BbnFQ4SYZV7rFpZZ9DQzBPQPRBbsVKYgBu58xXv7xtTe", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9mbky5U36ANAuN6X4gtWDomNLsqm2ErG2spDddnBQ9EK": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.46.90", + "user_payer": "2cL7FZVqu9se85t96otek8k4LKvA19SZK4RBm8JRSFkw", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "9mg4zyDxPJAZ5ZnyWRkCLXpdn1tWwhxJsTBxqnmg4frf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "A2JWh7ne1dV9vbqZvDDq46Z8LahNipDCTXusGBprAsB8" + }, + "client_ip": "70.40.186.69", + "user_payer": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9nUwdGXXjKNU4sPxwnPcjXfx4sYKW7GC5haRLmK1Uw3S": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.33.74", + "user_payer": "7iKedTgigSPbmKcPiHBXYFGptQ7z3AdVDK8KqYhJKwKG", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "9nfJzWk2dwgiSMQvgJPGJHquj1Syw3gKkrGp42s1kCiE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GQqxGEmi6aMBZtcfmfmC5Jgx33X57ksvNYoo8bMH52T9" + }, + "client_ip": "74.118.139.111", + "user_payer": "GQqxGEmi6aMBZtcfmfmC5Jgx33X57ksvNYoo8bMH52T9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9nsEY8zTx3Etnk7XqnsLBZcSK8km1NumgHPMv6wPb422": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AMukCLCr52XxsEjXoDxKKxjNg4FpnsReXNaQx8aR6DJF" + }, + "client_ip": "64.130.52.48", + "user_payer": "DW3paghe6S7sDeNsAPREAsoTnRmvRALoa629kD2g5Vi5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9pb1PFBhtALe9gLuDr3woF4SeHBkBagh7Sx5F5Nxwhop": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GoeW4aFK4dGoekJySgUynWDxBZiQJqm8GDAF4H53tDK9" + }, + "client_ip": "155.2.223.11", + "user_payer": "2jmJxNH4577eyo2EBrbV7hHTkjmKUuaQRXzK2GQkwUG5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9prA5i5XhAVAQFnr1HzaqAWdmKa1jLDXf2n3P3ZjjBMn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4KCLwQ1QqDBjfYwFXjH1vjzogmoSWUtJxFQeHdMLU4VV" + }, + "client_ip": "91.189.182.170", + "user_payer": "88K3vd8E7f2jXBwfNspzAYXKZuS7erF1w2wk3qcHTSfh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9q4yNgV31mvVErrE37WRzpJeFGDdBsirVoa89xnNSCxr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HgozywotiKv4F5g3jCgideF3gh9sdD3vz4QtgXKjWCtB" + }, + "client_ip": "137.220.55.224", + "user_payer": "96rY3VpT44hm6wdYzKMVwMGGeqhJY1BDzM1iFH87NcW9", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9q9VFWiopmkwXK8wA764oyc7wJ9FxQuRjaaQm1AkRJhC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "FZYtex3Etw4ZnPHQ3xcSSka43qv522qC9vipE4XydvN5" + }, + "client_ip": "70.34.252.244", + "user_payer": "2jHD7HZJbtZbVuGHimBgR2BPsubacyXF1HuutLR6tQVi", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9qkzaV4h52ihXEHVdRzKkuT7ekR6uGmkT88qL5pRfc8h": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BeaCHioStqCEFDFxKwAEzyrUPYxqnBPhJ98gDKeEiTPb" + }, + "client_ip": "94.158.242.125", + "user_payer": "4pNdwtJZg98QxhV7rcKsYZiFS9MY27XuNTwXjibgm8Nc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9rCrHKfSCkkEPWoPgHbSF2QrF31yoEBxQx7mrKnVUkoT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz" + }, + "client_ip": "72.46.84.111", + "user_payer": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9rEUBLW7j8wb5o23XQ5VmKeVMMvvorfXKK8Y91y8RQFd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE" + }, + "client_ip": "103.109.101.7", + "user_payer": "9AnJPXuU2Gm1ZUCWGdXxnyhQYGtFiZ7szYgUA7XiPGGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9sf6d3zPwUH9Xp9xxXbpBnSccNSv4Dsc8uc2MN6kyXXH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EHAmJS4Am2rJLCV8Hd66nzqqYbhpy81AGGAQGRmW4k9v" + }, + "client_ip": "84.32.49.208", + "user_payer": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9tSNPLRJiePqN83Uf7NGsXa4XAbNZfazjusjTy6WjKay": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE" + }, + "client_ip": "104.204.141.119", + "user_payer": "BLbGa2YfWZfRJsmG12FofALdf5N5irrUh4DcxovgczEm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9utvtCZs253JijNVBgyena1an4ZUKp4ZqawCg9qrBEoQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "A479ds9DDjGugszh47W6M4JaCJd1DspU8NSwgrXDZJuy" + }, + "client_ip": "84.32.32.21", + "user_payer": "EBKY6mSeuSVy4dE9fTNDtM71mi8PYJpDq3Qx8neDYnz3", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9vk4xTrRk2YnUrqwstVVzKxkoPRd677cJRu6JfxA8h51": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2t53LvZfskcpXkdwLaBnfZLbNgyVHPu2BNFpcRBaEBhM" + }, + "client_ip": "45.139.132.99", + "user_payer": "2t53LvZfskcpXkdwLaBnfZLbNgyVHPu2BNFpcRBaEBhM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9vvA7f5paZDNLQJCjdkzoEmfMt43RgHycL6CojK1T34U": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ECo8pYx2Dq7XUqM1WU9LBjoG7fZrcwQKg6jq92g8myxd" + }, + "client_ip": "45.77.142.108", + "user_payer": "BC23QRZ9UQmqXjZfubTq6rMaF7szTX3djiqcUXsszsph", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9wKWUfzVfrrtBmZRAifYAZFcn5VVSEDYcjhQjtzqLLus": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HnwMGBAw5PxaX56eSYc969MorEy2NzEMPLkmBkdnJmeq" + }, + "client_ip": "167.179.99.201", + "user_payer": "FmA9r56VrQGS61k76fXANcbXrT8KnB9dFRECH3moFh8q", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9wouUBnniTdfVizPzrvA1GXJkuUQLDQgNBW6QyckqWtY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2P9ZYA4vBoBBr56hrEFTmrd5ctuz3r7wtvRYmbgk6jRL" + }, + "client_ip": "207.246.75.232", + "user_payer": "D5zXsAfuLKYMs7aQGYKqMeQqLW97xD5xgVXrrsVPU6Zy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9xLweFVDiAotf66FmUL7XHuqmyrRdYZA6eBV9P6mYEEh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "5ghoFEVrsXeAPB6SUmBpZ2xq3KvHEjNMeSaBnxEBXkHV" + }, + "client_ip": "62.113.194.108", + "user_payer": "FWdQmnnKq3WqN5YrdJMZZXCWk4syWBhQyiPY8p7NugoX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9xwhNhzbU37VBC1d46GWf2TuBvSWtesSsj6C86XyLibL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7nzTzRZzezmugqE5ZjHRMxarhXunpwZ2PUdjV7uYzt7A" + }, + "client_ip": "212.83.42.99", + "user_payer": "DukHp7f1Us59jjWB6ihyg55cWGqcpz1db7pa5m9zvLLJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9yD44FZeHtmFwNr5TXrtLymoyBHJovtQxpadoBgHDN7b": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5P7Uyn451rVa6tHETMKnMT9qqfMLRLR8U1J9AS6GtaNh" + }, + "client_ip": "217.170.192.202", + "user_payer": "DWGupvBwXjUudG1fPqtcuw4qe6ByDzzLhnbr5z7RGWsL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9yDJYLrNUkkaADvnhQXTMyBc2NirpC9eSfBKX9Y7faU6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HM1KjNaXa4w8K4gCXbieoMh5gUTNeUhg9fvdXMKeBW3L" + }, + "client_ip": "64.130.61.68", + "user_payer": "52QixFm2NR7Gij7FGCxQp9ArikWc68z4sFdD9UWepmmN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9yJzHS2h1ci7g9d9KSeWeY3Yhw3p3Us5veDZNDHvjE2c": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ADjyeNzWd8yhEjCVyAqT87eqoyGRbimERQsNhFQcXjop" + }, + "client_ip": "88.216.198.132", + "user_payer": "HYpC5pR64SSU8Bp8fVRchQPmKwkXCx5WbsvTtCRpeK5j", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9ySts8aqQPvRK4LqdX9NN59cQZn8tJK9TwnYDBxqw3od": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "64.130.58.76", + "user_payer": "EDAMA2CMCKg3UPNUbizZsc5g62DE2AZqraiMLJo1rgmT", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9yfrvv5rWcp57x6ixtaH5mSRtQh8UMyp4bRRxahjSs9M": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5RkGQTfZHo5PViZCs1AxhzAF9zNKnc1jYYqeCF3u4L9p" + }, + "client_ip": "103.167.235.74", + "user_payer": "8KaTsxhUnQa26U3mLDqxfzCHqstYa4L3nGx3cJM4iafG", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9zQYNdK1oKD7pwGop97Y7UcxvDMnDMGA397C9WmuF7Qu": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "202.8.8.23", + "user_payer": "ChkBGZfDPK8xS8huBp6KZ65PrLAHhTrp7mA24epz9PZP", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "9zdCfPzFHYErFdkeCaAN8RnWNzjVNm2XnSgAEuRxNMxp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd" + }, + "client_ip": "103.88.234.123", + "user_payer": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A1vkNpbSEg4ENBW3Cz8Suo7zjKjNRxfobm8RNkPvY6Jc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "ECL56MsWKxwoq6rEBWdJ1j6Z5gVTRvjpD7FYZ3QQG2RP" + }, + "client_ip": "103.88.233.105", + "user_payer": "EmE5KsWqFYFyxytrCQWy91aGZy7nGfd96cdPfi7R5YRE", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A2jmT9qChkSR4pSxGgSxoPfN4y2i8ZYywP3999XdqNZm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6vG7fgweSfvY7JRViG4HwKgV9u6JKhMpf2bqr6TKNjUW" + }, + "client_ip": "104.204.142.237", + "user_payer": "9Uer4RUuBDajw6b4PF8SEH13HhNicDa1MKGXHWDVQoVQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A3YUuiJGUXhLi8faqT6ufX2TJibbKHFkJ5HVP4KMcNnc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "E9hD3ikumJx1GVswDjnpCt6Uu4WG5mz1PDWCqdE5uhmo" + }, + "client_ip": "151.123.174.78", + "user_payer": "GUDk7YkqVHJFKMnximYS4QU4jjGW67v9291CHSk8riPy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A4bzVd7kE7dnRkmhjNU1ckJoudoFMG2Nv6vE9mgLxAtY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CG4tRANBKrzUmpv93V5sgftjQznBdiJsc2yPCzZWWuS9" + }, + "client_ip": "88.211.219.99", + "user_payer": "x3W67xEMpyoJUq9EigCCK4gky7nJYXdYgHDAonW3QVa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A5LzcPo8VvJrdiUR42oVp2rHndEUZen8FGByvQpeDmK4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "sTEAKPk59EtPPbixCweyv6oRLNCDEE8pnnef6gUfbiW" + }, + "client_ip": "70.40.184.198", + "user_payer": "sTEAKPk59EtPPbixCweyv6oRLNCDEE8pnnef6gUfbiW", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A5pt9KsCaQBunZB3M4JSkWReLsnuTNeQRU1jLfdhsni": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CG4tRANBKrzUmpv93V5sgftjQznBdiJsc2yPCzZWWuS9" + }, + "client_ip": "170.23.153.115", + "user_payer": "x3W67xEMpyoJUq9EigCCK4gky7nJYXdYgHDAonW3QVa", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "A5xihLdGxyLRpyBZ8TWHAgmoESV4ZQiAvrDmy3mkKwhe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EKgSCR3ahdypkxXcBY43ZNxdmyZqPkKNPey3rwKjqbz7" + }, + "client_ip": "86.54.153.244", + "user_payer": "E8JKqZAQtYkWrBqx3H5eWWuky14Z8DNGwq61eqQ5wcp8", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A6KjsVDENmHWopSJGLYHvsFra2ZiNib1gAU7srB9kekA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "vu1sGn2f1Xim6voHNLt4nLn38zNkYdLasU7hEr1TC2D" + }, + "client_ip": "169.155.168.182", + "user_payer": "84Gbn3k1JuCiD9LhBNYcVUiNU8eu4s1Nab9yT3mMLQJK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A6zHV2USiFiCjSvrBBRgiLzwp3jWg2p5eQeviabtUNqi": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.227.134.101", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A7jowYPcT7N2YCsQBbnr4HgTK1Mx2PhUza4g9tZpPX9K": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BFMufPp4wW276nFzB7FVHgtY8FTahzn53kxxJaNpPGu6" + }, + "client_ip": "102.211.135.179", + "user_payer": "91wQgmU777nUhHgmdALwF2fw5EEi145u4QZnsqWvHW6g", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A7sW2NRp24DwEgxLzSLZKHwUTAhCCBbZrAn3mcTv2PJA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5keS92E3xQQozb5rCAkmMdXC6obx6GhjhHH4PQ52aLum" + }, + "client_ip": "64.176.168.67", + "user_payer": "FkUPod4tBiTGiNgmzp2xs8SdsxS9bQaWZKMHrf3hiQKu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A83PkTnHn8L2v621PMgWT2G4NsgGXoAMxQqYNXWRV4Dh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DupN8puwoPdFo9EYm8AXemEn9cMsore1QmZzfPaxyUG4" + }, + "client_ip": "45.76.138.26", + "user_payer": "CiFCLMt2ZXxvi6jiYnFzeQHUxgrX3bX1CoGkvRCy6Ts1", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A87WQdHjp7YbK8S1v6EJYrULfxGhzYF93V2xh44AXvgG": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.59.162.121", + "user_payer": "44XabxfLiB6MpM78jr94Fz5eudpcthnJWuodRZjGHt6A", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A8RAh5YbkxroPkRPxiADEyJFGGeQxKoXzVhtaTuoRzob": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "HM1KjNaXa4w8K4gCXbieoMh5gUTNeUhg9fvdXMKeBW3L" + }, + "client_ip": "64.130.43.107", + "user_payer": "HMZxyTe5guZ14GtMwmxvm9YeeGeHmwX86yvNuwvKyrbb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "A8edRBJmvG2eyH7fUihU8ED2AMM61Ev3SRoNzGCdCpmR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3CKKAoVi94EnfX8QcVxEmk8CAvZTc6nAYzXp1WkSUofX" + }, + "client_ip": "45.77.3.223", + "user_payer": "D7WhJxr7bi1dpfBWFLdf4U2ohJMx44zWdyRBMv2EyoHq", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A8h33isRvTpP7DRLusCxw4GRbaHy7QMheFkwiYL3aH2a": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.41.143", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "A8qF76pUs3qXowT4LycV3ZS1nx826iWBfqSvo2EMjc4w": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EUDis6LJeJzDHTEBgfHGQyjHp63XZkGkx4E69xunC2Ej" + }, + "client_ip": "45.32.26.61", + "user_payer": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "A9GonsuyUhWTr7VgaQbzkAiDooFCtm6whZ4GoqNuhnZV": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.61.152", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "A9jvtBZ1JChy5qmYMBzj366EJC11ic6qvt6x86AiQqXu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "AAFQY1dJhpkhEgWA9jGj6ueBTnE4Qwgfs5HQs94Frhrm" + }, + "client_ip": "83.143.83.230", + "user_payer": "Gf4rQifKzAHznUdtbFumy1MTwGX5ApgwnkxUUvEaEzWC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AAAx5Xp5vpzTxMLZzmDy8PJP8dSUhL6rr9u6UyoE7nE8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "MCFmmmXdzTKjBEoMggi8JGFJmd856uYSowuH2sCU5kx" + }, + "client_ip": "64.34.94.207", + "user_payer": "APaEbMzPskbrJFESuNDj1AZuu6iQhQcWeP79kZjy19Nt", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AAm9KK3wR9ReZWp7EweVkWdhaNFtpT7SQpfhxFSaN5sy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9pBHfuE19q7PRbupJf8CZAMwv6RHjasdyMN9U9du7Nx2" + }, + "client_ip": "193.243.164.211", + "user_payer": "8QQLUdfQoZJphGFoVhkDsexsobirRtSNM1D1Z9TVtsYQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AB8oH56Ji4biqfEbD74hRDoYa43rvoAYEkPxLEUsAUpS": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.50.245", + "user_payer": "CorvusJVzafrVZ56BwmLwcS335WwSJJXB54YmipCMp1B", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ABge2Hie4nKTDq9DVcoqQf5pPBqNeVEvbLPCDCGCpTPG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP" + }, + "client_ip": "72.46.84.111", + "user_payer": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ACYFjRBqVzYXkjRcpaCg5PHTyhMrn87d3VfBs5vBSkYN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz" + }, + "client_ip": "69.67.148.127", + "user_payer": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AChoLfQ5CpzcAp1DqhCySi1hmU92kes8eie2nyDc8Uvq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s" + }, + "client_ip": "103.88.234.125", + "user_payer": "Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ACiFR1LQU8HdnYD5vYAXxUmQxDaRmhtWVmBau5iJkwkr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9" + }, + "client_ip": "185.26.10.241", + "user_payer": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ADGbtgypzbB5m5RYEnHnsontLrHR4endk6h3BGFxcwy6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh" + }, + "client_ip": "23.252.121.218", + "user_payer": "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ADfbNVB7k2YNGfLsyU5cDX5R6Vw87VL7JzKF8Zn9Q3NG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dummyjMSfoJqFo8sicwFBKn7TKQoNDcJMsQHmGGo9rW" + }, + "client_ip": "38.92.24.106", + "user_payer": "D7biFzvLNfN2HCCw73rcRqNi4gDHG3rSD5cZ9uoLpk2T", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ADxwTyHsFLfyuGHYZqfxmH32i4BTdXiRZ1Xc44TxySeV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP" + }, + "client_ip": "189.1.171.179", + "user_payer": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ADyY9AnJ9YzhuxJBSzbLHMrWkrm8YePiLnotFM1hDApF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9JdLgtzccbXq66XDxXn41DiQozQ9rEVkQeMa6tvTEGEX" + }, + "client_ip": "64.130.57.215", + "user_payer": "DDB4XQGCCMdPQygsq6kPDz7VdTEWe1APfarNuGS9c8e5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AE8ESP5YDMutEAyfyLEta9QgjvNRkvKkyGAV1YXq6wop": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV" + }, + "client_ip": "67.213.122.69", + "user_payer": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AESzH1E8rQ4AptLJ8w83Zs1ocwf4KBkzhv6bcmskje9o": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DupN8puwoPdFo9EYm8AXemEn9cMsore1QmZzfPaxyUG4" + }, + "client_ip": "136.244.82.226", + "user_payer": "CiFCLMt2ZXxvi6jiYnFzeQHUxgrX3bX1CoGkvRCy6Ts1", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AEYn8yVv6J1bcxACTtJEU8GRHQYbQdbTDQVRh1Tm7MDQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "1KXvrkPXwkGF6NK1zyzVuJqbXfpenPVPP6hoiK9bsK3" + }, + "client_ip": "84.32.103.109", + "user_payer": "BnYN5YzNANLv3c3qWgKhPB5C9nCButYrn6ji4GfFhPrk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AEfGFSN8t4T9r5qxtNK9fjtNdkkxfXn6h6NRSgdNVpuC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC" + }, + "client_ip": "69.67.148.115", + "user_payer": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AEqKKpyUs6L2FVCE4dWHrnpNAxqPkEMrtzXxqyv6g64q": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "AqHB2hGDedjysHCwerVDq6cXDeaPSp3n9F31y1QVKDhi" + }, + "client_ip": "212.83.42.3", + "user_payer": "HqjQYyz6eK7wrpGnVuoCNxAzu41J3GmcAj3X6G5gJAPm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AErTpopY6i8m7zBjjwRh4PaJChq6kk7KnaE9ncdb8gs6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i" + }, + "client_ip": "185.26.10.181", + "user_payer": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AEs22KaWv6T94VsECED3FyWszfXNkXrHC2snBSAYCFKw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "nymsHergYedT9CJMgtGMvqXUTGcbs5o3MiWTJUbqTGY" + }, + "client_ip": "64.130.41.137", + "user_payer": "nymsHergYedT9CJMgtGMvqXUTGcbs5o3MiWTJUbqTGY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AFJmrTAo5sVA2T5kFKMotamqGoeXBLo1fWykPXjYWWWj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CLRMmAKhSY9TbqyFaqGCs27rqWZDFV1sy8BtZQFzxQLA" + }, + "client_ip": "80.76.51.168", + "user_payer": "FamdxUGG1RJ2MaLi18VSWgKtc8s6V4o9sDmjmk4imy6P", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AGBvws25iYoT9HhGnM2MFEQrpukwZLvUiYqN88WotMqX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CoRVUSdkpM6nT9zxZRoD5T9T4d1LsXj6hsEAmnD4Mj5L" + }, + "client_ip": "2.57.215.164", + "user_payer": "3mdmoVgPg1RrTf7vB86zudZBgvaJ1QFJwLK9JarUcu4u", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AGT1SeNZkFPdYsypMUKoydwuC4fCy8CuhULx7fX7wKDQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "popscoyTKVksa4TyTXw488b3vvFxM7qQEyTBeMQopKu" + }, + "client_ip": "88.216.197.11", + "user_payer": "GCV7b9bt9TViq3M4n8uYKrfz8HjE6VLU8czEsrgyzkmj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AGty3kKvrKVee4vwxCEJH27k6gbZdoEL2U9Ysd7enffM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "7MTjmteQHhthwwTZhUzsc2dP4NBvGNRqj8jzdqNxHFGE" + }, + "client_ip": "151.123.174.142", + "user_payer": "2BYpEke9hJ5cUtPMx1mj1xdcyhNbmKPZcD4REcwgstcb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AHfqNfApXzWjjhKdtWwodnLM8exHnTdnUyHaTrpYk1Wi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "HcZvwZ83PfjrQDiq3GLHxisTs17aGURs6bJ2LwtmL4qv" + }, + "client_ip": "37.202.198.11", + "user_payer": "GcrtDuddnXMGD7Tq1e7zaGp3EdXDFHxK7Q59tF6Ks7Qk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AJ2ByKHizd4JPUs1LKbBgSkdzyH5VgsvBCbFMjof1iAf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8augxYLUge2iWmitQMwbcBL5VQEpsM6aJdRofhwpnzyw" + }, + "client_ip": "80.76.51.168", + "user_payer": "Hf3HUBVD3yiYwJ9h99NRanRhWbiTqp8yDghfQcQk4Wza", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AJ2mZdCTCuAz9x2cEnVfiVDCBDRA8n82EpF8LR47uhf5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CpNnGGhgVATJAbzHUXdrcGfpPiGuZyPka4QUmH7YgavX" + }, + "client_ip": "216.18.205.162", + "user_payer": "88BZQLYKVGhaTqbcxiAjVfyJkws9vCysdZQFphafmZet", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AJ4V6Ev4XBwrSZHSWbvAeL7xPURnLxsD6vhDoRLG5qc4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "etherUisfbmZze6spQmtv3MD2VUCEfqJV1xjVcN6nbc" + }, + "client_ip": "185.26.10.195", + "user_payer": "7j2LygCdSJZUgjmtVhsme9rEKmEzx5NqfAkvEXoXzsgL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AK4HWJffoKimRt3YLiAb6vhGrc32fyvJHMbRSftYfiEw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GiYSnFRrXrmkJMC54A1j3K4xT6ZMfx1NSThEe5X2WpDe" + }, + "client_ip": "206.223.233.229", + "user_payer": "93dEEveCqbKo9UYhUWTA682yvpMVVry9qpqysYV8EqCS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "AK6u6cy9VoqsaSPQJDV2pghE4ebvA14XBuLCwWycv6iQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5zuNci3TV79w6zLoJZzbZujMvkVZb2FcSPhgv9aT24AK" + }, + "client_ip": "5.199.164.220", + "user_payer": "9zY9CKw4JfSUrjAPCENLJs3bt2o4EPsUq2aGcD1ESU3i", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AKBiAZChA6C7j69Zr1Lf67AEjseegp7KnkH5K5To5g4S": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "A6xR5K3m72yQMhMWMgonkW6kL79FEj59knuHBEx2jQLB" + }, + "client_ip": "185.234.13.14", + "user_payer": "H3vsTUMuwNbGGv4cdmwa886FmnrmQ1VwfMoUKV3GNyec", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AKKgwSwkB78Yp4ddu6geh5ipsS1XY5eQBHSB5bFXYTSW": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.63.237", + "user_payer": "3jFSeiuCJtRj2WibcKvd24UdrHPL1KT7viS7u4R5eiNR", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AKZMcHq5ACTceBFY1punrokZ63rxhZugAqT7LdZYG1Jq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "AmjX7CerZbHrU814UeBp2gJC7gANNG3KrP4c3RyD7TSD" + }, + "client_ip": "84.32.186.44", + "user_payer": "EonrwbANkvvWbRwkqcSVu3Vi7Rd9BLP5mgYvcjoxxsXw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ALKuZiYruxPGETJd6iWGyr1DiQsEPGRgFRRZw8io6K9b": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ChaossRPGKnsVhX1GfPC78yq5Sqju4cMThcAsKZNz5d6" + }, + "client_ip": "45.154.33.28", + "user_payer": "BvokayHYeVmaFbSLZ1rsLfpagC12vmxqAmRTF25ZT4Qt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ALnYAYXzGnU14hLJUPpLAKdLXJAR4Qc1CAkpycnNteHY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "GqDCbnafLmKkdqiqf278jDLXqjjZMB2sViZQtR82jPUf" + }, + "client_ip": "37.61.214.167", + "user_payer": "HyfDu3WTsXsiFvUtDy4AgP6iv2TJqVPbT84LGpWWNvJA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AMBDNvEec1pKvpdvbHdybda37p87VUD7s7wHLh1ipLSf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "CaveyttUBTKttncu1e4RF814XjuoGfYv8cEsiKGDNCPX" + }, + "client_ip": "208.91.110.44", + "user_payer": "GUeWVMZJF72Ds3fLkRPtH9ohHqz9bPPLbBoa1ByU2yVk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AMTdo4ekLZD8PF6RGeo16WZ8eqQCLC5P78V3K5MaMydW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn" + }, + "client_ip": "178.162.238.198", + "user_payer": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AMqiQ3NLqBcw7hErTL4ohnk4g7H6sF4rDsJxe4bWiFu7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2" + }, + "client_ip": "177.54.154.235", + "user_payer": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AN3jJ423cFvWZjA6JanVRdYFCeZDiDhPfZqeBpYdmcyB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HEL1USMZKAL2odpNBj2oCjffnFGaYwmbGmyewGv1e2TU" + }, + "client_ip": "64.130.57.134", + "user_payer": "4DfoeULZ1NdvQ8gPhghppzWLqU5SouhXEqovb3BCn2M7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ANGgvJrgtbCUMyD35qgRKthfzjQeJmXiiQToKCFCdWtd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "LA1NEzryoih6CQW3gwQqJQffK2mKgnXcjSQZSRpM3wc" + }, + "client_ip": "64.130.42.120", + "user_payer": "3Gjc9xDUYWnjEDTBenDizYZGoXZtPVvEiJdcZMuiEwud", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "APAR1BpVrSvi4FGm9kUAhLonuE1Yw5VzdJ1PUoBcCtNk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "fotby1ABxpei2EVH9uXJ6KbHYgPjbg4Sny9eRzQjtRN" + }, + "client_ip": "64.130.37.3", + "user_payer": "CmyoV6S7g8nRqGi21ZEjJc5GoUokmKV9uf2YBUPiCnhZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "APSwkmwhDDMvXYL1gKosB63R3GoiWu4TRdQwHiMFhzvx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4YGgmwyqztpJeAi3pzHQ4Gf9cWrMHCjZaWeWoCK6zz6X" + }, + "client_ip": "217.170.192.166", + "user_payer": "DxngUJ6ktRBTa3Gh8zpx7qJstu6PP45RcimhL4mneH2o", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AQ3KXCqrPRq5HyagGh5XNWLNymHPQQWcbnyVKNjDME97": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "junkNc68Q5jH6tJz8ZHmNoSDLRrJBX7F2PQsMwy6TLP" + }, + "client_ip": "108.171.203.186", + "user_payer": "F5kvKUW9CVtwrv4bQTvCqy3ZZvPsz9kmmnoCgymcu2of", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AQ97jPaXUj1ZfMt89Tmb5gHuohDm8HfiVnecg9asSxpq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d" + }, + "client_ip": "158.41.67.134", + "user_payer": "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AQAHJtr5Yjgu43E4bLQRm3SFdiqXSeaaShduFNfUPBhn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "21BXfe35jWugD8LVfJGmf928ZzHjkLN5B1aeALPKEZN9" + }, + "client_ip": "88.216.198.132", + "user_payer": "3C5HPrFxxanYuV7973hkZSqSWrFXXfKMqGRuu1sPJvVa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ARPd8cfdnySenZyTTYwUFKJ4sSWZvH5dQnuiGs4z41uL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd" + }, + "client_ip": "69.67.148.115", + "user_payer": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ASSmT6xwvqZYKRNa2D83erYpC2ob9QU9Wei4bH9PxDcE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "136.244.96.161", + "user_payer": "5nGhXt83eGzRt2RGADTZBwtX8AzWs3sw69N8qxnvMzN1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ATpaZ5EMc6uDgAU25wH3TvPNCXihJ6VMYo6dCAif9LJE": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "88.211.250.116", + "user_payer": "BTvitqoKBWLyu7xkswLjkGm1iiiBrRapEkxHtanXvn1J", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "AUFZYryTULVqzuR7wEuSJP3g9JRQa6zAdxnug94nnk7X": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj" + }, + "client_ip": "185.26.11.195", + "user_payer": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AV3pnwxjY8ujPC3A5tc9d5KfXjCFom9FLX9Kh7WMqZNv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CEL22Qx7p85qY6gmhCZaYJrrnynJitkVRMQo6qZdT8Ns" + }, + "client_ip": "198.13.133.78", + "user_payer": "39WWybLfDXnmmhfSt4cqAmV7b9S81gFR5kgsJ2REWynv", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AWSFQhZo442jSSn9NBGtj8mD5pBgF6AqmjebfsiggX8M": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "23.106.83.206", + "user_payer": "8bb3J1DFn6cr1eqo7Txe2J9dg3pa16YRiqSpymKjJJ9d", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AWUVJjQdLms6CkKS2Ro1nMhfq9XmbQiiWYxetQFj67Lb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "jagBNeXYncnn1hzwSq1JJ16XhWTgQ7DCFVqndSJZ6vT" + }, + "client_ip": "69.67.150.249", + "user_payer": "Eocdw5GT9JevaivSzGymaXzJnwCndoNhWuuDroHB8caP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AXCC8SiEhXACn7cSc9VDobXX5TLTCUnXW6w6qSe3gg1D": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Hi9CBpuiJQLp8UayRKS2Qz8SYu2arZXTcaHqcQdSH3gD" + }, + "client_ip": "23.252.121.174", + "user_payer": "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AXrJJmw5reSkMPyJQ8P1bYBCd7vzDzEp6Cq2mMRZ9Umu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "8GLRbAstsabZuZUx73AoyfGi1FRCWSUhRgMugFyofEz7" + }, + "client_ip": "67.213.127.113", + "user_payer": "8QuLoJmbqnK6vALfEXWtrQhB2RA4RBV6XSd6gAqYUkKA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AYjwpAxk1PQ7NVazzxSxFubkKpWgaWPszmGPqxELvdfo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HSZv8MAadCzpYc5YYvrWTjTK7Pk8hkA3hUwUHJYYcYQr" + }, + "client_ip": "5.199.170.100", + "user_payer": "Wwxz6ifCzHBZwM3pRobNXW7XAwmmu99GwE1CFHS95Az", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AZ7kVpgaAbfMmEfgcJuh56jpvf8krRVnDdBwayb778Tu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "LunaowJnt875WWoqDkhHhE93SNYHa6tfFNVn1rqc57c" + }, + "client_ip": "91.237.141.128", + "user_payer": "7U5D3su2SV4ZxrJjX3UmtxFn9ypeNnPREyDtLczBmyQf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AZvHaext2vnZutW35XMuaQaqrBrmQhYst6wp6u74WHV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DTELykegBxxEn9c15GbH1zbYFr9CFd8VHQnhTGfz5JLb" + }, + "client_ip": "142.91.158.164", + "user_payer": "DTELykegBxxEn9c15GbH1zbYFr9CFd8VHQnhTGfz5JLb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AZvdu9V8PZoKMhheo4CJhpNoFw5ctUB53jP31aCbgdtc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8Nvaxzif1NrdvxNkRetjT8xJvd33EHkKVrfL8EDkgaNy" + }, + "client_ip": "185.191.117.169", + "user_payer": "6ZpyCjsfWtTXhZTd3yBNKYnTaY8WgfmCFnBTuEEnLtjh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AaGHLsxsiMBr6Jo73sAcYx3t72jQFiG3CTcajcVparff": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FyrwfMaomErzqrFUXMjCJ7mA4u81DsiDdrzC3MJD6d4j" + }, + "client_ip": "45.32.103.133", + "user_payer": "539tRUjSsrj57iqWFrYfntDbWsLeeDnmhXQJ3x32NmLk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AaXDy3fTmWcGALrxav68uumCtywwbfZH1ffesHtJgDNU": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "67.209.52.214", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Aad7Yrs1AoyjLXYETrKvjroKLQoUt7YEtzWP13LhymjL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "As9NxA9bCfhrVLAFyGeWG5X5iLYPGhU3R7nLfX3tN6am" + }, + "client_ip": "5.187.35.246", + "user_payer": "BNPmJ3SEgee44KayKKqZjG6a1zeofLdK4KHHK8nLupFD", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AbMxJxCD1LS1MTo35W2hLRhJez3FWDwp7hvRbtCQbwyS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Hhn4usDjnktbPURJHbi4YrPdKudBD5Qq35mTcaQ3Uu6" + }, + "client_ip": "77.81.119.214", + "user_payer": "DauMSHyGsWdahvKaHj15QCHVdDajejC3sX2Qkwoy3oxW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AeBGi5ATLeyYsv3sQgoxNu4scxX9sn1vJPWMx5VvgfSj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "76dE465oc8kGAQszpgCSKk6ZZSabC8JuDiuBUaqF8Ptd" + }, + "client_ip": "72.46.87.245", + "user_payer": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AfLjbyYwLrPKrMokdge9AubDd863UZTUkxYjUHKXceN5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "UMi1r5J3SagSu4HC3waB3YFzbXi82rRSScgW2e8NTfr" + }, + "client_ip": "70.40.185.181", + "user_payer": "UMiZdCdPPeqEDp2KKozxdu1u4LVfihkfxp6Gjw2NPUZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Afbspr794iQCcmViqwTRcFx1PD1nkiyoGSUnFHtV2b3h": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj" + }, + "client_ip": "109.94.97.13", + "user_payer": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AfzJSduPZjJ4Fad4DSUnRxZYCDSU9Qs5JYyB9oRrNPY1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu" + }, + "client_ip": "103.88.233.21", + "user_payer": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ah9naUt5H6bEtkX5c1e8jDXsKvmA6rqnxiSE4SoSn9zk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3DaifGfDESUzer5ggUeo6UDjqEKMkCpdNSrrvyuggHVe" + }, + "client_ip": "198.13.134.223", + "user_payer": "7g7uRUy23fghiDSRX1d48K8SjbWV3yxe9tjNYyrPHGbr", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ahqf5AmZ8aMSC91VpVakTERT3ExeKKHNNKbx89KsMumh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh" + }, + "client_ip": "83.143.83.238", + "user_payer": "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AifMzUipZ8mVWt4A2VBiU6GAqiacFhrBtN5PZBPT49Mu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4TtHDPhgxXBVUK5Aox9HeW7LkonYHJw7z3gwyPVe43Rh" + }, + "client_ip": "208.115.223.234", + "user_payer": "EEaFqAtZatV82VNVQVBBvPizxNmNxbvsvxUuvJMcDnA1", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AisFkLXvCkdNEApC7jC6n79tDe3XdoxcidstEDCTYknV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HwN6eoEe9N3kwHi66hpQDBMFPk6ASQGthWKPX5MZmisp" + }, + "client_ip": "216.238.122.97", + "user_payer": "7zXB4qbj96s9Fryk9GDrF8vNN7sce65Z6yaLTsHxjppb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AjByhiAxaEvPh5D1mgBhVEUpU6uhSaBXBqM222aLRJLH": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "64.130.37.251", + "user_payer": "J7TsyAisqTqWGDvLGZxNtGNSR93M4hq8QXmAD3qtPnFi", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AjeXtLHWR9rzYHZYyzudXVM8Nw8kFvhPK7Q3nq2TXVNn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "A9mvukTd77EbRoBX4ydSCFQHdu5bsRFkNXTTRstA8FAC" + }, + "client_ip": "57.129.36.165", + "user_payer": "B9Fuytvr8tKqH1KNF7Jk4Yk6Pvg1ciVrtmjusYbwuVv9", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AjfTfgdpSVaBtPNESe42yXcnMGkcqxeggFYsWi2FSxj1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "DeepM3FDWaAb7o53rvyZk5YvHLG3FvDiVXJLRY78z51p" + }, + "client_ip": "45.32.230.164", + "user_payer": "7LgeV5j3xZXrGEsqZ5rQYAPX9oCrt4ZuutohzFrajL6V", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AjoiAoiDxq2tZs3XBmitgKeRqXQwH2t9gekdJNYz2c8z": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HugVyttBNA9FPZfnyR6WUgh1xvNVS52kqqbGEYTGE2hv" + }, + "client_ip": "89.42.231.224", + "user_payer": "Aho3hF8mqLmadyJdUFpoGidyo3fYAt3ALm2QpAo8wMX", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ak4LunDZPHh3nqqKAbcC98fbR3arwGLf1UEFYifSuAxo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk" + }, + "client_ip": "189.1.171.3", + "user_payer": "EwJA23TUEbcC5DrdEJ8uLXZs5YVsZPTHkkPjpFvTLovC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ak4VjXL7CWrByx9PTKGyZwrnxBDDGDw6EKvHmKfCQsUM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7" + }, + "client_ip": "5.199.165.10", + "user_payer": "76dER8N3JzYozG5bmnLMMHQTdqu4PjoNm7DLQYTrFfXH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AkfQWp7uM7umi66AcygMMDE95yrEakxonk8uh16JaqAq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7zAHbRxEQaNjKnQMjFm7j8LebHSGfzsQDdm2ZpUNPa7G" + }, + "client_ip": "216.242.0.102", + "user_payer": "3i79MmNHdGB4DJHf96FBvrqEBUCKsescAc1B4FDHoQBJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Akjq7UpKvo8jUnMS7oZTWdp3bFAXpDdUb82mTcipZ12w": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FoXyHJXdQGK2eHoTjSAzHq4hzxWdJvpGgyzrtPS9eAk" + }, + "client_ip": "139.84.227.17", + "user_payer": "BtQLtvQG6aeYLGT8cyj3RLfvvS3NLgTqym3eKSFqdDMT", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AkyBWakSrurf7YG6kQwmmLYnpAkHofAZ1KmGUPtr58AX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "adramSYKBv1yHoZTub4kepcmF5LybPxwyJcsz4fpfi7" + }, + "client_ip": "102.211.135.164", + "user_payer": "5WXoo4b6TYzHdgkoXx1joFdPDjR7gc1P2aSGTnPsnwR", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "An23mfBHqRKNLhE661cJpvU9ohn3sZWGeJf4mTqnBHBE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "chopskqnudaeCTENWzUjfFCBSLcxprqbdMoCAucAwfb" + }, + "client_ip": "89.36.35.227", + "user_payer": "Ht4aCPs9WGeNq9MKRn2RLracg6NVvsNus6VRBZS7QJXC", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "An3tCZWNFHrL6K5krb4dHmmE1mQGYyn9Frpfb3xAxYCy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7" + }, + "client_ip": "5.199.165.10", + "user_payer": "AJEqByTtBPGKcDi1WiXL4ixo1LBEjPpjtmiESUgKv2fi", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AnFu7HRq6MJt133VUKQkcksrv4jpN3x1sBAiuv9dqMLJ": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "206.189.42.167", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AnUusiW9paMgbgrG71MLMRmFHyptLAh6FJtAX8fKTZbE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "skynypLvsxD8g6RpqTgG3ZXLj6xDTZL3VncQE9PBecg" + }, + "client_ip": "67.213.118.77", + "user_payer": "9nxWixzZih86YrKapEiG3AZigQBpoUX9Avn5pS1GWMqX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ap5JF6LK8prMkanyhGwhFPnkUrwozad4cN6EJkwdRQa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY" + }, + "client_ip": "189.1.171.179", + "user_payer": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Apc6bM1EuJmQexdxBQ8VCVfVZZKKbhd5dmTUmH2EoryD": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.44.82", + "user_payer": "3xS5mdbJu2U25X31dskSDHsXaWJEprtn3Yoc7Gfebs9k", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "Aq1Ax1ZsQXUds6nzvwwaeknkCL7RQJr3eDB1yp2u1R7j": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "67joanjyAoVmb9nZLyX8p3Gx9tAxzXaUgHDe3kaUH4wf" + }, + "client_ip": "89.42.231.133", + "user_payer": "4qs2U4AZsecr9K1Spnrpe2sPjNPbnUqoQn3rsjXuaq6Z", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AqBhahybKQ9DmxjNAhJX3UPX7TmyNUuBak9mCyean27d": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 247, + "accesspass_type": { + "SolanaValidator": "Crg1X8FftV44NmwfFvgREjanBQmyyS7NEu6duLU7Cyy6" + }, + "client_ip": "209.250.245.183", + "user_payer": "BJjRL2rKwV2gxNWcWkFVy2q38TRpd7bWBHEws4fvNMBF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Aqk4BQAq6h6mAVPX4FEQP9UwUw61iAXeCxatJ99L4iJf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SscQkTYV2BFQYGGffAmTzvefrFrw6z9GNYiWHstVZ77" + }, + "client_ip": "149.248.51.171", + "user_payer": "ssZbdqVceyPhupmozC8pAEWNC9T984bNBeGRr18DnDz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ArDBwBrngrcQZBdkHdWLSgr9PPjGJhKp88PXPc5MPg8j": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "208.91.110.107", + "user_payer": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ArTwJ4uvkPmukm59xWNSCCPQP9Yeeg3xEKEFo4DYjoGD": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "13.114.117.11", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "AsavepAfDc8HdtURctBxKRc4PpQwhY7hy95ywqMVsdY4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BPKAfGkkzF5u1QRjjB1nWYYbPMUCMPJe1xZPmwEMNMCT" + }, + "client_ip": "103.167.235.224", + "user_payer": "5rr1r5gBUu7cqrN9pkL5jk6gezUeW7X1hE5K4tNMMfgf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AtBYJu7ZDwtgPtd1BKqdcYVt4RNKncQv6gCkwteowsPF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw" + }, + "client_ip": "37.9.63.58", + "user_payer": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AuFAxsMpZbtHSNGmZZVspzSC6TJiMzfc97NhydYpG8hJ": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.53.57", + "user_payer": "2JBVeDgybVMy3xjGezpNZANmfXsrp99p3BZdphbEzp7F", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "Aub3SgivxKhtTuqKASHYQH46iVjXj1JyoEMPn64FT5Zd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH" + }, + "client_ip": "185.26.10.241", + "user_payer": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Av4k76fMSdtjB4Zz955gz3sofJmGvCAEbKH2WbXPTt2s": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Frdg1NUoQaaTmASWNTrtDrBU5PbTnWtUvtdCr1XPNn1c" + }, + "client_ip": "72.46.84.111", + "user_payer": "Frdg1NUoQaaTmASWNTrtDrBU5PbTnWtUvtdCr1XPNn1c", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Av5JEVCTcKQxDrTCD5psSTws16scMJbPt5M9oAXXx5eL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BCS95L5JHBWHvWkcEJBEF3BH5QHxKcPeaTgoYmHLvfFh" + }, + "client_ip": "78.138.96.207", + "user_payer": "BdEAnnbuo5xUVZau4VBXUndyJ5xB9NvPpyMGMvAriAyr", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Av9yYJe2T1M6tAeuaJHv3BaXrL4Tz8dHi5CWRM9jrNQU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "RbrWDtjaZmPV9oK3EYRTurHUKjfmSDqyt9ryWoeJkJv" + }, + "client_ip": "64.34.90.213", + "user_payer": "CADuawrj4x74ixX6nSYrkVYzqRnMLDFqh2wsFxF4scww", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AwW981QPXTWybsAX7BE8p4cz4NFhLzdfMfsdMPz5HKaT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "dmyviYNeGuX2mKAZDhGy1MVYU1UkygTrPGrsupSdF4x" + }, + "client_ip": "84.32.176.106", + "user_payer": "54UHAFkResRoePzQPjJkSgQQYtVcp8B1ri2uFXuMygcj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AxdaWkVJPVABYYQFiWMcUXosYZVDq8yVmJbLEwVpCngG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BiGcsiuFCLuiTzXoQgfLdge9sfpwr55YzdT8Kp7bCXmS" + }, + "client_ip": "64.130.42.140", + "user_payer": "BiGcsiuFCLuiTzXoQgfLdge9sfpwr55YzdT8Kp7bCXmS", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AyJsPsyks8dqPQbkucj1mNrzK9dAzneJqvPJHwK2PCME": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "63.178.8.5", + "user_payer": "EY5faWZ9t1DRqidiHbWp62p57zrZu2wMb7WcrSewPfRT", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "AyTEgpzEdi1K2UhihpyYmRqcak7rManGBRNMHKSMKRYZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "8ebFZA8NPLBZD91CwsG1HWQsa2B5Ludgdyf5Hi3sYhhs" + }, + "client_ip": "91.189.181.98", + "user_payer": "54UHAFkResRoePzQPjJkSgQQYtVcp8B1ri2uFXuMygcj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "AzAR61p2KiER5bqUvsYPnLCzVSCLCh2rvngERLQkKp6w": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GetLn5cVnufTmxKWm3FQ21a4YbyFAap75inTxYWKe6oa" + }, + "client_ip": "84.207.214.253", + "user_payer": "2jmJxNH4577eyo2EBrbV7hHTkjmKUuaQRXzK2GQkwUG5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B1CvA6tS8XwTm5cQurLYCZNMebGAgXqjmSuuvd199SUp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S" + }, + "client_ip": "189.1.171.179", + "user_payer": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B1WUsk9eBpSAucrT62VQDayt36PnR66wg2q1dTDZBtwX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BFiYkAUHR7Giv5SHNSgKexLKN4b9kJSHhfRHoLs6gVkD" + }, + "client_ip": "207.90.224.252", + "user_payer": "FLVgaCPvSGFguumN9ao188izB4K4rxSWzkHneQMtkwQJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B1kKkwGdZ67LU34SbQBSrCABXHBmJupQHMz5CEBgSQFn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8vk6QpG93JSaQCSgnycBsv5qmfQBk4qC9FjNA35E5JhU" + }, + "client_ip": "84.32.176.42", + "user_payer": "D2gnQuqG8tNVLNL52WeC9VLwfnE6zv4NF49yintVPsZc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B1p6d8toWYpUbizGKfabALgvFqGTRx3JPBrv18kdQA4f": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9" + }, + "client_ip": "45.77.102.62", + "user_payer": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B1yReHN1pPvUgXc2TpXf2F8coxRNoJouM77Fr6zfCquS": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "104.204.140.218", + "user_payer": "EY5faWZ9t1DRqidiHbWp62p57zrZu2wMb7WcrSewPfRT", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "B2dTHsF59visa2Di7qpX71Wmr2xoW9gWpBMCD1PaRv4p": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "72.46.84.49", + "user_payer": "542FDjFrHSYjybTRMv1UpBZbaTrvqct1Km3oc2uhtq3x", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B3oAGQ7QMZUhx2NmvyM8JzBNGaKtmWrqzh3vbhMUmULs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "RAuSNo4DRjo83uGhdgg4fPqYBVszi1KsrQGpqcPHK1D" + }, + "client_ip": "103.244.113.94", + "user_payer": "CYuUvZkUYdAZqzgjvk13Y6Z14hgnaD2ysiun4trmRjFu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B52dm6HoxKQQ2RuXmUgJ5NkavBGwK5mUfhEtH9LyG9er": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "Awes4Tr6TX8JDzEhCZY2QVNimT6iD1zWHzf1vNyGvpLM" + }, + "client_ip": "94.158.242.125", + "user_payer": "EDBBUovWxTSLumyUNTbrp4XyBa8mX1eRSJU1XbQtnZaK", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B6au9aShfiL1iKrK378tPWD6t472GVQ7XHvXAJSyZKHX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ppppoqHcHVzigV6SK4856BAsNxhTAi32hqQQWrziyHE" + }, + "client_ip": "64.130.56.52", + "user_payer": "D7biFzvLNfN2HCCw73rcRqNi4gDHG3rSD5cZ9uoLpk2T", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B7GF8PvKEerK3xdy7S7eHFiX8v9DaRij9zLJ2c3zph9n": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7knvB4bbqHCKuNp3ef2hJWdwqoH6WAUi55NQt6LdRfkx" + }, + "client_ip": "149.50.101.21", + "user_payer": "49MMtDQBXrTa1pkV3oiDGzkKjorqDU4MuGACaMUuHuG2", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B7qyEYRwdEEATZNqQfjXF9UdVnBBymDpt23nUU2NipFp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk" + }, + "client_ip": "102.211.135.185", + "user_payer": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B8GGpmw8zHmsc6CdHrmLh3fouPznmVbgZbWgWESJxMBV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3QDpywqKW33Mdu3i6ESsu9eBueHfaDaguhaQuChbGmuJ" + }, + "client_ip": "173.233.132.23", + "user_payer": "55iEA5LZs4iGtmuvvpdJ1tDSVTmhLZ3whM3C28XeZydu", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B8UYiP9KSuNjyt8NHfVmPsN2o2PQeee9oTpEXsuDPyXy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "E9hD3ikumJx1GVswDjnpCt6Uu4WG5mz1PDWCqdE5uhmo" + }, + "client_ip": "64.176.6.132", + "user_payer": "GUDk7YkqVHJFKMnximYS4QU4jjGW67v9291CHSk8riPy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B8eu8ngDuq11BRrbr8YHci9rxXRnVBHkahnq2p8fS4WR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "gojir4WnhS7VS1JdbnanJMzaMfr4UD7KeX1ixWAHEmw" + }, + "client_ip": "64.34.83.203", + "user_payer": "C9dTbbWEdNeVZjqbnzZKB4DxfuLqWNVnr9mdZfCqBHKQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B98YimGqhK4jUm6WxJB5ATX3VZ6iZPeMjARzd8FaUoYY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "61QB1Evn9E3noQtpJm4auFYyHSXS5FPgqKtPgwJJfEQk" + }, + "client_ip": "193.221.135.101", + "user_payer": "61QB1Evn9E3noQtpJm4auFYyHSXS5FPgqKtPgwJJfEQk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B9QkXHrMkZawipi7nvzhAKAmdp6uxQGffwFFrEKBUjnb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw" + }, + "client_ip": "5.151.82.131", + "user_payer": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "B9e8sBM9X6d78mGMMUGKTj5ixH4A9EvJ6aabv1sEC145": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y" + }, + "client_ip": "5.199.165.6", + "user_payer": "J2ibtVSFZd11ccVf6CYS7w1MeNiCjQjosDAofhZbaZ6T", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BA3ZYEMSMCiaSocdiDoRWTDkvazdKvcHaEKNmcKdAVUd": { + "account_type": "AccessPass", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.58.6", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "BACqv3MrbeFYT1uzxszRsSXbB9eRM9d2SoRJjutPmLSb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DiveRaPKviyDnQyiiMFdV4rujsCBJzMNvPjKfvGNLGvL" + }, + "client_ip": "89.42.231.135", + "user_payer": "72qy6WqtSBRHNjTvvzwzcoCAhoef41kwPL2pc2bfGCo8", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BAmD6xftz4D1Pj458572Gsvf1KZjSEXwicb3bYp6BAi7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "3DaPk6TdeGnEBwTR8fEyZSLkdayk6vZXrqGZhAgYK8BV" + }, + "client_ip": "2.57.215.75", + "user_payer": "BsS2BWy1qeFLFsbahdzH3A5Sfo7DmMQqiYMbYdi4s5yt", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BAuQ4VzLHRkxwzeDUsMX1whWgr7Yqi8GU8xkrkALz6Fa": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "207.90.225.251", + "user_payer": "9ujujQjUE1qKWddVdbcfH5UafNkHc3PBysEpmBWNXcPc", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BBASRFYKW8mFKNU4q8h4y6v9yAmubusW1UMf2QBM1eb6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV" + }, + "client_ip": "185.26.10.181", + "user_payer": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BBVt2gLQ6KGL1e4pgEBDsRyMV14FjpHTkEbrHbdBPMjb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ChB6C6dmNujAi79XtQLPKLL5SWdNLMShA7KKnrMMFF52" + }, + "client_ip": "62.197.45.149", + "user_payer": "ChB6C6dmNujAi79XtQLPKLL5SWdNLMShA7KKnrMMFF52", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BBoLscrsSgFYVyA6M9Mwqt6rK4eGRwNrZRmY398L52Ps": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5" + }, + "client_ip": "45.77.156.249", + "user_payer": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BC7ag6ax5QFgh4GeKVHpg7SrArMFG77L8mD4sH7NndhR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3Pfubj3ytkRxFAGwFb5vtacuZJUxko5Du39xie9MBXuC" + }, + "client_ip": "213.111.138.67", + "user_payer": "3Pfubj3ytkRxFAGwFb5vtacuZJUxko5Du39xie9MBXuC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BDKuHbQ5RdYDMC2ZuqNWsxC16Zb1x4N4nqztFbxRJr8e": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5dSebuEq2qRmND3SwoCXyZFhTiNryeLDSQdV3sLAzij" + }, + "client_ip": "185.191.118.4", + "user_payer": "6dCYcUDudUWvcHpCessp15rJQp7JvQV3tpELXo29zHHS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BDXFfAsckzHgfPinh1uRABXRdzxQkqvZEuq38RbRyNjY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EWARp8Syq8cTWGWHtP5LT9fKAn5GvXfSCH8LfAwpgQ6m" + }, + "client_ip": "216.128.181.161", + "user_payer": "DZphw7yYtc5dQvcCyjWFUiT5WfyrDozGy7DUptB6d1a1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BDd7KMCP6QCYxEMqGYv3vyHrJYfbA6dEJiiPPiZRgSyH": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.34.83.203", + "user_payer": "8cANkDciUpe3GiGWbGgd88bBe7DU8d5XbGj9j3HYXyoG", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BEJVSFFT4RpGZEUZDvaP6mmao2FeuuS7XqVWhemkgLDq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "idCE5k2BtTpwXdwAC7Var1enT9reut9fWECcxQP7LY7" + }, + "client_ip": "15.235.232.142", + "user_payer": "dCENvFQpGSNrrRBiioxwF1ftaXyApiEYF2e8e7tipFV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BEdYeKrW7JSmm97onvUxRDiwHKx4LPiEkEt9v3UAZuMm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6gL3uHvuUjaPp9mTBf2VZ4tpKiYhbWyPrAPboGByzEHd" + }, + "client_ip": "91.142.85.11", + "user_payer": "C2AisTvMmkECQhary9FgcxVAVmc2h1V96MKpHVWePteL", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BFyeJMoLBMVzC6vhpkQGHjLrHzU42oZQNGWdwjd3Teiv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "67joanjyAoVmb9nZLyX8p3Gx9tAxzXaUgHDe3kaUH4wf" + }, + "client_ip": "154.16.171.104", + "user_payer": "4qs2U4AZsecr9K1Spnrpe2sPjNPbnUqoQn3rsjXuaq6Z", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BGxRMYZHZgb3VNNhFqpELHmoRpvXknHjjhFmc4wtGgCR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu" + }, + "client_ip": "189.1.171.179", + "user_payer": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BHr2QqrBohCHZ3Q4TCMct7bjGpMfUBHv4Jh6taE3jSMb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC" + }, + "client_ip": "67.213.117.61", + "user_payer": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BJLRr3x7EiNtnSoezW4ekpUnUTaeWrJwtuESmFXzCCdY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh" + }, + "client_ip": "70.40.187.53", + "user_payer": "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BJp2zdxC2xFNWyrqn2jx6W9boyJdqU7ym5CGY1k1ZMtn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "4t2D4hVB5tqLYEdnWxqfTcyVp8LfgAXpvaMM2BamCteV" + }, + "client_ip": "212.83.42.92", + "user_payer": "HC6Lay8Ax3agYUCexZ8PmT9iUTwzwACo69QLppHDAUcF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BK48boUYveuES3bvcTLdMM1vEXdv3sup3rfUF7djHroh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "AdSHK6vpQnwHRSw7jXUwjMEytmhFwnynZSENhvpAxL1y" + }, + "client_ip": "140.82.32.94", + "user_payer": "HoD9f8qmxEW9jXgLawE3zdWCPLKBbGCrL9Y1q4xXWxsj", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BKF9mewuLCFVGNJLMRbWGnNLrXkj5YiCrdFmqUvkYjaU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AfZTWYoFQbzqCMmUBTD7XwxFvjob1FVyCvkaXRryxtKc" + }, + "client_ip": "207.246.84.247", + "user_payer": "FijxN29RupuP6mVeLRmfVomGHFzFGZztw8XFyn3c54i1", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BLAiQ5gfVtAX2i26vKGbfmZ5ScP7MrmUXEN41Y58zsJR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9q16BB7WGmBxf1nJTdxH5zPnBUhtHqdqXqRFjSjuM4k7" + }, + "client_ip": "5.199.172.136", + "user_payer": "E5SLYWttYhTo393ag7rt1RhbxyTDvwB6dvQA2irDhyro", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BLMg97dGYXuWytNSaqEQwns1Nzj4v79MGSJaBchHNzPR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S" + }, + "client_ip": "67.213.117.61", + "user_payer": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BLhg8whApnXNr1g23Ce59c9h27eMr5wiy2Mw7B9hW2nE": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.133.125", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "BMJcLF5QTYFHCHRV6W13TtLptjcoeiMT6ycPwpig8GXx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "StkZAmzUiaUPmg6AhytiWLoRZ1bqefJSjDsqctjCmHb" + }, + "client_ip": "64.130.32.173", + "user_payer": "StkZAmzUiaUPmg6AhytiWLoRZ1bqefJSjDsqctjCmHb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BMU97LvLS829841zHQonPvNd7YACr9fxWw8yYFh68rY1": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.134.85", + "user_payer": "dztnEoXhBWMq2oRjbZLSrCrtaL5gqLNiMKZqKhiSpjF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "BMiVGDedy9mYQbf6U3WYeXTndF84LKiTSvCEKyskCikf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "RoYFUUD7QD9aQ34UCMcwfye8dC5YvJeXz2J3mmoy5S4" + }, + "client_ip": "45.154.33.26", + "user_payer": "Dns8VXvjs1EWFouP5wexRZKhGbLqn3D5ksYcPa8ePg83", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BNG1FfYskZRk4umt2jAG2xmRubs8yGXDsA5diAFLtM4y": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EBk678aQvc3cUkfGyoehfw21JQfJXjmWuBeopYc89RSV" + }, + "client_ip": "198.13.133.120", + "user_payer": "STKEbHxS7rRMgL1NE99MqV1VjTypnUV5YmE7TqAC4JY", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BNwW9vsdyDDPpmDQUG2RDSMXDSqKLttr4BQTP42bjtFw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu" + }, + "client_ip": "160.202.131.45", + "user_payer": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BPULfxwjFVAh8ZGtF1nWSUcn4WRBaq5wX5zaJJCVGeZn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "9dH6wfdJVgnDcbCUjT8rkmejAzTnGQaFarmLfvBYXANK" + }, + "client_ip": "167.179.76.114", + "user_payer": "GTAh4uFkY5rYxDuZ54yQuBXoYdEgALHuSg3dFSKpeQuc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BPhrsz5xYGbSspqB1XRNkCj7eirjXdfH5HCmcPE5gRcp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BNtHBLo1L2vAG7PBQ6mJvWz7GqVPxBnioXsY2Gjtubrg" + }, + "client_ip": "198.13.60.122", + "user_payer": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BPkPYmaVYrik5Wpv3bL5yYB7bzWJAfjTehxeAeBHATbU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF" + }, + "client_ip": "72.46.84.111", + "user_payer": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BQ2MAgenVNLNjhuS5Jh2i5jMXcEJqp9Xupp7UM4UUuz3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "AmjX7CerZbHrU814UeBp2gJC7gANNG3KrP4c3RyD7TSD" + }, + "client_ip": "84.32.186.44", + "user_payer": "AAcHyuBz85LCHWzyZwAvTPrBDc1HTGvMpEWeEa4Fie7y", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BQvdex8GDtkV61EYZ6M6Vv4EQY9thuAZLJCioVsifPKT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4" + }, + "client_ip": "46.166.162.143", + "user_payer": "BcLni9xCFuTKHPx8psQXqsdgj6WpD7mxGwdEUP7eY2Ls", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BRAjBXg1N1qkzQfBudZNu2zh2YALExj3a8MS2dHZNYeb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "pitMDEaMmWmr7qP8HsNqarPQkd3jhZbLJibhhQnL5RG" + }, + "client_ip": "67.213.121.179", + "user_payer": "8TiBijMRkgwLrcLgxtUJjmvoWuRNeP93oadu479azkWT", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BRCwNw5zZqe3Wb7BvU7VGqTATD63kGSkGMRKdKpJozyM": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "206.223.226.183", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "BRDSVDwN851WE9NhnyyZfmSemghD8K2hGDnsy24iJBUn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BJvrWSfonXnS2Km8iA9KLY6D6vS3GcsaUwUNPFBumTca" + }, + "client_ip": "62.197.45.91", + "user_payer": "7uxordWQHvMY3a9H411HdXQ8ePrgDrTD7XHdhVf7wX1C", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BRhghjvWHnCWVyhGaEkJZbmjynBZQBzQ59h69dEtpUDm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw" + }, + "client_ip": "38.50.164.149", + "user_payer": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BRjHm7s1rN2S27HzWFQcSxDjQ7pyJMUiAmWqnMG8dfyw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ANC1u9sY36q3mi2MyVhtz71un8yLgTsFBUuyLcSPzKsk" + }, + "client_ip": "70.40.185.184", + "user_payer": "ANCZV5uL8HdUbcmj1UCn48fuEr3vzzBNp1KuUKdYjcDu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BRmu6QLS4HCox5rKDzagZHAGmGke6khbX6bYTAtX6Q8T": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "82.27.90.20", + "user_payer": "84M41mesW1fkYxSEhgHxZgRRw9yEiw3G5rcGRfPhtapj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BRoX57wTYVoBBYyFEQdM8SVYLLXtz6xHSp5yppszP3Jf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ES1M3tMZ4rMTJ3apE75cHfeGWizDTrMMXy2zKtWkd38R" + }, + "client_ip": "84.32.186.117", + "user_payer": "6HrFLiqhvjY84ZKAfWdtxG18S6x4XRjQ9bjAcdUijA9R", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BSLQGYpmUgpjYzswZChQDyBkwWAQuQXFWkETW2YJRJEz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7Zm1pE4FubFYZDyAQ5Labh3A4cxDcvve1s3WCRgEAZ84" + }, + "client_ip": "23.111.240.159", + "user_payer": "4brdwDSt2v6t4cjEqY5w3ULHhBJXDu5izPsknqhPe6c6", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BSb8xq5LWUJPAWe7fJSmTpdj1kZvYw7BT2h1vt6kPXX3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "stacheBmGG5zMKuetUevAbc4m4dLbve1VPcpSur3voH" + }, + "client_ip": "62.113.194.102", + "user_payer": "JCRtqeL2TPjXFiW9ze3T1SVxBET6BPTHMYZawRLMERTw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BSuUx6PH5JCATwGNptHKMRszRuprWvuieGsxEj7mvJQ8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HgkX21YEqBf9bGcUMLvANarCyCEyPUnoqWqDhdBjiRLz" + }, + "client_ip": "84.32.186.116", + "user_payer": "FgUWvZC4tig9cKG6x4CPWcscGsfBfXGtGcaetp4jThMg", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BTAFPUS2Bf6pGZQxcYz9iJsiNqtrf6HRne3C64rDBPJ2": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "198.13.130.141", + "user_payer": "5LK4dd3zSdtaKX4Fw54EkPLMU9Pwhv85Xx4xnfhY5ifp", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "BTCXdEJkFW6EMevEM5M6nHQFMgSh84FmxwpD85X3c1QP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "ELTHh1yMWg9azMsRXZC4st28daLJyRyRs89Wz3hP2mSV" + }, + "client_ip": "64.130.40.6", + "user_payer": "anzaeL7Lsv71HW2mew8YcKGyGqL6qNn3xoNPRrejM73", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BU9PnnGWaZHtadpLQDsYebmdqvyGm4cRLkTSdQt5swia": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4" + }, + "client_ip": "185.26.10.181", + "user_payer": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BUhTBPmfzCussGQaAQbwuYwj4j3Uga8HnJBBJnxcmMZY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "KoLibrJsbABbtmtFPc7nPvDxT81rc4UPM7mY9xSLjpo" + }, + "client_ip": "91.189.181.102", + "user_payer": "KoLibrJsbABbtmtFPc7nPvDxT81rc4UPM7mY9xSLjpo", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BUncjLkXLa1D6xGiGAE5X2RJYtdBavT48AqAKEEXzkEm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk" + }, + "client_ip": "139.84.238.57", + "user_payer": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BVZUyWoQ9nzkSt6Qq5WiiBEjGjRdzKrUzbvGuD1m5S9b": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.32.138", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "BVsgTRHvYXxLwUr4CwnHT7LU55mnzhDXNYUdnDNXCzrD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL" + }, + "client_ip": "72.46.84.111", + "user_payer": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BW6q6XkFQ2oCdt5UBd3ZQ4G7AWUHkUgtdo3fBYTY5Gtm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CrSqnc5egWcULsMs5v7zqqfHnet3U4vBnxorFanPenoK" + }, + "client_ip": "84.32.32.105", + "user_payer": "dzJx9VJrDV2zaZZKNPA9XY5kV42MAmDNXe2W9cFujFr", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BWPmJTMP2Y73Y5pf9kANgXjPuuvtufKgJEZgbCTt1UAg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DeXsDvvZzKhVux4YfDFE6p4acJLGzr8yKt5pSTjzZB8t" + }, + "client_ip": "5.199.164.218", + "user_payer": "D7BoZgf1n3knySTHQ3SzMpacf1RCAfGGwggsX6FZZDXq", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BWoHaN6HTAbzGRh1sBooR3SU4hygSrmU75ETvGZBLyor": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "RBFiUqjYuy4mupzZaU96ctXJBy23sRBRsL3KivDAsFM" + }, + "client_ip": "195.12.227.249", + "user_payer": "ALQPuG2Lxv5FZCZMoQZLqifFBagdkKAHiWG4hkxrzdJX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BXLexis8f6SmiJRWr3vgvJBHr89LniCQG2NA4t8jgfTA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FzQqaDStQQHs52YKeCnDovwSqvyZBCgs2kJcmvoFZwaS" + }, + "client_ip": "198.13.130.223", + "user_payer": "Da6xRJqXLazx2g66nnMK5afW25zDughnejvu7cr1a461", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BXPNUwc6QzTT3FkXb6BJQrFJoXu7jU9jS6KQig4muds5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CLsFr1KZVbAyz16iFpwg2e4hiekR1unpwyxfNdjBMaoE" + }, + "client_ip": "70.40.185.37", + "user_payer": "H62eyAdfLsUDzB33YobSwrivVgLCGasj4eF9ZNN33UQS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BYXUBmWtdPZ4FSTXs8TkRTTnQdyHYhArvvnJoerrte8o": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "186.233.185.50", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "BZBAZfguuwdoQzP8fnA4bDgAw7FNd4QAkmPcS3zuwNGe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ" + }, + "client_ip": "64.34.94.243", + "user_payer": "2ziQRMDYEPGoiTvxKJVbC3mfGofNQxHk4Q4SMYs9vzcD", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BZDJR4R96SqdSvTA9CfkcLxP83B8nLuuWjoWrRuQ7ukt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE" + }, + "client_ip": "185.191.118.2", + "user_payer": "9o74ofcqNgZp44dnqgWipB4zdgtnGEXfTJS26AwFP4aS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BZWocP1zLK28UiXdbMYH7297R3y8qpzqwwKd3h8du5jX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "81KFsTrzo6iFaA6otL3nJueok3YiBVyCwwiyAFEEKXcR" + }, + "client_ip": "185.191.117.70", + "user_payer": "BLvUbmRVZGLzRTVE1DZL4LFdmCGytuizxStwtyhE3Pii", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BZjCTvmsvzHdJEpbbkS1oSvd84fHktuLV8Wa6tqqDB39": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CoRVUS4A3Rq7GytMuUmGM4toDo7pryXPAjV5Fa5S8qhP" + }, + "client_ip": "86.105.224.13", + "user_payer": "AZbG7q9dLpMBFF5BXmQmsm2GCBGf3zrMpyhmTeYk6Rww", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BZqqsYwwrkKRJrXEakpjTTyyKK4Bw5JJaSPjMp7ZFs1x": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "49j9bnkdgVNxLwsZ9h88sPR5MYEmsUyKrrJ6ZW8ijBrb" + }, + "client_ip": "45.32.145.163", + "user_payer": "FzU8ZJmbiEvkCaSgZcT5UKwZqH73Gr1dozmmaeRoxgJn", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BbN3k3VtC9bvKndrKj8DrRSYCkEUockAzX1VNnyAgNZN": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.32.138.111", + "user_payer": "FV8WkqSNanBf1FBMbuL1KGEwyzxR7BcCMVsA6Nuxe3Rs", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BcRNQf5z98W22yZa1Yg9BjaAEqBw6AwNPFbw1QRSRMZ5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "2zykwzzo1pd3H2oSj5j5SRLTvmpa9Nr2S2Bh8tTVd5Tq" + }, + "client_ip": "64.176.50.130", + "user_payer": "4xPk1pHXPhDcyNCT6Ze2cHq8pWV96pKhxRKpy48q6Npv", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BcW2pYqokj8PY44kghKB85mexHHe1e8bCbDSo1omuqt2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2gDeeRa3mwPPtw1CMWPkEhRWo9v5izNBBfEXanr8uibX" + }, + "client_ip": "109.74.144.98", + "user_payer": "ActdAKrRbwAADw7D1NQXuZ5Zm9jfP1AJ5kSj4ToLa9yy", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BcmoBcE3o7GBY3oGhADeosvK4sZM7wi2usmFHiAZoQC6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "UMi1r5J3SagSu4HC3waB3YFzbXi82rRSScgW2e8NTfr" + }, + "client_ip": "64.130.61.80", + "user_payer": "UMiZdCdPPeqEDp2KKozxdu1u4LVfihkfxp6Gjw2NPUZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Bdw6f4JNQ1664Z8z6RMgAcDVQxcfKcVx6LAoXjDUE5bQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "DniNcqixGGBS3PeHk3jXUXbeMemM15rdrDmSxe1p9Bho" + }, + "client_ip": "46.29.74.117", + "user_payer": "4SBNw6R5swH6QoeNs7x2VtAZ3xCCtqgptPD1qmyWkVNs", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BejKkRKDUG8eRmXcxptkBY2LTaohDrWvkcotYgsDLvQ7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ" + }, + "client_ip": "72.46.84.111", + "user_payer": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BfmYrvmSpCJiK4rVBWpHifhvbdFba7FPmCpWjpyPN3p8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5EAS8ZGdsXnNbbithK8Ej8GbuscgM9z9ZvDiT2kFZipo" + }, + "client_ip": "62.113.193.220", + "user_payer": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BgBcJPHXJ6PJky68E1J2DhNPAAAyfMn92pVMBhYHbKiL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q" + }, + "client_ip": "62.113.194.103", + "user_payer": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BgXVEisDPhhQMTvhFVcjhz62gP4aYgYSqCCgvphY75Ps": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5ghoFEVrsXeAPB6SUmBpZ2xq3KvHEjNMeSaBnxEBXkHV" + }, + "client_ip": "5.199.165.35", + "user_payer": "sEmKhLb1jfzajh6zqgs3ngYf8F7ovxzmgQL7oLnYv6v", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BgdF9PTdwT55Z5RKp1DuJG3FJitPUHysQtFJBYRoHWYh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU" + }, + "client_ip": "5.199.164.126", + "user_payer": "GWGHaRxKTHhQMkiEocBzdaD82Ds2X9kRcGrUosK8TyDB", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Bgg5g69PpsWUbUuPhttqHUYUFSUEL8fkKTN9ynBCFphu": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.134.27", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "BgwBthKtVneQXu1GiDVWrEY6YkTgPBDMsbnfiHJNKh4z": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.63.107", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Bgwer1m2B282ZfUXzsv9gGUex7Ugcx4diSH1kWV1bqt4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2" + }, + "client_ip": "103.14.27.11", + "user_payer": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BhqaWzyMNL24MfvSqufZ5jfGPBtrUdmqjFh6Rin3gxpL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "8yjHdsCgx3bp2zEwGiWSMgwpFaCSzfYAHT1vk7KJBqhN" + }, + "client_ip": "104.204.142.92", + "user_payer": "8yjHdsCgx3bp2zEwGiWSMgwpFaCSzfYAHT1vk7KJBqhN", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Bi3dG6R5c1on5uYPxKQUhpqepFZSKbg9Ar1CaHF1BAje": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DE27y8aLa1JtNorH5bURwLzdLnCT15dwC4JpwPqbzoa7" + }, + "client_ip": "38.88.64.94", + "user_payer": "5g3BW7oeoEiXJtSZWYJLFdE11JX1BX43mLDPrV2fzrpa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BkGeQp2L7QrUSJf1DfReE2LuS5NqDXw6fPEAJYKhDSpD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "SLNDCSGTEsA6KHpgR32MBt9UAurZnVSJGUtW2tRpdU2" + }, + "client_ip": "108.171.214.242", + "user_payer": "8TgTyigqnjE6La8oepMkNtedfEVNa22SqMo5Ge9MVf7K", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BkqE4fVYcjxvoizLAsEDGhuN6rme9PBDircEJLY5gdoD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd" + }, + "client_ip": "72.46.84.111", + "user_payer": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BmYpSAe2E8VYBhy4tDX3VCXEgPuBrRJo3pScLjavWvQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "LA1NEzryoih6CQW3gwQqJQffK2mKgnXcjSQZSRpM3wc" + }, + "client_ip": "64.130.42.164", + "user_payer": "3Gjc9xDUYWnjEDTBenDizYZGoXZtPVvEiJdcZMuiEwud", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BnMSfqpP96mCbmd3P7eBe7XTQ6eLsHnJZwdnHuvkBBtN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "8vk6QpG93JSaQCSgnycBsv5qmfQBk4qC9FjNA35E5JhU" + }, + "client_ip": "84.32.103.29", + "user_payer": "D2gnQuqG8tNVLNL52WeC9VLwfnE6zv4NF49yintVPsZc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Bo6oVruUhJfqa9nQtBhYDb5g5UWhk6bXEoSc8GFN4qa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "D3VP2JY1wXmNJB7JbcBFjru9VzHRY8uFSYGJpgoXvZmG" + }, + "client_ip": "62.113.194.221", + "user_payer": "3MfHwZkChspbJz3SNBDqcJCGU2Vf3U3JGjbjjj97vVox", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BpYcBEtJTDhirubgPbCFkMGto5Jb6S9Ey8xjRt8AESCu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2N7v8pDKDYhtBUJBQUgxvysUjgM9s4ULPCmeEiPWTf6Z" + }, + "client_ip": "149.28.246.159", + "user_payer": "AYyHfyXKsyFDndGxBLJmMRLNFVpTBc2KZC6j6wWDYQk5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BpcCa2E8WMQXmk5Vwb7KHPqXHexbM9hH8ZH4Sei5znow": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "YuRBAsy9Stw1u46A8dMp7WQVBFweLP1PKuYibzYAMmQ" + }, + "client_ip": "103.167.235.182", + "user_payer": "dbzB9po4W4nRHtpHKFScUonqRJFVWgLaTGCuG3WZCpt", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BpcRARKm6nnwapLmXtFjKRiMQdwPs2fndrZZ1RJwMNLK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY" + }, + "client_ip": "103.14.27.11", + "user_payer": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BppjkLqujBRwo2ViKctTH6JAW5Ev8xZpUAEWAufm2NBt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "THWsLPufeq9LWs2H9vYPbtFwdxAHbQHvSbT6pztG8x1" + }, + "client_ip": "185.234.13.20", + "user_payer": "6uayBceaFssKHAhLiA3EBhFzqinGKQ5T66RGSopGM5FN", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BqRWdJL3TnnBRXTC56ErU9pmeTpoXBhKqyHGHk2dsGFY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4GpHsK4ExBFQNt1jvNbk8hdF9EBm6medNjfHw7g2EazZ" + }, + "client_ip": "206.223.224.49", + "user_payer": "CADuawrj4x74ixX6nSYrkVYzqRnMLDFqh2wsFxF4scww", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Br2dcffyA8J4WfAx5vsX2fdESpojXzbZUVNj3cJbjH8E": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu" + }, + "client_ip": "162.43.190.147", + "user_payer": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BrZpXYtf9Dx7m1WuwucCcSt3kznJEdzhjTDkDuALC1Ro": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "MBVyz9s72WSfUmbr1S8fgHjDJQkPs1Q4Wxi6A2Mees9" + }, + "client_ip": "84.32.186.146", + "user_payer": "4zXizCocUV8ty8Ucv1qsLgzafv4sbk9aYjYyH69W8rAi", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Bremjk2sPCbQBkPspiDDqgFYDWttrMRUqDBR9qqK4FiG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "HNFk5BU6i45rQeiVvNQThvrnLVyBDMy85pFUhLso1wo7" + }, + "client_ip": "173.231.44.202", + "user_payer": "9UF7Jm92TjcbiAeKaog33mZ3stuynpQz3VQ2Ejkeok9C", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BsCSdjjvgPjZCSvhaVE3ek2HGSe797iPyH8Gp33esaWN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7RRFDM57y7JphnVyVYHFP5ys3FwL7AWQSsrGAM7KrT5x" + }, + "client_ip": "2.57.215.102", + "user_payer": "DZphw7yYtc5dQvcCyjWFUiT5WfyrDozGy7DUptB6d1a1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BsPscQrqmDkE8XfEkNuotxnH28yodntiyqrw2Q91DaDj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5marvipGzf98hxnoJFXsZbGHSXcEQ3yRGJ4ps7D3V4ou" + }, + "client_ip": "216.238.116.244", + "user_payer": "6wUHddXwjPfCCLuXChAq7FhhfjzQhWDu9XVh5saYAeKU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Bva4RDi9m99FUXd1NMUmbsT3NZThqy3UQAwPybxJeXFP": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.46.76", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "Bw1aouv1JaFyyicZtzsUC6fLLmtcb1pYXpuw61cj4LPc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CBZAzvNytu6R31Kqx5SXfNkNmooTaFpCD3tpeg13S25S" + }, + "client_ip": "162.19.222.23", + "user_payer": "EMtZGXt7As3kJgXFSMnWVWWzSh9yCb3s33WKXdQ2rwrC", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BwDFUgCdwSSC2PGj281Bd2HkPTeiRBZYA2wEVuRu3kUz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9ugjkWWrwN26PdbYHPjCJFTYSg6xpi6CFrs8sMUoeTUX" + }, + "client_ip": "104.194.8.161", + "user_payer": "EVAsrVQgWCVQXHKAVNsHi41TbxFbdfyusM8AFUjdU8JW", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Bwi5DBH9WKtooM8TDCNvcthgv3aNt48cbuCaCJfAHUyo": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.136.186", + "user_payer": "dztuVuFYWG1tyS9V65aHYBCyBqiK2Ss3VHmZzhUCHWM", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "BwukF7vQHVmQDQquxf5ZfwT8yvbSGLHnFkCqQqjWUgSE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL" + }, + "client_ip": "67.213.117.51", + "user_payer": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BxFAq61U6oq7zczt3NBdQsquE1HZ87rhN5tsdnLLrfqq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dmyQrYKDz9LKLV99MQrJ9BQsFfqQMDV4iYau1mzC4Ue" + }, + "client_ip": "67.209.52.133", + "user_payer": "54UHAFkResRoePzQPjJkSgQQYtVcp8B1ri2uFXuMygcj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ByEp5yaipmnJxRpwXyDfMZsFJjsqyFcJD7Z22J5QfnLA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CpNnGGhgVATJAbzHUXdrcGfpPiGuZyPka4QUmH7YgavX" + }, + "client_ip": "216.18.205.162", + "user_payer": "CpNnGGhgVATJAbzHUXdrcGfpPiGuZyPka4QUmH7YgavX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ByVodg65rrVzABrM9zMRvMQj5LUtRrSYzobWZGNXYUDj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "adramSYKBv1yHoZTub4kepcmF5LybPxwyJcsz4fpfi7" + }, + "client_ip": "216.158.77.26", + "user_payer": "7S4quwf8rQVvJHF7zguqcGf5BTFxnVYg86G1SKTpLfPw", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Byh2NhzTArhVJpc612CYhtqLhPauEwfcxoH4cwQHUBxe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i" + }, + "client_ip": "189.1.171.179", + "user_payer": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ByykTgvzB574F51pwnLqnWfrNRruUW8PQd8Ake4o3qtp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EN5F2BU5juUEWr9zRNNqKuQMi9zBUY1YLPHV5EyMrvnW" + }, + "client_ip": "67.213.117.35", + "user_payer": "EN5F2BU5juUEWr9zRNNqKuQMi9zBUY1YLPHV5EyMrvnW", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "BzVeweFZL8sA2yr8src2qW5C3jkNR3jJUdQYPsfhnMnZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "FjYEr2UCeFzNfAKiFrbhG34Zv8LxbmfHYAFhAfc7SLQL" + }, + "client_ip": "185.169.79.114", + "user_payer": "DZETFp32xdxwtzY31TCrMaSvVmqG9Hp6DqQ8z36Qoj9U", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C12nQDq16N5piei3atwDptrZ3FGHsiQnGwkCKDGxay5V": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3tzpLMWRkWucvTRWU5PjgKzN1iwJuV69yCCjmuuo4gTk" + }, + "client_ip": "64.130.52.146", + "user_payer": "BNB43YGo1H6uRaGXcQaC3qGuYW2shKwyUr9Ag7qMyoK8", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C1wTwbc6GHXniGUJLd3u7GnH76LmX6zvmvXVWkgrjafk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AmjX7CerZbHrU814UeBp2gJC7gANNG3KrP4c3RyD7TSD" + }, + "client_ip": "84.32.186.44", + "user_payer": "8MP9p5yLmbXB5mmVVXy5BKW9bSkKbRk6bMHmsskDpg6X", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C21A5J9kgxru25jodFFVa2BqrA2smXnMSpcD7uB5H6Z8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GkFT5nmcFVmJiLwuE98PjdF3LReMeq4WbejFHfwrnsgw" + }, + "client_ip": "23.111.240.147", + "user_payer": "9euQu6m4FDyrEDXSghHA5Kxd6txwQCYmS1Qn23zNpZst", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C43YqsN9mvQPHDMt2wt2G9TafWSGUGKLPeMv4WkjJYkw": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "104.204.140.11", + "user_payer": "AURAXd1nDoqtUDnjTFeedapcbSTid5XYhYpm2hhN6wd9", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C62Gyd9iy2G23DhEz3rt5YG9ZuuNyv53XaJSMH1VwmsS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "E4odJgV9t72tXLTF8VeY2fweHRwaQYieyVND6r3apsSj" + }, + "client_ip": "198.13.130.131", + "user_payer": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C88ChURPPVogYBok2XGh5RqWCtbdhtLqbgY4mrXqYVxg": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.138.246", + "user_payer": "LUZU146NS945XWExskbfvFvSuqxnJpRy51SAZUAff4c", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C8Q5w2keRsL5Y6E21Wnp58D4ps38iieKqeAQAhPxFNjD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj" + }, + "client_ip": "67.213.127.33", + "user_payer": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C8a555JzAZVLxQ7bHo2Uy1XiTa3s4WGvXT48CJUYwwjZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "9FXD1NXrK6xFU8i4gLAgjj2iMEWTqJhSuQN8tQuDfm2e" + }, + "client_ip": "185.32.162.87", + "user_payer": "AW19VNt5ySbQVXRnQ6KC9UaWZYF5Gph7WQeXEV4snYs1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C8gQjBDCRAXZapAmDa9YF9x4WVMihzzAiUSkiL1QJ3Ae": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "177.54.159.17", + "user_payer": "DZn2BJoE8NWd86p427wVYbkoyXPqoL7v5UHr68P5XvaK", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C8h62XifYXVbCEy6Ub7DTTU2AgoYjwNQDWx36hRRdygx": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "160.202.128.207", + "user_payer": "GcuhoPPxzdysaDGZ52ybYdof2vGYZfbH2yrLpm83HmCQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C8oApcBeR8ua7Ba91RFWMySqwn8JTjdqb13CjzL4NfgM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty" + }, + "client_ip": "64.130.44.106", + "user_payer": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C95x6717FdtYYuS6XBBqiTht215X78zCkmVzeUzitWMc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW" + }, + "client_ip": "160.202.131.45", + "user_payer": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "C9PUz7oQ2xApDYKYxayR7uUaWzuBrzLnDE8agMRqroTG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "AreCFzbUi8XMYFckUZU2NeFgL56AUXoLNomCGYBttuCn" + }, + "client_ip": "84.32.103.25", + "user_payer": "EBKY6mSeuSVy4dE9fTNDtM71mi8PYJpDq3Qx8neDYnz3", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CBM1Yi3ui6EJ4A1LS6CuHwkRSiPBWezbR6wdEhviepSQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "THE1CosYJD9F1eBq53Fg4MZYZa5WrPUf2RQU5ZHnfEj" + }, + "client_ip": "141.98.217.186", + "user_payer": "THEZtHf3GrUrjQCccu975jMjJ4sWJwTUCNayx2h18HW", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CBtvBtDaEMwV5bnukXx18dxcWmwfW2NpsrQ2Pgj97VGk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "stacheBmGG5zMKuetUevAbc4m4dLbve1VPcpSur3voH" + }, + "client_ip": "139.84.238.57", + "user_payer": "stacheBmGG5zMKuetUevAbc4m4dLbve1VPcpSur3voH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CD3kdimwbq8pvZ3GAX1ReL17JsmERbkpdE8rXS277Vmq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S" + }, + "client_ip": "72.46.84.111", + "user_payer": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CDZxEXpwWD6aB3WzyVb7awNHEgiqLDJgZcjUVdafkmg5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DTELykegBxxEn9c15GbH1zbYFr9CFd8VHQnhTGfz5JLb" + }, + "client_ip": "103.88.232.113", + "user_payer": "DTELykegBxxEn9c15GbH1zbYFr9CFd8VHQnhTGfz5JLb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CDgXdGMaZWWdDndjD69GnbUT6ogQj8uT26of95cpv7wB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf" + }, + "client_ip": "103.28.89.173", + "user_payer": "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CE4BnbB1bf7ChbHW3MmzgsBwd5SMibqPu6dNRsefqbPe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CtvdyHYt8cMuGVHFarV2RADfoCdnrbd8e9jAsB225uMW" + }, + "client_ip": "193.29.182.9", + "user_payer": "CjjwfyfjkoXew2KYkGHJkAuurA5cGaHi8V5LtrPdZ5Ti", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CERoddAuGhJKWpfa7G1ziaou9Axrgoiiaz6Q6vnKQniY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN" + }, + "client_ip": "185.26.10.181", + "user_payer": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CEhQBGKSVh5r1yeaBJLxvrZiPfARj4rk6jkEUUNg91Mp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "BRAZAtTTzR2Es8c98hJvcngerTEyRGSdgkHU59n4A6GT" + }, + "client_ip": "103.88.233.109", + "user_payer": "968LM3uBH43SN8EsrRnncdTWrTNU6XqGRDBcgTKERFVc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CEsbzjhKXCcsN5K6k1FRDZsMZ3nRq63PbeGd1TQz8bSi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "FwnWx7x99rGwLmipzz8ii15NqcHkKRo2oS1Y7j6LivgZ" + }, + "client_ip": "64.130.42.39", + "user_payer": "Dug99hFphzxrrA3GhS8U1Wxajz1QKaqszJU4PJEAwPDU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CFvC6vHVidA9vo9x774hMtN1pfapedBc1E7wX1YAADfc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "HrWYa5vKZrcDbQWE39SGYwyzYcbsmXfBiHJGxpasymm" + }, + "client_ip": "64.130.32.232", + "user_payer": "9isnTzXzz7odTak6UuSRjBXeaN8Hpw8DRtLDi3J2ukuU", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CGVpCF4cx4T8tB3dRa1t8JsBF9niozFaEjKqVN2Lg5C": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3PRBpKEfV2uMbCpxnrUR15cXV28NxpEY37zpSVYuCUTi" + }, + "client_ip": "216.18.205.52", + "user_payer": "2BYpEke9hJ5cUtPMx1mj1xdcyhNbmKPZcD4REcwgstcb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CH6o1wghrTtifjRxeCt9aP87eXkVKZRkTLEtGDVeQXkY": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.48.56", + "user_payer": "HFF3kp34qnL32vzc5f8nrffTAtudBetaLm4u8da6q5TP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CJJnUaa2YDvgkKfNcrPaxzQeh2c6vrFsL3JPAhKWzB4y": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "SwaP7ZYdExJ4kBdT4oaZkuL2ZwgDNMepuY1B7Ku6TFv" + }, + "client_ip": "104.204.140.222", + "user_payer": "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CKEL6jFe7TLbM1KBpQnanVmXU2MEzZmHNQNWpkx5kTVA": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "209.97.131.48", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "CLTcPQi33Xgv62DAe228U7fc2bb4nNsSjyBd4wV6E1mV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DrifTrN923QaouP89UxkQzFGbumKPCnfkNYQRwmZxatz" + }, + "client_ip": "64.130.43.227", + "user_payer": "CPST1r81CWZYFz2Ztc69Y2JKtSXgzCTFydTcpkBoKfUt", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CLudHxZjJv8Tz7M9Quk22rJKvi2pbV8CJBU9iwcpDX6M": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "VALiDcyCpujxjJAZDK2av2TpMAigpSodzj2ApqgR4e6" + }, + "client_ip": "151.123.174.34", + "user_payer": "VALiDcyCpujxjJAZDK2av2TpMAigpSodzj2ApqgR4e6", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CMvmHGwH4oDcaCXkh7pr6aqT4qyxqKHxnP8iS82KqoCP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6NDen7aDi65apHo8m1Vea4nuS6LyjQeM6pDNqcW4Q5Pg" + }, + "client_ip": "45.84.193.3", + "user_payer": "6z5qbssHvATWR5rS1dUU8EFjo4kRnGUf7MxQpetRQM8y", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CMxWZjwsfUmCWwv63w3BZzA2DdAcJukP3p5XoYeKZH1A": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "PAWsME7oYbjt5TRNc11mBa33JhKnQr9AYherdr9YAZ6" + }, + "client_ip": "86.105.224.150", + "user_payer": "7ZQPv6r1NVv9mwgMPyo6vMzqE26wHwYW8XHtdtFLkFDe", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CNPLtgDxZhd34o72PgtcwcXBfgGfXNDsnq1ozEVTfUJk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "pitMDEaMmWmr7qP8HsNqarPQkd3jhZbLJibhhQnL5RG" + }, + "client_ip": "86.105.224.6", + "user_payer": "8TiBijMRkgwLrcLgxtUJjmvoWuRNeP93oadu479azkWT", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CNTVgsQxKDrRJV9KMhLYYtfwwd543A93Sn9qCqPHYWt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "MBVyz9s72WSfUmbr1S8fgHjDJQkPs1Q4Wxi6A2Mees9" + }, + "client_ip": "84.32.186.146", + "user_payer": "bau8Wx5PBf1H4cGhsQehD8V5Vy7mRHdpXr5xoVjJbzi", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CNmRkt1ibqWrU6rVbxfpYzvR99gTHasZF3pxqRA32ELN": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "129.212.182.185", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CNz6bftCaQvHyB3X7AMQsFRaAjTMR5fpQBsCf3YwM3uL": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.52.139", + "user_payer": "dztJSiVgnkD1t7rDuXWuNiGDuvgRTuX2Fy2SkhL3EZ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CPFV9v2jLkPVQD6KyYEkWNQ5MJpEV9yNhx1eRteHHcut": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "nymsHergYedT9CJMgtGMvqXUTGcbs5o3MiWTJUbqTGY" + }, + "client_ip": "64.130.43.215", + "user_payer": "nymsHergYedT9CJMgtGMvqXUTGcbs5o3MiWTJUbqTGY", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CPyKKnRKhdds1UwFHsgpRxarLFhcLtfyAQFAUNDE1EsQ": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "146.190.30.251", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "CQ8pjbxvnTJpSngEWANrenjFZU27A5nomPBhrJNwSfxH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "mD1afZhSisoXfJLT8nYwSFANqjr1KPoDUEpYTEfFX1e" + }, + "client_ip": "64.34.94.205", + "user_payer": "7b5VyivVaadtMkFDbqFVPm3NWywNFueVfoAzt3YMCoJB", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CRYKv7xGGy2uafhPsrxMMFfySUiycBGZq75gG6Kk8sv4": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.130.138", + "user_payer": "6FW7Uf2CVV2n3RGZfMgyapzKHLN2w24Axk9xDd22zHtp", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CRiuCK4bjpMjZP3tfCBgsYG5yMCEMySH3Kis44kumWnS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Fy7RCjDdFLG8wLn7TBKbccaKwYX1FetdSoVDREdUHf5o" + }, + "client_ip": "65.20.98.10", + "user_payer": "C6AMt2f625JUfgL2CMFjVBMcGMep9ufzydi4ZBbqWnB3", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CSsQbGCryegfMXVy86DxiGTdRmWPSd4q1SDBkwvCPtWD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4uH4G6YiD5G8rU3mtPg73C2Uqamrqedy3FboTZcZrh6x" + }, + "client_ip": "139.84.227.71", + "user_payer": "GfjCQeGwF78UXo3YoJJrAEQwrcf9z8rkvV2Aejwzrdgr", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CTcYvtUKHo1D6msgx3gnoMbqEJhJDmApCzVvvpwTTyjL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD" + }, + "client_ip": "103.14.27.47", + "user_payer": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CTx6PATn1n3DowJiuapZeWatzYuUi5j3v18LVC1YdQ7g": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HEL1USMZKAL2odpNBj2oCjffnFGaYwmbGmyewGv1e2TU" + }, + "client_ip": "64.130.57.131", + "user_payer": "DDB4XQGCCMdPQygsq6kPDz7VdTEWe1APfarNuGS9c8e5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CUFd1LC1ZhCVY6c113MehiDJKmdukPYihQV962r3LVgq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DnQBmTJyLbBMgJYQLJDqJz25AJModNkyexL5LdVRGnG4" + }, + "client_ip": "84.32.186.145", + "user_payer": "9yX8hp1zHqJJEx2RZhXgB5ggR8iHL6NJiJjW12mKSXaF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CUWNQEArRcwWNHxESfGPxBip3vzcctkjHpURvNGyhX6W": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "198.13.130.85", + "user_payer": "EXSUyN5WT4E7X3hd1yz34LecA2iYEdL4HJeXvkhEf65g", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CV8MoHbS4h8imenx9kbAxCKcXGXE2yvmu729EvFNijxB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FugJZepeGfh1Ruunhep19JC4F3Hr2FL3oKUMezoK8ajp" + }, + "client_ip": "208.91.110.41", + "user_payer": "FugJZepeGfh1Ruunhep19JC4F3Hr2FL3oKUMezoK8ajp", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CVU2MqAawzdnoeNQGqGBnmFjMKx7hyHuV4eH8eJhQZNN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5marvipGzf98hxnoJFXsZbGHSXcEQ3yRGJ4ps7D3V4ou" + }, + "client_ip": "216.238.117.204", + "user_payer": "6wUHddXwjPfCCLuXChAq7FhhfjzQhWDu9XVh5saYAeKU", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CWDazKXsYeAkbeNPNfPR3Bg9NAwkEU2sz4x1AXXWQYQc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC" + }, + "client_ip": "67.213.113.83", + "user_payer": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CWgEqwSNA21DXLKBdCsxJXveu1QEmnPAPvBJ2rLyzTaH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "PAWsME7oYbjt5TRNc11mBa33JhKnQr9AYherdr9YAZ6" + }, + "client_ip": "64.34.83.7", + "user_payer": "BykbUwDn8pWtBUVrAr6ZJjRGRRgekmFEthNfoFUTh8JG", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CWoapDHApv1v7jzxvzmBqXUzttUDBhELhFQcBU2hFfT2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6c6RrC9TWNgiVXnbZ6hehNuhyh81pZK1yAj5w2nXZTwi" + }, + "client_ip": "216.238.118.132", + "user_payer": "ARx33747AK12mbKQ8rnpFkC9xKnizNVNjL8x57Ki4jYc", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CWpYg3xFJypdM3TVUSb2Nanc2TGbQzHmbUbhZLDUUAWz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu" + }, + "client_ip": "72.46.84.111", + "user_payer": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CWqGewDLJJSQF59XzShzqSSdcpZ9hzMnVUfJemx9TVRZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "gangtCrQg5RmKf5yxvhvZThPugPX58pDSdQ5UuS26vN" + }, + "client_ip": "64.130.41.140", + "user_payer": "gangtCrQg5RmKf5yxvhvZThPugPX58pDSdQ5UuS26vN", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CX3cxoy3u8e1JnLDrYR4dp11PsyyMHb2S7BDgjU7HqaD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL" + }, + "client_ip": "67.213.113.83", + "user_payer": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CZKf2FXsUHd28EcD1StVkfio75foRi858j6axBpNbZQ9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CZanBzZHFzrGY5qKzaX3CNhJ5smHEMTWFFnoeUi4J6dr" + }, + "client_ip": "85.195.100.131", + "user_payer": "Fkhd6WwaLAYGMTpGs1kX7ECQmuQ7Uj3ScurCDtzLBYRA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CZR93xgsynxQutAvrKhyphvMyLzWHMBiLSjyw5eTosPa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "sWyfZaozxeyvPkS6HK6xrDFmBFUwRmmjVtPPffawZWR" + }, + "client_ip": "91.199.149.203", + "user_payer": "C2AisTvMmkECQhary9FgcxVAVmc2h1V96MKpHVWePteL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ca8ahMgksshQuFNyPLtqAthdeqY9B1yrNLsr6CXZ1JDt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "dmyrxABzhyCFdSjP66KcXxh4YVVr9wL8i25bNDSWSuY" + }, + "client_ip": "83.143.84.202", + "user_payer": "dzmTjnSdbPhsVPFcJVsnr6DvkrmUkrvzhXLqxHXPwoU", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CadEH5vNhRXwfb37VhjnexCRNRkDfW6Q93yYv2A3BZTV": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "162.19.222.252", + "user_payer": "CuqNevaiCZLpWDNYEidcDHoR8oeXRY9Yb69MWGyuMW5c", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CbVaGW8XxirW4kK4WQ1cY4x4vLFx7zXU6tNd9cvzjLVT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6aMM9r8VupvDDJ25W7dcDKgBgD6oWLZzmQcuQSM3a9kZ" + }, + "client_ip": "204.15.241.13", + "user_payer": "5g3BW7oeoEiXJtSZWYJLFdE11JX1BX43mLDPrV2fzrpa", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CbmgAhgKLPgdbV6fDAFnEc5t78wQzTL7M4vpAfegLDks": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DKywukV86Jko7EB4pqVf3ZWtW1mw9P517maSAG28frJU" + }, + "client_ip": "146.0.229.229", + "user_payer": "CCohvGjRYik8Kp9JSm5qVLk5MDPpoEJJo1ERWvaerxCF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "Cc1RhJedVwNgidw4fNjZe3ztN7x8bjLkdKqu2GQgrp7p": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "CtvdyHYt8cMuGVHFarV2RADfoCdnrbd8e9jAsB225uMW" + }, + "client_ip": "45.76.159.29", + "user_payer": "CjjwfyfjkoXew2KYkGHJkAuurA5cGaHi8V5LtrPdZ5Ti", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Cc2wuv6CKDodk1Wp3jGPDDsJzdV11SGV8K5oJdvF76Zb": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "67.213.121.129", + "user_payer": "D7JAU1kkKJvKCBDNpUvqHyx6AXfYpSKzr6AHBZ5uHSYF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CcQSuGthKRtELhguKVCx7oqicBdUmpmNYxT1tBuSWAFa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BiZ1eK8hrjQajFvrrNYT5jMDdWnLxyKkdTqQGvYkUSYM" + }, + "client_ip": "104.243.33.35", + "user_payer": "A7nii4QwFSUaz8zCbiy1xFaapnJTYxLLVVWj9TvaFYC4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CcgrKcrdMchFpPQ1SqCHV9VhrCTTC6tzRohwS8TgCys9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu" + }, + "client_ip": "102.211.135.162", + "user_payer": "6ERi1d3xL1PofYUKC5d8tLZvPz3qnaw88euQqkvFy2xk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CdAKiDX9iYLy9JqerSFcMeXNu2BathcRbztfMJwB2mQ5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD" + }, + "client_ip": "177.54.154.225", + "user_payer": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CeF3uM1rFxxHDawBrpWdjAWF3a98DbSff6WTgQ7Sn5UT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "orbit1bWKxnECKLqjhm5rybTiEC2GEYbecyebgEfM5q" + }, + "client_ip": "2.57.215.183", + "user_payer": "HqjQYyz6eK7wrpGnVuoCNxAzu41J3GmcAj3X6G5gJAPm", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CeSoU1fSV3sdURqu6KAVFgDPjziusEYjFtYc6ZQLUumt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "89kGiSeYDLo2iWY2nFk8zNbZNFasPqF5Hy8eYXGaJJTe" + }, + "client_ip": "165.140.84.150", + "user_payer": "7NCw54YgSSfNh6FMvDrnnXZQkCs8VQbSAy3MnfFhA7EW", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CeXSMWAZQrPhPVj9xDPp8aLbS1JSrdTLhaLxZ1ZApx2o": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe" + }, + "client_ip": "69.67.148.127", + "user_payer": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CebHZsSqnjBwYJZcfEpep31TZENXCumjNSYpmyopkF72": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "7knvB4bbqHCKuNp3ef2hJWdwqoH6WAUi55NQt6LdRfkx" + }, + "client_ip": "154.47.145.50", + "user_payer": "49MMtDQBXrTa1pkV3oiDGzkKjorqDU4MuGACaMUuHuG2", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Cfa7yVRF563qA61YX38x82mCsfBSL3YFP61bn6tiHrpN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "GvTwyQnoYLCV2qANCyVYyKEzZ6Q9FzZwfmNCMSZn7xbb" + }, + "client_ip": "45.77.64.138", + "user_payer": "Fr8yndbYqLrjayohTJBeeUK3V161XUdU5fH43cRyv5uA", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CgRTeNpUr1GsNGxE7rQf29XAfV1FEmnpN5zZMCUxRHiW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ" + }, + "client_ip": "46.166.162.140", + "user_payer": "E6W7raN5jZQxvCiiQ4tZf6bcB2o6mMemKoKgHpfUaMre", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CgkiCv4obMfTSX83HXgGQrVwAsYa7QZkdxEoFqQPd711": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF" + }, + "client_ip": "185.26.10.181", + "user_payer": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Cgs4ZhNjDqxZTjNEQFWnp1fTgoqwuEMWuqbBfo2FavpN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5" + }, + "client_ip": "84.32.186.134", + "user_payer": "4KWEp68f78c61qusoHHTCth5V6bcjt3ejetPw3wERp9o", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Cikwp6MBVJqh7smoS9wfTzTy7g8aEC9nHNN3oNfEy4zf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "vALigXFg9wnnhVHN16vNxHxXtAXiBv5QjAE6udoniBY" + }, + "client_ip": "208.91.110.200", + "user_payer": "4NKEM1s5WCtPcqER4mXfGiStC7PAJLMWnh832tTB4FkG", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CiucWwcApUwy8GqfCWoaCrJrQyyr3kdCFVD6X2eww828": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2P9ZYA4vBoBBr56hrEFTmrd5ctuz3r7wtvRYmbgk6jRL" + }, + "client_ip": "192.248.161.211", + "user_payer": "D5zXsAfuLKYMs7aQGYKqMeQqLW97xD5xgVXrrsVPU6Zy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Cj83sRw2Tr6gqkuc7hDr9rr2Chs5Ahu9DG22MYd2XNz1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4Gw2F2eCtnfuHA2uX7SN7RVK4UNouy3tPrUM2XyexyRW" + }, + "client_ip": "192.248.172.51", + "user_payer": "EN5F2BU5juUEWr9zRNNqKuQMi9zBUY1YLPHV5EyMrvnW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CjdUALkJLwJaJNEfJ4845pPs9boMF4Hqez7Txkdp8Tix": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EgHNp9TbntWHRdst3ViZ2ALoq9wjjmMk4EBm1eP59Xxq" + }, + "client_ip": "185.26.10.241", + "user_payer": "FfzxeGsBnAvNkkKG8dZS779XoNgKjFKjgyqKbwYpBTN8", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CkDtnBx1aGA6GFBa48kp6RxY9KuVijjC7CJ6e6hp41ip": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "mrgn28BhocwdAUEenen3Sw2MR9cPKDpLkDvzDdR7DBD" + }, + "client_ip": "202.8.8.21", + "user_payer": "mrgn28BhocwdAUEenen3Sw2MR9cPKDpLkDvzDdR7DBD", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CkGqoA92C14RVx8G6gBFP4hGE7EVgu5AXQYRZMx7pRBQ": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "56.126.86.224", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "mgroup_sub_allowlist": [ + [ + 112, + 102, + 117, + 71, + 199, + 6, + 238, + 194, + 72, + 72, + 49, + 89, + 222, + 106, + 13, + 80, + 120, + 119, + 160, + 87, + 194, + 10, + 159, + 12, + 188, + 122, + 248, + 37, + 245, + 96, + 51, + 204 + ], + [ + 218, + 222, + 60, + 83, + 206, + 126, + 111, + 57, + 139, + 208, + 121, + 239, + 30, + 110, + 91, + 217, + 157, + 160, + 253, + 178, + 129, + 87, + 8, + 45, + 24, + 91, + 250, + 158, + 227, + 15, + 137, + 247 + ], + [ + 190, + 186, + 226, + 156, + 119, + 22, + 58, + 208, + 174, + 74, + 125, + 108, + 204, + 185, + 66, + 197, + 83, + 59, + 223, + 97, + 51, + 106, + 51, + 192, + 218, + 54, + 35, + 104, + 220, + 41, + 253, + 143 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "Cm4dRSg7U1XC3xvAhh5bHh148UgJWmhr5myTEpB4hdrP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "2nhGaJvR17TeytzJVajPfABHQcAwinKoCG8F69gRdQot" + }, + "client_ip": "45.63.84.213", + "user_payer": "Gt39S3VS7tTYGJ5Zcy2KiXZGc6uD2Dgqw1cqu1snoLgJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Cn5SiKztrc5hq5YBoh57jn3F3gmfWzBMBS2v8H5yzc3W": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8Yq98CFAorqAc3CN7XtMVgKLrBc78wsBvjhAbFr4sNQ5" + }, + "client_ip": "151.240.75.12", + "user_payer": "BD5sHXsvoe5ELVABzoTHjUVWBQj96dnjVhHMieqF1Ehi", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CnCYs3axjx7iW6bhP9qD3J3GxjBMnST4xr96G5AohzzE": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.46.108", + "user_payer": "FH4g2r5tndFX8c3RQ5EKVivDVXW7ibiJcQE2QSGsw98Q", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Co2uNgc8cE6GJaoH2S9GugcNdSuLWxTzrfp9dENWiimt": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "70.40.186.197", + "user_payer": "9wci39jGqbZuF66GLKtGNJe2qvKjkCg7qb4Uf3pTcxQZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ], + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "CodaXq99mpk4g32mK2NGMGBZTkjdVss7r2kpYG67srSL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "kom1oNHyyt84XLGVfi5Jo1qkVkU5xG1sBxPG19rWknE" + }, + "client_ip": "189.1.171.223", + "user_payer": "7n1XWWCLe42miMAYkpoE1Wpy7yfrHomR3s3RfB2npEU7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CojTNdiLHWciksNSrMKvt5RSCTUG7gb7wqxyqxW8RLSF": { + "account_type": "AccessPass", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "178.128.75.14", + "user_payer": "3w2Ft53Zv5uPMCQ125dyAnaDnRCqy89MeS58gixsKChP", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Cp22zMfxVyNVKW1s2LuE7D4cAa1V88VXdnMuuoSGRRmk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "777idJ8gG2cZXjc5Wvcq7RBtkvcU1TJ8WoLQSHaU8nN2" + }, + "client_ip": "64.176.18.82", + "user_payer": "kxQKXRAcJXbCxzjfkFoz6G8eU863G4G9DJSJKSTH88T", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CpVHqyYmwuHXvNyHFuWifXJjDNiK6sWgFFiegM1uZjU": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "95.173.205.81", + "user_payer": "dztFPUmYzYkTGpSYcGfUVLuXRtUUi9ozV6rmA3sP5VX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "CqY9y6UAJVLizPT7FjPEZP8CDZcpRwsCH2TtEnCA1Ka4": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "74.118.142.150", + "user_payer": "cs4YKos6GWCjyakfrZoPyotjexmFqES9hZU42ew8Byj", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 78, + 139, + 74, + 34, + 254, + 254, + 71, + 209, + 142, + 2, + 37, + 217, + 231, + 82, + 188, + 132, + 108, + 253, + 90, + 220, + 75, + 232, + 37, + 158, + 92, + 11, + 30, + 188, + 249, + 46, + 138, + 142 + ] + ] + }, + "CqZWniU53ZwwbncNdnzBiyV17kf6rquHingYD8oNgw2T": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "198.13.134.201", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "Cqvv9yzHC3dQoReVW94jJBqa53obCGW3Y5EgfsdmPcCW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DeepM3FDWaAb7o53rvyZk5YvHLG3FvDiVXJLRY78z51p" + }, + "client_ip": "70.34.195.106", + "user_payer": "7LgeV5j3xZXrGEsqZ5rQYAPX9oCrt4ZuutohzFrajL6V", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CrJcGrFSzZXRBsaP1dpFGr6KFyRYH1gyLWy5kmwomFD9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Cu9Ls6dsTL6cxFHZdStHwVSh1uy2ynXz8qPJMS5FRq86" + }, + "client_ip": "95.179.139.54", + "user_payer": "BC23QRZ9UQmqXjZfubTq6rMaF7szTX3djiqcUXsszsph", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Cs4VoMMR9YSHBzuWHXLFtk8CjByP1vZHnaSN1zHppjyH": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.49.116", + "user_payer": "5inQpgodpNrpCPyz4i91pfA4ecWsPUVwT8FaYW3pxNkh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CsJ8wsUDN2kDG9Zx6USNvgDVWCfVakobMZwSzVpww3BQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BqKZxaLkcdCu8SyFEhFW7NtwWJsMpgxA3Me9NwkBxfhg" + }, + "client_ip": "64.130.46.85", + "user_payer": "ANCZV5uL8HdUbcmj1UCn48fuEr3vzzBNp1KuUKdYjcDu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ctf84x1RkAtshXL4RVHzsyCX9zPRUTaNpU2Da3RZGTMM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BTSy6SwSnFSQWd8YfVasEGoTfzM2GwZc9SrPhJymirFa" + }, + "client_ip": "108.171.210.194", + "user_payer": "6z5qbssHvATWR5rS1dUU8EFjo4kRnGUf7MxQpetRQM8y", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Cu1UjLoN2hTjoLt838kw9RzNtTNEEn2fczSUwVvVYnGp": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "63.254.162.28", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "CvqeZFRodhgyVLDHSDuxDaphozaivpDGSK5DC8RrdudB": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "207.90.227.252", + "user_payer": "7tLqkoYrPgUXyAr5VQuHUX4gz5i4UXkWRt3fsn86NLab", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Cw8WWT6DVFML7AQkA93NSzyqk7Bhu8K8JwD63RNz4sYn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ana2y2YvQ3ZPMwm6qhnN3nJoUSiT3qx5Pvetkq9xcfY" + }, + "client_ip": "45.32.145.112", + "user_payer": "Fr8yndbYqLrjayohTJBeeUK3V161XUdU5fH43cRyv5uA", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CwAQuMtZVTEEQNqbJEZfzzGQFpSeKrHob8MYhtGfSzvi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5" + }, + "client_ip": "45.77.219.166", + "user_payer": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CxauGTAnwCnd7pqegf3iR4mzy5pDMqfZYaw93Xan93ba": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "170.64.239.28", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CyR878rrDAcuKMur7ttANxrhdKeB6wBvT5nbPRzqqBjR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA" + }, + "client_ip": "185.26.10.181", + "user_payer": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "CymkuRD9zqdphegmHGutEB8MWKeVYWDEFjdLv6uryMEn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "burncPhAzPbo9QCzN9j8ig2FKZjwDhM5zgN2eW3GmWa" + }, + "client_ip": "72.46.84.37", + "user_payer": "66XpCmLLQFL8CiN3viME5swfxFjnSheAoq7tK34ViFU2", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D17GEWa1WSRXpRjrR2BqM85LXMUL9Eg47zmD8xQBJeho": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw" + }, + "client_ip": "103.14.27.39", + "user_payer": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D1Pt9NexkG2u2Ckzeq7xEQKmhV1aaKsZamzXqYehPi9P": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6uaMGZF8QVtGtZvVAEQGPfWKnJhFUrAtjTn33QHG1gK9" + }, + "client_ip": "208.91.110.230", + "user_payer": "4DfoeULZ1NdvQ8gPhghppzWLqU5SouhXEqovb3BCn2M7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D1e9CpYoZ3c1uFmsLR2Kze2Aobb1YVXnVFr9PLQCu3Ph": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "UMi1r5J3SagSu4HC3waB3YFzbXi82rRSScgW2e8NTfr" + }, + "client_ip": "64.130.61.80", + "user_payer": "GaLQ1jLWyxZeTmwMvBotGBp8Cf4c1u94MNNeSGwWtD6t", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D2C87jPcpV6dF8yMxzc6yu4GMEaukgd68BtZSJ96b9Ud": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6gnbmed7kzwQVQ7ghsjgEuCoYmGeWciV2qCwni6WS6HU" + }, + "client_ip": "95.179.216.68", + "user_payer": "Cg9YspxfoL2zoSPtnwi91DhHS8RLUDguVWdF9113RFt6", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D2DPWtsgMc483Fmk1MxQyMReEH72YzLvYUpKL6vsDZTw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2kVZVTY8FMRZ3WuHzyqNz8qd4Ytbba9f9DaesUm5WLvR" + }, + "client_ip": "45.63.89.22", + "user_payer": "AgEosY2kAXbzCodTBhfL1LtGhKEGMHi633pCDBJeryHS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D2YTYhj6Nn71BZtr8wHCy5ZfeGDGLpBUDaiq25dEetRC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB" + }, + "client_ip": "45.32.155.121", + "user_payer": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D2n4zc9k6DQic9HxMPqAYfDoz8qBsf2rBHU9PbXo1cjc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FACb6bbTDRBHCK999V8ox8jga5JBnt1r3vvzmAYAMv2o" + }, + "client_ip": "86.105.224.79", + "user_payer": "4L45W8TgyZbL1Kvpc8yvdnCHcFgVaJUtntHzkS7MdtX5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D3c7NtMyxTBFcvPvzEAp3MNHbjvC6tiDLTkqGwoxDtr2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "E9hD3ikumJx1GVswDjnpCt6Uu4WG5mz1PDWCqdE5uhmo" + }, + "client_ip": "84.32.70.9", + "user_payer": "GUDk7YkqVHJFKMnximYS4QU4jjGW67v9291CHSk8riPy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D41AMKvrwC8fbM85cK57hLo8S7sFV4VLzAedZvSqXcxa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb" + }, + "client_ip": "72.46.87.247", + "user_payer": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D45zJ3ykqYi5wWKTumpAhx6Yc8aVmigjrarCRJERA5n9": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "64.130.35.90", + "user_payer": "7xPbXzatmzDH5YMHdEtM4bHPcKRHMq79Fp3u4M3UXDoM", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D4H6mE8EdSEkCRfb8pyGvAp9ZzRaCVa2NA9vyhwdwpZv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "nebu15XQKGpxzhhckADBX9PgvGN5qk9RRJCFLKc118w" + }, + "client_ip": "45.134.108.184", + "user_payer": "3MfHwZkChspbJz3SNBDqcJCGU2Vf3U3JGjbjjj97vVox", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D4Q9FcEGimPF9Zkht7M58jHcNG6ACArFNL4ZZrk89xdN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q" + }, + "client_ip": "66.42.68.193", + "user_payer": "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D4W5RBdch6De1p7vdHkPRp8vB2gtrAANF2aQpiAuFqDL": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "63.254.162.48", + "user_payer": "GG8ejFmhvVDfFNBh2jSDiZmWxK3gxpoWDGtNeVYEySLP", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D6i8JxAds466jfZEYuFHr5UaVHh5jCiw89531vhPZSXD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EMbTAAcM4zq1AeSKNtrRWfpNk22pXm4wUh4YtZMuzS3E" + }, + "client_ip": "91.199.149.216", + "user_payer": "8vjsxi5AXmk7DrHo3JVq4fSdkckSxmcDTyLW2zqTABZh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D6xR6v4NyXahqts4ycmt13Sv1snE1EuZxndCdros7ZES": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV" + }, + "client_ip": "177.54.154.241", + "user_payer": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D9HKL37A1FaexH8PWwq4MgFKpz5eNT63MKDbVfa8hdTy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK" + }, + "client_ip": "67.213.113.99", + "user_payer": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D9dZ36TmmCcUAUgZetJ8w81xLvxFjt1pG3KfnEU8cDNa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o" + }, + "client_ip": "185.26.11.195", + "user_payer": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "D9fqGYDGKydiXVEn9rk4ir8shfA3sAWq6FWqHeA1WHEg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HWfh55j3jw5WwbhkK9uAMA4PZ8HAEUnW8yJcNjzXfqeZ" + }, + "client_ip": "64.130.57.134", + "user_payer": "DDB4XQGCCMdPQygsq6kPDz7VdTEWe1APfarNuGS9c8e5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DA29NzyDYGicJKXd5Nh5dKFGCKU39Qa9vhG8S2vxn31k": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "74.118.138.197", + "user_payer": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DArjRZL4rXp5hNo65XmCNzArYqH8SV3Aiwz45E4XPUcx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "pfHSfK748gjDdABzEGqM1iJbB84HZwEqJJ3Xc4QJ2vT" + }, + "client_ip": "86.105.224.50", + "user_payer": "pfDZjJUvm66mAnpRguLp27eJXRMbbf8EVycpgL38Squ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DBE7USAUiSN2o85sY2aatV53D9p6Becg3ivqR72MKYp1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BM2vE2QqkB9fGtC34WPtM8drbgta13SBkhRq6dRG9J4J" + }, + "client_ip": "64.130.63.76", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DBY4tmo3n4SVXWMFKH2MHPitKJsr6s4vLS79BBnxEFLV": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "63.254.162.76", + "user_payer": "NU7EUvYwtQWMJcYcSSA7hxju3UpuTQQZEMjtyfi7Fds", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "DBY6U1ZqTkpXQR25LBcNDcd8SEiPpXF89JJUspnoaNGd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "9C55JWc5g1Ym9kPbDwL3ncQ4Y9115aJLXhYnC8xuHcTE" + }, + "client_ip": "2.57.215.163", + "user_payer": "3X5nVJtKLednxS8PgM8Ln2TDHariuYJohUEXzWZAvCAt", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DE6Cty3Pxh4hjny4KA71sqyQ1ukpn8Lv2YsezL18JYzc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "LFGGGJtnBLvq78DyMz1gTeedM6f8owck76qHThDABBC" + }, + "client_ip": "70.40.184.60", + "user_payer": "8r64yqzdG7kAGxXGKuAC7rsg9Nw6at9FsvqHNF1fLQNd", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DE78LDxkTjTnmaxJXegAAvBCXtWyuQnHVAhAYntV9ug2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5N9r2ne7dPgHtzeHC5ETJ3DAueKQiXSU8KAmEZrrojT7" + }, + "client_ip": "108.171.202.218", + "user_payer": "5N9r2ne7dPgHtzeHC5ETJ3DAueKQiXSU8KAmEZrrojT7", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DEDsPpLTYL6vg8BAkr21pqkJBnqeSvC1faUyfsLZLUW3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "GZAXGC7wFCDGFTgyVichtecL3aAFxDttCVETedVHfTNf" + }, + "client_ip": "208.76.222.170", + "user_payer": "4yA8G3Hk9EjFEvu4fU13DG4AG9YJTtGqFqTSxUf2CpUa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DEJRn7THx3zcxnYA3UFoBQ7DvReAqK1Hb4MTfFCtdow8": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.63.7", + "user_payer": "FLjs8DFJUucaB6sgivwg29AnW9NPbwRJ2ivbAjwstirG", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DETsNvtWwW4NCom3Xz6F53bKYSeJM1USwwNE5uBhi85A": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3x9nibnhgBHWKMRiGnsXJELRBjviQpKyigfrXtKW27KJ" + }, + "client_ip": "104.204.142.125", + "user_payer": "3x9nibnhgBHWKMRiGnsXJELRBjviQpKyigfrXtKW27KJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DEh2Q9DvnMCaF9Uonz5UVGfeCLuDH5jL44BApC91PGvn": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "207.90.225.252", + "user_payer": "44CKeisDUNVLqsAXVpikbk6sQ9t34h4XwQdzAFLgJSFD", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DEjjDMnHdn9ebx3p3at3233YwXp4fEMi6NM4HXpEXVP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "novaeuhY2JH2WHhc9KVTHDx2cyJZdXJC6faf4CtARZn" + }, + "client_ip": "89.36.35.228", + "user_payer": "FQm3giBLRhpzuQ52Lpmhuz3RautGXcsTJyGeXSBCVsVc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DEsW6DvoSm9JCk73TpQYsZiXiEGn3GWaHtSJF1Qy9rxv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HH5dA42XF1HxNk1TRpG6LuKfLViMYNdAz5iWrFM4hWFi" + }, + "client_ip": "23.111.240.149", + "user_payer": "AywHUVCgRNbJQkectnQCZCAMLXrnAFz1WfNBM7PTp2ZM", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DFJWydUnMbYSoyFyhzGR2zNVyip2WkzHfnKrdhvHZS7J": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8dz6mnkZC5eavdkyvFAEGSvXdV8vDYtWmtYtj9GcESUG" + }, + "client_ip": "64.130.41.52", + "user_payer": "8dz6mnkZC5eavdkyvFAEGSvXdV8vDYtWmtYtj9GcESUG", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DFQpJ2yLT3ARq8iDsSsuxgYLEL87fetZik9TGY1U6ZDU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "VALiDcyCpujxjJAZDK2av2TpMAigpSodzj2ApqgR4e6" + }, + "client_ip": "151.123.174.78", + "user_payer": "VALiDcyCpujxjJAZDK2av2TpMAigpSodzj2ApqgR4e6", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DGFVUPaibC7fL9G3KCDTt1gTBS6WL6rrUrDaKrGixESz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy" + }, + "client_ip": "103.88.232.141", + "user_payer": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DH3wx7qoeaxrY3y7Tb6ExGAHnvSTotsVoTy4cssCwKAD": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "202.8.9.28", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 231, + 193, + 102, + 84, + 73, + 27, + 224, + 26, + 26, + 207, + 245, + 127, + 47, + 24, + 24, + 143, + 142, + 201, + 203, + 18, + 250, + 154, + 124, + 177, + 79, + 4, + 2, + 93, + 104, + 254, + 177, + 78 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ], + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 51, + 174, + 2, + 67, + 109, + 220, + 168, + 226, + 12, + 124, + 251, + 34, + 171, + 48, + 174, + 66, + 239, + 236, + 202, + 29, + 131, + 235, + 61, + 27, + 53, + 22, + 213, + 129, + 76, + 147, + 147, + 153 + ], + [ + 231, + 193, + 102, + 84, + 73, + 27, + 224, + 26, + 26, + 207, + 245, + 127, + 47, + 24, + 24, + 143, + 142, + 201, + 203, + 18, + 250, + 154, + 124, + 177, + 79, + 4, + 2, + 93, + 104, + 254, + 177, + 78 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "DHDSnfpcz9A2BTFr7cT3fm4RLXX8oqU8yxKsKrBKxpBN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "2.57.214.27", + "user_payer": "8TiBijMRkgwLrcLgxtUJjmvoWuRNeP93oadu479azkWT", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DHMA32fyGXfBMLR22VCkFpW3Xm5mXKfFKBqKp6185ewM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "rssaJ2iKcE9QWsFYRZr8Q66TQh5bRk9DxYrzxGMzWQr" + }, + "client_ip": "38.244.189.189", + "user_payer": "4SBNw6R5swH6QoeNs7x2VtAZ3xCCtqgptPD1qmyWkVNs", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DL6qNFMCLYP31WapLrgdfJm2o33vQCyu9XewhbVoD7xa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "AdSHK6vpQnwHRSw7jXUwjMEytmhFwnynZSENhvpAxL1y" + }, + "client_ip": "64.176.170.50", + "user_payer": "FkUPod4tBiTGiNgmzp2xs8SdsxS9bQaWZKMHrf3hiQKu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DLdqsXVUvkP7jstYdXSCCssJfGvsY4orgpdbRC6gxcsL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "67.213.122.207", + "user_payer": "BNKS5rzaRhoikQbeYntbd6inE1PqecGhqDG5qvg3EEFj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "DMPp8rXDooAZYYduRtHxY9HGDMsr4dWiDSC2LEPUJki1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ" + }, + "client_ip": "177.54.154.223", + "user_payer": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DN5YKVKLZj2Q4vw21E3MmBDjvpiGLpPuid3ZzQZVCU4E": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BeaCHioStqCEFDFxKwAEzyrUPYxqnBPhJ98gDKeEiTPb" + }, + "client_ip": "185.92.120.148", + "user_payer": "4pNdwtJZg98QxhV7rcKsYZiFS9MY27XuNTwXjibgm8Nc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DNpGbdXAWXtJv4eZGoS8KRwsz5sUTFw85ocfXk35uJrK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "6Rk694kh1QTyQkirdb1uDZmS5xqG9bNaYtxx8d311Mr7" + }, + "client_ip": "66.42.126.225", + "user_payer": "C4b5kp4NoCUwiFAhZADES54nGCtUHAfRfVnCo5NU8vmZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DPeE75ZFNFQkRi6zHPZQ1ETtAtxygUyrrBdehprAcMm3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3wsewfjKigetkrnGDmWEZdjFpho5rAsKK39d6GJSZ5LT" + }, + "client_ip": "45.152.160.93", + "user_payer": "1Link6hB1NpkCwJt3ZtpQKZszKauhEcKgiWjaU8PRDG", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DQYngPPzoFUztX8bpEjA4Zk9GZSSvazB99pu6RA8Pq3p": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BUokhb8pPF9MZuzW3rHLr6jzakgcz3NDq2PZkpiVv3jb" + }, + "client_ip": "208.91.110.164", + "user_payer": "BUokhb8pPF9MZuzW3rHLr6jzakgcz3NDq2PZkpiVv3jb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DQnWojYT8AWwdA7qacPYbnsPu76VV9PQjjuCvBRy5pkH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "GqZLe9uL2K6bQxMLZ6GawXw4jYgzCvKYYcvasXqtXkiN" + }, + "client_ip": "108.171.203.206", + "user_payer": "shftkxnsXmqAkmLgz9Mn7bNB5Fr6mKgFc58kFHfVikj", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DRfTbXCxGcZ9DrSDmmk3t1yHQNJnoSmNcweMx2CPF51a": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu" + }, + "client_ip": "185.26.11.145", + "user_payer": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DSA2uoJkxsEWCf6ciqzKPkqtuqUBQSXzXw65LNwFd4CU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ErZietq4j9LHJs2wawHyXEp8zMRjTYzdeE5FdPqLvkei" + }, + "client_ip": "134.119.212.81", + "user_payer": "6uw2MvDo5j1bqWimPBFUx3AFjUMSHdm9jZXw3uYyNEAU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DST2V6LabGkToHQTcwL1sE2bL991T9wzBYTAvDn59tT8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HEnfJmMurye1NVoGgkGspeaxKqdV5Pnmz4QM6MN41Yem" + }, + "client_ip": "154.16.171.107", + "user_payer": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DSjupfdYEGuuF1ri7gpPtTMniZoT5FseMcY8U8DE2Vy8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD" + }, + "client_ip": "185.26.11.195", + "user_payer": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DStHRGeUUjeqQq2N5i9fErxQD8rXVmpq2Pza8KUPRKHH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu" + }, + "client_ip": "69.67.148.127", + "user_payer": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DSwWZ5hRbgvNx5nTVM68kkfpmHroUGFeffKy65uBi8LU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4" + }, + "client_ip": "72.46.86.125", + "user_payer": "CbR25Feev2a6tzymtjEVofxiyPLmxBPsBvD5czJ5oMJc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DTQbmSnnLuiYoBGcGjkNz1h6qHFuuZ1Lx5pZmWW4rMP6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EHAmJS4Am2rJLCV8Hd66nzqqYbhpy81AGGAQGRmW4k9v" + }, + "client_ip": "137.220.62.9", + "user_payer": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DTdfduMrmREaMafi3uR3jBYsSPr8tEeLKGWoXw5boYJU": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.45.98", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "DUBvUkgUgv9susziYVCjME97pjB6UGZ7tFv1cbJqvd2m": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "23SUe5fzmLws1M58AnGnvnUBRUKJmzCpnFQwv4M4b9Er" + }, + "client_ip": "91.242.214.245", + "user_payer": "ATEJvfGzid1QkZHbsWF93TCCNM3BAHUcyReH5RrxcGrF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DUXbgsD9gWpjBXUzYX55zU8rXTmUmBpRJwnpNKagQhwg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7PpXQgDb9eCHN1Uudgi77Wm89cRz4T85YgDw83qvaJXd" + }, + "client_ip": "45.32.46.99", + "user_payer": "79jiM1FrLqZpUWt4f1Uo7imRVQ4KiFfKAeb5mhHzJryU", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DUfVc6iJqpeJzvweVnQXVy2JvWEtmtXjYoYxL9eAHjx5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "MBVyz9s72WSfUmbr1S8fgHjDJQkPs1Q4Wxi6A2Mees9" + }, + "client_ip": "84.32.186.146", + "user_payer": "EfSn2XWdcEjeRj9b5KaLHxT6dEs1GAJVWnici1nLX16U", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DUjLnrFmWBEEjNbg2kNGp8dwv7PrmnvLqCrTKQZUvnqg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3BeharBd3j4sKQp7Qze27JLQLd9AEEwGTX9TC7dXYSNw" + }, + "client_ip": "70.40.185.69", + "user_payer": "8qLB45QTdhZnfVpdzGY4dCcMPMpxWt4nov6WB5BP5K77", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "DVGS4NgnrZd5UybnwaZLoFHqJxXyRwzeTX3kHL6JKBR9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ABREU5YkQcfpDZymoQ97iGUgQcfgjctWUUxEMfumiPdV" + }, + "client_ip": "64.176.11.26", + "user_payer": "ABREU5YkQcfpDZymoQ97iGUgQcfgjctWUUxEMfumiPdV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DVhp2w36hJYZkG14Zw3PVLTgpeA3uQdx7Bep465vGiKz": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "63.254.162.48", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "DWFPhGtbqD6Puo54Vo7p3NeiKw4hvTTyM78isjfwiwYQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "fdover4vb6YyyHhGBMnoKiNgD7qLceJsh5k4ce3b4FR" + }, + "client_ip": "5.187.35.134", + "user_payer": "Bq9t5usaaa3eKHjVkbYF4ZMzusVt5UBiP98xdoXZekmB", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DXnmzZtfpS9BartCgwxM4m2JVrptmqkAZoLC4oPyaUAS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "stacheBmGG5zMKuetUevAbc4m4dLbve1VPcpSur3voH" + }, + "client_ip": "89.36.35.229", + "user_payer": "JCRtqeL2TPjXFiW9ze3T1SVxBET6BPTHMYZawRLMERTw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DZYdQGzYSBFzYUmuLiUA2rJbeWwCpEVYJHKrXcyQJwao": { + "account_type": "AccessPass", + "owner": "FdDcx5MJYRxykTF3YRuatw4Am7DNvZp2EpbhwD4V4ZMQ", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "108.61.197.163", + "user_payer": "BAZsbYradMYg4cxLoYf2tmDogFtPRDaJSYkvrKnbSDjj", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 97, + 194, + 198, + 142, + 221, + 142, + 165, + 82, + 165, + 186, + 148, + 13, + 187, + 35, + 1, + 24, + 31, + 126, + 211, + 71, + 88, + 115, + 87, + 170, + 218, + 9, + 83, + 106, + 232, + 207, + 124, + 147 + ] + ], + "mgroup_sub_allowlist": [ + [ + 97, + 194, + 198, + 142, + 221, + 142, + 165, + 82, + 165, + 186, + 148, + 13, + 187, + 35, + 1, + 24, + 31, + 126, + 211, + 71, + 88, + 115, + 87, + 170, + 218, + 9, + 83, + 106, + 232, + 207, + 124, + 147 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "Da5RJbT9uhNYrnTNb7monwqS5CvCZUV4ZExm7ydEMPaA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "huinBRP3muBuqZLMW8ARjdn4mBnEmFFcxiBzrkQz553" + }, + "client_ip": "86.105.224.14", + "user_payer": "huinBRP3muBuqZLMW8ARjdn4mBnEmFFcxiBzrkQz553", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DaP9U66RDjrQbMLL1SbjsmXuCDjfv8YA6u9SwHpW3721": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "66.118.238.242", + "user_payer": "6MDSPxy3iERgJ6tJ5ZymTLFP2QHtC1fUmL5NgpLy5MpC", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DaXokfv85LU4VqeqBJtT4MCXHhrCKRJHrt3mqePPTiX9": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "84.32.50.37", + "user_payer": "dzt6rbUG2YZk8fNUvzVgcKRnMs6vUpi9QJobFcEoHJh", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "DbaeLrwzX5y77eDJsGn39VEkSZw9HoLs9q2NDqEFiPEx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB" + }, + "client_ip": "45.84.193.2", + "user_payer": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dbq5ipSeE35N7RDrin2yEdv8gCJw8BQZktziPnnXdwGM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "JupmVLmA8RoyTUbTMMuTtoPWHEiNQobxgTeGTrPNkzT" + }, + "client_ip": "64.130.41.46", + "user_payer": "JupmVLmA8RoyTUbTMMuTtoPWHEiNQobxgTeGTrPNkzT", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dbrn2qFmpnP47cg5ZzYz4WdUG8UhADp5s4WwYaLzuGc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6NDen7aDi65apHo8m1Vea4nuS6LyjQeM6pDNqcW4Q5Pg" + }, + "client_ip": "146.0.225.122", + "user_payer": "4uFL3dHfSJ1A8uKAxVoitv96hVeEneVrXXJw9gR7gG1A", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dbw6bQxnoL6fPPb57cx2vKh3NhnCnN63n3LAZnvHrWdD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DTSUkYHd2e9P2HLyZfbLarsbDdPhQUhZnWjRYuJZQRC8" + }, + "client_ip": "198.73.56.215", + "user_payer": "DTSUkYHd2e9P2HLyZfbLarsbDdPhQUhZnWjRYuJZQRC8", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dcggr9F4hyLFXKoSRh7RyVC8wsmHhnye6TkBQoYmMKkP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP" + }, + "client_ip": "67.213.113.83", + "user_payer": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DchtR6EboEA1Fx1GzvLsipFMiUsDCx89egWqaTTgT2MB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "bay3wXfJsu9ds1zQBoQQ4DUwFGs3NP6q4gca9WM5G1z" + }, + "client_ip": "212.83.42.92", + "user_payer": "7h582s5o3hcDNSou7JptSrD6TiMoaYtjip5kU1K5tYmQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DcugXjjhZVAHuMUf8KN7L52zpirRR7rwrkGXZxSYCwvt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "D2RV1q6FgePVVjrMa7AMzVbvvAeg5oS7TAV7qdNKSDsX" + }, + "client_ip": "88.216.197.108", + "user_payer": "DuHtbbm8Rdz28ygJjxKZuLCGtPrbttCTxAVbEQ5DkQth", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dd3m8BASf8fdZko3CwYnsn8HtS8jx5kAZkJxbDikSUDj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8ayZiCJjZYUPzrvhC5EqHXust6FCfHaePfuRXQuM1Ga9" + }, + "client_ip": "64.34.94.21", + "user_payer": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DdS3rCZ1KYoHFwiPXWKENmscZfs31tR7sq48n5p3zvnd": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "208.91.107.231", + "user_payer": "4EWpQFQPS8PXax26RKdGy5SX4vyYf2jBBtTrUpNk6qFp", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DdiouWiS633soQyMf2kCvabPXC3j6tRVW2f9R5KS5y5k": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "9gFxqsXbFyrKXUkqpAatonn47uYZ7sEZSnMxhzQoXrUJ" + }, + "client_ip": "38.244.189.101", + "user_payer": "2jHD7HZJbtZbVuGHimBgR2BPsubacyXF1HuutLR6tQVi", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "De4DSBCZyvRVcSaiWmsgGtSq8dNjret196cF5b1bEYif": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN" + }, + "client_ip": "69.67.148.127", + "user_payer": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DeBUoM1FKBzp5myJD68rDYF9RQEAmUyyfxc4zsJfcD5Y": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "sNKpC9XPhStDhjvKfQoUyo6s4tNcdCzdrwTkc13PGtz" + }, + "client_ip": "204.15.240.9", + "user_payer": "SL9udNQdwUgNwpAxouHgET6WGRHQermEXU5RAcHqjf5", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dew4VvZ1KFDShfgf3irMcx61pgtERReR7ywihCvjn5cu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SaGAgdkowooXBrHihpmE8gsjf1dUG7n5SqnyJxYFnXJ" + }, + "client_ip": "109.94.97.187", + "user_payer": "SaGAgdkowooXBrHihpmE8gsjf1dUG7n5SqnyJxYFnXJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DfD5whGWG5UqGN2xRo8PuNCKGtPF3zRLAJ15h2nYynRu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 249, + "accesspass_type": { + "SolanaValidator": "6c6RrC9TWNgiVXnbZ6hehNuhyh81pZK1yAj5w2nXZTwi" + }, + "client_ip": "216.238.118.132", + "user_payer": "2stNHo28euspHqv7qvLLxK3Biot5cSeE5emvurBQkJQj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DfdFWMUgKcHNDrvwzk3R73q6D664RiJMgoKrDCAcvFb9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3psxMyr7rQzywVp1MXKd1XFmFz33NjydzCoJx9t2sMQW" + }, + "client_ip": "151.123.172.126", + "user_payer": "2Xehqi4LzAvnhh2Ef6KcA5dbHvRrszyN1vRE1kZsEMcb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DgeUQ9cLq2KwmbftSZaUNdqDk28auCPdZVJqMDcpWFNF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "AreCFzbUi8XMYFckUZU2NeFgL56AUXoLNomCGYBttuCn" + }, + "client_ip": "5.199.172.194", + "user_payer": "EBKY6mSeuSVy4dE9fTNDtM71mi8PYJpDq3Qx8neDYnz3", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dgm8mmWszpgSrWAcAyb7fVqfsoA9ki51idXdWNmypxZU": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "143.244.60.44", + "user_payer": "dztjDmf4jph4NszYbyNsrxYqzKB8y5qDdrY8k2zoXrv", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "Dgt4EjRZhSwHLEhcymUPfE4nTSAMP3b3Da8moFipv53i": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 250, + "accesspass_type": "Prepaid", + "client_ip": "64.130.33.105", + "user_payer": "7G6HxUrfmipjnwLYGe6ZRPnbz6BYytC4Kn2iqZSYSx4N", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "DhWtxoczEDxJzYV8mbPQ5eae1X1Kad1seZwRVo334uNT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CZanBzZHFzrGY5qKzaX3CNhJ5smHEMTWFFnoeUi4J6dr" + }, + "client_ip": "139.84.152.15", + "user_payer": "Fkhd6WwaLAYGMTpGs1kX7ECQmuQ7Uj3ScurCDtzLBYRA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DhaaTNJhea5UDEiWHebNqvZnafcqYVieGHx5YWkVPmAG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "6WgdYhhGE53WrZ7ywJA15hBVkw7CRbQ8yDBBTwmBtAHN" + }, + "client_ip": "78.138.96.203", + "user_payer": "GZRFDqw5aiiyUVzWcJ7ayfqhAaXvq2HbfvGeCEoyUnHF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DitbBkbYMEfsFewtGKRHnZaWtB6twwypio7iXnrfBuCk": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "23.19.141.203", + "user_payer": "9d4himtfdBwuiwD9PfrfrYzsDiRrgm8EYaerNDqtGM2B", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dj28n3uDubFtDGNPDbUHsFUCFUK8rUanByskGvt1EdLH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6GULEPcuQTRFE3oSEgw1e2JNiZ25KdgLW1XDwS3SrKxD" + }, + "client_ip": "74.63.225.101", + "user_payer": "xkN8xAw8kQAvUjcpqnxBM5hYdrXRUJtHotK8WuK649M", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dk4SpAbXa6LiWkERrouqRVzZfaK5KBqHHDUnH4XRSRyA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "pSoLoZx55zZz61gjxSTwHtwTg4yTwdm7ruBmyjbYgT2" + }, + "client_ip": "198.73.56.214", + "user_payer": "pSoLoZx55zZz61gjxSTwHtwTg4yTwdm7ruBmyjbYgT2", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dk7zvPx5WjcnwbnLWPK4e6KyusPLhnzjtyQNHFPsfweR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk" + }, + "client_ip": "72.46.87.71", + "user_payer": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DkPUt4QAVj7mLpaBg17oizntxJdBCiJ9jd6RKozHoTuo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2XmhZKHmfjku3T3nC9xKhgr5bm1CAmWXqNsNt49mo82C" + }, + "client_ip": "95.179.213.112", + "user_payer": "56apcp6ZpQnRZfy5arcRr88pcgeNUKF9o9YB6m7Y5cbL", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DkXzSrYKDsaUUnpBZ3o7uThzLZqwhfNTZy1AziZHtZUU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk" + }, + "client_ip": "189.1.171.179", + "user_payer": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DmFo6jQkxEkapw4oUqzPerX6u1qiSDWrpKMVjpPRGibC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "swaP1Xpd6gPihQAst3EcAz7MrghnRS1m8hAq76Kno66" + }, + "client_ip": "45.152.160.31", + "user_payer": "VALiDcyCpujxjJAZDK2av2TpMAigpSodzj2ApqgR4e6", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DpQcExipD1bjPxFqUUQ4WQWU58nXbdX91NqLKMYSrTFm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "dzBhD4wikyy7xqwiJvT49gdrKqWVjfs9M6cTssmRX8Y" + }, + "client_ip": "45.76.239.188", + "user_payer": "dztk7matJd7ajSH9eSxrD4t3MuQ3vVYAHVJv2vq1vXL", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DpR4xY3wd32iZpbzoA5QE33BKpwwRJMmydTsrg89APWC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT" + }, + "client_ip": "198.13.130.125", + "user_payer": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DptDJQrk8e54aPpr4EdLUhuyAT8wFRwLe9KHuccPMSXU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6gnbmed7kzwQVQ7ghsjgEuCoYmGeWciV2qCwni6WS6HU" + }, + "client_ip": "46.21.153.94", + "user_payer": "DnGsKQ3WvpCXSg2vhjsfxEBF5s6cVP6CCqFujZXMj6Pi", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dq2Qs7XUnJXYANjGEDX2PLMyyBABN5F6XrcY3PCTLnzs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S" + }, + "client_ip": "185.26.10.241", + "user_payer": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DrMJWsxFJHm4gb9LV3vg67oFYD2Q72NZmf6qbrGLsyrq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "DtdSSG8ZJRZVv5Jx7K1MeWp7Zxcu19GD5wQRGRpQ9uMF" + }, + "client_ip": "86.54.152.245", + "user_payer": "3zLCNmt7Lhm2y44RW9YdZs6epmsDB8BazUUE2LXo9PzC", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DrRuS13UsWn8xtN4JwLi5F6ULadpBA4Yi6RAHoTb7S6z": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "12i8gndWWWMTRzJBFhnYkobNgZB3XMUUJq75HeUrshrk" + }, + "client_ip": "66.165.233.62", + "user_payer": "8TCpGEQTCKC6658W3J6JvCnUKCv1oCj41pWX5tTA1zxP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DrfZfkEEj4mTtErKv25KRyfG9dh14xMQ9vTtinBfVpm4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HFSPaT8zL2a75cVW3snNzgjFRPZj1GbKJRF2RJ1qztkZ" + }, + "client_ip": "202.8.10.119", + "user_payer": "7S8ASpAxqLuqcnAh1QGy4aVrtVvPWPtqcrfKbL21b5F9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DroLPdqYHqTynbkjwKYs7nL2mGPFfvyezLXthvwGqRZb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BSMe78Jk1BfeJDdHQj1aXVjrT2aMAYidyNAGQsTshrk" + }, + "client_ip": "66.165.233.118", + "user_payer": "EHte6hguQP9eRvkhHQSrH4a7o4BQU5zk2WSUGBw5yVfN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DsR3T1T4ouKyDR9Yhbed9og4GnpWdQZn7unV9doB3C6L": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.46.108", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "DuB4NmoUSdSYQB7qLoT7BvZb4Xwu54Ph99MvC4FdtAsz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6MiEjXqYksCtKnJpvAp3CAoEZnnWZyoSxu41HCzAYNdc" + }, + "client_ip": "86.54.153.48", + "user_payer": "E8JKqZAQtYkWrBqx3H5eWWuky14Z8DNGwq61eqQ5wcp8", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DvZwgMNWjPBDp2fBJW2hBMcD2ctji3TaUznxgQW4agEk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CARBN9PY1Qej1aCg4885pfoYH8EHfjWuMy59pVa48ky" + }, + "client_ip": "216.238.66.234", + "user_payer": "CARBN9PY1Qej1aCg4885pfoYH8EHfjWuMy59pVa48ky", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DwnEzUKDZAhUkdthYoxWA65U86nmfqWWa96JY6EWuBir": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5ysfTZ42VT1TjnjzQShZSrix7wdVtjXwssocSeYKDs5d" + }, + "client_ip": "45.76.82.217", + "user_payer": "4jYF1T4CKKTubyzRqHzAtdmKg6BQjYDGurt42E6kTyfr", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DxRa1CQ6EPyFzonWwjfWj3AZXmVRX2FVgFzKKu4x1F1g": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "CAm8abQAbyfSMgPw1KNmS41G5un8A5hcNVrD5dbtvCSP" + }, + "client_ip": "51.68.25.208", + "user_payer": "6L2RMSPbZjFnMFJ3FRgDgTb6A1FEmDydDEmFW7bXZVrk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DxVy39zBtjZN9Xrc55LKvVDVHG4bSi8YNAKrEcEBfDaP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb" + }, + "client_ip": "64.34.92.91", + "user_payer": "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DxWk4SorKgQS1kKnzGuLV7bgP11na8xP3V47crMhpAVJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf" + }, + "client_ip": "89.42.231.101", + "user_payer": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DywE8Ltgb6eY4itYgo6TZChHvFLQnUfzaoStYX1M3qYy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz" + }, + "client_ip": "102.211.135.181", + "user_payer": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DzT7HSVwp6tM5GcHQFn5yFfXCgFMwF8LjoymLf4AkBMV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EWRuu9ttR2x4TUcEUoXVsqTTzhpmUpjVPQBFnoLyM5AN" + }, + "client_ip": "62.113.194.68", + "user_payer": "BP5APdHoz9TykrzkoZm3Q8fBxUgc7METBAAx1nw3vvfe", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "DzUxx71uEqaBdJSWiTYbADspPnP3w4XehB8QwzxFhFdN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BHin3N7CRHFFPX8X96PrScPgZNc6JCBgD4fYzfGz9VqV" + }, + "client_ip": "205.209.125.138", + "user_payer": "HLXKZPQ1XNccxWVJw3ydwtQrGwTAaxxSGKzd6oqJth9Z", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Dzs9thrW9AFiEPsfcq98XW98YobvnFAkQRTKx8RUBP36": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "1Link6hB1NpkCwJt3ZtpQKZszKauhEcKgiWjaU8PRDG" + }, + "client_ip": "212.83.42.95", + "user_payer": "5EhZ46hy2KeKhmnv85SbZ34iPyZCrUDfVyTnaUCqJEsJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E16AhV7gSSWsktR6EafUVXvEajAC5XxRH6W7qRNSquC1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "JBkDoVQEf629eVmN8FCDPEU4QdugttrzJcvwDUopjeLP" + }, + "client_ip": "89.42.231.137", + "user_payer": "Fy7BRtoUrNpGfbegKvsnhst2DTqULvSjtt5X7vM5ogjc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E1F7vsJkir7RCEi4dKB2c7axj1iW7RptqTdnZ9wtrfvN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA" + }, + "client_ip": "67.213.113.83", + "user_payer": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E2YY5hhh7wuFdVCTmeyWk2FjF3t2zy1ueB8mZnrJ3nuv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2icrE9VGcHpJc3zjkLspEBSMHqyiwnqjNsVjQKHjND8H" + }, + "client_ip": "191.96.101.130", + "user_payer": "2XFNWm7TPScNGKTSwVi1i8RwbR6fbfZ7FjkWNYssPhj7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E34v9J6LPzdW6gh1XztMifQDmcYQs97eYTaxpZxdb6WF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9yrWdaFW9GNcJNxyFTcT9W1qotiDwSs4GiXxMQoKikzS" + }, + "client_ip": "45.152.160.157", + "user_payer": "2BYpEke9hJ5cUtPMx1mj1xdcyhNbmKPZcD4REcwgstcb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E3apY9mFci1ZcwBgRiZHtwwStrruFaWEBqJn9Ykpn44t": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk" + }, + "client_ip": "72.251.11.141", + "user_payer": "EwJA23TUEbcC5DrdEJ8uLXZs5YVsZPTHkkPjpFvTLovC", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E4ZamW8ecP4bSktCWcLdpgVagpYycNxRED9wLNxgc7bL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CDR7GpyETqHnmUGzVcHYYypgNLbERtmfX7EmAVb44z8Z" + }, + "client_ip": "107.155.109.146", + "user_payer": "UMiZdCdPPeqEDp2KKozxdu1u4LVfihkfxp6Gjw2NPUZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E4fcsPM8Bu2mJb4zFe96G5mLsT4paQ4BTFpypyFMjFm7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "86QfX8SSnTo54e4jVxiaZJRna9i1vYV6AApJebd5bdiP" + }, + "client_ip": "84.32.186.123", + "user_payer": "4NKEM1s5WCtPcqER4mXfGiStC7PAJLMWnh832tTB4FkG", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E5CrKF6K5roXoc3dRW1D91pcSFe5eSunSwgrvYBbYE5v": { + "account_type": "AccessPass", + "owner": "44NdeuZfjhHg61grggBUBpCvPSs96ogXFDo1eRNSKj42", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "202.8.9.28", + "user_payer": "BJke6xMPELUgs7evUpb4m2GvN7K6N8twXSdEmu4yWX6k", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Expired", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "E5FzAhS4Q8GonHT6bWna8pLefuaNzRn1zucPgRMv4Pis": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "HgozywotiKv4F5g3jCgideF3gh9sdD3vz4QtgXKjWCtB" + }, + "client_ip": "103.167.235.115", + "user_payer": "96rY3VpT44hm6wdYzKMVwMGGeqhJY1BDzM1iFH87NcW9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E61xLigw3vG19GCVVcPpcjkr13bmSvJdgAdRsUDz3xef": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA" + }, + "client_ip": "162.43.190.157", + "user_payer": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E6vobvnRpPafngVhofD9ZzqUmAfM9qLBvLVzTtJoXNTB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CeC95ByA5rd3cFELBgK5nx2hB8o7FynrB2ciNNwHYEib" + }, + "client_ip": "64.130.43.202", + "user_payer": "CeC95ByA5rd3cFELBgK5nx2hB8o7FynrB2ciNNwHYEib", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E7Btvg1WxBRqQr9GkEkr6NGogmySPH7sPA4KT7yWWjPr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy" + }, + "client_ip": "45.139.132.98", + "user_payer": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E7NuHFZVDJbC4UvDCjs5dZYCWZBqFLadQUAWRADbVUp9": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.134.236", + "user_payer": "pFx92o1UEarTJatwKGjojsWdxY51RCCHhPmv4JSXbJ9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "E7xMvAkUxg5hTtPysfZ5GSjGZjq9v2phKqChGbGLqiMH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5" + }, + "client_ip": "84.32.186.134", + "user_payer": "4wDxPq9iQPFibvaRhNjqo5yhAerEbMKqatAnQH2VCR9L", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "E9Nz9FJ9FbVQEwuQMrVFEnm6gkr8RkHLjzeVNCdn4AAD": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "198.13.134.45", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "EBviMRWg1rLdvRqSvSorATv5ncGbqoc2anLAmaCrvjyJ": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "141.98.218.140", + "user_payer": "GPN98466H1Zx6KryFjKuXYXCmoE9Jsu2LJjvQ2xRveTs", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "ECj7m2VvZzjVyDmzL8HQszLHQFhBw3VZvGzoUm9yXHdQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "popscoyTKVksa4TyTXw488b3vvFxM7qQEyTBeMQopKu" + }, + "client_ip": "84.32.49.138", + "user_payer": "GCV7b9bt9TViq3M4n8uYKrfz8HjE6VLU8czEsrgyzkmj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ECyJTBKLpSus7HjkGT22ZewTwaJ8fjZwMtSsU5dujphg": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "47uCSqxzrXwgDmWgScbLx23kNSD89ttWpCtLjMiESUba" + }, + "client_ip": "155.138.133.29", + "user_payer": "2jHD7HZJbtZbVuGHimBgR2BPsubacyXF1HuutLR6tQVi", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EDCRdJymKsbzkSzUj7EeGszdwY3sqKxdp8jSeYzEe9kf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "DefiihS7gLkj6xLjjhcr87bFuwpVVNYpeNBaBeFe56CY" + }, + "client_ip": "103.14.27.97", + "user_payer": "DefiihS7gLkj6xLjjhcr87bFuwpVVNYpeNBaBeFe56CY", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EGL9a6c82qxhcFzeZCB5tin5vAdUTnY7YmrbHwBJ5QNq": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.53.114", + "user_payer": "2oyAD9u5tbEW4pkiqWaMeF2EdvQReS2foqPrEfczFM4h", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EH817vYQMANKfkPpU9Ggmu7iRRLKr1juiumA5jetpBDJ": { + "account_type": "AccessPass", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "bump_seed": 249, + "accesspass_type": "Prepaid", + "client_ip": "64.130.33.90", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "EJHyGH1nuodKCkAhkzqLrSNvsBXEYaXVrsG9NTUKQXQ3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Stakex4B2tpDHPWGvV1dninfiaYCGdakgTknpzPitLh" + }, + "client_ip": "64.130.43.207", + "user_payer": "DZiGTxgDvmBFiNYmukLHYePG2S4CRydoHjQ4kF6vtMJu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EJjNER83fCbxBjiwYy6W7ns3sdhVHJrj7Es4dNbYxGpe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "LitxAVo3RnYXD2sX1TyRJxfnKy48amXgyGiysPZjZwE" + }, + "client_ip": "86.105.224.93", + "user_payer": "3X5nVJtKLednxS8PgM8Ln2TDHariuYJohUEXzWZAvCAt", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EJySD9m4tXahVdKWHfHezmkR4quPEc1nfRbnjDzUfHCu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ECeaWy82CxpeJQr3EG3XNmYXc9NrVeWDH5ag9Lt6TPVR" + }, + "client_ip": "64.130.51.51", + "user_payer": "7k1qZSJCgtAey4Xz9RDUVzazXw1dNnYoHxjyUw3ZRjJu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EK1HpCjYsF6VHfnMRjskGDvwscKEmR1expmgzTS3Yvsi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "43Am3PKFeo9cACpqYL5Sk95rpVdxLw3Mc22PqRqZXEW2" + }, + "client_ip": "95.179.135.155", + "user_payer": "HxmNg4kPUwGhGS7Z9EtdLQKG8Pd9VCg6cDtEsYXLEsoa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EK8TMW4aYttQVf93LQLciiMtQorFnks1pd81ooCmVyba": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "46.166.162.105", + "user_payer": "dztSTkqrHBccyYXN8pPxCieZB9HHHz5jMaPNBD7oj1G", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Expired", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EKp4y1p4gCjcxMLDKhUmvHcVSCWXkL6aaVmMeV5HMsZT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "SLAY6uN1zZpXBTfbuDDCesNmM5D288xrz8uYvfS3n41" + }, + "client_ip": "177.54.159.47", + "user_payer": "SLAY6uN1zZpXBTfbuDDCesNmM5D288xrz8uYvfS3n41", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ELQNGsrzAAVGbMVuGvwMQmdQdkHXNGHL8qZAwHKuQeKR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3P6jt8b3eyQpghRpxhXgsLMxLDK8zshqc7SoYUjhhffL" + }, + "client_ip": "147.124.195.52", + "user_payer": "ENBBdAkfEj5FgWwuyxaWAprHaSAUuTainYRCZbMET8se", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ELWcRiU3wESYm8tBaNjZYsHxJGV6WgZ5fWyjCJFj1Tq4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8nbE53mcKhy74HLiGZ1q5HRocwiCvgh49csSaHSdtukr" + }, + "client_ip": "208.91.110.228", + "user_payer": "Dh2gycoU8P68YnJGo5S8SzQ5ERH3v8hurHB8gABQdDNP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ELnteUnbZXfd5EjPJCXeYyjd83sQnzt3ZDquRR6TLVWc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF" + }, + "client_ip": "102.211.135.181", + "user_payer": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ELuwLduXND9pBDNdSLUevNuAs6FJ9w9CzrB55gSLWLPa": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "160.202.131.151", + "user_payer": "r2rUWLeetQy7vfjprvPo9ncwxKjiJHAzTy4vVAF7LwZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EMVXe9i83ebT7Eo7B8tZjGNVqGwoBn6hFWm5T9BgtC77": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "98.13.132.49", + "user_payer": "dzthauXK5XpzsTzYhWu3CQdgpuUXgrenrQ7uzrJEaBN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "EPBGJrYDdfkYKYde24FP3DAUumf98vds4vrtkfXDDduC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS" + }, + "client_ip": "160.202.128.61", + "user_payer": "5baGeF51jo2HJt99tkHhFdjgXPzgtTus25SPMDwbrybx", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EPGTqLVGsrhfbVLcUx6hUim58NahH8hFjA6YDx2E6r3K": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV" + }, + "client_ip": "185.26.10.181", + "user_payer": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EPcRxUgya14bHEWDKb3ee9p2sAjYUSDCvPJvs3UmAZnF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL" + }, + "client_ip": "207.188.6.155", + "user_payer": "8d2JbtZhPk1piZV7tsrDvZLuXxqckLVov5TN15PxZsqU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EQ9PcqWRxFRm7mVwZY14qtZpzYv7hRn55sgVdZetwQF6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "RBFiUqjYuy4mupzZaU96ctXJBy23sRBRsL3KivDAsFM" + }, + "client_ip": "195.12.228.205", + "user_payer": "ALQPuG2Lxv5FZCZMoQZLqifFBagdkKAHiWG4hkxrzdJX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EQcXci3QEx7TwhUDmarhzKWwHwDQ8zAmBAomKnX2Fcwm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf" + }, + "client_ip": "72.46.87.225", + "user_payer": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ER7E9xRAppn6TYB37VbvP85SGzKxszodNgvAZCrTg8Xj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "T44daqV6B4hZfCZU4ze2WLmJdn15TLkUy1bv8bh38kr" + }, + "client_ip": "64.130.63.145", + "user_payer": "E8JKqZAQtYkWrBqx3H5eWWuky14Z8DNGwq61eqQ5wcp8", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ES1pqvrkwktfCGbMSc7T1HLWF14CDufH7QCgohPfMPBA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw" + }, + "client_ip": "69.67.148.127", + "user_payer": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ETT8zroqC8nADgXUGRSW5JCuTtZ2MNt73Xd8169N9qgw": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "204.16.246.39", + "user_payer": "F44fgd2RRM9BjfEeH92DrvXBrYdU9XjJjSLzcBmkDERk", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "ETWQuP6YssZzNyNmFJmz1gnUdahitddPDA6VNMtxKVR3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Hz8GtFP5jUYjbT7AT9SuLC8XpMX4mokBBuugqWrwAc3m" + }, + "client_ip": "109.94.96.55", + "user_payer": "KoLibrJsbABbtmtFPc7nPvDxT81rc4UPM7mY9xSLjpo", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ETZeWpwUEVoiZf48qh1tEMnmm44EkFydhCdWUiLJpeUA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9aCLnHrqaAkebz1eDZMDer9EFJxrJcRZG6CnnNbwK3dV" + }, + "client_ip": "64.130.41.40", + "user_payer": "9aCLnHrqaAkebz1eDZMDer9EFJxrJcRZG6CnnNbwK3dV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ETaVUmux2roGbvCMV7ihiVz6QLjyjHBuX1AQ3uxD8TLx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ePtWhJMfLK9YysifPd4M5fP9MSBoKiZuS588cCVTvqi" + }, + "client_ip": "162.43.190.143", + "user_payer": "BtQLtvQG6aeYLGT8cyj3RLfvvS3NLgTqym3eKSFqdDMT", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EUGHTZ3DP7U8T88c79TDarD2fPLZ636SCNG9nvDuiTFi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK" + }, + "client_ip": "206.223.224.55", + "user_payer": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EUfjtWERwLHKu1c1Qd8kxTgECgzkwM5x5VUQzWD8hEfr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "jagBNeXYncnn1hzwSq1JJ16XhWTgQ7DCFVqndSJZ6vT" + }, + "client_ip": "103.14.27.37", + "user_payer": "Eocdw5GT9JevaivSzGymaXzJnwCndoNhWuuDroHB8caP", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EVpdFYCoHVFE3oCNm5RsjfmDMZ1hKr7g4ALdh6RebJ7Q": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5oDRdAwSMyvNWZaiENWiThxifPGsB3WcVkfVz5uswK2G" + }, + "client_ip": "85.195.110.15", + "user_payer": "4CfRQ8aTeemFXCiHyLdjbgPuDrFnvZKmcxjyEUofy9Gy", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EWXDMUHwpGuteniPD9TzXMg94eJzSyske8PhenbUim5m": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ" + }, + "client_ip": "84.32.103.107", + "user_payer": "6UUiSG8HwMNPH2BZccWkJ4jNHBPhKvT44ewQLgMR3Vp", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EWeqXg6yZ9rVqo97CLMY6w1naCm99kQtG2PrpVWduseV": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 250, + "accesspass_type": "Prepaid", + "client_ip": "64.130.61.140", + "user_payer": "6KsdpQwWAcYkt2bLaCSLN7Z1Zp8X2dGCWS4PZRGz46VS", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "EXCxfJbHvXfY56tma9tvcV37F7yQjBWPZrYemqkibvx8": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.52.115", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "EY21SLWDLjsSDkC2yLKd6BTA6PZsifFvzsui71t6j8Ut": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV" + }, + "client_ip": "102.211.135.167", + "user_payer": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EZ2t45Z16Y3BNAKvwVuLhrMVoPudnwKQTyqypWz4SJT2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ByzoLHrfhMgYrAPipDoADwERiys1Vu3Ur7DDnAowA9EW" + }, + "client_ip": "38.147.105.107", + "user_payer": "CADuawrj4x74ixX6nSYrkVYzqRnMLDFqh2wsFxF4scww", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EZDa6pFpvSy8PXt1DHsamHvmvuJnFfN9rGdvksNcRBh7": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "146.0.231.81", + "user_payer": "HGj448LdfkdtF3ENjv7W2WHpMNZ1qNy4zv1kEY8KDNgj", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EZqoMtNC6QNuBxaJFooCscBmYCN7w9A3sjjkaSGK8RDw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ACvL73V4GNnxPVfZ7K89jCrYurLyzpEuE9qirjvh2Xmi" + }, + "client_ip": "188.42.130.84", + "user_payer": "9kAJtm4PUBEpPcZ1SvPuGmgC2TEdfVG75RqZSmB62Dfr", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EaVgqM2tj6bV7c592ppM6vne5pBVZuwJ1KRYwnykqGF3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "KAW1LjxH73tRBd1XsaqsRsgeERFkg4WpdXUSqR4QjkW" + }, + "client_ip": "207.148.65.229", + "user_payer": "GBzbTunYrMzcpeyJ6nwCUCupAbvEvE4xJPx9SXjAN1vC", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EaisEj297awdcSXTg9p89fDeKW8uWnJQyN4izZiagvS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw" + }, + "client_ip": "189.1.171.179", + "user_payer": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Eb1NsDzXzNWhhCdfpNSNNrjrXHANPM3UfH2fZ2iegvsE": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.46.71", + "user_payer": "BTvitqoKBWLyu7xkswLjkGm1iiiBrRapEkxHtanXvn1J", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EbEm5VvtDXYUsGmDsvZGS1bAVUE7TRSbxYkr2KpnsLLU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4" + }, + "client_ip": "67.213.113.83", + "user_payer": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EcTeq7RbSwHZVju1D3uWTs7Sd9kDJdA2YuNhGXUML9Gu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "5xPVZofUn6tax89KdHEUs5sGrcJ1ykUGKdyn5VANRgDT" + }, + "client_ip": "185.32.162.88", + "user_payer": "9PdEoNkcGh43W1xoD7EiAz8YmPgBT1Hqeud3zKiQkyNF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EcfFBrbPjAZshTt1LPXyFBucZRYPpHyYttZbNDiZZ4so": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "bay3wXfJsu9ds1zQBoQQ4DUwFGs3NP6q4gca9WM5G1z" + }, + "client_ip": "45.152.160.79", + "user_payer": "HC6Lay8Ax3agYUCexZ8PmT9iUTwzwACo69QLppHDAUcF", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ecu5c78sPvVkpdMZYsTbKvpwy9FAf6dKBjWyjkHJCLXn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9" + }, + "client_ip": "102.211.135.177", + "user_payer": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EdHYKdnsR6Qo1aF23jgmS54zJSgxycRdbQuqtrChYk8c": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HwN6eoEe9N3kwHi66hpQDBMFPk6ASQGthWKPX5MZmisp" + }, + "client_ip": "216.238.119.115", + "user_payer": "7zXB4qbj96s9Fryk9GDrF8vNN7sce65Z6yaLTsHxjppb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EdnmCDrHFEoZLjGdnXwr9LuMuVsmPnpF5UTn2xfQ42Rr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "oLAFKB6fkuiXPsd5wFUt3TfoF42iPBzga33Q1NBKWWn" + }, + "client_ip": "69.2.39.164", + "user_payer": "6Sxv3nwXXbSxi3fGR7dGQBUNhj9K1cgKK3gxsYPZJV3t", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EfCKmZ8otVJDzszarDnmvXggWcMYvrNwxnxKsKz3SByC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9JdZLEKhA7k6SxRQ4cJT2Zh5JhRUBJGXcjTNwMtTwSiz" + }, + "client_ip": "149.255.37.174", + "user_payer": "9LFcvnsUyb9eMw7FF4UX6YzhjjmJjGv6UPQ57YpiBjbb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EfUih38eLKtYF2TBURL5zeuiHcArpgVzvje1kWFzASic": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "Ettghfhr2kQerqAyGUuifFtBX17QecRe2gwpUZTAbZuw" + }, + "client_ip": "149.28.44.18", + "user_payer": "HRFjYHGQryvSE7ga59qWtUhBLVswdLhh3oU4iWW9Zz8J", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EgD3GafsiogFYGk5S1dmmEa1EdEv4BNKejniHw2nFAAT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "pfHSB9PaDAeWce7GwS8Bzvaw2ogCVnwBgfbiognZgRL" + }, + "client_ip": "70.40.184.125", + "user_payer": "pfDZjJUvm66mAnpRguLp27eJXRMbbf8EVycpgL38Squ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EgMyojeZZKSNyiuguoy4knHKMsJ7przNw2n2zRTmZNLS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP" + }, + "client_ip": "177.54.154.241", + "user_payer": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EgP4K1iT6aQfpporf6m2Vze72bEK4VgkqCYyn1VqcBah": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "UMi1r5J3SagSu4HC3waB3YFzbXi82rRSScgW2e8NTfr" + }, + "client_ip": "64.130.37.226", + "user_payer": "GaLQ1jLWyxZeTmwMvBotGBp8Cf4c1u94MNNeSGwWtD6t", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EhFa1aFfHszXd3Vni3WA8X7r7LuWKiK5uLdec8QutMdk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE" + }, + "client_ip": "95.67.53.214", + "user_payer": "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EhQ5FoQGXUMMUwEfXFMqDnWjGaVeWaciwZzPwS4tUffp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BiU1DNow77wGwSXW1bLmkcQe2cuySpkbz7xtbitD9Fmk" + }, + "client_ip": "45.152.160.33", + "user_payer": "BiU1DNow77wGwSXW1bLmkcQe2cuySpkbz7xtbitD9Fmk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EhiPanHJ4tiwbrBAdSWzFg18bUrqVb6pnWCogBQe6wht": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Stakex4B2tpDHPWGvV1dninfiaYCGdakgTknpzPitLh" + }, + "client_ip": "151.123.174.162", + "user_payer": "DZiGTxgDvmBFiNYmukLHYePG2S4CRydoHjQ4kF6vtMJu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EhxeYCDNLfxm24GASeKkcFH8Ma21v9zUux9bkj5Yj1ui": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "2zykwzzo1pd3H2oSj5j5SRLTvmpa9Nr2S2Bh8tTVd5Tq" + }, + "client_ip": "64.176.173.201", + "user_payer": "4xPk1pHXPhDcyNCT6Ze2cHq8pWV96pKhxRKpy48q6Npv", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EiZa78xFWEWASJFRxxTvZFLssPRNRLwJkSTszPJcdaFV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "SFundNVpuWk89g211WKUZGkuu4BsKSp7PbnmRsPZLos" + }, + "client_ip": "104.204.140.152", + "user_payer": "SFDZe38ktiSkmDfiqH5BmjkoeAvbS24XBCNgQZTew4P", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EiuXuqJ66o6RdXL7kNdo5KkfgkovPyf6XES6KANaHTW": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "54.91.101.32", + "user_payer": "EY5faWZ9t1DRqidiHbWp62p57zrZu2wMb7WcrSewPfRT", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Eiyjz1MLEpctXQQF5vWG1XmRJhcMTkjoyq1dXErYVzHS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA" + }, + "client_ip": "72.46.84.115", + "user_payer": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EjGSUXsjL8AkqGEKMtB13kATKRXzrvooRxhqu2ip6Yf4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "JC7bH7HSZoDhwggBXtRF31cVt71WiizY2J6YDDQfG5er" + }, + "client_ip": "89.42.231.167", + "user_payer": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ekw6Q8gEk1c1JzySZcTaxheTz6PHC8T9u4ZWCEfmnRqE": { + "account_type": "AccessPass", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.41.170", + "user_payer": "3jc6iBZEMN5NQKJ969EHtg9s9uS2NJ1YxwBjMkC4mYpQ", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Expired", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Em3aFB9K63HxGvT13U7FqBQ4qGQ6q8pGznkCpAy3zERR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE" + }, + "client_ip": "84.32.103.46", + "user_payer": "HkUrFZKcHv5w8RnoYps1oLSP7HJagKAyjKtvSYZmj2mP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EmzTtwsjza2x4v1XPo1RofrnSQecoXRDd2jURQ6wumVj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "nSGZ3tv2UhskkPqiB666yDVj7PTi9qKgDqvjHyw5JgM" + }, + "client_ip": "64.130.42.120", + "user_payer": "374voYegWZ5NCBKjns3Cd4kdgDgmL973Mpxtxw8QpD1e", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "En1Dzrn7MJwBx9u1hnd6TR9pj3e32CeqoGfSnfpM7tgz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Frdg1NUoQaaTmASWNTrtDrBU5PbTnWtUvtdCr1XPNn1c" + }, + "client_ip": "185.26.11.157", + "user_payer": "Frdg1NUoQaaTmASWNTrtDrBU5PbTnWtUvtdCr1XPNn1c", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "En4btmQavWPg3MKHG5jvgDAK95FCNJGAJw8HHZpKkJFv": { + "account_type": "AccessPass", + "owner": "44NdeuZfjhHg61grggBUBpCvPSs96ogXFDo1eRNSKj42", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.51.60", + "user_payer": "HFF3kp34qnL32vzc5f8nrffTAtudBetaLm4u8da6q5TP", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "EnKgjm4pvXL8Zp6WLTkpzUvHYgptb8gEEgp1EbD3bV6c": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "PUmpKiNnSVAZ3w4KaFX6jKSjXUNHFShGkXbERo54xjb" + }, + "client_ip": "64.130.37.164", + "user_payer": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EnLYDYY18cnMZXHxn4WuKX5YC2eSzA5pAJ7C7fjBDnje": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5" + }, + "client_ip": "192.248.172.51", + "user_payer": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EnZKUXfWFF1Uzpj4NrgLweuJLeuxaFrcwjWynCqHCMit": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "nXWsX9oEgsW89gdwv9jSRhHtWFmyL1VyVoDFE1cP8HH" + }, + "client_ip": "172.241.224.141", + "user_payer": "FijxN29RupuP6mVeLRmfVomGHFzFGZztw8XFyn3c54i1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Eng35LQHTKDBjoR8CeNNJUmBWEpt48FLr6voSJQA8Ew": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.63.21", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "EoJydEKu1juU1LPKY5ZN6NVehnAXuqvF2dcHNDiRM9QQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm" + }, + "client_ip": "45.76.159.29", + "user_payer": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ep49hck1Uo9zxGEEpH7sRQ9LneGouJBkw7NrCxkrZUis": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "soLStaCk5TiGCpeLKa9Fvv6f5JQGMa6S3uhLh826e9N" + }, + "client_ip": "86.105.224.111", + "user_payer": "EmE5KsWqFYFyxytrCQWy91aGZy7nGfd96cdPfi7R5YRE", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EqDkbqjGXhUufXFkHmDafXZscGHtck74F4roWek6j9jq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "46zY585UbTVYZpJdAcd9m3EDiEKqMxXvo5t8Kp5rUh32" + }, + "client_ip": "94.46.194.194", + "user_payer": "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EqdSjqnWGsstJvou1ZQapWdmvDeZbMMfy2nBGcQcrYts": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "nSGZ3tv2UhskkPqiB666yDVj7PTi9qKgDqvjHyw5JgM" + }, + "client_ip": "45.77.70.13", + "user_payer": "374voYegWZ5NCBKjns3Cd4kdgDgmL973Mpxtxw8QpD1e", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EqfbBzkwkTpEfDcnGdooymkXJJwF52qFJmeQLf35QPGu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EvnRmnMrd69kFdbLMxWkTn1icZ7DCceRhvmb2SJXqDo4" + }, + "client_ip": "45.139.135.141", + "user_payer": "GgipuMTLa5cuEkmjxYeyMLPZ7vekkxFJqoHcakxjrtJm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Er2hgvi6JZn2dsk4PwVeXtHkmpdrsztS7h3ZeY2QuT7e": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "86.105.224.70", + "user_payer": "4yA8G3Hk9EjFEvu4fU13DG4AG9YJTtGqFqTSxUf2CpUa", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "Er4CzzSQ8A1Qv4Za6p1b3zZXgGwp3568eKz3FsNprwLA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ECZx4Dfyn2o55KTYbM9r3Dt4VZRcrdfdrst7sUbWgrdU" + }, + "client_ip": "137.239.202.126", + "user_payer": "HxGDmKC6w6LLhrSCRq1HaKEJ5wNjQf8XF3UVi891ZZpV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EteWeCMgTsv5MpMtyqd1CYnyhLC1CX98S41RNGJiUvtL": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.34.165", + "user_payer": "E76tBgcNk8gjhbaEh8bFteSVRUB4WVA2VhvTGySG8hv4", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Eu6J9B9oA3amUwXBfEYXFT74yLFaVke5xpWzRoBfnHQt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup" + }, + "client_ip": "102.211.135.177", + "user_payer": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EubGb8Qv4RAFcCbZJUdazToHy6m6NGPKAvMyd6Vcksmw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FzAu3ktE2hAgoVcPeax46Zi2uJdQpTNeyJhH6LazgL8R" + }, + "client_ip": "103.109.101.4", + "user_payer": "4SBNw6R5swH6QoeNs7x2VtAZ3xCCtqgptPD1qmyWkVNs", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EuwxoXcDYAs9xsJuwH5eMT9qEUtmvzD35rjFKVcyniWS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP" + }, + "client_ip": "102.211.135.167", + "user_payer": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Euz91k2MdTZHC7o8vobciaNR6SqCFcRAb3gqRh4nYf9H": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "peNgUgnzs1jGogUPW8SThXMvzNpzKSNf3om78xVPAYx" + }, + "client_ip": "202.8.8.186", + "user_payer": "CgygyPjoMXUXJJZUBiSKNM94XnkQs7Bf2eJGVfwmiiE8", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EvpmzNoREMPt3kbbHrHXmit4WVMC9p37QeFdxQLjHj3A": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "2nhGaJvR17TeytzJVajPfABHQcAwinKoCG8F69gRdQot" + }, + "client_ip": "64.176.12.238", + "user_payer": "Gt39S3VS7tTYGJ5Zcy2KiXZGc6uD2Dgqw1cqu1snoLgJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EwVxL9U5WwTWNBNhNFr1BUxbcoEFKu2uTgQWkoMkEus6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4DAC1Es9UKCWP7HLaAKPyv2vUpgM1HbTws9cJtFP4ZdW" + }, + "client_ip": "64.130.52.124", + "user_payer": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EwfJb43TXYtqq1fXGHrChYVdxC4UA85eRgRBqHzHZy2U": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DZKTNGR3r4Akj3G42ReZatKhkmgEXoZjk5Ed2tFwRyqm" + }, + "client_ip": "5.61.209.11", + "user_payer": "CHmxBZfppTVgJiAxgGQMmAFbJ8kE1xgEXQ9GP5ckZHZJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ex2DAJiwMVGr8JRMwa3QBS6roJt6d3zJPRe8WbNLj8Sx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ZoD1XLMhxdMveAJL4x9oab4FhRKP5NThTnSCH19Tdjp" + }, + "client_ip": "64.130.47.138", + "user_payer": "ZoDZCucFALR6XbNnqm7WabtXbNqw5bh9pWymmkJ9KCu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ExpegP3BjJRM6upLgGjxr4EbqCEvnUfDHNGMwUpyaSdc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "91oPXTs2oq8VvJpQ5TnvXakFGnnJSpEB6HFWDtSctwMt" + }, + "client_ip": "86.105.224.92", + "user_payer": "EFU7NZC8o6nwa7GYgnUZerGyfsG8JAhGcpN6nyCGci9H", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EypAN1q2oHRRSSNFYSEAvqST3R49FUyqW5EwjhAo17Qd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5EAS8ZGdsXnNbbithK8Ej8GbuscgM9z9ZvDiT2kFZipo" + }, + "client_ip": "185.167.205.6", + "user_payer": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EzWUaKd2oz9M4ogXwLcTcFXuFMCZgUmkxWK2vSjAAsF2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "c3rtoMCHSbFrLRTAdw4iRowKSn4BrDtvSPbuyJwkHwx" + }, + "client_ip": "91.242.214.241", + "user_payer": "CX9w2r3WTjwkKX57PXoEGLU8PD6M71zKvJsdyxSirUMh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EzdcN7CpC3B9n1WURaw6uwGBHJG1h63ok9zBPTXbdZiv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "MBVyz9s72WSfUmbr1S8fgHjDJQkPs1Q4Wxi6A2Mees9" + }, + "client_ip": "206.223.224.53", + "user_payer": "5K9Tp8Nkg2KeGYyWCEAD3ajLM1Z1czhvgoZN7eAyWA2r", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EzsSqSVoNuCnKnowA2qiWZKXrAZxgUMxov2Vr5796Qd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CpgSfd6QUoBw1267rTtJoZhELqC5q7isKLojBifSbNEE" + }, + "client_ip": "89.42.231.163", + "user_payer": "6t2hFwzATxr8PZwJkuQ2aedphDVmHbeX2zDWWKNbQLPN", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "EzsbFhNCkqhwNGp9Tj5pvQ3gm9qwSWgxrR2qkYMYw6KF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FTn9aJD8ZGSTy9KhEwsYuwRTZMYeYgdV6RPfvKD2sECk" + }, + "client_ip": "64.130.50.181", + "user_payer": "DDB4XQGCCMdPQygsq6kPDz7VdTEWe1APfarNuGS9c8e5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F2Ep8DrBMRo9p4dMbJ1YK4C3UYWxnCCf4479EuR3tTvY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2Eq6YD8P8QXTeoz9h6JHjgZ55t8RSxNdx4waMDCoPmQU" + }, + "client_ip": "104.238.220.71", + "user_payer": "EVAsrVQgWCVQXHKAVNsHi41TbxFbdfyusM8AFUjdU8JW", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F2ShZK8dNAC23k63jkXCrMmVQmU4suXVUZyHKdYvP286": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "FAkixgHNMk1pd4ymYQ5GRufQPz1oY4Mj19qFQesKmoDm" + }, + "client_ip": "217.170.201.46", + "user_payer": "BraMZdFsdMyjvwn9NZ2um87CB2vFCX9L2Re58S2QE6GC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F2eX9deicWUYQcNFGUcMp4TxtHPLYKzrY89iZvnZsGLm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk" + }, + "client_ip": "67.213.122.221", + "user_payer": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F2h8VYL74YmNVArbg7MrViDUvyEyQmTmpEJJqu4g1Qkc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "capyS1jerxhFp1RehdWRG6kbWi8bnWF3fkEG2RGLsQf" + }, + "client_ip": "103.88.233.107", + "user_payer": "9SKt48rHR7R7Zb4RREkhUTLjK7MH412jKYWsLXfqGNHf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F2nYGaY4GT6Rn3DHVPhSYebpW2QUVh5jKk3LNfN6wCJt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6maJ1mXF8jsH39a4yZffXzsshfVX4xPyYiyGk38PnBu8" + }, + "client_ip": "45.77.140.45", + "user_payer": "7b5VyivVaadtMkFDbqFVPm3NWywNFueVfoAzt3YMCoJB", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F2qAVSPcHgFNBMmCMZZLQFvLUEt6am1veJxFSDMcK4Ds": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "202.8.11.140", + "user_payer": "8oVeMfrLEVFNsTRs6MryJNVJ1N8WyK8ktyxQ2uyFDuoU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F36S18zZQzCMrR8nHkLFnwFAqba6LLHmWSaa6iQVTw6g": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BPKAfGkkzF5u1QRjjB1nWYYbPMUCMPJe1xZPmwEMNMCT" + }, + "client_ip": "45.139.132.215", + "user_payer": "8urCjgfZ2iFUNCGTYMaHzRKeZFn3aYmxtbLL6cb1p38c", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F3e32PfbSqiJKc647pcX4C12mfK7ta4YgujgMJAAR8SH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e" + }, + "client_ip": "64.34.94.9", + "user_payer": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F3o4ZuFAvUwEDg7GCiVpTXJpHAqg1fEa5C7ZieMicyQb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "6pEtDovpyd1zUMYPuNhMCPU37sUTEAtzzgoVVAh1G1JL" + }, + "client_ip": "5.187.35.213", + "user_payer": "2Eio42hoTCEQiab6WXJqqMMpZLaWiTuTHbHTJRbzcYMk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F4ChHsgcuJS66vrUqkBjpmFLLVXbbiuicfgxPLBP4MaX": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "54.233.36.106", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F4RLLhBWLB4fujV8FTLjjLSAJTBPSZRDATufLryCx4b2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW" + }, + "client_ip": "72.46.84.111", + "user_payer": "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F6A44peESEKT5hQi5dNqpzfeZcdhJa2gXbxvMxsv9TWR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GvfaiJUhNCRZGVGumsEF1eHDb8JpAeFAyHSrTifyhrbt" + }, + "client_ip": "177.54.154.11", + "user_payer": "vzzAePScm8ZV5oTnKCmLW2ZPGETo9nt2BXhgvoELM9R", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F77ZpkMLv33mqQFQP8JtjwCPZBwDn67xvJQ7SuHYh3aN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7" + }, + "client_ip": "185.189.44.133", + "user_payer": "76dER8N3JzYozG5bmnLMMHQTdqu4PjoNm7DLQYTrFfXH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F7FUD2BNcnkksHs4nU6jFCKjzbLig5NKWgaEV5sdJvfh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GVu33VaUABXuM1RkLyLJWU9nhDhdr6ejgWg8BE5N9TQL" + }, + "client_ip": "185.189.45.177", + "user_payer": "GnqBH8nSjBfsPBdvHz25qyYxiqdP7vzR1C254X9yRB9U", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F7Yp3NepZ62EuGRfvuGrziVS2oC1LDQWMMFbuX547rru": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "jagBNeXYncnn1hzwSq1JJ16XhWTgQ7DCFVqndSJZ6vT" + }, + "client_ip": "103.88.234.131", + "user_payer": "Eocdw5GT9JevaivSzGymaXzJnwCndoNhWuuDroHB8caP", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F8t31A3c7vmefvSR9LmMJoc21cWibgqUggW8D6sYmVUF": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.49.37", + "user_payer": "BWDeCAesUjq5vpCgBoQR2vuDz8fELCESitRhMnUSi92H", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F8tfgDpjvPoYUzL8m2RdruSwpo7B8PHeyNagLKhRUKEY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "kom1oNHyyt84XLGVfi5Jo1qkVkU5xG1sBxPG19rWknE" + }, + "client_ip": "103.88.233.79", + "user_payer": "EVucxMafA7ciqqJ2ndXjqy9KCtxdiWBnEp4j7sZuwVJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F8v7aBU8t7GMKoWfJTiFGs3SEs3aXSnhAB9Q358W3vQn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2Le6TjeEescF87qDA8Ftdz6U8Kq6SNVwoLJLhzBCHUr5" + }, + "client_ip": "64.130.32.201", + "user_payer": "dz4WsVpG97nvK7PG8CLbDE3ri5D86Ar3fzpeHqBhDBM", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F9gMCq8bJ4Ji9zxVjpt9SuUeZV23MJLzcFrQJwgWFcFd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD" + }, + "client_ip": "185.26.10.181", + "user_payer": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "F9nMrCeoSssXZys1Xr7GgefQHxuqBXCpAsyfS3AoxRA": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "67.209.55.22", + "user_payer": "36JU2jhWwaEaipUZSBRNFmy53hFtjTjLtERApWMAXKvF", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "FABMEj2o5r2MHqVwXJtDfgbnThRSDWi8J1JPVRkeVDNm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "SscQkTYV2BFQYGGffAmTzvefrFrw6z9GNYiWHstVZ77" + }, + "client_ip": "151.123.172.94", + "user_payer": "ssZbdqVceyPhupmozC8pAEWNC9T984bNBeGRr18DnDz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FAeUd9Q55Mjub8HuowhB5HpipL2ctePtpQpoWNQUwXNR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5HCTsoKM7vwjubSZSyVWChaHQ9sNNRB1d2SuvL3eZ6Y6" + }, + "client_ip": "67.213.121.121", + "user_payer": "B4zFSvtvknsW5uRWh4MUgNcz7wgwrdjEQpmxKWsrrzFp", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FAjuhAgff7EwVcvnYUFM6xhXPLL1qvkYqhGCQCszbRag": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn" + }, + "client_ip": "104.204.141.142", + "user_payer": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FBAycugn2MbUmzj5BNthsExiy9HMkigrc4bzbD7oi123": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "198.13.130.56", + "user_payer": "HNEdM9cSf5QCQR2ftyAqcwk6XH1ZrmVh3LG4MVNwFkbF", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FCSaXFtVXTjjkYKxFWsavEWnq2KY5eASJWNwLgw7g4a8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EvnRmnMrd69kFdbLMxWkTn1icZ7DCceRhvmb2SJXqDo4" + }, + "client_ip": "104.204.142.110", + "user_payer": "GgipuMTLa5cuEkmjxYeyMLPZ7vekkxFJqoHcakxjrtJm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FCckT37o7HetiZgRmt1vw26YYtf67wN5BRHopeFCJe6e": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.50.70", + "user_payer": "5tR1U5TAsuTWUGfsiJrBhtDmSzNnogEvtdFiL5rGcdzd", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FCjtfBmRoGfvXD555PgaocUqVKJ21nqRsgh1NBrnN1Q4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o" + }, + "client_ip": "109.94.97.187", + "user_payer": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FDKPKJiRw2QM3MUePqksFYgzvF6WvCD2cw6T5KGL9z9R": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL" + }, + "client_ip": "185.26.10.181", + "user_payer": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FEhEiWtfYwyEmZfk55YhAeqqg34EC5fMDFW2VWUeFZaS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6SF9KgkvNRi9rUF1vihHeSfrRbybiXr542JEWzox4cWv" + }, + "client_ip": "45.135.201.155", + "user_payer": "Ey3DkEVbfBxfWmkTsG7Hqj7jshYf5Zx9H8462Zjjkykf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FFAdGm4J5EcC5ppARWZy968ypt7CgZinf633KFFHe8W7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu" + }, + "client_ip": "185.26.11.195", + "user_payer": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FFYtvZdq1ncPNPm8xeJQufcXYQsGKUqoXPbFiYoDP7ne": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2nCMYSwFM5TsWhooJDsYjv25wQmMuPag221fnURwSnRQ" + }, + "client_ip": "5.187.35.42", + "user_payer": "Fy7BRtoUrNpGfbegKvsnhst2DTqULvSjtt5X7vM5ogjc", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FHW4Hdebg2xjHyVeFHfFgx3ob268QrG6BUAyV8xibLYU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "46zY585UbTVYZpJdAcd9m3EDiEKqMxXvo5t8Kp5rUh32" + }, + "client_ip": "38.50.164.87", + "user_payer": "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FHbsPtZFEg6je6maCSi5m2FLturS2VvhnH1hohkSURAG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "CtvdyHYt8cMuGVHFarV2RADfoCdnrbd8e9jAsB225uMW" + }, + "client_ip": "2.57.215.97", + "user_payer": "CjjwfyfjkoXew2KYkGHJkAuurA5cGaHi8V5LtrPdZ5Ti", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FJXHyKikz91qG6LsqiDq1vwWtueuPh1VML3qWVFEoqYw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2SNDBJfPk4gp47kPBt71crko4dqS4izdXMeVHSkiUYEU" + }, + "client_ip": "63.254.162.36", + "user_payer": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FK4b1HfQnucRWdJC1m8sRRwvmKczYNp2bmo65AcFSYLJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DWvDTSh3qfn88UoQTEKRV2JnLt5jtJAVoiCo3ivtMwXP" + }, + "client_ip": "170.23.153.203", + "user_payer": "EQLJDB5PdY9exCPvtaFobti9WgAGcxHW1e6kVF8eacX4", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "FKaLFg4ccDfkmDtTwCJAE1gMgo5P9z6RVgByVYqeJLer": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4iWFZJ4NCrkHdaU1zzsbnKdKubce685LecSJJ4cHH9yG" + }, + "client_ip": "189.1.171.85", + "user_payer": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FLQntXQtTichLPg6ne9UQqmf5wgzBw358VWQMeHGBEpH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8aPHvzVV91jZF948tykkoF6WfgLHppNfG8Z3V4gCrDix" + }, + "client_ip": "151.123.174.237", + "user_payer": "GHxoCXtgHSjFVan4L7sVqBXwScd9sC17uke73WJ2b7w2", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FLRqniJoV1ZSnjQe7RroDrj2nJV4Rdn5mhzPYTenFrbF": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "72.46.86.171", + "user_payer": "giwr6yNF8gMpgXWDt1T4Yya61xk4aCz71npcTs394Cu", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FMKDDzB38T9ekUzbRD99B2gZWmU2yFRnDn7LE34UW2BQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "uEhHSnCXvWgtgvVaYscPHjG13G3peMmngQQ2ghC54i3" + }, + "client_ip": "149.28.180.128", + "user_payer": "6iYsGkEPz6WwJYHxC8GtDQXRiKxdmWXfc8qrfMcQSW41", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FMWAigvTJNcceEmayyuQCrJv4HCJXqYctgFbVZUdhjL9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "PAWsME7oYbjt5TRNc11mBa33JhKnQr9AYherdr9YAZ6" + }, + "client_ip": "84.32.103.107", + "user_payer": "64zmXK9wbsJGwR5D6J1uv3SFwgRzw63Xn3VvYmw2AY4T", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FMmKJyJvsbdWQGZqg62wgsRdtGw9uw7rUjBmVcBZsTa1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "HSZv8MAadCzpYc5YYvrWTjTK7Pk8hkA3hUwUHJYYcYQr" + }, + "client_ip": "5.199.170.100", + "user_payer": "4Dy5N7pwNSYVYwV3KMFkF4op63S1Bw4foFmZwwFqL65G", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FNDbefAQqQDmuDNpmzhjiAnHvbfG242ncV67LdVtAbj5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e" + }, + "client_ip": "185.26.10.241", + "user_payer": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FNVMDc8YUgKfrtx5rmFvzCKj2q3a8zHTjT4QVp4DRFh5": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "208.91.110.153", + "user_payer": "qmEXyFqyDkuxY3dPdbvFmsidcSs2tDyTFdvkHUVtLac", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "FNhzp4C18Gif4h6nhUEpK4ahwhSCEj8wrGdjdyUxjjmM": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "202.8.11.167", + "user_payer": "5eJnbUbn2cY21t31uWRUBLdmYkoAvuNRxWgugFJVtZvd", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FNv32TomB3mpoLk72fYSvoSpVBNeJN45mht28WaUzdXm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6LnYdkv8G7Xgz77CVJxrJLHb2PmaeECRP8HfQQgDJaGZ" + }, + "client_ip": "64.130.41.46", + "user_payer": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FPEbmn3ohAhNUHm5LBLPjapDtG5ZrfrfhpU7XKCqLWLw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CBUGET5PnvLc3HvEeFYj64iTvdKhYV6pujTPDdDh785K" + }, + "client_ip": "159.148.20.198", + "user_payer": "2qu6A46TCo2eyJ5RsHJ1KeGUtV8gJGWmQJbfCs7E2BjM", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FPd8pKMSUt34ACHsuwEjke5Vos88TNugcgzxEdYgoCzK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DwwZsFuAj8iVwfyjuQzQ2GucZurtjpT4msnBP4Kop6GX" + }, + "client_ip": "95.214.54.140", + "user_payer": "FSkkUkQEdKBpjSbaVHci1zyu1HP34YKqd6LZnTbSkL24", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FPeAaHExXRn1drsGEosbFLQTA9nXH4MZHAb1opB4ZNqH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN" + }, + "client_ip": "177.54.154.233", + "user_payer": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FQiu7uX3sAUtZF2ckW5ac7DZWWVJHMQsu5wzXc2TtMJY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6Ut1wC8PhVGtMiJYHicbc3LPqSdg1tKKxyLbFXuFvRva" + }, + "client_ip": "2.57.215.182", + "user_payer": "D1scGjE7PTWZ2L72Cd3rgHF3pMfL7VyMG16ghHAKJis1", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FQnZteYaxr57QBd2o7xM5PgxmWeETGnorVLCs1H7QQ4Y": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Crg1X8FftV44NmwfFvgREjanBQmyyS7NEu6duLU7Cyy6" + }, + "client_ip": "64.130.42.113", + "user_payer": "BJjRL2rKwV2gxNWcWkFVy2q38TRpd7bWBHEws4fvNMBF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FRcmn3GsVQJEAz1LR8E6EUoarbCejReS7dZAXRkRsPWJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6T1otvmENgSy3XK6DBA41KmBno6G5unXTavbCCaNZis5" + }, + "client_ip": "67.213.112.35", + "user_payer": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FRfNRYkTfuQZim9rZS5bc8WRGeZkphdrFhaCg6HBMaBj": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "74.118.139.111", + "user_payer": "13NGPS7FWpY8b1GznECvYYb9XnbhPukA8AUUz8jjX5N2", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FSC1zqE79FC8RA9pKnkPp2cTscSjjJsFKRmNRvuyUcZp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "tkmaiSoZ3F8MofkQBVWG6JYSCzyN6ioe7ReYXohx3WJ" + }, + "client_ip": "109.94.97.193", + "user_payer": "8XT7HWWmJTWmwvqQSAEyCUyeMoKhytK6MEBBt4njSzAp", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FSEFRdFXQaG4kuSCpT4UhdNZXmCf1eGZLC8vr79Utmac": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL" + }, + "client_ip": "102.211.135.184", + "user_payer": "6ERi1d3xL1PofYUKC5d8tLZvPz3qnaw88euQqkvFy2xk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FSXEKpcMJ3M4ctNFcMZug3e6Yyx2V5yiaSXSMQQe7rMR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "RBFiUqjYuy4mupzZaU96ctXJBy23sRBRsL3KivDAsFM" + }, + "client_ip": "138.226.224.66", + "user_payer": "ALQPuG2Lxv5FZCZMoQZLqifFBagdkKAHiWG4hkxrzdJX", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FSk8voX8pZd9BGWyJkCsZExevrQD8TphhyU24aQGpqnV": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "34.40.119.120", + "user_payer": "LUZKNVwuRsady3kYiMPSDPkAG18uuie7kM7HuoCjsxP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FSo6GqeN5NNXyWTZJBqmwShdwdFSZmjXc3NAqvBKSxiK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4uH4G6YiD5G8rU3mtPg73C2Uqamrqedy3FboTZcZrh6x" + }, + "client_ip": "103.28.89.136", + "user_payer": "BEPnDy5Mgds5C8EnwX4rhbd47LwE7VdwpJY7Ui1SGH9r", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FSsTXMx5vV1mK8jzn4EoHYo7d9XwZzTLFYHz33JL86he": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "6tpuCGuvAZyUwQPFLKmiUfGUKSBjk3yVHJ314cfJV4ZF" + }, + "client_ip": "79.112.5.50", + "user_payer": "6tpuCGuvAZyUwQPFLKmiUfGUKSBjk3yVHJ314cfJV4ZF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FTCavRXfWckejy5ESJKgcp9gNwJxVxgHAyK9Yg3PuKnr": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.51.61", + "user_payer": "5inQpgodpNrpCPyz4i91pfA4ecWsPUVwT8FaYW3pxNkh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FTGTz9FrAHW3RkpTuGwvT3SRPmpi5S3rhUMkwweLN813": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.49.251", + "user_payer": "43G91PfeV4q1T2WHRxB91fUmXeiMwgD4CCxKVEKQ5eJX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FTbfAKupfGFvVdXRb6gGMi81QuPXC8uuqtq681dGHo9i": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "AdSHK6vpQnwHRSw7jXUwjMEytmhFwnynZSENhvpAxL1y" + }, + "client_ip": "207.148.31.63", + "user_payer": "HoD9f8qmxEW9jXgLawE3zdWCPLKBbGCrL9Y1q4xXWxsj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FUyHCE6xrVnEbkvSv3zj8k7BkpfoUXiJPbncLMVYbp9k": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "185.191.117.77", + "user_payer": "5z4NEyqhrsXfy9HQLoFhVDaBoBCGAfiA3U6kzAME6W7X", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FW4JBhNh5C8g3v8GLwkfSVFWt6Vkc9UKzawEv9N2Mjde": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HqotBmo2n2iQ396GJ7fRqRuEtbMxQ164YNTK8wbT8k9n" + }, + "client_ip": "5.61.209.66", + "user_payer": "6cfcopD5wh6ZMftYDck1KV64gvmHpFjF6w3rsFVTCkEf", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FWPqmKFmgiAQ9oGrb5478FQiDgHDYdb9q9Z5JysgzQEL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "rubyWZkfnjG716rx69n2oCAhevVZaMRQunir9VQcY2E" + }, + "client_ip": "198.73.56.216", + "user_payer": "rubyWZkfnjG716rx69n2oCAhevVZaMRQunir9VQcY2E", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FWaSit8bZ4hNGXdxGv4vVpPTz3dpH3pb76NGanpunup1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SscQkTYV2BFQYGGffAmTzvefrFrw6z9GNYiWHstVZ77" + }, + "client_ip": "64.130.32.174", + "user_payer": "ssZbdqVceyPhupmozC8pAEWNC9T984bNBeGRr18DnDz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FX4cqsXdNbsrBhAy5BGw2WyvBsWWWbfoADLbJUjtuhKY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "YUgwtxRyd7n2Q65BPeVN3EkFhiNTzGJot9jegLDXG8s" + }, + "client_ip": "64.34.80.117", + "user_payer": "3Gjc9xDUYWnjEDTBenDizYZGoXZtPVvEiJdcZMuiEwud", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FXLesmJUEHiT6cyJzBmddnbibB1tLm3Khsq7JtSjJJBd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4" + }, + "client_ip": "72.46.84.111", + "user_payer": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FY684qWWbxG6T9uK9uVVK69bgf86GCfyUJ3NkKqLvQVb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "movJfS8W7z4PzZJbanwt2DDSN3NbZSyadbDp8DnqbAP" + }, + "client_ip": "195.12.228.198", + "user_payer": "9WNHFKyfTN6TMkLkEZTPKY2y1TexuuL5EQKyqPz9u4vq", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FYQTKLq1sbuiqRxtSqTjKcuQfR8ar2bgxV8oMxkWRgb8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "nxts9SpchNGqWHRB3zmhskt434MCbUUwkeUcs6xX5oe" + }, + "client_ip": "216.18.208.58", + "user_payer": "866ntQVLu4rs2EVA8tp7rK1LB5PfJFLaSkVAPUtZSNX6", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FYiyPHLnY1GexUqQ3yo9xwnRi4oFDM5Q6Tvw3qyViFrF": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.34.80.117", + "user_payer": "9pxQ4tzujoFXWiKi9trTHEUcga2G1Wnqfz9MDtf7DcFu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FZTHd47Uk5uCeeqJtuRiJkAWp6CG7vccYVm6DWgrv7Co": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DWvDTSh3qfn88UoQTEKRV2JnLt5jtJAVoiCo3ivtMwXP" + }, + "client_ip": "94.242.240.68", + "user_payer": "EQLJDB5PdY9exCPvtaFobti9WgAGcxHW1e6kVF8eacX4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FZch2BuYCZ953dksNdqu24pusk17zbhHBUJKvWVNxH93": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 250, + "accesspass_type": "Prepaid", + "client_ip": "198.13.136.182", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "Fa39cXCnEYp38qdhiotSxYzd4zhnp2eNLxWcaZUsPKLn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "uEhHSnCXvWgtgvVaYscPHjG13G3peMmngQQ2ghC54i3" + }, + "client_ip": "139.84.238.122", + "user_payer": "6iYsGkEPz6WwJYHxC8GtDQXRiKxdmWXfc8qrfMcQSW41", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FaZTDPSBW3CFtGoSMpPSrdrEWZ9uYwWJzZTgVg6CPyPs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "8augxYLUge2iWmitQMwbcBL5VQEpsM6aJdRofhwpnzyw" + }, + "client_ip": "103.167.235.222", + "user_payer": "D1scGjE7PTWZ2L72Cd3rgHF3pMfL7VyMG16ghHAKJis1", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fb3B81jtSuBVGZDHjXqGeD1Q1a4s2WnKV1HMt2a55Fs4": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "134.209.10.105", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fb6TnQyq3mNDQog292d7kBop2oAfmSC8yDnUvyTGU9Qw": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.32.133", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 51, + 174, + 2, + 67, + 109, + 220, + 168, + 226, + 12, + 124, + 251, + 34, + 171, + 48, + 174, + 66, + 239, + 236, + 202, + 29, + 131, + 235, + 61, + 27, + 53, + 22, + 213, + 129, + 76, + 147, + 147, + 153 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ], + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 231, + 193, + 102, + 84, + 73, + 27, + 224, + 26, + 26, + 207, + 245, + 127, + 47, + 24, + 24, + 143, + 142, + 201, + 203, + 18, + 250, + 154, + 124, + 177, + 79, + 4, + 2, + 93, + 104, + 254, + 177, + 78 + ], + [ + 51, + 174, + 2, + 67, + 109, + 220, + 168, + 226, + 12, + 124, + 251, + 34, + 171, + 48, + 174, + 66, + 239, + 236, + 202, + 29, + 131, + 235, + 61, + 27, + 53, + 22, + 213, + 129, + 76, + 147, + 147, + 153 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "FbdMsysY2XWGXNic1kifvuK6ub8QUoksMFzYohy9cnzB": { + "account_type": "AccessPass", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "186.233.185.50", + "user_payer": "Ak7YMh8D1Tqx7jGRuNPypHb147RSHcnGBr5s42zy3cnF", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Expired", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "FcAp3x4CjC2V6yyeqH7hcVjoFp8hSYmye38wKt12xYRs": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.59.45", + "user_payer": "dztWRNcBYCNRasG5RM2ZFkWkBNQhz6qbxMzXKwG7esi", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FcDLa5S4bcxbfJrws3rDQxfYVdTn8snN38witVhsSbtj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6MiEjXqYksCtKnJpvAp3CAoEZnnWZyoSxu41HCzAYNdc" + }, + "client_ip": "64.130.32.88", + "user_payer": "E8JKqZAQtYkWrBqx3H5eWWuky14Z8DNGwq61eqQ5wcp8", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FcFBSkmp15hfSwLbsBuiMYpvEhgAKFrBAUN66ERJvk9d": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.52.139", + "user_payer": "CorvusKXgoqpFTdypc8ZMRCZmEroFMpcn2qx5wu48PSp", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fd8C7RMLHVGHwY3xBSd5zWc4fk5L8WkLRfKh4XSYQacD": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.42.124", + "user_payer": "9wsJ3uCdJ3SoaVTF9kvhPapAhJH7SeQtAjVzreRU557d", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FdLdWEarJoaAibtsdvFu9fhReWezik2hCReXdK2DVsXP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9r2CsyjRTmTRtu8GFk5oJRSQr5YfSENxDkf3eox8iPLa" + }, + "client_ip": "64.130.40.157", + "user_payer": "9r2CsyjRTmTRtu8GFk5oJRSQr5YfSENxDkf3eox8iPLa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FdQTYS27bnULvBPPadnSagnzdHSyFy3xPXdL3VVWX5bF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk" + }, + "client_ip": "69.67.148.115", + "user_payer": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FdrdUEoTo2aeJX1fCVKAAsUFxW5K4CBuLvFihsxLC26b": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.46.153", + "user_payer": "BTvitqoKBWLyu7xkswLjkGm1iiiBrRapEkxHtanXvn1J", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FeVoJBiUHQTjEHRcG13cjtFMoNfR3AV5j5yQrJYSC5Zo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HJHDGgsLBBGStNbu3zRMSTuNuUotzWoLeCSXHPzQmamo" + }, + "client_ip": "124.36.43.22", + "user_payer": "9NR8T2KaNPKSMaG1hQc7vqrgmkr7VBjqudDDUkTM5bQM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ff3AkGxNrrt7cntPE5V8AiaQdX4s5DQkT1bqPdNXpw2R": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HEL1USMZKAL2odpNBj2oCjffnFGaYwmbGmyewGv1e2TU" + }, + "client_ip": "208.91.109.57", + "user_payer": "DDB4XQGCCMdPQygsq6kPDz7VdTEWe1APfarNuGS9c8e5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ff4WtidnaWQk6nX46oiEM9WcsSYMqS5GQZxDvj2fEEKA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ADjyeNzWd8yhEjCVyAqT87eqoyGRbimERQsNhFQcXjop" + }, + "client_ip": "84.32.70.67", + "user_payer": "3C5HPrFxxanYuV7973hkZSqSWrFXXfKMqGRuu1sPJvVa", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FfBvXFVpGnNm6XpQSSsv8NT57GccPTBRNWqbdbiB3gLs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "adramSYKBv1yHoZTub4kepcmF5LybPxwyJcsz4fpfi7" + }, + "client_ip": "216.158.77.26", + "user_payer": "5WXoo4b6TYzHdgkoXx1joFdPDjR7gc1P2aSGTnPsnwR", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FfgYyhGdvWhLt4NGq7j9nZ3jDF1JeJWjppnL9v1awNze": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "privaEdSEmnMPGPoQACUkcDGkFBbTArVvsEGd7C5wUM" + }, + "client_ip": "64.130.40.170", + "user_payer": "CCohvGjRYik8Kp9JSm5qVLk5MDPpoEJJo1ERWvaerxCF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "FfjvyR2N2RD6WqpujZ515yC97qUmxVfAGmapk52hwUPT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "14JqZ9gCYVHrHp1TLRwFm1nYbNjR8bW5H3TY8gzZjkyR" + }, + "client_ip": "64.34.83.9", + "user_payer": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fg1KjwEw7pJvwmEJ85omYHXf1pJsvYRasB2y6Rv1XD7G": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2QEzJ7KPvhvnhLFw4Qc4wQYg8hpFtVxmyweys6kKA4FB" + }, + "client_ip": "151.123.174.242", + "user_payer": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fgw66bygJ9TVVESiXNRmZfMUjFKSijscdq3se92UvHtu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6MiEjXqYksCtKnJpvAp3CAoEZnnWZyoSxu41HCzAYNdc" + }, + "client_ip": "198.13.134.51", + "user_payer": "E8JKqZAQtYkWrBqx3H5eWWuky14Z8DNGwq61eqQ5wcp8", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FiNQ2Nkmgb2NH5bnriUeiG2XqyxnUdqBUzmCkNQNcrrZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AiBEt9kE8yZ4CnaLfTCGMp7Fg2wCtqhPTfvJ8D3zrLfu" + }, + "client_ip": "213.21.201.79", + "user_payer": "3ciLyv4sswadGGab4hSsfrskdVxdMQCD5Y6WPFJSMyyu", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FjnH3ni8AcsLNRfHH6kyjVQA1fQfZB1J5txFW8fxMjf3": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "185.191.117.148", + "user_payer": "9UgC7CFKL5ntinm8ssCj2MGtJd2r28LTfBvqkDRAJogb", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FkDU799ETXmcoyUJ9BB2EVuAr35DqKU3N6CQzA9J1rQc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2Ue9zGmDnvYRrJNEjuAdNkbbickw6fKWtbeNM7T2rakg" + }, + "client_ip": "84.32.186.112", + "user_payer": "2ZZkgKcBfp4tW8qCLj2yjxRYh9CuvEVJWb6e2KKS91Mj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FkUQ2Hi3giNQf7dXXpY78CzWzRUU3QPHenyHBk9y3cd3": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE" + }, + "client_ip": "104.204.141.119", + "user_payer": "H1QBG3ySwr31cWaZmpJkpLzNrZhM2e7hQMJdcrysuqgC", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fkyd2Zj5pEsKYj9pJNP731ZDhxuYAineVtsxpAvjdYf7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y" + }, + "client_ip": "45.77.235.115", + "user_payer": "J2ibtVSFZd11ccVf6CYS7w1MeNiCjQjosDAofhZbaZ6T", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fm3SVqaN5XF6GWTQcdqGYyYBP9Q4mCfhR6gLpzR4BD9Q": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6M53yM6dsE6hiaHgxWvYa4fsfzQTGyAZn7rM6JrzbqJV" + }, + "client_ip": "51.89.11.197", + "user_payer": "CWrQmiqkTKVkP2gZRjuX3n6ofYjhE98k5SgLn5AmPrZZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FmCDyNWjW91dXmcfGG6M4fj16fztV3Y1LfWwd88WP6XH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "GGX3BEoZDqjxcw4AbCdu62ZTMrkpSgmPt81oP2mVuZNS" + }, + "client_ip": "91.134.83.81", + "user_payer": "FzA4HijwuU4mtNBmKng9gVSL5oPHLKsRDFfR4CJqaSc2", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FnYoCHxXodBmohsafSygnLxcmmptyfd5CFVj4QSaZuTH": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "13.247.245.109", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fo3aKeCF5YHSCWdviBBizkCqzyNQGadQw9a9MuWhXMBR": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8aAt1RTSxCw3ZqXwityS6gqW32PvMJJp5DPGUwtdwJQk" + }, + "client_ip": "202.182.99.41", + "user_payer": "GHUFsW8uJoHeD6BPvFZYYPD8WbTawRyxYeCpqjcaU5wi", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FoMxQQn9zkhzkg6VP1dnkCg47UuELYjPquPbEP9pB8TL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "vahMVcSS3v6uwyFormV7FDAUbQSHwmy6vUedp1P7L42" + }, + "client_ip": "38.244.189.115", + "user_payer": "4tKf57sKisQUrbRmqbSqJ9TERBSGnLi9eUCfJvmMgcFo", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fofsv4Kqpm6r3gt77EsfU3t4t4nYjFC3rJoViBLvfgS5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC" + }, + "client_ip": "103.66.180.7", + "user_payer": "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FqJS5b15Q9caacmruQSidvHXyCiQJXHTGeP1VKAJayT7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "G4JtA3X7d8iw34gvczai8QhZ4M4ebSgyTuK7abgZw8EB" + }, + "client_ip": "185.199.38.132", + "user_payer": "8yfv9TJ7cxTUxkboDq5GQ47r6hvq12q55GBcocQNFoVq", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FqMgZudBU79VAGdX59fHTMekwZyqeM97TqLLWzNZ94ij": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "185.234.13.14", + "user_payer": "CorvusJRegS74ZiHbcsxDcknNZ1oT6HDL4oAb7xUFvoW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FquM1soytm6YsBKcQwDomokGJgNL14q2Xy62DRmYTFGC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK" + }, + "client_ip": "69.67.148.127", + "user_payer": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FrE9JtvxGBqssfZeyy5tLZi7akFUyJ6c2xmBnC5fJyfu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "4vdWYn2KbmQ3Dns5wVBfz4CFQDds4b7CpsC8MHBhHAib" + }, + "client_ip": "216.18.195.202", + "user_payer": "9UF7Jm92TjcbiAeKaog33mZ3stuynpQz3VQ2Ejkeok9C", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FrEkyHvHusPfwKnyzMzU8rLbhGv5XvBbBG3ne18vg2RA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "RoYFUUD7QD9aQ34UCMcwfye8dC5YvJeXz2J3mmoy5S4" + }, + "client_ip": "145.239.161.167", + "user_payer": "Dns8VXvjs1EWFouP5wexRZKhGbLqn3D5ksYcPa8ePg83", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FsMS6cvQUs2UTX9NsYgYGZtu3caHcbCgqUxEErpekNUM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 248, + "accesspass_type": { + "SolanaValidator": "FGj2F187dqKfCQLfa4NvRPhiTeXwm8LZDCq4q4z5g6ai" + }, + "client_ip": "84.32.186.145", + "user_payer": "HJK9KnfHDHu29CeJbUoCi6vnCjAGCTsAPssJeAZLqEhE", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FsruFmVNntgaU8hp4PNmirzyhpoVvex9wjQSeQGybzC7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "86wHBX2C6jmPKhZRbjYMBxVKFVZrcf44nGXzhEkuEHyF" + }, + "client_ip": "67.213.117.47", + "user_payer": "FH2JRSJsPxKYYxXY1qha26tmohiodsXYvH2NHNLVP6Jd", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ft73dhSrsZFEYoXoKbU7XYhL1vZPhvh41vViz9WPAstq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "HEnfJmMurye1NVoGgkGspeaxKqdV5Pnmz4QM6MN41Yem" + }, + "client_ip": "154.16.171.104", + "user_payer": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FtcPeoBFxCvHRqXEDSMry2nN4ae28aVPzBm3W9Dscitt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HgozywotiKv4F5g3jCgideF3gh9sdD3vz4QtgXKjWCtB" + }, + "client_ip": "64.176.71.31", + "user_payer": "96rY3VpT44hm6wdYzKMVwMGGeqhJY1BDzM1iFH87NcW9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FtjQWyGG6wTKVGbZRrYo3xyjrK3YVs1JNHmXbWFmMaKm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6dpdFgXyTGFTQkefKNTx6qgqwGEQa9GE1msghJTZoxQJ" + }, + "client_ip": "107.155.95.186", + "user_payer": "4fGYEyHPr21xBVAZn53LNWdite5aQqZmtmd7f3sFHhgj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FujmsBvV9SCU1dy3MutN8WQnkaygM3TstEPm4YEkbcS7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2N7v8pDKDYhtBUJBQUgxvysUjgM9s4ULPCmeEiPWTf6Z" + }, + "client_ip": "64.176.171.107", + "user_payer": "6DJV7cCS63GZEVzbjyXrfyHdG8TxzSxkRaxd2bxVxQ7J", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FwSNtgvEGu2adZditgqbdy95i6m4qQMmPqGoe5rd1J4N": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "45.77.107.204", + "user_payer": "Du4jcYA6YN2C3rk8BHCJJs9rgun3RpMi1WV31weBWXS3", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FwTXdiFuwdwGGFK5DmvyJ12qvVnneqKoDJ6U1e1N4nb6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CpuDNi3iVoHXbaT8gHpzKe6rqeBasoYjEKi21q7NRVJS" + }, + "client_ip": "207.246.75.232", + "user_payer": "EVzUdFvu69RH3p9oFybmaKgT2i516DHi8or8z4TKFmf9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fxng6S16QnUor8RoSiYPBkNNNzHonoZ7yMpU2sy89Npo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BTSy6SwSnFSQWd8YfVasEGoTfzM2GwZc9SrPhJymirFa" + }, + "client_ip": "108.171.210.194", + "user_payer": "Wwxz6ifCzHBZwM3pRobNXW7XAwmmu99GwE1CFHS95Az", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FyCN9oChB3ozGg7Mtg8AEt7MJf5wqzzph7SnUwzuwwJV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "4Gw2F2eCtnfuHA2uX7SN7RVK4UNouy3tPrUM2XyexyRW" + }, + "client_ip": "192.248.161.27", + "user_payer": "EN5F2BU5juUEWr9zRNNqKuQMi9zBUY1YLPHV5EyMrvnW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FymPTajjfE8zHpBn3aG8Hz95JcoZd8iyda11WrEAeRm2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL" + }, + "client_ip": "67.213.117.61", + "user_payer": "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FyyZu7tKnBV8xHod593HGjEMmTfadzocVPaUs1QH4r2j": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CvsxqT3uLH3sQSrpQjwKqJbzmCQMUZEB2R4ajraypAWa" + }, + "client_ip": "164.138.249.100", + "user_payer": "3fLQMhb7Pa3sUWmFLtmRrzkz9HhCH8mJYQE9BcMV9E2R", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Fz2q8cBeYv9UET9RCCsRb7oGYwsSmg9Hpr9t6udgJTRF": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "63.254.162.61", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "FzGFzGoQmQMyVg157qifJMBhezRWNe8P3oerVtakHYoz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Stakex4B2tpDHPWGvV1dninfiaYCGdakgTknpzPitLh" + }, + "client_ip": "70.40.187.69", + "user_payer": "DZiGTxgDvmBFiNYmukLHYePG2S4CRydoHjQ4kF6vtMJu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "FzpjEbJamSNGiqKDeH3wnswhTwedPT3yuBnm6fescpqW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS" + }, + "client_ip": "109.94.97.185", + "user_payer": "CWbapfvMikhLzuSruG9Yrm6Nqn2sw9pkoTqYBPYX3cdb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G1oPSW21xXmB85fP3UhgchFfke3F1u5WnygXPeefgAvN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HcZvwZ83PfjrQDiq3GLHxisTs17aGURs6bJ2LwtmL4qv" + }, + "client_ip": "204.15.240.10", + "user_payer": "SL9udNQdwUgNwpAxouHgET6WGRHQermEXU5RAcHqjf5", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G2dVBDEx7w4rejcXvVyY1AbFmXK2EUBiy9CSj44ekDLr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL" + }, + "client_ip": "89.36.35.226", + "user_payer": "6ERi1d3xL1PofYUKC5d8tLZvPz3qnaw88euQqkvFy2xk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G2h2jNjE3trRzZgKUhST46JtAPEYXnCYsdfCFSzWppke": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DU5uwMJ8ND5gFstUfbXEZjePcMdQbzZAhx6M2omp5vuD" + }, + "client_ip": "199.247.31.59", + "user_payer": "DagrM9XVaGpQGnsJzJ9pTLPvi5dWPDxmircQEkQ9biUF", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G329oQCYrMokPEyMaCRmk92AvZSsTAPUtKyzt8NGHvkt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8Nvaxzif1NrdvxNkRetjT8xJvd33EHkKVrfL8EDkgaNy" + }, + "client_ip": "185.189.45.175", + "user_payer": "D7SPLzWTSSogLcqyNXnqN7HFAqYfM5Ruedu1XH5FjAjT", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G37HQwzFEgn528NJhdWsR8jnn3gj1fkijDV7x3x5WTSW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4" + }, + "client_ip": "177.54.154.221", + "user_payer": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G3cCJP84xh2w8S63ypbwAdUKeirCiwpWk2wVDMsKgJ7v": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DtY5Bzxd75iWQRvKwM2xLUxqwLT1RRoeNwmVvgS2JANA" + }, + "client_ip": "91.209.71.15", + "user_payer": "6jxte5jrKezgZ8XhnmcXEVEN4xQxbXb1hR4mUg3m6BrB", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G3ig5p3sSDEricZA9aibdMMQ2jKJX97p3WoAf3QUWYvs": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "208.91.110.27", + "user_payer": "9enEN4R2QzbXVakUCjzZeD62AKhtSpVdkiXXVja6p4TQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G3pXW2iHtY7ziSMp9EtLAkKcgZ4q7pr95QqqBcGKwgqu": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "165.232.97.52", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G3u7aGTjBzvHCYAQPRzxb3pe3XjrCJcM6ASCLDdCgkBc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK" + }, + "client_ip": "103.14.27.39", + "user_payer": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G4cyKqwfZhynQA2kTf1r1FDiQnzwXXSyN5paoKTS2E3Y": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ELi5pJs9S5VYtwHzSa5DyDcjvMwaPx1wdxGT92UjJqAJ" + }, + "client_ip": "216.18.204.234", + "user_payer": "49MU8SPJy3DutoUh5Z6VEhMQyYMEZMEbheixormFmiQM", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G4tmRZ937oRCo4xhVcPdqtuy8HBFheGMukNhbhjNEKmx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4r7MYwVz9az7R4CkZzrawBsNca6ftVHBaPCXrzBFtPAX" + }, + "client_ip": "15.235.232.140", + "user_payer": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G5dzv2RAPtutoX7u5uMoaKwGhm8AePpucM3HREEaQDud": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "3ckN3MLrgxmzFX2MtZJkzmxDYPDBUJ2hFXKySMR4Viy3" + }, + "client_ip": "38.58.178.244", + "user_payer": "9Ud88H56aFDhbYwTcEyQ9nu8EhyjdPQr6K1gsgfGmJVN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G69XqwK8u8Px4n7SrBD9APKTBhUThUefQ5JgkdWar3TK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BeaCHioStqCEFDFxKwAEzyrUPYxqnBPhJ98gDKeEiTPb" + }, + "client_ip": "154.60.100.88", + "user_payer": "4pNdwtJZg98QxhV7rcKsYZiFS9MY27XuNTwXjibgm8Nc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G7UTXNWzn2CAr866quULgtqzE37EmJmScgJ9VdNbRrAD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9" + }, + "client_ip": "177.54.154.235", + "user_payer": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G7xi1MQ8mRRccAGbyn49WvZSqgVUqufNnE8ShgUC562p": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Hj2jzpAp57KyM3SmnYwJbDVrQ8tTWizMon2hhzYzwxet" + }, + "client_ip": "45.152.160.58", + "user_payer": "DUvg4m2BmMMtqje81cdQ3kKhHPujmw5wE9frQecRy6q1", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G8Lt7VgBmrUxeBh4xZemKaSsiNhZy1RW5AUub9QqEh8w": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "65pHd5P2VrehonT1cdJ2JUnq5wi3WUgfL3A8RhYH7Kg7" + }, + "client_ip": "64.130.43.208", + "user_payer": "CtjzeGgbpHzDDDn4r9WJ2CWuDRTq9gwerbUuFXRWvwCD", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "G9PKZiUA134LGCNh7RWgs9Q9GVXFjyxdwLzZiMw2Gv8x": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "8Nvaxzif1NrdvxNkRetjT8xJvd33EHkKVrfL8EDkgaNy" + }, + "client_ip": "104.204.143.94", + "user_payer": "AXjyPRSNkwDDU5HRrgSYFV6wt1SwX6cCtwhU5fWsLSQT", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GB8t2MenFg3sYaK4saZ7Wxnjk8kVha5eorC2z55mZnjJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 248, + "accesspass_type": { + "SolanaValidator": "sTepQGoReJq2tBKStL19DT6nnGHcGiAvFjyYaokLyuM" + }, + "client_ip": "45.77.241.154", + "user_payer": "Bv3XfQzj6vu8dFrJsvdBHwbLyejyUYT1xPmTeP4zGEcz", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GBk7CUE89QYtqh4uRvdfmKJLjMgkovutFLzzpwN3a2Gd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8M7anxqWKtJ3j6aKkCGRV7dwL2eEfcfiW76aN5BUikcJ" + }, + "client_ip": "162.19.37.218", + "user_payer": "6L2RMSPbZjFnMFJ3FRgDgTb6A1FEmDydDEmFW7bXZVrk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GBucjw6YZ9asQ8hYk772Rmw84yysm9JR9HQCEtMfTwNa": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "8hAYbagNt7CMBooFfqVJhBgLqLffpjXTWJMk8yybjJsN" + }, + "client_ip": "185.191.117.52", + "user_payer": "ArRV9GqGGWAnmeaQ4ps221HrMjai9BDFDUb4ZNXa9u1D", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GCKkdgi5PHMurXxyiipfoaXLavoMPMoFN8DpQpVttvNq": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "4NULyCo5tAw6wptZUHt1EAFRjeT39Qyt6cWdn7MqJ6q3" + }, + "client_ip": "217.170.201.58", + "user_payer": "8TgTyigqnjE6La8oepMkNtedfEVNa22SqMo5Ge9MVf7K", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GCXH9nG9V1HBBpBPThDExEUs1Xn2WdZSZ1JBdwnmGpnk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2XmhZKHmfjku3T3nC9xKhgr5bm1CAmWXqNsNt49mo82C" + }, + "client_ip": "185.101.32.46", + "user_payer": "56apcp6ZpQnRZfy5arcRr88pcgeNUKF9o9YB6m7Y5cbL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GCzCzDcnt8GgBHfM8kpThtxkzenBDm1R5JYtyhudYMr": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "34.185.237.52", + "user_payer": "LUZ99b99AWUQuFSpCejF5VbPQCNdTv78LNrU77c1Pxp", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GDYnYyhn1LK5jxSnsT8sEdm8bSNZLLnsxxCrZp8ZXrM1": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.36.170", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GDzg94466MmeZbPEBHboBRgeei5mL7uRN33ZgMSeymhf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "gridqZmeBcsUKT2Mv4M9YFHFN3tVLFb2TCtTcLD1cAd" + }, + "client_ip": "107.155.95.182", + "user_payer": "rgh2ZRt5ejyQ7saSLPNmYXsNuqwvkn8jzEWWXoAWrhr", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GENPj1p1TxuZs6P4SKfVRBHqTLGfvdBcUX1iEcSwKQzz": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "54.91.101.32", + "user_payer": "5ZENonyCMkJ1yWxvLCHrFfgNXNuLXWFvr7mSvcSek7u7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GEdCKNuU8v9tFRtXRtyWcDsd7FCrP4TR876HVfDYBqCt": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "198.13.134.216", + "user_payer": "CsLD7kDGsoxRaBnRVenoq6FNyNHC45ih9HtwhgoqTPJZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GEdG33BzRhyZHQh228P7iwXpx2qgkK9bBsgjnPmUtpWz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA" + }, + "client_ip": "189.1.171.179", + "user_payer": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GEnkLbJxSDVffMjjYFhSHEyFx5t4gPSaLKAz4CpPKiiK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8augxYLUge2iWmitQMwbcBL5VQEpsM6aJdRofhwpnzyw" + }, + "client_ip": "80.76.51.168", + "user_payer": "D1scGjE7PTWZ2L72Cd3rgHF3pMfL7VyMG16ghHAKJis1", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GF8feDC6JrVZEQ3TWWsPGNzXupPpsE3APdSTRrTYHhrn": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "146.0.225.230", + "user_payer": "33LkkPLhabvDAhtKqL3KM6gW9MYCF5Tjtn987DHGyDe7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GFkeW3cTJMY6V4fLW7U2QpwGFYKQ2PLhqfYxPSdyVxFB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "bookoVmqw4QjVj5BbkFacouadx9M7816wyRkfM7A5Lo" + }, + "client_ip": "64.176.12.167", + "user_payer": "oWPCJQUE4QP4ii1oCSLmryBaVy4sNyN1NVj16TZtyDe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GFtQt51n8cPQq6JDSmLzc7jCAcXGkewCjHVSWe97ShSv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu" + }, + "client_ip": "102.211.135.162", + "user_payer": "9WEBrQsqiRhwmRyLUTKXa5gUfqRKkDBYxbYbonDqCiKf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GFvh9nKXRUG3mGHeuNkKHHfvnnwY5FLpGyGg8PiwB5QH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk" + }, + "client_ip": "69.67.148.121", + "user_payer": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GGj64s82ckpsTKpJAmhk9mTxky9xijSDhFndhsbF1yWv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "ES1M3tMZ4rMTJ3apE75cHfeGWizDTrMMXy2zKtWkd38R" + }, + "client_ip": "104.204.143.94", + "user_payer": "7ow28Ctn1nJqZJKzZ9ZYUveqDvxMfBYXBJFHK3ZQ1QhY", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GJzEWHdbLxdkt3Hsph3358zRGpoPENmQhUXMeQgnUHLM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s" + }, + "client_ip": "109.94.97.187", + "user_payer": "Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GLRjUexjWvwJqsAVBiPyd3PND9qUR3WkKiN7ckTHqFSJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "fhT6kkkJfBAkG8C5CPBQJqyiNfW47NSLhAQFvBFYmio" + }, + "client_ip": "45.152.160.234", + "user_payer": "K9Kou3nyy58TtXrBrQkfRMbspbJm4yiRueigNdDjtvu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GLUHQJCXPgKLTDd3WP682ZW5QG8Qy27xAir9oZMhMTHF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "KAoSp3EudGqUBXv46tQoDwbZxSm3iXa9wM2aF4ySbJJ" + }, + "client_ip": "66.42.59.185", + "user_payer": "DagrM9XVaGpQGnsJzJ9pTLPvi5dWPDxmircQEkQ9biUF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GLbUwhDJb5HAZNqHN8tESjdVsfEe9XH71QcKCD1AxHtu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "AWcCdYG7Dy6GX45c6QMPbgGwgRZPKcBDT4bXGb3QrVRV" + }, + "client_ip": "185.218.204.89", + "user_payer": "FgUWvZC4tig9cKG6x4CPWcscGsfBfXGtGcaetp4jThMg", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GLcftu112GDp8PEXpcxBrnXBppjWD9swne4Ko1bt3PDM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "4fvL261MnaYN9rmJAYVDxcpfa355xPq3hSN17ymgbpaS" + }, + "client_ip": "103.219.171.159", + "user_payer": "6RakzpEyJ8o7ad9Ywk9ntjeQo6P3tMtpFQzhAksrZ1aY", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GMK8r2gAxEXuwYTMYoh6BTKAtHtvvy8HHnBJ9JHKpzV8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj" + }, + "client_ip": "72.46.84.111", + "user_payer": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GMnn7tB4TyLuSgaUKC7EsYaxujPdKSa6AVf6Hs6vbx9b": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn" + }, + "client_ip": "95.168.172.74", + "user_payer": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GNGxumnGinJ4o1yMs7QEnpPdXrcvAUocG3UWRnny1F6a": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS" + }, + "client_ip": "103.219.171.217", + "user_payer": "24Pz4X51n2obC9ob8CECNketFyTpnG6gPaSQiSNEWKAH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GPksNDffLDiCug3XALzttB636GoFuN9tDPAYtvmMprf4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2yTFwqij5wJ35mMbP9gJoyVN1Eqi4r4NnAxfGjnPTWCJ" + }, + "client_ip": "64.130.57.215", + "user_payer": "4DfoeULZ1NdvQ8gPhghppzWLqU5SouhXEqovb3BCn2M7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GQHpmx4BsXrfa3Wm2meexkkxsWu6nkHhZnYHFNtwaqzo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "TopjgY7N1fJdnW89S9fX6t7LF61nspgXGL1NpgAKhDG" + }, + "client_ip": "70.40.184.126", + "user_payer": "H3egfHfhKLANLTdMWvn8T5Hrtr3Md5aayZxLiUGxwEmZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GQQsmUnankurC6Cu86GqL9F4VC3sWcLFqRBqADXm8MWA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HwMrPr6S6Q7xYwzBFbuzGHJJpgjyoiDa1HdgHjTNwubs" + }, + "client_ip": "64.176.66.190", + "user_payer": "6FFPRQ5FFD9XLtphkAyTdnDRQs8a9j89G8gwi82u2qPu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GRwSLVkZwVG9XuEYgaDdujPQjvAqYfks2Ym6ckQTKtVT": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.43.217", + "user_payer": "6Ua19AVmFu8HQP3gs4mxr5669S5u3wrJBbyevr4s5qHM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GTwJbzVJgyi3dpxHb48Ss3SWGuJikfPWx2JEHRoGZ3Wj": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "152.233.19.204", + "user_payer": "dztG3Q1C3cvL9qYTRTbe9JZkWUJTHj3FvfvTHCN9TGZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "GUeJicByhYxDWFfXrwzmNLJjiATH7DJzZfzkB99irXW2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4Gw2F2eCtnfuHA2uX7SN7RVK4UNouy3tPrUM2XyexyRW" + }, + "client_ip": "95.179.161.157", + "user_payer": "EN5F2BU5juUEWr9zRNNqKuQMi9zBUY1YLPHV5EyMrvnW", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GUx9JVGt6NShZZERMKxuEdAYKX31VVRP5kzeLiheUd45": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm" + }, + "client_ip": "66.42.34.34", + "user_payer": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GVRfiEhMxbcchbaovFk1T8gp58tATPe2fcjhVkDRrMev": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "63.254.165.83", + "user_payer": "AVtvZKjk3D1hUQbUKjGDPGm5B7gnxZpEQ9m8GYsXpGiZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GVigpwgPLsa2zEfnezVu7uWyGe5g1Mq81BH5m7Re44AB": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "57.129.144.52", + "user_payer": "9iijGXFCfuGymAdCPbbpBVKQyF89awQX8YcrUDNVEtbm", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GVwFoPEgwTEXsyaRbnu73bXAUg4fdLMosFg5wNFJpxG3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HnVNed7gA4jhS4Yv9rhw44ZD6JKFFppvpJ12yuTep1ER" + }, + "client_ip": "64.130.43.220", + "user_payer": "EaibwFTprLH4SD6h6NVLQQvYjEqBmBcvWDvQavzh5DR8", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GWqQGLFMSb6ejANxSNFminGTCS7zRpkR1cK2ratmCTS3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BoNKmNCGvoHS4CkKvYRnF21iEpUP827pZjhFGdA4t5as" + }, + "client_ip": "66.165.246.46", + "user_payer": "A4XSeSJb1MEgqF4k3pFzL5cKg5FRehW8cgzZs95ey3dY", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GXg1Rh8Wc2Pwo4S6rWUfccqDygoLWt8AN4Gg55HuWZ16": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.32.198", + "user_payer": "DWiFpqeR7vx5eUHvarJHJFN7q1LjN7SUU6wdDVWubyv2", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GXmFc8qcLfCHP1eGQDd9v7nz3F3DdwWJwQcdn1wm8MSt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9" + }, + "client_ip": "103.50.32.189", + "user_payer": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GXvisqG33iHHmbsryVcFhCVx2yKqRMrYX9zyRyAsA6ev": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.134.236", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GY23PxE7gyQXLpjZJo2UnxXhSaXzkgpZMVV4a8oXD1sD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "DZVqmD4QqSWM2gUyEXdQhvt4u3NZtCRxdsn2n2nNiBRL" + }, + "client_ip": "195.12.227.249", + "user_payer": "3we3Jf1sQJC23x1VwQu8gBnTpVSR5VZGQbXJ6VS154sv", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GYBBag8yFSpPE3YDfrRh3wYBaYEGPYmuugHYhbtGpQyk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CZanBzZHFzrGY5qKzaX3CNhJ5smHEMTWFFnoeUi4J6dr" + }, + "client_ip": "140.82.43.129", + "user_payer": "Fkhd6WwaLAYGMTpGs1kX7ECQmuQ7Uj3ScurCDtzLBYRA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GYdhh4fet9VYDFyQ6XmsajaV9DAJVYeEKSAKg2S6S6V1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4CXiC9UdCaLe7vW15qDB91vszZqfqFVNW5eBTmrG9zAz" + }, + "client_ip": "69.67.151.91", + "user_payer": "Cg9YspxfoL2zoSPtnwi91DhHS8RLUDguVWdF9113RFt6", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GYjyeeprcre3tbdNS9BdUbWkKCNkMdmtn8vb3dC2yeZ5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "G4GT8z4AKWNoy3x6nuzxW83UfFXLXzrwn7DZQt4GvWdU" + }, + "client_ip": "149.28.113.63", + "user_payer": "DemMMhqhEZRQxFZUj8kvmdPKKEhswAZGr67tiSwqk7iP", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GZqYJRxoNcsyGLKkhMJUS5StS7BM1NWUULgCTaPT7MYb": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "178.239.19.43", + "user_payer": "EEBBECwabbAQuqNtLpbnJ2Nh2bdeLxSZ9yQ1jrdteggZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GZwCHAuUxoRUUPZ9DyumYFi4U9zNi2mMHNi8hvSnRTZW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HSZv8MAadCzpYc5YYvrWTjTK7Pk8hkA3hUwUHJYYcYQr" + }, + "client_ip": "5.199.170.100", + "user_payer": "FmsRM4M4dZMtGZGDY7WPzLWGuBKyesoVzCt5M6C3aE68", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GZwRzQcscH6TqyNhYZcEXwqEJnDfGxPhQ5qFJnkGWWP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7RHZsRcQfWp9Xu1HkVm1nnrmg57f9jUnZrU2K5ieawoA" + }, + "client_ip": "45.152.160.85", + "user_payer": "CDWhWFuJ23H3bqCr2togzxWCJnQJ1So4dq9tjivYw5Nz", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GboPR9kqJuiQoZTBzuSiC131MXsaCXBkthdfVHhKpajC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9wDoL3e2btwQyh44V8q3t1RnKoNRPpVmY2LRJtL8v3MD" + }, + "client_ip": "86.54.153.249", + "user_payer": "3zLCNmt7Lhm2y44RW9YdZs6epmsDB8BazUUE2LXo9PzC", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Gbq7UcnVjq4PKcMpAW1wjaBcgeBsWn4myaFGfzrnhSo4": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "165.140.87.226", + "user_payer": "LUZ29mJXzxdbYSFMyJVAnUJ7syBH1wJv8HDD59dpWsJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GbrgSESeZy8Zcgc7gwznXs2ReYhh7TStAZY5dD5sABtr": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "185.191.116.182", + "user_payer": "8VcvPgeiyyxx8R948hQ7i33AT6n3jUNPZX7Yjv6WLYSK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Gc82Nuit6HiDqyvLspHEQBNH1Q2ZzkK2hStp5DJGjhU4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty" + }, + "client_ip": "64.130.63.45", + "user_payer": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GcMNbM9p2eqXQu7X8H94A8PLUmMm7VTrKyaoygi9vbpw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5gTiZMW7AL3rErXZXJqy15NwCi5hKZYYda85tSfgD1TT" + }, + "client_ip": "37.61.209.234", + "user_payer": "J2obR2DK7gnd6H88HjKzEYuMyboDWRNpbzwmGSh31nnu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Gcd3snmG9dugkVa5YkovRv3GUa6qtJWMi6dx3efcrcAj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB" + }, + "client_ip": "45.139.134.46", + "user_payer": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GdU1yJyiTaMu7bCP9xo2zSRqM5BHZ9XAdcMPmynxdVGz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CSTSmRLjWQNbRzx3rg4iv4yYvP9F4oCDwAz9fJU319h9" + }, + "client_ip": "72.46.85.217", + "user_payer": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GdZk7wK2KLtzCWNXQoSByPs84ZQbbvmUVZS6BtCVuXqL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "FLVgaCPvSGFguumN9ao188izB4K4rxSWzkHneQMtkwQJ" + }, + "client_ip": "45.45.156.250", + "user_payer": "FLVgaCPvSGFguumN9ao188izB4K4rxSWzkHneQMtkwQJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Gdon2sYnm4oa6v2kjrjPN6MUwqvsLgn7KhyPrAuRe2Gs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5ghoFEVrsXeAPB6SUmBpZ2xq3KvHEjNMeSaBnxEBXkHV" + }, + "client_ip": "104.238.186.29", + "user_payer": "FWdQmnnKq3WqN5YrdJMZZXCWk4syWBhQyiPY8p7NugoX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GeDNt5FQf6a6simLxc5g3AExDNXC57d15i9LrW9tegxv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7cVfgArCheMR6Cs4t6vz5rfnqd56vZq4ndaBrY5xkxXy" + }, + "client_ip": "64.130.63.81", + "user_payer": "7cVfgArCheMR6Cs4t6vz5rfnqd56vZq4ndaBrY5xkxXy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GeEcYaSCuoT2NBSzmJKVA2jytNfbWhcUuvqZH98C6NSk": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "202.8.9.19", + "user_payer": "9zDKGXz7QmA1EcSLpFdcgpPsb45ArYY35ps985hP3ZkT", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GeGBUyYHXBQ3gSwbKxjG9TCKYKsLzZsAozAQfbi2ncJ3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8uPW9msN75rfaKiwy8y8NxEX5zSk2WejtVv5YhZr3jCo" + }, + "client_ip": "45.139.132.38", + "user_payer": "5mMiJMFFRKGsmVJxMuQrebRWwMcFYri9rSfiw2WzHbTB", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GeY8iahVVyAhpUyUw4e6wMZx5QYyw5qa9vv2xNU42bUi": { + "account_type": "AccessPass", + "owner": "DZKy4E6QNZSGowGoek4VX352QpHnRAWvqrd76vjbB3jo", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "165.22.228.245", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GfMXYp6wnMHqiuCpsTy5G51ccLddxP3qT9WBVxM5u677": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CyRYTVHK7QT5bD8rW7qXktivoSBPHCz3Qru1P9T9DsGr" + }, + "client_ip": "65.20.105.212", + "user_payer": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ggkwz3xJ4AgWpygaRvieuf9m4m1CuUXQ5bDQ2CELsaab": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.43.46", + "user_payer": "LUZpU6kg7e2cmJ1Wb2e1JzqXDA3dwoeesQxxpFgkqxX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GhwVrxaQV5cPjdERVMTETWtgWFAxUGa3uKrwhDb6Vtq4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "6PvHaibtZhuba14dzbhGFJRASYX3Ka2oviRzSbXV2wYC" + }, + "client_ip": "208.91.110.216", + "user_payer": "CxKWULssXv6pBM5nMLBZkww76fKrSfGaxSq1f1grqVhf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GioR8Q2AJRbZcjrvG4uw9LqfEjB5yfKv2EtYrpYahjxG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "PAWsME7oYbjt5TRNc11mBa33JhKnQr9AYherdr9YAZ6" + }, + "client_ip": "84.32.186.49", + "user_payer": "87CijYvtTbvvYmMaWqGrvfDk3LYbujaaig5XzGpSMVC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GisJADV3iEs67zZC94pEwTKgtjgQkXYDsfJo7jbkJFr1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "59T4FdDkNmEHpkwvY3X5HwNrhWiBXPqNPLjtuVSdZkcn" + }, + "client_ip": "104.204.143.76", + "user_payer": "BiU1DNow77wGwSXW1bLmkcQe2cuySpkbz7xtbitD9Fmk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GiujyUKe62wkd42qMPM3eXGovee2pf7MdwrzDGaaj6Ha": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "23SUe5fzmLws1M58AnGnvnUBRUKJmzCpnFQwv4M4b9Er" + }, + "client_ip": "84.32.64.134", + "user_payer": "ATEJvfGzid1QkZHbsWF93TCCNM3BAHUcyReH5RrxcGrF", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Gj9BBpsyNwBWhGtZj6dBXmA53A6zkhxNiZpecRPu8jp2": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "63.254.162.58", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GjWf9eD4rX9XJ7eAG9JwJogNGcCLj3MXX15BMCVjhNut": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 249, + "accesspass_type": "Prepaid", + "client_ip": "82.27.90.19", + "user_payer": "B4eBWMLcdDEyNErh61FojZ8jDUNvqNvNKfbZRbZZiVDy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GjXkvYR65BaNZPSHonPVxZMmXX9VtZtzL17S62uJzb1K": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "nodeEgRVkbYLAQePtMx2zCN7CGw7qRgzKMCBtjMfN1D" + }, + "client_ip": "37.72.171.70", + "user_payer": "6FFPRQ5FFD9XLtphkAyTdnDRQs8a9j89G8gwi82u2qPu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GjZmwcCRDCLPd2noV5zVTCiFVrpK4rcHDrL7FWGuUSEL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5" + }, + "client_ip": "72.46.87.45", + "user_payer": "EptAhyDYcy6xDnqFTpb4zFxhTxNXrXkMXwyk8qTPYNqH", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Gjerpk6v8xbSMgi9ivybyPGrvWShwDnWAvyYVLgDEVLp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AvNsK6uxBBwejyPe7tZqgX4onaCnXTqKQvKRaTe9Ekya" + }, + "client_ip": "64.130.41.39", + "user_payer": "AvNsK6uxBBwejyPe7tZqgX4onaCnXTqKQvKRaTe9Ekya", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GkX4WEsuUDM9D4v2X8TpCtB5faUYTZGBzSxGwNYoRSFy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o" + }, + "client_ip": "189.1.171.179", + "user_payer": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GkkxU9T7TkvRi5DwNNYGARvEZoEwchT9MkEvuM6KYhme": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "sTEAKPk59EtPPbixCweyv6oRLNCDEE8pnnef6gUfbiW" + }, + "client_ip": "83.143.86.174", + "user_payer": "sTEAKPk59EtPPbixCweyv6oRLNCDEE8pnnef6gUfbiW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GmLhGNx754CvK92pGTjgJV5m3jxbjTpsABzExJgRGMG9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EHAmJS4Am2rJLCV8Hd66nzqqYbhpy81AGGAQGRmW4k9v" + }, + "client_ip": "185.8.106.229", + "user_payer": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GnDUcj2q9zYRcRm3Hx218SpMEN1RdEdwPW3PVB17FxWe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "sfvTq7ojrEc5WdXcHijz676eX1pc5MgoLxbkYSdRDAB" + }, + "client_ip": "103.14.27.9", + "user_payer": "CADuawrj4x74ixX6nSYrkVYzqRnMLDFqh2wsFxF4scww", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GnKaFxsEMCxeNoZqAz3wkkNmnQbKKkxa8yesgxSc1JAA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup" + }, + "client_ip": "177.54.154.221", + "user_payer": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GoAmHSi1T33tr35XuuEAinkb65TEPq6AZ7pKSokb2Az5": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "67.213.121.185", + "user_payer": "8phtKoFKAgf5DXAyqzNVF1NnHP69h2841ukg4kM4w5w5", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GoP8xttuJXzw1ZVF5h34kxCjK8C6E64iwxShAqdC3dQ5": { + "account_type": "AccessPass", + "owner": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.36.35", + "user_payer": "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GpZiS6ztDDUmTLoH5nSArHS9eaU1qo9KpJQtnEe5K2uD": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "198.13.130.186", + "user_payer": "9XBTSRHHGBmpV7E1m1mwo6xGwNctEnhGDdEAYWkz6YZs", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GqvYtMGESW7wuQghK4ZdKoTQWLaFNLWs4bDhfLmu84mQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "13DmVBcyrSdsSsLWaKH9x1dwxDf48Wu5wprwxMmLshrk" + }, + "client_ip": "66.165.233.114", + "user_payer": "2wtreSE2mijUKJwfmHR8hR1eMKhC3cQerMUDpq74aAEf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GrMvq4CWGywEWcd1WVbj8qq5v68aTYi8DhoEk5hh5AwD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BTGPbq4KuFENn4CKuaKGqkaDd3TJD3TEgtMjSrsZnMLb" + }, + "client_ip": "206.223.224.207", + "user_payer": "8uB2AtLYxsC3HsVGc7h869MxFg8SRzj1oJ1zrdoULtnb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GrkW2wuT7ChMUKDwoHo8AX5JScjtpF4jxA7cSX4LdfL": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "64.130.51.167", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ], + [ + 231, + 193, + 102, + 84, + 73, + 27, + 224, + 26, + 26, + 207, + 245, + 127, + 47, + 24, + 24, + 143, + 142, + 201, + 203, + 18, + 250, + 154, + 124, + 177, + 79, + 4, + 2, + 93, + 104, + 254, + 177, + 78 + ], + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 51, + 174, + 2, + 67, + 109, + 220, + 168, + 226, + 12, + 124, + 251, + 34, + 171, + 48, + 174, + 66, + 239, + 236, + 202, + 29, + 131, + 235, + 61, + 27, + 53, + 22, + 213, + 129, + 76, + 147, + 147, + 153 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "Gs85Nh81HRVsTxyTJQn1Ns97AnkdYeqWCZE3tszxL5rY": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "AjGby82yXeYgj3kmng9y3c4nQpZFmiPpJKecLJTHbfbP" + }, + "client_ip": "64.176.71.37", + "user_payer": "5AZ1wBpCtkWjQpjBoxXctq7WPtUnA9KdgkE8bF3J4vXw", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GsSZLBo5ZyBi5siL7p5QzhVRGC3JqM8MvJQB9R1YjXEJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk" + }, + "client_ip": "160.202.131.41", + "user_payer": "6sMB8GQWmQLH7ygqLmCsGdhB9pWp2wNsoA72zEG1qoyu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GtoTmZyvHokwk529CCP6CHLeKWCpNX9nnoTdJq1L43iB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BH6aHw9y4Ejes5KdPYA3ezwERCvJd2zMzGLKze45kfy3" + }, + "client_ip": "95.168.172.74", + "user_payer": "BH6aHw9y4Ejes5KdPYA3ezwERCvJd2zMzGLKze45kfy3", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Gv9S5oHFof9wafizkkSvP53c9tGheCjpnYjsWiNBBa4c": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "aRPCK1BoYnwrHcQPXn3ArvgrwKZ29LxXfaYj5pjEAPY" + }, + "client_ip": "45.152.160.95", + "user_payer": "2hCUeFngGEGDGWm4EG38AhR9yiP4QodHcAgpA67Nvp8a", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GvBHNUk8HrgTqJkrBpSWy2ub3129NPvPm39q7KJPQbyh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6uaMGZF8QVtGtZvVAEQGPfWKnJhFUrAtjTn33QHG1gK9" + }, + "client_ip": "208.91.110.230", + "user_payer": "DDB4XQGCCMdPQygsq6kPDz7VdTEWe1APfarNuGS9c8e5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GvtkykvYXhwhxSP7qumETAXxuYA8AHFBagwg1FwPuZsV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "8hAYbagNt7CMBooFfqVJhBgLqLffpjXTWJMk8yybjJsN" + }, + "client_ip": "185.191.117.49", + "user_payer": "EgqkNdKiXhn47raWGPUHT15BCdrAWknhob9M3XpfiLqZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GwqqsboncYJDxcGVFL7HFi5xeB5KMCoZKmGk5CavYYaA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "fdover4vb6YyyHhGBMnoKiNgD7qLceJsh5k4ce3b4FR" + }, + "client_ip": "104.204.141.229", + "user_payer": "Bq9t5usaaa3eKHjVkbYF4ZMzusVt5UBiP98xdoXZekmB", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GxBt1eqMj5w8FnvhpPSm6v9JfFum78LbBh1BfuaQ9cRp": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "202.8.11.173", + "user_payer": "9o7H5rJ7TFfVEn5qrgerpX5w9M8ttjr1Fjy26efsJ5TA", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GyE2Vx5zAW5r9K4R1SWRv2611cN4XJPCyUC2z72iT4LP": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 246, + "accesspass_type": "Prepaid", + "client_ip": "64.130.63.215", + "user_payer": "DhF5V9yfnamt1bw1Z9XuPd9VS9yHtC1Nvwp7sR7F4u8T", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "GynMP1JEua5pxjahSZZpW89bJaHNQ4HECC7Pw1eAroN3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "dddkpiYSdXFPQi59vvQC2FpxM71noMzVTWwDtrFP9op" + }, + "client_ip": "151.123.174.238", + "user_payer": "HRGp1ti5YvjHy5BBSxq8g35yZwotwMi1zLQRv45pKUdx", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GypVzZaK2aQDepjLdGzMZ1jfb2gz2chBep88LCbqPmbU": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "149.28.38.64", + "user_payer": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GyqAhuufgpVHzH32VsBgPNLPzpzzyeCzCogAEVCo1qUE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8DKp1Q9ULeoVWz1V2fs6M3Zmp1yb5hLKy7MbxcUWS5g4" + }, + "client_ip": "146.19.172.17", + "user_payer": "668Qi5iwwmCfwiy4XUKRFGj1qvi6D8or9BVqn6KdnWyr", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "GzgXWFWg3GeN9C2HbRTHPgkwL6p1nmc7Rpcm3hqxiGrw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe" + }, + "client_ip": "160.202.131.45", + "user_payer": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Gzj7JDcaRxyKe7ats96UyuPR2S4M3n8Z48oGdJt9cv4q": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "avnujiRNoSRe9PcET42DPKznyfYnb2LRaZAsqv6REZo" + }, + "client_ip": "72.46.86.137", + "user_payer": "CVgQY4EdCUuMeMU1dxA56Azjm7HRCh5LyGecSe9b62fk", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H14zXR5vdnW1HhkkcJkWKLBCa4xtZfDhpTcX1g31Uwa6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y" + }, + "client_ip": "80.76.51.116", + "user_payer": "J2ibtVSFZd11ccVf6CYS7w1MeNiCjQjosDAofhZbaZ6T", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H1V8NhN878FMMkeanF8pFZ1ZPdktoH5SS8QuJrdK93H4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "HcNXGhw7yGRQZABmytA4JEvvUFsMxqyQH6tjoUvR1BRy" + }, + "client_ip": "89.42.231.120", + "user_payer": "D6uUDTEgXDf1yzLuQfFFCEKF9a2Ri5trFAWwaUpKB2ji", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H3Q8brNTPkbKRa4mqurgfTpc6S8JisQGxztZyW11mpcu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i" + }, + "client_ip": "160.202.131.193", + "user_payer": "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H3ZK9ELYyfjdWXk4zKJMmB3ySKcdW5YDc6enxN77rZ9b": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Hiwk6J6ENdCMwZHxFxuaxbpxqume7dhCveQihHGUsWCf" + }, + "client_ip": "108.61.178.44", + "user_payer": "DagrM9XVaGpQGnsJzJ9pTLPvi5dWPDxmircQEkQ9biUF", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H3zhB967bKG7p4zU8Y3z6krWC28SVTp8EnyopqwnFJci": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU" + }, + "client_ip": "185.189.45.170", + "user_payer": "563VDfbQaPuGGGpFYJdXq8TycB7egBiS2CGDdbYCRe52", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H4D73oAmRUKg8edk3YkotwEy9HaW3PEkgYwQeYEZnMyh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9USijQaAfSzw6gWbHNq68VVigmj3HvffDJYhbK4tfquB" + }, + "client_ip": "5.199.172.208", + "user_payer": "HaHbuziDiHUjPtiiCWz8Zin6hdR9LNaaFfRUd8H19zZ2", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H4dnYCY9ti5Ma7ytwoT6aAWSPGQi46Kc7a48DuWuPvHP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "32ke3uf1qL3xLqbwzU76T2sbG2XaJrGuSCNdUnien3zm" + }, + "client_ip": "67.213.121.173", + "user_payer": "GH53TDs32xYdQDDfe29B6J7BqM7UoVg36WztBhdb2QCc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H5fF5i5BPeKFHhdxKPmjygKHr7PjWNdNqVDMLPxzqrqD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2abwQG3v2xRemFxRszVHSfnjJNe9zu5X8duKgxjyLeaK" + }, + "client_ip": "185.59.221.44", + "user_payer": "HBm2GteK8fQ1fuGG4JAp7A91GSoS8VEnEGskertPgSj4", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H62rjcDqHaZ3WM187XLmj2jf13FF4QBqRgA4gyxL8Gjc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "p8gzksiJ3EcH2rWZULT7oLGty43Btk2apYGKdRjAmqv" + }, + "client_ip": "95.179.216.39", + "user_payer": "5mMiJMFFRKGsmVJxMuQrebRWwMcFYri9rSfiw2WzHbTB", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H62vgX8XyBCSsZhzSMAUxqZLgY1QzMxPG7e8kH5Do71R": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5zm9g3zgAPWzX3wmUB2JtTkcwCqe74NWsTmt5wLFwCKK" + }, + "client_ip": "45.250.255.197", + "user_payer": "BrkfMFtaQpZzfcat8vq7UAmW5CUZMohH6U61hYmB15qb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H6bU6MjsMRveLAdCVCJoRYboUEh2UwNWHSNj1VucX3e": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "CiR8HNCfkjtcongPmP2DRdZPnFgjSbN5gsXdjmsXXHcB" + }, + "client_ip": "207.148.14.220", + "user_payer": "7q6gfugkxuKFKKrieLcyajwXieLLo4NV13FUhR5Jgtxo", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H7JsGrB9irJQHgQh4JDB3KVGBwP9dHTq95cRPgPkoHGZ": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "43.212.27.94", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "H7Jyfu4Ckqaeo8jwXCvLSr5ab3NpDUJWb7QPozKSqYA9": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.37.196", + "user_payer": "CC6j49ahgWCYWUZJkMjWaXY8qnEMFmiZkALLqxBWqJcD", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "H7WkZeVKayC1yAVrxVabXuT3dSgwzpctCq5LC4TrhYyU": { + "account_type": "AccessPass", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "177.54.154.15", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "H7hzseDV4T6fWjptbXwvnzQwxBsyYcJ6UhMpfeXf9r83": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S" + }, + "client_ip": "103.88.234.129", + "user_payer": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HA7UkVdGjpHmdabremr3j1RH98fVmxi21WyowfrkLpMe": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "94.237.56.185", + "user_payer": "BSqELQANZ9ru2uvTrdAfNhoKh9zx1RgU9Wn1e2wq69HX", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HAN5RLF7oBbJPfJmgSWZ5RPJ6NBDmNHSbYBLA61KRTMH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "UMi1r5J3SagSu4HC3waB3YFzbXi82rRSScgW2e8NTfr" + }, + "client_ip": "64.130.37.226", + "user_payer": "2nHZrhbR8oV1PKmgmtBqJFq7Er7bZLjH6kmpspoLApgR", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HARYHLh5rtUU4qwpKQsARSKHvtKmy96gE2Y67qdQjPqb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GiYSnFRrXrmkJMC54A1j3K4xT6ZMfx1NSThEe5X2WpDe" + }, + "client_ip": "185.191.117.74", + "user_payer": "4FvpZRFqmBXQyX9GcUBnfEPxTB7UmuVG9wXyAZyBcUJR", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HATmh8i4wnkQE5vmvQv3DMHhvNqCrTfgzfpBmFtD95dn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hnubvz4ZaUH6UHwpcYuPy3pCF9SUjNXTwdx52hbqwBH" + }, + "client_ip": "64.130.43.36", + "user_payer": "DF7KWRWobuvRtzXmWuUDKKQwEbrbdKyeMNnTvPB2zR4y", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HAVQttrASWLX3mkod2KfRqHEY17c1UH9aUoiwGeTWoyS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "BstaWY9CVmfaYFPg1rCJb6EJ2EcwsBasucYTRH3u3VGR" + }, + "client_ip": "64.130.33.72", + "user_payer": "744sgXXkRUWA3C74d4assos2oLWFkUHSX4FWcgVPkeaH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HAipqzi3HKc9emfLx4LSwfaVjevkk8ikfJ2Pb1GA4E8q": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2qUknKa9V5ZpziTV9v5Bg9reDF9LmEEnAqvtDwhyRzqJ" + }, + "client_ip": "103.28.89.189", + "user_payer": "7NCw54YgSSfNh6FMvDrnnXZQkCs8VQbSAy3MnfFhA7EW", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HBKth4hXiGQtf4uTxJjnXkENimc62onodcdTxTC9Jvvr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "aXiomFkk6VzXaBhPuhMqTLZZguCFzzbyP9LTtZ7ZHLQ" + }, + "client_ip": "198.73.56.217", + "user_payer": "aXiomFkk6VzXaBhPuhMqTLZZguCFzzbyP9LTtZ7ZHLQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HCBqaZdZTtsR5N6nRh1xmUGux7d883zuw7ZSkXmKdUPm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "J6etcxDdYjPHrtyvDXrbCkx3q9W1UjMj1vy1jBFPJEbK" + }, + "client_ip": "64.130.37.138", + "user_payer": "J6etcxDdYjPHrtyvDXrbCkx3q9W1UjMj1vy1jBFPJEbK", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HCL2NLGjPBGtNvnNoekDuEzFdvceoMe2jCLMQLZQHdEp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2XmhZKHmfjku3T3nC9xKhgr5bm1CAmWXqNsNt49mo82C" + }, + "client_ip": "136.244.92.68", + "user_payer": "56apcp6ZpQnRZfy5arcRr88pcgeNUKF9o9YB6m7Y5cbL", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HCguSH6gtez9ysPad48D12KrrrJJazfKR3pC7YpqFWaE": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.40.126", + "user_payer": "Vu44FXNS3uU4mxXeu9hwRrFqVtrykyNfWK1C36sXtdc", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HDNRKohX9dY3zqzhXbqveFvjdgJyewVs7rjvtBxrrBx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk" + }, + "client_ip": "185.191.116.203", + "user_payer": "EwJA23TUEbcC5DrdEJ8uLXZs5YVsZPTHkkPjpFvTLovC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HDyut71jDCGsvk8jZBd6bPoCzLiNwr95c5vFXEXeXsRd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "9T6SNsBimjCRJpkEjiVsc8AcxTBa1XVA7RjnBGGfWP23" + }, + "client_ip": "140.82.39.68", + "user_payer": "6cfcopD5wh6ZMftYDck1KV64gvmHpFjF6w3rsFVTCkEf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HE6z67a5eBMDpHxwYTeQWGVbKY55RThWrZqgndXdmGwh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "LFGGGJtnBLvq78DyMz1gTeedM6f8owck76qHThDABBC" + }, + "client_ip": "45.139.132.65", + "user_payer": "FuKESZaoCLcLkBg3N2StYpm2znkB554L6aq6WtzTARuT", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HENY1MzkuS3AV6AfYu6DtbtD8Mfa3ErRAgts7B7XqDS7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC" + }, + "client_ip": "185.26.11.195", + "user_payer": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HFDDiCUsLV9riy9gTci6e7bguZHBAwYH4sZuyq8cTvKr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "E2FHj6LsECFv1DqYoGq6PovRimwaKzWemEmVYXx5aLhv" + }, + "client_ip": "104.204.142.140", + "user_payer": "DZiGTxgDvmBFiNYmukLHYePG2S4CRydoHjQ4kF6vtMJu", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HGHvUEJzERiMSu9ujRXq2dxYXz3SKffuDDfA3S7ToZgB": { + "account_type": "AccessPass", + "owner": "FdDcx5MJYRxykTF3YRuatw4Am7DNvZp2EpbhwD4V4ZMQ", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.32.155.94", + "user_payer": "FdDcx5MJYRxykTF3YRuatw4Am7DNvZp2EpbhwD4V4ZMQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 97, + 194, + 198, + 142, + 221, + 142, + 165, + 82, + 165, + 186, + 148, + 13, + 187, + 35, + 1, + 24, + 31, + 126, + 211, + 71, + 88, + 115, + 87, + 170, + 218, + 9, + 83, + 106, + 232, + 207, + 124, + 147 + ] + ], + "mgroup_sub_allowlist": [ + [ + 97, + 194, + 198, + 142, + 221, + 142, + 165, + 82, + 165, + 186, + 148, + 13, + 187, + 35, + 1, + 24, + 31, + 126, + 211, + 71, + 88, + 115, + 87, + 170, + 218, + 9, + 83, + 106, + 232, + 207, + 124, + 147 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "HH99ndFiDALLCh9ooPf7UWuJibJG7BiLUa272dPPm6gf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "fdover4vb6YyyHhGBMnoKiNgD7qLceJsh5k4ce3b4FR" + }, + "client_ip": "104.204.140.38", + "user_payer": "Bq9t5usaaa3eKHjVkbYF4ZMzusVt5UBiP98xdoXZekmB", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HHSVhxwthLP3i2FktQhPuWGzjJRjQn3ctWp6HXEMUUkB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "ark4Xyz5f5UnpvM6suFrHDkgavWf31rzVV1uaPTRGhf" + }, + "client_ip": "207.148.2.188", + "user_payer": "9nxWixzZih86YrKapEiG3AZigQBpoUX9Avn5pS1GWMqX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HJUwtFySeSkjyFzHsQCbgbdY7fMhXmoh8uMFLnEqf3bH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "D3htsc6iRQJLqCNWcC2xcZgUuvcd1JT8zoYNqraNcTQz" + }, + "client_ip": "185.191.117.142", + "user_payer": "EYTN9eRR4y4zN2yCR9L8cWvvbWbGTSuNrRT1ixMf6wND", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HJV38NiXexoFTTsGZDFWZq6yaTZ9V5ooguHsVtHc3CWn": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "4SNKY7GCp7ohY4AawND5Cc2D71sWMWN3Uifo854yvtks" + }, + "client_ip": "64.130.37.141", + "user_payer": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HJeFu4MjsbuLAewz6DcWBcPuz7ZHcW5fAYJ83TXFu3PN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "caSFeQYTQhPvDiMPoYAoVg1r1cmD7ijZLPdgRUYttak" + }, + "client_ip": "64.130.57.44", + "user_payer": "9BWFAyyHfKUTw5yjg1sfUaVTqaBrev6VjtCxBqFUPFdY", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HKaQEwq2QEHe3pQQn86h9JXmQjH2KWTNkDctUzZGQSeQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "4b1onMDEasBh4BuPekQWijx3BYR64hAE1z2jJyeZUkck" + }, + "client_ip": "104.194.8.153", + "user_payer": "A7nii4QwFSUaz8zCbiy1xFaapnJTYxLLVVWj9TvaFYC4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HL8GBwZnW5XAn1qmKZHUJoDWcPHgqqTsaYJhwbFs3Xty": { + "account_type": "AccessPass", + "owner": "FdDcx5MJYRxykTF3YRuatw4Am7DNvZp2EpbhwD4V4ZMQ", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "95.179.210.232", + "user_payer": "9kQKgQ3QFJBE8eveFzRqmCm1Sr5dcEcBSsPKukGJyCRA", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 97, + 194, + 198, + 142, + 221, + 142, + 165, + 82, + 165, + 186, + 148, + 13, + 187, + 35, + 1, + 24, + 31, + 126, + 211, + 71, + 88, + 115, + 87, + 170, + 218, + 9, + 83, + 106, + 232, + 207, + 124, + 147 + ] + ], + "mgroup_sub_allowlist": [ + [ + 97, + 194, + 198, + 142, + 221, + 142, + 165, + 82, + 165, + 186, + 148, + 13, + 187, + 35, + 1, + 24, + 31, + 126, + 211, + 71, + 88, + 115, + 87, + 170, + 218, + 9, + 83, + 106, + 232, + 207, + 124, + 147 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "HLEu5dxABP8czGJbZfcwtiqhRe8nwPaBZVEKbdvdozna": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3icve82hvXEquWEWg2sVKReFXSak2NVxaSTTjP44qKTs" + }, + "client_ip": "15.235.236.119", + "user_payer": "FPFXq9ZjDPwhuEHVR2UwbkfiuELYGUVuPv19Xn5Uh9N4", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HLe5e4hWaWgW7DCS2JT4xETXTkmb7ir2snPUi1ci6Akp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "bay3wXfJsu9ds1zQBoQQ4DUwFGs3NP6q4gca9WM5G1z" + }, + "client_ip": "212.83.42.92", + "user_payer": "bay3wXfJsu9ds1zQBoQQ4DUwFGs3NP6q4gca9WM5G1z", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HLijaqTZt8jCNFRJsHwMGZs8jUAihV59uVDV7jHzCiHT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "MicoB9cA9R6jsicdhzWFjwd9HMkV8FA4o3WxYU6Z2yz" + }, + "client_ip": "104.204.141.165", + "user_payer": "MicoB9cA9R6jsicdhzWFjwd9HMkV8FA4o3WxYU6Z2yz", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HLne5EgYZG33qnQr7R7R5E8rRb4nH6amWT8iZX2qU9eh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7ZjHeeYEesmBs4N6aDvCQimKdtJX2bs5boXpJmpG2bZJ" + }, + "client_ip": "185.189.47.161", + "user_payer": "DjdiUGStnZFhxqwXdv7jNK4ZfxfmoAwZZWVixkQAkYhH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HMXPeFBMiGFUAEigFSRr3ZkLhJkkBt1YLfw7KdtUr8c5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "KiNGTLWCgoqLKn266xxT2Zosko3FumNv7Z4V7V9cyKQ" + }, + "client_ip": "70.34.200.136", + "user_payer": "5ARyghFyLkd22cx4WEj4UMDRRh9QfRdJidRi8XoedRdQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HMfJB6fEytEPPo9x37AunXrsmYb6gUx2PaXp2Ym93eXB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BANXwrLTkNHL6vTpKhXn86ySjnbwwGyWf9ExGgwZoiSD" + }, + "client_ip": "89.36.35.227", + "user_payer": "AuiWzyRuxswXmM9mMp8JzXvbwzKzsCXUQvhJyyTZBpyM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HMhPCby8YHxYr7CqENSf7LjCtpVVdmFo4PsEZMcxbeMr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "AsMpvJ3DZ2Ydu1WTRMAyMH4QjSLiUG39rKzfzvtE1bWr" + }, + "client_ip": "86.105.224.181", + "user_payer": "FfzxeGsBnAvNkkKG8dZS779XoNgKjFKjgyqKbwYpBTN8", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HN1p8J5bRZTSx6NCdtL6Mp9XRU3KHRcdzLAgZgMUnrQe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HcZvwZ83PfjrQDiq3GLHxisTs17aGURs6bJ2LwtmL4qv" + }, + "client_ip": "37.202.198.11", + "user_payer": "SL9udNQdwUgNwpAxouHgET6WGRHQermEXU5RAcHqjf5", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HN717BfDP9cJnqQ5NGX9ET7jcZncD8EcYavk15Y15PJk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "7tLqkoYrPgUXyAr5VQuHUX4gz5i4UXkWRt3fsn86NLab" + }, + "client_ip": "207.90.227.252", + "user_payer": "FLVgaCPvSGFguumN9ao188izB4K4rxSWzkHneQMtkwQJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HNPPfk5ms7XSwYjmejPZ3PHk38LfZUkF4DhV292DFpjx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "GiYSnFRrXrmkJMC54A1j3K4xT6ZMfx1NSThEe5X2WpDe" + }, + "client_ip": "69.67.151.85", + "user_payer": "49eKC5d15NEyuhQ8K1eaop27MwBgzaNh1z3QUykNqXay", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HNQSrjbZwwVcvBFNCP8mQL29Mzd9s9rjaTfnXkyYA9Hf": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "82.27.90.28", + "user_payer": "G9XZgbqmNuQoyKgtuJ4iR7Yteqc1xwyi8ZVcjgXZELhN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HNc47Fix7BUETieWCDGa4EvKEYrYjuUuE5rkAhMTFzZN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DtY5Bzxd75iWQRvKwM2xLUxqwLT1RRoeNwmVvgS2JANA" + }, + "client_ip": "91.209.71.13", + "user_payer": "6jxte5jrKezgZ8XhnmcXEVEN4xQxbXb1hR4mUg3m6BrB", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HNeXj4Y3Tr7RPDyB3CQnvD9ZJKFG8oLMobKZSa83uK3": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "45.45.156.251", + "user_payer": "34sfv3gwVBZ4LxGemzjNz1q7zw2WMQ2hZEwGizQTsxoh", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HPhjZj9gr5PfVsW3dr5z7EbPApLHbcTerHfedekBnkcP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "XAqHfPFsqTfAJHBRHAcEECkMSykXjkUj2Rta16Qshrk" + }, + "client_ip": "66.165.246.214", + "user_payer": "2M5QWHEUWUBw5hLamafZ6aAvy2SWXJWmrE5vaXkuaMaW", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HPp5u7xCAhp5WB66wKZJPZfGyUV423WfusnLFt4ApJZ4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "bonkcbAQvHpYWxEG63E8ufTB1cxkkk9eAKaPdGePE88" + }, + "client_ip": "64.130.41.40", + "user_payer": "bonkcbAQvHpYWxEG63E8ufTB1cxkkk9eAKaPdGePE88", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HQQ3jKvbUpvNx4FPJKZSjEUccg7otjuiiViZG2V5kGsd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7" + }, + "client_ip": "103.88.233.59", + "user_payer": "53CHpSy7iCwQH8VvaZFUs8BZGz3qvtVZ9iGhiSKzYvJN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HQymVFa1KLmd4yA93yCHrBm8SLnJQF8R9fWV7nJ8C2jZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "VicAQ3U2GjjAuF3tPCtEQZdZKnpAAxkr5Q3zjDKmdo7" + }, + "client_ip": "217.69.0.24", + "user_payer": "JBjR6hxyMDHeiCfwrgmVQBpfDcPDSGbDBdLVUbpRS46e", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HRXu5Tb3ZmbyaZQJiqZVnRC1FHgRdH2Edxg6TNhnFWBp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC" + }, + "client_ip": "160.202.131.45", + "user_payer": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HRZGX91xRqsh9mmWTvtRQt17T1NHLgD6894c2x2iUY1i": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "EGBP25ioxkfqQ55ejS2G97vaYdKQwVaRMWnHeTuy5HSV" + }, + "client_ip": "67.213.117.49", + "user_payer": "anzaeL7Lsv71HW2mew8YcKGyGqL6qNn3xoNPRrejM73", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HSSrJi35sriVNgsPrSM1EQy1vcFbULXz78RLA1v7dZRb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz" + }, + "client_ip": "185.26.10.181", + "user_payer": "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HTgYP9qJFCZq4eptxv14eyezfgyF1SYMjg6NyKCB4nqt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "H7Zwkkjw14z7EDDXcvwra1nohNiZ1CDwvMQ4XgtvaPis" + }, + "client_ip": "5.187.35.9", + "user_payer": "6cfcopD5wh6ZMftYDck1KV64gvmHpFjF6w3rsFVTCkEf", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HU5CHQnG1P4VRX3WA5mSdKSrDpsvbToQbcAUgrbo61rb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "6MiEjXqYksCtKnJpvAp3CAoEZnnWZyoSxu41HCzAYNdc" + }, + "client_ip": "64.130.53.250", + "user_payer": "E8JKqZAQtYkWrBqx3H5eWWuky14Z8DNGwq61eqQ5wcp8", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HUFPiKxhtcprzea8NvNXVvScyyzZVhNAFUngo41K6wYU": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FwnWx7x99rGwLmipzz8ii15NqcHkKRo2oS1Y7j6LivgZ" + }, + "client_ip": "5.61.209.41", + "user_payer": "Dug99hFphzxrrA3GhS8U1Wxajz1QKaqszJU4PJEAwPDU", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HUFnbXB16W8YDUhPpmnzj7K4GMdWNQw8s8m1Ys8fMV7b": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9" + }, + "client_ip": "45.76.138.26", + "user_payer": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HVSf322SNVnwCmhJznVwvjaSYoxDiV7A63wck7UzMjdV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ" + }, + "client_ip": "189.1.171.179", + "user_payer": "TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HVaPk7EuqYJB4e8Qtug8nt3nSm7pwjeitz1eqtbgc4i3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3Rv6ZVGUuRczP76322LyhTTYw2iM4avV4B5xFJocQJer" + }, + "client_ip": "149.28.122.118", + "user_payer": "GqUtPyfcg7pa1ZHTBLd6tqdLndDcUFGeBcvhxJbpn2Ce", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HVu4Zg8XnBmLFpqdkKx6cAHEYQ4jgahU8vEtrvkMctZX": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.52.249", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HW7R48avQjL63rQoK8wxTU9ZKxbHggpriHaqXF6ut1oX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "BPaKs1w9fQWESWnvXywHQkyqpup6ozh9e6vqs5PAeZJm" + }, + "client_ip": "88.216.198.138", + "user_payer": "4NKEM1s5WCtPcqER4mXfGiStC7PAJLMWnh832tTB4FkG", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HWSjAWbzYn1D4bc1i1nj51J82f3D9vrNfWVRkkVHjjjx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y" + }, + "client_ip": "5.199.164.205", + "user_payer": "J2ibtVSFZd11ccVf6CYS7w1MeNiCjQjosDAofhZbaZ6T", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HWWM33L3zGQRihB1c21Wd6XtxdjTa6cqhm4nJJ2jtZpx": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "23.109.62.84", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "HX1PVQCbXnsLm3sWtjXCdgj6eV1ZLse9PansvHKsDump": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ETEfye2iPmRc5CWhoMsU7VaXJV6y6VtiXKDfSeuR2FYB" + }, + "client_ip": "165.140.84.154", + "user_payer": "E1D2CrTDZyb3dw9Zt35oWKwAT59d4BnhuztxdoM9fptS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HX2iAxAYtRpujbUiHcfe2hr3T9c93wZ37649cQWogYZN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "SP9K2c8Z1aaQaqdQgC6hZMJ5UCTTnE76XNYVse7H94b" + }, + "client_ip": "82.197.162.50", + "user_payer": "8p7k4K668cYhHvJA76ZDS2SaCejszMasPHzEMfgUuJLZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HXa6Masop9p1JNVkUTfoTyNC7VqqLsgyjfYsSYppSYHi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "4VrjyXQT61WFSjuG3ehgqZUK1jqvYqB46veQbXLotq3n" + }, + "client_ip": "50.7.5.42", + "user_payer": "DZRXuqSeAEdUdBy64URTUjw6iZ75N3YBigMzvoVDTaqK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HXhDrkPuy1yntJEdHpVQ7s67QZ1V5jvYaCTcd12dnWGY": { + "account_type": "AccessPass", + "owner": "dztTSUGoiTxm5gzGmUpPfKMkDiBQ7Pgsipqtg9zFfZX", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "208.91.107.165", + "user_payer": "dztpo5FUQ7aEXFhfxkGrMJNFNL2cPTZkctEyB5MRrEz", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HY3Kytbj6SH1QprvbhfUNtjkH419AGjkeCyYHM9A6nJt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA" + }, + "client_ip": "67.213.113.83", + "user_payer": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HYW2fYk8X2KDdXxSp7FezcyfLK2zjDwcrUspbJWXv3FJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6YDWxPaJWpZxJ6JLGaBeTJaGQn3gi3Pwtivii9cDyDHo" + }, + "client_ip": "86.105.224.78", + "user_payer": "6JxGDBcftAVgo9bV5yTzA5KBbNWRbci2eLf2VYMQKvSF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HZvTonZBLU4fQ8WJVwkiRa5Xm3a9MDL3LqpiTsgUr2eb": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4" + }, + "client_ip": "69.67.148.115", + "user_payer": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HaVjGaUgoyZSSM3kVgE1rZ5YYk5RabTgJU6EFrEdCv1j": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "PAWsME7oYbjt5TRNc11mBa33JhKnQr9AYherdr9YAZ6" + }, + "client_ip": "86.105.224.150", + "user_payer": "87CijYvtTbvvYmMaWqGrvfDk3LYbujaaig5XzGpSMVC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hb7cDiVzXKtsBr1LCerGsmgnvuazt2wDfDjiLRbTduFM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "53vKTuQsLV3YkSzUr2rXRcLn5Gw3yWakJ6Yb1sYNwby" + }, + "client_ip": "66.206.3.122", + "user_payer": "6dCYcUDudUWvcHpCessp15rJQp7JvQV3tpELXo29zHHS", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HbFNwLGxKGiAwCahnwcKTmpAdccmZEcasWa35tUBvhEL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DViARWAWKkxAzp4UCgbw5B9pLSrBY3PaztFErcwgVUKX" + }, + "client_ip": "91.227.33.5", + "user_payer": "6abpeScUh5nS8rVcBbRiWS8o849k13jDh3ENYFFGwpyS", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hfbkd5wWWsNZwEY81koMw3RyyJQZs6hnny3Fp9xBYKTf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK" + }, + "client_ip": "72.46.84.111", + "user_payer": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hfndnpy1FpENvTTTee1zGuQxndb7vp5ZXTznTDmAE8sH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2wQAQRspz1SrAuPP9S1RZikicSEhdVm6LBSLeAFqUHyf" + }, + "client_ip": "64.130.44.89", + "user_payer": "9NR8T2KaNPKSMaG1hQc7vqrgmkr7VBjqudDDUkTM5bQM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "HgLDP77owXDo28AkyzDUYzM27Gm5rRuNQBPN1JMMt5Yj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY" + }, + "client_ip": "177.54.154.243", + "user_payer": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HgNTuvTCiNBpJE5V7JcYaJV11QACiFZB7fyRA1q8A2G3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "qZMH9GWnnBkx7aM1h98iKSv2Lz5N78nwNSocAxDQrbP" + }, + "client_ip": "46.229.232.132", + "user_payer": "5k5d81XHiesf8KoA4eNarbDXsYbfxWsbxWL4A6RnLrXj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hhea9Wb3k5dbqoA8wGTzWphrH8sosK7bfceFXrZmQNXj": { + "account_type": "AccessPass", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "52.194.229.75", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hin8369Fm4XszaWmavjyYXNuH6wzK9HVdi5tV5V2Wxs2": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FwnWx7x99rGwLmipzz8ii15NqcHkKRo2oS1Y7j6LivgZ" + }, + "client_ip": "66.245.194.149", + "user_payer": "Dug99hFphzxrrA3GhS8U1Wxajz1QKaqszJU4PJEAwPDU", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HistfJwX9WWtuJNx5DkjE7dZTQCuVr2dEpVbEFTkxfqk": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "64.130.57.203", + "user_payer": "7u4bHqyHuiKwLyFR4Xpmgy5iBvyYsHVKvqNLC5D6qS9Y", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HivXb752fgGEhk4sXRdST9iw5WANd6Mvh94zyVdD1jMJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "gVALrRd3xq4D62KJNGDCpMMGz976w2x1Vo79mSNn4bh" + }, + "client_ip": "102.211.135.183", + "user_payer": "CDWhWFuJ23H3bqCr2togzxWCJnQJ1So4dq9tjivYw5Nz", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HjaX9G59Jq6NUc8UhAyH6hdbdq92DB6ME7koH8jpePtu": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.128.218.34", + "user_payer": "BmbSrSKCBXNr9zMSYqvebqGXCYjjnQKiW46qnYsCN4SY", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HkVDDCqLAToEW42EjmeVQjnmVRxNjMDJVtBxhF4XuTS4": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GWPGr5GjvZHn2UGRfGSqsjxfKLCwo4QbeVT8mtBqQVaP" + }, + "client_ip": "46.21.153.94", + "user_payer": "Cg9YspxfoL2zoSPtnwi91DhHS8RLUDguVWdF9113RFt6", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HkVE4wTeEmXRYAtksUtFckc43Bq1Vng2WiQQaAm2QNhH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe" + }, + "client_ip": "162.43.190.151", + "user_payer": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hm1VPdZ1BbJJHEK2ceoQK3yDEHp93FQP7rYJixrLxaJz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4uH4G6YiD5G8rU3mtPg73C2Uqamrqedy3FboTZcZrh6x" + }, + "client_ip": "185.191.117.49", + "user_payer": "42uqJWnUqNU8c1ZJztpaFqn6kknk6WsKZamKwxywbtxH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HmMja1RtsYezG2mDieniawjzBSAc6TtxYREbXA8HYioT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CmHAicGXp6boDhgp7Kb1JbPcvf7GstyK2yMyMxZY2pKU" + }, + "client_ip": "92.204.197.10", + "user_payer": "8HekJATdwHKTc2UQXnjxex4iM6jrGsMksXMiSyntc71D", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HmutrHbt5xnQsQETYuZCcHei4zGXWMVxDj2UvfkNkrb3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FyrwfMaomErzqrFUXMjCJ7mA4u81DsiDdrzC3MJD6d4j" + }, + "client_ip": "45.76.148.94", + "user_payer": "539tRUjSsrj57iqWFrYfntDbWsLeeDnmhXQJ3x32NmLk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hn6737NZJg91pBQYQRXfeGexHsAmvBUxQz9vpi8MzeXx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8hAYbagNt7CMBooFfqVJhBgLqLffpjXTWJMk8yybjJsN" + }, + "client_ip": "67.213.123.151", + "user_payer": "69nT8g5XC8csa6Q8nkSK1JYxAnQq8aW6BCRzaEEy9Fqc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HnCpGzBLSXem3yfz4d6Qw2jEj3GhcwrWF1JaS7snP6AP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "noMiSMNpN3iGeX3WdF5M2KQdFUQt2RYYpfJ4dN1Ni3k" + }, + "client_ip": "139.84.243.156", + "user_payer": "noMiSMNpN3iGeX3WdF5M2KQdFUQt2RYYpfJ4dN1Ni3k", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Ho8NuNGdpNr3YQTv3sSnzBQian8FsJUJadXooDqy1SfN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HMWXfjaeSHhww1wvdBhqhHVP9v96mFB4LJ9xP2MXbDGH" + }, + "client_ip": "45.76.138.60", + "user_payer": "5S3FbajTjdbdf84N1VUKj9aUAbQTyyxvZN4dXB9jhcn4", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HopLaQcwtf4VpKKpu8T5TQgNYvjc2sRobeAbSaiLrEp3": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DDnAqxJVFo2GVTujibHt5cjevHMSE9bo8HJaydHoshdp" + }, + "client_ip": "64.130.43.210", + "user_payer": "32hwvo6DJxFx6qH33SY1RiniRodSkKwdKH8XamAbNCGL", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hov6c4amxPxSRx6S1iuqkeR1t4QSk1mttdUsexWojFXS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "1Link6hB1NpkCwJt3ZtpQKZszKauhEcKgiWjaU8PRDG" + }, + "client_ip": "45.152.160.235", + "user_payer": "1Link6hB1NpkCwJt3ZtpQKZszKauhEcKgiWjaU8PRDG", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HqYXgGte6jfXBHc6PusWry7vJwWRNCUmMZJfPxcnoiyu": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7" + }, + "client_ip": "5.199.165.10", + "user_payer": "5BQPELVk7Lq1X3gcuvjcB1PH4auJU3PvmkEumHu6tEXJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hr8opx4PjgY2R1gXCKj6TXg3GQoik3C7sdGMcXFzWRR2": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.34.92.15", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "HrRoNRFCXc8z4TsGxKMPhox88KwN3KHdgFxUVcadynBi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "CMPSSdrTnRQBiBGTyFpdCc3VMNuLWYWaSkE8Zh5z6gbd" + }, + "client_ip": "45.77.28.184", + "user_payer": "GHUFsW8uJoHeD6BPvFZYYPD8WbTawRyxYeCpqjcaU5wi", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hrst6RgvZQCQCP2WQcQJaBGh8hRW587gHLQBnDbW6cZP": { + "account_type": "AccessPass", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "178.239.19.43", + "user_payer": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HsNM7ajgGtEKuksrsvjnH5t4HgJnBEjhqHxG6kkuJArm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "pitMDEaMmWmr7qP8HsNqarPQkd3jhZbLJibhhQnL5RG" + }, + "client_ip": "5.187.35.138", + "user_payer": "8TiBijMRkgwLrcLgxtUJjmvoWuRNeP93oadu479azkWT", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HtBvHyYfiSUCAdRJVMPqoZVUn8ZAZKdpmKdAMEWU1B7o": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "shftkxnsXmqAkmLgz9Mn7bNB5Fr6mKgFc58kFHfVikj" + }, + "client_ip": "64.130.40.54", + "user_payer": "shftkxnsXmqAkmLgz9Mn7bNB5Fr6mKgFc58kFHfVikj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HtNybSeM5nfbDBzSDyxNQB3cC4wzLRvxmMH6nqnV5Nyc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb" + }, + "client_ip": "216.18.195.226", + "user_payer": "Gc5i1TRqaBcQhh8cuFNCK5oRsnKMUarU1iH4pxUMNUps", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HtPCbr4v9ZXsYAr7vBFDiDS1XsfUTUfhq69q74evRew5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8cqck84coxk8TGXYBD95QosKCEA6fKwXLevcEv3oGmu8" + }, + "client_ip": "104.204.142.142", + "user_payer": "A1TrMXJKPCPkGf9RiCFw8e7YYzULJg8fi8YvsMENommr", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HteN4UjreAxrcWXWFc8jGSQQRwysWiwJgDXfJh8Ri2Ea": { + "account_type": "AccessPass", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "208.91.107.71", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "HtgaPLG7xb1ZksfYiHAKR4WLKr3x4ojzqBAdv638uMDG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3bFtCT3HKpGRKf7bK4tzgcGjUQJdrudY3M9HPHUPdF9M" + }, + "client_ip": "64.130.52.202", + "user_payer": "6kjk86WcroKzgXGscgKdupZwEYfDUN1koTF66iH4SAM4", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HthWRPfAixTdBJLDcJ1FGMyp6roNd2k42BCJyiHrHjEe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "D8kuk3qEiVBGwYkuMGKfBDwuRi6jjRkzjAZg45fdaRLx" + }, + "client_ip": "209.250.232.31", + "user_payer": "Fy7BRtoUrNpGfbegKvsnhst2DTqULvSjtt5X7vM5ogjc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Htz2cJvnRAbbxCnxgmwaj2SyFKA5FkeL9jKqMzzQEaqf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DCdTPyDbXNHrmdv4ZyPPzEfY4mPAqH4hDPtowAteoNgv" + }, + "client_ip": "64.34.80.81", + "user_payer": "GwPAVRhXrQmgYhV5Vtn3eNzvCCJhaRjJnzh6x3oi44wT", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hu6Yy7X4k4prrVGssxErmuhTMHyWLRznWGFyUoUEU54e": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "7PpXQgDb9eCHN1Uudgi77Wm89cRz4T85YgDw83qvaJXd" + }, + "client_ip": "45.76.39.191", + "user_payer": "79jiM1FrLqZpUWt4f1Uo7imRVQ4KiFfKAeb5mhHzJryU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HuZxMKzBXgZy6W7WdUEwoDKAaQLXrtHSuKJKozp3s2TJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6Ai4R2LodcFY6tMjZP19hPGCPCNB4hXR7chPUp3aKJjW" + }, + "client_ip": "207.90.226.252", + "user_payer": "FLVgaCPvSGFguumN9ao188izB4K4rxSWzkHneQMtkwQJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HuuQjMBB5DMRpUzFVGFmMrS66b6MgX4ZuYuBUiM2gZkN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "6WgdYhhGE53WrZ7ywJA15hBVkw7CRbQ8yDBBTwmBtAHN" + }, + "client_ip": "85.195.104.157", + "user_payer": "GZRFDqw5aiiyUVzWcJ7ayfqhAaXvq2HbfvGeCEoyUnHF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hv3a164bgamvbpw2qaKCzEhL89cuCYp9WvTqWGE7Jg98": { + "account_type": "AccessPass", + "owner": "DZ44dbatT5wgb1ijXZ54XBkRpfxWRLi7H5uNHM3tBTvE", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "134.122.54.123", + "user_payer": "3w2Ft53Zv5uPMCQ125dyAnaDnRCqy89MeS58gixsKChP", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hw5sVXfqpcpCxFB6hoW3fC4Di6TRWp4nEAL1V4VZG1PZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "LodeuWMHPiPj2PUHUyca2bkpFv9HyzR3gaDBmGJ9TSS" + }, + "client_ip": "192.69.194.213", + "user_payer": "LodeuWMHPiPj2PUHUyca2bkpFv9HyzR3gaDBmGJ9TSS", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HwoQqJtfKST4U1QJQiV3UF83yAP1yxPikD6oiixg6Lzn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "DWvDTSh3qfn88UoQTEKRV2JnLt5jtJAVoiCo3ivtMwXP" + }, + "client_ip": "31.172.68.134", + "user_payer": "EQLJDB5PdY9exCPvtaFobti9WgAGcxHW1e6kVF8eacX4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HwyTW2365ATcGK2ZTbDHCn43Mtn371mLhL7c5qBigQdn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9" + }, + "client_ip": "198.13.39.79", + "user_payer": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hx5sKKh4XDHjer4niHka4JPs8zz3qadHq62MGRFAQSXe": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "217.79.254.70", + "user_payer": "HQ2qpgy5K54ctLVaf5VvFLFfUqW5c1g7WwinG8SZ4AcS", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HxG5wjyFXKri33Zfb8e26uWLJFU7p37KC3TyAdpQD6MX": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "farbZXR7aBQSMCYiUXzoS4pRUsvuCZ38f6AXMXiKACf" + }, + "client_ip": "86.105.224.80", + "user_payer": "2XFNWm7TPScNGKTSwVi1i8RwbR6fbfZ7FjkWNYssPhj7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HxQCo4Qe32T7M9taviAU3hw4oSyJV9jCeLgSGgqqsW9X": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.57.28", + "user_payer": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HyXhosZqM382GhHwzycZFuK1LXZs7CUgzTJmqvUPaanS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 247, + "accesspass_type": { + "SolanaValidator": "C7CZpb8EkodpFsfNZ6rDdAGTyqT2oPiwLWSKQHFmtagj" + }, + "client_ip": "137.239.213.222", + "user_payer": "HxGDmKC6w6LLhrSCRq1HaKEJ5wNjQf8XF3UVi891ZZpV", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Hyq8ZfYBqJFkwtzCv2WPFdEw4vRYgQqSV9kqbRwgQNTB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh" + }, + "client_ip": "173.231.57.146", + "user_payer": "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "HzPwFkJqcxsyH8982VrUzLFzkLZw4iHuBX46SMdUHjbs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "15.235.231.135", + "user_payer": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J1QYkKhznL56yFg9Xc4RXKorrj3AgTgcXZhvGtmSSjdC": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "12mZ7YQT1J24tkyF1dr5AEuGEqypdmuL8JzeBsmR1Yct" + }, + "client_ip": "103.106.59.17", + "user_payer": "39WWybLfDXnmmhfSt4cqAmV7b9S81gFR5kgsJ2REWynv", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J1UZPL1LVwQt5AXbwhJY9XHrdiCD6M2TZpQ4GCAWFrCy": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.37.175", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ], + [ + 108, + 94, + 233, + 173, + 43, + 255, + 68, + 33, + 232, + 237, + 69, + 20, + 187, + 224, + 185, + 35, + 33, + 118, + 68, + 128, + 214, + 144, + 105, + 131, + 125, + 77, + 168, + 5, + 21, + 239, + 36, + 57 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "J1is2sBvEswhur31sPdbLzFwMTXXejSX4WQeZFVRqkDD": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7LCboK6qigoiq7qJhyu2pzZ8LWjSSkV3i5nrFCQ4HkGi" + }, + "client_ip": "89.42.231.14", + "user_payer": "AgEosY2kAXbzCodTBhfL1LtGhKEGMHi633pCDBJeryHS", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J1qL7N9gMG3sFC6zjuYFgLV5Whnx3CwQeTYp1zLd6QCr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "hykfH9jUQqe2yqv3VqVAK5AmMYqrmMWmdwDcbfsm6My" + }, + "client_ip": "155.138.243.122", + "user_payer": "9nxWixzZih86YrKapEiG3AZigQBpoUX9Avn5pS1GWMqX", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J2dUU4KxKrtZgUZoJTyNRT9a424zWjebZSFF5Lie2QSV": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Stakex4B2tpDHPWGvV1dninfiaYCGdakgTknpzPitLh" + }, + "client_ip": "151.123.174.66", + "user_payer": "DZiGTxgDvmBFiNYmukLHYePG2S4CRydoHjQ4kF6vtMJu", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J3bdiuzpbsTLasgLtp6aL39oxCS1Zh7zDydGVYjephi9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8ZQg3K1V1Z2BVJkjmnxpi43WKhjPGXphzu5QmBkJibSP" + }, + "client_ip": "170.23.153.105", + "user_payer": "8JeyzEF34DdmQUJd2S5su5ASFZMwxUniVXh2943V8LsX", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "J3mFUsZS4xjVdiVos16xdtHQnz8QNZ6YwL1ETmHQHjyT": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.45.156.252", + "user_payer": "6hKD9VNG3xiRTASMRCvE8agvoYCZRtfeGfKxvuT5QraA", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J436KV6z9hxFTHe7WkkNBRbpwYsoa8Uznx9u7YsVAJrT": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "DeXsDvvZzKhVux4YfDFE6p4acJLGzr8yKt5pSTjzZB8t" + }, + "client_ip": "5.199.164.131", + "user_payer": "GfKWhwJYZCfCgtu98vbf1GxTTXsiJejwuWAo1xkUcdf6", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J48GgEV5Ebexm2o4qkYW1pjnxZfgWFcoLLUbMCJTZkkn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "mrgn4sJJu5GBa5wbKyjuASzhyCifvcedGoLtpKjB3Wf" + }, + "client_ip": "64.130.41.53", + "user_payer": "mrgn4sJJu5GBa5wbKyjuASzhyCifvcedGoLtpKjB3Wf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J4qXN5NtpdhRYdbfyEMdeazVcNAnowJyzNp9RJ7nX8kB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "EATpCzQNs8BzZh1mx1hXMAJm3o1MLXakTXr4UEmcsY7f" + }, + "client_ip": "84.32.32.16", + "user_payer": "3F2SvqfCut3YmsHKC5vjhpBi1wvPFBF3CTHi1Jic7tJK", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J4wXRULejm6BEZJfNQSNHzmen2mzuNZWFiN42i9AAurL": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "GxxXXKqA3gCodmbx5LyeHcZn4AcrVrgutLa4uZ68e6KY" + }, + "client_ip": "195.231.30.71", + "user_payer": "DzFn1LG97hQczGVqcLHjjetnMoGyHG7KohJxwPRUxfQD", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J5HzpLkLpVpD8pqe9sAPk2u5vdMZapHJbGGRkGv7pzYr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "7PpXQgDb9eCHN1Uudgi77Wm89cRz4T85YgDw83qvaJXd" + }, + "client_ip": "158.247.246.36", + "user_payer": "79jiM1FrLqZpUWt4f1Uo7imRVQ4KiFfKAeb5mhHzJryU", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J5JZJX9ih1RqDrzWXifxmvr7LPvjbAKLLzS5D58JWLba": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "DPjHgNzoZywHpDNZqBh5mdHSJrTZyQRQ5iA9S3Ro2udb" + }, + "client_ip": "45.77.136.79", + "user_payer": "GBzbTunYrMzcpeyJ6nwCUCupAbvEvE4xJPx9SXjAN1vC", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J5pGQ26GRMcRa6pDNqJTCLcPnyZDcCsbBy3XXAvqCB6H": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "198.13.134.201", + "user_payer": "27uzhwMXu7Qv1Z7iMfvhR2BYy99egSZznVshznhVCokr", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J5puZCVVeHvWk4yf5TZPtURP9ssT8wP8vb25e6Wb8Z8k": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.52.182", + "user_payer": "FMNhfpBAN2fPoaoE3P9qYiK8nMycrLN1kQxb8q1MKN94", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "J7BKPNYRdJhesGJ83yypz2RKwkSBwJPk6aMfcYHa9cbH": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2xKovmftuWNTwCWGtw2Cc6aZovgMZyKaoKK68n1ZLmww" + }, + "client_ip": "64.130.32.181", + "user_payer": "2xKovmftuWNTwCWGtw2Cc6aZovgMZyKaoKK68n1ZLmww", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J7LPzti6SPeEHnungybXY8cQtrxhHuu7T1a5vyj6vnxj": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "71v7RtjE4R7Cbq1s3FZtizT8dRb96cHqLUGSysUbYWWW" + }, + "client_ip": "104.204.140.78", + "user_payer": "VALiDcyCpujxjJAZDK2av2TpMAigpSodzj2ApqgR4e6", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J7LeqLmqbJviL6Cyw1WhVuADAt1vJ6MQj4UeuYTzhU74": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5zm9g3zgAPWzX3wmUB2JtTkcwCqe74NWsTmt5wLFwCKK" + }, + "client_ip": "185.191.117.69", + "user_payer": "2pPPVmfrdQi6m8UYTXtwNpovf1wHDok2HomgFTgrzN77", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J7M5cq6LzHMSsx54uJsr5yy7Xd8iAjo1tncbLaQtvvRh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DUrordmMASu7Sx8ihhwBrgYqLXxhRCNoetY9HxBmzMVL" + }, + "client_ip": "64.130.37.226", + "user_payer": "UMiZdCdPPeqEDp2KKozxdu1u4LVfihkfxp6Gjw2NPUZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J9L4Q4oS2d5uALR2deNhvMMLDs87bd2iwtBkV4cSWTig": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "48uvGzZYWw3fkE5omkUjPj6K66bCMUmvVpvsrfPe3U87" + }, + "client_ip": "70.40.184.245", + "user_payer": "Bq9t5usaaa3eKHjVkbYF4ZMzusVt5UBiP98xdoXZekmB", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "J9jbkRSm5GSpM5tSu84TbBH2PZWqn5bBLz8MrAYkyVFo": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "Fg88LMe81uEoeFPV1YLBJ14hGzkLM3WEan8EunerbYau" + }, + "client_ip": "141.98.217.184", + "user_payer": "PoNZQgVSE7X95D1fwiPJBobHYCXBxw3MV8oiT9vSqjf", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JA8H89B3kvzNBrXjxQqAQovxj4CXGc3yTwkLB5ePXvwK": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.41.212", + "user_payer": "7zNycMnTp7uVGHSjBiR3vuLsHDKXe9eapnJR97D9p89K", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "JAFXy9V8r2cB3hFnHQLXKX9fMwdJK5LFWvZjqjMWHG4g": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y" + }, + "client_ip": "64.176.7.70", + "user_payer": "J2ibtVSFZd11ccVf6CYS7w1MeNiCjQjosDAofhZbaZ6T", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JAHg5HgeRWn4wYNJS3RH1YGwi5ehJoEm8QYFne47BAir": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "wifwUaAXgGXixi757cinR8RhAzNuuyKg8hh7mkCDPEc" + }, + "client_ip": "64.130.41.38", + "user_payer": "wifwUaAXgGXixi757cinR8RhAzNuuyKg8hh7mkCDPEc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JAXtgVdW849Vua1fMibDgFo4hpx9fTmMCvQJ4oxPWEbi": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8LvFvzQ9tuQo68tBTqk1ctj56rYh5WY1GVtzYnA2vmfC" + }, + "client_ip": "91.242.214.37", + "user_payer": "EjXcWzStYCM9nBMRsz36VxHkBd5ZPBhoMqyX8HvvTFvX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JAdaCczfLxy328iSGCtoC8UShwV84bULYzz7bQnqi4wK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV" + }, + "client_ip": "72.46.84.111", + "user_payer": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JBRYP1exsCrqj4f8SmgUgFJNPNDa1V5T1vrrKjTsvrCZ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "1KXvrkPXwkGF6NK1zyzVuJqbXfpenPVPP6hoiK9bsK3" + }, + "client_ip": "45.152.160.122", + "user_payer": "BnYN5YzNANLv3c3qWgKhPB5C9nCButYrn6ji4GfFhPrk", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JBkgA7JuydYJQ82tZLwzArtg9rbJ9sTUrCkTRwWVH1K7": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "AR8uetaAnHRoPr6jvwKXWqd4YWbkbAXs5yreqo4HQHLQ" + }, + "client_ip": "185.189.45.80", + "user_payer": "DZphw7yYtc5dQvcCyjWFUiT5WfyrDozGy7DUptB6d1a1", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JC6jZK5eXcKqbVbT1Rh4ZdD9bFwwMPFTCgW8HHHHY54q": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "841mxTUmRDKdN5mes8Kf3VMctk8rcefnD4aBuaPeUNoU" + }, + "client_ip": "208.91.110.141", + "user_payer": "GgipuMTLa5cuEkmjxYeyMLPZ7vekkxFJqoHcakxjrtJm", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JC71u1fK57no7ja7ou21bKnVHKTKSiu73Niz26p5Qgi5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "3Yhk7RzAi1RdmG8GRpT3HvMCADRva5y3Q6Zb2DUk68ex" + }, + "client_ip": "146.19.172.16", + "user_payer": "ADtJfJxdBwPd3Ln5FfPhjYhTk8mgGXKmSPmsYSbnxFWi", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JCU1LJhWQn4wugBZiVCvKPUJz9KUuDJG71LFehfWHwWA": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS" + }, + "client_ip": "102.211.135.173", + "user_payer": "24Pz4X51n2obC9ob8CECNketFyTpnG6gPaSQiSNEWKAH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JD4ZtS6XE1ABznaKAmBAnGjgRJZnLK8543chRfkEsJhK": { + "account_type": "AccessPass", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.41.170", + "user_payer": "td2GGWDsCJ6LvjN89oLJvmrDwE14neNrbqQ9s3tVkPy", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JDCGnpr263uX4FULotbBZ2CqW8L6rNLVxAJ8fAMeH9my": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4" + }, + "client_ip": "72.46.86.125", + "user_payer": "BRZoEWqCGG8aTNQUuaiT3oP5yzDS2up2dHhxdwLhM8tt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JDs2WUQL9FvkqPMp231Gey9ABLwELw7uCH5YU5nDJjTt": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ArMBx6veRq33ffEP9sxHafiPRgrtzww4XvbwZbSMfXiM" + }, + "client_ip": "104.204.142.108", + "user_payer": "6k4oeLB9fcAuNFnBERKqZXPC2vfnMpaeNnqxU3D3zEKo", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "JDs2wxaro5McB6dfu1QDzP9Joo3jBbXtegzEDWazf5ro": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2icWF7TvxyycF7d1NHpMZYuJJqiRy2h7wmjFSbqUij1B" + }, + "client_ip": "64.130.50.181", + "user_payer": "pzcBFENnzdfGwKfDWQkZzYtrP1JSg2NtYmve1nLjgg8", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "KK8wBZBB48Fy3wo2tYnnSx7JqvRqQfdCzVMu2dprtLC": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.154.33.13", + "user_payer": "8uSqU1CepXtQXmoxgKfVTjDubqVjTXuFAA838zB9w1Hb", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "KcmssqcWFBzBPWtX4SJpPHS9qT7U1cKtbF63wQTb3hf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HJHDGgsLBBGStNbu3zRMSTuNuUotzWoLeCSXHPzQmamo" + }, + "client_ip": "65.49.109.98", + "user_payer": "9NR8T2KaNPKSMaG1hQc7vqrgmkr7VBjqudDDUkTM5bQM", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "KqRH6es7H7iLKc7AhvCEPZmh1Tm2devqEgKdTw2k1jf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Corvusonv2NRNRAVJdbvQJdRzLNUEwoz7sp4NkUVTpKm" + }, + "client_ip": "89.42.231.195", + "user_payer": "4FTJFhhNyj16XE3PYQ2XZk6Stj3XR2KVTC3cLrQRtGt3", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "KrvdGnutoMBTeumWbQrMVEotxxzPEQ25kbFxv2TqEQm": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "shftkxnsXmqAkmLgz9Mn7bNB5Fr6mKgFc58kFHfVikj" + }, + "client_ip": "45.139.135.100", + "user_payer": "shftkxnsXmqAkmLgz9Mn7bNB5Fr6mKgFc58kFHfVikj", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Kysjzr9sDtV6D1mdKSt5mbQeN1oQwAFqvSuMBwShLiF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "BR1aTt4ZZUCwWJDkSYf1hqkYJjo7Mb7Ar8iVTkeSwUB8" + }, + "client_ip": "64.176.66.213", + "user_payer": "HViQEoiH7whMUcv4ctVgnRKPiZVALwMjJH2Cj7R6gsR3", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "LFH7A5VnMJQXnLZg3SfeV7SRWUZfDoiZGcqrKd4Q59m": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "93LmioiZk4hZX2YZuP7ue85Zrv5d362Cua5YHpDSRe1E" + }, + "client_ip": "185.133.42.59", + "user_payer": "GUDk7YkqVHJFKMnximYS4QU4jjGW67v9291CHSk8riPy", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "LeBtFogFVK725g9DK8kZJ7U3RE8ckUqhW2so5RbMf18": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "HVJKtzgTSq9x1rzcReYqjTgCrGvKQ3hMdMBVURRwytcb" + }, + "client_ip": "84.32.103.132", + "user_payer": "H3egfHfhKLANLTdMWvn8T5Hrtr3Md5aayZxLiUGxwEmZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "MNJZAbjFBxfHHBT4HZxySwgGpD5JCR6u2tSxZGcbSmv": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "juigBT2qetpYpf1iwgjaiWTjryKkY3uUTVAnRFKkqY6" + }, + "client_ip": "69.2.39.165", + "user_payer": "3mJrMUPfc7e5VWCXGbyyAMwkEoaopnMsHMzk5DjUks1x", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "NW3v6AW7wzVCYc4fBiMDP6wdmyWLerodJViTsGUyy4C": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 252, + "accesspass_type": "Prepaid", + "client_ip": "198.13.136.182", + "user_payer": "ErEdVCQ5y7yTD67w7qDycHF55iVbkcx3MMKU3ewbJ1Gg", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "PWsf2Gfoz8rWXgQxWEkjoPsmmeE4uziHg45EMBZVMNE": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "NordEHiwa6wT5TCjdeWJzpsA7DSmWQPqfSS7m2b6cv3" + }, + "client_ip": "83.143.84.46", + "user_payer": "F5kvKUW9CVtwrv4bQTvCqy3ZZvPsz9kmmnoCgymcu2of", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Pgs1KMnUAQK7ZRVXmN3nADRcc3i6xAdK25js1XqqfdS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj" + }, + "client_ip": "189.1.171.179", + "user_payer": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "PrB5KtsHtWJJ6K6VcKQpurJcLW52a1cBMYfLryxn3FM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 251, + "accesspass_type": { + "SolanaValidator": "3C2cXXVHCm2w2EWnHUNxhtZCB2EMv2AeJ4TpW5ws18fi" + }, + "client_ip": "146.0.249.83", + "user_payer": "3fVYKDtpP6ER3pFfESF9MySXEn1uLBvKTcn6BNQJ61ZX", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "QhGTmWFRF5iq95PDGLj9iGg9otL5MsLqkZxTqCeHdZM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "LiFiDJwJjW98MB8wxcnXpafKYsuz1hwpUkuszkERiX6" + }, + "client_ip": "185.26.11.149", + "user_payer": "4uht5h5AMPF7tBm7ycciEZmBi7QeqphszvG3E8Nzffjn", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "R5PEEuQrWLUh7WdzSjRPZAMUvtyN96kWNYpXnuAMqDW": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ZoD1XLMhxdMveAJL4x9oab4FhRKP5NThTnSCH19Tdjp" + }, + "client_ip": "64.130.47.138", + "user_payer": "5qCyU5eN5Mh2uU8pXQRfN8fAMbLTMwJNkzCSgTmtojtA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "RKVrTXSttpDejssWvsp2iVzF3iyRdkYckWeAeP6Uo2D": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.46.106", + "user_payer": "dztvSgQxKtvm6GARpAq19vVRy8CP9MNGWssBcvnWY9e", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "mgroup_sub_allowlist": [ + [ + 103, + 189, + 236, + 198, + 227, + 66, + 50, + 64, + 8, + 146, + 17, + 168, + 164, + 161, + 15, + 192, + 94, + 63, + 98, + 66, + 251, + 201, + 114, + 170, + 182, + 36, + 69, + 42, + 195, + 239, + 223, + 188 + ] + ], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "S48iUy174Uznm4e1dLWY8E67z5uvk73UPtrQTPfVikz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS" + }, + "client_ip": "67.213.119.55", + "user_payer": "BRMaxjR6GQwH9RRe3SELSvzUH9Nv48G67DPmPVjJysEG", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "SVKW5VAqctPGmzvBLpD6dpPEfv7PiH3PL5NUBD62w9t": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT" + }, + "client_ip": "67.213.122.59", + "user_payer": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "SdhdGnyAB1cLkC8sYtDwnmogteqte9brjB93zAwjYET": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 251, + "accesspass_type": "Prepaid", + "client_ip": "64.130.41.153", + "user_payer": "rd1Fao2DfA3KrXjVBNBsbsFiqmyCtBzZPbjbzEF7ZEz", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ShuEnHDC8rpwzxqHfw6oJShPq5P6gdAevKSUf6mmEU1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HM1KjNaXa4w8K4gCXbieoMh5gUTNeUhg9fvdXMKeBW3L" + }, + "client_ip": "70.40.185.183", + "user_payer": "HMZxyTe5guZ14GtMwmxvm9YeeGeHmwX86yvNuwvKyrbb", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "T7NAHLmoKbPTyYsRPM3ijQYobB5qBFyvXWndaUUVAwQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "5DbaUbZsi6aGGmMC6dGS64ZEf9gbHp5sVKYRBhpmDRbn" + }, + "client_ip": "185.101.32.154", + "user_payer": "FLWc77X8dKh5RdJe5xMFxry8kvSVUbo9G4MQ8hCAg5ve", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "TUVJo4SDpCGJDZyq1QsgZBJnejNpKrofm527BoV17aQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "kREnNfJrPEHbrjSQDxmxZdGmN6hi7ewXZ3UZTURshrk" + }, + "client_ip": "66.165.251.122", + "user_payer": "HcY7m8P4zXqHTurUB7pKbFyjGCdoYwKDmgXHwVAm9cSM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "TZ42Qdb6NhKDe2kR4Rb8Sxg7TzjVLXCeCKe1B2KSMLw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw" + }, + "client_ip": "103.88.234.129", + "user_payer": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Tfe2HbMXjeqEugX4NbSxCBWLP53veFbnrxy3bnEjfgY": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "185.191.117.14", + "user_payer": "3qZeoX7f7koqrhdLKpFzdcQe5B4Fatvw8WnLqu7zgQRU", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "UkMNBFUTXMSWk975ssd2gfcceZ3NUxPhZPTBYzd1KgQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH" + }, + "client_ip": "69.67.148.115", + "user_payer": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "UxtHX4A8tH3fGEQiWSF5PzZh1tQFKon9aJJQ9oau3cV": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "64.130.57.46", + "user_payer": "AHqZ5hZMJUvQguZtdNhvEK3dH2DXRVj852XZEvXZz8Rw", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "VbaWre9UwZ57ysSyXqnrWXJ14sLth52yJ4XCQpCp2X1": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "23SUe5fzmLws1M58AnGnvnUBRUKJmzCpnFQwv4M4b9Er" + }, + "client_ip": "70.40.185.124", + "user_payer": "ATEJvfGzid1QkZHbsWF93TCCNM3BAHUcyReH5RrxcGrF", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "VkiGEgJ9z4igSWJTh53v1mwxX9CzfcVyBefzGdWxhq6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb" + }, + "client_ip": "67.213.115.199", + "user_payer": "4vswZt3g3PvJEVfVXKTPpn8fYFt4nyRbi4bijgpJxofQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "W1CJ9drQ1c1VToT5A5FRb9PjRwgyXViHdYvuzPkGXcp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "9dH6wfdJVgnDcbCUjT8rkmejAzTnGQaFarmLfvBYXANK" + }, + "client_ip": "95.179.218.209", + "user_payer": "GTAh4uFkY5rYxDuZ54yQuBXoYdEgALHuSg3dFSKpeQuc", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Wp468CaNoFfhwnT9N3dnYHq8SViHHLbMYYkZhVC1Pzw": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "4k6wgP5WPBKQpsFGtzuXNrjcTE2fKWLj17nDvFeG5zSF" + }, + "client_ip": "70.40.185.53", + "user_payer": "3ujS7Yf1oCuFvvDwdfTttPncpgM5iejGGkdJx1BSR9qQ", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Yv1RMLGWbQHb6TPBULWgPoPXAjzN6B6GKFH9xSpDfVy": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2uQdYW6WrBN1ouF3VikHfkKhqdn6gsq54bYdxvoiUV62" + }, + "client_ip": "84.32.32.86", + "user_payer": "BLvUbmRVZGLzRTVE1DZL4LFdmCGytuizxStwtyhE3Pii", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Z5bwwjqtY1f7SyQ2ocF6fU6AYbd6aiJEuAic2rnmU4R": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "45.146.160.2", + "user_payer": "2pkxNkwXKq6KW8XmB7Dt7xEiURgCNDDGhb1ay2xWkqoX", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "Z6qZcEVZwy9PZbGYyjBCghyxfrJVud1e4LXwCk5T5Fz": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "ArMBx6veRq33ffEP9sxHafiPRgrtzww4XvbwZbSMfXiM" + }, + "client_ip": "83.143.84.90", + "user_payer": "6k4oeLB9fcAuNFnBERKqZXPC2vfnMpaeNnqxU3D3zEKo", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "a1JrGVWzUZih19SwDQhKXmXbjH858MzqkYthZ8cApyD": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "207.148.74.12", + "user_payer": "BNyEsi7Lac8FbeTPgqxiQaXGcvunDgmTHp9WotyTYSxs", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "aao1H7bxzVUcqyW7MoiUwoAuP3eMwj1VeR7eWNARNwf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "SyndicAgdEphcy5xhAKZAomTYhcF8xhC7za2UD9xeug" + }, + "client_ip": "198.244.253.130", + "user_payer": "SyndicAgdEphcy5xhAKZAomTYhcF8xhC7za2UD9xeug", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "aivPFcbFXiL6W5JuwnuaVeb8b3vUjqfWneD9wM3cccQ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y" + }, + "client_ip": "5.199.165.43", + "user_payer": "J2ibtVSFZd11ccVf6CYS7w1MeNiCjQjosDAofhZbaZ6T", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "bsn63hLVtonyjAFq6j54PuAwjec1C3QpVX53FDbLan9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF" + }, + "client_ip": "206.223.224.55", + "user_payer": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "bzLwvXT2djy3LZRmsd8MZKB8uBKhCUSNTW6xVnUBndK": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "A23LfQn6khffj2hGhGfXr6P52W2pxrVcCaHVQLYQgiX2" + }, + "client_ip": "103.167.235.180", + "user_payer": "BgjpXdNJYN4KSp5X32HowKEj1A2eeBcqNSfwyojxj1KJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "cJshcAKp3u3xtT2e7h38pZpPi7xFWLH2kk4cy647yZJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "FGj2F187dqKfCQLfa4NvRPhiTeXwm8LZDCq4q4z5g6ai" + }, + "client_ip": "84.32.186.148", + "user_payer": "AqVgt6Zmodyg1dzx126TvHLaie73yXX5gp5ZLuRd2V6E", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "cPNa2GqvNYBnJdQzqCwD8BEuUWJNqJCBMbsCaCG3nqk": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2P9ZYA4vBoBBr56hrEFTmrd5ctuz3r7wtvRYmbgk6jRL" + }, + "client_ip": "149.28.225.106", + "user_payer": "D5zXsAfuLKYMs7aQGYKqMeQqLW97xD5xgVXrrsVPU6Zy", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "d7uJxPp6TbnQ6BiPCNiyochcZ3qkRugp9jhyKFBAneh": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "zeroT6PTAEjipvZuACTh1mbGCqTHgA6i1ped9DcuidX" + }, + "client_ip": "192.69.194.82", + "user_payer": "ZeRoXF8PpC1t7qfmqdthLdeS6gudnTqyHirSnE5ZzgR", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "dnXoRsafyDfwfUrrDf8DGCc2mLDHqvVDadSC5J8CNX9": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e" + }, + "client_ip": "185.26.10.181", + "user_payer": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "eCUbry1sqM2nS5bfXUYyQH63bYvQPZJUmsaQEKFHuh6": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 250, + "accesspass_type": { + "SolanaValidator": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4" + }, + "client_ip": "185.26.10.241", + "user_payer": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "eYSrAZegwhCT9ZUv3adG1RzmDWQfrcxwg5uq8RQVfjc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "2mMGsb5uy1Q4Dvezr8HK2E8SJoChcb2X7b61tJPaVHHd" + }, + "client_ip": "185.189.47.156", + "user_payer": "DrtYc35tpe3ZKiVfLtR8gio8YZSb8aQotZbKoKLthTM", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "eoYKYSwSy4hvsUz68if1xDt4pQHai82ZiRaFMY878yx": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj" + }, + "client_ip": "185.26.11.195", + "user_payer": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "fN8kPdwGagJrdZL1yC4ndNi3ytJDMfh6N9f7iQYtMGM": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw" + }, + "client_ip": "37.9.63.60", + "user_payer": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "fm5nu1FjcvS3z724cZ5QJpKTNue3jHT8rCRFaJr4x9w": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "7Nn8qBJey7vXtVFMNBbbuN8UkujU8Y6nWzbHVGuf49yV" + }, + "client_ip": "64.176.51.216", + "user_payer": "5gGfsbAa5J5KkCyQjc8gJjymCddkReCgP6V8B6dmo18Z", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "gNVyomsekjsSYgVXcnUEdA2PpYDk8iZfqh5nsW444sr": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "spcti6GQVvinbtHU9UAkbXhjTcBJaba1NVx4tmK4M5F" + }, + "client_ip": "185.52.237.102", + "user_payer": "3fLQMhb7Pa3sUWmFLtmRrzkz9HhCH8mJYQE9BcMV9E2R", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "hYHFZgeirwcssyEc1HcY52gvxScoi4bVwkzDVuCznqn": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "jUNk9Panm9A8VSeJ1n2S3fVPgcCZiGwYME4d3xgRAFH" + }, + "client_ip": "86.105.224.126", + "user_payer": "6uayBceaFssKHAhLiA3EBhFzqinGKQ5T66RGSopGM5FN", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "infr3fqeVguxfuKZH25fasSLwieUZQB9EsuJFZ1edKN": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "CZanBzZHFzrGY5qKzaX3CNhJ5smHEMTWFFnoeUi4J6dr" + }, + "client_ip": "139.84.147.220", + "user_payer": "Fkhd6WwaLAYGMTpGs1kX7ECQmuQ7Uj3ScurCDtzLBYRA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "jPBguNEK54P5qdYZpuLov6YYQJgWAJFaYjwm1QeP3NS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "8AkVj5aAtJ27tYXeq89cnSf68V43NarFHMx2iSDjZv7c" + }, + "client_ip": "88.216.197.114", + "user_payer": "9NR8T2KaNPKSMaG1hQc7vqrgmkr7VBjqudDDUkTM5bQM", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "k74HaFGRgNHekZacSgcpCYKBK8m1Jm6Faks95E3RJwJ": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4" + }, + "client_ip": "46.166.162.210", + "user_payer": "DYdXpUx9uKZijodWUhKu2ti374Sc579iAHSvyJZQztBn", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "kV3AG3Z22jDScf1sxR9uHNjAAevmaZfL5TNk5CLgeGd": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu" + }, + "client_ip": "72.46.84.111", + "user_payer": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "khEUVRPwnfrpDaeZBsWPabfT8Drt3Ka3U5RHHaMNYjp": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe" + }, + "client_ip": "72.46.84.111", + "user_payer": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "m3jGKo5kxtooWYnooXCMKNDKuWWdyP3sHHXSiHnzV5U": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "KAW1LjxH73tRBd1XsaqsRsgeERFkg4WpdXUSqR4QjkW" + }, + "client_ip": "95.179.144.252", + "user_payer": "GBzbTunYrMzcpeyJ6nwCUCupAbvEvE4xJPx9SXjAN1vC", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "mM4xqoKVwHnXSxma8oGuuz8oZZeAdgm2aWSvpB38dst": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.63.218", + "user_payer": "FPKdPELbNxgV7y2iQtZR5MptF34SrCNxwNrEMXkAzYSD", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "mXNbpqxA9AKev94sxhkj2wxeucKmFuKqUJXfvXty5s4": { + "account_type": "AccessPass", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "95.40.47.218", + "user_payer": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "mZqtwA7YLGDxR7v38be35RspxZ8eTetmXdh5MeEfoE8": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "82vucuWCTTQEz6nYe3VetnL3pJYBrfDF2gDAjec9sPUy" + }, + "client_ip": "64.130.41.141", + "user_payer": "BL9s6hWz6QUyhNzouA1kWDETsmbksN8WhxmzFgG9YgXq", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "n6baMbsdgbVeauFcu8Kwkwtb3HUKszKFQGFsqxo3F6G": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "84.32.186.111", + "user_payer": "Cm9bKMpDT1xzWLsnjdJ85BuwVifyEEJay2FBx8Y1Z4gE", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "nHZfSwf36nafotvoyLqqdJpZFyjRn4DeCCmCDdGwUDs": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "BuoZ7q6faiJNTN24r7Kcj8dp96axs5XPEKXmWGsh2pDE" + }, + "client_ip": "208.91.110.215", + "user_payer": "BuoZ7q6faiJNTN24r7Kcj8dp96axs5XPEKXmWGsh2pDE", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "nvcdkKe3JKAicYkgy2SQ5FfJrmvh9BGvH1o3tro9HdP": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "HW4zorvt6xDwhU36RqjcWNwU8YMj9tiqnAafBKW4cqV" + }, + "client_ip": "89.42.231.164", + "user_payer": "7NCw54YgSSfNh6FMvDrnnXZQkCs8VQbSAy3MnfFhA7EW", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "oZELfCBHxzFZZJ9og9c4EdFD5vqR8gnRH5gViNr9tiF": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "2oHUYyW2PU9VJh4XBs5TbGgzdernunvGqyKth3kxW4ns" + }, + "client_ip": "64.130.43.229", + "user_payer": "EdN9iNEm2bVyLaZ2fp83BAMGSbJ8RBaXKchXsLmmPtGL", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "owPusHd5LvUND8tbYBsW4WWRMK2puQin8Y7x2hBNqT8": { + "account_type": "AccessPass", + "owner": "DZfLKFDgLShjY34WqXdVVzHUvVtrYXb7UtdrALnGa8jw", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "64.130.40.217", + "user_payer": "Hca2MvF3AjbhUuuZnxqs1i1HyPVcHfN3L56cDcKnT8cM", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "pFLpuQFBFWWudcu2a229TKgJf9TZaoB862rKWiNa6i5": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "8YTYPvPeiMh38rsvJTy7jtMtsNtAnvTCqdcScrDiGdVv" + }, + "client_ip": "86.54.152.250", + "user_payer": "8uymczRPuSMNB2perH3aHq2aAdb9wLjK8hDRkAiuiTyw", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "pnuwCy3jwY7fHhwUUDi9gREWYV5GMQGQ6pCkKHFjgRe": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "JupmVLmA8RoyTUbTMMuTtoPWHEiNQobxgTeGTrPNkzT" + }, + "client_ip": "67.213.121.209", + "user_payer": "JupmVLmA8RoyTUbTMMuTtoPWHEiNQobxgTeGTrPNkzT", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "sZBj7tzvSN17mkHePJEjAhKdSYyKm48tTVFWjV9QT8U": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "3B2mGaZoFwzAnWCoZ4EAKdps4FbYbDKQ48jo8u1XWynU" + }, + "client_ip": "77.81.119.170", + "user_payer": "4TgEHPq1GPiUJdAfyjC4KnxhAQE7v71iGRK5APfgLjjP", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "tdmjiLkwJxWWtPVyzBWrgyDVSEicEzezRYFdgAK5Z6z": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "sCANXAaS1a7yB8jz3USvGNLfd8DSc9r7TNzNSKKPkfY" + }, + "client_ip": "64.176.11.113", + "user_payer": "H4nmqwZyELNGqb3F7t2rzpEYydzntxoNb7FS6Pkgnoz4", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "uHTuae7g3uSFhfXQZrBiS1rEZ3RTiFsebb1oqhuxfXf": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 252, + "accesspass_type": { + "SolanaValidator": "5ivRNcK1yThcK3koZR1oikAfuNm6rj1LceMskayoVSzc" + }, + "client_ip": "64.130.40.247", + "user_payer": "5ivRNcK1yThcK3koZR1oikAfuNm6rj1LceMskayoVSzc", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "uZjL94azfRnvo5AsyeyCA6uggLgtm3QL4FsDVbG3cKG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw" + }, + "client_ip": "185.26.11.195", + "user_payer": "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Disconnected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "ufNfzdbZP4aLizbFpYJ6QRGWmsjaZ1nZZK8VKeLKP6x": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "meshRrDTME9cL2FSQ9E56EncfkZ7vL8apwcCFsw3o6Y" + }, + "client_ip": "149.28.144.120", + "user_payer": "ooc9bBwcrSKVMWNCojjmvikh8NkSPSgRebm3DWMZeyP", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "vgGBdbhnDz7jaW7Eekk3zbZ6G8jpabq7breas4EVEog": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "hykfH9jUQqe2yqv3VqVAK5AmMYqrmMWmdwDcbfsm6My" + }, + "client_ip": "2.57.215.101", + "user_payer": "9nxWixzZih86YrKapEiG3AZigQBpoUX9Avn5pS1GWMqX", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "vt6Znyo6JUJhcdQckF1FnrSzh4o5LacjBD84ceUguFc": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "6h6GjwcFJDqGojsjReSa7NgwxtYe5hNmKWk1x35GxbVg" + }, + "client_ip": "74.63.225.105", + "user_payer": "32hwvo6DJxFx6qH33SY1RiniRodSkKwdKH8XamAbNCGL", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "vu1Jb1LsTEU8HYwS2jZqvMiayQRUjpE7q337EV9a1Fq": { + "account_type": "AccessPass", + "owner": "44NdeuZfjhHg61grggBUBpCvPSs96ogXFDo1eRNSKj42", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "64.130.51.167", + "user_payer": "3PH8WEHnjAoVRKKnDVGcG2bCqYpNw7o8n5zCmNXARj15", + "last_access_epoch": 0, + "connection_count": 0, + "status": "Expired", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [ + [ + 39, + 81, + 111, + 228, + 146, + 136, + 188, + 77, + 119, + 45, + 20, + 194, + 177, + 123, + 240, + 136, + 141, + 51, + 174, + 75, + 90, + 6, + 84, + 149, + 201, + 83, + 47, + 33, + 133, + 119, + 149, + 186 + ] + ], + "flags": 0, + "tenant_allowlist": [] + }, + "xfwgJbSBKNLY3zQPQHac9x7UFmeJEJ9L2z9EhM2UgsS": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV" + }, + "client_ip": "189.1.171.179", + "user_payer": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "xrRMDKFv1Wwd5jtHg4NuPXTRpGaC1WFYfaECBJNqNWB": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 254, + "accesspass_type": { + "SolanaValidator": "SQDS9iwyWvT2mQbSZzuNKGoxuBug5jRHouF6SuMRBkA" + }, + "client_ip": "216.18.211.210", + "user_payer": "ADFvFuC7ii7ReQhN4MYLei47aeB7AA5Tg39jY88F86MY", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "xxW6Sxdm1GrkiNXnjKaBgNG53G7MxRJKzhZgJe5iuUG": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 255, + "accesspass_type": { + "SolanaValidator": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP" + }, + "client_ip": "72.46.87.59", + "user_payer": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + }, + "yABAW3MvLTTW4GLBrwoyJ7zTUxeZv6qPci5riy6Ep54": { + "account_type": "AccessPass", + "owner": "HbS2XwoYAdVrQVDevnVfURCyvpRsT8YnnQXVaD57gomQ", + "bump_seed": 253, + "accesspass_type": { + "SolanaValidator": "Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24" + }, + "client_ip": "64.130.42.114", + "user_payer": "9BWFAyyHfKUTw5yjg1sfUaVTqaBrev6VjtCxBqFUPFdY", + "last_access_epoch": 18446744073709551615, + "connection_count": 2, + "status": "Connected", + "mgroup_pub_allowlist": [ + [ + 29, + 227, + 13, + 133, + 77, + 227, + 106, + 99, + 242, + 243, + 145, + 92, + 251, + 97, + 51, + 215, + 103, + 5, + 63, + 117, + 47, + 184, + 177, + 63, + 168, + 3, + 79, + 197, + 17, + 143, + 156, + 66 + ] + ], + "mgroup_sub_allowlist": [], + "flags": 0, + "tenant_allowlist": [] + } + } + }, + "dz_telemetry": { + "device_latency_samples": [ + { + "pubkey": "F6V1xk5VQtEctPhk8ofzv7bwPSykuQ6EhMqPdzaAwU51", + "epoch": 129, + "origin_device_pk": "A1WWZhApXFAzCgCVjnZLwBHCaWBC41UUh7Cw3o96Vfx9", + "target_device_pk": "QYt2wx7Xvfn7DfVTVJjPATGUQc56L9vkdgL5dGkRE1n", + "link_pk": "4aE9d9UF25o6ZNvkuEEaHu14qw4fh6yBXN6Reom9Vd7Y", + "origin_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "target_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429169118, + "samples": [ + 163, + 132, + 150, + 122, + 136, + 136, + 149, + 167, + 158, + 147, + 145, + 170, + 108, + 163, + 131, + 120, + 154, + 172, + 140, + 156, + 141, + 192, + 153, + 159, + 154, + 141, + 145, + 137, + 160, + 165, + 149, + 145 + ], + "sample_count": 32 + }, + { + "pubkey": "62T2wj6w41Y5j4QoQ6Umr1fSt1j7hKdFkooMRA26JCq3", + "epoch": 129, + "origin_device_pk": "CqGi7i432BVjZo3vwQhnEDoCBsmiWMebbo6JE7wSSp3c", + "target_device_pk": "BjL4wxo9VVaFT1McpZzok7XRYzcgGxXLrHJpPQ47RYVd", + "link_pk": "J18xDPrz4ormhrXXBLb1kG6eDtMe9wHSSLozmtzEUHyQ", + "origin_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "target_device_location_pk": "CR9Fqex8eAULhXrXWRUNDKaQW7Wy52B3zGdkZsKfoocR", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429196621, + "samples": [ + 19676, + 19701, + 20019, + 19686, + 19793, + 19691, + 19796, + 19720, + 20175, + 19719, + 19721, + 19695, + 19754, + 19711, + 20046, + 19699, + 19737, + 19729, + 19744, + 19749, + 20329, + 20173, + 19735, + 19723, + 19724, + 19862, + 19687, + 19721, + 19701, + 19729, + 19687, + 20163 + ], + "sample_count": 32 + }, + { + "pubkey": "Ht9c1L8RCk8nyjYFj237CXBAuFUWT8fi4cPqJqdSS4BF", + "epoch": 129, + "origin_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "target_device_pk": "HGRoBFv4vbU7mN5oJUTU9Z1h36fnUTUx2QyMrxyuimFY", + "link_pk": "GpsVKCeQW1CLeLfy9VCSKQUpQv2UAcM5jXaojuQyeiDt", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428596662, + "samples": [ + 7933, + 7875, + 7887, + 7867, + 7883, + 7875, + 7869, + 7897, + 7908, + 7903, + 7888, + 7910, + 7897, + 7884, + 7887, + 7910, + 7914, + 7894, + 7873, + 7911, + 7893, + 7866, + 7914, + 7871, + 7922, + 7908, + 7921, + 7887, + 7866, + 7859, + 7930, + 7903 + ], + "sample_count": 32 + }, + { + "pubkey": "2KpKs37QCpNyXGui3bSioiwGCx9MxfNtHzNvi6nFTVSn", + "epoch": 129, + "origin_device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "target_device_pk": "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT", + "link_pk": "EXZnmY379HerfKQiUSHKReexZwCzueZg7g9iBTnDxStS", + "origin_device_location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "target_device_location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428404746, + "samples": [ + 182, + 162, + 120, + 114, + 122, + 127, + 172, + 141, + 108, + 121, + 171, + 149, + 155, + 124, + 126, + 107, + 184, + 150, + 126, + 152, + 113, + 119, + 125, + 119, + 159, + 143, + 150, + 133, + 166, + 152, + 143, + 142 + ], + "sample_count": 32 + }, + { + "pubkey": "CdvjytkBvMBndVvRuTjJYLHAdNAsdPZ59Piaz6wNVqPo", + "epoch": 129, + "origin_device_pk": "UUi9EmbmizNvUkYUZBtyUjwFtp5adkjRgkcoUyhnvmu", + "target_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "link_pk": "8pJYRGyrA6G47jtur142ZWghMdunxHicR3oDdofTgxzx", + "origin_device_location_pk": "ELZqQoJv9MMtrt4iq6wjMHpyRmBi8ENzgEa97U9ixPLE", + "target_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429554710, + "samples": [ + 14026, + 14051, + 14033, + 14035, + 14022, + 14053, + 14030, + 14127, + 14045, + 14052, + 14018, + 14015, + 14020, + 14047, + 14044, + 14018, + 14044, + 14025, + 14054, + 14026, + 14027, + 14039, + 14041, + 14029, + 14026, + 14037, + 14031, + 14057, + 14021, + 14011, + 14041, + 14032 + ], + "sample_count": 32 + }, + { + "pubkey": "4teCe1p4YfiDuj18Y23An9bRyNe3RoXVJbmBxQYdLTwb", + "epoch": 129, + "origin_device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "target_device_pk": "pem7vfRADmANUPvMqz5gwkz6UbJkHJQvsA4aKSF9Ave", + "link_pk": "GfiWgCnSSEsmui4M2f3EsVusUuCdEoC1TZf4TzQJcfFo", + "origin_device_location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "target_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429748458, + "samples": [ + 131837, + 131851, + 131845, + 131840, + 131845, + 131874, + 131833, + 131848, + 131848, + 131840, + 131837, + 131859, + 131837, + 131877, + 131896, + 131866, + 131847, + 131873, + 131841, + 131844, + 131839, + 131832, + 131843, + 131863, + 131841, + 131836, + 131865, + 131876, + 131839, + 131857, + 131876, + 131876 + ], + "sample_count": 32 + }, + { + "pubkey": "Ebp1LihwggQ8h41P2U7ydAJV9kV6bsFDQsFwevuSVGRu", + "epoch": 129, + "origin_device_pk": "6WjPZwrMrZgwuEJMdyMAewvwSVig6HF5EVjCuF9LeJMm", + "target_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "link_pk": "3HV6rX6KAPXuKWTmxiWmE7WTc9oXVfEVyNja4qYDATz6", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425852773, + "samples": [ + 164, + 167, + 117, + 132, + 156, + 177, + 125, + 160, + 168, + 160, + 164, + 163, + 153, + 148, + 156, + 151, + 120, + 170, + 136, + 140, + 159, + 117, + 118, + 166, + 139, + 148, + 167, + 165, + 157, + 164, + 152, + 163 + ], + "sample_count": 32 + }, + { + "pubkey": "9DVt2vpcDNtesGpYCyRp5ANtzp9jPwoqA9Ke5xc54XnN", + "epoch": 129, + "origin_device_pk": "CTTCwG765QP8ycYrX1h8hZZo7K1pvDJXPaiC9Ue1u8qV", + "target_device_pk": "5VhacudbiTcMP4uB4a712bYXLhSJqzAjLEau2qJynJf2", + "link_pk": "44RsnMsyJfLqCfDkiAuWVxTF5dLPLDq2buhbbQscv34h", + "origin_device_location_pk": "9gQn94Rs72oe9QRZM5i7KgACG6dXjirttbcZV75JxqH8", + "target_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426486633, + "samples": [ + 5759, + 5764, + 5739, + 5743, + 5709, + 5776, + 5741, + 5726, + 5763, + 5737, + 5753, + 5719, + 5703, + 5795, + 5754, + 5751, + 5778, + 5757, + 5746, + 5775, + 5705, + 5751, + 5791, + 5696, + 5760, + 5702, + 5735, + 5747, + 5734, + 5727, + 5783, + 5734 + ], + "sample_count": 32 + }, + { + "pubkey": "5kUkfSWquAwzmH6FiZ8VPwzkRRVxhNhgrCm3ovDVo1dj", + "epoch": 129, + "origin_device_pk": "WTngs9GF7PDyWuVPkRg3KRj8E8sJCJ2zLc75DAn9DHT", + "target_device_pk": "DLhiDiskfhpbqPgLVEY8MLwaB8uxmsQ55tNrX9vpqDwe", + "link_pk": "7xxfuQwZXKsbqyrZ2Rr3ZjBHP5ga2U9JxkzLdnUxBuhk", + "origin_device_location_pk": "2QmK4Cxj2RZopHeX85QZ4wkJtVyYjf7n2ub5hAKH7eC8", + "target_device_location_pk": "22fDArnRLgyEiebZMKzbzmCG17zxJ6HPJdzWbzzBFaMW", + "origin_device_agent_pk": "HQ8pqcfexhftBNjYhzDZJuGnCz869fCxcZbni6jqmbo", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427805215, + "samples": [ + 27503, + 27543, + 27538, + 27983, + 27552, + 27599, + 27891, + 27534, + 27570, + 27536, + 27681, + 27504, + 27593, + 28037, + 27511, + 27509, + 27522, + 27543, + 27806, + 27500, + 27574, + 27539, + 27604, + 27569, + 27514, + 27513, + 27842, + 27600, + 27535, + 27562, + 27518, + 27529 + ], + "sample_count": 32 + }, + { + "pubkey": "DgWE9JCMraCrqbB8iYhEwjWfCBGX8fUDVLonmAqMtzjA", + "epoch": 129, + "origin_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "target_device_pk": "DW4kmVTZrb2tAggT915P3W5vgfC28BmYVTKYnAQPx32s", + "link_pk": "9yga9CRw7m5gw88xVWnsegBWMSZ6nDtMieCX6ZAocp7C", + "origin_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429552538, + "samples": [ + 206, + 202, + 225, + 174, + 248, + 222, + 203, + 226, + 284, + 197, + 172, + 225, + 195, + 203, + 265, + 221, + 230, + 175, + 181, + 180, + 213, + 201, + 204, + 191, + 202, + 188, + 218, + 201, + 186, + 196, + 203, + 227 + ], + "sample_count": 32 + }, + { + "pubkey": "GxV2SySTzK8UsKNCswmCCPvS963jcGP5yY4NRzRDeao5", + "epoch": 129, + "origin_device_pk": "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj", + "target_device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "link_pk": "ABXMG7UZcbytdAt5tqMHUC8NBxuKByrLTRN91WXnZbk9", + "origin_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "target_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430526250, + "samples": [ + 432, + 446, + 459, + 426, + 441, + 428, + 483, + 430, + 449, + 416, + 462, + 420, + 403, + 424, + 443, + 471, + 442, + 462, + 455, + 426, + 411, + 432, + 443, + 426, + 463, + 459, + 437, + 450, + 432, + 454, + 463, + 412 + ], + "sample_count": 32 + }, + { + "pubkey": "AhMndVvepqZeGYRB5bQ5ZWzJZQJ323EwaQu3LGteX76S", + "epoch": 129, + "origin_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "target_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "link_pk": "D14dhq5XVDyMua1eN47rh5ybiNAkz6qJTaKr3maKnSck", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424653369, + "samples": [ + 389, + 425, + 436, + 424, + 439, + 438, + 388, + 410, + 400, + 442, + 421, + 389, + 445, + 414, + 433, + 411, + 417, + 387, + 435, + 433, + 436, + 446, + 405, + 397, + 422, + 431, + 424, + 483, + 431, + 390, + 426, + 398 + ], + "sample_count": 32 + }, + { + "pubkey": "FJbBXrmzaQJfNSsjBPwkEm93QANkbLD5Veouyben3jzV", + "epoch": 129, + "origin_device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "target_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "link_pk": "2EHeaxVbsb2FvheFGsWn7VBaQYcZdnXg7hhoMdiqtW4A", + "origin_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "target_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429513946, + "samples": [ + 81586, + 81581, + 81630, + 81578, + 81604, + 81587, + 81587, + 81601, + 81577, + 81612, + 81572, + 81565, + 81566, + 81643, + 81566, + 81582, + 81622, + 81588, + 81575, + 81600, + 81560, + 81590, + 81591, + 81744, + 81584, + 81585, + 81551, + 81539, + 81562, + 81579, + 81586, + 81593 + ], + "sample_count": 32 + }, + { + "pubkey": "FVDvcuXgyryVkmHGBss9iKgpEp3uc7225D4rSAmucSrK", + "epoch": 129, + "origin_device_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "target_device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "link_pk": "HQNCezuCWzZcMmhFHmPywJPMGZU1WkPwfBL5YMMyW6AM", + "origin_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "target_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427205078, + "samples": [ + 5219, + 5225, + 5228, + 5235, + 5209, + 5220, + 5222, + 5213, + 5215, + 5257, + 5242, + 5220, + 5242, + 5215, + 5214, + 5218, + 5233, + 5247, + 5240, + 5228, + 5248, + 5227, + 5237, + 5231, + 5221, + 5255, + 5233, + 5235, + 5219, + 5226, + 5214, + 5228 + ], + "sample_count": 32 + }, + { + "pubkey": "FkFKxHK54mUwEKm49upQ1BPU5ZDChwLhYKK48cpERLFB", + "epoch": 129, + "origin_device_pk": "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT", + "target_device_pk": "9PsbdMKcfmiHHruNTV2neyMtqfkKcNscJEJNmMBnFM68", + "link_pk": "BGmYpKgFjjVqdTXcRhFUe6hvb2gSmQVdaXoUA3WM4Jpi", + "origin_device_location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "target_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429224773, + "samples": [ + 39315, + 39324, + 39333, + 39335, + 39337, + 39321, + 39338, + 39339, + 39339, + 39330, + 39327, + 39340, + 39325, + 39325, + 39327, + 39362, + 39332, + 39406, + 39362, + 39329, + 39375, + 39331, + 39337, + 39330, + 39322, + 39317, + 39336, + 39347, + 39326, + 39336, + 39319, + 39340 + ], + "sample_count": 32 + }, + { + "pubkey": "75azD84Fvpu87u3JpCPXEh2wWwrVFu62b5MqCHiz1syy", + "epoch": 129, + "origin_device_pk": "3CTmBQeNF6LQZzaLbYj6jbhCztcsLuzzJeByfrhXTaXU", + "target_device_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "link_pk": "jLpSzAwgdhe5yMi4vCdemqNPJZaNhsMwXD3k2QL78hz", + "origin_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "target_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428489175, + "samples": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "sample_count": 32 + }, + { + "pubkey": "56m78E2TcS4YS3cQ2gFJCHmSGELikKop4eaDx11gEfMW", + "epoch": 129, + "origin_device_pk": "DW4kmVTZrb2tAggT915P3W5vgfC28BmYVTKYnAQPx32s", + "target_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "link_pk": "9yga9CRw7m5gw88xVWnsegBWMSZ6nDtMieCX6ZAocp7C", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "origin_device_agent_pk": "H6TzLFei8eXpH9g65HNvoBGn81e7BRQvSS2i8uxLxxgJ", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427401814, + "samples": [ + 172, + 173, + 181, + 263, + 218, + 173, + 169, + 200, + 175, + 175, + 204, + 186, + 189, + 218, + 203, + 193, + 205, + 196, + 175, + 183, + 207, + 210, + 162, + 158, + 185, + 202, + 170, + 180, + 181, + 177, + 212, + 213 + ], + "sample_count": 32 + }, + { + "pubkey": "55yPDGfiFgfeySXCRbWZaSiphbUwDJYtZrEcjLw7cLdD", + "epoch": 129, + "origin_device_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "target_device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "link_pk": "7rgqwAbY2iKoHA5xWeUmPZoY63YC6XvocbdHA5FjkzEn", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "Ga9FVdnt99y3idLkthMw2LEJ2QA3WtUBKdM5MUQKnZwq", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433853326, + "samples": [ + 113, + 136, + 149, + 126, + 120, + 144, + 183, + 154, + 141, + 178, + 149, + 183, + 150, + 174, + 167, + 167, + 150, + 139, + 159, + 176, + 205, + 207, + 187, + 158, + 180, + 155, + 164, + 139, + 133, + 171, + 168, + 146 + ], + "sample_count": 32 + }, + { + "pubkey": "7ozRjV8Ly2RRto1KZes9bRD2XdkQG5qC2AeGSDBb6zp7", + "epoch": 129, + "origin_device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "target_device_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "link_pk": "8wQCpckuDYHHQNM2cbLN2KgNjLT9EwbCAuegZuZy8AMr", + "origin_device_location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426454547, + "samples": [ + 82408, + 82453, + 82418, + 82431, + 82437, + 82426, + 82444, + 82428, + 82405, + 82508, + 82406, + 82444, + 82401, + 82441, + 82422, + 82462, + 82436, + 82427, + 82486, + 82465, + 82426, + 82459, + 82442, + 82451, + 82463, + 82499, + 82448, + 82433, + 82399, + 82438, + 82406, + 82452 + ], + "sample_count": 32 + }, + { + "pubkey": "9i8zFtejzqftMTJy5u3UhKGcSv28NE2wKJbhBJFAgd5b", + "epoch": 129, + "origin_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "target_device_pk": "BLArXrBNd1vd5ELbF133ypTpAe1GbSi8nc6DMepBUrYa", + "link_pk": "AmVQfjXNQeQ299snwT3H2XfL5FoC39WPThGY3MkFxSnY", + "origin_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "target_device_location_pk": "9ySXHhn4zheYB9FJtpCCUQBbj6RqX5NJihkyNEeb1xoN", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429552530, + "samples": [ + 2806, + 2807, + 2804, + 2792, + 2851, + 2816, + 2801, + 2801, + 2779, + 2790, + 2813, + 2789, + 2790, + 2802, + 2797, + 2838, + 2799, + 2816, + 2795, + 2808, + 2809, + 2801, + 2796, + 2789, + 2785, + 2814, + 2804, + 2794, + 2794, + 2800, + 2806, + 2834 + ], + "sample_count": 32 + }, + { + "pubkey": "4j1psnV8XCEqEFziosQaQFyteJWacvobjBzX1azZycMu", + "epoch": 129, + "origin_device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "target_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "link_pk": "EY87P4cBAUW8VEJV82QaTmNY1ZB2t51Z9MPL7UUxywtp", + "origin_device_location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "target_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431836804, + "samples": [ + 148396, + 148473, + 148391, + 148404, + 148478, + 148409, + 148397, + 148412, + 148389, + 148425, + 148407, + 148400, + 148419, + 148435, + 148423, + 148447, + 148446, + 148387, + 148417, + 148417, + 148388, + 148407, + 148457, + 148621, + 148421, + 148402, + 148402, + 148390, + 148408, + 148408, + 148400, + 148427 + ], + "sample_count": 32 + }, + { + "pubkey": "CNmMKVGZy53k3YoVEM9hm7AWBD2w1dFNwGBxt4JHLZWJ", + "epoch": 129, + "origin_device_pk": "GARSc9a1pEQ3oKWLSP2BAYcBDwrTrNxsUVzxjCA6aoyc", + "target_device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "link_pk": "E6DjtpFgPftJvEx9Ca9A3arcJ29Ki2W2ttB1Vv3Q3mAC", + "origin_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430030304, + "samples": [ + 16151, + 16149, + 16162, + 16151, + 16149, + 16147, + 16155, + 16142, + 16132, + 16138, + 16184, + 16155, + 16165, + 16272, + 16133, + 16139, + 16158, + 16136, + 16133, + 16146, + 16288, + 16207, + 16191, + 16169, + 16145, + 16132, + 16173, + 16167, + 16150, + 16165, + 16149, + 16191 + ], + "sample_count": 32 + }, + { + "pubkey": "5fq1MxYAFLWqbbVTEjUd5uW6dVgoHA4x1saBk8dhAnLq", + "epoch": 129, + "origin_device_pk": "2AFsyp34CFTS5UZJpoqYXvyzFnRW49Q5s7xMEtFFEDVm", + "target_device_pk": "41xFZBtps2EdEJBJo7PxAKvFpVV9DugZEndkahKsoPxX", + "link_pk": "4qdWd9nuQpQJacqbJpx2FGU84ePQvGcYt9Caz2ABnNE7", + "origin_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "target_device_location_pk": "HAhDgmZSUzukS94JSaadMyFjritUWrtwdNPSzp9DFV7h", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427475682, + "samples": [ + 27981, + 27886, + 27837, + 27820, + 27811, + 27850, + 27866, + 27838, + 27816, + 27794, + 27846, + 27839, + 27847, + 27843, + 27843, + 27810, + 27891, + 27898, + 27818, + 27816, + 27823, + 27848, + 27835, + 27842, + 27859, + 27832, + 27849, + 27823, + 27813, + 27852, + 27847, + 27842 + ], + "sample_count": 32 + }, + { + "pubkey": "E7UfbAPdVkyT2Ajt3BwcPpJMYLegn3WB8SUBnxjbYF7M", + "epoch": 129, + "origin_device_pk": "41xFZBtps2EdEJBJo7PxAKvFpVV9DugZEndkahKsoPxX", + "target_device_pk": "BjL4wxo9VVaFT1McpZzok7XRYzcgGxXLrHJpPQ47RYVd", + "link_pk": "BfG691D2KxbcKrP3VFZWK8rNAetRaneg7FVCCQu8pZm3", + "origin_device_location_pk": "HAhDgmZSUzukS94JSaadMyFjritUWrtwdNPSzp9DFV7h", + "target_device_location_pk": "CR9Fqex8eAULhXrXWRUNDKaQW7Wy52B3zGdkZsKfoocR", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426406007, + "samples": [ + 13103, + 13076, + 13055, + 13111, + 13113, + 13092, + 13116, + 13085, + 13076, + 13098, + 13114, + 13113, + 13125, + 13090, + 13098, + 13406, + 13072, + 13102, + 13075, + 13100, + 13110, + 13077, + 13081, + 13119, + 13064, + 13112, + 13065, + 13110, + 13091, + 13073, + 13070, + 13123 + ], + "sample_count": 32 + }, + { + "pubkey": "GC1vAwE6veB8TcMJqovY3Dx197dbAe3sj4JmbNqRy9As", + "epoch": 129, + "origin_device_pk": "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj", + "target_device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "link_pk": "DqJ98NLFCUu9fj5jhk9HAV76UE8puArU6NNjQ9Rwp5fj", + "origin_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "target_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430526257, + "samples": [ + 127, + 114, + 155, + 120, + 126, + 166, + 116, + 145, + 143, + 148, + 126, + 164, + 128, + 147, + 132, + 114, + 118, + 156, + 132, + 121, + 144, + 96, + 164, + 116, + 145, + 135, + 174, + 117, + 148, + 151, + 163, + 194 + ], + "sample_count": 32 + }, + { + "pubkey": "HV221qWmYpevbrLeh4qbyi1JDsxBawCP6pNVBdRRMNtn", + "epoch": 129, + "origin_device_pk": "GphgLkA7JDVtkDQZCiDrwrDvaUs8r8XczEae1KkV6CGQ", + "target_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "link_pk": "8vkYpXaBW8RuknJqHHxhg1SsvKCLokHJ6WgTpSGgfgT8", + "origin_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "target_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432176846, + "samples": [ + 365, + 406, + 377, + 377, + 386, + 372, + 386, + 356, + 354, + 370, + 396, + 440, + 378, + 381, + 373, + 438, + 401, + 380, + 388, + 381, + 388, + 378, + 355, + 405, + 365, + 371, + 377, + 389, + 364, + 387, + 354, + 347 + ], + "sample_count": 32 + }, + { + "pubkey": "73x7cLk3FkDKvsp5nz2r3XDXuGv84DwSFFgv6EobkjuZ", + "epoch": 129, + "origin_device_pk": "9TZ7d3XrvSyGSAZD6nx7pkBkjHLq7ewqHKgyZZ34QMze", + "target_device_pk": "CgX1gLM5VPS9pzS2Dhmhm5sGhj84GKxmP2vZy35otYom", + "link_pk": "DndB9BUgRHupThKgd4nv47W2zuwjpKVf7pWhKpBnL1E9", + "origin_device_location_pk": "Evgy1NR5x5hcGPSVTZab4gxbWCcHaQVry4Mxd2eCRTJS", + "target_device_location_pk": "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429676924, + "samples": [ + 129, + 158, + 118, + 130, + 119, + 156, + 126, + 145, + 127, + 129, + 140, + 118, + 117, + 158, + 153, + 149, + 136, + 125, + 141, + 123, + 116, + 142, + 141, + 122, + 115, + 155, + 111, + 152, + 137, + 136, + 130, + 153 + ], + "sample_count": 32 + }, + { + "pubkey": "5cd3y5Lggt52bZruWERD1AL5sgLRCgn5jRYKCh5M7T5K", + "epoch": 129, + "origin_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "target_device_pk": "AWQUQCWAR3rbJfYD6MC7ESM3stFgQnehE6N5aXEtfEnc", + "link_pk": "8PTZtrzQ17sQBNNyRu1wxcbkjVLqnRTa3vkMRyBGxdXT", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465708, + "samples": [ + 17796, + 17762, + 17811, + 17769, + 17815, + 17756, + 17795, + 17776, + 17756, + 17942, + 17763, + 17791, + 17820, + 17793, + 17802, + 17770, + 17796, + 17832, + 17832, + 17768, + 17776, + 17767, + 17742, + 17781, + 17797, + 17840, + 17803, + 17852, + 17859, + 17809, + 17855, + 17780 + ], + "sample_count": 32 + }, + { + "pubkey": "4HfNKjLXomosScNQdJAhnQ6YSoTmbwiJzu3HBw7HUCuF", + "epoch": 129, + "origin_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "target_device_pk": "2AvqMdvf5tmsvS2DsJZD16c7vtCDS8Fx83mg1RueipvY", + "link_pk": "9MgrhvF7v6vevLAVcS5Zt4doPVyqPCCuoMEGwFiQJBBc", + "origin_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "target_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427830652, + "samples": [ + 283, + 282, + 281, + 249, + 256, + 267, + 261, + 311, + 254, + 307, + 289, + 298, + 308, + 259, + 272, + 261, + 327, + 310, + 300, + 253, + 304, + 325, + 306, + 292, + 315, + 289, + 260, + 262, + 292, + 258, + 265, + 277 + ], + "sample_count": 32 + }, + { + "pubkey": "8iUDREtaUrcThPqoQPpoHEfr3USxPAJoCCw9yneHLT4y", + "epoch": 129, + "origin_device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "target_device_pk": "pem7vfRADmANUPvMqz5gwkz6UbJkHJQvsA4aKSF9Ave", + "link_pk": "BghsvED9eCtpXC1smkfm8iEzfNGrro24c5eacE154goa", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426780006, + "samples": [ + 13274, + 13713, + 13288, + 13340, + 13317, + 13279, + 13315, + 13286, + 13283, + 13354, + 13337, + 13326, + 13607, + 13311, + 13355, + 13503, + 13379, + 13290, + 13325, + 13297, + 13292, + 13337, + 13301, + 13304, + 13323, + 13309, + 13336, + 13316, + 13325, + 13342, + 13316, + 13297 + ], + "sample_count": 32 + }, + { + "pubkey": "DqC4HCBAXc41BTy5xZtZT18ExzdpETbEXhjXvwkhuzm3", + "epoch": 129, + "origin_device_pk": "ASPPyWXei4wZJnxBkm2ejf75s6tUZREq4UBvNtHcyVSz", + "target_device_pk": "A1WWZhApXFAzCgCVjnZLwBHCaWBC41UUh7Cw3o96Vfx9", + "link_pk": "HRqgCF2UdyRoH2b7vVxyf2w2oBKFmxtMzkZRLpoUTDBq", + "origin_device_location_pk": "3xKLEjXi9vThfFnCNdgB2E2uFzeiF8FnaDtt4P6G2H2w", + "target_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426194506, + "samples": [ + 26384, + 26354, + 26343, + 26348, + 26410, + 26373, + 26351, + 26359, + 26393, + 26393, + 26352, + 26401, + 26388, + 26380, + 26395, + 26385, + 26374, + 26364, + 26353, + 26350, + 26355, + 26378, + 26423, + 26346, + 26374, + 26422, + 26339, + 26346, + 26356, + 26399, + 26353, + 26372 + ], + "sample_count": 32 + }, + { + "pubkey": "8fzsHMHXhVxPfMkznK8gfw74doZnxAXJoFuH9Ctgvqef", + "epoch": 129, + "origin_device_pk": "9PsbdMKcfmiHHruNTV2neyMtqfkKcNscJEJNmMBnFM68", + "target_device_pk": "AWQUQCWAR3rbJfYD6MC7ESM3stFgQnehE6N5aXEtfEnc", + "link_pk": "CcSTnWvgaHLtj3zFS98gQbsAcoV7hFbqMoAkAD95DZpj", + "origin_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "target_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429262372, + "samples": [ + 21894, + 21904, + 22057, + 21901, + 22718, + 21893, + 21890, + 21876, + 21881, + 21880, + 21869, + 21886, + 21892, + 21884, + 21907, + 21865, + 21904, + 21879, + 21924, + 21882, + 21867, + 21876, + 21905, + 21879, + 21880, + 21901, + 21857, + 21873, + 21863, + 22010, + 21908, + 21902 + ], + "sample_count": 32 + }, + { + "pubkey": "CBShSAJkMvYo5Dkd5w3M2XBB3k4JkynXw6bgFB9NwUD3", + "epoch": 129, + "origin_device_pk": "9gGVhChduB9DezW22cvJDDeYbWddpn1vpeKZ5RKxh8Ji", + "target_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "link_pk": "AFvhUch4E6cqKssTjKGUfW3hvoAcSAEcyzkoQXhxKoFS", + "origin_device_location_pk": "8sejbB8n2vNYtmHKNQQJWnm17zjBZcDuMfwdb144W1kk", + "target_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428687657, + "samples": [ + 34426, + 34387, + 34406, + 34409, + 34412, + 34390, + 34364, + 34358, + 34415, + 34366, + 34390, + 34374, + 34384, + 34427, + 34467, + 34405, + 34355, + 34427, + 34357, + 34406, + 34359, + 34373, + 34386, + 34382, + 34361, + 34361, + 34423, + 34405, + 34381, + 34411, + 34382, + 34352 + ], + "sample_count": 32 + }, + { + "pubkey": "Aj5GmKJy97WhWiRsQWRrR3Rn2DHbgpReuvmZg6ZpXnWN", + "epoch": 129, + "origin_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "target_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "link_pk": "A5WCW8Tc3TW5VZXhoCZELimuCnwXzW8VTnK1wiZB1q8Y", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431395180, + "samples": [ + 160, + 163, + 156, + 134, + 163, + 166, + 160, + 126, + 180, + 140, + 140, + 168, + 141, + 152, + 136, + 137, + 158, + 154, + 154, + 155, + 174, + 162, + 160, + 136, + 141, + 138, + 172, + 157, + 167, + 146, + 133, + 153 + ], + "sample_count": 32 + }, + { + "pubkey": "3KedJHc5taXKuNLvwAwfUJsB6GMa2D2qurrdoUAWZk2E", + "epoch": 129, + "origin_device_pk": "2AFsyp34CFTS5UZJpoqYXvyzFnRW49Q5s7xMEtFFEDVm", + "target_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_pk": "2DPrStYZzCKo3QSiHLFSHr1Ktk7rCYyLqe2jN5z5PU7v", + "origin_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427475668, + "samples": [ + 329, + 348, + 335, + 284, + 285, + 317, + 346, + 307, + 313, + 299, + 307, + 316, + 322, + 324, + 298, + 362, + 292, + 329, + 299, + 284, + 339, + 330, + 316, + 320, + 321, + 337, + 286, + 322, + 288, + 309, + 332, + 355 + ], + "sample_count": 32 + }, + { + "pubkey": "21utKTte1WtNS3WqqGxpXTqqYbjSgBg3hMTnVGDjGdVi", + "epoch": 129, + "origin_device_pk": "AWQUQCWAR3rbJfYD6MC7ESM3stFgQnehE6N5aXEtfEnc", + "target_device_pk": "9PsbdMKcfmiHHruNTV2neyMtqfkKcNscJEJNmMBnFM68", + "link_pk": "CcSTnWvgaHLtj3zFS98gQbsAcoV7hFbqMoAkAD95DZpj", + "origin_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "target_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429230515, + "samples": [ + 21920, + 21961, + 21889, + 21886, + 21896, + 21885, + 21925, + 21925, + 21881, + 21897, + 21898, + 21903, + 21902, + 21877, + 21968, + 21881, + 21910, + 21921, + 21877, + 21873, + 21903, + 21887, + 21870, + 21898, + 21871, + 21880, + 21895, + 21872, + 21863, + 21882, + 21886, + 21892 + ], + "sample_count": 32 + }, + { + "pubkey": "itBiYjA48nYtaGcVSw1arpzoXeiaB1yRGYATJFfkdAC", + "epoch": 129, + "origin_device_pk": "CgX1gLM5VPS9pzS2Dhmhm5sGhj84GKxmP2vZy35otYom", + "target_device_pk": "9TZ7d3XrvSyGSAZD6nx7pkBkjHLq7ewqHKgyZZ34QMze", + "link_pk": "DndB9BUgRHupThKgd4nv47W2zuwjpKVf7pWhKpBnL1E9", + "origin_device_location_pk": "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4", + "target_device_location_pk": "Evgy1NR5x5hcGPSVTZab4gxbWCcHaQVry4Mxd2eCRTJS", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427157503, + "samples": [ + 159, + 173, + 155, + 148, + 182, + 157, + 146, + 166, + 151, + 180, + 148, + 178, + 176, + 154, + 134, + 143, + 133, + 147, + 150, + 162, + 171, + 173, + 170, + 148, + 170, + 173, + 152, + 153, + 116, + 142, + 177, + 161 + ], + "sample_count": 32 + }, + { + "pubkey": "9RV2Zni4ZeeaHXZt5zSAPhb3GspwHPNMScYjQfcY4jwE", + "epoch": 129, + "origin_device_pk": "A1WWZhApXFAzCgCVjnZLwBHCaWBC41UUh7Cw3o96Vfx9", + "target_device_pk": "Cgn84CWvpGbh5L6an4YgS6Q6wTZaZPW7nqNLdptQPxgV", + "link_pk": "EcWSrui72LCx4DgMqnQoRwJdwpjqLv7b1s8BeupwHWFj", + "origin_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "target_device_location_pk": "E8hhYdAvrYTPk8xxpRsmh1BayVLMwptM2ismsrQJpSmV", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429169141, + "samples": [ + 133, + 105, + 121, + 108, + 120, + 138, + 115, + 143, + 109, + 112, + 130, + 165, + 168, + 133, + 146, + 138, + 152, + 128, + 115, + 132, + 251, + 115, + 115, + 122, + 142, + 127, + 110, + 124, + 124, + 129, + 107, + 147 + ], + "sample_count": 32 + }, + { + "pubkey": "GDdBpjizmFKLapsSZt8npMYy2VwaLry352aU1A4fnRL3", + "epoch": 129, + "origin_device_pk": "2AvqMdvf5tmsvS2DsJZD16c7vtCDS8Fx83mg1RueipvY", + "target_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "link_pk": "36DajDue7EeALsXMnPD7VgHjU4CBxBdWoQcsMJuxtDNa", + "origin_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "target_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429533780, + "samples": [ + 18743, + 18748, + 18742, + 18731, + 18731, + 18777, + 18754, + 18735, + 18743, + 18724, + 18745, + 18761, + 18740, + 18752, + 18768, + 18717, + 18727, + 18766, + 18735, + 18789, + 18730, + 18729, + 18738, + 18736, + 18738, + 18741, + 18750, + 18756, + 18732, + 18726, + 18759, + 18733 + ], + "sample_count": 32 + }, + { + "pubkey": "43yfcvbgeaDwSDbqPS98MGVNx2CTdxyiXmvTdPuSd9Eq", + "epoch": 129, + "origin_device_pk": "48p9HYhMNMu8rwjBgPgKUJjr8LSMJx1DCAbBMnVewAVr", + "target_device_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "link_pk": "DtPLPTh9LkLzk5ezHeaszkFQNzQKWypPza4QzCr68ReQ", + "origin_device_location_pk": "BhapEuF9xoTgLWNP9iWwziSFYzXwbtSbXNsxJyySMrmf", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425632201, + "samples": [ + 24673, + 24705, + 24694, + 24701, + 24791, + 24817, + 24687, + 24706, + 24684, + 24691, + 24760, + 24744, + 24652, + 24708, + 24767, + 24711, + 24701, + 24819, + 24681, + 24680, + 24683, + 24715, + 24906, + 24699, + 24693, + 24720, + 24724, + 24676, + 24681, + 24712, + 24700, + 24688 + ], + "sample_count": 32 + }, + { + "pubkey": "7EhWigmwD924DZczjT4gNz8SeACKJp4oKsp87yfybo57", + "epoch": 129, + "origin_device_pk": "B1JjhMNjy3HhkXvyYzq6DBNfLfLkvizftzaUrXDf7XEY", + "target_device_pk": "HGRoBFv4vbU7mN5oJUTU9Z1h36fnUTUx2QyMrxyuimFY", + "link_pk": "7PXaBzL9yANF7vfLg3r1T9UTSvNV6Ftc5gEj57sVEd6X", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465575, + "samples": [ + 19002, + 19013, + 18984, + 19006, + 18973, + 18954, + 19007, + 18982, + 18945, + 18971, + 18965, + 18962, + 18989, + 18983, + 18990, + 18980, + 18982, + 18965, + 19005, + 18988, + 18955, + 18955, + 18967, + 18987, + 18967, + 19004, + 19043, + 19037, + 18963, + 18965, + 19000, + 18997 + ], + "sample_count": 32 + }, + { + "pubkey": "HRSS9RoK5Deww5Z34boZB5bc5o7ykSXXfSjBHi9dymcF", + "epoch": 129, + "origin_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "target_device_pk": "2XrHv68pxYtsheKX1K2cCsCsMmfb2VDbJMNraLax98Ff", + "link_pk": "FUFiSpDotoKxNRrt8TzfiWomrMn8iaLiVJ2rBXH3p35k", + "origin_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "target_device_location_pk": "6d1k85c2xARsJFdBC9tgRRFH1iWRZnZaJvs9AiRowYo1", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429552525, + "samples": [ + 6101, + 6226, + 6080, + 6084, + 6070, + 6110, + 6100, + 6138, + 6092, + 6085, + 6096, + 6082, + 6085, + 6099, + 6087, + 6124, + 6091, + 6137, + 6107, + 6089, + 6187, + 6202, + 6098, + 6102, + 6093, + 6104, + 6149, + 6102, + 6080, + 6088, + 6100, + 6108 + ], + "sample_count": 32 + }, + { + "pubkey": "9kQJ6o9Ru4G6QEVLMzVuWaqxNYzuYqSBnxfekJuTAq8U", + "epoch": 129, + "origin_device_pk": "BjL4wxo9VVaFT1McpZzok7XRYzcgGxXLrHJpPQ47RYVd", + "target_device_pk": "41xFZBtps2EdEJBJo7PxAKvFpVV9DugZEndkahKsoPxX", + "link_pk": "BfG691D2KxbcKrP3VFZWK8rNAetRaneg7FVCCQu8pZm3", + "origin_device_location_pk": "CR9Fqex8eAULhXrXWRUNDKaQW7Wy52B3zGdkZsKfoocR", + "target_device_location_pk": "HAhDgmZSUzukS94JSaadMyFjritUWrtwdNPSzp9DFV7h", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432833502, + "samples": [ + 13124, + 13093, + 13076, + 13091, + 13072, + 13072, + 13111, + 13095, + 13092, + 13141, + 13085, + 13069, + 13066, + 13062, + 13094, + 13099, + 13097, + 13112, + 13087, + 13101, + 13091, + 13081, + 13069, + 13100, + 13090, + 13113, + 13053, + 13090, + 13052, + 13112, + 13107, + 13094 + ], + "sample_count": 32 + }, + { + "pubkey": "2YhAWsm5djRdPHNZ6nXTrfePownZpH5Dtt43oFNfmyQh", + "epoch": 129, + "origin_device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "target_device_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "link_pk": "BfrMFL2xVwGECppmQBrmCD2VkMfABr8ZtrafNVnohzET", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428125748, + "samples": [ + 139, + 155, + 121, + 132, + 173, + 153, + 122, + 151, + 140, + 158, + 160, + 144, + 177, + 119, + 142, + 147, + 151, + 174, + 154, + 176, + 150, + 159, + 132, + 134, + 157, + 117, + 142, + 166, + 130, + 187, + 148, + 143 + ], + "sample_count": 32 + }, + { + "pubkey": "DHoSij42uLkWRPNoNbv5wxKsFhR9i1SbFFU5UZF1sZMy", + "epoch": 129, + "origin_device_pk": "CgX1gLM5VPS9pzS2Dhmhm5sGhj84GKxmP2vZy35otYom", + "target_device_pk": "AE5tZ5VZdkvQNTg44AY57QiLu9mvoToShtAEqEK68hPX", + "link_pk": "ZCf4eHeSMA1WoKsvLNEVMoYnWcEE4GrgvP4woivFUnm", + "origin_device_location_pk": "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427157512, + "samples": [ + 25380, + 25387, + 25367, + 25367, + 25371, + 25353, + 25381, + 25388, + 25371, + 25409, + 25379, + 25400, + 25391, + 25417, + 25364, + 25397, + 25365, + 25443, + 25364, + 25500, + 25355, + 25363, + 25501, + 25406, + 25397, + 25367, + 25460, + 25370, + 25496, + 25359, + 25355, + 25371 + ], + "sample_count": 32 + }, + { + "pubkey": "84ZTz6qyJFvCn6mLTMftG5sp2PG3v6uoLQY6XRDep5Qs", + "epoch": 129, + "origin_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "target_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_pk": "8XjBUfLfujKtrafLXk3SDMgsGL7hh4c3KPn32HVMFojX", + "origin_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432759529, + "samples": [ + 363, + 371, + 358, + 399, + 374, + 334, + 371, + 368, + 391, + 418, + 392, + 407, + 382, + 369, + 357, + 385, + 366, + 362, + 355, + 346, + 427, + 343, + 340, + 345, + 355, + 373, + 372, + 399, + 413, + 347, + 349, + 401 + ], + "sample_count": 32 + }, + { + "pubkey": "E7tKrtrtepjKw4aSkQonpvqZT7pkPdgxu49Ub2x6XHNh", + "epoch": 129, + "origin_device_pk": "GBow73shpP8aTLiWm8QuJtqoE59GbZ3rppVgJLVpyvd6", + "target_device_pk": "9TZ7d3XrvSyGSAZD6nx7pkBkjHLq7ewqHKgyZZ34QMze", + "link_pk": "2BVb9VWvNX6oy5NwSuJjTedhK9cZEdfjWDd3XcL3785Y", + "origin_device_location_pk": "DJD3UmMd15dZqq1LTs1hqiyB4eH4PLBmptzAxAPY9phU", + "target_device_location_pk": "Evgy1NR5x5hcGPSVTZab4gxbWCcHaQVry4Mxd2eCRTJS", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433213693, + "samples": [ + 21546, + 21597, + 21588, + 21576, + 21730, + 21810, + 21610, + 21623, + 21867, + 21581, + 21655, + 21725, + 21602, + 21791, + 21577, + 21815, + 21581, + 21560, + 21915, + 21572, + 21612, + 21789, + 21755, + 21683, + 21760, + 21576, + 21548, + 21559, + 21579, + 21531, + 21790, + 21539 + ], + "sample_count": 32 + }, + { + "pubkey": "D3LW4Mvc27H2BhkPEz3jDy8DWKaAnNhUrKw9CLB2iCB", + "epoch": 129, + "origin_device_pk": "Ddc96QyGecBsDGQ5Mtvato2UdrTQeAuuEUQBwhWpujRk", + "target_device_pk": "9PsbdMKcfmiHHruNTV2neyMtqfkKcNscJEJNmMBnFM68", + "link_pk": "HT4cNCCCU64M4R4kzhP6RodGVrHdh4SqrMu3XXyHW8e6", + "origin_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "target_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428420407, + "samples": [ + 106, + 127, + 116, + 117, + 136, + 155, + 135, + 136, + 110, + 267, + 119, + 108, + 135, + 105, + 139, + 670, + 108, + 183, + 115, + 106, + 157, + 201, + 118, + 120, + 126, + 144, + 179, + 139, + 166, + 133, + 119, + 117 + ], + "sample_count": 32 + }, + { + "pubkey": "3AWMYaMQcmVZecnTdC6FREAt5GrHvRNQbBuyXLC1qzT2", + "epoch": 129, + "origin_device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "target_device_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "link_pk": "7rgqwAbY2iKoHA5xWeUmPZoY63YC6XvocbdHA5FjkzEn", + "origin_device_location_pk": "Ga9FVdnt99y3idLkthMw2LEJ2QA3WtUBKdM5MUQKnZwq", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432563135, + "samples": [ + 128, + 132, + 169, + 167, + 183, + 154, + 110, + 212, + 176, + 187, + 146, + 132, + 172, + 128, + 173, + 195, + 182, + 122, + 185, + 153, + 140, + 180, + 180, + 145, + 155, + 188, + 183, + 165, + 138, + 135, + 158, + 155 + ], + "sample_count": 32 + }, + { + "pubkey": "AyBX6YLsWdHLa9sbxv9pr8ZoTiNsTncYWnuEXr3zsZU6", + "epoch": 129, + "origin_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "target_device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "link_pk": "vJrmECGJ7GeBmrEN22TRJxdrd7mpD5Vefm4BUjFgYfQ", + "origin_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "target_device_location_pk": "Ga9FVdnt99y3idLkthMw2LEJ2QA3WtUBKdM5MUQKnZwq", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143423979131, + "samples": [ + 69336, + 69357, + 69303, + 69326, + 69312, + 69273, + 69294, + 69328, + 69288, + 69304, + 69294, + 69313, + 69293, + 69298, + 69283, + 69316, + 69297, + 69347, + 69323, + 69289, + 69310, + 69300, + 69262, + 69304, + 69259, + 69294, + 69284, + 69326, + 69284, + 69286, + 69304, + 69313 + ], + "sample_count": 32 + }, + { + "pubkey": "2jyb9oiG3osmLu4ivovUfNCgLgNWUvBehgDzZCKPJMm3", + "epoch": 129, + "origin_device_pk": "CTTCwG765QP8ycYrX1h8hZZo7K1pvDJXPaiC9Ue1u8qV", + "target_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "link_pk": "GmtxGqz73XYdDmerspvSmgik6vZP6jY1Fkz6M7xAas9a", + "origin_device_location_pk": "9gQn94Rs72oe9QRZM5i7KgACG6dXjirttbcZV75JxqH8", + "target_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426486642, + "samples": [ + 11278, + 11301, + 11287, + 11289, + 11273, + 11265, + 11264, + 11305, + 11305, + 11265, + 11276, + 11338, + 11280, + 11265, + 11276, + 11281, + 11266, + 11310, + 11300, + 11272, + 11316, + 11292, + 11265, + 11262, + 11295, + 11301, + 11312, + 11271, + 11297, + 11312, + 11297, + 11302 + ], + "sample_count": 32 + }, + { + "pubkey": "E8WcC73fxM9Z9JURHoM499iMhLGE7oBhiXrw7yUKrcyp", + "epoch": 129, + "origin_device_pk": "7YKkAaXLD5XyjUc3JR9MECSKRN9q7kMnzKT3c4jFkZEh", + "target_device_pk": "ASPPyWXei4wZJnxBkm2ejf75s6tUZREq4UBvNtHcyVSz", + "link_pk": "J8SFGwr87W4u1HRUkGxnXQybR2UuDTR2s2up9o336N4L", + "origin_device_location_pk": "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q", + "target_device_location_pk": "3xKLEjXi9vThfFnCNdgB2E2uFzeiF8FnaDtt4P6G2H2w", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424175036, + "samples": [ + 1139, + 1135, + 1158, + 1143, + 1131, + 1121, + 1152, + 1156, + 1126, + 1102, + 1176, + 1182, + 1173, + 1113, + 1114, + 1122, + 1139, + 1146, + 1149, + 1164, + 1128, + 1163, + 1134, + 1190, + 1132, + 1166, + 1125, + 1135, + 1116, + 1166, + 1148, + 1130 + ], + "sample_count": 32 + }, + { + "pubkey": "2fN2yAKowe8dyKA12uFtVbjtk1c8MSg53tcYXG93ztdM", + "epoch": 129, + "origin_device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "target_device_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "link_pk": "4jWgCo3rVDa61eaG7kBnRt5fbmnS6sug848XFsgBQC4N", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428125740, + "samples": [ + 162, + 153, + 132, + 120, + 146, + 153, + 146, + 169, + 190, + 166, + 120, + 151, + 146, + 158, + 186, + 159, + 138, + 177, + 190, + 182, + 127, + 130, + 157, + 150, + 168, + 144, + 139, + 157, + 150, + 178, + 156, + 135 + ], + "sample_count": 32 + }, + { + "pubkey": "GU1gW56T3GG8KBB67CZ3n2hS2zAfnatM9UDmmt7hrGLW", + "epoch": 129, + "origin_device_pk": "Ddc96QyGecBsDGQ5Mtvato2UdrTQeAuuEUQBwhWpujRk", + "target_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_pk": "9L36cYa4kxsVoNngeDMLuFxWVg8pUxykLmiBX1UfHzti", + "origin_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428420422, + "samples": [ + 38719, + 38716, + 38706, + 38687, + 38705, + 38719, + 38685, + 38758, + 38707, + 38746, + 38688, + 38692, + 38710, + 38685, + 38719, + 38713, + 38792, + 38722, + 38697, + 38719, + 38796, + 38702, + 38719, + 38702, + 38752, + 38758, + 38797, + 38706, + 38748, + 38708, + 38692, + 38796 + ], + "sample_count": 32 + }, + { + "pubkey": "4Sz8zuBYQ6qXqXF4nfhJhxKbEqUdxv1wbz94HHxGaHYe", + "epoch": 129, + "origin_device_pk": "BTw4t8cVo5hGAJsJpLWE35nxDexcuAbmQNZHV1rJMNqQ", + "target_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "link_pk": "81Z2wjrirbfZbAiPUrP2djshYzZxfLB9MKbnA1RMo4cV", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424403373, + "samples": [ + 128, + 138, + 128, + 137, + 146, + 128, + 115, + 148, + 150, + 167, + 166, + 104, + 129, + 141, + 145, + 160, + 114, + 119, + 130, + 126, + 137, + 129, + 156, + 159, + 159, + 145, + 168, + 137, + 175, + 145, + 125, + 161 + ], + "sample_count": 32 + }, + { + "pubkey": "6vDPfik1ht1EQcewboEb3jtj3kZNZ66RGFEbLVF4j5Vv", + "epoch": 129, + "origin_device_pk": "5VhacudbiTcMP4uB4a712bYXLhSJqzAjLEau2qJynJf2", + "target_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "link_pk": "EksKPymnmzYbqWLqL2T1wEHiLgtUHM6GZeEgN9eRWJd2", + "origin_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "target_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431021451, + "samples": [ + 5870, + 5829, + 5846, + 5843, + 5819, + 5845, + 5824, + 5841, + 5895, + 5846, + 5852, + 5869, + 5830, + 5812, + 5830, + 5909, + 5860, + 5803, + 5842, + 5862, + 5841, + 5861, + 5935, + 5837, + 5839, + 5833, + 5884, + 5862, + 5847, + 5923, + 5889, + 5823 + ], + "sample_count": 32 + }, + { + "pubkey": "HXFBiJ9JGPAd6CMLCjdSJdKP9mXgkYuDiFdToW4VBPAQ", + "epoch": 129, + "origin_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "target_device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "link_pk": "HjqQuQw87zU4bRxfM6zkaei9f5jTjC5LfwCWvjcPJu54", + "origin_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "target_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432461542, + "samples": [ + 113, + 139, + 179, + 145, + 125, + 155, + 151, + 149, + 145, + 169, + 131, + 143, + 132, + 164, + 152, + 147, + 129, + 146, + 132, + 166, + 166, + 154, + 140, + 159, + 168, + 151, + 160, + 122, + 156, + 131, + 141, + 180 + ], + "sample_count": 32 + }, + { + "pubkey": "49MwKNcGJLcWm2mVPLssFVYYbbWv9iZKhg8fPY5fXuXE", + "epoch": 129, + "origin_device_pk": "DLajvcrHuZpbrJKY31Bgdd7oymCADDUPN1N77Rvd2QxN", + "target_device_pk": "WTngs9GF7PDyWuVPkRg3KRj8E8sJCJ2zLc75DAn9DHT", + "link_pk": "4cNZLDnNf6T5P7KbnTdKKDNMgAsfNAccXrh1Re4re4LJ", + "origin_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "target_device_location_pk": "2QmK4Cxj2RZopHeX85QZ4wkJtVyYjf7n2ub5hAKH7eC8", + "origin_device_agent_pk": "HQ8pqcfexhftBNjYhzDZJuGnCz869fCxcZbni6jqmbo", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426491066, + "samples": [ + 25464, + 25448, + 25466, + 25473, + 25526, + 25467, + 25455, + 25535, + 25433, + 25460, + 25469, + 25542, + 25424, + 25458, + 25472, + 25504, + 25471, + 25500, + 25469, + 25553, + 25470, + 25476, + 25450, + 25470, + 25464, + 25443, + 25445, + 25496, + 25451, + 25458, + 25459, + 25421 + ], + "sample_count": 32 + }, + { + "pubkey": "4LeJLWouvVTb1SvhrNmVuGLBktPVkJ9Aky76R6KormaF", + "epoch": 129, + "origin_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "target_device_pk": "5YYidoUwgjN3r5wFT5F1Zd4YAddzuz5fwFkuNekRbo48", + "link_pk": "2AgowxodjPEDFgkxWZzkCy4YfTVT1WJiDv2ig1nfJUkk", + "origin_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "target_device_location_pk": "Fx4bTA1DW8nEkS998eRuhQoKKmqevdALcNs8ibCj2RaH", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427830661, + "samples": [ + 97742, + 97737, + 97782, + 97753, + 97784, + 97791, + 97757, + 97751, + 97764, + 97778, + 97768, + 97778, + 97780, + 97742, + 97733, + 97742, + 97793, + 97769, + 97782, + 97780, + 97788, + 97770, + 97734, + 97773, + 97769, + 97799, + 97777, + 97786, + 97782, + 97773, + 97751, + 97788 + ], + "sample_count": 32 + }, + { + "pubkey": "2qP4v5qMYeC64cDTsADaVa4PGTucpkwbJAfvZqH6pPZU", + "epoch": 129, + "origin_device_pk": "2AvqMdvf5tmsvS2DsJZD16c7vtCDS8Fx83mg1RueipvY", + "target_device_pk": "BLArXrBNd1vd5ELbF133ypTpAe1GbSi8nc6DMepBUrYa", + "link_pk": "MoiGqAWncXdSyJhX2xAiEdSCYhm35tP39oya9KCiBDF", + "origin_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "target_device_location_pk": "9ySXHhn4zheYB9FJtpCCUQBbj6RqX5NJihkyNEeb1xoN", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429533769, + "samples": [ + 10827, + 10832, + 10799, + 10819, + 10807, + 10859, + 10891, + 10805, + 10868, + 10789, + 10824, + 10847, + 10821, + 10820, + 10811, + 10869, + 10834, + 10791, + 10789, + 10798, + 10846, + 10796, + 10789, + 10801, + 10805, + 10805, + 10798, + 10783, + 10862, + 10798, + 10853, + 10834 + ], + "sample_count": 32 + }, + { + "pubkey": "xyp75ytaPKAUicLBTxiMtqA5KdVvLbEVXP6WFttiNrJ", + "epoch": 129, + "origin_device_pk": "QYt2wx7Xvfn7DfVTVJjPATGUQc56L9vkdgL5dGkRE1n", + "target_device_pk": "Cgn84CWvpGbh5L6an4YgS6Q6wTZaZPW7nqNLdptQPxgV", + "link_pk": "3HVDzUf5c1qr2CEMkLgigZhPjBA4KFVSkjExtaHRfM9f", + "origin_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "target_device_location_pk": "E8hhYdAvrYTPk8xxpRsmh1BayVLMwptM2ismsrQJpSmV", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429256886, + "samples": [ + 111, + 125, + 130, + 97, + 113, + 119, + 114, + 118, + 117, + 127, + 108, + 126, + 122, + 166, + 118, + 104, + 136, + 138, + 126, + 112, + 124, + 125, + 128, + 108, + 144, + 118, + 138, + 108, + 136, + 97, + 151, + 159 + ], + "sample_count": 32 + }, + { + "pubkey": "Aw7SNFzfU3SxU1NnsLNfkBvx5xJNK6zxKw771Xn1AwiK", + "epoch": 129, + "origin_device_pk": "BTw4t8cVo5hGAJsJpLWE35nxDexcuAbmQNZHV1rJMNqQ", + "target_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_pk": "65eVRJGifcJUpjbbzazdZ17HMTmH8Jqkg3BiFWo5WwHK", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424403364, + "samples": [ + 11396, + 11419, + 11416, + 11422, + 11409, + 11428, + 11413, + 11430, + 11445, + 11450, + 11451, + 11460, + 11547, + 11411, + 11417, + 11434, + 11438, + 11444, + 11453, + 11407, + 11440, + 11414, + 11434, + 11483, + 11411, + 11442, + 11432, + 11437, + 11440, + 11407, + 11417, + 11424 + ], + "sample_count": 32 + }, + { + "pubkey": "D2ZmKh3q13oNxeN7nCyCQiF7kenXEtWiN2GrfFMkGyRd", + "epoch": 129, + "origin_device_pk": "2TBUsniuER8r6JB7ZNBzhmzAUAncsEdre35o5CJjnSGV", + "target_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "link_pk": "297mYzpWzPDsJn7vmjjWmtNbYUDjfKaNEDoQBbJ9mn9x", + "origin_device_location_pk": "3BZkwwMNGZG2iSeZr1nxYX4Vxcodcft2zwNVT99BbqNC", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430262971, + "samples": [ + 17842, + 17870, + 17847, + 17913, + 17934, + 17819, + 17883, + 17854, + 18033, + 17836, + 17849, + 17843, + 17919, + 17819, + 17825, + 17827, + 17883, + 17923, + 17898, + 17878, + 17834, + 17828, + 22164, + 17885, + 17885, + 17841, + 17844, + 18034, + 17826, + 18112, + 17883, + 18083 + ], + "sample_count": 32 + }, + { + "pubkey": "FyEdAtb1BGAwe9V5kL8Vmq8oyp5Qy3w6A1yymCZpq6bf", + "epoch": 129, + "origin_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "target_device_pk": "2AFsyp34CFTS5UZJpoqYXvyzFnRW49Q5s7xMEtFFEDVm", + "link_pk": "81khRsBPHa2XfdEZE1QxHuHeJgyE7yrhaCAfM2Dp1cdF", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431395236, + "samples": [ + 148, + 157, + 177, + 143, + 127, + 150, + 136, + 137, + 228, + 141, + 114, + 147, + 155, + 175, + 126, + 135, + 141, + 157, + 131, + 138, + 130, + 168, + 156, + 135, + 156, + 147, + 206, + 122, + 148, + 140, + 167, + 156 + ], + "sample_count": 32 + }, + { + "pubkey": "4aynxaEM1Md9jnWFQGb2DX3mSr6jdCPamSetJARoZRPE", + "epoch": 129, + "origin_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "target_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "link_pk": "4SoZf7tRjQaFZyP5nfHikjgBRMCSfukJa2fNzcMoEQZB", + "origin_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "target_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425745474, + "samples": [ + 521, + 516, + 484, + 518, + 517, + 596, + 482, + 498, + 473, + 485, + 525, + 522, + 508, + 523, + 521, + 483, + 474, + 528, + 536, + 511, + 507, + 503, + 526, + 508, + 500, + 526, + 469, + 470, + 513, + 542, + 546, + 506 + ], + "sample_count": 32 + }, + { + "pubkey": "7tdphVtr7fXJ5Hwqs1xMJeBummYMWQL9eu9WxZCPHAoW", + "epoch": 129, + "origin_device_pk": "DW4kmVTZrb2tAggT915P3W5vgfC28BmYVTKYnAQPx32s", + "target_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "link_pk": "G4ST8z1Y34EHPDGCZhVKTgrmcL33wK2j6JeewDFuUVow", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "H6TzLFei8eXpH9g65HNvoBGn81e7BRQvSS2i8uxLxxgJ", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427401801, + "samples": [ + 302, + 303, + 349, + 341, + 361, + 344, + 339, + 370, + 339, + 341, + 354, + 318, + 369, + 301, + 323, + 325, + 347, + 309, + 359, + 340, + 367, + 357, + 307, + 368, + 361, + 346, + 330, + 335, + 344, + 347, + 323, + 299 + ], + "sample_count": 32 + }, + { + "pubkey": "Hs1jzTr225izyY6KaDbrUjbRnCnrdDuUZGHy6rq5G3dQ", + "epoch": 129, + "origin_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "target_device_pk": "UUi9EmbmizNvUkYUZBtyUjwFtp5adkjRgkcoUyhnvmu", + "link_pk": "8pJYRGyrA6G47jtur142ZWghMdunxHicR3oDdofTgxzx", + "origin_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "target_device_location_pk": "ELZqQoJv9MMtrt4iq6wjMHpyRmBi8ENzgEa97U9ixPLE", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429552517, + "samples": [ + 14052, + 14056, + 14047, + 14207, + 14075, + 14063, + 14051, + 14065, + 14056, + 14038, + 14038, + 14032, + 14041, + 14056, + 14060, + 14068, + 14061, + 14043, + 14054, + 14068, + 14055, + 14045, + 14059, + 14061, + 14043, + 14031, + 14047, + 14030, + 14039, + 14062, + 14028, + 14054 + ], + "sample_count": 32 + }, + { + "pubkey": "C5WM5jhWcE5dyReWkQztNgr7r1kqBTxkzmnvU7QuFFLo", + "epoch": 129, + "origin_device_pk": "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT", + "target_device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "link_pk": "EXZnmY379HerfKQiUSHKReexZwCzueZg7g9iBTnDxStS", + "origin_device_location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "target_device_location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429224764, + "samples": [ + 119, + 119, + 152, + 135, + 124, + 116, + 116, + 133, + 137, + 135, + 131, + 177, + 111, + 111, + 110, + 111, + 206, + 106, + 153, + 128, + 162, + 147, + 105, + 115, + 180, + 120, + 108, + 111, + 149, + 143, + 122, + 118 + ], + "sample_count": 32 + }, + { + "pubkey": "7GPj26dc8TtCuHt2xGJBvnVgopAHAZvHndCmpbWqdfG5", + "epoch": 129, + "origin_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "target_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_pk": "EewiYE6NxAjaYq7uVGtame4fsFtCvLJ87zLpsWeayRSW", + "origin_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429552505, + "samples": [ + 190, + 179, + 184, + 169, + 190, + 194, + 181, + 199, + 191, + 194, + 190, + 177, + 179, + 210, + 180, + 165, + 174, + 190, + 178, + 168, + 171, + 167, + 194, + 159, + 183, + 168, + 211, + 233, + 168, + 178, + 188, + 179 + ], + "sample_count": 32 + }, + { + "pubkey": "BBZz8fGGy4Joqr8veffKaCCoKcvVBn4bssUsUYUS4fbo", + "epoch": 129, + "origin_device_pk": "2AvqMdvf5tmsvS2DsJZD16c7vtCDS8Fx83mg1RueipvY", + "target_device_pk": "4sXvs2kxGhfbChZS48xGosZkV8fJwxYc1gwHnSR3fS6F", + "link_pk": "27vvYzffpz85AbvbXfs5BgfR1Xp4zJxZE2Fegexk2VXg", + "origin_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "target_device_location_pk": "BNoP4em7REgS7igJ9cAnYpDW5w9SdRHWB9Bf6oNf3PJ5", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429533757, + "samples": [ + 14261, + 14273, + 14257, + 14298, + 14272, + 14281, + 14287, + 14276, + 14263, + 14269, + 14258, + 14290, + 14271, + 14243, + 14239, + 14278, + 14275, + 14259, + 14288, + 14252, + 14309, + 14264, + 14266, + 14281, + 14236, + 14274, + 14254, + 14247, + 14257, + 14238, + 14259, + 14254 + ], + "sample_count": 32 + }, + { + "pubkey": "DEPHL4xqdnaPWkTXrjcZjhVcQum87BeEXdEoEA8ZGxMY", + "epoch": 129, + "origin_device_pk": "41xFZBtps2EdEJBJo7PxAKvFpVV9DugZEndkahKsoPxX", + "target_device_pk": "2AFsyp34CFTS5UZJpoqYXvyzFnRW49Q5s7xMEtFFEDVm", + "link_pk": "4qdWd9nuQpQJacqbJpx2FGU84ePQvGcYt9Caz2ABnNE7", + "origin_device_location_pk": "HAhDgmZSUzukS94JSaadMyFjritUWrtwdNPSzp9DFV7h", + "target_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426405993, + "samples": [ + 27834, + 28166, + 27842, + 28248, + 27831, + 28219, + 27828, + 27833, + 27797, + 27802, + 28118, + 27810, + 27877, + 27800, + 27841, + 27808, + 27821, + 27845, + 27820, + 28475, + 28202, + 27808, + 27836, + 27828, + 27814, + 27834, + 27865, + 27843, + 27842, + 27803, + 27812, + 27825 + ], + "sample_count": 32 + }, + { + "pubkey": "58MaYUzTTzvPPQPFbZufdqzk3FDUwCNc6LUoQAhyQvTT", + "epoch": 129, + "origin_device_pk": "83SQUuoufcgFYwHMEs7rXBib3NDj5t3wBxMSzznYfe4W", + "target_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "link_pk": "DzHDqj3cdi77eMLWKemdhfr6YZJeHHGxuysvAdekniC", + "origin_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425138320, + "samples": [ + 10566, + 10608, + 10599, + 10567, + 10590, + 10579, + 10570, + 10565, + 10566, + 10574, + 10576, + 10585, + 10569, + 10591, + 10582, + 10576, + 10583, + 10577, + 10578, + 10618, + 10574, + 10583, + 10604, + 10609, + 10622, + 10570, + 10611, + 10596, + 10622, + 10573, + 10573, + 10613 + ], + "sample_count": 32 + }, + { + "pubkey": "Aj36MVJk6S2JUFVHgwrF9VRSqCCozyVDwBAXkwf2LyvW", + "epoch": 129, + "origin_device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "target_device_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "link_pk": "Fn2EJucjUakS99N9D4MFcykP7W8uiZ9PmCzBihfBi51s", + "origin_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "target_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429513950, + "samples": [ + 124, + 125, + 131, + 119, + 120, + 160, + 122, + 151, + 139, + 115, + 132, + 112, + 115, + 131, + 163, + 120, + 129, + 139, + 132, + 112, + 134, + 153, + 135, + 210, + 116, + 141, + 186, + 119, + 119, + 106, + 108, + 118 + ], + "sample_count": 32 + }, + { + "pubkey": "D3K73VzFpv6v4TuoRfZrzKBctAWhtCgBFast4o8QFxPW", + "epoch": 129, + "origin_device_pk": "GphgLkA7JDVtkDQZCiDrwrDvaUs8r8XczEae1KkV6CGQ", + "target_device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "link_pk": "7NMRSZ8AjmLYXmSLdn9vmoMisM8tYdxrk77jt6Zr19b8", + "origin_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432176841, + "samples": [ + 5806, + 5851, + 5842, + 5825, + 5832, + 5809, + 5863, + 5855, + 5829, + 5811, + 5838, + 5836, + 5837, + 5798, + 5824, + 5807, + 5813, + 5844, + 5827, + 5828, + 5823, + 5872, + 5811, + 5828, + 5825, + 5840, + 5840, + 5825, + 5848, + 5826, + 5816, + 5850 + ], + "sample_count": 32 + }, + { + "pubkey": "EGUY6Rts4X9dzbLYzriSUFUiLBio4BdGNEsNTkM8NFaS", + "epoch": 129, + "origin_device_pk": "3CTmBQeNF6LQZzaLbYj6jbhCztcsLuzzJeByfrhXTaXU", + "target_device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "link_pk": "4DcV5UtFfWz1aH6oyppMsNt3ypu3wgUNnp6VvrDM8F2C", + "origin_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "target_device_location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428489196, + "samples": [ + 17763, + 17598, + 17658, + 18145, + 17603, + 17661, + 17644, + 17596, + 17596, + 17631, + 17599, + 17699, + 17752, + 17598, + 17602, + 17615, + 17627, + 17676, + 17606, + 18484, + 17632, + 17623, + 17588, + 17602, + 17595, + 17624, + 17607, + 17658, + 17702, + 18642, + 17614, + 17599 + ], + "sample_count": 32 + }, + { + "pubkey": "HJSNB3DDnhXVc8AjtK6WnBfLLcYKBKDfHdqoKGT2XA3d", + "epoch": 129, + "origin_device_pk": "pem7vfRADmANUPvMqz5gwkz6UbJkHJQvsA4aKSF9Ave", + "target_device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "link_pk": "BghsvED9eCtpXC1smkfm8iEzfNGrro24c5eacE154goa", + "origin_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427495067, + "samples": [ + 13307, + 13292, + 13291, + 13318, + 13367, + 13311, + 13284, + 13308, + 13336, + 13287, + 13295, + 13318, + 13296, + 13306, + 13310, + 13325, + 13308, + 13309, + 13278, + 13306, + 13303, + 13290, + 13333, + 13288, + 13282, + 13277, + 13292, + 13290, + 13291, + 13293, + 13317, + 13355 + ], + "sample_count": 32 + }, + { + "pubkey": "EH5AmiWuANdnWdsFAJKrVeuE5efWRiEpqhh8CaBiFaQ3", + "epoch": 129, + "origin_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "target_device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "link_pk": "EY87P4cBAUW8VEJV82QaTmNY1ZB2t51Z9MPL7UUxywtp", + "origin_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "target_device_location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432759500, + "samples": [ + 148455, + 148437, + 148421, + 148435, + 148413, + 148418, + 148406, + 148400, + 148429, + 148447, + 148408, + 148428, + 148430, + 148419, + 148387, + 148414, + 148447, + 148455, + 148446, + 148478, + 148439, + 148410, + 148427, + 148448, + 148429, + 148411, + 148424, + 148421, + 148449, + 148447, + 148398, + 148431 + ], + "sample_count": 32 + }, + { + "pubkey": "B5JqbKfRTs3WSCgt9khPYV8Y3WHMLoGBiijbDPCxqAtA", + "epoch": 129, + "origin_device_pk": "2AvqMdvf5tmsvS2DsJZD16c7vtCDS8Fx83mg1RueipvY", + "target_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "link_pk": "9MgrhvF7v6vevLAVcS5Zt4doPVyqPCCuoMEGwFiQJBBc", + "origin_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "target_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429533798, + "samples": [ + 316, + 250, + 267, + 304, + 253, + 274, + 262, + 263, + 299, + 270, + 305, + 284, + 301, + 298, + 285, + 307, + 298, + 278, + 273, + 308, + 265, + 264, + 254, + 267, + 276, + 263, + 269, + 271, + 289, + 293, + 245, + 281 + ], + "sample_count": 32 + }, + { + "pubkey": "A6Y8tVjhcx2aQuGeQHSxwdjNiJQCLVcf1jhmWbu3UxrD", + "epoch": 129, + "origin_device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "target_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "link_pk": "JBmy4A7XxuB2dgBFGzRTvK8if1oNQW6Hx3DDGut8D8ZP", + "origin_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "target_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428536696, + "samples": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "sample_count": 32 + }, + { + "pubkey": "3fdrSMDVsYLCg87K8RU5Yrdmjw8qx5iKe1ohx1TUx4Sg", + "epoch": 129, + "origin_device_pk": "WTngs9GF7PDyWuVPkRg3KRj8E8sJCJ2zLc75DAn9DHT", + "target_device_pk": "DLajvcrHuZpbrJKY31Bgdd7oymCADDUPN1N77Rvd2QxN", + "link_pk": "4cNZLDnNf6T5P7KbnTdKKDNMgAsfNAccXrh1Re4re4LJ", + "origin_device_location_pk": "2QmK4Cxj2RZopHeX85QZ4wkJtVyYjf7n2ub5hAKH7eC8", + "target_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "origin_device_agent_pk": "HQ8pqcfexhftBNjYhzDZJuGnCz869fCxcZbni6jqmbo", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427805220, + "samples": [ + 25459, + 25474, + 25490, + 25736, + 25921, + 26018, + 25849, + 25480, + 25978, + 25680, + 25474, + 25959, + 25612, + 25897, + 25940, + 25448, + 25466, + 25526, + 25655, + 25436, + 25558, + 25713, + 25513, + 25496, + 25674, + 25453, + 25588, + 25459, + 25472, + 25544, + 25507, + 25445 + ], + "sample_count": 32 + }, + { + "pubkey": "HCTvvKHLvcARmdGCRWZD7E6hL2exaYqN2ggFahgiN7Kf", + "epoch": 129, + "origin_device_pk": "ENMRWMfzzUFuMJa5R78AP4ruaGtutCkMAmsQZAUR8SmH", + "target_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "link_pk": "CLMj53rUneEokXWZLtBL8Jj5fWxjprBpcrdurysAis3v", + "origin_device_location_pk": "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq", + "target_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425402226, + "samples": [ + 124423, + 124427, + 124413, + 124421, + 124400, + 124417, + 124402, + 124410, + 124429, + 124433, + 124452, + 124444, + 124458, + 124432, + 124501, + 124416, + 124433, + 124430, + 124415, + 124453, + 124442, + 124419, + 124414, + 124447, + 124429, + 124437, + 124476, + 124407, + 124431, + 124461, + 124416, + 124457 + ], + "sample_count": 32 + }, + { + "pubkey": "G9V23WjBTKYktvUp4PPnqJPGMCJa2z94As7Jsu5NRops", + "epoch": 129, + "origin_device_pk": "AWQUQCWAR3rbJfYD6MC7ESM3stFgQnehE6N5aXEtfEnc", + "target_device_pk": "7YKkAaXLD5XyjUc3JR9MECSKRN9q7kMnzKT3c4jFkZEh", + "link_pk": "CRQMUYCfgP2o9NdNyoXJ93kM4wt39993V18yaZQx5je6", + "origin_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "target_device_location_pk": "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429230552, + "samples": [ + 1678, + 1688, + 1714, + 1679, + 1695, + 1693, + 1666, + 1709, + 1699, + 1740, + 1676, + 1650, + 1673, + 1678, + 1663, + 1694, + 1674, + 1701, + 1682, + 1699, + 1679, + 1664, + 1677, + 1692, + 1694, + 1668, + 1674, + 1680, + 1714, + 1712, + 1654, + 1676 + ], + "sample_count": 32 + }, + { + "pubkey": "FEdu971zRXCoE3T3asTSibJAFALrbQ1ohvDoPAPrCst2", + "epoch": 129, + "origin_device_pk": "3CTmBQeNF6LQZzaLbYj6jbhCztcsLuzzJeByfrhXTaXU", + "target_device_pk": "AWQUQCWAR3rbJfYD6MC7ESM3stFgQnehE6N5aXEtfEnc", + "link_pk": "CywNxAMgEhsaCAcS3NhQ2JGmW3ArGFwxkQ5TBb7ULBsZ", + "origin_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "target_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428489183, + "samples": [ + 132, + 108, + 116, + 146, + 134, + 116, + 112, + 99, + 105, + 158, + 113, + 114, + 157, + 119, + 112, + 89, + 114, + 92, + 129, + 97, + 125, + 106, + 151, + 100, + 151, + 106, + 127, + 85, + 136, + 183, + 116, + 113 + ], + "sample_count": 32 + }, + { + "pubkey": "Ds4tUyMJr83ht7Y4yhDvjqVHywb9YU7RTZVKWSEgiZed", + "epoch": 129, + "origin_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "target_device_pk": "Ddc96QyGecBsDGQ5Mtvato2UdrTQeAuuEUQBwhWpujRk", + "link_pk": "9L36cYa4kxsVoNngeDMLuFxWVg8pUxykLmiBX1UfHzti", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465684, + "samples": [ + 38731, + 38730, + 38770, + 38714, + 38715, + 38700, + 38706, + 38739, + 38718, + 38711, + 38728, + 38717, + 38718, + 38701, + 38746, + 38726, + 38716, + 38708, + 38733, + 38710, + 38786, + 38720, + 38740, + 38734, + 38735, + 38719, + 38702, + 38738, + 38717, + 38742, + 38718, + 38733 + ], + "sample_count": 32 + }, + { + "pubkey": "Bpkb2fH5hpULUXXrXgQyy3JMBRzpWDM6MsY3fAztCSHx", + "epoch": 129, + "origin_device_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "target_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_pk": "B7qNZ1r7yXdLoEHb8eGvuPUdsVYoKUVgTPQsYqnqDBBQ", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433853344, + "samples": [ + 130, + 136, + 168, + 105, + 140, + 130, + 135, + 149, + 166, + 139, + 158, + 122, + 112, + 159, + 118, + 149, + 162, + 146, + 134, + 122, + 125, + 125, + 153, + 132, + 176, + 141, + 129, + 116, + 120, + 127, + 165, + 128 + ], + "sample_count": 32 + }, + { + "pubkey": "7oRxG7MSe6dzd77ELvjgZcC2Fcv3hXugyAj54WrrmZHG", + "epoch": 129, + "origin_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "target_device_pk": "BTw4t8cVo5hGAJsJpLWE35nxDexcuAbmQNZHV1rJMNqQ", + "link_pk": "81Z2wjrirbfZbAiPUrP2djshYzZxfLB9MKbnA1RMo4cV", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425915609, + "samples": [ + 134, + 190, + 114, + 133, + 162, + 105, + 116, + 126, + 147, + 155, + 141, + 112, + 117, + 170, + 139, + 131, + 182, + 140, + 132, + 118, + 180, + 118, + 191, + 139, + 155, + 111, + 155, + 143, + 159, + 183, + 161, + 158 + ], + "sample_count": 32 + }, + { + "pubkey": "BEDcvGz6kHgLp5qfsnEgwpofuY1thooB5SDpnDaJFnYf", + "epoch": 129, + "origin_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "target_device_pk": "6VywMdq9TggmKcNUHoEyGmhrmLqRw4FGa8G5C5bM9nr1", + "link_pk": "Ck3z6oWrXvrMVHvViWDPJYQuJW9EWqs2TVZWPgA76dXV", + "origin_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "target_device_location_pk": "5FVgFpww2FyftFamYqLEHjoq7AYCVWUWtWaWRxuh6rP4", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425745491, + "samples": [ + 12468, + 12449, + 12418, + 12426, + 12504, + 12432, + 12419, + 12468, + 12440, + 12413, + 12432, + 12428, + 12462, + 12469, + 12436, + 12487, + 12432, + 12450, + 12478, + 12428, + 12473, + 12415, + 12431, + 12458, + 12428, + 12425, + 12652, + 12420, + 12427, + 12468, + 12442, + 12459 + ], + "sample_count": 32 + }, + { + "pubkey": "HPfis83AvRuB7x9FwCAPMEJ9N5zmzdtwRyZR86UNihkF", + "epoch": 129, + "origin_device_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "target_device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "link_pk": "8J4DJUr5wq1wJd8PCbr38jdF1v14ZkHmAQpfaqGWfeVk", + "origin_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "target_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427205072, + "samples": [ + 136, + 120, + 154, + 141, + 143, + 112, + 120, + 112, + 127, + 143, + 139, + 136, + 104, + 139, + 126, + 125, + 117, + 153, + 134, + 154, + 130, + 114, + 115, + 160, + 151, + 152, + 131, + 118, + 159, + 137, + 130, + 117 + ], + "sample_count": 32 + }, + { + "pubkey": "9TCtnrkJie8RXCEy7LYW5d8HAufi4uHTdcXQAbCQNRaj", + "epoch": 129, + "origin_device_pk": "4wusXr7UXdX7b4j6LUVYiW5VU1CRnQkSoQACgq9vM1r9", + "target_device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "link_pk": "FVWE6sAb2KaHNANJm1CGQjhzWzMLZxqs9Wt7BkDoKiX4", + "origin_device_location_pk": "CepfuwR988f64wqmmQoNtsTnSjtMFToo5KUZH6dcjMTX", + "target_device_location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428787990, + "samples": [ + 161, + 171, + 157, + 186, + 152, + 175, + 186, + 155, + 145, + 149, + 191, + 193, + 143, + 149, + 154, + 162, + 163, + 205, + 150, + 159, + 169, + 190, + 191, + 195, + 142, + 152, + 176, + 186, + 159, + 143, + 144, + 168 + ], + "sample_count": 32 + }, + { + "pubkey": "4YH4QGiNjZVmHQvjZT9moZ2PMDLAzhtUMhQihh9QM6s3", + "epoch": 129, + "origin_device_pk": "4sXvs2kxGhfbChZS48xGosZkV8fJwxYc1gwHnSR3fS6F", + "target_device_pk": "2AvqMdvf5tmsvS2DsJZD16c7vtCDS8Fx83mg1RueipvY", + "link_pk": "27vvYzffpz85AbvbXfs5BgfR1Xp4zJxZE2Fegexk2VXg", + "origin_device_location_pk": "BNoP4em7REgS7igJ9cAnYpDW5w9SdRHWB9Bf6oNf3PJ5", + "target_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429558770, + "samples": [ + 14237, + 14267, + 14256, + 14238, + 14263, + 14262, + 14246, + 14275, + 14239, + 14255, + 14262, + 14335, + 14259, + 14253, + 14250, + 14275, + 14255, + 14251, + 14268, + 14254, + 14342, + 14347, + 14251, + 14238, + 14256, + 14365, + 14272, + 14251, + 14244, + 14242, + 14250, + 14230 + ], + "sample_count": 32 + }, + { + "pubkey": "9cW4REmvJeyqztcJMRm4dNQoEm1KwDGnbXM6c1toSRKB", + "epoch": 129, + "origin_device_pk": "Ebbzp9HgohXmrbJMYdydyrnmwzoYMkR6W7AgXunoTr2R", + "target_device_pk": "5YYidoUwgjN3r5wFT5F1Zd4YAddzuz5fwFkuNekRbo48", + "link_pk": "81bC6DMDwg7XVCdoAXpo9NpsCD5J4UJA22ZPicnZcFUX", + "origin_device_location_pk": "Fx4bTA1DW8nEkS998eRuhQoKKmqevdALcNs8ibCj2RaH", + "target_device_location_pk": "Fx4bTA1DW8nEkS998eRuhQoKKmqevdALcNs8ibCj2RaH", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431685434, + "samples": [ + 114, + 153, + 119, + 160, + 116, + 164, + 162, + 136, + 122, + 129, + 162, + 130, + 123, + 115, + 159, + 114, + 139, + 130, + 127, + 138, + 142, + 154, + 119, + 164, + 154, + 168, + 107, + 122, + 136, + 167, + 153, + 124 + ], + "sample_count": 32 + }, + { + "pubkey": "8eUADAic3d3WN2LTYB3CL3oMQocoE8ULZUj9NX6VHjJG", + "epoch": 129, + "origin_device_pk": "7YKkAaXLD5XyjUc3JR9MECSKRN9q7kMnzKT3c4jFkZEh", + "target_device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "link_pk": "6K7oDWbKHK3cF4AbpFEpM6Z9VFLuiuohGFKUMJihKB8D", + "origin_device_location_pk": "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424175043, + "samples": [ + 39915, + 40440, + 38964, + 38994, + 38960, + 40583, + 41219, + 41557, + 38954, + 40021, + 0, + 38940, + 38973, + 42980, + 38976, + 40992, + 38951, + 38970, + 38954, + 40496, + 40083, + 40190, + 38988, + 38990, + 38957, + 38979, + 38967, + 41095, + 38951, + 41732, + 40728, + 38970 + ], + "sample_count": 32 + }, + { + "pubkey": "svPLLXA8K2NzSPqNxv58Jxwc2G6CP6QH1mGbLWDFVVx", + "epoch": 129, + "origin_device_pk": "9gGVhChduB9DezW22cvJDDeYbWddpn1vpeKZ5RKxh8Ji", + "target_device_pk": "127iHx1CmZitJhtdTs8ePqepLi6DaPoL44Nzrxmvr1V8", + "link_pk": "F4BvF2SYKCyGXBQHZ5zArb8v9u5YUFpVgFKWeH8H9ejV", + "origin_device_location_pk": "8sejbB8n2vNYtmHKNQQJWnm17zjBZcDuMfwdb144W1kk", + "target_device_location_pk": "8sejbB8n2vNYtmHKNQQJWnm17zjBZcDuMfwdb144W1kk", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428687651, + "samples": [ + 102, + 116, + 114, + 116, + 120, + 144, + 133, + 124, + 107, + 111, + 135, + 114, + 117, + 119, + 123, + 104, + 109, + 118, + 157, + 100, + 131, + 105, + 103, + 106, + 101, + 115, + 116, + 122, + 114, + 110, + 106, + 116 + ], + "sample_count": 32 + }, + { + "pubkey": "A2xvavmb49zavfJPHonMaj2XqQ6rzwbuGyEwEAeNXkJ", + "epoch": 129, + "origin_device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "target_device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "link_pk": "CqHUSTSccTRMJ4LPGkgfQLA1GmYWTqiR8LQWfqVGUeAt", + "origin_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "target_device_location_pk": "7g1K5YyfHmbVSnkHhJTsL2fLiJ1WxFdFD1vUML5WokTz", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433856258, + "samples": [ + 147, + 211, + 165, + 184, + 152, + 176, + 179, + 205, + 177, + 147, + 180, + 165, + 156, + 180, + 173, + 174, + 173, + 164, + 147, + 193, + 158, + 179, + 190, + 154, + 156, + 143, + 193, + 180, + 201, + 164, + 178, + 199 + ], + "sample_count": 32 + }, + { + "pubkey": "9oQTxPfvvSaigJ8hnCd9sjzXVAXixrQRmRSe6NRLpuGD", + "epoch": 129, + "origin_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "target_device_pk": "5VhacudbiTcMP4uB4a712bYXLhSJqzAjLEau2qJynJf2", + "link_pk": "EksKPymnmzYbqWLqL2T1wEHiLgtUHM6GZeEgN9eRWJd2", + "origin_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "target_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432759481, + "samples": [ + 5873, + 5867, + 5831, + 5858, + 5847, + 5886, + 5843, + 5837, + 5817, + 5926, + 5887, + 5846, + 5841, + 5879, + 5829, + 5856, + 5862, + 5867, + 5850, + 5829, + 5831, + 5861, + 5889, + 5869, + 5841, + 5832, + 5859, + 5867, + 5845, + 5863, + 5843, + 5849 + ], + "sample_count": 32 + }, + { + "pubkey": "5C6evDPMgq75985BcB7NDTxj1FRABep5xTjfJfkCXyN4", + "epoch": 129, + "origin_device_pk": "5YYidoUwgjN3r5wFT5F1Zd4YAddzuz5fwFkuNekRbo48", + "target_device_pk": "Ebbzp9HgohXmrbJMYdydyrnmwzoYMkR6W7AgXunoTr2R", + "link_pk": "81bC6DMDwg7XVCdoAXpo9NpsCD5J4UJA22ZPicnZcFUX", + "origin_device_location_pk": "Fx4bTA1DW8nEkS998eRuhQoKKmqevdALcNs8ibCj2RaH", + "target_device_location_pk": "Fx4bTA1DW8nEkS998eRuhQoKKmqevdALcNs8ibCj2RaH", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428223325, + "samples": [ + 140, + 117, + 108, + 133, + 111, + 132, + 138, + 141, + 144, + 141, + 145, + 120, + 119, + 138, + 116, + 128, + 147, + 139, + 153, + 100, + 143, + 131, + 151, + 163, + 163, + 113, + 160, + 156, + 121, + 111, + 127, + 132 + ], + "sample_count": 32 + }, + { + "pubkey": "4nJCimpUHKSjSStpJmMkNqfeTjggcvTNgAarCFRqmH6M", + "epoch": 129, + "origin_device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "target_device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "link_pk": "889avwHAHyCvg9c8ALBfC91yQY7w6ncg9pjwdDivRsUZ", + "origin_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "target_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433856252, + "samples": [ + 190, + 166, + 169, + 157, + 175, + 222, + 183, + 152, + 153, + 168, + 131, + 164, + 140, + 180, + 145, + 164, + 179, + 145, + 157, + 180, + 155, + 156, + 152, + 141, + 161, + 158, + 183, + 153, + 186, + 173, + 144, + 175 + ], + "sample_count": 32 + }, + { + "pubkey": "FFtxgaWHiPK4pHHKDmR4sHP5j5g7LD269HxXuZTghRL6", + "epoch": 129, + "origin_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "target_device_pk": "GARSc9a1pEQ3oKWLSP2BAYcBDwrTrNxsUVzxjCA6aoyc", + "link_pk": "9EUvwVQ6dMXf7oGEpmVKdJypuE6ayeKGqs6QQYieVnj1", + "origin_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "target_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432461548, + "samples": [ + 136711, + 136783, + 136718, + 136751, + 136755, + 136752, + 136744, + 136731, + 136722, + 136702, + 136761, + 136728, + 136785, + 136730, + 136746, + 136734, + 136721, + 136737, + 136764, + 136728, + 136731, + 136753, + 136709, + 136717, + 136707, + 136745, + 136786, + 136735, + 136769, + 136720, + 136739, + 136762 + ], + "sample_count": 32 + }, + { + "pubkey": "6PTo7U9wKwSuMbNgK4u5nZCoyv5r9YxDmwJvTN1ZLpjp", + "epoch": 129, + "origin_device_pk": "Cgn84CWvpGbh5L6an4YgS6Q6wTZaZPW7nqNLdptQPxgV", + "target_device_pk": "A1WWZhApXFAzCgCVjnZLwBHCaWBC41UUh7Cw3o96Vfx9", + "link_pk": "EcWSrui72LCx4DgMqnQoRwJdwpjqLv7b1s8BeupwHWFj", + "origin_device_location_pk": "E8hhYdAvrYTPk8xxpRsmh1BayVLMwptM2ismsrQJpSmV", + "target_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429389133, + "samples": [ + 132, + 150, + 118, + 124, + 117, + 117, + 101, + 149, + 146, + 125, + 137, + 125, + 142, + 126, + 118, + 128, + 123, + 102, + 131, + 157, + 141, + 134, + 126, + 153, + 131, + 142, + 124, + 118, + 142, + 148, + 112, + 110 + ], + "sample_count": 32 + }, + { + "pubkey": "7M8YnSMDqRr7jM4ohWuKD2nmKnmX9Bngx9VrzASYRkXu", + "epoch": 129, + "origin_device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "target_device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "link_pk": "5tavj7kq3uBrSP7LbuhT2T2VjngxV9yYU7hufrYXVntm", + "origin_device_location_pk": "8a5WNgBA7hNprZDBSMrMUYB3QjiRfGknrZ2hxSJ3X6F2", + "target_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432095203, + "samples": [ + 497, + 497, + 499, + 500, + 495, + 509, + 514, + 485, + 509, + 508, + 494, + 498, + 509, + 487, + 532, + 523, + 489, + 493, + 495, + 498, + 471, + 492, + 507, + 531, + 471, + 482, + 492, + 518, + 488, + 502, + 530, + 491 + ], + "sample_count": 32 + }, + { + "pubkey": "3cAk4ub3D7rh8zvN2WYjHG3UHkf2eDmi4MyjunwdpZJh", + "epoch": 129, + "origin_device_pk": "ENMRWMfzzUFuMJa5R78AP4ruaGtutCkMAmsQZAUR8SmH", + "target_device_pk": "ASYSzEwBAPhnqj6q1io8VdCUcjfb5T1731kJPUjnHa7Y", + "link_pk": "CfQesQBHnHWrh42poQYrsp3EYfrHYHXjX7QfBqsDMFLW", + "origin_device_location_pk": "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq", + "target_device_location_pk": "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425402214, + "samples": [ + 160, + 114, + 166, + 173, + 146, + 124, + 151, + 154, + 153, + 127, + 129, + 130, + 144, + 140, + 135, + 145, + 142, + 130, + 128, + 135, + 133, + 128, + 154, + 164, + 120, + 136, + 152, + 133, + 127, + 158, + 138, + 119 + ], + "sample_count": 32 + }, + { + "pubkey": "CBsm4jWi9uT2Ed1oS79hevVAryTgccGZaHNcmPVuqqdD", + "epoch": 129, + "origin_device_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "target_device_pk": "48p9HYhMNMu8rwjBgPgKUJjr8LSMJx1DCAbBMnVewAVr", + "link_pk": "DtPLPTh9LkLzk5ezHeaszkFQNzQKWypPza4QzCr68ReQ", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "BhapEuF9xoTgLWNP9iWwziSFYzXwbtSbXNsxJyySMrmf", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433633983, + "samples": [ + 24683, + 25040, + 24675, + 24680, + 24709, + 24721, + 24824, + 25108, + 24719, + 24865, + 24717, + 24700, + 24688, + 24691, + 24713, + 24758, + 24725, + 24689, + 24685, + 24686, + 24683, + 24678, + 24673, + 24669, + 25218, + 24722, + 24700, + 24695, + 24700, + 25019, + 24712, + 25028 + ], + "sample_count": 32 + }, + { + "pubkey": "4MFM4KEagzxohVEgb1yMdkuZeUSZkbKn5fYimw2XB41F", + "epoch": 129, + "origin_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "target_device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "link_pk": "2EHeaxVbsb2FvheFGsWn7VBaQYcZdnXg7hhoMdiqtW4A", + "origin_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "target_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427830627, + "samples": [ + 81610, + 81622, + 81582, + 81574, + 81597, + 81579, + 81603, + 81578, + 81570, + 81578, + 81588, + 81644, + 81584, + 81600, + 81583, + 81622, + 81604, + 81626, + 81568, + 81620, + 81608, + 81636, + 81620, + 81604, + 81603, + 81625, + 81626, + 81586, + 81649, + 81589, + 81690, + 81621 + ], + "sample_count": 32 + }, + { + "pubkey": "FVNfbwXz9pj2HADhJXtqPMzobJ4pbmMPnd5y1DVLUhXA", + "epoch": 129, + "origin_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "target_device_pk": "CqGi7i432BVjZo3vwQhnEDoCBsmiWMebbo6JE7wSSp3c", + "link_pk": "6snESc9Qw3eHZcxfVeJM84Bd18bUorcmcZ3H4jG6Wxuq", + "origin_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "target_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425745488, + "samples": [ + 485, + 503, + 533, + 519, + 455, + 475, + 497, + 511, + 497, + 549, + 489, + 542, + 492, + 516, + 485, + 542, + 475, + 555, + 521, + 506, + 494, + 483, + 493, + 521, + 501, + 503, + 494, + 481, + 479, + 502, + 506, + 456 + ], + "sample_count": 32 + }, + { + "pubkey": "97GVn8nYGea4rAVruBDwcHakNF9TqzzuDyGA8N4z3eNM", + "epoch": 129, + "origin_device_pk": "BLArXrBNd1vd5ELbF133ypTpAe1GbSi8nc6DMepBUrYa", + "target_device_pk": "4sXvs2kxGhfbChZS48xGosZkV8fJwxYc1gwHnSR3fS6F", + "link_pk": "F4xaxs6ERY8VHyyNMctT4jJFegConpepygrQG6bEtb44", + "origin_device_location_pk": "9ySXHhn4zheYB9FJtpCCUQBbj6RqX5NJihkyNEeb1xoN", + "target_device_location_pk": "BNoP4em7REgS7igJ9cAnYpDW5w9SdRHWB9Bf6oNf3PJ5", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429503359, + "samples": [ + 21311, + 21332, + 21330, + 21368, + 21316, + 21299, + 21311, + 21301, + 21427, + 21299, + 21317, + 21315, + 21338, + 21386, + 21298, + 21356, + 21367, + 21343, + 21351, + 21336, + 21346, + 21327, + 21323, + 21317, + 21322, + 21398, + 21329, + 21325, + 21306, + 21325, + 21324, + 21363 + ], + "sample_count": 32 + }, + { + "pubkey": "AcoCnJu6tTJLqoM1wtto7Hq4vPCtZAkRwGUUkLpD2RRP", + "epoch": 129, + "origin_device_pk": "4sXvs2kxGhfbChZS48xGosZkV8fJwxYc1gwHnSR3fS6F", + "target_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "link_pk": "J616cKWbecxcRGJrN6xBKkXv2RiCFcjDPhSfgxR2hx4c", + "origin_device_location_pk": "BNoP4em7REgS7igJ9cAnYpDW5w9SdRHWB9Bf6oNf3PJ5", + "target_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429558764, + "samples": [ + 22942, + 22948, + 23035, + 23002, + 22963, + 23011, + 22980, + 22974, + 23053, + 22977, + 22961, + 22952, + 22957, + 22935, + 22947, + 22975, + 22954, + 23003, + 23013, + 22969, + 22948, + 22973, + 22956, + 22944, + 22974, + 22967, + 22955, + 22978, + 23000, + 22968, + 22972, + 22922 + ], + "sample_count": 32 + }, + { + "pubkey": "J7YPtNNCxg6Sq8aKmfxn685htE3bPUHtd8HJpz2PL4Ft", + "epoch": 129, + "origin_device_pk": "3EUTjtzdJFG9PFp9j39cxvY8zAWtFUkUjrzWQ8GsUvRD", + "target_device_pk": "DW4kmVTZrb2tAggT915P3W5vgfC28BmYVTKYnAQPx32s", + "link_pk": "6V4vvD7NjvrK7kmekaf5pfGJiUbJZrUVB7PuZsnTqxZZ", + "origin_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "H6TzLFei8eXpH9g65HNvoBGn81e7BRQvSS2i8uxLxxgJ", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427915609, + "samples": [ + 134114, + 134092, + 134004, + 134063, + 134140, + 134152, + 134094, + 134047, + 134100, + 134048, + 134013, + 134081, + 134128, + 134110, + 134101, + 134064, + 134085, + 134105, + 134077, + 134126, + 134061, + 134054, + 134047, + 134056, + 134027, + 134140, + 134032, + 134004, + 134105, + 134057, + 134077, + 134074 + ], + "sample_count": 32 + }, + { + "pubkey": "BuH6HBtcYF2HYn4C1j3hdshUQwunQYyNM7DpzYmu3as8", + "epoch": 129, + "origin_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "target_device_pk": "4sXvs2kxGhfbChZS48xGosZkV8fJwxYc1gwHnSR3fS6F", + "link_pk": "J616cKWbecxcRGJrN6xBKkXv2RiCFcjDPhSfgxR2hx4c", + "origin_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "target_device_location_pk": "BNoP4em7REgS7igJ9cAnYpDW5w9SdRHWB9Bf6oNf3PJ5", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429508658, + "samples": [ + 23099, + 22988, + 22960, + 22953, + 22968, + 22931, + 24242, + 24606, + 22961, + 22949, + 22983, + 23207, + 22966, + 23041, + 22964, + 22973, + 22935, + 22940, + 22955, + 22947, + 22992, + 22939, + 22953, + 22932, + 22983, + 23027, + 22954, + 22949, + 22968, + 22975, + 22935, + 22938 + ], + "sample_count": 32 + }, + { + "pubkey": "D53PAskPXfZ8uQnuvkx79iFPmXkJkScn4gUrp1kvrEEt", + "epoch": 129, + "origin_device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "target_device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "link_pk": "CXeafseL5sd9KYmbKQQqmk3MzcGHwdLVLDqLbiKbpz3k", + "origin_device_location_pk": "8a5WNgBA7hNprZDBSMrMUYB3QjiRfGknrZ2hxSJ3X6F2", + "target_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432095217, + "samples": [ + 65661, + 65702, + 65665, + 65724, + 65639, + 65646, + 65644, + 65654, + 65663, + 65663, + 65647, + 65641, + 65641, + 65674, + 65705, + 65667, + 65680, + 65672, + 65692, + 65665, + 65668, + 65660, + 65653, + 65657, + 65657, + 65683, + 65711, + 65686, + 65647, + 65645, + 65664, + 65652 + ], + "sample_count": 32 + }, + { + "pubkey": "59DnmLP8B7kJc8huV8squTAkhcbiHcqh49Xw4Zr1zzEr", + "epoch": 129, + "origin_device_pk": "9PsbdMKcfmiHHruNTV2neyMtqfkKcNscJEJNmMBnFM68", + "target_device_pk": "FEML4XsDPN3WfmyFAXzE2xzyYqSB9kFCRrMik8JqN6kT", + "link_pk": "BGmYpKgFjjVqdTXcRhFUe6hvb2gSmQVdaXoUA3WM4Jpi", + "origin_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "target_device_location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429262384, + "samples": [ + 39350, + 39330, + 39366, + 39358, + 39368, + 39344, + 39408, + 39337, + 39372, + 39343, + 39356, + 39356, + 39348, + 39392, + 39353, + 39352, + 39358, + 39350, + 39349, + 39360, + 39364, + 39329, + 39349, + 39347, + 39349, + 39325, + 39367, + 39367, + 39363, + 39363, + 39354, + 39440 + ], + "sample_count": 32 + }, + { + "pubkey": "4XeA5dcHvqJeBvpHiDFs4zX4zHYwyLvudrtour5NM9mW", + "epoch": 129, + "origin_device_pk": "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2", + "target_device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "link_pk": "AsfPXyjY4dgNkUtepE6LCRzKcXroZ3z8XtR5XEGnc4GG", + "origin_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "target_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432883950, + "samples": [ + 126, + 111, + 121, + 166, + 116, + 148, + 159, + 182, + 164, + 181, + 153, + 129, + 112, + 138, + 126, + 159, + 151, + 176, + 149, + 161, + 155, + 134, + 121, + 129, + 129, + 170, + 151, + 148, + 115, + 149, + 151, + 220 + ], + "sample_count": 32 + }, + { + "pubkey": "JAT1HmC129L3f91fCa9tajSsK2hwgn4nkM9o8rzxicgD", + "epoch": 129, + "origin_device_pk": "GBow73shpP8aTLiWm8QuJtqoE59GbZ3rppVgJLVpyvd6", + "target_device_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "link_pk": "B81688uu9zgJHzD5G1pn3YbAWtCf7uh2tfEU6dXQbsB4", + "origin_device_location_pk": "DJD3UmMd15dZqq1LTs1hqiyB4eH4PLBmptzAxAPY9phU", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433213687, + "samples": [ + 40099, + 40104, + 40077, + 40099, + 40105, + 40078, + 40090, + 40081, + 40111, + 40085, + 40098, + 40105, + 40112, + 40095, + 40116, + 40079, + 40091, + 40086, + 40097, + 40114, + 40124, + 40105, + 40124, + 40107, + 40109, + 40069, + 40107, + 40065, + 40062, + 40125, + 40124, + 40089 + ], + "sample_count": 32 + }, + { + "pubkey": "HRvK4igMDEcArbxPtaM6AQTpRFGR6CwobUMdaFx4G4Ci", + "epoch": 129, + "origin_device_pk": "Ddc96QyGecBsDGQ5Mtvato2UdrTQeAuuEUQBwhWpujRk", + "target_device_pk": "CgX1gLM5VPS9pzS2Dhmhm5sGhj84GKxmP2vZy35otYom", + "link_pk": "GbURiJNcdGb5E3BRqpizsQHrbYEra5fDHe5jrvhnVbxe", + "origin_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "target_device_location_pk": "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428420412, + "samples": [ + 1049, + 1084, + 1033, + 1048, + 1081, + 1038, + 1038, + 1061, + 1049, + 1072, + 1043, + 1034, + 1040, + 1067, + 1036, + 1082, + 1084, + 1076, + 1060, + 1084, + 1038, + 1048, + 1086, + 1070, + 1089, + 1067, + 1060, + 1042, + 1048, + 1067, + 1086, + 1041 + ], + "sample_count": 32 + }, + { + "pubkey": "U75oYu1aANzUU6gCHJm4H38y8QgxyXbXFvV6JhqvXrH", + "epoch": 129, + "origin_device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "target_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "link_pk": "HjqQuQw87zU4bRxfM6zkaei9f5jTjC5LfwCWvjcPJu54", + "origin_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "target_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430626645, + "samples": [ + 168, + 169, + 131, + 146, + 135, + 136, + 140, + 142, + 144, + 166, + 184, + 170, + 148, + 125, + 143, + 139, + 137, + 186, + 158, + 137, + 151, + 156, + 114, + 180, + 174, + 134, + 123, + 174, + 112, + 166, + 142, + 147 + ], + "sample_count": 32 + }, + { + "pubkey": "7gPEtfAygu9MzoFdTy6SXvAqQYaw2HpaXXepRsJL1Haa", + "epoch": 129, + "origin_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "target_device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "link_pk": "bChqyD8NUxeXeTMFq3YBu4WP3XqHkwndPGTEZxmA82k", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424653355, + "samples": [ + 136, + 154, + 156, + 114, + 134, + 154, + 132, + 148, + 151, + 134, + 132, + 139, + 139, + 134, + 173, + 131, + 165, + 154, + 159, + 152, + 154, + 152, + 155, + 143, + 146, + 200, + 139, + 126, + 114, + 130, + 125, + 143 + ], + "sample_count": 32 + }, + { + "pubkey": "HPQf4tTfzsjc2UTy1CVNG6VnNaiC2GYu4MvbiYdoYmvt", + "epoch": 129, + "origin_device_pk": "CqGi7i432BVjZo3vwQhnEDoCBsmiWMebbo6JE7wSSp3c", + "target_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "link_pk": "G57tMEhyprE8Q47wvmwU4SY92w4uVP8i8Lt3ZZNGsxKa", + "origin_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "target_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429196617, + "samples": [ + 209, + 249, + 244, + 246, + 235, + 261, + 267, + 223, + 220, + 260, + 251, + 260, + 262, + 229, + 231, + 220, + 243, + 244, + 244, + 237, + 236, + 276, + 215, + 228, + 248, + 232, + 224, + 239, + 300, + 227, + 223, + 246 + ], + "sample_count": 32 + }, + { + "pubkey": "HzJT7Hef2YEy5mSNUA5DkQqoSTo5mMPjP5KLCusWUpNJ", + "epoch": 129, + "origin_device_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "target_device_pk": "7YKkAaXLD5XyjUc3JR9MECSKRN9q7kMnzKT3c4jFkZEh", + "link_pk": "dXoaHzUh3apD5PKxAUDdkDzZ7GUrQG1niYMjf4YK5jq", + "origin_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "target_device_location_pk": "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427205091, + "samples": [ + 16482, + 16477, + 16466, + 16457, + 16457, + 16483, + 16500, + 16492, + 16481, + 16458, + 16501, + 16468, + 16483, + 16464, + 16468, + 16491, + 16470, + 16497, + 16477, + 16456, + 16467, + 16457, + 16453, + 16480, + 16499, + 16505, + 16471, + 16502, + 16470, + 16507, + 16469, + 16480 + ], + "sample_count": 32 + }, + { + "pubkey": "6G5sgEg2LpR2kgcfHNmJER92qnkwJNKqnDrs2td9pYPX", + "epoch": 129, + "origin_device_pk": "6WjPZwrMrZgwuEJMdyMAewvwSVig6HF5EVjCuF9LeJMm", + "target_device_pk": "AE5tZ5VZdkvQNTg44AY57QiLu9mvoToShtAEqEK68hPX", + "link_pk": "7V5g7QsLZ83jzDNdTSEdnJsDBTfxzsDAcqS9HUKUEEii", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425852754, + "samples": [ + 116, + 156, + 144, + 131, + 143, + 98, + 131, + 100, + 113, + 140, + 125, + 124, + 135, + 125, + 131, + 117, + 140, + 141, + 115, + 126, + 140, + 140, + 132, + 123, + 130, + 144, + 138, + 141, + 137, + 118, + 146, + 131 + ], + "sample_count": 32 + }, + { + "pubkey": "RR13hz41TdXb3xE5datEcgxzJy5FRZBdtK5fpYCgr3y", + "epoch": 129, + "origin_device_pk": "CTTCwG765QP8ycYrX1h8hZZo7K1pvDJXPaiC9Ue1u8qV", + "target_device_pk": "BTw4t8cVo5hGAJsJpLWE35nxDexcuAbmQNZHV1rJMNqQ", + "link_pk": "G84ptDdcrhb75wHzzSTrTqyRKGi43L1E5TC4N5hU3Gvd", + "origin_device_location_pk": "9gQn94Rs72oe9QRZM5i7KgACG6dXjirttbcZV75JxqH8", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426486613, + "samples": [ + 219, + 186, + 123, + 151, + 130, + 127, + 143, + 131, + 143, + 150, + 148, + 173, + 149, + 157, + 138, + 127, + 141, + 165, + 121, + 194, + 154, + 155, + 172, + 128, + 165, + 133, + 137, + 135, + 225, + 214, + 159, + 177 + ], + "sample_count": 32 + }, + { + "pubkey": "2AHLzMtexZ4wRMoseUCJ8aNQmjgnj8rkUG9TW8ZhDfWn", + "epoch": 129, + "origin_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "target_device_pk": "E1nCHKhKkgSodz8MMR1oxu7yXyhjZJMunPZzoZQrfYwD", + "link_pk": "Cxp6rJ1NpjNTqe6RnkkJHBmpMqPnTnmgiRZxgPhqourd", + "origin_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "target_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143423979114, + "samples": [ + 155, + 107, + 131, + 213, + 131, + 120, + 154, + 171, + 142, + 166, + 124, + 140, + 155, + 180, + 174, + 165, + 166, + 110, + 105, + 148, + 159, + 158, + 113, + 129, + 139, + 172, + 138, + 171, + 140, + 105, + 140, + 154 + ], + "sample_count": 32 + }, + { + "pubkey": "6sUCAoxW9kcMkSXE2uVNFPB8tUaDckjGafv1XLmaU9B6", + "epoch": 129, + "origin_device_pk": "DLhiDiskfhpbqPgLVEY8MLwaB8uxmsQ55tNrX9vpqDwe", + "target_device_pk": "WTngs9GF7PDyWuVPkRg3KRj8E8sJCJ2zLc75DAn9DHT", + "link_pk": "7xxfuQwZXKsbqyrZ2Rr3ZjBHP5ga2U9JxkzLdnUxBuhk", + "origin_device_location_pk": "22fDArnRLgyEiebZMKzbzmCG17zxJ6HPJdzWbzzBFaMW", + "target_device_location_pk": "2QmK4Cxj2RZopHeX85QZ4wkJtVyYjf7n2ub5hAKH7eC8", + "origin_device_agent_pk": "HQ8pqcfexhftBNjYhzDZJuGnCz869fCxcZbni6jqmbo", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426592459, + "samples": [ + 28317, + 27563, + 0, + 27514, + 27694, + 27537, + 27521, + 27532, + 27519, + 27589, + 27517, + 27513, + 27521, + 27505, + 27563, + 27507, + 27512, + 28931, + 27531, + 27514, + 27602, + 27532, + 27526, + 27527, + 28486, + 27517, + 27520, + 27513, + 27508, + 27608, + 27732, + 27569 + ], + "sample_count": 32 + }, + { + "pubkey": "2osivgSZSeFHvgub8hNhFq2EaD849kQhdk4Jewc5eavW", + "epoch": 129, + "origin_device_pk": "AWQUQCWAR3rbJfYD6MC7ESM3stFgQnehE6N5aXEtfEnc", + "target_device_pk": "3CTmBQeNF6LQZzaLbYj6jbhCztcsLuzzJeByfrhXTaXU", + "link_pk": "CywNxAMgEhsaCAcS3NhQ2JGmW3ArGFwxkQ5TBb7ULBsZ", + "origin_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "target_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429230525, + "samples": [ + 132, + 173, + 141, + 139, + 149, + 119, + 152, + 116, + 131, + 122, + 125, + 140, + 113, + 147, + 161, + 104, + 149, + 161, + 134, + 124, + 115, + 147, + 132, + 149, + 128, + 136, + 153, + 133, + 115, + 120, + 133, + 127 + ], + "sample_count": 32 + }, + { + "pubkey": "HNHvYtHFgXeYKHTfmRKx4QTcPuSGSkU4gitxu6j4CEkf", + "epoch": 129, + "origin_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "target_device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "link_pk": "5PfMcoVjuC8GSEwHS6uS4yJvVMfn5zzWo16DGVipFdmn", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425915568, + "samples": [ + 11343, + 11367, + 11359, + 11364, + 11369, + 11326, + 11354, + 11390, + 11348, + 11389, + 11377, + 11358, + 11399, + 11387, + 11398, + 11361, + 11366, + 11375, + 11352, + 11382, + 11393, + 11373, + 11357, + 11393, + 11356, + 11326, + 11389, + 11352, + 11436, + 11377, + 11329, + 11377 + ], + "sample_count": 32 + }, + { + "pubkey": "4H4vZDrpZ8v1uCeXcWKRHpBAdLiT4Q6JkYJJYMXLbRgk", + "epoch": 129, + "origin_device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "target_device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "link_pk": "5j4y3qgt8eqT2bKem13XzFydBN2ti7K9kEdjX5zoBnGM", + "origin_device_location_pk": "7g1K5YyfHmbVSnkHhJTsL2fLiJ1WxFdFD1vUML5WokTz", + "target_device_location_pk": "Ga9FVdnt99y3idLkthMw2LEJ2QA3WtUBKdM5MUQKnZwq", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426107018, + "samples": [ + 5166, + 5125, + 5167, + 5144, + 5166, + 5142, + 5124, + 5129, + 5116, + 5124, + 5142, + 5137, + 5136, + 5137, + 5147, + 5145, + 5120, + 5163, + 5130, + 5157, + 5125, + 5144, + 5176, + 5116, + 5151, + 5134, + 5173, + 5143, + 5145, + 5152, + 5110, + 5147 + ], + "sample_count": 32 + }, + { + "pubkey": "yBRNtaJWXL43JKN7iosgZqH7CTtcust4u7qAh6HyJ4p", + "epoch": 129, + "origin_device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "target_device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "link_pk": "5tavj7kq3uBrSP7LbuhT2T2VjngxV9yYU7hufrYXVntm", + "origin_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "target_device_location_pk": "8a5WNgBA7hNprZDBSMrMUYB3QjiRfGknrZ2hxSJ3X6F2", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427668654, + "samples": [ + 540, + 514, + 495, + 513, + 520, + 519, + 478, + 479, + 501, + 507, + 490, + 494, + 486, + 482, + 504, + 500, + 492, + 516, + 525, + 477, + 518, + 527, + 508, + 524, + 485, + 509, + 538, + 512, + 540, + 506, + 476, + 493 + ], + "sample_count": 32 + }, + { + "pubkey": "9NYEZVW2KWMEfKLcaBpBkUgy2pcN12kdutSH64CvmJS9", + "epoch": 129, + "origin_device_pk": "GARSc9a1pEQ3oKWLSP2BAYcBDwrTrNxsUVzxjCA6aoyc", + "target_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "link_pk": "9EUvwVQ6dMXf7oGEpmVKdJypuE6ayeKGqs6QQYieVnj1", + "origin_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "target_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430030321, + "samples": [ + 136759, + 136753, + 136743, + 136698, + 136754, + 136754, + 136719, + 136737, + 136728, + 136717, + 136717, + 136738, + 136745, + 136745, + 136739, + 136733, + 136761, + 136761, + 136755, + 136769, + 136741, + 136738, + 136724, + 136732, + 136719, + 136741, + 136743, + 136721, + 136704, + 136716, + 136728, + 136765 + ], + "sample_count": 32 + }, + { + "pubkey": "F6U3unMEuLso3f6E3RAYBnxyU5LM7fmHYENSuomMdg9f", + "epoch": 129, + "origin_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "target_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "link_pk": "6mjRAWpgWFyeVt9EwD6SpR1s9noyepcMabj3hJBvTjqu", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425915612, + "samples": [ + 16071, + 16107, + 16084, + 16096, + 16018, + 16006, + 16028, + 16018, + 16031, + 16010, + 16042, + 16036, + 16041, + 16073, + 16058, + 16023, + 16021, + 16032, + 16019, + 16012, + 16061, + 16015, + 16013, + 16036, + 16024, + 16026, + 16032, + 16015, + 16029, + 16099, + 16030, + 16038 + ], + "sample_count": 32 + }, + { + "pubkey": "CiHU9qJry87jrfohfRxnE4hohm34mmRuK8aujeicyaH", + "epoch": 129, + "origin_device_pk": "5VhacudbiTcMP4uB4a712bYXLhSJqzAjLEau2qJynJf2", + "target_device_pk": "CTTCwG765QP8ycYrX1h8hZZo7K1pvDJXPaiC9Ue1u8qV", + "link_pk": "44RsnMsyJfLqCfDkiAuWVxTF5dLPLDq2buhbbQscv34h", + "origin_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "target_device_location_pk": "9gQn94Rs72oe9QRZM5i7KgACG6dXjirttbcZV75JxqH8", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431021442, + "samples": [ + 5732, + 5759, + 5720, + 5736, + 5729, + 5742, + 5715, + 5735, + 5732, + 5729, + 5749, + 5750, + 5728, + 5703, + 5724, + 5722, + 5734, + 5744, + 5725, + 5726, + 5711, + 5708, + 5747, + 5735, + 5751, + 5762, + 5727, + 5759, + 5773, + 5784, + 5750, + 5734 + ], + "sample_count": 32 + }, + { + "pubkey": "GPrp9pU4LrB8FTdS6vYLr897nRfYMPcRAyWB6goxsmao", + "epoch": 129, + "origin_device_pk": "3CTmBQeNF6LQZzaLbYj6jbhCztcsLuzzJeByfrhXTaXU", + "target_device_pk": "TVEgwqaTtPK8tV17RFeYbik8zMbocqbbtZNm2dWpXPK", + "link_pk": "DDrDBdXGvfLMpUPwF7du8xEsQF7bQyCYwTYEUJoA6f31", + "origin_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "target_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428489166, + "samples": [ + 42679, + 42700, + 42692, + 42659, + 42678, + 42649, + 42689, + 42686, + 46301, + 42693, + 43131, + 42685, + 42654, + 43608, + 42685, + 43008, + 42682, + 42669, + 42656, + 42702, + 44693, + 42684, + 42671, + 42688, + 42718, + 42881, + 42706, + 42692, + 42709, + 42691, + 42698, + 43024 + ], + "sample_count": 32 + }, + { + "pubkey": "8jTXKuBfxfExhTHzgrN84Ht9NEoHorFs5QUok6X52761", + "epoch": 129, + "origin_device_pk": "127iHx1CmZitJhtdTs8ePqepLi6DaPoL44Nzrxmvr1V8", + "target_device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "link_pk": "FE6BfMxh4iwdr6VsreBeDzK2VavKNQnmjZBonRpDx4r", + "origin_device_location_pk": "8sejbB8n2vNYtmHKNQQJWnm17zjBZcDuMfwdb144W1kk", + "target_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428600597, + "samples": [ + 44532, + 44514, + 44538, + 44534, + 44509, + 44513, + 44568, + 44521, + 44496, + 44543, + 44542, + 44553, + 44536, + 44540, + 44550, + 44495, + 44553, + 44545, + 44594, + 44506, + 44553, + 44518, + 44497, + 44511, + 44526, + 44539, + 44544, + 44497, + 44565, + 44533, + 44536, + 44522 + ], + "sample_count": 32 + }, + { + "pubkey": "7RsU7Gwh9jSiC7QDQhiovh7sdoS9FhT1RQ5Hua3quh6x", + "epoch": 129, + "origin_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "target_device_pk": "2TBUsniuER8r6JB7ZNBzhmzAUAncsEdre35o5CJjnSGV", + "link_pk": "297mYzpWzPDsJn7vmjjWmtNbYUDjfKaNEDoQBbJ9mn9x", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "3BZkwwMNGZG2iSeZr1nxYX4Vxcodcft2zwNVT99BbqNC", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431395245, + "samples": [ + 17863, + 17976, + 17996, + 17912, + 17886, + 17918, + 17891, + 18075, + 17856, + 17883, + 17877, + 18337, + 17912, + 17880, + 17882, + 17877, + 17853, + 17885, + 17916, + 17860, + 17910, + 17840, + 17865, + 17856, + 18685, + 17870, + 17889, + 17900, + 17879, + 18130, + 17876, + 17914 + ], + "sample_count": 32 + }, + { + "pubkey": "9jwcyXc76iP8XaEvxhb7xTNv4F7q1rwnL5f9uWA2pyLu", + "epoch": 129, + "origin_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "target_device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "link_pk": "5VjMUTNCDzmrfHkJ7MRftuvQjAmEv4da6WCm1Aqp9zzP", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465746, + "samples": [ + 229, + 205, + 198, + 205, + 244, + 223, + 205, + 228, + 206, + 224, + 220, + 225, + 216, + 210, + 206, + 233, + 249, + 199, + 252, + 215, + 244, + 233, + 233, + 223, + 228, + 221, + 214, + 223, + 227, + 214, + 233, + 216 + ], + "sample_count": 32 + }, + { + "pubkey": "FZBLLmkDTfmgEDjfQHRB8CZEApbEZFLQGmzfVSKobLgK", + "epoch": 129, + "origin_device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "target_device_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "link_pk": "HmMvUfSW9DMYiHAANEXrTYxwX89VUPxnbcWwWWUputnk", + "origin_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428536703, + "samples": [ + 82173, + 82223, + 82206, + 82174, + 82162, + 82182, + 82174, + 82169, + 82150, + 82190, + 82139, + 82139, + 82156, + 82199, + 82166, + 82166, + 82180, + 82232, + 82152, + 82158, + 82191, + 82214, + 82161, + 82204, + 82193, + 82253, + 82164, + 82143, + 82158, + 82213, + 82168, + 82192 + ], + "sample_count": 32 + }, + { + "pubkey": "7sxANt43VxLS5eFqHPna6yECV4H9ZBvqifo6wnaSmTUP", + "epoch": 129, + "origin_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "target_device_pk": "Ddc96QyGecBsDGQ5Mtvato2UdrTQeAuuEUQBwhWpujRk", + "link_pk": "7GM3AyxDVhZ335eq7bg3iokycP7M3vRj4R2bt4VN88dr", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428596655, + "samples": [ + 31996, + 32044, + 32019, + 31984, + 31989, + 31978, + 31986, + 32008, + 31985, + 31999, + 32003, + 32016, + 32009, + 31981, + 31984, + 31972, + 31979, + 31995, + 32001, + 32013, + 31998, + 31989, + 31978, + 31997, + 31991, + 32006, + 32000, + 31997, + 32005, + 31983, + 31989, + 32024 + ], + "sample_count": 32 + }, + { + "pubkey": "HoBFz6DZ1d1R1bucdmvENPYvHisufobtYYiwNjbwJjjZ", + "epoch": 129, + "origin_device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "target_device_pk": "9M7FfYYyjM4wGinKPofZRNmQFcCjCKRbXscGBUiXvXnG", + "link_pk": "2evoLjnibgtukidrxRXy1fBruMmHJwk3nVSQGLpWcA4V", + "origin_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "target_device_location_pk": "DH7tvE5x4yusyDQcZhNpZmWFaWDdCU7HWVBZ2Fc3BVxt", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427268287, + "samples": [ + 10024, + 10009, + 10057, + 10078, + 10021, + 10045, + 10020, + 10042, + 10025, + 10060, + 10019, + 10067, + 10044, + 10016, + 10035, + 10039, + 10040, + 10038, + 10042, + 10030, + 10024, + 10030, + 10012, + 10020, + 10051, + 10065, + 10020, + 10022, + 10073, + 10095, + 10031, + 10046 + ], + "sample_count": 32 + }, + { + "pubkey": "Bh4ci4czYuCNq4yXiqiKokDJtgdTZiiEmVVD5BFbqRke", + "epoch": 129, + "origin_device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "target_device_pk": "127iHx1CmZitJhtdTs8ePqepLi6DaPoL44Nzrxmvr1V8", + "link_pk": "FE6BfMxh4iwdr6VsreBeDzK2VavKNQnmjZBonRpDx4r", + "origin_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "target_device_location_pk": "8sejbB8n2vNYtmHKNQQJWnm17zjBZcDuMfwdb144W1kk", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427668670, + "samples": [ + 44569, + 44507, + 44474, + 44493, + 44527, + 44585, + 44521, + 44560, + 44536, + 44503, + 44526, + 44492, + 44534, + 44528, + 44498, + 44504, + 44471, + 44472, + 44520, + 44513, + 44507, + 44487, + 44488, + 44545, + 44518, + 44494, + 44508, + 44529, + 44505, + 44533, + 44536, + 44513 + ], + "sample_count": 32 + }, + { + "pubkey": "2Dcn34ighDbaBu98MBVzpqzXBahjqUXi8ub1yAUvA3Ge", + "epoch": 129, + "origin_device_pk": "CqGi7i432BVjZo3vwQhnEDoCBsmiWMebbo6JE7wSSp3c", + "target_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "link_pk": "6snESc9Qw3eHZcxfVeJM84Bd18bUorcmcZ3H4jG6Wxuq", + "origin_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "target_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429196624, + "samples": [ + 460, + 503, + 487, + 469, + 506, + 511, + 490, + 478, + 465, + 516, + 492, + 473, + 477, + 477, + 500, + 510, + 495, + 483, + 519, + 502, + 532, + 504, + 478, + 500, + 466, + 493, + 486, + 483, + 498, + 507, + 474, + 526 + ], + "sample_count": 32 + }, + { + "pubkey": "J7SuucKry6xRM8qKieAzJbUF8ZibdXY7vN2i2SmhGF6Y", + "epoch": 129, + "origin_device_pk": "ASYSzEwBAPhnqj6q1io8VdCUcjfb5T1731kJPUjnHa7Y", + "target_device_pk": "ENMRWMfzzUFuMJa5R78AP4ruaGtutCkMAmsQZAUR8SmH", + "link_pk": "CfQesQBHnHWrh42poQYrsp3EYfrHYHXjX7QfBqsDMFLW", + "origin_device_location_pk": "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq", + "target_device_location_pk": "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428697433, + "samples": [ + 164, + 100, + 134, + 156, + 115, + 109, + 105, + 125, + 140, + 115, + 162, + 108, + 126, + 121, + 115, + 129, + 115, + 119, + 144, + 134, + 128, + 127, + 129, + 140, + 128, + 128, + 122, + 133, + 142, + 130, + 142, + 107 + ], + "sample_count": 32 + }, + { + "pubkey": "4NuYvt98jNjKWHnDrUnaXjKV2i1P46M2XjVWR39fyXed", + "epoch": 129, + "origin_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "target_device_pk": "BTw4t8cVo5hGAJsJpLWE35nxDexcuAbmQNZHV1rJMNqQ", + "link_pk": "YoE1ekeLwfkY6CAHm9RTXamRDC6tDzXDEs6iwMauV2m", + "origin_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143423979108, + "samples": [ + 702, + 738, + 680, + 717, + 710, + 673, + 711, + 711, + 712, + 715, + 683, + 733, + 693, + 702, + 735, + 664, + 708, + 698, + 689, + 708, + 736, + 695, + 721, + 677, + 685, + 715, + 673, + 687, + 712, + 685, + 676, + 772 + ], + "sample_count": 32 + }, + { + "pubkey": "G9JiKyDpjLD4eAg8qvrCe7SytAAadfbjy86pzdebaqM8", + "epoch": 129, + "origin_device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "target_device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "link_pk": "CqHUSTSccTRMJ4LPGkgfQLA1GmYWTqiR8LQWfqVGUeAt", + "origin_device_location_pk": "7g1K5YyfHmbVSnkHhJTsL2fLiJ1WxFdFD1vUML5WokTz", + "target_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426107011, + "samples": [ + 199, + 167, + 166, + 190, + 171, + 178, + 185, + 200, + 169, + 200, + 143, + 165, + 180, + 167, + 170, + 211, + 207, + 178, + 197, + 194, + 179, + 163, + 168, + 165, + 168, + 173, + 156, + 169, + 185, + 167, + 187, + 149 + ], + "sample_count": 32 + }, + { + "pubkey": "EDc2YxxUnFb3STg8ANhEDwvEQunQ6Z2PaoqC2dk1fKrb", + "epoch": 129, + "origin_device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "target_device_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "link_pk": "2Ees9RHezZuta2hgVJJXMWMVCDdqAyPyU1DUboUSiAze", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432583810, + "samples": [ + 90470, + 90471, + 90464, + 90455, + 90456, + 90459, + 90475, + 90470, + 90717, + 90513, + 90492, + 90433, + 90478, + 90452, + 90465, + 90492, + 90522, + 90506, + 90448, + 90473, + 90499, + 90486, + 90508, + 90446, + 90434, + 90439, + 90481, + 90463, + 90469, + 90482, + 90458, + 90467 + ], + "sample_count": 32 + }, + { + "pubkey": "47UJ3xhggEvisofWYuhomGhGJHbcDh2FZs9tc8QSr81r", + "epoch": 129, + "origin_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "target_device_pk": "DW4kmVTZrb2tAggT915P3W5vgfC28BmYVTKYnAQPx32s", + "link_pk": "G4ST8z1Y34EHPDGCZhVKTgrmcL33wK2j6JeewDFuUVow", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431395196, + "samples": [ + 349, + 326, + 358, + 316, + 387, + 334, + 354, + 335, + 344, + 338, + 301, + 316, + 390, + 403, + 324, + 296, + 322, + 320, + 301, + 343, + 350, + 361, + 353, + 305, + 320, + 352, + 296, + 363, + 330, + 331, + 327, + 352 + ], + "sample_count": 32 + }, + { + "pubkey": "3BcispCrrdh2LC6RwyhYe71nJCqJ23duX9hyH4zP811K", + "epoch": 129, + "origin_device_pk": "6VywMdq9TggmKcNUHoEyGmhrmLqRw4FGa8G5C5bM9nr1", + "target_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "link_pk": "Ck3z6oWrXvrMVHvViWDPJYQuJW9EWqs2TVZWPgA76dXV", + "origin_device_location_pk": "5FVgFpww2FyftFamYqLEHjoq7AYCVWUWtWaWRxuh6rP4", + "target_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424083088, + "samples": [ + 12453, + 12424, + 12418, + 12439, + 12482, + 12415, + 12450, + 12450, + 12409, + 12407, + 12405, + 12424, + 12451, + 12434, + 12417, + 12413, + 12442, + 12425, + 12619, + 12426, + 12413, + 12433, + 12444, + 12425, + 12408, + 12425, + 12419, + 12433, + 12423, + 12486, + 12419, + 12478 + ], + "sample_count": 32 + }, + { + "pubkey": "EdmjmJyGegGNQprj5KG39Bvyy7aviHM3Jhnh83DkUKJG", + "epoch": 129, + "origin_device_pk": "2XrHv68pxYtsheKX1K2cCsCsMmfb2VDbJMNraLax98Ff", + "target_device_pk": "UUi9EmbmizNvUkYUZBtyUjwFtp5adkjRgkcoUyhnvmu", + "link_pk": "EpyBqeZ2mF3Py6kKLBBMTvH3MJe8S49GP8KxZPYRuK5S", + "origin_device_location_pk": "6d1k85c2xARsJFdBC9tgRRFH1iWRZnZaJvs9AiRowYo1", + "target_device_location_pk": "ELZqQoJv9MMtrt4iq6wjMHpyRmBi8ENzgEa97U9ixPLE", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429551767, + "samples": [ + 18104, + 18951, + 18175, + 18127, + 18289, + 18990, + 18081, + 18159, + 18068, + 18084, + 18069, + 18065, + 18057, + 18072, + 18064, + 18158, + 18137, + 18064, + 18067, + 18077, + 18053, + 18098, + 18073, + 18063, + 18060, + 18091, + 18062, + 18225, + 18561, + 18065, + 18064, + 18095 + ], + "sample_count": 32 + }, + { + "pubkey": "95mLuuXYM6g4BAVrh1HsYDoX3bCo7ZdRaTCJFZshKQg6", + "epoch": 129, + "origin_device_pk": "CgX1gLM5VPS9pzS2Dhmhm5sGhj84GKxmP2vZy35otYom", + "target_device_pk": "DLhiDiskfhpbqPgLVEY8MLwaB8uxmsQ55tNrX9vpqDwe", + "link_pk": "H1wHxbyXGj1TqKTsKsUdUACcUiSNbnjNbipwhtJY6Xrr", + "origin_device_location_pk": "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4", + "target_device_location_pk": "22fDArnRLgyEiebZMKzbzmCG17zxJ6HPJdzWbzzBFaMW", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427157495, + "samples": [ + 1561, + 154, + 122, + 155, + 162, + 145, + 127, + 127, + 145, + 139, + 171, + 209, + 111, + 205, + 150, + 141, + 193, + 134, + 158, + 177, + 150, + 196, + 168, + 166, + 145, + 165, + 185, + 186, + 149, + 152, + 125, + 161 + ], + "sample_count": 32 + }, + { + "pubkey": "8VRAEdZAfc2JTeyGhQNXkA2t182noixaYVdkvJuxQHhe", + "epoch": 129, + "origin_device_pk": "DcyYy7A4Af8dh72CMs2yiqTo8jerdhXb9jmY1LcSU7u6", + "target_device_pk": "6WjPZwrMrZgwuEJMdyMAewvwSVig6HF5EVjCuF9LeJMm", + "link_pk": "4r82w57HQbr9AH23mmeW9rhgtquMdxvzYCxf5gBuX4dj", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "64TqjyFA9y2qDJc1Bk7EtURQRjT3H9g6D6EXQbqLrj6o", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426291698, + "samples": [ + 118, + 123, + 120, + 148, + 108, + 122, + 127, + 137, + 119, + 113, + 183, + 152, + 129, + 119, + 136, + 158, + 165, + 126, + 123, + 112, + 128, + 150, + 111, + 112, + 136, + 123, + 127, + 116, + 118, + 143, + 123, + 117 + ], + "sample_count": 32 + }, + { + "pubkey": "3WDEYHVP7t5DFqfRNuqnPpfU3cKqTs9spEiGpcK7gKeE", + "epoch": 129, + "origin_device_pk": "6VywMdq9TggmKcNUHoEyGmhrmLqRw4FGa8G5C5bM9nr1", + "target_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "link_pk": "2jGY7sRd8MdJLAuGncyG7FAJQWyoHE43rYcbK41Fu4vv", + "origin_device_location_pk": "5FVgFpww2FyftFamYqLEHjoq7AYCVWUWtWaWRxuh6rP4", + "target_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424083097, + "samples": [ + 8577, + 8523, + 8541, + 8537, + 8570, + 8541, + 8536, + 8567, + 8540, + 8531, + 8539, + 8536, + 8546, + 8535, + 8540, + 8570, + 8573, + 8550, + 8532, + 8550, + 8571, + 8536, + 8506, + 8549, + 8538, + 8547, + 8561, + 8534, + 8560, + 8541, + 8552, + 8538 + ], + "sample_count": 32 + }, + { + "pubkey": "6aRSxd89fGbD9DKmYJzC2Fy1dicSGLDcde14zJgRh2f3", + "epoch": 129, + "origin_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "target_device_pk": "2AvqMdvf5tmsvS2DsJZD16c7vtCDS8Fx83mg1RueipvY", + "link_pk": "36DajDue7EeALsXMnPD7VgHjU4CBxBdWoQcsMJuxtDNa", + "origin_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "target_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429508646, + "samples": [ + 18726, + 18765, + 18709, + 18733, + 18903, + 18931, + 19582, + 19296, + 18738, + 18952, + 18781, + 18743, + 18732, + 18729, + 20796, + 18719, + 18708, + 18778, + 18731, + 18778, + 18743, + 18710, + 18740, + 18712, + 18736, + 18786, + 18729, + 18720, + 18709, + 18714, + 18740, + 18714 + ], + "sample_count": 32 + }, + { + "pubkey": "EcM6LycXysf1rEWXKhhwSjYzYruV16ZSWQL5ZPVNdmwA", + "epoch": 129, + "origin_device_pk": "9Lkn7hnX2pm4pLzyj4QoCi9Kd3oNkpZ35651Fcj5h71E", + "target_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "link_pk": "9iSeeEXQqumPpefJQn3L5We1FwtcVRgZ87Bzy5v72SU2", + "origin_device_location_pk": "9mSvergSFRj6ij4fQUqn3sZazhwPLC7MhngFxz9BEqWX", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427469004, + "samples": [ + 7034, + 7022, + 7074, + 7068, + 7066, + 7047, + 7046, + 7067, + 7062, + 7033, + 7024, + 7040, + 7052, + 7027, + 7040, + 7047, + 7067, + 7026, + 7029, + 7032, + 7045, + 7041, + 7027, + 7045, + 7035, + 7039, + 7028, + 7066, + 7071, + 7055, + 7080, + 7022 + ], + "sample_count": 32 + }, + { + "pubkey": "2PuewoL8HBULsUK1tXMeK8K9bf1sYv7wN5XtX9gbvjBb", + "epoch": 129, + "origin_device_pk": "48p9HYhMNMu8rwjBgPgKUJjr8LSMJx1DCAbBMnVewAVr", + "target_device_pk": "6WjPZwrMrZgwuEJMdyMAewvwSVig6HF5EVjCuF9LeJMm", + "link_pk": "AWsXPWzNAbuCAX3Cw6v5vWWbStwoxh41PNobfMQwojJT", + "origin_device_location_pk": "BhapEuF9xoTgLWNP9iWwziSFYzXwbtSbXNsxJyySMrmf", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425632194, + "samples": [ + 148, + 156, + 155, + 170, + 125, + 132, + 145, + 146, + 127, + 165, + 126, + 152, + 168, + 149, + 145, + 159, + 152, + 171, + 122, + 151, + 163, + 144, + 146, + 123, + 141, + 120, + 150, + 154, + 124, + 132, + 134, + 125 + ], + "sample_count": 32 + }, + { + "pubkey": "CFNJ8BXbi3qj5NQzMqxCnN2eQWYgTUitb4HCF7W7mE4u", + "epoch": 129, + "origin_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "target_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "link_pk": "9sM8S2YW4xCnpnn8z6W7SnoV7Anukf2crX4TRgkXyLxW", + "origin_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "target_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429552556, + "samples": [ + 5637, + 5682, + 5636, + 5633, + 5644, + 5666, + 5666, + 5656, + 5645, + 5648, + 5665, + 5644, + 5628, + 5637, + 5675, + 5644, + 5640, + 5699, + 5685, + 5707, + 5641, + 5643, + 5682, + 5650, + 5629, + 5662, + 5641, + 5667, + 5675, + 5644, + 5645, + 5648 + ], + "sample_count": 32 + }, + { + "pubkey": "FhdpxN11Nhiayrf6HKz3jvceqnAQgfZSnLptnNZssSRv", + "epoch": 129, + "origin_device_pk": "3EUTjtzdJFG9PFp9j39cxvY8zAWtFUkUjrzWQ8GsUvRD", + "target_device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "link_pk": "Bf2bFHK1uaCCwqbA6BHbRKACHXqMrog7S9MY539GpHgE", + "origin_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "target_device_location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "origin_device_agent_pk": "H6TzLFei8eXpH9g65HNvoBGn81e7BRQvSS2i8uxLxxgJ", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427915604, + "samples": [ + 423, + 389, + 456, + 376, + 456, + 400, + 413, + 424, + 453, + 391, + 374, + 426, + 395, + 393, + 433, + 398, + 445, + 399, + 384, + 444, + 451, + 450, + 413, + 447, + 425, + 418, + 426, + 448, + 414, + 402, + 425, + 411 + ], + "sample_count": 32 + }, + { + "pubkey": "6Xbu7amCvBSJXdqyvx7uPSJhj533iLwQ2hnJLXA9VXee", + "epoch": 129, + "origin_device_pk": "6WjPZwrMrZgwuEJMdyMAewvwSVig6HF5EVjCuF9LeJMm", + "target_device_pk": "A1WWZhApXFAzCgCVjnZLwBHCaWBC41UUh7Cw3o96Vfx9", + "link_pk": "4pgEW1XDahLuwjsuBkfes7KMbteGSzYSR9rmJs5krr9N", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425852749, + "samples": [ + 13504, + 13531, + 13510, + 13524, + 13516, + 13553, + 13502, + 13525, + 13545, + 13552, + 13514, + 13554, + 13534, + 13513, + 13516, + 13519, + 13525, + 13514, + 13521, + 13508, + 13496, + 13520, + 13494, + 13512, + 13557, + 13532, + 13518, + 13529, + 13509, + 13527, + 13534, + 13499 + ], + "sample_count": 32 + }, + { + "pubkey": "2ZRyMTdGKcFuJps8qNu4W9z5t7ynwG5y5UrUsT512ccf", + "epoch": 129, + "origin_device_pk": "AE5tZ5VZdkvQNTg44AY57QiLu9mvoToShtAEqEK68hPX", + "target_device_pk": "4wusXr7UXdX7b4j6LUVYiW5VU1CRnQkSoQACgq9vM1r9", + "link_pk": "J4A6iB4SYxcgQ9GHNFfCq6ygLA6s8A57RyfKjDsscWGT", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "CepfuwR988f64wqmmQoNtsTnSjtMFToo5KUZH6dcjMTX", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425796366, + "samples": [ + 98694, + 98674, + 98682, + 98733, + 98681, + 98655, + 98674, + 98711, + 98694, + 98688, + 98696, + 98693, + 98699, + 98681, + 98687, + 98672, + 98700, + 98714, + 98704, + 98728, + 98739, + 98702, + 98673, + 98675, + 98681, + 98695, + 98686, + 98721, + 98672, + 98685, + 98671, + 98700 + ], + "sample_count": 32 + }, + { + "pubkey": "BjrJAjXF9Y9frsEA5vs1v9mc4k16uMLUpCx5HLNgse6k", + "epoch": 129, + "origin_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "target_device_pk": "GphgLkA7JDVtkDQZCiDrwrDvaUs8r8XczEae1KkV6CGQ", + "link_pk": "8vkYpXaBW8RuknJqHHxhg1SsvKCLokHJ6WgTpSGgfgT8", + "origin_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "target_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429508649, + "samples": [ + 414, + 405, + 352, + 368, + 370, + 384, + 411, + 367, + 374, + 412, + 400, + 428, + 378, + 384, + 385, + 364, + 359, + 392, + 375, + 378, + 347, + 368, + 354, + 392, + 372, + 411, + 432, + 379, + 383, + 399, + 383, + 413 + ], + "sample_count": 32 + }, + { + "pubkey": "9VFpGydraJAZQKHGjSNEs6H64ehhFEGcSn98SZvku6wp", + "epoch": 129, + "origin_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "target_device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "link_pk": "5Q928Fc5bjvMad6tDAtwXxuezJP1jJ9eKSEsFJN3EzqE", + "origin_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425745490, + "samples": [ + 5852, + 5796, + 5829, + 5844, + 5869, + 5832, + 5816, + 5829, + 5812, + 5810, + 5835, + 5825, + 5825, + 5837, + 5868, + 5838, + 5834, + 5852, + 5838, + 5815, + 5832, + 5839, + 5837, + 5861, + 5832, + 5833, + 5862, + 5856, + 5855, + 5887, + 5823, + 5876 + ], + "sample_count": 32 + }, + { + "pubkey": "5ZC4dWH9hpreQpv3jMwzB5Nvb3FGzmVygazf8y3Feaw5", + "epoch": 129, + "origin_device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "target_device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "link_pk": "4akCMp6aQGtbRMSns8exFwtiqaoTAaos785eHvJgx3o2", + "origin_device_location_pk": "8a5WNgBA7hNprZDBSMrMUYB3QjiRfGknrZ2hxSJ3X6F2", + "target_device_location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432095208, + "samples": [ + 746, + 783, + 755, + 782, + 787, + 768, + 762, + 839, + 774, + 799, + 759, + 792, + 792, + 771, + 810, + 764, + 744, + 774, + 768, + 767, + 804, + 823, + 814, + 786, + 790, + 794, + 794, + 807, + 771, + 786, + 777, + 799 + ], + "sample_count": 32 + }, + { + "pubkey": "BmNw57wk5gz5kHCw5Ej25XiNvczVWNFAFZdrdri3ZuUn", + "epoch": 129, + "origin_device_pk": "pem7vfRADmANUPvMqz5gwkz6UbJkHJQvsA4aKSF9Ave", + "target_device_pk": "2AvqMdvf5tmsvS2DsJZD16c7vtCDS8Fx83mg1RueipvY", + "link_pk": "DmGsJkmDeBWazNps4Y2YDK7KPWG4GXog2kBtQghsjNCu", + "origin_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "target_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427494907, + "samples": [ + 277, + 124, + 137, + 243, + 127, + 126, + 147, + 152, + 117, + 177, + 126, + 184, + 143, + 154, + 149, + 158, + 138, + 139, + 135, + 109, + 130, + 127, + 154, + 150, + 114, + 113, + 179, + 148, + 167, + 120, + 145, + 117 + ], + "sample_count": 32 + }, + { + "pubkey": "GHqMo1gtioAnmxEMDCGQCtJt85YcbsDkRxhB6dawKR3Z", + "epoch": 129, + "origin_device_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "target_device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "link_pk": "8wQCpckuDYHHQNM2cbLN2KgNjLT9EwbCAuegZuZy8AMr", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433633963, + "samples": [ + 82454, + 82428, + 82444, + 82430, + 82421, + 82414, + 82472, + 82404, + 82421, + 82415, + 82421, + 82457, + 82443, + 82415, + 82424, + 82425, + 82433, + 82435, + 82435, + 82444, + 82414, + 82446, + 82463, + 82434, + 82462, + 82453, + 82443, + 82434, + 82478, + 82456, + 82436, + 82413 + ], + "sample_count": 32 + }, + { + "pubkey": "6UGESrFLtAzo7f7Hx1yBzUtQzcNaw7vWxX2iVnKnCcxf", + "epoch": 129, + "origin_device_pk": "A1WWZhApXFAzCgCVjnZLwBHCaWBC41UUh7Cw3o96Vfx9", + "target_device_pk": "6WjPZwrMrZgwuEJMdyMAewvwSVig6HF5EVjCuF9LeJMm", + "link_pk": "4pgEW1XDahLuwjsuBkfes7KMbteGSzYSR9rmJs5krr9N", + "origin_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429169124, + "samples": [ + 13503, + 13494, + 13499, + 13545, + 13504, + 13500, + 13496, + 13529, + 13547, + 13518, + 13531, + 13544, + 13532, + 13524, + 13530, + 13505, + 13534, + 13538, + 13506, + 13546, + 22151, + 13498, + 13513, + 13523, + 13548, + 13537, + 13504, + 13516, + 13502, + 13500, + 13522, + 13560 + ], + "sample_count": 32 + }, + { + "pubkey": "EkcGpMfg6BeyLh4onSAJWzLoJMSx1CxyfWR52Zi91ys1", + "epoch": 129, + "origin_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "target_device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "link_pk": "3B9NhDBJ1sJEptuuE2xF8CMT6GdXspbNni1KeGYMsKhN", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428596672, + "samples": [ + 98736, + 98741, + 98749, + 98771, + 98736, + 98721, + 98774, + 98806, + 98747, + 98756, + 98742, + 98780, + 98748, + 98775, + 98788, + 98745, + 98796, + 98750, + 98773, + 98821, + 98736, + 98791, + 98798, + 98767, + 98775, + 98760, + 98730, + 98734, + 98828, + 98798, + 98738, + 98799 + ], + "sample_count": 32 + }, + { + "pubkey": "AHTWQ9UUeyCEVMRouUjrVZf7wowYfUYJdsPPhHz19cxp", + "epoch": 129, + "origin_device_pk": "Ebbzp9HgohXmrbJMYdydyrnmwzoYMkR6W7AgXunoTr2R", + "target_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "link_pk": "Aq1vfKKLfYdiCz1wz1x3uc9xepaZ1hcMHZ2JTBsPZ2eZ", + "origin_device_location_pk": "Fx4bTA1DW8nEkS998eRuhQoKKmqevdALcNs8ibCj2RaH", + "target_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431685429, + "samples": [ + 59590, + 59536, + 59522, + 59522, + 59524, + 59536, + 59598, + 59525, + 59626, + 59536, + 59548, + 59589, + 59529, + 59562, + 59567, + 59576, + 59521, + 59533, + 59526, + 59525, + 59546, + 59561, + 59549, + 59553, + 59542, + 59538, + 59582, + 59567, + 59557, + 59557, + 59541, + 59564 + ], + "sample_count": 32 + }, + { + "pubkey": "3QiLYxPjsdSFLsMdJSQU8VRpXPSCYyfTQT9honZZ5woU", + "epoch": 129, + "origin_device_pk": "9LFtjDzohKvCBzSquQD4YtL3HwuvkKBDE7KSzb8ztV2b", + "target_device_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "link_pk": "H6TRtoGZpyvU8tNyKN8YgY1zSqumrU2hdXy2R8KszpUy", + "origin_device_location_pk": "9oBZnBX4BPrSDgQ4Rz8PxYGuMGp7dW4CUyCwPE2ficDZ", + "target_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429154463, + "samples": [ + 7831, + 7887, + 7843, + 7863, + 7835, + 7808, + 7836, + 7855, + 7821, + 7812, + 7815, + 7814, + 7849, + 7827, + 7864, + 7839, + 7847, + 7817, + 7852, + 7880, + 7850, + 7835, + 7823, + 7846, + 7827, + 7846, + 7859, + 7847, + 7821, + 7819, + 7846, + 7845 + ], + "sample_count": 32 + }, + { + "pubkey": "99pCvCS5xPyUgCnZJvu6ahwWGuWNZoPzU3Ei4SJDfkAb", + "epoch": 129, + "origin_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "target_device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "link_pk": "Ca2Aj5RZnbrfWHU5jjSYZdWx7CZfuKoC8dxEEWTgJFx2", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "Ga9FVdnt99y3idLkthMw2LEJ2QA3WtUBKdM5MUQKnZwq", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465737, + "samples": [ + 136, + 125, + 164, + 155, + 247, + 167, + 116, + 150, + 129, + 196, + 133, + 142, + 160, + 164, + 182, + 179, + 121, + 119, + 190, + 169, + 208, + 184, + 157, + 153, + 150, + 149, + 166, + 171, + 158, + 160, + 156, + 155 + ], + "sample_count": 32 + }, + { + "pubkey": "BsD5Hcw9NC21USPHayA3yZ6qHZww2zieqsJYS67BAwmU", + "epoch": 129, + "origin_device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "target_device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "link_pk": "GBefoHkadgE4kR6R4goKmeZNGTn6GX5Wr2RpYGFS9AFr", + "origin_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "target_device_location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430626665, + "samples": [ + 160, + 172, + 164, + 154, + 148, + 156, + 161, + 125, + 142, + 186, + 166, + 147, + 158, + 149, + 129, + 170, + 161, + 157, + 163, + 131, + 184, + 157, + 137, + 151, + 158, + 197, + 167, + 183, + 135, + 122, + 161, + 183 + ], + "sample_count": 32 + }, + { + "pubkey": "F2eWtfKtzkFah3QYUrgM9WA4GvqUmBnu1A9abLPFn9ey", + "epoch": 129, + "origin_device_pk": "Cgn84CWvpGbh5L6an4YgS6Q6wTZaZPW7nqNLdptQPxgV", + "target_device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "link_pk": "VhDy3ieaY93vc9xwkVdvZV8ATg8kwYTLAVmSYhsGKVh", + "origin_device_location_pk": "E8hhYdAvrYTPk8xxpRsmh1BayVLMwptM2ismsrQJpSmV", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429389116, + "samples": [ + 16416, + 16397, + 16394, + 16401, + 16385, + 16385, + 16392, + 16448, + 16418, + 16420, + 16425, + 16404, + 16401, + 16425, + 16399, + 16394, + 16420, + 16420, + 16410, + 16423, + 16413, + 16431, + 16438, + 16388, + 16407, + 16399, + 16402, + 16456, + 16397, + 16390, + 16445, + 16435 + ], + "sample_count": 32 + }, + { + "pubkey": "3VBJtTMNBUUZKyByjeGm5jGRtohkXGJgQCmjvPTxnE5w", + "epoch": 129, + "origin_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "target_device_pk": "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2", + "link_pk": "31N1k5feogjR5zDux9U6opBEjwtuJ6qzqNrmpKRHugvt", + "origin_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "target_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432759516, + "samples": [ + 80626, + 80594, + 80584, + 80570, + 80568, + 80580, + 80601, + 80619, + 80610, + 80642, + 80584, + 80623, + 80584, + 80615, + 80609, + 80582, + 80588, + 80628, + 80595, + 80616, + 80643, + 80566, + 80541, + 80519, + 80609, + 80619, + 80610, + 80616, + 80600, + 80576, + 80580, + 80598 + ], + "sample_count": 32 + }, + { + "pubkey": "GriBLwae7FAJdL5iepiTtA3JMwxvGPwXidJmHC7VXxAA", + "epoch": 129, + "origin_device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "target_device_pk": "DLajvcrHuZpbrJKY31Bgdd7oymCADDUPN1N77Rvd2QxN", + "link_pk": "7KUWgPjbPLpLMAjZq7BYioUxVeXYJrPvEL6TNeMDcwY2", + "origin_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "target_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433856287, + "samples": [ + 130, + 161, + 206, + 157, + 111, + 152, + 123, + 129, + 124, + 125, + 136, + 146, + 156, + 145, + 145, + 152, + 158, + 112, + 170, + 150, + 131, + 175, + 157, + 114, + 111, + 148, + 119, + 149, + 111, + 148, + 228, + 190 + ], + "sample_count": 32 + }, + { + "pubkey": "FdnXacaDtQpZ3tMb7c13zTBkpurm7Hf7wyyFQ8dzDm3A", + "epoch": 129, + "origin_device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "target_device_pk": "Cgn84CWvpGbh5L6an4YgS6Q6wTZaZPW7nqNLdptQPxgV", + "link_pk": "VhDy3ieaY93vc9xwkVdvZV8ATg8kwYTLAVmSYhsGKVh", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "E8hhYdAvrYTPk8xxpRsmh1BayVLMwptM2ismsrQJpSmV", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428125773, + "samples": [ + 16427, + 16501, + 16454, + 16463, + 16418, + 16434, + 16403, + 16453, + 16453, + 16423, + 16446, + 16428, + 16426, + 16472, + 16498, + 16474, + 16452, + 16444, + 16429, + 16462, + 16435, + 16427, + 16449, + 16399, + 16466, + 16426, + 16404, + 16446, + 16473, + 16442, + 16425, + 16447 + ], + "sample_count": 32 + }, + { + "pubkey": "85vXCqWUkgyyfTxxiM1W73B4L5Q5PcRgciM2QnWDuV3n", + "epoch": 129, + "origin_device_pk": "7YKkAaXLD5XyjUc3JR9MECSKRN9q7kMnzKT3c4jFkZEh", + "target_device_pk": "E9yGW6LkdvbiCoRoJx63GBn4yWZaKEDirxGqs4oTPPpy", + "link_pk": "9kEpEZQfXYFjSCvMsMu1gksdpE7PSmHVfmgngh1BbcXj", + "origin_device_location_pk": "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q", + "target_device_location_pk": "BxEPAbcARmCaWct6TAiW1ugYq2edBUga8ToLZ9sf4D12", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424175063, + "samples": [ + 743, + 759, + 752, + 739, + 758, + 759, + 710, + 700, + 724, + 765, + 742, + 772, + 747, + 732, + 754, + 750, + 734, + 734, + 735, + 771, + 738, + 758, + 736, + 765, + 750, + 746, + 758, + 749, + 714, + 728, + 747, + 719 + ], + "sample_count": 32 + }, + { + "pubkey": "H1WL2ow5FZJJLkTL65u52UYi8FTLZTprR1LHTeEkefeR", + "epoch": 129, + "origin_device_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "target_device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "link_pk": "Fn2EJucjUakS99N9D4MFcykP7W8uiZ9PmCzBihfBi51s", + "origin_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "target_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428436381, + "samples": [ + 116, + 153, + 121, + 143, + 144, + 129, + 120, + 125, + 142, + 140, + 116, + 141, + 138, + 137, + 123, + 127, + 168, + 110, + 134, + 142, + 171, + 146, + 127, + 111, + 158, + 113, + 125, + 120, + 140, + 146, + 164, + 105 + ], + "sample_count": 32 + }, + { + "pubkey": "FeaxVEbZxTwUdWDhq5vAkTJHvrCrjgtrRxuXvenVqRFc", + "epoch": 129, + "origin_device_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "target_device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "link_pk": "2Ees9RHezZuta2hgVJJXMWMVCDdqAyPyU1DUboUSiAze", + "origin_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428436384, + "samples": [ + 90443, + 90433, + 90477, + 90481, + 90441, + 90471, + 90478, + 90472, + 90522, + 90447, + 90448, + 90487, + 90471, + 90469, + 90443, + 90476, + 90438, + 90472, + 90443, + 90470, + 90450, + 90507, + 90466, + 90503, + 90444, + 90446, + 90481, + 90467, + 90472, + 90524, + 90465, + 90438 + ], + "sample_count": 32 + }, + { + "pubkey": "FrqgfwsrEt9rgX82BcoATRcwqU1wpsCdEWAmPZbsJSGk", + "epoch": 129, + "origin_device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "target_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "link_pk": "38AC4EEGwbjt9gTmgzSY9PXrC9RHV7wAeJoaTyCoxB7Y", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432583784, + "samples": [ + 135, + 151, + 115, + 163, + 189, + 121, + 138, + 161, + 163, + 155, + 145, + 150, + 142, + 108, + 171, + 124, + 162, + 153, + 170, + 159, + 186, + 156, + 149, + 132, + 154, + 183, + 136, + 152, + 133, + 128, + 119, + 125 + ], + "sample_count": 32 + }, + { + "pubkey": "6fZS3k7Zk2HQV5rh9STKN5dqUhC3x2uUXL99mBfJ8qk6", + "epoch": 129, + "origin_device_pk": "DESzDP8GkSTpQLkrUegLkt4S2ynGfZX5bTDzZf3sEE58", + "target_device_pk": "3CTmBQeNF6LQZzaLbYj6jbhCztcsLuzzJeByfrhXTaXU", + "link_pk": "jLpSzAwgdhe5yMi4vCdemqNPJZaNhsMwXD3k2QL78hz", + "origin_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "target_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428436375, + "samples": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "sample_count": 32 + }, + { + "pubkey": "3ZEVmvYzCtAesXdzvJ4E1LFVJACzqYcwZ1KAtKxva3gv", + "epoch": 129, + "origin_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "target_device_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "link_pk": "B7qNZ1r7yXdLoEHb8eGvuPUdsVYoKUVgTPQsYqnqDBBQ", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465701, + "samples": [ + 150, + 153, + 149, + 130, + 156, + 128, + 139, + 161, + 128, + 123, + 162, + 154, + 159, + 131, + 112, + 162, + 136, + 167, + 160, + 130, + 141, + 124, + 174, + 137, + 161, + 138, + 149, + 174, + 137, + 129, + 134, + 118 + ], + "sample_count": 32 + }, + { + "pubkey": "B9dLK4RJBzDsDthzmgpmCFwbmMyi1V7bcscQ9YHv5R6s", + "epoch": 129, + "origin_device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "target_device_pk": "9PsbdMKcfmiHHruNTV2neyMtqfkKcNscJEJNmMBnFM68", + "link_pk": "ER7YPJAEd5dFqrELBPJPEfHfaZSw7NigvkqBeKp4ajKs", + "origin_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "target_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429513920, + "samples": [ + 33585, + 36280, + 33771, + 36609, + 35832, + 34641, + 33570, + 33588, + 33551, + 33600, + 33567, + 33572, + 33555, + 35118, + 34890, + 35013, + 36137, + 34766, + 33619, + 34404, + 36305, + 35935, + 36493, + 40171, + 34841, + 34932, + 34897, + 33629, + 34200, + 34615, + 37402, + 33831 + ], + "sample_count": 32 + }, + { + "pubkey": "H45JFCKLNfGjjyjVPQSz8joHWFtf8mq7u1scDh3NPLom", + "epoch": 129, + "origin_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "target_device_pk": "EKMfgyPsnVzhBtVrDkfU65M2hodauQzWtu6mHB9wLx35", + "link_pk": "6uF5TBjXQXxkjhJ2Y9vGB3fxiyUtcK5Bqw3wrdssxRFq", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465717, + "samples": [ + 60096, + 60127, + 60232, + 60096, + 60070, + 60129, + 60094, + 60126, + 60132, + 60074, + 60118, + 60127, + 60085, + 60116, + 60158, + 60121, + 60119, + 60158, + 60083, + 60076, + 60141, + 60074, + 60068, + 60137, + 60154, + 60108, + 60117, + 60097, + 60097, + 60110, + 60098, + 60105 + ], + "sample_count": 32 + }, + { + "pubkey": "HvJCezhC16VV82ndYvFtYq4yq5ewABjh41UBQ9EP3okB", + "epoch": 129, + "origin_device_pk": "BTw4t8cVo5hGAJsJpLWE35nxDexcuAbmQNZHV1rJMNqQ", + "target_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "link_pk": "YoE1ekeLwfkY6CAHm9RTXamRDC6tDzXDEs6iwMauV2m", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424403388, + "samples": [ + 698, + 688, + 687, + 753, + 764, + 708, + 710, + 737, + 702, + 716, + 709, + 716, + 679, + 739, + 693, + 717, + 710, + 704, + 677, + 686, + 758, + 703, + 722, + 734, + 721, + 733, + 668, + 682, + 699, + 752, + 688, + 699 + ], + "sample_count": 32 + }, + { + "pubkey": "EALLeKmifuxbHF3qR4HNc8ShfBhTQWYawNuaYh8yVTzX", + "epoch": 129, + "origin_device_pk": "9M7FfYYyjM4wGinKPofZRNmQFcCjCKRbXscGBUiXvXnG", + "target_device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "link_pk": "2evoLjnibgtukidrxRXy1fBruMmHJwk3nVSQGLpWcA4V", + "origin_device_location_pk": "DH7tvE5x4yusyDQcZhNpZmWFaWDdCU7HWVBZ2Fc3BVxt", + "target_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431072284, + "samples": [ + 10063, + 10064, + 10043, + 10069, + 10032, + 10041, + 10058, + 10064, + 10050, + 10043, + 10062, + 10016, + 10034, + 10034, + 10049, + 10062, + 10048, + 10035, + 10066, + 10050, + 10072, + 10072, + 10021, + 10031, + 10092, + 10086, + 10016, + 10050, + 10017, + 10020, + 10026, + 10039 + ], + "sample_count": 32 + }, + { + "pubkey": "C9EnyrXH9gcGkGaDu1gB3rNnjJr1d8Wd5GWW6HHyi6na", + "epoch": 129, + "origin_device_pk": "ENMRWMfzzUFuMJa5R78AP4ruaGtutCkMAmsQZAUR8SmH", + "target_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_pk": "5Psm9gSZjLvfskWq3DSBnqcKNypFaLp3diURBrLUXaMT", + "origin_device_location_pk": "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425402222, + "samples": [ + 108114, + 108046, + 108086, + 108081, + 108133, + 108105, + 108043, + 108073, + 108090, + 108144, + 108068, + 108101, + 108092, + 108069, + 108065, + 108107, + 108116, + 108101, + 108087, + 108103, + 108091, + 108103, + 108095, + 108084, + 108065, + 108082, + 108089, + 108091, + 108054, + 108064, + 108078, + 108084 + ], + "sample_count": 32 + }, + { + "pubkey": "8mKiS6dDpWZR8LgqDwU6qAPMK3XfgEymxD5ZtXHpbaxZ", + "epoch": 129, + "origin_device_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "target_device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "link_pk": "4jWgCo3rVDa61eaG7kBnRt5fbmnS6sug848XFsgBQC4N", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429272160, + "samples": [ + 163, + 166, + 126, + 133, + 127, + 110, + 119, + 170, + 151, + 142, + 167, + 143, + 148, + 160, + 141, + 139, + 150, + 168, + 144, + 188, + 161, + 138, + 152, + 112, + 153, + 164, + 106, + 163, + 164, + 127, + 145, + 169 + ], + "sample_count": 32 + }, + { + "pubkey": "Ft4GvmfPuPx8zWqfEi9wsYymsTQ8dZXv5fSJm4CkhnjH", + "epoch": 129, + "origin_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "target_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "link_pk": "A5WCW8Tc3TW5VZXhoCZELimuCnwXzW8VTnK1wiZB1q8Y", + "origin_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432759510, + "samples": [ + 174, + 161, + 132, + 156, + 160, + 161, + 154, + 128, + 143, + 128, + 135, + 141, + 123, + 134, + 126, + 128, + 133, + 158, + 148, + 160, + 182, + 133, + 130, + 168, + 173, + 144, + 142, + 146, + 155, + 144, + 138, + 182 + ], + "sample_count": 32 + }, + { + "pubkey": "Gb6T3r62BYp9LdLjh3D7Sfi12zjvkvmhGM2GrvyDmN6", + "epoch": 129, + "origin_device_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "target_device_pk": "9LFtjDzohKvCBzSquQD4YtL3HwuvkKBDE7KSzb8ztV2b", + "link_pk": "H6TRtoGZpyvU8tNyKN8YgY1zSqumrU2hdXy2R8KszpUy", + "origin_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "target_device_location_pk": "9oBZnBX4BPrSDgQ4Rz8PxYGuMGp7dW4CUyCwPE2ficDZ", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427205086, + "samples": [ + 7804, + 7827, + 7835, + 7808, + 7838, + 7845, + 7820, + 7838, + 7835, + 7847, + 7833, + 7843, + 7813, + 7858, + 7826, + 7857, + 7850, + 7823, + 7851, + 7800, + 7853, + 7849, + 7851, + 7872, + 7835, + 7837, + 7881, + 7824, + 7844, + 7858, + 7813, + 7811 + ], + "sample_count": 32 + }, + { + "pubkey": "59BDkguTvZDyjo2YrWnhfBwDDSMh6pb6mCY5CCwqSbjL", + "epoch": 129, + "origin_device_pk": "HGRoBFv4vbU7mN5oJUTU9Z1h36fnUTUx2QyMrxyuimFY", + "target_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "link_pk": "GpsVKCeQW1CLeLfy9VCSKQUpQv2UAcM5jXaojuQyeiDt", + "origin_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426189408, + "samples": [ + 7886, + 7940, + 7908, + 7862, + 7914, + 7912, + 7890, + 7878, + 7894, + 7904, + 7874, + 7878, + 7895, + 7884, + 7897, + 7892, + 7901, + 7886, + 7894, + 7895, + 7891, + 7900, + 7919, + 7888, + 7946, + 7900, + 7895, + 7896, + 7879, + 7964, + 7874, + 7918 + ], + "sample_count": 32 + }, + { + "pubkey": "55Z1JhNkDxXZYzGkRxHMzoNotVo6qprwWqrdjNY9gqjk", + "epoch": 129, + "origin_device_pk": "HNVZG2GDy6AWXrbTgXd2cPZ4zw7GJoo4eq6ZPLTGbBgD", + "target_device_pk": "EKMfgyPsnVzhBtVrDkfU65M2hodauQzWtu6mHB9wLx35", + "link_pk": "DJ1sw7jUiZRvseynGGy5rvPiT1ybzpgMGoxnkrNuFU31", + "origin_device_location_pk": "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn", + "target_device_location_pk": "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432130519, + "samples": [ + 116, + 115, + 150, + 157, + 114, + 155, + 134, + 139, + 151, + 134, + 124, + 167, + 123, + 137, + 146, + 133, + 143, + 136, + 118, + 139, + 145, + 128, + 133, + 151, + 138, + 139, + 149, + 132, + 138, + 130, + 106, + 140 + ], + "sample_count": 32 + }, + { + "pubkey": "7RpQXURAEJnSB6Yu9u2hutE2GVZyEmUtG7Dbq5aUCNP4", + "epoch": 129, + "origin_device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "target_device_pk": "3CTmBQeNF6LQZzaLbYj6jbhCztcsLuzzJeByfrhXTaXU", + "link_pk": "4DcV5UtFfWz1aH6oyppMsNt3ypu3wgUNnp6VvrDM8F2C", + "origin_device_location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "target_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428404722, + "samples": [ + 17604, + 17642, + 17605, + 17632, + 17665, + 17600, + 17620, + 17654, + 17607, + 17613, + 17603, + 17620, + 17597, + 17598, + 17609, + 17642, + 17599, + 17655, + 17644, + 17613, + 17655, + 17612, + 17641, + 17661, + 17616, + 17651, + 17632, + 17625, + 17639, + 17610, + 17610, + 17679 + ], + "sample_count": 32 + }, + { + "pubkey": "6Byii6Ge2UQPg7xLq5obD9mLWTW5V15JbAvGi52yYPWU", + "epoch": 129, + "origin_device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "target_device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "link_pk": "CXeafseL5sd9KYmbKQQqmk3MzcGHwdLVLDqLbiKbpz3k", + "origin_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "target_device_location_pk": "8a5WNgBA7hNprZDBSMrMUYB3QjiRfGknrZ2hxSJ3X6F2", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430626659, + "samples": [ + 65681, + 65655, + 65638, + 65683, + 65668, + 65659, + 65642, + 65662, + 65635, + 65654, + 65681, + 65659, + 65665, + 65672, + 65672, + 65646, + 65692, + 65639, + 65706, + 65689, + 65695, + 65675, + 65670, + 65653, + 65646, + 65734, + 65675, + 65676, + 65674, + 65656, + 65672, + 65644 + ], + "sample_count": 32 + }, + { + "pubkey": "5bmx5WhbWXTgtanUD59eDVE11VWjb2YwTjLmwmkPUg1A", + "epoch": 129, + "origin_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "target_device_pk": "5VhacudbiTcMP4uB4a712bYXLhSJqzAjLEau2qJynJf2", + "link_pk": "ETLoXyDghC8FeP6CMvusqwscKsGras4MpeMVVjei29TT", + "origin_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "target_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425745458, + "samples": [ + 811, + 824, + 784, + 835, + 799, + 817, + 830, + 800, + 803, + 800, + 869, + 808, + 826, + 855, + 825, + 808, + 882, + 810, + 821, + 836, + 780, + 846, + 811, + 801, + 852, + 818, + 803, + 790, + 803, + 776, + 827, + 819 + ], + "sample_count": 32 + }, + { + "pubkey": "Fa7dajVW8pwB1G4oCD1CJAWmtTHJ3VCyXCqXDPmCmGVC", + "epoch": 129, + "origin_device_pk": "2XrHv68pxYtsheKX1K2cCsCsMmfb2VDbJMNraLax98Ff", + "target_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "link_pk": "FUFiSpDotoKxNRrt8TzfiWomrMn8iaLiVJ2rBXH3p35k", + "origin_device_location_pk": "6d1k85c2xARsJFdBC9tgRRFH1iWRZnZaJvs9AiRowYo1", + "target_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429551762, + "samples": [ + 6102, + 6102, + 6056, + 6069, + 6069, + 6114, + 6101, + 6081, + 6082, + 6090, + 6064, + 6088, + 6092, + 6097, + 6096, + 6081, + 6083, + 6099, + 6106, + 6077, + 6094, + 6051, + 6081, + 6081, + 6094, + 6074, + 6087, + 6086, + 6071, + 6068, + 6083, + 6092 + ], + "sample_count": 32 + }, + { + "pubkey": "54L3ipM1GBqgGyhNNjKN7khnEQLAyLt74sc16DVtJCsv", + "epoch": 129, + "origin_device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "target_device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "link_pk": "9m3X8KaoR6BBmicBtVKxhdXerttxhdT7PYFvT3SnPvos", + "origin_device_location_pk": "8a5WNgBA7hNprZDBSMrMUYB3QjiRfGknrZ2hxSJ3X6F2", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432095192, + "samples": [ + 82352, + 82317, + 82318, + 82331, + 82282, + 82345, + 82304, + 82282, + 82290, + 82320, + 82318, + 82302, + 82301, + 82293, + 82297, + 82328, + 82307, + 82292, + 82311, + 82297, + 82347, + 82315, + 82275, + 82339, + 82358, + 82317, + 82302, + 82336, + 82301, + 82314, + 82298, + 82342 + ], + "sample_count": 32 + }, + { + "pubkey": "DMwq4Dmzjn2kqczb9sqYVkDL9pxCPVFVqEFqDRtz1MnK", + "epoch": 129, + "origin_device_pk": "5YYidoUwgjN3r5wFT5F1Zd4YAddzuz5fwFkuNekRbo48", + "target_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "link_pk": "2AgowxodjPEDFgkxWZzkCy4YfTVT1WJiDv2ig1nfJUkk", + "origin_device_location_pk": "Fx4bTA1DW8nEkS998eRuhQoKKmqevdALcNs8ibCj2RaH", + "target_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428223318, + "samples": [ + 97764, + 97764, + 97784, + 97754, + 97787, + 97740, + 97783, + 97759, + 97749, + 97788, + 97771, + 97735, + 97771, + 97810, + 97749, + 97774, + 97753, + 97787, + 97782, + 97750, + 97781, + 97749, + 97803, + 97739, + 97743, + 97745, + 97767, + 97740, + 97733, + 97728, + 97766, + 97796 + ], + "sample_count": 32 + }, + { + "pubkey": "6yiF9aPBdfMqhZ8xZNkR7XpWCw8BFXcMz7ryhimJc3M9", + "epoch": 129, + "origin_device_pk": "BLArXrBNd1vd5ELbF133ypTpAe1GbSi8nc6DMepBUrYa", + "target_device_pk": "2XrHv68pxYtsheKX1K2cCsCsMmfb2VDbJMNraLax98Ff", + "link_pk": "2yHdPviNiFm53eYRg688otatNqx5Ewgyx5pozKtmu75M", + "origin_device_location_pk": "9ySXHhn4zheYB9FJtpCCUQBbj6RqX5NJihkyNEeb1xoN", + "target_device_location_pk": "6d1k85c2xARsJFdBC9tgRRFH1iWRZnZaJvs9AiRowYo1", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429503328, + "samples": [ + 5301, + 5287, + 5261, + 5269, + 5250, + 5265, + 5279, + 5340, + 5374, + 5249, + 5269, + 5260, + 5265, + 5246, + 5257, + 5298, + 5298, + 5343, + 5512, + 5317, + 5374, + 5263, + 5266, + 5332, + 5287, + 5281, + 5296, + 5263, + 5233, + 5250, + 5273, + 5279 + ], + "sample_count": 32 + }, + { + "pubkey": "5DhDFCXMqGNF3RNAvoZp5LkVZYF2x8BWRvEKrLVZLfEp", + "epoch": 129, + "origin_device_pk": "EKMfgyPsnVzhBtVrDkfU65M2hodauQzWtu6mHB9wLx35", + "target_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_pk": "6uF5TBjXQXxkjhJ2Y9vGB3fxiyUtcK5Bqw3wrdssxRFq", + "origin_device_location_pk": "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425715678, + "samples": [ + 60130, + 60103, + 60147, + 60112, + 60139, + 60105, + 60094, + 60083, + 60177, + 60115, + 60108, + 60068, + 60122, + 60112, + 60100, + 60128, + 60136, + 60100, + 60110, + 60112, + 60104, + 60115, + 60106, + 60104, + 60121, + 60131, + 60095, + 60141, + 60082, + 60107, + 60109, + 60128 + ], + "sample_count": 32 + }, + { + "pubkey": "36yeWGYRFAGJxse7yPbXJgAKv5RhF8jXWKAh4KGNkqri", + "epoch": 129, + "origin_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "target_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "link_pk": "4SoZf7tRjQaFZyP5nfHikjgBRMCSfukJa2fNzcMoEQZB", + "origin_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "target_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429508676, + "samples": [ + 491, + 534, + 490, + 470, + 500, + 525, + 511, + 485, + 491, + 479, + 482, + 517, + 530, + 490, + 496, + 510, + 518, + 483, + 539, + 531, + 496, + 468, + 490, + 513, + 519, + 476, + 501, + 488, + 475, + 514, + 477, + 550 + ], + "sample_count": 32 + }, + { + "pubkey": "BnpeCuMy6T8xVsdpuM4R8e966ZbtLDcyfiURfxJomXxC", + "epoch": 129, + "origin_device_pk": "HGRoBFv4vbU7mN5oJUTU9Z1h36fnUTUx2QyMrxyuimFY", + "target_device_pk": "B1JjhMNjy3HhkXvyYzq6DBNfLfLkvizftzaUrXDf7XEY", + "link_pk": "7PXaBzL9yANF7vfLg3r1T9UTSvNV6Ftc5gEj57sVEd6X", + "origin_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426189410, + "samples": [ + 18999, + 19006, + 18937, + 18998, + 18968, + 18969, + 18968, + 18992, + 19027, + 19019, + 18997, + 18988, + 19003, + 19009, + 19022, + 19004, + 19036, + 18980, + 18989, + 19028, + 18991, + 19034, + 19002, + 18981, + 19000, + 18976, + 18977, + 18982, + 19007, + 19039, + 18965, + 19011 + ], + "sample_count": 32 + }, + { + "pubkey": "7q2w3rJBkg4q5ZEeHGbyF1SUQxCpkr4XB27Zrh1pGUcN", + "epoch": 129, + "origin_device_pk": "HNVZG2GDy6AWXrbTgXd2cPZ4zw7GJoo4eq6ZPLTGbBgD", + "target_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "link_pk": "HeejcBonv8tg2d2AXPAxCRkfVhWe2HvcCaaUMt3p1g2Y", + "origin_device_location_pk": "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432130526, + "samples": [ + 9064, + 9061, + 9026, + 9024, + 9023, + 9048, + 9021, + 9078, + 9052, + 9044, + 9072, + 9070, + 9029, + 9074, + 9035, + 9060, + 9045, + 9101, + 9057, + 9081, + 9075, + 9021, + 9056, + 9029, + 9024, + 9057, + 9044, + 9046, + 9066, + 9076, + 9064, + 9048 + ], + "sample_count": 32 + }, + { + "pubkey": "7kNzKDBYdtHocmkkDfFSMoZGpDU9qLukgHX6JV2YFV3W", + "epoch": 129, + "origin_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "target_device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "link_pk": "JBmy4A7XxuB2dgBFGzRTvK8if1oNQW6Hx3DDGut8D8ZP", + "origin_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "target_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432461554, + "samples": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "sample_count": 32 + }, + { + "pubkey": "34gpGbRWmP4e8gHVnyCHyBGMC5U9ZPLxxpFRHjFdhJWL", + "epoch": 129, + "origin_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "target_device_pk": "9Lkn7hnX2pm4pLzyj4QoCi9Kd3oNkpZ35651Fcj5h71E", + "link_pk": "9iSeeEXQqumPpefJQn3L5We1FwtcVRgZ87Bzy5v72SU2", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "9mSvergSFRj6ij4fQUqn3sZazhwPLC7MhngFxz9BEqWX", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431395228, + "samples": [ + 7084, + 7106, + 7035, + 7062, + 7062, + 7039, + 7036, + 7070, + 7059, + 7054, + 7038, + 7023, + 7078, + 7063, + 7037, + 7047, + 7062, + 7025, + 7040, + 7049, + 7036, + 7050, + 7050, + 7035, + 7049, + 7083, + 7036, + 7063, + 7073, + 7032, + 7052, + 7115 + ], + "sample_count": 32 + }, + { + "pubkey": "7pXVJsExG2mAD18Wh36Si2UF4GAdRigXQJvnEhndcT6T", + "epoch": 129, + "origin_device_pk": "E1nCHKhKkgSodz8MMR1oxu7yXyhjZJMunPZzoZQrfYwD", + "target_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "link_pk": "Cxp6rJ1NpjNTqe6RnkkJHBmpMqPnTnmgiRZxgPhqourd", + "origin_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "target_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "origin_device_agent_pk": "DChABzQ4uRpTy8Huvz8RZBDPddSVU9sHoGJmMiik14ST", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428818427, + "samples": [ + 150, + 110, + 142, + 100, + 135, + 170, + 112, + 117, + 125, + 129, + 138, + 121, + 162, + 110, + 151, + 126, + 121, + 110, + 144, + 128, + 138, + 116, + 135, + 141, + 116, + 146, + 126, + 157, + 113, + 157, + 170, + 117 + ], + "sample_count": 32 + }, + { + "pubkey": "PfY5HYZjJa9o2H84jYZNJ7WhFHBHPRfkXeUABB8BfDr", + "epoch": 129, + "origin_device_pk": "9PsbdMKcfmiHHruNTV2neyMtqfkKcNscJEJNmMBnFM68", + "target_device_pk": "Ddc96QyGecBsDGQ5Mtvato2UdrTQeAuuEUQBwhWpujRk", + "link_pk": "HT4cNCCCU64M4R4kzhP6RodGVrHdh4SqrMu3XXyHW8e6", + "origin_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "target_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429262391, + "samples": [ + 110, + 109, + 112, + 124, + 143, + 175, + 105, + 117, + 106, + 131, + 106, + 117, + 111, + 126, + 120, + 170, + 116, + 115, + 141, + 125, + 130, + 111, + 116, + 125, + 137, + 112, + 147, + 114, + 120, + 105, + 115, + 147 + ], + "sample_count": 32 + }, + { + "pubkey": "mX1cEAxcjmKWLwvoXpxszqwEdxGbPRw3wPRyVXMPez3", + "epoch": 129, + "origin_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "target_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "link_pk": "6mjRAWpgWFyeVt9EwD6SpR1s9noyepcMabj3hJBvTjqu", + "origin_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427830639, + "samples": [ + 16049, + 16014, + 16082, + 16316, + 16021, + 16482, + 16027, + 16014, + 16054, + 16079, + 16066, + 16045, + 16061, + 16068, + 16010, + 16071, + 16067, + 16044, + 16052, + 16043, + 16047, + 16041, + 16088, + 16061, + 16055, + 16047, + 16082, + 16073, + 16063, + 16030, + 16089, + 16037 + ], + "sample_count": 32 + }, + { + "pubkey": "29euXxAUxMS3GqSnMELE52GEHkzuNJL4dZLjfw2Y337k", + "epoch": 129, + "origin_device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "target_device_pk": "GphgLkA7JDVtkDQZCiDrwrDvaUs8r8XczEae1KkV6CGQ", + "link_pk": "7NMRSZ8AjmLYXmSLdn9vmoMisM8tYdxrk77jt6Zr19b8", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432583790, + "samples": [ + 5839, + 5821, + 5846, + 5881, + 5838, + 5926, + 5807, + 5826, + 5796, + 5855, + 5876, + 5849, + 5849, + 5808, + 5867, + 5818, + 5827, + 5869, + 5864, + 5843, + 5860, + 5875, + 5844, + 5840, + 5888, + 5830, + 5831, + 5855, + 5855, + 5891, + 5836, + 5801 + ], + "sample_count": 32 + }, + { + "pubkey": "8vpEP2EvKt1XNK2m2r9TErDZfWstJXYrPFSSedDgxDQD", + "epoch": 129, + "origin_device_pk": "A1WWZhApXFAzCgCVjnZLwBHCaWBC41UUh7Cw3o96Vfx9", + "target_device_pk": "ASPPyWXei4wZJnxBkm2ejf75s6tUZREq4UBvNtHcyVSz", + "link_pk": "HRqgCF2UdyRoH2b7vVxyf2w2oBKFmxtMzkZRLpoUTDBq", + "origin_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "target_device_location_pk": "3xKLEjXi9vThfFnCNdgB2E2uFzeiF8FnaDtt4P6G2H2w", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429169111, + "samples": [ + 26330, + 26368, + 26387, + 26332, + 26390, + 26344, + 26393, + 26378, + 26372, + 26382, + 26345, + 26351, + 26365, + 26397, + 26370, + 26356, + 26381, + 26366, + 26374, + 26357, + 26408, + 26434, + 26391, + 26395, + 26384, + 26366, + 26354, + 26353, + 26367, + 26353, + 26371, + 26354 + ], + "sample_count": 32 + }, + { + "pubkey": "9oiJ2VWapbmCkT2BPkPE3usiir663zXJ3zEWp237wGeq", + "epoch": 129, + "origin_device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "target_device_pk": "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2", + "link_pk": "AsfPXyjY4dgNkUtepE6LCRzKcXroZ3z8XtR5XEGnc4GG", + "origin_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "target_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433856274, + "samples": [ + 180, + 216, + 178, + 133, + 151, + 171, + 135, + 174, + 149, + 162, + 158, + 151, + 197, + 192, + 180, + 120, + 190, + 118, + 148, + 154, + 168, + 157, + 158, + 166, + 196, + 170, + 181, + 165, + 176, + 160, + 154, + 159 + ], + "sample_count": 32 + }, + { + "pubkey": "2pMH19dYWj1aRKSDuFN9avMvLnHStXrN1HKomk8yVABH", + "epoch": 129, + "origin_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "target_device_pk": "2AFsyp34CFTS5UZJpoqYXvyzFnRW49Q5s7xMEtFFEDVm", + "link_pk": "2DPrStYZzCKo3QSiHLFSHr1Ktk7rCYyLqe2jN5z5PU7v", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424653347, + "samples": [ + 335, + 370, + 355, + 315, + 320, + 321, + 317, + 356, + 336, + 339, + 303, + 344, + 353, + 324, + 376, + 320, + 300, + 326, + 315, + 327, + 342, + 353, + 347, + 343, + 392, + 342, + 338, + 345, + 301, + 307, + 332, + 345 + ], + "sample_count": 32 + }, + { + "pubkey": "DBkwCharFBfb1Cf91BC4ZQYUdjU6tydfZjPBWvQLkVBk", + "epoch": 129, + "origin_device_pk": "6WjPZwrMrZgwuEJMdyMAewvwSVig6HF5EVjCuF9LeJMm", + "target_device_pk": "48p9HYhMNMu8rwjBgPgKUJjr8LSMJx1DCAbBMnVewAVr", + "link_pk": "AWsXPWzNAbuCAX3Cw6v5vWWbStwoxh41PNobfMQwojJT", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "BhapEuF9xoTgLWNP9iWwziSFYzXwbtSbXNsxJyySMrmf", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425852765, + "samples": [ + 159, + 149, + 145, + 141, + 145, + 144, + 150, + 161, + 151, + 165, + 148, + 143, + 162, + 128, + 131, + 152, + 150, + 126, + 124, + 157, + 137, + 140, + 180, + 138, + 114, + 144, + 139, + 162, + 178, + 127, + 134, + 174 + ], + "sample_count": 32 + }, + { + "pubkey": "DBAMXmFPJSGtT18PXvLQWv2y6TwqeR4wSmZ66UnWNezT", + "epoch": 129, + "origin_device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "target_device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "link_pk": "889avwHAHyCvg9c8ALBfC91yQY7w6ncg9pjwdDivRsUZ", + "origin_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "target_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429513939, + "samples": [ + 147, + 132, + 194, + 126, + 149, + 168, + 143, + 159, + 138, + 210, + 166, + 175, + 154, + 147, + 185, + 165, + 163, + 229, + 168, + 165, + 180, + 153, + 138, + 293, + 139, + 156, + 166, + 157, + 167, + 175, + 152, + 178 + ], + "sample_count": 32 + }, + { + "pubkey": "7P2S7nk8xizUqcfuAZD76TJLBXpHRgaWZnTNw6qn1XbP", + "epoch": 129, + "origin_device_pk": "BTw4t8cVo5hGAJsJpLWE35nxDexcuAbmQNZHV1rJMNqQ", + "target_device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "link_pk": "9pKT1jVfzgtUGeLe5kLurfvWvRizyUh35zw7jp6jAuLt", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424403368, + "samples": [ + 64185, + 64194, + 64248, + 64246, + 64237, + 64226, + 64204, + 64196, + 64208, + 64180, + 64226, + 64200, + 64197, + 64284, + 64200, + 64186, + 64201, + 64224, + 64178, + 64235, + 64197, + 64195, + 64202, + 64223, + 64204, + 64210, + 64214, + 64195, + 64190, + 64197, + 67348, + 64217 + ], + "sample_count": 32 + }, + { + "pubkey": "69HwzGnogDwVjb4aNqHznDB1jp2aKSapWDSeaQbZJDsc", + "epoch": 129, + "origin_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "target_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "link_pk": "EewiYE6NxAjaYq7uVGtame4fsFtCvLJ87zLpsWeayRSW", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424653355, + "samples": [ + 192, + 200, + 231, + 178, + 194, + 200, + 188, + 217, + 217, + 160, + 170, + 227, + 170, + 206, + 230, + 211, + 212, + 192, + 210, + 199, + 220, + 195, + 177, + 211, + 202, + 195, + 169, + 218, + 219, + 206, + 178, + 206 + ], + "sample_count": 32 + }, + { + "pubkey": "9EdPXGbS24qqQV89gQbmQEt7pFYa9wsDFVoULk6P2pTt", + "epoch": 129, + "origin_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "target_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_pk": "T1zE2oyWqfYpVW5NUuimeg6UyBGLtN6sSn7QDkozYJA", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425915578, + "samples": [ + 68566, + 68569, + 68575, + 68608, + 68576, + 68558, + 68614, + 68566, + 68603, + 68584, + 68554, + 68602, + 68563, + 68559, + 68560, + 68576, + 68578, + 68611, + 68565, + 68607, + 68577, + 68582, + 68580, + 68626, + 68568, + 68584, + 68608, + 68576, + 68561, + 68591, + 68642, + 68627 + ], + "sample_count": 32 + }, + { + "pubkey": "DHq2DPFzX2qiwJc9tb5FQHyyMNoSL9PHc1Wn4FL3TgBi", + "epoch": 129, + "origin_device_pk": "2AvqMdvf5tmsvS2DsJZD16c7vtCDS8Fx83mg1RueipvY", + "target_device_pk": "pem7vfRADmANUPvMqz5gwkz6UbJkHJQvsA4aKSF9Ave", + "link_pk": "DmGsJkmDeBWazNps4Y2YDK7KPWG4GXog2kBtQghsjNCu", + "origin_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "target_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429533788, + "samples": [ + 127, + 159, + 126, + 121, + 163, + 144, + 145, + 127, + 137, + 159, + 177, + 149, + 138, + 143, + 174, + 158, + 164, + 143, + 128, + 151, + 159, + 148, + 177, + 147, + 139, + 140, + 156, + 106, + 150, + 136, + 137, + 134 + ], + "sample_count": 32 + }, + { + "pubkey": "79XgASf3EiProZBmy5Cs3E2VSRrjkpuNAvNQ1zvVrBqV", + "epoch": 129, + "origin_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "target_device_pk": "HNVZG2GDy6AWXrbTgXd2cPZ4zw7GJoo4eq6ZPLTGbBgD", + "link_pk": "HeejcBonv8tg2d2AXPAxCRkfVhWe2HvcCaaUMt3p1g2Y", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425915598, + "samples": [ + 9064, + 9048, + 9098, + 9062, + 9121, + 9033, + 9020, + 9052, + 9066, + 9029, + 9051, + 9046, + 9055, + 9045, + 9068, + 9017, + 9063, + 9069, + 9050, + 9034, + 9056, + 9084, + 9058, + 9066, + 9087, + 9066, + 9040, + 9100, + 9062, + 9062, + 9066, + 9062 + ], + "sample_count": 32 + }, + { + "pubkey": "FpLdf3gShQyLa95F8DuV2uU9LpLnW3zbmgMynmbvZXke", + "epoch": 129, + "origin_device_pk": "QYt2wx7Xvfn7DfVTVJjPATGUQc56L9vkdgL5dGkRE1n", + "target_device_pk": "A1WWZhApXFAzCgCVjnZLwBHCaWBC41UUh7Cw3o96Vfx9", + "link_pk": "4aE9d9UF25o6ZNvkuEEaHu14qw4fh6yBXN6Reom9Vd7Y", + "origin_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "target_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429256882, + "samples": [ + 114, + 122, + 110, + 112, + 108, + 111, + 133, + 155, + 141, + 128, + 136, + 120, + 158, + 133, + 115, + 122, + 116, + 134, + 121, + 121, + 129, + 134, + 116, + 159, + 149, + 143, + 154, + 115, + 155, + 126, + 316, + 133 + ], + "sample_count": 32 + }, + { + "pubkey": "CiigFyKyEdte8q24pZo1ejdiqPdtYtD24yqtJpatSZda", + "epoch": 129, + "origin_device_pk": "DLhiDiskfhpbqPgLVEY8MLwaB8uxmsQ55tNrX9vpqDwe", + "target_device_pk": "CgX1gLM5VPS9pzS2Dhmhm5sGhj84GKxmP2vZy35otYom", + "link_pk": "H1wHxbyXGj1TqKTsKsUdUACcUiSNbnjNbipwhtJY6Xrr", + "origin_device_location_pk": "22fDArnRLgyEiebZMKzbzmCG17zxJ6HPJdzWbzzBFaMW", + "target_device_location_pk": "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4", + "origin_device_agent_pk": "HQ8pqcfexhftBNjYhzDZJuGnCz869fCxcZbni6jqmbo", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426592475, + "samples": [ + 185, + 165, + 153, + 154, + 162, + 226, + 169, + 132, + 121, + 138, + 142, + 163, + 142, + 190, + 112, + 133, + 103, + 150, + 142, + 142, + 145, + 203, + 138, + 141, + 126, + 133, + 162, + 142, + 146, + 136, + 146, + 148 + ], + "sample_count": 32 + }, + { + "pubkey": "3ANAA1wZvq7mDeD69kiYaGQR5fyt9XuLBuAYsnMfWRLU", + "epoch": 129, + "origin_device_pk": "E9yGW6LkdvbiCoRoJx63GBn4yWZaKEDirxGqs4oTPPpy", + "target_device_pk": "7YKkAaXLD5XyjUc3JR9MECSKRN9q7kMnzKT3c4jFkZEh", + "link_pk": "9kEpEZQfXYFjSCvMsMu1gksdpE7PSmHVfmgngh1BbcXj", + "origin_device_location_pk": "BxEPAbcARmCaWct6TAiW1ugYq2edBUga8ToLZ9sf4D12", + "target_device_location_pk": "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q", + "origin_device_agent_pk": "64TqjyFA9y2qDJc1Bk7EtURQRjT3H9g6D6EXQbqLrj6o", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143449273828, + "samples": [ + 747, + 747, + 716, + 762, + 748, + 735, + 736, + 749, + 768, + 743, + 707, + 712, + 729, + 717, + 713, + 721, + 742, + 741, + 729, + 741, + 726, + 733, + 715, + 722, + 757, + 784, + 752, + 746, + 792, + 756, + 760, + 749 + ], + "sample_count": 32 + }, + { + "pubkey": "4hEuBFoeTRRmJFk5H7MQorrNyM7AQx8TfNJASxreMHh5", + "epoch": 129, + "origin_device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "target_device_pk": "4wusXr7UXdX7b4j6LUVYiW5VU1CRnQkSoQACgq9vM1r9", + "link_pk": "FVWE6sAb2KaHNANJm1CGQjhzWzMLZxqs9Wt7BkDoKiX4", + "origin_device_location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "target_device_location_pk": "CepfuwR988f64wqmmQoNtsTnSjtMFToo5KUZH6dcjMTX", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426454540, + "samples": [ + 199, + 154, + 192, + 157, + 157, + 154, + 143, + 158, + 163, + 183, + 173, + 154, + 176, + 181, + 161, + 151, + 189, + 149, + 163, + 236, + 144, + 178, + 144, + 183, + 154, + 165, + 168, + 161, + 235, + 188, + 143, + 219 + ], + "sample_count": 32 + }, + { + "pubkey": "DR6eW5C2vBSS4cCJhxnrDqmUPiaUHuWD9F7iYokA1oU3", + "epoch": 129, + "origin_device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "target_device_pk": "3EUTjtzdJFG9PFp9j39cxvY8zAWtFUkUjrzWQ8GsUvRD", + "link_pk": "Bf2bFHK1uaCCwqbA6BHbRKACHXqMrog7S9MY539GpHgE", + "origin_device_location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "target_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426454560, + "samples": [ + 449, + 430, + 428, + 450, + 461, + 424, + 412, + 453, + 443, + 427, + 441, + 452, + 425, + 441, + 439, + 417, + 465, + 489, + 442, + 409, + 456, + 435, + 437, + 455, + 411, + 421, + 461, + 396, + 444, + 497, + 441, + 418 + ], + "sample_count": 32 + }, + { + "pubkey": "DNR9Nmt3oWVPx5zxRu4UrZ5bijcmjp3YgDZUWpSTn56P", + "epoch": 129, + "origin_device_pk": "RiLEARFF7V6PNhzaEJ2UTEz569wwTmRtNjCn6ndwZH2", + "target_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "link_pk": "31N1k5feogjR5zDux9U6opBEjwtuJ6qzqNrmpKRHugvt", + "origin_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "target_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432883939, + "samples": [ + 80635, + 80536, + 80616, + 80596, + 80567, + 80605, + 80594, + 80582, + 80599, + 80574, + 80568, + 80594, + 80577, + 80547, + 80609, + 80629, + 80561, + 80574, + 80553, + 80600, + 80572, + 80566, + 80512, + 80590, + 80616, + 80660, + 80637, + 80549, + 80518, + 80557, + 80609, + 80580 + ], + "sample_count": 32 + }, + { + "pubkey": "CYMy46VnRiAhgkZ6aFo6RwguXMH4zPuuJL56DJNzcNfm", + "epoch": 129, + "origin_device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "target_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_pk": "6yYfjJHaZMWj828pAchWRCjGApnMVCSqFNa2iPhBE2DE", + "origin_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429513930, + "samples": [ + 5363, + 5358, + 5362, + 5373, + 5357, + 5387, + 5368, + 5411, + 5380, + 5399, + 5399, + 5374, + 5376, + 5371, + 5419, + 5400, + 5338, + 5385, + 5373, + 5355, + 5387, + 5354, + 5345, + 5489, + 5366, + 5378, + 5378, + 5379, + 5395, + 5352, + 5391, + 5392 + ], + "sample_count": 32 + }, + { + "pubkey": "87LywfTX7cTqGVFRG4ognWwYTGZqDCQKsBUq1tBqxr4L", + "epoch": 129, + "origin_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "target_device_pk": "6WjPZwrMrZgwuEJMdyMAewvwSVig6HF5EVjCuF9LeJMm", + "link_pk": "3HV6rX6KAPXuKWTmxiWmE7WTc9oXVfEVyNja4qYDATz6", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428596648, + "samples": [ + 153, + 160, + 161, + 190, + 135, + 142, + 143, + 149, + 130, + 160, + 160, + 211, + 130, + 128, + 172, + 106, + 134, + 153, + 137, + 128, + 161, + 112, + 131, + 161, + 131, + 127, + 142, + 171, + 158, + 126, + 176, + 170 + ], + "sample_count": 32 + }, + { + "pubkey": "8wcvNPPTwLBtxnXXVULepMrT8sE6egompcFKabewwYaa", + "epoch": 129, + "origin_device_pk": "83SQUuoufcgFYwHMEs7rXBib3NDj5t3wBxMSzznYfe4W", + "target_device_pk": "2TBUsniuER8r6JB7ZNBzhmzAUAncsEdre35o5CJjnSGV", + "link_pk": "CrHzEkpjQ7QSi8d4zGTMnhVS9kCcuaLKuY9mFJKvXyT6", + "origin_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "target_device_location_pk": "3BZkwwMNGZG2iSeZr1nxYX4Vxcodcft2zwNVT99BbqNC", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425138302, + "samples": [ + 16780, + 16837, + 16933, + 16786, + 16802, + 16806, + 16823, + 16820, + 16798, + 16807, + 16821, + 16809, + 16780, + 16794, + 16817, + 16905, + 16794, + 16765, + 16795, + 16748, + 16767, + 16807, + 16833, + 16736, + 16916, + 16786, + 16843, + 16884, + 16795, + 16869, + 16808, + 17193 + ], + "sample_count": 32 + }, + { + "pubkey": "2rUTGuYYaMwZ4DqAbAuanCd2e4PCPFfHv71NNW3Py5Fx", + "epoch": 129, + "origin_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "target_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_pk": "D14dhq5XVDyMua1eN47rh5ybiNAkz6qJTaKr3maKnSck", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431395201, + "samples": [ + 436, + 399, + 413, + 410, + 415, + 381, + 394, + 395, + 444, + 424, + 394, + 425, + 413, + 395, + 410, + 405, + 417, + 424, + 416, + 421, + 422, + 393, + 428, + 449, + 434, + 383, + 458, + 450, + 444, + 471, + 434, + 423 + ], + "sample_count": 32 + }, + { + "pubkey": "4qqE5gU9VhMYM51uA7Zh8G4BkiFVKcUhxNw8zuw3ZuXg", + "epoch": 129, + "origin_device_pk": "4wusXr7UXdX7b4j6LUVYiW5VU1CRnQkSoQACgq9vM1r9", + "target_device_pk": "AE5tZ5VZdkvQNTg44AY57QiLu9mvoToShtAEqEK68hPX", + "link_pk": "J4A6iB4SYxcgQ9GHNFfCq6ygLA6s8A57RyfKjDsscWGT", + "origin_device_location_pk": "CepfuwR988f64wqmmQoNtsTnSjtMFToo5KUZH6dcjMTX", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428787994, + "samples": [ + 98669, + 98711, + 98660, + 98712, + 98674, + 98655, + 98701, + 98661, + 98679, + 98667, + 98689, + 98659, + 98646, + 98661, + 98686, + 98682, + 98657, + 98660, + 98709, + 98683, + 98721, + 98694, + 98698, + 98705, + 98661, + 98701, + 98674, + 98679, + 98721, + 98666, + 98707, + 98686 + ], + "sample_count": 32 + }, + { + "pubkey": "2TjaFJi3pYcPAxpZVZ5fVBDiPck5wzV9GsSU3DteggHn", + "epoch": 129, + "origin_device_pk": "TVEgwqaTtPK8tV17RFeYbik8zMbocqbbtZNm2dWpXPK", + "target_device_pk": "HGRoBFv4vbU7mN5oJUTU9Z1h36fnUTUx2QyMrxyuimFY", + "link_pk": "GwoqeRvzCUjmdNgm1NCbz5u49VXPVV7fuMzWenUTSeVi", + "origin_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "target_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432632695, + "samples": [ + 112, + 119, + 160, + 112, + 137, + 152, + 129, + 139, + 127, + 149, + 111, + 126, + 151, + 142, + 108, + 140, + 105, + 115, + 139, + 148, + 110, + 133, + 140, + 117, + 162, + 111, + 139, + 153, + 133, + 158, + 108, + 155 + ], + "sample_count": 32 + }, + { + "pubkey": "FdEVA8qcbueen2FKjZVq1q5z5MJq69c1RnxqgKLDxn1M", + "epoch": 129, + "origin_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "target_device_pk": "9gGVhChduB9DezW22cvJDDeYbWddpn1vpeKZ5RKxh8Ji", + "link_pk": "AFvhUch4E6cqKssTjKGUfW3hvoAcSAEcyzkoQXhxKoFS", + "origin_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "target_device_location_pk": "8sejbB8n2vNYtmHKNQQJWnm17zjBZcDuMfwdb144W1kk", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432461576, + "samples": [ + 34403, + 34465, + 34602, + 34393, + 34437, + 34380, + 34380, + 34404, + 34400, + 34361, + 34413, + 34424, + 34403, + 34396, + 34413, + 34392, + 34400, + 34422, + 34387, + 34385, + 34377, + 34417, + 34398, + 34487, + 34402, + 34440, + 34535, + 34422, + 34389, + 34387, + 34411, + 34412 + ], + "sample_count": 32 + }, + { + "pubkey": "8yPy11FFQUwuh4wo3DtNRZdxK9NnWoRRizfb9Fnxchgg", + "epoch": 129, + "origin_device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "target_device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "link_pk": "GUEVP6ugfbZpC33sYJuB1buTxwDJjEXn8wjxMuq9xpbK", + "origin_device_location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "target_device_location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431836799, + "samples": [ + 64569, + 64530, + 64531, + 64503, + 64483, + 64491, + 64516, + 64555, + 64509, + 64518, + 64542, + 64540, + 64540, + 64579, + 64500, + 64542, + 64487, + 64551, + 64504, + 64540, + 64534, + 64587, + 64542, + 64530, + 64551, + 64513, + 64524, + 64512, + 64512, + 64534, + 64541, + 64506 + ], + "sample_count": 32 + }, + { + "pubkey": "HHrTzwxWWPKp6D53nSiS9MzgQ2woY84QW1GcPPd4NqUH", + "epoch": 129, + "origin_device_pk": "AE5tZ5VZdkvQNTg44AY57QiLu9mvoToShtAEqEK68hPX", + "target_device_pk": "CgX1gLM5VPS9pzS2Dhmhm5sGhj84GKxmP2vZy35otYom", + "link_pk": "ZCf4eHeSMA1WoKsvLNEVMoYnWcEE4GrgvP4woivFUnm", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425796358, + "samples": [ + 25377, + 25407, + 25365, + 25370, + 25401, + 25417, + 25407, + 25412, + 25380, + 25403, + 25402, + 25396, + 25371, + 25365, + 25388, + 25374, + 25363, + 25421, + 25398, + 25379, + 25384, + 25385, + 25355, + 25412, + 25390, + 25414, + 25389, + 25417, + 25381, + 25394, + 25361, + 25361 + ], + "sample_count": 32 + }, + { + "pubkey": "AKh8ETJfQzDzFRPQjdiWwRynJJ18jfW8iKvQEpTWdRgw", + "epoch": 129, + "origin_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "target_device_pk": "6VywMdq9TggmKcNUHoEyGmhrmLqRw4FGa8G5C5bM9nr1", + "link_pk": "2jGY7sRd8MdJLAuGncyG7FAJQWyoHE43rYcbK41Fu4vv", + "origin_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "target_device_location_pk": "5FVgFpww2FyftFamYqLEHjoq7AYCVWUWtWaWRxuh6rP4", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143423979124, + "samples": [ + 8548, + 8562, + 8538, + 8557, + 8556, + 8550, + 8534, + 8558, + 8551, + 8548, + 8558, + 8597, + 8546, + 8573, + 8585, + 8541, + 8587, + 8551, + 8580, + 8577, + 8553, + 8557, + 8548, + 8521, + 8531, + 8571, + 8539, + 8546, + 8558, + 8565, + 8533, + 8539 + ], + "sample_count": 32 + }, + { + "pubkey": "9qjPEpy2chJu5rGueAKnd6ZZifjZcktgbHxPk1ALUQrB", + "epoch": 129, + "origin_device_pk": "2AFsyp34CFTS5UZJpoqYXvyzFnRW49Q5s7xMEtFFEDVm", + "target_device_pk": "CqGi7i432BVjZo3vwQhnEDoCBsmiWMebbo6JE7wSSp3c", + "link_pk": "H3SDoHyBLzD72tySCHpoTVJs2PQGpFrNAa1jYhkG1eCp", + "origin_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "target_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427475675, + "samples": [ + 6788, + 6775, + 6786, + 6795, + 6772, + 6791, + 6775, + 6772, + 6766, + 6750, + 6761, + 6790, + 6768, + 6758, + 6794, + 6748, + 6778, + 6770, + 6767, + 6849, + 6777, + 6774, + 6800, + 6801, + 6820, + 6746, + 6777, + 6795, + 6734, + 6763, + 6756, + 6775 + ], + "sample_count": 32 + }, + { + "pubkey": "6ARpdZ6bY9GJuYbWRcU7GArYNuX4Gk5hn45DEBcrhcFc", + "epoch": 129, + "origin_device_pk": "TVEgwqaTtPK8tV17RFeYbik8zMbocqbbtZNm2dWpXPK", + "target_device_pk": "3CTmBQeNF6LQZzaLbYj6jbhCztcsLuzzJeByfrhXTaXU", + "link_pk": "DDrDBdXGvfLMpUPwF7du8xEsQF7bQyCYwTYEUJoA6f31", + "origin_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "target_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432632685, + "samples": [ + 42765, + 42693, + 42691, + 42715, + 42678, + 42673, + 42760, + 42668, + 42670, + 42716, + 42663, + 42680, + 42700, + 42670, + 42669, + 42698, + 42681, + 42681, + 42693, + 42760, + 42665, + 42682, + 42709, + 42684, + 42716, + 42709, + 42670, + 42682, + 42678, + 42698, + 42704, + 42680 + ], + "sample_count": 32 + }, + { + "pubkey": "FBx5J8N7LmkhryZNUmCjrRiaEqVaFvFfyJKTpYGwCWhc", + "epoch": 129, + "origin_device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "target_device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "link_pk": "J35vG3xdC7WZ2AQzs295gFktfgRdq9URwdZGCitmDJFB", + "origin_device_location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "target_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429748467, + "samples": [ + 192, + 154, + 162, + 117, + 141, + 128, + 156, + 160, + 179, + 160, + 166, + 117, + 166, + 179, + 142, + 148, + 181, + 116, + 170, + 167, + 167, + 129, + 163, + 132, + 153, + 119, + 166, + 149, + 144, + 113, + 154, + 139 + ], + "sample_count": 32 + }, + { + "pubkey": "82inYs3LfYpctzS6axsSbKnxMgptrdB6VuMreN6pkAYz", + "epoch": 129, + "origin_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "target_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "link_pk": "8XjBUfLfujKtrafLXk3SDMgsGL7hh4c3KPn32HVMFojX", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424653361, + "samples": [ + 363, + 372, + 399, + 350, + 384, + 349, + 380, + 384, + 370, + 359, + 368, + 347, + 362, + 376, + 338, + 356, + 406, + 388, + 361, + 364, + 350, + 368, + 353, + 360, + 388, + 364, + 370, + 391, + 390, + 355, + 369, + 371 + ], + "sample_count": 32 + }, + { + "pubkey": "EXYLsKSmpfuqBq9UNB6cWgt9LBi4Yp2manWkVftKVj6q", + "epoch": 129, + "origin_device_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "target_device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "link_pk": "BfrMFL2xVwGECppmQBrmCD2VkMfABr8ZtrafNVnohzET", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433633970, + "samples": [ + 176, + 136, + 134, + 123, + 139, + 163, + 152, + 144, + 122, + 124, + 130, + 134, + 114, + 126, + 137, + 165, + 151, + 136, + 157, + 129, + 151, + 180, + 119, + 144, + 135, + 115, + 134, + 146, + 139, + 140, + 161, + 129 + ], + "sample_count": 32 + }, + { + "pubkey": "CxtxMoeLoSjwBuN6La2jjPfCBCHfKPZzQtYJidXUdVR7", + "epoch": 129, + "origin_device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "target_device_pk": "CgX1gLM5VPS9pzS2Dhmhm5sGhj84GKxmP2vZy35otYom", + "link_pk": "4RaBQ5BBWmUyzGTCYUFefDKLT6os9zab4icNpBidf2th", + "origin_device_location_pk": "7g1K5YyfHmbVSnkHhJTsL2fLiJ1WxFdFD1vUML5WokTz", + "target_device_location_pk": "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426106999, + "samples": [ + 28648, + 28665, + 28629, + 28615, + 28611, + 28606, + 28619, + 28653, + 28602, + 28606, + 28638, + 28610, + 28603, + 28594, + 28628, + 28622, + 29031, + 28615, + 28633, + 28635, + 28591, + 28615, + 28610, + 28620, + 28669, + 28595, + 28651, + 28637, + 28632, + 28627, + 28618, + 28605 + ], + "sample_count": 32 + }, + { + "pubkey": "Da2VM21sGQgBpPQ9QQSZGwyBnYfMJRKgdBeNBgY9VVET", + "epoch": 129, + "origin_device_pk": "BjL4wxo9VVaFT1McpZzok7XRYzcgGxXLrHJpPQ47RYVd", + "target_device_pk": "CqGi7i432BVjZo3vwQhnEDoCBsmiWMebbo6JE7wSSp3c", + "link_pk": "J18xDPrz4ormhrXXBLb1kG6eDtMe9wHSSLozmtzEUHyQ", + "origin_device_location_pk": "CR9Fqex8eAULhXrXWRUNDKaQW7Wy52B3zGdkZsKfoocR", + "target_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432833497, + "samples": [ + 19706, + 19737, + 19819, + 19722, + 19718, + 19671, + 19677, + 19735, + 19728, + 19699, + 19807, + 19753, + 19681, + 19731, + 19703, + 19751, + 19731, + 19798, + 19689, + 19762, + 19746, + 19773, + 19702, + 19703, + 19741, + 19849, + 19712, + 19741, + 19681, + 20487, + 20001, + 19711 + ], + "sample_count": 32 + }, + { + "pubkey": "8uQ2JYtiUuMUhK4BW28UjcyUxRd5SPXrd32QUSTxcH5T", + "epoch": 129, + "origin_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "target_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "link_pk": "sUTL6T7sJzjqttcG5Eu7nwMwE8ULMcRrgMU4fjXB1R2", + "origin_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "target_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143423979143, + "samples": [ + 5594, + 5578, + 5613, + 5597, + 5607, + 5572, + 5567, + 5581, + 5580, + 5591, + 5598, + 5570, + 5581, + 5623, + 5580, + 5589, + 5576, + 5561, + 5607, + 5609, + 5612, + 5583, + 5594, + 5580, + 5589, + 5572, + 5552, + 5555, + 5576, + 5609, + 5583, + 5593 + ], + "sample_count": 32 + }, + { + "pubkey": "8QJKAgcXn4fQNnAGaD4KusuDsWcRMPwX6vh2bGb5XRaa", + "epoch": 129, + "origin_device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "target_device_pk": "7YKkAaXLD5XyjUc3JR9MECSKRN9q7kMnzKT3c4jFkZEh", + "link_pk": "6K7oDWbKHK3cF4AbpFEpM6Z9VFLuiuohGFKUMJihKB8D", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428125765, + "samples": [ + 39005, + 38972, + 38992, + 39042, + 38977, + 38971, + 38965, + 39013, + 38987, + 38975, + 38970, + 38962, + 39007, + 39007, + 38959, + 39015, + 38968, + 38976, + 38973, + 39014, + 38951, + 39001, + 38988, + 38972, + 38999, + 38973, + 39008, + 38997, + 38992, + 39022, + 38988, + 39020 + ], + "sample_count": 32 + }, + { + "pubkey": "65tn5b89JTJF9TKAdzqVf36SMJ2ibdzEh9UsCLV55HzU", + "epoch": 129, + "origin_device_pk": "BTw4t8cVo5hGAJsJpLWE35nxDexcuAbmQNZHV1rJMNqQ", + "target_device_pk": "CTTCwG765QP8ycYrX1h8hZZo7K1pvDJXPaiC9Ue1u8qV", + "link_pk": "G84ptDdcrhb75wHzzSTrTqyRKGi43L1E5TC4N5hU3Gvd", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "9gQn94Rs72oe9QRZM5i7KgACG6dXjirttbcZV75JxqH8", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424403375, + "samples": [ + 154, + 144, + 131, + 207, + 142, + 167, + 163, + 169, + 159, + 185, + 127, + 148, + 179, + 146, + 174, + 156, + 150, + 175, + 151, + 138, + 227, + 152, + 139, + 154, + 143, + 153, + 165, + 169, + 125, + 186, + 185, + 132 + ], + "sample_count": 32 + }, + { + "pubkey": "CnyfASBXspSE1B39qwgE6rZ7warmn6Gnv3Sy5ARHeULZ", + "epoch": 129, + "origin_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "target_device_pk": "FwWis5rJD6ByvJmGYcfapYuHHB4B5pgFXpz2zMDn8SKy", + "link_pk": "CsLwpagXfZnMtB6XYMX2hAxCznWftKBbtGxEjSwZpvfX", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424653339, + "samples": [ + 113, + 159, + 167, + 107, + 157, + 139, + 138, + 130, + 172, + 130, + 133, + 124, + 138, + 163, + 136, + 122, + 167, + 138, + 121, + 155, + 116, + 131, + 139, + 139, + 122, + 134, + 149, + 118, + 175, + 147, + 131, + 212 + ], + "sample_count": 32 + }, + { + "pubkey": "BoToqfy9yuZ98GoCFNEHWuFctVzZWFMQzkSx9UzhqwLx", + "epoch": 129, + "origin_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "target_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "link_pk": "9sM8S2YW4xCnpnn8z6W7SnoV7Anukf2crX4TRgkXyLxW", + "origin_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "target_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429508667, + "samples": [ + 5634, + 5655, + 5645, + 5611, + 5619, + 5631, + 5629, + 5673, + 5658, + 5655, + 5656, + 5626, + 5640, + 5649, + 5640, + 5656, + 5618, + 5627, + 5641, + 5635, + 5631, + 5631, + 5630, + 5638, + 5649, + 5639, + 5638, + 5637, + 5641, + 5627, + 5640, + 5652 + ], + "sample_count": 32 + }, + { + "pubkey": "6bPK7W8k2Hfs7ycTXYBmzxQF68CJ9ESDPHCfJXnBd31o", + "epoch": 129, + "origin_device_pk": "H6d5bUsWPYz8Aqjzguj3NwHorHrr3SuXY2hi6tezxABJ", + "target_device_pk": "CqGi7i432BVjZo3vwQhnEDoCBsmiWMebbo6JE7wSSp3c", + "link_pk": "G57tMEhyprE8Q47wvmwU4SY92w4uVP8i8Lt3ZZNGsxKa", + "origin_device_location_pk": "FYsVP5mTvwxaPZ8KxwivedKeoC3hKUicoEcAvJw34ULp", + "target_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429508654, + "samples": [ + 231, + 233, + 249, + 249, + 254, + 222, + 268, + 245, + 228, + 246, + 267, + 277, + 298, + 208, + 257, + 254, + 210, + 246, + 255, + 224, + 209, + 264, + 242, + 235, + 240, + 204, + 330, + 230, + 254, + 229, + 231, + 230 + ], + "sample_count": 32 + }, + { + "pubkey": "FzTgcwy6awmmnfVMQiHenwGwuTkCJgfmbRf9TiEpmTL1", + "epoch": 129, + "origin_device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "target_device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "link_pk": "5j4y3qgt8eqT2bKem13XzFydBN2ti7K9kEdjX5zoBnGM", + "origin_device_location_pk": "Ga9FVdnt99y3idLkthMw2LEJ2QA3WtUBKdM5MUQKnZwq", + "target_device_location_pk": "7g1K5YyfHmbVSnkHhJTsL2fLiJ1WxFdFD1vUML5WokTz", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432563145, + "samples": [ + 5121, + 5159, + 5172, + 5145, + 5172, + 5129, + 5178, + 5154, + 5147, + 5158, + 5121, + 5135, + 5191, + 5169, + 5131, + 5117, + 5163, + 5110, + 5132, + 5179, + 5134, + 5131, + 5137, + 5131, + 5145, + 5129, + 5127, + 5162, + 5144, + 5181, + 5142, + 5156 + ], + "sample_count": 32 + }, + { + "pubkey": "7pu8kY2Nk3oRThm7Fjq25k9KDqpiQYDVkYucV2gRzvya", + "epoch": 129, + "origin_device_pk": "CgX1gLM5VPS9pzS2Dhmhm5sGhj84GKxmP2vZy35otYom", + "target_device_pk": "Ddc96QyGecBsDGQ5Mtvato2UdrTQeAuuEUQBwhWpujRk", + "link_pk": "GbURiJNcdGb5E3BRqpizsQHrbYEra5fDHe5jrvhnVbxe", + "origin_device_location_pk": "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4", + "target_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427157475, + "samples": [ + 1062, + 1046, + 1059, + 1071, + 1042, + 1104, + 1075, + 1049, + 1099, + 1080, + 1080, + 1054, + 1054, + 1060, + 1065, + 1046, + 1086, + 1116, + 1106, + 1056, + 1055, + 1101, + 1078, + 1037, + 1099, + 1075, + 1041, + 1084, + 1129, + 1044, + 1079, + 1053 + ], + "sample_count": 32 + }, + { + "pubkey": "FFeVvN9mb6wz4Yk9ztmWZsRDBHha7cAjg2LwY6EMT7TP", + "epoch": 129, + "origin_device_pk": "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj", + "target_device_pk": "HGRoBFv4vbU7mN5oJUTU9Z1h36fnUTUx2QyMrxyuimFY", + "link_pk": "5LdodyAC2UtudDiE4wqifh37RX7WPUciHE5bRcHQYmP3", + "origin_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "target_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430526241, + "samples": [ + 103374, + 103431, + 103368, + 103408, + 103428, + 103402, + 103364, + 103395, + 103396, + 103385, + 103398, + 103369, + 103367, + 103389, + 103422, + 103377, + 103401, + 103368, + 103411, + 103378, + 103392, + 103388, + 103376, + 103394, + 103409, + 103430, + 103384, + 103375, + 103397, + 103361, + 103419, + 103403 + ], + "sample_count": 32 + }, + { + "pubkey": "Hj4HKXN9stQVsnMiuhb9vT6SfHZTZYDgFyfvsLp2MmFX", + "epoch": 129, + "origin_device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "target_device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "link_pk": "GBefoHkadgE4kR6R4goKmeZNGTn6GX5Wr2RpYGFS9AFr", + "origin_device_location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "target_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431836809, + "samples": [ + 172, + 146, + 153, + 185, + 160, + 135, + 154, + 165, + 148, + 138, + 118, + 122, + 168, + 174, + 115, + 211, + 185, + 162, + 143, + 180, + 148, + 164, + 166, + 170, + 157, + 165, + 167, + 170, + 134, + 109, + 152, + 206 + ], + "sample_count": 32 + }, + { + "pubkey": "mVT4zQd4r4zkExHYkmrKFj6tyikHXPpRvVNpy2vpU4S", + "epoch": 129, + "origin_device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "target_device_pk": "BTw4t8cVo5hGAJsJpLWE35nxDexcuAbmQNZHV1rJMNqQ", + "link_pk": "9pKT1jVfzgtUGeLe5kLurfvWvRizyUh35zw7jp6jAuLt", + "origin_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427268302, + "samples": [ + 64201, + 64209, + 64194, + 64183, + 64231, + 64239, + 64208, + 64198, + 64186, + 64197, + 64186, + 64197, + 64185, + 64203, + 64171, + 64181, + 64191, + 64185, + 64203, + 64208, + 64192, + 64212, + 64247, + 64197, + 64188, + 64186, + 64209, + 64186, + 64239, + 64218, + 64212, + 64218 + ], + "sample_count": 32 + }, + { + "pubkey": "5Lx3LA4BXWVL6k2PtjR6aorZ6KqQa3zSwMKu1M6TjEsq", + "epoch": 129, + "origin_device_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "target_device_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "link_pk": "4CHWAfis8nch5fpAgyb69PcZHmt9zZQ94MvDjpAVSty2", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433853336, + "samples": [ + 205, + 215, + 213, + 196, + 197, + 210, + 195, + 227, + 233, + 214, + 240, + 211, + 199, + 212, + 232, + 212, + 188, + 203, + 226, + 198, + 192, + 257, + 228, + 203, + 204, + 199, + 201, + 198, + 197, + 228, + 207, + 241 + ], + "sample_count": 32 + }, + { + "pubkey": "FwoKhAL9Bpe5ne88cAmqmmCJcVvDcVPzfsFEe1qKiVbB", + "epoch": 129, + "origin_device_pk": "UUi9EmbmizNvUkYUZBtyUjwFtp5adkjRgkcoUyhnvmu", + "target_device_pk": "2XrHv68pxYtsheKX1K2cCsCsMmfb2VDbJMNraLax98Ff", + "link_pk": "EpyBqeZ2mF3Py6kKLBBMTvH3MJe8S49GP8KxZPYRuK5S", + "origin_device_location_pk": "ELZqQoJv9MMtrt4iq6wjMHpyRmBi8ENzgEa97U9ixPLE", + "target_device_location_pk": "6d1k85c2xARsJFdBC9tgRRFH1iWRZnZaJvs9AiRowYo1", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429554715, + "samples": [ + 18082, + 18080, + 18089, + 18074, + 18057, + 18169, + 18078, + 18320, + 18065, + 18059, + 18081, + 18068, + 18067, + 18100, + 18167, + 18069, + 18078, + 18119, + 18131, + 18127, + 18087, + 18114, + 18101, + 18093, + 18103, + 18094, + 18083, + 18065, + 18087, + 18138, + 18145, + 18101 + ], + "sample_count": 32 + }, + { + "pubkey": "8Fi8WjkH6Q85hQ7st2e4NvkQhu7soozvkSjPyGuPYYeQ", + "epoch": 129, + "origin_device_pk": "7YKkAaXLD5XyjUc3JR9MECSKRN9q7kMnzKT3c4jFkZEh", + "target_device_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "link_pk": "dXoaHzUh3apD5PKxAUDdkDzZ7GUrQG1niYMjf4YK5jq", + "origin_device_location_pk": "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q", + "target_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424175027, + "samples": [ + 16470, + 16476, + 16493, + 16471, + 16542, + 16505, + 16447, + 16461, + 16715, + 16481, + 16485, + 16503, + 16512, + 16486, + 16822, + 16442, + 18705, + 16474, + 16487, + 16465, + 16444, + 16466, + 16475, + 16480, + 16473, + 16451, + 16498, + 16448, + 16471, + 16466, + 16477, + 16474 + ], + "sample_count": 32 + }, + { + "pubkey": "4XYauTDTn29exPwcJhRanKPhRoBzv5yzyXfTEpZ6GHa9", + "epoch": 129, + "origin_device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "target_device_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "link_pk": "61UDX3zAU7cZWBgyZA3xkBSzXjXhJbTPyNPM2JabWT8u", + "origin_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427268282, + "samples": [ + 203, + 174, + 170, + 256, + 231, + 202, + 169, + 169, + 216, + 232, + 169, + 211, + 217, + 188, + 194, + 170, + 216, + 182, + 189, + 219, + 180, + 167, + 239, + 206, + 209, + 202, + 208, + 208, + 185, + 210, + 218, + 169 + ], + "sample_count": 32 + }, + { + "pubkey": "CH5CkSyf2NPiBgduU6HWxSMkN6LALLJvSRjuFBaAeg3Y", + "epoch": 129, + "origin_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "target_device_pk": "ASYSzEwBAPhnqj6q1io8VdCUcjfb5T1731kJPUjnHa7Y", + "link_pk": "6b7vqaWaVS119fqKKMEVdc1o8LYHmTvskYasFp6X5b7G", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428596688, + "samples": [ + 152792, + 152787, + 152800, + 152827, + 152759, + 152765, + 152759, + 152806, + 152804, + 152779, + 152793, + 152796, + 152766, + 152746, + 152773, + 152781, + 152771, + 152761, + 152798, + 152777, + 152779, + 152796, + 152805, + 152783, + 152785, + 152768, + 152799, + 152765, + 152775, + 152762, + 152764, + 152763 + ], + "sample_count": 32 + }, + { + "pubkey": "8ySz5FpBKJjnwQx4i7sMd3aRoUNM5rbYWu16VXnTpkXr", + "epoch": 129, + "origin_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "target_device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "link_pk": "6yYfjJHaZMWj828pAchWRCjGApnMVCSqFNa2iPhBE2DE", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465725, + "samples": [ + 5349, + 5358, + 5354, + 5331, + 5341, + 5428, + 5364, + 5375, + 5363, + 5335, + 5380, + 5408, + 5335, + 5374, + 5383, + 5356, + 5379, + 5416, + 5354, + 5359, + 5404, + 5336, + 5331, + 5328, + 5438, + 5368, + 5365, + 5348, + 5362, + 5367, + 5349, + 5356 + ], + "sample_count": 32 + }, + { + "pubkey": "DXPZFq6LpveiMUc8KP4nBwVReHm5uXewJqoZMF3L1P3t", + "epoch": 129, + "origin_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "target_device_pk": "BTw4t8cVo5hGAJsJpLWE35nxDexcuAbmQNZHV1rJMNqQ", + "link_pk": "65eVRJGifcJUpjbbzazdZ17HMTmH8Jqkg3BiFWo5WwHK", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424653396, + "samples": [ + 11478, + 11532, + 11419, + 11411, + 11415, + 11424, + 11407, + 11434, + 11426, + 11397, + 11426, + 11418, + 11426, + 11405, + 11443, + 11398, + 11421, + 11416, + 11432, + 11430, + 11420, + 11454, + 11432, + 11431, + 11432, + 11431, + 11435, + 11414, + 11459, + 11413, + 11424, + 11455 + ], + "sample_count": 32 + }, + { + "pubkey": "BQGRnrM1rLZG2wcYvyfvCuDKbGmkdPggFFS3NqpkdEHj", + "epoch": 129, + "origin_device_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "target_device_pk": "AWQUQCWAR3rbJfYD6MC7ESM3stFgQnehE6N5aXEtfEnc", + "link_pk": "8cAgVftvEXrHGDw2N2M9MFnC2eQiPEWWbPT6fPdgEVoJ", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429272172, + "samples": [ + 41573, + 41576, + 41626, + 41609, + 41658, + 43833, + 41597, + 41588, + 41570, + 41549, + 41574, + 41590, + 41573, + 41571, + 41590, + 41554, + 41581, + 41560, + 41569, + 41581, + 41577, + 41553, + 42359, + 41614, + 43758, + 41567, + 41573, + 41567, + 41560, + 41556, + 41655, + 44286 + ], + "sample_count": 32 + }, + { + "pubkey": "2L2df6LGdrjUnktjBrZYBZJb9iKY1tAkCJhEWTRDwNhk", + "epoch": 129, + "origin_device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "target_device_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "link_pk": "8J4DJUr5wq1wJd8PCbr38jdF1v14ZkHmAQpfaqGWfeVk", + "origin_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "target_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427268261, + "samples": [ + 134, + 142, + 166, + 178, + 96, + 126, + 134, + 111, + 121, + 127, + 114, + 120, + 221, + 153, + 132, + 133, + 153, + 144, + 137, + 102, + 112, + 136, + 126, + 224, + 133, + 111, + 150, + 116, + 137, + 129, + 132, + 114 + ], + "sample_count": 32 + }, + { + "pubkey": "zcduvF3pRDm2B3M2rfEdVnhQ6VNkmYtdcCpW1U1Zfob", + "epoch": 129, + "origin_device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "target_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "link_pk": "5PfMcoVjuC8GSEwHS6uS4yJvVMfn5zzWo16DGVipFdmn", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432583812, + "samples": [ + 11378, + 11321, + 11324, + 11341, + 11356, + 11386, + 11356, + 11326, + 11363, + 11351, + 11384, + 11364, + 11351, + 11400, + 11331, + 11341, + 11346, + 11343, + 11338, + 11391, + 11368, + 11350, + 11355, + 11391, + 11343, + 11344, + 11405, + 11335, + 11359, + 11407, + 11358, + 11372 + ], + "sample_count": 32 + }, + { + "pubkey": "C2VmWpDNxzbLFjJXuYgNmTiCMtFwVmJ9cPeqMMrwJgiR", + "epoch": 129, + "origin_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "target_device_pk": "GARSc9a1pEQ3oKWLSP2BAYcBDwrTrNxsUVzxjCA6aoyc", + "link_pk": "4DH6VssEtHvpQEuoiKUXCpZjbPD848FjXQDHxc5Rbg78", + "origin_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "target_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427830643, + "samples": [ + 119, + 146, + 113, + 155, + 149, + 135, + 150, + 132, + 123, + 146, + 112, + 168, + 132, + 167, + 155, + 124, + 155, + 144, + 157, + 147, + 128, + 162, + 152, + 160, + 130, + 144, + 146, + 183, + 142, + 150, + 185, + 161 + ], + "sample_count": 32 + }, + { + "pubkey": "6Yo8mQoyfwswsmVNdQZVJ9cCQPnMSik5nAi2VezCwFzQ", + "epoch": 129, + "origin_device_pk": "EKMfgyPsnVzhBtVrDkfU65M2hodauQzWtu6mHB9wLx35", + "target_device_pk": "6VywMdq9TggmKcNUHoEyGmhrmLqRw4FGa8G5C5bM9nr1", + "link_pk": "H6L9WQo9g4rsKkpfZ7gxNkNmNVfHNpsqLbDBFcyr9gqw", + "origin_device_location_pk": "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn", + "target_device_location_pk": "5FVgFpww2FyftFamYqLEHjoq7AYCVWUWtWaWRxuh6rP4", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425715665, + "samples": [ + 227, + 225, + 206, + 226, + 201, + 222, + 229, + 216, + 238, + 250, + 199, + 214, + 245, + 240, + 186, + 237, + 201, + 205, + 255, + 188, + 201, + 210, + 231, + 218, + 208, + 200, + 205, + 215, + 213, + 202, + 185, + 272 + ], + "sample_count": 32 + }, + { + "pubkey": "kR77umedLXdrg4zMji2f3VF9ZGJSV1zeKtGhXzJHkqY", + "epoch": 129, + "origin_device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "target_device_pk": "GARSc9a1pEQ3oKWLSP2BAYcBDwrTrNxsUVzxjCA6aoyc", + "link_pk": "E6DjtpFgPftJvEx9Ca9A3arcJ29Ki2W2ttB1Vv3Q3mAC", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432583814, + "samples": [ + 16139, + 16154, + 16131, + 16157, + 16152, + 16111, + 16184, + 16126, + 16111, + 16128, + 16187, + 16190, + 16148, + 16228, + 16195, + 16128, + 16162, + 16199, + 16197, + 16131, + 16144, + 16146, + 16186, + 16139, + 16207, + 16179, + 16149, + 16122, + 16139, + 16148, + 16187, + 16159 + ], + "sample_count": 32 + }, + { + "pubkey": "7NnygCe2K84xHe5cNRzohRURzAjhdwzUY6C8rKTyG4sH", + "epoch": 129, + "origin_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "target_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "link_pk": "6ct2cQXAKuB8M7pT4tHJTrCEKspRs2dSqrhrYHhFwMne", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428596683, + "samples": [ + 173371, + 173358, + 173350, + 173378, + 173386, + 173350, + 173374, + 173360, + 173378, + 173365, + 173411, + 173365, + 173359, + 173388, + 173364, + 173365, + 173363, + 173354, + 173388, + 173369, + 173374, + 173378, + 173361, + 173399, + 173356, + 173354, + 173408, + 173354, + 173373, + 173393, + 173401, + 173370 + ], + "sample_count": 32 + }, + { + "pubkey": "4fbrguo5c5e3HFbrzhSDsKhKfSpRq9jFAX23JfyAqkvE", + "epoch": 129, + "origin_device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "target_device_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "link_pk": "HQNCezuCWzZcMmhFHmPywJPMGZU1WkPwfBL5YMMyW6AM", + "origin_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "target_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433856276, + "samples": [ + 5205, + 5237, + 5196, + 5209, + 5206, + 5198, + 5189, + 5285, + 5236, + 5205, + 5210, + 5240, + 5206, + 5201, + 5197, + 5213, + 5250, + 5223, + 5222, + 5189, + 5211, + 5220, + 5212, + 5229, + 5201, + 5202, + 5227, + 5217, + 5215, + 5198, + 5210, + 5232 + ], + "sample_count": 32 + }, + { + "pubkey": "DjXbQaaTqZFJQcqqt62i536RAtmjNC44qnqxghwkjACd", + "epoch": 129, + "origin_device_pk": "pem7vfRADmANUPvMqz5gwkz6UbJkHJQvsA4aKSF9Ave", + "target_device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "link_pk": "GfiWgCnSSEsmui4M2f3EsVusUuCdEoC1TZf4TzQJcfFo", + "origin_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "target_device_location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427495054, + "samples": [ + 131858, + 131909, + 131908, + 131881, + 131864, + 131910, + 131865, + 131874, + 131885, + 131892, + 131852, + 131862, + 131864, + 131866, + 131853, + 131885, + 131926, + 131926, + 131876, + 131916, + 131870, + 131897, + 131863, + 131897, + 131888, + 131877, + 131878, + 131897, + 131872, + 131912, + 131875, + 131893 + ], + "sample_count": 32 + }, + { + "pubkey": "D9Cgamz1H8ZzHELoRUy8tVcaYqtmiosCrpDhDYECYnPW", + "epoch": 129, + "origin_device_pk": "CqGi7i432BVjZo3vwQhnEDoCBsmiWMebbo6JE7wSSp3c", + "target_device_pk": "2AFsyp34CFTS5UZJpoqYXvyzFnRW49Q5s7xMEtFFEDVm", + "link_pk": "H3SDoHyBLzD72tySCHpoTVJs2PQGpFrNAa1jYhkG1eCp", + "origin_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "target_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429196636, + "samples": [ + 6813, + 6769, + 6763, + 6794, + 6774, + 6795, + 6784, + 6804, + 6749, + 6771, + 6774, + 6773, + 6748, + 6788, + 6796, + 6794, + 6780, + 6761, + 6850, + 6798, + 6817, + 6788, + 6784, + 6761, + 6786, + 6801, + 6782, + 6785, + 6799, + 6792, + 6808, + 6781 + ], + "sample_count": 32 + }, + { + "pubkey": "6JE9UhTYugwJJPdhVppnqK7vjKEikofbuS5h5shEZwwp", + "epoch": 129, + "origin_device_pk": "AWQUQCWAR3rbJfYD6MC7ESM3stFgQnehE6N5aXEtfEnc", + "target_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_pk": "8PTZtrzQ17sQBNNyRu1wxcbkjVLqnRTa3vkMRyBGxdXT", + "origin_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429230531, + "samples": [ + 17757, + 17802, + 17788, + 17827, + 17803, + 17774, + 17771, + 17753, + 17795, + 17774, + 17769, + 17754, + 17771, + 17810, + 17759, + 17777, + 17766, + 17761, + 17748, + 17756, + 17756, + 17770, + 17770, + 17742, + 17797, + 17767, + 17770, + 17753, + 17748, + 17805, + 17761, + 17805 + ], + "sample_count": 32 + }, + { + "pubkey": "DUrN9ydebNRGRQkZ1tZtxn2fuVpJaeSzhSJJwTQvPHqJ", + "epoch": 129, + "origin_device_pk": "Cgn84CWvpGbh5L6an4YgS6Q6wTZaZPW7nqNLdptQPxgV", + "target_device_pk": "QYt2wx7Xvfn7DfVTVJjPATGUQc56L9vkdgL5dGkRE1n", + "link_pk": "3HVDzUf5c1qr2CEMkLgigZhPjBA4KFVSkjExtaHRfM9f", + "origin_device_location_pk": "E8hhYdAvrYTPk8xxpRsmh1BayVLMwptM2ismsrQJpSmV", + "target_device_location_pk": "dWdN7Mnbuut6qw9jqwkfqidcqj9v9LcWvzVLdHqQjZp", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429389128, + "samples": [ + 155, + 116, + 136, + 129, + 99, + 120, + 122, + 125, + 120, + 123, + 130, + 115, + 117, + 162, + 147, + 109, + 135, + 115, + 138, + 133, + 122, + 152, + 134, + 112, + 160, + 130, + 136, + 133, + 141, + 132, + 140, + 119 + ], + "sample_count": 32 + }, + { + "pubkey": "4uqWHhSCGkfiw6RonVSygeBcX4LhYyE7H9y77w7CHAq", + "epoch": 129, + "origin_device_pk": "4sXvs2kxGhfbChZS48xGosZkV8fJwxYc1gwHnSR3fS6F", + "target_device_pk": "BLArXrBNd1vd5ELbF133ypTpAe1GbSi8nc6DMepBUrYa", + "link_pk": "F4xaxs6ERY8VHyyNMctT4jJFegConpepygrQG6bEtb44", + "origin_device_location_pk": "BNoP4em7REgS7igJ9cAnYpDW5w9SdRHWB9Bf6oNf3PJ5", + "target_device_location_pk": "9ySXHhn4zheYB9FJtpCCUQBbj6RqX5NJihkyNEeb1xoN", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429558774, + "samples": [ + 21284, + 21270, + 21298, + 21320, + 21313, + 21298, + 21281, + 21343, + 21306, + 21300, + 21287, + 21364, + 21273, + 21265, + 21276, + 21342, + 21354, + 21268, + 21315, + 21285, + 21485, + 21321, + 21279, + 21302, + 21279, + 21272, + 21266, + 21268, + 21292, + 21297, + 21290, + 21274 + ], + "sample_count": 32 + }, + { + "pubkey": "81LX9W3mKpGTZPdEDwsk5GpMU4EZn3HUTEeYiFCTmiUk", + "epoch": 129, + "origin_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "target_device_pk": "ENMRWMfzzUFuMJa5R78AP4ruaGtutCkMAmsQZAUR8SmH", + "link_pk": "CLMj53rUneEokXWZLtBL8Jj5fWxjprBpcrdurysAis3v", + "origin_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "target_device_location_pk": "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427830634, + "samples": [ + 124405, + 124406, + 124455, + 124477, + 124455, + 124416, + 124413, + 124402, + 124405, + 124508, + 124512, + 124438, + 124447, + 124444, + 124466, + 124430, + 124460, + 124418, + 124419, + 124442, + 124419, + 124436, + 124398, + 124449, + 124445, + 124406, + 124439, + 124438, + 124438, + 124432, + 124457, + 124405 + ], + "sample_count": 32 + }, + { + "pubkey": "1FE55iUi6ExNMMJe24W4DGUT1wk6wsF5jQqVeXsG53P", + "epoch": 129, + "origin_device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "target_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_pk": "bChqyD8NUxeXeTMFq3YBu4WP3XqHkwndPGTEZxmA82k", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426780018, + "samples": [ + 142, + 178, + 150, + 149, + 154, + 145, + 114, + 174, + 195, + 152, + 122, + 130, + 135, + 131, + 150, + 118, + 133, + 128, + 179, + 126, + 192, + 191, + 121, + 151, + 152, + 166, + 126, + 168, + 151, + 129, + 169, + 121 + ], + "sample_count": 32 + }, + { + "pubkey": "HGfsDzijdPvfHXD7UKnkCcgF8R6fhyr876b1fqJUrFCF", + "epoch": 129, + "origin_device_pk": "FwWis5rJD6ByvJmGYcfapYuHHB4B5pgFXpz2zMDn8SKy", + "target_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_pk": "CsLwpagXfZnMtB6XYMX2hAxCznWftKBbtGxEjSwZpvfX", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "6KtCR8fECV8h63CgefjMnVjt7iy1cd9SNoivyYHQrWKG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429166652, + "samples": [ + 142, + 146, + 112, + 104, + 131, + 147, + 167, + 153, + 143, + 171, + 114, + 119, + 128, + 124, + 114, + 117, + 153, + 121, + 139, + 118, + 181, + 133, + 147, + 134, + 118, + 117, + 125, + 156, + 138, + 124, + 121, + 116 + ], + "sample_count": 32 + }, + { + "pubkey": "G3FovMSLoWULzpJWk2LMGxWEB9VtFUSgrdCJBZe3dZb7", + "epoch": 129, + "origin_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "target_device_pk": "83SQUuoufcgFYwHMEs7rXBib3NDj5t3wBxMSzznYfe4W", + "link_pk": "DzHDqj3cdi77eMLWKemdhfr6YZJeHHGxuysvAdekniC", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431395213, + "samples": [ + 10575, + 10615, + 10593, + 10632, + 10622, + 10619, + 10571, + 10580, + 10585, + 10582, + 10619, + 10575, + 10620, + 10587, + 10606, + 10587, + 10594, + 10599, + 10623, + 10577, + 10621, + 10561, + 10611, + 10589, + 10609, + 10604, + 10604, + 10589, + 10572, + 10577, + 10576, + 10609 + ], + "sample_count": 32 + }, + { + "pubkey": "FUnnwLwheGzhiikwVuHChYtkcrEeEMvWWay95Dr7qRdu", + "epoch": 129, + "origin_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "target_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "link_pk": "6ct2cQXAKuB8M7pT4tHJTrCEKspRs2dSqrhrYHhFwMne", + "origin_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432461565, + "samples": [ + 173400, + 173367, + 173391, + 173354, + 173418, + 173337, + 173375, + 173324, + 173382, + 173395, + 173383, + 173390, + 173339, + 173352, + 173348, + 173342, + 173396, + 173396, + 173404, + 173384, + 173365, + 173381, + 173363, + 173378, + 173364, + 173384, + 173349, + 173387, + 173371, + 173360, + 173378, + 173388 + ], + "sample_count": 32 + }, + { + "pubkey": "6WGN16QMCGXWCv4gWLss1hdqFhwVujPTgu5dEaUGFRjk", + "epoch": 129, + "origin_device_pk": "BLArXrBNd1vd5ELbF133ypTpAe1GbSi8nc6DMepBUrYa", + "target_device_pk": "k6UWhPrgHAti83PwzMr73VDwf8w6a3HHeM3qcHSAKTZ", + "link_pk": "AmVQfjXNQeQ299snwT3H2XfL5FoC39WPThGY3MkFxSnY", + "origin_device_location_pk": "9ySXHhn4zheYB9FJtpCCUQBbj6RqX5NJihkyNEeb1xoN", + "target_device_location_pk": "HJiYKh8SB2PqM3ie89Mk2LUoF6MrvhuRhL4GMWvNz2jB", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429503344, + "samples": [ + 2826, + 2858, + 2789, + 2827, + 2809, + 2845, + 2794, + 2857, + 2815, + 2811, + 2816, + 2820, + 2858, + 2868, + 2845, + 2851, + 2845, + 2846, + 2828, + 2819, + 2811, + 2834, + 2799, + 2844, + 2799, + 2821, + 2795, + 2824, + 2809, + 2855, + 2868, + 2809 + ], + "sample_count": 32 + }, + { + "pubkey": "J7y14iKph6thmHQsDdPbDnUeTzUNdUdBPHKn68Bsx8To", + "epoch": 129, + "origin_device_pk": "AWQUQCWAR3rbJfYD6MC7ESM3stFgQnehE6N5aXEtfEnc", + "target_device_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "link_pk": "8cAgVftvEXrHGDw2N2M9MFnC2eQiPEWWbPT6fPdgEVoJ", + "origin_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429230540, + "samples": [ + 41615, + 41597, + 41601, + 41591, + 41616, + 41635, + 41588, + 41605, + 41610, + 41618, + 41592, + 41598, + 41584, + 41604, + 41579, + 41605, + 41588, + 41608, + 41575, + 41576, + 41596, + 41604, + 41614, + 41637, + 41585, + 41588, + 41585, + 41617, + 41612, + 41587, + 41591, + 41611 + ], + "sample_count": 32 + }, + { + "pubkey": "6C6CvHowqfEtRxPenBKV6uXgARPnisjD4LUd93vhrKNK", + "epoch": 129, + "origin_device_pk": "9qDPmN4cNw7WeVZd9JphP7DYQvrcqKC47NEJp91iAu92", + "target_device_pk": "6FFAxR973WyWYEMBSuiN9aCzWBeZEE3caz56sqkXzPW7", + "link_pk": "J35vG3xdC7WZ2AQzs295gFktfgRdq9URwdZGCitmDJFB", + "origin_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "target_device_location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430626652, + "samples": [ + 125, + 162, + 113, + 149, + 146, + 163, + 165, + 145, + 158, + 162, + 179, + 150, + 171, + 124, + 180, + 142, + 192, + 184, + 130, + 167, + 146, + 141, + 160, + 133, + 136, + 155, + 151, + 142, + 148, + 193, + 145, + 212 + ], + "sample_count": 32 + }, + { + "pubkey": "B82LcTm9xYvnpzbgNSadX538rKGa37stfitYguG12Skg", + "epoch": 129, + "origin_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "target_device_pk": "DW4kmVTZrb2tAggT915P3W5vgfC28BmYVTKYnAQPx32s", + "link_pk": "4pRUyqhTmkKyuQMTRn9Kki9SmcKW7aSTe6RgNNEvgbZA", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424653390, + "samples": [ + 158, + 151, + 126, + 140, + 172, + 140, + 173, + 136, + 148, + 148, + 164, + 139, + 144, + 148, + 171, + 147, + 158, + 129, + 134, + 140, + 162, + 146, + 184, + 167, + 178, + 172, + 143, + 159, + 201, + 161, + 155, + 191 + ], + "sample_count": 32 + }, + { + "pubkey": "6BD8g3gHzfnxZSGA51vkiwWeR1r8AUyfo5kC8a1UiBeS", + "epoch": 129, + "origin_device_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "target_device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "link_pk": "HmMvUfSW9DMYiHAANEXrTYxwX89VUPxnbcWwWWUputnk", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429272184, + "samples": [ + 82160, + 82176, + 82154, + 82153, + 82151, + 82147, + 82176, + 82161, + 82178, + 82194, + 82178, + 82172, + 82175, + 82204, + 82148, + 82150, + 82188, + 82152, + 82209, + 82190, + 82164, + 82172, + 82157, + 82161, + 82195, + 82155, + 82159, + 82151, + 82183, + 82231, + 82196, + 82219 + ], + "sample_count": 32 + }, + { + "pubkey": "Gqg77QuCqw8wjjXqqfVBn9LshDiRHYEFPqRaJgj54i1D", + "epoch": 129, + "origin_device_pk": "6VywMdq9TggmKcNUHoEyGmhrmLqRw4FGa8G5C5bM9nr1", + "target_device_pk": "EKMfgyPsnVzhBtVrDkfU65M2hodauQzWtu6mHB9wLx35", + "link_pk": "H6L9WQo9g4rsKkpfZ7gxNkNmNVfHNpsqLbDBFcyr9gqw", + "origin_device_location_pk": "5FVgFpww2FyftFamYqLEHjoq7AYCVWUWtWaWRxuh6rP4", + "target_device_location_pk": "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424083082, + "samples": [ + 186, + 182, + 222, + 200, + 213, + 198, + 201, + 212, + 230, + 214, + 201, + 232, + 193, + 189, + 225, + 201, + 209, + 209, + 220, + 191, + 203, + 200, + 215, + 302, + 247, + 249, + 216, + 209, + 222, + 481, + 237, + 197 + ], + "sample_count": 32 + }, + { + "pubkey": "A7R5W2HkPYX8bA54qicsz7rX6Lnx7mo4Qkf7mFwYVeBN", + "epoch": 129, + "origin_device_pk": "D5nBgnmauYd3UtsWQiqHkGg22mMvYo6M78Ny8ccrumWT", + "target_device_pk": "CTTCwG765QP8ycYrX1h8hZZo7K1pvDJXPaiC9Ue1u8qV", + "link_pk": "GmtxGqz73XYdDmerspvSmgik6vZP6jY1Fkz6M7xAas9a", + "origin_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "target_device_location_pk": "9gQn94Rs72oe9QRZM5i7KgACG6dXjirttbcZV75JxqH8", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432759489, + "samples": [ + 11277, + 11322, + 11250, + 11281, + 11303, + 11314, + 11282, + 11296, + 11295, + 11292, + 11285, + 11313, + 11300, + 11305, + 11301, + 11304, + 11266, + 11289, + 11269, + 11261, + 11293, + 11269, + 11281, + 11269, + 11334, + 11284, + 11279, + 11313, + 11258, + 11325, + 11307, + 11291 + ], + "sample_count": 32 + }, + { + "pubkey": "2BjpmCua8Gu7yYoqQyHPPRtXuvGvm6YvUvQn5sdENgvn", + "epoch": 129, + "origin_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "target_device_pk": "6rqTWfDpBzx92yUi7JVuCp8EeRKH6umNiA6ANg54rEoi", + "link_pk": "H7NHBD35i4oQvwoiH4ocJL3qLABVj3Au5tGEgYUaBTxw", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "2aDqcihcejSWManyqqZRJ8rpShaH6a718jmaQjkNTZfZ", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424653399, + "samples": [ + 183, + 212, + 230, + 185, + 179, + 239, + 169, + 197, + 172, + 195, + 202, + 197, + 181, + 182, + 196, + 207, + 225, + 228, + 224, + 208, + 204, + 215, + 211, + 245, + 195, + 192, + 194, + 179, + 213, + 260, + 212, + 216 + ], + "sample_count": 32 + }, + { + "pubkey": "AnAm2QFBBhGL2WD6v6u9618VbHN9qYPX2BBpKCLNzQLZ", + "epoch": 129, + "origin_device_pk": "83SQUuoufcgFYwHMEs7rXBib3NDj5t3wBxMSzznYfe4W", + "target_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "link_pk": "AwvKgL6P6rRmf8VRPXxWuboyQdcNqp4x986cghTWRk7S", + "origin_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "target_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425138313, + "samples": [ + 106, + 113, + 170, + 155, + 167, + 151, + 119, + 116, + 147, + 108, + 122, + 137, + 108, + 130, + 111, + 122, + 120, + 133, + 113, + 109, + 147, + 130, + 131, + 120, + 126, + 161, + 128, + 144, + 125, + 118, + 107, + 149 + ], + "sample_count": 32 + }, + { + "pubkey": "8JA9KFXBKgpCxyoTQvU1qPhAwGV7veuHQegqeq5rDhan", + "epoch": 129, + "origin_device_pk": "EKMfgyPsnVzhBtVrDkfU65M2hodauQzWtu6mHB9wLx35", + "target_device_pk": "HNVZG2GDy6AWXrbTgXd2cPZ4zw7GJoo4eq6ZPLTGbBgD", + "link_pk": "DJ1sw7jUiZRvseynGGy5rvPiT1ybzpgMGoxnkrNuFU31", + "origin_device_location_pk": "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn", + "target_device_location_pk": "Db3TGBUpE3e9K659yALC426M5bno2x79Gyi5ELNHZ4Fn", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425715672, + "samples": [ + 158, + 139, + 141, + 153, + 216, + 133, + 150, + 143, + 122, + 161, + 127, + 125, + 149, + 161, + 179, + 142, + 140, + 145, + 123, + 147, + 123, + 191, + 155, + 107, + 123, + 162, + 138, + 131, + 152, + 131, + 161, + 137 + ], + "sample_count": 32 + }, + { + "pubkey": "2L1aY22dHhpff2Ez8Ffg4E4CHCV5iRMjYuFrf6v6NEov", + "epoch": 129, + "origin_device_pk": "GARSc9a1pEQ3oKWLSP2BAYcBDwrTrNxsUVzxjCA6aoyc", + "target_device_pk": "4XuCxgU8h2ZBy4ReHxJKAWEkRt7fSLZDh92AZGsjMBbn", + "link_pk": "4DH6VssEtHvpQEuoiKUXCpZjbPD848FjXQDHxc5Rbg78", + "origin_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "target_device_location_pk": "CYKzc3GuqHiatGaTHiuSwaWxXkb96F54mFYVqbs8L58C", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430030311, + "samples": [ + 133, + 108, + 167, + 139, + 133, + 113, + 115, + 114, + 171, + 147, + 138, + 161, + 141, + 194, + 118, + 147, + 150, + 112, + 146, + 177, + 140, + 133, + 176, + 165, + 146, + 131, + 115, + 158, + 151, + 135, + 132, + 130 + ], + "sample_count": 32 + }, + { + "pubkey": "m3HMd63X8qhNcvJ5WAfGcYmmC946msrUPin9dX6v3fc", + "epoch": 129, + "origin_device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "target_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_pk": "Ca2Aj5RZnbrfWHU5jjSYZdWx7CZfuKoC8dxEEWTgJFx2", + "origin_device_location_pk": "Ga9FVdnt99y3idLkthMw2LEJ2QA3WtUBKdM5MUQKnZwq", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432563131, + "samples": [ + 142, + 149, + 160, + 137, + 174, + 156, + 121, + 162, + 169, + 168, + 158, + 128, + 147, + 142, + 250, + 155, + 123, + 164, + 109, + 142, + 161, + 115, + 134, + 163, + 154, + 135, + 133, + 128, + 164, + 170, + 146, + 169 + ], + "sample_count": 32 + }, + { + "pubkey": "BXFcfkWm4vmvNRvNCeZeYDNWvFRR3CGfWxkQzZAYLGtE", + "epoch": 129, + "origin_device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "target_device_pk": "4XRSGuuGTZnaYz1MTq9xgkqwkD4d7SyxJhNQEfUUyLZf", + "link_pk": "GUEVP6ugfbZpC33sYJuB1buTxwDJjEXn8wjxMuq9xpbK", + "origin_device_location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "target_device_location_pk": "D99Ub7zMtX2WN1YKV3Kt48AgQinBSYFmLqvcuZoj4wRP", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426454533, + "samples": [ + 64546, + 64506, + 64507, + 64511, + 64570, + 64549, + 64489, + 64527, + 64519, + 64568, + 64510, + 64512, + 64545, + 64508, + 64554, + 64556, + 64532, + 64564, + 64551, + 64546, + 64558, + 64531, + 64528, + 64529, + 64516, + 64498, + 64528, + 64549, + 64562, + 64509, + 64541, + 64591 + ], + "sample_count": 32 + }, + { + "pubkey": "H9HVKMBjKBMQojdo7u6kB4hizXJwHEeqQCvbtHDT4BCD", + "epoch": 129, + "origin_device_pk": "9mBBsvpo9TVLYg1G27rVLhR1GsUVMVrVmF6B52vsdR1B", + "target_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "link_pk": "5Q928Fc5bjvMad6tDAtwXxuezJP1jJ9eKSEsFJN3EzqE", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426780012, + "samples": [ + 5844, + 5836, + 5828, + 5852, + 5856, + 5839, + 5823, + 5838, + 5826, + 5838, + 5813, + 5843, + 5835, + 5814, + 5818, + 5837, + 5849, + 5815, + 5842, + 5832, + 5898, + 5872, + 5842, + 5817, + 5837, + 5854, + 5879, + 5857, + 5838, + 5822, + 5818, + 5881 + ], + "sample_count": 32 + }, + { + "pubkey": "A7wTB4UjUJYtQ9Uf1WVmRZTe6Snm9xGqCR5afJcPJoCV", + "epoch": 129, + "origin_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "target_device_pk": "ENMRWMfzzUFuMJa5R78AP4ruaGtutCkMAmsQZAUR8SmH", + "link_pk": "5Psm9gSZjLvfskWq3DSBnqcKNypFaLp3diURBrLUXaMT", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465691, + "samples": [ + 108051, + 108045, + 108079, + 108093, + 108074, + 108068, + 108048, + 108066, + 108082, + 108044, + 108082, + 108070, + 108119, + 108060, + 108093, + 108038, + 108073, + 108050, + 108085, + 108108, + 108092, + 108068, + 108064, + 108070, + 108067, + 108061, + 108076, + 108087, + 108066, + 108076, + 108039, + 108049 + ], + "sample_count": 32 + }, + { + "pubkey": "BXQgKwiq5pV4W8yn3xpSJQPyEJ14JD1punv3qUKFw9xT", + "epoch": 129, + "origin_device_pk": "DW4kmVTZrb2tAggT915P3W5vgfC28BmYVTKYnAQPx32s", + "target_device_pk": "3EUTjtzdJFG9PFp9j39cxvY8zAWtFUkUjrzWQ8GsUvRD", + "link_pk": "6V4vvD7NjvrK7kmekaf5pfGJiUbJZrUVB7PuZsnTqxZZ", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "origin_device_agent_pk": "H6TzLFei8eXpH9g65HNvoBGn81e7BRQvSS2i8uxLxxgJ", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427401794, + "samples": [ + 134048, + 134055, + 134021, + 134055, + 134074, + 134072, + 134063, + 134100, + 134046, + 134035, + 134057, + 134040, + 134077, + 134089, + 134061, + 134025, + 134103, + 134069, + 134076, + 134025, + 134049, + 134121, + 134051, + 134067, + 134032, + 134038, + 134108, + 134047, + 134028, + 134111, + 134065, + 134005 + ], + "sample_count": 32 + }, + { + "pubkey": "GPC528CjETtXpruvpV1tokp2MpdFogCRaKJzZzZcdzZp", + "epoch": 129, + "origin_device_pk": "GphgLkA7JDVtkDQZCiDrwrDvaUs8r8XczEae1KkV6CGQ", + "target_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "link_pk": "6xLR3MKkcSi35PVmTjusZSTNKzvriqkbm9FyTvRii61c", + "origin_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432176850, + "samples": [ + 5877, + 5885, + 5824, + 5877, + 5867, + 5832, + 5873, + 5881, + 5852, + 5812, + 5873, + 5901, + 5854, + 5896, + 5869, + 5864, + 5845, + 5830, + 5846, + 5838, + 5884, + 5853, + 5884, + 5886, + 5845, + 5853, + 5833, + 5848, + 5876, + 5879, + 5839, + 5846 + ], + "sample_count": 32 + }, + { + "pubkey": "6AwZx5dd6mjS2A25A7aPYftMEfKxcqyggNMdRE48eth2", + "epoch": 129, + "origin_device_pk": "2FcrRNGi5FmPtmpAcgdPUBFNQB217By5gSm3H3Tj4qrV", + "target_device_pk": "Ebbzp9HgohXmrbJMYdydyrnmwzoYMkR6W7AgXunoTr2R", + "link_pk": "Aq1vfKKLfYdiCz1wz1x3uc9xepaZ1hcMHZ2JTBsPZ2eZ", + "origin_device_location_pk": "GQhqbCPijoiZAQeVyCzQQy52o7jAdA8EenA5GTYpxmx8", + "target_device_location_pk": "Fx4bTA1DW8nEkS998eRuhQoKKmqevdALcNs8ibCj2RaH", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432461590, + "samples": [ + 59521, + 59545, + 59567, + 59548, + 59562, + 59581, + 59536, + 59562, + 59567, + 59557, + 59585, + 59566, + 59531, + 59558, + 59664, + 59550, + 59516, + 59549, + 59553, + 59596, + 59535, + 59552, + 59561, + 59555, + 59538, + 59572, + 59605, + 59571, + 59577, + 59555, + 59546, + 59562 + ], + "sample_count": 32 + }, + { + "pubkey": "CH26RbpSue6TjkuEpW1dJa49M4ghXaEid6Ygq3WAvksN", + "epoch": 129, + "origin_device_pk": "5VhacudbiTcMP4uB4a712bYXLhSJqzAjLEau2qJynJf2", + "target_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "link_pk": "ETLoXyDghC8FeP6CMvusqwscKsGras4MpeMVVjei29TT", + "origin_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "target_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431021437, + "samples": [ + 808, + 830, + 788, + 839, + 847, + 809, + 820, + 817, + 805, + 805, + 803, + 820, + 788, + 856, + 783, + 807, + 801, + 795, + 847, + 802, + 799, + 789, + 794, + 815, + 818, + 815, + 822, + 825, + 854, + 816, + 793, + 795 + ], + "sample_count": 32 + }, + { + "pubkey": "5jgriFkw2wVBUo9tMqS3fHuGqRE3VyWMzHAACSzzyFth", + "epoch": 129, + "origin_device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "target_device_pk": "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj", + "link_pk": "ABXMG7UZcbytdAt5tqMHUC8NBxuKByrLTRN91WXnZbk9", + "origin_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "target_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427668660, + "samples": [ + 447, + 453, + 457, + 421, + 439, + 448, + 450, + 417, + 462, + 462, + 446, + 451, + 445, + 445, + 455, + 427, + 429, + 459, + 415, + 451, + 466, + 443, + 414, + 424, + 447, + 443, + 464, + 444, + 471, + 460, + 442, + 443 + ], + "sample_count": 32 + }, + { + "pubkey": "bafcLf8ePwxquMsiLGiegCmxkrLj1jmnxVbmLXkjSta", + "epoch": 129, + "origin_device_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "target_device_pk": "2hPMFJHh5BPX42ygBvuYYJfCv9q7g3rRR3ZRsUgtaqUi", + "link_pk": "61UDX3zAU7cZWBgyZA3xkBSzXjXhJbTPyNPM2JabWT8u", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433853317, + "samples": [ + 194, + 198, + 219, + 224, + 198, + 186, + 196, + 241, + 198, + 224, + 229, + 204, + 219, + 247, + 202, + 216, + 205, + 200, + 240, + 169, + 201, + 215, + 194, + 217, + 213, + 223, + 216, + 213, + 229, + 218, + 199, + 204 + ], + "sample_count": 32 + }, + { + "pubkey": "6utjPa3avGBPmFFVnMyrZ6ztKtfg69So9fHPpcXokCyr", + "epoch": 129, + "origin_device_pk": "E9yGW6LkdvbiCoRoJx63GBn4yWZaKEDirxGqs4oTPPpy", + "target_device_pk": "DcyYy7A4Af8dh72CMs2yiqTo8jerdhXb9jmY1LcSU7u6", + "link_pk": "67j732HB5cafsDjWS1dPpB6ckGumq18rndLvpWKXpXu8", + "origin_device_location_pk": "BxEPAbcARmCaWct6TAiW1ugYq2edBUga8ToLZ9sf4D12", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "64TqjyFA9y2qDJc1Bk7EtURQRjT3H9g6D6EXQbqLrj6o", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143449273823, + "samples": [ + 38114, + 38056, + 38085, + 38092, + 38106, + 38095, + 38067, + 38067, + 38097, + 38070, + 38068, + 38067, + 38091, + 38094, + 38069, + 38072, + 38114, + 38119, + 38081, + 38106, + 38081, + 38060, + 38068, + 38119, + 38121, + 38077, + 38084, + 38096, + 38062, + 38093, + 38085, + 38088 + ], + "sample_count": 32 + }, + { + "pubkey": "6rBd1cQY8mLCvcfMPuHRj3Tg7JBgAL7NtSCa33uFNpxe", + "epoch": 129, + "origin_device_pk": "2TBUsniuER8r6JB7ZNBzhmzAUAncsEdre35o5CJjnSGV", + "target_device_pk": "83SQUuoufcgFYwHMEs7rXBib3NDj5t3wBxMSzznYfe4W", + "link_pk": "CrHzEkpjQ7QSi8d4zGTMnhVS9kCcuaLKuY9mFJKvXyT6", + "origin_device_location_pk": "3BZkwwMNGZG2iSeZr1nxYX4Vxcodcft2zwNVT99BbqNC", + "target_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143430262976, + "samples": [ + 16772, + 16832, + 16886, + 16835, + 16969, + 16774, + 16764, + 16807, + 16917, + 16742, + 16812, + 16811, + 16945, + 16762, + 16771, + 16772, + 16753, + 16777, + 16917, + 16799, + 16758, + 16803, + 20392, + 16808, + 16780, + 16760, + 16779, + 16991, + 16779, + 16734, + 16740, + 16827 + ], + "sample_count": 32 + }, + { + "pubkey": "hFcJtwTQt1XP3d23d63dytpf4qhePjJUpdeAWGSLnK6", + "epoch": 129, + "origin_device_pk": "ASYSzEwBAPhnqj6q1io8VdCUcjfb5T1731kJPUjnHa7Y", + "target_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "link_pk": "6b7vqaWaVS119fqKKMEVdc1o8LYHmTvskYasFp6X5b7G", + "origin_device_location_pk": "AtVFtz8mn1fQatrd9fQN88CHKFojoR1nAngPnMnCaszq", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428697445, + "samples": [ + 152773, + 152764, + 152767, + 152761, + 152748, + 152788, + 152759, + 152763, + 152804, + 152776, + 152770, + 152760, + 152773, + 152749, + 152773, + 152748, + 152777, + 152746, + 152774, + 152771, + 152772, + 152759, + 152776, + 152761, + 152759, + 152783, + 152778, + 152790, + 152770, + 152750, + 152796, + 152798 + ], + "sample_count": 32 + }, + { + "pubkey": "AncQKAL5PVzhAu9H59bNofqiv7GA7osioTs8ZDxhqE9C", + "epoch": 129, + "origin_device_pk": "DLajvcrHuZpbrJKY31Bgdd7oymCADDUPN1N77Rvd2QxN", + "target_device_pk": "9oKLaL6Hwno5TyAFutTbbkNrzxm1fw9fhzkiUHgsxgGx", + "link_pk": "7KUWgPjbPLpLMAjZq7BYioUxVeXYJrPvEL6TNeMDcwY2", + "origin_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "target_device_location_pk": "DwnrwrYCKU5NPvEHZX3vn2dZmTV1Sqm6vFNahVzFrMj", + "origin_device_agent_pk": "HQ8pqcfexhftBNjYhzDZJuGnCz869fCxcZbni6jqmbo", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426491073, + "samples": [ + 155, + 158, + 137, + 141, + 133, + 145, + 160, + 165, + 119, + 123, + 146, + 111, + 125, + 116, + 115, + 146, + 181, + 166, + 148, + 135, + 139, + 143, + 138, + 132, + 120, + 148, + 166, + 131, + 149, + 91, + 122, + 130 + ], + "sample_count": 32 + }, + { + "pubkey": "Gc84gaZxyFJYFEJhixh8KSQpcrVQjpapWJoozJe4hifz", + "epoch": 129, + "origin_device_pk": "2AFsyp34CFTS5UZJpoqYXvyzFnRW49Q5s7xMEtFFEDVm", + "target_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "link_pk": "81khRsBPHa2XfdEZE1QxHuHeJgyE7yrhaCAfM2Dp1cdF", + "origin_device_location_pk": "FQmM1TfBDgKjdTBKauy5fJ3M5b6CZzeddw3vUwqSWTYu", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "5sUWzNaZP9euVMP5ipEQZzN8CbeccgMbXB2hYH864ujG", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427475691, + "samples": [ + 99, + 149, + 147, + 147, + 119, + 124, + 132, + 144, + 112, + 160, + 126, + 121, + 105, + 119, + 134, + 131, + 107, + 130, + 106, + 93, + 138, + 128, + 109, + 134, + 112, + 144, + 142, + 110, + 127, + 117, + 118, + 96 + ], + "sample_count": 32 + }, + { + "pubkey": "zA1wWdPrWiv4JgfiQP2TTE1VTMw622obTzaok18p3wS", + "epoch": 129, + "origin_device_pk": "AXZqvZKpjiKSNQ3isq9ssHDP4hRBJg2mMFKstpgv4RV4", + "target_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "link_pk": "vJrmECGJ7GeBmrEN22TRJxdrd7mpD5Vefm4BUjFgYfQ", + "origin_device_location_pk": "Ga9FVdnt99y3idLkthMw2LEJ2QA3WtUBKdM5MUQKnZwq", + "target_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143432563127, + "samples": [ + 69304, + 69283, + 69310, + 69324, + 69265, + 69278, + 69291, + 69324, + 69276, + 69307, + 69303, + 69282, + 69264, + 69281, + 69262, + 69304, + 69260, + 69271, + 69277, + 69313, + 69286, + 69276, + 69283, + 69271, + 69258, + 69265, + 69263, + 69333, + 69316, + 69322, + 69260, + 69275 + ], + "sample_count": 32 + }, + { + "pubkey": "AL7DDE1KGJjcwRn1tNvmekyeAiwzVhyXxwaMk2fKGv3u", + "epoch": 129, + "origin_device_pk": "8fiTfMTsWFp21bjGTYiLvUQWijmTeks6SmCpYiqRZyyw", + "target_device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "link_pk": "4akCMp6aQGtbRMSns8exFwtiqaoTAaos785eHvJgx3o2", + "origin_device_location_pk": "AysiUk3wAU7G2GQ6fHr7LoyBNzxNRkYULciDXPNYJHyj", + "target_device_location_pk": "8a5WNgBA7hNprZDBSMrMUYB3QjiRfGknrZ2hxSJ3X6F2", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426454553, + "samples": [ + 790, + 787, + 757, + 770, + 792, + 764, + 791, + 760, + 808, + 776, + 787, + 755, + 768, + 772, + 777, + 791, + 775, + 762, + 756, + 806, + 789, + 766, + 766, + 794, + 799, + 779, + 804, + 784, + 793, + 804, + 765, + 757 + ], + "sample_count": 32 + }, + { + "pubkey": "GfxQ3y9JrfWQX4jCi8G3GSdeGPk7r1VtKcGZ83C1VLeP", + "epoch": 129, + "origin_device_pk": "C2Snxyu5FkpDWgH9otTzQ5td4D2e38GpEH3wCQgEriuB", + "target_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "link_pk": "3B9NhDBJ1sJEptuuE2xF8CMT6GdXspbNni1KeGYMsKhN", + "origin_device_location_pk": "9ma4yfzHDY6ubwUBKLvciSdH9ZaiEUK2CXSLmMzBgDN5", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427668641, + "samples": [ + 98790, + 98759, + 98739, + 98774, + 98768, + 98785, + 98758, + 98759, + 98757, + 98777, + 98776, + 98800, + 98814, + 98750, + 98737, + 98791, + 98803, + 98752, + 98792, + 98745, + 98771, + 98789, + 98794, + 98791, + 98794, + 98795, + 98750, + 98814, + 98820, + 98777, + 98741, + 98784 + ], + "sample_count": 32 + }, + { + "pubkey": "5noUkrZ4HJExQ2VKkyDqg5ESE8Hb4g5vYKd4DCiRoe4g", + "epoch": 129, + "origin_device_pk": "9TZ7d3XrvSyGSAZD6nx7pkBkjHLq7ewqHKgyZZ34QMze", + "target_device_pk": "GBow73shpP8aTLiWm8QuJtqoE59GbZ3rppVgJLVpyvd6", + "link_pk": "2BVb9VWvNX6oy5NwSuJjTedhK9cZEdfjWDd3XcL3785Y", + "origin_device_location_pk": "Evgy1NR5x5hcGPSVTZab4gxbWCcHaQVry4Mxd2eCRTJS", + "target_device_location_pk": "DJD3UmMd15dZqq1LTs1hqiyB4eH4PLBmptzAxAPY9phU", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429676914, + "samples": [ + 21636, + 21692, + 21601, + 21533, + 21614, + 21545, + 21771, + 21612, + 21547, + 21582, + 21563, + 21787, + 21745, + 21581, + 21580, + 21587, + 21573, + 21537, + 21779, + 21553, + 21817, + 21586, + 21973, + 21568, + 21567, + 21659, + 21713, + 21560, + 21553, + 21564, + 21585, + 21530 + ], + "sample_count": 32 + }, + { + "pubkey": "86f7Qi8YLDD2veFSnumdN6mvHgefKzV5qgXAXntQoTqP", + "epoch": 129, + "origin_device_pk": "2HXe7gd7wgpe8NnEtWHnWSwXdNAkd6YKT86zUHQ4dwU4", + "target_device_pk": "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj", + "link_pk": "DqJ98NLFCUu9fj5jhk9HAV76UE8puArU6NNjQ9Rwp5fj", + "origin_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "target_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428536717, + "samples": [ + 140, + 125, + 111, + 109, + 109, + 130, + 109, + 124, + 114, + 123, + 111, + 142, + 144, + 124, + 120, + 123, + 142, + 126, + 126, + 121, + 132, + 122, + 143, + 115, + 148, + 167, + 156, + 127, + 134, + 115, + 118, + 108 + ], + "sample_count": 32 + }, + { + "pubkey": "F7j1qWz974fsnAgnfcCYqsmFnUegCSkmWC8uB4ZF5hYh", + "epoch": 129, + "origin_device_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "target_device_pk": "B1JjhMNjy3HhkXvyYzq6DBNfLfLkvizftzaUrXDf7XEY", + "link_pk": "FmcM3hsb96fgpFQMGHPoTcrKE6K4AKbC1xtaRhDsLkAa", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429272167, + "samples": [ + 177, + 144, + 145, + 149, + 154, + 145, + 163, + 130, + 132, + 145, + 138, + 131, + 166, + 118, + 161, + 182, + 153, + 123, + 169, + 131, + 161, + 150, + 140, + 205, + 180, + 126, + 128, + 144, + 194, + 147, + 174, + 151 + ], + "sample_count": 32 + }, + { + "pubkey": "Hihn2CAQ7E3uXAkeQFEBf56kRHSUQBXNxxEyPzdDTUpN", + "epoch": 129, + "origin_device_pk": "B1JjhMNjy3HhkXvyYzq6DBNfLfLkvizftzaUrXDf7XEY", + "target_device_pk": "82qu8p7dahbxdZp7oQdDAGFv5V7BdcXBivr48S4fgf42", + "link_pk": "FmcM3hsb96fgpFQMGHPoTcrKE6K4AKbC1xtaRhDsLkAa", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465568, + "samples": [ + 127, + 103, + 121, + 114, + 107, + 102, + 109, + 100, + 103, + 114, + 108, + 109, + 117, + 107, + 144, + 142, + 139, + 128, + 135, + 108, + 110, + 123, + 116, + 117, + 120, + 111, + 106, + 161, + 114, + 112, + 120, + 116 + ], + "sample_count": 32 + }, + { + "pubkey": "74WitsrTgTZGdkTbNXtGmGyLJmCnfeV8YAjCEtYkEPCw", + "epoch": 129, + "origin_device_pk": "BLArXrBNd1vd5ELbF133ypTpAe1GbSi8nc6DMepBUrYa", + "target_device_pk": "2AvqMdvf5tmsvS2DsJZD16c7vtCDS8Fx83mg1RueipvY", + "link_pk": "MoiGqAWncXdSyJhX2xAiEdSCYhm35tP39oya9KCiBDF", + "origin_device_location_pk": "9ySXHhn4zheYB9FJtpCCUQBbj6RqX5NJihkyNEeb1xoN", + "target_device_location_pk": "9HA3tm5Z5n2tFyEkMFCfTScaXTSq1ce2f89BxMbs4i37", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429503352, + "samples": [ + 10791, + 10809, + 10851, + 10793, + 10820, + 10795, + 10805, + 10818, + 10838, + 10812, + 10824, + 10796, + 10796, + 10812, + 10809, + 10801, + 10833, + 10818, + 10796, + 10854, + 10832, + 10800, + 10860, + 10804, + 10801, + 10830, + 10810, + 10802, + 10844, + 10843, + 10790, + 10807 + ], + "sample_count": 32 + }, + { + "pubkey": "Djq8Jgvm3MgRjnqUTUBkWFjn5auEz2RX2y9xHret3243", + "epoch": 129, + "origin_device_pk": "DW4kmVTZrb2tAggT915P3W5vgfC28BmYVTKYnAQPx32s", + "target_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_pk": "4pRUyqhTmkKyuQMTRn9Kki9SmcKW7aSTe6RgNNEvgbZA", + "origin_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "H6TzLFei8eXpH9g65HNvoBGn81e7BRQvSS2i8uxLxxgJ", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427401780, + "samples": [ + 141, + 145, + 129, + 136, + 150, + 116, + 159, + 135, + 147, + 150, + 115, + 154, + 129, + 130, + 124, + 140, + 149, + 164, + 139, + 119, + 111, + 157, + 133, + 143, + 153, + 128, + 117, + 130, + 123, + 139, + 128, + 123 + ], + "sample_count": 32 + }, + { + "pubkey": "BvxxHMfCLa8K87TGeNudL6D5GEvGy1KQfNDMRTB9Av27", + "epoch": 129, + "origin_device_pk": "ASPPyWXei4wZJnxBkm2ejf75s6tUZREq4UBvNtHcyVSz", + "target_device_pk": "7YKkAaXLD5XyjUc3JR9MECSKRN9q7kMnzKT3c4jFkZEh", + "link_pk": "J8SFGwr87W4u1HRUkGxnXQybR2UuDTR2s2up9o336N4L", + "origin_device_location_pk": "3xKLEjXi9vThfFnCNdgB2E2uFzeiF8FnaDtt4P6G2H2w", + "target_device_location_pk": "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426194513, + "samples": [ + 1198, + 1162, + 1167, + 1189, + 1139, + 1119, + 1126, + 1124, + 1149, + 1135, + 1149, + 1119, + 1131, + 1121, + 1154, + 1144, + 1158, + 1147, + 1159, + 1119, + 1149, + 1139, + 1147, + 1136, + 1142, + 1137, + 1166, + 1148, + 1141, + 1136, + 1152, + 1172 + ], + "sample_count": 32 + }, + { + "pubkey": "5Eo5xPT82WFvmiQocCFf5z8CrVFZeKESWVSLiszsgjT6", + "epoch": 129, + "origin_device_pk": "HfmYnpWXNuL6EFWA2CPgFaSadGAKVwbk5J2p13UEUoXy", + "target_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "link_pk": "sUTL6T7sJzjqttcG5Eu7nwMwE8ULMcRrgMU4fjXB1R2", + "origin_device_location_pk": "EFimBWsK6TLkighARRGWuCL218BHbs98oNh15EnCKtQh", + "target_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425745468, + "samples": [ + 5563, + 5611, + 5584, + 5585, + 5602, + 5595, + 5559, + 5567, + 5566, + 5574, + 5593, + 5625, + 5553, + 5564, + 5594, + 5623, + 5561, + 5582, + 5557, + 5571, + 5568, + 5601, + 5580, + 5589, + 5583, + 5576, + 5590, + 5558, + 5602, + 5620, + 5561, + 5595 + ], + "sample_count": 32 + }, + { + "pubkey": "2RNdyjHE9XpdEAiJ86poWYugUrfaqwSdYDD6XJ9YST8W", + "epoch": 129, + "origin_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "target_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "link_pk": "T1zE2oyWqfYpVW5NUuimeg6UyBGLtN6sSn7QDkozYJA", + "origin_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "target_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428465760, + "samples": [ + 68565, + 68562, + 68585, + 68568, + 68552, + 68560, + 68619, + 68564, + 68668, + 68590, + 68574, + 68553, + 68583, + 68575, + 68559, + 68600, + 68561, + 68593, + 68551, + 68554, + 68596, + 68560, + 68557, + 68552, + 68632, + 68541, + 68597, + 68629, + 68548, + 68591, + 68608, + 68567 + ], + "sample_count": 32 + }, + { + "pubkey": "GPcbCYEYBWM55mP7vJhcPqED9sXpNQYcgCXEog6jBjLt", + "epoch": 129, + "origin_device_pk": "E7c27CT7vJpgXZPv6F9jxKvKMYvDBiYz2m6UEx1LTW4P", + "target_device_pk": "GBow73shpP8aTLiWm8QuJtqoE59GbZ3rppVgJLVpyvd6", + "link_pk": "B81688uu9zgJHzD5G1pn3YbAWtCf7uh2tfEU6dXQbsB4", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "DJD3UmMd15dZqq1LTs1hqiyB4eH4PLBmptzAxAPY9phU", + "origin_device_agent_pk": "A9UJ45uCeCJuujNVJvnRKUoXuvYgkpeV87H66FT1w9iv", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143433633977, + "samples": [ + 40119, + 40083, + 40132, + 40093, + 40086, + 40081, + 40105, + 40084, + 40065, + 40086, + 40107, + 40123, + 40121, + 40078, + 40082, + 40086, + 40087, + 40139, + 40100, + 40122, + 40115, + 40095, + 40111, + 40081, + 40085, + 40088, + 40117, + 40126, + 40066, + 40098, + 40095, + 40082 + ], + "sample_count": 32 + }, + { + "pubkey": "7fdtMskKnK7nQrRo7vjNKtxupM4ANC7okfNZJbzDYGGD", + "epoch": 129, + "origin_device_pk": "2XrHv68pxYtsheKX1K2cCsCsMmfb2VDbJMNraLax98Ff", + "target_device_pk": "BLArXrBNd1vd5ELbF133ypTpAe1GbSi8nc6DMepBUrYa", + "link_pk": "2yHdPviNiFm53eYRg688otatNqx5Ewgyx5pozKtmu75M", + "origin_device_location_pk": "6d1k85c2xARsJFdBC9tgRRFH1iWRZnZaJvs9AiRowYo1", + "target_device_location_pk": "9ySXHhn4zheYB9FJtpCCUQBbj6RqX5NJihkyNEeb1xoN", + "origin_device_agent_pk": "G2RBEWAxpFybPHyQ5C2bDedkugcmnXUn2gi3zHBYBs6H", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429551755, + "samples": [ + 5214, + 5218, + 5243, + 5241, + 5245, + 5226, + 5229, + 5254, + 5258, + 5214, + 5230, + 5302, + 5225, + 5231, + 5205, + 5226, + 5206, + 5215, + 5215, + 5248, + 5225, + 5220, + 5234, + 5239, + 5227, + 5230, + 5213, + 5243, + 5274, + 5223, + 5215, + 5223 + ], + "sample_count": 32 + }, + { + "pubkey": "3QkJYo5Q8tHQUCA3JELPw83SnuvLnxwBPrHLimmm7fwf", + "epoch": 129, + "origin_device_pk": "8gisbwJnNhMNEWz587cAJMtSSFuWeNFtiufPuBTVqF2Z", + "target_device_pk": "ETdwWpdQ7fXDHH5ea8feMmWxnZZvSKi4xDvuEGcpEvq3", + "link_pk": "4CHWAfis8nch5fpAgyb69PcZHmt9zZQ94MvDjpAVSty2", + "origin_device_location_pk": "7chHZ5ywA5edBAnpZ6zRb3VS2gedJSMdfgXPjgB7zZAC", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427205063, + "samples": [ + 214, + 221, + 224, + 251, + 211, + 190, + 216, + 212, + 205, + 209, + 216, + 217, + 231, + 217, + 221, + 183, + 190, + 188, + 198, + 204, + 237, + 209, + 198, + 208, + 216, + 229, + 233, + 236, + 234, + 229, + 207, + 223 + ], + "sample_count": 32 + }, + { + "pubkey": "AHTSFgUiJymwiDq3d9yFdewYedZW2kyYFswvTCxMsKS4", + "epoch": 129, + "origin_device_pk": "CgX1gLM5VPS9pzS2Dhmhm5sGhj84GKxmP2vZy35otYom", + "target_device_pk": "A4DWVJWnf61Fu3uJwW8ZGLUv14RkZANpBYre69bxSGSX", + "link_pk": "4RaBQ5BBWmUyzGTCYUFefDKLT6os9zab4icNpBidf2th", + "origin_device_location_pk": "78D4ba8nDp4LZgcido4HXeF3RarPpTiZh3VpQWPvgRD4", + "target_device_location_pk": "7g1K5YyfHmbVSnkHhJTsL2fLiJ1WxFdFD1vUML5WokTz", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143427157488, + "samples": [ + 28644, + 28620, + 28614, + 28600, + 28632, + 28635, + 28652, + 28778, + 28609, + 28663, + 28657, + 28628, + 28639, + 28624, + 28623, + 28621, + 28639, + 28639, + 28650, + 28663, + 28624, + 28618, + 28647, + 28673, + 28640, + 28673, + 28632, + 28648, + 28664, + 28631, + 28734, + 28645 + ], + "sample_count": 32 + }, + { + "pubkey": "9akiBopoWYzVPAVZ3WRGTVPV7JXJmovEmMUynkdVJbqA", + "epoch": 129, + "origin_device_pk": "F6rcwbV1oU1DMhNkWNksnEPPM7M3Y5JbstdZpnKpmeA5", + "target_device_pk": "6HDniG2dEQuuGGz14G4DxJ3J1WQRauARCTT18ckh5mpP", + "link_pk": "38AC4EEGwbjt9gTmgzSY9PXrC9RHV7wAeJoaTyCoxB7Y", + "origin_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "target_device_location_pk": "EfVZyFjKmaEULJ8SFyRK77xKuE6ZZshken1qJhkZc9du", + "origin_device_agent_pk": "7DzupqGzEDZD9a7hSGY69ctg3kgMoNyrmx34PMGfNfW3", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143431395190, + "samples": [ + 132, + 175, + 147, + 104, + 115, + 169, + 199, + 115, + 128, + 120, + 156, + 152, + 137, + 173, + 144, + 161, + 179, + 155, + 117, + 132, + 108, + 134, + 212, + 153, + 175, + 121, + 152, + 135, + 155, + 144, + 136, + 164 + ], + "sample_count": 32 + }, + { + "pubkey": "JDqPm4QsBNiZcSbGtKHhXfko5mrjLVx1Hn8fwjJaRM3X", + "epoch": 129, + "origin_device_pk": "127iHx1CmZitJhtdTs8ePqepLi6DaPoL44Nzrxmvr1V8", + "target_device_pk": "9gGVhChduB9DezW22cvJDDeYbWddpn1vpeKZ5RKxh8Ji", + "link_pk": "F4BvF2SYKCyGXBQHZ5zArb8v9u5YUFpVgFKWeH8H9ejV", + "origin_device_location_pk": "8sejbB8n2vNYtmHKNQQJWnm17zjBZcDuMfwdb144W1kk", + "target_device_location_pk": "8sejbB8n2vNYtmHKNQQJWnm17zjBZcDuMfwdb144W1kk", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428600602, + "samples": [ + 175, + 109, + 111, + 144, + 117, + 163, + 160, + 122, + 115, + 112, + 118, + 167, + 156, + 118, + 125, + 107, + 159, + 145, + 129, + 117, + 107, + 119, + 138, + 152, + 163, + 139, + 136, + 157, + 113, + 125, + 162, + 109 + ], + "sample_count": 32 + }, + { + "pubkey": "EisyfciUgh6Vq6TZyPBw8hW5kjVoSTA9HkDk4Cbfc5MY", + "epoch": 129, + "origin_device_pk": "AE5tZ5VZdkvQNTg44AY57QiLu9mvoToShtAEqEK68hPX", + "target_device_pk": "6WjPZwrMrZgwuEJMdyMAewvwSVig6HF5EVjCuF9LeJMm", + "link_pk": "7V5g7QsLZ83jzDNdTSEdnJsDBTfxzsDAcqS9HUKUEEii", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425796372, + "samples": [ + 142, + 130, + 115, + 134, + 126, + 117, + 119, + 127, + 138, + 141, + 127, + 147, + 123, + 151, + 129, + 122, + 123, + 148, + 123, + 174, + 130, + 102, + 113, + 126, + 148, + 111, + 131, + 118, + 114, + 123, + 123, + 141 + ], + "sample_count": 32 + }, + { + "pubkey": "HfHn4RKmr4ZKhZ394TpyQMuBYDQaVqe9r21uVevNhFAY", + "epoch": 129, + "origin_device_pk": "ChN3oE2XGMfSpiCjsy581Nwp2K77wmDj57sjhiozqpp4", + "target_device_pk": "GphgLkA7JDVtkDQZCiDrwrDvaUs8r8XczEae1KkV6CGQ", + "link_pk": "6xLR3MKkcSi35PVmTjusZSTNKzvriqkbm9FyTvRii61c", + "origin_device_location_pk": "F7TiY2tPpHszPqK8nSM62Lu8RPygr2iRbRVBfoQNF6j8", + "target_device_location_pk": "67E6GKoWXVrHwGoV64sQXUnE2mgvS5tuutq2FXHrD9e1", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425915586, + "samples": [ + 5845, + 5842, + 5871, + 5863, + 5876, + 5851, + 5849, + 5844, + 5870, + 5840, + 5934, + 5905, + 5826, + 5850, + 5864, + 5852, + 5870, + 5854, + 5845, + 5822, + 5845, + 5838, + 5856, + 5912, + 5869, + 5893, + 5913, + 5895, + 5896, + 5935, + 5835, + 5836 + ], + "sample_count": 32 + }, + { + "pubkey": "9qr7vqLEbtfu8D3fn5rRnDai41TJv19vicmNec8jxaws", + "epoch": 129, + "origin_device_pk": "7YKkAaXLD5XyjUc3JR9MECSKRN9q7kMnzKT3c4jFkZEh", + "target_device_pk": "AWQUQCWAR3rbJfYD6MC7ESM3stFgQnehE6N5aXEtfEnc", + "link_pk": "CRQMUYCfgP2o9NdNyoXJ93kM4wt39993V18yaZQx5je6", + "origin_device_location_pk": "89zQST8kFTriSGJDR3VF7CwgA5Ti6eSLTKWmxxdkxq6Q", + "target_device_location_pk": "3HXxb7pabJDGU4Vk9Qdx6EmXsvvEQ82DKK2b7Eyqqaf4", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143424175052, + "samples": [ + 1691, + 1682, + 1680, + 1666, + 1742, + 1716, + 1690, + 1707, + 1692, + 1693, + 1692, + 1679, + 1685, + 1683, + 1665, + 1679, + 1704, + 1698, + 1686, + 1691, + 1695, + 1698, + 1687, + 1680, + 1673, + 1683, + 1698, + 1680, + 1722, + 1704, + 1671, + 1718 + ], + "sample_count": 32 + }, + { + "pubkey": "AsNTqYj6EUWDpC9JcshspQiXiFrJ6b7vFpkfVxDbToQP", + "epoch": 129, + "origin_device_pk": "HGRoBFv4vbU7mN5oJUTU9Z1h36fnUTUx2QyMrxyuimFY", + "target_device_pk": "TVEgwqaTtPK8tV17RFeYbik8zMbocqbbtZNm2dWpXPK", + "link_pk": "GwoqeRvzCUjmdNgm1NCbz5u49VXPVV7fuMzWenUTSeVi", + "origin_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "target_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426189400, + "samples": [ + 152, + 160, + 139, + 126, + 137, + 131, + 138, + 115, + 144, + 136, + 137, + 117, + 159, + 136, + 157, + 152, + 170, + 138, + 131, + 144, + 185, + 131, + 176, + 147, + 118, + 157, + 140, + 135, + 147, + 153, + 143, + 145 + ], + "sample_count": 32 + }, + { + "pubkey": "EHn9vAQbPS22TGX41YPyP8ZiPdMNCLoXMKkstghW9BQK", + "epoch": 129, + "origin_device_pk": "9PsbdMKcfmiHHruNTV2neyMtqfkKcNscJEJNmMBnFM68", + "target_device_pk": "HHNCpqB7CwHVLxAiB1S86ko6gJRzLCtw78K1tc7ZpT5P", + "link_pk": "ER7YPJAEd5dFqrELBPJPEfHfaZSw7NigvkqBeKp4ajKs", + "origin_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "target_device_location_pk": "AacV1W3NdZLqV4V4sjcaVSYnLzxjh62kC6eMAorDy2re", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143429262379, + "samples": [ + 33559, + 33565, + 33614, + 33581, + 33555, + 33565, + 33651, + 33580, + 33564, + 33584, + 33569, + 33588, + 33562, + 33563, + 33564, + 33573, + 33569, + 33659, + 33586, + 33578, + 33581, + 33561, + 33555, + 33572, + 33556, + 33562, + 33621, + 33592, + 33574, + 33605, + 33609, + 33572 + ], + "sample_count": 32 + }, + { + "pubkey": "fspezMTKwce43UPdqxDGpUaRn1bER1sykQanUBcrtxu", + "epoch": 129, + "origin_device_pk": "8oBYPkf5kpQMyvsW8g9PpUgozYFdm9sef8u8DPYeUhoe", + "target_device_pk": "9pops7Fje9i75cF8K4Bu2rLRKMBgLj1DtWs9NfkZJsD6", + "link_pk": "9m3X8KaoR6BBmicBtVKxhdXerttxhdT7PYFvT3SnPvos", + "origin_device_location_pk": "3zWepKPLw24vgpQkHCFsjqi5XKdWbMi9ETuhppPWUMWx", + "target_device_location_pk": "8a5WNgBA7hNprZDBSMrMUYB3QjiRfGknrZ2hxSJ3X6F2", + "origin_device_agent_pk": "AQbA3iWwW1h5GsW9RL2LPF8Y8TRhDNTZG7ujhu2Kiam2", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428125754, + "samples": [ + 82378, + 82374, + 82309, + 82314, + 82327, + 82295, + 82356, + 82340, + 82283, + 82309, + 82342, + 82345, + 82327, + 82329, + 82382, + 82310, + 82321, + 82302, + 82305, + 82290, + 82347, + 82326, + 82319, + 82331, + 82344, + 82330, + 82352, + 82373, + 82325, + 82309, + 82311, + 82371 + ], + "sample_count": 32 + }, + { + "pubkey": "2p54BT9WHnkTMAejH9oYt6gqn1ihdMtHaiiea1m8miKV", + "epoch": 129, + "origin_device_pk": "HGRoBFv4vbU7mN5oJUTU9Z1h36fnUTUx2QyMrxyuimFY", + "target_device_pk": "hdS3aegXTarJw7TrXE8V7y6EhynhbMAc4iuepV29Hcj", + "link_pk": "5LdodyAC2UtudDiE4wqifh37RX7WPUciHE5bRcHQYmP3", + "origin_device_location_pk": "4i4yWGzb7a1R7r5K66x4iWESD2E4Bo5Z2fstFyGifgvV", + "target_device_location_pk": "BfpqJUqbdR5LGbBKojJSipPtUERpWFhqZm7z95U5kaXv", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426189394, + "samples": [ + 103376, + 103409, + 103407, + 103377, + 103392, + 103416, + 103377, + 103371, + 103349, + 103374, + 103362, + 103416, + 103366, + 103380, + 103386, + 103373, + 103394, + 103448, + 103405, + 103371, + 103393, + 103382, + 103393, + 103425, + 103388, + 103383, + 103397, + 103435, + 103372, + 103418, + 103382, + 103375 + ], + "sample_count": 32 + }, + { + "pubkey": "8fWSP6ZWAinrGeLDjifgr5Dg6cTLgNWsL383ApFbUUQL", + "epoch": 129, + "origin_device_pk": "DcyYy7A4Af8dh72CMs2yiqTo8jerdhXb9jmY1LcSU7u6", + "target_device_pk": "E9yGW6LkdvbiCoRoJx63GBn4yWZaKEDirxGqs4oTPPpy", + "link_pk": "67j732HB5cafsDjWS1dPpB6ckGumq18rndLvpWKXpXu8", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "BxEPAbcARmCaWct6TAiW1ugYq2edBUga8ToLZ9sf4D12", + "origin_device_agent_pk": "64TqjyFA9y2qDJc1Bk7EtURQRjT3H9g6D6EXQbqLrj6o", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143426291691, + "samples": [ + 38089, + 38075, + 38134, + 38112, + 38048, + 38091, + 38042, + 38040, + 38059, + 38083, + 38110, + 38078, + 38069, + 38053, + 38084, + 38080, + 38080, + 38067, + 38047, + 38069, + 38064, + 38085, + 38109, + 38082, + 38062, + 38076, + 38096, + 38046, + 38058, + 38082, + 38119, + 38096 + ], + "sample_count": 32 + }, + { + "pubkey": "ErYL5bUfaqE8oc7ukSbG8GEBsp5tsPpsDj6XKLZ7keMa", + "epoch": 129, + "origin_device_pk": "uzyg9iYw2FEbtdTHaDb5HoeEWYAPRPQgvsgyd873qPS", + "target_device_pk": "8J691gPwzy9FzUZQ4SmC6jJcY7By8kZXfbJwRfQ8ns31", + "link_pk": "5VjMUTNCDzmrfHkJ7MRftuvQjAmEv4da6WCm1Aqp9zzP", + "origin_device_location_pk": "BLq6wRjchvm2KkAG9hGV5hGFmK9uMbkHpJFnPTZWVyQu", + "target_device_location_pk": "6afTvCdW6ypuiCiyBRmbj1Ua5gFwkTVtPbon7CbN9gkX", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428404730, + "samples": [ + 245, + 264, + 248, + 202, + 217, + 236, + 209, + 247, + 243, + 253, + 211, + 234, + 204, + 227, + 265, + 239, + 231, + 234, + 241, + 229, + 233, + 249, + 228, + 259, + 249, + 234, + 239, + 241, + 264, + 258, + 221, + 219 + ], + "sample_count": 32 + }, + { + "pubkey": "Fro3R4nwgaLYSMkZQwKAZ9qWvueCVz6bQvTidpbhd3yi", + "epoch": 129, + "origin_device_pk": "Ddc96QyGecBsDGQ5Mtvato2UdrTQeAuuEUQBwhWpujRk", + "target_device_pk": "GbVWCMJaY4U7KAfM6iGLoGaz9qsreAzyNrZPMniTb54Q", + "link_pk": "7GM3AyxDVhZ335eq7bg3iokycP7M3vRj4R2bt4VN88dr", + "origin_device_location_pk": "9djn1eTM88UKSfKZyAQKhPryADxZ29dRgNsJQMoSpCkf", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "3SVfmSpnsDFX8kawSjjwd4MYUDR6qELot3yj6uww3Rgt", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143428420425, + "samples": [ + 31993, + 32004, + 31972, + 32037, + 31992, + 32051, + 32014, + 31993, + 32021, + 32016, + 31980, + 31993, + 32078, + 32058, + 31999, + 31996, + 31992, + 31981, + 32032, + 31994, + 32071, + 31994, + 32027, + 31993, + 31989, + 31999, + 32014, + 32055, + 32031, + 31981, + 32025, + 31983 + ], + "sample_count": 32 + }, + { + "pubkey": "BYPz6JUVKD5THeKUmaQXkxifCBF4YbTLnnqhFuAjHej2", + "epoch": 129, + "origin_device_pk": "7s6gT1iutNUKCNkzRGcN9RWEJ4T5gCgg1U4p9sRphwT1", + "target_device_pk": "83SQUuoufcgFYwHMEs7rXBib3NDj5t3wBxMSzznYfe4W", + "link_pk": "AwvKgL6P6rRmf8VRPXxWuboyQdcNqp4x986cghTWRk7S", + "origin_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "target_device_location_pk": "3p8Pzhq9F4WDgXniW3Lyk23xuT7M4jLLXqGq9xVtFFLM", + "origin_device_agent_pk": "1mxNqyteSoJqcfBeRfbB2UGhYhptj5UCWH6wGGN2rGS", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143423979135, + "samples": [ + 133, + 153, + 124, + 156, + 156, + 132, + 139, + 125, + 140, + 126, + 168, + 136, + 139, + 110, + 186, + 116, + 115, + 136, + 127, + 122, + 168, + 132, + 127, + 116, + 132, + 179, + 150, + 151, + 120, + 120, + 135, + 114 + ], + "sample_count": 32 + }, + { + "pubkey": "8JH68pThHw6Lonfd442LzsEihtrUic4REcSFeoirzC2Z", + "epoch": 129, + "origin_device_pk": "6WjPZwrMrZgwuEJMdyMAewvwSVig6HF5EVjCuF9LeJMm", + "target_device_pk": "DcyYy7A4Af8dh72CMs2yiqTo8jerdhXb9jmY1LcSU7u6", + "link_pk": "4r82w57HQbr9AH23mmeW9rhgtquMdxvzYCxf5gBuX4dj", + "origin_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "target_device_location_pk": "2ywv1yjkTBHBzUq1ocyQqNXdegrFT5xwhJsh2nLj7VHt", + "origin_device_agent_pk": "S3V96nRC5Qv83r9E51JM7uv27ohWihD62gja72SLmet", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425852763, + "samples": [ + 155, + 151, + 168, + 149, + 142, + 153, + 136, + 114, + 170, + 116, + 158, + 124, + 142, + 156, + 178, + 138, + 126, + 196, + 194, + 141, + 174, + 157, + 112, + 170, + 165, + 151, + 126, + 144, + 148, + 197, + 133, + 160 + ], + "sample_count": 32 + }, + { + "pubkey": "5iwgLbDH4ry4Sz9sJ72rfoYzS1MFarfBu1vkscEFtJ9X", + "epoch": 129, + "origin_device_pk": "6rqTWfDpBzx92yUi7JVuCp8EeRKH6umNiA6ANg54rEoi", + "target_device_pk": "7FfrX8YbvbzM8A1ojNynP9BjiKpK9rrmhdEdchB2myhG", + "link_pk": "H7NHBD35i4oQvwoiH4ocJL3qLABVj3Au5tGEgYUaBTxw", + "origin_device_location_pk": "2aDqcihcejSWManyqqZRJ8rpShaH6a718jmaQjkNTZfZ", + "target_device_location_pk": "CfQm1wAGaA9kpVAxT1Fy5MXYfSKbaDoUVJZJC1MStMrS", + "origin_device_agent_pk": "7fxtCsxuGKseMvUjGy1UYHKHKYQMWgejfig7WnogwAqM", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1775143425546265, + "samples": [ + 232, + 219, + 203, + 187, + 219, + 178, + 208, + 219, + 213, + 242, + 217, + 212, + 218, + 216, + 224, + 221, + 211, + 194, + 222, + 183, + 236, + 214, + 237, + 212, + 211, + 223, + 194, + 238, + 222, + 215, + 215, + 207 + ], + "sample_count": 32 + } + ] + }, + "dz_internet": { + "internet_latency_samples": [ + { + "pubkey": "7AgRAEun4UT9Du5FT1mGkXhytFppC3QqAQ8MsuiQX813", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143505000000, + "samples": [ + 7524, + 7524, + 8713, + 8713, + 8551, + 8551, + 7216, + 7216, + 8342, + 8342, + 7486, + 7563, + 7563, + 9461, + 9461, + 7674, + 7674, + 7410, + 7410, + 8091, + 8091, + 7621, + 7621, + 7656, + 7656, + 8130, + 8130, + 7914, + 7914, + 7658, + 7658, + 7908 + ], + "sample_count": 32 + }, + { + "pubkey": "5Rq1E8Ttk1VeVVuX7XkGB7TpNpQGqzar19YrmFkyH7MW", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143578000000, + "samples": [ + 9189, + 9174, + 9180, + 9203, + 9203, + 9167, + 9208, + 9180, + 9200, + 9238, + 9209, + 9198, + 9181, + 9175, + 9235, + 9169, + 9212, + 9207, + 9206, + 9187, + 9147, + 9190, + 9197, + 9190, + 9197, + 9210, + 9190, + 9190, + 9205, + 9224, + 9177, + 9203 + ], + "sample_count": 32 + }, + { + "pubkey": "AbYsXohQhiGGfxnYhuEmciEkb4g61AJPh2n9pCMU6qVR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 95511, + 104457, + 95862, + 95374, + 102424, + 102424, + 95499, + 95382, + 107155, + 95545, + 95363, + 105216, + 95576, + 95576, + 95435, + 107247, + 96514, + 95553, + 97634, + 96954, + 95353, + 111243, + 95429, + 96404, + 105389, + 95501, + 95449, + 113118, + 113118, + 95543, + 95640, + 95864 + ], + "sample_count": 32 + }, + { + "pubkey": "J5rVwuGGhLTv39y8mNSqLfG8eTWvMHJszfN7WGTjFqoD", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143570000000, + "samples": [ + 77194, + 77172, + 77180, + 77123, + 77259, + 77348, + 77139, + 77231, + 77383, + 77241, + 77200, + 77159, + 77202, + 77406, + 77430, + 77192, + 77181, + 77407, + 77380, + 77294, + 77195, + 77163, + 77410, + 77217, + 77282, + 77197, + 77122, + 77245, + 77227, + 77465, + 77293, + 77217 + ], + "sample_count": 32 + }, + { + "pubkey": "82M67ooUKRrPBFbuXL7v3NAVnnsWqqWYWKCW3nsddmjZ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 70209, + 70923, + 70365, + 70244, + 71243, + 70306, + 70225, + 70574, + 70406, + 70259, + 70657, + 70314, + 70198, + 70198, + 70633, + 70214, + 70247, + 71530, + 70267, + 70172, + 70574, + 70214, + 70429, + 70487, + 70257, + 70188, + 71245, + 71077, + 70178, + 70912, + 70189, + 70175 + ], + "sample_count": 32 + }, + { + "pubkey": "DCuSQUtc6SQar1rzSWAu6656yYbwBhKmHNRnhkABZnXY", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143569000000, + "samples": [ + 85206, + 85140, + 85266, + 85213, + 85247, + 85250, + 85267, + 85309, + 85416, + 85427, + 85234, + 85167, + 85248, + 85360, + 85186, + 85367, + 85249, + 85271, + 85181, + 85236, + 85240, + 85166, + 85362, + 85340, + 85282, + 85348, + 85196, + 85217, + 85241, + 85228, + 85236, + 85371 + ], + "sample_count": 32 + }, + { + "pubkey": "4qtaJn7fSQMi1RbGRfJZzFAs2e2sRzcCNtEsAWSfw4T4", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 23105, + 23542, + 23151, + 23188, + 23705, + 23222, + 23185, + 23364, + 23143, + 23154, + 23378, + 23276, + 23124, + 23953, + 23292, + 23171, + 23552, + 23210, + 23156, + 23876, + 23159, + 23231, + 23387, + 23264, + 23121, + 23381, + 23140, + 23187, + 23187, + 23593, + 23181, + 23101 + ], + "sample_count": 32 + }, + { + "pubkey": "FT7qawcYHkki4MP59t3ohMJmTQAbysw8XxSd63mwKgv7", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143569000000, + "samples": [ + 25395, + 25341, + 25349, + 25452, + 25481, + 25560, + 25419, + 25328, + 25381, + 25583, + 25389, + 25479, + 25445, + 25342, + 25553, + 25387, + 25375, + 25364, + 25362, + 25355, + 25428, + 25387, + 25461, + 25564, + 25387, + 25327, + 25320, + 25553, + 25415, + 25478, + 25353, + 25471 + ], + "sample_count": 32 + }, + { + "pubkey": "96AJySqJpSMiAc9TXmCcY959TxaZUBz4qPHERcuJawgY", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 33639, + 35076, + 33893, + 33543, + 33774, + 33506, + 33273, + 35270, + 33732, + 33251, + 33531, + 33386, + 33264, + 34280, + 33395, + 33263, + 34151, + 33434, + 33394, + 33653, + 33434, + 33397, + 34159, + 33477, + 33458, + 34058, + 33441, + 33311, + 35565, + 35248, + 35385, + 35735 + ], + "sample_count": 32 + }, + { + "pubkey": "9WdKm2T3cSwKFfKbNAgizkFYnfzFjEAkxmpywRHfvrti", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143564000000, + "samples": [ + 45359, + 45205, + 45131, + 45272, + 45289, + 45374, + 45095, + 45219, + 45366, + 45240, + 45208, + 45341, + 45194, + 45259, + 45281, + 45148, + 45175, + 45114, + 45199, + 45181, + 45151, + 45214, + 45221, + 45238, + 45261, + 45134, + 45163, + 45167, + 45360, + 45409, + 45219, + 45154 + ], + "sample_count": 32 + }, + { + "pubkey": "BthdiTTYvZfzTWYN6dwjjA33CZJFy3J8f2ws4rJct7Ps", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 35066, + 37737, + 37737, + 35149, + 35153, + 37389, + 35240, + 35066, + 37296, + 35782, + 35058, + 36225, + 35116, + 35073, + 36023, + 35264, + 35178, + 35773, + 35773, + 36626, + 35036, + 35941, + 35306, + 35083, + 35767, + 35066, + 35125, + 35410, + 35066, + 35139, + 36929, + 35293 + ], + "sample_count": 32 + }, + { + "pubkey": "JAaByWchmSVjD6LhTjukXjTmoTdwLo63jXSQ2eheEDYL", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143565000000, + "samples": [ + 36651, + 36650, + 36661, + 36560, + 36593, + 36669, + 36588, + 36649, + 36835, + 36743, + 36541, + 36625, + 36592, + 36742, + 36636, + 36583, + 36684, + 36587, + 36796, + 36722, + 36586, + 36582, + 36727, + 36708, + 36648, + 36688, + 36510, + 36624, + 36698, + 36814, + 36587, + 36659 + ], + "sample_count": 32 + }, + { + "pubkey": "4joDM7JNgjFNoU2DktGKYsU2pHaodT1geuktN9uYzxzc", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 227548, + 227870, + 227580, + 227312, + 228054, + 227665, + 227429, + 227802, + 228038, + 228038, + 227318, + 227865, + 227475, + 227355, + 227736, + 227736, + 227544, + 227395, + 227837, + 227593, + 227563, + 227705, + 227637, + 227493, + 227729, + 227729, + 227577, + 227483, + 227927, + 227755, + 227552, + 227872 + ], + "sample_count": 32 + }, + { + "pubkey": "31RWSPPgH27THADf3QA2nVeabwB7MTS3ke5r6stqbgYp", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143564000000, + "samples": [ + 244764, + 244714, + 244724, + 244768, + 244725, + 244837, + 244605, + 244754, + 244798, + 244793, + 244791, + 244779, + 244740, + 244710, + 244700, + 244793, + 244651, + 244798, + 244731, + 244714, + 244815, + 244706, + 244815, + 244747, + 244807, + 244726, + 244633, + 244673, + 244737, + 244746, + 244806, + 244642 + ], + "sample_count": 32 + }, + { + "pubkey": "2G56UGn1NVxG2aUBwrUP2y5eRw2bVurkdmJfXV3U7Mq9", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 106481, + 106881, + 106881, + 106528, + 106405, + 106746, + 106549, + 106383, + 106703, + 106954, + 111620, + 106816, + 106454, + 106442, + 106835, + 106496, + 106494, + 107017, + 106579, + 106397, + 106751, + 106494, + 106601, + 106886, + 106546, + 106452, + 106904, + 106510, + 106419, + 106923, + 106494, + 115926 + ], + "sample_count": 32 + }, + { + "pubkey": "8RNUBtS9rRLvwtdC6pfGaLwxF13x7y7M6dZbNCiuHPB1", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143565000000, + "samples": [ + 110787, + 110737, + 110701, + 110710, + 110695, + 110911, + 110709, + 110773, + 110866, + 110759, + 110685, + 110737, + 110784, + 110917, + 110691, + 110689, + 110642, + 110678, + 110736, + 110757, + 110888, + 110702, + 110665, + 110821, + 110753, + 110766, + 110791, + 110752, + 110787, + 110867, + 110933, + 110810 + ], + "sample_count": 32 + }, + { + "pubkey": "9NFC9Lr3m9xCFsYKPSQHJDFqbMLaQuh8RhGBZGUjRbs7", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 125620, + 126121, + 125665, + 125683, + 126193, + 125810, + 125663, + 125909, + 125976, + 125741, + 126359, + 125935, + 125707, + 126420, + 125835, + 125661, + 126350, + 126350, + 125757, + 125661, + 126196, + 125839, + 125839, + 125808, + 126386, + 125881, + 125774, + 126394, + 125666, + 125710, + 125899, + 125727 + ], + "sample_count": 32 + }, + { + "pubkey": "EHJ1hZBkrUzMgifkhv8xpCdbWTTdjQSUWdMn5HGopkz8", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143567000000, + "samples": [ + 142348, + 142193, + 142145, + 142210, + 142240, + 142264, + 142168, + 142145, + 142256, + 142032, + 141986, + 142210, + 142250, + 142234, + 142288, + 142227, + 142171, + 142147, + 142376, + 142254, + 141974, + 142297, + 142049, + 142137, + 142301, + 142175, + 141947, + 142244, + 142174, + 142263, + 142296, + 142214 + ], + "sample_count": 32 + }, + { + "pubkey": "4xgfAK2kE4W1ScCt9r6nmH5m4EgLyCVNxc4zpqxkz2ft", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 41936, + 42361, + 41972, + 41901, + 42517, + 41925, + 41907, + 41907, + 42554, + 42348, + 41922, + 42333, + 42021, + 41936, + 42130, + 41997, + 41911, + 41911, + 42924, + 42216, + 42101, + 42270, + 41952, + 41912, + 42422, + 42078, + 42023, + 42297, + 41978, + 42037, + 42340, + 42083 + ], + "sample_count": 32 + }, + { + "pubkey": "2qYtS4hFSZe5ZJy93P2Ziz3DNuj21dVtHF54dVCcEG8m", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143568000000, + "samples": [ + 43109, + 43212, + 43453, + 43168, + 43183, + 43005, + 43259, + 43256, + 43082, + 43200, + 43197, + 43260, + 43155, + 43224, + 43189, + 43197, + 43261, + 43426, + 43009, + 43168, + 43290, + 43192, + 43236, + 43431, + 43275, + 43180, + 43082, + 43317, + 43316, + 43143, + 43272, + 43149 + ], + "sample_count": 32 + }, + { + "pubkey": "GagXvvmTXnuomRvCSAJe18eN91tGq6ZKWx6Jz7WsLioK", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 81051, + 81801, + 81008, + 80930, + 81678, + 81004, + 81120, + 81624, + 81624, + 81285, + 81103, + 81223, + 81229, + 80931, + 81339, + 81038, + 80930, + 81340, + 81200, + 81009, + 81228, + 81228, + 81024, + 81345, + 81295, + 81021, + 81216, + 81300, + 81300, + 80976, + 80895, + 81220 + ], + "sample_count": 32 + }, + { + "pubkey": "6vbmXMb6Cv6fgyY3t5Lvf5qr8QfXrNsPRBTU2Wn4QJe2", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143569000000, + "samples": [ + 83417, + 83245, + 83491, + 83351, + 83393, + 83385, + 83361, + 83492, + 83551, + 83596, + 83599, + 83345, + 83513, + 83434, + 83394, + 83404, + 83563, + 83414, + 83569, + 83354, + 83379, + 83542, + 83551, + 83417, + 83377, + 83381, + 83532, + 83503, + 83414, + 83366, + 83613, + 83342 + ], + "sample_count": 32 + }, + { + "pubkey": "8CyjmTckQgLHAzgyh6ePniKgRyG1pdJagMKAwQx6bvb4", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 23550, + 23918, + 23640, + 23495, + 23880, + 23505, + 23808, + 25356, + 25377, + 24535, + 23869, + 24519, + 24083, + 25194, + 23385, + 23458, + 23458, + 24123, + 23588, + 25947, + 23940, + 23754, + 23754, + 25390, + 25456, + 23611, + 26608, + 26608, + 26242, + 25880, + 25690, + 26708 + ], + "sample_count": 32 + }, + { + "pubkey": "FRexLHVzJQiVCAT1wsjrqpMd3T11PnSTbi8q86xQwvLj", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143563000000, + "samples": [ + 22836, + 22883, + 22843, + 22668, + 22790, + 22647, + 22629, + 22699, + 22887, + 22775, + 22887, + 22714, + 22960, + 22680, + 22667, + 22635, + 22877, + 22706, + 22759, + 22814, + 22757, + 22771, + 22690, + 22680, + 22720, + 22624, + 22786, + 22870, + 22791, + 22930, + 22704, + 22912 + ], + "sample_count": 32 + }, + { + "pubkey": "FjxLqKpsow2wnfKcis7pn5qk8iFRzpvF7ohma5BBpsUx", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 168689, + 168786, + 168772, + 168631, + 168622, + 168646, + 168186, + 168623, + 168818, + 168818, + 168668, + 168792, + 168874, + 189234, + 189234, + 189597, + 168863, + 169333, + 170181, + 169384, + 169580, + 169580, + 170268, + 168691, + 169569, + 169818, + 169779, + 169594, + 169594, + 170615, + 169575, + 169634 + ], + "sample_count": 32 + }, + { + "pubkey": "BLXTwYNgrdXhiuDwu64VxaeaZ2dQfhbFMRrwHaNwoa3p", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143568000000, + "samples": [ + 202335, + 202188, + 202364, + 202416, + 202370, + 202349, + 202231, + 202454, + 202599, + 202532, + 202356, + 202262, + 202375, + 202367, + 202386, + 202448, + 202350, + 202406, + 202482, + 202585, + 202359, + 202342, + 202331, + 202466, + 202460, + 202452, + 202382, + 202498, + 202310, + 202513, + 202329, + 202259 + ], + "sample_count": 32 + }, + { + "pubkey": "6NaRUXVC1bJkh2CPAtjpD4yXVKMZyHKojWJtXHfDDzBr", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 165528, + 166428, + 165453, + 165145, + 166119, + 165996, + 165425, + 166380, + 172231, + 166042, + 168438, + 167822, + 165664, + 168491, + 165891, + 166101, + 166430, + 165995, + 166270, + 170049, + 165931, + 169152, + 166383, + 166543, + 167814, + 166457, + 166457, + 166620, + 166329, + 166329, + 167201, + 165807 + ], + "sample_count": 32 + }, + { + "pubkey": "Be5WwdG7X8N7nBN4VExBa74qV6wy7Jqh8QeGsHejrVf1", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143567000000, + "samples": [ + 163450, + 163310, + 163443, + 163342, + 163370, + 163409, + 163463, + 163380, + 163437, + 163529, + 163390, + 163523, + 163364, + 163334, + 163498, + 163361, + 163423, + 163408, + 163365, + 163348, + 163454, + 163301, + 163521, + 163464, + 163480, + 163411, + 163474, + 163464, + 163439, + 163394, + 163368, + 163325 + ], + "sample_count": 32 + }, + { + "pubkey": "4yQMPKjrv77KYQMCFWaQEkiGCKcMspkVasQ4Ti3bcGmz", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 82743, + 83220, + 82963, + 82963, + 82650, + 83209, + 82953, + 82702, + 83174, + 82910, + 83114, + 82869, + 82666, + 82666, + 83077, + 82696, + 82761, + 83243, + 82801, + 82801, + 82875, + 82895, + 82734, + 82783, + 83004, + 82994, + 82904, + 83001, + 82962, + 82848, + 83171, + 82958 + ], + "sample_count": 32 + }, + { + "pubkey": "5mDDA9EzyxstFTQTBofYahPxEBhJJNhAdBEJSVajjzEg", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143570000000, + "samples": [ + 93682, + 93514, + 93565, + 93546, + 93672, + 93677, + 93440, + 93644, + 93708, + 93569, + 93735, + 93505, + 93585, + 93516, + 93594, + 93537, + 93481, + 93583, + 93580, + 93543, + 93598, + 93671, + 93668, + 93542, + 93743, + 93549, + 93680, + 93587, + 93564, + 93600, + 93688, + 93534 + ], + "sample_count": 32 + }, + { + "pubkey": "8CqzrvsiWoY6rThXED2RgAPf2T8v1WZa1rHtc37hEeyN", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 126327, + 126327, + 126886, + 126480, + 126383, + 126698, + 126495, + 126456, + 127080, + 127000, + 126553, + 126799, + 126497, + 126400, + 126659, + 126491, + 126438, + 127302, + 126587, + 126413, + 126779, + 126523, + 126765, + 126603, + 126471, + 126453, + 126453, + 127020, + 126547, + 126293, + 127533, + 126585 + ], + "sample_count": 32 + }, + { + "pubkey": "66y8ZdDaq9HAyWgUffGAKLd4p7TyWjKNnupy71p785yV", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143571000000, + "samples": [ + 144404, + 144380, + 144469, + 144413, + 144462, + 144455, + 144410, + 144674, + 144477, + 144495, + 144507, + 144406, + 144572, + 144461, + 144515, + 144461, + 144403, + 144505, + 144502, + 144635, + 144464, + 144397, + 144613, + 144420, + 144567, + 144484, + 144369, + 144507, + 144565, + 144482, + 144641, + 144337 + ], + "sample_count": 32 + }, + { + "pubkey": "3zdYihrkekwJ3FkErBmXsewhUw8GYp314giVLcaHAyui", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 192561, + 193013, + 192887, + 192420, + 193373, + 192619, + 192572, + 193189, + 192618, + 192505, + 192761, + 192525, + 192591, + 192999, + 192553, + 192524, + 193638, + 192717, + 192504, + 192811, + 192493, + 192515, + 192515, + 192925, + 192750, + 192540, + 193132, + 192657, + 192553, + 192802, + 197173, + 197173 + ], + "sample_count": 32 + }, + { + "pubkey": "2qxUJ9zTKy6v154eayDiJLMd23mEtRocXY4HF8vEFFUX", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143572000000, + "samples": [ + 195037, + 194899, + 195087, + 195202, + 195273, + 195125, + 194964, + 195123, + 195094, + 195200, + 195249, + 195066, + 195317, + 195152, + 195017, + 195346, + 194978, + 195122, + 195135, + 195152, + 195176, + 194985, + 194980, + 195223, + 195082, + 195224, + 194858, + 194919, + 195131, + 194914, + 195058, + 195058 + ], + "sample_count": 32 + }, + { + "pubkey": "CkGbjFkfNcLM7CbTSdqBk9FcDwxcoAPPLd5bzruccqXj", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 80463, + 80839, + 80522, + 80522, + 80451, + 81028, + 123825, + 87119, + 106778, + 128855, + 98332, + 86297, + 94160, + 83729, + 82900, + 103590, + 83312, + 83312, + 92458, + 127259, + 131266, + 130116, + 112494, + 109613, + 122893, + 120486, + 119478, + 105471, + 86348, + 83348, + 117750, + 80812 + ], + "sample_count": 32 + }, + { + "pubkey": "4FkSKTETZtLK2k6NyVwgN9GvUEr6PgDy2qaDLXXYeQrW", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143571000000, + "samples": [ + 75229, + 75082, + 75102, + 75233, + 75060, + 75136, + 75225, + 75240, + 75169, + 75042, + 75165, + 75224, + 75270, + 75064, + 75052, + 74974, + 75073, + 75030, + 75211, + 75257, + 75158, + 75137, + 75022, + 75047, + 75171, + 74932, + 74997, + 75232, + 75185, + 75238, + 75143, + 75058 + ], + "sample_count": 32 + }, + { + "pubkey": "A4zckLK3BWA39UbAkmGjqKiYc7ag9cH3S3nxbPm46qZ4", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 33574, + 33902, + 33729, + 33729, + 33456, + 33827, + 33730, + 33586, + 34243, + 33622, + 33593, + 34044, + 33545, + 33550, + 34475, + 33537, + 33624, + 34194, + 33770, + 33476, + 33777, + 33632, + 33508, + 33810, + 33581, + 33593, + 33856, + 33620, + 33530, + 33946, + 33674, + 33498 + ], + "sample_count": 32 + }, + { + "pubkey": "7Y1khrA3fpsgK6xbWUHVHP9nNek2fFqkHRVhDFEV4RzC", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143562000000, + "samples": [ + 31812, + 31900, + 31857, + 31863, + 31936, + 31830, + 31836, + 31878, + 31870, + 31904, + 31891, + 31823, + 31856, + 31943, + 31877, + 31856, + 31856, + 31846, + 31862, + 31884, + 31921, + 31894, + 31843, + 32051, + 31944, + 31846, + 31918, + 32064, + 32070, + 31893, + 32070, + 31905 + ], + "sample_count": 32 + }, + { + "pubkey": "9MDZZ3Q5A1CZ7qwMT7LA6neMP7AKc4aJE1U9wCgWZaTH", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 28893, + 29317, + 28915, + 28778, + 29225, + 28967, + 28817, + 29252, + 29105, + 28872, + 28872, + 29045, + 28980, + 28841, + 29187, + 28913, + 28899, + 29314, + 28860, + 28742, + 29275, + 28957, + 28946, + 29595, + 28918, + 28864, + 29508, + 28902, + 28792, + 30356, + 29135, + 28872 + ], + "sample_count": 32 + }, + { + "pubkey": "64m81cXarQzqJcb1LoSNTX4zBpT3LCjVi4LF6xYYhs3s", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143563000000, + "samples": [ + 26735, + 26679, + 26723, + 26730, + 26718, + 26689, + 26679, + 26640, + 26813, + 26710, + 26815, + 26863, + 26655, + 26751, + 26717, + 26751, + 26783, + 26722, + 26692, + 26694, + 26706, + 26697, + 26882, + 26862, + 26894, + 26739, + 26672, + 26739, + 26861, + 26699, + 26739, + 26765 + ], + "sample_count": 32 + }, + { + "pubkey": "DmeYvtCmJ6bGqE7M83JAQTdn6Pkhow5wwyXT2W1xwtf7", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 29660, + 30482, + 29909, + 29959, + 30698, + 29779, + 29557, + 31816, + 30014, + 29694, + 31333, + 29961, + 29961, + 29674, + 31993, + 31993, + 29696, + 29710, + 29979, + 33199, + 29612, + 30894, + 30244, + 30030, + 31770, + 29875, + 29699, + 30627, + 29782, + 29692, + 29914, + 30142 + ], + "sample_count": 32 + }, + { + "pubkey": "53qQwSq9hngqTGAYNpWGsvzXMomSmfezviYh4nUmYZoq", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143565000000, + "samples": [ + 30320, + 30260, + 30254, + 30315, + 30335, + 30264, + 30277, + 30380, + 30315, + 30314, + 30333, + 30283, + 30498, + 30258, + 30462, + 30489, + 30304, + 30257, + 30292, + 30483, + 30217, + 30307, + 30397, + 30523, + 30435, + 30304, + 30291, + 30446, + 30410, + 30276, + 30291, + 30329 + ], + "sample_count": 32 + }, + { + "pubkey": "2r33EAQZb2Rr6yNBjnp17iSfnNofWmwseLhDqjLtFrwB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 112607, + 113730, + 112887, + 112658, + 112658, + 113268, + 112780, + 113004, + 113550, + 113550, + 112948, + 112602, + 113023, + 112614, + 112734, + 113275, + 112645, + 112637, + 112637, + 112878, + 112977, + 112637, + 112637, + 113093, + 112776, + 112776, + 112616, + 113950, + 113950, + 112776, + 112707, + 112952 + ], + "sample_count": 32 + }, + { + "pubkey": "AK92ByXBsszyeddqJWeTp9oeRXWK4u6rX7nHayksjgP2", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143567000000, + "samples": [ + 151310, + 151098, + 151183, + 151285, + 151253, + 151460, + 151157, + 151379, + 151343, + 151268, + 151195, + 151318, + 151501, + 151392, + 151286, + 151251, + 151340, + 151394, + 151247, + 151343, + 151383, + 151098, + 151293, + 151343, + 151447, + 151213, + 151474, + 151391, + 151379, + 151439, + 151480, + 151166 + ], + "sample_count": 32 + }, + { + "pubkey": "A1qMwcUURzyBShNV6xnY9AGpbaKhSEPTEEVJGQ2HXAw8", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 130001, + 130001, + 130247, + 129901, + 129972, + 130245, + 129664, + 129802, + 130399, + 130018, + 130018, + 129883, + 129933, + 129884, + 129868, + 130361, + 129984, + 130157, + 130350, + 129848, + 129904, + 130582, + 129763, + 129906, + 130315, + 129836, + 129869, + 130219, + 129883, + 129979, + 130013, + 129973 + ], + "sample_count": 32 + }, + { + "pubkey": "BdMc4tVNsM4NnnjmPmBP7ZXPz1k2QAtwNnb6zNVfv7zd", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143563000000, + "samples": [ + 141595, + 141652, + 141742, + 141755, + 141784, + 141718, + 141727, + 141927, + 141781, + 141782, + 141728, + 141856, + 141773, + 141955, + 141735, + 141665, + 141622, + 141835, + 141911, + 141722, + 141644, + 141854, + 141799, + 141807, + 141824, + 141770, + 141796, + 141721, + 141727, + 141893, + 141801, + 141557 + ], + "sample_count": 32 + }, + { + "pubkey": "E82Y5VKio7j7ptFdkjxUNDHTK1x6G4q2Jh7Gz69STAri", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 31895, + 31895, + 32159, + 32134, + 31994, + 35120, + 31984, + 32035, + 33405, + 32321, + 31972, + 32121, + 32021, + 32109, + 32370, + 31947, + 31947, + 31921, + 31921, + 33322, + 31948, + 31884, + 32278, + 32070, + 32133, + 32310, + 32310, + 32139, + 32139, + 31975, + 31975, + 32086 + ], + "sample_count": 32 + }, + { + "pubkey": "nhEk87UocNPTj41fo89VMX7CyoN9bxC4hS69FX8Y8HH", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143566000000, + "samples": [ + 41146, + 41120, + 41034, + 41073, + 41211, + 41232, + 41037, + 41254, + 41131, + 41120, + 41220, + 41123, + 41152, + 41337, + 41277, + 41337, + 41157, + 41247, + 41158, + 41199, + 41191, + 41045, + 41120, + 41314, + 41236, + 41074, + 40948, + 41185, + 41191, + 41190, + 41240, + 41034 + ], + "sample_count": 32 + }, + { + "pubkey": "3gpX2M6YbcN7Y3JgRekJ3xSqGVU5aUqoX5S66qDtRSqu", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 11157, + 11703, + 11703, + 11344, + 11155, + 11488, + 11382, + 11289, + 11483, + 11530, + 11282, + 11486, + 11486, + 11198, + 11181, + 11733, + 11535, + 11156, + 12139, + 11294, + 11380, + 11981, + 11248, + 11233, + 11469, + 11287, + 11205, + 11655, + 11328, + 11228, + 11536, + 11174 + ], + "sample_count": 32 + }, + { + "pubkey": "ARcrE4digk3otGTquqEkkahJpEu81zb3UweQuxv6sS3Q", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143562000000, + "samples": [ + 9980, + 10164, + 10097, + 9999, + 9979, + 9874, + 9967, + 10025, + 10254, + 10118, + 10057, + 9956, + 9988, + 9928, + 10182, + 9874, + 10218, + 9977, + 10135, + 10082, + 9968, + 10049, + 9999, + 10100, + 10022, + 9801, + 10069, + 9994, + 10150, + 10096, + 9960, + 10245 + ], + "sample_count": 32 + }, + { + "pubkey": "HMRnMMGExrnh9HF91gMKHoeApMBS94tcAJhwoweBoUjU", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 49300, + 49433, + 49586, + 49258, + 49568, + 49355, + 49153, + 50251, + 50125, + 49221, + 50463, + 49564, + 49564, + 49244, + 51685, + 49881, + 49293, + 50041, + 49425, + 49357, + 49450, + 49727, + 49706, + 49828, + 49294, + 49323, + 52268, + 49315, + 49251, + 49550, + 49568, + 49623 + ], + "sample_count": 32 + }, + { + "pubkey": "A16amAcpJJKX4cNKyJevCuQJMAWHDdmATaExxeqpaFuk", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143566000000, + "samples": [ + 53506, + 53440, + 53649, + 53538, + 53575, + 53563, + 53543, + 53501, + 53587, + 53542, + 53574, + 53729, + 53705, + 53721, + 53630, + 53506, + 53530, + 53526, + 53521, + 53458, + 53557, + 53721, + 53608, + 53680, + 53700, + 53538, + 53696, + 53672, + 53543, + 53665, + 53483, + 53444 + ], + "sample_count": 32 + }, + { + "pubkey": "3pFQBigrtuKBXZVC4aGg8t9ZUADZWi4uZDCbggSpFcMR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 22338, + 33068, + 21784, + 21827, + 30626, + 21847, + 21746, + 34972, + 21796, + 21793, + 30471, + 21787, + 21800, + 21800, + 33063, + 21848, + 21912, + 22875, + 21995, + 21775, + 21775, + 33569, + 22561, + 21830, + 30709, + 22106, + 22136, + 22136, + 33685, + 23793, + 22154, + 28712 + ], + "sample_count": 32 + }, + { + "pubkey": "AyKdaCzRR6kntfyxQyu1MxXdQJxNmL2jy7noNG4sxcPG", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143576000000, + "samples": [ + 16171, + 16139, + 16165, + 16138, + 16168, + 16158, + 16158, + 16139, + 16174, + 16190, + 16161, + 16155, + 16146, + 16140, + 16184, + 16148, + 16148, + 16148, + 16143, + 16172, + 16151, + 16152, + 16169, + 16183, + 16198, + 16161, + 16174, + 16164, + 16186, + 16181, + 16158, + 16164 + ], + "sample_count": 32 + }, + { + "pubkey": "2vVZMyqVmPwLoqGKbuSx8Q7vJR9B7d2o1SQv3Mzgn3Un", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 86855, + 86936, + 86825, + 86832, + 87040, + 86930, + 86792, + 87008, + 86821, + 87621, + 87621, + 87061, + 100012, + 100012, + 88610, + 87084, + 86973, + 86973, + 93853, + 94364, + 86923, + 100473, + 118556, + 87415, + 126353, + 112530, + 121889, + 133189, + 133189, + 125323, + 108599, + 127511 + ], + "sample_count": 32 + }, + { + "pubkey": "CUjVfaD8miAx4XM15NkFneuYab8K6ED5Vnd5W1JCTNej", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143576000000, + "samples": [ + 90602, + 90608, + 90616, + 90632, + 90624, + 90643, + 90605, + 90591, + 90609, + 90589, + 90572, + 90617, + 90620, + 90618, + 90605, + 90616, + 90618, + 90616, + 90609, + 90608, + 90623, + 90589, + 90591, + 90596, + 90650, + 90558, + 90606, + 90588, + 90625, + 90607, + 90576, + 90650 + ], + "sample_count": 32 + }, + { + "pubkey": "Ba7tygcxbLxv52nWV6aTJMZD6R1bcRnP5rQePCtewCPj", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 112125, + 112125, + 112140, + 112279, + 112279, + 112124, + 112951, + 112151, + 112230, + 112135, + 112123, + 112134, + 112187, + 112215, + 112233, + 112153, + 112132, + 112405, + 112142, + 112336, + 112336, + 112154, + 112049, + 112169, + 112056, + 112160, + 112160, + 112253, + 112210, + 112254, + 112338, + 112062 + ], + "sample_count": 32 + }, + { + "pubkey": "HAQToQnsXoNi6RLGxmk6K2ENASNCLXBZUDffjKHcFXgZ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143573000000, + "samples": [ + 113914, + 113915, + 113945, + 113866, + 113892, + 113914, + 113923, + 113878, + 113892, + 113922, + 113879, + 113889, + 113924, + 113886, + 113892, + 113919, + 113898, + 113888, + 113910, + 113929, + 113883, + 113888, + 113889, + 113894, + 113898, + 113942, + 113874, + 113892, + 113940, + 113868, + 113880, + 113897 + ], + "sample_count": 32 + }, + { + "pubkey": "7ieZ4Y2haU76KctDb8CGkQvgtscTseTHCMFPR9Uak9sx", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 102899, + 103144, + 103151, + 102798, + 103849, + 103849, + 103090, + 102792, + 104981, + 102805, + 102805, + 103593, + 107166, + 103161, + 102887, + 102887, + 102819, + 102907, + 103240, + 103852, + 103133, + 102839, + 105430, + 102770, + 102910, + 103237, + 103392, + 103392, + 102921, + 102911, + 103358, + 102831 + ], + "sample_count": 32 + }, + { + "pubkey": "BVuQgWUvmzc44LSxfmzAWbFPVbqtPBgazHCE8UkJeGRp", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143573000000, + "samples": [ + 105088, + 105140, + 105127, + 105128, + 105168, + 105120, + 105124, + 105059, + 105136, + 105119, + 105147, + 105090, + 105109, + 105097, + 105122, + 105091, + 105085, + 105071, + 105098, + 105092, + 105048, + 105095, + 105067, + 105166, + 105070, + 105092, + 105131, + 105120, + 105077, + 105096, + 105109, + 105122 + ], + "sample_count": 32 + }, + { + "pubkey": "JuoScoCSZgqPKvbwrkAvdfDtfEdcgzfkFJ4gjPBYZ9c", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 156475, + 156507, + 156435, + 156435, + 156351, + 156810, + 156588, + 156641, + 156643, + 156588, + 156407, + 156582, + 156438, + 156484, + 156926, + 156418, + 156373, + 156699, + 156465, + 156328, + 156592, + 156567, + 156443, + 156443, + 156488, + 156592, + 156653, + 156734, + 156530, + 156513, + 156482, + 156335 + ], + "sample_count": 32 + }, + { + "pubkey": "8TH7sZDn2ApQzzd4ahYtpANxorChKat8umoXhH8a84Ck", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143572000000, + "samples": [ + 132102, + 132120, + 132095, + 132152, + 132028, + 132105, + 132045, + 132042, + 132065, + 132066, + 132019, + 132130, + 132098, + 132010, + 132042, + 132084, + 132106, + 132030, + 132111, + 132008, + 132022, + 132094, + 132097, + 132027, + 132105, + 132113, + 132127, + 132051, + 132142, + 132010, + 132072, + 132008 + ], + "sample_count": 32 + }, + { + "pubkey": "EQKwWNwk6dBY8fL2HEmqxp77S2Pa5WBDhs1RjdqMua8r", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 122443, + 122339, + 122423, + 122358, + 122370, + 122674, + 122354, + 122354, + 122327, + 122519, + 122444, + 122420, + 122420, + 122419, + 122419, + 122548, + 122543, + 122342, + 122393, + 122523, + 122413, + 122371, + 122371, + 122362, + 122442, + 122425, + 122415, + 122408, + 122416, + 122367, + 122485, + 122459 + ], + "sample_count": 32 + }, + { + "pubkey": "6emvDTwmfWCkbxkAZkSB2ZGvuWDFbuNYogv2YDkiE2Nx", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143575000000, + "samples": [ + 97356, + 97459, + 97232, + 97478, + 97311, + 97482, + 97447, + 97268, + 97512, + 97450, + 97400, + 97256, + 97463, + 97429, + 97321, + 97395, + 97472, + 97354, + 97258, + 97350, + 97269, + 97504, + 97309, + 97469, + 97397, + 97444, + 97330, + 97230, + 97542, + 97472, + 97409, + 97417 + ], + "sample_count": 32 + }, + { + "pubkey": "DjFs7ESqT5gT2YKi6Nb5jLHPw5gxsHbL46Kpkqt3o6jW", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 19809, + 19787, + 19678, + 19660, + 19851, + 19852, + 19808, + 19794, + 19686, + 19774, + 20010, + 19985, + 20048, + 19742, + 19679, + 19750, + 19767, + 19653, + 19761, + 20389, + 19589, + 19768, + 19768, + 19935, + 19935, + 19639, + 19911, + 19739, + 19709, + 19627, + 19765, + 19616 + ], + "sample_count": 32 + }, + { + "pubkey": "7iaoFAEsVRuCZiV9CNrfFnjouCgeH19KBjuNE8xZDytG", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143576000000, + "samples": [ + 16804, + 16781, + 16826, + 16785, + 16768, + 16794, + 16822, + 16767, + 16804, + 16799, + 16813, + 16807, + 16780, + 16814, + 16779, + 16793, + 16789, + 16750, + 16803, + 16775, + 16802, + 16773, + 16808, + 16834, + 16771, + 16823, + 16808, + 16806, + 16818, + 16791, + 16780, + 16813 + ], + "sample_count": 32 + }, + { + "pubkey": "A9MQMKkjuidfvSQYbyJEPHR1WFjpGfNrn9TTJ1gR4Mr3", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 121401, + 122007, + 121097, + 121242, + 121431, + 121131, + 121471, + 121784, + 121658, + 121350, + 121350, + 121283, + 121569, + 121569, + 121088, + 121233, + 121619, + 121729, + 122493, + 121622, + 121660, + 121621, + 121390, + 121536, + 121779, + 121773, + 121578, + 121570, + 121280, + 121280, + 132128, + 121321 + ], + "sample_count": 32 + }, + { + "pubkey": "ErPVAKMoRQGGjCEf6XBUdLEEipT6eq3Hu5FXGKoYVjrT", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143575000000, + "samples": [ + 143682, + 143630, + 143628, + 143620, + 143646, + 143651, + 143583, + 143667, + 143638, + 143662, + 143648, + 143616, + 143659, + 143677, + 143665, + 143660, + 143649, + 143639, + 143590, + 143555, + 143647, + 143644, + 143629, + 143650, + 143630, + 143680, + 143708, + 143645, + 143679, + 143681, + 143616, + 143678 + ], + "sample_count": 32 + }, + { + "pubkey": "2MYFTAn7MFBuzWGZCHohPmspMfhQpBQK4tgtgmj7vqnX", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 245189, + 269884, + 230539, + 230481, + 233407, + 230453, + 230228, + 250574, + 230346, + 230542, + 230942, + 230235, + 230263, + 230545, + 230406, + 230215, + 230255, + 230253, + 230431, + 230617, + 230687, + 230649, + 230279, + 230279, + 230362, + 230362, + 252778, + 230291, + 230239, + 237822, + 230209, + 230295 + ], + "sample_count": 32 + }, + { + "pubkey": "BhRzhr8BU7phVJV4BFxEr41Ay2K4Ct1wEc9QRBRNXBjP", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143574000000, + "samples": [ + 196018, + 196006, + 196007, + 196009, + 196012, + 195969, + 195994, + 195982, + 195991, + 196023, + 195973, + 195980, + 195995, + 195967, + 195981, + 195977, + 195930, + 195958, + 195941, + 195985, + 196014, + 195976, + 195981, + 195985, + 195953, + 195990, + 195982, + 195993, + 195969, + 195958, + 195968, + 195959 + ], + "sample_count": 32 + }, + { + "pubkey": "2pyaxM1nLpD4ymJpMfdmLmJFwefrNu7rdCV3Lm8jv2QQ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 11908, + 12117, + 12197, + 11947, + 11947, + 11999, + 11993, + 11922, + 11850, + 11838, + 12078, + 11974, + 11943, + 11974, + 11857, + 11885, + 11885, + 11915, + 11915, + 11748, + 11978, + 11978, + 11999, + 11851, + 11965, + 12096, + 12001, + 12108, + 12697, + 12050, + 11895, + 11895 + ], + "sample_count": 32 + }, + { + "pubkey": "GFKx71RsSve98sH4D7f6jPWPvTkW9oJ14XQXc5hXaxQs", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143577000000, + "samples": [ + 5329, + 5328, + 5348, + 5345, + 5324, + 5344, + 5294, + 5371, + 5305, + 5325, + 5340, + 5316, + 5337, + 5308, + 5344, + 5335, + 5313, + 5348, + 5324, + 5274, + 5350, + 5304, + 5355, + 5384, + 5356, + 5324, + 5313, + 5344, + 5327, + 5306, + 5335, + 5354 + ], + "sample_count": 32 + }, + { + "pubkey": "4TY9FPVvwBfHbm2KsvU8Ryz9ntHd2mkkDv6e5kLNVGRw", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 53023, + 53133, + 52856, + 52936, + 53063, + 52740, + 52928, + 52816, + 52823, + 52913, + 53164, + 52986, + 52821, + 52821, + 53017, + 52743, + 52743, + 52998, + 52865, + 52973, + 52925, + 53086, + 52853, + 52853, + 53032, + 52891, + 52925, + 52882, + 53035, + 52972, + 52947, + 53183 + ], + "sample_count": 32 + }, + { + "pubkey": "9f8yWuMoFd93uSW2ZWdPm9yS3S3ApB83BsBAX3B8bokb", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143577000000, + "samples": [ + 56761, + 56798, + 56753, + 56753, + 56797, + 56769, + 56813, + 56786, + 56792, + 56808, + 56793, + 56785, + 56790, + 56780, + 56781, + 56788, + 56777, + 56803, + 56786, + 56787, + 56809, + 56777, + 56812, + 56811, + 56760, + 56761, + 56819, + 56806, + 56800, + 56797, + 56767, + 56817 + ], + "sample_count": 32 + }, + { + "pubkey": "7eBHxVkKKHat921uoFv4bXk57qyiZ3B9hTJxwqBWrPVb", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 40837, + 40994, + 40994, + 41294, + 40911, + 41037, + 41037, + 41195, + 41030, + 40872, + 41441, + 40939, + 41095, + 41186, + 41125, + 41125, + 41876, + 41758, + 41059, + 41059, + 41062, + 41106, + 40882, + 41491, + 40912, + 40955, + 40961, + 41031, + 41124, + 41074, + 41074, + 41153 + ], + "sample_count": 32 + }, + { + "pubkey": "F1Ma53DPYcQ5Atz435K5cEmGk1TAGZGjQiWMqaqQsZg4", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143574000000, + "samples": [ + 65793, + 65730, + 65776, + 65775, + 65729, + 65725, + 65783, + 65795, + 65803, + 65804, + 65721, + 65738, + 65776, + 65773, + 65728, + 65726, + 65739, + 65782, + 65825, + 65685, + 65709, + 65737, + 65751, + 65720, + 65717, + 65793, + 65758, + 65749, + 65772, + 65832, + 65783, + 65759 + ], + "sample_count": 32 + }, + { + "pubkey": "JA5eYQuWiZoJ6ZrS5MeeSte8tyEHzAQapiVCsNYhJ5ik", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 58627, + 58558, + 58683, + 58770, + 59348, + 59315, + 58549, + 58657, + 58884, + 58884, + 58598, + 59015, + 58581, + 58744, + 58648, + 58529, + 58574, + 58998, + 58483, + 58628, + 59171, + 58808, + 58564, + 58801, + 58801, + 58841, + 58599, + 58658, + 58489, + 58588, + 58653, + 58701 + ], + "sample_count": 32 + }, + { + "pubkey": "C4ud5dR39ZX2u7c4wBchfj1D3fntDSFZoddy3cB2ZoCf", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143572000000, + "samples": [ + 66111, + 66111, + 66104, + 66114, + 66014, + 66019, + 66030, + 66011, + 66087, + 66110, + 66058, + 65993, + 66084, + 66123, + 66002, + 66112, + 66110, + 66091, + 66079, + 66082, + 66115, + 66029, + 66084, + 66105, + 66132, + 66124, + 66028, + 66037, + 66028, + 66017, + 65946, + 66071 + ], + "sample_count": 32 + }, + { + "pubkey": "9EiSEDihqPpdD3xTGCY4Hk8JbY3XegUHWZ8bm57UDm72", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 114177, + 115797, + 114146, + 113960, + 117090, + 114382, + 114026, + 114049, + 114049, + 113993, + 114021, + 114218, + 114252, + 114201, + 114671, + 114671, + 114389, + 114168, + 114168, + 115963, + 114630, + 114022, + 116468, + 116468, + 114076, + 114341, + 114108, + 114331, + 114156, + 114831, + 114096, + 114029 + ], + "sample_count": 32 + }, + { + "pubkey": "9XBujWzsg6sTGz4n583P3VD25ttZVMEf8g7Vi5mpcAL6", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143574000000, + "samples": [ + 120765, + 120769, + 120773, + 120763, + 120777, + 120748, + 120776, + 120753, + 120721, + 120743, + 120748, + 120782, + 120782, + 120761, + 120746, + 120783, + 120755, + 120741, + 120734, + 120735, + 120779, + 120732, + 120761, + 120770, + 120794, + 120746, + 120782, + 120748, + 120773, + 120780, + 120787, + 120791 + ], + "sample_count": 32 + }, + { + "pubkey": "DRg9L6s7Jd7oZwKHRsN188GPzhfod4W2v7mi47o7xrtC", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 98789, + 108663, + 98463, + 98510, + 100778, + 99896, + 98631, + 111226, + 98540, + 98736, + 107039, + 107039, + 98623, + 98465, + 115171, + 115171, + 98485, + 99416, + 99416, + 101415, + 100855, + 98459, + 111405, + 98608, + 98600, + 111039, + 98556, + 98556, + 98530, + 108772, + 99309, + 98690 + ], + "sample_count": 32 + }, + { + "pubkey": "8PVTWKwLyVRhV5CXk7SDD2EvUP4yLxcTwtvRA1Lh7ZC2", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143549000000, + "samples": [ + 97925, + 97941, + 97950, + 97924, + 97981, + 97942, + 97936, + 97968, + 97966, + 97953, + 97958, + 97943, + 97950, + 97984, + 97942, + 97965, + 97945, + 97941, + 97934, + 97946, + 97937, + 97971, + 97939, + 97972, + 97959, + 97961, + 97959, + 97966, + 97962, + 97957, + 97936, + 97935 + ], + "sample_count": 32 + }, + { + "pubkey": "81aw17xyR5atjbBZqT9YDsMHVM9PnjrQwiTH15Xcy9uq", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 244307, + 244076, + 244221, + 244018, + 244118, + 244302, + 244268, + 244268, + 244345, + 244247, + 244247, + 244209, + 244182, + 244218, + 244205, + 244116, + 244379, + 244155, + 244104, + 244104, + 244152, + 244129, + 244205, + 244205, + 244331, + 244091, + 244351, + 244382, + 244120, + 244598, + 244291, + 244291 + ], + "sample_count": 32 + }, + { + "pubkey": "3PyGDf1EppNycsUvLYgjkUaWV72uvUMUcUsNQcmZypad", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143548000000, + "samples": [ + 251591, + 251722, + 251618, + 251573, + 251629, + 251605, + 251682, + 247388, + 247366, + 247632, + 251685, + 251648, + 251689, + 251628, + 251619, + 251643, + 251712, + 247427, + 247410, + 247465, + 247379, + 247409, + 247393, + 247380, + 247443, + 247491, + 247456, + 247399, + 247383, + 247387, + 247413, + 247434 + ], + "sample_count": 32 + }, + { + "pubkey": "3upb4CsZtrUotnCF21kXyrFsrpzAKbkAh7Z4y8x2zpGm", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 22687, + 22687, + 22532, + 22532, + 22568, + 22536, + 22536, + 22639, + 22736, + 22513, + 25283, + 22728, + 22529, + 22456, + 22470, + 22458, + 22498, + 22560, + 22560, + 22589, + 22523, + 22784, + 22368, + 22368, + 22582, + 22567, + 22618, + 22626, + 22637, + 22546, + 22567, + 22567 + ], + "sample_count": 32 + }, + { + "pubkey": "9YA3dp12mKHKj3ojHXgAT64Gj4LuzHazvhHPNuvLyud9", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143548000000, + "samples": [ + 21080, + 21002, + 21228, + 21161, + 21284, + 21241, + 21136, + 20981, + 21232, + 21242, + 20978, + 21028, + 20989, + 21236, + 21216, + 21019, + 21014, + 21006, + 21210, + 21216, + 21132, + 21246, + 21228, + 21216, + 20966, + 21213, + 21162, + 21027, + 21166, + 20993, + 21251, + 21216 + ], + "sample_count": 32 + }, + { + "pubkey": "aiF92NPL5tLfSUTGJoVZRb2f9Fzn4A64n9hgMnpGiXV", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 92679, + 92436, + 92713, + 92713, + 92302, + 93234, + 93234, + 92365, + 92560, + 92376, + 92595, + 92467, + 92841, + 92561, + 92993, + 92697, + 92407, + 92537, + 92580, + 92434, + 92434, + 92590, + 92504, + 92775, + 92511, + 92511, + 93117, + 93117, + 92426, + 92479, + 92479, + 92424 + ], + "sample_count": 32 + }, + { + "pubkey": "33Jz6v6pp9CeaUBF1piJQGpm8rNwgppQATHUU9uSBvih", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143549000000, + "samples": [ + 106223, + 106243, + 106239, + 106225, + 106243, + 106250, + 106203, + 106205, + 106254, + 106253, + 106236, + 106216, + 106240, + 106247, + 106255, + 106197, + 106284, + 106215, + 106203, + 106247, + 106236, + 106219, + 106246, + 106242, + 106211, + 106236, + 106220, + 106224, + 106246, + 106269, + 106234, + 106225 + ], + "sample_count": 32 + }, + { + "pubkey": "AcEf4uEYnF2XV5cunLrNrUDkpicw2h4YHueB14zrbCC9", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 86722, + 88841, + 83938, + 84004, + 86837, + 86815, + 83906, + 83906, + 84928, + 86834, + 86834, + 86677, + 86960, + 86960, + 86878, + 86878, + 86885, + 83843, + 83813, + 83960, + 86761, + 84878, + 84805, + 84009, + 84009, + 83747, + 86974, + 87053, + 86802, + 86956, + 87343, + 87035 + ], + "sample_count": 32 + }, + { + "pubkey": "AZoJRWuBU4q1gqPAfb5MgkPtDjH3Ydh9PNqLJAwVZs3t", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143549000000, + "samples": [ + 85488, + 85433, + 85453, + 85459, + 85495, + 85472, + 85454, + 85494, + 85495, + 85494, + 85465, + 85459, + 85469, + 85477, + 85453, + 85459, + 85477, + 85463, + 85474, + 85447, + 85473, + 85464, + 85507, + 85522, + 85492, + 85408, + 85499, + 85477, + 85456, + 85480, + 85476, + 85420 + ], + "sample_count": 32 + }, + { + "pubkey": "DBFqrR4UrpokZE32qtbN7UiZGSbNJhV6rJsThhLJF4wr", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 128136, + 140433, + 128560, + 126989, + 126989, + 129902, + 127024, + 127078, + 127078, + 138276, + 126913, + 127091, + 129359, + 126980, + 127135, + 138638, + 126982, + 126916, + 139243, + 126939, + 126877, + 126877, + 142735, + 126937, + 126968, + 138867, + 127028, + 127161, + 127161, + 139857, + 139857, + 127042 + ], + "sample_count": 32 + }, + { + "pubkey": "EKxwMAhy3GcMKgHQgrz44i86dMoeifCSGFfioe1WijPA", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143464000000, + "samples": [ + 98715, + 98758, + 98691, + 98694, + 98711, + 98716, + 98761, + 98721, + 98733, + 98723, + 98698, + 98764, + 98683, + 98664, + 98722, + 98702, + 98720, + 98709, + 98718, + 98720, + 98725, + 98775, + 98721, + 98748, + 98755, + 98736, + 98780, + 98686, + 98725, + 98719, + 98729, + 98773 + ], + "sample_count": 32 + }, + { + "pubkey": "Adwq6DTMceqoKmFnj8jdFnCMi59uo2tFCT21FJb5y55v", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143505000000, + "samples": [ + 33226, + 33226, + 33443, + 33443, + 33483, + 33221, + 33420, + 33215, + 33159, + 33287, + 33247, + 33247, + 33453, + 33453, + 33229, + 33204, + 33419, + 33419, + 33337, + 33337, + 33224, + 33477, + 33401, + 33346, + 33431, + 33346, + 33346, + 33215, + 33296, + 33296, + 33451, + 33176 + ], + "sample_count": 32 + }, + { + "pubkey": "FmgMZGKkh2J3kPqfLRswW5YF7WmUQUCX7v4qj6uB3xro", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143463000000, + "samples": [ + 42013, + 42033, + 42020, + 42016, + 41999, + 41970, + 41997, + 41982, + 42031, + 42037, + 41988, + 41997, + 42005, + 42042, + 41945, + 42043, + 42031, + 42027, + 42036, + 41975, + 41988, + 42056, + 41994, + 42093, + 42000, + 42032, + 42050, + 41988, + 42017, + 42022, + 42013, + 42051 + ], + "sample_count": 32 + }, + { + "pubkey": "EXoBWCzTqafznbrwpifWQChi8Mi1E764HwbGCVVu1jWY", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 252433, + 255486, + 249466, + 249466, + 253979, + 250549, + 257057, + 249609, + 256904, + 254360, + 254360, + 252422, + 252419, + 254692, + 254097, + 257587, + 257133, + 257618, + 250549, + 250477, + 256966, + 254639, + 254639, + 252607, + 251201, + 253968, + 250626, + 250626, + 252426, + 255423, + 254318, + 254318 + ], + "sample_count": 32 + }, + { + "pubkey": "2TninHJkZwUkSpfDS6WuPUVihrbaoMmmbusJYkZpb9Dg", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143462000000, + "samples": [ + 260038, + 260178, + 260007, + 260015, + 260048, + 259997, + 260125, + 256714, + 256767, + 260009, + 260036, + 260223, + 260072, + 260060, + 260031, + 260029, + 260192, + 256728, + 256697, + 256781, + 256778, + 256891, + 256745, + 256744, + 256807, + 256699, + 256896, + 256766, + 256733, + 256801, + 256723, + 256930 + ], + "sample_count": 32 + }, + { + "pubkey": "FwTpehaENW5koUsrKdHw3VGkT6GdNNm5jh7bYg6CxCjd", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 39600, + 39970, + 39671, + 39743, + 39689, + 39689, + 39731, + 39617, + 39643, + 39736, + 39541, + 39883, + 39703, + 39589, + 39646, + 39694, + 39526, + 39798, + 39759, + 39865, + 39583, + 39540, + 39704, + 39704, + 39699, + 39699, + 39760, + 39474, + 39474, + 39738, + 39713, + 39800 + ], + "sample_count": 32 + }, + { + "pubkey": "DUi1teUsUBCoV3tQYnvd64LHXGcFBx6qt3KQWcPNPQHj", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143462000000, + "samples": [ + 46819, + 46727, + 46868, + 46794, + 47020, + 46912, + 46862, + 46940, + 46836, + 47013, + 46835, + 46947, + 47020, + 46859, + 47025, + 47032, + 47043, + 46913, + 46857, + 46997, + 46810, + 46855, + 46732, + 47100, + 46817, + 46914, + 46856, + 46829, + 47088, + 47058, + 46823, + 46925 + ], + "sample_count": 32 + }, + { + "pubkey": "49Qz16GXucN83gDaLVecmebN6yfa9mHut3z51jpQ6XEz", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 109143, + 109510, + 109532, + 109202, + 109213, + 109163, + 109191, + 109265, + 109265, + 109502, + 113354, + 109969, + 109187, + 109293, + 111256, + 109301, + 108971, + 109148, + 109116, + 109116, + 108979, + 109435, + 109079, + 109079, + 109097, + 109911, + 109173, + 109144, + 109185, + 109284, + 109099, + 109099 + ], + "sample_count": 32 + }, + { + "pubkey": "21aKDr5mYGjKfgNcaVL5E5q342H42dydaxWz46YyGHXL", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143463000000, + "samples": [ + 108645, + 108756, + 108684, + 108698, + 108641, + 108684, + 108735, + 108647, + 108705, + 108697, + 108688, + 108727, + 108658, + 108654, + 108628, + 108657, + 108696, + 108659, + 108649, + 108659, + 108666, + 108720, + 108679, + 108705, + 108684, + 108656, + 108714, + 108682, + 108642, + 108694, + 108677, + 108717 + ], + "sample_count": 32 + }, + { + "pubkey": "AC1wQq1iTKJM4WVCXxNzSk24BgNB9Z2EKQFsANVwKUZa", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 99252, + 99213, + 99213, + 99278, + 97019, + 99300, + 97193, + 99007, + 99314, + 99438, + 96097, + 97303, + 96304, + 96304, + 99119, + 99119, + 97322, + 97295, + 97295, + 96993, + 96993, + 99267, + 99267, + 96994, + 97122, + 99260, + 99039, + 97298, + 97393, + 97391, + 99161, + 97046 + ], + "sample_count": 32 + }, + { + "pubkey": "78bTAGCcZV6hi4vgdLuG8KuSBs7b1GfP6qUbSCmsVT2F", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143464000000, + "samples": [ + 113242, + 113304, + 113216, + 113274, + 113260, + 113233, + 113334, + 113229, + 113275, + 113234, + 113218, + 113258, + 113277, + 113253, + 113260, + 113249, + 113307, + 113224, + 113237, + 113259, + 113245, + 113279, + 113198, + 113222, + 113264, + 113252, + 113343, + 113268, + 113264, + 113256, + 113259, + 113295 + ], + "sample_count": 32 + }, + { + "pubkey": "89AKkQo5a3xXt98Hhtor4Pyu6dcsZrP9pJNjaUUou8Cx", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143482000000, + "samples": [ + 287016, + 299869, + 286947, + 286975, + 294161, + 287179, + 287151, + 294240, + 288153, + 287171, + 287171, + 294707, + 286887, + 287152, + 287152, + 301544, + 301544, + 288216, + 287025, + 295009, + 287588, + 287127, + 294674, + 287356, + 287182, + 291881, + 286953, + 287175, + 297104, + 287290, + 287350, + 295182 + ], + "sample_count": 32 + }, + { + "pubkey": "BWnUJPbbi2BzLSVEVEcz2s41p9JMrCNuzi5mohxcHGDL", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143540000000, + "samples": [ + 251315, + 251367, + 251281, + 256863, + 256887, + 256874, + 256952, + 256839, + 256853, + 256831, + 256875, + 257011, + 256843, + 256868, + 256853, + 256865, + 244208, + 244101, + 244064, + 244394, + 244081, + 244507, + 244376, + 244101, + 244403, + 244101, + 244203, + 244096, + 244103, + 244401, + 244100, + 244223 + ], + "sample_count": 32 + }, + { + "pubkey": "GaBRKzaoWtZR2Xyj1jMrZTmL6aq4dDw87W4bmQ5dnWYF", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 221113, + 223078, + 221478, + 221151, + 224440, + 224440, + 221277, + 221264, + 223832, + 223832, + 221288, + 221187, + 221187, + 222206, + 221297, + 221154, + 221746, + 221270, + 221273, + 225100, + 221274, + 221259, + 221283, + 221237, + 221311, + 221939, + 221169, + 221262, + 223509, + 221209, + 221234, + 221234 + ], + "sample_count": 32 + }, + { + "pubkey": "BdGo7zsqcfWWZsEPSpnJJ4rfY2LcEE1dzZ9ddV6Y4Yw9", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143539000000, + "samples": [ + 140148, + 140154, + 140185, + 140194, + 140169, + 140273, + 140081, + 140287, + 140311, + 140304, + 140268, + 140342, + 140293, + 140362, + 140253, + 140300, + 138895, + 138888, + 138788, + 139000, + 139020, + 139038, + 138999, + 139027, + 139025, + 138868, + 138831, + 138813, + 139084, + 138924, + 138880, + 139078 + ], + "sample_count": 32 + }, + { + "pubkey": "45hqm5WtwcPJFUVzqRSNV6MNyqRs7p8msqAcs13ssYxY", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 263274, + 263196, + 263171, + 263151, + 263501, + 262936, + 263115, + 263051, + 263125, + 263020, + 263030, + 263251, + 263037, + 263037, + 263176, + 263181, + 263007, + 263492, + 263173, + 263157, + 263916, + 263116, + 263246, + 263246, + 263175, + 263149, + 260726, + 260598, + 260598, + 260773, + 260531, + 260657 + ], + "sample_count": 32 + }, + { + "pubkey": "81K8dw2UsqDVjk8JgiDZvPZnpNmrtFWRzpM21Rk8AuUj", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143540000000, + "samples": [ + 206890, + 243212, + 206857, + 207094, + 207088, + 207103, + 207217, + 207076, + 207076, + 207084, + 207104, + 207196, + 207069, + 207143, + 207118, + 207092, + 207205, + 207079, + 207156, + 207096, + 207082, + 207200, + 207104, + 207112, + 207085, + 207091, + 207238, + 207115, + 207111, + 207109, + 207128, + 207206 + ], + "sample_count": 32 + }, + { + "pubkey": "5AJEyAuxHi75ve5w12XogG7hVxqYYfiRQGeWVR7WwQt5", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 131634, + 131725, + 131725, + 131604, + 131627, + 131698, + 131816, + 131622, + 131718, + 131766, + 148417, + 131631, + 131595, + 131603, + 131603, + 131709, + 131585, + 131585, + 131745, + 131697, + 131690, + 131666, + 131666, + 131586, + 131554, + 131530, + 131650, + 131571, + 131703, + 131558, + 131396, + 131591 + ], + "sample_count": 32 + }, + { + "pubkey": "J26YnbZhM3pyJJc551tAidZdNZKnxUWgvsfujvPmtNQw", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143539000000, + "samples": [ + 128412, + 128452, + 128382, + 128484, + 128541, + 128488, + 128520, + 128478, + 128471, + 128466, + 128490, + 128560, + 128481, + 128473, + 128507, + 128475, + 128549, + 128519, + 128518, + 128452, + 128491, + 128580, + 128445, + 128514, + 128482, + 128447, + 128574, + 128491, + 128503, + 128495, + 128505, + 128550 + ], + "sample_count": 32 + }, + { + "pubkey": "5YX1XyLrQRkPisPzGynjMvzpRFnvVKu1fAB32uWs2jMe", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 235412, + 245675, + 248075, + 247864, + 247871, + 247739, + 247799, + 247799, + 247804, + 247659, + 248158, + 247639, + 235343, + 235456, + 234500, + 247987, + 235234, + 234725, + 235167, + 235211, + 234559, + 235580, + 247783, + 232142, + 232653, + 232377, + 232182, + 232382, + 244719, + 231869, + 244725, + 231513 + ], + "sample_count": 32 + }, + { + "pubkey": "EFTEWtK2B6GcMKv1UfswRLRwFBKHD8XPbciiZhzD1PnE", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143533000000, + "samples": [ + 147217, + 205012, + 147203, + 147204, + 147220, + 147184, + 147301, + 147249, + 147230, + 147248, + 147255, + 147287, + 147241, + 147188, + 147222, + 147176, + 147302, + 147246, + 147215, + 147194, + 147179, + 147292, + 147247, + 147202, + 147191, + 147219, + 147285, + 147256, + 147210, + 147226, + 147239, + 147306 + ], + "sample_count": 32 + }, + { + "pubkey": "F3Aqt96yZE2ua3eFw7ZtxhKd6T4eAe6Pn4waVJEDeo6p", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143482000000, + "samples": [ + 188843, + 188902, + 188745, + 188745, + 189256, + 188956, + 188849, + 188839, + 189379, + 214260, + 214260, + 189118, + 188893, + 188893, + 188769, + 189290, + 189128, + 189089, + 189546, + 189104, + 189104, + 189029, + 188874, + 188742, + 188970, + 190127, + 188888, + 186344, + 186344, + 190410, + 190410, + 186395 + ], + "sample_count": 32 + }, + { + "pubkey": "9YrxLx8iK5tYNnmBgYU94qPPQVBBAAtHCSUYtgbDPkL3", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143535000000, + "samples": [ + 119765, + 180151, + 119812, + 119930, + 119874, + 119907, + 119951, + 119917, + 119946, + 119931, + 119870, + 119985, + 119880, + 119870, + 119885, + 119932, + 120027, + 119958, + 120011, + 119884, + 119843, + 120054, + 119871, + 119898, + 119932, + 119897, + 120021, + 119867, + 119978, + 119847, + 119880, + 119971 + ], + "sample_count": 32 + }, + { + "pubkey": "3vr9nUKaNDH2ZFG5A4Vqg2MQmM5xyqe4uvfUimVhfnWN", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 123656, + 123628, + 123856, + 123498, + 124040, + 123531, + 123593, + 123570, + 123586, + 123667, + 131782, + 123661, + 123478, + 123478, + 123633, + 123778, + 123735, + 124073, + 123809, + 123605, + 123857, + 123744, + 123744, + 123640, + 123841, + 123841, + 123957, + 123396, + 123782, + 123437, + 123067, + 123121 + ], + "sample_count": 32 + }, + { + "pubkey": "DFhqjTwQv9yf2w8y1gjrs4KbR9MZRrKKkXTxxgFhBckT", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143533000000, + "samples": [ + 118905, + 118923, + 118874, + 120506, + 120458, + 120494, + 120492, + 120455, + 120406, + 120476, + 120550, + 120558, + 120486, + 120455, + 120433, + 120430, + 120516, + 135110, + 120383, + 135128, + 135105, + 135201, + 120298, + 120380, + 120346, + 120427, + 116085, + 115972, + 116041, + 116068, + 115979, + 116056 + ], + "sample_count": 32 + }, + { + "pubkey": "8ae7Piizprw8jQhC7fm31s4fMSMqpe54wPF3FgPFNwiW", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 280546, + 280551, + 280540, + 280353, + 280353, + 280414, + 280413, + 280371, + 280371, + 280531, + 280351, + 280331, + 280331, + 280333, + 280344, + 280353, + 280328, + 280289, + 280310, + 280442, + 280306, + 280480, + 280431, + 280367, + 280470, + 280344, + 280295, + 280082, + 280359, + 280282, + 280096, + 280260 + ], + "sample_count": 32 + }, + { + "pubkey": "BhZQvnEE33pDiRK1ztDGNyGziKygY7ibUYXhTSu9g8z5", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143535000000, + "samples": [ + 289530, + 302590, + 302548, + 302376, + 301926, + 302002, + 302506, + 302399, + 294447, + 291336, + 291430, + 291566, + 295339, + 295314, + 295353, + 295339, + 291772, + 296061, + 295990, + 295918, + 303349, + 307763, + 304328, + 308523, + 297831, + 293479, + 303456, + 288840, + 288802, + 288816, + 298975, + 297881 + ], + "sample_count": 32 + }, + { + "pubkey": "8ys4FL42vRJmyD7abLWqDxLMdJ9vYeoii7ntwKWXDXiu", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 223305, + 223437, + 223392, + 223328, + 223397, + 223318, + 223294, + 223561, + 223359, + 223359, + 223385, + 223422, + 223374, + 223324, + 223315, + 223354, + 223296, + 223548, + 223400, + 223290, + 223470, + 223470, + 223470, + 223263, + 223548, + 223389, + 223211, + 223664, + 223419, + 223624, + 223387, + 223320 + ], + "sample_count": 32 + }, + { + "pubkey": "7QFteTKmBvKPsuWKFvPnCNoM9yAtnnBqF4YdE7YpVR2J", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143537000000, + "samples": [ + 227505, + 227625, + 227588, + 237844, + 237658, + 237814, + 237733, + 237594, + 237769, + 237701, + 237614, + 237762, + 237681, + 237683, + 237843, + 237819, + 233516, + 237870, + 237694, + 237727, + 237721, + 237791, + 237952, + 237688, + 237714, + 233493, + 233419, + 233398, + 233366, + 233435, + 233474, + 233466 + ], + "sample_count": 32 + }, + { + "pubkey": "3qgXwNewVb6PxB1iCwTKpQvm4YCRa3WZu7m3vYL1sewM", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 184930, + 186071, + 186071, + 184321, + 184114, + 184114, + 184218, + 197141, + 191800, + 184503, + 184259, + 184149, + 184088, + 184167, + 184008, + 184488, + 184118, + 184311, + 184311, + 184577, + 184163, + 184110, + 184296, + 184192, + 184189, + 184339, + 184318, + 181688, + 182043, + 181913, + 181998, + 181853 + ], + "sample_count": 32 + }, + { + "pubkey": "HasrqJQ8dhqbwr7V6GB9Btmb4mUme71GkYzNYtGM28gp", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143538000000, + "samples": [ + 147434, + 147547, + 147340, + 147468, + 147217, + 147363, + 147268, + 147288, + 147457, + 147487, + 147499, + 147522, + 147315, + 147168, + 147284, + 147532, + 148832, + 148798, + 156189, + 148780, + 148730, + 148901, + 148587, + 148754, + 148601, + 148538, + 148911, + 149298, + 209398, + 350956, + 387974, + 150223 + ], + "sample_count": 32 + }, + { + "pubkey": "6dGHAYQAmrB4n3xz2aaaDe6E1Da8d4Xa5T5MZHgokAdf", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 289274, + 289283, + 289120, + 289098, + 289797, + 289797, + 289005, + 289316, + 289441, + 289441, + 289255, + 289017, + 289356, + 289176, + 289176, + 289270, + 289385, + 289208, + 289174, + 289330, + 289142, + 289149, + 289123, + 289276, + 289132, + 289309, + 289204, + 289204, + 286786, + 286954, + 287037, + 286147 + ], + "sample_count": 32 + }, + { + "pubkey": "FLtAs7ctd95WZp4tcGKtaF1wxV8F2xqe97BpCaxZ29EZ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143539000000, + "samples": [ + 242132, + 298989, + 242100, + 242153, + 242190, + 242138, + 242210, + 242166, + 242149, + 242177, + 242196, + 242303, + 242100, + 242131, + 242164, + 242170, + 238002, + 242260, + 246086, + 242233, + 242257, + 242344, + 242207, + 242206, + 242259, + 237850, + 238006, + 237856, + 237889, + 237886, + 237887, + 237993 + ], + "sample_count": 32 + }, + { + "pubkey": "6xwXfs8GK6myUStPJ25KyWDrLyY4q3m3nYpfE2frToCN", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 184829, + 219955, + 184774, + 184500, + 184996, + 184665, + 184668, + 184668, + 184764, + 184688, + 227293, + 184683, + 184620, + 184776, + 184945, + 184651, + 184639, + 184676, + 184703, + 184764, + 184764, + 184818, + 184769, + 184694, + 184746, + 184785, + 182266, + 182358, + 182231, + 182466, + 182322, + 182304 + ], + "sample_count": 32 + }, + { + "pubkey": "AUV8B8v8EBiBMhHCwWAYfEgxeWQk7YiwnY6naFotUQ1w", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143532000000, + "samples": [ + 121566, + 121496, + 121654, + 121539, + 121576, + 121579, + 121593, + 121489, + 121566, + 121468, + 121487, + 121508, + 121421, + 121451, + 121478, + 121497, + 121477, + 121368, + 121511, + 121485, + 121451, + 121469, + 121475, + 121456, + 121464, + 121464, + 121535, + 121459, + 121553, + 121497, + 121477, + 121561 + ], + "sample_count": 32 + }, + { + "pubkey": "8DmutxT3n98eQNjgGZNMMkrTpVmikbybhRq5obgXSZ9J", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 315531, + 316253, + 315726, + 315616, + 315616, + 315889, + 315672, + 315719, + 316123, + 315749, + 315686, + 316049, + 312931, + 313100, + 312813, + 312742, + 312836, + 313138, + 313138, + 319289, + 312861, + 313755, + 313156, + 313166, + 313166, + 313835, + 313835, + 313070, + 312932, + 312803, + 312802, + 312892 + ], + "sample_count": 32 + }, + { + "pubkey": "3mPwxKjr6opr71NyrPz9sRFNgHuKu6XSFHMJoeabMTgy", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143538000000, + "samples": [ + 243388, + 268626, + 243399, + 235844, + 235858, + 235891, + 235996, + 235814, + 235924, + 235825, + 235873, + 235967, + 235860, + 235845, + 235860, + 235799, + 235956, + 235866, + 235910, + 235802, + 235829, + 236005, + 235929, + 235789, + 235808, + 235854, + 235974, + 235841, + 235872, + 235849, + 235886, + 235954 + ], + "sample_count": 32 + }, + { + "pubkey": "4SXviEDj2Q4ZsxxC8u6BoUsEjAsBQ4CDxun5D215Gmis", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 215504, + 215504, + 213448, + 213560, + 213216, + 213981, + 213520, + 213762, + 213263, + 214934, + 214852, + 213606, + 213819, + 213372, + 213399, + 213542, + 213678, + 213656, + 213925, + 213440, + 214561, + 213780, + 214166, + 213544, + 213549, + 211355, + 211038, + 211419, + 210534, + 210514, + 210514, + 211445 + ], + "sample_count": 32 + }, + { + "pubkey": "FrrNbcW3brAMhKdy1ZSLd5njV4rnvzMSGPTssBDDhqfT", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143537000000, + "samples": [ + 71687, + 71705, + 71699, + 72370, + 72388, + 72447, + 72440, + 72430, + 72418, + 72419, + 72445, + 72543, + 72417, + 72436, + 72437, + 72412, + 72451, + 72406, + 72472, + 72446, + 72448, + 72457, + 72432, + 72428, + 72441, + 71985, + 73338, + 73304, + 73287, + 73245, + 73268, + 73270 + ], + "sample_count": 32 + }, + { + "pubkey": "9cdjzVrZNGuGKzruLBAm6SFZw7gHcZA6ichP3KjPo7Ug", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 273416, + 273416, + 273725, + 273384, + 273217, + 273748, + 273611, + 273295, + 273694, + 273388, + 273670, + 273335, + 273374, + 273465, + 273391, + 273467, + 273310, + 273700, + 273358, + 273463, + 273463, + 273695, + 273355, + 273483, + 275074, + 274902, + 274676, + 274597, + 274448, + 274407, + 274735, + 274333 + ], + "sample_count": 32 + }, + { + "pubkey": "EsFStWvJmwE7apHYJ6QAz5WLVsEDwMx5rdLUyfgg9XUY", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143541000000, + "samples": [ + 236841, + 237007, + 236906, + 236760, + 236741, + 236741, + 236829, + 236729, + 236697, + 236723, + 236779, + 236898, + 236783, + 236677, + 236753, + 236771, + 236897, + 236719, + 236783, + 236722, + 236753, + 236870, + 236748, + 236733, + 236772, + 236670, + 236872, + 236748, + 236705, + 236747, + 236764, + 236923 + ], + "sample_count": 32 + }, + { + "pubkey": "GvQ9D2nvCYUCG6CdczL5YD2h5o2Tx1xa9sD2CJu6mqgt", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 254200, + 254130, + 254237, + 254038, + 254374, + 253903, + 254383, + 263860, + 254277, + 254216, + 254507, + 254275, + 254514, + 254578, + 254209, + 254323, + 254540, + 254354, + 381324, + 254323, + 254155, + 254139, + 254337, + 254568, + 254443, + 254398, + 254365, + 254122, + 254502, + 254263, + 254205, + 254362 + ], + "sample_count": 32 + }, + { + "pubkey": "6aMozmSimky1Hk7bJtAtciLeaZfMo8b6nnAZTRx13ReZ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143541000000, + "samples": [ + 230265, + 230379, + 230287, + 229917, + 230038, + 230009, + 230115, + 229993, + 230003, + 229996, + 230012, + 230115, + 229990, + 230003, + 229981, + 230002, + 230140, + 234216, + 229995, + 230035, + 229965, + 230118, + 229967, + 229994, + 230052, + 230038, + 230097, + 230034, + 230008, + 229973, + 230058, + 230105 + ], + "sample_count": 32 + }, + { + "pubkey": "3zyCh2f3siDZU8aP4XMfwiBJHm6r5iQTKWnZQYMDLi2Y", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 89663, + 89902, + 89707, + 89696, + 89760, + 89647, + 89746, + 90023, + 89794, + 89715, + 89849, + 89777, + 89813, + 89742, + 89855, + 89609, + 89647, + 89688, + 89724, + 89847, + 89726, + 89712, + 89725, + 89789, + 87307, + 87448, + 87559, + 87559, + 86926, + 87050, + 88394, + 87089 + ], + "sample_count": 32 + }, + { + "pubkey": "B9Mr5Koo5yvKVYucLByxYLxpEW9PWSETDDxPH149axn", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143542000000, + "samples": [ + 99485, + 99466, + 99301, + 99297, + 99205, + 99239, + 99247, + 99154, + 99063, + 99170, + 99136, + 99237, + 99178, + 99263, + 99194, + 99220, + 99257, + 99097, + 99087, + 113830, + 113794, + 113953, + 99082, + 99071, + 98971, + 98899, + 99135, + 99087, + 99123, + 98990, + 99129, + 99027 + ], + "sample_count": 32 + }, + { + "pubkey": "D8ew776KUwwqDrG3e92nA96iHrnVQdorBG6jM9GbvV76", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 259066, + 258805, + 258637, + 258596, + 258596, + 260386, + 258803, + 258631, + 258773, + 258713, + 260215, + 260298, + 260298, + 260386, + 258794, + 258517, + 258573, + 258686, + 313003, + 258764, + 258710, + 258655, + 258596, + 258483, + 258698, + 258637, + 258699, + 258524, + 260204, + 260347, + 260347, + 260010 + ], + "sample_count": 32 + }, + { + "pubkey": "9zgTsSPT26RAMhGjJiS1MYr7UGXRG5ZFfHfGgUC1kxxP", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143541000000, + "samples": [ + 190586, + 190622, + 190619, + 190531, + 190534, + 190456, + 190622, + 190487, + 190503, + 190490, + 190870, + 190874, + 190824, + 190869, + 190865, + 190823, + 197563, + 191749, + 191689, + 191887, + 191699, + 191778, + 191667, + 191656, + 191601, + 191741, + 191747, + 191733, + 191705, + 191704, + 191576, + 191658 + ], + "sample_count": 32 + }, + { + "pubkey": "3Z9BQCQ3fkTGxVcy8TmjePKLFY5wub7QwJ9AvJP7iUx3", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143482000000, + "samples": [ + 154529, + 154620, + 154568, + 154414, + 155798, + 154613, + 154593, + 154836, + 154535, + 154619, + 154930, + 154888, + 154584, + 154464, + 154895, + 154516, + 154535, + 277076, + 154730, + 154730, + 154592, + 154551, + 154521, + 154483, + 154610, + 154610, + 154567, + 154789, + 154533, + 154508, + 154840, + 154439 + ], + "sample_count": 32 + }, + { + "pubkey": "9KbSN6nDXmGAMMoksvZs7zS3V2NsDvAxGoxB8pAo4VNu", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143531000000, + "samples": [ + 109523, + 143404, + 109527, + 109698, + 109735, + 109706, + 109725, + 109730, + 109746, + 109699, + 109725, + 109742, + 109670, + 109691, + 109724, + 109679, + 109789, + 109697, + 109720, + 109714, + 109706, + 109784, + 109717, + 109669, + 109704, + 109692, + 109781, + 109735, + 109713, + 109710, + 109710, + 109748 + ], + "sample_count": 32 + }, + { + "pubkey": "Dc6pJFfGFdzccryBFVByDuA6WrPQ8Hm2U9qR6h7UVtqt", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 214267, + 200558, + 200284, + 200176, + 200259, + 225919, + 200112, + 200112, + 200146, + 200076, + 240398, + 210339, + 219173, + 231393, + 200302, + 200117, + 200199, + 200270, + 200135, + 200273, + 200230, + 200417, + 200326, + 200526, + 201197, + 197762, + 197979, + 197885, + 198029, + 197971, + 197628, + 197954 + ], + "sample_count": 32 + }, + { + "pubkey": "7jVquws2PJpJ5tAKJBz4GFC5oq22knaVoUCa2pAnSSWe", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143532000000, + "samples": [ + 114119, + 172361, + 114117, + 114315, + 114312, + 114363, + 114345, + 114295, + 114339, + 114306, + 114333, + 114368, + 114321, + 114325, + 114341, + 114253, + 114383, + 114302, + 114335, + 114265, + 114275, + 114361, + 114254, + 114306, + 114286, + 114297, + 114374, + 114275, + 114352, + 114347, + 114302, + 114402 + ], + "sample_count": 32 + }, + { + "pubkey": "3GzMWCrNGGKHeTJSHZWahJat6KUwwKHPSJMx4Xu7kFV4", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 143333, + 143770, + 143232, + 143188, + 142974, + 143291, + 143200, + 143134, + 143099, + 143232, + 144973, + 143237, + 143216, + 143361, + 144402, + 144402, + 143196, + 145539, + 190637, + 143185, + 145535, + 143182, + 143017, + 143336, + 143346, + 143010, + 143366, + 143193, + 150477, + 144779, + 144796, + 143315 + ], + "sample_count": 32 + }, + { + "pubkey": "5EmpcqLdxkgaNdb6mdUazSfEqqiXhgnXCciZ9nmgP4G5", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143534000000, + "samples": [ + 162542, + 162615, + 162569, + 162515, + 162496, + 162562, + 162561, + 162576, + 162523, + 162519, + 162572, + 162610, + 162551, + 162496, + 162568, + 162480, + 162579, + 162546, + 162523, + 177270, + 177357, + 177448, + 162497, + 162502, + 162518, + 162495, + 162621, + 162550, + 162488, + 162587, + 162548, + 162631 + ], + "sample_count": 32 + }, + { + "pubkey": "DWbw1oQBeVjrQ6NyywWoYcuMniW9NG6AtfH2MW6z9EtD", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 255595, + 255671, + 264070, + 255587, + 255916, + 255941, + 255703, + 255905, + 255885, + 255460, + 256168, + 256168, + 255852, + 255673, + 256024, + 255665, + 255670, + 255879, + 255641, + 255786, + 255956, + 255923, + 255627, + 255627, + 256051, + 255847, + 255533, + 255986, + 255970, + 256041, + 256006, + 255647 + ], + "sample_count": 32 + }, + { + "pubkey": "BaqPAEQgr6f4zTNSBzVRJo5xqAEqeo5CGPXkk7gZh4Lm", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143535000000, + "samples": [ + 231639, + 231825, + 231673, + 231527, + 231516, + 231503, + 231692, + 231613, + 231574, + 231572, + 231910, + 231979, + 231896, + 231921, + 231914, + 231827, + 232021, + 231854, + 231851, + 231877, + 231838, + 231975, + 231891, + 231939, + 231841, + 231867, + 231958, + 231846, + 231803, + 231884, + 231932, + 232047 + ], + "sample_count": 32 + }, + { + "pubkey": "6eFDXP914DHq5Cbbm8upZDvL5uZQo4H2XPDNN79mbNDf", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 242131, + 242150, + 242331, + 242064, + 242460, + 242285, + 242107, + 243123, + 242116, + 242262, + 242459, + 242126, + 242090, + 243473, + 242247, + 242274, + 242289, + 242001, + 242188, + 242121, + 242121, + 242472, + 242208, + 242208, + 242435, + 242258, + 241979, + 242120, + 242146, + 241444, + 241581, + 241601 + ], + "sample_count": 32 + }, + { + "pubkey": "AU7xhpF4ZKBaYKQMzS3cnpaLEvS9pSKv3BTASeKfAXLz", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143537000000, + "samples": [ + 259279, + 259356, + 259245, + 259221, + 259156, + 259144, + 259309, + 259261, + 259153, + 259182, + 259250, + 259339, + 259190, + 259295, + 259211, + 259127, + 259293, + 259226, + 259233, + 259178, + 259189, + 259346, + 259221, + 259185, + 259249, + 259202, + 259337, + 259086, + 259286, + 259218, + 259225, + 259288 + ], + "sample_count": 32 + }, + { + "pubkey": "7z4yhXxdn3iDaATt6VZjQogjqTc3AVwu8bBh7RbzCj8B", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 232210, + 232574, + 232443, + 232505, + 232370, + 232079, + 232130, + 232574, + 232441, + 232272, + 232328, + 232590, + 232139, + 232618, + 232476, + 232476, + 232310, + 232334, + 232824, + 354659, + 232169, + 232138, + 232287, + 232367, + 232589, + 229934, + 229836, + 230011, + 229708, + 229838, + 229741, + 229732 + ], + "sample_count": 32 + }, + { + "pubkey": "36rRmJF36apr3ibRb57V6wWXD81t7N4nUvmUmKAY2Hym", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143532000000, + "samples": [ + 243873, + 279971, + 243845, + 243751, + 243741, + 243705, + 243870, + 243761, + 243729, + 243878, + 243788, + 243837, + 243838, + 243681, + 243821, + 243730, + 243878, + 243680, + 243733, + 243857, + 243741, + 243948, + 243751, + 243672, + 243670, + 243765, + 243868, + 243811, + 243849, + 243908, + 243791, + 243817 + ], + "sample_count": 32 + }, + { + "pubkey": "EWDZmwDreu1iy4xryGMEroHZpicWv8o7155X1Qkr3VEa", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 264366, + 264247, + 264355, + 266892, + 264631, + 264375, + 264229, + 264452, + 264374, + 264237, + 264337, + 264346, + 264208, + 264485, + 264355, + 264211, + 264491, + 264300, + 265045, + 264471, + 264353, + 264619, + 264322, + 261977, + 261996, + 261970, + 262018, + 262487, + 262037, + 262829, + 263217, + 262178 + ], + "sample_count": 32 + }, + { + "pubkey": "Dg498vvnKZL6w5WTJy9tKb7gQjKCp6z7CAfYRyMzzf2m", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143534000000, + "samples": [ + 246595, + 246739, + 246602, + 246542, + 246504, + 246507, + 246600, + 246511, + 246486, + 246475, + 246487, + 246587, + 246511, + 246486, + 246436, + 246495, + 246631, + 246491, + 246501, + 246502, + 246493, + 246645, + 246503, + 246448, + 246484, + 246107, + 247412, + 247353, + 247313, + 247401, + 247307, + 247446 + ], + "sample_count": 32 + }, + { + "pubkey": "6Z6DuAF857UPTq56qfj3jyRYA4kwVuiWyDA11GR3KuwW", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 167959, + 167794, + 168418, + 167795, + 168008, + 168172, + 167936, + 169860, + 168055, + 174629, + 168002, + 168153, + 168036, + 167887, + 168005, + 167865, + 169656, + 168325, + 167922, + 168764, + 168764, + 168188, + 168064, + 168020, + 167972, + 167867, + 169681, + 168019, + 168110, + 168762, + 168028, + 168198 + ], + "sample_count": 32 + }, + { + "pubkey": "69RKDwihPCvu345UY8MyakoYZWKRdPrJY8QK9N2yuJNB", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143536000000, + "samples": [ + 141964, + 167706, + 141889, + 141738, + 141804, + 141751, + 141688, + 141749, + 141767, + 141747, + 141734, + 141802, + 141729, + 141651, + 141729, + 141665, + 141744, + 141688, + 141844, + 141757, + 141698, + 141758, + 141754, + 141735, + 141716, + 141729, + 141790, + 141633, + 141753, + 141693, + 141761, + 141770 + ], + "sample_count": 32 + }, + { + "pubkey": "6mwcB2T2RkALYThQPTKaKscYFe3TAXNAt2HSZeQ2eUyB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 137316, + 137838, + 137364, + 137364, + 137222, + 137492, + 137620, + 137212, + 137928, + 137645, + 137410, + 137456, + 137318, + 159699, + 159699, + 137500, + 137543, + 137405, + 137635, + 190172, + 137374, + 137473, + 137698, + 137255, + 137431, + 137303, + 137303, + 137198, + 137455, + 137675, + 137366, + 137533 + ], + "sample_count": 32 + }, + { + "pubkey": "DL6chtvBELTb3rNC7a9T342aKLvmYwLWh7yuXAkEyhdi", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143531000000, + "samples": [ + 248597, + 248803, + 248619, + 244287, + 244222, + 244489, + 244510, + 244323, + 244377, + 244413, + 244298, + 244506, + 244488, + 244408, + 244463, + 244333, + 246668, + 246412, + 246658, + 246772, + 246936, + 246666, + 246788, + 246788, + 246572, + 246397, + 246619, + 246577, + 246566, + 246562, + 246571, + 246592 + ], + "sample_count": 32 + }, + { + "pubkey": "439RiK95ZGyoQPLdRs3prR5VVCkdWemoBbaFh8suVfXX", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 177822, + 178436, + 178125, + 177929, + 178294, + 191056, + 185648, + 178421, + 178257, + 199441, + 199441, + 182012, + 178203, + 178049, + 178734, + 178542, + 178159, + 179609, + 178144, + 178161, + 178156, + 178607, + 178162, + 178103, + 178591, + 175772, + 175997, + 175804, + 175797, + 175721, + 175721, + 175938 + ], + "sample_count": 32 + }, + { + "pubkey": "9yAGefHvJYabSYG8Yc9hp4UCQ8kRf4c9Hrd16dTU8Sf8", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143536000000, + "samples": [ + 140567, + 207830, + 140556, + 140701, + 140686, + 140655, + 140745, + 140690, + 140670, + 140721, + 140672, + 140783, + 140671, + 140730, + 140687, + 140697, + 140771, + 140716, + 217666, + 140705, + 248282, + 153965, + 153875, + 153899, + 153850, + 153867, + 153958, + 153908, + 153894, + 153928, + 153881, + 154016 + ], + "sample_count": 32 + }, + { + "pubkey": "F3TDu8ehJTB3oNX1H4eG3fQx4C1z25kpyuZjh8ivs5do", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143505000000, + "samples": [ + 110216, + 110216, + 119076, + 110418, + 109991, + 120588, + 110211, + 110072, + 125877, + 110065, + 109960, + 115442, + 110197, + 110197, + 110156, + 110156, + 127529, + 110431, + 110324, + 114285, + 110742, + 109942, + 122801, + 110064, + 110030, + 121958, + 121958, + 110048, + 110260, + 125130, + 110415, + 110400 + ], + "sample_count": 32 + }, + { + "pubkey": "3AUfnQ65PPhdS1s1A9xH14DJvFxyKMgAeGn8HHf7h9Tm", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 104115, + 104048, + 104106, + 104085, + 104100, + 104080, + 104109, + 104109, + 104068, + 104137, + 104139, + 104053, + 104114, + 104141, + 104104, + 104115, + 104036, + 104118, + 104085, + 104111, + 104110, + 104122, + 104106, + 104130, + 104045, + 104148, + 104059, + 104106, + 104094, + 104092, + 104132, + 104045 + ], + "sample_count": 32 + }, + { + "pubkey": "DLu2NpCjFPNULyXGKXQ1VbFEahpsHjjkfiKAWbaKndXu", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 15251, + 15756, + 15257, + 15145, + 15400, + 15242, + 15072, + 15307, + 15215, + 15143, + 15143, + 15224, + 15183, + 15231, + 15237, + 15264, + 15185, + 15335, + 15603, + 15275, + 15350, + 15389, + 15145, + 15451, + 15120, + 15164, + 15445, + 15448, + 15109, + 16101, + 16101, + 15328 + ], + "sample_count": 32 + }, + { + "pubkey": "EVzZ7NeWGf8A5wExErZsDA8Kv6VjJAMPHPeAavp4CUU5", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 17616, + 17548, + 17455, + 17569, + 17519, + 17509, + 17548, + 17546, + 17585, + 17542, + 17586, + 17549, + 17525, + 17491, + 17553, + 17513, + 17542, + 17496, + 17523, + 17540, + 17502, + 17552, + 17517, + 17553, + 17577, + 17547, + 17515, + 17537, + 17521, + 17496, + 17494, + 17529 + ], + "sample_count": 32 + }, + { + "pubkey": "DWSCjyyS8cSPwQaxpBxvuAUjw7aEL7bM6wUBXHHbNNRx", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 24709, + 25122, + 24623, + 24445, + 24706, + 24557, + 24582, + 24582, + 24762, + 24805, + 24805, + 24522, + 24726, + 24532, + 24507, + 24555, + 24701, + 25270, + 24613, + 24891, + 24584, + 24697, + 24510, + 24510, + 24639, + 24714, + 24714, + 24538, + 24562, + 24562, + 24557, + 24716 + ], + "sample_count": 32 + }, + { + "pubkey": "yzKkHfQRD68eNPufZNyWxVG9zeK1Ga74pot5hG8w9mo", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143483000000, + "samples": [ + 31128, + 31216, + 31205, + 31144, + 31150, + 31199, + 31216, + 31173, + 31124, + 31107, + 31147, + 31153, + 31150, + 31104, + 31191, + 31154, + 31220, + 31148, + 31200, + 31226, + 31183, + 31245, + 31196, + 31247, + 31190, + 31218, + 31202, + 31211, + 31243, + 31162, + 31230, + 31199 + ], + "sample_count": 32 + }, + { + "pubkey": "9b8g6GD64LSmkrRXuVTHsPvFXeNC3Twiy4CMCunBWCSL", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 268711, + 268205, + 268205, + 268379, + 268142, + 268342, + 268225, + 268246, + 268132, + 268132, + 268304, + 268086, + 268567, + 268567, + 268209, + 268099, + 268330, + 268463, + 268463, + 268430, + 268351, + 268351, + 269042, + 268406, + 268673, + 268673, + 268228, + 268146, + 268409, + 268266, + 268385, + 268400 + ], + "sample_count": 32 + }, + { + "pubkey": "9P5hHqUjm58cabQaprLPAq93UBoBq4TEigSFNYmu3jQ3", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143483000000, + "samples": [ + 236619, + 236481, + 236606, + 236582, + 236642, + 236586, + 236471, + 234556, + 234563, + 236553, + 236648, + 236469, + 236624, + 236560, + 236667, + 236586, + 236564, + 234515, + 234629, + 234639, + 234635, + 234445, + 234631, + 234647, + 234478, + 234611, + 234490, + 234648, + 234653, + 234609, + 234625, + 234451 + ], + "sample_count": 32 + }, + { + "pubkey": "BTHCsVycrGCKMLCfUDd8CUD1124aSJ69RBbpYRidt62E", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 35372, + 35475, + 35529, + 35554, + 35565, + 35436, + 35409, + 35528, + 35267, + 35269, + 35489, + 35283, + 35170, + 35651, + 35632, + 35416, + 35464, + 35622, + 35403, + 35432, + 35525, + 35403, + 35461, + 35402, + 35312, + 35578, + 35431, + 35216, + 35702, + 35503, + 35299, + 35504 + ], + "sample_count": 32 + }, + { + "pubkey": "472y6sGzCrJ5ZSQifBvKRJLRVqsCqGQASFdCUKhdNdbC", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 14273, + 14278, + 14023, + 14188, + 14021, + 14014, + 14145, + 13966, + 14234, + 13976, + 14045, + 14046, + 14075, + 14194, + 14142, + 14050, + 14046, + 14271, + 14211, + 14122, + 14070, + 14233, + 14217, + 14250, + 14034, + 14133, + 14239, + 14008, + 14075, + 13971, + 14039, + 14250 + ], + "sample_count": 32 + }, + { + "pubkey": "7J523Z4cBACW2vqDrm23MkPvH2XLb37WjsnpvbfxAXQj", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 102824, + 102793, + 102980, + 102765, + 102756, + 102916, + 102610, + 102898, + 102767, + 102709, + 103046, + 102874, + 102765, + 103447, + 103447, + 102778, + 102789, + 102980, + 102869, + 104930, + 104363, + 102894, + 102796, + 103036, + 102828, + 102729, + 102941, + 103137, + 102944, + 103126, + 102841, + 102793 + ], + "sample_count": 32 + }, + { + "pubkey": "HCiQSupyuqU1ykE8Ni4TDuc9oJ6E9wDJ5kMw6ehCQ1yE", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 113729, + 113702, + 113768, + 113735, + 113732, + 113761, + 113696, + 113735, + 113707, + 113728, + 113736, + 113622, + 113746, + 113765, + 113746, + 113725, + 113676, + 113778, + 113737, + 113770, + 113770, + 113671, + 113710, + 113735, + 113745, + 113748, + 113705, + 113770, + 113693, + 113750, + 113788, + 113644 + ], + "sample_count": 32 + }, + { + "pubkey": "7iSTVjP7yR3jLycXiSQvSPFSW5iY2eGxZ4mbnVjNYLgL", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143505000000, + "samples": [ + 191659, + 191659, + 191858, + 192080, + 192080, + 191684, + 191652, + 191917, + 191789, + 192101, + 191900, + 191728, + 192017, + 191834, + 191682, + 193038, + 191425, + 190740, + 190740, + 190831, + 190630, + 190213, + 190339, + 190806, + 190420, + 190420, + 191284, + 190689, + 190226, + 190226, + 191620, + 190754 + ], + "sample_count": 32 + }, + { + "pubkey": "CGXiSzN9UdkigHMMtrpDpkhU11PE2AjFWBr3tUz1D2bc", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 220457, + 220270, + 220423, + 220474, + 220407, + 220502, + 220381, + 220553, + 220433, + 220450, + 220415, + 220253, + 220361, + 220462, + 220482, + 220488, + 220312, + 220458, + 220487, + 220492, + 220465, + 220315, + 220490, + 220445, + 220462, + 220456, + 220292, + 220464, + 220570, + 220397, + 220401, + 220248 + ], + "sample_count": 32 + }, + { + "pubkey": "9kUVSm9RgeGFnP91Ds6PEpmumoPooM3M7UgpwnawThyH", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 165891, + 165951, + 166084, + 165844, + 166125, + 166125, + 165971, + 165768, + 166089, + 165912, + 165830, + 167553, + 165847, + 165861, + 165916, + 165916, + 166009, + 165846, + 165879, + 166224, + 165987, + 166481, + 165882, + 165931, + 166032, + 165952, + 165952, + 165961, + 166013, + 165895, + 165895, + 165817 + ], + "sample_count": 32 + }, + { + "pubkey": "DynWHXTK9hawJBZ59PYhRFvshgbMzTH17GdPMVvLukW7", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 161214, + 161138, + 161242, + 161202, + 161208, + 161244, + 161158, + 161251, + 161180, + 161195, + 161278, + 161196, + 161207, + 161258, + 161177, + 161212, + 161125, + 161250, + 161247, + 161202, + 161243, + 161181, + 161227, + 161226, + 161207, + 161214, + 161136, + 161188, + 161220, + 161232, + 161206, + 161054 + ], + "sample_count": 32 + }, + { + "pubkey": "GiNAdUEVzFvUPWPXF63PJrjaUCDAQEbgpmGky5NeSJkg", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 103646, + 104426, + 103586, + 103339, + 103441, + 103478, + 103410, + 103675, + 103498, + 103621, + 103762, + 103762, + 103571, + 103341, + 103579, + 103549, + 103490, + 103626, + 104134, + 103459, + 103850, + 103850, + 106705, + 103481, + 103481, + 103680, + 103879, + 103922, + 103537, + 103537, + 103653, + 103506 + ], + "sample_count": 32 + }, + { + "pubkey": "29rJH4yiox6Vrbug2Mo4YhBFn6xgK5vmH4mwGrxHhU24", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 109323, + 109242, + 109290, + 109269, + 109269, + 109291, + 109312, + 109291, + 109218, + 109295, + 109274, + 109199, + 109296, + 109292, + 109304, + 109257, + 109275, + 109322, + 109276, + 109277, + 109311, + 109285, + 109301, + 109295, + 109252, + 109295, + 109228, + 109262, + 109294, + 109295, + 109317, + 109238 + ], + "sample_count": 32 + }, + { + "pubkey": "GZCQ8Jm15nFVyW1z8ZiMsVbryKEHgLPJBeddKvfwcksw", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 170723, + 170850, + 170865, + 170613, + 171018, + 170837, + 170727, + 171021, + 170812, + 172118, + 171399, + 171399, + 170859, + 170733, + 171171, + 171341, + 170832, + 170910, + 170846, + 170739, + 170975, + 170688, + 170650, + 170960, + 170873, + 170687, + 170871, + 170994, + 170659, + 171149, + 170678, + 170603 + ], + "sample_count": 32 + }, + { + "pubkey": "8Jf4bfS5JMHkXzbg6StxqT4piZGf1TiUkMx6XACfw78a", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 163343, + 163291, + 163362, + 163344, + 163360, + 163368, + 163385, + 163353, + 163321, + 163363, + 163410, + 163258, + 163429, + 163351, + 163377, + 163348, + 163328, + 163384, + 163373, + 163369, + 163372, + 163270, + 163361, + 163370, + 163395, + 163345, + 163305, + 163365, + 163360, + 163400, + 163349, + 163274 + ], + "sample_count": 32 + }, + { + "pubkey": "J8jJ3yFKeE3CyjouaR2AhcipD8kMhevoJcrB1LZnmti9", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 135858, + 136277, + 136304, + 135826, + 136319, + 136213, + 136039, + 136162, + 136116, + 135928, + 137104, + 135999, + 136009, + 136651, + 136220, + 136028, + 136686, + 136104, + 135870, + 136059, + 154108, + 135805, + 136466, + 136466, + 136125, + 136631, + 136631, + 161817, + 135941, + 136326, + 137005, + 135921 + ], + "sample_count": 32 + }, + { + "pubkey": "4XNKYdG7SPP4B4edt15YXEMkRnsBAKNKBDov4YWXtYVQ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 144680, + 144572, + 144687, + 144722, + 144742, + 144786, + 144651, + 144702, + 144735, + 144705, + 144745, + 144638, + 144741, + 144712, + 144749, + 144837, + 144667, + 144654, + 144665, + 144654, + 144826, + 144640, + 144831, + 144717, + 144688, + 144702, + 144606, + 144745, + 144813, + 144711, + 144674, + 144710 + ], + "sample_count": 32 + }, + { + "pubkey": "E4b3eUpPJAVYVtzKxtYgjSxSfx3F2pFv8vkZGXC6i6GT", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 159867, + 160220, + 160023, + 160274, + 160465, + 159861, + 159872, + 160601, + 160053, + 160053, + 160023, + 159913, + 159913, + 159844, + 159737, + 159737, + 160209, + 160209, + 160198, + 159954, + 160032, + 160374, + 160374, + 159786, + 159786, + 161185, + 160103, + 159963, + 159963, + 160199, + 159997, + 159785 + ], + "sample_count": 32 + }, + { + "pubkey": "3fxYNuenmLowh7CuYNSjp67z9TFK8TTnJoBfqUR1fc9j", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143482000000, + "samples": [ + 160696, + 160636, + 160701, + 160719, + 160698, + 160616, + 160632, + 160792, + 160692, + 160785, + 160627, + 160706, + 160672, + 160674, + 160648, + 160749, + 160721, + 160642, + 160691, + 160776, + 160764, + 160650, + 160773, + 160753, + 160669, + 160680, + 160493, + 160739, + 160567, + 160719, + 160670, + 160589 + ], + "sample_count": 32 + }, + { + "pubkey": "CxXWzP6oDZYqHU7BX7UoWctfdrye4qhWKGpgjwGdVmud", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 36132, + 36389, + 36236, + 35896, + 35896, + 36088, + 35958, + 37034, + 36089, + 37585, + 36225, + 36022, + 35937, + 36178, + 36136, + 36240, + 38368, + 36132, + 36492, + 37125, + 36363, + 35953, + 36845, + 36039, + 36022, + 38429, + 36319, + 35912, + 39227, + 36245, + 35906, + 36725 + ], + "sample_count": 32 + }, + { + "pubkey": "63BewsYnswL2Yp4tpczFJssQRogwFcZYjW5DETabsA7T", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 29616, + 29604, + 29667, + 29605, + 29692, + 29647, + 29645, + 29668, + 29663, + 29586, + 29657, + 29579, + 29616, + 29669, + 29694, + 29638, + 29659, + 29625, + 29673, + 29658, + 29623, + 29624, + 29716, + 29627, + 29676, + 29599, + 29622, + 29673, + 29477, + 29686, + 29654, + 29569 + ], + "sample_count": 32 + }, + { + "pubkey": "313rr5GH4Z2qifRULb8wuVkoED9827Pd9CuHzSKUWFYx", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143505000000, + "samples": [ + 171385, + 185552, + 171445, + 171445, + 171275, + 171275, + 176713, + 172912, + 171355, + 186063, + 171791, + 171173, + 174409, + 171407, + 171296, + 181107, + 171796, + 171354, + 171354, + 175700, + 171778, + 171294, + 171294, + 181743, + 173728, + 171862, + 177469, + 172681, + 172681, + 171535, + 180889, + 174094 + ], + "sample_count": 32 + }, + { + "pubkey": "6vTzUwGFzZfa7pBNNVZCdsUbDGmd1SDW5ExFCKYnkKCP", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143461000000, + "samples": [ + 175870, + 175926, + 175951, + 175945, + 175902, + 175963, + 175931, + 175896, + 175939, + 175917, + 175925, + 175909, + 175927, + 175938, + 175917, + 175924, + 175932, + 175918, + 175953, + 175895, + 175934, + 175901, + 175923, + 175905, + 175933, + 175973, + 175932, + 175902, + 175920, + 175947, + 175960, + 175954 + ], + "sample_count": 32 + }, + { + "pubkey": "3fK6HKhiFwVf7VkjaXFvwCgmtiA2pnixJPhpZW7qPom2", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143506000000, + "samples": [ + 297589, + 297589, + 297765, + 297497, + 297341, + 297376, + 297376, + 297364, + 297296, + 297296, + 297260, + 297378, + 297474, + 297517, + 297517, + 297541, + 297541, + 297432, + 297463, + 297463, + 297616, + 297616, + 297430, + 297527, + 297527, + 297443, + 297418, + 297404, + 297404, + 297496, + 297406, + 297385 + ], + "sample_count": 32 + }, + { + "pubkey": "AShf94yrDF8pGoBZ5LSc2kAcWGXACjF2xMBmBt73b7Yk", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143460000000, + "samples": [ + 241847, + 241991, + 242102, + 242023, + 241895, + 242133, + 242047, + 240005, + 240234, + 242013, + 242112, + 242131, + 242164, + 242142, + 242077, + 241958, + 241984, + 240145, + 240011, + 240019, + 240004, + 240003, + 240219, + 239980, + 240056, + 240250, + 240213, + 239860, + 240208, + 239997, + 240178, + 240238 + ], + "sample_count": 32 + }, + { + "pubkey": "AmmSKmfThyQvZyjoXbHBaNoBBjjKKWjDqQwuH1tVFLk8", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 189166, + 189314, + 189175, + 189136, + 189181, + 189047, + 189077, + 189192, + 189309, + 189309, + 189005, + 189214, + 189247, + 189096, + 189096, + 190366, + 189189, + 189073, + 189426, + 189119, + 189119, + 189429, + 189327, + 189327, + 189347, + 189235, + 189235, + 189160, + 189160, + 189224, + 189141, + 189141 + ], + "sample_count": 32 + }, + { + "pubkey": "EfFs2hKdoqgtLRBwtmfLjc8CECEcrqT1KvF73C4rUhFh", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143461000000, + "samples": [ + 173760, + 165863, + 165825, + 173581, + 173165, + 173197, + 161969, + 170570, + 162010, + 162037, + 162000, + 165855, + 164212, + 164278, + 165847, + 164231, + 162140, + 164284, + 164270, + 161951, + 162018, + 162011, + 164245, + 164200, + 164306, + 164301, + 164263, + 165880, + 164253, + 164314, + 162043, + 162014 + ], + "sample_count": 32 + }, + { + "pubkey": "3iVsq9niq79BFqpStq5JKmH5DsTq3tRxXCy1fe5gLz5u", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 149772, + 149782, + 149782, + 149596, + 149587, + 149760, + 149600, + 149610, + 149620, + 149620, + 149574, + 149606, + 149606, + 149442, + 149685, + 149630, + 149782, + 149659, + 149765, + 149881, + 149621, + 149641, + 149699, + 149762, + 149762, + 149596, + 149957, + 149628, + 149578, + 149578, + 149518, + 149518 + ], + "sample_count": 32 + }, + { + "pubkey": "EnyDaFpJypm3JAmjEEYiNwtAihTA7RvHu3WNemp5BszZ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143462000000, + "samples": [ + 143623, + 144149, + 148489, + 144158, + 144219, + 144170, + 148705, + 148671, + 148725, + 148690, + 151960, + 149619, + 148725, + 151205, + 148718, + 148514, + 148533, + 148518, + 151977, + 151942, + 149643, + 144214, + 143634, + 149616, + 149640, + 151781, + 151618, + 148572, + 143797, + 143864, + 149605, + 149627 + ], + "sample_count": 32 + }, + { + "pubkey": "786MVs8mrvYgCBiqvAohuVce1dPVoyFwkQCRTne9CtGQ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 60822, + 71155, + 60491, + 60479, + 70510, + 60518, + 60728, + 70137, + 60523, + 60777, + 60611, + 60778, + 60763, + 71236, + 61168, + 60482, + 72818, + 61554, + 60472, + 68933, + 61516, + 61643, + 60628, + 60491, + 60710, + 75420, + 62422, + 60487, + 69459, + 60490, + 60485, + 71307 + ], + "sample_count": 32 + }, + { + "pubkey": "Dhf7L7ZDM4Sgu4hFZAedc3jxSJ1iqNeHrDpmekPhpx5w", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 41433, + 41445, + 41414, + 41444, + 41419, + 41443, + 41503, + 41466, + 41425, + 41426, + 41467, + 41438, + 41425, + 41473, + 41438, + 41436, + 41462, + 41421, + 41466, + 41493, + 41441, + 41402, + 41434, + 41424, + 41488, + 41445, + 41440, + 41414, + 41436, + 41479, + 41461, + 41419 + ], + "sample_count": 32 + }, + { + "pubkey": "9Zn21oa3kFkZKYdCx2fP4eWXg6hLtuJq4KCH8zHuKBNR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 41652, + 41771, + 41775, + 41699, + 41699, + 41822, + 41714, + 41660, + 41726, + 41769, + 41729, + 41648, + 41740, + 41732, + 41727, + 41678, + 41713, + 41682, + 41646, + 41733, + 41733, + 41890, + 41775, + 41644, + 41731, + 41763, + 41676, + 41918, + 41742, + 41696, + 41799, + 41768 + ], + "sample_count": 32 + }, + { + "pubkey": "Aq86pQ7tFff27LzrLtp5ad9sVgkJpN7LN3NXAVf6voyF", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 29233, + 29280, + 29315, + 29276, + 29289, + 29248, + 29322, + 29272, + 29273, + 29287, + 29265, + 29296, + 29293, + 29272, + 29310, + 29275, + 29325, + 29268, + 29362, + 29342, + 29234, + 29293, + 29303, + 29276, + 29358, + 29269, + 29265, + 29312, + 29293, + 29314, + 29236, + 29262 + ], + "sample_count": 32 + }, + { + "pubkey": "FZ8rYdcfqysSGJtQCFLAUAjxyaJYhgeagktYUtTcbcf9", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 117728, + 117817, + 117749, + 117869, + 117838, + 117793, + 117782, + 117702, + 117701, + 117929, + 117960, + 117960, + 117847, + 117858, + 117746, + 117746, + 117634, + 117846, + 117684, + 117799, + 117894, + 117827, + 117764, + 117851, + 117736, + 117848, + 117684, + 117780, + 117914, + 117788, + 117816, + 117872 + ], + "sample_count": 32 + }, + { + "pubkey": "4vn2ZCY5m5e3fkxYmYVYn1T8Ei9UsntFCtD8Mduvcr7m", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 115054, + 115063, + 115030, + 115071, + 115054, + 115047, + 115050, + 115068, + 115160, + 115061, + 115033, + 115094, + 115032, + 115044, + 115002, + 115032, + 115077, + 115133, + 115121, + 115133, + 115060, + 115042, + 115035, + 115090, + 115021, + 115096, + 115085, + 115059, + 115038, + 115051, + 115046, + 114923 + ], + "sample_count": 32 + }, + { + "pubkey": "GSpcKhxLzxNE92ybKsuGVw3EYz2nYoVMaSxKDQQi7gDQ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 121142, + 121165, + 121195, + 121381, + 121271, + 121154, + 121127, + 121117, + 121130, + 126223, + 121083, + 121092, + 121277, + 121123, + 121107, + 121058, + 121143, + 121218, + 121047, + 121047, + 121084, + 121087, + 121050, + 121050, + 121130, + 121325, + 121248, + 121376, + 121166, + 121311, + 123152, + 122779 + ], + "sample_count": 32 + }, + { + "pubkey": "BbfqEHAZGJnD971x1hzYHfxsoraJpmzJDqGChEWGHtKu", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 132229, + 132275, + 132213, + 132222, + 132260, + 132254, + 132231, + 132252, + 132287, + 136523, + 132215, + 132262, + 132191, + 132231, + 132169, + 132220, + 132288, + 132372, + 132325, + 132203, + 132322, + 136781, + 132284, + 132340, + 132264, + 132321, + 132326, + 139258, + 132320, + 132238, + 132250, + 132177 + ], + "sample_count": 32 + }, + { + "pubkey": "C5cJ2amdSnCtDhZZC11Eep6uFGaFPfbPDrcf7MqQkYuJ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 127029, + 128780, + 127324, + 127010, + 128661, + 127037, + 126964, + 129245, + 127246, + 127053, + 127051, + 127033, + 128576, + 127346, + 126982, + 127284, + 129381, + 127927, + 127058, + 127113, + 127393, + 127029, + 127549, + 127695, + 126994, + 128025, + 126986, + 127013, + 127185, + 127129, + 127042, + 127142 + ], + "sample_count": 32 + }, + { + "pubkey": "9DceJcT9jY33V6NgcqMMZiy55zkdR3SfzHPQ4DDC7KPi", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 133167, + 133189, + 133182, + 133179, + 133188, + 133177, + 133151, + 133179, + 133254, + 133186, + 133147, + 133207, + 133150, + 133170, + 133191, + 133215, + 133179, + 133153, + 133250, + 133176, + 133094, + 133237, + 133140, + 133197, + 133107, + 133179, + 133137, + 133169, + 133194, + 133169, + 133163, + 133140 + ], + "sample_count": 32 + }, + { + "pubkey": "igz3JiNDRVvuNNdSruBaEgo4hWz6rRwwimAsEytkZTM", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 189118, + 189219, + 189309, + 189075, + 189154, + 189525, + 189104, + 189325, + 189271, + 189152, + 189421, + 189212, + 189225, + 189225, + 189097, + 189421, + 189307, + 189380, + 189380, + 189288, + 189277, + 189325, + 189310, + 189093, + 189093, + 189199, + 189199, + 189242, + 189216, + 189185, + 189417, + 189292 + ], + "sample_count": 32 + }, + { + "pubkey": "9bh1tNmpa94W8xiSwaQJyPjdDYwrJZWQkd3yb8VQSCwa", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 157695, + 157727, + 157728, + 157687, + 157638, + 157658, + 157761, + 157699, + 157775, + 158279, + 158289, + 158201, + 158214, + 158190, + 158304, + 163609, + 163639, + 163717, + 162827, + 162840, + 162805, + 157712, + 162789, + 162821, + 162779, + 162802, + 162827, + 157896, + 157920, + 157907, + 157878, + 157799 + ], + "sample_count": 32 + }, + { + "pubkey": "FNT1mVikU3pDamSbnmxJT3EL6MghQHtxCzGujdv5cMRU", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 136602, + 136529, + 136529, + 136336, + 136444, + 136491, + 136491, + 136552, + 136542, + 136542, + 136495, + 136430, + 136560, + 136532, + 136422, + 136422, + 136482, + 136567, + 136410, + 136495, + 136376, + 136512, + 136426, + 136447, + 136410, + 136507, + 136467, + 136440, + 136523, + 136456, + 136641, + 136625 + ], + "sample_count": 32 + }, + { + "pubkey": "7NCTg41atNEKw63y1rLcDjcEx7RTykoGVJP8T828X73Z", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 129710, + 129866, + 129646, + 129794, + 129770, + 129607, + 129806, + 129787, + 129945, + 134056, + 129726, + 129733, + 129722, + 129827, + 129871, + 129734, + 129889, + 129638, + 129777, + 129651, + 129725, + 129953, + 129904, + 129821, + 129716, + 129728, + 129758, + 129788, + 129782, + 129723, + 129907, + 129785 + ], + "sample_count": 32 + }, + { + "pubkey": "Bke4cdb4DjMjZvqN9hGeD5pSHc7iYzFzZyypGGugA31T", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 39517, + 39384, + 39333, + 39206, + 39229, + 39239, + 39362, + 39236, + 39229, + 39333, + 39562, + 39307, + 39262, + 39334, + 39296, + 39296, + 39289, + 39830, + 39279, + 39332, + 39257, + 39339, + 39339, + 39266, + 39287, + 39332, + 39341, + 39223, + 39223, + 39462, + 39227, + 39606 + ], + "sample_count": 32 + }, + { + "pubkey": "4WzRMC2p8o2f7pJM75cSMUsDqhUMd7QRdUEZsJCEfhox", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 47284, + 47343, + 47270, + 47295, + 47272, + 47335, + 47355, + 47353, + 47315, + 47271, + 47297, + 47345, + 47291, + 47299, + 47333, + 47373, + 47380, + 47295, + 47429, + 47280, + 47294, + 47363, + 47276, + 47344, + 47310, + 47341, + 47314, + 47315, + 47306, + 47306, + 47279, + 47273 + ], + "sample_count": 32 + }, + { + "pubkey": "7dQUty3DbBTNDWaYiDr4PbYu8xdd6FQn8N6rDJuiDt6m", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 128836, + 128524, + 128524, + 128775, + 128797, + 128948, + 128599, + 128432, + 128974, + 128607, + 128607, + 128721, + 128931, + 128734, + 128926, + 129881, + 128941, + 128658, + 128969, + 128900, + 128808, + 128756, + 128756, + 128791, + 128860, + 129043, + 128524, + 128524, + 128795, + 128812, + 128631, + 128631 + ], + "sample_count": 32 + }, + { + "pubkey": "5BJe7Rr6oviqmwyTccfw3rvLKuGYwQCpA7SULdQ9UmEN", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 106790, + 106711, + 106801, + 106826, + 106813, + 106804, + 106801, + 106743, + 106803, + 106810, + 106731, + 106715, + 106785, + 106788, + 106760, + 106790, + 106773, + 106817, + 106788, + 106838, + 114203, + 106716, + 106773, + 106775, + 106738, + 106837, + 106785, + 106803, + 106814, + 106834, + 106748, + 106670 + ], + "sample_count": 32 + }, + { + "pubkey": "Drq73pasRmqghaNG8A9ANdXtFrjnkuWxSKw2WgfxE3co", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 224704, + 224666, + 224778, + 224596, + 224675, + 224660, + 224592, + 224711, + 224559, + 224831, + 235825, + 224715, + 224715, + 224693, + 224693, + 225259, + 225259, + 224772, + 224606, + 224658, + 224888, + 224655, + 224875, + 224654, + 224606, + 224647, + 224636, + 224578, + 224868, + 224647, + 224693, + 224683 + ], + "sample_count": 32 + }, + { + "pubkey": "EmZNEneVZnZbsJV9EJgqT5gT5g2M9uZfXASZZZ5f1DqC", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 228788, + 239553, + 239564, + 222415, + 228847, + 228881, + 227544, + 227623, + 233051, + 233039, + 233137, + 239590, + 229724, + 229746, + 239555, + 239623, + 239618, + 239657, + 234421, + 234364, + 228471, + 224473, + 225531, + 225505, + 225505, + 225595, + 228456, + 223719, + 233011, + 233073, + 227478, + 226894 + ], + "sample_count": 32 + }, + { + "pubkey": "DvXo3U8PPBR3qhbdFutxzJrhoBWchwhYc8kSE1vJy1bC", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 40256, + 40484, + 40276, + 40431, + 40417, + 40246, + 40340, + 40446, + 40475, + 40684, + 40517, + 23092, + 23097, + 23140, + 23093, + 23093, + 22842, + 22842, + 23295, + 23189, + 23052, + 22972, + 23046, + 23001, + 23037, + 22919, + 22957, + 23149, + 23010, + 23016, + 22968, + 23219 + ], + "sample_count": 32 + }, + { + "pubkey": "BVdt2gGhbxPsMjVMZXUjhUj3bEPD3YuZPadB3qHjadbu", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 31672, + 31723, + 31618, + 31617, + 31624, + 31660, + 31668, + 31657, + 31600, + 31575, + 31683, + 31635, + 31606, + 31683, + 31622, + 31624, + 31646, + 31652, + 31719, + 31674, + 31639, + 31646, + 31648, + 31712, + 31669, + 31596, + 31646, + 31629, + 31648, + 31641, + 31642, + 31620 + ], + "sample_count": 32 + }, + { + "pubkey": "DSumR3LhD3eGbFB7jKkPCW7XN98kn4Dc8nSY2U6ikGXF", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 79365, + 79365, + 79241, + 79242, + 79279, + 79477, + 79102, + 79158, + 79158, + 79329, + 79358, + 79273, + 79314, + 79292, + 79183, + 79254, + 79372, + 79247, + 79159, + 79312, + 79251, + 79415, + 79352, + 79191, + 79455, + 79361, + 79242, + 79432, + 79373, + 79247, + 79379, + 79379 + ], + "sample_count": 32 + }, + { + "pubkey": "GBr2Jn5z2MHUFXG35PLvvBuE9pvwWcakhnEH3XPgFnLe", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 78567, + 78546, + 78549, + 78529, + 78566, + 78570, + 78575, + 78502, + 78513, + 78527, + 78547, + 78557, + 78567, + 78570, + 78542, + 78541, + 78571, + 78568, + 78574, + 78578, + 78549, + 78528, + 78583, + 78558, + 78545, + 78599, + 78551, + 78606, + 78550, + 78551, + 78543, + 78501 + ], + "sample_count": 32 + }, + { + "pubkey": "AK51yWxfLNgbM1qSzGUE6FMh4W3Cwy77Ctyggo7KQfTk", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 33539, + 33598, + 33505, + 33468, + 33686, + 33686, + 33438, + 33500, + 33622, + 33622, + 33458, + 33487, + 33675, + 33524, + 33524, + 33410, + 33628, + 33567, + 34597, + 33655, + 33556, + 33370, + 33524, + 33519, + 33556, + 33685, + 33600, + 33717, + 33602, + 33523, + 33530, + 33530 + ], + "sample_count": 32 + }, + { + "pubkey": "F5Li7SzQGjSe84JLFkuXavVyph4qCsRUmEB1DC9L3QJW", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 32659, + 32577, + 32560, + 32549, + 32584, + 32653, + 32630, + 32711, + 32649, + 32610, + 32584, + 32594, + 32640, + 32613, + 32670, + 32946, + 32671, + 32656, + 32534, + 32624, + 32612, + 32530, + 32634, + 32670, + 32582, + 32655, + 32641, + 32668, + 32621, + 32668, + 32659, + 32640 + ], + "sample_count": 32 + }, + { + "pubkey": "H5dCGr5zGgFbBmNHVpvoJpZaSRXZ7jQZsQBKyM91tqx4", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 123328, + 123423, + 123308, + 123411, + 123274, + 123368, + 123265, + 123343, + 123254, + 123194, + 123385, + 123293, + 123354, + 124048, + 123322, + 123322, + 123209, + 123209, + 123417, + 123271, + 123191, + 123440, + 123313, + 123230, + 123306, + 123354, + 123272, + 123323, + 123406, + 123310, + 123336, + 123425 + ], + "sample_count": 32 + }, + { + "pubkey": "8pZzdfNA8uncsyvkEeKmpdns6gpGKULxxACU2novSZXU", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 111691, + 111660, + 111679, + 111626, + 111729, + 111677, + 111721, + 111711, + 111692, + 111733, + 111690, + 111712, + 111694, + 111657, + 111623, + 111707, + 111673, + 111684, + 111723, + 111681, + 111696, + 111757, + 111692, + 111685, + 111667, + 111682, + 111692, + 111727, + 111732, + 111677, + 111638, + 111626 + ], + "sample_count": 32 + }, + { + "pubkey": "64wK5AMU2aWV3he6RPx1wcLQmiRVDJtDTUpu9NGoeCDY", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 156647, + 156647, + 157194, + 156569, + 156694, + 160749, + 157181, + 156629, + 156733, + 156816, + 156762, + 156984, + 156609, + 156603, + 156765, + 156773, + 156726, + 156764, + 156853, + 156716, + 156683, + 156791, + 156707, + 156583, + 156879, + 156839, + 156839, + 156540, + 156603, + 156561, + 156819, + 156836 + ], + "sample_count": 32 + }, + { + "pubkey": "HBcFKxPoL5njLRvMENw62EKJyiT5rohDcoYCXBkeR9Gv", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 122158, + 122134, + 122140, + 122173, + 122132, + 122185, + 122204, + 122164, + 122176, + 122221, + 122162, + 122172, + 122130, + 122164, + 122214, + 122146, + 122169, + 122135, + 122197, + 122147, + 122172, + 122179, + 122164, + 122178, + 122185, + 122225, + 122132, + 122157, + 122125, + 122161, + 122159, + 122133 + ], + "sample_count": 32 + }, + { + "pubkey": "2g5YTzwbTRt7Q3soNnB843sC3CdRBaMm1jJa5kPgGUEb", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 54843, + 56544, + 54867, + 54867, + 54747, + 55236, + 55893, + 54960, + 54963, + 55834, + 55130, + 55130, + 54901, + 55805, + 55811, + 55794, + 54993, + 55007, + 55059, + 55102, + 55102, + 55013, + 54952, + 55138, + 54958, + 55172, + 55004, + 54871, + 55861, + 55017, + 54792, + 55857 + ], + "sample_count": 32 + }, + { + "pubkey": "ERJmYuQ1G9MDAKCD61Pom2NX3EdvBj7rXe2rCCJJazVW", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 53217, + 53199, + 53154, + 53275, + 53330, + 53311, + 53216, + 53261, + 53434, + 53311, + 53198, + 53316, + 53238, + 53243, + 53344, + 53259, + 53107, + 53274, + 53360, + 53279, + 53297, + 53245, + 53264, + 53256, + 53229, + 53257, + 53292, + 53219, + 53455, + 53340, + 53306, + 53207 + ], + "sample_count": 32 + }, + { + "pubkey": "8jZRhz4G7JDsRjkJ5VVtkRutFyi315KkqZ2ZrzCgBWUw", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 68969, + 69151, + 69315, + 68724, + 68731, + 68746, + 68849, + 69228, + 68654, + 68854, + 68861, + 68908, + 68853, + 69610, + 69610, + 68796, + 68885, + 69079, + 68802, + 68835, + 69277, + 68959, + 68790, + 68747, + 68835, + 68889, + 68965, + 69001, + 69001, + 68678, + 68943, + 69122 + ], + "sample_count": 32 + }, + { + "pubkey": "84st2qjzcsg46zg9aFQ4A4y7ksm6qcecpMq94dCp7G2T", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 70048, + 70160, + 67996, + 67975, + 67938, + 70134, + 70288, + 70293, + 68012, + 67982, + 70192, + 70198, + 70295, + 70257, + 70359, + 70294, + 70257, + 70117, + 70191, + 70160, + 67928, + 67914, + 68003, + 70056, + 67960, + 68002, + 67863, + 70040, + 70009, + 70052, + 70206, + 70221 + ], + "sample_count": 32 + }, + { + "pubkey": "E26W4DZZJcCxUA8shiwjHstioF6zL28FbhKYyhUe2dEw", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 116754, + 116635, + 116655, + 116796, + 117443, + 116633, + 116737, + 116841, + 116737, + 116640, + 116649, + 116695, + 116737, + 116646, + 116725, + 117035, + 116754, + 116686, + 116679, + 116751, + 116764, + 116872, + 116918, + 116628, + 116628, + 118249, + 116794, + 116689, + 116610, + 116610, + 116744, + 116718 + ], + "sample_count": 32 + }, + { + "pubkey": "GXxGchf7x4oeTiWVKJjbTMcprQfy4NdYWacfg7PEHG38", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 120867, + 120962, + 120833, + 120902, + 120863, + 120887, + 120974, + 120873, + 120947, + 120862, + 120877, + 120956, + 120829, + 120914, + 120858, + 120957, + 120909, + 120925, + 120955, + 120828, + 120851, + 120828, + 120862, + 120896, + 120896, + 120879, + 121553, + 121577, + 121465, + 121503, + 121582, + 121493 + ], + "sample_count": 32 + }, + { + "pubkey": "EdMXD4xobsvaFdVePANEevUxfCDFd1UCVTvcueCtmmv", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 152077, + 152240, + 152240, + 152206, + 152186, + 155291, + 152336, + 152143, + 152730, + 152334, + 152015, + 152653, + 152363, + 152466, + 152274, + 152915, + 152076, + 155196, + 152166, + 152335, + 152335, + 152725, + 152604, + 152324, + 152950, + 152381, + 152219, + 154273, + 152488, + 152109, + 152685, + 152685 + ], + "sample_count": 32 + }, + { + "pubkey": "BkV4wHaBSBQZkEx6tFAcaNhmo4r61th6XvghfQ5eCtoe", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 150346, + 150322, + 150348, + 150328, + 149724, + 149753, + 149730, + 149739, + 149753, + 142166, + 149637, + 150329, + 150320, + 150406, + 150307, + 150222, + 150387, + 150282, + 150382, + 148929, + 160840, + 149708, + 149715, + 149766, + 149718, + 149691, + 150372, + 149704, + 149635, + 149663, + 149652, + 149596 + ], + "sample_count": 32 + }, + { + "pubkey": "3wVEWDSySLvPehRYxEGEkius37JUCbSyo2aNYs9J9HBc", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 68735, + 73498, + 68155, + 69524, + 76875, + 69673, + 69546, + 79245, + 70070, + 68149, + 68122, + 68160, + 68160, + 80731, + 68732, + 68426, + 68345, + 68242, + 68116, + 79382, + 69787, + 68617, + 68255, + 68204, + 68198, + 77306, + 68063, + 68390, + 76900, + 68200, + 68161, + 72894 + ], + "sample_count": 32 + }, + { + "pubkey": "FbWzJkrQCbSfcGCcXnqwsqnSXBTJC3YRA7rF7BAbpqxE", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143525000000, + "samples": [ + 61597, + 61645, + 61798, + 61654, + 61831, + 61653, + 61647, + 61607, + 61844, + 61719, + 61647, + 61716, + 61610, + 61607, + 61638, + 61730, + 61624, + 61609, + 61646, + 61671, + 61847, + 61642, + 61698, + 61668, + 61638, + 61634, + 61652, + 61625, + 61651, + 61635, + 61780, + 61638 + ], + "sample_count": 32 + }, + { + "pubkey": "3xcwrgRdNbjJi3vEvhJuyrRv5jdSo3EJazmbRpuCiTod", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 70076, + 70281, + 70144, + 70139, + 70324, + 70324, + 70241, + 70099, + 70192, + 70185, + 70160, + 70136, + 70269, + 70095, + 70358, + 70264, + 70112, + 70318, + 70084, + 70229, + 70194, + 70034, + 70043, + 70232, + 70201, + 70091, + 70334, + 70066, + 70203, + 70357, + 70256, + 70062 + ], + "sample_count": 32 + }, + { + "pubkey": "37ZuHEXFcxWYFu6cb89uGL9Kwb5R6nh4LAysQ23Aniv6", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143525000000, + "samples": [ + 60687, + 60484, + 60529, + 60607, + 60750, + 60567, + 60546, + 60588, + 60732, + 60554, + 60531, + 60502, + 60738, + 60704, + 60628, + 60542, + 60596, + 60575, + 60525, + 60514, + 60551, + 60632, + 60756, + 60512, + 60513, + 60579, + 60660, + 60535, + 60563, + 60540, + 60578, + 60637 + ], + "sample_count": 32 + }, + { + "pubkey": "2mz8ZCxGdcm93bbqbdDtA9QHhDSyFfEf6ER7qFiy1yBJ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 148872, + 149054, + 149054, + 148900, + 148928, + 149464, + 149086, + 148976, + 149018, + 148834, + 149057, + 149057, + 148952, + 149135, + 148940, + 148940, + 149173, + 149061, + 148937, + 149309, + 148996, + 148889, + 149071, + 148995, + 148995, + 148919, + 149233, + 148975, + 148908, + 149022, + 148915, + 148948 + ], + "sample_count": 32 + }, + { + "pubkey": "6f6o2eRca7TvXE59GAN67zF2RymNQYP1KRdNbUoEWXq2", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143525000000, + "samples": [ + 163981, + 163986, + 163960, + 163997, + 163988, + 163913, + 163971, + 163959, + 163938, + 164180, + 164020, + 163946, + 164104, + 163971, + 163904, + 163931, + 164018, + 163963, + 163956, + 164194, + 164060, + 164087, + 164059, + 163955, + 163995, + 163963, + 163972, + 163980, + 163969, + 164120, + 163963, + 164000 + ], + "sample_count": 32 + }, + { + "pubkey": "MzJrMofxELsQcyh4DbQasXJkbcr4yBKDmqLYSsHJA3Y", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 156701, + 156675, + 156208, + 156217, + 158203, + 156174, + 156933, + 158971, + 156760, + 156127, + 158915, + 158137, + 182942, + 155577, + 155110, + 158910, + 157766, + 155892, + 155892, + 156153, + 156111, + 156061, + 156194, + 158942, + 155996, + 159346, + 157077, + 158695, + 156126, + 156970, + 160132, + 156033 + ], + "sample_count": 32 + }, + { + "pubkey": "8FEJwhyjV7ssQUrzEhu8kt5TUK6MCdgPxjpiQHicXW8Z", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143520000000, + "samples": [ + 161086, + 161027, + 160981, + 161033, + 161157, + 160973, + 160927, + 160996, + 160973, + 161052, + 161009, + 161030, + 161119, + 161065, + 161187, + 160988, + 161197, + 161055, + 160968, + 161000, + 161000, + 160991, + 160984, + 161010, + 160984, + 160996, + 160988, + 161003, + 161002, + 160934, + 161182, + 160980 + ], + "sample_count": 32 + }, + { + "pubkey": "3XoUtPuDwa2t4zNer2EhrHg1xa31ZwEDKxA4jRLUwgwY", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 157492, + 158696, + 157642, + 157436, + 157584, + 157510, + 157693, + 157596, + 157532, + 157516, + 158302, + 157524, + 157524, + 157445, + 157910, + 157520, + 157464, + 157659, + 157711, + 157402, + 158462, + 157451, + 157601, + 157881, + 157678, + 157678, + 157406, + 157701, + 157400, + 157422, + 157422, + 162459 + ], + "sample_count": 32 + }, + { + "pubkey": "48s5wqauM5LFtU3Jrrij15VCJhMApDGdNxF9EriLf2ok", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143521000000, + "samples": [ + 167522, + 167430, + 167358, + 167475, + 167328, + 167455, + 167365, + 167501, + 167333, + 167482, + 167318, + 167354, + 167235, + 167316, + 167367, + 167490, + 167412, + 167476, + 167322, + 167362, + 167368, + 167454, + 167411, + 167385, + 167507, + 167493, + 167275, + 167311, + 167303, + 167323, + 167319, + 167516 + ], + "sample_count": 32 + }, + { + "pubkey": "GWZTQ3Q7xuPJodc5CA49tpTgyyM9uEzU1TVfb74w4cKE", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 104499, + 104616, + 104490, + 104423, + 104472, + 104460, + 104356, + 104880, + 104592, + 104469, + 104470, + 104470, + 104450, + 104243, + 104555, + 104516, + 104460, + 104501, + 104585, + 104487, + 104531, + 104531, + 104501, + 104425, + 104914, + 104579, + 104440, + 104594, + 104634, + 104348, + 104406, + 104406 + ], + "sample_count": 32 + }, + { + "pubkey": "3KXqv8PF65sx1uvi7Puk3c1Y9sA5SUP5gzmS8g7eZ7uJ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143520000000, + "samples": [ + 105313, + 105165, + 105115, + 105196, + 105219, + 105135, + 105166, + 105171, + 105170, + 105049, + 105133, + 105151, + 105245, + 105155, + 104992, + 105100, + 105054, + 105142, + 105162, + 105165, + 105040, + 105154, + 105228, + 105251, + 105175, + 105174, + 105244, + 105220, + 105205, + 105111, + 105220, + 105069 + ], + "sample_count": 32 + }, + { + "pubkey": "DD3RX4WFX8NA3Pz7rgrst4Q8rBDAaH7iwc8VDEN2HM9Q", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 57643, + 57716, + 57586, + 57669, + 57771, + 57719, + 57630, + 57729, + 57881, + 57701, + 57752, + 57732, + 57602, + 57774, + 57686, + 57690, + 57690, + 57655, + 57871, + 57592, + 57669, + 57621, + 57782, + 57723, + 57634, + 57595, + 57834, + 57637, + 57570, + 57570, + 57657, + 57740 + ], + "sample_count": 32 + }, + { + "pubkey": "HJP7NMfA1AxBff64bzETWEyYmpEU7zc3cVb241aUTcUS", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143521000000, + "samples": [ + 57590, + 57717, + 57634, + 57686, + 57655, + 57599, + 57701, + 57676, + 57708, + 57616, + 57645, + 57691, + 57819, + 57625, + 57640, + 57638, + 57683, + 57746, + 57885, + 57733, + 57653, + 57770, + 57690, + 57749, + 57817, + 57710, + 57722, + 57764, + 57603, + 57710, + 57693, + 57652 + ], + "sample_count": 32 + }, + { + "pubkey": "WVnWCcfN9Tj7MU2bXjw7eEk1ZdDPe56eccYS1ATncyd", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 155003, + 155010, + 155819, + 156254, + 156254, + 155039, + 155787, + 156371, + 156268, + 156337, + 156326, + 155049, + 155779, + 155696, + 154871, + 155827, + 155827, + 156408, + 156315, + 156405, + 156431, + 155651, + 154947, + 156314, + 156440, + 156495, + 155949, + 155693, + 156285, + 156388, + 156626, + 155774 + ], + "sample_count": 32 + }, + { + "pubkey": "HqT49RF9XZR5eAGZwtauh8RtBoj9yqXzhUK2zHkr45xq", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143523000000, + "samples": [ + 165078, + 164904, + 165125, + 165036, + 165174, + 165006, + 164993, + 165139, + 165164, + 165100, + 164771, + 164839, + 165102, + 165070, + 165070, + 165147, + 165124, + 165047, + 165066, + 165106, + 165235, + 165103, + 165094, + 164942, + 165008, + 164845, + 165066, + 164985, + 164841, + 165061, + 165041, + 165074 + ], + "sample_count": 32 + }, + { + "pubkey": "9p8EcySJpCReJF4cc5WEdnneyNxvT6gT4GfBwdHSeJ2A", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 68845, + 69870, + 68784, + 68689, + 68689, + 68870, + 68886, + 68832, + 68973, + 68933, + 68980, + 68850, + 68885, + 68872, + 69513, + 69089, + 68850, + 69047, + 68991, + 68763, + 68890, + 68691, + 68898, + 68850, + 68840, + 69061, + 69061, + 69091, + 69091, + 68780, + 68837, + 69597 + ], + "sample_count": 32 + }, + { + "pubkey": "CtBP5UfDeRDwqvekDDNE6b8xxpQpqP1X4XzJEZx9oSiz", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143524000000, + "samples": [ + 57091, + 57019, + 57023, + 56889, + 56997, + 56902, + 56947, + 56969, + 56900, + 56932, + 57012, + 56901, + 57092, + 56856, + 56924, + 56972, + 56996, + 56936, + 56947, + 57136, + 57070, + 57068, + 56962, + 56935, + 57044, + 56913, + 56912, + 56971, + 56909, + 56933, + 57104, + 56862 + ], + "sample_count": 32 + }, + { + "pubkey": "J6LdudSgfGioyFxPFJsCz4xwhScHKc5rfPirjrq9ya5N", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 173027, + 173067, + 173097, + 172909, + 173234, + 173164, + 172967, + 173125, + 173079, + 173237, + 173123, + 172792, + 173092, + 173142, + 173097, + 173015, + 173007, + 173218, + 172921, + 173355, + 172891, + 173106, + 173336, + 173336, + 173172, + 181570, + 173293, + 173095, + 173095, + 173169, + 173273, + 173273 + ], + "sample_count": 32 + }, + { + "pubkey": "CTjY1Lcr1Jydgr79or5z85V6PWmjyHgwDyNVkgqY9LNY", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143524000000, + "samples": [ + 174982, + 174970, + 174890, + 175059, + 175081, + 174978, + 174917, + 174921, + 175094, + 175085, + 174912, + 175059, + 174984, + 174960, + 174946, + 174907, + 174907, + 174830, + 174928, + 175077, + 174997, + 174957, + 174928, + 174913, + 175054, + 174883, + 174832, + 174793, + 174900, + 175001, + 174957, + 174845 + ], + "sample_count": 32 + }, + { + "pubkey": "2N2Gfb6HCiLgJ32y3UuToY11ofuiV5CUsNj6fS3PKifr", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 162361, + 162562, + 162457, + 162410, + 162355, + 162525, + 162317, + 162654, + 162654, + 162473, + 162569, + 169006, + 162473, + 162420, + 162420, + 162595, + 162457, + 162399, + 162959, + 162443, + 162344, + 162340, + 162450, + 162434, + 162405, + 162488, + 163058, + 162559, + 162318, + 162364, + 162483, + 162431 + ], + "sample_count": 32 + }, + { + "pubkey": "Dm3BSWLBqZKn3y6L4UcE8ytUdwsrtczA3AyM7JcdhBWx", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143523000000, + "samples": [ + 174173, + 174134, + 174082, + 174093, + 174098, + 174112, + 174171, + 174201, + 174086, + 174314, + 174084, + 174092, + 174319, + 174138, + 174078, + 174099, + 174198, + 174186, + 174216, + 174032, + 174270, + 174123, + 174260, + 174095, + 174084, + 175633, + 175635, + 175711, + 174056, + 174145, + 174132, + 174071 + ], + "sample_count": 32 + }, + { + "pubkey": "AQ6Kxzap1tZfVZPEoN1CsFf7UGr5WkFFwWrMYgPxixXJ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 52616, + 52616, + 53088, + 52495, + 52761, + 52774, + 52456, + 52581, + 52621, + 52511, + 52652, + 52652, + 52988, + 52728, + 52522, + 52739, + 52896, + 52628, + 52697, + 52628, + 52564, + 52564, + 52598, + 52569, + 52548, + 52681, + 52622, + 52509, + 52814, + 52560, + 52818, + 52953 + ], + "sample_count": 32 + }, + { + "pubkey": "5Ma5tmEa591eQWhFLnr1mN2M75ZYtYedMAtb5oMzXF4V", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143526000000, + "samples": [ + 56925, + 57042, + 56974, + 56961, + 57154, + 56999, + 57003, + 57107, + 56983, + 56953, + 57002, + 56966, + 56933, + 57045, + 56982, + 57159, + 57064, + 57018, + 57131, + 56963, + 57159, + 57009, + 57143, + 56953, + 56946, + 57164, + 57013, + 57022, + 56977, + 57109, + 56972, + 57079 + ], + "sample_count": 32 + }, + { + "pubkey": "BrKPXuncSbJbng9Uuk6Hy5Ht1JNDd16rieBTf7qb9DuH", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 27102, + 25783, + 25745, + 25745, + 25724, + 24499, + 25856, + 25653, + 25696, + 25810, + 27096, + 27186, + 27186, + 27064, + 25659, + 25915, + 25915, + 24259, + 24392, + 24766, + 24439, + 24592, + 24364, + 24505, + 24435, + 24435, + 25909, + 25754, + 25709, + 27279, + 27327, + 25700 + ], + "sample_count": 32 + }, + { + "pubkey": "8nkDev6QCTA6DvG9WqF9HKEnrsd4mzyAyDeMWgshTZcU", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143526000000, + "samples": [ + 26079, + 26014, + 26096, + 26093, + 26281, + 26162, + 26100, + 26065, + 26079, + 26270, + 26074, + 26048, + 26077, + 26113, + 25996, + 26098, + 26145, + 26192, + 26103, + 26005, + 26027, + 26088, + 26041, + 26220, + 26040, + 26104, + 26046, + 26073, + 26025, + 26021, + 26063, + 26082 + ], + "sample_count": 32 + }, + { + "pubkey": "8dSMvGhCjiECdyvfai9i4hoU7pmxKbFWtTkByWdBjZDQ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 59043, + 59366, + 59096, + 59347, + 59212, + 59245, + 59132, + 59214, + 59282, + 59282, + 59305, + 59647, + 59091, + 59096, + 59122, + 59080, + 59366, + 59398, + 59258, + 59173, + 59429, + 59153, + 59187, + 59568, + 59157, + 59003, + 59003, + 59056, + 59085, + 59204, + 59362, + 59139 + ], + "sample_count": 32 + }, + { + "pubkey": "Ek2UUeBJy5sbUMSDwb8fWHYj8hYxyz6zue8t2iSjbNXX", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143526000000, + "samples": [ + 56275, + 56166, + 56183, + 56285, + 56197, + 56273, + 56191, + 56163, + 56190, + 56234, + 56351, + 56137, + 56189, + 56215, + 56119, + 56395, + 56147, + 56236, + 56313, + 56274, + 56379, + 56085, + 56206, + 56311, + 56317, + 56164, + 56199, + 56254, + 56281, + 56325, + 56310, + 56223 + ], + "sample_count": 32 + }, + { + "pubkey": "377qPiz41qAverjS9ZDrpQ21MhEuKQWpYpjjYH4Tn5jA", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 163688, + 163810, + 163894, + 163774, + 163885, + 163719, + 163880, + 163768, + 163742, + 163750, + 163705, + 163790, + 163706, + 163726, + 163685, + 163761, + 163744, + 163764, + 163734, + 164256, + 163644, + 163856, + 163773, + 163871, + 163763, + 163878, + 163903, + 163821, + 163733, + 163860, + 163817, + 163685 + ], + "sample_count": 32 + }, + { + "pubkey": "F4caxFi47bu91bWv2i5stkftwnqKLgeKmtZzibkJWUrq", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143518000000, + "samples": [ + 145521, + 145562, + 145531, + 145544, + 145562, + 145531, + 145525, + 145510, + 145564, + 145598, + 145460, + 145517, + 145557, + 145521, + 145483, + 145489, + 145504, + 145534, + 145532, + 145476, + 145469, + 145469, + 145576, + 145552, + 145488, + 145714, + 145462, + 145564, + 145619, + 145533, + 145510, + 145533 + ], + "sample_count": 32 + }, + { + "pubkey": "AuJTYhi51gYQcc4gUDRVHuD6Xb6LDPvEsJxJm9ZEEzEC", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 146042, + 146335, + 146077, + 146200, + 146200, + 146060, + 146054, + 146063, + 146063, + 146257, + 146133, + 146150, + 146205, + 146369, + 146369, + 146049, + 146180, + 146148, + 146134, + 146778, + 146115, + 145881, + 146216, + 146031, + 145947, + 146154, + 146006, + 146097, + 146030, + 146131, + 146069, + 146216 + ], + "sample_count": 32 + }, + { + "pubkey": "AJ7Kh6eHqj627i72cn5SXpKmyiCovRr4ujsUwBmdPKg6", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143519000000, + "samples": [ + 140700, + 140685, + 140707, + 140919, + 140745, + 140806, + 140721, + 140708, + 140717, + 140730, + 140752, + 140800, + 140679, + 140700, + 140659, + 140720, + 140819, + 140722, + 140721, + 140766, + 140726, + 140767, + 140869, + 140876, + 140714, + 140888, + 140692, + 140681, + 140773, + 140953, + 140721, + 140707 + ], + "sample_count": 32 + }, + { + "pubkey": "CDxVFiFXEvcb9bxu4n75kZpkqD92CEjsEjXauko5TRia", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 148916, + 149907, + 146726, + 146726, + 146887, + 146887, + 150509, + 147730, + 147521, + 147866, + 147176, + 164273, + 149370, + 149152, + 149164, + 148171, + 148201, + 148201, + 149871, + 147453, + 148977, + 146698, + 147745, + 146725, + 151123, + 148369, + 147385, + 147385, + 147452, + 147497, + 147268, + 149168 + ], + "sample_count": 32 + }, + { + "pubkey": "FaPbCpFP1WwoLXuKr9avwRKNLebrtk8rWRncnViHeRUj", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143520000000, + "samples": [ + 151222, + 151150, + 151090, + 151152, + 151300, + 151189, + 151159, + 151262, + 151103, + 151202, + 151197, + 151130, + 151150, + 151180, + 151130, + 151295, + 151125, + 151302, + 151195, + 151195, + 151224, + 151181, + 151328, + 151177, + 151137, + 151032, + 151098, + 151052, + 151215, + 151148, + 151106, + 151197 + ], + "sample_count": 32 + }, + { + "pubkey": "8MH1Mw61LUKz8BNXWTgXaPEoLdJyqSX5ZujgD27dA58m", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 13958, + 14360, + 14002, + 14013, + 14287, + 14050, + 13995, + 14133, + 14048, + 13965, + 14329, + 14112, + 14112, + 13942, + 14242, + 14128, + 13993, + 14206, + 14034, + 14223, + 14422, + 13946, + 13995, + 14054, + 14116, + 13979, + 13979, + 14119, + 13963, + 14156, + 14054, + 14265 + ], + "sample_count": 32 + }, + { + "pubkey": "CxS9pWK514LvKRqkgvwJ8uZ4MQbprD3btoRv2RMn8aaa", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143522000000, + "samples": [ + 37155, + 37208, + 37247, + 37328, + 35804, + 35633, + 35721, + 37202, + 37398, + 37200, + 37256, + 37178, + 37122, + 37184, + 37125, + 37183, + 37108, + 37183, + 37224, + 37113, + 37265, + 37264, + 37263, + 37140, + 37164, + 46902, + 37146, + 37081, + 37235, + 37324, + 37285, + 37117 + ], + "sample_count": 32 + }, + { + "pubkey": "vsSB6emDtrD7KfEutzS5PRpMdjagwq5irKZQCX7Keo8", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 11685, + 11797, + 11779, + 10405, + 12194, + 12194, + 10498, + 10262, + 11815, + 11685, + 11705, + 11834, + 10513, + 10174, + 11161, + 11161, + 11662, + 11548, + 10397, + 11972, + 11751, + 11818, + 11818, + 11771, + 11771, + 11701, + 10385, + 10423, + 11662, + 12038, + 11757, + 11757 + ], + "sample_count": 32 + }, + { + "pubkey": "6ZXWpWzWSGMtFvryrvdu4nTUxD95r9VY6vGZM6GcEsUh", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143519000000, + "samples": [ + 10070, + 10100, + 10127, + 10025, + 10083, + 10028, + 10195, + 10102, + 10144, + 10191, + 10247, + 10107, + 10065, + 10157, + 10042, + 10157, + 10147, + 10107, + 10109, + 10168, + 10054, + 10214, + 10031, + 10070, + 10078, + 10078, + 10172, + 10137, + 10242, + 10080, + 10179, + 10014 + ], + "sample_count": 32 + }, + { + "pubkey": "4LbdeM1JqgxKcVUR4cNjGUoKUvAb5DbVHhMtovC6vfrh", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 152866, + 152867, + 152867, + 153086, + 152881, + 152881, + 152863, + 153083, + 152873, + 153266, + 152945, + 152928, + 152978, + 152930, + 152821, + 153233, + 153052, + 153056, + 152903, + 152903, + 153071, + 152878, + 153456, + 153456, + 153262, + 152853, + 190024, + 153201, + 153201, + 152950, + 153434, + 153110 + ], + "sample_count": 32 + }, + { + "pubkey": "8HHUQVphUhv7FPkuYAb7sTVNERS5TGJtbdXyJd9fcig5", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143522000000, + "samples": [ + 147101, + 147255, + 147216, + 147238, + 147214, + 147140, + 147209, + 147246, + 147203, + 147263, + 147213, + 147187, + 147388, + 147209, + 146849, + 146840, + 147209, + 147259, + 147288, + 147249, + 147254, + 147161, + 147270, + 147135, + 147399, + 147385, + 147171, + 147217, + 147281, + 147305, + 147233, + 147399 + ], + "sample_count": 32 + }, + { + "pubkey": "72AgxHj8iyRo23GrhxcHZdRCeG4Yg5Rw7KCGmoPzbmSL", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 131862, + 131906, + 131176, + 131484, + 131924, + 131349, + 131166, + 132002, + 131924, + 131860, + 131200, + 131565, + 131387, + 131331, + 131848, + 131218, + 131286, + 130925, + 131764, + 132007, + 131236, + 131195, + 131475, + 131475, + 131943, + 131860, + 131860, + 132318, + 131773, + 130553, + 131808, + 131367 + ], + "sample_count": 32 + }, + { + "pubkey": "Ez9LyDA9sxYfGE7Zvt6rVozJpvF1gPSVXXWpj31FtTM7", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143518000000, + "samples": [ + 123886, + 124002, + 124603, + 124749, + 124637, + 124497, + 124533, + 124377, + 124596, + 124452, + 124565, + 124689, + 124483, + 124435, + 124625, + 125712, + 125788, + 125652, + 125808, + 125725, + 125765, + 125707, + 125685, + 125744, + 125840, + 125857, + 125755, + 124720, + 124714, + 124641, + 124571, + 124440 + ], + "sample_count": 32 + }, + { + "pubkey": "636dVf7iCidMaB792VCb9jnZwZi1WMX5dd1jcJWmedCj", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 163471, + 166353, + 163569, + 163230, + 163630, + 163394, + 163204, + 163478, + 163418, + 163298, + 163938, + 163265, + 163255, + 164684, + 163772, + 163543, + 163765, + 163418, + 163402, + 163363, + 163617, + 163401, + 163302, + 164294, + 163239, + 163298, + 163255, + 163255, + 163498, + 163451, + 163471, + 163559 + ], + "sample_count": 32 + }, + { + "pubkey": "CxyV6xTaDnuwStgwF8s4iG7zYYizDsTE9wKczaCBiELb", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143522000000, + "samples": [ + 159758, + 159478, + 159488, + 159540, + 159661, + 159614, + 159531, + 160166, + 160155, + 160270, + 157482, + 157514, + 157447, + 157491, + 157522, + 157705, + 157606, + 157595, + 157524, + 157536, + 157578, + 157498, + 157509, + 157607, + 160173, + 160227, + 160138, + 160286, + 157552, + 157647, + 157542, + 157506 + ], + "sample_count": 32 + }, + { + "pubkey": "6otTmNA4X5XcmX5joEjcxzkUGb9r85YtVg3JHKpCYHD7", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 118636, + 118636, + 125000, + 113333, + 116808, + 116808, + 121636, + 117444, + 117086, + 117086, + 126537, + 116800, + 117091, + 117091, + 126639, + 126639, + 116996, + 116996, + 117042, + 124432, + 116906, + 116906, + 118189, + 118189, + 128171, + 128171, + 113507, + 116868, + 128437, + 119677, + 116785, + 116785 + ], + "sample_count": 32 + }, + { + "pubkey": "EVh8kNxYZF1GKAEv9m7qahs1zJAftCDjv87tNidCU11H", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143542000000, + "samples": [ + 103776, + 103852, + 103838, + 103929, + 104006, + 103965, + 103927, + 103896, + 103936, + 103934, + 103803, + 103916, + 103981, + 103755, + 103978, + 103771, + 104046, + 103816, + 103737, + 104056, + 103830, + 103877, + 103981, + 103821, + 103796, + 103953, + 103817, + 103975, + 103797, + 103798, + 103997, + 103896 + ], + "sample_count": 32 + }, + { + "pubkey": "8s4RadRF7dz36vw1cEmLgdsB2hi2wPoERcFx6mF71SJB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 109232, + 109168, + 109168, + 109206, + 109206, + 109192, + 109807, + 109807, + 109258, + 109042, + 109020, + 109020, + 109190, + 109190, + 109050, + 109158, + 109118, + 109118, + 109125, + 109125, + 109197, + 109058, + 109159, + 109052, + 109052, + 109151, + 109151, + 109546, + 109546, + 109627, + 109627, + 109146 + ], + "sample_count": 32 + }, + { + "pubkey": "FcyPCJr9RLX46o7cj6LfiVvuPWqaikh9xEFXBS2HLvDW", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143542000000, + "samples": [ + 111044, + 111073, + 111208, + 111117, + 111175, + 111237, + 111004, + 110996, + 111204, + 111002, + 111146, + 111118, + 111220, + 111010, + 111238, + 111121, + 111005, + 111162, + 110922, + 111217, + 110991, + 111174, + 111194, + 110927, + 111034, + 111173, + 110996, + 111070, + 111084, + 111169, + 111250, + 110975 + ], + "sample_count": 32 + }, + { + "pubkey": "FoqbqhixGD19NBWEdC4U6qJVWbtpd5kVbUYFNSBbGcim", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 101648, + 108609, + 101669, + 101522, + 101639, + 101591, + 101533, + 109431, + 101601, + 101813, + 109846, + 109846, + 101626, + 101824, + 101824, + 115467, + 101927, + 102210, + 103167, + 101524, + 101594, + 110557, + 102524, + 101845, + 110289, + 110289, + 101517, + 101816, + 111229, + 102559, + 101633, + 101633 + ], + "sample_count": 32 + }, + { + "pubkey": "BNe3oT8hCKcGuVCBwUVLnMFRPVY771bBPQhjor2P2dPg", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143447000000, + "samples": [ + 88890, + 88970, + 88952, + 88914, + 88908, + 88912, + 89002, + 88938, + 88894, + 88924, + 88915, + 88920, + 88905, + 88930, + 88916, + 88986, + 89027, + 88872, + 89024, + 88974, + 88954, + 88924, + 88909, + 88933, + 88984, + 88920, + 88973, + 88937, + 89016, + 88973, + 88939, + 89045 + ], + "sample_count": 32 + }, + { + "pubkey": "6S8yZdUXZnDQk4hADtnYKAgdHfEwp4A7KxKcyvvj4aSA", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 92623, + 92955, + 92955, + 92675, + 92623, + 92560, + 92598, + 92794, + 92522, + 92663, + 93869, + 92592, + 92678, + 92612, + 92581, + 92676, + 92676, + 92686, + 92687, + 92687, + 92575, + 92769, + 92712, + 92712, + 92656, + 92668, + 92682, + 92620, + 92778, + 92839, + 92839, + 92654 + ], + "sample_count": 32 + }, + { + "pubkey": "AWnAAwXTAm6HNiMoXFaog2p5E2uaR4s6NXeVrUzWr7e4", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143447000000, + "samples": [ + 85751, + 85828, + 85818, + 85716, + 85717, + 85755, + 85785, + 85714, + 85764, + 85734, + 85794, + 85795, + 85704, + 85750, + 85728, + 85714, + 85777, + 85746, + 85752, + 85713, + 85743, + 85756, + 85759, + 85734, + 85769, + 85769, + 85790, + 85691, + 85730, + 85766, + 85730, + 85795 + ], + "sample_count": 32 + }, + { + "pubkey": "9jPGMpPf1H8dpfvPN5EE7W23F3SHz3Fg6PELBMjqfMRG", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 3492, + 3463, + 3472, + 3495, + 3548, + 3510, + 8762, + 3484, + 3390, + 3478, + 3602, + 3482, + 3503, + 3523, + 3505, + 3505, + 3478, + 3435, + 3518, + 3494, + 3449, + 3558, + 13172, + 3574, + 3463, + 3492, + 3563, + 3577, + 3401, + 3521, + 3486, + 3486 + ], + "sample_count": 32 + }, + { + "pubkey": "D4UUkWmWX1ifPkKuMiVRg48eaTPAA21naDkbQQ3xhizc", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143447000000, + "samples": [ + 4274, + 4251, + 4202, + 4239, + 4238, + 4273, + 4345, + 4271, + 4261, + 4228, + 4310, + 4285, + 4265, + 4245, + 4244, + 4296, + 4306, + 4256, + 4251, + 4266, + 4280, + 4246, + 4311, + 4249, + 4274, + 4316, + 4293, + 4348, + 4274, + 4231, + 4278, + 4281 + ], + "sample_count": 32 + }, + { + "pubkey": "9WGmGYccoj6qaCDE6dczgLztnPPAc7RcyMfGxns1nugB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 20469, + 20308, + 20367, + 20367, + 20475, + 21123, + 21163, + 21123, + 20334, + 20355, + 20334, + 20478, + 20435, + 20281, + 20446, + 20447, + 20467, + 20360, + 20522, + 20294, + 20355, + 20368, + 20449, + 20409, + 20486, + 20302, + 20370, + 20370, + 20441, + 20346, + 20346, + 20370 + ], + "sample_count": 32 + }, + { + "pubkey": "FDm2YyqZrGgFMDpAppvFS4MLVZkuGFShaY7ukyGGdX7M", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143442000000, + "samples": [ + 37017, + 36941, + 37024, + 36936, + 36887, + 36847, + 36839, + 36881, + 36885, + 36941, + 36918, + 36868, + 36952, + 37012, + 36884, + 36941, + 36998, + 36911, + 36897, + 36962, + 36887, + 36905, + 36930, + 36938, + 36952, + 36920, + 36995, + 36954, + 36960, + 37049, + 36921, + 36941 + ], + "sample_count": 32 + }, + { + "pubkey": "ETidHnHMuKvLPZiKsgkzfVjjD4fxiDH7umSx8VC2bEJY", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 7116, + 7248, + 7248, + 7571, + 7060, + 8625, + 7155, + 7130, + 7616, + 7209, + 7105, + 8916, + 7190, + 7102, + 7079, + 7180, + 7238, + 7944, + 7012, + 7094, + 8390, + 7155, + 7068, + 7114, + 6981, + 7174, + 7196, + 7044, + 7029, + 9184, + 7229, + 7056 + ], + "sample_count": 32 + }, + { + "pubkey": "9vxMr8sKHDPSNnDD61jwLCJXFDyxZEXpqa3j9UM5yEgE", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143443000000, + "samples": [ + 13037, + 13038, + 13081, + 13005, + 13120, + 13061, + 13201, + 13019, + 13065, + 13106, + 13090, + 13090, + 13080, + 13091, + 13122, + 13058, + 13121, + 13047, + 13078, + 13072, + 13016, + 13035, + 13034, + 13019, + 13049, + 13069, + 12986, + 13072, + 13000, + 13141, + 13005, + 13051 + ], + "sample_count": 32 + }, + { + "pubkey": "HHtXxRfZWCtjgn7VhwVaigAeNMuqeBMsjsV7c1XjkyFx", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 266260, + 266383, + 266440, + 266440, + 266201, + 266201, + 266257, + 266177, + 266333, + 266324, + 266352, + 266289, + 266200, + 266253, + 266089, + 266214, + 266238, + 266244, + 266246, + 266098, + 266098, + 266407, + 266407, + 266210, + 266438, + 266186, + 266094, + 266184, + 266211, + 266171, + 266171, + 266287 + ], + "sample_count": 32 + }, + { + "pubkey": "CJRdmNJmNqhBQzxj1ehgLu5P2F9dAP4XRrs3W2QXEEfE", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143441000000, + "samples": [ + 234005, + 234166, + 234214, + 234026, + 234106, + 234072, + 234169, + 226555, + 226589, + 227594, + 234077, + 234059, + 234122, + 234144, + 234040, + 234211, + 234208, + 226582, + 226514, + 226530, + 226532, + 226630, + 226559, + 226589, + 226529, + 226552, + 226615, + 226561, + 226554, + 226957, + 226515, + 226571 + ], + "sample_count": 32 + }, + { + "pubkey": "6vwy7CEJsvp8VBiJ4ZUQgcANVJT1DBh22k2JK7U3MS4G", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 111366, + 111606, + 111276, + 111226, + 111432, + 111256, + 111299, + 111297, + 111347, + 111320, + 111295, + 111258, + 111304, + 111360, + 111409, + 111259, + 111252, + 111217, + 111269, + 111244, + 111265, + 111227, + 111235, + 111236, + 111330, + 111235, + 111246, + 111348, + 111395, + 111380, + 111269, + 111267 + ], + "sample_count": 32 + }, + { + "pubkey": "DX6DBFq7pUcP4TWVMgXf6Xoj68sYmwsdJXTB5NXBGzZq", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143443000000, + "samples": [ + 113726, + 114287, + 113069, + 112956, + 112942, + 112917, + 114410, + 114322, + 114360, + 114261, + 114315, + 114469, + 114342, + 112989, + 112983, + 114421, + 114430, + 114446, + 113768, + 113710, + 114435, + 114406, + 114424, + 114391, + 114376, + 114393, + 114329, + 113709, + 113751, + 113899, + 113853, + 113777 + ], + "sample_count": 32 + }, + { + "pubkey": "DRGWzczGyBk6GDRULhy5owbNymWmkBURJpnXv9VbzXoa", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 149029, + 148893, + 148904, + 148904, + 148950, + 148950, + 148882, + 148912, + 148876, + 148827, + 148827, + 148858, + 149041, + 150665, + 148957, + 149033, + 148958, + 148963, + 148958, + 150861, + 149062, + 149100, + 148839, + 148912, + 148845, + 149704, + 148884, + 148947, + 148988, + 149031, + 148866, + 149343 + ], + "sample_count": 32 + }, + { + "pubkey": "3m3HnbaGERPdrhhn1oUMFqdgAC7yPni9GHU26jCjPknj", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143445000000, + "samples": [ + 156104, + 156358, + 156168, + 156116, + 156180, + 156260, + 156368, + 156196, + 156214, + 156279, + 156214, + 156247, + 156177, + 156167, + 156128, + 156358, + 156412, + 156178, + 156253, + 156212, + 156168, + 156136, + 156167, + 156158, + 156441, + 156349, + 156395, + 233915, + 207130, + 156163, + 156173, + 287559 + ], + "sample_count": 32 + }, + { + "pubkey": "BHiAuRAFioqMJ6sYY6vXJTTkGhEvg16tUFo4hX7B1d9q", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 19554, + 19368, + 21396, + 21312, + 21419, + 21288, + 21322, + 21335, + 19315, + 19443, + 19367, + 21314, + 21380, + 21310, + 21469, + 21283, + 21454, + 21257, + 21657, + 21430, + 21288, + 21288, + 21194, + 21572, + 21601, + 22213, + 21700, + 21708, + 21346, + 21302, + 21302, + 21439 + ], + "sample_count": 32 + }, + { + "pubkey": "E2KnjJRr4N31aQZ7a96xUdybxE71NNwZrAQj1Q7oKuSP", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143445000000, + "samples": [ + 18751, + 18979, + 18960, + 18847, + 19011, + 19004, + 19063, + 18983, + 19003, + 18846, + 18997, + 18923, + 19035, + 18941, + 18982, + 19052, + 18840, + 18753, + 18760, + 18819, + 18894, + 19016, + 19004, + 19003, + 18844, + 18815, + 18902, + 19014, + 18786, + 18802, + 18941, + 19021 + ], + "sample_count": 32 + }, + { + "pubkey": "4b83SvCYGo5m9mYYdaGVvFfnayuQ3tSSdiANjHD3FV7h", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 99134, + 99243, + 99088, + 99249, + 99121, + 99106, + 99111, + 99026, + 99268, + 99209, + 99090, + 99047, + 99047, + 99323, + 99146, + 99099, + 99019, + 99141, + 99165, + 99301, + 99159, + 99144, + 99084, + 99157, + 99132, + 99368, + 99087, + 99368, + 99043, + 99558, + 99150, + 99417 + ], + "sample_count": 32 + }, + { + "pubkey": "BiZL8WQACmQGVfZCdm2BSndj7KjdSsWQ2bmrWaZJ9Lvw", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143446000000, + "samples": [ + 93817, + 93852, + 93871, + 93876, + 93820, + 93792, + 93916, + 93811, + 93863, + 93852, + 93825, + 93874, + 93895, + 93796, + 93801, + 93834, + 93949, + 93845, + 93854, + 93935, + 93817, + 93924, + 93883, + 93875, + 93908, + 93866, + 93886, + 93805, + 93908, + 93948, + 93889, + 93954 + ], + "sample_count": 32 + }, + { + "pubkey": "9CzBGEGXbFQQJPL5Aesqg6RbomkSsYNzw8HfdEghruvX", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 197545, + 197675, + 197641, + 197502, + 197384, + 197534, + 197621, + 197981, + 197454, + 197536, + 197983, + 197983, + 197283, + 197470, + 197555, + 197213, + 206311, + 197395, + 197520, + 199140, + 197598, + 197522, + 197522, + 197904, + 197540, + 197575, + 197639, + 197632, + 197240, + 197602, + 197589, + 197373 + ], + "sample_count": 32 + }, + { + "pubkey": "8RfVW39DbRktiundkgJepx6EZUVreGfbD8vreid6Bsdr", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143446000000, + "samples": [ + 198284, + 198230, + 198207, + 198319, + 198269, + 198289, + 198334, + 198230, + 198351, + 198195, + 198219, + 198314, + 198197, + 198269, + 198185, + 198273, + 198300, + 198246, + 198231, + 198210, + 198262, + 198330, + 198242, + 198250, + 198226, + 198260, + 198284, + 198177, + 198203, + 198248, + 198185, + 198373 + ], + "sample_count": 32 + }, + { + "pubkey": "DtQqZNHkT2mXQYoEgf9G29rmv8BB3yxzpjSAryV3PvpL", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 148868, + 148654, + 149073, + 148669, + 148770, + 149392, + 148964, + 148656, + 148819, + 148984, + 152780, + 149189, + 148819, + 148694, + 149805, + 148826, + 149125, + 148904, + 148687, + 148685, + 149049, + 148625, + 148958, + 149159, + 149187, + 148701, + 148833, + 149592, + 148799, + 148901, + 149548, + 149645 + ], + "sample_count": 32 + }, + { + "pubkey": "7F23Ku1bQVaJRRM4guML8mokEWufoMPX1VUT2XZMLzTi", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143445000000, + "samples": [ + 156119, + 156188, + 156131, + 156122, + 156150, + 156108, + 156148, + 156178, + 156170, + 156141, + 156084, + 156171, + 156094, + 156115, + 156117, + 156155, + 156132, + 156190, + 156122, + 156147, + 156101, + 156137, + 156190, + 156104, + 156102, + 156125, + 156164, + 156107, + 156108, + 156168, + 156093, + 156114 + ], + "sample_count": 32 + }, + { + "pubkey": "C8YCayA94qnMNyDzXsYkGYGTHu9kSUxm8swstRvNWoCt", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 91512, + 91714, + 91519, + 91661, + 91577, + 91549, + 91494, + 91662, + 91550, + 91705, + 91500, + 91580, + 91418, + 91418, + 91430, + 91681, + 91553, + 91570, + 91521, + 91503, + 91686, + 91678, + 91394, + 91624, + 91511, + 91511, + 91653, + 91486, + 91703, + 91629, + 91645, + 91547 + ], + "sample_count": 32 + }, + { + "pubkey": "4ma5e84rdv2ic5oL3BwXGCih2x9ZqwXULCBNP2iJdihn", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143448000000, + "samples": [ + 88929, + 88897, + 88912, + 88889, + 88841, + 88895, + 88969, + 88855, + 88940, + 88906, + 88942, + 88984, + 88904, + 88937, + 88926, + 88927, + 88934, + 88941, + 88951, + 88932, + 88909, + 88967, + 88907, + 88928, + 88910, + 88877, + 88965, + 88953, + 88931, + 88930, + 88927, + 89006 + ], + "sample_count": 32 + }, + { + "pubkey": "4eUNaeMuX3GkUXqrCDGc1V6gYpS9BFvMquCiny7KaejT", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 142539, + 142401, + 142356, + 142304, + 142391, + 142312, + 142480, + 142468, + 142432, + 142432, + 142381, + 142400, + 142357, + 142300, + 142365, + 142110, + 142389, + 142262, + 142593, + 142238, + 142350, + 142305, + 142456, + 142336, + 142378, + 142380, + 142446, + 142446, + 142928, + 142264, + 142414, + 142322 + ], + "sample_count": 32 + }, + { + "pubkey": "R7dZAzHYLNpwcQeYMThatxwhjjFC9B4KeQj9svDuCP7", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143448000000, + "samples": [ + 153559, + 153574, + 153442, + 153540, + 153401, + 153531, + 153782, + 153504, + 153477, + 153548, + 153432, + 153628, + 153414, + 153436, + 153604, + 153543, + 153577, + 153436, + 153578, + 153629, + 153495, + 153573, + 153466, + 153549, + 153507, + 153513, + 153565, + 153472, + 153496, + 153474, + 153387, + 153600 + ], + "sample_count": 32 + }, + { + "pubkey": "9y1UtyJ4Xk4RgbezcDWwRBMh33QUJe8HD3KYa4fpyzeU", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 150654, + 150619, + 150748, + 150621, + 151069, + 164132, + 150922, + 151046, + 151148, + 150925, + 151127, + 151019, + 151034, + 151001, + 151008, + 150846, + 151020, + 150942, + 150905, + 150855, + 151151, + 150990, + 150882, + 150915, + 151016, + 151470, + 151013, + 151092, + 151088, + 151073, + 150966, + 151015 + ], + "sample_count": 32 + }, + { + "pubkey": "297e4hVb5tpeUqQySmoPcb93NkyvtaWXnkopv4eyurtH", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143449000000, + "samples": [ + 176874, + 177031, + 176868, + 176990, + 176896, + 176906, + 177100, + 176700, + 177014, + 176926, + 177032, + 177132, + 176950, + 176986, + 176874, + 176907, + 177210, + 176854, + 176870, + 177007, + 176887, + 177000, + 176946, + 176955, + 176765, + 176936, + 176976, + 176750, + 177026, + 176905, + 176872, + 177047 + ], + "sample_count": 32 + }, + { + "pubkey": "DQcst5bAnw7ucwYXmgFhn3z6nJzqbrDA4uNR4BS4LEpX", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 88981, + 88983, + 88971, + 88947, + 89059, + 88904, + 88993, + 89028, + 88978, + 88978, + 89085, + 88965, + 88965, + 89035, + 89254, + 89005, + 89005, + 89099, + 89075, + 89139, + 88947, + 88976, + 89006, + 88941, + 88966, + 89713, + 89082, + 88976, + 89078, + 88999, + 89446, + 88966 + ], + "sample_count": 32 + }, + { + "pubkey": "6KxP8Utk3Chg7uwd4mzS4SmQBCNYWdrNLgFdB2baYMpY", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143449000000, + "samples": [ + 83877, + 83935, + 84008, + 83948, + 83896, + 83878, + 83971, + 83915, + 83845, + 83904, + 82971, + 83951, + 83868, + 83930, + 84029, + 84016, + 84066, + 83997, + 83974, + 83993, + 83930, + 83994, + 83890, + 84004, + 84038, + 83954, + 84025, + 83917, + 84019, + 84029, + 84004, + 84044 + ], + "sample_count": 32 + }, + { + "pubkey": "5QWNdVeXzXK2xjE5Ldjbi3zszPhz1MVrnBbQZziXiGiY", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 34281, + 34197, + 34429, + 34160, + 34207, + 34339, + 34472, + 34275, + 34336, + 34296, + 34214, + 34183, + 34433, + 34207, + 34331, + 34340, + 34340, + 34233, + 34429, + 34322, + 34390, + 34284, + 34385, + 34321, + 34179, + 34541, + 34278, + 34345, + 34374, + 34289, + 34361, + 34399 + ], + "sample_count": 32 + }, + { + "pubkey": "2pjsio4uDbzQrqakbpJT4HYJz6HFxQkaatcdqz6VnXVM", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143440000000, + "samples": [ + 28421, + 28411, + 28458, + 28431, + 28437, + 28362, + 28484, + 28394, + 28386, + 28424, + 28442, + 28435, + 28440, + 28431, + 28338, + 28426, + 28426, + 28412, + 28422, + 28417, + 28397, + 28418, + 28440, + 28409, + 28411, + 28445, + 28423, + 28396, + 28448, + 28436, + 28416, + 28443 + ], + "sample_count": 32 + }, + { + "pubkey": "zew5m19HMuzYd62DdmbTzCLKnHENtDcrNH36tgqNW6S", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 18376, + 18217, + 18236, + 18158, + 18255, + 18162, + 18206, + 18151, + 18387, + 18202, + 18375, + 18059, + 18120, + 18287, + 18237, + 18199, + 18455, + 18341, + 18210, + 18715, + 18715, + 18417, + 18035, + 18287, + 18287, + 18197, + 18197, + 18205, + 18271, + 18367, + 18313, + 18124 + ], + "sample_count": 32 + }, + { + "pubkey": "69KTzhqMQrJ6oL4btw8BWCsjEEcPMborc4qaq82c4abG", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143440000000, + "samples": [ + 25204, + 25240, + 25203, + 25200, + 25189, + 25226, + 25235, + 25217, + 25214, + 25186, + 25191, + 25260, + 25137, + 25205, + 25191, + 25227, + 25234, + 25181, + 25167, + 25193, + 25185, + 25215, + 25199, + 25210, + 25201, + 25202, + 25221, + 25187, + 25200, + 25216, + 25196, + 25199 + ], + "sample_count": 32 + }, + { + "pubkey": "yzuThsvxje6MvX4SasugGc7uHZdz3v6h7h8SPaVT7tk", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 9689, + 10059, + 9648, + 9747, + 10094, + 9574, + 9912, + 9706, + 9578, + 9580, + 9550, + 9469, + 9484, + 9492, + 9675, + 9492, + 11409, + 9431, + 9506, + 11273, + 9514, + 9534, + 10029, + 9625, + 10393, + 10041, + 9459, + 9607, + 9765, + 10389, + 10389, + 9540 + ], + "sample_count": 32 + }, + { + "pubkey": "7KoUDjpoCMXDfeqYQT8rk3NmjFAZynmVgAGdLeMXoCL1", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143442000000, + "samples": [ + 6549, + 6590, + 6532, + 6508, + 6584, + 6590, + 6678, + 6547, + 6575, + 6582, + 6551, + 6623, + 6573, + 6556, + 6562, + 6614, + 6592, + 6544, + 6530, + 6555, + 6576, + 6563, + 6524, + 6525, + 6557, + 6602, + 6525, + 6564, + 6572, + 6579, + 6587, + 6509 + ], + "sample_count": 32 + }, + { + "pubkey": "Gek9B8AaM4HEcJZpeh7qu5QaJ7wqvFTFBtHXRWwDiEL7", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 126016, + 125882, + 124412, + 124783, + 125933, + 123259, + 123174, + 124764, + 124764, + 126106, + 126106, + 124779, + 123423, + 123104, + 125888, + 126616, + 124582, + 123253, + 126591, + 123127, + 126048, + 124475, + 123327, + 123203, + 124587, + 124691, + 126040, + 124704, + 126071, + 124405, + 123191, + 124608 + ], + "sample_count": 32 + }, + { + "pubkey": "9x3M4BPVvW3rQbZaFKoDFabVvkeNQc778A6tyQXBZUrC", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143444000000, + "samples": [ + 136076, + 135903, + 135840, + 136189, + 135946, + 135840, + 135947, + 135960, + 135884, + 135860, + 135980, + 135965, + 135934, + 136024, + 135902, + 136073, + 135944, + 135901, + 135959, + 135859, + 135817, + 136025, + 135916, + 135894, + 136040, + 135852, + 135940, + 135855, + 135836, + 135916, + 135900, + 136052 + ], + "sample_count": 32 + }, + { + "pubkey": "CQTtGXb92Ladf3Ao35ZJ1jctbxz8ZhtJ6RueV5hAHGZV", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 148815, + 149117, + 148933, + 148872, + 148842, + 149120, + 148891, + 149529, + 148813, + 148734, + 148867, + 148560, + 148771, + 148957, + 149016, + 148605, + 149050, + 148766, + 148728, + 148786, + 148584, + 148950, + 148918, + 148899, + 148721, + 148986, + 148741, + 148693, + 148986, + 148807, + 148757, + 148580 + ], + "sample_count": 32 + }, + { + "pubkey": "GngrQUSfuBQQUYPvXL5xuR1vbzFAUKeNm3dtaj5XAtLv", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143441000000, + "samples": [ + 152026, + 152051, + 152010, + 151981, + 151994, + 152059, + 152290, + 152040, + 151962, + 152008, + 152038, + 152068, + 152064, + 151999, + 152053, + 152026, + 152215, + 152097, + 152124, + 152041, + 152056, + 152136, + 152118, + 152129, + 152024, + 152120, + 151997, + 152046, + 152070, + 152219, + 152108, + 152206 + ], + "sample_count": 32 + }, + { + "pubkey": "6n1uw87Hv1DqqMG7B9Nrco8znfjHisZCZwTLYgemWUxq", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 19524, + 19524, + 19305, + 19624, + 19496, + 19539, + 19551, + 19540, + 19540, + 19773, + 19381, + 19270, + 19458, + 19629, + 19566, + 19374, + 19470, + 19391, + 21823, + 19393, + 19613, + 20234, + 19600, + 19581, + 19348, + 19551, + 19622, + 19464, + 19786, + 19405, + 19452, + 19452 + ], + "sample_count": 32 + }, + { + "pubkey": "DmVaMH78Q1Wgsd37G7ffxT4w4b2NcofxAzWM3YDLHcS1", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143443000000, + "samples": [ + 37918, + 38047, + 38000, + 37845, + 37932, + 38015, + 38110, + 37955, + 37974, + 38041, + 37946, + 37895, + 37930, + 38022, + 37981, + 38047, + 38056, + 38026, + 37939, + 37926, + 38027, + 37930, + 38012, + 38017, + 37962, + 37990, + 38031, + 37974, + 37929, + 37998, + 38019, + 37904 + ], + "sample_count": 32 + }, + { + "pubkey": "2xV8DYMm3CZWDRnL7LhmqCxGsSDC2YCy71Yw7FBXVwwP", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 14663, + 14762, + 14641, + 14607, + 15004, + 14769, + 14678, + 14731, + 14780, + 14580, + 14580, + 14668, + 14768, + 14622, + 14715, + 14686, + 14633, + 15161, + 14572, + 14653, + 14762, + 14762, + 14745, + 14827, + 14850, + 14757, + 14786, + 14786, + 14655, + 14654, + 14635, + 14937 + ], + "sample_count": 32 + }, + { + "pubkey": "J4hVU6jAWCQbNXFphHatzYanzoxBAXYfbqXyMCE7vLng", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143440000000, + "samples": [ + 14034, + 13921, + 13896, + 13851, + 13956, + 13950, + 13937, + 13913, + 13836, + 14037, + 13994, + 13897, + 13918, + 14018, + 14024, + 13942, + 13907, + 13851, + 13971, + 13975, + 14083, + 14004, + 14011, + 13979, + 13963, + 13980, + 13904, + 13940, + 13982, + 13971, + 13985, + 14080 + ], + "sample_count": 32 + }, + { + "pubkey": "5u15H9eeprUBG7bHCgUia1LVdC6ZUFATdc9P48t4WPRy", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 26321, + 28445, + 26230, + 26507, + 28128, + 28128, + 26535, + 26362, + 26362, + 26744, + 26237, + 26455, + 26534, + 26421, + 26375, + 28487, + 28487, + 26467, + 26293, + 30491, + 26638, + 26506, + 26241, + 26296, + 26280, + 26419, + 26306, + 26467, + 26263, + 26363, + 26282, + 26961 + ], + "sample_count": 32 + }, + { + "pubkey": "HaNeVbLFVJKjVJiFSUfFRyLvU5iDDs6L6FvLeFhFeotT", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143444000000, + "samples": [ + 29730, + 26376, + 26373, + 26317, + 26312, + 26342, + 26412, + 26370, + 26352, + 26342, + 26371, + 26418, + 26334, + 26382, + 26395, + 26378, + 26429, + 26387, + 26349, + 26337, + 26369, + 26334, + 26379, + 26421, + 26337, + 26361, + 26403, + 26363, + 26374, + 26384, + 26378, + 26425 + ], + "sample_count": 32 + }, + { + "pubkey": "5DEvcZFAjMo6wskbg76TqYj2qfRjCGX41xCLrpHecKX9", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 139203, + 146179, + 136090, + 135955, + 135976, + 136048, + 136655, + 144310, + 136840, + 135637, + 147230, + 135959, + 135959, + 136418, + 136418, + 148962, + 136433, + 137223, + 141115, + 141115, + 136650, + 137666, + 149936, + 136677, + 137126, + 136571, + 137024, + 137024, + 136898, + 147932, + 137065, + 137508 + ], + "sample_count": 32 + }, + { + "pubkey": "BGWyTatxiHfWrBGCCU43jTB4M64HLtkJkT5oimBAZxFQ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143547000000, + "samples": [ + 134857, + 134898, + 134854, + 134898, + 134866, + 134865, + 134859, + 134840, + 134843, + 134846, + 134839, + 134858, + 134840, + 134839, + 134860, + 134871, + 134863, + 134849, + 134862, + 134816, + 134848, + 134838, + 134837, + 134865, + 134817, + 134889, + 134819, + 134835, + 134838, + 134820, + 134838, + 134809 + ], + "sample_count": 32 + }, + { + "pubkey": "9sEF7BJCagxk8b1ruDjpBfVVbnUUVy5dgNyZFJmNHrBx", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 194721, + 194408, + 194754, + 194400, + 194832, + 194492, + 194783, + 194780, + 194815, + 194495, + 194450, + 194774, + 194710, + 194629, + 194557, + 194557, + 194743, + 194733, + 194788, + 194806, + 195014, + 194784, + 194435, + 194435, + 194828, + 194868, + 194781, + 194703, + 194790, + 194632, + 194887, + 194586 + ], + "sample_count": 32 + }, + { + "pubkey": "AnqULJcmppxnpq9EYm3hZXyuVxxSTB9A3CCrP5CCjehc", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143546000000, + "samples": [ + 214598, + 214662, + 214619, + 214583, + 214668, + 214602, + 214631, + 214599, + 214665, + 214585, + 214597, + 214649, + 214632, + 214576, + 214601, + 214624, + 214603, + 214605, + 214585, + 214596, + 214623, + 214609, + 214524, + 214640, + 214628, + 214609, + 214655, + 214575, + 214593, + 214624, + 214614, + 214632 + ], + "sample_count": 32 + }, + { + "pubkey": "8mY8tP24Y9eRMBZtc4U9XmqXXhQHxHPunG2p4U5T5TA2", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 223708, + 223096, + 218404, + 218355, + 223245, + 223245, + 223140, + 223600, + 223573, + 219693, + 222939, + 223837, + 218684, + 218727, + 220477, + 220234, + 218441, + 223467, + 223729, + 223729, + 223762, + 223762, + 222782, + 223676, + 223433, + 245603, + 223727, + 223672, + 218809, + 218773, + 218773, + 223444 + ], + "sample_count": 32 + }, + { + "pubkey": "DeNs7snLDAxRsrHEFFLGuCP4ckZwAfjkweUuqzHY6qU7", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143544000000, + "samples": [ + 223646, + 223673, + 223631, + 223636, + 223645, + 223684, + 223653, + 223692, + 223709, + 223681, + 223648, + 223632, + 223638, + 223677, + 223672, + 223675, + 223697, + 223655, + 223656, + 223640, + 223623, + 223663, + 223680, + 223665, + 223642, + 223656, + 223676, + 223667, + 223647, + 223619, + 223639, + 223645 + ], + "sample_count": 32 + }, + { + "pubkey": "6UdAPvTCsmwD7KkE9PTqSKS5UN8VNnnaZFuYWF1t7oTW", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 294025, + 294025, + 294265, + 293846, + 293846, + 293942, + 293747, + 293956, + 293759, + 294079, + 294079, + 294122, + 293960, + 294414, + 294179, + 294050, + 294050, + 294334, + 294085, + 293733, + 293779, + 294224, + 294043, + 293786, + 294307, + 293747, + 294252, + 294252, + 294100, + 294100, + 293985, + 294514 + ], + "sample_count": 32 + }, + { + "pubkey": "9rGQxkpZcatWqyZ2WXG44tTTDuY1Qr4T91s3foJRDWnz", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143543000000, + "samples": [ + 272566, + 272422, + 272492, + 272511, + 272444, + 272512, + 272486, + 272503, + 272396, + 272445, + 272520, + 272473, + 272518, + 272467, + 272495, + 272477, + 272522, + 272465, + 272392, + 272499, + 272465, + 272431, + 272484, + 272445, + 272461, + 272414, + 272514, + 272516, + 272450, + 272415, + 272495, + 272385 + ], + "sample_count": 32 + }, + { + "pubkey": "6B6rd9CocEBZrZr1idUCPaMtpvTXTAm2ueGYxih4qTDW", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 220814, + 222094, + 222212, + 222018, + 220975, + 221292, + 221610, + 222374, + 221840, + 221348, + 221437, + 221459, + 306872, + 222348, + 222237, + 221653, + 222429, + 222429, + 221604, + 221586, + 220816, + 221708, + 222015, + 222026, + 221314, + 222422, + 222459, + 222726, + 221861, + 222028, + 220887, + 220489 + ], + "sample_count": 32 + }, + { + "pubkey": "6TMbUkTgR5cmE7rvQqq6XiZfmvzWKSin57eoRz1QVJME", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143545000000, + "samples": [ + 240164, + 240208, + 240172, + 240166, + 240098, + 240121, + 240024, + 239971, + 239903, + 240118, + 239956, + 239951, + 240145, + 239982, + 240143, + 239933, + 240204, + 240142, + 239892, + 240092, + 240000, + 240152, + 239863, + 240016, + 240092, + 239974, + 240026, + 240081, + 240059, + 239905, + 240166, + 240084 + ], + "sample_count": 32 + }, + { + "pubkey": "Bg9Vy1dpUyxc78f3zdN2yNkfhjWf4XbsAQTmHXApRxtb", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 140371, + 141646, + 140614, + 140269, + 140468, + 140382, + 140605, + 140435, + 140600, + 140539, + 140539, + 140814, + 140527, + 140468, + 140468, + 140262, + 140262, + 140748, + 140455, + 140836, + 140712, + 140677, + 141524, + 141524, + 140611, + 140770, + 140786, + 140786, + 140656, + 140545, + 140718, + 140818 + ], + "sample_count": 32 + }, + { + "pubkey": "BbketMaPF85wzen6auyrV88mRAAaM5uhRKUNz3ZN9QUt", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143546000000, + "samples": [ + 134721, + 134734, + 134710, + 134742, + 134713, + 134781, + 134760, + 134756, + 134772, + 134738, + 134675, + 134731, + 134744, + 134693, + 134716, + 134673, + 134728, + 134729, + 134718, + 134714, + 134739, + 134694, + 134688, + 134725, + 134760, + 134742, + 134672, + 134702, + 134682, + 134730, + 134676, + 134696 + ], + "sample_count": 32 + }, + { + "pubkey": "2VYvibJeh7zjgAz1ubYWMxnv4PEwxRY3KwUiAT5CpUQB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 330677, + 331084, + 331084, + 330488, + 330653, + 330895, + 330629, + 330741, + 330760, + 330741, + 330741, + 330562, + 331436, + 330482, + 330758, + 330567, + 330935, + 330408, + 330408, + 330784, + 330299, + 331494, + 330959, + 330867, + 330867, + 330718, + 330995, + 331240, + 331155, + 331155, + 330779, + 330790 + ], + "sample_count": 32 + }, + { + "pubkey": "BC6ejCrz5zAyo9c4eXDUZmnymZ785HKfVboXXVf2NTXu", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143545000000, + "samples": [ + 322053, + 322062, + 322031, + 322067, + 322051, + 322000, + 322013, + 322062, + 322053, + 322033, + 322011, + 322069, + 322029, + 322005, + 322021, + 322036, + 321992, + 322054, + 321964, + 322051, + 322025, + 322002, + 322065, + 322112, + 322030, + 321985, + 322008, + 322028, + 321950, + 322003, + 322002, + 321930 + ], + "sample_count": 32 + }, + { + "pubkey": "13a2ZMmcuB14EvQ1GxDnEqqgKYWBBhcYJg5cCcx4kTA8", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 125900, + 125833, + 125851, + 125935, + 126049, + 125725, + 125819, + 127445, + 125929, + 125895, + 126050, + 126050, + 125896, + 163730, + 126037, + 125635, + 125671, + 125977, + 125571, + 125936, + 125994, + 125702, + 125985, + 125985, + 125702, + 125838, + 125981, + 125902, + 125889, + 126155, + 126113, + 125917 + ], + "sample_count": 32 + }, + { + "pubkey": "2ebif7FUziq2crDPMAepoAovCk5ypAampksVk6b123ot", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143547000000, + "samples": [ + 114461, + 114438, + 114425, + 114444, + 114433, + 114474, + 114428, + 114511, + 114452, + 114460, + 114456, + 114497, + 114428, + 114383, + 114454, + 114495, + 114502, + 114458, + 114438, + 114420, + 114444, + 114457, + 114474, + 114476, + 114511, + 114526, + 114500, + 114461, + 114492, + 114482, + 114478, + 114394 + ], + "sample_count": 32 + }, + { + "pubkey": "12eVqfeoN5GcAxRXwqFNFwqjqH3wYj4fwueEsaFamwAG", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 186402, + 186067, + 186052, + 186052, + 186285, + 184326, + 186234, + 186205, + 186422, + 186422, + 186400, + 186100, + 186243, + 186405, + 186604, + 186245, + 193139, + 186052, + 186046, + 186095, + 186095, + 184027, + 186552, + 186339, + 186533, + 186056, + 186523, + 186628, + 184376, + 184376, + 183736, + 184248 + ], + "sample_count": 32 + }, + { + "pubkey": "D1BZ5NWZJE8oFTkzYfXjmFdwwJHqSKawnsC8sQnjGWTk", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143547000000, + "samples": [ + 183147, + 183142, + 183149, + 183148, + 183160, + 183138, + 183374, + 183150, + 183124, + 190744, + 183095, + 183132, + 183137, + 183116, + 183127, + 183159, + 183192, + 183096, + 183158, + 183109, + 183159, + 183168, + 183144, + 183150, + 183122, + 183117, + 183142, + 183114, + 183166, + 183146, + 183112, + 183119 + ], + "sample_count": 32 + }, + { + "pubkey": "AtTmfMSoD3TZKu2k3YYGGXf3FT9BBd25PiPRQPdcj1za", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 158492, + 159181, + 160187, + 158413, + 158821, + 158891, + 158820, + 158820, + 159021, + 159144, + 159144, + 159241, + 159035, + 159100, + 159100, + 158810, + 158960, + 158802, + 156900, + 158983, + 158999, + 158851, + 159230, + 158886, + 158718, + 158652, + 158837, + 158840, + 158914, + 159163, + 173597, + 159652 + ], + "sample_count": 32 + }, + { + "pubkey": "4KVcMV2PcF7J3rN9BWpfBJbk4qrpRjCoooMwpfw8uy4Y", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143544000000, + "samples": [ + 158734, + 158627, + 158769, + 158771, + 158945, + 158646, + 158729, + 158647, + 158763, + 158696, + 158687, + 158739, + 158788, + 158762, + 158625, + 158613, + 158761, + 158698, + 158699, + 158672, + 158723, + 158751, + 158747, + 158680, + 158905, + 158269, + 157864, + 157873, + 157799, + 157771, + 157836, + 157870 + ], + "sample_count": 32 + }, + { + "pubkey": "Fx9yq8j3UqH2B45k7fXLyQh9C4q1XfmRx23L498YpvtU", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 178320, + 179135, + 176397, + 180165, + 180165, + 190570, + 180722, + 186641, + 178062, + 184225, + 179085, + 186787, + 185819, + 186931, + 186885, + 184502, + 184962, + 184646, + 184570, + 178428, + 178428, + 180790, + 178656, + 180695, + 178421, + 184450, + 180914, + 181006, + 178347, + 186460, + 183942, + 184390 + ], + "sample_count": 32 + }, + { + "pubkey": "BtBL2oeWLFEXxKQSGpyPhj7yLhH91fUYCTp11gWZ5ftQ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143543000000, + "samples": [ + 185320, + 185279, + 187583, + 187575, + 187368, + 187276, + 187359, + 187308, + 187571, + 187377, + 187483, + 187374, + 187605, + 187613, + 187606, + 187436, + 187549, + 185191, + 187556, + 187562, + 187577, + 187630, + 187537, + 187448, + 187559, + 187534, + 187424, + 187251, + 187571, + 187491, + 187524, + 187535 + ], + "sample_count": 32 + }, + { + "pubkey": "2aB4AJqavQG2CB3HgJzHbodQvLh5j9UoeesuMf7kYDi5", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 230728, + 230779, + 230453, + 230558, + 231005, + 230716, + 230553, + 230915, + 230718, + 230718, + 251230, + 231516, + 230360, + 230452, + 232408, + 230530, + 228541, + 230797, + 230574, + 230611, + 230267, + 230394, + 230111, + 230298, + 231123, + 230438, + 230438, + 230296, + 230296, + 230470, + 230610, + 230707 + ], + "sample_count": 32 + }, + { + "pubkey": "3GFXcF5uu4kJXBPc5GayxeqSW2u6iDvgmAeAMFuGLZ4m", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143544000000, + "samples": [ + 216849, + 216847, + 216871, + 216854, + 216626, + 216828, + 216865, + 216874, + 216864, + 216859, + 216881, + 216878, + 216853, + 216903, + 216844, + 216887, + 216887, + 225254, + 225265, + 216822, + 216804, + 216883, + 216831, + 216878, + 216861, + 216862, + 216863, + 216858, + 216873, + 216849, + 216840, + 216835 + ], + "sample_count": 32 + }, + { + "pubkey": "EBX3H79RWwPcdRjcnD1GW97NxoKm1DD65RrmtNJowsyc", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 252966, + 266233, + 266233, + 252959, + 253093, + 253093, + 256868, + 252955, + 252991, + 269424, + 253161, + 253380, + 258376, + 252918, + 252883, + 271469, + 271469, + 253012, + 253150, + 258546, + 254031, + 252983, + 265372, + 253872, + 253110, + 253110, + 264594, + 252890, + 253081, + 262872, + 253144, + 253316 + ], + "sample_count": 32 + }, + { + "pubkey": "2wv9GnqW66HfVXsgW8LsUkdCfXgT3f9pWBKJTNCvp91n", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143530000000, + "samples": [ + 229576, + 229691, + 229586, + 229558, + 229566, + 229573, + 229692, + 229568, + 229586, + 229598, + 229586, + 229680, + 229584, + 229597, + 229566, + 229577, + 229702, + 229581, + 229582, + 229576, + 229581, + 229696, + 229580, + 229569, + 229588, + 229572, + 229697, + 229587, + 229565, + 229551, + 229570, + 229672 + ], + "sample_count": 32 + }, + { + "pubkey": "4tQziGzx9qQLiep2j5tgsoMyhBu9FUX3Lky7zeoPXoLW", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 154975, + 154998, + 155126, + 155126, + 154851, + 155030, + 154902, + 154883, + 154977, + 155040, + 155040, + 154926, + 155119, + 154929, + 154914, + 154985, + 154880, + 154905, + 155179, + 154861, + 154945, + 155019, + 154918, + 154918, + 154973, + 154960, + 155079, + 155079, + 154958, + 155041, + 154935, + 154956 + ], + "sample_count": 32 + }, + { + "pubkey": "EhWu36vv9YXJb7McygbNMBR1tJB6xWKPeij5Ed58Vu21", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143530000000, + "samples": [ + 154351, + 154353, + 154317, + 154326, + 154353, + 154312, + 154399, + 154342, + 154344, + 154373, + 154334, + 154372, + 154334, + 154339, + 154343, + 154329, + 154440, + 154257, + 154365, + 154343, + 154292, + 154377, + 154282, + 154311, + 154303, + 154296, + 154424, + 154351, + 154336, + 154305, + 154355, + 154421 + ], + "sample_count": 32 + }, + { + "pubkey": "9o2nBzmEhMDT4yrvhVMEANdYXq6rvuyZAhjvQjicfQP8", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 171928, + 171840, + 171939, + 172082, + 172058, + 171886, + 171821, + 172374, + 172374, + 171902, + 172014, + 172155, + 171830, + 172218, + 172218, + 172990, + 172990, + 172476, + 171997, + 172299, + 172009, + 171896, + 171896, + 172592, + 171907, + 171927, + 172378, + 172135, + 171921, + 172331, + 171853, + 171720 + ], + "sample_count": 32 + }, + { + "pubkey": "Es1BfRkxtPQMP4J4rafsmnRhpeFrVeDyYUKSkEH64yQ9", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143528000000, + "samples": [ + 178845, + 178970, + 178888, + 178893, + 178910, + 178863, + 179004, + 177439, + 177413, + 178912, + 178889, + 178959, + 178898, + 178907, + 178860, + 178888, + 178955, + 177450, + 177455, + 177469, + 177418, + 177526, + 177430, + 177378, + 177467, + 177405, + 177515, + 177427, + 177431, + 177445, + 177430, + 177514 + ], + "sample_count": 32 + }, + { + "pubkey": "4NbBL4tGHCwKBVipm7hDUaTedtwFWzE4559pohddXAgZ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 275107, + 275468, + 275415, + 275254, + 275380, + 275341, + 275140, + 275140, + 275222, + 275518, + 275518, + 275136, + 275729, + 275267, + 275271, + 275147, + 275398, + 275398, + 275203, + 275175, + 275434, + 275127, + 275251, + 275355, + 275216, + 275251, + 275161, + 275371, + 275555, + 275218, + 275280, + 275350 + ], + "sample_count": 32 + }, + { + "pubkey": "G2KQWKaQfBPTiNpRRptPQWZZkL9QyYUMPGP3ij3QrQVw", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143527000000, + "samples": [ + 67641, + 67752, + 67693, + 67692, + 67652, + 67663, + 67682, + 67689, + 67644, + 67622, + 67616, + 67706, + 67618, + 67644, + 67656, + 67694, + 67771, + 67697, + 67680, + 67722, + 67684, + 67732, + 67604, + 67665, + 67672, + 67693, + 67683, + 67717, + 67610, + 67688, + 67687, + 67644 + ], + "sample_count": 32 + }, + { + "pubkey": "4eJMPvk93NyWJKMzxq3ykPzNJbnEGibaa2HdRCJNW9Tx", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143505000000, + "samples": [ + 174586, + 174586, + 174600, + 174734, + 174594, + 174719, + 174737, + 174609, + 174561, + 174561, + 174528, + 175016, + 174783, + 174758, + 174616, + 174563, + 174677, + 174519, + 174581, + 174530, + 174651, + 174585, + 174699, + 174657, + 174646, + 174791, + 174659, + 174605, + 174643, + 174662, + 174781, + 174666 + ], + "sample_count": 32 + }, + { + "pubkey": "ENsy8hRcqWgCAPdNRr3y4ef2KN2VY5KfxMTozkhZu9zG", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143529000000, + "samples": [ + 168973, + 169331, + 169247, + 169089, + 169096, + 168969, + 169219, + 169092, + 169058, + 169246, + 168945, + 169149, + 169229, + 169258, + 169231, + 169040, + 169297, + 169252, + 169038, + 169259, + 168965, + 169291, + 169240, + 169006, + 169031, + 169231, + 169147, + 169230, + 169052, + 169208, + 169058, + 169322 + ], + "sample_count": 32 + }, + { + "pubkey": "CPNpEutsj8gtCSxLomStDEU54RftbJekLK52qPnef1A7", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 239640, + 239397, + 239466, + 239362, + 239486, + 239486, + 239332, + 239355, + 239534, + 239391, + 239349, + 239624, + 239249, + 239385, + 239385, + 239261, + 239437, + 239280, + 239280, + 239686, + 239492, + 239662, + 239288, + 240936, + 239412, + 239417, + 239310, + 239230, + 239230, + 239406, + 239406, + 239428 + ], + "sample_count": 32 + }, + { + "pubkey": "CCshVnxf7jnSoQeDn5ssJTxF2yuzXDnC2RWfKux8BVTF", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143529000000, + "samples": [ + 236480, + 236639, + 236464, + 236485, + 236509, + 236495, + 236661, + 236540, + 236506, + 236533, + 236491, + 236626, + 236502, + 236528, + 236495, + 236478, + 236581, + 236540, + 236504, + 236504, + 236514, + 236619, + 236471, + 236505, + 236532, + 236499, + 236572, + 236474, + 236517, + 236507, + 236541, + 236615 + ], + "sample_count": 32 + }, + { + "pubkey": "94LJnUvcUVRzEuv5bt19FEakMUKgqPzNbPnRFwnHZNZE", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 226377, + 226475, + 226581, + 226373, + 226309, + 226379, + 219234, + 218806, + 218806, + 219203, + 219383, + 219383, + 234018, + 218689, + 218689, + 219994, + 227908, + 227908, + 225372, + 225314, + 225314, + 225565, + 241103, + 241103, + 226229, + 229262, + 221516, + 221536, + 227539, + 226984, + 226872, + 227012 + ], + "sample_count": 32 + }, + { + "pubkey": "FiS5ptn1Pw1QUBFDHQ2nEtYNQf8yh9SytCqq6W9H4FE8", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143530000000, + "samples": [ + 205508, + 205617, + 205504, + 205536, + 205523, + 205549, + 205653, + 205540, + 205543, + 205544, + 205563, + 205649, + 205496, + 205550, + 205550, + 205507, + 205660, + 205479, + 205478, + 205516, + 205538, + 205566, + 205525, + 205519, + 205519, + 205486, + 205609, + 205533, + 205501, + 205525, + 205515, + 205599 + ], + "sample_count": 32 + }, + { + "pubkey": "4STLQ3JuMyeB3wavv1nSY1qboWgy1T2x23pe9peEZh8f", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 184763, + 184703, + 184712, + 185578, + 184932, + 185615, + 184607, + 184698, + 184986, + 185004, + 184712, + 184538, + 184629, + 185355, + 184697, + 185330, + 184641, + 184786, + 184587, + 184714, + 184732, + 184907, + 184661, + 184514, + 184756, + 185573, + 184709, + 184689, + 184959, + 184795, + 184795, + 184649 + ], + "sample_count": 32 + }, + { + "pubkey": "Ds7ethLmQ9qqnrpvhRy8u8ht8m83iVxsN4GxG4fceTdm", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143528000000, + "samples": [ + 172691, + 172827, + 172801, + 172738, + 172818, + 172731, + 172830, + 172731, + 172726, + 172760, + 172808, + 172870, + 172739, + 172774, + 172822, + 172717, + 172938, + 172856, + 172826, + 178415, + 178496, + 178478, + 178476, + 178423, + 178432, + 209344, + 178544, + 178497, + 178473, + 178902, + 178447, + 178701 + ], + "sample_count": 32 + }, + { + "pubkey": "EKrn91FnxHu7tV9Zxmgbjt11S7j5dzRMxE8xb6dzsBmy", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 170145, + 171961, + 171961, + 172213, + 171463, + 172168, + 173233, + 172945, + 172886, + 173064, + 176891, + 182483, + 182069, + 183155, + 172207, + 169969, + 172195, + 172195, + 174168, + 173988, + 172420, + 180014, + 172331, + 176184, + 176184, + 172882, + 173256, + 173082, + 172941, + 172387, + 173143, + 173123 + ], + "sample_count": 32 + }, + { + "pubkey": "7k5tdUoxh8E8wtWUopNNgutGyGKup1zuD9yrUZVftqBd", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143527000000, + "samples": [ + 177512, + 177559, + 177510, + 177549, + 177491, + 177474, + 176171, + 176115, + 176073, + 176144, + 179998, + 176105, + 183191, + 183189, + 183206, + 183184, + 183279, + 183198, + 183040, + 183084, + 183161, + 183218, + 183191, + 183123, + 183159, + 183154, + 187258, + 190335, + 190272, + 187123, + 179961, + 175368 + ], + "sample_count": 32 + }, + { + "pubkey": "337eUs3PmPJ6RQ4XhbJkZrsgZM4VeJnHEo3ianAeYatU", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 178962, + 181051, + 181985, + 179276, + 181903, + 178766, + 178953, + 179388, + 179024, + 200905, + 200905, + 179384, + 179043, + 181679, + 179464, + 179139, + 180039, + 179375, + 178937, + 179024, + 179024, + 179340, + 178948, + 179132, + 178660, + 178837, + 183754, + 179748, + 178786, + 179134, + 179134, + 179000 + ], + "sample_count": 32 + }, + { + "pubkey": "CfZVv17JBBsbjUFu7zCnWLRLhnxrnegHGLgUETH419Cm", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143528000000, + "samples": [ + 179574, + 179651, + 179545, + 178927, + 179578, + 189024, + 189149, + 179895, + 179900, + 179898, + 179949, + 192161, + 192084, + 192172, + 179907, + 184817, + 179967, + 179891, + 188186, + 179897, + 184804, + 179960, + 179890, + 186064, + 189023, + 184786, + 184765, + 184800, + 189017, + 189052, + 184767, + 179377 + ], + "sample_count": 32 + }, + { + "pubkey": "9FW15LWxd9WWRq7qd5wiTRFzvjLGZF5z1wDy3UgV4hhU", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 23502, + 32620, + 25345, + 23502, + 23502, + 31795, + 23217, + 23257, + 23257, + 34614, + 34614, + 23762, + 23250, + 23250, + 32151, + 23226, + 24404, + 34723, + 23216, + 25004, + 35819, + 35819, + 23283, + 23332, + 36258, + 36258, + 23738, + 23617, + 23617, + 33524, + 23599, + 23599 + ], + "sample_count": 32 + }, + { + "pubkey": "451udvurYkCYvBCHpvfWxL2VroRdMJRrpSheyhiqwZvo", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143579000000, + "samples": [ + 14489, + 14503, + 14463, + 14504, + 14502, + 14474, + 14457, + 14471, + 14457, + 14468, + 14449, + 14503, + 14489, + 14452, + 14505, + 14450, + 14501, + 14450, + 14439, + 14475, + 14497, + 14470, + 14467, + 14476, + 14480, + 14466, + 14466, + 14458, + 14467, + 14478, + 14409, + 14476 + ], + "sample_count": 32 + }, + { + "pubkey": "7WomDnZZpG45vukgytKMbM14xByW87YEsTbtUMeoXc5H", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143507000000, + "samples": [ + 103519, + 104347, + 104347, + 104424, + 104213, + 103570, + 104782, + 104782, + 104551, + 104551, + 104274, + 103628, + 103628, + 104853, + 151249, + 151249, + 104465, + 104325, + 104325, + 104364, + 104352, + 105086, + 105086, + 104127, + 104127, + 105591, + 104351, + 105214, + 104840, + 105005, + 104405, + 104405 + ], + "sample_count": 32 + }, + { + "pubkey": "GSfNLSMYLSTAZcJif5QLqzAZmcWm2iYmLVfU8aD8gM5A", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143578000000, + "samples": [ + 115427, + 115462, + 115292, + 115431, + 115383, + 115343, + 115238, + 115385, + 115138, + 115077, + 115589, + 115395, + 115391, + 115313, + 115172, + 115613, + 115474, + 115237, + 115561, + 4392440, + 115394, + 115481, + 115291, + 115496, + 115301, + 126815, + 115528, + 5321983, + 253031, + 115191, + 244306, + 115464 + ], + "sample_count": 32 + }, + { + "pubkey": "BNP2NgYpPfRb5A5gpqdp71vvp4nB68QqndzgwWB1G4N7", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143511000000, + "samples": [ + 16642, + 16642, + 16555, + 16555, + 16772, + 16668, + 16600, + 16600, + 18467, + 16687, + 17097, + 16750, + 16634, + 17443, + 16656, + 16656, + 16867, + 16935, + 16935, + 17001, + 16602, + 16602, + 16716, + 16663, + 17160, + 16700, + 16563, + 16563, + 16784, + 16633, + 16633, + 16630 + ], + "sample_count": 32 + }, + { + "pubkey": "FbowwphHWLoNcf6EC8RsnyemQVgHh6kkiTfT4TyeoX6V", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143578000000, + "samples": [ + 19900, + 19919, + 19912, + 19898, + 19878, + 19869, + 19888, + 19883, + 19890, + 19907, + 19886, + 19919, + 19886, + 19925, + 19917, + 19889, + 19913, + 19877, + 19927, + 19892, + 19910, + 19906, + 19873, + 19974, + 19867, + 19916, + 19915, + 19905, + 19934, + 19970, + 19850, + 19887 + ], + "sample_count": 32 + }, + { + "pubkey": "GV33dtWnyS9JarWXQfMALxLFXhZyoJDDsFEvApdjaFGR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143506000000, + "samples": [ + 76870, + 76870, + 92590, + 77921, + 76867, + 76867, + 78878, + 77984, + 77115, + 91764, + 76786, + 77039, + 86766, + 86766, + 77852, + 76759, + 95987, + 76795, + 76795, + 77079, + 77079, + 80817, + 78442, + 76900, + 76900, + 85002, + 77161, + 77161, + 89301, + 76869, + 76957, + 90155 + ], + "sample_count": 32 + }, + { + "pubkey": "f2c7ckSMAuvRec71LZ1msK13FNEKscM8C2ufjVDw47R", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143583000000, + "samples": [ + 65925, + 65938, + 65948, + 65948, + 65935, + 65940, + 65897, + 65945, + 65927, + 65952, + 65920, + 65938, + 65947, + 65934, + 65957, + 65932, + 65934, + 65919, + 65938, + 65922, + 65942, + 65932, + 65906, + 65939, + 65958, + 65931, + 65937, + 65942, + 65943, + 65924, + 65931, + 65887 + ], + "sample_count": 32 + }, + { + "pubkey": "2uyhHmX7H1NZ6X9NxciWfFgWHVCm9ratpC78LLSrhjao", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143505000000, + "samples": [ + 156339, + 156646, + 156646, + 156353, + 156390, + 156434, + 156470, + 156380, + 156333, + 156333, + 156520, + 156520, + 156432, + 156432, + 156463, + 156625, + 156488, + 156432, + 156528, + 156506, + 156604, + 156490, + 156499, + 156499, + 156537, + 156420, + 156398, + 156398, + 156416, + 156396, + 156427, + 156400 + ], + "sample_count": 32 + }, + { + "pubkey": "3MTJHyhqE1DKdPndQSadCYFG7ybd7M63nxySa6tYSJg2", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143583000000, + "samples": [ + 160873, + 160842, + 160877, + 160847, + 160851, + 160862, + 160834, + 160864, + 160868, + 160905, + 160859, + 160868, + 160887, + 160867, + 160891, + 160854, + 160889, + 160842, + 160859, + 160870, + 160875, + 160883, + 160873, + 160873, + 160871, + 160871, + 160890, + 160873, + 160859, + 160862, + 160903, + 160848 + ], + "sample_count": 32 + }, + { + "pubkey": "75sz5qZsfabjV6Stbxu6oehXYZ7Vz7T4vYqJJy5hsrfN", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 150605, + 150716, + 151649, + 151649, + 155646, + 155641, + 150685, + 151667, + 151667, + 155635, + 155570, + 155089, + 150534, + 150534, + 151773, + 205100, + 156148, + 155636, + 155636, + 152371, + 152146, + 152146, + 155604, + 155788, + 152506, + 152071, + 152071, + 155208, + 150766, + 151564, + 155227, + 155318 + ], + "sample_count": 32 + }, + { + "pubkey": "FnEugzsAKfA6s46n7937NQUdJCkBKJjoZ3iwPmxAYkip", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143580000000, + "samples": [ + 167671, + 167701, + 167733, + 167712, + 167727, + 167738, + 167696, + 167675, + 167711, + 167660, + 167738, + 167712, + 167698, + 167702, + 167724, + 167693, + 167722, + 167698, + 167687, + 167704, + 167699, + 167720, + 167723, + 167735, + 167715, + 167687, + 167718, + 167741, + 167701, + 167702, + 167696, + 167713 + ], + "sample_count": 32 + }, + { + "pubkey": "2f3NLuCBfo4wd5DJ3URKFQrsyXwXTpDVrDZtEKUAWJ4z", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 117224, + 117499, + 117403, + 117103, + 117577, + 117357, + 117240, + 117193, + 117193, + 117377, + 117191, + 117556, + 117578, + 117305, + 117439, + 117362, + 117318, + 117214, + 117295, + 117369, + 117369, + 117141, + 117439, + 117477, + 117270, + 117270, + 117413, + 117413, + 117496, + 117656, + 117656, + 117447 + ], + "sample_count": 32 + }, + { + "pubkey": "61c9u1NiFfKzfqmBDNbcfvkwyFpKZjsyHzwPshXdtCou", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143580000000, + "samples": [ + 85564, + 87648, + 85606, + 85547, + 85513, + 85525, + 85454, + 87677, + 87634, + 87738, + 85567, + 85536, + 85512, + 85486, + 87742, + 89266, + 85443, + 87652, + 87705, + 87646, + 89204, + 89251, + 87669, + 85426, + 89300, + 87702, + 87716, + 87764, + 87681, + 85473, + 85455, + 89265 + ], + "sample_count": 32 + }, + { + "pubkey": "HppE4BHndP83Scc5xMTMnuoCdcPiAGLCo2XKZq612v1k", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 162901, + 159460, + 162825, + 162870, + 162872, + 163264, + 159397, + 162889, + 159528, + 159367, + 159367, + 159458, + 159285, + 162840, + 162880, + 162929, + 162894, + 162897, + 162927, + 162927, + 259492, + 162937, + 159530, + 162878, + 159384, + 162798, + 162884, + 163019, + 159583, + 163020, + 162955, + 159515 + ], + "sample_count": 32 + }, + { + "pubkey": "6zuZ1zSNMmwasugq2i5DkCBFnr7Ugy9EMrTZUDZ596J", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143582000000, + "samples": [ + 166197, + 166257, + 166266, + 166255, + 166244, + 166053, + 166040, + 166175, + 166246, + 166049, + 166170, + 166193, + 166248, + 166074, + 166261, + 166325, + 166001, + 166099, + 170903, + 177131, + 166255, + 166317, + 166247, + 166315, + 166121, + 166385, + 166301, + 191877, + 178130, + 167370, + 177423, + 170880 + ], + "sample_count": 32 + }, + { + "pubkey": "ABgYfUfEF2PGhTK4CyQ9fJpV5XJDsjHyCESFeFXu1VtP", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 51148, + 51907, + 50995, + 51036, + 51077, + 51077, + 50936, + 51205, + 51017, + 51087, + 50957, + 50957, + 51485, + 51485, + 51927, + 51119, + 51031, + 51041, + 51041, + 50962, + 51664, + 51664, + 51003, + 51065, + 51324, + 51139, + 51182, + 51710, + 51042, + 51167, + 51045, + 51047 + ], + "sample_count": 32 + }, + { + "pubkey": "GjiZosR6Wb5Dg5E6w4zneqmWSKjAeQ2WoedsKhmvofag", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143582000000, + "samples": [ + 54905, + 54910, + 54943, + 54917, + 54888, + 54888, + 54924, + 54892, + 54913, + 54889, + 54901, + 54907, + 54908, + 54903, + 54871, + 54917, + 54951, + 54911, + 54896, + 54901, + 54872, + 54914, + 54932, + 54921, + 54903, + 54921, + 54917, + 54931, + 54915, + 54915, + 54939, + 54890 + ], + "sample_count": 32 + }, + { + "pubkey": "7gLw1U5dPcWxR1YPsqL3Cgsp4jQcQAYCkbmJWouUnjMh", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 207376, + 193302, + 207504, + 165989, + 201827, + 196629, + 185524, + 207252, + 201696, + 204853, + 211466, + 207436, + 204679, + 195448, + 165873, + 163576, + 166017, + 165770, + 163400, + 166946, + 166946, + 165722, + 165937, + 165768, + 163375, + 170023, + 166423, + 168239, + 163919, + 163695, + 163428, + 166250 + ], + "sample_count": 32 + }, + { + "pubkey": "2M824yMx635SGhrKuV9Na837JF6wTDfLCniDLavVo8VK", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143581000000, + "samples": [ + 148302, + 148286, + 148282, + 148273, + 148269, + 148291, + 148297, + 148288, + 148303, + 148309, + 148282, + 148288, + 148270, + 148269, + 148277, + 148293, + 148251, + 148279, + 148249, + 148281, + 148282, + 148310, + 148268, + 148293, + 148245, + 148300, + 148264, + 148259, + 148270, + 148277, + 148248, + 148265 + ], + "sample_count": 32 + }, + { + "pubkey": "n1HKRSjurxhxuJTjdykPHHAqEVGrnUAxktT86YsEDXK", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 60622, + 60559, + 60376, + 60187, + 60484, + 60286, + 60211, + 60208, + 60381, + 60381, + 60420, + 60437, + 60434, + 60434, + 60099, + 60640, + 60291, + 60256, + 60467, + 60200, + 60200, + 60296, + 60301, + 60222, + 60335, + 60327, + 60076, + 60312, + 60343, + 60391, + 60276, + 60331 + ], + "sample_count": 32 + }, + { + "pubkey": "EoK495zAcZLM3pdq2GybAhke9YLM1Pah5j65JX7PwVKp", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143583000000, + "samples": [ + 57379, + 57360, + 57384, + 57378, + 57354, + 57378, + 57405, + 57410, + 57396, + 57411, + 57393, + 57399, + 57381, + 57407, + 57356, + 57385, + 57364, + 57402, + 57400, + 57360, + 57390, + 57404, + 57399, + 57380, + 57415, + 57351, + 57402, + 57397, + 57381, + 57410, + 57378, + 57366 + ], + "sample_count": 32 + }, + { + "pubkey": "FnGJ44wPEXfTjdBAKmgZWBD9gL36R32kVPHuDvb5HdvB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 18568, + 18399, + 18396, + 18470, + 18472, + 18581, + 18429, + 18370, + 18271, + 18400, + 18483, + 18431, + 18667, + 18616, + 19056, + 18488, + 18502, + 18436, + 18551, + 19559, + 18522, + 18515, + 18794, + 18724, + 18583, + 18583, + 18523, + 18590, + 18582, + 18776, + 18392, + 18392 + ], + "sample_count": 32 + }, + { + "pubkey": "EqzUeXPsqGLCUNXiC44ytk93pawtF6uPyJLhCSkbA3PH", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143581000000, + "samples": [ + 28215, + 28200, + 28163, + 28268, + 28159, + 28187, + 28214, + 28164, + 28215, + 28208, + 28177, + 28172, + 28271, + 28270, + 28099, + 28197, + 28134, + 28181, + 28208, + 28169, + 28178, + 28113, + 28238, + 28136, + 28143, + 28238, + 28206, + 28244, + 28206, + 28265, + 28295, + 28167 + ], + "sample_count": 32 + }, + { + "pubkey": "6RGruC9fbXt9V1YXFZzQv9Cuf6HAh5u7EbmdvAaNNTtU", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 25558, + 25676, + 25791, + 25477, + 32091, + 25590, + 21748, + 32511, + 32511, + 21535, + 21973, + 21616, + 21708, + 21947, + 21898, + 21663, + 21868, + 21838, + 21696, + 21468, + 21516, + 21627, + 21627, + 21618, + 21485, + 21485, + 21776, + 21715, + 21525, + 21525, + 21890, + 21674 + ], + "sample_count": 32 + }, + { + "pubkey": "E1WfGQWNZ4v5LtgULFtYMLm8xpGQKemxLHKkMhNP1AwZ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143579000000, + "samples": [ + 20030, + 20034, + 20082, + 20021, + 20028, + 19977, + 20021, + 20081, + 20136, + 19988, + 20044, + 20036, + 19954, + 20028, + 19969, + 20038, + 20076, + 20015, + 20087, + 20029, + 20088, + 20092, + 20007, + 20071, + 20086, + 20038, + 20052, + 19995, + 20077, + 19946, + 20104, + 20002 + ], + "sample_count": 32 + }, + { + "pubkey": "GNgmbGpSk86EB2W1LxBUPaZZcJPUkMz6jBQ97kAbGsA5", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 158845, + 159163, + 158718, + 158659, + 158907, + 158641, + 158488, + 158578, + 158754, + 158491, + 159074, + 158547, + 158542, + 158542, + 158618, + 158618, + 159127, + 158580, + 160971, + 159477, + 170860, + 161313, + 158377, + 158661, + 161648, + 158526, + 158535, + 160794, + 158545, + 158560, + 158560, + 160384 + ], + "sample_count": 32 + }, + { + "pubkey": "Hrr6VXCYdXLS2Ta6s8rCq6cXnqgoaiaNSVH59PFZfcCM", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143581000000, + "samples": [ + 174496, + 174477, + 174500, + 174477, + 174413, + 174467, + 174470, + 174481, + 174486, + 174467, + 174485, + 174493, + 174506, + 174458, + 174470, + 174498, + 174470, + 174503, + 174492, + 174462, + 174470, + 174471, + 174478, + 174525, + 174506, + 174458, + 174491, + 174488, + 174476, + 174504, + 174463, + 174508 + ], + "sample_count": 32 + }, + { + "pubkey": "n9oguE28T4WvzeLRbRnWYWA1v27QaJ5VH5zn14rfGnt", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 212635, + 223248, + 212668, + 212570, + 215268, + 213717, + 212668, + 220786, + 212639, + 212756, + 223189, + 212770, + 212770, + 212807, + 225290, + 212532, + 220063, + 220079, + 222975, + 212585, + 225446, + 225446, + 213296, + 212734, + 221684, + 212561, + 212663, + 223510, + 213879, + 213259, + 217904, + 212591 + ], + "sample_count": 32 + }, + { + "pubkey": "9pQpUtQMbx1fmjj2Cyw4S3CqDbJjoLfgEfZQgyRKsLgA", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143598000000, + "samples": [ + 199597, + 199690, + 199740, + 199724, + 199729, + 199621, + 199739, + 199719, + 199742, + 199751, + 199706, + 199702, + 199741, + 199626, + 199725, + 199693, + 199596, + 199690, + 199734, + 199628, + 199640, + 199744, + 199693, + 199729, + 199683, + 199727, + 199626, + 199656, + 199694, + 199725, + 199637, + 199728 + ], + "sample_count": 32 + }, + { + "pubkey": "CraFnk9TKNvHUzXYgGj5ZnFiPd7wzMTJzrcKtc8sg35j", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 211665, + 210848, + 210773, + 210717, + 210864, + 223851, + 218568, + 218568, + 211443, + 210790, + 210765, + 211028, + 211017, + 210708, + 210809, + 210718, + 210938, + 210937, + 210727, + 211068, + 210970, + 210761, + 210808, + 211371, + 210856, + 210969, + 210956, + 210990, + 210749, + 210997, + 210908, + 210798 + ], + "sample_count": 32 + }, + { + "pubkey": "7H16Yg4akVfzjr8VjfHob9ZS5KE9snmoq1sgTdRt9tc6", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143598000000, + "samples": [ + 229180, + 229164, + 232175, + 232000, + 232014, + 232003, + 228153, + 228183, + 225339, + 232020, + 225284, + 228043, + 225376, + 232984, + 232935, + 232852, + 228180, + 228129, + 228168, + 228076, + 228113, + 228209, + 230116, + 230063, + 230007, + 230070, + 230124, + 225309, + 225400, + 225295, + 225323, + 225400 + ], + "sample_count": 32 + }, + { + "pubkey": "3qhwWr83ivkA7XGQaw42u6cWH61BFr2GM7dusnxMSYrZ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 170709, + 170734, + 170746, + 170726, + 170726, + 170803, + 176028, + 170769, + 170901, + 170882, + 170850, + 170833, + 170822, + 170801, + 170819, + 170736, + 170787, + 170848, + 170853, + 170701, + 170762, + 170883, + 170856, + 171032, + 170787, + 170766, + 170950, + 170825, + 170824, + 170837, + 177257, + 177175 + ], + "sample_count": 32 + }, + { + "pubkey": "9Qya1R1rPx6xcEDmN6GJ7bDLP96KY3kC8dNhg3MMG9Ec", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143597000000, + "samples": [ + 241808, + 241834, + 241943, + 241865, + 241926, + 241885, + 241931, + 241806, + 241883, + 241858, + 241825, + 241886, + 241849, + 241887, + 241915, + 241814, + 241906, + 241872, + 241893, + 241857, + 241862, + 241890, + 241890, + 241831, + 241733, + 241775, + 241821, + 241848, + 241865, + 241840, + 241794, + 241878 + ], + "sample_count": 32 + }, + { + "pubkey": "39T26qXr8jpjdjTanBuvPukajHiKDQH4H35LcEvrXYw5", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 199370, + 199370, + 199414, + 199436, + 199376, + 199400, + 199364, + 199335, + 199487, + 199575, + 199465, + 199543, + 199384, + 199399, + 199399, + 199391, + 199454, + 199337, + 199418, + 199342, + 199373, + 199381, + 199475, + 199312, + 199943, + 199943, + 199363, + 199340, + 199413, + 199479, + 199361, + 199423 + ], + "sample_count": 32 + }, + { + "pubkey": "3dEoAUhiJRYmvKpAB4HUUKuWRWMzQgYpombofve99V6A", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143592000000, + "samples": [ + 264422, + 264348, + 261499, + 259634, + 259726, + 256656, + 256576, + 256546, + 260004, + 260033, + 260002, + 260033, + 260065, + 259327, + 259346, + 259245, + 261632, + 265041, + 264955, + 259892, + 259995, + 259983, + 259839, + 259899, + 259962, + 259875, + 259964, + 259930, + 258245, + 261887, + 261797, + 261793 + ], + "sample_count": 32 + }, + { + "pubkey": "GMgFGnj3fpnsbHHfHjxBFbth6k1Kacv9tteQzMXggeQw", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 159155, + 159333, + 159942, + 159109, + 159319, + 172831, + 159476, + 161509, + 159503, + 159342, + 159815, + 159753, + 159379, + 160657, + 159581, + 159485, + 159822, + 159349, + 159459, + 160916, + 159524, + 159456, + 159776, + 159564, + 159417, + 159908, + 159636, + 160125, + 160791, + 159336, + 159525, + 159925 + ], + "sample_count": 32 + }, + { + "pubkey": "9N3L79JR2vxR5icQR88m8N2XSmgcuRwiqS3AgvBPFvvn", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143593000000, + "samples": [ + 179896, + 179803, + 179872, + 179854, + 179950, + 179888, + 179881, + 179853, + 179856, + 179832, + 179952, + 179793, + 179902, + 179940, + 179887, + 179808, + 179782, + 179768, + 179805, + 179767, + 179884, + 179854, + 179802, + 179810, + 179913, + 179857, + 179851, + 179789, + 179838, + 179854, + 179854, + 179862 + ], + "sample_count": 32 + }, + { + "pubkey": "3e9KJyW8au6NHpXH67w9JFHNpCNVeydYzbGQVXxPviHe", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 49085, + 49463, + 49216, + 48798, + 53197, + 48893, + 48957, + 49043, + 49026, + 48782, + 48914, + 48914, + 49186, + 49065, + 49125, + 49141, + 49057, + 49006, + 49033, + 49099, + 49322, + 49143, + 48907, + 49042, + 49041, + 48995, + 48995, + 49162, + 49020, + 48981, + 48989, + 49204 + ], + "sample_count": 32 + }, + { + "pubkey": "A3SBwGZQJnd9n2cZknG4JudK2oesd295NXdbpf8m9qaW", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143592000000, + "samples": [ + 52019, + 54742, + 54854, + 54835, + 52136, + 52079, + 52054, + 54891, + 54650, + 54834, + 54811, + 54567, + 54701, + 53654, + 53583, + 51787, + 54631, + 54542, + 54825, + 51965, + 51943, + 51947, + 51990, + 51880, + 51911, + 52030, + 54630, + 53601, + 53587, + 53564, + 54246, + 54041 + ], + "sample_count": 32 + }, + { + "pubkey": "ADrCc82J5uFpMoownTPknA2cfkvkSgMFLgGNzAGPLGC1", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 205036, + 205032, + 205032, + 205020, + 205039, + 205253, + 205050, + 205033, + 205080, + 205064, + 205009, + 205152, + 205064, + 204984, + 205027, + 205111, + 204974, + 205361, + 205076, + 205016, + 205055, + 205083, + 205036, + 205036, + 205123, + 205108, + 205119, + 205172, + 205163, + 205002, + 205050, + 205022 + ], + "sample_count": 32 + }, + { + "pubkey": "6XZJ3s5ED7hBKT7a6JQJcTtyRhpuXpqKJGa3gRSrzd6u", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143594000000, + "samples": [ + 208745, + 208748, + 208717, + 208707, + 208622, + 208625, + 208588, + 208601, + 208704, + 208655, + 208738, + 208622, + 208677, + 208667, + 208613, + 208643, + 208664, + 208654, + 208683, + 208574, + 208634, + 208676, + 208581, + 208604, + 208690, + 208625, + 208651, + 208564, + 208633, + 208669, + 208639, + 208664 + ], + "sample_count": 32 + }, + { + "pubkey": "FE4fpVq8s4yzgRNiguGp6BtAMJFzw8noeoWiKFufCYYn", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 145018, + 145086, + 144988, + 145013, + 145264, + 145068, + 145029, + 145138, + 145066, + 145066, + 145151, + 145172, + 145172, + 145216, + 144999, + 145126, + 145128, + 145117, + 145142, + 145165, + 145046, + 145056, + 145039, + 145167, + 145365, + 145254, + 145095, + 145095, + 145151, + 145088, + 145016, + 145779 + ], + "sample_count": 32 + }, + { + "pubkey": "FCnUxjYjUXVDqR1toT2ZUcvWNcUvrXgkEwTofoDw6uH4", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143595000000, + "samples": [ + 140442, + 140462, + 140487, + 140612, + 140596, + 140502, + 140710, + 140435, + 140504, + 140454, + 140527, + 140581, + 140686, + 140634, + 140710, + 140494, + 140767, + 140407, + 140717, + 140511, + 140518, + 140525, + 140724, + 146990, + 147315, + 147358, + 140784, + 140493, + 140604, + 140504, + 140515, + 140659 + ], + "sample_count": 32 + }, + { + "pubkey": "5DJbDEjuEgXa8AA9LGqcm6CE4V16FBeUbAaeBFkxkyUB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 131101, + 131193, + 131133, + 131152, + 131064, + 131064, + 144596, + 131495, + 131560, + 131318, + 131318, + 131411, + 131579, + 131520, + 131351, + 131291, + 131590, + 131526, + 131402, + 131512, + 131525, + 131525, + 131459, + 131375, + 131450, + 131653, + 131593, + 131439, + 131554, + 131537, + 131537, + 131382 + ], + "sample_count": 32 + }, + { + "pubkey": "CtU7sn8qKEVY3Z5hKWnp3VxmTj7JXwby7hsmuZbFfkaL", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143596000000, + "samples": [ + 205690, + 205694, + 205761, + 205845, + 205851, + 205554, + 205718, + 205925, + 205887, + 205784, + 205797, + 205699, + 205702, + 205802, + 205859, + 205928, + 205837, + 205852, + 205870, + 205841, + 205868, + 205543, + 205914, + 205746, + 205690, + 205778, + 205814, + 205811, + 205747, + 205750, + 205713, + 205818 + ], + "sample_count": 32 + }, + { + "pubkey": "BBULJ2h86Se9wuhgQmJvVdB9nX2EdypAPpp4TaeN9FT", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 198803, + 197228, + 197681, + 199851, + 560098, + 195768, + 195826, + 195848, + 195848, + 199683, + 199455, + 199518, + 197378, + 198010, + 196432, + 197427, + 197340, + 198709, + 192128, + 192128, + 192633, + 195644, + 195578, + 197398, + 194025, + 196378, + 196355, + 196364, + 196448, + 196418, + 198644, + 200041 + ], + "sample_count": 32 + }, + { + "pubkey": "HMEFmhYyFEiFoHBtRPBrjtyvuiKG6VBb34QHTBH7wUAm", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143597000000, + "samples": [ + 192849, + 192872, + 192925, + 192753, + 192867, + 192781, + 192916, + 192795, + 192839, + 192873, + 192753, + 192848, + 192876, + 192918, + 192866, + 192787, + 192890, + 192869, + 192926, + 192892, + 192842, + 192890, + 192916, + 192765, + 192791, + 192828, + 192855, + 192810, + 192831, + 192837, + 192677, + 192894 + ], + "sample_count": 32 + }, + { + "pubkey": "5WSAYNAaUSrEyriEZEaWyiC394a57n2ZmA1sYJA41kvu", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 319438, + 315653, + 315265, + 315278, + 315278, + 315587, + 319323, + 319436, + 340159, + 340301, + 340118, + 340118, + 323676, + 340218, + 319288, + 323590, + 321992, + 325636, + 325392, + 341711, + 319170, + 323756, + 323651, + 319494, + 319954, + 339988, + 319320, + 340295, + 339971, + 323559, + 319585, + 319498 + ], + "sample_count": 32 + }, + { + "pubkey": "59WnHmCZxTGFXiRL4S2LrqrKMjzgkSEXUZ1mGiSdkShx", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143596000000, + "samples": [ + 324383, + 324436, + 324484, + 324376, + 324420, + 324366, + 324389, + 324406, + 324386, + 324383, + 324338, + 324262, + 324390, + 324484, + 324428, + 324360, + 324335, + 324369, + 324326, + 324296, + 324352, + 324339, + 324364, + 330954, + 331008, + 331077, + 324322, + 324343, + 324366, + 324400, + 324230, + 324346 + ], + "sample_count": 32 + }, + { + "pubkey": "HjXBqVCnqgbSV245gC6VNTDPvdhDrML37xYv5T93Mcjc", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 81442, + 83813, + 86097, + 45349, + 45191, + 84546, + 85429, + 85429, + 77377, + 78640, + 86554, + 84197, + 82025, + 82025, + 86317, + 67672, + 44858, + 45095, + 45407, + 45109, + 45006, + 45112, + 44937, + 44755, + 44755, + 45094, + 44950, + 45039, + 45119, + 44900, + 45286, + 45027 + ], + "sample_count": 32 + }, + { + "pubkey": "HLTRDV9N4rgVNvDwG1EPaAiS3s99A3frQ7noS1fSV8y3", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143596000000, + "samples": [ + 30035, + 30106, + 30062, + 30016, + 30005, + 29864, + 30018, + 29949, + 30011, + 30035, + 29865, + 30028, + 29957, + 30039, + 29982, + 29945, + 30025, + 30054, + 30007, + 29965, + 29896, + 30054, + 29898, + 29967, + 29901, + 29956, + 30013, + 29947, + 29942, + 29847, + 30003, + 30001 + ], + "sample_count": 32 + }, + { + "pubkey": "B9srZtfJobsxgKyETUhybEaf6VwZxdr6jWaiY7xoqZrE", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 201967, + 202413, + 198701, + 193807, + 200181, + 196813, + 193673, + 199095, + 196242, + 199312, + 200038, + 195329, + 199028, + 198826, + 196467, + 193713, + 197286, + 196766, + 199343, + 199885, + 193652, + 192379, + 200144, + 195614, + 196453, + 195718, + 198977, + 196839, + 195129, + 198373, + 193699, + 193559 + ], + "sample_count": 32 + }, + { + "pubkey": "9LuVxPdjDjW3C1PG5RNjZCya1Wf8AVu8cF9A8qrE7MiT", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143599000000, + "samples": [ + 190550, + 190599, + 190636, + 190581, + 190603, + 190603, + 190676, + 190528, + 190641, + 190657, + 190621, + 190522, + 190582, + 190643, + 190672, + 190605, + 190591, + 190653, + 190512, + 190520, + 190596, + 190631, + 190619, + 197311, + 197187, + 197211, + 190733, + 190730, + 190697, + 190582, + 190540, + 190620 + ], + "sample_count": 32 + }, + { + "pubkey": "ESoLXSqGKHwLtqEC2CWgVYBtVWfYxccmNSbteaRjCFcD", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 130865, + 137579, + 137480, + 133559, + 468332, + 136301, + 136306, + 136363, + 135498, + 135274, + 135514, + 131745, + 133437, + 129616, + 137464, + 137584, + 134710, + 138238, + 138278, + 133150, + 133116, + 136106, + 131170, + 135542, + 135667, + 135832, + 135832, + 135523, + 135516, + 134722, + 134722, + 138601 + ], + "sample_count": 32 + }, + { + "pubkey": "ARA3WLRVEuCdstwgwmr388f8txKv5uHEHPaRrvCV3TFV", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143599000000, + "samples": [ + 133175, + 133303, + 133287, + 133323, + 133340, + 133265, + 133205, + 133287, + 133230, + 133277, + 133149, + 133266, + 133281, + 133325, + 133285, + 133256, + 133251, + 133287, + 133253, + 133110, + 133240, + 133311, + 133302, + 133247, + 133219, + 133295, + 133340, + 133295, + 133257, + 133240, + 133349, + 133278 + ], + "sample_count": 32 + }, + { + "pubkey": "EbpcwKhF1uEEhw8egfTE1qRidz2NJVJV5JtxDqGq8ARy", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 191800, + 189315, + 189251, + 189189, + 192263, + 189262, + 189269, + 189272, + 189174, + 189113, + 189639, + 189444, + 189176, + 189324, + 189207, + 189153, + 189388, + 189388, + 189205, + 189229, + 189229, + 189395, + 189381, + 189218, + 189147, + 189061, + 189175, + 189429, + 189379, + 189088, + 189163, + 189235 + ], + "sample_count": 32 + }, + { + "pubkey": "8aEzYR8jLnAz3gBAR6ezNPR7TGwRNxtjDDmzLK6Be7SK", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143599000000, + "samples": [ + 217353, + 217316, + 217340, + 217361, + 217295, + 217224, + 217363, + 217317, + 217277, + 217340, + 217352, + 217337, + 217226, + 217277, + 217248, + 217320, + 217299, + 217305, + 217280, + 217123, + 217307, + 217198, + 217336, + 217157, + 217346, + 217286, + 217375, + 217296, + 217339, + 217203, + 217354, + 217350 + ], + "sample_count": 32 + }, + { + "pubkey": "3U6r83pDst2TrdMMqzc5K1YZM4dPkyJW5LQz5J1eM8yQ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 206132, + 206132, + 205319, + 206396, + 209734, + 209734, + 217610, + 209368, + 205241, + 206760, + 206422, + 205107, + 210468, + 205580, + 204440, + 209360, + 219562, + 218579, + 209955, + 202329, + 205495, + 221594, + 205337, + 209127, + 205400, + 218619, + 218763, + 208833, + 195905, + 196028, + 200006, + 204131 + ], + "sample_count": 32 + }, + { + "pubkey": "7JYMP5YPTxR5GmNopqxBp5iJ8LJbWX5gegQvWANfbqAt", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143591000000, + "samples": [ + 194450, + 194494, + 194486, + 194472, + 194497, + 194404, + 194492, + 194484, + 194357, + 194525, + 194516, + 194489, + 194519, + 194487, + 194504, + 194325, + 194571, + 194503, + 194517, + 194618, + 194428, + 194483, + 194468, + 194328, + 194491, + 194466, + 194515, + 194340, + 194501, + 194402, + 194483, + 194500 + ], + "sample_count": 32 + }, + { + "pubkey": "4zVoQr5e1amiUbPtNjjzPRFw72or8JgrJuZq2UucGUZs", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 162000, + 162130, + 162078, + 161970, + 162115, + 161988, + 162095, + 162079, + 162268, + 162010, + 162065, + 162151, + 162029, + 162109, + 161856, + 162142, + 162072, + 162083, + 161983, + 162502, + 162502, + 162010, + 161958, + 162862, + 162033, + 161942, + 162321, + 162100, + 162023, + 162141, + 162110, + 162214 + ], + "sample_count": 32 + }, + { + "pubkey": "7vEsVuDUtT6svsfnF7HmiL8EeBj6szUGS7KXTmhgBYMB", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143591000000, + "samples": [ + 175468, + 186122, + 186091, + 186146, + 173119, + 173201, + 168504, + 168428, + 168491, + 171460, + 171972, + 172000, + 171963, + 171470, + 171512, + 171508, + 171352, + 170691, + 170787, + 176205, + 176327, + 176374, + 176285, + 176661, + 183958, + 168166, + 168056, + 171878, + 171949, + 171470, + 171513, + 171336 + ], + "sample_count": 32 + }, + { + "pubkey": "6JFkhEbvtagjoTUhLRS8pFnpT81whBW8G2xaDLj5xdsa", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 155417, + 155372, + 157858, + 155623, + 156886, + 173743, + 162970, + 159012, + 155635, + 155596, + 155588, + 155767, + 155767, + 155609, + 155546, + 155546, + 155631, + 155397, + 155397, + 157006, + 155573, + 155636, + 156505, + 155890, + 155557, + 156236, + 155560, + 155564, + 155480, + 155731, + 155549, + 155549 + ], + "sample_count": 32 + }, + { + "pubkey": "B5CBi3AvC7mzBycYnAcBx1N1JTPPh62HSv3MZfuokerm", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143593000000, + "samples": [ + 180338, + 180252, + 180269, + 180250, + 180296, + 180330, + 181406, + 181356, + 181447, + 181413, + 184343, + 184495, + 191989, + 181420, + 181361, + 181434, + 181397, + 178560, + 181937, + 181404, + 181358, + 181424, + 180384, + 180203, + 180286, + 177564, + 177635, + 182389, + 184290, + 181453, + 181364, + 181420 + ], + "sample_count": 32 + }, + { + "pubkey": "3hQuV6ffA7HeAZCLA9ZQnLzN1QAwcZaMZAqw85Xm7Vuj", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 214650, + 219514, + 219220, + 212514, + 218034, + 228004, + 219649, + 212079, + 223086, + 219724, + 216906, + 220846, + 215288, + 220812, + 218243, + 212153, + 217373, + 212420, + 217168, + 217168, + 217622, + 210740, + 212785, + 211509, + 219030, + 210958, + 219884, + 212719, + 222330, + 218816, + 212153, + 220842 + ], + "sample_count": 32 + }, + { + "pubkey": "34tqZwTZCkUes8NDMYEJ7n5WzoGvxVhenj2fAxryaV4v", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143595000000, + "samples": [ + 155305, + 155440, + 155500, + 155454, + 155403, + 155457, + 155478, + 155469, + 155442, + 155489, + 155465, + 155509, + 155454, + 155475, + 155499, + 155389, + 155485, + 155395, + 155461, + 155352, + 155475, + 155425, + 155544, + 155414, + 155452, + 155421, + 155446, + 155540, + 155513, + 155397, + 155403, + 155372 + ], + "sample_count": 32 + }, + { + "pubkey": "ARXz22BYXNjsnvz8e7GebAQodaAisCw7EjEYPWh99z5J", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 154155, + 153645, + 153645, + 154326, + 154859, + 153510, + 154260, + 152299, + 151294, + 154300, + 154133, + 154493, + 152876, + 157038, + 156760, + 158281, + 158440, + 156685, + 150777, + 151157, + 152013, + 152663, + 151694, + 150381, + 152403, + 151467, + 151068, + 150272, + 151510, + 151520, + 155218, + 150845 + ], + "sample_count": 32 + }, + { + "pubkey": "Caa88nvCee4u7pTxaLzvbugxsAPDfF8BMxEZ8LFZUSCx", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143592000000, + "samples": [ + 154496, + 154381, + 154440, + 154511, + 154516, + 154434, + 154441, + 154330, + 154378, + 154364, + 154465, + 154417, + 154478, + 154467, + 154366, + 154446, + 154372, + 154526, + 154459, + 154189, + 154406, + 154474, + 154444, + 161050, + 161212, + 161078, + 154427, + 154334, + 154463, + 154427, + 154476, + 154418 + ], + "sample_count": 32 + }, + { + "pubkey": "FpShKaUS6FMbQJTCxtEwPve9HsQre9FWGgYn4EzTpcBa", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 193323, + 193323, + 194307, + 193485, + 193105, + 193203, + 198802, + 193408, + 193496, + 193428, + 193469, + 193469, + 194121, + 193462, + 193462, + 193252, + 195186, + 193450, + 193450, + 193386, + 193881, + 193881, + 193314, + 193511, + 193410, + 193587, + 193385, + 193395, + 193278, + 193278, + 193474, + 193298 + ], + "sample_count": 32 + }, + { + "pubkey": "DCJp3izpFztq1A6fzFjGEkVeonZayeFwCVdRW2TSCk6m", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143594000000, + "samples": [ + 214050, + 213970, + 214060, + 214009, + 214044, + 213963, + 214020, + 213952, + 213828, + 214086, + 213993, + 214004, + 214037, + 213943, + 213914, + 214096, + 214019, + 213951, + 213944, + 213979, + 214027, + 213993, + 213964, + 214063, + 214061, + 213968, + 213963, + 213977, + 213972, + 214021, + 213888, + 213991 + ], + "sample_count": 32 + }, + { + "pubkey": "6hpqquTp9pswAhv1Zywxc2y5LhBQrtEzfLuSLTyuYtYr", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 192215, + 192874, + 192717, + 192717, + 192412, + 192425, + 192312, + 192273, + 192517, + 192275, + 192262, + 192373, + 192288, + 192398, + 192589, + 192589, + 192274, + 192487, + 192470, + 192260, + 192481, + 192502, + 192301, + 192257, + 192354, + 192363, + 192195, + 192354, + 192462, + 192386, + 192658, + 196935 + ], + "sample_count": 32 + }, + { + "pubkey": "LVMxKMKjmM224jHzMug66oXSbocaKjtcPaJE63yAoP9", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143590000000, + "samples": [ + 186520, + 186587, + 186641, + 186618, + 186455, + 186455, + 186427, + 186704, + 186401, + 186570, + 186653, + 186536, + 186682, + 186594, + 186618, + 186667, + 186573, + 186636, + 186615, + 186499, + 186582, + 186471, + 186672, + 186558, + 186690, + 186597, + 186651, + 186510, + 186404, + 186517, + 186639, + 186657 + ], + "sample_count": 32 + }, + { + "pubkey": "CQWeN3kbCnUJgj7fU7LagvCfRYRiiNdsCAEqZDJdLTpi", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 177876, + 179892, + 177877, + 177927, + 178379, + 185848, + 178164, + 178267, + 178128, + 178159, + 178052, + 178209, + 179398, + 178131, + 178474, + 178064, + 178301, + 177964, + 178443, + 180202, + 178033, + 178033, + 178119, + 178119, + 178487, + 178272, + 177873, + 177873, + 181040, + 178578, + 178140, + 179457 + ], + "sample_count": 32 + }, + { + "pubkey": "CE6c5DmRHQkzMyzVKzTXpbJhdfNDpqUJwtc7axKerizY", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143594000000, + "samples": [ + 210426, + 210429, + 210496, + 210439, + 210436, + 210342, + 210364, + 210413, + 210316, + 210377, + 210392, + 210433, + 210358, + 210453, + 210335, + 210356, + 210369, + 210359, + 210431, + 210305, + 210228, + 210411, + 210391, + 210444, + 210450, + 210364, + 210282, + 210381, + 210384, + 210292, + 210247, + 210383 + ], + "sample_count": 32 + }, + { + "pubkey": "Be5JTyqnHTpxFYfpYE3Sv7TaDRgGPnZfda1oxaWFWiNS", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 14274, + 25862, + 15698, + 19786, + 20263, + 20127, + 20141, + 23844, + 14184, + 14461, + 17675, + 17675, + 15662, + 14063, + 31087, + 19804, + 14156, + 28307, + 14040, + 14075, + 31394, + 14781, + 14131, + 30419, + 14008, + 19881, + 24403, + 14202, + 20034, + 22292, + 13883, + 14451 + ], + "sample_count": 32 + }, + { + "pubkey": "AZwRvFs76SQRujzLrwN6voJbc4AiSQMQzBDnQnrLypcC", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143589000000, + "samples": [ + 8688, + 8683, + 8724, + 8717, + 8724, + 8692, + 8725, + 8695, + 8689, + 8705, + 8707, + 8726, + 8676, + 8666, + 8678, + 8706, + 8668, + 8751, + 8690, + 8698, + 8703, + 8648, + 8679, + 8680, + 8695, + 8701, + 8658, + 8686, + 8676, + 8677, + 8680, + 8719 + ], + "sample_count": 32 + }, + { + "pubkey": "Cxaez2TdASfYgwA6dbM5yFgHtC9LHdB4wupU28i6GkSa", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 18623, + 16949, + 18753, + 21558, + 21492, + 18542, + 18603, + 16926, + 16732, + 21422, + 21467, + 21382, + 21347, + 21483, + 21376, + 16876, + 21648, + 21480, + 21475, + 22134, + 16739, + 21530, + 21443, + 21470, + 21959, + 16872, + 21397, + 18614, + 21476, + 21476, + 16885, + 21395 + ], + "sample_count": 32 + }, + { + "pubkey": "EtLPyrzsFst8RsN8LXRWoihqLa3PvNJ1ZFjFLS3rAT2G", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143589000000, + "samples": [ + 10178, + 10119, + 10102, + 10128, + 10154, + 10124, + 10112, + 10084, + 10113, + 10090, + 10116, + 10116, + 10116, + 10101, + 10096, + 10090, + 10117, + 10113, + 10091, + 10111, + 10087, + 10085, + 10143, + 10124, + 10086, + 10096, + 10116, + 10121, + 10122, + 10083, + 10140, + 10130 + ], + "sample_count": 32 + }, + { + "pubkey": "3eTKNEhRRJAqjQYt8wjgWwptLYvvmLxuL9L9gLBMpXJ5", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 81846, + 79485, + 81704, + 84759, + 79547, + 81895, + 81358, + 82020, + 79429, + 81744, + 81961, + 81961, + 79428, + 81467, + 79527, + 79567, + 79613, + 79496, + 81410, + 79377, + 79442, + 81140, + 84716, + 81551, + 79473, + 84830, + 81494, + 79250, + 79513, + 79313, + 79434, + 84762 + ], + "sample_count": 32 + }, + { + "pubkey": "4sttDwD4F6tFyYndyWmdsgDHkQeKV1kKjF1XNcLYYrZk", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143588000000, + "samples": [ + 91593, + 91581, + 91590, + 91555, + 91614, + 91563, + 91566, + 91549, + 91534, + 91539, + 91547, + 91546, + 91607, + 91550, + 91544, + 91571, + 91578, + 91593, + 91503, + 91538, + 91569, + 91587, + 91545, + 91516, + 91611, + 91582, + 91602, + 91576, + 91604, + 91591, + 91550, + 91601 + ], + "sample_count": 32 + }, + { + "pubkey": "Fp1T1myifBA2LmgUKCgVQzVKSyir64uhToXjb1jvdUJY", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 100099, + 100099, + 103117, + 92173, + 92480, + 99982, + 99982, + 100176, + 92377, + 100075, + 92166, + 99242, + 92265, + 92264, + 102663, + 100063, + 100204, + 100214, + 99927, + 92536, + 99290, + 100499, + 92219, + 92138, + 100133, + 102714, + 100184, + 92259, + 100007, + 100093, + 92698, + 100030 + ], + "sample_count": 32 + }, + { + "pubkey": "8Qye6xjan4WY4pX8ZGxwXsEySfu41E1HguPu5Emc8FrE", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143585000000, + "samples": [ + 111342, + 111353, + 111301, + 111301, + 111372, + 111316, + 111345, + 111349, + 111370, + 111347, + 111352, + 111343, + 111387, + 111399, + 111392, + 111385, + 111321, + 111325, + 111329, + 111297, + 111305, + 111382, + 111380, + 111320, + 111348, + 111318, + 111380, + 111368, + 111366, + 111362, + 111362, + 111275 + ], + "sample_count": 32 + }, + { + "pubkey": "DGwNgCuNfD5hrqru6hzujKknr4H7f7yigrgG6Bs8sQNC", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 95176, + 94286, + 102792, + 95804, + 95804, + 95754, + 95405, + 95215, + 95215, + 95367, + 94334, + 94204, + 95565, + 95437, + 96030, + 95454, + 102353, + 94494, + 102414, + 102594, + 95412, + 94259, + 103008, + 95348, + 96592, + 96592, + 95398, + 94207, + 97080, + 97080, + 94243, + 94243 + ], + "sample_count": 32 + }, + { + "pubkey": "CeMa7c5E5XYopHxBBC8cNBgZJaBFtV4Au6jXdirqqM8n", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143585000000, + "samples": [ + 94757, + 94838, + 94789, + 94886, + 94836, + 94883, + 94800, + 94860, + 94885, + 94818, + 94817, + 94825, + 94785, + 94816, + 94831, + 94874, + 94845, + 94836, + 94833, + 94857, + 94860, + 94825, + 94726, + 94810, + 94797, + 94833, + 94828, + 94856, + 94827, + 94828, + 94857, + 94792 + ], + "sample_count": 32 + }, + { + "pubkey": "EJg7UvZN3kb1Kxwe4penxF3WbkSPiVzxMr2BPCQ5hKeH", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 147288, + 147272, + 147842, + 150504, + 150773, + 150834, + 151047, + 159782, + 150831, + 150831, + 159440, + 147388, + 159563, + 147292, + 151409, + 150696, + 159510, + 151468, + 151468, + 150681, + 150802, + 150943, + 150943, + 147383, + 151209, + 150895, + 159395, + 150814, + 150814, + 147481, + 147596, + 150864 + ], + "sample_count": 32 + }, + { + "pubkey": "EDYdQEMPfkBq8ddBx9gqkJqnwLcYHefuRYQGW5fyPPZs", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143584000000, + "samples": [ + 169107, + 172115, + 165337, + 162570, + 162581, + 162654, + 172051, + 162678, + 160523, + 164351, + 160457, + 160481, + 164341, + 164222, + 162632, + 160527, + 162618, + 162654, + 160437, + 160602, + 164248, + 164274, + 160446, + 160473, + 160491, + 164279, + 164324, + 164335, + 164299, + 164261, + 160480, + 160562 + ], + "sample_count": 32 + }, + { + "pubkey": "3innJsx3KoHRJk77P1THbAYybHLqsKQqK9NgKPHScuxM", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 98985, + 100539, + 95725, + 99005, + 98899, + 97016, + 95592, + 100736, + 100736, + 101794, + 98866, + 101200, + 95459, + 98866, + 100487, + 100366, + 97044, + 99037, + 97220, + 95574, + 100555, + 97334, + 97334, + 100474, + 97172, + 97277, + 97277, + 95535, + 98977, + 99220, + 100766, + 100766 + ], + "sample_count": 32 + }, + { + "pubkey": "2Evp4SeUv3F6LRpB9DxFme7vvcbA2R8Brye3ypHPqzG8", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143587000000, + "samples": [ + 98753, + 98905, + 99064, + 99032, + 98938, + 99018, + 98964, + 98869, + 98828, + 99065, + 98964, + 99050, + 99168, + 100291, + 100121, + 98938, + 120426, + 101644, + 99473, + 100251, + 99206, + 118088, + 99168, + 99065, + 99018, + 98947, + 99123, + 98956, + 99092, + 98953, + 103930, + 99093 + ], + "sample_count": 32 + }, + { + "pubkey": "GbGnbqfU1NzrWREs2QMyd4qUWHUB4Hfx21VtwGtyzvTb", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 19108, + 19108, + 19054, + 19054, + 17822, + 19038, + 19048, + 17846, + 17795, + 17806, + 17730, + 19120, + 18272, + 21680, + 21680, + 17951, + 19013, + 21732, + 18926, + 19263, + 19371, + 19124, + 21978, + 19592, + 17814, + 17814, + 17837, + 18955, + 18009, + 18009, + 18004, + 17973 + ], + "sample_count": 32 + }, + { + "pubkey": "C1QRBdMNPy2ojfZGHSgpHwSSojeRELXM54MfR2z9htom", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143588000000, + "samples": [ + 14621, + 14629, + 14651, + 14673, + 14637, + 14623, + 14668, + 14624, + 14613, + 14574, + 14623, + 14646, + 14644, + 14639, + 14633, + 14612, + 14605, + 14617, + 14632, + 14598, + 14600, + 14625, + 14599, + 14636, + 14636, + 14681, + 14605, + 14642, + 14604, + 14641, + 14628, + 14665 + ], + "sample_count": 32 + }, + { + "pubkey": "5Lm7wFzrJDoacGvCYQzxro3aBcFoBUP9gHG9rp7zejej", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 126029, + 112780, + 111279, + 111866, + 113729, + 125427, + 111427, + 125655, + 125978, + 126734, + 111831, + 111574, + 125850, + 112532, + 126058, + 112141, + 112141, + 112273, + 129543, + 129545, + 111571, + 112942, + 111634, + 111660, + 111272, + 112324, + 112558, + 129848, + 111706, + 129688, + 112216, + 129923 + ], + "sample_count": 32 + }, + { + "pubkey": "8efHENRPPFrK69YqLuXLWj4nixMxK3srvJgfKvoiRWw8", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143588000000, + "samples": [ + 124350, + 124401, + 124268, + 124296, + 124369, + 124303, + 124267, + 124314, + 132053, + 131819, + 132796, + 124252, + 124295, + 124372, + 132027, + 132334, + 124348, + 124377, + 124388, + 124370, + 124296, + 124290, + 124365, + 124289, + 124334, + 124344, + 124320, + 124350, + 124281, + 124344, + 124323, + 124281 + ], + "sample_count": 32 + }, + { + "pubkey": "GZz9MxYbMaKPLZ1759AFwrcGjWf2j9EPoUDpUZY8NKuo", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 223586, + 229152, + 230780, + 225017, + 225505, + 267874, + 261921, + 265107, + 258077, + 235659, + 243062, + 243062, + 244630, + 237571, + 232836, + 249622, + 230814, + 237300, + 261454, + 276888, + 276888, + 270314, + 273725, + 252061, + 275353, + 275580, + 271691, + 261660, + 225263, + 225510, + 260794, + 231911 + ], + "sample_count": 32 + }, + { + "pubkey": "9gQfhJGAigdtaA8cSB5oEX8NAyYgmZPrvmkv8WanhM36", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143587000000, + "samples": [ + 225649, + 225698, + 225637, + 225671, + 225688, + 225656, + 225681, + 225698, + 225647, + 225687, + 225698, + 225649, + 225657, + 225647, + 225640, + 225698, + 225633, + 225665, + 225646, + 225670, + 225666, + 225684, + 225657, + 225657, + 225646, + 225655, + 225632, + 225669, + 225652, + 225648, + 225678, + 225669 + ], + "sample_count": 32 + }, + { + "pubkey": "H13T5bFELBvWP7y9a97po3FEXLe2zKcDyQzxMXYKAcP1", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 6706, + 7216, + 6749, + 6922, + 6879, + 7135, + 6800, + 6724, + 6910, + 7884, + 7096, + 8064, + 6862, + 6926, + 6745, + 6980, + 6783, + 7258, + 7258, + 6814, + 7035, + 7338, + 7338, + 7853, + 6775, + 7151, + 6977, + 7143, + 7488, + 6665, + 6899, + 7046 + ], + "sample_count": 32 + }, + { + "pubkey": "2wg5Qf6QmkyqFVdBqc7yxve7cCnpenVpDYFkLSPUNU1X", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143590000000, + "samples": [ + 7232, + 7236, + 7169, + 7179, + 7251, + 7253, + 7214, + 7215, + 7222, + 7254, + 7251, + 7196, + 7216, + 7205, + 7233, + 7234, + 7230, + 7244, + 7203, + 7233, + 7208, + 7231, + 7224, + 7255, + 7211, + 7188, + 7247, + 7222, + 7237, + 7246, + 7240, + 7218 + ], + "sample_count": 32 + }, + { + "pubkey": "Gp3YR2pBePPh9m4DtQhNCmeZPkNfdy8tHTFJs6r7bgzb", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 62488, + 61088, + 61036, + 61036, + 61044, + 61286, + 63884, + 62309, + 63670, + 61140, + 61501, + 61501, + 63684, + 63960, + 62279, + 62347, + 62477, + 62477, + 62468, + 62692, + 60772, + 63902, + 61101, + 63758, + 60920, + 64199, + 62476, + 61048, + 62395, + 61271, + 62415, + 64004 + ], + "sample_count": 32 + }, + { + "pubkey": "Gjvq1pU4iJJMR2vHwBgFBkg22kbFGx32KrXUoAXDtuxd", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143590000000, + "samples": [ + 58205, + 58209, + 58221, + 58207, + 58205, + 58165, + 58189, + 58171, + 58119, + 58193, + 58238, + 58166, + 58151, + 58178, + 58190, + 58142, + 58220, + 58210, + 58119, + 58200, + 58170, + 58192, + 58174, + 58239, + 58124, + 58178, + 58193, + 58200, + 58176, + 58172, + 58177, + 58204 + ], + "sample_count": 32 + }, + { + "pubkey": "aCYF9PUedWmCZLDEwxnZ4nxZkAoSVqGCUtSSLuP8sEa", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 62054, + 60444, + 60846, + 62483, + 62715, + 60739, + 60344, + 62304, + 62187, + 61961, + 62277, + 60640, + 61680, + 61680, + 70341, + 62056, + 62096, + 62096, + 61879, + 60395, + 60395, + 60753, + 60371, + 62682, + 60437, + 60477, + 62950, + 60310, + 61863, + 60724, + 62342, + 62342 + ], + "sample_count": 32 + }, + { + "pubkey": "FTYwtssqRZx8CiKb6PSTDU1YCy5UXycexm8PvHPB3efb", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143586000000, + "samples": [ + 49653, + 49720, + 49639, + 49771, + 49678, + 49678, + 49707, + 49770, + 49823, + 49657, + 49654, + 49638, + 49734, + 49722, + 49580, + 49621, + 49654, + 49648, + 49681, + 49824, + 49752, + 49628, + 49654, + 49676, + 49716, + 49695, + 49797, + 49667, + 49677, + 49634, + 49503, + 49721 + ], + "sample_count": 32 + }, + { + "pubkey": "7zoBLhAoZsAdb9XPu449Hn1o3S1bB4gPBvFfJGeGhFUh", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 67791, + 68042, + 69511, + 67659, + 69721, + 69311, + 69653, + 68401, + 67836, + 69903, + 68266, + 69220, + 67846, + 68293, + 68293, + 69316, + 68822, + 69319, + 67959, + 69544, + 68210, + 67919, + 69233, + 69058, + 67855, + 67809, + 69396, + 69233, + 68991, + 69699, + 68093, + 70138 + ], + "sample_count": 32 + }, + { + "pubkey": "HK9zwQq83MCVf4dUUPRUSzJ4sHJHNPLUN7KJP37BP42D", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143584000000, + "samples": [ + 61536, + 61541, + 61488, + 61564, + 61642, + 61533, + 61526, + 61585, + 61628, + 61488, + 61583, + 61542, + 61532, + 61644, + 61520, + 61549, + 61614, + 61477, + 61572, + 61653, + 61590, + 61572, + 61529, + 61639, + 61675, + 61558, + 61602, + 61532, + 61589, + 61607, + 61572, + 61620 + ], + "sample_count": 32 + }, + { + "pubkey": "6wphme2oRCFfXsgxKDTqSRz9PasarnW8eA2mAKCpXSa6", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 86881, + 99436, + 87049, + 98612, + 98773, + 87449, + 86887, + 98506, + 98225, + 86707, + 98835, + 86935, + 99171, + 99171, + 98250, + 98584, + 86918, + 87764, + 86889, + 98103, + 86887, + 86790, + 98248, + 98658, + 87644, + 98434, + 98915, + 87003, + 87003, + 98724, + 86790, + 86782 + ], + "sample_count": 32 + }, + { + "pubkey": "8bYnsJ2EEHM7wo3rMCgM1TZy683amT97Pgp1GJXXzBda", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143585000000, + "samples": [ + 98911, + 98859, + 98901, + 98839, + 98939, + 98817, + 98805, + 98807, + 98924, + 98747, + 98791, + 98909, + 98878, + 98815, + 98871, + 98846, + 98861, + 98919, + 98831, + 98844, + 98944, + 98881, + 98899, + 98916, + 98933, + 98829, + 98891, + 98944, + 98898, + 98932, + 98894, + 98800 + ], + "sample_count": 32 + }, + { + "pubkey": "J7yHHMjxXDxx6w5rsp898GKELE1sqJogFyiZriAYwjdB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 115410, + 114204, + 115332, + 118656, + 113344, + 110525, + 115392, + 120204, + 120473, + 120580, + 118825, + 118825, + 120467, + 120199, + 113184, + 110763, + 118784, + 120693, + 120486, + 118666, + 118786, + 115526, + 120441, + 112649, + 120435, + 120130, + 120130, + 111123, + 120411, + 118836, + 118836, + 118926 + ], + "sample_count": 32 + }, + { + "pubkey": "CyaNgZZtPzMGctRmhHoEWuYXzcbUwMktTTv9jtNrc4Qv", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143586000000, + "samples": [ + 113915, + 113879, + 131890, + 106971, + 107032, + 107017, + 106991, + 106992, + 106984, + 107038, + 106745, + 106959, + 107048, + 106957, + 107009, + 106995, + 106922, + 107027, + 106978, + 106978, + 106935, + 106724, + 106979, + 107010, + 106998, + 107038, + 107028, + 106958, + 106972, + 106990, + 107005, + 107010 + ], + "sample_count": 32 + }, + { + "pubkey": "2H3yC7afM5vguKmDus82GYWCNxwW15BAfFPvYhqsddfX", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 115000, + 125731, + 115191, + 114925, + 116911, + 115024, + 115036, + 127009, + 115318, + 115034, + 119820, + 114943, + 114965, + 127497, + 115083, + 115180, + 115180, + 115105, + 114977, + 114978, + 122902, + 114996, + 114863, + 119263, + 115070, + 114936, + 125822, + 116270, + 115010, + 115181, + 115307, + 115173 + ], + "sample_count": 32 + }, + { + "pubkey": "9rCxcLPt7rE6eyMtSMkW3ve8WnpmY5FacP4vFjutSk7t", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143560000000, + "samples": [ + 84534, + 84464, + 84493, + 84523, + 84512, + 84536, + 84556, + 84455, + 84584, + 84539, + 84494, + 84462, + 84505, + 84557, + 84603, + 84542, + 84585, + 84494, + 84574, + 84557, + 84468, + 84562, + 84571, + 84507, + 84417, + 84568, + 84443, + 84505, + 84559, + 84528, + 84546, + 84564 + ], + "sample_count": 32 + }, + { + "pubkey": "Gk6m3f43yZKWKmmHbHaCrzHmGgxFTpjEnvmr7UGopA45", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 14708, + 14708, + 14996, + 15652, + 14706, + 14706, + 15464, + 14854, + 14827, + 15245, + 14886, + 14872, + 15049, + 14917, + 14798, + 15234, + 14766, + 14810, + 20292, + 14762, + 14882, + 14919, + 14802, + 14914, + 16991, + 15260, + 14906, + 16608, + 14808, + 14838, + 15578, + 15264 + ], + "sample_count": 32 + }, + { + "pubkey": "7casp6cFNYKw8SCn47vuUx6hMeeLmJKbC1eWwdDkA4dN", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143559000000, + "samples": [ + 18436, + 18594, + 18585, + 18355, + 18307, + 18473, + 18511, + 18351, + 18470, + 18541, + 18528, + 18593, + 18377, + 18629, + 18309, + 18304, + 18443, + 18456, + 18530, + 18496, + 18347, + 18448, + 18353, + 18478, + 18529, + 18227, + 18398, + 18637, + 18529, + 18302, + 18413, + 18568 + ], + "sample_count": 32 + }, + { + "pubkey": "GM9bqeLQgzK6e6Zj91eKUE7xgz3zguLoAyH1rpV9azYH", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 88871, + 89098, + 88970, + 88906, + 88925, + 88942, + 88841, + 89037, + 89037, + 88864, + 88939, + 89076, + 89058, + 88884, + 88996, + 88878, + 88966, + 88988, + 89043, + 88846, + 89078, + 88885, + 88976, + 89086, + 88955, + 88893, + 88956, + 88996, + 88946, + 89181, + 89135, + 88933 + ], + "sample_count": 32 + }, + { + "pubkey": "AWXkETeAYkDg2MU3SKW4rBGKQpMQGnenp4ra6GorZa1Z", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143559000000, + "samples": [ + 78366, + 78358, + 78289, + 78397, + 78438, + 78306, + 78325, + 78357, + 78355, + 78422, + 78293, + 78304, + 78370, + 78333, + 78321, + 78373, + 78384, + 78373, + 78357, + 78363, + 78284, + 78331, + 78285, + 78372, + 78353, + 78350, + 78381, + 78337, + 78316, + 78322, + 78423, + 78362 + ], + "sample_count": 32 + }, + { + "pubkey": "GtV3XkGicd1Adht9dQAvktTspDYBDUozxkmne7CBGLja", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143481000000, + "samples": [ + 10293, + 10303, + 10285, + 10229, + 10381, + 10331, + 10354, + 10387, + 10382, + 10273, + 10612, + 10221, + 10457, + 10462, + 10372, + 10217, + 10504, + 10298, + 10307, + 10510, + 10211, + 10343, + 10270, + 10160, + 10414, + 10633, + 10317, + 10246, + 10477, + 10519, + 10361, + 10251 + ], + "sample_count": 32 + }, + { + "pubkey": "CcsRSna92ugKsweQY1wFpLWMHg15mf5ohDcoPQEdmnLW", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143559000000, + "samples": [ + 13271, + 13230, + 13270, + 13305, + 13306, + 13290, + 13289, + 13271, + 13257, + 13271, + 13161, + 13294, + 13239, + 13191, + 13263, + 13297, + 13215, + 13236, + 13307, + 13231, + 13261, + 13203, + 13314, + 13300, + 13192, + 13267, + 13228, + 13222, + 13246, + 13281, + 13201, + 13305 + ], + "sample_count": 32 + }, + { + "pubkey": "4D5cEUdCwswVMovHd8eEV4SBTQfHNekFDLF4ecn5SX1g", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 17260, + 17395, + 17401, + 17283, + 17488, + 17343, + 17353, + 17615, + 17300, + 17276, + 17245, + 16959, + 17190, + 17098, + 16953, + 17057, + 17016, + 17078, + 16996, + 17026, + 16979, + 17114, + 17509, + 17083, + 17157, + 17387, + 17353, + 17466, + 17381, + 17381, + 17270, + 17489 + ], + "sample_count": 32 + }, + { + "pubkey": "92bru5PHPjtYi8PF1qJ9eTFzJ1ypGpjvxgaubTYp9jnM", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143552000000, + "samples": [ + 27705, + 27798, + 27688, + 27631, + 27839, + 27697, + 27720, + 27854, + 27717, + 27758, + 27741, + 27734, + 27788, + 27876, + 27796, + 27733, + 27757, + 27781, + 27752, + 27734, + 27761, + 27805, + 27775, + 27880, + 27703, + 27859, + 27836, + 27854, + 27822, + 27682, + 27743, + 27636 + ], + "sample_count": 32 + }, + { + "pubkey": "FtqL4kGv9HxPc479qTXaiiuPyEGGeK8sZFPA2Pn71hmo", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 135196, + 135643, + 135290, + 135339, + 135528, + 135241, + 135259, + 135419, + 135158, + 135459, + 139516, + 135339, + 135012, + 135742, + 135742, + 135119, + 134981, + 135411, + 190649, + 190649, + 135739, + 135752, + 135933, + 135217, + 135544, + 135108, + 135245, + 135466, + 135099, + 135044, + 135232, + 135320 + ], + "sample_count": 32 + }, + { + "pubkey": "5JZLUR4kzdpcNogQKJqUCgeMbu8KhPohhhmKDs9z9qh9", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143557000000, + "samples": [ + 127794, + 130548, + 127691, + 135378, + 135323, + 135394, + 135377, + 135239, + 135419, + 135184, + 211973, + 135345, + 141198, + 135277, + 135344, + 135288, + 135068, + 134859, + 134811, + 134780, + 137981, + 134938, + 135019, + 134923, + 135027, + 134926, + 134953, + 134838, + 134795, + 134731, + 134959, + 134889 + ], + "sample_count": 32 + }, + { + "pubkey": "Gee3fCQQfWSn52d4LqGkSqNXD2TQcZfkb2HC7JwAbZSS", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143482000000, + "samples": [ + 15492, + 15691, + 15651, + 15430, + 16656, + 15612, + 15380, + 16685, + 15498, + 15516, + 17958, + 15560, + 15453, + 17891, + 15535, + 15535, + 15835, + 16656, + 15534, + 15396, + 15789, + 15513, + 15502, + 15981, + 15508, + 15444, + 15444, + 15492, + 15487, + 15375, + 15375, + 15688 + ], + "sample_count": 32 + }, + { + "pubkey": "7rc3Y6Ni394s5smbPYEkVcostYr2vQvyf1vCSrBhA3pS", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143554000000, + "samples": [ + 20096, + 19938, + 19943, + 20073, + 20018, + 20004, + 20107, + 19915, + 19989, + 19964, + 20041, + 20047, + 19953, + 20025, + 19946, + 20089, + 20003, + 20041, + 19997, + 19967, + 20019, + 20018, + 20079, + 19987, + 20052, + 20031, + 20024, + 19936, + 19960, + 20023, + 20041, + 20037 + ], + "sample_count": 32 + }, + { + "pubkey": "An7d88iw3dPgxyRZbSJurui7C6echL3mcv4SCqXyud6Y", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 249539, + 249965, + 249457, + 249544, + 249394, + 249669, + 249389, + 249778, + 249560, + 249321, + 249419, + 249333, + 249397, + 249546, + 249552, + 249552, + 249492, + 249526, + 249495, + 249467, + 249335, + 249652, + 249197, + 249581, + 249624, + 249366, + 249531, + 249492, + 249517, + 249517, + 249531, + 249311 + ], + "sample_count": 32 + }, + { + "pubkey": "ADwVKBkbRzVY8N3Zhyc2dJjnXM9hJDHzsrqGRCsTcZAe", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143552000000, + "samples": [ + 223966, + 224031, + 223963, + 223925, + 223999, + 223891, + 223825, + 223917, + 223952, + 223840, + 224030, + 223964, + 224001, + 223855, + 223807, + 223961, + 224026, + 223916, + 223981, + 223990, + 224022, + 223947, + 223930, + 224000, + 223913, + 224012, + 224019, + 223965, + 223926, + 223967, + 224060, + 223909 + ], + "sample_count": 32 + }, + { + "pubkey": "7oXib4PY1BnyD2hmYz8a9CWkB67Q3DdrNRaBJpZRyvY6", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143483000000, + "samples": [ + 114534, + 114531, + 114552, + 114499, + 114590, + 114560, + 114436, + 114713, + 114602, + 114588, + 114583, + 114519, + 114612, + 114804, + 114804, + 114441, + 114441, + 114552, + 114607, + 114586, + 114510, + 114730, + 114598, + 114601, + 114561, + 114605, + 114482, + 114642, + 114441, + 114499, + 114693, + 114607 + ], + "sample_count": 32 + }, + { + "pubkey": "H7JCYcEkCgcmx89hvZi1ezEoAzqw8YxrWo6nWzwv5h2d", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143554000000, + "samples": [ + 110042, + 110004, + 109987, + 109989, + 109992, + 110043, + 109931, + 110035, + 110002, + 117432, + 110190, + 110058, + 110003, + 109940, + 110012, + 110011, + 110019, + 109985, + 110028, + 109989, + 109999, + 109988, + 109986, + 109961, + 109932, + 109953, + 109913, + 109912, + 109971, + 109988, + 109957, + 109982 + ], + "sample_count": 32 + }, + { + "pubkey": "5JMV5RG8EcuZ1nkZC32NEbyt5qSVr19AVuQP6f85V95z", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 130529, + 130689, + 130525, + 130442, + 138992, + 138992, + 130563, + 130625, + 131576, + 130530, + 130547, + 131366, + 130483, + 130470, + 130470, + 130696, + 130547, + 130574, + 130583, + 130715, + 130503, + 130503, + 130664, + 130534, + 130486, + 130792, + 130690, + 130472, + 130689, + 130682, + 130408, + 131897 + ], + "sample_count": 32 + }, + { + "pubkey": "GMPDFDR8yGcvaoQvq4uf79X2iAsRyHeFLfH9s4gaBt1B", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143556000000, + "samples": [ + 140104, + 140132, + 140045, + 140153, + 140037, + 138858, + 138726, + 138732, + 138892, + 138818, + 138960, + 138757, + 138810, + 139035, + 138776, + 138120, + 138148, + 138344, + 138365, + 138407, + 138311, + 138093, + 138232, + 138313, + 138129, + 138819, + 138894, + 138828, + 139590, + 139505, + 139655, + 139595 + ], + "sample_count": 32 + }, + { + "pubkey": "3S5zyTMyXhEn8Cbve8PfdBwAjCAeNYp9kASKKxUTZVz3", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 24707, + 24764, + 24633, + 24632, + 24772, + 24657, + 24702, + 24726, + 24711, + 24596, + 24628, + 24784, + 24637, + 24801, + 24801, + 24667, + 24717, + 24805, + 24746, + 24799, + 24953, + 24606, + 24791, + 24729, + 24768, + 24674, + 24743, + 24742, + 24714, + 24744, + 24622, + 24858 + ], + "sample_count": 32 + }, + { + "pubkey": "3sB85CpvUw6RR7jmFA1cEXL8A4qf4nWKQB9bbu9Wrk8a", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143557000000, + "samples": [ + 23914, + 23914, + 23826, + 23867, + 23809, + 23848, + 23744, + 23854, + 23831, + 23733, + 23643, + 23619, + 23884, + 23753, + 23567, + 23853, + 23887, + 23781, + 23728, + 23787, + 23700, + 23794, + 23811, + 23729, + 23492, + 23765, + 23659, + 23913, + 23832, + 23882, + 23867, + 23768 + ], + "sample_count": 32 + }, + { + "pubkey": "HnfbZcxvtGF9ipvq7TheyUkyGA5jQDNXTx1T4WYmqvxF", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 91434, + 92326, + 92326, + 91541, + 91780, + 95626, + 95626, + 91563, + 91626, + 91705, + 91373, + 91663, + 91896, + 91416, + 91466, + 91511, + 91567, + 91441, + 91441, + 91647, + 91552, + 91643, + 91625, + 91710, + 91371, + 91582, + 91531, + 91839, + 91558, + 91558, + 91735, + 91494 + ], + "sample_count": 32 + }, + { + "pubkey": "BNyQs2aHGbMs9ZKUM9ECkGoXGhhYNGmZsMkZKhDpeB5W", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143558000000, + "samples": [ + 92720, + 92669, + 92743, + 92725, + 92676, + 92731, + 92769, + 92613, + 92713, + 92717, + 92703, + 92683, + 92673, + 92698, + 92679, + 92694, + 92724, + 92643, + 92730, + 92731, + 92706, + 92677, + 92755, + 92789, + 92703, + 92658, + 92774, + 92666, + 92730, + 92702, + 92741, + 92723 + ], + "sample_count": 32 + }, + { + "pubkey": "HVEi3EqcmJuEnthtfcJvLMHLcHf4rYmFgvftkmQR2omk", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 7186, + 7359, + 6675, + 6684, + 6762, + 6762, + 6599, + 6664, + 6885, + 7403, + 7403, + 7339, + 7338, + 7427, + 7265, + 7265, + 7360, + 7228, + 7177, + 7444, + 7351, + 7342, + 7272, + 7301, + 7301, + 7314, + 7490, + 7490, + 7221, + 7221, + 7324, + 7359 + ], + "sample_count": 32 + }, + { + "pubkey": "59VzMHuDXa57Evn93P1yBYCC52FuN54YJUVCYCaWX6z2", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143551000000, + "samples": [ + 7238, + 7278, + 7217, + 7207, + 7206, + 7280, + 7180, + 7295, + 7275, + 7207, + 7300, + 7297, + 7301, + 7268, + 7249, + 7261, + 7357, + 7235, + 7269, + 7219, + 7368, + 7209, + 7278, + 7293, + 7191, + 7258, + 7287, + 7276, + 7271, + 7237, + 7132, + 7158 + ], + "sample_count": 32 + }, + { + "pubkey": "DSSNLYvDWpzfWq4V9qUT7JmiQ5WMPu8F2o1yYe4YTT3d", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 175888, + 175829, + 175832, + 175779, + 175778, + 175840, + 175729, + 176472, + 175901, + 175915, + 176118, + 176003, + 175931, + 176110, + 175758, + 174619, + 174826, + 174751, + 174452, + 175460, + 175460, + 174621, + 174846, + 174444, + 174806, + 174696, + 174696, + 174808, + 174471, + 174688, + 174980, + 174577 + ], + "sample_count": 32 + }, + { + "pubkey": "CDotAHM9JWpDzucnp5SKQwU25HZddVbXRH5qRS7VUW5t", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143558000000, + "samples": [ + 185375, + 185294, + 185222, + 185268, + 185226, + 185240, + 185250, + 185319, + 185316, + 185280, + 185335, + 185212, + 185311, + 185222, + 185295, + 185267, + 185253, + 185276, + 185299, + 185282, + 185298, + 185416, + 185283, + 185198, + 185381, + 185313, + 185206, + 185333, + 185234, + 185343, + 185277, + 185310 + ], + "sample_count": 32 + }, + { + "pubkey": "25Kfs2NR1HEMcRfUkdqivPMhZCUDUKiPD12HU8asj1ra", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 157502, + 157502, + 157705, + 157532, + 157471, + 158412, + 157594, + 157594, + 157582, + 157443, + 158140, + 159357, + 157457, + 157741, + 157589, + 157693, + 157717, + 157755, + 157583, + 157582, + 157554, + 157428, + 157661, + 157803, + 157516, + 157472, + 158044, + 158107, + 157506, + 157872, + 157732, + 157488 + ], + "sample_count": 32 + }, + { + "pubkey": "AUX4vmrEB7tuecwerXDKXeK8gcnCt2qvL6iVXZJTCjTD", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143556000000, + "samples": [ + 240399, + 240386, + 240372, + 240305, + 240381, + 240423, + 240294, + 240410, + 240410, + 240289, + 240273, + 240358, + 240303, + 240354, + 240350, + 240417, + 240355, + 240392, + 240429, + 240383, + 240318, + 240426, + 240395, + 240354, + 240325, + 240372, + 240334, + 240401, + 240372, + 240356, + 240338, + 240300 + ], + "sample_count": 32 + }, + { + "pubkey": "ya5F19YvMFC8sVntfi24WCg9s4PXqdCXufKPmTCLshA", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 97330, + 97514, + 97597, + 97395, + 97420, + 97257, + 97437, + 97254, + 97254, + 97298, + 97298, + 97269, + 97269, + 97773, + 97773, + 97317, + 97252, + 97306, + 97306, + 97279, + 97304, + 97561, + 97373, + 97274, + 97344, + 97329, + 97462, + 97429, + 97276, + 97215, + 97405, + 97208 + ], + "sample_count": 32 + }, + { + "pubkey": "9HtKdRxLEDEFSoHR8MxDAH9dY35PWcyBMXBXBwyMbBMg", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143560000000, + "samples": [ + 94659, + 94610, + 94673, + 94608, + 94650, + 94635, + 94729, + 94796, + 94671, + 94711, + 94683, + 94699, + 94651, + 94729, + 94749, + 94690, + 94748, + 94712, + 94724, + 94687, + 94698, + 94635, + 94714, + 94647, + 94643, + 94701, + 94670, + 94704, + 94639, + 94672, + 94729, + 94628 + ], + "sample_count": 32 + }, + { + "pubkey": "GnmojpPhCD6fSrdiXQ2UQKQydPBMLSeNPqaKgnwJP4a6", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143481000000, + "samples": [ + 146981, + 147339, + 147032, + 146984, + 147311, + 147040, + 146916, + 147274, + 146992, + 147006, + 147175, + 147171, + 147016, + 147110, + 147146, + 146832, + 147171, + 147171, + 147055, + 147212, + 147509, + 147034, + 146960, + 147219, + 147047, + 147093, + 147185, + 147192, + 146923, + 147216, + 147216, + 147438 + ], + "sample_count": 32 + }, + { + "pubkey": "6GE1fT7YNHofEdmkAdjFxHdowBHhhHkV4yocR3xhdah8", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143561000000, + "samples": [ + 146951, + 146948, + 146897, + 146921, + 146976, + 146924, + 146927, + 146929, + 146937, + 146977, + 146937, + 147019, + 146931, + 146991, + 146896, + 146936, + 146946, + 147049, + 146919, + 146932, + 146920, + 146895, + 146955, + 146919, + 146930, + 146936, + 146861, + 146951, + 146992, + 146916, + 146958, + 147036 + ], + "sample_count": 32 + }, + { + "pubkey": "BxzhZRsgjDewo2ZrCH3YZUwyUf8m9pLMkkA7naxqkRBU", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 167942, + 168048, + 168080, + 167950, + 168141, + 173270, + 168166, + 168432, + 168055, + 168109, + 167845, + 167845, + 167750, + 167879, + 167918, + 167811, + 167940, + 167826, + 167675, + 167888, + 167724, + 167809, + 167917, + 167875, + 167682, + 167897, + 167765, + 167749, + 167807, + 167801, + 167810, + 167835 + ], + "sample_count": 32 + }, + { + "pubkey": "7MerrLyJa8vebWDFpDih8mhY1cZv6HLaQ3JGgcpriG9B", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143561000000, + "samples": [ + 175883, + 175831, + 175908, + 175923, + 175706, + 175750, + 175783, + 175822, + 175725, + 175750, + 175766, + 175881, + 175902, + 175864, + 175776, + 175784, + 175801, + 175696, + 175787, + 175654, + 175887, + 175793, + 175826, + 196385, + 175727, + 175681, + 175916, + 175800, + 175795, + 175806, + 175932, + 175660 + ], + "sample_count": 32 + }, + { + "pubkey": "46A2LPMf2ajxv9Gs5fbXLRmwJHKRegp7nPqj7MJqUiJM", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143482000000, + "samples": [ + 76436, + 76298, + 76366, + 76366, + 76208, + 76183, + 76534, + 76181, + 76444, + 76352, + 76315, + 76188, + 76205, + 76198, + 76401, + 76317, + 76210, + 76269, + 76347, + 76313, + 76550, + 76354, + 76288, + 76391, + 76444, + 76251, + 76474, + 76347, + 76348, + 76438, + 76289, + 76103 + ], + "sample_count": 32 + }, + { + "pubkey": "84KhDbM8HTNSrJxhoLYQbkAdKJhatPc3atVDQTP7PHuW", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143561000000, + "samples": [ + 78972, + 78998, + 78967, + 78962, + 78965, + 78974, + 78893, + 78894, + 79018, + 90178, + 78699, + 78669, + 78660, + 78607, + 78662, + 78680, + 78763, + 78683, + 78598, + 78605, + 78651, + 78709, + 78685, + 78682, + 78632, + 78642, + 78619, + 78557, + 78686, + 78580, + 78657, + 78754 + ], + "sample_count": 32 + }, + { + "pubkey": "BLYcvun1MeB6gNKWygkaT3a8aKDjWujRMFGwiSEKsdWQ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 29083, + 29061, + 29188, + 28951, + 29106, + 29208, + 29015, + 29130, + 29066, + 29223, + 29453, + 29134, + 28976, + 29129, + 29220, + 29092, + 29086, + 29203, + 29300, + 29151, + 29447, + 29156, + 28989, + 29259, + 29219, + 29115, + 29127, + 29102, + 29506, + 29100, + 29139, + 29267 + ], + "sample_count": 32 + }, + { + "pubkey": "B3zamZZFuWENaUmRR54PwJM2qf6LwWFbcPwhu4L6VgpT", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143550000000, + "samples": [ + 25912, + 25949, + 25926, + 25883, + 25912, + 25945, + 25845, + 25917, + 25854, + 25821, + 25809, + 25834, + 25872, + 25778, + 25962, + 25840, + 25888, + 25923, + 25943, + 25910, + 25859, + 25806, + 25787, + 25873, + 25913, + 25931, + 25860, + 25963, + 25879, + 26000, + 25918, + 25859 + ], + "sample_count": 32 + }, + { + "pubkey": "H6eWdtQ2nZNQh5n2nAFrCVfjEER1qaqkZdYHeVwFFbaH", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 20612, + 20900, + 20746, + 20640, + 20782, + 20508, + 20771, + 20948, + 20576, + 20773, + 20676, + 20600, + 20793, + 20868, + 20589, + 20615, + 20950, + 20704, + 20627, + 20796, + 20674, + 20409, + 20669, + 20547, + 20640, + 21162, + 20751, + 20586, + 20704, + 20833, + 20660, + 21331 + ], + "sample_count": 32 + }, + { + "pubkey": "A1qBtfdzeZjG8nuQmRE981cKHsgzpHmQMUfGNYGDMrBN", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143551000000, + "samples": [ + 20209, + 20121, + 20154, + 20164, + 20099, + 20170, + 20156, + 20154, + 20188, + 20110, + 20237, + 20168, + 20143, + 20145, + 20200, + 20178, + 20188, + 20164, + 20144, + 20142, + 20169, + 20101, + 20128, + 20122, + 20214, + 20190, + 20157, + 20127, + 20157, + 20057, + 20163, + 20183 + ], + "sample_count": 32 + }, + { + "pubkey": "8kUWksHuRLLhhTj2VGN8yvNCsgENxK87XW9N1pKj3M7s", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 77829, + 23791, + 24117, + 23671, + 23671, + 23702, + 23665, + 23758, + 25103, + 23774, + 23839, + 25246, + 23696, + 23628, + 23655, + 23587, + 23588, + 23588, + 24556, + 23679, + 23805, + 23573, + 23770, + 24014, + 24014, + 24309, + 23673, + 23529, + 24296, + 23488, + 23660, + 24045 + ], + "sample_count": 32 + }, + { + "pubkey": "HsVhphBgjwKQQQmQP4PrVE8UpL1ehhH6xnsrYybvQoz5", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143553000000, + "samples": [ + 13217, + 13170, + 13218, + 13249, + 13253, + 13203, + 13184, + 13254, + 13217, + 13233, + 13204, + 13144, + 13248, + 13226, + 13213, + 13184, + 13155, + 21453, + 13138, + 13161, + 13197, + 13266, + 13195, + 13249, + 13262, + 13238, + 13251, + 13265, + 13201, + 13207, + 13254, + 13190 + ], + "sample_count": 32 + }, + { + "pubkey": "5MpvJGbwAu8jn21PKzQVWKdz3NnzLRJ6huUe2iFRRuVM", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 115470, + 115470, + 115665, + 115339, + 115571, + 115956, + 115690, + 115652, + 116083, + 115709, + 115572, + 115572, + 115819, + 115714, + 115486, + 115856, + 115529, + 115506, + 115653, + 115559, + 115543, + 115601, + 115744, + 115569, + 115565, + 115612, + 115510, + 116195, + 115464, + 115464, + 115412, + 115412 + ], + "sample_count": 32 + }, + { + "pubkey": "48mSyeEjdoYHLNbVteVokcnnSSGf31qCFgWEXbPhgjii", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143554000000, + "samples": [ + 109853, + 109920, + 109836, + 109932, + 109864, + 109918, + 109886, + 109928, + 109970, + 109898, + 109896, + 109885, + 109841, + 109953, + 109824, + 109941, + 109924, + 109941, + 109910, + 109923, + 109853, + 109845, + 109898, + 111767, + 111794, + 111730, + 111800, + 111769, + 111767, + 107598, + 107591, + 107591 + ], + "sample_count": 32 + }, + { + "pubkey": "5VPumxfx9Fb7Jizq7W46KFB6FFznYD4Co1ZnupgoKzyJ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 122739, + 122744, + 122744, + 122922, + 122893, + 123053, + 123008, + 122714, + 123626, + 122905, + 122808, + 122808, + 122761, + 122838, + 123191, + 122868, + 122784, + 123114, + 122727, + 122727, + 122934, + 122969, + 122934, + 122934, + 122812, + 122894, + 123002, + 122892, + 122906, + 122915, + 122874, + 123826 + ], + "sample_count": 32 + }, + { + "pubkey": "DhWuJAzydfNiWWDSZFXv1LhCsWdFBnjaegdffF9StVcW", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143556000000, + "samples": [ + 120910, + 120879, + 120947, + 120988, + 120904, + 120887, + 120812, + 120834, + 120881, + 121130, + 120917, + 120898, + 121098, + 120859, + 120858, + 120948, + 120935, + 120928, + 120864, + 120826, + 120904, + 120690, + 120946, + 120864, + 120809, + 120911, + 120958, + 121094, + 120893, + 120872, + 120897, + 120949 + ], + "sample_count": 32 + }, + { + "pubkey": "5owUvskVHobCSWtpk3Y1vZq2cYHAN2QQKSifUtYCH4Ma", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 139720, + 139905, + 139724, + 139590, + 139564, + 139659, + 139625, + 139966, + 139741, + 139680, + 140400, + 139552, + 139552, + 139674, + 139648, + 139952, + 139611, + 139767, + 139787, + 139783, + 139792, + 139675, + 139560, + 139925, + 140061, + 139816, + 139638, + 139709, + 139646, + 140066, + 139695, + 139682 + ], + "sample_count": 32 + }, + { + "pubkey": "CGZ5W7VUfjE3FacbCo6VSmzkCHEoMMxG5oh7zwmuMD3Z", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143551000000, + "samples": [ + 142505, + 142473, + 142491, + 142524, + 142491, + 142434, + 142703, + 142622, + 142585, + 147933, + 142461, + 142555, + 142612, + 142474, + 142512, + 142399, + 142465, + 142484, + 142543, + 142709, + 142576, + 142513, + 142435, + 142597, + 142599, + 142556, + 142619, + 142531, + 142551, + 142610, + 142459, + 142434 + ], + "sample_count": 32 + }, + { + "pubkey": "HHA96DBFzA2a7CVMB4PqEj8HdmXg4tp3VNYCVZtb7ShC", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 93069, + 93223, + 96966, + 93013, + 93156, + 93055, + 93063, + 93437, + 93094, + 93116, + 93357, + 93224, + 93079, + 93138, + 93099, + 93099, + 93354, + 93264, + 93163, + 93026, + 96748, + 93079, + 100281, + 93675, + 93223, + 93106, + 93149, + 93072, + 93719, + 93300, + 94434, + 93082 + ], + "sample_count": 32 + }, + { + "pubkey": "BpAmgwB4T3sj982mWKvu165MtjZadJWvC6xs9tEG3wFo", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143553000000, + "samples": [ + 98046, + 98005, + 98041, + 98021, + 98122, + 98007, + 98085, + 97976, + 98051, + 100979, + 98029, + 97972, + 98010, + 98034, + 98052, + 98030, + 98030, + 98130, + 97961, + 98009, + 97989, + 98053, + 97975, + 97935, + 97984, + 98042, + 98134, + 98061, + 98019, + 97990, + 98088, + 98045 + ], + "sample_count": 32 + }, + { + "pubkey": "F7Dh21nsSUHMvc7Rd2xHA3JgyQuxnq68TzDUsBx5aFrp", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 19121, + 19302, + 19316, + 19393, + 19668, + 19123, + 19424, + 19316, + 19391, + 19188, + 20048, + 19182, + 19182, + 19128, + 19898, + 19238, + 19172, + 19172, + 19285, + 19507, + 19126, + 19129, + 19146, + 19152, + 19271, + 19265, + 19273, + 19370, + 19281, + 19158, + 19969, + 19272 + ], + "sample_count": 32 + }, + { + "pubkey": "6no2MP9tfqvsmsj1YRRPqyzuFdhTnCg6PLkboUMsfXw5", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143555000000, + "samples": [ + 18340, + 18303, + 18345, + 18322, + 18311, + 18251, + 18262, + 18274, + 18281, + 18288, + 18245, + 18228, + 18474, + 18306, + 18178, + 18287, + 18278, + 18330, + 18316, + 18275, + 18324, + 18347, + 18281, + 18201, + 18226, + 18366, + 18195, + 18222, + 18310, + 18383, + 18262, + 18330 + ], + "sample_count": 32 + }, + { + "pubkey": "3ui6oog1CkAkinZ8UnivUoZYwGfb2NNGaEU7CvmAQWpQ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 8115, + 8159, + 8196, + 8310, + 8230, + 8130, + 8028, + 8028, + 8129, + 8252, + 6992, + 6994, + 6947, + 7023, + 7023, + 7171, + 7098, + 7011, + 7068, + 7031, + 6997, + 8290, + 8207, + 8399, + 8462, + 8416, + 8172, + 8235, + 8193, + 8163, + 8368, + 8333 + ], + "sample_count": 32 + }, + { + "pubkey": "GfMfv4tibW8TbqCqY1Szq1siVSrcV9NkA4poirBr1DXi", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143550000000, + "samples": [ + 8514, + 8496, + 8476, + 8533, + 8405, + 8419, + 8534, + 8384, + 8461, + 8660, + 8535, + 8328, + 8568, + 8414, + 8500, + 8509, + 8510, + 8474, + 8400, + 8541, + 8501, + 8381, + 8479, + 8602, + 8513, + 8555, + 8460, + 8510, + 8416, + 8636, + 8484, + 8445 + ], + "sample_count": 32 + }, + { + "pubkey": "4NhzTVoxYh55kmsE8TAtbVXmSTsyANCeiXxhY1i42Xa1", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 30409, + 31170, + 31170, + 30381, + 30431, + 31270, + 30711, + 30758, + 30923, + 30676, + 30421, + 30554, + 30754, + 30496, + 30923, + 31054, + 30738, + 31252, + 30530, + 30403, + 33056, + 30571, + 30657, + 31303, + 30977, + 30642, + 31065, + 30758, + 30840, + 31113, + 30628, + 30874 + ], + "sample_count": 32 + }, + { + "pubkey": "BiMM7YX1Yg63Yo9mqcRdoajp7GC671AV8TWHKPpBqBfG", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143555000000, + "samples": [ + 32040, + 32055, + 31939, + 32029, + 32033, + 31911, + 32011, + 31973, + 31957, + 32048, + 31996, + 32024, + 32115, + 32073, + 31980, + 32052, + 32080, + 32057, + 32031, + 32029, + 31926, + 31968, + 32045, + 32029, + 32036, + 32049, + 31940, + 32073, + 32018, + 32043, + 32009, + 31945 + ], + "sample_count": 32 + }, + { + "pubkey": "GcH4wm86gDLCDNxt8j8mr8k5hu4UtCw4ukkYp6N8FwwS", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 104307, + 113910, + 104087, + 104123, + 114778, + 104158, + 105257, + 116166, + 105102, + 105188, + 108465, + 105344, + 105307, + 118908, + 105488, + 104949, + 109798, + 105058, + 105302, + 116252, + 105375, + 104949, + 104949, + 114663, + 105058, + 105175, + 119335, + 105686, + 105222, + 115067, + 105059, + 105030 + ], + "sample_count": 32 + }, + { + "pubkey": "5h9ueC2yiXiHR9yVXPEKfqQmPPJZequTZYubuFMr72ZA", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143799000000, + "samples": [ + 99277, + 99282, + 99287, + 99279, + 99273, + 99270, + 99284, + 99283, + 99284, + 99269, + 99288, + 99279, + 99301, + 99301, + 99294, + 99294, + 99282, + 99287, + 99281, + 99281, + 99279, + 99277, + 99281, + 99272, + 99276, + 99279, + 99276, + 99286, + 99297, + 99268, + 99292, + 99285 + ], + "sample_count": 32 + }, + { + "pubkey": "BJrRNLHuogMHU7UVu2tzg2huFpjQw2VJwy59hSadFYuD", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 85372, + 85921, + 85921, + 85455, + 85433, + 85419, + 85482, + 85491, + 85389, + 85451, + 85374, + 85458, + 85410, + 85516, + 85737, + 85394, + 85395, + 85479, + 85479, + 85428, + 85543, + 85663, + 85380, + 85500, + 85555, + 85351, + 85544, + 85408, + 85344, + 85420, + 85486, + 85373 + ], + "sample_count": 32 + }, + { + "pubkey": "5Ma8LPpdAVRoRrAPDEUhmStWwstv2zdWHgUmFizLogFF", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143799000000, + "samples": [ + 93098, + 93080, + 93091, + 93073, + 93095, + 93076, + 93083, + 93077, + 88389, + 93961, + 93921, + 93933, + 93946, + 93939, + 93944, + 93903, + 93921, + 93906, + 93927, + 93913, + 93944, + 93930, + 93902, + 93951, + 93952, + 93958, + 93946, + 93937, + 93946, + 93942, + 93931, + 93928 + ], + "sample_count": 32 + }, + { + "pubkey": "AX6R8RtDvpXVu9dtyf9sNcpyr1rwobMtUfusBN5xs74d", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 24374, + 25240, + 24336, + 24296, + 24434, + 24422, + 24281, + 24375, + 24351, + 24395, + 24326, + 24311, + 24435, + 24386, + 24314, + 24314, + 24374, + 24572, + 24446, + 24404, + 24404, + 24427, + 24349, + 24451, + 24375, + 24285, + 24282, + 24481, + 24314, + 24352, + 24423, + 24455 + ], + "sample_count": 32 + }, + { + "pubkey": "CMQmT4WS5jQo3jt4VeASdHs7aT56xabVKX5pYq8rKKcX", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143798000000, + "samples": [ + 21487, + 21494, + 21480, + 21482, + 21487, + 21473, + 21512, + 21505, + 21458, + 21454, + 21414, + 21446, + 21502, + 21459, + 21503, + 21492, + 21473, + 21482, + 21439, + 21462, + 21488, + 21520, + 21425, + 21473, + 21482, + 21409, + 21484, + 21498, + 21468, + 21480, + 21474, + 21491 + ], + "sample_count": 32 + }, + { + "pubkey": "9nA8rBZzMDYcD9WeHMacyMPWH6rmcVYNe7dP46HhrC53", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 48931, + 48917, + 49041, + 49013, + 49037, + 49010, + 49030, + 48999, + 49012, + 48955, + 49096, + 49000, + 56884, + 48960, + 48992, + 48832, + 48934, + 49054, + 49200, + 48893, + 49094, + 49021, + 48920, + 49104, + 49088, + 49063, + 49071, + 48911, + 48864, + 48965, + 49121, + 49012 + ], + "sample_count": 32 + }, + { + "pubkey": "8CAvfzMExG5Ct7AGKchGz5oWJQCEPf9djDnmQakAdPw5", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143793000000, + "samples": [ + 52318, + 52356, + 52308, + 52363, + 52322, + 52370, + 52321, + 52355, + 52329, + 52357, + 52367, + 52368, + 52300, + 52350, + 52368, + 52325, + 52320, + 52370, + 52336, + 52332, + 52346, + 52330, + 52342, + 52314, + 52308, + 52342, + 52331, + 52377, + 52337, + 52319, + 52329, + 52327 + ], + "sample_count": 32 + }, + { + "pubkey": "UaUExqkneRAkLkA8beqAka6qhriygU1fnyLVFgyELMh", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 42403, + 43140, + 42506, + 42506, + 42469, + 44524, + 42651, + 42418, + 42418, + 42516, + 42704, + 42456, + 44323, + 42289, + 42553, + 42785, + 42388, + 42569, + 42820, + 42407, + 42463, + 42385, + 42384, + 42258, + 45137, + 42396, + 42454, + 42750, + 42286, + 42428, + 45960, + 42626 + ], + "sample_count": 32 + }, + { + "pubkey": "9vzNaEGFrVtVJrqLdjkVra5wy7QvtZR6APXKQCw2ypqs", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143794000000, + "samples": [ + 38880, + 38884, + 38903, + 38886, + 38973, + 38867, + 38938, + 38870, + 38891, + 38865, + 38881, + 38886, + 38883, + 38881, + 38931, + 38887, + 38908, + 38931, + 38825, + 38910, + 38927, + 38929, + 38870, + 38908, + 38869, + 38923, + 38884, + 38880, + 38871, + 38935, + 38895, + 38884 + ], + "sample_count": 32 + }, + { + "pubkey": "FK9Nw2X3oXs2XDHyoTPfkeQoXUEL6WnVwHroDg8N9E6J", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 260464, + 260198, + 260274, + 260242, + 260338, + 260496, + 260365, + 260413, + 260417, + 260285, + 260266, + 260275, + 260131, + 260179, + 260427, + 260361, + 260304, + 260166, + 260166, + 260457, + 260114, + 260336, + 260336, + 260331, + 260475, + 260529, + 260262, + 260384, + 250832, + 250863, + 251081, + 251029 + ], + "sample_count": 32 + }, + { + "pubkey": "HkwxEcMKATodtyW76xNNC2CLpPJ7ZXj59FMBqzWGvUcd", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143793000000, + "samples": [ + 222260, + 222221, + 222262, + 222265, + 222187, + 222289, + 222175, + 222220, + 222247, + 222260, + 222237, + 222231, + 222218, + 222206, + 222218, + 222226, + 222266, + 222240, + 222175, + 222161, + 222155, + 222196, + 222248, + 222229, + 222193, + 222213, + 222231, + 222210, + 222256, + 222257, + 222229, + 222183 + ], + "sample_count": 32 + }, + { + "pubkey": "9LUK6Mm2KzzZzPPrPP6KPQiGgMoq4zUHtzvH9TdQ4Kjq", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 106508, + 106695, + 106726, + 106717, + 107041, + 107041, + 106578, + 107050, + 106619, + 106678, + 108895, + 106595, + 106595, + 106561, + 106600, + 106568, + 106703, + 106703, + 106637, + 106563, + 106611, + 106526, + 106509, + 106732, + 106522, + 106700, + 106658, + 106587, + 106637, + 106631, + 106581, + 106694 + ], + "sample_count": 32 + }, + { + "pubkey": "8kE7p8dGhvvYzj7wEibGrmczotycZXd5bGQs9sU2HJcC", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143795000000, + "samples": [ + 110796, + 110813, + 110860, + 110891, + 110855, + 110857, + 110792, + 115536, + 115594, + 115549, + 110821, + 110827, + 110807, + 110797, + 110802, + 110847, + 110839, + 110808, + 110806, + 110857, + 110846, + 110848, + 110830, + 110836, + 110814, + 110789, + 110821, + 110800, + 110859, + 110871, + 110797, + 110824 + ], + "sample_count": 32 + }, + { + "pubkey": "839RFYDtKRYVWnEF5FWA4rpwE9GhJV18NZ4jakD6NmJe", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 48730, + 48730, + 48968, + 48616, + 48578, + 48806, + 48772, + 48762, + 48648, + 48642, + 48600, + 48916, + 48484, + 48776, + 48489, + 48675, + 48629, + 48690, + 48690, + 48534, + 48626, + 48737, + 48737, + 48540, + 48961, + 48525, + 48684, + 48844, + 48844, + 48891, + 48753, + 48765 + ], + "sample_count": 32 + }, + { + "pubkey": "3BCXgzPoFYFkij1217Vb6QwGXscL3qiv71VCnNgXstFS", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143797000000, + "samples": [ + 38546, + 38694, + 38666, + 38958, + 38763, + 38590, + 38875, + 38902, + 38908, + 38762, + 38628, + 38727, + 38653, + 38926, + 52712, + 52648, + 52717, + 52671, + 52722, + 52702, + 52689, + 52647, + 52900, + 52895, + 52929, + 52630, + 52877, + 52916, + 52709, + 52889, + 52604, + 52914 + ], + "sample_count": 32 + }, + { + "pubkey": "7ET71Acq7C9wPAsAMZK7eH7vpiQhhEvkvAQTU2R3UfEL", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 109314, + 109915, + 109365, + 109307, + 109462, + 109565, + 109306, + 109351, + 109294, + 109358, + 109465, + 109302, + 109403, + 109555, + 109472, + 109245, + 109643, + 109643, + 109494, + 109612, + 109384, + 109378, + 109326, + 109395, + 109385, + 109385, + 109421, + 109421, + 109616, + 109585, + 109592, + 109487 + ], + "sample_count": 32 + }, + { + "pubkey": "Hxgvv5ySUcg3fCVmVsqCBLxYvxQtyWywRFiQrKkgac1z", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143798000000, + "samples": [ + 94184, + 94173, + 94180, + 94149, + 94161, + 94144, + 94155, + 94189, + 94164, + 94167, + 94160, + 94172, + 94164, + 94185, + 94136, + 94192, + 94144, + 94161, + 94146, + 94146, + 94161, + 94161, + 94178, + 94194, + 94221, + 94190, + 94154, + 94167, + 94186, + 94191, + 94184, + 94202 + ], + "sample_count": 32 + }, + { + "pubkey": "AzyTT26tCiDca14hLPNXJoKt3jkR6GssQnCjA77NAD4o", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 208350, + 208015, + 208422, + 208308, + 208372, + 208536, + 208378, + 208323, + 208323, + 208563, + 208420, + 208549, + 208396, + 208355, + 208340, + 208485, + 208451, + 208573, + 208338, + 208293, + 208552, + 208275, + 208211, + 208569, + 208498, + 208828, + 208260, + 208261, + 208095, + 208514, + 208401, + 208359 + ], + "sample_count": 32 + }, + { + "pubkey": "6AL9Q2N4dZ8JJzUkDqirF2yK7pN2uDQqM5E576CD2LZ6", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143797000000, + "samples": [ + 206184, + 206177, + 206180, + 206150, + 206099, + 206140, + 206197, + 206194, + 206221, + 206199, + 206168, + 206176, + 206153, + 206149, + 206254, + 206134, + 206167, + 206177, + 206235, + 206209, + 206145, + 206124, + 206199, + 206152, + 206137, + 206132, + 206114, + 206191, + 206213, + 206123, + 206115, + 206145 + ], + "sample_count": 32 + }, + { + "pubkey": "AP7zFRCUfuXbRLAsKTeqNs53KgAXhvSet5nq6QENXPqa", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 160754, + 160680, + 160775, + 160707, + 160911, + 160966, + 160920, + 160920, + 160904, + 160965, + 160803, + 162983, + 160745, + 160783, + 161931, + 160745, + 160745, + 160734, + 160777, + 160821, + 160912, + 160912, + 161131, + 160805, + 160860, + 160736, + 160679, + 160729, + 161047, + 160749, + 160969, + 160798 + ], + "sample_count": 32 + }, + { + "pubkey": "3TDibs2cJqPfLktuV8yeJmUStQnxBBk6QGPJGNSSDnKz", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143797000000, + "samples": [ + 148517, + 148487, + 148542, + 148551, + 148544, + 148528, + 148553, + 148540, + 148509, + 148537, + 148517, + 148575, + 148495, + 148504, + 148522, + 148517, + 148502, + 148528, + 148501, + 148555, + 148514, + 148541, + 148495, + 148544, + 148517, + 148488, + 148541, + 148510, + 148494, + 148539, + 148498, + 148536 + ], + "sample_count": 32 + }, + { + "pubkey": "7rFF2QUjctWykCitWxk5uMzEdEAqg6bFDyhvEeSPwrhW", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 94291, + 94364, + 97469, + 97479, + 97672, + 94413, + 97192, + 97562, + 95234, + 97303, + 95367, + 95367, + 94624, + 95192, + 95416, + 95416, + 95450, + 95450, + 95368, + 97279, + 97408, + 95377, + 97517, + 97369, + 97494, + 97679, + 95268, + 95241, + 95333, + 97553, + 95295, + 97304 + ], + "sample_count": 32 + }, + { + "pubkey": "FJBJpD1uKQzCQoNXJSmjf1bphoZ7HCWH4ecrD73deb3", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143799000000, + "samples": [ + 99329, + 99359, + 99367, + 99342, + 99328, + 99346, + 99332, + 99285, + 99324, + 99336, + 99322, + 99338, + 99360, + 99376, + 99365, + 99311, + 99318, + 99361, + 99373, + 99346, + 99341, + 99322, + 99331, + 99337, + 99325, + 99334, + 99320, + 99372, + 99318, + 99322, + 99337, + 99347 + ], + "sample_count": 32 + }, + { + "pubkey": "DQmD7wYT8z5pLyR7iY7NWEPrZBzgE1Qt8oyWhTDZWW9j", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 166010, + 166216, + 165996, + 165811, + 166209, + 166038, + 165933, + 166113, + 166137, + 166137, + 166218, + 166269, + 166144, + 166024, + 166037, + 165991, + 166293, + 166044, + 166118, + 166390, + 165960, + 166054, + 166024, + 166102, + 166003, + 165964, + 173798, + 173704, + 173826, + 173964, + 173963, + 173963 + ], + "sample_count": 32 + }, + { + "pubkey": "8T3aPZtsHRbDFWWwfyQg1GLtYmQP5vCFmeMV5onXTxpz", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143800000000, + "samples": [ + 159315, + 159310, + 159309, + 159295, + 159311, + 159309, + 159314, + 159289, + 159309, + 159317, + 159307, + 159301, + 159314, + 159312, + 159315, + 159303, + 159324, + 159314, + 159315, + 159299, + 159318, + 159342, + 159303, + 159309, + 159316, + 159306, + 159299, + 159330, + 159321, + 159310, + 159316, + 159300 + ], + "sample_count": 32 + }, + { + "pubkey": "GDVWPwLgtf9DkPLpTesXH28hQZsdiEQYaHPAtKqBWLF2", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 93678, + 93626, + 93718, + 93970, + 93970, + 93880, + 93807, + 93884, + 93699, + 93663, + 93906, + 93763, + 93715, + 93629, + 93610, + 93669, + 93669, + 93682, + 93682, + 93785, + 93777, + 93835, + 94078, + 93667, + 93658, + 93658, + 93926, + 93691, + 93921, + 93835, + 93781, + 93808 + ], + "sample_count": 32 + }, + { + "pubkey": "6B17MXDQDwjaD4V39b7R6yNAKYiCWoQ9ZLX2sEE57dbL", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143800000000, + "samples": [ + 87875, + 87800, + 87878, + 87827, + 87859, + 87830, + 87855, + 87820, + 83244, + 87853, + 87832, + 87809, + 87886, + 87858, + 87811, + 87832, + 87894, + 87864, + 87796, + 87794, + 87845, + 87868, + 87886, + 87838, + 87848, + 87844, + 87838, + 87860, + 87842, + 87869, + 87818, + 87846 + ], + "sample_count": 32 + }, + { + "pubkey": "26sa1AnPtLoDRHcF6ghbMr5WetWwsKN96RtFS8GCGzGR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 76456, + 76536, + 76886, + 76908, + 76908, + 76456, + 76440, + 76472, + 76679, + 76683, + 76459, + 76535, + 76433, + 76433, + 76422, + 76652, + 76236, + 76569, + 76442, + 76543, + 76456, + 76414, + 76430, + 76510, + 76510, + 76583, + 76570, + 76473, + 76473, + 76493, + 76389, + 76545 + ], + "sample_count": 32 + }, + { + "pubkey": "JB9QRY1wvpMgeVWab34jBknw7goEdPzGqeX2sKVDS8sn", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143792000000, + "samples": [ + 15869, + 15853, + 15852, + 15889, + 15883, + 15859, + 15831, + 15849, + 15875, + 15874, + 15872, + 15856, + 15860, + 15877, + 15871, + 15866, + 15853, + 15875, + 15866, + 15874, + 15857, + 15880, + 15876, + 15869, + 15861, + 15871, + 15879, + 15846, + 15886, + 15849, + 15867, + 15888 + ], + "sample_count": 32 + }, + { + "pubkey": "DNU8ihU3CHyu1dNrt8Qn91CHWz9QpywEH4kfgtbDdLbC", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 34205, + 37300, + 34267, + 34267, + 34969, + 36308, + 34271, + 34175, + 34260, + 34326, + 34750, + 34299, + 34362, + 34166, + 35570, + 34825, + 34150, + 34390, + 34194, + 34149, + 34230, + 34267, + 34199, + 34831, + 34869, + 34380, + 36737, + 34412, + 34266, + 34315, + 34315, + 35040 + ], + "sample_count": 32 + }, + { + "pubkey": "35JWGfUYskHYJBQTSVqt5JbSeH5qY7dM7pyvoxAKXkPW", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143794000000, + "samples": [ + 31239, + 31263, + 31219, + 31282, + 31251, + 31271, + 31266, + 31249, + 31268, + 31246, + 31274, + 31261, + 31294, + 31245, + 31213, + 31229, + 31249, + 31236, + 31251, + 31259, + 31260, + 31247, + 31242, + 31207, + 31263, + 31254, + 31208, + 31268, + 31223, + 31237, + 31251, + 30729 + ], + "sample_count": 32 + }, + { + "pubkey": "4Vb2RoQ7fM91kTdpnPZUAzATsQnBK5DaK3vXWVsoUtz1", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 131026, + 131088, + 131032, + 131092, + 131219, + 130878, + 131180, + 131224, + 131150, + 131207, + 131006, + 131073, + 131157, + 131157, + 131467, + 131158, + 131062, + 131062, + 131617, + 131099, + 131217, + 130991, + 131063, + 130981, + 130929, + 131113, + 131337, + 131449, + 131056, + 131168, + 131302, + 131064 + ], + "sample_count": 32 + }, + { + "pubkey": "2T8THmk5sThjDC3pA2JYCUTtDzYHAuBfuZbrXigdmqFA", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143796000000, + "samples": [ + 160366, + 160399, + 160520, + 160405, + 160336, + 160405, + 160505, + 160463, + 160433, + 160502, + 160499, + 160441, + 160391, + 160558, + 171562, + 171490, + 171644, + 171685, + 171529, + 171562, + 171488, + 171618, + 171543, + 171611, + 171785, + 171698, + 171656, + 171645, + 171900, + 171867, + 171794, + 171509 + ], + "sample_count": 32 + }, + { + "pubkey": "CNrAC9mKYQZwJCAYXakxQzCcxWsc82mBZPKwDgYrQX1k", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 161620, + 161713, + 161746, + 161575, + 161448, + 161652, + 161592, + 161796, + 161796, + 161703, + 161531, + 162207, + 161791, + 161609, + 161704, + 161704, + 161692, + 161726, + 161732, + 161855, + 161801, + 161847, + 161644, + 161563, + 161481, + 161816, + 161542, + 162131, + 165409, + 165409, + 165312, + 165313 + ], + "sample_count": 32 + }, + { + "pubkey": "E9mYgchJ2n4wYPrFZPQVsNZ8oUNFJFCGMi9xu4EiykFx", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143793000000, + "samples": [ + 142822, + 142963, + 142932, + 142895, + 142938, + 142935, + 142940, + 142969, + 142876, + 142861, + 142881, + 142858, + 142855, + 142858, + 142816, + 142920, + 142884, + 142884, + 142830, + 142829, + 142869, + 142887, + 142886, + 142971, + 142890, + 142912, + 142858, + 142944, + 142961, + 142863, + 142880, + 142945 + ], + "sample_count": 32 + }, + { + "pubkey": "A3KgXvRBE1eUZG8B6CBj9ZcWhmUnu6aLUm1MLZcwvhNH", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 50470, + 50480, + 50343, + 50279, + 50453, + 50622, + 50616, + 52066, + 50628, + 50232, + 50326, + 50284, + 50445, + 50232, + 50228, + 50524, + 50312, + 50400, + 50523, + 50354, + 50350, + 50356, + 50209, + 50249, + 50249, + 50547, + 50637, + 50526, + 50454, + 50430, + 50318, + 50464 + ], + "sample_count": 32 + }, + { + "pubkey": "84hiVqbts4KpC9XmPzHgzLoGUPxfBB1wAaGWYqwEpp8f", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143795000000, + "samples": [ + 52235, + 52301, + 52294, + 52290, + 52248, + 52182, + 52228, + 52274, + 52201, + 52294, + 52226, + 52254, + 52280, + 52223, + 52272, + 52243, + 52316, + 52263, + 52230, + 52269, + 52228, + 52264, + 52272, + 52223, + 52263, + 52280, + 52279, + 52235, + 52184, + 52266, + 52194, + 52238 + ], + "sample_count": 32 + }, + { + "pubkey": "6npsCmSpGDf3rrqFQEWVA53QMWMHty5AgSchkjt3Kx2B", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 60413, + 61003, + 61003, + 60817, + 60577, + 63470, + 60664, + 60852, + 60539, + 60558, + 60558, + 60770, + 60770, + 60735, + 60735, + 60591, + 60784, + 60785, + 60865, + 60798, + 60604, + 60588, + 60591, + 60769, + 60673, + 60554, + 60589, + 60629, + 60629, + 60466, + 63694, + 63694 + ], + "sample_count": 32 + }, + { + "pubkey": "DjeVM4fTGRqCiWtAXL7KqBkrFDXfEUm1khm4iocA7Gy1", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143796000000, + "samples": [ + 59238, + 59229, + 59256, + 59210, + 59203, + 59242, + 59213, + 59251, + 59231, + 59216, + 59234, + 59258, + 59240, + 59233, + 59208, + 59126, + 59210, + 59217, + 59240, + 59245, + 59214, + 59226, + 59241, + 59220, + 59201, + 59248, + 59214, + 59208, + 59048, + 59254, + 59238, + 59238 + ], + "sample_count": 32 + }, + { + "pubkey": "6qoHV3i8mczyFCbxpoHxkrBEot13TGqJP7624idXbYYZ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 106699, + 116095, + 106647, + 106688, + 106756, + 106685, + 107401, + 115917, + 107075, + 106728, + 114347, + 106757, + 106677, + 115948, + 107710, + 107860, + 110917, + 108079, + 106596, + 115612, + 107086, + 106948, + 106948, + 110143, + 106620, + 106607, + 117769, + 108729, + 106904, + 110916, + 107484, + 106751 + ], + "sample_count": 32 + }, + { + "pubkey": "7FD4oxpXETGB4uLDGBPixGLp97vLcg85RTNc2vJCwNNw", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143455000000, + "samples": [ + 93225, + 93207, + 93269, + 93260, + 93252, + 93229, + 93262, + 93287, + 93238, + 93252, + 93250, + 93206, + 93224, + 93266, + 93239, + 93239, + 93187, + 93242, + 93258, + 93256, + 93208, + 93213, + 93220, + 93264, + 93244, + 93238, + 93223, + 93221, + 93256, + 93256, + 93244, + 93189 + ], + "sample_count": 32 + }, + { + "pubkey": "9o3EtDMenAEhKfSuD5sX4R7jP4sawtditcAQp4hYf9TR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 90839, + 91422, + 90608, + 90753, + 90773, + 90804, + 90878, + 90878, + 90700, + 90802, + 90797, + 90807, + 90861, + 90701, + 90883, + 90723, + 90856, + 90992, + 90839, + 90819, + 91123, + 90872, + 90787, + 90904, + 90840, + 91088, + 91020, + 90976, + 90806, + 90723, + 90661, + 90952 + ], + "sample_count": 32 + }, + { + "pubkey": "LcLkWbmbASdFsAHThyiaq2tueCtcdCBipNartpfgBRw", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143455000000, + "samples": [ + 98006, + 97991, + 97990, + 98029, + 97969, + 98052, + 98018, + 98015, + 98008, + 98004, + 97972, + 97979, + 97980, + 97980, + 97978, + 98002, + 97988, + 98034, + 97954, + 98009, + 97992, + 97942, + 98000, + 98023, + 98029, + 97990, + 97987, + 97965, + 98012, + 98002, + 97979, + 97989 + ], + "sample_count": 32 + }, + { + "pubkey": "86R7et3xozdhjcNoB1rhz9cFKNTftkm7B6Thn1FTo6vj", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 17425, + 17425, + 17558, + 17558, + 17285, + 17301, + 17476, + 17542, + 17291, + 17351, + 17317, + 17247, + 17663, + 17344, + 17183, + 17897, + 17408, + 17382, + 17456, + 17244, + 17231, + 17478, + 17587, + 17587, + 17371, + 17516, + 17516, + 17398, + 17224, + 17378, + 17390, + 17246 + ], + "sample_count": 32 + }, + { + "pubkey": "6CZkotbxj3MzoLUQGBs1QVj2BiASkhUKNKwsM2sfovsy", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143454000000, + "samples": [ + 20557, + 20499, + 20559, + 20508, + 20497, + 20511, + 20609, + 20493, + 20504, + 20521, + 20472, + 20511, + 20481, + 20509, + 20493, + 20532, + 20524, + 20540, + 20512, + 20545, + 20505, + 20458, + 20515, + 20536, + 20539, + 20544, + 20495, + 20502, + 20540, + 20511, + 20477, + 20502 + ], + "sample_count": 32 + }, + { + "pubkey": "3fPbQ1bQN6Ndv99qkodWRqeayJiU3z9NmvdT311FjUHi", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 46709, + 47160, + 46900, + 46885, + 46722, + 46763, + 46563, + 46764, + 46744, + 46776, + 46729, + 46703, + 46778, + 46566, + 46646, + 46767, + 46814, + 46678, + 46715, + 46715, + 46751, + 46682, + 46670, + 48951, + 46765, + 46728, + 46875, + 46817, + 46735, + 46644, + 46959, + 46755 + ], + "sample_count": 32 + }, + { + "pubkey": "8aCkcMgTPLdJk8LGSefc5zjusRkPjXz9TjdwnPDYzuVh", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143450000000, + "samples": [ + 40040, + 40019, + 39986, + 39977, + 40005, + 40022, + 40037, + 37379, + 37397, + 39965, + 40007, + 39947, + 39988, + 39944, + 40031, + 40016, + 39987, + 37412, + 37344, + 37405, + 37359, + 37338, + 37378, + 37416, + 37377, + 37389, + 37359, + 37361, + 37415, + 37384, + 37419, + 37358 + ], + "sample_count": 32 + }, + { + "pubkey": "3DzvLkVW9xXWZLYVxhvUceeQArwD1Ze13zRCn2t34w2C", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 24015, + 24444, + 24480, + 24179, + 26505, + 24330, + 24187, + 24222, + 24181, + 24143, + 24285, + 24136, + 24221, + 25305, + 24113, + 24170, + 24242, + 25103, + 25103, + 24959, + 24120, + 24116, + 24055, + 24573, + 24149, + 24238, + 24296, + 24185, + 24136, + 26849, + 24209, + 24178 + ], + "sample_count": 32 + }, + { + "pubkey": "H2JHkJhE5vjBva3omHe3XZTz3JBAwbmxrd5HLJs96yJf", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143451000000, + "samples": [ + 24338, + 24355, + 24351, + 24331, + 24369, + 24330, + 24342, + 24377, + 24324, + 24281, + 24366, + 24325, + 24253, + 24359, + 24344, + 24358, + 24284, + 24296, + 24333, + 24291, + 24325, + 24339, + 24354, + 24341, + 24348, + 24372, + 24344, + 24342, + 24337, + 24296, + 24323, + 24302 + ], + "sample_count": 32 + }, + { + "pubkey": "7yAVjinkDEab2wgbyurrmKVJckZ31xGGJCuQqdVSfzXa", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 277466, + 277635, + 277649, + 277649, + 277510, + 277624, + 277499, + 242001, + 242012, + 242276, + 242276, + 241978, + 242386, + 242300, + 242300, + 241929, + 242053, + 242142, + 241838, + 242100, + 242100, + 244303, + 244303, + 244186, + 244063, + 244279, + 244254, + 244286, + 244012, + 244307, + 244051, + 244311 + ], + "sample_count": 32 + }, + { + "pubkey": "EiaSmD2mfXdh31er2j4mT8ySvx7u1Vb7VTQRcRMQPgQJ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143450000000, + "samples": [ + 225823, + 225672, + 225847, + 225815, + 225767, + 225806, + 225792, + 225765, + 225769, + 225765, + 225781, + 225673, + 225828, + 225723, + 225764, + 225825, + 225741, + 225845, + 225715, + 225807, + 225800, + 225766, + 225742, + 225739, + 225769, + 225754, + 225727, + 225773, + 225785, + 225815, + 225779, + 225650 + ], + "sample_count": 32 + }, + { + "pubkey": "CAUigKLpLkDP6BwvBTFneXdHZr3SZdSQd6x6ciwnPq8W", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 39518, + 39691, + 39463, + 39503, + 39554, + 39554, + 39558, + 34706, + 35175, + 34703, + 34752, + 34830, + 34754, + 34842, + 34888, + 34830, + 34801, + 34763, + 34758, + 34619, + 34783, + 34700, + 34774, + 34796, + 34670, + 35126, + 34927, + 34927, + 34807, + 34914, + 34775, + 34792 + ], + "sample_count": 32 + }, + { + "pubkey": "DH4nG7enYce1edkmg7PpHzawy32FpCkEz1nd7A56Cx3v", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143453000000, + "samples": [ + 37546, + 37276, + 37525, + 37339, + 37360, + 37368, + 37576, + 35517, + 35493, + 37403, + 37526, + 37329, + 37271, + 37424, + 37326, + 37252, + 37545, + 35566, + 35615, + 35640, + 35547, + 35760, + 35689, + 35424, + 35513, + 35679, + 35752, + 35730, + 35469, + 35737, + 35758, + 35508 + ], + "sample_count": 32 + }, + { + "pubkey": "7CuZvHLe8h5PZopi2cib1EA63vyTDxawWMxeyNLHmwmN", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 104651, + 104407, + 104607, + 104529, + 104852, + 104565, + 104604, + 104583, + 104698, + 104651, + 105179, + 104586, + 104564, + 105009, + 104687, + 104579, + 104592, + 104464, + 104534, + 104628, + 104727, + 104589, + 104494, + 104584, + 104584, + 104550, + 104749, + 104475, + 104592, + 104551, + 104600, + 104880 + ], + "sample_count": 32 + }, + { + "pubkey": "EhMvF8zT7mNoBmMh973DJc756giV7MaJYXqAjermkjFt", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143454000000, + "samples": [ + 100130, + 100059, + 100159, + 100131, + 100123, + 100137, + 100113, + 100118, + 100133, + 100151, + 100114, + 100004, + 100120, + 100118, + 100112, + 100077, + 100083, + 100137, + 100087, + 100123, + 100109, + 100057, + 100148, + 100139, + 100135, + 100100, + 100145, + 100172, + 100140, + 100135, + 100137, + 100033 + ], + "sample_count": 32 + }, + { + "pubkey": "2CM1yThN6uY6yrUb9SMnKufbx4SzTUmy3EfX3bZbvJhQ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 207214, + 207214, + 207660, + 207369, + 209548, + 209548, + 207475, + 207220, + 207789, + 207422, + 207422, + 207243, + 207579, + 207480, + 207573, + 207694, + 207592, + 206728, + 216599, + 207530, + 207530, + 207551, + 207459, + 207646, + 203672, + 207895, + 207553, + 207415, + 207467, + 207470, + 207490, + 207501 + ], + "sample_count": 32 + }, + { + "pubkey": "HRHorPzJtJkjraEEQC7u9bjd2mxhUoB13LzurmonqBQX", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143453000000, + "samples": [ + 201767, + 201678, + 201714, + 201748, + 201737, + 201764, + 201693, + 201788, + 201683, + 201809, + 201727, + 201590, + 201729, + 201752, + 201682, + 201748, + 201716, + 201767, + 201753, + 201737, + 201785, + 201594, + 201776, + 201707, + 201833, + 201750, + 201640, + 201745, + 201719, + 201738, + 201758, + 201598 + ], + "sample_count": 32 + }, + { + "pubkey": "9MVaEEnwzkV93jLq3QWfhh7gRPHM7V9odB6XeFRXWD3X", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 148241, + 148265, + 148156, + 148362, + 148076, + 148449, + 148363, + 148244, + 148240, + 148240, + 148476, + 148804, + 148330, + 148087, + 148753, + 149273, + 148352, + 148467, + 148388, + 148405, + 148338, + 148479, + 148345, + 148299, + 148279, + 148341, + 148374, + 148255, + 148245, + 148204, + 148869, + 148869 + ], + "sample_count": 32 + }, + { + "pubkey": "3hPuBQVYe3rNT61cecm8wownQMbkHMYprk95AJguU5ej", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143453000000, + "samples": [ + 134378, + 134305, + 134371, + 134356, + 134391, + 134406, + 134361, + 134442, + 134417, + 134366, + 134384, + 134304, + 134401, + 134403, + 134387, + 134363, + 134397, + 134408, + 134404, + 134370, + 134384, + 134321, + 134386, + 134337, + 134379, + 134353, + 134347, + 134385, + 134388, + 134375, + 134389, + 134286 + ], + "sample_count": 32 + }, + { + "pubkey": "4j9Rrozb5ra1f7ajx6JsdiWfivpUqht4GpXDV9UyA81P", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 89848, + 89827, + 89835, + 89845, + 89845, + 89710, + 89817, + 90034, + 89885, + 89836, + 89786, + 89738, + 89928, + 89939, + 89984, + 90059, + 89774, + 90079, + 89836, + 89753, + 89902, + 89768, + 89683, + 89890, + 89963, + 89790, + 89606, + 89985, + 89870, + 89732, + 89813, + 89787 + ], + "sample_count": 32 + }, + { + "pubkey": "6UGLFVpkmFeiwve3uERUE8mMzEr92zaVvmFyKE5xgoes", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143456000000, + "samples": [ + 88425, + 88343, + 88410, + 88400, + 88356, + 88391, + 88387, + 88437, + 88395, + 88399, + 88427, + 88357, + 88388, + 88409, + 88415, + 88399, + 88377, + 88416, + 88425, + 88380, + 88395, + 88340, + 88366, + 88388, + 88422, + 88426, + 88376, + 88382, + 88423, + 88396, + 88409, + 88340 + ], + "sample_count": 32 + }, + { + "pubkey": "EmV3Co6R999fRdbzP5K4nsviiXse8H7cq58rfVRfBEii", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 146590, + 147420, + 146673, + 146679, + 146704, + 146600, + 146629, + 146563, + 146612, + 146511, + 146862, + 146787, + 146564, + 146799, + 146615, + 146649, + 146599, + 146792, + 146609, + 146730, + 146599, + 146704, + 146747, + 146614, + 146565, + 146613, + 146681, + 146693, + 146719, + 146890, + 146683, + 146746 + ], + "sample_count": 32 + }, + { + "pubkey": "Gvn6TDACk9cuX9KbcyjTHF2ocduTr84xpoxmzGdy9jcJ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143456000000, + "samples": [ + 146656, + 146609, + 146688, + 146701, + 146665, + 146705, + 146639, + 146671, + 146642, + 146678, + 146650, + 146605, + 146699, + 146654, + 146685, + 146704, + 146628, + 146676, + 146680, + 146625, + 146683, + 146589, + 146660, + 146667, + 146678, + 146664, + 146658, + 146664, + 146675, + 146697, + 146694, + 146646 + ], + "sample_count": 32 + }, + { + "pubkey": "HHSEpP6AxUucSNq6y2GsohxBg3hwBGYFntgSzFsoEVsd", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 91918, + 91985, + 91850, + 92063, + 91958, + 91850, + 91888, + 92287, + 91989, + 91824, + 91817, + 91896, + 91921, + 91986, + 91922, + 91863, + 92029, + 91944, + 91998, + 91954, + 91954, + 91962, + 92080, + 92080, + 91877, + 92091, + 91908, + 92018, + 91909, + 91909, + 91951, + 91979 + ], + "sample_count": 32 + }, + { + "pubkey": "HvZkMWziJYUsgC2WCjjRdaX19VZ88AbpfQyYFw3Zgys2", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143456000000, + "samples": [ + 82817, + 82851, + 82780, + 82881, + 82835, + 82838, + 82877, + 82919, + 82815, + 82894, + 82813, + 82765, + 82779, + 82838, + 82852, + 82786, + 82921, + 82802, + 82781, + 82801, + 82805, + 82856, + 82810, + 82848, + 82825, + 82838, + 82798, + 82831, + 82826, + 82826, + 82829, + 82729 + ], + "sample_count": 32 + }, + { + "pubkey": "FYvXSwak4VET1hy6rxmrrfnbK6YLz9bUpRpcnXJoiuHy", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 24966, + 24995, + 25018, + 24991, + 25635, + 25025, + 24965, + 24994, + 24990, + 24954, + 24954, + 25052, + 25253, + 25054, + 25151, + 25179, + 25009, + 26052, + 24946, + 24972, + 25105, + 24970, + 24926, + 25113, + 25384, + 25005, + 25180, + 25056, + 25027, + 25011, + 25104, + 25018 + ], + "sample_count": 32 + }, + { + "pubkey": "EcU1nZhjWGvuoo5T8NvtYh67jvWUppXu3W7SqQsix2cy", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143451000000, + "samples": [ + 21572, + 21518, + 21559, + 21549, + 21526, + 21519, + 21625, + 20071, + 20042, + 21516, + 21586, + 21529, + 21572, + 21517, + 21564, + 21578, + 21577, + 20054, + 20076, + 20067, + 20025, + 20102, + 20089, + 20036, + 20050, + 20037, + 20126, + 20094, + 20052, + 20068, + 20079, + 20024 + ], + "sample_count": 32 + }, + { + "pubkey": "6xhmSAbAAtb8v21VfhDGmQQmuVNGtLD7sPoTiuJ6QHre", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 129107, + 129534, + 129352, + 129441, + 129196, + 129377, + 129452, + 130020, + 130020, + 129187, + 130265, + 129746, + 129418, + 129318, + 129566, + 129566, + 129427, + 129335, + 129828, + 129332, + 129172, + 129222, + 129222, + 129189, + 129267, + 129469, + 129330, + 129279, + 129781, + 129359, + 129284, + 130368 + ], + "sample_count": 32 + }, + { + "pubkey": "36c3PEyi9owyJTgx1kgvp4hFyzBSFEoTtupdYGymx591", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143452000000, + "samples": [ + 131340, + 131192, + 131320, + 131384, + 131344, + 131327, + 131273, + 131361, + 131410, + 131377, + 131371, + 131122, + 131374, + 131344, + 131315, + 131291, + 131378, + 131260, + 131386, + 131335, + 131276, + 131260, + 131340, + 131289, + 131338, + 131386, + 131285, + 131286, + 131330, + 131298, + 131309, + 131327 + ], + "sample_count": 32 + }, + { + "pubkey": "3teSCSQbUAYfrHfPDxEzmgjcKewP5baXZULBiedJwYEW", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 154590, + 194827, + 155013, + 154643, + 155051, + 154617, + 145856, + 146630, + 146210, + 145931, + 146130, + 146141, + 145880, + 146299, + 146210, + 146046, + 145920, + 146205, + 145907, + 146241, + 146104, + 145912, + 145998, + 146495, + 146079, + 146079, + 146595, + 145970, + 146470, + 146576, + 146242, + 145944 + ], + "sample_count": 32 + }, + { + "pubkey": "FVUQu6YKecUASnhz6rmK1kN3WgBtmpaLUeRwfntSYXY1", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143449000000, + "samples": [ + 147307, + 147223, + 147174, + 147266, + 147297, + 147195, + 147273, + 147208, + 147218, + 147217, + 147237, + 147237, + 147177, + 147159, + 147366, + 147227, + 147193, + 147249, + 147132, + 147218, + 147275, + 147123, + 147255, + 147288, + 147190, + 147236, + 147218, + 147245, + 147258, + 147175, + 147252, + 147141 + ], + "sample_count": 32 + }, + { + "pubkey": "3rWFs2xWjnoRmkeQ9Tnz6gknL5w6d87TzcDdNaqvhz13", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 49717, + 49775, + 50047, + 50047, + 49779, + 52032, + 49831, + 49737, + 49899, + 49994, + 49688, + 49688, + 50471, + 50053, + 50089, + 50089, + 49887, + 49770, + 49953, + 49953, + 49937, + 49827, + 49702, + 49852, + 50035, + 49705, + 50463, + 49805, + 49900, + 50870, + 50325, + 49732 + ], + "sample_count": 32 + }, + { + "pubkey": "DmHBrBTvjXcWkfS1v9msQNeHTQoyQwrai2UhUA5WGddF", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143451000000, + "samples": [ + 41291, + 41273, + 41275, + 41307, + 41315, + 41292, + 41347, + 41240, + 41267, + 41344, + 41207, + 41284, + 41298, + 41328, + 41364, + 41212, + 41273, + 41342, + 41300, + 41319, + 41306, + 41337, + 41260, + 41286, + 41261, + 41297, + 41345, + 41300, + 41284, + 41329, + 41393, + 41245 + ], + "sample_count": 32 + }, + { + "pubkey": "HJjrcqTpGqTLEovE9CBWVAZXEZmdLz6mbmRE2nzBKLbc", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 43426, + 43917, + 43724, + 43616, + 43589, + 44079, + 44841, + 45356, + 43450, + 43738, + 43836, + 43836, + 43460, + 43662, + 43602, + 44999, + 44999, + 43663, + 45490, + 44895, + 44800, + 45698, + 45113, + 44751, + 45215, + 45313, + 43429, + 43429, + 46713, + 43832, + 43906, + 43906 + ], + "sample_count": 32 + }, + { + "pubkey": "3QYjj7GVsxRpo2vG3tejG4MeuqYXG39FNEC1LWGgSk5p", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143452000000, + "samples": [ + 46970, + 46980, + 46940, + 46947, + 46936, + 46924, + 46966, + 45441, + 45434, + 46916, + 46925, + 46925, + 46804, + 46937, + 46973, + 46917, + 46944, + 45433, + 45419, + 45412, + 45401, + 45418, + 45386, + 45395, + 45453, + 45433, + 45495, + 45443, + 45454, + 45426, + 45427, + 45423 + ], + "sample_count": 32 + }, + { + "pubkey": "6zbBLRdfbWh1vWWp6VyoWZPxTadhNqpnXgBvqoDtWx4s", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 116134, + 128751, + 116255, + 115613, + 115613, + 123640, + 120719, + 124646, + 126167, + 116551, + 117854, + 127846, + 122734, + 117259, + 128609, + 115682, + 115429, + 115429, + 126458, + 115771, + 119927, + 132256, + 115611, + 116786, + 128193, + 115718, + 115525, + 130147, + 130147, + 121598, + 120258, + 127117 + ], + "sample_count": 32 + }, + { + "pubkey": "5pzVBr9V5aQtyN43Ta9fY9qE8Ke1YGpP6FkZd2AyqYHR", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143481000000, + "samples": [ + 97915, + 97862, + 97895, + 97884, + 97898, + 97882, + 97853, + 97929, + 97915, + 97882, + 97914, + 97857, + 97895, + 97918, + 97916, + 97903, + 97879, + 97913, + 97928, + 97930, + 97901, + 97850, + 97899, + 97925, + 97894, + 97940, + 97861, + 97921, + 97927, + 97912, + 97932, + 97857 + ], + "sample_count": 32 + }, + { + "pubkey": "CV2PumRDyy3CqkbNUYfUP75vrX57Vkb5TZ2ZZDMdHPKf", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 97713, + 97989, + 97776, + 97669, + 98015, + 97744, + 97720, + 100101, + 97880, + 97732, + 98051, + 98051, + 97819, + 98637, + 99007, + 97710, + 97598, + 99282, + 97901, + 97895, + 98127, + 98051, + 97807, + 98146, + 97841, + 97803, + 98763, + 97826, + 97658, + 98415, + 97955, + 97725 + ], + "sample_count": 32 + }, + { + "pubkey": "6xwkJwpT4ST7wsodT7EZRkCiv6nvPyf5YMjD34Zj2AXt", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143480000000, + "samples": [ + 95264, + 95247, + 95259, + 95249, + 95282, + 95242, + 95222, + 95289, + 95237, + 95280, + 95266, + 95212, + 95289, + 95271, + 95243, + 95263, + 95220, + 95247, + 95266, + 95244, + 95217, + 95239, + 95250, + 95260, + 95267, + 95297, + 95238, + 95281, + 95292, + 95260, + 95273, + 95218 + ], + "sample_count": 32 + }, + { + "pubkey": "9M67W2516NfdcWbPUWBB9JhtSRheLTMmJxg1S9vEA1dh", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 11777, + 12176, + 11994, + 12862, + 12354, + 12121, + 11890, + 12173, + 11991, + 11771, + 12167, + 12490, + 11901, + 12415, + 12359, + 12114, + 12625, + 12015, + 12805, + 12403, + 36534, + 11927, + 12281, + 12076, + 11950, + 12321, + 16007, + 12016, + 12128, + 11986, + 11896, + 12206 + ], + "sample_count": 32 + }, + { + "pubkey": "38roYrxibAyPBYJFXgBn34mfZy6hz9BxABJo2ApvNViS", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143480000000, + "samples": [ + 9814, + 9878, + 9897, + 9822, + 9854, + 9878, + 9834, + 9917, + 9883, + 9850, + 9864, + 9882, + 9879, + 9916, + 9867, + 9818, + 9842, + 9903, + 9864, + 9856, + 9810, + 9817, + 9866, + 9884, + 9855, + 9840, + 9808, + 9888, + 9865, + 9846, + 9877, + 9864 + ], + "sample_count": 32 + }, + { + "pubkey": "HniKJptBShW9bN3ysQDyCzVGVqZicoKJu3U5wjmhSnGo", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 34029, + 34107, + 34148, + 34132, + 34340, + 34100, + 34036, + 34237, + 34025, + 33969, + 33969, + 34259, + 34005, + 33885, + 34229, + 34006, + 34050, + 34407, + 33962, + 34278, + 34296, + 33960, + 33979, + 34395, + 34091, + 33997, + 34238, + 34045, + 33910, + 34746, + 34389, + 34389 + ], + "sample_count": 32 + }, + { + "pubkey": "35S1WaoqGEiKyPxeEQJBqeyHkKmBcXYSVAYXdyZrHn9F", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143476000000, + "samples": [ + 25982, + 25903, + 25931, + 25879, + 25924, + 25927, + 25895, + 25921, + 25935, + 25913, + 25943, + 25905, + 25950, + 25950, + 25912, + 25952, + 25883, + 25917, + 25878, + 25908, + 25951, + 25952, + 25918, + 25869, + 25942, + 25940, + 25958, + 25927, + 25897, + 25949, + 25965, + 25887 + ], + "sample_count": 32 + }, + { + "pubkey": "GRoNovFpvJzGPyBu2w1Y7wcqbmqgThzuzCKVzUE1H4ad", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 26776, + 29641, + 27179, + 27001, + 27351, + 26976, + 26924, + 28169, + 26882, + 26758, + 28433, + 26931, + 26771, + 27117, + 27043, + 26701, + 26701, + 27270, + 28762, + 26774, + 28647, + 26996, + 26780, + 26780, + 28803, + 26900, + 26847, + 27381, + 27205, + 26952, + 27513, + 27430 + ], + "sample_count": 32 + }, + { + "pubkey": "4V1MrHAG8rEniUKRPxVffLo6LtqVLYJQFReeNikMqqjn", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143477000000, + "samples": [ + 7685, + 7690, + 7742, + 7702, + 7682, + 7728, + 7711, + 7673, + 7703, + 7734, + 7782, + 7726, + 7731, + 7741, + 7715, + 7687, + 7712, + 7733, + 7702, + 7703, + 7693, + 7669, + 7713, + 7669, + 7743, + 7664, + 7761, + 7733, + 7752, + 7726, + 7746, + 7748 + ], + "sample_count": 32 + }, + { + "pubkey": "6yZrhRaW8f5evCPEPTTCSkbyBhzEP7fsDXFy6CvbhRZX", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 268224, + 268538, + 265420, + 268188, + 266465, + 268478, + 266034, + 266396, + 266363, + 266179, + 291209, + 268266, + 266219, + 268445, + 266331, + 266428, + 268887, + 266494, + 268234, + 266766, + 266447, + 268243, + 266714, + 268616, + 268501, + 266919, + 268547, + 265277, + 265575, + 268974, + 268305, + 268305 + ], + "sample_count": 32 + }, + { + "pubkey": "7XGwLHRScwpH2KXReGmMymnwZfxYTBadZ39wtZKJUVMu", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143476000000, + "samples": [ + 225906, + 225781, + 225837, + 225796, + 225812, + 225808, + 225770, + 224436, + 224445, + 225860, + 225882, + 225756, + 225807, + 225844, + 225783, + 225842, + 225791, + 224393, + 224472, + 224424, + 224423, + 224344, + 224440, + 224461, + 224371, + 224411, + 224377, + 224487, + 224489, + 224396, + 224510, + 224345 + ], + "sample_count": 32 + }, + { + "pubkey": "GZth4AWVJmLstXNRKXNy6pj3z2nK85vJyGiZgseGQFfN", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 24824, + 25344, + 25318, + 24952, + 24952, + 25169, + 25032, + 24685, + 25038, + 25033, + 25033, + 24986, + 25253, + 25036, + 25162, + 25195, + 24979, + 24979, + 24814, + 25627, + 25032, + 25005, + 25370, + 27598, + 24760, + 25199, + 25288, + 25035, + 25218, + 25122, + 25203, + 25436 + ], + "sample_count": 32 + }, + { + "pubkey": "FRVaQuDptamkjCsF6ALzBspEq1YM2Tw5sPZt77vCdmby", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143479000000, + "samples": [ + 23122, + 22840, + 23109, + 23045, + 22803, + 22852, + 23127, + 23090, + 22982, + 22968, + 22998, + 22978, + 23137, + 23019, + 23117, + 23078, + 23099, + 22857, + 23030, + 22805, + 23110, + 22991, + 23102, + 23077, + 23045, + 23123, + 22971, + 22882, + 22899, + 22835, + 22944, + 23074 + ], + "sample_count": 32 + }, + { + "pubkey": "HdovA1g5SUbzakKpxLRbbKz3wnAL47LawDN56su9tdkP", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 110247, + 111440, + 110512, + 110281, + 110954, + 110548, + 110309, + 110309, + 110767, + 110573, + 110190, + 110550, + 110515, + 110376, + 110693, + 110455, + 110520, + 111022, + 111022, + 110364, + 110364, + 110353, + 111484, + 110526, + 110291, + 112098, + 110450, + 110527, + 110676, + 110554, + 110435, + 110779 + ], + "sample_count": 32 + }, + { + "pubkey": "DZGGWoXquzGD9iLVKLkd4NJMf2sP3zftTGAwb82A5QqB", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143480000000, + "samples": [ + 103309, + 103249, + 103347, + 103326, + 103314, + 103236, + 103274, + 103337, + 103303, + 103251, + 103276, + 103264, + 103237, + 103266, + 103359, + 103242, + 103271, + 103315, + 103295, + 103254, + 103301, + 103293, + 103251, + 103386, + 103299, + 103278, + 103217, + 103349, + 103238, + 103256, + 103285, + 103254 + ], + "sample_count": 32 + }, + { + "pubkey": "1g7GXwdJxJbwN2ShoS4w2ds5vcshXgUcbdeKURfbibY", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 200937, + 201802, + 201452, + 201271, + 201485, + 201485, + 201474, + 201347, + 201799, + 201649, + 201332, + 201765, + 201071, + 201188, + 202445, + 201540, + 201024, + 202352, + 201652, + 201316, + 202667, + 239131, + 201150, + 201571, + 201571, + 201508, + 201508, + 201183, + 201871, + 201497, + 201497, + 201084 + ], + "sample_count": 32 + }, + { + "pubkey": "FF4gc7VMJCQhaxBZxkLXbQzALW2Ao7UY5XVHK9Uda614", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143479000000, + "samples": [ + 197087, + 196898, + 197089, + 197148, + 197134, + 197073, + 196977, + 197059, + 197081, + 197132, + 197128, + 196957, + 197108, + 197103, + 197130, + 197074, + 197060, + 197090, + 197107, + 197055, + 197140, + 196946, + 197117, + 197148, + 197120, + 197117, + 197007, + 197079, + 197100, + 197070, + 197104, + 196929 + ], + "sample_count": 32 + }, + { + "pubkey": "DqpqZKEbUHempc2UjsuNot91tY95b5HQ3rGECHYryphE", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 183929, + 157832, + 163108, + 157832, + 157832, + 158463, + 157929, + 157661, + 180230, + 180230, + 158815, + 187322, + 185777, + 161077, + 157648, + 157648, + 171557, + 164476, + 158006, + 158006, + 158872, + 158872, + 159045, + 157919, + 158049, + 157887, + 159466, + 158441, + 157981, + 157877, + 158209, + 158354 + ], + "sample_count": 32 + }, + { + "pubkey": "AX9awUxGCh5egb3nETR2EeQvZSHFFMcPYWoTToo9HzBd", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143478000000, + "samples": [ + 158074, + 157950, + 158040, + 158017, + 158001, + 158079, + 157960, + 156691, + 156669, + 158006, + 158060, + 157929, + 158058, + 158100, + 158012, + 158066, + 157968, + 156720, + 156669, + 156664, + 156690, + 156607, + 156734, + 156645, + 156657, + 156704, + 156613, + 156719, + 156652, + 156686, + 156658, + 156574 + ], + "sample_count": 32 + }, + { + "pubkey": "H5udTfwkENzVBgoYggjW7MG4hB7NavNUVSZSRzLDPU2Z", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 108561, + 107614, + 106771, + 106771, + 107651, + 107044, + 105751, + 105678, + 106382, + 105846, + 108558, + 107120, + 106994, + 106521, + 108900, + 108900, + 108670, + 107131, + 107762, + 108684, + 107324, + 107005, + 106765, + 106582, + 106958, + 106056, + 105714, + 106347, + 114305, + 107635, + 107728, + 107634 + ], + "sample_count": 32 + }, + { + "pubkey": "9r3Z2eir5zeehXRR25SERWLSCHaA47jgTwoXBL1CsQTw", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143481000000, + "samples": [ + 94203, + 94201, + 94216, + 94252, + 94236, + 94235, + 94215, + 94199, + 94196, + 94226, + 94222, + 94185, + 94241, + 94242, + 94231, + 94231, + 94218, + 94201, + 94223, + 94212, + 94222, + 94200, + 94249, + 94213, + 94242, + 94265, + 94214, + 94220, + 94190, + 94237, + 94257, + 94196 + ], + "sample_count": 32 + }, + { + "pubkey": "AnMqC78CyaFF5LPRpmvQrLUaZPsfYNxa9qnauhzZwZqX", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 160825, + 160945, + 160792, + 160849, + 161328, + 161113, + 160824, + 157875, + 160895, + 160616, + 157758, + 160823, + 160823, + 157294, + 160944, + 160780, + 157552, + 157886, + 157918, + 157332, + 157332, + 157676, + 202372, + 202372, + 160734, + 161254, + 157259, + 160842, + 161335, + 161083, + 160712, + 160712 + ], + "sample_count": 32 + }, + { + "pubkey": "5Gsdc9qX2S9ync3uCWovKDjmkUVffB37qKHNzNenHMuk", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143482000000, + "samples": [ + 154502, + 154431, + 154458, + 154461, + 154451, + 154474, + 154426, + 154503, + 154471, + 154481, + 154462, + 154366, + 154486, + 154481, + 154482, + 154478, + 154401, + 154459, + 154477, + 154459, + 154450, + 154401, + 154445, + 154457, + 154480, + 154473, + 154359, + 154465, + 154458, + 154461, + 154479, + 154391 + ], + "sample_count": 32 + }, + { + "pubkey": "ksJW3rJAn7zfDsPqNqnDfqS3NgS6xHqEX4Exf6xmtx4", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 96055, + 91968, + 91840, + 91750, + 92249, + 96083, + 95973, + 92169, + 92650, + 92614, + 96544, + 96544, + 92754, + 91688, + 92004, + 92004, + 92196, + 91727, + 96781, + 96097, + 91736, + 91994, + 103335, + 91702, + 93092, + 92101, + 96023, + 92233, + 96030, + 91589, + 92082, + 92141 + ], + "sample_count": 32 + }, + { + "pubkey": "9vq2PWy5PufjGmynyp1pPa1YdDehGcjWLFkhq8XJr8iU", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143482000000, + "samples": [ + 90131, + 90094, + 90179, + 90190, + 90125, + 90243, + 90103, + 90187, + 90158, + 90170, + 90171, + 90081, + 90078, + 90124, + 90190, + 90225, + 90115, + 90175, + 90147, + 90140, + 90163, + 90087, + 90145, + 90187, + 90178, + 90237, + 90130, + 90188, + 90101, + 90180, + 90167, + 90110 + ], + "sample_count": 32 + }, + { + "pubkey": "3it4Ts1UcPYpBv1ygNvGvpFDLfFq5SF1yjSyKmsmReF9", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 136261, + 136261, + 135846, + 135685, + 135605, + 135815, + 135979, + 135548, + 135996, + 135648, + 135460, + 135460, + 135879, + 135464, + 135456, + 135932, + 135664, + 135327, + 136385, + 136385, + 135918, + 135748, + 136124, + 135592, + 135481, + 135481, + 136010, + 135550, + 135595, + 135697, + 158043, + 135541 + ], + "sample_count": 32 + }, + { + "pubkey": "CCiuYAAdfM3x4mdDftr5WBXaKcHxWeDVn1osbCGBBsvU", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143478000000, + "samples": [ + 139100, + 138958, + 139008, + 139023, + 139058, + 139054, + 139051, + 139067, + 139101, + 139078, + 139050, + 139000, + 139061, + 139165, + 139135, + 139098, + 139034, + 139046, + 139038, + 139033, + 139011, + 138974, + 139028, + 139032, + 139007, + 139015, + 138935, + 139099, + 139082, + 139019, + 138996, + 138990 + ], + "sample_count": 32 + }, + { + "pubkey": "5vobpUXqSCtR6o8CYWQpYrLzCWkKyk9EEk9MZe4Urb2D", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 163209, + 166593, + 166593, + 166170, + 165386, + 163662, + 163350, + 163364, + 163364, + 164345, + 164458, + 163241, + 164850, + 164217, + 166409, + 166377, + 166259, + 164198, + 165159, + 166730, + 166231, + 166303, + 162884, + 163299, + 164193, + 163304, + 164180, + 165443, + 166330, + 166330, + 166268, + 166261 + ], + "sample_count": 32 + }, + { + "pubkey": "4CdAi4RLRTA5M2gKiCx7dXw9SnJfHAFBfGc25drJ7iGp", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143475000000, + "samples": [ + 158649, + 158489, + 158544, + 158590, + 158573, + 158630, + 158510, + 158587, + 158671, + 158658, + 158534, + 158531, + 158589, + 158514, + 158573, + 158591, + 158426, + 158572, + 158505, + 158548, + 158647, + 158577, + 158574, + 158603, + 158598, + 158627, + 158442, + 158572, + 158569, + 158560, + 158619, + 158490 + ], + "sample_count": 32 + }, + { + "pubkey": "BGa8XmbyMWSNUboGbZeRAk43xcg9CxysVAivC26DkwXf", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 38043, + 38137, + 41727, + 37992, + 38091, + 37919, + 38008, + 38370, + 38370, + 38258, + 37895, + 38507, + 38200, + 38048, + 38941, + 38304, + 37929, + 38400, + 38160, + 38051, + 38702, + 38702, + 38254, + 38066, + 39072, + 38171, + 37905, + 38175, + 38135, + 38135, + 38036, + 38324 + ], + "sample_count": 32 + }, + { + "pubkey": "7dqctMfZgVojBAHKGet3vup7XNVkRK5FSrxb8XBA7Xwa", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143477000000, + "samples": [ + 29633, + 29725, + 29718, + 29749, + 29723, + 29800, + 29698, + 29694, + 29714, + 29703, + 29652, + 29671, + 29670, + 29640, + 29646, + 29733, + 29662, + 29684, + 29712, + 29627, + 29671, + 29633, + 29742, + 29697, + 29700, + 29604, + 29672, + 29665, + 29697, + 29757, + 29639, + 29655 + ], + "sample_count": 32 + }, + { + "pubkey": "8vuKMXTYPLsZx5johCPwct4wRaia1BFWDSThLbgwpwEe", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 36953, + 37742, + 37343, + 37773, + 37892, + 37500, + 37038, + 38616, + 37621, + 37776, + 37972, + 37488, + 37292, + 40082, + 37769, + 37578, + 37641, + 37397, + 37208, + 42364, + 37292, + 37329, + 37671, + 37671, + 38366, + 37435, + 37435, + 37493, + 37457, + 37302, + 37572, + 40115 + ], + "sample_count": 32 + }, + { + "pubkey": "J8Yb3ddmahY9WApz3KQtXkAwh1eymS5mKQ95mAaqdEp5", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143477000000, + "samples": [ + 32453, + 32375, + 32426, + 32435, + 32406, + 32381, + 32391, + 32445, + 32427, + 32381, + 36214, + 36193, + 36033, + 36200, + 32424, + 32392, + 32381, + 32406, + 32445, + 32394, + 32406, + 32430, + 32438, + 32405, + 32399, + 32421, + 32395, + 32424, + 32423, + 32430, + 32384, + 32375 + ], + "sample_count": 32 + }, + { + "pubkey": "7qii2C5979vdQPV2g9W7e27LKaqH6qqp8E17mC65QzCB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 57509, + 57509, + 66762, + 57775, + 57546, + 60724, + 57469, + 57432, + 70036, + 57951, + 57365, + 61150, + 58665, + 58272, + 69221, + 57594, + 57671, + 66685, + 57511, + 57413, + 64962, + 57454, + 57489, + 64720, + 57427, + 57502, + 69984, + 69984, + 58258, + 57780, + 65995, + 59708 + ], + "sample_count": 32 + }, + { + "pubkey": "9aGaZenF8d6xS1neBbo8iSVCP9NRHHPMdKCgjb1i8PzD", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 43758, + 43822, + 43725, + 43755, + 43767, + 43751, + 43773, + 43792, + 43760, + 43705, + 43772, + 43730, + 43737, + 43738, + 43738, + 43733, + 43719, + 43748, + 43736, + 43747, + 43816, + 43709, + 43745, + 43681, + 43729, + 43755, + 43742, + 43737, + 43716, + 43745, + 43724, + 43745 + ], + "sample_count": 32 + }, + { + "pubkey": "DtEKhCNR7A2AaDA961WooGiQfbj2kqVYb2HdQRJvwqaV", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 107047, + 108893, + 107180, + 107041, + 109044, + 107272, + 106972, + 107266, + 107256, + 107212, + 108802, + 107008, + 106970, + 108101, + 107251, + 107072, + 112028, + 107229, + 106991, + 110455, + 107237, + 107117, + 107145, + 108239, + 107302, + 107322, + 107201, + 107069, + 110837, + 107208, + 107047, + 112884 + ], + "sample_count": 32 + }, + { + "pubkey": "GHQaQsceH3npVMbdhEj9DmNoPoBiCVR63GS37TejLiBv", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 119643, + 120995, + 118991, + 119683, + 120418, + 121143, + 119429, + 120907, + 120163, + 120574, + 120573, + 120491, + 119914, + 120278, + 120416, + 120435, + 119597, + 120583, + 120590, + 120608, + 120652, + 120632, + 120313, + 120491, + 120613, + 120448, + 120498, + 120577, + 121025, + 120453, + 120502, + 120512 + ], + "sample_count": 32 + }, + { + "pubkey": "4QLGqyiKkUXLQTWVsitQwmEy9j73HDYiiwqhkFDE2icW", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 31323, + 31556, + 31431, + 31542, + 31958, + 31360, + 31479, + 31434, + 31414, + 31464, + 31601, + 31390, + 31671, + 31706, + 31388, + 31470, + 31919, + 31505, + 31456, + 31679, + 31679, + 31449, + 31396, + 31400, + 31736, + 31736, + 31479, + 31557, + 31486, + 31597, + 32365, + 31427 + ], + "sample_count": 32 + }, + { + "pubkey": "48zLhSyeXoZ1iZpBfzn7SJxxkt2ZjBcgjndPmfnTWxUD", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 38031, + 38088, + 38108, + 38009, + 38040, + 38053, + 38058, + 38026, + 38051, + 38029, + 38033, + 38014, + 38036, + 37542, + 37544, + 38112, + 37998, + 38031, + 37548, + 37596, + 37465, + 37547, + 37573, + 37609, + 37533, + 37579, + 37597, + 38057, + 38025, + 38064, + 38007, + 38030 + ], + "sample_count": 32 + }, + { + "pubkey": "BibiZzB7SgQDUE3GGXvftdivFUjWLmx4ufffLSACQhBp", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 117260, + 117638, + 117357, + 117470, + 117366, + 117162, + 117195, + 117334, + 117268, + 117449, + 117201, + 117201, + 117262, + 117227, + 117562, + 117206, + 117192, + 117384, + 117135, + 117242, + 117282, + 117532, + 117344, + 117574, + 117349, + 117306, + 117451, + 117149, + 117419, + 117516, + 117187, + 117187 + ], + "sample_count": 32 + }, + { + "pubkey": "A2g8osJvbmEptrM1QsSwpcB7q9svgMiwNCwy3nxd6YjX", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 118774, + 118874, + 118668, + 118742, + 118691, + 118723, + 118819, + 118756, + 118744, + 118748, + 118691, + 118748, + 118732, + 118768, + 118713, + 118690, + 118647, + 118795, + 118757, + 118762, + 118786, + 118728, + 118723, + 118692, + 118725, + 118819, + 118723, + 118715, + 118724, + 118720, + 118733, + 118680 + ], + "sample_count": 32 + }, + { + "pubkey": "FcoUZyxvADgftLQrNbkvBddbxCAjFB5DUw5J2ewybnqm", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 132145, + 131902, + 132354, + 132791, + 131760, + 131048, + 132166, + 133834, + 132070, + 132322, + 132428, + 131716, + 133360, + 134227, + 133916, + 132616, + 131448, + 130929, + 131729, + 132282, + 131456, + 131724, + 131941, + 131941, + 132820, + 134087, + 134087, + 131627, + 131309, + 131590, + 132853, + 134669 + ], + "sample_count": 32 + }, + { + "pubkey": "5qAN5XZk23JdHMydK3JnutkxFhWSptYnFttEXQfKTHNu", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 136635, + 136718, + 133906, + 133857, + 133853, + 133873, + 133894, + 133894, + 133948, + 133897, + 133891, + 133985, + 133938, + 133886, + 133890, + 133894, + 133895, + 134563, + 134548, + 134631, + 134579, + 133961, + 133885, + 133945, + 133901, + 133950, + 133945, + 133958, + 133922, + 136611, + 136646, + 136627 + ], + "sample_count": 32 + }, + { + "pubkey": "FzmARWpdvugHiqfDhoPkyT7d3npq9ovd7nxEG8fczZo1", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 132101, + 133090, + 132727, + 132273, + 134149, + 132338, + 132050, + 134337, + 132143, + 132069, + 132178, + 132011, + 132045, + 134760, + 132075, + 132240, + 132703, + 132703, + 132180, + 132057, + 137184, + 132254, + 132000, + 132000, + 133667, + 132072, + 132072, + 131905, + 134646, + 132195, + 132030, + 135871 + ], + "sample_count": 32 + }, + { + "pubkey": "9ib5nHbe6u8cb3NX43bKdJubHy7cZuraMSRhJBR6Hvzk", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 128907, + 128892, + 128812, + 128801, + 128804, + 128835, + 128805, + 128898, + 128872, + 128840, + 128822, + 128827, + 128872, + 128946, + 128779, + 128878, + 128947, + 128924, + 128828, + 131416, + 131606, + 131487, + 131429, + 131548, + 131503, + 131500, + 131514, + 131453, + 131470, + 131482, + 131541, + 131457 + ], + "sample_count": 32 + }, + { + "pubkey": "2Sj1xzNgHBUu9SaQPMgA9aGCZWVijReb3ewFnwrt5Gvz", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 168371, + 168634, + 168541, + 168597, + 168697, + 168614, + 213939, + 168504, + 217033, + 168580, + 168631, + 168647, + 168504, + 168600, + 168694, + 168361, + 168727, + 168727, + 168644, + 168583, + 168974, + 168727, + 168445, + 168724, + 168675, + 168556, + 168980, + 168767, + 168380, + 168618, + 168549, + 168571 + ], + "sample_count": 32 + }, + { + "pubkey": "75seHTKx5rxNGLraKdzjcaMP7EActJDLGnNNqsNYED53", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 134315, + 133385, + 127920, + 127984, + 127935, + 133300, + 133430, + 133347, + 127974, + 128008, + 127897, + 128002, + 127992, + 128007, + 128009, + 127830, + 128039, + 128080, + 127970, + 127948, + 127945, + 127990, + 127963, + 133346, + 133331, + 133386, + 133472, + 133412, + 127566, + 127643, + 127625, + 127526 + ], + "sample_count": 32 + }, + { + "pubkey": "3QD7cDxqxASxeCDJ2b6upqvj9QS4Lr5munx4t69BWzym", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 28294, + 28316, + 28281, + 28337, + 28464, + 28354, + 28288, + 28247, + 28226, + 28421, + 28528, + 28471, + 28298, + 28618, + 28596, + 28403, + 28428, + 28377, + 28311, + 28776, + 28539, + 28455, + 28294, + 28266, + 28263, + 28392, + 28367, + 28327, + 28520, + 28423, + 28258, + 28408 + ], + "sample_count": 32 + }, + { + "pubkey": "GgwSLbSxt357yjtu7bGGdiMQRZFaGcpkf5wCvz4HRoai", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 28063, + 28114, + 27989, + 28071, + 28054, + 28136, + 28107, + 28136, + 28017, + 28052, + 27967, + 28127, + 28141, + 28043, + 28046, + 28103, + 28093, + 28185, + 28048, + 28050, + 28134, + 28026, + 28057, + 28017, + 28047, + 28057, + 28073, + 28046, + 27979, + 28030, + 28054, + 28058 + ], + "sample_count": 32 + }, + { + "pubkey": "A3ZjjeHnWAvCxjJSxN1rcRrx1oEBBHydeiBtGpyPUB5V", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 31665, + 32297, + 31834, + 31620, + 31757, + 31743, + 31745, + 31738, + 31691, + 31614, + 31990, + 31796, + 31727, + 31674, + 31730, + 31801, + 31877, + 31618, + 31722, + 31745, + 31641, + 31772, + 31772, + 31789, + 31875, + 31737, + 31683, + 31673, + 31709, + 31694, + 31694, + 31954 + ], + "sample_count": 32 + }, + { + "pubkey": "8WyxhbxKMXaw8nZBnF3MFRcYFivoV3oexGa4BX8LjQfo", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 30573, + 30715, + 30623, + 30645, + 30796, + 30617, + 30655, + 30678, + 30609, + 30839, + 30618, + 30855, + 30611, + 30703, + 30612, + 30676, + 30636, + 30531, + 30779, + 30836, + 30673, + 30638, + 30788, + 30622, + 30684, + 30634, + 30721, + 30601, + 30449, + 30769, + 30761, + 30556 + ], + "sample_count": 32 + }, + { + "pubkey": "63e3vXo47RXvZgF8zwFSPcs8Rf1GpSEtHHarFNoujKi5", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143483000000, + "samples": [ + 135302, + 135228, + 133939, + 134002, + 134002, + 138271, + 134520, + 135458, + 135705, + 134701, + 135333, + 134874, + 135573, + 184200, + 184200, + 135248, + 135386, + 135386, + 134419, + 135416, + 135488, + 134783, + 134944, + 135838, + 135846, + 134566, + 135094, + 134738, + 133910, + 133945, + 133945, + 135666 + ], + "sample_count": 32 + }, + { + "pubkey": "437hLfPMb5dUijoEDtbouGFpBfkfUKbp38hFCjkVCN1t", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 134513, + 134743, + 134515, + 134727, + 134750, + 134630, + 134679, + 134715, + 134641, + 141676, + 134514, + 134481, + 134623, + 134696, + 134722, + 134661, + 131794, + 132121, + 132036, + 131911, + 132184, + 131846, + 132094, + 131990, + 131996, + 132058, + 132171, + 132089, + 131853, + 134598, + 134630, + 134657 + ], + "sample_count": 32 + }, + { + "pubkey": "CUEPEtjLeuxtPsst85MSRiqKND9hzfjxUtowaipqxrb4", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 36799, + 37111, + 36835, + 36751, + 36751, + 37026, + 36859, + 36904, + 36938, + 37257, + 36987, + 37028, + 36805, + 36919, + 37736, + 37260, + 36986, + 37388, + 37012, + 36903, + 37019, + 37019, + 36892, + 37155, + 37155, + 36928, + 36723, + 36990, + 36987, + 36943, + 37124, + 36895 + ], + "sample_count": 32 + }, + { + "pubkey": "7chLC3pCFm9TxihkHFty549grkw6izdeRQ8JNsaHZp7b", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 34052, + 34101, + 33999, + 34028, + 33987, + 34064, + 34006, + 34062, + 34049, + 34001, + 34001, + 34008, + 33986, + 34039, + 34012, + 34048, + 34017, + 34101, + 34005, + 34029, + 33989, + 34055, + 34017, + 34037, + 34035, + 34015, + 34020, + 34033, + 34046, + 34018, + 33996, + 33980 + ], + "sample_count": 32 + }, + { + "pubkey": "6GKvzCgiMD9ZeB8tyy7ujEQr1y1rptDhmAw6zXCdTVR1", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 119847, + 119933, + 119823, + 119982, + 120030, + 119906, + 120053, + 120053, + 119932, + 119802, + 119866, + 119877, + 119839, + 119799, + 119994, + 119858, + 119899, + 120010, + 119765, + 120134, + 120004, + 120017, + 120017, + 119772, + 119934, + 120070, + 119848, + 120139, + 119793, + 119793, + 120208, + 119857 + ], + "sample_count": 32 + }, + { + "pubkey": "DsC67c33eY45TA9ButLCVWs87ZqTL2hZYSoEu7P1dUKm", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 124886, + 126803, + 124827, + 125950, + 126779, + 126653, + 126006, + 125644, + 126752, + 126668, + 126106, + 125704, + 126117, + 126101, + 126153, + 125577, + 126167, + 126105, + 126063, + 126096, + 126274, + 126569, + 126005, + 126614, + 126146, + 124771, + 126673, + 126198, + 126153, + 126147, + 125340, + 124801 + ], + "sample_count": 32 + }, + { + "pubkey": "FCHE8hBqZHyS5Rj3DQavPHK5hxZbXqrWsxzKXJH4TQHA", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 140433, + 140565, + 140217, + 140248, + 140424, + 140551, + 140249, + 141649, + 141649, + 140298, + 140299, + 134353, + 134444, + 141585, + 134338, + 134020, + 134347, + 134347, + 135065, + 140396, + 140151, + 140136, + 140302, + 140029, + 140968, + 140526, + 140272, + 140609, + 140048, + 140293, + 140493, + 140375 + ], + "sample_count": 32 + }, + { + "pubkey": "EV8v3WeyM5XNCBtFRi2XFykcTf9TStyXeVTBMrR1wunR", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 137105, + 137029, + 137071, + 137105, + 137046, + 137031, + 136984, + 137049, + 137083, + 136942, + 137051, + 136958, + 137082, + 137086, + 136988, + 137118, + 137082, + 137081, + 137038, + 137097, + 144789, + 137027, + 136965, + 137043, + 137013, + 137084, + 137050, + 137029, + 137007, + 137016, + 137020, + 136995 + ], + "sample_count": 32 + }, + { + "pubkey": "4qbvqWBbV7w56m6i6WuPBC6SafwNpqiXqFzd7C6HhSAY", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 204259, + 204220, + 204220, + 203950, + 204025, + 204120, + 204788, + 204389, + 204075, + 204393, + 204368, + 204270, + 204567, + 204395, + 204125, + 204298, + 204083, + 206024, + 204392, + 204192, + 204362, + 204131, + 203948, + 204672, + 204159, + 204188, + 204188, + 205436, + 205436, + 204472, + 204000, + 204303 + ], + "sample_count": 32 + }, + { + "pubkey": "45dbDgpEqhNrM8MgFFfsb6mW5eS4dw64EYYRJLLrKR4z", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 198354, + 198469, + 198440, + 199859, + 198323, + 211453, + 201639, + 212422, + 212466, + 212464, + 197414, + 197441, + 205924, + 212418, + 206276, + 206377, + 206376, + 205014, + 204956, + 204923, + 204951, + 204914, + 196467, + 201255, + 201327, + 206381, + 206338, + 206300, + 205854, + 205887, + 211520, + 211518 + ], + "sample_count": 32 + }, + { + "pubkey": "J3jjFYAtaiNBwDKge8QQJcBQ2DF3coJ433T6SA2crGeS", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 35750, + 35141, + 35814, + 35673, + 35351, + 35606, + 35686, + 36307, + 36376, + 35718, + 35718, + 36357, + 36357, + 36091, + 48755, + 36426, + 35125, + 35645, + 36250, + 35462, + 35142, + 35646, + 35495, + 35790, + 36126, + 36125, + 36166, + 36047, + 35188, + 35061, + 35244, + 35611 + ], + "sample_count": 32 + }, + { + "pubkey": "5rc4imBnBX3pGAGaq3j8wB76v7dNzsrdJaKVsqmneBd8", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 34685, + 34762, + 34688, + 34722, + 34723, + 34714, + 34729, + 34699, + 34647, + 34691, + 35201, + 34633, + 34613, + 34685, + 34691, + 34705, + 34708, + 34733, + 34605, + 34694, + 34710, + 34720, + 34701, + 34710, + 34750, + 34708, + 35152, + 35137, + 35178, + 35199, + 35151, + 35155 + ], + "sample_count": 32 + }, + { + "pubkey": "FDqYzLpcE6fZe5m91rK15XduoYTTvHQJDJwyPpC4nbMt", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 64074, + 64074, + 64234, + 63866, + 63692, + 63910, + 61642, + 63749, + 62085, + 61656, + 71786, + 64242, + 63680, + 61490, + 61927, + 61927, + 63858, + 64135, + 64118, + 64006, + 63942, + 64227, + 61579, + 61794, + 61794, + 64088, + 63924, + 63857, + 63831, + 63891, + 63845, + 64099 + ], + "sample_count": 32 + }, + { + "pubkey": "6z9YzJfdKM3dB5QW9gcVRwBtUJsXDtAy14RqNuHsUovA", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143505000000, + "samples": [ + 57316, + 57366, + 57238, + 57237, + 57326, + 57347, + 57274, + 55023, + 54987, + 57144, + 57167, + 57088, + 57122, + 57177, + 57140, + 57189, + 57239, + 57202, + 57126, + 57179, + 57200, + 57080, + 57126, + 57126, + 57050, + 57159, + 57099, + 57247, + 57258, + 57283, + 57249, + 57279 + ], + "sample_count": 32 + }, + { + "pubkey": "9NNJz98Xh7gV5kDr5TSVFJUDnZi6iDcp3RcCDyb6RQK7", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 175759, + 172657, + 172476, + 174037, + 175774, + 173789, + 171936, + 172823, + 172571, + 174198, + 174238, + 179487, + 177908, + 174127, + 175095, + 175630, + 180659, + 174805, + 174773, + 172159, + 177395, + 177106, + 179327, + 180246, + 170705, + 172865, + 175439, + 177853, + 177981, + 177744, + 171897, + 175211 + ], + "sample_count": 32 + }, + { + "pubkey": "28Exz2SiPLs7AV8MvnQ5bethJdGThvTineCUuzs9hbyG", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143506000000, + "samples": [ + 185105, + 178680, + 184372, + 180540, + 180584, + 180626, + 187303, + 187107, + 187299, + 185750, + 185859, + 185691, + 184593, + 181739, + 181188, + 178852, + 184470, + 179130, + 179096, + 185739, + 185166, + 178869, + 178986, + 178954, + 178871, + 178779, + 184474, + 178441, + 178538, + 178575, + 178496, + 178538 + ], + "sample_count": 32 + }, + { + "pubkey": "BvhNPJYe6WZb5Nj8ekaFeD3ttAkxY4kehukcBBnghXoh", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 41105, + 40946, + 41473, + 41131, + 41138, + 40993, + 40909, + 41036, + 41134, + 40995, + 41311, + 41124, + 41706, + 41258, + 41144, + 41138, + 41224, + 41312, + 41391, + 41235, + 41118, + 41216, + 41591, + 41591, + 41218, + 41138, + 41049, + 41113, + 41179, + 41258, + 41063, + 41054 + ], + "sample_count": 32 + }, + { + "pubkey": "BtkiWfWh1655Cz65Sp4oH3PqNXnauB7Yix923uDns4Fk", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143505000000, + "samples": [ + 31475, + 31555, + 31424, + 31334, + 31412, + 31396, + 31491, + 31374, + 31382, + 31451, + 31393, + 31393, + 31420, + 31375, + 31383, + 31655, + 31482, + 31515, + 31410, + 31495, + 31428, + 34093, + 34098, + 34080, + 34055, + 34150, + 34324, + 34269, + 34347, + 34285, + 34282, + 34301 + ], + "sample_count": 32 + }, + { + "pubkey": "EH9wE6BBrfmqTKtchJXMvgrj7MbmqoaZvgfFYcf7gGD4", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 132197, + 132283, + 132186, + 132186, + 132439, + 132107, + 132107, + 132032, + 132284, + 132152, + 132138, + 132091, + 132232, + 132301, + 132301, + 132377, + 132079, + 132065, + 132393, + 132388, + 132277, + 132251, + 132802, + 132196, + 132041, + 132041, + 132150, + 132267, + 132162, + 127393, + 127393, + 127282 + ], + "sample_count": 32 + }, + { + "pubkey": "CmPsP4WfjJu4PEkanBLCQTWbmFcB3NWyQqeoRXdXaMS1", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 120046, + 120121, + 120004, + 119988, + 120038, + 120074, + 120040, + 120053, + 120020, + 120016, + 120042, + 120026, + 120039, + 120028, + 119997, + 120011, + 120046, + 120073, + 120043, + 120065, + 120092, + 120011, + 119995, + 120012, + 120042, + 119996, + 120002, + 120001, + 120021, + 122660, + 122677, + 122630 + ], + "sample_count": 32 + }, + { + "pubkey": "5TpoNo6xx3NgT2BGVJLMBaASDentNRmZmaXHpWVXTGFQ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 120173, + 120253, + 120476, + 120371, + 120394, + 120412, + 120299, + 121146, + 120623, + 120290, + 125330, + 120295, + 120295, + 120305, + 120500, + 120500, + 120282, + 120404, + 120404, + 120348, + 120645, + 120645, + 120272, + 120362, + 120404, + 120361, + 120768, + 120306, + 120384, + 121005, + 120283, + 120342 + ], + "sample_count": 32 + }, + { + "pubkey": "5k51gSHihS1ZS5jD9TXnQwxurMS7HoSakUW9m5KcME1S", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 119199, + 120116, + 122119, + 119571, + 122062, + 119581, + 122079, + 119152, + 119183, + 121645, + 119101, + 121590, + 122134, + 122098, + 119494, + 121748, + 121668, + 121708, + 121658, + 120022, + 120066, + 120058, + 122111, + 122140, + 121551, + 120035, + 119559, + 119527, + 119509, + 119644, + 119611, + 119567 + ], + "sample_count": 32 + }, + { + "pubkey": "6jRKkdSo7qDGViqJnLBN2VmMfPvNoY4vpcEhqJ6xvdks", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 140670, + 141582, + 141296, + 141420, + 143187, + 140447, + 141292, + 141090, + 141835, + 141809, + 142027, + 140760, + 140760, + 139839, + 140091, + 140004, + 140856, + 141846, + 141846, + 141338, + 141982, + 141982, + 141780, + 142683, + 141310, + 141480, + 142113, + 140725, + 140725, + 141776, + 140001, + 141914 + ], + "sample_count": 32 + }, + { + "pubkey": "ACWFbUwgtfD9FWq31mKpMLUBnaz1Mw4eqhCuyARKRKh7", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 121824, + 121968, + 121851, + 121823, + 121842, + 121813, + 121884, + 121825, + 121868, + 121845, + 121809, + 121896, + 121893, + 121829, + 121811, + 123709, + 123716, + 123716, + 123724, + 123729, + 123750, + 123717, + 123717, + 123717, + 123785, + 123710, + 123706, + 123767, + 123728, + 123702, + 123740, + 123659 + ], + "sample_count": 32 + }, + { + "pubkey": "48nAEKGLeoeVZ1G4LQhVBBG3LeM6stuBQjKBWNfi1xGq", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 32848, + 32848, + 32788, + 32841, + 32609, + 33075, + 32794, + 32719, + 32787, + 32466, + 32664, + 32740, + 32721, + 32567, + 33253, + 32754, + 32692, + 32858, + 32768, + 32681, + 32723, + 32687, + 32915, + 32602, + 32889, + 32608, + 33068, + 32721, + 32721, + 32614, + 32799, + 32665 + ], + "sample_count": 32 + }, + { + "pubkey": "9oLJncGzdKHDUVk6nj7DShfiNy69aSZqkq7m1BUk3Lh3", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 30703, + 30631, + 30633, + 30703, + 30626, + 30593, + 30625, + 30594, + 30582, + 30684, + 30577, + 30521, + 30655, + 30577, + 30525, + 30662, + 30602, + 30540, + 30597, + 30646, + 30601, + 30691, + 30546, + 30553, + 30660, + 30562, + 30702, + 30555, + 30550, + 30745, + 30742, + 30752 + ], + "sample_count": 32 + }, + { + "pubkey": "2FWjBhiPRNPUcv8wkB4mhm616RsRkJZbUnjx54PmLP7E", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 43030, + 43327, + 43544, + 43301, + 43337, + 43324, + 43626, + 44146, + 43164, + 43064, + 43029, + 43289, + 43166, + 43166, + 43720, + 43152, + 43285, + 43084, + 50101, + 43303, + 43141, + 43428, + 43229, + 43143, + 43019, + 43090, + 43801, + 43464, + 43244, + 43244, + 43376, + 43357 + ], + "sample_count": 32 + }, + { + "pubkey": "CRRBTh6VbMRFftw6ZZFZ6k9FUZGs8guSznABw1rSaCdH", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 38660, + 38662, + 38571, + 38597, + 38684, + 38545, + 38740, + 38566, + 38657, + 38700, + 38621, + 38570, + 38752, + 38657, + 38503, + 38661, + 38661, + 38604, + 38547, + 38614, + 38601, + 38612, + 38454, + 38636, + 38657, + 38601, + 38656, + 38588, + 38583, + 38648, + 38669, + 38586 + ], + "sample_count": 32 + }, + { + "pubkey": "FLSGa32XcPvNhUx5VL8tm93RtbhXLdsXkL9KsGsXx4DQ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 119081, + 119594, + 119234, + 119094, + 119292, + 119366, + 119171, + 119171, + 119089, + 119149, + 119194, + 119216, + 119369, + 119296, + 119477, + 119141, + 119290, + 119377, + 119191, + 119357, + 120082, + 119274, + 119218, + 119033, + 119498, + 119510, + 119335, + 119525, + 122104, + 119516, + 119126, + 119324 + ], + "sample_count": 32 + }, + { + "pubkey": "Hp3ppmGJ6YiNdJtTYXjXypT624cca6rMG1QmEx7Va5s7", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 125654, + 125707, + 125504, + 125613, + 125606, + 125606, + 125633, + 125654, + 125602, + 125542, + 125576, + 125577, + 125543, + 125506, + 125535, + 125692, + 125564, + 125628, + 125553, + 125564, + 125610, + 125594, + 125478, + 125514, + 122889, + 122856, + 122806, + 122954, + 122940, + 122911, + 122935, + 122839 + ], + "sample_count": 32 + }, + { + "pubkey": "6sBy2WFYzjK3nFjV8bRLxwCgTLVyyjfMvp6LvsUcPdVi", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 110099, + 110706, + 108749, + 109768, + 110015, + 109931, + 108723, + 109975, + 109985, + 109459, + 109066, + 109499, + 109552, + 109552, + 110355, + 109597, + 110122, + 110459, + 109425, + 109297, + 109200, + 109559, + 110122, + 110365, + 110116, + 110064, + 111006, + 109678, + 110622, + 110257, + 109546, + 109419 + ], + "sample_count": 32 + }, + { + "pubkey": "4JyNWSLLqyNonPiirU96miyRZMUUsNQi19xoY97YJ625", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 100914, + 100963, + 100867, + 100844, + 100767, + 100789, + 100822, + 100186, + 100038, + 100248, + 100420, + 100360, + 100279, + 100368, + 105765, + 105755, + 105840, + 105802, + 105831, + 105759, + 105842, + 105684, + 105768, + 105865, + 105839, + 105740, + 105761, + 102803, + 102676, + 100120, + 100091, + 100066 + ], + "sample_count": 32 + }, + { + "pubkey": "EFDkBzZeUh6XEsQJ77M4V5xaYY4L7ghmQEL12Pw7kYsR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 138395, + 138496, + 138207, + 138218, + 138383, + 138130, + 184903, + 138831, + 176622, + 176622, + 138083, + 138924, + 138924, + 138421, + 138254, + 139565, + 139687, + 139687, + 138195, + 140842, + 137992, + 138267, + 138221, + 138403, + 138416, + 138303, + 137932, + 138033, + 138152, + 138499, + 138259, + 138355 + ], + "sample_count": 32 + }, + { + "pubkey": "HfJ85wkygDW73GRey4SJrmf5WXuJdUhJDwHGaigB7tAz", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 135405, + 135440, + 135351, + 135356, + 135395, + 135413, + 135425, + 135422, + 135358, + 135362, + 135398, + 135344, + 135441, + 135450, + 135320, + 135384, + 135273, + 135427, + 135330, + 135306, + 135272, + 135300, + 135314, + 135357, + 135367, + 135352, + 135330, + 135341, + 135328, + 137995, + 138036, + 138056 + ], + "sample_count": 32 + }, + { + "pubkey": "2doRRNeBmHhKzvwKkJBmhott73UPXiVQunutWTkVUDSc", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 55649, + 67569, + 55367, + 55539, + 55539, + 68135, + 68135, + 55598, + 55410, + 69751, + 69751, + 56682, + 55747, + 67463, + 67463, + 55457, + 55520, + 69255, + 56200, + 55526, + 55526, + 55629, + 56462, + 56462, + 55421, + 67700, + 56007, + 55457, + 63284, + 55669, + 55669, + 55712 + ], + "sample_count": 32 + }, + { + "pubkey": "8m1SLeU5B55ZMYwonUaUHfFTBDvG8hs9uaB6EeTEBwGd", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143517000000, + "samples": [ + 48426, + 48357, + 48438, + 48401, + 48410, + 48391, + 48424, + 48436, + 48483, + 48389, + 48418, + 48413, + 48439, + 48420, + 48415, + 48383, + 48392, + 48392, + 48429, + 48430, + 48448, + 48426, + 48365, + 48441, + 48433, + 48677, + 48461, + 48442, + 48410, + 48442, + 48469, + 48442 + ], + "sample_count": 32 + }, + { + "pubkey": "4jFhSpsD8SPocfB3hS3iEzvFa9MwxM7xCqxrxHzZ69Vc", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 126562, + 126562, + 127071, + 126393, + 126586, + 126394, + 126499, + 126555, + 126555, + 126517, + 126462, + 126495, + 126659, + 126530, + 126552, + 126423, + 126415, + 126563, + 126435, + 126435, + 126478, + 126435, + 126627, + 126465, + 128141, + 127200, + 126622, + 126515, + 126932, + 126533, + 126481, + 126690 + ], + "sample_count": 32 + }, + { + "pubkey": "7sams2kXtV19oAdi64eNxFNxinPP5v4AshN8oQ8CdkRc", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143517000000, + "samples": [ + 194709, + 194745, + 194687, + 194726, + 194702, + 194710, + 194746, + 194707, + 194769, + 194813, + 194741, + 194838, + 194723, + 194759, + 194660, + 194708, + 194730, + 194704, + 194739, + 183334, + 183336, + 183365, + 183299, + 183293, + 183336, + 192671, + 183534, + 183358, + 183410, + 183349, + 183285, + 183432 + ], + "sample_count": 32 + }, + { + "pubkey": "8borXwvE6cUBEmm6eo9ggU9DNZ2gHqSvFZhMwZTvyS31", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143501000000, + "samples": [ + 157982, + 158656, + 158045, + 158009, + 158064, + 157972, + 157943, + 157985, + 158372, + 158372, + 157999, + 157925, + 158439, + 158439, + 158022, + 158163, + 157866, + 158209, + 157979, + 157923, + 158256, + 158111, + 157905, + 158492, + 158492, + 157920, + 158029, + 158130, + 157928, + 157901, + 160178, + 160178 + ], + "sample_count": 32 + }, + { + "pubkey": "3L3A2BKwvSUHAQBL1YF17LPUpvGN5B3poFhehqeHohsQ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143515000000, + "samples": [ + 143615, + 143579, + 143590, + 143637, + 143684, + 143622, + 143590, + 143604, + 143612, + 143640, + 143701, + 143847, + 143612, + 143667, + 143597, + 143606, + 143618, + 143621, + 143670, + 143560, + 143599, + 143736, + 143656, + 143639, + 143562, + 151190, + 143782, + 143716, + 143679, + 143638, + 143677, + 143718 + ], + "sample_count": 32 + }, + { + "pubkey": "EYUzy4Gepa18wgvCDEYs3ts93UD9vyCB7CXDUd68w1Fk", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 109227, + 109399, + 109455, + 109455, + 109222, + 109407, + 109205, + 109062, + 109352, + 109735, + 109053, + 109132, + 109337, + 109197, + 109604, + 110677, + 109124, + 109439, + 109439, + 109307, + 109212, + 109322, + 109177, + 109341, + 109188, + 109201, + 109161, + 109161, + 109095, + 109158, + 109103, + 109845 + ], + "sample_count": 32 + }, + { + "pubkey": "CjAnjiT3Ko2X8mJk8rP75zqftyR58DkEMBA9hdKFj8jf", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143515000000, + "samples": [ + 117644, + 117671, + 117558, + 117526, + 117707, + 117581, + 117600, + 117544, + 117598, + 117641, + 117668, + 117714, + 117533, + 117656, + 117588, + 117706, + 117585, + 117562, + 117701, + 117606, + 117604, + 117721, + 117560, + 117542, + 117571, + 118188, + 117658, + 117703, + 117663, + 117614, + 117660, + 117618 + ], + "sample_count": 32 + }, + { + "pubkey": "5MxRyapJDB2ECNRxxmP7Rd8tpPrwYgHkrf6FufhBocxd", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 153052, + 153052, + 149922, + 149470, + 149497, + 149497, + 155021, + 153154, + 153014, + 149488, + 152816, + 149382, + 153103, + 152914, + 152764, + 152726, + 149572, + 149379, + 152791, + 153201, + 149330, + 149614, + 152922, + 152852, + 149353, + 153056, + 152756, + 149701, + 149701, + 149417, + 153198, + 149931 + ], + "sample_count": 32 + }, + { + "pubkey": "CNg1GeG3wZMRyHusnFSu6x63xAcyeFz3WXAVcCqUdrw7", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143516000000, + "samples": [ + 142148, + 142007, + 142085, + 142112, + 142135, + 142051, + 142123, + 142220, + 141957, + 142087, + 141878, + 142043, + 142052, + 142123, + 141915, + 142090, + 142103, + 142092, + 141966, + 142027, + 142009, + 142156, + 142180, + 142001, + 142060, + 147909, + 142219, + 142142, + 142087, + 142227, + 142144, + 142232 + ], + "sample_count": 32 + }, + { + "pubkey": "3swnY4vEk29Pv5RHtx2tmxdpP9R1Gdf3cyEa8GfugQR6", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 53060, + 51332, + 51096, + 51096, + 49327, + 51441, + 51441, + 50992, + 50912, + 49545, + 49545, + 51170, + 51170, + 50903, + 49509, + 51108, + 51108, + 49430, + 51404, + 49965, + 49468, + 49468, + 51010, + 49322, + 51108, + 51108, + 51362, + 50955, + 50955, + 50757, + 51137, + 49399 + ], + "sample_count": 32 + }, + { + "pubkey": "56hb9MUv8Ajg2scEdLVTArid7joM1A8ZYFuA2iFsbeNa", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143516000000, + "samples": [ + 39708, + 39617, + 39642, + 39719, + 39723, + 39617, + 39659, + 39866, + 39614, + 39652, + 39740, + 39699, + 41101, + 39616, + 39664, + 39649, + 39673, + 41043, + 39623, + 39683, + 39651, + 39663, + 39614, + 40394, + 39702, + 40684, + 39732, + 39766, + 39781, + 40929, + 39790, + 39707 + ], + "sample_count": 32 + }, + { + "pubkey": "DajuygZGoiFskR84Fg5wBr2znwqup7z5w8GFFsEEtWFD", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 47423, + 47496, + 47477, + 47250, + 47396, + 47166, + 47350, + 47260, + 47260, + 47116, + 47487, + 47686, + 47686, + 47392, + 47548, + 47548, + 47334, + 47294, + 47294, + 47210, + 47129, + 47095, + 47308, + 47308, + 47326, + 47326, + 47083, + 47167, + 46969, + 47631, + 47224, + 47492 + ], + "sample_count": 32 + }, + { + "pubkey": "BZHTmiGP6aCHmPxWCMV9BdSr5eq8Pb5XpgznNsZmeGi3", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143518000000, + "samples": [ + 63766, + 63747, + 63743, + 63818, + 63803, + 63824, + 63800, + 63758, + 63793, + 63809, + 63819, + 63814, + 63806, + 63825, + 63761, + 63748, + 63772, + 63775, + 63774, + 58949, + 58950, + 58899, + 58980, + 58943, + 58897, + 65282, + 59020, + 58956, + 58973, + 58980, + 58992, + 58889 + ], + "sample_count": 32 + }, + { + "pubkey": "2Af9vSGXpP9YYEdxVKamQVrbTVa7qyxHJHQsbCyKWwqV", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 151695, + 161414, + 161414, + 151759, + 151506, + 152417, + 151739, + 152237, + 152586, + 151531, + 151953, + 151728, + 152337, + 151710, + 155305, + 155305, + 151959, + 151642, + 151871, + 151712, + 151600, + 152381, + 151839, + 151809, + 151809, + 152017, + 151852, + 151922, + 152036, + 151863, + 151800, + 151800 + ], + "sample_count": 32 + }, + { + "pubkey": "FrqGpr4SbkvDxWudEhUhZdJY2o33Qa6nRSoW27xyuz12", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143516000000, + "samples": [ + 156413, + 156329, + 156429, + 156350, + 156387, + 156424, + 156442, + 156437, + 156451, + 156475, + 156450, + 156401, + 156438, + 156438, + 156345, + 156437, + 156421, + 156442, + 156400, + 156355, + 156402, + 156503, + 156419, + 156358, + 156394, + 164948, + 156514, + 156389, + 156453, + 156476, + 156410, + 156508 + ], + "sample_count": 32 + }, + { + "pubkey": "4JhXwvUpVtQxwCoBStWDqLjaeKGnzxZXzyryR7ErpHkx", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 83516, + 83516, + 92018, + 83350, + 83140, + 86498, + 83260, + 83305, + 95320, + 83802, + 83201, + 83201, + 85882, + 83332, + 83249, + 83249, + 93800, + 83697, + 83473, + 90600, + 83232, + 83267, + 83267, + 87561, + 84725, + 84204, + 90350, + 83384, + 83432, + 97562, + 85562, + 83265 + ], + "sample_count": 32 + }, + { + "pubkey": "FLnJHgCHwt9pcXTALNyPYcfpzXwBskTjiHfMYSLgzgtP", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143460000000, + "samples": [ + 65528, + 65606, + 65464, + 65483, + 65518, + 65465, + 65590, + 65519, + 65489, + 65483, + 65498, + 65544, + 65521, + 65459, + 65524, + 65525, + 65561, + 65473, + 65519, + 65516, + 65509, + 65553, + 65453, + 65527, + 65546, + 65507, + 65477, + 65489, + 65522, + 65494, + 65498, + 65547 + ], + "sample_count": 32 + }, + { + "pubkey": "FuroWqn3XgM6Srx8cMh7ioxzZyyrr5tefqEgytKTzzre", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 147221, + 147377, + 147232, + 147303, + 147370, + 147240, + 147142, + 147384, + 147342, + 147176, + 147176, + 147332, + 147248, + 147302, + 147406, + 147327, + 147277, + 147309, + 147491, + 147491, + 147252, + 147172, + 147287, + 147287, + 147268, + 147166, + 147289, + 147289, + 147226, + 147226, + 147497, + 147775 + ], + "sample_count": 32 + }, + { + "pubkey": "DPo5sVEoWbjdk5FRtYgtRcYS2Exdd78Qy4KQ78HCptbM", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143459000000, + "samples": [ + 155744, + 155935, + 155759, + 155809, + 155785, + 155771, + 155866, + 155772, + 155749, + 155841, + 155817, + 155911, + 155834, + 155742, + 155757, + 155781, + 155855, + 155770, + 155827, + 155749, + 155765, + 155935, + 155680, + 155755, + 155761, + 155794, + 155863, + 155806, + 155772, + 155743, + 155777, + 155893 + ], + "sample_count": 32 + }, + { + "pubkey": "2ibrvM7P79iF8pTKBFAkQCAf5ajrCtzVfRZh8t9v3ppA", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 158555, + 158631, + 158346, + 156248, + 156473, + 156794, + 158345, + 156641, + 158608, + 158523, + 156382, + 158507, + 185122, + 155555, + 156558, + 155672, + 155672, + 155492, + 155492, + 158436, + 158489, + 158470, + 156435, + 158501, + 158501, + 155822, + 158717, + 158492, + 159167, + 158475, + 158511, + 158689 + ], + "sample_count": 32 + }, + { + "pubkey": "4bf5StUYtesiBrwbvQrDsbSKDr2XcG7MwSCP2MzzCP7L", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143457000000, + "samples": [ + 151212, + 151289, + 151255, + 151265, + 151215, + 151220, + 151323, + 151167, + 151185, + 151211, + 151230, + 151294, + 170303, + 151125, + 151190, + 151135, + 151340, + 151248, + 151266, + 151195, + 151223, + 151320, + 151161, + 151207, + 151238, + 151270, + 151209, + 151198, + 151235, + 151231, + 151237, + 151338 + ], + "sample_count": 32 + }, + { + "pubkey": "DtT8JcBbAbYqHKV1AiMrWfB1LUPSKkj4SfvJoAo71si4", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 101058, + 101302, + 101345, + 101089, + 101290, + 101290, + 101334, + 101109, + 101109, + 101635, + 101148, + 101046, + 101261, + 101027, + 101027, + 101262, + 101350, + 101337, + 101191, + 101622, + 101148, + 101046, + 101286, + 101315, + 101245, + 101174, + 101303, + 101064, + 101064, + 101389, + 101207, + 101170 + ], + "sample_count": 32 + }, + { + "pubkey": "575D4hmAyMXNYaamvwvhQB2cgGzEyXGwLAQFVxLvj84c", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143457000000, + "samples": [ + 106767, + 106786, + 106804, + 106414, + 106985, + 106716, + 106879, + 106791, + 106794, + 106715, + 106284, + 106482, + 106974, + 103813, + 103814, + 106820, + 103885, + 106928, + 107075, + 106910, + 103816, + 103786, + 103758, + 103778, + 103834, + 107053, + 107000, + 107077, + 107028, + 106964, + 107247, + 107352 + ], + "sample_count": 32 + }, + { + "pubkey": "432DNadyGLYPhSV9N9Dkbmt6ki6LPzKBbSTtx7JAC7ud", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 164024, + 164060, + 163959, + 163959, + 164018, + 168532, + 163550, + 168780, + 166576, + 166576, + 163570, + 168708, + 162676, + 164065, + 213072, + 163921, + 168367, + 163980, + 162555, + 163401, + 163401, + 168607, + 164094, + 163412, + 164155, + 164097, + 165787, + 163380, + 169084, + 164250, + 164090, + 168796 + ], + "sample_count": 32 + }, + { + "pubkey": "46JFJPiWCRvNBmG5FswdYPsUDKh4AdFXbJXJUmPacbyD", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143458000000, + "samples": [ + 160150, + 160271, + 160299, + 160128, + 160135, + 160249, + 160339, + 160241, + 160095, + 164439, + 160156, + 160362, + 169468, + 160237, + 160046, + 160129, + 160139, + 160250, + 160304, + 160135, + 160171, + 160095, + 160108, + 159985, + 160130, + 159990, + 160295, + 160310, + 160119, + 160237, + 160140, + 160323 + ], + "sample_count": 32 + }, + { + "pubkey": "9CTpaFecQu6bdHxuDkN83onWK52tjgG5rrxNNPharKEe", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 63731, + 63951, + 63909, + 63945, + 64273, + 64215, + 63923, + 63868, + 64162, + 64667, + 64335, + 64062, + 64091, + 64060, + 64060, + 64209, + 64209, + 63902, + 64385, + 64103, + 64103, + 64065, + 64115, + 63974, + 64263, + 64380, + 64070, + 64317, + 64590, + 64590, + 64140, + 64140 + ], + "sample_count": 32 + }, + { + "pubkey": "DeiBGnKbDfV5LDrbZQiaaC9wz66B4UTGeLUkHyw3qQs5", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143459000000, + "samples": [ + 67046, + 67075, + 66992, + 67015, + 67056, + 67071, + 67075, + 67032, + 67093, + 67021, + 67065, + 67054, + 66650, + 67067, + 67151, + 66992, + 67097, + 67001, + 66987, + 66995, + 67063, + 67069, + 66989, + 67064, + 67013, + 67058, + 67047, + 67050, + 67142, + 67024, + 67002, + 67141 + ], + "sample_count": 32 + }, + { + "pubkey": "2K7KFZVM5RvseGhK9vdf6uq5xLwU3ApxJhxj8UDjyv37", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 71339, + 71609, + 71410, + 71298, + 71298, + 71469, + 71231, + 71343, + 71597, + 71198, + 71541, + 71515, + 71294, + 71101, + 71722, + 71474, + 71327, + 71587, + 71873, + 71253, + 71556, + 71556, + 71313, + 71243, + 71442, + 71322, + 71379, + 71525, + 71232, + 71232, + 71331, + 71182 + ], + "sample_count": 32 + }, + { + "pubkey": "BbGZgNi1m5DFwVKucEfCb87jhrdn8dMjWyJ2znTGapxE", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143460000000, + "samples": [ + 69648, + 69630, + 69621, + 69613, + 69619, + 69634, + 69687, + 69564, + 69589, + 69569, + 69587, + 69657, + 69555, + 69573, + 69647, + 69539, + 69618, + 69585, + 69594, + 69608, + 69592, + 69669, + 69596, + 69635, + 69649, + 69704, + 69645, + 69632, + 69561, + 69585, + 69638, + 69634 + ], + "sample_count": 32 + }, + { + "pubkey": "HGUcMjd9g9Pa4KWU8mopWEXqWgdaz6yKLgABUCe69F8X", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 16369, + 16504, + 16504, + 16360, + 16424, + 16520, + 16477, + 16336, + 16650, + 16424, + 16424, + 16442, + 16442, + 16677, + 16677, + 16416, + 16465, + 16429, + 16497, + 16419, + 18345, + 17151, + 16225, + 16343, + 16592, + 16336, + 16398, + 16330, + 16389, + 16787, + 16419, + 16347 + ], + "sample_count": 32 + }, + { + "pubkey": "CU2mdDNCXLM8aiHJJSnMsSZjimJ2urjTrU89euKbwYrh", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143458000000, + "samples": [ + 16952, + 16945, + 16921, + 17000, + 17020, + 17069, + 17033, + 16994, + 17101, + 16984, + 16997, + 17060, + 17054, + 16844, + 16972, + 16980, + 16996, + 16988, + 17004, + 17013, + 17003, + 17002, + 16946, + 16947, + 17048, + 17015, + 16972, + 17055, + 16971, + 16914, + 17005, + 16980 + ], + "sample_count": 32 + }, + { + "pubkey": "55gHaMQfgWWkHQK38myyRudzZMu79x4wXUrDRkZtgErN", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 160975, + 160975, + 165526, + 165526, + 161155, + 161593, + 161091, + 161377, + 161136, + 161264, + 161465, + 161079, + 161494, + 161444, + 161165, + 161150, + 161289, + 161239, + 162336, + 161315, + 161038, + 161108, + 161103, + 160992, + 161181, + 161181, + 160987, + 161101, + 163841, + 161050, + 161042, + 161205 + ], + "sample_count": 32 + }, + { + "pubkey": "97eQP9FeTKdaRnZMFVM5fYstvzMLou1AMEQE5oCU3Y5f", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143458000000, + "samples": [ + 163792, + 163359, + 162296, + 162538, + 162435, + 163265, + 163950, + 163840, + 163881, + 163886, + 163143, + 163963, + 169149, + 163301, + 162531, + 163343, + 162655, + 162570, + 162638, + 163908, + 163957, + 163383, + 163915, + 164003, + 163968, + 163960, + 164034, + 163783, + 163944, + 164006, + 163903, + 164067 + ], + "sample_count": 32 + }, + { + "pubkey": "Bz6Ef4yoxGMeWMrvcdTH4mHWx6USp3fZsr4gfk2JKYSX", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 16952, + 20914, + 16854, + 16818, + 17001, + 16842, + 16920, + 31845, + 16887, + 16850, + 24984, + 17277, + 16829, + 30089, + 30089, + 17112, + 16851, + 21856, + 16815, + 16815, + 16901, + 25272, + 16784, + 16874, + 19481, + 16873, + 16776, + 31065, + 16823, + 17066, + 16999, + 17225 + ], + "sample_count": 32 + }, + { + "pubkey": "4hG5AppzJynW1Lh5gBHjdBFJWELpns97qjQDrpqgV3TV", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143473000000, + "samples": [ + 21227, + 21222, + 21211, + 21172, + 21208, + 21194, + 21211, + 21220, + 21187, + 21178, + 21182, + 21197, + 21199, + 21216, + 21201, + 21176, + 21214, + 21173, + 21216, + 21202, + 21176, + 21207, + 21187, + 21206, + 21189, + 21210, + 21197, + 21196, + 21203, + 21207, + 21208, + 21189 + ], + "sample_count": 32 + }, + { + "pubkey": "24MRXHEskWELWyBkKid7uPghx1McKUCaL4VXXy9Vya9i", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 87483, + 88229, + 87426, + 87486, + 93239, + 89336, + 87387, + 88462, + 88462, + 87709, + 87450, + 87785, + 87685, + 87436, + 88560, + 87603, + 87434, + 87731, + 87430, + 87588, + 87612, + 87422, + 88003, + 87877, + 87536, + 87429, + 89909, + 87460, + 89374, + 89617, + 87709, + 87489 + ], + "sample_count": 32 + }, + { + "pubkey": "FQ6LD4CffcFvMiVZTpkCTFEADN5Nf1Ev3595CgYqHeaC", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143473000000, + "samples": [ + 97165, + 97341, + 97312, + 97082, + 97342, + 97171, + 97435, + 97263, + 97326, + 97341, + 97353, + 97396, + 97351, + 97358, + 97384, + 97310, + 97236, + 97332, + 97346, + 97339, + 97359, + 97175, + 97269, + 97342, + 97294, + 97138, + 97323, + 97235, + 97124, + 97273, + 97346, + 97421 + ], + "sample_count": 32 + }, + { + "pubkey": "ESbJRwvKJqwKjfKPuEwUKBrHHDPrhVYDL6eAwg3egFoA", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 12749, + 12764, + 12889, + 12704, + 12738, + 12744, + 14314, + 12847, + 12680, + 12690, + 12800, + 12883, + 12667, + 12657, + 12676, + 12772, + 12885, + 12832, + 12682, + 12792, + 12825, + 12738, + 12723, + 12747, + 12847, + 12847, + 12729, + 12787, + 12848, + 12934, + 12762, + 12723 + ], + "sample_count": 32 + }, + { + "pubkey": "9q4gxw9DzuxkwRdPyRnxkjSHriBLUHwSznxsntXAHkc8", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143473000000, + "samples": [ + 18413, + 18451, + 18431, + 18418, + 18396, + 18435, + 18403, + 18393, + 18397, + 18400, + 18405, + 18428, + 18448, + 18402, + 18424, + 18441, + 18430, + 18404, + 18395, + 18438, + 18394, + 18418, + 18434, + 18395, + 18426, + 18414, + 18407, + 18394, + 18426, + 18433, + 18403, + 18429 + ], + "sample_count": 32 + }, + { + "pubkey": "5oZQ1eLrqg4ZXS7ZNLuS5EdA3XvCYPWktK5XV59CvM8E", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 98810, + 98810, + 98359, + 98271, + 98300, + 98276, + 98218, + 98082, + 98356, + 98235, + 98142, + 98160, + 99090, + 98234, + 98241, + 98331, + 98304, + 100146, + 99394, + 98188, + 98352, + 98221, + 98175, + 98184, + 98260, + 98147, + 98260, + 98237, + 98440, + 98264, + 98426, + 98154 + ], + "sample_count": 32 + }, + { + "pubkey": "9Zt19nXQWYVNz22hACu8uod38VvVodV3n9yCz3ZeSCw8", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143472000000, + "samples": [ + 114824, + 114795, + 114776, + 114832, + 114749, + 114796, + 114837, + 114804, + 114788, + 114794, + 114820, + 114855, + 114791, + 114837, + 114849, + 114798, + 114864, + 114805, + 114838, + 114813, + 114767, + 114858, + 114826, + 114835, + 114791, + 114801, + 114904, + 114788, + 114781, + 114785, + 114809, + 114844 + ], + "sample_count": 32 + }, + { + "pubkey": "2QvxGR9YN7t15w8PmDdxMDAmpLdDM27NSeZwvQCa3fk1", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 109258, + 109704, + 109216, + 109512, + 109486, + 109342, + 109326, + 109298, + 109545, + 109780, + 109558, + 109370, + 109429, + 109404, + 109254, + 109399, + 109937, + 109627, + 109347, + 109308, + 109350, + 109396, + 109324, + 110413, + 109353, + 109411, + 109443, + 109330, + 111269, + 111156, + 111004, + 111115 + ], + "sample_count": 32 + }, + { + "pubkey": "DMgjb3yaDsS3FWx3VDa5jQT9RX6oSbwUuYjeSvEH2HVb", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143467000000, + "samples": [ + 113880, + 113944, + 113873, + 113874, + 113824, + 113852, + 114024, + 113825, + 113866, + 116340, + 113911, + 113901, + 113876, + 113849, + 113856, + 113888, + 113877, + 113901, + 113865, + 113889, + 113939, + 113909, + 113848, + 113867, + 113876, + 113842, + 113923, + 113856, + 113922, + 113879, + 113913, + 113927 + ], + "sample_count": 32 + }, + { + "pubkey": "9vXo2teJHjy5Hiu4Q6LjsyMWjGxXEji6BNS7rz4GWcBn", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 109048, + 110203, + 109306, + 114987, + 111074, + 109137, + 109066, + 109228, + 109253, + 109211, + 109211, + 110058, + 109317, + 109062, + 109586, + 109476, + 109742, + 110182, + 110248, + 111187, + 109878, + 109397, + 109228, + 109974, + 109097, + 109040, + 109223, + 109524, + 109415, + 109415, + 109527, + 110171 + ], + "sample_count": 32 + }, + { + "pubkey": "3ejRsGECCav5iVSiooMMnj1ZZpdxnNAF8YtaUv1sNPSA", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143468000000, + "samples": [ + 116671, + 116846, + 116727, + 116662, + 116698, + 116627, + 116757, + 116662, + 116667, + 116689, + 116716, + 116718, + 116698, + 116677, + 116703, + 116671, + 116753, + 116658, + 116677, + 116732, + 116676, + 116744, + 116708, + 116737, + 116647, + 116725, + 116718, + 116652, + 116650, + 116662, + 116660, + 116769 + ], + "sample_count": 32 + }, + { + "pubkey": "6gEDUNUfU272UfNjY5zyAzdTnAMQgrULVQyerzXdqx76", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 163069, + 163192, + 163017, + 162956, + 163402, + 163115, + 163079, + 163079, + 163231, + 163048, + 163190, + 163161, + 164457, + 164321, + 164320, + 164484, + 165491, + 164579, + 164606, + 288457, + 164577, + 164591, + 164464, + 164580, + 164645, + 164395, + 164523, + 164515, + 164471, + 164471, + 164444, + 164350 + ], + "sample_count": 32 + }, + { + "pubkey": "A66WyqhCQXNN29BfsASpqVSCPt6MUtBbC1rCFpkNqcQb", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143467000000, + "samples": [ + 146805, + 146932, + 146869, + 146846, + 146815, + 146864, + 146927, + 146798, + 146861, + 146853, + 146865, + 146913, + 146946, + 146899, + 146790, + 146876, + 146902, + 146885, + 146843, + 146803, + 146850, + 146990, + 146849, + 146887, + 146817, + 146906, + 146933, + 146845, + 146841, + 146846, + 146841, + 146925 + ], + "sample_count": 32 + }, + { + "pubkey": "GbbHGcUCN1EvwA5T871KWFqT6UbTdEovsBe2gYWoUxmV", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143483000000, + "samples": [ + 35312, + 37075, + 35119, + 35086, + 35207, + 35169, + 35091, + 35304, + 35179, + 35640, + 35923, + 35289, + 35102, + 35446, + 35293, + 36353, + 35209, + 35128, + 35143, + 35548, + 36416, + 35041, + 35201, + 35122, + 35097, + 35229, + 35187, + 35187, + 35164, + 35091, + 35091, + 35155 + ], + "sample_count": 32 + }, + { + "pubkey": "BxtrmpneZGYmDbrdsKVsjWMg1SnyaGzuCb1BesDXiKAn", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143468000000, + "samples": [ + 40781, + 40859, + 40772, + 40675, + 40809, + 40780, + 40775, + 40727, + 40719, + 40707, + 40718, + 40735, + 40793, + 40734, + 40740, + 40765, + 40763, + 40828, + 40754, + 40770, + 40698, + 40837, + 40756, + 40706, + 40695, + 40733, + 40694, + 40715, + 40726, + 40741, + 40683, + 40788 + ], + "sample_count": 32 + }, + { + "pubkey": "5U94D4XijqyZdVQtBt3ogqkjzrsCs5aLC4y9SUe5z98M", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 45592, + 45705, + 49030, + 45651, + 46218, + 46284, + 45746, + 45594, + 45522, + 45875, + 45676, + 45640, + 45620, + 45664, + 45709, + 45654, + 45897, + 45897, + 45804, + 45593, + 45840, + 45629, + 45753, + 46173, + 46173, + 45614, + 45625, + 45610, + 45699, + 45623, + 45718, + 45546 + ], + "sample_count": 32 + }, + { + "pubkey": "9fafiNdaypScUcbUmTM16AKc99irGibJtTptHPtz6uDf", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143470000000, + "samples": [ + 52611, + 52437, + 52414, + 52455, + 52425, + 52429, + 52513, + 52442, + 52622, + 52583, + 52450, + 52464, + 52423, + 52622, + 52621, + 52633, + 52440, + 52319, + 52412, + 52380, + 52397, + 52455, + 52331, + 52626, + 52593, + 52343, + 52516, + 52381, + 52495, + 52426, + 52493, + 52629 + ], + "sample_count": 32 + }, + { + "pubkey": "HkLZXreyFpzQz6dDQ4kuSENoiUFK5QzC2wuokKpnmsWd", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 116724, + 116734, + 116755, + 116704, + 116702, + 117248, + 117023, + 117216, + 117469, + 117144, + 117137, + 117103, + 117161, + 117437, + 117153, + 119826, + 118081, + 117155, + 117175, + 117411, + 117199, + 117179, + 117139, + 117125, + 124239, + 117732, + 117305, + 117155, + 117315, + 117104, + 117619, + 117204 + ], + "sample_count": 32 + }, + { + "pubkey": "FCuveZoQRwaY1K5fHNitjibAvae9BYji1rmajHFTU1wV", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143471000000, + "samples": [ + 121034, + 121048, + 121000, + 121174, + 121152, + 121078, + 121262, + 121208, + 121005, + 121079, + 120988, + 121164, + 121105, + 120916, + 121028, + 121262, + 121341, + 121006, + 121018, + 121120, + 121001, + 121092, + 121134, + 121160, + 121210, + 121053, + 121115, + 121199, + 121181, + 121146, + 121012, + 121334 + ], + "sample_count": 32 + }, + { + "pubkey": "8gq361BeQPFNjo9u4B5x9iUpNEEhPXhxQfC8GtEWqEkm", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 10370, + 10370, + 10501, + 10529, + 10455, + 10824, + 10479, + 10411, + 10516, + 10418, + 10383, + 10578, + 10602, + 10442, + 10390, + 10375, + 10504, + 10390, + 10268, + 10431, + 10710, + 10351, + 10525, + 10424, + 10490, + 10318, + 10594, + 10951, + 10366, + 10463, + 10486, + 10486 + ], + "sample_count": 32 + }, + { + "pubkey": "2GXALk2moEo98JU1aFJZKwyzWqEUaoucabq6XZoB8w67", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143472000000, + "samples": [ + 14372, + 14444, + 14414, + 14421, + 14386, + 14418, + 14410, + 14390, + 14444, + 14435, + 14424, + 14414, + 14404, + 14358, + 14432, + 14388, + 14434, + 14416, + 14374, + 14443, + 14407, + 14424, + 14389, + 14389, + 14384, + 14437, + 14413, + 14446, + 14440, + 14431, + 14415, + 14394 + ], + "sample_count": 32 + }, + { + "pubkey": "CZX8JhjoKaLfMZWEgZuFhpKcNer6tNuRubaUta2J5KaV", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 100429, + 100441, + 100361, + 100319, + 100373, + 100543, + 100290, + 100290, + 100498, + 100560, + 100305, + 100339, + 100322, + 100430, + 100451, + 100304, + 100479, + 100390, + 100414, + 102088, + 100474, + 100400, + 100400, + 100329, + 100549, + 100396, + 100494, + 100399, + 100369, + 100384, + 100425, + 100394 + ], + "sample_count": 32 + }, + { + "pubkey": "B1WrF644f5yiZn3rgX5avb494Az5mXfGYQPtRbf5HK3H", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143465000000, + "samples": [ + 102092, + 102194, + 102075, + 101999, + 102051, + 102026, + 102080, + 101987, + 102008, + 102036, + 102104, + 102243, + 102102, + 102224, + 102191, + 102073, + 102209, + 102059, + 102072, + 102052, + 102056, + 102049, + 102135, + 102189, + 102054, + 102155, + 102082, + 102029, + 102093, + 102024, + 102068, + 102108 + ], + "sample_count": 32 + }, + { + "pubkey": "HoEBpAXcPYyErehTR6bxgMKcZgUNozoxyMZP72BLR3PP", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 126962, + 126825, + 126825, + 127457, + 127288, + 127203, + 127433, + 127412, + 127316, + 127095, + 126966, + 127068, + 127048, + 127048, + 126940, + 127172, + 127076, + 127076, + 127755, + 129084, + 127919, + 128073, + 128073, + 128320, + 127997, + 127584, + 128233, + 128233, + 127844, + 129387, + 128942, + 128942 + ], + "sample_count": 32 + }, + { + "pubkey": "4jKzZbC2BsGzPoRhvHoDMyNNFeW8fLNW9ZSz8T2yJmxC", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143471000000, + "samples": [ + 129556, + 129571, + 129524, + 129577, + 129568, + 129485, + 129592, + 129520, + 129526, + 129512, + 129532, + 129598, + 129524, + 129559, + 129505, + 129543, + 129583, + 129554, + 129519, + 129566, + 129496, + 129660, + 129478, + 129499, + 129497, + 129447, + 129648, + 129416, + 129478, + 129503, + 129545, + 129592 + ], + "sample_count": 32 + }, + { + "pubkey": "6FejfLEUgJKtHj5EU6w6CJw1a2YodrruPJ9GZnbQn75h", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143482000000, + "samples": [ + 218731, + 217504, + 217402, + 217321, + 217387, + 217480, + 217393, + 217494, + 217403, + 217487, + 217892, + 217301, + 217338, + 217496, + 217496, + 217504, + 217332, + 217470, + 217468, + 217539, + 217407, + 217630, + 217426, + 217365, + 217410, + 217390, + 217688, + 217452, + 217452, + 217328, + 217574, + 219334 + ], + "sample_count": 32 + }, + { + "pubkey": "3fuPFcem3XSZnsq9g4FCp85DuLhfTQUV6HJiXmNRfsMJ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143471000000, + "samples": [ + 214473, + 214659, + 214496, + 214445, + 214449, + 214468, + 214556, + 214500, + 214411, + 214441, + 214509, + 214830, + 214815, + 214519, + 214473, + 214480, + 215003, + 214524, + 214535, + 214434, + 214514, + 214567, + 214450, + 214464, + 214464, + 214443, + 214543, + 214464, + 214424, + 214550, + 214477, + 214529 + ], + "sample_count": 32 + }, + { + "pubkey": "H57VEHsikeMebHSbEnRdnMDycMNSfijbLkNdp9QScjK", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 20340, + 20848, + 20340, + 20270, + 20725, + 20481, + 20572, + 20586, + 19027, + 18917, + 19021, + 20700, + 20369, + 20346, + 20423, + 20303, + 20489, + 20328, + 20328, + 20716, + 19483, + 19531, + 19086, + 19080, + 19207, + 19900, + 19151, + 18895, + 18919, + 18919, + 19156, + 19405 + ], + "sample_count": 32 + }, + { + "pubkey": "BQui6yJuTbZmkSPTbUFJgy9WMrtRwv47nHFneUmt5TKA", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143474000000, + "samples": [ + 18978, + 18976, + 18988, + 19018, + 18983, + 18929, + 18958, + 18985, + 18963, + 18964, + 19006, + 18928, + 18968, + 18983, + 18984, + 18979, + 18960, + 18978, + 18973, + 18983, + 18987, + 18981, + 19017, + 18961, + 18993, + 18966, + 18994, + 18989, + 18979, + 19007, + 18964, + 19015 + ], + "sample_count": 32 + }, + { + "pubkey": "DSdoTtuX1Zta7uYUPJjf2Q5DMn8Wwimk5s9cLUKGaSYR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 39797, + 39582, + 39582, + 39497, + 39479, + 42817, + 39475, + 39394, + 39574, + 39263, + 39540, + 39655, + 39642, + 39406, + 40006, + 39513, + 39497, + 39497, + 40003, + 39850, + 39707, + 39503, + 39541, + 39401, + 39401, + 39747, + 39549, + 39439, + 39571, + 39513, + 39248, + 39843 + ], + "sample_count": 32 + }, + { + "pubkey": "6AEPcwt8RSHxBqmudJ9jiitXyJzsq546XFUqhtPy2AMh", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143474000000, + "samples": [ + 44270, + 44271, + 44246, + 44212, + 44251, + 44252, + 44216, + 44251, + 44229, + 44263, + 44255, + 44265, + 44264, + 44242, + 44233, + 44269, + 44225, + 44234, + 44269, + 44219, + 44233, + 44259, + 44260, + 44246, + 44274, + 44254, + 44262, + 44259, + 44243, + 44249, + 44241, + 44242 + ], + "sample_count": 32 + }, + { + "pubkey": "7wFo5s1sKf6YLQDs62yZk9a9AuzumUz6khtq76Cwq6BM", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 180675, + 181044, + 185846, + 180671, + 180671, + 180918, + 180635, + 180713, + 180912, + 180929, + 180671, + 180753, + 180727, + 180679, + 180650, + 180751, + 180583, + 181038, + 180701, + 180693, + 180638, + 180687, + 180662, + 180741, + 180696, + 180634, + 180795, + 180690, + 180775, + 180752, + 180673, + 180798 + ], + "sample_count": 32 + }, + { + "pubkey": "sVDU2vp8HdLQ6rd2Gy6A1ENF9oJmXWcZMr8wT37mqVY", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143475000000, + "samples": [ + 186868, + 186878, + 186738, + 186836, + 186785, + 186769, + 186865, + 186831, + 186853, + 186847, + 186823, + 186950, + 186764, + 186805, + 186677, + 186817, + 186826, + 186644, + 186778, + 186828, + 186816, + 186958, + 186758, + 186795, + 186826, + 186821, + 186918, + 186685, + 186734, + 186760, + 186700, + 186951 + ], + "sample_count": 32 + }, + { + "pubkey": "CSBtu4v9KVg9WeNaNPrxRYg9YxE161BLHJYB1cH6Z39o", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143484000000, + "samples": [ + 18293, + 18252, + 18290, + 18186, + 18430, + 18617, + 18572, + 18438, + 18438, + 18186, + 18376, + 18376, + 18604, + 18467, + 18197, + 18197, + 18692, + 18393, + 18598, + 18598, + 18987, + 18262, + 18258, + 18753, + 18394, + 18602, + 25046, + 18208, + 19051, + 18485, + 18521, + 18611 + ], + "sample_count": 32 + }, + { + "pubkey": "5Kx8TNk4tGiRPUz5gDcWqJNVRpv2X2ZZbDLQ3PmcoMkU", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143475000000, + "samples": [ + 18448, + 18442, + 18407, + 18378, + 18423, + 18444, + 18460, + 18346, + 18443, + 18418, + 18467, + 18401, + 18353, + 18453, + 18413, + 18418, + 18401, + 18451, + 18417, + 18354, + 18394, + 18443, + 18379, + 18431, + 18382, + 18467, + 18410, + 18434, + 18482, + 18416, + 18403, + 18482 + ], + "sample_count": 32 + }, + { + "pubkey": "2JmMx9UAoxjooAxkeDzE4yjEAhLdnEvYArhLLmz7qawj", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 98424, + 98701, + 98497, + 99427, + 98818, + 98940, + 98547, + 98508, + 98503, + 98771, + 98455, + 98461, + 98476, + 98494, + 98502, + 98542, + 98425, + 98707, + 98604, + 98752, + 98528, + 98592, + 98605, + 98605, + 98576, + 98822, + 98669, + 98504, + 98427, + 98715, + 98452, + 98488 + ], + "sample_count": 32 + }, + { + "pubkey": "66UTZu7b7vD872Xv9DjmDNwUBhEqpkLV4DXd8Ecf9JSQ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143465000000, + "samples": [ + 106645, + 106712, + 106619, + 106650, + 106622, + 106657, + 106720, + 106651, + 106622, + 106611, + 106629, + 106677, + 106656, + 106659, + 106646, + 106653, + 106692, + 106640, + 106625, + 106666, + 106664, + 106658, + 106608, + 106640, + 106639, + 106620, + 106703, + 106599, + 106664, + 106642, + 106646, + 106740 + ], + "sample_count": 32 + }, + { + "pubkey": "Gqja4UtRa58ppTwnAMnJ1ba7bNshszAA32rm5w6x6zt9", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143482000000, + "samples": [ + 105806, + 105807, + 105816, + 105792, + 105885, + 105842, + 105820, + 105892, + 106035, + 106035, + 105914, + 106082, + 105691, + 105797, + 105797, + 105915, + 105907, + 105907, + 105819, + 106314, + 106023, + 106023, + 105890, + 106035, + 105771, + 105793, + 106391, + 105839, + 105839, + 105920, + 105902, + 105917 + ], + "sample_count": 32 + }, + { + "pubkey": "7AEgcHLCmq7XwaZHJLvD3PqFZrhj3NVYSFUo97QrA6ut", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143466000000, + "samples": [ + 98987, + 98995, + 98943, + 98950, + 98952, + 98931, + 99038, + 98904, + 98861, + 98917, + 98905, + 98994, + 98946, + 98976, + 98984, + 98931, + 99006, + 98973, + 98915, + 98895, + 98935, + 98992, + 98962, + 98925, + 98948, + 98941, + 98964, + 98894, + 98951, + 98960, + 98956, + 99000 + ], + "sample_count": 32 + }, + { + "pubkey": "2d8q2TEk3V49vyBvWPxs4TUfLXWJrXBmFSvoszFg5yNE", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 123889, + 123965, + 124245, + 124055, + 124885, + 124019, + 123845, + 124554, + 124018, + 124063, + 125820, + 124726, + 124292, + 124216, + 124202, + 124006, + 125492, + 124163, + 126126, + 131888, + 164632, + 125626, + 124807, + 123862, + 123958, + 124415, + 125314, + 123899, + 124518, + 124413, + 124047, + 124132 + ], + "sample_count": 32 + }, + { + "pubkey": "8hNVTaeLrqtuNbpizKFs4ob2NFqUHMRUJKPRUKZcCV48", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143467000000, + "samples": [ + 109795, + 109786, + 109700, + 109766, + 109721, + 109720, + 109834, + 109719, + 109723, + 109742, + 109778, + 109780, + 109729, + 109726, + 109725, + 109747, + 109781, + 109764, + 109738, + 109750, + 109757, + 109785, + 109751, + 109759, + 109741, + 109776, + 109851, + 109738, + 109749, + 109679, + 109762, + 109755 + ], + "sample_count": 32 + }, + { + "pubkey": "E9e3NpUxrEFYXrP7NX6WaWiooqdaMh9szrDMY4Qe7N8L", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143483000000, + "samples": [ + 19868, + 20070, + 20001, + 20001, + 20062, + 20062, + 20060, + 20424, + 20292, + 20131, + 22234, + 20505, + 20505, + 19815, + 20085, + 20423, + 20167, + 20658, + 19964, + 19946, + 19962, + 20752, + 20752, + 20388, + 20038, + 19955, + 19762, + 19900, + 20240, + 20240, + 19876, + 20002 + ], + "sample_count": 32 + }, + { + "pubkey": "2Ee9tiDWC2B1RRWN1pZueM8V1HRFhz94WvJ18AKWLcbF", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143469000000, + "samples": [ + 22448, + 22428, + 22274, + 22425, + 22330, + 22447, + 22428, + 22466, + 22392, + 22351, + 22380, + 22386, + 22377, + 22414, + 22413, + 22395, + 22418, + 22423, + 22334, + 22390, + 22377, + 22419, + 22377, + 22330, + 22427, + 22373, + 22553, + 22379, + 22417, + 22402, + 22379, + 22417 + ], + "sample_count": 32 + }, + { + "pubkey": "4tfn4btirHHKCa8Gbenm5aqrm4Nb3BC9gopRDFB4cAg2", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 40834, + 40873, + 40885, + 40854, + 40748, + 40879, + 40806, + 40918, + 40831, + 40785, + 41993, + 41087, + 40783, + 41333, + 40830, + 40845, + 40990, + 40819, + 40800, + 41058, + 41746, + 40832, + 40936, + 40814, + 40759, + 40804, + 40667, + 40832, + 40986, + 40893, + 41054, + 41292 + ], + "sample_count": 32 + }, + { + "pubkey": "GcecJGLzmg6ZGQ9QYvczGZEb1CdYSp8tTFBh4pnmune4", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143470000000, + "samples": [ + 29697, + 29771, + 29716, + 29698, + 29770, + 29750, + 29744, + 29734, + 29924, + 29795, + 29803, + 29742, + 29719, + 29693, + 29746, + 29925, + 29723, + 29931, + 29695, + 29719, + 29721, + 29665, + 29796, + 29665, + 29656, + 29707, + 29836, + 29787, + 29813, + 29752, + 29740, + 29832 + ], + "sample_count": 32 + }, + { + "pubkey": "3PvHSJtWKZD1qzuecsQMpYxt1EPcP24GVgXdBSbHZcAG", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 46575, + 47359, + 46786, + 46565, + 46810, + 46488, + 56168, + 46689, + 46534, + 46607, + 47149, + 46730, + 52718, + 47158, + 46722, + 46722, + 46462, + 46674, + 46534, + 46553, + 47239, + 46737, + 47143, + 46632, + 46616, + 46621, + 46621, + 46601, + 46553, + 46377, + 46912, + 46572 + ], + "sample_count": 32 + }, + { + "pubkey": "CrfntNAHYL3KDEDYHu8WHWqdtvesQcAee6dEVBgDcjRX", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143466000000, + "samples": [ + 46726, + 46733, + 46711, + 46826, + 46735, + 46720, + 46735, + 46687, + 46816, + 46770, + 46660, + 46811, + 46831, + 46643, + 46687, + 46721, + 46786, + 46727, + 46710, + 46729, + 46770, + 46829, + 46653, + 46790, + 46747, + 46743, + 46785, + 46738, + 46733, + 46730, + 46732, + 47007 + ], + "sample_count": 32 + }, + { + "pubkey": "87Wu5kVMtzHyCAeVvK15NvfFvpfeoSPBU2DqV3ZtxPGf", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143485000000, + "samples": [ + 101747, + 102119, + 101657, + 101657, + 101545, + 101698, + 101492, + 101701, + 101707, + 101707, + 101593, + 101589, + 101542, + 101497, + 101427, + 102391, + 101754, + 101520, + 102332, + 101562, + 101707, + 101707, + 101630, + 101626, + 101626, + 101571, + 102713, + 101686, + 101461, + 101761, + 101807, + 101629 + ], + "sample_count": 32 + }, + { + "pubkey": "6svjt47JFRckVqtEJGVcqm2J5tYaoADVURdJBUrK7a2j", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143469000000, + "samples": [ + 120885, + 120991, + 120800, + 120850, + 120833, + 120793, + 120882, + 120783, + 120843, + 120869, + 120901, + 120831, + 120862, + 120872, + 120862, + 120850, + 120876, + 120817, + 120873, + 120805, + 120826, + 120831, + 120885, + 120911, + 120851, + 120757, + 120842, + 120816, + 120864, + 120854, + 120830, + 120824 + ], + "sample_count": 32 + }, + { + "pubkey": "vaaT3iXDHFThnxnVoxuppcQg8Jx1L5miHSCsKAPAMVc", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143483000000, + "samples": [ + 90161, + 90497, + 91075, + 90313, + 90401, + 90337, + 90169, + 90422, + 90344, + 90115, + 90255, + 90458, + 90156, + 88215, + 90151, + 90172, + 90172, + 90336, + 90141, + 90174, + 92677, + 90202, + 90186, + 90217, + 90187, + 90187, + 90194, + 90545, + 90203, + 90141, + 90296, + 90296 + ], + "sample_count": 32 + }, + { + "pubkey": "9Y9peHoXiXzc8sajFVfPjQTwAu1HQYVG2ngQMGegf7u3", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143465000000, + "samples": [ + 85344, + 85563, + 85433, + 85389, + 85429, + 85369, + 85567, + 85429, + 85333, + 85352, + 85552, + 85477, + 85537, + 85485, + 85463, + 85634, + 85420, + 92329, + 85417, + 85423, + 85537, + 85457, + 85358, + 85327, + 85448, + 85584, + 85448, + 85424, + 85568, + 85477, + 85458, + 85543 + ], + "sample_count": 32 + }, + { + "pubkey": "ApNKo3BJ6y4ZXrV1s7JprLV6cVCibbtbpq4QZ5e26CXr", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 126467, + 128284, + 126702, + 126374, + 128019, + 126478, + 126303, + 126454, + 126410, + 126634, + 126766, + 126249, + 126587, + 126324, + 126993, + 126993, + 126170, + 126558, + 126329, + 126353, + 126365, + 126388, + 126420, + 128891, + 126521, + 126451, + 128819, + 126737, + 126292, + 126391, + 126381, + 126317 + ], + "sample_count": 32 + }, + { + "pubkey": "FoYSfvzZHZLVtMBWDjtkhSkMF3j1T9Dr7bTjVzqCky1m", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143469000000, + "samples": [ + 140156, + 140215, + 140119, + 140128, + 140142, + 140172, + 140148, + 140114, + 140180, + 140108, + 140172, + 140186, + 140133, + 140139, + 140157, + 140159, + 140229, + 140118, + 140173, + 140133, + 140094, + 140203, + 140141, + 140111, + 140147, + 140108, + 140227, + 140109, + 140141, + 140163, + 140155, + 140175 + ], + "sample_count": 32 + }, + { + "pubkey": "CZddXYWiEm9Bw4sSQegRz7Pgi33UKk8HxHFPF9tRnxPK", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 103722, + 114298, + 114298, + 103534, + 103331, + 103331, + 108249, + 103558, + 104002, + 119396, + 103641, + 103656, + 111392, + 111392, + 103787, + 103963, + 116371, + 103449, + 103430, + 107567, + 103540, + 104283, + 107523, + 104150, + 103415, + 106947, + 103669, + 103668, + 111880, + 103544, + 103431, + 103472 + ], + "sample_count": 32 + }, + { + "pubkey": "Erhja9uESwt7zXHJQgjUCAwMnod7BD6zyF9k9gsMacZA", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143511000000, + "samples": [ + 106446, + 106436, + 106443, + 106364, + 106383, + 106379, + 106418, + 106432, + 106408, + 106392, + 106428, + 106401, + 106424, + 106419, + 106441, + 106402, + 106426, + 106439, + 106430, + 106444, + 106443, + 106371, + 106432, + 106414, + 106424, + 106368, + 106404, + 106423, + 106393, + 106409, + 106430, + 106461 + ], + "sample_count": 32 + }, + { + "pubkey": "DTGXZDBkDjqqHXiQX5CxKzxqC5ti8dFmWGV6z1YRYTZx", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 94263, + 94229, + 94310, + 94249, + 94273, + 94151, + 94218, + 94279, + 94639, + 94211, + 94398, + 94360, + 94168, + 94268, + 94223, + 94177, + 94466, + 94944, + 94287, + 94565, + 94555, + 94555, + 94239, + 94479, + 94276, + 94214, + 94214, + 94269, + 94302, + 94200, + 94205, + 94310 + ], + "sample_count": 32 + }, + { + "pubkey": "C7KdLCjB1vkgMNN69dTpfGgV87mMZbTFzgtALsSU8rBX", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143510000000, + "samples": [ + 98045, + 98009, + 98092, + 98059, + 98073, + 98099, + 98041, + 98013, + 98053, + 98037, + 98074, + 98028, + 98091, + 98065, + 98003, + 98108, + 98053, + 98077, + 98053, + 98047, + 97999, + 98054, + 98033, + 98033, + 98059, + 98081, + 98036, + 98069, + 98100, + 98038, + 98113, + 98020 + ], + "sample_count": 32 + }, + { + "pubkey": "2dP9LQc47Qxt7HpsPhedbuBvrFH46TWmGVr8oodCqArf", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 33800, + 33584, + 33605, + 33537, + 33537, + 33530, + 33583, + 33614, + 33614, + 33981, + 33632, + 33696, + 33696, + 33565, + 33660, + 33698, + 33607, + 33607, + 33530, + 33436, + 33789, + 33483, + 33504, + 33673, + 33614, + 33712, + 33688, + 33616, + 33432, + 33913, + 33913, + 33530 + ], + "sample_count": 32 + }, + { + "pubkey": "9yAyy5U8Wxh2TWNMss8dkrchWGmgB91fBtAtRPuECSCi", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143510000000, + "samples": [ + 40880, + 40945, + 40933, + 40945, + 40895, + 40950, + 40904, + 40943, + 40906, + 40955, + 40882, + 40895, + 40867, + 40931, + 40945, + 40936, + 40893, + 40941, + 40961, + 40926, + 40974, + 40863, + 40895, + 40895, + 40874, + 40846, + 40891, + 40966, + 40949, + 40969, + 40963, + 40903 + ], + "sample_count": 32 + }, + { + "pubkey": "BNHzsfQEiyz633HYsvpa5kiX7ss2AfZDkwG1Q4QfnJ6M", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 7835, + 8004, + 7706, + 7758, + 7760, + 7623, + 7714, + 7859, + 7859, + 7928, + 7731, + 7733, + 7796, + 7676, + 7708, + 7880, + 7699, + 7699, + 7929, + 7911, + 7747, + 8226, + 7674, + 7690, + 8283, + 7863, + 7755, + 7967, + 7800, + 7800, + 7880, + 8121 + ], + "sample_count": 32 + }, + { + "pubkey": "4Sm5UTyEeApmJJdYS4DraDMy7WTqCkPGLRa6B4z1SnZa", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143507000000, + "samples": [ + 7342, + 7389, + 7360, + 7342, + 7402, + 7363, + 7332, + 7341, + 7353, + 7403, + 7400, + 7353, + 7380, + 7299, + 7426, + 7334, + 7366, + 7263, + 7359, + 7335, + 7382, + 7408, + 7353, + 7374, + 7405, + 7353, + 7434, + 7374, + 7428, + 7379, + 7368, + 7319 + ], + "sample_count": 32 + }, + { + "pubkey": "FXjvnbV8yhzeaGzqXiUuWYiuuHnhgqbBD8cTLHyAbAUL", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 28253, + 28253, + 31852, + 28508, + 28286, + 28692, + 28692, + 28135, + 28060, + 28253, + 28251, + 28161, + 28925, + 28192, + 28035, + 29422, + 28191, + 28310, + 28351, + 28262, + 27996, + 28861, + 28139, + 28006, + 29713, + 28225, + 28425, + 28199, + 28056, + 28130, + 29005, + 27998 + ], + "sample_count": 32 + }, + { + "pubkey": "CWpzjjrxmzsXiJHGXd3zSpb4TG1xqvocrickyqxUxQ29", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143507000000, + "samples": [ + 28625, + 28724, + 28750, + 28683, + 28698, + 28673, + 28597, + 28698, + 28761, + 28688, + 28693, + 28691, + 28702, + 28722, + 28694, + 28725, + 28632, + 28659, + 28722, + 28666, + 28682, + 28600, + 28737, + 28731, + 28724, + 28673, + 28701, + 28686, + 28745, + 28690, + 28703, + 28715 + ], + "sample_count": 32 + }, + { + "pubkey": "EL4KUh95J44MdxRkUGwsZPjR8cFUeShweAhqCcefMAti", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 267721, + 267721, + 268339, + 267721, + 267779, + 267952, + 267670, + 267752, + 268019, + 267884, + 267721, + 267813, + 267693, + 267722, + 267722, + 267785, + 267888, + 267776, + 267756, + 267979, + 267674, + 267777, + 267881, + 267609, + 278983, + 267913, + 267581, + 268014, + 267881, + 267882, + 267741, + 267741 + ], + "sample_count": 32 + }, + { + "pubkey": "BRwmR3kwLkGYsMAdu3emxh4PHwaVyMvBtHK5tBABxt9N", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143506000000, + "samples": [ + 248441, + 248478, + 248385, + 248358, + 248436, + 248328, + 248452, + 247343, + 247256, + 248407, + 248501, + 248449, + 248351, + 248456, + 248453, + 248412, + 248502, + 247245, + 247285, + 247312, + 247212, + 247243, + 247200, + 247197, + 247263, + 247202, + 247289, + 247257, + 247308, + 247234, + 247236, + 247240 + ], + "sample_count": 32 + }, + { + "pubkey": "9tCpGuuqdjjdgAETsHZCRXTo1KxXwVuifdK6Uz8TsSvz", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 30730, + 30405, + 30504, + 30516, + 30553, + 30486, + 30446, + 30666, + 30456, + 30411, + 30411, + 30547, + 30509, + 30325, + 30509, + 30538, + 30538, + 30424, + 30748, + 30748, + 30396, + 30347, + 30455, + 30481, + 30407, + 30475, + 30540, + 30544, + 30704, + 30581, + 30544, + 30588 + ], + "sample_count": 32 + }, + { + "pubkey": "7iSTkc1Sj4XpNz4XpjeKyo8kpGza2YwMLh5MgEv2ztop", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143509000000, + "samples": [ + 41243, + 41173, + 41011, + 41166, + 41236, + 40983, + 41234, + 40961, + 41250, + 41167, + 40946, + 41047, + 41237, + 41064, + 41293, + 40980, + 41188, + 41151, + 41202, + 41120, + 40914, + 40939, + 41091, + 41221, + 41219, + 41301, + 41189, + 41196, + 41091, + 41091, + 41242, + 41197 + ], + "sample_count": 32 + }, + { + "pubkey": "Dwxvf6JHLdPniEVkiaiqfBwWJEhswnUSCPf6JxXavztP", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 112171, + 112682, + 112173, + 112039, + 112558, + 112258, + 112213, + 112213, + 112515, + 112515, + 112293, + 112293, + 112124, + 112434, + 112321, + 112215, + 112535, + 112139, + 112373, + 112376, + 112191, + 112154, + 112279, + 112230, + 112172, + 112172, + 114387, + 112115, + 112312, + 112230, + 112338, + 111973 + ], + "sample_count": 32 + }, + { + "pubkey": "xzRLkWkm65E4U4ZBG9PKzaRD99i5Xr3MaoRxyYd8mwE", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143510000000, + "samples": [ + 114392, + 114439, + 114406, + 114379, + 114414, + 114428, + 114462, + 114459, + 114443, + 114412, + 114476, + 114444, + 114415, + 114443, + 114442, + 114422, + 114396, + 114470, + 114446, + 114472, + 114420, + 114444, + 114323, + 114424, + 114320, + 114436, + 114412, + 114427, + 114525, + 114489, + 114450, + 114432 + ], + "sample_count": 32 + }, + { + "pubkey": "6ZYZsjk24fndobDSQmUS5iM3zWq9DUoeZWKEYvtANVKT", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 200470, + 200622, + 200781, + 200431, + 200431, + 200868, + 200345, + 200549, + 201192, + 200455, + 200679, + 200912, + 200409, + 200514, + 200502, + 200286, + 200672, + 200711, + 200794, + 200406, + 200258, + 200258, + 200323, + 200246, + 345891, + 345891, + 200751, + 200404, + 200729, + 200718, + 200640, + 201206 + ], + "sample_count": 32 + }, + { + "pubkey": "5Sj4VQw5EiSyVBxMJAJVcbbLWswPpEbP252KyGtv9Pcs", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143509000000, + "samples": [ + 203808, + 203810, + 203809, + 203758, + 203838, + 203817, + 203776, + 203814, + 203818, + 203788, + 203794, + 203864, + 203828, + 203832, + 203831, + 203796, + 203854, + 203773, + 203862, + 203876, + 203737, + 203830, + 203798, + 203800, + 203787, + 203796, + 203828, + 203878, + 203794, + 203824, + 203815, + 203854 + ], + "sample_count": 32 + }, + { + "pubkey": "FADi6TA76nUiWz5WYNw2CBSkd2gEbexz79Uxf5ByskP5", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 177902, + 177969, + 177921, + 177837, + 176449, + 176412, + 177826, + 177941, + 177978, + 177964, + 178620, + 176472, + 176304, + 176459, + 176575, + 176443, + 176443, + 176382, + 176396, + 176374, + 176374, + 176425, + 176337, + 176359, + 176534, + 176404, + 176384, + 176479, + 176381, + 176625, + 176332, + 176321 + ], + "sample_count": 32 + }, + { + "pubkey": "7QnNi2EBTMQWbGoicrNLfMZKqtMEoXPvMLcUGLZmDFyE", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143508000000, + "samples": [ + 168179, + 168176, + 168207, + 168185, + 168170, + 168167, + 168174, + 168214, + 168217, + 168199, + 168160, + 168131, + 168192, + 168205, + 168131, + 168249, + 168161, + 168101, + 168206, + 168178, + 168203, + 168208, + 168216, + 168213, + 168149, + 168192, + 168146, + 168213, + 168183, + 168169, + 168099, + 168179 + ], + "sample_count": 32 + }, + { + "pubkey": "44rdnnksY8gV2e5Xve8njEckBUk3s7mzx8onMvkyeiX1", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 90579, + 90856, + 90592, + 90664, + 90606, + 90684, + 90617, + 90797, + 90755, + 90821, + 90780, + 90611, + 90589, + 91050, + 90737, + 90577, + 90841, + 90674, + 90766, + 91043, + 90549, + 90562, + 90562, + 90955, + 90732, + 90600, + 90851, + 90604, + 90739, + 90689, + 90659, + 90866 + ], + "sample_count": 32 + }, + { + "pubkey": "6xNME74qrY4Qj8nxvRb7iqsm8RyQwrX16JkDFbvHPn2i", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143511000000, + "samples": [ + 113440, + 113444, + 113428, + 113459, + 113468, + 113434, + 113434, + 113454, + 113485, + 113567, + 113466, + 113442, + 113485, + 113523, + 113523, + 113509, + 113487, + 113442, + 113492, + 113442, + 113441, + 113514, + 113437, + 113513, + 113439, + 113487, + 113464, + 113451, + 113532, + 113473, + 113492, + 113499 + ], + "sample_count": 32 + }, + { + "pubkey": "6oC5v6UZnq7kwoqJwRswaeGu2AmgoYKYfrvs7w9S49HB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 143486, + 143983, + 143741, + 143992, + 143810, + 144561, + 143580, + 143976, + 143777, + 143695, + 143917, + 143631, + 143631, + 143674, + 145159, + 143846, + 143836, + 143763, + 143662, + 143541, + 143814, + 143588, + 143629, + 148885, + 143688, + 143593, + 144281, + 143593, + 143583, + 143796, + 143712, + 143707 + ], + "sample_count": 32 + }, + { + "pubkey": "GtpbnWxM9sHCWJg3eovpqzYtxvEmqy9LoeXUD465KEps", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143512000000, + "samples": [ + 164854, + 164899, + 164924, + 164894, + 164904, + 164914, + 164843, + 164907, + 164878, + 164874, + 164866, + 164928, + 164903, + 164920, + 164939, + 164869, + 164939, + 164838, + 164910, + 164856, + 164841, + 164899, + 164901, + 164884, + 164876, + 164898, + 164862, + 164844, + 164829, + 164930, + 164879, + 164873 + ], + "sample_count": 32 + }, + { + "pubkey": "67zm9et8XKrtDSZXJYafcKKciuiUv6vh1EaEuVktHUAR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 149549, + 149746, + 149746, + 149691, + 149691, + 149445, + 149788, + 149512, + 149325, + 150094, + 149485, + 149550, + 149682, + 149665, + 149197, + 149685, + 149537, + 149538, + 149920, + 149444, + 149616, + 149580, + 150038, + 149613, + 172810, + 149708, + 149329, + 149486, + 149486, + 149684, + 149333, + 149301 + ], + "sample_count": 32 + }, + { + "pubkey": "ErQD7iKLXr2JNu52MMtzCtvKvmTUXv6PeD2bT2NWr6Tr", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143508000000, + "samples": [ + 137980, + 137831, + 137921, + 138021, + 137860, + 137958, + 137840, + 138452, + 138018, + 137994, + 138053, + 137949, + 137807, + 137894, + 137976, + 137874, + 137863, + 137892, + 137818, + 137826, + 137825, + 137813, + 137916, + 137926, + 137930, + 138328, + 137904, + 137868, + 137946, + 137983, + 138282, + 138032 + ], + "sample_count": 32 + }, + { + "pubkey": "7YfvKJrMELMro478BcmXR2i9JgeRV1ftwEFkUrKFHD9A", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143503000000, + "samples": [ + 150188, + 150188, + 150009, + 150522, + 149942, + 150357, + 150216, + 150017, + 150017, + 150417, + 150162, + 149880, + 149880, + 150563, + 150354, + 150121, + 150282, + 150567, + 150218, + 150259, + 150219, + 150219, + 150020, + 150427, + 150105, + 150027, + 150342, + 150099, + 150099, + 150411, + 150074, + 150076 + ], + "sample_count": 32 + }, + { + "pubkey": "24SH9SqdmfYLNBz9RSHJUCQd2UprCitoJmV8pbr8u6J1", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143506000000, + "samples": [ + 150526, + 150545, + 150524, + 150566, + 150479, + 150478, + 150469, + 150503, + 150478, + 150483, + 150435, + 150468, + 150414, + 150597, + 150536, + 150497, + 150520, + 150511, + 150600, + 150662, + 150592, + 150548, + 150458, + 150555, + 150529, + 150573, + 150542, + 150548, + 150588, + 150526, + 150528, + 150559 + ], + "sample_count": 32 + }, + { + "pubkey": "3SzJVywwcQUqV6kRJu5MMEPz5qB685D3RUPEkYDxCun3", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 23845, + 26675, + 23448, + 23656, + 24436, + 23806, + 23600, + 23714, + 23779, + 23741, + 26108, + 23791, + 24262, + 24502, + 23895, + 23782, + 26670, + 23946, + 23538, + 24052, + 23733, + 23928, + 26498, + 23704, + 23711, + 26717, + 23681, + 23590, + 23590, + 23743, + 23475, + 23772 + ], + "sample_count": 32 + }, + { + "pubkey": "5EhojzNA6Ruw6dAzxWwsENyW3YdJrixUwxeEyFjKc6tr", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143508000000, + "samples": [ + 21364, + 21447, + 21444, + 21442, + 21418, + 21366, + 21353, + 21420, + 21441, + 21398, + 21430, + 21374, + 21356, + 21447, + 21383, + 21422, + 21401, + 21418, + 21406, + 21398, + 21430, + 21466, + 21425, + 21468, + 21400, + 21433, + 21407, + 21440, + 21479, + 21404, + 21452, + 21435 + ], + "sample_count": 32 + }, + { + "pubkey": "2GLnA7WV1jFQUVdqEt3Mm9bqJBbhDgYY964byhDAZ656", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 80393, + 92579, + 85476, + 79611, + 92166, + 84679, + 85039, + 91848, + 84673, + 82249, + 87370, + 81948, + 82276, + 82276, + 94831, + 94831, + 84948, + 82243, + 82243, + 88566, + 79544, + 79858, + 79858, + 96327, + 82302, + 79835, + 79835, + 82278, + 82200, + 80634, + 91341, + 85444 + ], + "sample_count": 32 + }, + { + "pubkey": "6QnSTukGMvgHUntLnmGhaop6AeCenzkdWaiKU3L8GDwB", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143791000000, + "samples": [ + 76442, + 76425, + 76441, + 76396, + 76467, + 76481, + 76385, + 76246, + 76410, + 76401, + 76444, + 76508, + 76438, + 76461, + 76518, + 76444, + 76369, + 76402, + 76415, + 76416, + 76469, + 76403, + 76387, + 76434, + 76364, + 76523, + 76464, + 76427, + 76395, + 76411, + 76468, + 76400 + ], + "sample_count": 32 + }, + { + "pubkey": "CUY2mQm5SqD1gQNUCgpo1RBxHyBrqwJ8pRNYWwaJmpyF", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 91977, + 98394, + 92419, + 92149, + 99044, + 96452, + 96469, + 91950, + 96398, + 98152, + 96395, + 96395, + 96391, + 147027, + 92138, + 92138, + 92317, + 92155, + 96535, + 92062, + 96435, + 92577, + 92008, + 92086, + 98363, + 96415, + 96386, + 92424, + 92053, + 96352, + 96387, + 96328 + ], + "sample_count": 32 + }, + { + "pubkey": "2kbtpEaLg377XAEXHcu6rc16Pae2fZ8Ns7DheFrhzXDe", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "2PSqE3SoWQM3xm6jMvAAHfx76Ez2ykjnXM27ag2nG3cL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143790000000, + "samples": [ + 77358, + 77503, + 77309, + 77309, + 77456, + 77439, + 77416, + 77291, + 77375, + 77514, + 77387, + 77426, + 77446, + 77431, + 77450, + 77300, + 77332, + 77411, + 77352, + 77341, + 77357, + 77350, + 77258, + 77440, + 77403, + 77348, + 77350, + 77310, + 77376, + 77369, + 77463, + 77453 + ], + "sample_count": 32 + }, + { + "pubkey": "2w8DthQ6XkKSXuDH7Rcmtm7nmnUBnhoRutZm7gPh3hV4", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 14620, + 13263, + 14585, + 13758, + 13489, + 13250, + 14506, + 21495, + 21495, + 13307, + 14568, + 13781, + 13829, + 13203, + 14532, + 14669, + 14636, + 13611, + 13611, + 13306, + 14973, + 13229, + 13775, + 13273, + 13273, + 14727, + 14477, + 13847, + 13586, + 13816, + 13831, + 14950 + ], + "sample_count": 32 + }, + { + "pubkey": "Hauf8WpLjSiEgEkbAkrvHgGi76bKDemVGViQt8nPZZ9C", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143790000000, + "samples": [ + 14561, + 14546, + 14475, + 14413, + 14589, + 14568, + 14549, + 14434, + 14556, + 14602, + 14448, + 14619, + 14580, + 14547, + 14631, + 14584, + 14546, + 14543, + 14596, + 14608, + 14459, + 14507, + 14553, + 14470, + 14590, + 14519, + 14494, + 14487, + 14458, + 14554, + 14515, + 14537 + ], + "sample_count": 32 + }, + { + "pubkey": "DeHAXFFP5ursuBTynfHTrYwYEH7ombrpQtHfRKp65sEU", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143488000000, + "samples": [ + 29848, + 30241, + 30241, + 30500, + 30637, + 30528, + 30305, + 29710, + 30298, + 29739, + 29654, + 30385, + 29680, + 72185, + 30401, + 30401, + 29788, + 30429, + 29765, + 30176, + 30591, + 30271, + 30434, + 30350, + 30376, + 30444, + 30490, + 29819, + 29912, + 30227, + 30254, + 30432 + ], + "sample_count": 32 + }, + { + "pubkey": "5xG7y3bZuTZ62PZEcLsVXcqTeqPdFenFydkBzGheFmL3", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143785000000, + "samples": [ + 32281, + 32386, + 32250, + 32406, + 32438, + 32393, + 32451, + 32202, + 32348, + 32403, + 32397, + 32369, + 32341, + 32430, + 32342, + 32381, + 32406, + 32378, + 32461, + 32462, + 32463, + 32279, + 32298, + 32331, + 32384, + 32338, + 32391, + 32348, + 32332, + 32420, + 32331, + 32259 + ], + "sample_count": 32 + }, + { + "pubkey": "9qNoYbVCYjfBvWkeEjWApMmUmfyR1eYfWmjY3N87e9Sc", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 103563, + 27053, + 26631, + 24438, + 26733, + 27632, + 26537, + 104068, + 104068, + 26688, + 26678, + 24499, + 26714, + 26605, + 104650, + 26597, + 24672, + 27997, + 27630, + 24448, + 104661, + 104661, + 26629, + 24496, + 25757, + 104117, + 104173, + 104164, + 104164, + 103463, + 24540, + 106654 + ], + "sample_count": 32 + }, + { + "pubkey": "2nn9bSenYKuX8TwQsfEiGqqFno8wxfroLPmhPjPqw9FR", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143786000000, + "samples": [ + 27343, + 27510, + 27332, + 27531, + 27477, + 27522, + 27511, + 27267, + 27552, + 27451, + 27478, + 27498, + 27645, + 27485, + 27487, + 27397, + 27513, + 27440, + 27516, + 27555, + 27501, + 27456, + 27506, + 27363, + 27545, + 27370, + 27454, + 27461, + 27450, + 27516, + 27511, + 27536 + ], + "sample_count": 32 + }, + { + "pubkey": "B8H2CXU2VgtqQ3z2YtqwCbzcFqNgb8PcWbWVDsC7XWxw", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143490000000, + "samples": [ + 252289, + 254916, + 252408, + 251573, + 252546, + 254687, + 254968, + 255044, + 251552, + 247373, + 251492, + 248117, + 248117, + 252603, + 255003, + 248342, + 255036, + 248213, + 252512, + 255178, + 251614, + 251614, + 251507, + 248070, + 254900, + 254900, + 254928, + 248162, + 254852, + 252542, + 254584, + 247313 + ], + "sample_count": 32 + }, + { + "pubkey": "4XRFEbccFCJRCrEVLcFvPQ87b8RbTtkHXDTNERvUiKDP", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143785000000, + "samples": [ + 223994, + 224168, + 224040, + 224079, + 224065, + 224092, + 224008, + 224008, + 223909, + 224109, + 224095, + 224036, + 224083, + 224090, + 224176, + 224110, + 223956, + 224069, + 224070, + 224075, + 224059, + 224087, + 224072, + 223994, + 224062, + 223971, + 224030, + 224080, + 224023, + 224032, + 224115, + 224008 + ], + "sample_count": 32 + }, + { + "pubkey": "2QN3751H3sxSbGq3B3VgaeFpSHe4hCSwW9dPN6gLW6nH", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143498000000, + "samples": [ + 104620, + 105068, + 104622, + 102053, + 102053, + 103541, + 102571, + 102298, + 103740, + 102032, + 102511, + 102635, + 103575, + 102762, + 104877, + 101964, + 104549, + 104651, + 104680, + 102132, + 102020, + 103311, + 102012, + 102732, + 103685, + 102490, + 102490, + 105288, + 105288, + 102556, + 104930, + 103725 + ], + "sample_count": 32 + }, + { + "pubkey": "GyzEAYKvjDuCVGDtQjV8NzcCsViiuRjzaSbppqNNi2k6", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143787000000, + "samples": [ + 105203, + 105091, + 105147, + 100446, + 105153, + 100461, + 100425, + 100230, + 100415, + 100476, + 100305, + 100247, + 100367, + 100424, + 100439, + 100230, + 100363, + 100399, + 100510, + 100429, + 100320, + 100317, + 100314, + 100360, + 100345, + 100364, + 100409, + 100366, + 105185, + 105079, + 105175, + 105155 + ], + "sample_count": 32 + }, + { + "pubkey": "6n6zPadcgVSSuLtSo1qt7v4VfZMUH1rJR44QSL5RphMr", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143500000000, + "samples": [ + 25703, + 25703, + 23949, + 26385, + 23777, + 26090, + 23886, + 25446, + 26124, + 25521, + 25683, + 25787, + 26345, + 26097, + 25624, + 25502, + 25529, + 26203, + 23969, + 23839, + 25489, + 25546, + 26087, + 24036, + 25531, + 25749, + 26197, + 26507, + 26049, + 23992, + 23847, + 26386 + ], + "sample_count": 32 + }, + { + "pubkey": "4KZkrTEywKTU9KbySpb2WPnRdNpSom86j47AhFkbVZLm", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143789000000, + "samples": [ + 31547, + 31530, + 31409, + 31554, + 31459, + 31686, + 31313, + 31463, + 31637, + 31602, + 31577, + 31649, + 31450, + 31574, + 31372, + 31551, + 31527, + 31376, + 31445, + 31590, + 31531, + 31511, + 31543, + 31374, + 31441, + 31617, + 31630, + 31465, + 31564, + 31504, + 31582, + 31396 + ], + "sample_count": 32 + }, + { + "pubkey": "JCWue8oB8XWmw2A4datpEnxFnTuS8JRYj2gAXncPvDvs", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143495000000, + "samples": [ + 91532, + 91632, + 82743, + 84657, + 91645, + 84429, + 91517, + 84575, + 84378, + 82544, + 84406, + 84450, + 84316, + 91491, + 84542, + 91536, + 84272, + 84391, + 84333, + 84265, + 84388, + 92297, + 91638, + 91474, + 82731, + 84404, + 84719, + 91456, + 84531, + 84531, + 91568, + 91618 + ], + "sample_count": 32 + }, + { + "pubkey": "TCXoCqyDcHKpqQZor9Xa3xxUNeWDdEYysJT8L9eSAue", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143789000000, + "samples": [ + 81843, + 81845, + 81865, + 81780, + 81941, + 81876, + 81871, + 82115, + 81913, + 81947, + 81924, + 81967, + 81902, + 81907, + 82009, + 82013, + 81882, + 81896, + 81997, + 81858, + 81906, + 81850, + 81856, + 81838, + 81942, + 81861, + 81858, + 81817, + 81894, + 81938, + 81942, + 81919 + ], + "sample_count": 32 + }, + { + "pubkey": "8eoyzjQni5xMDCtMrpLPd641fCwaQJny7VLAXx92xiPU", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143489000000, + "samples": [ + 183963, + 183554, + 183968, + 183570, + 194645, + 194048, + 183777, + 184868, + 181783, + 181596, + 183977, + 183653, + 184602, + 194132, + 185091, + 181525, + 194528, + 181707, + 181707, + 194273, + 194091, + 185055, + 193827, + 185985, + 185672, + 185966, + 181557, + 194247, + 181451, + 182903, + 181747, + 181747 + ], + "sample_count": 32 + }, + { + "pubkey": "Cz767obJZhtXM7QGwbnYrd5T7BJAfDXYWZz2eZjAGJT", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143789000000, + "samples": [ + 178737, + 178751, + 178852, + 178745, + 178771, + 178808, + 178752, + 178716, + 178807, + 178739, + 178725, + 178729, + 178821, + 178771, + 178722, + 178721, + 178783, + 178774, + 178768, + 178850, + 178740, + 178758, + 178651, + 178719, + 178730, + 178676, + 178741, + 178646, + 178773, + 178709, + 178724, + 178709 + ], + "sample_count": 32 + }, + { + "pubkey": "GmYTekGSn9rHtcUWR5i1d2XgZh9QyojfcEeQjmV3Bid7", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 154607, + 164229, + 159908, + 159848, + 226543, + 234123, + 226488, + 226816, + 160027, + 164180, + 164180, + 162285, + 234536, + 226736, + 226672, + 160116, + 154242, + 226902, + 234290, + 234621, + 234999, + 160039, + 226523, + 226796, + 159935, + 160096, + 164072, + 234111, + 226276, + 159967, + 226550, + 226550 + ], + "sample_count": 32 + }, + { + "pubkey": "7y5nqzVifoidWZyZme5pZQhLaNroqnG7n2ge3f2F7viN", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143788000000, + "samples": [ + 160056, + 159940, + 159939, + 159867, + 160044, + 160057, + 159873, + 159853, + 160056, + 159974, + 160049, + 159984, + 159901, + 160057, + 159958, + 159980, + 159857, + 159953, + 159979, + 160000, + 159931, + 159875, + 159948, + 159909, + 159978, + 159935, + 160075, + 159973, + 159948, + 159850, + 159889, + 159984 + ], + "sample_count": 32 + }, + { + "pubkey": "585ezhXT4DTGULMrn5km89MjZ4wuNNx3Pi3f3jmuWvwt", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 76944, + 77952, + 76342, + 76187, + 77818, + 79274, + 78439, + 77410, + 78571, + 78601, + 77566, + 77334, + 77603, + 77603, + 78516, + 77669, + 78328, + 77422, + 77611, + 76965, + 77045, + 77206, + 77643, + 78456, + 76205, + 76205, + 77812, + 77708, + 78405, + 78405, + 79454, + 79115 + ], + "sample_count": 32 + }, + { + "pubkey": "5h2FdPKRAgedyzdo2xRDmBFHVQaJeqbpTW6LdZqMEYzC", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143791000000, + "samples": [ + 82412, + 82407, + 82274, + 82325, + 82384, + 82461, + 82328, + 82298, + 82423, + 82419, + 82339, + 82440, + 82360, + 82380, + 82447, + 82432, + 82301, + 82292, + 82357, + 82351, + 82417, + 82317, + 82412, + 82423, + 82422, + 82434, + 82448, + 82402, + 82362, + 82396, + 82434, + 82383 + ], + "sample_count": 32 + }, + { + "pubkey": "GebyqgzFHSwaLXcuzVqpK3E8rEzQt1zqeo7t295zekKD", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143491000000, + "samples": [ + 134675, + 134972, + 131271, + 134689, + 134987, + 134987, + 130783, + 134192, + 134891, + 134800, + 134800, + 131291, + 134121, + 141410, + 134600, + 136173, + 134598, + 134598, + 134853, + 134674, + 136364, + 134837, + 130503, + 130568, + 131319, + 134834, + 134705, + 134702, + 131505, + 131363, + 136079, + 134769 + ], + "sample_count": 32 + }, + { + "pubkey": "DMCFC1eyX7HXPgyxe3tD5Mr1ZxGVVi4s7FEssuuEqjur", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143792000000, + "samples": [ + 135680, + 135715, + 135589, + 135542, + 135698, + 135692, + 135664, + 135563, + 135653, + 135710, + 135586, + 135617, + 135627, + 135667, + 135642, + 135711, + 135613, + 135660, + 135610, + 135622, + 135675, + 135633, + 135617, + 135597, + 135604, + 135663, + 135638, + 135615, + 135626, + 135608, + 135648, + 135643 + ], + "sample_count": 32 + }, + { + "pubkey": "8o8Z3U9rpfA53zNu88aJwAFmwvXRo3tcSoVYvvc6feAB", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143486000000, + "samples": [ + 84676, + 82525, + 77213, + 82486, + 80890, + 82409, + 82494, + 82333, + 82523, + 82523, + 78040, + 81971, + 81971, + 84818, + 77493, + 83967, + 83890, + 84729, + 83807, + 83807, + 84742, + 82655, + 78653, + 81609, + 81508, + 81734, + 77732, + 83932, + 81688, + 78026, + 84675, + 82627 + ], + "sample_count": 32 + }, + { + "pubkey": "4gk5yWZqF6zWr5FMS6eR4mHrkxTGm4LyBzcgRE39ypQN", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143792000000, + "samples": [ + 72540, + 72540, + 72512, + 72422, + 72506, + 72479, + 72541, + 72376, + 72602, + 72484, + 72479, + 72484, + 72485, + 72573, + 72490, + 72474, + 72452, + 72518, + 72468, + 72487, + 72524, + 72482, + 72527, + 72487, + 72534, + 72538, + 72495, + 72418, + 72346, + 72466, + 72568, + 72486 + ], + "sample_count": 32 + }, + { + "pubkey": "5HX414gaja97QUzCJyNYchTswooFhiuPy96M7nuc7jE9", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 23223, + 25098, + 28821, + 24953, + 23328, + 23283, + 28803, + 23430, + 29036, + 23391, + 23538, + 24951, + 24851, + 25133, + 23255, + 23467, + 24906, + 24881, + 23231, + 23301, + 23501, + 28616, + 28795, + 25029, + 24935, + 28716, + 24996, + 23324, + 23424, + 23350, + 25132, + 25131 + ], + "sample_count": 32 + }, + { + "pubkey": "7DmgU5m378tkaAj5eNUoHX3rRSywbdFZM6Vm9FnLMfoZ", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143784000000, + "samples": [ + 26496, + 26433, + 26336, + 26358, + 26472, + 26438, + 26367, + 26289, + 26475, + 26526, + 26363, + 26400, + 26368, + 26452, + 26408, + 26373, + 26471, + 26408, + 26384, + 26424, + 26400, + 26358, + 26407, + 26452, + 26457, + 26409, + 26513, + 26348, + 26371, + 26454, + 26438, + 26320 + ], + "sample_count": 32 + }, + { + "pubkey": "DgpVEHCfxczpiwmomcxTrwxZPWcHdZSGMRTEKE7mMrsC", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 18379, + 18078, + 18023, + 19277, + 17698, + 18404, + 17950, + 19100, + 19201, + 19026, + 19587, + 19205, + 19356, + 19645, + 19066, + 17803, + 18522, + 18648, + 18253, + 18494, + 17971, + 18353, + 17830, + 17830, + 19427, + 19426, + 17986, + 19275, + 17893, + 18418, + 18418, + 18595 + ], + "sample_count": 32 + }, + { + "pubkey": "14T9Pvp1x9YuiJwzhKW9QMD2V1mkwDXaGXek2nZQQP4s", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143784000000, + "samples": [ + 17643, + 17454, + 17537, + 17557, + 17607, + 17584, + 17567, + 17451, + 17496, + 17587, + 17587, + 17598, + 17597, + 17588, + 17562, + 17490, + 17569, + 17521, + 17549, + 17564, + 17422, + 17591, + 17512, + 17601, + 17550, + 17581, + 17589, + 17562, + 17577, + 17624, + 17514, + 17504 + ], + "sample_count": 32 + }, + { + "pubkey": "Eh9H1pkW3q3QZfjSQxMAk2KuGBTJZUfVQPTJFKWDEB1i", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143497000000, + "samples": [ + 31718, + 25081, + 25295, + 25991, + 25991, + 25322, + 25071, + 24992, + 24704, + 25318, + 24805, + 31928, + 25040, + 24955, + 25227, + 24945, + 24974, + 25104, + 25103, + 24738, + 25095, + 24789, + 24786, + 24814, + 24903, + 24943, + 24943, + 26675, + 24894, + 24775, + 24802, + 24999 + ], + "sample_count": 32 + }, + { + "pubkey": "13n4XPfjwrdEv9t87gnS7k1LRx6xeTDSxLUwDc7Mxx1m", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143786000000, + "samples": [ + 19158, + 19195, + 19074, + 19238, + 19116, + 19292, + 19103, + 19008, + 19084, + 19154, + 19140, + 19112, + 19037, + 19198, + 19163, + 19059, + 19135, + 19178, + 19205, + 19128, + 19128, + 19012, + 19079, + 19089, + 19129, + 19068, + 19071, + 19133, + 19038, + 19149, + 19146, + 19111 + ], + "sample_count": 32 + }, + { + "pubkey": "4GShPvPsPtvmoE82xXPNR2CWN5zTYVE8D8e9YDxfXDkR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143492000000, + "samples": [ + 132514, + 131031, + 131918, + 132030, + 131910, + 131810, + 132307, + 132317, + 131719, + 132347, + 134753, + 133285, + 131268, + 131591, + 135414, + 135601, + 131865, + 132170, + 138022, + 134385, + 134724, + 135577, + 134898, + 132341, + 132294, + 135825, + 135468, + 135468, + 134187, + 133359, + 132003, + 131660 + ], + "sample_count": 32 + }, + { + "pubkey": "4mKht2XYYkACqSEqjxpUGQNGKePdTPhQ4Hg5MUioc5uk", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143788000000, + "samples": [ + 154789, + 154725, + 154736, + 154785, + 154814, + 154575, + 154700, + 154637, + 154841, + 154938, + 154793, + 154766, + 154798, + 154845, + 154782, + 154660, + 154704, + 154745, + 154776, + 154722, + 154822, + 154739, + 154753, + 154626, + 154760, + 154834, + 154645, + 154779, + 154828, + 154831, + 154783, + 154728 + ], + "sample_count": 32 + }, + { + "pubkey": "46tk89wQhCjq6YKKyg8GgvuxxpqrKPnJbBiPudrHNrw6", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143496000000, + "samples": [ + 136703, + 138466, + 139247, + 139247, + 136562, + 137615, + 137860, + 136485, + 136485, + 138187, + 135950, + 135880, + 138347, + 136647, + 135117, + 136764, + 138031, + 138980, + 138342, + 138617, + 138692, + 137067, + 137771, + 137771, + 135216, + 139235, + 139216, + 136561, + 136209, + 137229, + 137788, + 137788 + ], + "sample_count": 32 + }, + { + "pubkey": "8TX1QvSfuLBmWVehiWsRzd7Cdznn4d4mD6EGYbT4Wfk4", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143784000000, + "samples": [ + 135352, + 135502, + 135440, + 135292, + 135344, + 135488, + 135412, + 135310, + 135471, + 135585, + 135464, + 135458, + 135454, + 135253, + 135256, + 135334, + 135298, + 135440, + 135385, + 135508, + 135312, + 135364, + 135370, + 135402, + 135333, + 135226, + 135411, + 135363, + 135335, + 135442, + 135416, + 135357 + ], + "sample_count": 32 + }, + { + "pubkey": "7z8UzDHJhVLDJLPkok3BPKX8ScdJ1qNTxRnjYwRsTv2G", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143493000000, + "samples": [ + 28912, + 29192, + 29461, + 29461, + 28773, + 27239, + 96016, + 27266, + 27163, + 28830, + 96169, + 96080, + 27353, + 27253, + 96499, + 96229, + 28844, + 96243, + 27346, + 27340, + 27189, + 28899, + 96325, + 27127, + 27095, + 96018, + 27519, + 27920, + 96343, + 27201, + 96253, + 27157 + ], + "sample_count": 32 + }, + { + "pubkey": "C2jfny3iA54468ssdL2CJ7xqbL33wqpYU4isPAmB8zbG", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143787000000, + "samples": [ + 26276, + 26245, + 26244, + 26174, + 26308, + 26285, + 26098, + 26066, + 26303, + 26219, + 26322, + 26277, + 26239, + 26238, + 26202, + 26106, + 26332, + 26212, + 26198, + 26216, + 26106, + 26173, + 26160, + 26100, + 26178, + 26260, + 26207, + 26221, + 26182, + 26180, + 26344, + 26103 + ], + "sample_count": 32 + }, + { + "pubkey": "8naQxG5F4vZp54gJSxKSs6rj5vzekQSkWUe2W9Jb5CA2", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143487000000, + "samples": [ + 41348, + 42045, + 41456, + 41456, + 41625, + 42592, + 42624, + 41315, + 42146, + 42207, + 42301, + 41690, + 42180, + 42238, + 41862, + 41567, + 41494, + 42051, + 42451, + 41517, + 44777, + 42301, + 42301, + 41483, + 43272, + 41208, + 41493, + 42053, + 42318, + 43259, + 41272, + 41147 + ], + "sample_count": 32 + }, + { + "pubkey": "EyYrnAYXuxMBreDuEzTE8kW1uFm3TkB5FGHbQXn9EucS", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S", + "target_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143787000000, + "samples": [ + 38487, + 38482, + 41024, + 41017, + 41091, + 41169, + 41048, + 40900, + 41114, + 41062, + 41115, + 41067, + 41101, + 41075, + 41028, + 40973, + 41030, + 41075, + 40996, + 41201, + 41075, + 40997, + 38403, + 38430, + 38570, + 38597, + 38536, + 38580, + 38378, + 38512, + 38578, + 38501 + ], + "sample_count": 32 + }, + { + "pubkey": "4nJSSYFqEP6fuiUgqtivyi2hV2kEVTQAweK4QK9Dk7UR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143494000000, + "samples": [ + 132969, + 142489, + 133613, + 132698, + 133106, + 134231, + 132703, + 149056, + 133245, + 132841, + 141394, + 141394, + 133906, + 132702, + 147437, + 147437, + 133862, + 133862, + 132835, + 132835, + 133323, + 134068, + 134068, + 133014, + 148729, + 132924, + 132872, + 146458, + 146458, + 133506, + 132619, + 145466 + ], + "sample_count": 32 + }, + { + "pubkey": "3Vma5FW8puT2w9WPez6xWpeJ6itDcQpnr86upFqaCN8X", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143514000000, + "samples": [ + 109162, + 109113, + 109178, + 109168, + 109162, + 109150, + 109176, + 109182, + 109162, + 109188, + 109187, + 109173, + 109177, + 109207, + 109183, + 109184, + 109187, + 108998, + 109178, + 109139, + 109112, + 108957, + 109139, + 109151, + 109160, + 109184, + 109164, + 109180, + 109073, + 109117, + 109190, + 109186 + ], + "sample_count": 32 + }, + { + "pubkey": "ydPThr9MDxuLn1YdNE4redcAqxSoXFfHsWz8DChu3Ux", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143502000000, + "samples": [ + 29845, + 30935, + 29870, + 29778, + 29982, + 30157, + 29760, + 46152, + 30178, + 30178, + 29848, + 29848, + 30773, + 34820, + 29955, + 30353, + 30264, + 29900, + 30526, + 30208, + 29791, + 30236, + 30236, + 30000, + 30255, + 30760, + 30430, + 29859, + 30507, + 30190, + 29611, + 30342 + ], + "sample_count": 32 + }, + { + "pubkey": "BZyAmJeiCm1VJmVbUAMrhdchcsd2iii7Zrai16VPAgQh", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143514000000, + "samples": [ + 31665, + 31720, + 31691, + 31677, + 31681, + 31709, + 31688, + 31683, + 31691, + 31692, + 31705, + 31688, + 31693, + 31757, + 31703, + 31668, + 31738, + 31715, + 31692, + 31682, + 31690, + 31702, + 31691, + 31519, + 31695, + 31718, + 31718, + 31738, + 31697, + 31672, + 31706, + 31688 + ], + "sample_count": 32 + }, + { + "pubkey": "9cjmbPwnqzU6A9nq4oYvxrUbv4tmpK5fQczQdNqnZgsR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143499000000, + "samples": [ + 20014, + 20373, + 20373, + 20025, + 19616, + 19843, + 19565, + 19565, + 20190, + 20190, + 19926, + 19496, + 19496, + 20145, + 19993, + 19910, + 19872, + 19842, + 22979, + 19950, + 20215, + 20215, + 19802, + 20328, + 19881, + 19570, + 20398, + 19704, + 19587, + 20111, + 19714, + 19771 + ], + "sample_count": 32 + }, + { + "pubkey": "2XUpGimkTpVLzceaByMt7KtLa8mV5E4LvtbhSeLi7L8e", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143512000000, + "samples": [ + 18296, + 18305, + 18254, + 18271, + 18302, + 18319, + 18319, + 18263, + 18296, + 18247, + 18284, + 18330, + 18295, + 18330, + 18337, + 18326, + 18167, + 18279, + 18303, + 18333, + 18244, + 18160, + 18168, + 18327, + 18326, + 18324, + 18291, + 18333, + 18301, + 18288, + 18312, + 18304 + ], + "sample_count": 32 + }, + { + "pubkey": "DhNxYYVHfwCyaUqc4F2Wevyc8m274jJxSPMBJBdwWuts", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143508000000, + "samples": [ + 268144, + 268144, + 268678, + 268538, + 268538, + 268038, + 268487, + 268100, + 268013, + 268478, + 268438, + 268008, + 268536, + 268403, + 268403, + 268211, + 268726, + 269328, + 268724, + 268731, + 268759, + 268336, + 268336, + 268793, + 268612, + 268089, + 268607, + 268557, + 268088, + 268472, + 268044, + 268123 + ], + "sample_count": 32 + }, + { + "pubkey": "Da6PNKHYyEFzP9xtU3acp3FUKY46Ncf1TUEjSsVGT3QS", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143512000000, + "samples": [ + 255170, + 255166, + 255026, + 255118, + 255107, + 255089, + 255118, + 251497, + 251524, + 255157, + 255095, + 255086, + 255062, + 255212, + 255067, + 255126, + 255199, + 251548, + 251456, + 251546, + 251510, + 251549, + 251481, + 251471, + 251494, + 251495, + 251565, + 251563, + 251551, + 251479, + 251547, + 251492 + ], + "sample_count": 32 + }, + { + "pubkey": "HYBeQabMAVCsjWP9pDgwPA7u3Nkg88ZpojGgKxB95Xsh", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143504000000, + "samples": [ + 10917, + 12177, + 11263, + 11076, + 11323, + 11197, + 11113, + 11629, + 10989, + 11425, + 11075, + 11207, + 10990, + 11361, + 11722, + 10847, + 11409, + 11463, + 10906, + 11208, + 11145, + 11145, + 11006, + 12030, + 11207, + 11207, + 11118, + 11256, + 10911, + 11203, + 11367, + 11063 + ], + "sample_count": 32 + }, + { + "pubkey": "CCRYujJmofs9o67dDhVxqHbxHrRj51a5CmiXJYd8quu2", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143513000000, + "samples": [ + 40061, + 40294, + 12059, + 40121, + 40359, + 40033, + 40310, + 40142, + 12080, + 40299, + 12010, + 40280, + 40054, + 40136, + 40333, + 40158, + 40331, + 40312, + 40292, + 40309, + 40129, + 40133, + 40062, + 12300, + 40261, + 12325, + 12343, + 12353, + 12110, + 12302, + 12169, + 12123 + ], + "sample_count": 32 + }, + { + "pubkey": "AiHh7yVhUcmujLD6xUhDWc1z82sL19ebyGCHov9wFZeR", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143506000000, + "samples": [ + 130655, + 131888, + 130774, + 130612, + 130612, + 130952, + 130952, + 130536, + 130575, + 130861, + 130602, + 130871, + 132154, + 132154, + 130563, + 130450, + 131021, + 130627, + 130488, + 130900, + 130900, + 130600, + 130566, + 130718, + 130602, + 130623, + 130805, + 130613, + 130668, + 131379, + 130836, + 130384 + ], + "sample_count": 32 + }, + { + "pubkey": "GXEmpUTMGsjxQsrx7bseZyhkfyc7nLNm5GerWFQWKRq9", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143513000000, + "samples": [ + 114537, + 114572, + 114617, + 114632, + 114629, + 114612, + 114589, + 114556, + 114556, + 114565, + 114529, + 114594, + 114657, + 114569, + 114579, + 114615, + 114678, + 114632, + 114604, + 114644, + 114638, + 114578, + 114634, + 114675, + 114607, + 114604, + 114606, + 114632, + 114539, + 114609, + 114548, + 114579 + ], + "sample_count": 32 + }, + { + "pubkey": "HToD7rMCvL8Fa4hTVMccRLWJWr417b7ecPHE7XocodtJ", + "epoch": 129, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 600000000, + "start_timestamp_us": 1775143507000000, + "samples": [ + 110397, + 111785, + 112184, + 111918, + 111918, + 111983, + 111747, + 112315, + 112315, + 112067, + 111741, + 112061, + 112061, + 111870, + 111870, + 112028, + 112028, + 112610, + 112175, + 112175, + 112067, + 112097, + 112634, + 112154, + 112934, + 111894, + 111924, + 111924, + 112267, + 112173, + 112072, + 112072 + ], + "sample_count": 32 + }, + { + "pubkey": "3sMx5aFHwiVWm7K7fchWGVMmgwrjt9HMp9H6iyXnTp46", + "epoch": 129, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "8xHn4r7oQuqNZ5cLYwL5YZcDy1JjDQcpVkyoA8Dw5uXH", + "origin_exchange_pk": "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA", + "target_exchange_pk": "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6", + "sampling_interval_us": 360000000, + "start_timestamp_us": 1775143514000000, + "samples": [ + 117038, + 116997, + 116997, + 117042, + 117038, + 116978, + 117046, + 117069, + 117013, + 117010, + 117008, + 117027, + 116944, + 117046, + 117012, + 117042, + 117055, + 117003, + 117014, + 117040, + 117014, + 116990, + 116983, + 117062, + 116991, + 117031, + 117032, + 116998, + 117008, + 117025, + 117049, + 116964 + ], + "sample_count": 32 + } + ] + }, + "metro_prices": { + "25csXKnwTqFFfHwqwMUfF5m8zaG8aoJnwpmBZy3dTJND": 30, + "3Ph68a7sWQCzW4o2ESRFt1ic6LLT9Am8QiZ7oa27VGvA": 30, + "581fBJ3dEzJnKHy4j5mGE4FYY1qPbsgwtsAj3TLDB7co": 30, + "5EEqn4v7gmdTczZuVK3quNUsr6W1TXcvUEuXeBbms9Mx": 30, + "63QtaZS7gsUvDdVs9WPrbnY96tn8T7XKRZ9bwtTQRSCZ": 30, + "6KwFsdEf1boBo39sj79yu15rdFQq6wWTwEfST4tDNXJf": 60, + "6Q3o7nStJsjojHS77aDRzaaUaFVbyEnoMZYqWxMrJFum": 30, + "6n5E4c1KAS48kGvS3d3VwVRZP625A4iEcEV6DJx8zVNQ": 30, + "6nUhJP19k6QN6oLv85nh65kj2jFLuHnCs69U4JkvoTfY": 30, + "6v4HetbCcwhbjXSrBvBBLsY8Co8wj88dNjkDCNExpf1B": 30, + "8dvMd6ffPuMEGnaUyvSqu9HEYxyi6yrgMJLazH9xiaGq": 100, + "8eJ76RCXa9E2Yz9ShSZPZhArf3gSb8J5QafFNpZMAvdN": 30, + "8kXCA4GxDzh9cstMEXyGec6ZNSCW8GyCSLDiyr7mzLjn": 60, + "9jY4WDF1p33xD1g4tER1d4PQuWjbcWGuRxZMKDU4Rgm6": 30, + "9uhendwVxjV7JYDHYaHyYK4WYYGNnh9rkiZjcGgryQV9": 30, + "9vMztAeVSKHPHHcaDEnRKYc2sh1yLuNkWmHaE56uPEKK": 30, + "AE34gT3GfHLUCXVLAq2m2em18s4f39StGitNC1KVhqNX": 60, + "BKJWUyoW2sJkbenX9PFnBfGWAJ1uQkLbMDh39sG3sqph": 100, + "CmK4uEEQs481cXkRhRSCYfTSxyCRmM7dSuXk4D8nqQPc": 30, + "CwWxHc2CVJNK4KTtX5zd83Ff7u85d9MaKH3GCQdyoWcL": 30, + "DhhAmgS9j1sPJ3P4oL2mTt2ojWEw8VL7HBroBS7kk4Sx": 30, + "E4hJXm7xPudJ5whyHmvkVboSk745k55KDvUjWtP4wDNH": 30, + "F8PKqYmb3VWFLo5EsUbJUCwCgN2hNozpR1qSoXPcqGYc": 30, + "G6Pyo45d3y8cHnR3Wg6vZhRBeV1MM9fqcxae2fWXC69P": 30, + "GJgTymrMEfeuHJ1fcvpruLfkpi3ga1oEoXS5ZSnGMyAB": 30, + "GqsyGpbftd9eKidUtcMe7WAk1UJKW7kVVqF5MAbRSgvt": 30, + "GxjZbiuzpnq8uHPHR7aF1r9KGXRpsY4Z4nxkusTJSx3S": 60, + "HVfVpTFRVcqCfv7wHC4KuwVeWjpDHHTA6UZJNZvsEBWA": 30, + "rYsGwrL7GJg3qgsK8g2Bc1TZpwu6xNFkxgqTuz2JP8R": 30 + }, + "start_us": 1775143423979108, + "end_us": 1775302159273828, + "fetched_at": "2026-04-09T18:19:32.810161Z" + }, + "leader_schedule": { + "solana_epoch": 950, + "schedule_map": { + "11AMA4mnNbsrPQeuoNN7uiZVJZtqEzQHrTfa5vnbcjk": 140, + "12i8gndWWWMTRzJBFhnYkobNgZB3XMUUJq75HeUrshrk": 52, + "13DmVBcyrSdsSsLWaKH9x1dwxDf48Wu5wprwxMmLshrk": 44, + "14GtGcdikcK33tFBhedZ4rYTHcTpWveCxLXvR3Ydx9zS": 308, + "1KXvrkPXwkGF6NK1zyzVuJqbXfpenPVPP6hoiK9bsK3": 232, + "1Link6hB1NpkCwJt3ZtpQKZszKauhEcKgiWjaU8PRDG": 108, + "1ggyZGbYtEo1WrV1kmXfnvhPeSPxrYAXoDBeApnszLT": 176, + "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i": 60, + "1unarWPGGseFag2WfnoFv8o9P7vTPU8eHex9GinP3eY": 152, + "22rU5yUmdVThrkoPieVNphqEyAtMQKmZxjwcD8v4bJDU": 2264, + "23SUe5fzmLws1M58AnGnvnUBRUKJmzCpnFQwv4M4b9Er": 548, + "23U4mgK9DMCxsv2StC4y2qAptP25Xv5b2cybKCeJ1to3": 88, + "2AKKnirWVZMhnzuwqpizw9SwfZjGpRFLx2zCCNtPWpbc": 88, + "2Eq6YD8P8QXTeoz9h6JHjgZ55t8RSxNdx4waMDCoPmQU": 40, + "2GUnfxZavKoPfS9s3VSEjaWDzB3vNf5RojUhprCS1rSx": 2592, + "2Le6TjeEescF87qDA8Ftdz6U8Kq6SNVwoLJLhzBCHUr5": 48, + "2Mob8FJkb8chZY5pTBMpKfLwgZAQHE5i9jAC5zbASitD": 276, + "2N7v8pDKDYhtBUJBQUgxvysUjgM9s4ULPCmeEiPWTf6Z": 156, + "2P9ZYA4vBoBBr56hrEFTmrd5ctuz3r7wtvRYmbgk6jRL": 240, + "2Rv9npqdWE1mLPsT1r2obn3xtKmA5afkxt8GsWeLnKoc": 168, + "2UBhtRuyr9nvWsUnrbWrvJiYWEU8TVBD4PLYQJKiRa9H": 196, + "2VKu11f8zc3huqDQUN6WJTFpX32PgHpXXjf72P6YvYMd": 64, + "2Wf9V9rPeVRUTfmWdPedCJuWVr6MFfyLuigEq42DuMDc": 460, + "2X7WoaXX9KPqNrNfvguhnwo3rjFPNsfw2t75fGjWRthz": 112, + "2XmhZKHmfjku3T3nC9xKhgr5bm1CAmWXqNsNt49mo82C": 220, + "2abwQG3v2xRemFxRszVHSfnjJNe9zu5X8duKgxjyLeaK": 76, + "2bpfa8JbFfZUGUsedDsemu6vQUxbhcEM8ALSH3PgXd2d": 36, + "2dfgsiSaZ51QYPsECMYMG247PXxyKdwkV9wTHoQb8YEC": 352, + "2dxz129YxB1xtf7Mx6HUT5JspexArNNtQt84FYueWZV7": 92, + "2gDeeRa3mwPPtw1CMWPkEhRWo9v5izNBBfEXanr8uibX": 212, + "2icWF7TvxyycF7d1NHpMZYuJJqiRy2h7wmjFSbqUij1B": 60, + "2jS8AX38m8F9C5juToW1FmTufEbb1DfDzZJj9HSJcWwo": 164, + "2kVZVTY8FMRZ3WuHzyqNz8qd4Ytbba9f9DaesUm5WLvR": 220, + "2m1A2WM1vte7RWz5xTTw4i1SiXmngVtXhqFERaUjoAAb": 2016, + "2mDrrmhSzpSyaF12izGk8hnFjtKCGeCFPwQHpRiJDby2": 224, + "2mMGsb5uy1Q4Dvezr8HK2E8SJoChcb2X7b61tJPaVHHd": 544, + "2nhGaJvR17TeytzJVajPfABHQcAwinKoCG8F69gRdQot": 72, + "2oHUYyW2PU9VJh4XBs5TbGgzdernunvGqyKth3kxW4ns": 324, + "2pCxbAfUEwuL2k9Fiz3xnronPqRnXsuz9XV76ddq2GEt": 40, + "2t53LvZfskcpXkdwLaBnfZLbNgyVHPu2BNFpcRBaEBhM": 220, + "2ufnDYz755WuHqGCczry1ACTNUVZdn2cm43bCyyPSZtH": 12, + "2uxEHizFmmnLekKG2LZJwxNabhpymEYfdVCpgDxjt87m": 140, + "2zykwzzo1pd3H2oSj5j5SRLTvmpa9Nr2S2Bh8tTVd5Tq": 188, + "32jCuWyy4aJjyv4gd4DSGBHmFU5KUSSfqbmPb9GpMin6": 52, + "32ke3uf1qL3xLqbwzU76T2sbG2XaJrGuSCNdUnien3zm": 288, + "3B2mGaZoFwzAnWCoZ4EAKdps4FbYbDKQ48jo8u1XWynU": 316, + "3BeharBd3j4sKQp7Qze27JLQLd9AEEwGTX9TC7dXYSNw": 96, + "3CKKAoVi94EnfX8QcVxEmk8CAvZTc6nAYzXp1WkSUofX": 148, + "3DaPk6TdeGnEBwTR8fEyZSLkdayk6vZXrqGZhAgYK8BV": 88, + "3DaifGfDESUzer5ggUeo6UDjqEKMkCpdNSrrvyuggHVe": 20, + "3JotfSFPaod4KVK7nj7ULvcq5PjUBdZNVGracNkJNhrt": 1920, + "3KNGMiXwhy2CAWVNpLoUt25sNngFnX1mZpaiEeVccBA6": 72, + "3KiDz3wuZrJfsgKt5KEvRb1WPpbci1PWj78aPVF5ei3F": 284, + "3Pfubj3ytkRxFAGwFb5vtacuZJUxko5Du39xie9MBXuC": 104, + "3RXKQBRv7xKTQeNdLSPhCiD4QcUfxEQ12rtgUkMf5LnS": 412, + "3Rv6ZVGUuRczP76322LyhTTYw2iM4avV4B5xFJocQJer": 116, + "3SkE34PVeGck2ArEffFKjihrQgURsvnoTAhitsNXNzXd": 2352, + "3UfMeKHFaoZzN68TQJZXbLEARLZdhYmFcEvrMhtXTpnz": 8, + "3V2xaccDpFib4DbTksdiveNDmiwpXBqSWyjSof3w1Bg7": 92, + "3WDh9HgusCujDmXCVhophLrHvoKHQd1Sd4uFHz1Awo35": 228, + "3YVoK8UN62dyiPZnGBzBTkGdwsVmmK1MpRoLcxNRs9BE": 332, + "3YX7PQuESmR2h95FDgjahEQjyCBhmY1Ts2MsrM1Kg9DS": 72, + "3ZfGPNhdvo1phyqKEFy3F2DnUjuxbgYqhg7GVCdPKsyo": 524, + "3cZSHGfNdaULpFAvGbWbxpVwzXB4gHdk8NFucPNR5pgA": 704, + "3iQqh65Gby53aaYUF8ocoiEyhBs4aoe7BTYYWvy1c9dF": 12, + "3psxMyr7rQzywVp1MXKd1XFmFz33NjydzCoJx9t2sMQW": 2472, + "3rqEEEGjHRyndHuduBcjkf17rX3hgmGACpYTQYeZ5Ltk": 192, + "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5": 228, + "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk": 84, + "3tzpLMWRkWucvTRWU5PjgKzN1iwJuV69yCCjmuuo4gTk": 228, + "3x9nibnhgBHWKMRiGnsXJELRBjviQpKyigfrXtKW27KJ": 88, + "43Am3PKFeo9cACpqYL5Sk95rpVdxLw3Mc22PqRqZXEW2": 292, + "44VSCibTpr8Fn1Hk8fazhkuSrrSTYZX2f76b2xqKPwmt": 320, + "49j9bnkdgVNxLwsZ9h88sPR5MYEmsUyKrrJ6ZW8ijBrb": 128, + "4DraK9wUrMSpzbGjUbSWTHAhJimMyB49HyKhvfwe6e51": 208, + "4GEEKSwuiBHWTff9WaqrDcToZjbX6KYdyB4c578Zxse2": 24, + "4JahMMrVRS1gimWoXpD5H6KwKc2MrsoTDFMaStMttL1E": 140, + "4Kbcyn7JVPAWLRLPsNGTPmcNMvCkLTw51ZLRhqsUC6jP": 64, + "4NwpynvugnHvyLzr5h9Y7mw44saGJXDNoBjm6wgMiYDr": 136, + "4QNekaDqrLmUENqkVhGCJrgHziPxkX9kridbKwunx9su": 136, + "4SNKY7GCp7ohY4AawND5Cc2D71sWMWN3Uifo854yvtks": 492, + "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf": 72, + "4SsMncJdtKiUcDtukkX15mqei7WiuQ9yvRtQrQW4reWC": 1072, + "4VrjyXQT61WFSjuG3ehgqZUK1jqvYqB46veQbXLotq3n": 196, + "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE": 68, + "4XspXDcJy3DWZsVdaXrt8pE1xhcLpXDKkhj9XyjmWWNy": 300, + "4YGgmwyqztpJeAi3pzHQ4Gf9cWrMHCjZaWeWoCK6zz6X": 80, + "4aRPyjsqqFsf5488a9QAaHJLQJMGwoL5P6wRtLmroe2d": 204, + "4b1onMDEasBh4BuPekQWijx3BYR64hAE1z2jJyeZUkck": 252, + "4k6wgP5WPBKQpsFGtzuXNrjcTE2fKWLj17nDvFeG5zSF": 212, + "4kL5QD8ir5CvkuvCUnQhBDuWhq3Xfnz3UfQLt4CqPQZQ": 76, + "4mtXJ5pUcMMB4t8cLbi7zfDJCHfYLRrQb4qSLmh57sKL": 876, + "4mzLWNgBX67zVwTykNnq96Z6KQLc8UyV5Q35EfVCDifC": 8, + "4uH4G6YiD5G8rU3mtPg73C2Uqamrqedy3FboTZcZrh6x": 36, + "4vcmYPfLztUckU3c3FvXDwSq8aDNDqwEpvEiqAv97LGJ": 172, + "4vdWYn2KbmQ3Dns5wVBfz4CFQDds4b7CpsC8MHBhHAib": 56, + "57i31UEyDg4koaZMZ1wAHbYuezXv3AVaHtvJgJarxt3f": 192, + "58KprHKFNHgH1Cvo4QwxWkDeJNaSQVteCoAAFUWjtESn": 944, + "5AsoSeQtLoN8eLsf3wKrR3LwxHME4sTBGR6dpTCP1k3H": 132, + "5Cchr1XGEg7dbBXByV5NY2ad8jfxAM7HA3x8D56rq9Ux": 5088, + "5EhGYUyQNrxgUbuYF4vbL2SZDT6RMfhq3yjeyevvULeC": 3684, + "5FbKKGdEaFcxGxxaLKVvBes2JxiKbreh8w2ZpMcSQ2a5": 100, + "5HCTsoKM7vwjubSZSyVWChaHQ9sNNRB1d2SuvL3eZ6Y6": 104, + "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4": 176, + "5LNEDitSMhApT2uFnmtN7FmjCiGuatpnb2uU4f3shrk": 32, + "5MAGJ3zShtXMMVXjZRoFqtFF7XhP8iLSyZrxdL7KpjcB": 256, + "5N9r2ne7dPgHtzeHC5ETJ3DAueKQiXSU8KAmEZrrojT7": 36, + "5P35CJVKU15Rrh5M6EVkre23EyA3K34kAut2GXhHKM7W": 24, + "5RvfTSowms7BTYaBj8SxVjj7ELAAKdQadKsuNpmBAwCs": 688, + "5TGfVQV1S3wHE9hkgGaQkRoPC7xZxiqwMcjQZxVYsf1j": 2208, + "5Us18hLZPXJTS4QVuGSsUw137Dyd2tgBaem24Xsf5nBS": 1312, + "5VrW7YNBccVnhnZVmooCePdLFcs2UjfxRT3hoY9mN8Ec": 316, + "5XKJwdKB2Hs7pkEXzifAysjSk6q7Rt6k5KfHwmAMPtoQ": 112, + "5ZjxMYBbnKd4VFxLjAChSWMTeQ96147HnxZvQJxUseHV": 92, + "5ZqveVffQPiUbkjBg4KD9kib1MKHLqiFno4ke9jSq9qk": 3876, + "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7": 144, + "5d9Mdc2Zk8as8GL1AxQeXxv5htBBvC5bjfmsXC7UUWwG": 392, + "5ejbTALcBsKQ7Cj1iSuu2mY5jqbYHqh9gF5ERXLiYj1z": 2636, + "5essVpBYvocZkQnkrWsMDfRPwtp4BeihJRaweKLR4dRn": 888, + "5fSQdv4zsAJNx6RKpGho6sL6rY6a8nziaqcmwaRJB9NE": 92, + "5ghoFEVrsXeAPB6SUmBpZ2xq3KvHEjNMeSaBnxEBXkHV": 72, + "5ikB9XZNVsjwKb6hHT3FS3So1Z1SrDvU5yaniWEQyDEG": 316, + "5ivRNcK1yThcK3koZR1oikAfuNm6rj1LceMskayoVSzc": 148, + "5marvipGzf98hxnoJFXsZbGHSXcEQ3yRGJ4ps7D3V4ou": 356, + "5pPRHniefFjkiaArbGX3Y8NUysJmQ9tMZg3FrFGwHzSm": 6952, + "5pZvwjSpGYCxpJeySwSbSAji7kZe4YntL7rQvXM3YcNT": 48, + "5t4shVsKnUqgjmhK3fFNsvyju2E6Rd7cc4S5pmqqEVEW": 108, + "5tfcGyf3NQFcufDigvbRt9kWoVN2KPEkBRUY3UaC3Zwm": 276, + "5yEnvhM4Ld3UZs2n173J2iR369E1ddcbQYeLSZxk4cYj": 12, + "5ysfTZ42VT1TjnjzQShZSrix7wdVtjXwssocSeYKDs5d": 148, + "5zm9g3zgAPWzX3wmUB2JtTkcwCqe74NWsTmt5wLFwCKK": 180, + "5zuNci3TV79w6zLoJZzbZujMvkVZb2FcSPhgv9aT24AK": 32, + "61QB1Evn9E3noQtpJm4auFYyHSXS5FPgqKtPgwJJfEQk": 256, + "65pHd5P2VrehonT1cdJ2JUnq5wi3WUgfL3A8RhYH7Kg7": 76, + "6JKwz43wDTgk5n8eNCJrtsnNtkDdKd1XUZAvB9WkiEQ4": 60, + "6M53yM6dsE6hiaHgxWvYa4fsfzQTGyAZn7rM6JrzbqJV": 436, + "6NDen7aDi65apHo8m1Vea4nuS6LyjQeM6pDNqcW4Q5Pg": 344, + "6Rk694kh1QTyQkirdb1uDZmS5xqG9bNaYtxx8d311Mr7": 72, + "6TkKqq15wXjqEjNg9zqTKADwuVATR9dW3rkNnsYme1ea": 1520, + "6WgdYhhGE53WrZ7ywJA15hBVkw7CRbQ8yDBBTwmBtAHN": 2484, + "6XKqyUVUcpe3CNucjF6gk5zonJDqNGvob6kaTy4Ps1U": 680, + "6YDWxPaJWpZxJ6JLGaBeTJaGQn3gi3Pwtivii9cDyDHo": 16, + "6aDs9tUm2gErcPn2c1TZnp5cu2bQV9BzyuwW4baWQYd4": 1544, + "6c6RrC9TWNgiVXnbZ6hehNuhyh81pZK1yAj5w2nXZTwi": 192, + "6dtVKjb6vRwNAekki2FXhKv8WTNzQ3xW6HWMCNWqtoDy": 8, + "6gL3uHvuUjaPp9mTBf2VZ4tpKiYhbWyPrAPboGByzEHd": 96, + "6gnbmed7kzwQVQ7ghsjgEuCoYmGeWciV2qCwni6WS6HU": 184, + "6k1YkmTKwPRUhChnxA9ryJmbtuQMbro4xFTL6mL9jycB": 132, + "6k5hZkHGa4x3xEU7Wz2LxWwueqZtVvX3fpymGugB14yB": 292, + "6pEtDovpyd1zUMYPuNhMCPU37sUTEAtzzgoVVAh1G1JL": 120, + "6ptuwW4rg5A3wP9hNKxeymG3QhSagugPd3grnMTGJwWG": 1060, + "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw": 40, + "6tpuCGuvAZyUwQPFLKmiUfGUKSBjk3yVHJ314cfJV4ZF": 24, + "6vG7fgweSfvY7JRViG4HwKgV9u6JKhMpf2bqr6TKNjUW": 372, + "6xFDLX751L7H9d5fQT9sf2SM5RWWE9LDgqz25pPDbWoJ": 128, + "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d": 92, + "6xWLi1TDSh65fWsSqE1zdvANTSuVDRMx4ghsGJwgunS8": 840, + "6y7V8dL673XFzm9QyC5vvh3itWkp7wztahBd2yDqsyrK": 2900, + "6yFGGAgYpBxgYPuHW4rv7hJmhKrUiXKyHkpVGaYtKrwE": 776, + "722RdWmHC5TGXBjTejzNjbc8xEiduVDLqZvoUGz6Xzbp": 1384, + "73hojLdq1vZDSxeVQEqVFJ4iwLngdvEJPEpEHkSdv6BZ": 204, + "74Xkp2iLXm315h69sFRiCFjmKnaWkMV8W2LgJwPRSgN5": 128, + "76rcGHdPvgs8G1XrzCXUTWtwgT59AFDvpB4VbTS2TBBJ": 2284, + "78sEMVmeecStjxWU7XMJMH8bMRBW9vSiEAhAjtZbt3fW": 72, + "7CR3Jq4ny2tsr3DX3DvyjoU8TYs776MGkU6nLMWjAqCT": 556, + "7CR6whiYULVf1Knj4J5PxUS37opdk8UAx2WnDzBQKiVe": 32, + "7EzbSahSfSjeRexHcNDLDpzHBAGBLjLKtjbmuoQnEtjE": 492, + "7G4RfctwLLgqG4ZWfCirU8dfJd87mKQWgB4EHQRv8i7v": 132, + "7GkMBmtrTZz8QbjSe1sXvAUtz7Pp42SQxfT5ymmJD4We": 296, + "7HMHSdQkjDwz9Q5zAhEy83uzW3XHJchjdpMYapKXcKt5": 160, + "7Hp1e6BrTBkbBN4wFiNmycPVPsjvyUUBL2tGhYEMT6gt": 156, + "7MTjmteQHhthwwTZhUzsc2dP4NBvGNRqj8jzdqNxHFGE": 160, + "7Nn8qBJey7vXtVFMNBbbuN8UkujU8Y6nWzbHVGuf49yV": 64, + "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB": 192, + "7PdKhpKz7T39vZHFL1UfcYNDsLvay6hp4KPQq1aUckFf": 784, + "7PpXQgDb9eCHN1Uudgi77Wm89cRz4T85YgDw83qvaJXd": 92, + "7QQGNm3ptwinipDCyaCF7jY5katgmFUu1ieP2f7nwLpE": 1832, + "7U68WfpxJF5W1HjVQ2NCQr5EuKhNSvSRAnmWTk6225Jf": 28, + "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn": 180, + "7ZjHeeYEesmBs4N6aDvCQimKdtJX2bs5boXpJmpG2bZJ": 72, + "7Zm1pE4FubFYZDyAQ5Labh3A4cxDcvve1s3WCRgEAZ84": 316, + "7cVfgArCheMR6Cs4t6vz5rfnqd56vZq4ndaBrY5xkxXy": 2892, + "7d7x84jiVtqpz9NK88ocLmu4L15uhdnzMEDmo8Py8oVi": 4, + "7knvB4bbqHCKuNp3ef2hJWdwqoH6WAUi55NQt6LdRfkx": 104, + "7mF8NZJdREuM1uwYcvKffuY9QJBEoHhNp4hZ4NS2fuXW": 200, + "7nzTzRZzezmugqE5ZjHRMxarhXunpwZ2PUdjV7uYzt7A": 208, + "7pR7t5axFfkg2VZB1uAuFNUvpAeowq2v15J4gw5MmHTB": 112, + "7qGNnXKW1e3DsqEaSxwxMdBTFsrK73XtWTmkGitRyMQc": 2352, + "7tqeaFKsg2K9xKnQWe61w71AtCZVMQvG4hbFAiFAngYw": 416, + "7y5VhV4fkz6r4zUmH2UiwPjLwXzPL1PcV28or5NWkWRL": 1676, + "7zAHbRxEQaNjKnQMjFm7j8LebHSGfzsQDdm2ZpUNPa7G": 12, + "84gC25fbFKYueR9WEfreUysk1n3ZFxLFDDjbyqeqGpoW": 1044, + "8AkVj5aAtJ27tYXeq89cnSf68V43NarFHMx2iSDjZv7c": 256, + "8GLRbAstsabZuZUx73AoyfGi1FRCWSUhRgMugFyofEz7": 228, + "8Nvaxzif1NrdvxNkRetjT8xJvd33EHkKVrfL8EDkgaNy": 200, + "8Rf7hLczBzGb71rmEjw3h9tTcxGijDiDHL651H9SfSFa": 28, + "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ": 172, + "8Yq98CFAorqAc3CN7XtMVgKLrBc78wsBvjhAbFr4sNQ5": 320, + "8ZQg3K1V1Z2BVJkjmnxpi43WKhjPGXphzu5QmBkJibSP": 236, + "8a4juhtQScHcXPAcqVF3otxLMqxZMDALcE3FEVGBnKu8": 28, + "8aPHvzVV91jZF948tykkoF6WfgLHppNfG8Z3V4gCrDix": 40, + "8augxYLUge2iWmitQMwbcBL5VQEpsM6aJdRofhwpnzyw": 80, + "8aySXUFrqJz5kath6aVijrkBH8ZtxMWJGhYXwYBpKmHK": 128, + "8cnksBVjDPspn3AvmxJd8JKUdh4uWDDXzDemPmDctaHi": 32, + "8cqck84coxk8TGXYBD95QosKCEA6fKwXLevcEv3oGmu8": 452, + "8dz6mnkZC5eavdkyvFAEGSvXdV8vDYtWmtYtj9GcESUG": 72, + "8ebFZA8NPLBZD91CwsG1HWQsa2B5Ludgdyf5Hi3sYhhs": 196, + "8hAYbagNt7CMBooFfqVJhBgLqLffpjXTWJMk8yybjJsN": 92, + "8n4pc4sCJtBeLfJdGyJn6EcZuhtfTiepRa9ExdJFdmEN": 240, + "8nbE53mcKhy74HLiGZ1q5HRocwiCvgh49csSaHSdtukr": 128, + "8pyp3vfVPRziYdAYEyqkwytdBbdVbQmHqfQAVDcRV3w": 200, + "8tjFeSApQ85ThoQXT28acfF2KUfQr3TvTdirSkzNnYC7": 1100, + "8uJiHDJ1b7UDQ4KFsQGJXK9nUCkokdKRJymg1Wy9nxvM": 1088, + "8uPW9msN75rfaKiwy8y8NxEX5zSk2WejtVv5YhZr3jCo": 164, + "8vk6QpG93JSaQCSgnycBsv5qmfQBk4qC9FjNA35E5JhU": 392, + "8yjHdsCgx3bp2zEwGiWSMgwpFaCSzfYAHT1vk7KJBqhN": 240, + "91oPXTs2oq8VvJpQ5TnvXakFGnnJSpEB6HFWDtSctwMt": 132, + "93Q99nhdKjuSe6WNXgMBbC3s8QVQEAoHKt91PNRkUkMn": 120, + "96XWbKem84optM8RLHhc8EYJQG8CCWA8F6oqWMPHDweN": 120, + "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt": 216, + "99rG5AhkVagxJ7y8NpMAmy1h1u9GhT3h1Cimu2X3cwaJ": 92, + "9AW87WqARQonyJYhx1G25fKfvjURFYVmHs79z1NUXDPD": 280, + "9FXD1NXrK6xFU8i4gLAgjj2iMEWTqJhSuQN8tQuDfm2e": 164, + "9GHvMeJ4ZWuAX6sDGscFL1TBMszx2EehnrcTVUy4MZJQ": 204, + "9PRr9k87HjjdLMRkxtxygidjxVta9VQ1kAsqgLBWXKdQ": 80, + "9T6SNsBimjCRJpkEjiVsc8AcxTBa1XVA7RjnBGGfWP23": 68, + "9U4WqNGVywKt3gG9HSt9tGVXBDXJvgid6BVweRysaJmg": 40, + "9UM8wQ8F5oMiRcP5YdqD6Lr4krpBWCD8LtgQYoisJd9i": 3676, + "9USijQaAfSzw6gWbHNq68VVigmj3HvffDJYhbK4tfquB": 572, + "9UbU7oaVXX6t7bMthxzzGPnWumFNxoWqUwX3qsrxb4pp": 180, + "9W3QTgBhkU4Bwg6cwnDJo6eGZ9BtZafSdu1Lo9JmWws7": 2744, + "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf": 160, + "9WzPWqKSqbE5PT9hMsmCDFjzpurAXEYCE9qrpVWp28KR": 680, + "9aCLnHrqaAkebz1eDZMDer9EFJxrJcRZG6CnnNbwK3dV": 108, + "9bkyxgYxRrysC1ijd6iByp9idn112CnYTw243fdH2Uvr": 244, + "9dH6wfdJVgnDcbCUjT8rkmejAzTnGQaFarmLfvBYXANK": 192, + "9eGrDohdNTAo61DRHyfMuqKWXqYnA3i254Wiszxe8FoY": 6756, + "9fa5wcqnAQqHyn58U1vHHLuZW5GXLcoho7hKT17jGJfZ": 4, + "9gFxqsXbFyrKXUkqpAatonn47uYZ7sEZSnMxhzQoXrUJ": 236, + "9hQqNe3DQTiwhspatewA8EXhz12e6sq5UJVJ2qNRwnTf": 116, + "9iFPQbP1jGkj67sXg6YLLGRUBVEDMcapdS6jmCZSnz8R": 400, + "9jJ3YRBL611e7xjXFMBExuninmTWjDnv3FXNotHmPnK2": 16, + "9jxgosAfHgHzwnxsHw4RAZYaLVokMbnYtmiZBreynGFP": 5576, + "9pBHfuE19q7PRbupJf8CZAMwv6RHjasdyMN9U9du7Nx2": 84, + "9ppJrpsbbuGNjiMhhD52Ueco4KXUzVfrtNQ6tAcDab4f": 144, + "9q16BB7WGmBxf1nJTdxH5zPnBUhtHqdqXqRFjSjuM4k7": 148, + "9rkJMARqK6VBkcxGfKBAwnA44gPAfGxPbPsfsggFNDSQ": 4972, + "9ueKvL3WiLM4mNUZrfWqPTYY2Np5YwzFTYvAiPibx1Zq": 76, + "A1vqhA2fS6K7CvHsJKX1ACcHJFEmyRg4KuR5pctHANy4": 3752, + "A23LfQn6khffj2hGhGfXr6P52W2pxrVcCaHVQLYQgiX2": 188, + "A4hyMd3FyvUJSRafDUSwtLLaQcxRP4r1BRC9w2AJ1to2": 284, + "A9mvukTd77EbRoBX4ydSCFQHdu5bsRFkNXTTRstA8FAC": 1432, + "ABC1U4cf9DZMwqy8ktEr4WJj8VHmVBQibbC57gEJthwY": 192, + "ABREU5YkQcfpDZymoQ97iGUgQcfgjctWUUxEMfumiPdV": 108, + "ACTGYsH7bHbaSP7z9N86oLPHBThAELbGfTboc1VoFeZz": 44, + "ACvL73V4GNnxPVfZ7K89jCrYurLyzpEuE9qirjvh2Xmi": 700, + "ADjyeNzWd8yhEjCVyAqT87eqoyGRbimERQsNhFQcXjop": 152, + "AEAJtnjjB19XFreJH21UP8rfd12f9kxMmngwZG3tGXbP": 200, + "AEHqTB2RtJjegsR2ePjvoJSm6AA5pnYKWVbcsn6kqTBD": 2000, + "AG1PsJMQcutNUX64RD3bAhW7NpxWeFkqkgGizBznYFKW": 316, + "AHZxzLeRGRfNVFrCmP58iJgEwbcXyZeAkZ32CmbfEmYR": 348, + "ALPHA6rdHZkx1om79xp47vX1iZXcbM3qfEwLyttZ1T7R": 292, + "ALp2GdA1eJV8vZHMHazCtTxNXe3BLUSco9LDASgjDs8R": 100, + "AMukCLCr52XxsEjXoDxKKxjNg4FpnsReXNaQx8aR6DJF": 1304, + "ANC1u9sY36q3mi2MyVhtz71un8yLgTsFBUuyLcSPzKsk": 224, + "AS4i8EXUZnPbmNT5ZXmoTEbrXQrbFoReiWwwFB43Ds5z": 8, + "AWZhUiQjrjtxL8MEMWsCFbMausFQKkdTnDsFW2i411hN": 52, + "AWcCdYG7Dy6GX45c6QMPbgGwgRZPKcBDT4bXGb3QrVRV": 2068, + "AYY1TCe347UZ7zueBmF4MyoFkeEZquRUNVBNoUZiRoew": 60, + "AccReGBNBdUCEJ7ZyP231jw7uVJ3eF9u4cLBFAyqQuWm": 56, + "AdSHK6vpQnwHRSw7jXUwjMEytmhFwnynZSENhvpAxL1y": 60, + "AfZTWYoFQbzqCMmUBTD7XwxFvjob1FVyCvkaXRryxtKc": 232, + "AiBEt9kE8yZ4CnaLfTCGMp7Fg2wCtqhPTfvJ8D3zrLfu": 96, + "AiDoLWFKzNxSXKeZ4zym2TEPkg6F4kQ3YBA8WhANVPEq": 988, + "AicQr2zCWBLiBwt2r6o7iTemmtyE7q5pTKyuuupbXEQA": 748, + "AjGby82yXeYgj3kmng9y3c4nQpZFmiPpJKecLJTHbfbP": 80, + "AmhQFcGvH2hjkucP78rn6GMKSbstYwyFpCDVKZUwBGrG": 92, + "AmjX7CerZbHrU814UeBp2gJC7gANNG3KrP4c3RyD7TSD": 100, + "AnKWYWA1zktynzWqPC5KQFYWrTEWNny2CAHbAVU9zSXT": 56, + "AoUwfPuiEek2thVRDhMP7HbQb9rguyab4rDiz2NAfwwA": 268, + "AqyRvpjjSN6jWYPxijoJwhmKwJFk6fRYDh9fQZHcJ2o7": 516, + "ArMBx6veRq33ffEP9sxHafiPRgrtzww4XvbwZbSMfXiM": 372, + "As9NxA9bCfhrVLAFyGeWG5X5iLYPGhU3R7nLfX3tN6am": 152, + "AsMpvJ3DZ2Ydu1WTRMAyMH4QjSLiUG39rKzfzvtE1bWr": 200, + "Atom7LRkdXj6MBoWJPgjaetrCMrgB9nnkQBYXTWE8Z3S": 24, + "Av8EnYrPBnSJHK5e2wmTdnCpSy7nzmBgyFaUKSyLnBfe": 144, + "Aw5wEMXhbygFLR7jHtHpih8QvxVBGAMTqsQ2SjWPk1ex": 2756, + "AwcMVMvmT1aCETVYV42WE1cSMCyNp4vZqVjLsvs6dM4o": 220, + "Awes4Tr6TX8JDzEhCZY2QVNimT6iD1zWHzf1vNyGvpLM": 6416, + "B94PGWcxE9iEDov8sZobTkqEY96Yb5gfcsYWSWpQxh6S": 40, + "BADc8V9fi8KsZfF26K6DgZsywcJYZTX5EW5jypnVCB8d": 216, + "BCJN2vZFAHDYmufBDcbD5UAQHSyerXfc6UQkgX3mSWuh": 16, + "BCS95L5JHBWHvWkcEJBEF3BH5QHxKcPeaTgoYmHLvfFh": 68, + "BCeczqpTRPigndHVJu1KEzno1Uhb4hjrE7ttmAndrV1p": 276, + "BGAjnivVWqLqByqCVT9dSyPUFicvyJrz7vRvrvui3SEk": 748, + "BJvrWSfonXnS2Km8iA9KLY6D6vS3GcsaUwUNPFBumTca": 76, + "BLUEHGDihXD9CqqC5XFSQzDC3aS5jASohb2BAsXaJokR": 124, + "BNtHBLo1L2vAG7PBQ6mJvWz7GqVPxBnioXsY2Gjtubrg": 112, + "BPKAfGkkzF5u1QRjjB1nWYYbPMUCMPJe1xZPmwEMNMCT": 96, + "BR1aTt4ZZUCwWJDkSYf1hqkYJjo7Mb7Ar8iVTkeSwUB8": 260, + "BRAZAtTTzR2Es8c98hJvcngerTEyRGSdgkHU59n4A6GT": 4, + "BSGMRbK97DcgLe4u4kfNQnmTVZGVnwdtKQBJqWRBTZxU": 36, + "BSMe78Jk1BfeJDdHQj1aXVjrT2aMAYidyNAGQsTshrk": 36, + "BSVckjdW2f8kcXPGcrPPtV9kUDBZ8w8PjrrGVnxgEdwq": 2896, + "BTGPbq4KuFENn4CKuaKGqkaDd3TJD3TEgtMjSrsZnMLb": 92, + "BULKzVM41WAyQZfL34vxqdsYwEYH9mJAJyzRS4xraf8b": 284, + "BUokhb8pPF9MZuzW3rHLr6jzakgcz3NDq2PZkpiVv3jb": 312, + "BUv44cVtsdvU9z2BfFGk6s5JZZWrmVnq5qCaii5ARyyB": 2080, + "BXAxLMMMUNYfC1z166VjWHR3WjTmqzLxB837o5ghmRtH": 936, + "BaDhUB1eWfunwD21Tu3WywyYQ9wZx5hS9WXeHHNGZUPy": 68, + "BeSovDCzhEAfgwDyXBuhmCFKsu5WQ3PaX61GEfteNzXM": 272, + "BeaCHioStqCEFDFxKwAEzyrUPYxqnBPhJ98gDKeEiTPb": 608, + "BfgMdL4FaNHp5zZpD7WMYG5sZUrCWQPEjXDwWS7M5q3F": 340, + "BhNnboEZb3mKkVADMH11cYGWCqefAfmhzx5rU4eRTKGY": 20, + "Bi9kKNxfW2XqgCmLcuhHt6A3x55GuAGmrVZxRHLyVoQ4": 348, + "BiGcsiuFCLuiTzXoQgfLdge9sfpwr55YzdT8Kp7bCXmS": 116, + "BiU1DNow77wGwSXW1bLmkcQe2cuySpkbz7xtbitD9Fmk": 40, + "BirdeyeK5yooepHNNgaW2bGGDD2jmib4oSRFTHyELbZ1": 72, + "BitokuDHQiAhpUKrwx1VssAAoW5Rst8zB6gpfoaxM3Kh": 132, + "BkoS26vBuaXnSowACdChi4WKid8UwmuPNhEJWa8KsLHd": 3840, + "BoNKmNCGvoHS4CkKvYRnF21iEpUP827pZjhFGdA4t5as": 380, + "Bs19Z9SokV1s46jutN9tqqaCgYf1GsVyyytVfkzwn9qK": 128, + "BtsmiEEvnSuUnKxqXj2PZRYpPJAc7C34mGz8gtJ1DAaH": 3944, + "BuoZ7q6faiJNTN24r7Kcj8dp96axs5XPEKXmWGsh2pDE": 172, + "BuonuQoAR74GoMwCFhxKWVWWSGGt2wfbNmQ3cizaJ97G": 60, + "BxkAkLR2W3agWtjMXBNvhxmB8vsn7zhjNQcyfost99KY": 92, + "By8MseMKtZQQaQjMHJiyetmc5AC8RZZv8C2ss33ktrHt": 96, + "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm": 80, + "C1ocKDYMCm2ooWptMMnpd5VEB2Nx4UMJgRuYofysyzcA": 1652, + "CARBN9PY1Qej1aCg4885pfoYH8EHfjWuMy59pVa48ky": 32, + "CAo1dCGYrB6NhHh5xb1cGjUiu86iyCfMTENxgHumSve4": 6308, + "CBUGET5PnvLc3HvEeFYj64iTvdKhYV6pujTPDdDh785K": 48, + "CEL22Qx7p85qY6gmhCZaYJrrnynJitkVRMQo6qZdT8Ns": 220, + "CG4tRANBKrzUmpv93V5sgftjQznBdiJsc2yPCzZWWuS9": 1348, + "CLsFr1KZVbAyz16iFpwg2e4hiekR1unpwyxfNdjBMaoE": 144, + "CMPSSdrTnRQBiBGTyFpdCc3VMNuLWYWaSkE8Zh5z6gbd": 1572, + "CPcDFHCAKkr5Kp9T5aQWJhXV5J6iFj141NMQ87L6poPL": 224, + "CRNyGD7xNPThLjNviGdxoAiHpQXZKx3UeyCfrxnmTi8r": 8, + "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC": 288, + "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y": 216, + "CVGwNaC1FaG95hRBHUuieDLyQU2hJuGhPduu2cMyHnw6": 68, + "CVRr5oHCAAooVbYze7CvXtRp4FUtkMCSqBZU7MVu8v8e": 100, + "CVgwMrWo9chKEuEPCe6Za9KJe8jamnAcoeWzaMeNubr6": 56, + "CVvaeDPR2o7P1eawG5c9TPFLzSXAewwPovPmREaEL4Cm": 432, + "CW9C7HBwAMgqNdXkNgFg9Ujr3edR2Ab9ymEuQnVacd1A": 2348, + "CXPeim1wQMkcTvEHx9QdhgKREYYJD8bnaCCqPRwJ1to1": 296, + "CZanBzZHFzrGY5qKzaX3CNhJ5smHEMTWFFnoeUi4J6dr": 116, + "CaveyttUBTKttncu1e4RF814XjuoGfYv8cEsiKGDNCPX": 872, + "CeJjdkRwfqYjrb7ZgKgqTurxx88H6kZyRadJwNJBcQwC": 48, + "Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24": 484, + "CfgRXmp1LEYr97EaT2RyoL2cSvtWgJh52Bes89RxVSoW": 1288, + "ChaossRPGKnsVhX1GfPC78yq5Sqju4cMThcAsKZNz5d6": 68, + "ChorusmmK7i1AxXeiTtQgQZhQNiXYU84ULeaYF1EH15n": 1300, + "CiR8HNCfkjtcongPmP2DRdZPnFgjSbN5gsXdjmsXXHcB": 72, + "CjmXSapt1ouz3CZzgkRJckBEwMSo5fVdVrizLeRscwYD": 244, + "CkCMabrc3HgBgDkeKPXkbWuQpUuSqW7zs1Mg3HFArx61": 384, + "CoG8d9Fp2TFJRkAmrPMiPsGhQWHzdTTVoegEp9svRgmJ": 2708, + "Cogent51kHgGLHr7zpkpRjGYFXM57LgjHjDdqXd4ypdA": 624, + "CpNnGGhgVATJAbzHUXdrcGfpPiGuZyPka4QUmH7YgavX": 80, + "CpgSfd6QUoBw1267rTtJoZhELqC5q7isKLojBifSbNEE": 56, + "CpuDNi3iVoHXbaT8gHpzKe6rqeBasoYjEKi21q7NRVJS": 248, + "Crg1X8FftV44NmwfFvgREjanBQmyyS7NEu6duLU7Cyy6": 172, + "CtvdyHYt8cMuGVHFarV2RADfoCdnrbd8e9jAsB225uMW": 100, + "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP": 92, + "Cu9Ls6dsTL6cxFHZdStHwVSh1uy2ynXz8qPJMS5FRq86": 500, + "CuStTdKU5nWev5YKxMHyFjiHYG2CnjZ3rrPa8r1G2hTw": 28, + "CwhdMezLucz7bcuWzStpLXgrzKGC2tBBiaVmJZjfprRN": 36, + "CwyVpfmfSiMeCexi3JgUNvaiDfYN14cLDjzT99zcBuD2": 988, + "D1A4F2yh38JLQExKjDiCi4G2tCMwj93c3sikseSSePKe": 120, + "D1Vbgkrhp1TmLGhfUD1urRMx5Ntz9AqQpgdX8DR8QMC1": 92, + "D2RV1q6FgePVVjrMa7AMzVbvvAeg5oS7TAV7qdNKSDsX": 252, + "D3htsc6iRQJLqCNWcC2xcZgUuvcd1JT8zoYNqraNcTQz": 104, + "D4r6Rcua2L7nHHhdaiZe2k2bTfPg2WQqcNYpG6bugvCG": 212, + "D8kuk3qEiVBGwYkuMGKfBDwuRi6jjRkzjAZg45fdaRLx": 56, + "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e": 84, + "DB7DNWMVQASMFxcjkwdr4w4eg3NmfjWTk2rqFMMbrPLA": 692, + "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA": 48, + "DCdTPyDbXNHrmdv4ZyPPzEfY4mPAqH4hDPtowAteoNgv": 236, + "DDnAqxJVFo2GVTujibHt5cjevHMSE9bo8HJaydHoshdp": 400, + "DEU4agzdUCA5oZ1QSLxCyZb1smvdu5j1NXXsK2r823Uu": 8, + "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup": 8, + "DF1owXYZ1fk5vWyHJ8s1cJeAozgkqsi1JUVqvktqrpwd": 420, + "DNVZMSqeRH18Xa4MCTrb1MndNf3Npg4MEwqswo23eWkf": 1832, + "DP9iBgK9c7tJYb83KhxQMFNc1LXYu7nE7EhWpEzQnjmg": 100, + "DRpbCBMxVnDK7maPM5tGv6MvB3v1sRMC86PZ8okm21hy": 11936, + "DTELykegBxxEn9c15GbH1zbYFr9CFd8VHQnhTGfz5JLb": 52, + "DTSUkYHd2e9P2HLyZfbLarsbDdPhQUhZnWjRYuJZQRC8": 1472, + "DUND26mEDfFeaPsVof3YvbXDRvpuQX7HMUJrLgEWzYw4": 2764, + "DURt7rLam3Dhm98nzV9gdbvc5BucoAQYE5HgCgGyYEbi": 68, + "DViARWAWKkxAzp4UCgbw5B9pLSrBY3PaztFErcwgVUKX": 164, + "DWvDTSh3qfn88UoQTEKRV2JnLt5jtJAVoiCo3ivtMwXP": 3388, + "DZKTNGR3r4Akj3G42ReZatKhkmgEXoZjk5Ed2tFwRyqm": 164, + "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT": 636, + "DeXsDvvZzKhVux4YfDFE6p4acJLGzr8yKt5pSTjzZB8t": 168, + "DeepM3FDWaAb7o53rvyZk5YvHLG3FvDiVXJLRY78z51p": 80, + "DefiihS7gLkj6xLjjhcr87bFuwpVVNYpeNBaBeFe56CY": 80, + "DiFeTctQSaNczJNmZ5121kYqLaBe9wDpM9sjCzTELJLE": 32, + "Diman2GphWLwECE3swjrAEAJniezpYLxK1edUydiDZau": 400, + "DiveRaPKviyDnQyiiMFdV4rujsCBJzMNvPjKfvGNLGvL": 308, + "DnQBmTJyLbBMgJYQLJDqJz25AJModNkyexL5LdVRGnG4": 148, + "DrifTrN923QaouP89UxkQzFGbumKPCnfkNYQRwmZxatz": 2912, + "DtY5Bzxd75iWQRvKwM2xLUxqwLT1RRoeNwmVvgS2JANA": 76, + "DupN8puwoPdFo9EYm8AXemEn9cMsore1QmZzfPaxyUG4": 100, + "E1r4Psq84tHfQ6aPTvvDka4U3u8zPVD7gEUrH25RdxHL": 6848, + "E4xNK4UwGnMtkdiUPyx13i6NkFDdW9Gw9NFGY93wEdGZ": 24, + "E5UXkzUxqEXpeDf3WsrMZHTs2ZSSBpAz7G4hpGwgRGDT": 500, + "E99w1XfS4UNM1xUKXWEuDmj8Mduy7u65jm2NCULTspSV": 84, + "E9hD3ikumJx1GVswDjnpCt6Uu4WG5mz1PDWCqdE5uhmo": 48, + "EATpCzQNs8BzZh1mx1hXMAJm3o1MLXakTXr4UEmcsY7f": 76, + "EAW9vxqogvdPNapq7QTDpiVTHK6o7begUhPVnf854VTc": 72, + "EBk678aQvc3cUkfGyoehfw21JQfJXjmWuBeopYc89RSV": 104, + "EBoKqyT2kCabcHXgpF7ScwrHgGUsR821xkTJsHtP2JJi": 32, + "ECNnK4VjcKTsABiw8FAp3JCE6tCmYyrEJthYVyMazmxi": 20, + "ECZx4Dfyn2o55KTYbM9r3Dt4VZRcrdfdrst7sUbWgrdU": 128, + "ECeaWy82CxpeJQr3EG3XNmYXc9NrVeWDH5ag9Lt6TPVR": 100, + "EKgSCR3ahdypkxXcBY43ZNxdmyZqPkKNPey3rwKjqbz7": 168, + "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk": 92, + "EN5F2BU5juUEWr9zRNNqKuQMi9zBUY1YLPHV5EyMrvnW": 232, + "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy": 72, + "EQhTjikb1L2jvxsCaSW2o2TuRXh4Do6HzBEWCxpeM44W": 272, + "ES1M3tMZ4rMTJ3apE75cHfeGWizDTrMMXy2zKtWkd38R": 32, + "ETcW7iuVraMKLMJayNCCsr9bLvKrJPDczy1CMVMPmXTc": 276, + "ETuPS3kRfLufz5VSYN2ZrePoEVSZSpgVPKz3MUZpYe3x": 272, + "EUDis6LJeJzDHTEBgfHGQyjHp63XZkGkx4E69xunC2Ej": 124, + "EUcJwf7jXskRE6NZBtFPVH2EedNvNYko8LL2WT62XctB": 1356, + "EWARp8Syq8cTWGWHtP5LT9fKAn5GvXfSCH8LfAwpgQ6m": 152, + "EXckihF3qmguH5znjhfzLvHsbk2E3nEW2DqNh4MMnDMm": 1432, + "Ed9WjPnZfAXsPttcqxMwj94qsuXVRyBsyXnDkxFva2Zv": 232, + "EdFUcP2f6j9iBg5BqsgJn3WDr1JieiKCo41hZ5Zrsk6w": 192, + "EdGevanA2MZsDpxDXK6b36FH7RCcTuDZZRcc6MEyE9hy": 256, + "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9": 184, + "EfPYQ4BUMiKa6736qqrtnCBGkUSRDGSr1WvtyUgWHuyp": 388, + "EkvdKhULbMFqjKBKotAzGi3kwMvMpYNDKJXXQQmi6C1f": 3848, + "EtoMApqP2h1vVm9XLTTp5HERNezm5btkqrdAGQ9fZRnp": 8, + "Ettghfhr2kQerqAyGUuifFtBX17QecRe2gwpUZTAbZuw": 48, + "EvnRmnMrd69kFdbLMxWkTn1icZ7DCceRhvmb2SJXqDo4": 7604, + "Ex1AxFCipXGfSxgvXPPT3nPQUARddCduHwKR6jHiXAaT": 872, + "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD": 40, + "Ey3DkEVbfBxfWmkTsG7Hqj7jshYf5Zx9H8462Zjjkykf": 276, + "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4": 92, + "F3tdN8SoakjEPb743VY18YyKJWYHo6rojV3nkas5YJh8": 24, + "F6kVwubXEfZZo6e4Kozrtg7WoWk5wTRmrC8pwoxSLa7S": 260, + "FACb6bbTDRBHCK999V8ox8jga5JBnt1r3vvzmAYAMv2o": 240, + "FBKFWadXZJahGtFitAsBvbqh5968gLY7dMBBJUoUjeNi": 4156, + "FBbqKvwLfKGZrKrfSbPJz4ymQ7zMarhRyZtu1RBkSe89": 1976, + "FCWkGAHDWK41ANjiaoPudkCZRkvTecaEkoZQugezUnpr": 96, + "FFevTkywysWf8PJvH4DZkEp4v9ks9HJPJhZWbhhJiYnr": 36, + "FGiEdzde7Fco2WLpNQMat299hUVoykJdaA5hxdmCzHiS": 112, + "FLVgaCPvSGFguumN9ao188izB4K4rxSWzkHneQMtkwQJ": 24, + "FLwV8tm3pL8pZj6d927VASzPrgW51Gf4nRJuTewrfega": 8, + "FNKgX9dYUhYQFRTM9bkeKoRpsyEtZGNMxbdQLDzfqB8a": 3624, + "FNTPSUuRpDoJx1hwFmB5ncNLLMX42aE83P4hsFYUfNRL": 68, + "FSVdqBzx5D4UsqBLnvmH5dFx2dCm1pTPAbQWJ1PYzTJ2": 4, + "FSyAsxcE7g8pSSEu5nx7Hkz44rMZiYio5Wz8Lszh3Nbi": 144, + "FWwwP9tNttSy9dJFxwf6ebXWfc6VJXqFNMTccrMiLFTH": 908, + "FZ4MT1HYJHd9GK8D5mJ9f3r7irLaDL5NxBNLjGqrLqs9": 1396, + "FZrSKKsKfZJovcQWRQFDXz8DbHKCSRZLZqbBAGd1dG57": 12, + "Fb77sbwgXmtjmkjkaoSckGp5yg3nqdtD8zf1dyxxiCSf": 208, + "FbYX2uN573G5WsgiPdHU6fS5PNUyjdXfGfpZNkYUuT4k": 2316, + "Fc6NNdS2j3EmrWbU6Uqt6wsKB5ef72NjaWfNxKYbULGD": 2128, + "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk": 14588, + "FdH9QEQBxPQfaF2JpcjgdfcMnDb7rjZkCDRCWLRjTQwj": 128, + "FhFB8MAj5Kzxo2aUKnnAXGWxQRhfe1Nfrf5gTReQ1evD": 636, + "FjYEr2UCeFzNfAKiFrbhG34Zv8LxbmfHYAFhAfc7SLQL": 180, + "FoXyHJXdQGK2eHoTjSAzHq4hzxWdJvpGgyzrtPS9eAk": 44, + "FoigPJ6kL6Gth5Er6t9d1Nkh96Skadqw63Ciyjxc1f8H": 72, + "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q": 20, + "Frog1Fks1AVN8ywFH3HTFeYojq6LQqoEPzgQFx2Kz5Ch": 516, + "Fudp7uPDYNYQRxoq1Q4JiwJnzyxhVz37bGqRki3PBzS": 188, + "FugJZepeGfh1Ruunhep19JC4F3Hr2FL3oKUMezoK8ajp": 260, + "FwnWx7x99rGwLmipzz8ii15NqcHkKRo2oS1Y7j6LivgZ": 316, + "Fy7RCjDdFLG8wLn7TBKbccaKwYX1FetdSoVDREdUHf5o": 104, + "FyLVPAKkgdAy8Gn9jnFYN5yjC1ubQWRkw2EHt2UnC8uA": 120, + "FyrwfMaomErzqrFUXMjCJ7mA4u81DsiDdrzC3MJD6d4j": 356, + "FzQqaDStQQHs52YKeCnDovwSqvyZBCgs2kJcmvoFZwaS": 2044, + "G1bLKfyNm7zsmmYEL9dyxBvMtxpFcwy2s84bHDj2ZFUY": 524, + "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN": 52, + "G2TBEh2ahNGS9tGnuBNyDduNjyfUtGhMcssgRb8b6KfH": 1076, + "G3a3iYZKNLbivothF3twqcaTCEvoPb9uJ2bFc9DNKkBQ": 1268, + "G4GT8z4AKWNoy3x6nuzxW83UfFXLXzrwn7DZQt4GvWdU": 208, + "G9vCpJUUSpEm4zPwzSNpDmZ8MGwLEbiSLV59EBzCGvzM": 1036, + "GBQ2GvTzmjXMu97dr7WUnLKYTNim1aoZsYS53KYXAAAA": 2792, + "GEM1N1UE3C8BB8EaaEPrcFvT3iLMVrurknjW5AYjUReR": 184, + "GFXVa19rX6iwfs3sLS5UvX9Exu2usRsG4V5MRMDRo23V": 96, + "GGX3BEoZDqjxcw4AbCdu62ZTMrkpSgmPt81oP2mVuZNS": 100, + "GK2YYwmQk58xA2k2SeugY3i334SJVViqTT8sT5wim3Dk": 188, + "GQiWnDYrzHMALWG9avt5FCu1wisAQHjGY5ve7GMBiPEe": 104, + "GQzMeEMwAR44ugoNCifTb5NdRKos1GduDUPeNh6AgV46": 2596, + "GREEDkgav1ox1jYyd9Anv6exLqKV2vYnxMw5prGwmNKc": 644, + "GRT7yrpfF1TEvp3RmCzu5YZ74B4EueVMPg5NYtSiPwtD": 184, + "GSTampk6BJRKSDkzhaMM49R7qRx98MTPYYWvKbp83XKc": 2640, + "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5": 188, + "GYx8kpp7SsRwtQEEsGQjAxb4hFMMmT91kFJuDeky3YGQ": 1468, + "GiYSnFRrXrmkJMC54A1j3K4xT6ZMfx1NSThEe5X2WpDe": 96, + "GkFT5nmcFVmJiLwuE98PjdF3LReMeq4WbejFHfwrnsgw": 264, + "GmCxjmjKZoaKN1DKunbYq8RCYib94Nm3sHyncFfofaF5": 1040, + "GoeW4aFK4dGoekJySgUynWDxBZiQJqm8GDAF4H53tDK9": 3084, + "GqDCbnafLmKkdqiqf278jDLXqjjZMB2sViZQtR82jPUf": 148, + "GvfaiJUhNCRZGVGumsEF1eHDb8JpAeFAyHSrTifyhrbt": 80, + "GwHH8ciFhR8vejWCqmg8FWZUCNtubPY2esALvy5tBvji": 184, + "H8fHToVcZPi5bupGZohGPX2SWs8NHzgFKQ31wi5n6oux": 716, + "H9ENbtmy2tWFtAJNmpC8xQtbcr1NTp4FXLdphRaG8L2T": 316, + "H9METtoxNp2PhcDNxXwqpzBarJw9zJezhzdDEFgBqv8w": 36, + "HEL1USMZKAL2odpNBj2oCjffnFGaYwmbGmyewGv1e2TU": 14396, + "HFSPaT8zL2a75cVW3snNzgjFRPZj1GbKJRF2RJ1qztkZ": 36, + "HFTcVVrX93SJwYHAiiHAssb3c4zXqSsF4mNjg5arGPEj": 156, + "HH5dA42XF1HxNk1TRpG6LuKfLViMYNdAz5iWrFM4hWFi": 752, + "HLXxkmjb47spcmbbKi3UCfZ2qmFY29t8MN562AEmh2Qh": 112, + "HLnodbYkL5PFA8hjAZDkm5pGzV7eLTvcs671AW2L6St9": 1276, + "HLyBoQdXsCcCCXgPMcT6QN64V9zEe43zi4BDoYCramJ3": 48, + "HM1KjNaXa4w8K4gCXbieoMh5gUTNeUhg9fvdXMKeBW3L": 576, + "HMWXfjaeSHhww1wvdBhqhHVP9v96mFB4LJ9xP2MXbDGH": 180, + "HT41udB8mLZZf7tev9tUoHYJ41TP8GWZ6zFMbjiviXk5": 320, + "HVXXmNKkmDZbZwj74iL2Y9Wu4SyrchBoxAfFYVAktLrG": 180, + "HW4zorvt6xDwhU36RqjcWNwU8YMj9tiqnAafBKW4cqV": 112, + "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU": 1068, + "HaLanfo94ezLc3JZ55qqxr7W3qbe1PprJyv2uEtriEqN": 680, + "HbidP4hpQdwhkzrxder3x3VNPt6DQnE25gFG46napD2p": 1700, + "HcZvwZ83PfjrQDiq3GLHxisTs17aGURs6bJ2LwtmL4qv": 544, + "HgozywotiKv4F5g3jCgideF3gh9sdD3vz4QtgXKjWCtB": 76, + "Hj2jzpAp57KyM3SmnYwJbDVrQ8tTWizMon2hhzYzwxet": 180, + "HnfPZDrbJFooiP9vvgWrjx3baXVNAZCgisT58gyMCgML": 2372, + "HnwMGBAw5PxaX56eSYc969MorEy2NzEMPLkmBkdnJmeq": 132, + "HpcB5Qg8Y9E73dUkot5e8HkgAJbExsYeUzniY4bCuKac": 2564, + "HrWYa5vKZrcDbQWE39SGYwyzYcbsmXfBiHJGxpasymm": 12, + "HrpWeJSYnQVtZe3BKxFCBrAEr8GRCmYUbQev4hoGDBs6": 128, + "Hu7pi2Xg5Kav8vSAUUr5CCZaEmMCzT6FgCTpueu3oBtW": 80, + "HwN6eoEe9N3kwHi66hpQDBMFPk6ASQGthWKPX5MZmisp": 72, + "HwRia5HUmQcvundpC6iFqwfK4iVNKRSmYm1NKsrMkZBC": 4, + "HyperSPG8w4jgdHgmA8ExrhRL1L1BriRTHD9UFdXJUud": 212, + "Hz5aLvpKScNWoe9YZWxBLrQA3qzHJivBGtfciMekk8m5": 3768, + "HzF7Kov41YJvKNkVEepUByEP5NKG45NJTc63JUDxT7tE": 56, + "HzrEstnLfzsijhaD6z5frkSE2vWZEH5EUfn3bU9swo1f": 584, + "J6etcxDdYjPHrtyvDXrbCkx3q9W1UjMj1vy1jBFPJEbK": 3832, + "JC7bH7HSZoDhwggBXtRF31cVt71WiizY2J6YDDQfG5er": 84, + "JD549HsbJHeEKKUrKgg4Fj2iyv2RGjsV7NTZjZUrHybB": 6748, + "JupmVLmA8RoyTUbTMMuTtoPWHEiNQobxgTeGTrPNkzT": 12792, + "KAW1LjxH73tRBd1XsaqsRsgeERFkg4WpdXUSqR4QjkW": 28, + "KAoSp3EudGqUBXv46tQoDwbZxSm3iXa9wM2aF4ySbJJ": 28, + "KTMkUG8WCw9FdH44jLMBpc1teGafnYL6SgP4fHHbsNM": 196, + "KoLibrJsbABbtmtFPc7nPvDxT81rc4UPM7mY9xSLjpo": 296, + "LA1NEzryoih6CQW3gwQqJQffK2mKgnXcjSQZSRpM3wc": 536, + "LFGGGJtnBLvq78DyMz1gTeedM6f8owck76qHThDABBC": 20, + "LTP1bMnfq1Z6UctyDXYHo9qcUJ6ReXm9cG2VwQcsHBt": 36, + "Lake8NXDThihebhxS3Js7mFnj9fthmus93zEdsFNrsL": 136, + "LeDbQ99QT342j9S5YdyXLrsq2Gu3T3dMGajExdAuE3V": 288, + "LiFiDJwJjW98MB8wxcnXpafKYsuz1hwpUkuszkERiX6": 28, + "LimeA3gMLb2SjxrKbP7NsWk1UwTZrw4B6Ctc9dmVU6E": 148, + "LitxAVo3RnYXD2sX1TyRJxfnKy48amXgyGiysPZjZwE": 96, + "LodeuWMHPiPj2PUHUyca2bkpFv9HyzR3gaDBmGJ9TSS": 60, + "Lua1fxRRHCnjVAYdfGyv2GbUsRHGM2DN2wgpWuF2WSb": 16, + "LunaowJnt875WWoqDkhHhE93SNYHa6tfFNVn1rqc57c": 124, + "MARiKM3t7pDCyXtvLq24ErWDAvYu84yXqCthkR1GS33": 284, + "MBVyz9s72WSfUmbr1S8fgHjDJQkPs1Q4Wxi6A2Mees9": 152, + "MCFmmmXdzTKjBEoMggi8JGFJmd856uYSowuH2sCU5kx": 160, + "MFLKSo4XDfrBf4FByx76zYM2dXSWcigag7ec2bCHTR4": 48, + "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV": 212, + "MargusJeV9bkePFLWbbzRNsMVo3Re6h9wKB5Ago8Tfj": 56, + "MicoB9cA9R6jsicdhzWFjwd9HMkV8FA4o3WxYU6Z2yz": 24, + "MutT1jxCXbRWJXpXoJK259gLrNfzDezdxS3BSkQAmv1": 504, + "Mwz8VgAEnPtfqS62r3ixrFiMJwnNfEwR141CGnsTo5k": 60, + "N43JWBg42ZoUFMkHsRUVbP7wGVdxaHKanqaF9BBNiFC": 196, + "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk": 136, + "NLMSHTjmSiRxGJPs3uaqtsFBC2dTGYwK41U18Nmw5kH": 116, + "NdMV1C3XMCRqSBwBtNmoUNnKctYh95Ug4xb6FSTcAWr": 124, + "Ninja1spj6n9t5hVYgF3PdnYz2PLnkt7rvaw3firmjs": 1408, + "NordEHiwa6wT5TCjdeWJzpsA7DSmWQPqfSS7m2b6cv3": 192, + "PAD9aPiKJGcbGxuVLbc8o4Vf65GPq3fJQ7PkHWuX6a8": 232, + "PAWsME7oYbjt5TRNc11mBa33JhKnQr9AYherdr9YAZ6": 268, + "PKdLMugp1Mf88Ji1GkdqRDBewaUh2cqg79CBEo6eJoQ": 136, + "PRGNnb8DxVcP2WjSHfVRGgc8SkA5u6dbMwoTVV1BGKN": 372, + "PUmpKiNnSVAZ3w4KaFX6jKSjXUNHFShGkXbERo54xjb": 1392, + "Pid6HQnMCFb9izqX9i7X6ePdUPieGmjHoPxC1Jfooix": 176, + "PoN1E3VyqwqoGQEhC8ExpkRKTuyhxtGLnHHH3DwbgTU": 52, + "PuRposE4utktenW49N8DCtVzdVEwYrmsrroboEUram4": 20, + "R2D2imoV8nXk1ngT9v4dEK65We4uLNyUarTBdWbFruq": 48, + "RAuSNo4DRjo83uGhdgg4fPqYBVszi1KsrQGpqcPHK1D": 80, + "RBFiUqjYuy4mupzZaU96ctXJBy23sRBRsL3KivDAsFM": 588, + "REA1zKzM5WjDEcpB27Zx2Rk16foNPtLGTETy93LLgNw": 60, + "RFLCTDRBVZTEbXrCd92jnKghYeDJARb6ByK2JnPfQmH": 4, + "RLMS1pv3YKi7CSUCKTNcFN5fFkXJc2SmCwPhbQpqZJo": 96, + "RNXnAJV1DeBt6Lytjz4wYzvS3d6bhsfidS5Np4ovwZz": 744, + "ReFiqMfGnc7tW8WQtFFcJRPZSDAWDBnAsdoFYF2QnfR": 64, + "RoYFUUD7QD9aQ34UCMcwfye8dC5YvJeXz2J3mmoy5S4": 112, + "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4": 52, + "SANDCxXBbQhvbUqNtiLqKdFEY1uQhVo1UgUACaS4mXU": 68, + "SELEXm1aELCweknS2tsG6A4WivjVvgrTWn9doHNLj66": 128, + "SFundNVpuWk89g211WKUZGkuu4BsKSp7PbnmRsPZLos": 32, + "SLAY6uN1zZpXBTfbuDDCesNmM5D288xrz8uYvfS3n41": 268, + "SLNDCSGTEsA6KHpgR32MBt9UAurZnVSJGUtW2tRpdU2": 224, + "SPHERExTW7GaMgS4RN6MbghYvXU2REfFWHgpxMH1P69": 188, + "SQDS9iwyWvT2mQbSZzuNKGoxuBug5jRHouF6SuMRBkA": 152, + "SSmBEooM7RkmyuXxuKgAhTvhQZ36Z3G2WsmLGJKoQLY": 328, + "STPTshazcjH6cZMHzQBrggFSPHXYCTRGB7ctqS1AjkH": 104, + "STaKesuXJH6UGRizuEVSWG1tyLu5ycKgWj3i1HUdvs5": 36, + "SWiz7QwnYPm61pWWUUkMhj4r5pZLP1SvYibdHcB2cov": 184, + "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh": 40, + "SaGAgdkowooXBrHihpmE8gsjf1dUG7n5SqnyJxYFnXJ": 72, + "SaV6UWBaE8M3kwMBfAhQ6Tmvd2qdJRm94NTwLqtoyGd": 112, + "Sh1ro1CaaVjNuihgNK6kay7jwcWzSqD2fdix6RNPaSh": 100, + "SoLiDJGk4WkdinyLiRWjkFbgLUhjL3idGJK8H1rUWqH": 44, + "Spiky3mMSLHGhffuEhYR7ptMNZ8NddddwrTjki4VhWk": 4, + "SscQkTYV2BFQYGGffAmTzvefrFrw6z9GNYiWHstVZ77": 76, + "Stakex4B2tpDHPWGvV1dninfiaYCGdakgTknpzPitLh": 184, + "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty": 296, + "SyndicAgdEphcy5xhAKZAomTYhcF8xhC7za2UD9xeug": 236, + "THE1CosYJD9F1eBq53Fg4MZYZa5WrPUf2RQU5ZHnfEj": 32, + "THWsLPufeq9LWs2H9vYPbtFwdxAHbQHvSbT6pztG8x1": 204, + "TopjgY7N1fJdnW89S9fX6t7LF61nspgXGL1NpgAKhDG": 44, + "Tri1F8B6YtjkBztGCwBNSLEZib1EAqMUEUM7dTT7ZG3": 260, + "U82KEYMnuCiZSQbvuCJTZ652HX9NQ63uNSnxyucshrk": 64, + "UMi1r5J3SagSu4HC3waB3YFzbXi82rRSScgW2e8NTfr": 208, + "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL": 68, + "UPSCQNqdbiaqrQou9X9y8mr43ZHzvoNpKC26Mo7GubF": 388, + "UZBmptMjMSQEPKm4WyUkJeAuvZSqTuNK3cQCKFqJcXT": 20, + "Uf7TePem6vihMBiRg2d1ivnoNtRapdATfe5o99NuZH6": 84, + "VALiDcyCpujxjJAZDK2av2TpMAigpSodzj2ApqgR4e6": 112, + "VQwCCSfW3o5NDx7n5FBr9SoYiLXVgetstHvaWBvv2YH": 920, + "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh": 536, + "VicAQ3U2GjjAuF3tPCtEQZdZKnpAAxkr5Q3zjDKmdo7": 168, + "WUNoB9YQXmXXRcJsjY1G8PfVag5aAfnyGmFd6YwJVwp": 156, + "XAqHfPFsqTfAJHBRHAcEECkMSykXjkUj2Rta16Qshrk": 64, + "XkCriyrNwS3G4rzAXtG5B1nnvb5Ka1JtCku93VqeKAr": 736, + "Xoir1BnQX9TbEvon9HRbD8tkjcD9dorsxmNjZAV64Re": 8, + "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV": 64, + "YuRBAsy9Stw1u46A8dMp7WQVBFweLP1PKuYibzYAMmQ": 156, + "ZoD1XLMhxdMveAJL4x9oab4FhRKP5NThTnSCH19Tdjp": 36, + "aXiomFkk6VzXaBhPuhMqTLZZguCFzzbyP9LTtZ7ZHLQ": 620, + "adramSYKBv1yHoZTub4kepcmF5LybPxwyJcsz4fpfi7": 296, + "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ": 48, + "ana2y2YvQ3ZPMwm6qhnN3nJoUSiT3qx5Pvetkq9xcfY": 1680, + "anatWca4MKScN6y6zo5GEoao5ABy1BLHYLz5s2DnjZA": 12, + "anza1rXDVhy1NfVNtsbT3kSBh2jgB1BGZUKuUibSAJd": 456, + "anzaeL7Lsv71HW2mew8YcKGyGqL6qNn3xoNPRrejM73": 96, + "ark1hdnnfmusE24wGHkyVG1gdRCqfmXs9drasDAdABZ": 40, + "avnujiRNoSRe9PcET42DPKznyfYnb2LRaZAsqv6REZo": 16, + "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4": 92, + "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF": 56, + "bay3wXfJsu9ds1zQBoQQ4DUwFGs3NP6q4gca9WM5G1z": 180, + "bkpk9KVsDRfrArzzmkJ9mPEvbXfQxczzQYR3QMGiR8Z": 316, + "bookoVmqw4QjVj5BbkFacouadx9M7816wyRkfM7A5Lo": 68, + "bxrAptB5ZpZBhoLedJpoGWY5hBjjt3zvVBr2323Rrq6": 304, + "c3rtoMCHSbFrLRTAdw4iRowKSn4BrDtvSPbuyJwkHwx": 136, + "capyS1jerxhFp1RehdWRG6kbWi8bnWF3fkEG2RGLsQf": 172, + "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe": 60, + "chopskqnudaeCTENWzUjfFCBSLcxprqbdMoCAucAwfb": 24, + "chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL": 40, + "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj": 216, + "cybi55ebub37HZW9YmRaLh59Lh3kqaLTsEBQwW6vFkC": 120, + "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu": 120, + "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S": 140, + "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH": 44, + "dxa6QFqLcByyHykLCAW5tv1VYNVQFV3v6oovM2h8inH": 64, + "dzBhD4wikyy7xqwiJvT49gdrKqWVjfs9M6cTssmRX8Y": 32, + "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK": 140, + "fdzip81euDS8jEZHx5H1mn27zGVMLzkgpQuzYRBfBYG": 196, + "fhsM2sxME8cHrrk3qvtMsRRDv5AoLFja7NjNnHeYZxe": 104, + "fishfishrD9BwrQQiAcG6YeYZVUYVJf3tb9QGQPMJqF": 652, + "forb5u56XgvzxiKfRt4FVNFQKJrd2LWAfNCsCqL6P7q": 216, + "gVALrRd3xq4D62KJNGDCpMMGz976w2x1Vo79mSNn4bh": 20, + "gangtCrQg5RmKf5yxvhvZThPugPX58pDSdQ5UuS26vN": 24, + "gojir4WnhS7VS1JdbnanJMzaMfr4UD7KeX1ixWAHEmw": 92, + "gotasRuLTuJNZDtLHmaDJpEUjCWZqkHcuwbLhkgCwCX": 68, + "gridqZmeBcsUKT2Mv4M9YFHFN3tVLFb2TCtTcLD1cAd": 240, + "grptonHnt7YSmJokGK9TJJTBXDT8ca4LSWMHCCfzzPa": 488, + "h3ZXAE168mNxsszYYrUfkMVSCWx6DU2Uvrx97Kb1Nch": 40, + "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o": 40, + "huinBRP3muBuqZLMW8ARjdn4mBnEmFFcxiBzrkQz553": 44, + "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj": 148, + "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu": 344, + "hykfH9jUQqe2yqv3VqVAK5AmMYqrmMWmdwDcbfsm6My": 76, + "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE": 292, + "idCE5k2BtTpwXdwAC7Var1enT9reut9fWECcxQP7LY7": 168, + "jagBNeXYncnn1hzwSq1JJ16XhWTgQ7DCFVqndSJZ6vT": 168, + "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA": 64, + "juigBT2qetpYpf1iwgjaiWTjryKkY3uUTVAnRFKkqY6": 628, + "kREnNfJrPEHbrjSQDxmxZdGmN6hi7ewXZ3UZTURshrk": 48, + "kom1oNHyyt84XLGVfi5Jo1qkVkU5xG1sBxPG19rWknE": 156, + "krakeNd6ednDPEXxHAmoBs1qKVM8kLg79PvWF2mhXV1": 2652, + "kyzzzgRymGpePUsLyr48kQHt53kh5CSfRH1qfvz1xgj": 64, + "mALL2W6DUgDDtcyurC9v5YTF2CMMeuRwPBkf6tEoG3y": 92, + "mD1afZhSisoXfJLT8nYwSFANqjr1KPoDUEpYTEfFX1e": 208, + "mXv18ov8qCiQGs3ieoen981LdgZzYJjJak6reK6fpNC": 204, + "mastWEbKEMjvBCd1uaUBpNjWcfSPhXMWnH9tTrgzn1g": 236, + "mds1WWedpezW3qvgML4WgP341jZksYAy5SbMLwjP5KC": 60, + "mds2fZEpJP688PqJHvfLxGyf2VFrcNkvjuUxNYCwjrq": 60, + "mds3Df1ieBonG2qS8ZoKTqshq5MgTUNfZgc78cjiCdq": 44, + "mds4GEuiSgQRqveGyktWpETBFCb4AS2wDnhqwLHcT6Z": 308, + "meshRrDTME9cL2FSQ9E56EncfkZ7vL8apwcCFsw3o6Y": 100, + "mineL1YNwcRnxN93B2sX6q22R11WfRqxnY4NBV8KfFY": 528, + "mint13XHZSSxtgHuTSM9qPDEJSbWktpmpM4CZxeLB8f": 360, + "movJfS8W7z4PzZJbanwt2DDSN3NbZSyadbDp8DnqbAP": 20, + "mrgn28BhocwdAUEenen3Sw2MR9cPKDpLkDvzDdR7DBD": 160, + "mrgn4sJJu5GBa5wbKyjuASzhyCifvcedGoLtpKjB3Wf": 80, + "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk": 80, + "nSGZ3tv2UhskkPqiB666yDVj7PTi9qKgDqvjHyw5JgM": 180, + "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC": 104, + "nebu15XQKGpxzhhckADBX9PgvGN5qk9RRJCFLKc118w": 208, + "noMiSMNpN3iGeX3WdF5M2KQdFUQt2RYYpfJ4dN1Ni3k": 100, + "nodeEgRVkbYLAQePtMx2zCN7CGw7qRgzKMCBtjMfN1D": 72, + "novaeuhY2JH2WHhc9KVTHDx2cyJZdXJC6faf4CtARZn": 96, + "nymsHergYedT9CJMgtGMvqXUTGcbs5o3MiWTJUbqTGY": 316, + "oPaLtitM6cwpFVzP2rDhLsJLdY2vcbuZiJJyD1TFUKs": 572, + "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS": 48, + "omeg2wsojzB7tfyAxsFhp8npxHL8yxVnaf51poXCwSd": 76, + "orbit1bWKxnECKLqjhm5rybTiEC2GEYbecyebgEfM5q": 32, + "pSoLoZx55zZz61gjxSTwHtwTg4yTwdm7ruBmyjbYgT2": 1400, + "parafiUS6h6oLhCFwhjvEmQJKw8pF1iXsxMJdTq46dS": 208, + "parayLyZvwnGjDT2pGqrVn8UDxmNcdNQCE8uPRWMeRz": 48, + "peNgUgnzs1jGogUPW8SThXMvzNpzKSNf3om78xVPAYx": 160, + "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2": 300, + "pineXRUnbaLNFMxaM3zBmFfTiKgQMGqT9jYHXZWq2Fw": 40, + "pitMDEaMmWmr7qP8HsNqarPQkd3jhZbLJibhhQnL5RG": 4, + "pitch9cMruwjDtAnisNS4mwZUPhMsBztNEGu2weMg55": 40, + "popscoyTKVksa4TyTXw488b3vvFxM7qQEyTBeMQopKu": 188, + "ppppoqHcHVzigV6SK4856BAsNxhTAi32hqQQWrziyHE": 96, + "privaEdSEmnMPGPoQACUkcDGkFBbTArVvsEGd7C5wUM": 1400, + "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW": 40, + "puffinQSvKFriPbyE5atyx1ptfnyytovbzxybr1jsyy": 228, + "q1yPXLsYcJhzxhUYLewFDjYmsBh2gDFnYqrZ9VPshrk": 56, + "q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot": 8768, + "qZMH9GWnnBkx7aM1h98iKSv2Lz5N78nwNSocAxDQrbP": 232, + "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9": 296, + "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC": 40, + "revtecFsGSRCdF29atQvchSXrjwBesA9vSisD4fyH5K": 144, + "rsbp8zMHbGCpLoRktmsjspYv77VcjxAzH1KxPCD9BiU": 272, + "rssaJ2iKcE9QWsFYRZr8Q66TQh5bRk9DxYrzxGMzWQr": 120, + "sCANXAaS1a7yB8jz3USvGNLfd8DSc9r7TNzNSKKPkfY": 32, + "sTEAKPk59EtPPbixCweyv6oRLNCDEE8pnnef6gUfbiW": 136, + "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu": 52, + "sTepQGoReJq2tBKStL19DT6nnGHcGiAvFjyYaokLyuM": 36, + "sZAqxCSN5kkVfG2s65Bje4jzCkD2aLyk21qU95PMf2Y": 180, + "sbidYi7fbif6qNsMpwBKvyF5DKcLCbjaegpADsKqNux": 200, + "scb1Z7du8NVSaHFXsafSjRdXr6xBjWR3iugikL739Y1": 72, + "scb2TYPmwHgKxXJaJNq6gHKwYkVyLKx58hz9RbCKZZR": 68, + "sce1oTWYVXv7a7Hy2skxREozs5nwkQ4wDT8XJSi5tgE": 64, + "sce2zXNjLpPMcSCATTrLiQhAAvHNNMKypTFVtg2H37U": 56, + "sce3TfT81rxYYcdbP1kBFMcTK3ZBc8hvHVeXD6WLSzE": 44, + "scs1NCSTafrUX6RBx113B9YDCepo1QdEzU8WwEkf25i": 32, + "scs2Ra91pMbvqFAP7uitrN5U25SoyBTqZgBbhpVMJko": 52, + "sfvTq7ojrEc5WdXcHijz676eX1pc5MgoLxbkYSdRDAB": 112, + "shftkxnsXmqAkmLgz9Mn7bNB5Fr6mKgFc58kFHfVikj": 3204, + "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb": 52, + "soLStaCk5TiGCpeLKa9Fvv6f5JQGMa6S3uhLh826e9N": 188, + "spcti6GQVvinbtHU9UAkbXhjTcBJaba1NVx4tmK4M5F": 296, + "spur5CDwBvTZszvy1ozGjRc1x2TuDWo3VF4jrq7zgvD": 100, + "stacheBmGG5zMKuetUevAbc4m4dLbve1VPcpSur3voH": 72, + "svsD6T44XJnuXQWB15sy1pBxxruzrFy8rR7gXy8Jsj3": 28, + "t23p8aBQN6P6tziMuN5XPmzqVRrip9oes7KuQwSmate": 900, + "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY": 64, + "tkmaiSoZ3F8MofkQBVWG6JYSCzyN6ioe7ReYXohx3WJ": 64, + "uEhHSnCXvWgtgvVaYscPHjG13G3peMmngQQ2ghC54i3": 204, + "uxqVAFQfox97HazsPtkKiwhypQH6jEGXkQBHDtXshrk": 60, + "vALigXFg9wnnhVHN16vNxHxXtAXiBv5QjAE6udoniBY": 520, + "vahMVcSS3v6uwyFormV7FDAUbQSHwmy6vUedp1P7L42": 232, + "vaoJKVZYPAsqc52T2nNQhABR1gU6Cy2koDKfCQaEiva": 200, + "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd": 36, + "vu1sGn2f1Xim6voHNLt4nLn38zNkYdLasU7hEr1TC2D": 968, + "vvvvbtDs9HsdsE6NskZMnb1RA6muoud1ChQuiF9QhSM": 184, + "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo": 56, + "xLabscif2DLnYg39rQThqi7A9E45L9qiysRZhmZ1ARE": 56, + "yJeahQNRHNWtL9Z1SqPX3SBwTYXr5ECMYYVK4uYVwxt": 252, + "zeroT6PTAEjipvZuACTh1mbGCqTHgA6i1ped9DcuidX": 28 + } + }, + "metadata": { + "created_at": "2026-04-09T18:19:34.117038+00:00", + "network": "mainnet-beta", + "exchanges_count": 30, + "locations_count": 63, + "devices_count": 96, + "internet_samples_count": 870, + "device_samples_count": 328 + } +} diff --git a/offchain/crates/contributor-rewards/tests/goldens/make-fixture.py b/offchain/crates/contributor-rewards/tests/goldens/make-fixture.py new file mode 100644 index 0000000000..2c5675d72a --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/goldens/make-fixture.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python3 +"""Trim a full CompleteSnapshot capture down to a fixture that runs fast enough for git. + +Exact Shapley value computation is O(2^n) in the number of operators, with one LP solve +per coalition per demand city. The full mainnet-beta capture has 14 operators across +about 30 demand cities: roughly 16,384 coalitions per city, tens of minutes of CPU even +in a release build. Byte size is not the constraint here, runtime is: a golden fixture +nobody can afford to run in CI is worthless. So this script does not preserve the full +network topology. It keeps a small, still-connected sub-network: + +- Rank contributors by how many devices they own. Keep the top `--operator-cap` (default + 4) and drop the devices, and then the links, belonging to everyone else. +- Rank the remaining devices' exchanges (cities) by device count. Keep the top + `--city-cap` (default 6) and drop devices outside them, and then their links. +- Drop users whose device no longer exists. AccessPass records carry no device + reference in this schema (only a user_payer/validator identity), so there is nothing + to drop there by device membership. They are left as captured. +- Truncate every `samples` array in `dz_telemetry.device_latency_samples` and + `dz_internet.internet_latency_samples` to the first `--sample-cap` (default 32) + entries, updating `sample_count` to match where present. 32 because + `settings.inet_lookback.min_samples_per_link` is 20, and anything at or below risks a + link being dropped for insufficient coverage. These telemetry records are NOT + filtered to the surviving devices. All 328 device and 870 internet records in the + full capture are kept, with only their sample arrays truncated, even though the trim + above leaves only 74 of the 328 device records relevant to the surviving topology. + +Everything else (locations, multicast_groups, access_passes, leader_schedule, +metro_prices) is kept as captured. None of it drives the operator or city count that +makes exact Shapley expensive. + +Usage: + python3 make-fixture.py \\ + [--sample-cap N] [--operator-cap N] [--city-cap N] + +The input snapshot is a full CompleteSnapshot capture. It is not committed (it lives +under the gitignored dry-run-output/ directory). Re-capture it with the crate's own +snapshot command, with network set to mainnet-beta in the config or environment, for +example: + cargo run -p doublezero-contributor-rewards -- snapshot --epoch 129 \\ + --local-dir ../../dry-run-output/ + +Regenerate the committed fixture with: + python3 make-fixture.py \\ + ../../dry-run-output/mainnet-beta-epoch-129-snapshot.json \\ + mainnet-beta-epoch-129-trimmed.json + +If a future regeneration times out, lower --operator-cap or --city-cap and retry. If it +comes back all zero, the surviving sub-network is likely disconnected. Try a larger +--operator-cap with a smaller --city-cap: more operators concentrated into fewer +cities makes a connecting path more likely. See the task 1a report for the timings +this cap was chosen against. +""" + +import argparse +import json +from collections import Counter + + +def truncate_samples(records, sample_cap): + """Truncate each record's `samples` list to `sample_cap` entries in place. + + Updates `sample_count` to match when the record carries one, so the record stays + internally consistent with its own sample list. + """ + for record in records: + samples = record.get("samples") + if samples is None: + continue + record["samples"] = samples[:sample_cap] + if "sample_count" in record: + record["sample_count"] = len(record["samples"]) + + +def top_keys_by_count(counts, cap): + """Return the `cap` keys with the highest counts, ties broken by key for a + deterministic result independent of dict iteration order.""" + ranked = sorted(counts.items(), key=lambda pair: (-pair[1], pair[0])) + return [key for key, _count in ranked[:cap]] + + +def trim_topology(fetch_data, operator_cap, city_cap): + serviceability = fetch_data["dz_serviceability"] + devices = serviceability["devices"] + + devices_per_contributor = Counter( + device["contributor_pk"] for device in devices.values() + ) + kept_contributor_pks = set(top_keys_by_count(devices_per_contributor, operator_cap)) + kept_device_pks = { + device_pk + for device_pk, device in devices.items() + if device["contributor_pk"] in kept_contributor_pks + } + + devices_per_exchange = Counter( + devices[device_pk]["exchange_pk"] for device_pk in kept_device_pks + ) + kept_exchange_pks = set(top_keys_by_count(devices_per_exchange, city_cap)) + kept_device_pks = { + device_pk + for device_pk in kept_device_pks + if devices[device_pk]["exchange_pk"] in kept_exchange_pks + } + + # Recompute the surviving contributor set from the surviving devices: a contributor + # that made the operator cap can still lose every device to the city cap. + kept_contributor_pks = { + devices[device_pk]["contributor_pk"] for device_pk in kept_device_pks + } + + serviceability["devices"] = { + device_pk: device + for device_pk, device in devices.items() + if device_pk in kept_device_pks + } + serviceability["contributors"] = { + contributor_pk: contributor + for contributor_pk, contributor in serviceability["contributors"].items() + if contributor_pk in kept_contributor_pks + } + serviceability["exchanges"] = { + exchange_pk: exchange + for exchange_pk, exchange in serviceability["exchanges"].items() + if exchange_pk in kept_exchange_pks + } + serviceability["links"] = { + link_pk: link + for link_pk, link in serviceability["links"].items() + if link["side_a_pk"] in kept_device_pks and link["side_z_pk"] in kept_device_pks + } + serviceability["users"] = { + user_pk: user + for user_pk, user in serviceability["users"].items() + if user.get("device_pk") in kept_device_pks + } + + assert serviceability["devices"], "trim left no devices, raise --operator-cap or --city-cap" + assert serviceability["contributors"], "trim left no contributors" + assert serviceability["exchanges"], "trim left no exchanges" + assert serviceability["users"], "trim left no users, raise --operator-cap or --city-cap" + + +def make_fixture(input_path, output_path, sample_cap, operator_cap, city_cap): + with open(input_path) as input_file: + snapshot = json.load(input_file) + + fetch_data = snapshot["fetch_data"] + trim_topology(fetch_data, operator_cap, city_cap) + truncate_samples(fetch_data["dz_telemetry"]["device_latency_samples"], sample_cap) + truncate_samples(fetch_data["dz_internet"]["internet_latency_samples"], sample_cap) + + with open(output_path, "w") as output_file: + json.dump(snapshot, output_file, indent=2) + output_file.write("\n") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("input_path", help="full CompleteSnapshot capture to trim") + parser.add_argument("output_path", help="path to write the trimmed fixture to") + parser.add_argument( + "--sample-cap", + type=int, + default=32, + help="number of samples to keep per latency record (default 32)", + ) + parser.add_argument( + "--operator-cap", + type=int, + default=4, + help="number of contributors (by device count) to keep (default 4)", + ) + parser.add_argument( + "--city-cap", + type=int, + default=6, + help="number of exchanges/cities (by surviving device count) to keep (default 6)", + ) + args = parser.parse_args() + make_fixture( + args.input_path, + args.output_path, + args.sample_cap, + args.operator_cap, + args.city_cap, + ) + + +if __name__ == "__main__": + main() diff --git a/offchain/crates/contributor-rewards/tests/goldens/shapley-mainnet-beta-epoch-129.json b/offchain/crates/contributor-rewards/tests/goldens/shapley-mainnet-beta-epoch-129.json new file mode 100644 index 0000000000..dbd8695b6d --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/goldens/shapley-mainnet-beta-epoch-129.json @@ -0,0 +1,25 @@ +{ + "operator_count": 4, + "operators": [ + { + "operator": "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + "value": 114.5825402808965, + "proportion": 0.0582158738145588 + }, + { + "operator": "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + "value": 7.018788167339876, + "proportion": 0.0035660309614299964 + }, + { + "operator": "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + "value": 1770.4535644969292, + "proportion": 0.8995131461793304 + }, + { + "operator": "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + "value": 76.18044860254402, + "proportion": 0.0387049490446808 + } + ] +} diff --git a/offchain/crates/contributor-rewards/tests/goldens/shapley-per-city-mainnet-beta-epoch-129.json b/offchain/crates/contributor-rewards/tests/goldens/shapley-per-city-mainnet-beta-epoch-129.json new file mode 100644 index 0000000000..1614213237 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/goldens/shapley-per-city-mainnet-beta-epoch-129.json @@ -0,0 +1,113 @@ +{ + "city_count": 6, + "cities": { + "FRA": [ + [ + "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + 1.2126596023639042e-12 + ], + [ + "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + 0.0 + ], + [ + "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + 2147.8283189999875 + ], + [ + "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + -3.637978807091713e-12 + ] + ], + "NYC": [ + [ + "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + 101.78010810073222 + ], + [ + "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + 4.1395302194420465 + ], + [ + "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + 90.13211893728294 + ], + [ + "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + 123.59524825871995 + ] + ], + "SEA": [ + [ + "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + 357.37630201728155 + ], + [ + "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + 1.8189894035458565e-12 + ], + [ + "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + 414.99754547328183 + ], + [ + "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + 372.29043868127764 + ] + ], + "SIN": [ + [ + "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + 153.7957970640115 + ], + [ + "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + -8.48861721654733e-12 + ], + [ + "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + 1819.7826650639968 + ], + [ + "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + 3.637978807091713e-12 + ] + ], + "TYO": [ + [ + "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + 153.4317718500121 + ], + [ + "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + -2.425319204727808e-12 + ], + [ + "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + 2331.5170126499966 + ], + [ + "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + 107.40397739402157 + ] + ], + "WAS": [ + [ + "5YbNrJHJJoiRwVEvgAWRGdFRG9gRdZ47hLCKSym8bqbp", + 188.22575114784496 + ], + [ + "895D8oq5ceWQ7uzL6VDBu4YfAywuaThQp8qfcP7TWJjK", + 99.34872526655514 + ], + [ + "FUYRNmVyxaP6jsm6KmRgkGYfRNoFC8yCaxytyhwy7Hwb", + 1708.2413809372867 + ], + [ + "H647kAwTcWsGXZUK3BTr1JyTBZmbNcYyCmRFFCEnXUVp", + 199.5595005398409 + ] + ] + } +} diff --git a/offchain/crates/contributor-rewards/tests/leader-schedule-epoch-89.json b/offchain/crates/contributor-rewards/tests/leader-schedule-epoch-89.json new file mode 100644 index 0000000000..4ac5396a2c --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/leader-schedule-epoch-89.json @@ -0,0 +1,946 @@ +{ + "solana_epoch": 845, + "schedule_map": { + "11AMA4mnNbsrPQeuoNN7uiZVJZtqEzQHrTfa5vnbcjk": 40, + "12i8gndWWWMTRzJBFhnYkobNgZB3XMUUJq75HeUrshrk": 24, + "138KHwTqKNWGLoo8fK5i8UxYtwoC5tC8o7M9rY1CDEjT": 8, + "13DmVBcyrSdsSsLWaKH9x1dwxDf48Wu5wprwxMmLshrk": 28, + "13cm6z7ajighVFYN1aR2hPQ3Rhp4QJenDbHGRmps9P1n": 196, + "1EWZm7aZYxfZHbyiELXtTgN1yT2vU1HF9d8DWswX2Tp": 36, + "1KXvrkPXwkGF6NK1zyzVuJqbXfpenPVPP6hoiK9bsK3": 408, + "1i1yPyh843bTfi5qPgqozTbDcEX65rUNEFcUT2KAs2i": 188, + "1unarWPGGseFag2WfnoFv8o9P7vTPU8eHex9GinP3eY": 324, + "22rU5yUmdVThrkoPieVNphqEyAtMQKmZxjwcD8v4bJDU": 2596, + "2374M8ZtmrpdY3ywb7fLqokSd2mRhvdJu2PUwoJmbTUh": 32, + "23SUe5fzmLws1M58AnGnvnUBRUKJmzCpnFQwv4M4b9Er": 296, + "23U4mgK9DMCxsv2StC4y2qAptP25Xv5b2cybKCeJ1to3": 128, + "245B9WFHUGuWycSXHagHXwsXGcxDkNYfxWBaeh7vAHDU": 136, + "24xpPUt82of7pcmy3qDvRQjCfaj7DaEiM3D4UDEYr3y4": 8, + "2AKKnirWVZMhnzuwqpizw9SwfZjGpRFLx2zCCNtPWpbc": 248, + "2D2v7sMqDuq2ekZnFhaQm4k2ErWHemZQuYf5qaVTPFmg": 68, + "2E2JPuFhjkQvEJEeNGqVSwGLJa5GoFqabQTutGjg1bzw": 212, + "2Eq6YD8P8QXTeoz9h6JHjgZ55t8RSxNdx4waMDCoPmQU": 48, + "2EutAcbv7T8it6PfPQ7HbK2KFMnMC6anwkX6C3RifE5M": 68, + "2GUnfxZavKoPfS9s3VSEjaWDzB3vNf5RojUhprCS1rSx": 2548, + "2Mob8FJkb8chZY5pTBMpKfLwgZAQHE5i9jAC5zbASitD": 332, + "2NeqnzhgQBUEyMdWyVAXJjCYA3E2UTYXVdqutSQ27h17": 4, + "2P9ZYA4vBoBBr56hrEFTmrd5ctuz3r7wtvRYmbgk6jRL": 100, + "2Q1vzxgfu1AybswayZCNdKkjyAhzDw8r8kqtwcpG7UZQ": 16, + "2Rv9npqdWE1mLPsT1r2obn3xtKmA5afkxt8GsWeLnKoc": 200, + "2UBhtRuyr9nvWsUnrbWrvJiYWEU8TVBD4PLYQJKiRa9H": 68, + "2Ue9zGmDnvYRrJNEjuAdNkbbickw6fKWtbeNM7T2rakg": 68, + "2VA3q6DbiLjbrLgnkiZ2fdyuRyVBkYRgqBDwA6qYiSDD": 60, + "2VKu11f8zc3huqDQUN6WJTFpX32PgHpXXjf72P6YvYMd": 40, + "2XK1YYuLwPCMZSbmfedmso1vmkqrX63M2srNApvAntvw": 4, + "2XmhZKHmfjku3T3nC9xKhgr5bm1CAmWXqNsNt49mo82C": 276, + "2abwQG3v2xRemFxRszVHSfnjJNe9zu5X8duKgxjyLeaK": 100, + "2dfgsiSaZ51QYPsECMYMG247PXxyKdwkV9wTHoQb8YEC": 420, + "2dxz129YxB1xtf7Mx6HUT5JspexArNNtQt84FYueWZV7": 72, + "2gDeeRa3mwPPtw1CMWPkEhRWo9v5izNBBfEXanr8uibX": 228, + "2iXZmNQmmgE5ZeTQ1GMhhYGDqDr2BiqdEu3DbGJDo8MA": 72, + "2icWF7TvxyycF7d1NHpMZYuJJqiRy2h7wmjFSbqUij1B": 48, + "2jS8AX38m8F9C5juToW1FmTufEbb1DfDzZJj9HSJcWwo": 60, + "2kVZVTY8FMRZ3WuHzyqNz8qd4Ytbba9f9DaesUm5WLvR": 36, + "2m1A2WM1vte7RWz5xTTw4i1SiXmngVtXhqFERaUjoAAb": 2208, + "2mDrrmhSzpSyaF12izGk8hnFjtKCGeCFPwQHpRiJDby2": 332, + "2mMGsb5uy1Q4Dvezr8HK2E8SJoChcb2X7b61tJPaVHHd": 872, + "2nhGaJvR17TeytzJVajPfABHQcAwinKoCG8F69gRdQot": 76, + "2oHUYyW2PU9VJh4XBs5TbGgzdernunvGqyKth3kxW4ns": 292, + "2t53LvZfskcpXkdwLaBnfZLbNgyVHPu2BNFpcRBaEBhM": 144, + "2t63m4rsfZEocZZABeDCZYnNqPRPMbQsebSogfUxp5UG": 188, + "2ufnDYz755WuHqGCczry1ACTNUVZdn2cm43bCyyPSZtH": 24, + "2uxEHizFmmnLekKG2LZJwxNabhpymEYfdVCpgDxjt87m": 220, + "2xKovmftuWNTwCWGtw2Cc6aZovgMZyKaoKK68n1ZLmww": 28, + "2zykwzzo1pd3H2oSj5j5SRLTvmpa9Nr2S2Bh8tTVd5Tq": 104, + "32jCuWyy4aJjyv4gd4DSGBHmFU5KUSSfqbmPb9GpMin6": 84, + "32ke3uf1qL3xLqbwzU76T2sbG2XaJrGuSCNdUnien3zm": 536, + "33HWyuwH5H8e4BjjhGJuTBC9tQ41urgxBEuUror8x8SU": 4, + "3ARtLeVB83RoGAwRot8dh74pc2uqbPi6JwbkwDzqk91m": 24, + "3B2mGaZoFwzAnWCoZ4EAKdps4FbYbDKQ48jo8u1XWynU": 248, + "3BeharBd3j4sKQp7Qze27JLQLd9AEEwGTX9TC7dXYSNw": 268, + "3C2cXXVHCm2w2EWnHUNxhtZCB2EMv2AeJ4TpW5ws18fi": 260, + "3CKKAoVi94EnfX8QcVxEmk8CAvZTc6nAYzXp1WkSUofX": 84, + "3DaPk6TdeGnEBwTR8fEyZSLkdayk6vZXrqGZhAgYK8BV": 208, + "3JotfSFPaod4KVK7nj7ULvcq5PjUBdZNVGracNkJNhrt": 2040, + "3KNGMiXwhy2CAWVNpLoUt25sNngFnX1mZpaiEeVccBA6": 36, + "3KW9MzaoUrqXymwZKMph4kPaJ37JfCfw8LxsZnHnCBGS": 24, + "3KiDz3wuZrJfsgKt5KEvRb1WPpbci1PWj78aPVF5ei3F": 296, + "3LKjD9Cb8RKKbmwM3LphHEvfZdjEU4rAFGDDUiVnuXhJ": 12, + "3MVdbyD3niYjAj1uskREY5UsxqNj4nvPHn8fCMahdM71": 4, + "3Pfubj3ytkRxFAGwFb5vtacuZJUxko5Du39xie9MBXuC": 36, + "3Q8GcTR6gUpFjSwjRuN6Bqy73xuJQHPKceuoDq8v18DC": 24, + "3QduBTMSMRAPbRhSmoEYQYPC85HiLmAtjCt2y15Bqw4E": 72, + "3RXKQBRv7xKTQeNdLSPhCiD4QcUfxEQ12rtgUkMf5LnS": 468, + "3Rv6ZVGUuRczP76322LyhTTYw2iM4avV4B5xFJocQJer": 220, + "3SkE34PVeGck2ArEffFKjihrQgURsvnoTAhitsNXNzXd": 2640, + "3Uwkpd9ZKxhuTDWKuiFbJee9Z1ZJPxpkin9476Bwc7Ha": 172, + "3V2xaccDpFib4DbTksdiveNDmiwpXBqSWyjSof3w1Bg7": 284, + "3VV7jhspRhapnvCHTNxJeUzEXCpAJGSYbhHeCvTndHHa": 92, + "3WDh9HgusCujDmXCVhophLrHvoKHQd1Sd4uFHz1Awo35": 96, + "3YVoK8UN62dyiPZnGBzBTkGdwsVmmK1MpRoLcxNRs9BE": 576, + "3YX7PQuESmR2h95FDgjahEQjyCBhmY1Ts2MsrM1Kg9DS": 36, + "3cZSHGfNdaULpFAvGbWbxpVwzXB4gHdk8NFucPNR5pgA": 52, + "3ddX9QcC6DjFqPTysrFWtR48v5g3wJjB862sji4s5Tui": 108, + "3fpcsJ2WPdrmpjVVA5Lmv4m9Qx5xqND1xJhFprDSjWJ4": 288, + "3j1dv2SP3xtG5vcqiqTSpc9C3h4wQnnzh3aqBcx6fU7h": 112, + "3psxMyr7rQzywVp1MXKd1XFmFz33NjydzCoJx9t2sMQW": 548, + "3rqEEEGjHRyndHuduBcjkf17rX3hgmGACpYTQYeZ5Ltk": 36, + "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5": 316, + "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk": 276, + "3tzpLMWRkWucvTRWU5PjgKzN1iwJuV69yCCjmuuo4gTk": 272, + "3x9nibnhgBHWKMRiGnsXJELRBjviQpKyigfrXtKW27KJ": 84, + "3z6PJ9F4Yk2vAFGzCV6cQ9MLAJfHcGtLD3rDmuim3G2g": 28, + "43Am3PKFeo9cACpqYL5Sk95rpVdxLw3Mc22PqRqZXEW2": 288, + "43t4YbjyH2XCnifhBibxhzQEpcLrk7PFS9719DHMSFfA": 32, + "44ZDKo96gQR1h2afAA3oXgutUzHcRXH72RYxhtGxzWYk": 220, + "451X5rboJpJtXK2gj4dLsXv8yCGfujqus2HsYjMkkSpE": 188, + "49j9bnkdgVNxLwsZ9h88sPR5MYEmsUyKrrJ6ZW8ijBrb": 144, + "4BevYSucyVnLL6z1ybHh8KH5FnAhJCbX5gYhn5Dfz1FE": 92, + "4CymATQ8a9qJUmCh5ygNFCePNQVgiKGkobvki5i45BiB": 252, + "4DraK9wUrMSpzbGjUbSWTHAhJimMyB49HyKhvfwe6e51": 268, + "4GEEKSwuiBHWTff9WaqrDcToZjbX6KYdyB4c578Zxse2": 4, + "4JTfCRjd6SzZdoKqdvStHvaKHBYCe9iENAnG4iDTrGW2": 68, + "4JahMMrVRS1gimWoXpD5H6KwKc2MrsoTDFMaStMttL1E": 40, + "4JryygoiM1j324fYkeBzcQDcwRfd2WpgkEzUePFj1rJY": 100, + "4KK5zaTuRoFCGa7cjej7hjHXco7rnoZs7bCLdoRX6vQg": 32, + "4Kbcyn7JVPAWLRLPsNGTPmcNMvCkLTw51ZLRhqsUC6jP": 52, + "4QNekaDqrLmUENqkVhGCJrgHziPxkX9kridbKwunx9su": 140, + "4RLcStbSkt5S1Xm4mStup6N13PGyAfAWy7Vs5d7yJRnY": 220, + "4Ro4hxThmqs4XJMii1yP6x3jupHaAPtnoVmSpX7cxgp4": 160, + "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf": 80, + "4SsMncJdtKiUcDtukkX15mqei7WiuQ9yvRtQrQW4reWC": 528, + "4VmboVWgpQKM9hcULoYjNdhrDsy8JDD1S6uxuU37xEBE": 96, + "4VrjyXQT61WFSjuG3ehgqZUK1jqvYqB46veQbXLotq3n": 128, + "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE": 28, + "4XspXDcJy3DWZsVdaXrt8pE1xhcLpXDKkhj9XyjmWWNy": 384, + "4YGgmwyqztpJeAi3pzHQ4Gf9cWrMHCjZaWeWoCK6zz6X": 16, + "4ZToBgveZ5m8NySrDyPA2fiGVRVBioaoMXD31KGidm65": 92, + "4aRPyjsqqFsf5488a9QAaHJLQJMGwoL5P6wRtLmroe2d": 12, + "4akzqFZ7aMcnEwURTJKJZ6Mg3ERQCSY3h6W4GtZNRpMP": 152, + "4b1onMDEasBh4BuPekQWijx3BYR64hAE1z2jJyeZUkck": 148, + "4bNLHMyyfvDqM7prYKqvQcaZfZScgT6n3jXAmzWHAPqS": 4, + "4daH8Aotxpk68HsMvws3P5AQL3F1gVTA44jqLaB2GuGx": 40, + "4fVW6e4Ww1JUPxnH4mqGLE1fgynsB6gcmPskTq1P3Bzk": 12, + "4guS5XP2wgDWecZGgvN5UQmV8iywTrKGaA7kv9hj3tk7": 264, + "4k6wgP5WPBKQpsFGtzuXNrjcTE2fKWLj17nDvFeG5zSF": 328, + "4kL5QD8ir5CvkuvCUnQhBDuWhq3Xfnz3UfQLt4CqPQZQ": 20, + "4mtXJ5pUcMMB4t8cLbi7zfDJCHfYLRrQb4qSLmh57sKL": 996, + "4mzLWNgBX67zVwTykNnq96Z6KQLc8UyV5Q35EfVCDifC": 48, + "4n2or6zoFFSJnzihG8NEHsqHQ7W39SVDs5gYeijc8u5d": 192, + "4nGV3oRHi9Fkk7HwakFS1ZjVq6U7M2v1p5xLrAbYLQtZ": 100, + "4rXCssbNbfGjPH727pBJXix3DPy47PN3ZVGMERdZQQ3D": 112, + "4uH4G6YiD5G8rU3mtPg73C2Uqamrqedy3FboTZcZrh6x": 316, + "4vXCtYfPeracuQg3a67Zx4jvtJco6MU3LKip8ax6GkVq": 96, + "4vcmYPfLztUckU3c3FvXDwSq8aDNDqwEpvEiqAv97LGJ": 140, + "4vdWYn2KbmQ3Dns5wVBfz4CFQDds4b7CpsC8MHBhHAib": 60, + "55Bp7VEw2WgTRNpK1diKKo9y29edeUm4kmzUaLUJn6t5": 172, + "574rvsKGZg8rBuSNX7k8gG2mHFvUMwt22sSgJJBMCQVy": 172, + "57i31UEyDg4koaZMZ1wAHbYuezXv3AVaHtvJgJarxt3f": 204, + "58KprHKFNHgH1Cvo4QwxWkDeJNaSQVteCoAAFUWjtESn": 980, + "5AsoSeQtLoN8eLsf3wKrR3LwxHME4sTBGR6dpTCP1k3H": 96, + "5Cchr1XGEg7dbBXByV5NY2ad8jfxAM7HA3x8D56rq9Ux": 3464, + "5CfFhpErZrKcrDLQtB7R9V66cAvQkcc6NmMPeA12vDgS": 16, + "5EhGYUyQNrxgUbuYF4vbL2SZDT6RMfhq3yjeyevvULeC": 3836, + "5FbKKGdEaFcxGxxaLKVvBes2JxiKbreh8w2ZpMcSQ2a5": 40, + "5HYjArGt81naevDdwMaEx8yeGNw9jYBSDJa8YavT9Mp4": 232, + "5LNEDitSMhApT2uFnmtN7FmjCiGuatpnb2uU4f3shrk": 40, + "5N8rWeZbNWLJDYTohNfpH4JAXiPhnicVYKrucW1shrk": 32, + "5N9r2ne7dPgHtzeHC5ETJ3DAueKQiXSU8KAmEZrrojT7": 12, + "5RvfTSowms7BTYaBj8SxVjj7ELAAKdQadKsuNpmBAwCs": 540, + "5S1vPAd2MRJ9WyLAK8mfLQ2Jz43oQHX5pFGVkAyaxLb7": 156, + "5TGfVQV1S3wHE9hkgGaQkRoPC7xZxiqwMcjQZxVYsf1j": 896, + "5Us18hLZPXJTS4QVuGSsUw137Dyd2tgBaem24Xsf5nBS": 1408, + "5VrW7YNBccVnhnZVmooCePdLFcs2UjfxRT3hoY9mN8Ec": 312, + "5XKJwdKB2Hs7pkEXzifAysjSk6q7Rt6k5KfHwmAMPtoQ": 176, + "5ZjxMYBbnKd4VFxLjAChSWMTeQ96147HnxZvQJxUseHV": 88, + "5ZqveVffQPiUbkjBg4KD9kib1MKHLqiFno4ke9jSq9qk": 1888, + "5aD6KB8g4MPt3xJafmMmun86hHMDnoFiGbd5gYiMFZw7": 320, + "5d9Mdc2Zk8as8GL1AxQeXxv5htBBvC5bjfmsXC7UUWwG": 500, + "5ejbTALcBsKQ7Cj1iSuu2mY5jqbYHqh9gF5ERXLiYj1z": 2784, + "5fSQdv4zsAJNx6RKpGho6sL6rY6a8nziaqcmwaRJB9NE": 128, + "5ghoFEVrsXeAPB6SUmBpZ2xq3KvHEjNMeSaBnxEBXkHV": 4, + "5ikB9XZNVsjwKb6hHT3FS3So1Z1SrDvU5yaniWEQyDEG": 2284, + "5ivRNcK1yThcK3koZR1oikAfuNm6rj1LceMskayoVSzc": 528, + "5marvipGzf98hxnoJFXsZbGHSXcEQ3yRGJ4ps7D3V4ou": 232, + "5oZ4GSP4waw2fphYoUgdnChN29sH8nRXbBnP5Qa1TnEy": 20, + "5pPRHniefFjkiaArbGX3Y8NUysJmQ9tMZg3FrFGwHzSm": 9152, + "5pZvwjSpGYCxpJeySwSbSAji7kZe4YntL7rQvXM3YcNT": 256, + "5spfmL3ZksWzAdAoKE5VzUuQKW5R3CwxbJYBJBymXYMH": 148, + "5t4shVsKnUqgjmhK3fFNsvyju2E6Rd7cc4S5pmqqEVEW": 28, + "5tfcGyf3NQFcufDigvbRt9kWoVN2KPEkBRUY3UaC3Zwm": 284, + "5yEnvhM4Ld3UZs2n173J2iR369E1ddcbQYeLSZxk4cYj": 8, + "5yRbBQY5ZKe7VcuuwCS8wVvMfcq41gNctbdhK781Joep": 68, + "5ysfTZ42VT1TjnjzQShZSrix7wdVtjXwssocSeYKDs5d": 12, + "5zm9g3zgAPWzX3wmUB2JtTkcwCqe74NWsTmt5wLFwCKK": 168, + "5zuNci3TV79w6zLoJZzbZujMvkVZb2FcSPhgv9aT24AK": 292, + "61QB1Evn9E3noQtpJm4auFYyHSXS5FPgqKtPgwJJfEQk": 176, + "65pHd5P2VrehonT1cdJ2JUnq5wi3WUgfL3A8RhYH7Kg7": 68, + "67joanjyAoVmb9nZLyX8p3Gx9tAxzXaUgHDe3kaUH4wf": 136, + "67oE2WCwhCSXHmyBeq4A4Em4W8Q6thTQQfdUtPmechuf": 32, + "6JKwz43wDTgk5n8eNCJrtsnNtkDdKd1XUZAvB9WkiEQ4": 516, + "6LCpzSkg3Ud1SpCnsYtmByWiiW6tcjSPNmJQmFGQcwaL": 176, + "6M53yM6dsE6hiaHgxWvYa4fsfzQTGyAZn7rM6JrzbqJV": 364, + "6MMvVR2UqSkHz5Drt4mmpaS3DBv8kvcrFuKh4sWNGCqD": 44, + "6MiEjXqYksCtKnJpvAp3CAoEZnnWZyoSxu41HCzAYNdc": 8, + "6NDen7aDi65apHo8m1Vea4nuS6LyjQeM6pDNqcW4Q5Pg": 112, + "6PvHaibtZhuba14dzbhGFJRASYX3Ka2oviRzSbXV2wYC": 332, + "6Rk694kh1QTyQkirdb1uDZmS5xqG9bNaYtxx8d311Mr7": 208, + "6TkKqq15wXjqEjNg9zqTKADwuVATR9dW3rkNnsYme1ea": 1968, + "6VN8L6FarZeVt2ZnJR1n3ausGVHYSfZZE9sUwwgGLzmk": 4, + "6WgdYhhGE53WrZ7ywJA15hBVkw7CRbQ8yDBBTwmBtAHN": 1508, + "6XKqyUVUcpe3CNucjF6gk5zonJDqNGvob6kaTy4Ps1U": 144, + "6XUsoRDfb5YrGy5m6HsSiMjFnSvKKbn83qfadKLeswKe": 192, + "6YDWxPaJWpZxJ6JLGaBeTJaGQn3gi3Pwtivii9cDyDHo": 152, + "6aDs9tUm2gErcPn2c1TZnp5cu2bQV9BzyuwW4baWQYd4": 1212, + "6c6RrC9TWNgiVXnbZ6hehNuhyh81pZK1yAj5w2nXZTwi": 28, + "6dPJ8HCuwMAV2sZ7jwajy5KMu1CvBwgY8J1WPXiiTG17": 28, + "6dtVKjb6vRwNAekki2FXhKv8WTNzQ3xW6HWMCNWqtoDy": 224, + "6gL3uHvuUjaPp9mTBf2VZ4tpKiYhbWyPrAPboGByzEHd": 40, + "6gnbmed7kzwQVQ7ghsjgEuCoYmGeWciV2qCwni6WS6HU": 76, + "6jMprKjLwc2ezd6VLmkUvGUZExEpnsUsjtK9Yd9Jb4xW": 116, + "6k1YkmTKwPRUhChnxA9ryJmbtuQMbro4xFTL6mL9jycB": 156, + "6mCzwUFcdTuz6fFJRA8nY1iXNRJqPpXU1PvCfANfVXhh": 16, + "6oscnrXS6LBipaXfcbMhQLm4M6bihhsxfTiHajvtYy9F": 192, + "6pEtDovpyd1zUMYPuNhMCPU37sUTEAtzzgoVVAh1G1JL": 176, + "6pVZhUW9AZMMFuNVMUds8useZHB7VFT4vvxuA3B9JgW4": 184, + "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw": 220, + "6xFDLX751L7H9d5fQT9sf2SM5RWWE9LDgqz25pPDbWoJ": 28, + "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d": 164, + "6xWLi1TDSh65fWsSqE1zdvANTSuVDRMx4ghsGJwgunS8": 300, + "6y7V8dL673XFzm9QyC5vvh3itWkp7wztahBd2yDqsyrK": 3080, + "6yFGGAgYpBxgYPuHW4rv7hJmhKrUiXKyHkpVGaYtKrwE": 1372, + "6yVX5rkTR3NfgCuu37vkmLCeG2RLqKaJHLj4G6b4Dvzu": 16, + "722RdWmHC5TGXBjTejzNjbc8xEiduVDLqZvoUGz6Xzbp": 1624, + "73ET66kH1rxnkTByem6r7CX37Wc1FGmmBtP5uWYzjAs9": 120, + "73hojLdq1vZDSxeVQEqVFJ4iwLngdvEJPEpEHkSdv6BZ": 280, + "76rcGHdPvgs8G1XrzCXUTWtwgT59AFDvpB4VbTS2TBBJ": 2636, + "7AGmaR23EUZFsxuyJ8VNUUPb7dzqY41uh9Tsjq7fQGVr": 116, + "7B4sGM7d8CakzRSRyHNxkhyGK9Avt2twrUsW9iXewVkW": 8, + "7CR3Jq4ny2tsr3DX3DvyjoU8TYs776MGkU6nLMWjAqCT": 760, + "7EzbSahSfSjeRexHcNDLDpzHBAGBLjLKtjbmuoQnEtjE": 396, + "7G4RfctwLLgqG4ZWfCirU8dfJd87mKQWgB4EHQRv8i7v": 164, + "7GkMBmtrTZz8QbjSe1sXvAUtz7Pp42SQxfT5ymmJD4We": 304, + "7HMHSdQkjDwz9Q5zAhEy83uzW3XHJchjdpMYapKXcKt5": 148, + "7Hp1e6BrTBkbBN4wFiNmycPVPsjvyUUBL2tGhYEMT6gt": 160, + "7MTjmteQHhthwwTZhUzsc2dP4NBvGNRqj8jzdqNxHFGE": 52, + "7Nn8qBJey7vXtVFMNBbbuN8UkujU8Y6nWzbHVGuf49yV": 12, + "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB": 72, + "7PdKhpKz7T39vZHFL1UfcYNDsLvay6hp4KPQq1aUckFf": 884, + "7PpXQgDb9eCHN1Uudgi77Wm89cRz4T85YgDw83qvaJXd": 100, + "7QGeaLDAhDdrLHZxFb27xL6GMoVGZ5oJTk7ULpgici1M": 92, + "7QHFXHKfssXc8HrgxvEu8durTwM1pR14ffXESfux33od": 20, + "7QQGNm3ptwinipDCyaCF7jY5katgmFUu1ieP2f7nwLpE": 2036, + "7TYbdqaFpHbLUWBe6fTc19XPweUMN6fB3GBW3TzZWu1i": 112, + "7U68WfpxJF5W1HjVQ2NCQr5EuKhNSvSRAnmWTk6225Jf": 32, + "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn": 188, + "7ZSVbdE4gTWq7rh8d6a22LoMmSCHNB45aBtnHD5C5bUc": 216, + "7ZjHeeYEesmBs4N6aDvCQimKdtJX2bs5boXpJmpG2bZJ": 48, + "7Zm1pE4FubFYZDyAQ5Labh3A4cxDcvve1s3WCRgEAZ84": 876, + "7cJB452VqXe5pM9f6YKcTziWmoHE9Tg4jNWTCpohFiAH": 64, + "7cVfgArCheMR6Cs4t6vz5rfnqd56vZq4ndaBrY5xkxXy": 1688, + "7cvpkJPcvNX1DpkyYzP9vtKrLUr9xEjb8AxcBT56bnjS": 24, + "7hMD4oMmGT4GsS4DfBKzJ75wSjDhgu2pvcazbvoKPrNs": 176, + "7knvB4bbqHCKuNp3ef2hJWdwqoH6WAUi55NQt6LdRfkx": 56, + "7kwZc68XSEs3bgPcHjh6XKUG2t5ocWKEZtnVJYcEjvPs": 72, + "7mF8NZJdREuM1uwYcvKffuY9QJBEoHhNp4hZ4NS2fuXW": 356, + "7mYeuc2iBaWRpkxATYteXxe2pMjzQ7XhPgP1xG6vTjDh": 48, + "7mcgHPHLfdoVn1JV9pQp6y8dbx2QF4n1STRCyG9wJ9rV": 32, + "7nzTzRZzezmugqE5ZjHRMxarhXunpwZ2PUdjV7uYzt7A": 8, + "7pR7t5axFfkg2VZB1uAuFNUvpAeowq2v15J4gw5MmHTB": 16, + "7qGNnXKW1e3DsqEaSxwxMdBTFsrK73XtWTmkGitRyMQc": 132, + "7tqeaFKsg2K9xKnQWe61w71AtCZVMQvG4hbFAiFAngYw": 488, + "7y5VhV4fkz6r4zUmH2UiwPjLwXzPL1PcV28or5NWkWRL": 2068, + "7zAHbRxEQaNjKnQMjFm7j8LebHSGfzsQDdm2ZpUNPa7G": 4, + "82vucuWCTTQEz6nYe3VetnL3pJYBrfDF2gDAjec9sPUy": 600, + "84Za5eXvehQLZR6Xqhe9WT6tTcCHTVjw3XU7GCbBRNfW": 56, + "84gC25fbFKYueR9WEfreUysk1n3ZFxLFDDjbyqeqGpoW": 1048, + "86ajwRu4xCfhM5ALAaHJqn1RVZLaQapDkGcnuufyw6Ub": 128, + "87aa82cCUqVUWza4WvGk4wNTRJ1aZzugUvch74r7gHQd": 196, + "87sZBKaGtRseDxuSkF7pUCERd3Hs98ESRJVipdscTCXc": 64, + "88K3vd8E7f2jXBwfNspzAYXKZuS7erF1w2wk3qcHTSfh": 216, + "8AkVj5aAtJ27tYXeq89cnSf68V43NarFHMx2iSDjZv7c": 96, + "8GLRbAstsabZuZUx73AoyfGi1FRCWSUhRgMugFyofEz7": 160, + "8JpfpVyew5Y9cLQCHkt5gqT4vDZLL46ZknMbSThVjzrg": 4, + "8Nvaxzif1NrdvxNkRetjT8xJvd33EHkKVrfL8EDkgaNy": 312, + "8Q7K2irCbYfEG5ZWyBceiytbL1u977gXqw7UaHZ55Awo": 144, + "8RXYL85eGMyuUcBCMHt5owGvasySS4FYbmKTx4CqFkpe": 96, + "8S1VXBgZvCsjgnRAMvxknx5BKT7APb8rFhyRVeeTx1SS": 72, + "8T8AJfUCXwPFwEMmjca8gCRSktPrqbUBVa6ggNyhLhFJ": 216, + "8Y7SLeBygba7einxtGCaCKaQQtUXBQrVtqQbmDGErvXU": 20, + "8Yq98CFAorqAc3CN7XtMVgKLrBc78wsBvjhAbFr4sNQ5": 16, + "8ZQg3K1V1Z2BVJkjmnxpi43WKhjPGXphzu5QmBkJibSP": 188, + "8Zh5A5Hs6bJFAyWrLGMaF2VEUVbXFANtfuw7824Hd5XV": 20, + "8aqTSm1MT5VhxRD9ufR4WUh1g3Xsn9av3mp2bJB66Ywp": 12, + "8augxYLUge2iWmitQMwbcBL5VQEpsM6aJdRofhwpnzyw": 180, + "8aySXUFrqJz5kath6aVijrkBH8ZtxMWJGhYXwYBpKmHK": 28, + "8cnksBVjDPspn3AvmxJd8JKUdh4uWDDXzDemPmDctaHi": 16, + "8ebFZA8NPLBZD91CwsG1HWQsa2B5Ludgdyf5Hi3sYhhs": 240, + "8hAYbagNt7CMBooFfqVJhBgLqLffpjXTWJMk8yybjJsN": 248, + "8mhdbYU3PxALpTfDrdTYvk5obaGxL8ATQMvCLXW9SV2L": 60, + "8n4pc4sCJtBeLfJdGyJn6EcZuhtfTiepRa9ExdJFdmEN": 304, + "8n9KRHDRDuZErZwdwzhtsTFJxmHqgCQ4ddZcdk6GMzvQ": 28, + "8nbE53mcKhy74HLiGZ1q5HRocwiCvgh49csSaHSdtukr": 36, + "8pyp3vfVPRziYdAYEyqkwytdBbdVbQmHqfQAVDcRV3w": 336, + "8rWDbEsuz4UWF2ZXiHhMECPkTZm51YrRaQSoSz8RPz2H": 72, + "8tjFeSApQ85ThoQXT28acfF2KUfQr3TvTdirSkzNnYC7": 980, + "8uJiHDJ1b7UDQ4KFsQGJXK9nUCkokdKRJymg1Wy9nxvM": 1280, + "8uPW9msN75rfaKiwy8y8NxEX5zSk2WejtVv5YhZr3jCo": 148, + "8vk6QpG93JSaQCSgnycBsv5qmfQBk4qC9FjNA35E5JhU": 380, + "8yjHdsCgx3bp2zEwGiWSMgwpFaCSzfYAHT1vk7KJBqhN": 236, + "8zgT2JAcjqE32L9xGt1CZqKzBvB8crb7PVYn2B26taid": 32, + "91oPXTs2oq8VvJpQ5TnvXakFGnnJSpEB6HFWDtSctwMt": 284, + "92VEPQZ6VK9x5rSxw6c3nNiVb3H32nF1ZeaeqkaFXTwK": 60, + "93Q99nhdKjuSe6WNXgMBbC3s8QVQEAoHKt91PNRkUkMn": 104, + "95A3UmKrAmTuNJkjipBULk5wHopiFvLWfxTKmhR6AzQc": 12, + "96XWbKem84optM8RLHhc8EYJQG8CCWA8F6oqWMPHDweN": 24, + "97MtLX5ajrR319PH8iLnctBpaLFoT3TNuUAtZfZaEn7U": 16, + "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt": 8, + "9AW87WqARQonyJYhx1G25fKfvjURFYVmHs79z1NUXDPD": 272, + "9CJKNW77HfjZf2jrUpdecDub6a5cb1MtVFv7hrXAeVwb": 76, + "9D3o3EYeknhTrRvXS1PnD2euGXnMFa3HwpYBq5gPZJDA": 68, + "9FXD1NXrK6xFU8i4gLAgjj2iMEWTqJhSuQN8tQuDfm2e": 248, + "9GHvMeJ4ZWuAX6sDGscFL1TBMszx2EehnrcTVUy4MZJQ": 220, + "9HiuHYVDnoQz7xdL2NFmZdv6S2jYNUQxGg7taDwrZ3gy": 92, + "9JdZLEKhA7k6SxRQ4cJT2Zh5JhRUBJGXcjTNwMtTwSiz": 100, + "9PRr9k87HjjdLMRkxtxygidjxVta9VQ1kAsqgLBWXKdQ": 100, + "9QA1fzbAKJicmRoFa9wFnYYx2PGYn97s8Nh6VojBMvCi": 24, + "9T6SNsBimjCRJpkEjiVsc8AcxTBa1XVA7RjnBGGfWP23": 116, + "9U4WqNGVywKt3gG9HSt9tGVXBDXJvgid6BVweRysaJmg": 60, + "9UM8wQ8F5oMiRcP5YdqD6Lr4krpBWCD8LtgQYoisJd9i": 2888, + "9Ukj3PkyD3igEDJGt1QTj9ThzjK6hMiadQfa3gm7kjf1": 8, + "9W3QTgBhkU4Bwg6cwnDJo6eGZ9BtZafSdu1Lo9JmWws7": 2136, + "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf": 160, + "9Z2TswRKvvS1d8YZVdgnJAZyqwwVUhk3QLp74J8pEmXs": 16, + "9bkyxgYxRrysC1ijd6iByp9idn112CnYTw243fdH2Uvr": 172, + "9cS2cDhLmRoUCqkhMjXZs4HC1YYbP5QYweCP3vVqodcb": 28, + "9dH6wfdJVgnDcbCUjT8rkmejAzTnGQaFarmLfvBYXANK": 48, + "9gFxqsXbFyrKXUkqpAatonn47uYZ7sEZSnMxhzQoXrUJ": 212, + "9hQqNe3DQTiwhspatewA8EXhz12e6sq5UJVJ2qNRwnTf": 92, + "9jnYKtJoHKsR5XudQnvR9cXTxeorQf8C1wqZvU79govG": 52, + "9jxgosAfHgHzwnxsHw4RAZYaLVokMbnYtmiZBreynGFP": 5868, + "9kTTMvxVjE5Doyr9QeFzrx7ccK3B6nmFQZtn61JFe4uD": 20, + "9maF99FLLAMh5v5JKG1ZyRZVBVsT5VkZnAJzDvduCpJa": 360, + "9n1eEtJJfj1535NYfx524QcCG5aHbf5DH7ejqBrFLBwG": 1584, + "9pBHfuE19q7PRbupJf8CZAMwv6RHjasdyMN9U9du7Nx2": 500, + "9ppJrpsbbuGNjiMhhD52Ueco4KXUzVfrtNQ6tAcDab4f": 132, + "9q16BB7WGmBxf1nJTdxH5zPnBUhtHqdqXqRFjSjuM4k7": 36, + "9r2CsyjRTmTRtu8GFk5oJRSQr5YfSENxDkf3eox8iPLa": 468, + "9rkJMARqK6VBkcxGfKBAwnA44gPAfGxPbPsfsggFNDSQ": 5288, + "9ueKvL3WiLM4mNUZrfWqPTYY2Np5YwzFTYvAiPibx1Zq": 44, + "A1vqhA2fS6K7CvHsJKX1ACcHJFEmyRg4KuR5pctHANy4": 1852, + "A23LfQn6khffj2hGhGfXr6P52W2pxrVcCaHVQLYQgiX2": 180, + "A4hyMd3FyvUJSRafDUSwtLLaQcxRP4r1BRC9w2AJ1to2": 596, + "A79u1awz7CqnxmNYEVtzWwSzup3eKPNW6w2Jrd56oZ3y": 104, + "A963nwma1r6tr6VgASiHgj9VKmvXvbFeZHoMW6XT1aiQ": 36, + "A9mvukTd77EbRoBX4ydSCFQHdu5bsRFkNXTTRstA8FAC": 1364, + "AB821LfpFBwedJEfoNFZRsiPvcSxXPBNMgjyGC7RuNfS": 180, + "ABC1U4cf9DZMwqy8ktEr4WJj8VHmVBQibbC57gEJthwY": 252, + "ACTGYsH7bHbaSP7z9N86oLPHBThAELbGfTboc1VoFeZz": 24, + "ACvL73V4GNnxPVfZ7K89jCrYurLyzpEuE9qirjvh2Xmi": 616, + "ADjyeNzWd8yhEjCVyAqT87eqoyGRbimERQsNhFQcXjop": 108, + "AEAJtnjjB19XFreJH21UP8rfd12f9kxMmngwZG3tGXbP": 208, + "AEHqTB2RtJjegsR2ePjvoJSm6AA5pnYKWVbcsn6kqTBD": 2300, + "ALPHA6rdHZkx1om79xp47vX1iZXcbM3qfEwLyttZ1T7R": 256, + "ALp2GdA1eJV8vZHMHazCtTxNXe3BLUSco9LDASgjDs8R": 320, + "AMukCLCr52XxsEjXoDxKKxjNg4FpnsReXNaQx8aR6DJF": 924, + "ANC1u9sY36q3mi2MyVhtz71un8yLgTsFBUuyLcSPzKsk": 440, + "AS4i8EXUZnPbmNT5ZXmoTEbrXQrbFoReiWwwFB43Ds5z": 68, + "ASTERhckBQwAM82EQm2S2ivVcQ9mHQHZQs5u4BHMv6JH": 12, + "AWZhUiQjrjtxL8MEMWsCFbMausFQKkdTnDsFW2i411hN": 20, + "AWqkGtq9rgpMDc7pTKe62aJuaX8ZvrnZxCpr8nfpDSCK": 136, + "AYY1TCe347UZ7zueBmF4MyoFkeEZquRUNVBNoUZiRoew": 96, + "AaapDdocMdZQaMAF1gXqKX2ixd7YYSxTpKHMcsbcF318": 588, + "AccReGBNBdUCEJ7ZyP231jw7uVJ3eF9u4cLBFAyqQuWm": 100, + "AciiTVBnxJiJWyXPanDw22h46LRhcQ7ijWWfthKNa9fG": 24, + "AdSHK6vpQnwHRSw7jXUwjMEytmhFwnynZSENhvpAxL1y": 64, + "AfZTWYoFQbzqCMmUBTD7XwxFvjob1FVyCvkaXRryxtKc": 228, + "AgG8obWYeVY6nSkPYqDHXfssxdcG68GkuBikkearYRv1": 4, + "Aho3hF8mqLmadyJdUFpoGidyo3fYAt3ALm2QpAo8wMX": 144, + "AhyLPwqeE8zg7fyFjuufH8k7Kq4kNS2eARRq5EKNGRcT": 188, + "AiBEt9kE8yZ4CnaLfTCGMp7Fg2wCtqhPTfvJ8D3zrLfu": 72, + "AiDoLWFKzNxSXKeZ4zym2TEPkg6F4kQ3YBA8WhANVPEq": 820, + "AiZSaHVtGpof7Ho4vpfz37PRagkG1hR9ZJWKzoGCXiWv": 68, + "AicQr2zCWBLiBwt2r6o7iTemmtyE7q5pTKyuuupbXEQA": 1132, + "AmhQFcGvH2hjkucP78rn6GMKSbstYwyFpCDVKZUwBGrG": 112, + "AnKWYWA1zktynzWqPC5KQFYWrTEWNny2CAHbAVU9zSXT": 84, + "AoUwfPuiEek2thVRDhMP7HbQb9rguyab4rDiz2NAfwwA": 532, + "ArMBx6veRq33ffEP9sxHafiPRgrtzww4XvbwZbSMfXiM": 164, + "Arvv3uwEyDPKckw3wEFiCq9hgxMw8kawFU6doxFAWGYR": 12, + "As9NxA9bCfhrVLAFyGeWG5X5iLYPGhU3R7nLfX3tN6am": 152, + "AsMpvJ3DZ2Ydu1WTRMAyMH4QjSLiUG39rKzfzvtE1bWr": 156, + "Atom7LRkdXj6MBoWJPgjaetrCMrgB9nnkQBYXTWE8Z3S": 100, + "Av8EnYrPBnSJHK5e2wmTdnCpSy7nzmBgyFaUKSyLnBfe": 156, + "AvNsK6uxBBwejyPe7tZqgX4onaCnXTqKQvKRaTe9Ekya": 72, + "Aw5wEMXhbygFLR7jHtHpih8QvxVBGAMTqsQ2SjWPk1ex": 2708, + "AwcMVMvmT1aCETVYV42WE1cSMCyNp4vZqVjLsvs6dM4o": 164, + "Awes4Tr6TX8JDzEhCZY2QVNimT6iD1zWHzf1vNyGvpLM": 6432, + "B4dn3WWS95M4qNXaR5NTdkNzhzvTZVqC13E3eLrWhXLa": 252, + "B94PGWcxE9iEDov8sZobTkqEY96Yb5gfcsYWSWpQxh6S": 24, + "BANXwrLTkNHL6vTpKhXn86ySjnbwwGyWf9ExGgwZoiSD": 12, + "BCS95L5JHBWHvWkcEJBEF3BH5QHxKcPeaTgoYmHLvfFh": 232, + "BCeczqpTRPigndHVJu1KEzno1Uhb4hjrE7ttmAndrV1p": 208, + "BCjGyexo1i7qpN9CbJ9Zt8avWr4Lb2JRtcm43sJvsgQK": 84, + "BFMufPp4wW276nFzB7FVHgtY8FTahzn53kxxJaNpPGu6": 260, + "BJvrWSfonXnS2Km8iA9KLY6D6vS3GcsaUwUNPFBumTca": 148, + "BLUEHGDihXD9CqqC5XFSQzDC3aS5jASohb2BAsXaJokR": 188, + "BM2vE2QqkB9fGtC34WPtM8drbgta13SBkhRq6dRG9J4J": 540, + "BNtHBLo1L2vAG7PBQ6mJvWz7GqVPxBnioXsY2Gjtubrg": 240, + "BP1epAhFXxXEqo47GkFTdf9UuRUU2spKnuRxhWrAFED2": 96, + "BP4XZG94R74uK5WgNewUa6uBcQGfmPtQnoVRpSYY31FV": 68, + "BPKAfGkkzF5u1QRjjB1nWYYbPMUCMPJe1xZPmwEMNMCT": 116, + "BR1aTt4ZZUCwWJDkSYf1hqkYJjo7Mb7Ar8iVTkeSwUB8": 244, + "BSGMRbK97DcgLe4u4kfNQnmTVZGVnwdtKQBJqWRBTZxU": 192, + "BSMe78Jk1BfeJDdHQj1aXVjrT2aMAYidyNAGQsTshrk": 16, + "BSNJGveGPVYzdt2bhTh3YfqbzWPH5Sq38zT1Br88Pn1N": 56, + "BSVckjdW2f8kcXPGcrPPtV9kUDBZ8w8PjrrGVnxgEdwq": 2672, + "BUv44cVtsdvU9z2BfFGk6s5JZZWrmVnq5qCaii5ARyyB": 3612, + "BVywdtWgb7q3PFTexiH9TTaLyh7HxLnBZSkQxedbbJCu": 68, + "BXAxLMMMUNYfC1z166VjWHR3WjTmqzLxB837o5ghmRtH": 772, + "BXoNGzhaW2R71avxDbMofBTnqH9FMsQmXVAXR1Xshrk": 32, + "BaDhUB1eWfunwD21Tu3WywyYQ9wZx5hS9WXeHHNGZUPy": 76, + "Bat6DHawBwy8k4fqsrgkSMb33UWWCDyiXH9AUQBrWiGX": 32, + "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP": 28, + "BeSovDCzhEAfgwDyXBuhmCFKsu5WQ3PaX61GEfteNzXM": 176, + "BeaCHioStqCEFDFxKwAEzyrUPYxqnBPhJ98gDKeEiTPb": 516, + "BfgMdL4FaNHp5zZpD7WMYG5sZUrCWQPEjXDwWS7M5q3F": 952, + "BhNnboEZb3mKkVADMH11cYGWCqefAfmhzx5rU4eRTKGY": 4, + "BhwrctpZCQqwZHFHhgsnZkZG3btSwAg5aBtDPVDzQriG": 60, + "BiGcsiuFCLuiTzXoQgfLdge9sfpwr55YzdT8Kp7bCXmS": 356, + "BiU1DNow77wGwSXW1bLmkcQe2cuySpkbz7xtbitD9Fmk": 260, + "BirdeyeK5yooepHNNgaW2bGGDD2jmib4oSRFTHyELbZ1": 136, + "BitokuDHQiAhpUKrwx1VssAAoW5Rst8zB6gpfoaxM3Kh": 208, + "BjuD62v9RysrburpKb65UKeaAWRSFyi7pFLLxdE3dPv": 8, + "BkoS26vBuaXnSowACdChi4WKid8UwmuPNhEJWa8KsLHd": 3584, + "BoNKmNCGvoHS4CkKvYRnF21iEpUP827pZjhFGdA4t5as": 388, + "Bs19Z9SokV1s46jutN9tqqaCgYf1GsVyyytVfkzwn9qK": 248, + "BtJei4AagS2viyJPYVT8FVhRiDKW5YyusQuqjVbtG3Hs": 172, + "BtsmiEEvnSuUnKxqXj2PZRYpPJAc7C34mGz8gtJ1DAaH": 4532, + "BuonuQoAR74GoMwCFhxKWVWWSGGt2wfbNmQ3cizaJ97G": 8, + "BuqMbtUpT9DQTFmWqo3t629Am65Vw4SsgCoMksDsryQD": 172, + "BxkAkLR2W3agWtjMXBNvhxmB8vsn7zhjNQcyfost99KY": 224, + "By8MseMKtZQQaQjMHJiyetmc5AC8RZZv8C2ss33ktrHt": 252, + "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm": 260, + "Bz6FHRznS6TmAoWbsbuU7Xq5To3T2HFyAPWQuJCKUy9w": 12, + "C1ocKDYMCm2ooWptMMnpd5VEB2Nx4UMJgRuYofysyzcA": 1680, + "C2ocKwTTZCDpwuyZuem7hih2pkpataAx21P5KHkKboko": 80, + "C4bgengueVA9cRcprjutgu9XgvgoaaFnCqvpZaPy27xx": 16, + "C4iCqAQuheCTQYsVNxYE2rWWjBmq2UfAdivYDKLdR4ut": 196, + "C8H7mCWTYDX3LJUgAH5hqmVUQAwdAyHpybTZgvfCJDaM": 80, + "CAo1dCGYrB6NhHh5xb1cGjUiu86iyCfMTENxgHumSve4": 4648, + "CBSufxkHhvNTtBuP3dmCCeRWJdLcBt35jJnd28cZXq8H": 16, + "CBUGET5PnvLc3HvEeFYj64iTvdKhYV6pujTPDdDh785K": 48, + "CEL22Qx7p85qY6gmhCZaYJrrnynJitkVRMQo6qZdT8Ns": 328, + "CG4tRANBKrzUmpv93V5sgftjQznBdiJsc2yPCzZWWuS9": 2212, + "CHikKUoYJDqFK5mPPtQ4ip63n4DZbsz9gMEGJ6a3t3o": 40, + "CLsFr1KZVbAyz16iFpwg2e4hiekR1unpwyxfNdjBMaoE": 280, + "CMPSSdrTnRQBiBGTyFpdCc3VMNuLWYWaSkE8Zh5z6gbd": 1936, + "CNRyYnXZjryxNdSUwztdmVFVuQPXvugQ1d2wtRTjjTb3": 72, + "CPcDFHCAKkr5Kp9T5aQWJhXV5J6iFj141NMQ87L6poPL": 220, + "CTDGxTK789ZvhgyHZHtSnxTtysbyY1mrywXEJiYYqXxC": 232, + "CTwsruptUccEtZGNxBDbuusHYxkBX3P6ndrxVjSG213y": 140, + "CVAAQGA8GBzKi4kLdmpDuJnpkSik6PMWSvRk3RDds9K8": 20, + "CVRr5oHCAAooVbYze7CvXtRp4FUtkMCSqBZU7MVu8v8e": 300, + "CVgwMrWo9chKEuEPCe6Za9KJe8jamnAcoeWzaMeNubr6": 68, + "CVvaeDPR2o7P1eawG5c9TPFLzSXAewwPovPmREaEL4Cm": 504, + "CW9C7HBwAMgqNdXkNgFg9Ujr3edR2Ab9ymEuQnVacd1A": 6916, + "CXPeim1wQMkcTvEHx9QdhgKREYYJD8bnaCCqPRwJ1to1": 984, + "CZ2xJQHwiojrAgrR2BUNheuWxXGjSVSZrkcxFcAGoSUH": 40, + "CZanBzZHFzrGY5qKzaX3CNhJ5smHEMTWFFnoeUi4J6dr": 116, + "CaveyttUBTKttncu1e4RF814XjuoGfYv8cEsiKGDNCPX": 652, + "CcJX66BQ2Y99GQNcojA4zjDSPG71NSXCRLH2CVei6h4v": 172, + "CcTtRsmLJEjqsv5iyfXSYwjaUJdfrRK7AU9cHMnQfTb3": 156, + "Ccw4n1JNzcjdEUTYorfZPATWHfmBKV7BHnJ8YDyzqh5s": 196, + "CeC95ByA5rd3cFELBgK5nx2hB8o7FynrB2ciNNwHYEib": 28, + "Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24": 1364, + "CfXY2KyS6PvGW3oeSb7NCFZcswRZp2FAJY9E96hCvvVp": 72, + "CfgRXmp1LEYr97EaT2RyoL2cSvtWgJh52Bes89RxVSoW": 1288, + "ChB6C6dmNujAi79XtQLPKLL5SWdNLMShA7KKnrMMFF52": 32, + "ChaossRPGKnsVhX1GfPC78yq5Sqju4cMThcAsKZNz5d6": 84, + "ChorusmmK7i1AxXeiTtQgQZhQNiXYU84ULeaYF1EH15n": 1328, + "CiR8HNCfkjtcongPmP2DRdZPnFgjSbN5gsXdjmsXXHcB": 72, + "CjmXSapt1ouz3CZzgkRJckBEwMSo5fVdVrizLeRscwYD": 184, + "CkCMabrc3HgBgDkeKPXkbWuQpUuSqW7zs1Mg3HFArx61": 264, + "CmHAicGXp6boDhgp7Kb1JbPcvf7GstyK2yMyMxZY2pKU": 60, + "CnevKtH5zaThFqJmpWZSBzjEMY8bsWiVkkeP6GVSMVgf": 28, + "CoG8d9Fp2TFJRkAmrPMiPsGhQWHzdTTVoegEp9svRgmJ": 1396, + "Cogent51kHgGLHr7zpkpRjGYFXM57LgjHjDdqXd4ypdA": 696, + "CpNnGGhgVATJAbzHUXdrcGfpPiGuZyPka4QUmH7YgavX": 92, + "CpdzCVzaR9gjFymmEVE8xHboJFHaDnimRZ448cMBs6Rn": 88, + "CpgSfd6QUoBw1267rTtJoZhELqC5q7isKLojBifSbNEE": 116, + "CpuDNi3iVoHXbaT8gHpzKe6rqeBasoYjEKi21q7NRVJS": 184, + "Crg1X8FftV44NmwfFvgREjanBQmyyS7NEu6duLU7Cyy6": 168, + "CtvdyHYt8cMuGVHFarV2RADfoCdnrbd8e9jAsB225uMW": 172, + "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP": 56, + "Cu9Ls6dsTL6cxFHZdStHwVSh1uy2ynXz8qPJMS5FRq86": 444, + "CwhdMezLucz7bcuWzStpLXgrzKGC2tBBiaVmJZjfprRN": 68, + "CwyVpfmfSiMeCexi3JgUNvaiDfYN14cLDjzT99zcBuD2": 1120, + "Cx8Bd26EPfnhoAM94hNW1ot3vESEDsMDqD7Jgw31Pzqj": 4, + "D1A4F2yh38JLQExKjDiCi4G2tCMwj93c3sikseSSePKe": 168, + "D2RV1q6FgePVVjrMa7AMzVbvvAeg5oS7TAV7qdNKSDsX": 224, + "D3htsc6iRQJLqCNWcC2xcZgUuvcd1JT8zoYNqraNcTQz": 352, + "D4r6Rcua2L7nHHhdaiZe2k2bTfPg2WQqcNYpG6bugvCG": 240, + "D4ujBcx3Wwc6rHhx1DFdTZL7vfDJDE6Y2BvRfE8HovBF": 100, + "D6uUDTEgXDf1yzLuQfFFCEKF9a2Ri5trFAWwaUpKB2ji": 164, + "D8izqaR979Fc2amDoGHmYqEugjckEi1RQL1Y1JKyHUwX": 104, + "D8kuk3qEiVBGwYkuMGKfBDwuRi6jjRkzjAZg45fdaRLx": 260, + "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e": 200, + "DB7DNWMVQASMFxcjkwdr4w4eg3NmfjWTk2rqFMMbrPLA": 860, + "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA": 12, + "DCdTPyDbXNHrmdv4ZyPPzEfY4mPAqH4hDPtowAteoNgv": 168, + "DCgEjpXK3CeHQQdiCtPdFJggzay2Ue3M7MzTW4Hn5sJi": 92, + "DDgVWafunwNr1YeJD89SWqotXuwjzyvZRmpapZPshrk": 32, + "DDnAqxJVFo2GVTujibHt5cjevHMSE9bo8HJaydHoshdp": 2856, + "DEU4agzdUCA5oZ1QSLxCyZb1smvdu5j1NXXsK2r823Uu": 24, + "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup": 56, + "DKSy9mQn63487j7oXHxqmykLEYUA3akTHm1QNPgDLGN8": 116, + "DLupiSkASr2wkSLazQodYL3M8v8zvtpoGrJ1nLc9bysK": 124, + "DNVZMSqeRH18Xa4MCTrb1MndNf3Npg4MEwqswo23eWkf": 2228, + "DP9iBgK9c7tJYb83KhxQMFNc1LXYu7nE7EhWpEzQnjmg": 116, + "DRpbCBMxVnDK7maPM5tGv6MvB3v1sRMC86PZ8okm21hy": 12376, + "DSRVdh9PQaqAcFtMCbJhyD4yMD5H2EeHNzdbqWctRY4E": 4, + "DTELykegBxxEn9c15GbH1zbYFr9CFd8VHQnhTGfz5JLb": 24, + "DTSUkYHd2e9P2HLyZfbLarsbDdPhQUhZnWjRYuJZQRC8": 1880, + "DUND26mEDfFeaPsVof3YvbXDRvpuQX7HMUJrLgEWzYw4": 2796, + "DViARWAWKkxAzp4UCgbw5B9pLSrBY3PaztFErcwgVUKX": 268, + "DWGupvBwXjUudG1fPqtcuw4qe6ByDzzLhnbr5z7RGWsL": 176, + "DWvDTSh3qfn88UoQTEKRV2JnLt5jtJAVoiCo3ivtMwXP": 2896, + "DZKTNGR3r4Akj3G42ReZatKhkmgEXoZjk5Ed2tFwRyqm": 28, + "DZVqmD4QqSWM2gUyEXdQhvt4u3NZtCRxdsn2n2nNiBRL": 292, + "DZVySotZvrvJyVAcgjFtUDm93zoCaq9wBruMAUz83CWW": 344, + "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT": 312, + "DeBB6xpUEUQWhKaYgBGzsfJxR7UQaRJbPmZmGA7jZdu8": 4, + "DeXsDvvZzKhVux4YfDFE6p4acJLGzr8yKt5pSTjzZB8t": 292, + "DeepM3FDWaAb7o53rvyZk5YvHLG3FvDiVXJLRY78z51p": 104, + "DefiihS7gLkj6xLjjhcr87bFuwpVVNYpeNBaBeFe56CY": 16, + "DiFeTctQSaNczJNmZ5121kYqLaBe9wDpM9sjCzTELJLE": 20, + "Diman2GphWLwECE3swjrAEAJniezpYLxK1edUydiDZau": 524, + "DiveRaPKviyDnQyiiMFdV4rujsCBJzMNvPjKfvGNLGvL": 116, + "DnCMFNX4EEJENyXq5S29WCBXvpQLG6mkBfU5aVSnvYa8": 28, + "DpkoHfYFTJbRk2FFUzxrrYEgJw515pCzpUJ9Sd8ePy6u": 12, + "DqRT482tSPAyo9LAyXnqT1wgPFVwFTVFrT5oH1Wv2gyx": 20, + "DrifTrN923QaouP89UxkQzFGbumKPCnfkNYQRwmZxatz": 1692, + "DtY5Bzxd75iWQRvKwM2xLUxqwLT1RRoeNwmVvgS2JANA": 152, + "DtdSSG8ZJRZVv5Jx7K1MeWp7Zxcu19GD5wQRGRpQ9uMF": 10200, + "DwGEK1ZSC5SM9e7Tkts5hLpkUffAsFUcqeLr2zifaXZi": 220, + "E3uWZFRYyKuC78U1FaGNEvxKgbBshRmuTRQbWhe9eSFW": 28, + "E6cyDdEH8fiyCTusmWcZVhapAvvp2LK24zMLg4KrrAkt": 68, + "E99w1XfS4UNM1xUKXWEuDmj8Mduy7u65jm2NCULTspSV": 48, + "E9hD3ikumJx1GVswDjnpCt6Uu4WG5mz1PDWCqdE5uhmo": 36, + "EAW9vxqogvdPNapq7QTDpiVTHK6o7begUhPVnf854VTc": 16, + "EBk678aQvc3cUkfGyoehfw21JQfJXjmWuBeopYc89RSV": 212, + "EBoKqyT2kCabcHXgpF7ScwrHgGUsR821xkTJsHtP2JJi": 12, + "EC6axG4VsaAifzQ7JDDqEBrC99gZaszmkFcDvQiNM4Dj": 60, + "ECNnK4VjcKTsABiw8FAp3JCE6tCmYyrEJthYVyMazmxi": 88, + "ECeaWy82CxpeJQr3EG3XNmYXc9NrVeWDH5ag9Lt6TPVR": 24, + "EKHuz3Ag7UtYrEeterGVFHwYWDn2d6aXjnAAf2d5edLh": 68, + "ELE1xBTfmHB7vuhSH94q23r6j3tuvTXYTqgm1u4uzMLk": 80, + "EN5F2BU5juUEWr9zRNNqKuQMi9zBUY1YLPHV5EyMrvnW": 140, + "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy": 32, + "EQhTjikb1L2jvxsCaSW2o2TuRXh4Do6HzBEWCxpeM44W": 260, + "EReBoRDj5Lv9y1FGPXxFCt1KAgZeKqa8zJNZvkoA4Uoa": 292, + "ET6sihELJYJeiQ6z3MdpSnbHWPPJ5FUFjZag1BtxVX6e": 188, + "ETcW7iuVraMKLMJayNCCsr9bLvKrJPDczy1CMVMPmXTc": 352, + "EUDis6LJeJzDHTEBgfHGQyjHp63XZkGkx4E69xunC2Ej": 192, + "EUcJwf7jXskRE6NZBtFPVH2EedNvNYko8LL2WT62XctB": 440, + "EWARp8Syq8cTWGWHtP5LT9fKAn5GvXfSCH8LfAwpgQ6m": 120, + "EXAJfWzR6SmYyWQpCrP6o8Ppj9YNPVLjdHZNssC12xjV": 44, + "Ec2vpRp8HsTXndg25eBNJTQcQxTdEbhutivLQQLshrk": 32, + "Ed9WjPnZfAXsPttcqxMwj94qsuXVRyBsyXnDkxFva2Zv": 112, + "EdGevanA2MZsDpxDXK6b36FH7RCcTuDZZRcc6MEyE9hy": 204, + "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9": 120, + "EfPYQ4BUMiKa6736qqrtnCBGkUSRDGSr1WvtyUgWHuyp": 488, + "EgxVyTgh2Msg781wt9EsqYx4fW8wSvfFAHGLaJQjghiL": 300, + "EkQhARtamK28xL63SgeaehkG8xvPtqXHPzKqvh562kWQ": 8, + "EkvdKhULbMFqjKBKotAzGi3kwMvMpYNDKJXXQQmi6C1f": 4900, + "EtoMApqP2h1vVm9XLTTp5HERNezm5btkqrdAGQ9fZRnp": 232, + "Ettghfhr2kQerqAyGUuifFtBX17QecRe2gwpUZTAbZuw": 56, + "EvnRmnMrd69kFdbLMxWkTn1icZ7DCceRhvmb2SJXqDo4": 6496, + "EwUVzgSPe1zy2hfUGZxJAEP7Y1wheNgNsgratbzPELru": 48, + "Ex1AxFCipXGfSxgvXPPT3nPQUARddCduHwKR6jHiXAaT": 848, + "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD": 60, + "Ey3DkEVbfBxfWmkTsG7Hqj7jshYf5Zx9H8462Zjjkykf": 304, + "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4": 152, + "F3dJbecT56EoP51Awv5RXtVTv498QNKWrUDu3rQ5srvY": 144, + "F3tdN8SoakjEPb743VY18YyKJWYHo6rojV3nkas5YJh8": 284, + "F5CRSKK34yQ1G43WnnP5vy9sj4YxthBWM4ct3wGzaB6n": 204, + "FACb6bbTDRBHCK999V8ox8jga5JBnt1r3vvzmAYAMv2o": 216, + "FBKFWadXZJahGtFitAsBvbqh5968gLY7dMBBJUoUjeNi": 4964, + "FBbqKvwLfKGZrKrfSbPJz4ymQ7zMarhRyZtu1RBkSe89": 576, + "FCWkGAHDWK41ANjiaoPudkCZRkvTecaEkoZQugezUnpr": 196, + "FEtkEYC16YG4ANgohvGUhobZMTSKmNKJc5h8QvpRazrA": 140, + "FFevTkywysWf8PJvH4DZkEp4v9ks9HJPJhZWbhhJiYnr": 20, + "FGNVWcDwy3rZnY2LdAFRjv8S4pa4urYMdXM2io6WmfH6": 12, + "FGiEdzde7Fco2WLpNQMat299hUVoykJdaA5hxdmCzHiS": 112, + "FJDmjm2bkR49AxtBvABQphrYwjdjB54BP4XCW7ht4E4M": 140, + "FJN8ryNvkm3QAQufsjJmJ9eGPpK1D8hG4MawATqZfFhx": 44, + "FLVgaCPvSGFguumN9ao188izB4K4rxSWzkHneQMtkwQJ": 8, + "FLWc77X8dKh5RdJe5xMFxry8kvSVUbo9G4MQ8hCAg5ve": 224, + "FNKgX9dYUhYQFRTM9bkeKoRpsyEtZGNMxbdQLDzfqB8a": 3908, + "FNTPSUuRpDoJx1hwFmB5ncNLLMX42aE83P4hsFYUfNRL": 60, + "FSVdqBzx5D4UsqBLnvmH5dFx2dCm1pTPAbQWJ1PYzTJ2": 48, + "FSyAsxcE7g8pSSEu5nx7Hkz44rMZiYio5Wz8Lszh3Nbi": 132, + "FUNDTXgtnkfuhK6G6JUi5CzxPWeZNF9n96vFuBNGFy1v": 132, + "FUURpC3LjVnxr21PmEfHtxT7Mfe4CVJXxESBjQPvmqTZ": 20, + "FUiUtbEoUVbtghgftxJwQackskGkW7MPbLFMQzHzsfb2": 100, + "FVZLnRhj9Gjf77CtDFvh7jNu8avAnduJW5m365HrDLfD": 48, + "FWwwP9tNttSy9dJFxwf6ebXWfc6VJXqFNMTccrMiLFTH": 1124, + "FXfNZwnDQxNR3NVHzA3Xpctzey7AUmgz5YvWTHiUActw": 20, + "FZ4MT1HYJHd9GK8D5mJ9f3r7irLaDL5NxBNLjGqrLqs9": 1584, + "FZrSKKsKfZJovcQWRQFDXz8DbHKCSRZLZqbBAGd1dG57": 4, + "Fb77sbwgXmtjmkjkaoSckGp5yg3nqdtD8zf1dyxxiCSf": 84, + "FbYX2uN573G5WsgiPdHU6fS5PNUyjdXfGfpZNkYUuT4k": 2560, + "Fc6NNdS2j3EmrWbU6Uqt6wsKB5ef72NjaWfNxKYbULGD": 3116, + "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk": 10332, + "FdH9QEQBxPQfaF2JpcjgdfcMnDb7rjZkCDRCWLRjTQwj": 192, + "FfdKMwFrWJSBdF5N3RPVc4r16K9KnQcVw2boCpkY5zVi": 84, + "FjYEr2UCeFzNfAKiFrbhG34Zv8LxbmfHYAFhAfc7SLQL": 236, + "FmaVX7HuaaLRc3jy7HZktJX18hsk2S3MWdt6vYKiMweT": 16, + "FnRqe316RrxVBv85EzMgcuWaVLZYYuyEq9znJnSZAu55": 284, + "FoigPJ6kL6Gth5Er6t9d1Nkh96Skadqw63Ciyjxc1f8H": 64, + "FphFJA451qptiGyCeCN3xvrDi8cApGAnyR5vw2KxxQ1q": 44, + "Frdg1NUoQaaTmASWNTrtDrBU5PbTnWtUvtdCr1XPNn1c": 56, + "Frog1Fks1AVN8ywFH3HTFeYojq6LQqoEPzgQFx2Kz5Ch": 680, + "Fudp7uPDYNYQRxoq1Q4JiwJnzyxhVz37bGqRki3PBzS": 224, + "FugJZepeGfh1Ruunhep19JC4F3Hr2FL3oKUMezoK8ajp": 952, + "Fumin2Kx6BjkbUGMi4E7ZkRQg4KmgDv2j5xJBi98nUAD": 16, + "FwnWx7x99rGwLmipzz8ii15NqcHkKRo2oS1Y7j6LivgZ": 204, + "Fx8ATrRvjMnmUCjjDaUFcyjhbLVPzZJicj32bDcraqBz": 212, + "Fy7RCjDdFLG8wLn7TBKbccaKwYX1FetdSoVDREdUHf5o": 32, + "FyLVPAKkgdAy8Gn9jnFYN5yjC1ubQWRkw2EHt2UnC8uA": 32, + "FyrwfMaomErzqrFUXMjCJ7mA4u81DsiDdrzC3MJD6d4j": 412, + "Fz6BL7pe2F8Fc78ZgLrPuXv9w8rz9UY3AZnDaxyGvuBT": 64, + "FzQqaDStQQHs52YKeCnDovwSqvyZBCgs2kJcmvoFZwaS": 2796, + "FzaAiLVXh6xXAFCfJNfBVQVYJ884zWz3LZVVmC8iRgdP": 120, + "G1bLKfyNm7zsmmYEL9dyxBvMtxpFcwy2s84bHDj2ZFUY": 536, + "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN": 216, + "G2TBEh2ahNGS9tGnuBNyDduNjyfUtGhMcssgRb8b6KfH": 1440, + "G4GT8z4AKWNoy3x6nuzxW83UfFXLXzrwn7DZQt4GvWdU": 156, + "G9vCpJUUSpEm4zPwzSNpDmZ8MGwLEbiSLV59EBzCGvzM": 2344, + "GCQ4V2e6PPdgHM1mXgepHZvdRkWAxbiFUUpJC5Bpcncd": 172, + "GFXVa19rX6iwfs3sLS5UvX9Exu2usRsG4V5MRMDRo23V": 16, + "GGX3BEoZDqjxcw4AbCdu62ZTMrkpSgmPt81oP2mVuZNS": 28, + "GK2YYwmQk58xA2k2SeugY3i334SJVViqTT8sT5wim3Dk": 48, + "GMag1aGPi4Qi7FYNYi9HnAaktSRiWvZ6At3UWruuhEcL": 188, + "GQiWnDYrzHMALWG9avt5FCu1wisAQHjGY5ve7GMBiPEe": 168, + "GQqxGEmi6aMBZtcfmfmC5Jgx33X57ksvNYoo8bMH52T9": 20, + "GQzMeEMwAR44ugoNCifTb5NdRKos1GduDUPeNh6AgV46": 2700, + "GREEDkgav1ox1jYyd9Anv6exLqKV2vYnxMw5prGwmNKc": 816, + "GS7tvhfiU36vp8q2d92buz3dgENidvA3bWNpRDFcvnR2": 200, + "GSTampk6BJRKSDkzhaMM49R7qRx98MTPYYWvKbp83XKc": 2532, + "GUdrZwgTRwZdcZ9fTEhj37jJSSfBHvV9wpCY8u9837Ju": 1084, + "GVkVZ5yzu1Ukfng1GPfipg1fG6S9hF4z2Uwcn6T7WWeC": 56, + "GWJyUxzcVwRRtpLuLiu1mpiUQsZ4onYFAYfCjQnuLmz5": 268, + "GYx8kpp7SsRwtQEEsGQjAxb4hFMMmT91kFJuDeky3YGQ": 1296, + "GZMbBC62TfFZj7YBM11AciMSm7ejKRGjzg9ehsmjLtqz": 216, + "GbEV1RH2cGDWLXXUEFJ8ryP3B1guHjkQ5LPkhes8BsME": 32, + "Gd33fENP1XsBimff41s1EWrs2kmqfGQqEJ5CQPQB3Jwy": 76, + "GdwLVjtBMZEXZiLV5iNnzSgunYmr1D4Fz2CDcEsT6HA2": 12, + "Gf4rQifKzAHznUdtbFumy1MTwGX5ApgwnkxUUvEaEzWC": 132, + "GiGa4gzsvLHmtPdN4MXFnr5U8cRbxS2FoVkZ8xq2uus5": 68, + "GiYSnFRrXrmkJMC54A1j3K4xT6ZMfx1NSThEe5X2WpDe": 104, + "GjLM4KzHZq1KLDStTEhTwdjypeAbb3Cj3QgadepkUtck": 68, + "GkFT5nmcFVmJiLwuE98PjdF3LReMeq4WbejFHfwrnsgw": 184, + "GmCxjmjKZoaKN1DKunbYq8RCYib94Nm3sHyncFfofaF5": 1256, + "GnZB2GTH8KJKqU3L4tR42a7BnKXxvgS9rerGMAszNCp": 124, + "GoLd56YQz8nJQnCsPFw8g5hcxrNaQBvCfAgbtwYFLbd": 1264, + "GoeW4aFK4dGoekJySgUynWDxBZiQJqm8GDAF4H53tDK9": 3568, + "GqDCbnafLmKkdqiqf278jDLXqjjZMB2sViZQtR82jPUf": 20, + "GtpcBib8a8AJAaryYict5s4igHCfvoCM9qVSXTK1scyx": 232, + "GvfaiJUhNCRZGVGumsEF1eHDb8JpAeFAyHSrTifyhrbt": 208, + "GwHH8ciFhR8vejWCqmg8FWZUCNtubPY2esALvy5tBvji": 212, + "GzK6vbP3fejCMqja1veNtN3kF3s8KubDCwApnkVeyGt4": 144, + "GzdpwmsqTaEK2yk2s1xdmzXEfH3P1UnKjZR7u7nSNXbi": 4, + "H5EhFXGKY29BNcDbz2k2pcBeRiFXXGLQ9exHmirfRuFn": 104, + "H9ENbtmy2tWFtAJNmpC8xQtbcr1NTp4FXLdphRaG8L2T": 444, + "H9METtoxNp2PhcDNxXwqpzBarJw9zJezhzdDEFgBqv8w": 128, + "HBhWr2MXcBjuhJAfwei8N6cK588Y7zBwmAg13RPshrk": 24, + "HEL1USMZKAL2odpNBj2oCjffnFGaYwmbGmyewGv1e2TU": 14208, + "HFTcVVrX93SJwYHAiiHAssb3c4zXqSsF4mNjg5arGPEj": 92, + "HH5dA42XF1HxNk1TRpG6LuKfLViMYNdAz5iWrFM4hWFi": 460, + "HLXxkmjb47spcmbbKi3UCfZ2qmFY29t8MN562AEmh2Qh": 492, + "HLnodbYkL5PFA8hjAZDkm5pGzV7eLTvcs671AW2L6St9": 1208, + "HLv4d6uhQ7ViicNQ1ff6RHNNntNzmq1bATLne2kCW5VV": 4, + "HM1KjNaXa4w8K4gCXbieoMh5gUTNeUhg9fvdXMKeBW3L": 628, + "HMWXfjaeSHhww1wvdBhqhHVP9v96mFB4LJ9xP2MXbDGH": 112, + "HSX42dhQPTaVjtwMQXwGTCobrs1HnxZ8G2J6JTnPXpgP": 72, + "HSZfYvEn8VnrBsR5Ner7iWWbUcRvLsv1EMeLndnbhPgY": 16, + "HT41udB8mLZZf7tev9tUoHYJ41TP8GWZ6zFMbjiviXk5": 244, + "HVXXmNKkmDZbZwj74iL2Y9Wu4SyrchBoxAfFYVAktLrG": 132, + "HW4zorvt6xDwhU36RqjcWNwU8YMj9tiqnAafBKW4cqV": 152, + "Ha1iade1AH3B12K9SccfWoPdFtQKKQsj2ZyWwxcjqJJU": 244, + "HaLanfo94ezLc3JZ55qqxr7W3qbe1PprJyv2uEtriEqN": 712, + "HbQwCgDvVZF5pMdGZMdX2poPU43RyF1TxQLz6LFMqYRF": 144, + "HbidP4hpQdwhkzrxder3x3VNPt6DQnE25gFG46napD2p": 1984, + "HcZvwZ83PfjrQDiq3GLHxisTs17aGURs6bJ2LwtmL4qv": 184, + "HgozywotiKv4F5g3jCgideF3gh9sdD3vz4QtgXKjWCtB": 32, + "Hhn4usDjnktbPURJHbi4YrPdKudBD5Qq35mTcaQ3Uu6": 28, + "Hj2jzpAp57KyM3SmnYwJbDVrQ8tTWizMon2hhzYzwxet": 240, + "HnfPZDrbJFooiP9vvgWrjx3baXVNAZCgisT58gyMCgML": 2376, + "HnwMGBAw5PxaX56eSYc969MorEy2NzEMPLkmBkdnJmeq": 292, + "HpcB5Qg8Y9E73dUkot5e8HkgAJbExsYeUzniY4bCuKac": 2692, + "HrM8x5Xn6ugoHqfLc7MCr8K7D34Z3NBc1TcuohCJ2ksz": 12, + "HrWYa5vKZrcDbQWE39SGYwyzYcbsmXfBiHJGxpasymm": 8, + "HrpWeJSYnQVtZe3BKxFCBrAEr8GRCmYUbQev4hoGDBs6": 244, + "HuxezmVRF3Dokr23jXmtUVoR12g4Cw1VCvwb8KAP9M4o": 28, + "HwN6eoEe9N3kwHi66hpQDBMFPk6ASQGthWKPX5MZmisp": 88, + "HyperSPG8w4jgdHgmA8ExrhRL1L1BriRTHD9UFdXJUud": 244, + "Hz5aLvpKScNWoe9YZWxBLrQA3qzHJivBGtfciMekk8m5": 4320, + "HzF7Kov41YJvKNkVEepUByEP5NKG45NJTc63JUDxT7tE": 256, + "HzrEstnLfzsijhaD6z5frkSE2vWZEH5EUfn3bU9swo1f": 1272, + "J1pscjzX9tVX4dxcwK348EEE6gVUvLkM8Hg5Jbmaiowf": 64, + "J1xEijrZvidXX8eF9gnHprucjeMAASZ2tYkY1GXF91Tq": 176, + "J2obR2DK7gnd6H88HjKzEYuMyboDWRNpbzwmGSh31nnu": 12, + "J3jZnDWMNHiQVuVDRM1PhYfFRMWwMEAMark2oiwQMzcu": 68, + "J5AsxaHfWn6KpEcPRT9EZ9szvEMBQeHRe947UeaMPG3z": 144, + "J6pE1oDMUQHAK1C965h9nmPdu1HpCDCUboENbGYViswH": 8, + "J75rPTt9n28CGsnk7LDrUbs293Da72gsexpkzJtLLrBi": 4, + "JupmVLmA8RoyTUbTMMuTtoPWHEiNQobxgTeGTrPNkzT": 6824, + "KTMkUG8WCw9FdH44jLMBpc1teGafnYL6SgP4fHHbsNM": 16, + "KiNGTLWCgoqLKn266xxT2Zosko3FumNv7Z4V7V9cyKQ": 248, + "KoLibrJsbABbtmtFPc7nPvDxT81rc4UPM7mY9xSLjpo": 144, + "LA1NEzryoih6CQW3gwQqJQffK2mKgnXcjSQZSRpM3wc": 1696, + "LFGGGJtnBLvq78DyMz1gTeedM6f8owck76qHThDABBC": 88, + "LTP1bMnfq1Z6UctyDXYHo9qcUJ6ReXm9cG2VwQcsHBt": 116, + "Lake8NXDThihebhxS3Js7mFnj9fthmus93zEdsFNrsL": 312, + "LeDbQ99QT342j9S5YdyXLrsq2Gu3T3dMGajExdAuE3V": 132, + "LitxAVo3RnYXD2sX1TyRJxfnKy48amXgyGiysPZjZwE": 36, + "LodeuWMHPiPj2PUHUyca2bkpFv9HyzR3gaDBmGJ9TSS": 44, + "Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s": 128, + "LunaowJnt875WWoqDkhHhE93SNYHa6tfFNVn1rqc57c": 144, + "MCFmmmXdzTKjBEoMggi8JGFJmd856uYSowuH2sCU5kx": 220, + "METALk27ukQon9fq12To13K7LocZQJUuPojr8RkNmnF": 4, + "MRGSoA53J7i4WidVHTxawPyKdr26LdVYCywnrUZ6auT": 56, + "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV": 56, + "MargusHP4dQyxrBuCWngzJp6EZSvg1aPNxdgpXykfr4": 28, + "MutT1jxCXbRWJXpXoJK259gLrNfzDezdxS3BSkQAmv1": 532, + "Mwz8VgAEnPtfqS62r3ixrFiMJwnNfEwR141CGnsTo5k": 168, + "N43JWBg42ZoUFMkHsRUVbP7wGVdxaHKanqaF9BBNiFC": 156, + "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk": 216, + "NLMSHTjmSiRxGJPs3uaqtsFBC2dTGYwK41U18Nmw5kH": 216, + "NWY18yrPHsTogTDq78HpB51D7gC5AGRsvJ5pPqSchkH": 136, + "NdMV1C3XMCRqSBwBtNmoUNnKctYh95Ug4xb6FSTcAWr": 312, + "Ninja1spj6n9t5hVYgF3PdnYz2PLnkt7rvaw3firmjs": 2552, + "NordEHiwa6wT5TCjdeWJzpsA7DSmWQPqfSS7m2b6cv3": 144, + "PAD9aPiKJGcbGxuVLbc8o4Vf65GPq3fJQ7PkHWuX6a8": 196, + "PAWsME7oYbjt5TRNc11mBa33JhKnQr9AYherdr9YAZ6": 268, + "PRGNnb8DxVcP2WjSHfVRGgc8SkA5u6dbMwoTVV1BGKN": 344, + "PULSARKCJTG5xMoJTxaKHtVzr9H4Kv84haZnnewArAG": 120, + "PUmpKiNnSVAZ3w4KaFX6jKSjXUNHFShGkXbERo54xjb": 1484, + "Pid6HQnMCFb9izqX9i7X6ePdUPieGmjHoPxC1Jfooix": 172, + "PoN1E3VyqwqoGQEhC8ExpkRKTuyhxtGLnHHH3DwbgTU": 24, + "PuRposE4utktenW49N8DCtVzdVEwYrmsrroboEUram4": 72, + "R1parD2CtxPBGPABB2m3JjuLpGgNLiJuLxyt7qvAJR3": 148, + "RBFiUqjYuy4mupzZaU96ctXJBy23sRBRsL3KivDAsFM": 680, + "RFLCTDRBVZTEbXrCd92jnKghYeDJARb6ByK2JnPfQmH": 48, + "RLMS1pv3YKi7CSUCKTNcFN5fFkXJc2SmCwPhbQpqZJo": 80, + "RNXnAJV1DeBt6Lytjz4wYzvS3d6bhsfidS5Np4ovwZz": 800, + "RhoAkvPz4uJY6F5EnmBSHnFFEeyA9rt9Rvp95G6HraT": 44, + "RoYFUUD7QD9aQ34UCMcwfye8dC5YvJeXz2J3mmoy5S4": 204, + "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4": 24, + "SANDCxXBbQhvbUqNtiLqKdFEY1uQhVo1UgUACaS4mXU": 52, + "SELEXm1aELCweknS2tsG6A4WivjVvgrTWn9doHNLj66": 160, + "SFundNVpuWk89g211WKUZGkuu4BsKSp7PbnmRsPZLos": 420, + "SLAY6uN1zZpXBTfbuDDCesNmM5D288xrz8uYvfS3n41": 668, + "SLNDCSGTEsA6KHpgR32MBt9UAurZnVSJGUtW2tRpdU2": 196, + "SNPRUBQxL9R2B9WX9B1Qt7xBRTASz4gePDpkxJWTZa4": 32, + "SP9K2c8Z1aaQaqdQgC6hZMJ5UCTTnE76XNYVse7H94b": 20, + "SPHERExTW7GaMgS4RN6MbghYvXU2REfFWHgpxMH1P69": 40, + "SQDS9iwyWvT2mQbSZzuNKGoxuBug5jRHouF6SuMRBkA": 120, + "SSmBEooM7RkmyuXxuKgAhTvhQZ36Z3G2WsmLGJKoQLY": 584, + "STPTshazcjH6cZMHzQBrggFSPHXYCTRGB7ctqS1AjkH": 96, + "STaKesuXJH6UGRizuEVSWG1tyLu5ycKgWj3i1HUdvs5": 60, + "SWnetabTLirPWqEK1V1T7HkVLC5vGvfjEsb89wiqrGh": 188, + "SaGAgdkowooXBrHihpmE8gsjf1dUG7n5SqnyJxYFnXJ": 184, + "Sh1ro1CaaVjNuihgNK6kay7jwcWzSqD2fdix6RNPaSh": 4, + "SoLiDJGk4WkdinyLiRWjkFbgLUhjL3idGJK8H1rUWqH": 52, + "Sp7stYmvQaALhVEsmbV3NnatVrH7DFJUz6PWYJfshrk": 44, + "Spiky3mMSLHGhffuEhYR7ptMNZ8NddddwrTjki4VhWk": 64, + "SscQkTYV2BFQYGGffAmTzvefrFrw6z9GNYiWHstVZ77": 92, + "Stakex4B2tpDHPWGvV1dninfiaYCGdakgTknpzPitLh": 232, + "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty": 428, + "Stsa15mLMK5mjvcdyKKF1stZ9QZWUNdK4Pkc87g8xD9": 112, + "SyndicAgdEphcy5xhAKZAomTYhcF8xhC7za2UD9xeug": 212, + "THE1CosYJD9F1eBq53Fg4MZYZa5WrPUf2RQU5ZHnfEj": 208, + "THWsLPufeq9LWs2H9vYPbtFwdxAHbQHvSbT6pztG8x1": 252, + "TRUMPdBAv1xG1BeuiYMbeqCzySBVpkPtw2bfL8x2GJA": 100, + "TiMxX1yasS4CiGyRcnn7sy9T2fvaNdFpkf8tFDhhDkG": 60, + "TopjgY7N1fJdnW89S9fX6t7LF61nspgXGL1NpgAKhDG": 24, + "TrUtH9WTw1jBVuuExpm3MnC5XF7mW6J3x6oXXA9yX4U": 76, + "Tri1F8B6YtjkBztGCwBNSLEZib1EAqMUEUM7dTT7ZG3": 404, + "TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ": 16, + "U82KEYMnuCiZSQbvuCJTZ652HX9NQ63uNSnxyucshrk": 28, + "UNrgBLmc8JT6A3dxXY9DWeHvDezt2DZQbhg1KPQfqEL": 36, + "UPSCQNqdbiaqrQou9X9y8mr43ZHzvoNpKC26Mo7GubF": 740, + "UZBmptMjMSQEPKm4WyUkJeAuvZSqTuNK3cQCKFqJcXT": 80, + "Uf7TePem6vihMBiRg2d1ivnoNtRapdATfe5o99NuZH6": 16, + "VALiDcyCpujxjJAZDK2av2TpMAigpSodzj2ApqgR4e6": 212, + "Va1idLRtYEtVFJFsvz8vtt1uCJgea4Q1zi2Rh3eraJh": 528, + "VicAQ3U2GjjAuF3tPCtEQZdZKnpAAxkr5Q3zjDKmdo7": 80, + "VymDdiepH77edNcNcKBKtRUb3gbQPtPyGh5NLcWaynj": 4396, + "W1FAbXyQJ5iPghy12TqPktwobU5kTD73ZjA6QZCvsRp": 76, + "WENqavduvNNv1LbwCJPRDr4ZmrdvdfF2SZNrKTAV7pm": 24, + "WUNoB9YQXmXXRcJsjY1G8PfVag5aAfnyGmFd6YwJVwp": 152, + "WnP8cbMW3fqZLHiyEWSpjBQ6sZpfPustpaiY4QKshrk": 28, + "XAqHfPFsqTfAJHBRHAcEECkMSykXjkUj2Rta16Qshrk": 44, + "XRAYzQwAcSqPt4T78ibJAUPmz9rjsqkWzCxmXHv3nir": 96, + "Xbk4tCYoTmxDH98ymRKyh95h5LEUaH229YbiP5avzyW": 4, + "XkCriyrNwS3G4rzAXtG5B1nnvb5Ka1JtCku93VqeKAr": 896, + "Xoir1BnQX9TbEvon9HRbD8tkjcD9dorsxmNjZAV64Re": 52, + "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV": 116, + "YuRBAsy9Stw1u46A8dMp7WQVBFweLP1PKuYibzYAMmQ": 152, + "ZoD1XLMhxdMveAJL4x9oab4FhRKP5NThTnSCH19Tdjp": 68, + "aXiomFkk6VzXaBhPuhMqTLZZguCFzzbyP9LTtZ7ZHLQ": 672, + "adramSYKBv1yHoZTub4kepcmF5LybPxwyJcsz4fpfi7": 264, + "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ": 72, + "ana2y2YvQ3ZPMwm6qhnN3nJoUSiT3qx5Pvetkq9xcfY": 1244, + "anza1rXDVhy1NfVNtsbT3kSBh2jgB1BGZUKuUibSAJd": 356, + "ark1hdnnfmusE24wGHkyVG1gdRCqfmXs9drasDAdABZ": 24, + "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4": 136, + "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF": 36, + "basedN8GQrnMHdVuKo5G361oYFfNy35Sx4UUKwztRfH": 108, + "bay3wXfJsu9ds1zQBoQQ4DUwFGs3NP6q4gca9WM5G1z": 72, + "bcZxRSozXDb61a77rxL6n9yumsbatqC7RFmZ8Xi5K8V": 20, + "bkpk9KVsDRfrArzzmkJ9mPEvbXfQxczzQYR3QMGiR8Z": 628, + "bonkcbAQvHpYWxEG63E8ufTB1cxkkk9eAKaPdGePE88": 228, + "bookoVmqw4QjVj5BbkFacouadx9M7816wyRkfM7A5Lo": 252, + "burncPhAzPbo9QCzN9j8ig2FKZjwDhM5zgN2eW3GmWa": 80, + "bxrAptB5ZpZBhoLedJpoGWY5hBjjt3zvVBr2323Rrq6": 356, + "c3rtoMCHSbFrLRTAdw4iRowKSn4BrDtvSPbuyJwkHwx": 104, + "cBYbGeACrgaqNNoE1zFTveRZGozE6G4q6X6ntnCshrk": 20, + "cami5ixFFZD3jLdX8Ef5tu8o21reSGoE3GpGRrQyP4z": 44, + "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe": 240, + "chrtyETASKQhsndRM9pr6qC3gAHG5MuRwCgXSNVqnJL": 192, + "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj": 240, + "cmshPgUzd5iDkyZxPfUvepRSLtNV47Ks5AGu4KvKqY6": 4, + "custm2hZdfZKpL5xGCUpShF23h7uXFVtL6fK7r5Ca7g": 16, + "cybi55ebub37HZW9YmRaLh59Lh3kqaLTsEBQwW6vFkC": 36, + "damnxGo4n4oBzLcqSft6ad8ZbFqChbMU76hcTdRScBY": 24, + "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu": 204, + "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S": 160, + "donK13ycwd7Xp3ZCGCgRQupemv9s7MedbrQsnpwT3UX": 28, + "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH": 60, + "dzBhD4wikyy7xqwiJvT49gdrKqWVjfs9M6cTssmRX8Y": 12, + "eKV6p4xW86Ryc3r93WYLEHhHne7Zzn3upT8R2cxshrk": 8, + "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK": 192, + "f8JPS1sKWo8ewAUu6sufkDRU1HRCqYfegExB9K6CPA2": 216, + "farbZXR7aBQSMCYiUXzoS4pRUsvuCZ38f6AXMXiKACf": 4, + "fishfishrD9BwrQQiAcG6YeYZVUYVJf3tb9QGQPMJqF": 552, + "forb5u56XgvzxiKfRt4FVNFQKJrd2LWAfNCsCqL6P7q": 336, + "fotby1ABxpei2EVH9uXJ6KbHYgPjbg4Sny9eRzQjtRN": 16, + "gVALrRd3xq4D62KJNGDCpMMGz976w2x1Vo79mSNn4bh": 96, + "gangtCrQg5RmKf5yxvhvZThPugPX58pDSdQ5UuS26vN": 80, + "gojir4WnhS7VS1JdbnanJMzaMfr4UD7KeX1ixWAHEmw": 128, + "gotasRuLTuJNZDtLHmaDJpEUjCWZqkHcuwbLhkgCwCX": 28, + "gridqZmeBcsUKT2Mv4M9YFHFN3tVLFb2TCtTcLD1cAd": 284, + "grptonHnt7YSmJokGK9TJJTBXDT8ca4LSWMHCCfzzPa": 420, + "h3ZXAE168mNxsszYYrUfkMVSCWx6DU2Uvrx97Kb1Nch": 344, + "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o": 224, + "huinBRP3muBuqZLMW8ARjdn4mBnEmFFcxiBzrkQz553": 208, + "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj": 244, + "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu": 80, + "hykfH9jUQqe2yqv3VqVAK5AmMYqrmMWmdwDcbfsm6My": 96, + "hyp3Eo67t6FgeuWg5Qxbeme8NPXJPXXdKT4iJ4DsLf2": 120, + "icex1C6pnZxznQWiHZZANjGU8nZ8kNquFnjyY7XXrXE": 152, + "idCE5k2BtTpwXdwAC7Var1enT9reut9fWECcxQP7LY7": 88, + "jagBNeXYncnn1hzwSq1JJ16XhWTgQ7DCFVqndSJZ6vT": 136, + "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA": 40, + "juigBT2qetpYpf1iwgjaiWTjryKkY3uUTVAnRFKkqY6": 700, + "kREnNfJrPEHbrjSQDxmxZdGmN6hi7ewXZ3UZTURshrk": 20, + "kom1oNHyyt84XLGVfi5Jo1qkVkU5xG1sBxPG19rWknE": 4, + "krakeNd6ednDPEXxHAmoBs1qKVM8kLg79PvWF2mhXV1": 3236, + "kyzzzgRymGpePUsLyr48kQHt53kh5CSfRH1qfvz1xgj": 20, + "mALL2W6DUgDDtcyurC9v5YTF2CMMeuRwPBkf6tEoG3y": 56, + "mHtqTQHaUcFjSZF6tGLNLsHLvjVsxXEK8w3BoT9eLAT": 140, + "mLyfgvyTAuEBVyAZcqyWKJ4SnM88Tqv2hFMy68y8hmY": 68, + "mXv18ov8qCiQGs3ieoen981LdgZzYJjJak6reK6fpNC": 80, + "makot6hiF2ZEWy1yPF5otx73VuXpP5SCUeCbZiiGSt4": 276, + "mastWEbKEMjvBCd1uaUBpNjWcfSPhXMWnH9tTrgzn1g": 312, + "mds1WWedpezW3qvgML4WgP341jZksYAy5SbMLwjP5KC": 60, + "mds2fZEpJP688PqJHvfLxGyf2VFrcNkvjuUxNYCwjrq": 52, + "mds3Df1ieBonG2qS8ZoKTqshq5MgTUNfZgc78cjiCdq": 68, + "mds4GEuiSgQRqveGyktWpETBFCb4AS2wDnhqwLHcT6Z": 312, + "memeSJj41yAk4s3BgzCURhzFkMptBDkNtfcgysRCrGA": 12, + "meshRrDTME9cL2FSQ9E56EncfkZ7vL8apwcCFsw3o6Y": 140, + "metaLond2yfFxCN48HBZGScfbKge6nV61EHYEphRwwR": 240, + "mineL1YNwcRnxN93B2sX6q22R11WfRqxnY4NBV8KfFY": 548, + "mint13XHZSSxtgHuTSM9qPDEJSbWktpmpM4CZxeLB8f": 456, + "mrgn28BhocwdAUEenen3Sw2MR9cPKDpLkDvzDdR7DBD": 256, + "mrgn4sJJu5GBa5wbKyjuASzhyCifvcedGoLtpKjB3Wf": 280, + "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk": 152, + "nSGZ3tv2UhskkPqiB666yDVj7PTi9qKgDqvjHyw5JgM": 220, + "narPxmKTwkUxvcXhueccHT8xbE8og2Vb7NrLBm8kcrh": 4, + "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC": 196, + "nebu15XQKGpxzhhckADBX9PgvGN5qk9RRJCFLKc118w": 232, + "nodeEgRVkbYLAQePtMx2zCN7CGw7qRgzKMCBtjMfN1D": 272, + "novaeuhY2JH2WHhc9KVTHDx2cyJZdXJC6faf4CtARZn": 48, + "nxts9SpchNGqWHRB3zmhskt434MCbUUwkeUcs6xX5oe": 24, + "nymsHergYedT9CJMgtGMvqXUTGcbs5o3MiWTJUbqTGY": 244, + "oPaLtitM6cwpFVzP2rDhLsJLdY2vcbuZiJJyD1TFUKs": 908, + "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS": 32, + "omegahqefiV3bcrbwwx654NqiMrLVwDiewqnqekpNgo": 224, + "p1ayS5DGgrM7m1VU4zcppoTWPbcFGhrBYTh7Wm6ApAC": 8, + "pSoLoZx55zZz61gjxSTwHtwTg4yTwdm7ruBmyjbYgT2": 708, + "parafiUS6h6oLhCFwhjvEmQJKw8pF1iXsxMJdTq46dS": 60, + "peNgUgnzs1jGogUPW8SThXMvzNpzKSNf3om78xVPAYx": 32, + "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2": 308, + "pitMDEaMmWmr7qP8HsNqarPQkd3jhZbLJibhhQnL5RG": 268, + "pitch9cMruwjDtAnisNS4mwZUPhMsBztNEGu2weMg55": 12, + "popscoyTKVksa4TyTXw488b3vvFxM7qQEyTBeMQopKu": 248, + "ppppoqHcHVzigV6SK4856BAsNxhTAi32hqQQWrziyHE": 100, + "privaEdSEmnMPGPoQACUkcDGkFBbTArVvsEGd7C5wUM": 4, + "prt1st4RSxAt32ams4zsXCe1kavzmKeoR7eh1sdYRXW": 4, + "puffinQSvKFriPbyE5atyx1ptfnyytovbzxybr1jsyy": 196, + "q1yPXLsYcJhzxhUYLewFDjYmsBh2gDFnYqrZ9VPshrk": 36, + "q9XWcZ7T1wP4bW9SB4XgNNwjnFEJ982nE8aVbbNuwot": 9492, + "qZMH9GWnnBkx7aM1h98iKSv2Lz5N78nwNSocAxDQrbP": 292, + "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9": 320, + "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC": 300, + "rsbp8zMHbGCpLoRktmsjspYv77VcjxAzH1KxPCD9BiU": 40, + "rssaJ2iKcE9QWsFYRZr8Q66TQh5bRk9DxYrzxGMzWQr": 164, + "rubyWZkfnjG716rx69n2oCAhevVZaMRQunir9VQcY2E": 1036, + "s2Meqg3YnYVZBLSAvXhLCttifWyppoPh3W6Meqz3J3v": 176, + "s9bQfWdGJSTr8zHcFrDbuXpc2SgjS5jZvaor3t1shrk": 28, + "sCANXAaS1a7yB8jz3USvGNLfd8DSc9r7TNzNSKKPkfY": 40, + "sTEAKPk59EtPPbixCweyv6oRLNCDEE8pnnef6gUfbiW": 240, + "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu": 36, + "sTepQGoReJq2tBKStL19DT6nnGHcGiAvFjyYaokLyuM": 692, + "sZAqxCSN5kkVfG2s65Bje4jzCkD2aLyk21qU95PMf2Y": 64, + "sbidYi7fbif6qNsMpwBKvyF5DKcLCbjaegpADsKqNux": 176, + "scb1Z7du8NVSaHFXsafSjRdXr6xBjWR3iugikL739Y1": 88, + "scb2TYPmwHgKxXJaJNq6gHKwYkVyLKx58hz9RbCKZZR": 40, + "sce1oTWYVXv7a7Hy2skxREozs5nwkQ4wDT8XJSi5tgE": 68, + "sce2zXNjLpPMcSCATTrLiQhAAvHNNMKypTFVtg2H37U": 40, + "sce3TfT81rxYYcdbP1kBFMcTK3ZBc8hvHVeXD6WLSzE": 80, + "scs1NCSTafrUX6RBx113B9YDCepo1QdEzU8WwEkf25i": 56, + "scs2Ra91pMbvqFAP7uitrN5U25SoyBTqZgBbhpVMJko": 48, + "sh4rk6QkkaHkYtn9TCNjTPmAk7yBHCNw35pp1KHo4UC": 104, + "shftkxnsXmqAkmLgz9Mn7bNB5Fr6mKgFc58kFHfVikj": 644, + "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb": 324, + "soLStaCk5TiGCpeLKa9Fvv6f5JQGMa6S3uhLh826e9N": 348, + "spcti6GQVvinbtHU9UAkbXhjTcBJaba1NVx4tmK4M5F": 244, + "spur5CDwBvTZszvy1ozGjRc1x2TuDWo3VF4jrq7zgvD": 116, + "sq7KFNx5BQ8kSqbunZYnUM3DaQZAQhz1cXuVR2kSZ7k": 44, + "stacheBmGG5zMKuetUevAbc4m4dLbve1VPcpSur3voH": 212, + "str4t8cca1qmHtdNkZVYUkkpyfAGbBQKE8MRQBFQLCx": 96, + "tcrkE5QNG87Zbexm6fdWMbn7A5MjLC4ML7i1JfHF7cj": 232, + "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY": 72, + "tkmaiSoZ3F8MofkQBVWG6JYSCzyN6ioe7ReYXohx3WJ": 68, + "uEhHSnCXvWgtgvVaYscPHjG13G3peMmngQQ2ghC54i3": 80, + "ungM4fafkQg1e13MAzwzuvCxtTTiTZ4Xcq7KqnJRyVJ": 152, + "uxqVAFQfox97HazsPtkKiwhypQH6jEGXkQBHDtXshrk": 40, + "vALigXFg9wnnhVHN16vNxHxXtAXiBv5QjAE6udoniBY": 240, + "vE8K2TUzwD9NAiTcDjGx6rF8aqU7s3mYtvCmQjHshrk": 40, + "vahMVcSS3v6uwyFormV7FDAUbQSHwmy6vUedp1P7L42": 92, + "vaoJKVZYPAsqc52T2nNQhABR1gU6Cy2koDKfCQaEiva": 136, + "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd": 88, + "vu1sGn2f1Xim6voHNLt4nLn38zNkYdLasU7hEr1TC2D": 1400, + "vvvvbtDs9HsdsE6NskZMnb1RA6muoud1ChQuiF9QhSM": 232, + "w3iDxC22CnKLUcST77cp5ZPGbEjXGrp5gvgtEPNNMaA": 128, + "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo": 100, + "wifwUaAXgGXixi757cinR8RhAzNuuyKg8hh7mkCDPEc": 192, + "xLabscif2DLnYg39rQThqi7A9E45L9qiysRZhmZ1ARE": 160, + "xx6jU8CRzoUCT2RNCoomRqAokWmvgVymxRKtyfvQ4CG": 24, + "yJeahQNRHNWtL9Z1SqPX3SBwTYXr5ECMYYVK4uYVwxt": 240, + "zeroT6PTAEjipvZuACTh1mbGCqTHgA6i1ped9DcuidX": 344 + } +} \ No newline at end of file diff --git a/offchain/crates/contributor-rewards/tests/test_demand.rs b/offchain/crates/contributor-rewards/tests/test_demand.rs new file mode 100644 index 0000000000..60387c6cd3 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/test_demand.rs @@ -0,0 +1,229 @@ +mod common; + +use std::{collections::BTreeMap, fs, path::Path}; + +use anyhow::Result; +use common::create_test_settings; +use doublezero_contributor_rewards::{ + ingestor::{ + demand::{self, CityStat}, + epoch::LeaderSchedule, + types::{FetchData, apply_json_compat_migrations}, + }, + settings::DemandSettings, +}; +use doublezero_serviceability::state::user::{UserStatus, UserType}; +use serde_json::Value; + +fn load_test_data() -> Result { + let data_path = Path::new("tests/testnet_snapshot.json"); + let json = fs::read_to_string(data_path)?; + let mut data: Value = serde_json::from_str(&json)?; + apply_json_compat_migrations(&mut data); + + // Parse the JSON into FetchData + let fetch_data: FetchData = serde_json::from_value(data)?; + Ok(fetch_data) +} + +fn load_leader_schedule() -> Result { + let data_path = Path::new("tests/leader-schedule-epoch-89.json"); + let json = fs::read_to_string(data_path)?; + let data: Value = serde_json::from_str(&json)?; + let schedule: LeaderSchedule = serde_json::from_value(data)?; + Ok(schedule) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_demand_generation_from_json() -> Result<()> { + // Create test settings + let settings = create_test_settings(0.7, 1000.0, false); + + // Load test data + let fetch_data = load_test_data()?; + let leader_schedule = load_leader_schedule()?; + + // Build demands using the refactored function + let result = demand::build_with_schedule(&settings, &fetch_data, &leader_schedule)?; + + // Verify results + println!("\nGenerated {} demands", result.demands.len()); + + // Basic assertions + assert!( + !result.demands.is_empty(), + "Should generate at least one demand" + ); + + // Verify no self-loops + for demand in &result.demands { + assert_ne!(demand.start, demand.end, "Should not have self-loops"); + } + + // With access pass changes, verify the cities expected exist + let expected_cities = ["AMS", "FRA", "LAX", "LON", "NYC", "PRG", "SIN", "TYO"]; + + println!("{:#?}", result.demands); + + // Should have exactly 56 demands (8 cities * 7 destinations each) + assert_eq!(result.demands.len(), 56, "Should have exactly 56 demands"); + + // Verify demands are created between all expected city pairs + for start_city in expected_cities.iter() { + for end_city in expected_cities.iter() { + if start_city != end_city { + let found = result + .demands + .iter() + .find(|d| d.start == *start_city && d.end == *end_city); + assert!( + found.is_some(), + "Missing demand from {start_city} to {end_city}", + ); + + // Verify demand has valid values + if let Some(demand) = found { + assert!(demand.receivers > 0, "Demand should have receivers"); + // Priority can be 0.0 if total_stake_proxy is 0 for the destination city + assert!( + demand.priority >= 0.0, + "Demand priority should be non-negative" + ); + } + } + } + } + + // Print demands (for debugging) + for (i, demand) in result.demands.iter().enumerate() { + println!( + " {}: {} -> {} (receivers: {}, priority: {:.4})", + i + 1, + demand.start, + demand.end, + demand.receivers, + demand.priority + ); + } + + Ok(()) + } + + #[test] + fn test_demand_generation_uses_configured_settings() { + let mut city_stats = BTreeMap::new(); + city_stats.insert( + "AAA".to_string(), + CityStat { + validator_count: 1, + total_stake_proxy: 1, + subscriber_count: 0, + city_price: 0, + }, + ); + city_stats.insert( + "BBB".to_string(), + CityStat { + validator_count: 2, + total_stake_proxy: 2, + subscriber_count: 3, + city_price: 42, + }, + ); + let demand_settings = DemandSettings { + traffic: 0.42, + priority: 7.0, + kind: 11, + multicast_enabled: true, + shred_kind: 22, + shred_multicast_enabled: false, + }; + + let demands = demand::generate(&city_stats, &demand_settings); + + let ibrl = demands + .iter() + .find(|d| d.kind == demand_settings.kind) + .expect("expected IBRL demand"); + assert_eq!(ibrl.traffic, demand_settings.traffic); + assert_eq!(ibrl.priority, demand_settings.priority); + assert_eq!(ibrl.multicast, demand_settings.multicast_enabled); + + let shred = demands + .iter() + .find(|d| d.kind == demand_settings.shred_kind) + .expect("expected shred demand"); + assert_eq!(shred.traffic, demand_settings.traffic); + assert_eq!(shred.priority, 42.0); + assert_eq!(shred.multicast, demand_settings.shred_multicast_enabled); + } + + #[test] + fn test_subscriber_counts_come_from_users_not_device_counters() -> Result<()> { + let settings = create_test_settings(0.7, 1000.0, false); + let mut fetch_data = load_test_data()?; + let leader_schedule = load_leader_schedule()?; + + let mut expected_by_city = BTreeMap::::new(); + for user in fetch_data.dz_serviceability.users.values() { + let is_live = !matches!( + user.status, + UserStatus::RejectedDeprecated + | UserStatus::Banned + | UserStatus::PendingBanDeprecated + ); + if user.user_type != UserType::Multicast || !is_live || user.is_publisher() { + continue; + } + + let Some(device) = fetch_data.dz_serviceability.devices.get(&user.device_pk) else { + continue; + }; + let Some(exchange) = fetch_data + .dz_serviceability + .exchanges + .get(&device.exchange_pk) + else { + continue; + }; + let city = exchange + .code + .strip_prefix('x') + .unwrap_or(&exchange.code) + .to_uppercase(); + *expected_by_city.entry(city).or_default() += 1; + } + + assert!( + expected_by_city.values().any(|count| *count > 0), + "fixture should contain multicast subscribers" + ); + + // Poison the denormalized Device counters with an impossible value. The + // demand builder must ignore these counters and derive subscriber demand + // from live multicast User accounts instead. + for device in fetch_data.dz_serviceability.devices.values_mut() { + device.multicast_subscribers_count = 12_916; + } + + let result = demand::build_with_schedule(&settings, &fetch_data, &leader_schedule)?; + + for (city, expected) in expected_by_city { + let actual = result + .city_stats + .get(&city) + .map(|stats| stats.subscriber_count) + .unwrap_or(0); + assert_eq!( + actual, expected, + "subscriber count for {city} should be derived from users" + ); + } + + Ok(()) + } +} diff --git a/offchain/crates/contributor-rewards/tests/test_historical_epoch.rs b/offchain/crates/contributor-rewards/tests/test_historical_epoch.rs new file mode 100644 index 0000000000..d941dce532 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/test_historical_epoch.rs @@ -0,0 +1,253 @@ +use doublezero_contributor_rewards::ingestor::types::{DZInternetData, DZInternetLatencySamples}; +use solana_sdk::pubkey::Pubkey; + +/// Mock RPC client for testing without actual chain +#[cfg(test)] +mod mock_tests { + use super::*; + + // Helper to create test internet data with specified coverage + fn create_internet_data_with_coverage( + epoch: u64, + num_links: usize, + samples_per_link: usize, + ) -> DZInternetData { + let mut samples = Vec::new(); + + for _i in 0..num_links { + let origin = Pubkey::new_unique(); + let target = Pubkey::new_unique(); + + let mut latency_samples = Vec::new(); + for j in 0..samples_per_link { + latency_samples.push(50000 + (j as u32 * 1000)); // 50ms + variance in microseconds + } + + samples.push(DZInternetLatencySamples { + pubkey: Pubkey::new_unique(), + epoch, + data_provider_name: "test_provider".to_string(), + oracle_agent_pk: Pubkey::new_unique(), + origin_exchange_pk: origin, + target_exchange_pk: target, + sampling_interval_us: 1000000, // 1 second + start_timestamp_us: 1000000000, // arbitrary start time + samples: latency_samples, + sample_count: samples_per_link as u32, + }); + } + + DZInternetData { + internet_latency_samples: samples, + accounts: vec![], + } + } + + #[test] + fn test_threshold_logic_current_epoch_sufficient() { + // Test: Current epoch has sufficient coverage, should use it + let target_epoch = 100; + let _expected_links = 10; + + // Simulate data with 80% coverage (8 out of 10 links) + let data = create_internet_data_with_coverage(target_epoch, 8, 15); + + // In a real test, we'd mock the RPC call + // Here we're testing the logic conceptually + // Check that we created data for the target epoch + assert_eq!(data.internet_latency_samples[0].epoch, target_epoch); + assert_eq!(data.internet_latency_samples.len(), 8); + } + + #[test] + fn test_threshold_logic_requires_lookback() { + // Test: Current epoch insufficient, historical epoch sufficient + let target_epoch = 100; + let _expected_links = 10; + + // Current epoch: 50% coverage (5 out of 10 links) + let current_data = create_internet_data_with_coverage(target_epoch, 5, 15); + + // Historical epoch: 80% coverage (8 out of 10 links) + let historical_data = create_internet_data_with_coverage(target_epoch - 1, 8, 15); + + // Verify the data structures + assert_eq!(current_data.internet_latency_samples.len(), 5); + assert_eq!(historical_data.internet_latency_samples.len(), 8); + if !historical_data.internet_latency_samples.is_empty() { + assert_eq!( + historical_data.internet_latency_samples[0].epoch, + target_epoch - 1 + ); + } + } + + #[test] + fn test_edge_case_no_data_all_epochs() { + // Create empty data for multiple epochs + let epochs: Vec = vec![100, 99, 98, 97, 96]; + let empty_data: Vec = epochs + .iter() + .map(|_epoch| DZInternetData { + internet_latency_samples: vec![], + accounts: vec![], + }) + .collect(); + + // Verify all epochs have no data + for data in &empty_data { + assert_eq!(data.internet_latency_samples.len(), 0); + } + } + + #[test] + fn test_edge_case_all_epochs_below_threshold() { + // Test: All epochs have data but below threshold + let expected_links = 10; + + // Create data with 30%, 40%, 50% coverage for 3 epochs + let coverages = [3, 4, 5]; + let epochs = [100, 99, 98]; + + let insufficient_data: Vec = epochs + .iter() + .zip(coverages.iter()) + .map(|(&epoch, &num_links)| create_internet_data_with_coverage(epoch, num_links, 15)) + .collect(); + + // Verify all epochs are below 70% threshold + for (i, data) in insufficient_data.iter().enumerate() { + let coverage = data.internet_latency_samples.len() as f64 / expected_links as f64; + assert!( + coverage < 0.7, + "Epoch {} coverage should be below threshold", + epochs[i] + ); + } + + // Best available should be epoch 98 with 50% coverage + let best_data = &insufficient_data[2]; + if !best_data.internet_latency_samples.is_empty() { + assert_eq!(best_data.internet_latency_samples[0].epoch, 98); + } + assert_eq!(best_data.internet_latency_samples.len(), 5); + } + + #[test] + fn test_lookback_limit_enforcement() { + // Test: Should not look back more than max_epochs_lookback + let target_epoch = 100; + + // Create epochs to test + let test_epochs: Vec = vec![100, 99, 98, 97, 96, 95]; // 6 epochs + + // Only first 4 epochs should be checked (current + 3 lookback) + let checked_epochs = &test_epochs[0..4]; + assert_eq!(checked_epochs.len(), 4); + assert_eq!(checked_epochs[0], target_epoch); + assert_eq!(checked_epochs[3], target_epoch - 3); + } + + #[test] + fn test_samples_threshold_filtering() { + // Test: Links with insufficient samples should not count toward coverage + let expected_links = 6; + + // Create data with mixed sample counts + let mut data = create_internet_data_with_coverage(100, 3, 15); // 3 links with 15 samples + + // Add 3 more links with only 5 samples (below min_samples_per_link of 10) + for _i in 3..6 { + let origin = Pubkey::new_unique(); + let target = Pubkey::new_unique(); + + let mut latency_samples = Vec::new(); + for j in 0..5 { + latency_samples.push(50000 + (j as u32 * 1000)); + } + + data.internet_latency_samples + .push(DZInternetLatencySamples { + pubkey: Pubkey::new_unique(), + epoch: 100, + data_provider_name: "test_provider".to_string(), + oracle_agent_pk: Pubkey::new_unique(), + origin_exchange_pk: origin, + target_exchange_pk: target, + sampling_interval_us: 1000000, + start_timestamp_us: 1000000000, + samples: latency_samples, + sample_count: 5, + }); + } + + // Total links: 6, but only 3 have sufficient samples + assert_eq!(data.internet_latency_samples.len(), 6); + + // Only 3 links meet the min_samples requirement + let valid_links: Vec<_> = data + .internet_latency_samples + .iter() + .filter(|s| s.samples.len() >= 10) + .collect(); + assert_eq!(valid_links.len(), 3); + + // Coverage should be 50% (3 valid out of 6 expected) + let coverage = valid_links.len() as f64 / expected_links as f64; + assert_eq!(coverage, 0.5); + } + + #[test] + fn test_best_available_selection() { + // Test: When no epoch meets threshold, select the one with best coverage + + // Create epochs with varying coverage, all below 80% + let epochs_and_coverage = [ + (100, 3), // 30% coverage + (99, 5), // 50% coverage + (98, 7), // 70% coverage - best but still below threshold + (97, 4), // 40% coverage + (96, 2), // 20% coverage + ]; + + let data_collection: Vec = epochs_and_coverage + .iter() + .map(|&(epoch, num_links)| create_internet_data_with_coverage(epoch, num_links, 15)) + .collect(); + + // Find the best coverage + let best_data = data_collection + .iter() + .max_by_key(|d| d.internet_latency_samples.len()) + .unwrap(); + + // Best data should have epoch 98 and 7 samples + if !best_data.internet_latency_samples.is_empty() { + assert_eq!(best_data.internet_latency_samples[0].epoch, 98); + } + assert_eq!(best_data.internet_latency_samples.len(), 7); + } + + #[test] + fn test_calculate_expected_links_integration() { + // Test the calculate_expected_links logic from data_prep.rs + // For n locations, expected links = n * (n - 1) + + let test_cases: Vec<(usize, usize)> = vec![ + (0, 0), // No locations + (1, 0), // Single location (no links possible) + (2, 2), // 2 locations: A→B, B→A + (3, 6), // 3 locations: 3 * 2 = 6 directional links + (4, 12), // 4 locations: 4 * 3 = 12 directional links + (5, 20), // 5 locations: 5 * 4 = 20 directional links + ]; + + for (num_locations, expected_links) in test_cases { + let calculated = num_locations * num_locations.saturating_sub(1); + assert_eq!( + calculated, expected_links, + "For {num_locations} locations, expected {expected_links} links", + ); + } + } +} diff --git a/offchain/crates/contributor-rewards/tests/test_pub_links.rs b/offchain/crates/contributor-rewards/tests/test_pub_links.rs new file mode 100644 index 0000000000..b0f0eb4e45 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/test_pub_links.rs @@ -0,0 +1,341 @@ +use std::{collections::HashMap, fs, path::Path}; + +use anyhow::Result; +use doublezero_contributor_rewards::{ + calculator::shapley::handler::{PreviousEpochCache, build_public_links}, + ingestor::types::{FetchData, apply_json_compat_migrations}, + processor::internet::InternetTelemetryProcessor, + settings, +}; +use serde_json::Value; + +fn load_test_data() -> Result { + let data_path = Path::new("tests/testnet_snapshot.json"); + let json = fs::read_to_string(data_path)?; + let mut data: Value = serde_json::from_str(&json)?; + apply_json_compat_migrations(&mut data); + + // Parse the JSON into FetchData manually + let fetch_data: FetchData = serde_json::from_value(data)?; + Ok(fetch_data) +} + +fn test_settings() -> settings::Settings { + // Create test settings with testnet network (since data is from testnet) + settings::Settings { + log_level: "info".to_string(), + network: settings::network::Network::Testnet, + shapley: settings::ShapleySettings { + operator_uptime: 0.98, + contiguity_bonus: 5.0, + demand_multiplier: 1.2, + }, + demand: settings::DemandSettings::default(), + input: settings::InputSettings::default(), + rpc: settings::RpcSettings { + dz_url: "https://test.com".to_string(), + solana_read_url: "https://test.com".to_string(), + solana_write_url: "https://test.com".to_string(), + commitment: "confirmed".to_string(), + rps_limit: 10, + }, + programs: settings::ProgramSettings { + serviceability_program_id: "test".to_string(), + telemetry_program_id: "test".to_string(), + }, + prefixes: settings::PrefixSettings { + device_telemetry: "device".to_string(), + internet_telemetry: "internet".to_string(), + contributor_rewards: "rewards".to_string(), + reward_input: "input".to_string(), + }, + inet_lookback: settings::InetLookbackSettings { + min_coverage_threshold: 0.8, + max_epochs_lookback: 5, + min_samples_per_link: 20, + enable_accumulator: true, + dedup_window_us: 10000000, + }, + telemetry_defaults: settings::TelemetryDefaultSettings { + missing_data_threshold: 0.7, + private_default_latency_ms: 1000.0, + enable_previous_epoch_lookup: true, + }, + scheduler: settings::SchedulerSettings { + interval_seconds: 300, + state_file: "/var/lib/doublezero-contributor-rewards/scheduler.state".to_string(), + snapshot_dir: "/tmp/snapshots".to_string(), + enable_dry_run: false, + storage_backend: settings::aws::StorageBackend::LocalFile, + grace_period_max_wait_seconds: 21600, + }, + metrics: Some(settings::MetricsSettings { + addr: "127.0.0.1:9090".parse().unwrap(), + }), + aws: Some(settings::aws::AwsSettings { + region: "us-east-1".to_string(), + bucket: "dummy-bucket".to_string(), + access_key_id: "dummy-key".to_string(), + secret_access_key: "dummy-secret".to_string(), + endpoint: None, + }), + slack: None, + } +} + +fn create_expected_results() -> HashMap<(String, String), f64> { + let mut expected = HashMap::new(); + + // These are the exact values from the public links output (updated after snapshot rebuild) + expected.insert(("ams".to_string(), "fra".to_string()), 7.320); + expected.insert(("ams".to_string(), "lax".to_string()), 148.240); + expected.insert(("ams".to_string(), "lon".to_string()), 12.622); + expected.insert(("ams".to_string(), "nyc".to_string()), 80.040); + expected.insert(("ams".to_string(), "prg".to_string()), 16.645); + expected.insert(("ams".to_string(), "sin".to_string()), 211.876); + expected.insert(("ams".to_string(), "tyo".to_string()), 286.482); + + expected.insert(("fra".to_string(), "lax".to_string()), 142.718); + expected.insert(("fra".to_string(), "lon".to_string()), 12.018); + expected.insert(("fra".to_string(), "nyc".to_string()), 87.938); + expected.insert(("fra".to_string(), "prg".to_string()), 10.914); + expected.insert(("fra".to_string(), "sin".to_string()), 170.642); + expected.insert(("fra".to_string(), "tyo".to_string()), 243.183); + + expected.insert(("lax".to_string(), "lon".to_string()), 147.642); + expected.insert(("lax".to_string(), "nyc".to_string()), 64.951); + expected.insert(("lax".to_string(), "prg".to_string()), 154.809); + expected.insert(("lax".to_string(), "sin".to_string()), 184.499); + expected.insert(("lax".to_string(), "tyo".to_string()), 101.735); + + expected.insert(("lon".to_string(), "nyc".to_string()), 84.530); + expected.insert(("lon".to_string(), "prg".to_string()), 21.166); + expected.insert(("lon".to_string(), "sin".to_string()), 235.639); + expected.insert(("lon".to_string(), "tyo".to_string()), 284.035); + + expected.insert(("nyc".to_string(), "prg".to_string()), 95.203); + expected.insert(("nyc".to_string(), "sin".to_string()), 386.875); + expected.insert(("nyc".to_string(), "tyo".to_string()), 166.375); + + expected.insert(("prg".to_string(), "sin".to_string()), 208.615); + expected.insert(("prg".to_string(), "tyo".to_string()), 262.659); + + expected.insert(("sin".to_string(), "tyo".to_string()), 73.031); + + expected +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_public_links_generation() -> Result<()> { + // Load test data from JSON file + let fetch_data = load_test_data()?; + + // Test settings + let settings = test_settings(); + + println!( + "Loaded snapshot with {} exchanges, {} locations, {} devices", + fetch_data.dz_serviceability.exchanges.len(), + fetch_data.dz_serviceability.locations.len(), + fetch_data.dz_serviceability.devices.len() + ); + println!( + "Internet telemetry samples: {}", + fetch_data.dz_internet.internet_latency_samples.len() + ); + + // Process internet telemetry to get stats + let internet_stats = InternetTelemetryProcessor::process(&fetch_data)?; + println!( + "Processed {} internet telemetry stats", + internet_stats.len() + ); + + // Create an empty cache for tests + let previous_epoch_cache = PreviousEpochCache::new(); + + // Generate public links + let public_links = build_public_links( + &settings, + &internet_stats, + &fetch_data, + &previous_epoch_cache, + )?; + + // Print results for verification + println!("\nPublic Links Generated:"); + println!("{:<5} | {:<5} | {:>15}", "city1", "city2", "latency(ms)"); + println!("{:-<35}", ""); + for link in &public_links { + println!( + "{:<5} | {:<5} | {:>15.3}", + link.city1, link.city2, link.latency + ); + } + + // Verify we have the expected number of city pairs + // With 8 cities, we expect C(8,2) = 28 city pairs + let expected_count = 28; + println!( + "\nExpected {} city pairs, got {}", + expected_count, + public_links.len() + ); + + // Allow for some missing pairs due to data availability + assert!( + public_links.len() >= expected_count / 2, + "Expected at least {} city pairs, got {}", + expected_count / 2, + public_links.len() + ); + + // Get expected results + let expected = create_expected_results(); + + // Create a map from public_links for easier comparison + let mut result_map: HashMap<(String, String), f64> = HashMap::new(); + for link in &public_links { + result_map.insert((link.city1.clone(), link.city2.clone()), link.latency); + } + + // Verify that we have reasonable latency values + for link in &public_links { + // Allow 0.0 for links with no data or same location + assert!( + link.latency >= 0.0 && link.latency < 1000.0, + "Unreasonable latency value for {} -> {}: {}", + link.city1, + link.city2, + link.latency + ); + } + + // Verify the exact values match expected results with small tolerance + for ((city1, city2), expected_latency) in expected.iter() { + if let Some(actual_latency) = result_map.get(&(city1.clone(), city2.clone())) { + // Allow very small difference due to floating point precision + let diff = (actual_latency - expected_latency).abs(); + println!( + "Checking {city1}->{city2}: expected {expected_latency:.3}, got {actual_latency:.3}, diff {diff:.6}", + ); + + // We should get exact or very close values since we're using the same test data + // Allow slightly more tolerance due to updated statistics calculations (population vs sample variance) + // The new calculations are more accurate (using Welford's algorithm, proper percentiles, etc) + assert!( + diff < 1.0, + "Latency mismatch for {city1} -> {city2}: got {actual_latency}, expected {expected_latency}" + ); + } + } + + Ok(()) + } + + #[test] + fn test_public_latency_multiplier() -> Result<()> { + let fetch_data = load_test_data()?; + let internet_stats = InternetTelemetryProcessor::process(&fetch_data)?; + let previous_epoch_cache = PreviousEpochCache::new(); + + let settings = test_settings(); + let public_links = build_public_links( + &settings, + &internet_stats, + &fetch_data, + &previous_epoch_cache, + )?; + + let mut adjusted_settings = test_settings(); + adjusted_settings.input.public_latency_multiplier = 1.25; + let adjusted_public_links = build_public_links( + &adjusted_settings, + &internet_stats, + &fetch_data, + &previous_epoch_cache, + )?; + + assert_eq!(public_links.len(), adjusted_public_links.len()); + for (base_link, adjusted_link) in public_links.iter().zip(adjusted_public_links.iter()) { + assert_eq!(base_link.city1, adjusted_link.city1); + assert_eq!(base_link.city2, adjusted_link.city2); + let expected_latency = base_link.latency * 1.25; + let diff = (adjusted_link.latency - expected_latency).abs(); + assert!( + diff < f64::EPSILON, + "Latency mismatch for {} -> {}: got {}, expected {}", + adjusted_link.city1, + adjusted_link.city2, + adjusted_link.latency, + expected_latency + ); + } + + Ok(()) + } + + #[test] + fn test_snapshot_data_integrity() -> Result<()> { + let fetch_data = load_test_data()?; + + // Verify we have the expected cities + let expected_cities = vec!["ams", "fra", "lax", "lon", "nyc", "prg", "sin", "tyo"]; + + let location_codes: Vec = fetch_data + .dz_serviceability + .locations + .values() + .map(|loc| loc.code.clone()) + .collect(); + + for city in expected_cities { + assert!( + location_codes.contains(&city.to_string()), + "Missing expected city: {city}", + ); + } + + // Verify exchanges have 'x' prefix + for exchange in fetch_data.dz_serviceability.exchanges.values() { + assert!( + exchange.code.starts_with('x'), + "Exchange code should start with 'x': {}", + exchange.code + ); + } + + // Verify we have internet telemetry samples + assert!( + !fetch_data.dz_internet.internet_latency_samples.is_empty(), + "No internet telemetry samples found" + ); + + // Verify telemetry samples use exchange PKs that exist + for sample in &fetch_data.dz_internet.internet_latency_samples { + let origin_exists = fetch_data + .dz_serviceability + .exchanges + .contains_key(&sample.origin_exchange_pk); + let target_exists = fetch_data + .dz_serviceability + .exchanges + .contains_key(&sample.target_exchange_pk); + + // Some samples might still use old location PKs, that's OK + if origin_exists && target_exists { + println!( + "Valid sample: {} -> {}", + fetch_data.dz_serviceability.exchanges[&sample.origin_exchange_pk].code, + fetch_data.dz_serviceability.exchanges[&sample.target_exchange_pk].code + ); + } + } + + Ok(()) + } +} diff --git a/offchain/crates/contributor-rewards/tests/test_pvt_links.rs b/offchain/crates/contributor-rewards/tests/test_pvt_links.rs new file mode 100644 index 0000000000..ea8c33ca72 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/test_pvt_links.rs @@ -0,0 +1,441 @@ +use std::{collections::HashMap, fs, path::Path}; + +use anyhow::Result; +use doublezero_contributor_rewards::{ + calculator::shapley::handler::{build_devices, build_private_links}, + ingestor::types::{FetchData, apply_json_compat_migrations}, + processor::telemetry::DZDTelemetryProcessor, + settings, +}; +use serde_json::Value; + +fn load_test_data() -> Result { + let data_path = Path::new("tests/testnet_snapshot.json"); + let json = fs::read_to_string(data_path)?; + let mut data: Value = serde_json::from_str(&json)?; + apply_json_compat_migrations(&mut data); + + // Parse the JSON into FetchData + let fetch_data: FetchData = serde_json::from_value(data)?; + Ok(fetch_data) +} + +fn create_expected_results() -> HashMap<(String, String), ExpectedLink> { + let mut expected = HashMap::new(); + + // These are the exact P95 values from the private links output using R type 7 quantile + expected.insert( + ("lon-dz001".to_string(), "sin-dz001".to_string()), + ExpectedLink { + latency_ms: 154.520, + bandwidth_mbps: 10000.0, + uptime: 0.9968580219, // raw true_uptime; penalty applied inside network-shapley-rs + }, + ); + + // Dead link fra-dz001 -> fra-dz-001-x is filtered out + + expected.insert( + ("ams-dz001".to_string(), "lon-dz001".to_string()), + ExpectedLink { + latency_ms: 5.804, + bandwidth_mbps: 10000.0, + uptime: 1.0, + }, + ); + + expected.insert( + ("sin-dz001".to_string(), "tyo-dz001".to_string()), + ExpectedLink { + latency_ms: 67.249, + bandwidth_mbps: 10000.0, + uptime: 1.0, + }, + ); + + expected.insert( + ("lax-dz001".to_string(), "nyc-dz001".to_string()), + ExpectedLink { + latency_ms: 68.448, + bandwidth_mbps: 10000.0, + uptime: 1.0, + }, + ); + + expected.insert( + ("nyc-dz001".to_string(), "lon-dz001".to_string()), + ExpectedLink { + latency_ms: 67.337, + bandwidth_mbps: 10000.0, + uptime: 1.0, + }, + ); + + // Dead link fra-dz-001-x -> prg-dz-001-x is filtered out + + expected.insert( + ("lon-dz001".to_string(), "fra-dz001".to_string()), + ExpectedLink { + latency_ms: 11.092, + bandwidth_mbps: 10000.0, + uptime: 1.0, + }, + ); + + expected.insert( + ("tyo-dz001".to_string(), "lax-dz001".to_string()), + ExpectedLink { + latency_ms: 98.787, + bandwidth_mbps: 10000.0, + uptime: 1.0, + }, + ); + + expected +} + +fn test_settings() -> settings::Settings { + // Create test settings with testnet network + settings::Settings { + log_level: "info".to_string(), + network: settings::network::Network::Testnet, + shapley: settings::ShapleySettings { + operator_uptime: 0.98, + contiguity_bonus: 5.0, + demand_multiplier: 1.2, + }, + demand: settings::DemandSettings::default(), + input: settings::InputSettings::default(), + rpc: settings::RpcSettings { + dz_url: "https://test.com".to_string(), + solana_read_url: "https://test.com".to_string(), + solana_write_url: "https://test.com".to_string(), + commitment: "confirmed".to_string(), + rps_limit: 10, + }, + programs: settings::ProgramSettings { + serviceability_program_id: "test".to_string(), + telemetry_program_id: "test".to_string(), + }, + prefixes: settings::PrefixSettings { + device_telemetry: "device".to_string(), + internet_telemetry: "internet".to_string(), + contributor_rewards: "rewards".to_string(), + reward_input: "input".to_string(), + }, + inet_lookback: settings::InetLookbackSettings { + min_coverage_threshold: 0.8, + max_epochs_lookback: 5, + min_samples_per_link: 20, + enable_accumulator: true, + dedup_window_us: 10000000, + }, + telemetry_defaults: settings::TelemetryDefaultSettings { + missing_data_threshold: 0.7, + private_default_latency_ms: 1000.0, + enable_previous_epoch_lookup: true, + }, + scheduler: settings::SchedulerSettings { + interval_seconds: 300, + state_file: "/var/lib/doublezero-contributor-rewards/scheduler.state".to_string(), + snapshot_dir: "/tmp/snapshots".to_string(), + enable_dry_run: false, + storage_backend: settings::aws::StorageBackend::LocalFile, + grace_period_max_wait_seconds: 21600, + }, + metrics: Some(settings::MetricsSettings { + addr: "127.0.0.1:9090".parse().unwrap(), + }), + aws: Some(settings::aws::AwsSettings { + region: "us-east-1".to_string(), + bucket: "dummy-bucket".to_string(), + access_key_id: "dummy-key".to_string(), + secret_access_key: "dummy-secret".to_string(), + endpoint: None, + }), + slack: None, + } +} + +#[derive(Debug, Clone)] +struct ExpectedLink { + latency_ms: f64, + bandwidth_mbps: f64, + uptime: f64, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_private_links_generation() -> Result<()> { + // Load test data from JSON file + let fetch_data = load_test_data()?; + println!( + "Loaded snapshot with {} devices, {} links", + fetch_data.dz_serviceability.devices.len(), + fetch_data.dz_serviceability.links.len() + ); + println!( + "Device telemetry samples: {}", + fetch_data.dz_telemetry.device_latency_samples.len() + ); + + // Test settings + let settings = test_settings(); + + // Process device telemetry to get stats + let telemetry_stats = DZDTelemetryProcessor::process(&fetch_data)?; + println!("Processed {} device telemetry stats", telemetry_stats.len()); + + // Build devices to obtain the shapley device identifiers and mapping back to original codes + let (devices, device_ids) = build_devices(&fetch_data, &settings.network)?; + println!("Constructed {} shapley device identifiers", devices.len()); + + let mut shapley_to_original: HashMap = HashMap::new(); + for (device_pk, shapley_id) in device_ids.iter() { + if let Some(device) = fetch_data.dz_serviceability.devices.get(device_pk) { + shapley_to_original.insert(shapley_id.clone(), device.code.clone()); + } + } + + // Generate private links + let private_links = build_private_links(&fetch_data, &device_ids); + + // Print results for verification + println!("\nPrivate Links Generated:"); + println!( + "{:<20} | {:<20} | {:>12} | {:>12} | {:>8}", + "device1", "device2", "latency(ms)", "bandwidth(Mbps)", "uptime" + ); + println!("{:-<85}", ""); + for link in &private_links { + println!( + "{:<20} | {:<20} | {:>12.3} | {:>12.1} | {:>8.4}", + link.device1, link.device2, link.latency, link.bandwidth, link.uptime + ); + } + + // Verify we have at least some private links + assert!(!private_links.is_empty(), "No private links were generated"); + + // Verify reasonable values for all links + for link in &private_links { + // Latency should be non-negative and reasonable (<= 1000ms, where 1000ms is the default for non-optimal links) + assert!( + link.latency >= 0.0 && link.latency <= 1000.0, + "Unreasonable latency value for {} -> {}: {}", + link.device1, + link.device2, + link.latency + ); + + // Bandwidth should be positive + assert!( + link.bandwidth > 0.0, + "Invalid bandwidth for {} -> {}: {}", + link.device1, + link.device2, + link.bandwidth + ); + + // Uptime should be between 0 and 1 + assert!( + link.uptime >= 0.0 && link.uptime <= 1.0, + "Invalid uptime for {} -> {}: {}", + link.device1, + link.device2, + link.uptime + ); + } + + // Get expected results + let expected = create_expected_results(); + + // Create a map from private_links for easier comparison + let mut result_map: HashMap<(String, String), (f64, f64, f64)> = HashMap::new(); + for link in &private_links { + let device1 = shapley_to_original + .get(&link.device1) + .cloned() + .unwrap_or_else(|| link.device1.clone()); + let device2 = shapley_to_original + .get(&link.device2) + .cloned() + .unwrap_or_else(|| link.device2.clone()); + result_map.insert( + (device1, device2), + (link.latency, link.bandwidth, link.uptime), + ); + } + + // Verify all expected links exist with exact values + for ((device1, device2), expected_link) in expected.iter() { + let actual = result_map.get(&(device1.clone(), device2.clone())); + assert!( + actual.is_some(), + "Missing expected link: {device1} -> {device2}", + ); + + let (actual_latency, actual_bandwidth, actual_uptime) = actual.unwrap(); + + println!("\nChecking link {device1} -> {device2}:"); + println!( + " Latency: expected {:.6}ms, got {:.6}ms", + expected_link.latency_ms, actual_latency + ); + println!( + " Bandwidth: expected {:.1}Mbps, got {:.1}Mbps", + expected_link.bandwidth_mbps, actual_bandwidth + ); + println!( + " Uptime: expected {:.10}, got {:.10}", + expected_link.uptime, actual_uptime + ); + + // Check latency with tolerance for floating point precision + let latency_diff = (actual_latency - expected_link.latency_ms).abs(); + assert!( + latency_diff < 0.01, + "Latency mismatch for {} -> {}: got {}, expected {}", + device1, + device2, + actual_latency, + expected_link.latency_ms + ); + + // Bandwidth should be exact + assert_eq!( + *actual_bandwidth, expected_link.bandwidth_mbps, + "Bandwidth mismatch for {device1} -> {device2}", + ); + + // Check uptime with tolerance for floating point precision + let uptime_diff = (actual_uptime - expected_link.uptime).abs(); + assert!( + uptime_diff < 0.001, + "Uptime mismatch for {} -> {}: got {}, expected {}", + device1, + device2, + actual_uptime, + expected_link.uptime + ); + } + + Ok(()) + } + + #[test] + fn test_link_data_integrity() -> Result<()> { + let fetch_data = load_test_data()?; + + // Verify links reference valid devices + for link in fetch_data.dz_serviceability.links.values() { + // Check that both sides of the link reference valid devices + let side_a_exists = fetch_data + .dz_serviceability + .devices + .contains_key(&link.side_a_pk); + let side_z_exists = fetch_data + .dz_serviceability + .devices + .contains_key(&link.side_z_pk); + + if !side_a_exists || !side_z_exists { + println!( + "Link {} references missing device(s): side_a={}, side_z={}", + link.code, side_a_exists, side_z_exists + ); + } + + // Verify link has reasonable properties + assert!( + link.bandwidth > 0, + "Link {} has invalid bandwidth: {}", + link.code, + link.bandwidth + ); + + // Check link code format (should be device1:device2) + assert!( + link.code.contains(':'), + "Link code should contain ':' separator: {}", + link.code + ); + } + + // Verify telemetry samples reference valid devices + for sample in &fetch_data.dz_telemetry.device_latency_samples { + let origin_exists = fetch_data + .dz_serviceability + .devices + .contains_key(&sample.origin_device_pk); + let target_exists = fetch_data + .dz_serviceability + .devices + .contains_key(&sample.target_device_pk); + + if origin_exists && target_exists { + let origin_device = &fetch_data.dz_serviceability.devices[&sample.origin_device_pk]; + let target_device = &fetch_data.dz_serviceability.devices[&sample.target_device_pk]; + println!( + "Valid telemetry sample: {} -> {} (link: {})", + origin_device.code, + target_device.code, + fetch_data + .dz_serviceability + .links + .get(&sample.link_pk) + .map(|l| l.code.as_str()) + .unwrap_or("unknown") + ); + } + } + + Ok(()) + } + + #[test] + fn test_bandwidth_conversion() { + // Test that bandwidth conversion from bits/sec to Gbps is correct + let bits_per_sec = 10_000_000_000_u64; // 10 Gbps in bits/sec + let gbps = bits_per_sec as f64 / 1_000_000_000.0; + assert_eq!(gbps, 10.0, "10 Gbps conversion failed"); + + let bits_per_sec = 1_000_000_000_u64; // 1 Gbps in bits/sec + let gbps = bits_per_sec as f64 / 1_000_000_000.0; + assert_eq!(gbps, 1.0, "1 Gbps conversion failed"); + + let bits_per_sec = 100_000_000_000_u64; // 100 Gbps in bits/sec + let gbps = bits_per_sec as f64 / 1_000_000_000.0; + assert_eq!(gbps, 100.0, "100 Gbps conversion failed"); + } + + #[test] + fn test_uptime_calculation() { + // Test uptime calculation logic + // Uptime should be between 0.0 and 1.0 + + // Perfect uptime + let total_time_ms = 1000.0; + let downtime_ms = 0.0; + let uptime = (total_time_ms - downtime_ms) / total_time_ms; + assert_eq!(uptime, 1.0, "Perfect uptime should be 1.0"); + + // 50% uptime + let total_time_ms = 1000.0; + let downtime_ms = 500.0; + let uptime = (total_time_ms - downtime_ms) / total_time_ms; + assert_eq!(uptime, 0.5, "50% uptime calculation failed"); + + // 99.9% uptime (three nines) + let total_time_ms = 1000.0; + let downtime_ms = 1.0; + let uptime = (total_time_ms - downtime_ms) / total_time_ms; + assert!( + (uptime - 0.999_f64).abs() < 0.0001, + "99.9% uptime calculation failed" + ); + } +} diff --git a/offchain/crates/contributor-rewards/tests/test_s3_storage.rs b/offchain/crates/contributor-rewards/tests/test_s3_storage.rs new file mode 100644 index 0000000000..eeb53c1098 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/test_s3_storage.rs @@ -0,0 +1,216 @@ +// Integration test for S3 storage with minio +// This test requires minio to be running on localhost:9000 + +use doublezero_contributor_rewards::{ + cli::snapshot::{CompleteSnapshot, SnapshotMetadata}, + ingestor::types::FetchData, + settings::{ + DemandSettings, InputSettings, Settings, + aws::{AwsSettings, StorageBackend}, + network::Network, + }, + storage::create_storage, +}; + +/// Helper function to create dummy AWS settings for tests that don't use S3 +fn create_dummy_aws_settings() -> Option { + Some(AwsSettings { + region: "us-east-1".to_string(), + bucket: "dummy-bucket".to_string(), + access_key_id: "dummy-key".to_string(), + secret_access_key: "dummy-secret".to_string(), + endpoint: None, + }) +} + +/// Helper function to create test settings with configurable storage backend +fn create_test_settings( + storage_backend: StorageBackend, + snapshot_dir: String, + aws: Option, +) -> Settings { + Settings { + log_level: "info".to_string(), + network: Network::Testnet, + scheduler: doublezero_contributor_rewards::settings::SchedulerSettings { + interval_seconds: 300, + state_file: "/tmp/test.state".to_string(), + snapshot_dir, + enable_dry_run: false, + storage_backend, + grace_period_max_wait_seconds: 21600, + }, + aws, + shapley: doublezero_contributor_rewards::settings::ShapleySettings { + operator_uptime: 0.98, + contiguity_bonus: 5.0, + demand_multiplier: 1.2, + }, + demand: DemandSettings::default(), + input: InputSettings::default(), + rpc: doublezero_contributor_rewards::settings::RpcSettings { + dz_url: "https://test.com".to_string(), + solana_read_url: "https://test.com".to_string(), + solana_write_url: "https://test.com".to_string(), + commitment: "confirmed".to_string(), + rps_limit: 10, + }, + programs: doublezero_contributor_rewards::settings::ProgramSettings { + serviceability_program_id: "test".to_string(), + telemetry_program_id: "test".to_string(), + }, + prefixes: doublezero_contributor_rewards::settings::PrefixSettings { + device_telemetry: "device".to_string(), + internet_telemetry: "internet".to_string(), + contributor_rewards: "rewards".to_string(), + reward_input: "input".to_string(), + }, + inet_lookback: doublezero_contributor_rewards::settings::InetLookbackSettings { + min_coverage_threshold: 0.8, + max_epochs_lookback: 5, + min_samples_per_link: 20, + enable_accumulator: true, + dedup_window_us: 10000000, + }, + telemetry_defaults: doublezero_contributor_rewards::settings::TelemetryDefaultSettings { + missing_data_threshold: 0.7, + private_default_latency_ms: 1000.0, + enable_previous_epoch_lookup: true, + }, + metrics: None, + slack: None, + } +} + +#[tokio::test] +#[ignore] // Ignored by default, run with: cargo test --test test_s3_storage -- --ignored --include-ignored +async fn test_s3_upload_to_minio() { + // Create minimal test settings for S3 storage with minio + let aws_config = Some(AwsSettings { + region: "us-east-1".to_string(), + bucket: "doublezero-contributor-rewards-testnet-snapshots".to_string(), + access_key_id: "minioadmin".to_string(), + secret_access_key: "minioadmin".to_string(), + endpoint: Some("http://localhost:9000".to_string()), + }); + + let settings = + create_test_settings(StorageBackend::S3, "/tmp/snapshots".to_string(), aws_config); + + // Create storage backend + let storage = create_storage(&settings) + .await + .expect("Failed to create storage"); + + assert_eq!(storage.storage_type(), "S3"); + + // Create a minimal test snapshot + let snapshot = CompleteSnapshot { + dz_epoch: 999, + solana_epoch: Some(1000), + fetch_data: FetchData::default(), + leader_schedule: None, + metadata: SnapshotMetadata { + created_at: chrono::Utc::now().to_rfc3339(), + network: "Testnet".to_string(), + exchanges_count: 0, + locations_count: 0, + devices_count: 0, + internet_samples_count: 0, + device_samples_count: 0, + }, + }; + + let filename = "test-snapshot-epoch-999.json"; + + // Test save + let location = storage + .save(&snapshot, filename) + .await + .expect("Failed to save snapshot to S3"); + + println!("Snapshot saved to: {}", location); + assert!(location.starts_with("https://") || location.starts_with("http://")); + + // Test exists + let exists = storage + .exists(filename) + .await + .expect("Failed to check existence"); + assert!(exists, "Snapshot should exist after upload"); + + // Test load + let loaded = storage + .load(filename) + .await + .expect("Failed to load snapshot"); + assert_eq!(loaded.dz_epoch, snapshot.dz_epoch); + assert_eq!(loaded.solana_epoch, snapshot.solana_epoch); + assert_eq!(loaded.metadata.network, snapshot.metadata.network); + + println!("✓ S3 storage test passed - minio integration working!"); +} + +#[tokio::test] +async fn test_local_file_storage() { + use tempfile::TempDir; + + let temp_dir = TempDir::new().expect("Failed to create temp dir"); + + let settings = create_test_settings( + StorageBackend::LocalFile, + temp_dir.path().to_string_lossy().to_string(), + create_dummy_aws_settings(), + ); + + let storage = create_storage(&settings) + .await + .expect("Failed to create storage"); + + assert_eq!(storage.storage_type(), "LocalFile"); + + // Create a minimal test snapshot + let snapshot = CompleteSnapshot { + dz_epoch: 888, + solana_epoch: Some(900), + fetch_data: FetchData::default(), + leader_schedule: None, + metadata: SnapshotMetadata { + created_at: chrono::Utc::now().to_rfc3339(), + network: "Testnet".to_string(), + exchanges_count: 0, + locations_count: 0, + devices_count: 0, + internet_samples_count: 0, + device_samples_count: 0, + }, + }; + + let filename = "test-local-snapshot-epoch-888.json"; + + // Test save + let location = storage + .save(&snapshot, filename) + .await + .expect("Failed to save snapshot locally"); + + println!("Snapshot saved to: {}", location); + assert!(location.contains(filename)); + + // Test exists + let exists = storage + .exists(filename) + .await + .expect("Failed to check existence"); + assert!(exists, "Snapshot should exist after save"); + + // Test load + let loaded = storage + .load(filename) + .await + .expect("Failed to load snapshot"); + assert_eq!(loaded.dz_epoch, snapshot.dz_epoch); + assert_eq!(loaded.solana_epoch, snapshot.solana_epoch); + + println!("✓ Local file storage test passed!"); +} diff --git a/offchain/crates/contributor-rewards/tests/test_sanity.rs b/offchain/crates/contributor-rewards/tests/test_sanity.rs new file mode 100644 index 0000000000..063c82b27a --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/test_sanity.rs @@ -0,0 +1,145 @@ +#[cfg(test)] +mod tests { + use std::{collections::BTreeMap, fs, path::PathBuf}; + + use anyhow::Result; + use doublezero_contributor_rewards::{ + calculator::keypair_loader::load_keypair, + processor::{internet::InternetTelemetryStatMap, telemetry::DZDTelemetryStatMap}, + }; + use tempfile::TempDir; + + #[test] + fn test_keypair_cli_takes_precedence() -> Result<()> { + // Create a temporary directory and keypair file + let temp_dir = TempDir::new()?; + let keypair_path = temp_dir.path().join("test_keypair.json"); + + // Create a valid test keypair + let test_keypair = solana_sdk::signature::Keypair::new(); + let keypair_bytes = test_keypair.to_bytes(); + fs::write( + &keypair_path, + serde_json::to_string(&keypair_bytes.to_vec())?, + )?; + + // Set env var to a different path + unsafe { + std::env::set_var("REWARDER_KEYPAIR_PATH", "/some/other/path"); + } + + // CLI path should take precedence + let result = load_keypair(&Some(keypair_path)); + assert!(result.is_ok()); + + // Clean up + unsafe { + std::env::remove_var("REWARDER_KEYPAIR_PATH"); + } + Ok(()) + } + + #[test] + fn test_keypair_env_fallback() -> Result<()> { + // Create a temporary directory and keypair file + let temp_dir = TempDir::new()?; + let keypair_path = temp_dir.path().join("test_keypair.json"); + + // Create a valid test keypair + let test_keypair = solana_sdk::signature::Keypair::new(); + let keypair_bytes = test_keypair.to_bytes(); + fs::write( + &keypair_path, + serde_json::to_string(&keypair_bytes.to_vec())?, + )?; + + // Set env var + unsafe { + std::env::set_var("REWARDER_KEYPAIR_PATH", keypair_path.to_str().unwrap()); + } + + // Should use env var when no CLI path provided + let result = load_keypair(&None); + assert!(result.is_ok()); + + // Clean up + unsafe { + std::env::remove_var("REWARDER_KEYPAIR_PATH"); + } + Ok(()) + } + + #[test] + fn test_keypair_not_provided_error() { + // Ensure no env var is set + unsafe { + std::env::remove_var("REWARDER_KEYPAIR_PATH"); + } + + // Should return NotProvided error + let result = load_keypair(&None); + assert!(result.is_err()); + + let err = result.unwrap_err(); + assert!(err.to_string().contains("Keypair not provided")); + } + + #[test] + fn test_keypair_file_not_found() { + let non_existent_path = PathBuf::from("/non/existent/keypair.json"); + + let result = load_keypair(&Some(non_existent_path)); + assert!(result.is_err()); + + let err = result.unwrap_err(); + assert!(err.to_string().contains("Keypair file not found")); + } + + #[test] + fn test_keypair_invalid_format() -> Result<()> { + // Create a temporary directory and invalid keypair file + let temp_dir = TempDir::new()?; + let keypair_path = temp_dir.path().join("invalid_keypair.json"); + + // Write invalid JSON + fs::write(&keypair_path, "not valid json")?; + + let result = load_keypair(&Some(keypair_path)); + assert!(result.is_err()); + + let err = result.unwrap_err(); + assert!(err.to_string().contains("Invalid keypair format")); + + Ok(()) + } + + #[test] + fn test_borsh_serialization_dzd_telemetry() { + // Create an empty test telemetry map + let stat_map: DZDTelemetryStatMap = BTreeMap::new(); + + // Serialize + let serialized = borsh::to_vec(&stat_map).unwrap(); + + // Deserialize + let deserialized: DZDTelemetryStatMap = borsh::from_slice(&serialized).unwrap(); + + // Check round-trip - just verify it deserializes correctly + assert_eq!(stat_map.len(), deserialized.len()); + } + + #[test] + fn test_borsh_serialization_internet_telemetry() { + // Create an empty test telemetry map + let stat_map: InternetTelemetryStatMap = BTreeMap::new(); + + // Serialize + let serialized = borsh::to_vec(&stat_map).unwrap(); + + // Deserialize + let deserialized: InternetTelemetryStatMap = borsh::from_slice(&serialized).unwrap(); + + // Check round-trip - just verify it deserializes correctly + assert_eq!(stat_map.len(), deserialized.len()); + } +} diff --git a/offchain/crates/contributor-rewards/tests/test_scheduler.rs b/offchain/crates/contributor-rewards/tests/test_scheduler.rs new file mode 100644 index 0000000000..61042cc556 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/test_scheduler.rs @@ -0,0 +1,226 @@ +#[cfg(test)] +mod tests { + use std::fs; + + use doublezero_contributor_rewards::scheduler::SchedulerState; + use tempfile::TempDir; + + #[test] + fn test_worker_state_persistence() { + let temp_dir = TempDir::new().unwrap(); + let state_file = temp_dir.path().join("test.state"); + + // Create and save state + let mut state = SchedulerState::default(); + state.mark_success(100); + state.save(&state_file).unwrap(); + + // Load state and verify + let loaded_state = SchedulerState::load_or_default(&state_file).unwrap(); + assert_eq!(loaded_state.last_processed_epoch, Some(100)); + assert_eq!(loaded_state.consecutive_failures, 0); + } + + #[test] + fn test_should_process_epoch() { + let mut state = SchedulerState::default(); + + // Should process when no epoch has been processed + assert!(state.should_process_epoch(1)); + + // Mark epoch 5 as processed + state.mark_success(5); + + // Should not process epochs <= 5 + assert!(!state.should_process_epoch(5)); + assert!(!state.should_process_epoch(4)); + + // Should process epochs > 5 + assert!(state.should_process_epoch(6)); + assert!(state.should_process_epoch(10)); + } + + #[test] + fn test_failure_tracking() { + let mut state = SchedulerState::default(); + + // Initially no failures + assert_eq!(state.consecutive_failures, 0); + assert!(!state.is_in_failure_state(5)); + + // Track failures + state.mark_failure(); + assert_eq!(state.consecutive_failures, 1); + + state.mark_failure(); + assert_eq!(state.consecutive_failures, 2); + + // Check failure state + assert!(!state.is_in_failure_state(3)); + assert!(state.is_in_failure_state(2)); // Exactly at threshold + + // Success resets failures + state.mark_success(10); + assert_eq!(state.consecutive_failures, 0); + assert!(!state.is_in_failure_state(1)); + } + + #[test] + fn test_state_file_creation() { + let temp_dir = TempDir::new().unwrap(); + let non_existent_path = temp_dir.path().join("subdir").join("state.json"); + + // Should create parent directories + let mut state = SchedulerState::default(); + state.mark_success(42); + state.save(&non_existent_path).unwrap(); + + // Verify file was created and can be loaded + assert!(non_existent_path.exists()); + let loaded = SchedulerState::load_or_default(&non_existent_path).unwrap(); + assert_eq!(loaded.last_processed_epoch, Some(42)); + } + + /// Test state corruption recovery - creates backup and returns default + #[test] + fn test_state_corruption_recovery() { + let temp_dir = TempDir::new().unwrap(); + let state_file = temp_dir.path().join("corrupted.state"); + + // Write corrupted JSON + fs::write(&state_file, "{ this is not valid json }").unwrap(); + + // Should recover by returning default state + let state = SchedulerState::load_or_default(&state_file).unwrap(); + assert!(state.last_processed_epoch.is_none()); + assert_eq!(state.consecutive_failures, 0); + + // Should have created a backup file + let backup_path = state_file.with_extension("state.backup"); + assert!(backup_path.exists()); + } + + /// Test atomic save pattern (uses temp file + rename) + #[test] + fn test_atomic_save_pattern() { + let temp_dir = TempDir::new().unwrap(); + let state_file = temp_dir.path().join("atomic.state"); + + let mut state = SchedulerState::default(); + state.mark_success(50); + state.save(&state_file).unwrap(); + + // Temp file should not exist after save completes + let temp_path = state_file.with_extension("state.tmp"); + assert!(!temp_path.exists()); + + // Main file should exist with correct content + assert!(state_file.exists()); + let loaded = SchedulerState::load_or_default(&state_file).unwrap(); + assert_eq!(loaded.last_processed_epoch, Some(50)); + } + + /// Test mark_check updates last_check_time + #[test] + fn test_mark_check() { + let mut state = SchedulerState::default(); + let initial_check_time = state.last_check_time; + + // Small delay to ensure time difference + std::thread::sleep(std::time::Duration::from_millis(10)); + + state.mark_check(); + + // Check time should have been updated + assert!(state.last_check_time > initial_check_time); + } + + /// Test mark_snapshot_created + #[test] + fn test_mark_snapshot_created() { + let mut state = SchedulerState::default(); + assert!(state.last_snapshot_location.is_none()); + + state.mark_snapshot_created(42, "s3://bucket/snapshot-42.json".to_string()); + + assert_eq!( + state.last_snapshot_location, + Some("s3://bucket/snapshot-42.json".to_string()) + ); + } + + /// Test success updates last_success_time + #[test] + fn test_success_updates_time() { + let mut state = SchedulerState::default(); + assert!(state.last_success_time.is_none()); + + state.mark_success(100); + + assert!(state.last_success_time.is_some()); + let success_time = state.last_success_time.unwrap(); + let now = chrono::Utc::now(); + let diff = (now - success_time).num_seconds().abs(); + assert!(diff < 5, "last_success_time should be close to now"); + } + + /// Test multiple failures accumulate + #[test] + fn test_multiple_failures_accumulate() { + let mut state = SchedulerState::default(); + + for i in 1..=10 { + state.mark_failure(); + assert_eq!(state.consecutive_failures, i); + } + + // 10 consecutive failures + assert!(state.is_in_failure_state(10)); + assert!(state.is_in_failure_state(5)); + assert!(!state.is_in_failure_state(11)); + } + + /// Test that save creates valid JSON + #[test] + fn test_save_creates_valid_json() { + let temp_dir = TempDir::new().unwrap(); + let state_file = temp_dir.path().join("json.state"); + + let mut state = SchedulerState::default(); + state.mark_success(100); + state.mark_snapshot_created(100, "s3://bucket/snapshot-100.json".to_string()); + state.save(&state_file).unwrap(); + + // Read raw file and verify it's valid JSON + let contents = fs::read_to_string(&state_file).unwrap(); + let parsed: serde_json::Value = serde_json::from_str(&contents).unwrap(); + + let obj = &parsed.as_object(); + + let mut state_keys: Vec<&String> = obj.unwrap().keys().collect(); + state_keys.sort(); + // make sure the keys don't change unexpectedly + assert_eq!( + state_keys, + [ + "consecutive_distribution_failures", + "consecutive_failures", + "last_check_time", + "last_distributed_epoch", + "last_processed_epoch", + "last_snapshot_location", + "last_success_time" + ] + ); + + // make sure we have values + assert_eq!(parsed["last_processed_epoch"], 100); + assert_eq!(parsed["consecutive_failures"], 0); + assert_eq!( + parsed["last_snapshot_location"], + "s3://bucket/snapshot-100.json" + ); + assert!(parsed["last_check_time"].is_string()); + assert!(parsed["last_success_time"].is_string()); + } +} diff --git a/offchain/crates/contributor-rewards/tests/test_shapley_golden.rs b/offchain/crates/contributor-rewards/tests/test_shapley_golden.rs new file mode 100644 index 0000000000..1a66b2f2a1 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/test_shapley_golden.rs @@ -0,0 +1,236 @@ +mod common; + +use std::{ + collections::{BTreeMap, HashMap}, + fs, + path::{Path, PathBuf}, +}; + +use anyhow::{Context, Result}; +use common::create_test_settings; +use doublezero_contributor_rewards::{ + calculator::{data_prep::PreparedData, shapley::evaluator::compute_shapley_values}, + cli::snapshot::CompleteSnapshot, + settings::network::Network, +}; +use serde::{Deserialize, Serialize}; + +// Exact float equality is avoided on purpose. The computation is deterministic on +// one machine, but bit-identical floating point across architectures is not +// guaranteed, so a golden generated on arm64 could differ in the last bit from +// x86_64 CI. A dependency change that alters reward math moves values far more +// than this tolerance. A last-bit difference does not. +const RELATIVE_TOLERANCE: f64 = 1e-12; + +// Values below this carry no reward information. They are cancellation noise from +// the Shapley computation, and pinning them at a 1e-12 absolute gate would make the +// test fail on floating point differences that mean nothing. A real regression moves +// these entries to the hundreds, not to 1e-12. +const NEGLIGIBLE: f64 = 1e-6; + +const FIXTURE: &str = "tests/goldens/mainnet-beta-epoch-129-trimmed.json"; + +fn assert_close(label: &str, actual: f64, expected: f64) { + if actual.abs() < NEGLIGIBLE && expected.abs() < NEGLIGIBLE { + return; + } + let difference = (actual - expected).abs(); + let scale = expected.abs().max(actual.abs()).max(1.0); + assert!( + difference / scale <= RELATIVE_TOLERANCE, + "{label}: {actual} differs from golden {expected} by {difference} (relative {})", + difference / scale + ); +} + +fn golden_path(name: &str) -> PathBuf { + Path::new("tests/goldens").join(name) +} + +// Set UPDATE_GOLDEN=1 to rewrite the golden files instead of comparing against them. +fn regenerating() -> bool { + std::env::var("UPDATE_GOLDEN").as_deref() == Ok("1") +} + +/// Run the committed fixture through the production snapshot path. +/// +/// `PreparedData::from_snapshot` is what `Orchestrator::calculate_rewards` calls for +/// the snapshot case, so this exercises the real assembly rather than a copy of it. +/// Everything past `compute_shapley_values` is async and reads from RPC, so this is +/// the deepest point a test can reach offline. +fn compute_from_fixture() +-> Result { + // create_test_settings hardcodes Testnet. The fixture is mainnet-beta, and + // build_devices derives city codes on a different branch per network, so + // leaving this as Testnet mis-maps every city. + let mut settings = create_test_settings(0.7, 1000.0, false); + settings.network = Network::MainnetBeta; + + let snapshot = CompleteSnapshot::load_from_file(Path::new(FIXTURE)) + .with_context(|| format!("loading {FIXTURE}"))?; + let prepared = PreparedData::from_snapshot(&snapshot, &settings, true)?; + let inputs = prepared + .shapley_inputs + .context("from_snapshot returned no shapley inputs despite require_shapley")?; + compute_shapley_values(&inputs, &settings.shapley, &HashMap::new()) +} + +#[derive(Debug, Serialize, Deserialize)] +struct GoldenOperator { + operator: String, + value: f64, + proportion: f64, +} + +#[derive(Debug, Serialize, Deserialize)] +struct AggregatedGolden { + operator_count: usize, + // Ordered as `aggregated_output` iterates, which is BTreeMap order. + operators: Vec, +} + +#[test] +fn test_aggregated_shapley_output_matches_golden() -> Result<()> { + let result = compute_from_fixture()?; + + let operators = result + .aggregated_output + .iter() + .map(|(operator, aggregated)| GoldenOperator { + operator: operator.clone(), + value: aggregated.value, + proportion: aggregated.proportion, + }) + .collect::>(); + let actual = AggregatedGolden { + operator_count: operators.len(), + operators, + }; + + let path = golden_path("shapley-mainnet-beta-epoch-129.json"); + + if regenerating() { + fs::write( + &path, + format!("{}\n", serde_json::to_string_pretty(&actual)?), + )?; + eprintln!("wrote golden {}", path.display()); + return Ok(()); + } + + let golden_json = fs::read_to_string(&path).with_context(|| { + format!( + "reading {}. Generate it with UPDATE_GOLDEN=1", + path.display() + ) + })?; + let expected = serde_json::from_str::(&golden_json)?; + + // Structure is asserted exactly. Only the numbers get a tolerance. + assert_eq!( + actual.operator_count, expected.operator_count, + "operator count changed" + ); + let actual_operators = actual + .operators + .iter() + .map(|entry| entry.operator.as_str()) + .collect::>(); + let expected_operators = expected + .operators + .iter() + .map(|entry| entry.operator.as_str()) + .collect::>(); + assert_eq!( + actual_operators, expected_operators, + "operator set or ordering changed" + ); + + for (actual_entry, expected_entry) in actual.operators.iter().zip(expected.operators.iter()) { + assert_close( + &format!("{} value", actual_entry.operator), + actual_entry.value, + expected_entry.value, + ); + assert_close( + &format!("{} proportion", actual_entry.operator), + actual_entry.proportion, + expected_entry.proportion, + ); + } + Ok(()) +} + +#[derive(Debug, Serialize, Deserialize)] +struct PerCityGolden { + city_count: usize, + // city -> [(operator, value)], in BTreeMap and Vec order as produced. + cities: BTreeMap>, +} + +#[test] +fn test_per_city_shapley_output_matches_golden() -> Result<()> { + let result = compute_from_fixture()?; + + let actual = PerCityGolden { + city_count: result.per_city_outputs.len(), + cities: result.per_city_outputs.clone(), + }; + + let path = golden_path("shapley-per-city-mainnet-beta-epoch-129.json"); + + if regenerating() { + fs::write( + &path, + format!("{}\n", serde_json::to_string_pretty(&actual)?), + )?; + eprintln!("wrote golden {}", path.display()); + return Ok(()); + } + + let golden_json = fs::read_to_string(&path).with_context(|| { + format!( + "reading {}. Generate it with UPDATE_GOLDEN=1", + path.display() + ) + })?; + let expected = serde_json::from_str::(&golden_json)?; + + assert_eq!(actual.city_count, expected.city_count, "city count changed"); + + let actual_cities = actual.cities.keys().collect::>(); + let expected_cities = expected.cities.keys().collect::>(); + assert_eq!( + actual_cities, expected_cities, + "city set or ordering changed" + ); + + for (city, actual_values) in actual.cities.iter() { + let expected_values = expected + .cities + .get(city) + .with_context(|| format!("city {city} missing from golden"))?; + let actual_operators = actual_values + .iter() + .map(|(operator, _)| operator) + .collect::>(); + let expected_operators = expected_values + .iter() + .map(|(operator, _)| operator) + .collect::>(); + assert_eq!( + actual_operators, expected_operators, + "{city}: operator set or ordering changed" + ); + for ((operator, actual_value), (_, expected_value)) in + actual_values.iter().zip(expected_values.iter()) + { + assert_close( + &format!("{city}/{operator}"), + *actual_value, + *expected_value, + ); + } + } + Ok(()) +} diff --git a/offchain/crates/contributor-rewards/tests/test_snapshot_validate.rs b/offchain/crates/contributor-rewards/tests/test_snapshot_validate.rs new file mode 100644 index 0000000000..be06266314 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/test_snapshot_validate.rs @@ -0,0 +1,81 @@ +use std::{fs, path::Path}; + +use anyhow::Result; +use doublezero_contributor_rewards::{ + cli::snapshot::{CompleteSnapshot, SnapshotMetadata}, + ingestor::{ + epoch::LeaderSchedule, + types::{FetchData, apply_json_compat_migrations}, + }, +}; +use serde_json::Value; + +// validate() is what both producers run before they save, so these pin the leader +// schedule checks it has to enforce. +fn load_snapshot(leader_schedule: Option) -> Result { + let mut data: Value = serde_json::from_str(&fs::read_to_string(Path::new( + "tests/testnet_snapshot.json", + ))?)?; + apply_json_compat_migrations(&mut data); + let fetch_data: FetchData = serde_json::from_value(data)?; + + let metadata = SnapshotMetadata { + created_at: "2026-01-01T00:00:00Z".to_string(), + network: "Testnet".to_string(), + exchanges_count: fetch_data.dz_serviceability.exchanges.len(), + locations_count: fetch_data.dz_serviceability.locations.len(), + devices_count: fetch_data.dz_serviceability.devices.len(), + internet_samples_count: fetch_data.dz_internet.internet_latency_samples.len(), + device_samples_count: fetch_data.dz_telemetry.device_latency_samples.len(), + }; + + Ok(CompleteSnapshot { + dz_epoch: 89, + solana_epoch: leader_schedule + .as_ref() + .map(|schedule| schedule.solana_epoch), + fetch_data, + leader_schedule, + metadata, + }) +} + +fn load_leader_schedule() -> Result { + let data: Value = serde_json::from_str(&fs::read_to_string(Path::new( + "tests/leader-schedule-epoch-89.json", + ))?)?; + Ok(serde_json::from_value(data)?) +} + +#[test] +fn test_validate_accepts_a_complete_snapshot() -> Result<()> { + let snapshot = load_snapshot(Some(load_leader_schedule()?))?; + + snapshot.validate()?; + + Ok(()) +} + +#[test] +fn test_validate_rejects_a_missing_leader_schedule() -> Result<()> { + let error = load_snapshot(None)?.validate().unwrap_err().to_string(); + + assert!(error.contains("Missing leader schedule"), "{error}"); + + Ok(()) +} + +#[test] +fn test_validate_rejects_an_empty_leader_schedule() -> Result<()> { + let mut schedule = load_leader_schedule()?; + schedule.schedule_map.clear(); + + let error = load_snapshot(Some(schedule))? + .validate() + .unwrap_err() + .to_string(); + + assert!(error.contains("Leader schedule is empty"), "{error}"); + + Ok(()) +} diff --git a/offchain/crates/contributor-rewards/tests/test_telemetry_defaults.rs b/offchain/crates/contributor-rewards/tests/test_telemetry_defaults.rs new file mode 100644 index 0000000000..5bfcd05c81 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/test_telemetry_defaults.rs @@ -0,0 +1,286 @@ +mod common; + +use common::create_test_settings; +use doublezero_contributor_rewards::{ + calculator::shapley::handler::PreviousEpochCache, + processor::{ + internet::{InternetTelemetryStatMap, InternetTelemetryStats}, + telemetry::{DZDTelemetryStatMap, DZDTelemetryStats}, + }, +}; +use solana_sdk::pubkey::Pubkey; + +/// Create mock telemetry stats with specified missing data ratio +fn create_mock_device_stats(circuit: &str, missing_ratio: f64) -> DZDTelemetryStats { + let total_samples = 100; + let loss_count = (missing_ratio * total_samples as f64).round() as u64; + let success_count = total_samples - loss_count as usize; + + DZDTelemetryStats { + circuit: circuit.to_string(), + link_pubkey: Pubkey::default(), + origin_device: Pubkey::default(), + target_device: Pubkey::default(), + rtt_mean_us: 5000.0, + rtt_median_us: 4500.0, + rtt_min_us: 1000.0, + rtt_max_us: 10000.0, + rtt_p90_us: 8500.0, + rtt_p95_us: 9000.0, + rtt_p99_us: 9900.0, + rtt_stddev_us: 1500.0, + jitter_ewma_us: 500.0, + avg_jitter_us: 500.0, + max_jitter_us: 1000.0, + packet_loss: missing_ratio * 100.0, + loss_count, + success_count: success_count as u64, + total_samples, + missing_data_ratio: missing_ratio, + } +} + +/// Create mock internet telemetry stats with specified missing data ratio +fn create_mock_internet_stats(circuit: &str, missing_ratio: f64) -> InternetTelemetryStats { + let total_samples = 100; + let loss_count = (missing_ratio * total_samples as f64).round() as u64; + let success_count = total_samples - loss_count as usize; + + InternetTelemetryStats { + circuit: circuit.to_string(), + origin_exchange_code: "orig".to_string(), + target_exchange_code: "targ".to_string(), + data_provider_name: "provider".to_string(), + oracle_agent_pk: Pubkey::default(), + origin_exchange_pk: Pubkey::default(), + target_exchange_pk: Pubkey::default(), + rtt_mean_us: 8000.0, + rtt_median_us: 7500.0, + rtt_min_us: 2000.0, + rtt_max_us: 15000.0, + rtt_p90_us: 13000.0, + rtt_p95_us: 14000.0, + rtt_p99_us: 14900.0, + rtt_stddev_us: 2500.0, + jitter_ewma_us: 800.0, + avg_jitter_us: 800.0, + max_jitter_us: 1600.0, + packet_loss: missing_ratio * 100.0, + loss_count, + success_count: success_count as u64, + total_samples, + missing_data_ratio: missing_ratio, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_missing_data_ratio_calculation() { + // Test that missing_data_ratio correctly represents the percentage of zero samples + let stats_80_percent_missing = create_mock_device_stats("test_circuit", 0.8); + assert_eq!(stats_80_percent_missing.missing_data_ratio, 0.8); + assert_eq!(stats_80_percent_missing.loss_count, 80); + assert_eq!(stats_80_percent_missing.success_count, 20); + + let stats_30_percent_missing = create_mock_device_stats("test_circuit", 0.3); + assert_eq!(stats_30_percent_missing.missing_data_ratio, 0.3); + assert_eq!(stats_30_percent_missing.loss_count, 30); + assert_eq!(stats_30_percent_missing.success_count, 70); + } + + #[test] + fn test_private_link_uses_default_when_above_threshold() { + // Test 1: Without previous epoch lookup + { + let settings = create_test_settings(0.7, 1000.0, false); + let mut telemetry_stats = DZDTelemetryStatMap::new(); + telemetry_stats.insert( + "device1->device2".to_string(), + create_mock_device_stats("device1->device2", 0.8), + ); + + let stats = telemetry_stats.get("device1->device2").unwrap(); + let should_use_default = + stats.missing_data_ratio > settings.telemetry_defaults.missing_data_threshold; + assert!(should_use_default); + + // Should use configured default since previous epoch lookup is disabled + let default_latency_us = + settings.telemetry_defaults.private_default_latency_ms * 1000.0; + assert_eq!(default_latency_us, 1_000_000.0); + } + + // Test 2: With previous epoch lookup enabled and data available + { + let mut cache = PreviousEpochCache::new(); + + // Add previous epoch data for this circuit + let mut prev_device_stats = DZDTelemetryStatMap::new(); + prev_device_stats.insert( + "device1->device2".to_string(), + create_mock_device_stats("device1->device2", 0.1), // Previous epoch had good data + ); + cache.device_stats = Some(prev_device_stats); + + // Should prefer previous epoch average (9000us P95) over default (1000ms) + let prev_avg = cache + .get_device_circuit_average("device1->device2") + .unwrap(); + assert_eq!(prev_avg, 9000.0); // Previous epoch P95 + } + + // Test 3: With previous epoch lookup enabled but no data available + { + let settings = create_test_settings(0.7, 1000.0, true); + let cache = PreviousEpochCache::new(); // Empty cache + + // Should fall back to configured default + let prev_avg = cache.get_device_circuit_average("device1->device2"); + assert!(prev_avg.is_none()); + + // Would use configured default (1000ms) + let default_latency_us = + settings.telemetry_defaults.private_default_latency_ms * 1000.0; + assert_eq!(default_latency_us, 1_000_000.0); + } + } + + #[test] + fn test_private_link_uses_actual_when_below_threshold() { + // Create settings with 70% threshold + let settings = create_test_settings(0.7, 1000.0, false); + + // Create mock telemetry stats with 30% missing data (below threshold) + let mut telemetry_stats = DZDTelemetryStatMap::new(); + telemetry_stats.insert( + "device1->device2".to_string(), + create_mock_device_stats("device1->device2", 0.3), + ); + + // Should use actual data since 30% < 70% threshold + let stats = telemetry_stats.get("device1->device2").unwrap(); + let should_use_default = + stats.missing_data_ratio > settings.telemetry_defaults.missing_data_threshold; + assert!(!should_use_default); + + if !should_use_default { + assert_eq!(stats.rtt_mean_us, 5000.0); // Use actual mean + } + } + + #[test] + fn test_public_link_previous_epoch_cache() { + // Test that PreviousEpochCache can store and retrieve both internet and device stats + let mut cache = PreviousEpochCache::new(); + + // Test 1: Internet stats retrieval + { + let mut prev_internet_stats = InternetTelemetryStatMap::new(); + prev_internet_stats.insert( + "circuit1".to_string(), + create_mock_internet_stats("circuit1", 0.2), + ); + cache.internet_stats = Some(prev_internet_stats); + + let avg = cache.get_internet_circuit_average("circuit1"); + assert!(avg.is_some()); + assert_eq!(avg.unwrap(), 8000.0); // The mean from mock stats + + let missing = cache.get_internet_circuit_average("non_existent"); + assert!(missing.is_none()); + } + + // Test 2: Device stats retrieval + { + let mut prev_device_stats = DZDTelemetryStatMap::new(); + prev_device_stats.insert( + "device1->device2".to_string(), + create_mock_device_stats("device1->device2", 0.1), + ); + cache.device_stats = Some(prev_device_stats); + + let avg = cache.get_device_circuit_average("device1->device2"); + assert!(avg.is_some()); + assert_eq!(avg.unwrap(), 9000.0); // The P95 from mock stats + + let missing = cache.get_device_circuit_average("device3->device4"); + assert!(missing.is_none()); + } + } + + #[test] + fn test_threshold_edge_cases() { + // Test exactly at threshold (should NOT use default) + let settings = create_test_settings(0.7, 1000.0, false); + let stats = create_mock_device_stats("test", 0.7); + let should_use_default = + stats.missing_data_ratio > settings.telemetry_defaults.missing_data_threshold; + assert!( + !should_use_default, + "Exactly at threshold should not trigger default" + ); + + // Test just above threshold (should use default) + let stats = create_mock_device_stats("test", 0.70001); + let should_use_default = + stats.missing_data_ratio > settings.telemetry_defaults.missing_data_threshold; + assert!( + should_use_default, + "Just above threshold should trigger default" + ); + + // Test 100% missing (should definitely use default) + let stats = create_mock_device_stats("test", 1.0); + let should_use_default = + stats.missing_data_ratio > settings.telemetry_defaults.missing_data_threshold; + assert!(should_use_default, "100% missing should trigger default"); + + // Test 0% missing (should not use default) + let stats = create_mock_device_stats("test", 0.0); + let should_use_default = + stats.missing_data_ratio > settings.telemetry_defaults.missing_data_threshold; + assert!(!should_use_default, "0% missing should not trigger default"); + } + + #[test] + fn test_configuration_validation() { + use doublezero_contributor_rewards::settings::validation::validate_config; + + // Valid configuration + let valid_settings = create_test_settings(0.7, 1000.0, true); + assert!(validate_config(&valid_settings).is_ok()); + + // Invalid threshold (> 1.0) + let mut invalid_settings = create_test_settings(1.5, 1000.0, true); + invalid_settings.telemetry_defaults.missing_data_threshold = 1.5; + assert!(validate_config(&invalid_settings).is_err()); + + // Invalid threshold (< 0.0) + let mut invalid_settings = create_test_settings(-0.1, 1000.0, true); + invalid_settings.telemetry_defaults.missing_data_threshold = -0.1; + assert!(validate_config(&invalid_settings).is_err()); + + // Invalid default latency (<= 0) + let mut invalid_settings = create_test_settings(0.7, -100.0, true); + invalid_settings + .telemetry_defaults + .private_default_latency_ms = -100.0; + assert!(validate_config(&invalid_settings).is_err()); + } + + #[test] + fn test_cache_initialization() { + // Test Default trait implementation + let cache = PreviousEpochCache::default(); + assert!(cache.internet_stats.is_none()); + assert!(cache.device_stats.is_none()); + + // Test new() method + let cache = PreviousEpochCache::new(); + assert!(cache.internet_stats.is_none()); + assert!(cache.device_stats.is_none()); + } +} diff --git a/offchain/crates/contributor-rewards/tests/testnet_snapshot.json b/offchain/crates/contributor-rewards/tests/testnet_snapshot.json new file mode 100644 index 0000000000..3983fe0cd9 --- /dev/null +++ b/offchain/crates/contributor-rewards/tests/testnet_snapshot.json @@ -0,0 +1,312581 @@ +{ + "dz_serviceability": { + "locations": { + "7vt8Tnbk15S6JA1uhRQVtbuL7w39zY8jeQ5iqgjsqLfP": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 3, + "bump_seed": 255, + "lat": 51.5139998039393, + "lng": -0.120147648430922, + "loc_id": 399, + "status": "Activated", + "code": "lon", + "name": "London", + "country": "UK", + "reference_count": 0 + }, + "8Crp8LgRPCapwdzQiFYeyNtwi8FVooCd9si1ujWwLuHQ": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 4, + "bump_seed": 255, + "lat": 52.30085793004, + "lng": 4.9422411400853, + "loc_id": 4627, + "status": "Activated", + "code": "ams", + "name": "Amsterdam", + "country": "US", + "reference_count": 0 + }, + "8ivCSPhAs6WwbWY5WR7GCQiChEVcK2kpoj97MugLPwcg": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 1, + "bump_seed": 255, + "lat": 34.0496412740764, + "lng": -118.259396424999, + "loc_id": 363, + "status": "Activated", + "code": "lax", + "name": "Los Angeles", + "country": "US", + "reference_count": 0 + }, + "9nJjrDoWWbzhqLka3oHYdj2W3vr2UzUCcjoeCEQ7mAai": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 6, + "bump_seed": 254, + "lat": 40.7802970717721, + "lng": -74.0720300349692, + "loc_id": 122, + "status": "Activated", + "code": "nyc", + "name": "New York", + "country": "US", + "reference_count": 0 + }, + "Aq174PC1QHQ17qv24NasQNjFRd7jdDPgPoYz1PVhJ1X5": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 7, + "bump_seed": 255, + "lat": 50.060164, + "lng": 14.4804031, + "loc_id": 214, + "status": "Activated", + "code": "prg", + "name": "Prague", + "country": "CZ", + "reference_count": 0 + }, + "CJsM8xrShT5YCR8VbaLKR3dDZMA24X9XkMeBKh6eH9z9": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 5, + "bump_seed": 255, + "lat": 35.6687514422876, + "lng": 139.765652675645, + "loc_id": 452, + "status": "Activated", + "code": "tyo", + "name": "Tokyo", + "country": "JP", + "reference_count": 0 + }, + "DJX3x93muX4Tnv2yG4aqLL3YntLurDKeR2SFZEF5qWRV": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 8, + "bump_seed": 253, + "lat": 1.28071507073903, + "lng": 103.855071361443, + "loc_id": 282, + "status": "Activated", + "code": "sin", + "name": "Singapore", + "country": "SG", + "reference_count": 0 + }, + "HiJWeiLKcw6tcBmdX65x1Hd1XtjkQXLgEpPBhfkW2qxw": { + "account_type": "Location", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 2, + "bump_seed": 255, + "lat": 50.1215356432098, + "lng": 8.64204711717509, + "loc_id": 457, + "status": "Activated", + "code": "fra", + "name": "Frankfurt", + "country": "DE", + "reference_count": 0 + } + }, + "exchanges": { + "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 12, + "bump_seed": 255, + "lat": 52.30085793004, + "lng": 4.9422411400853, + "loc_id": 4627, + "status": "Activated", + "code": "xams", + "name": "Amsterdam", + "reference_count": 0, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111", + "bgp_community": 0, + "unused": 0 + }, + "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 14, + "bump_seed": 251, + "lat": 40.7802970717721, + "lng": -74.0720300349692, + "loc_id": 122, + "status": "Activated", + "code": "xnyc", + "name": "New York", + "reference_count": 0, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111", + "bgp_community": 0, + "unused": 0 + }, + "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 10, + "bump_seed": 255, + "lat": 50.1215356432098, + "lng": 8.64204711717509, + "loc_id": 457, + "status": "Activated", + "code": "xfra", + "name": "Frankfurt", + "reference_count": 0, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111", + "bgp_community": 0, + "unused": 0 + }, + "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 11, + "bump_seed": 255, + "lat": 51.5139998039393, + "lng": -0.120147648430922, + "loc_id": 399, + "status": "Activated", + "code": "xlon", + "name": "London", + "reference_count": 0, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111", + "bgp_community": 0, + "unused": 0 + }, + "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 9, + "bump_seed": 254, + "lat": 34.0496412740764, + "lng": -118.259396424999, + "loc_id": 363, + "status": "Activated", + "code": "xlax", + "name": "Los Angeles", + "reference_count": 0, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111", + "bgp_community": 0, + "unused": 0 + }, + "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 13, + "bump_seed": 255, + "lat": 35.6687514422876, + "lng": 139.765652675645, + "loc_id": 452, + "status": "Activated", + "code": "xtyo", + "name": "Tokyo", + "reference_count": 0, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111", + "bgp_community": 0, + "unused": 0 + }, + "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 15, + "bump_seed": 252, + "lat": 50.060164, + "lng": 14.4804031, + "loc_id": 214, + "status": "Activated", + "code": "xprg", + "name": "Prague", + "reference_count": 0, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111", + "bgp_community": 0, + "unused": 0 + }, + "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7": { + "account_type": "Exchange", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 16, + "bump_seed": 255, + "lat": 1.28071507073903, + "lng": 103.855071361443, + "loc_id": 282, + "status": "Activated", + "code": "xsin", + "name": "Singapore", + "reference_count": 0, + "device1_pk": "11111111111111111111111111111111", + "device2_pk": "11111111111111111111111111111111", + "bgp_community": 0, + "unused": 0 + } + }, + "devices": { + "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs": { + "account_type": "Device", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 20, + "bump_seed": 255, + "location_pk": "HiJWeiLKcw6tcBmdX65x1Hd1XtjkQXLgEpPBhfkW2qxw", + "exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "device_type": "Edge", + "public_ip": "195.219.220.58", + "status": "Activated", + "code": "fra-dz001", + "dz_prefixes": [ + "195.219.221.64/27" + ], + "metrics_publisher_pk": "FawcUyUPosa6MkTsJhds4Wdy4qQvk1z4vcuMryJhrmBi", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.31/32", + "node_segment_idx": 9, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.38/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1004", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1004, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/11/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 54, + "users_count": 128, + "max_users": 128, + "device_health": "ReadyForUsers", + "desired_status": "Activated", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp": { + "account_type": "Device", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 17, + "bump_seed": 253, + "location_pk": "8Crp8LgRPCapwdzQiFYeyNtwi8FVooCd9si1ujWwLuHQ", + "exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "device_type": "Edge", + "public_ip": "195.219.138.50", + "status": "Activated", + "code": "ams-dz001", + "dz_prefixes": [ + "195.219.138.96/27" + ], + "metrics_publisher_pk": "HFNP25XgSPMqCZTMxScHfVsUkrZJgqdHS8drHf2xL897", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.30/32", + "node_segment_idx": 8, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.37/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1001", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1001, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 41, + "users_count": 82, + "max_users": 128, + "device_health": "ReadyForUsers", + "desired_status": "Activated", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU": { + "account_type": "Device", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 24, + "bump_seed": 255, + "location_pk": "CJsM8xrShT5YCR8VbaLKR3dDZMA24X9XkMeBKh6eH9z9", + "exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "device_type": "Edge", + "public_ip": "180.87.154.78", + "status": "Activated", + "code": "tyo-dz001", + "dz_prefixes": [ + "115.108.56.128/27" + ], + "metrics_publisher_pk": "qEkxzwaSExKenpUZJFhzGz98j4upY64u8n96KJjFiSp", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.36/32", + "node_segment_idx": 14, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.43/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1003", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1003, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1005", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1005, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 6, + "users_count": 11, + "max_users": 128, + "device_health": "ReadyForUsers", + "desired_status": "Activated", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb": { + "account_type": "Device", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 22, + "bump_seed": 254, + "location_pk": "9nJjrDoWWbzhqLka3oHYdj2W3vr2UzUCcjoeCEQ7mAai", + "exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "device_type": "Edge", + "public_ip": "64.86.249.22", + "status": "Activated", + "code": "nyc-dz001", + "dz_prefixes": [ + "64.86.248.128/27" + ], + "metrics_publisher_pk": "A7yxgJvkU5kaLmvKtL5Yz5tQB9td6DLxtbezhqZVfgsd", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.33/32", + "node_segment_idx": 11, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.40/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1000, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1002", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1002, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 43, + "users_count": 85, + "max_users": 128, + "device_health": "ReadyForUsers", + "desired_status": "Activated", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj": { + "account_type": "Device", + "owner": "RoXFXFQAqBxYx6QZYG9AmGMWpSyr7xJPPqAy3FCafpv", + "index": 76, + "bump_seed": 255, + "location_pk": "Aq174PC1QHQ17qv24NasQNjFRd7jdDPgPoYz1PVhJ1X5", + "exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "device_type": "Edge", + "public_ip": "195.12.228.250", + "status": "Activated", + "code": "prg-dz-001-x", + "dz_prefixes": [ + "195.12.228.240/29" + ], + "metrics_publisher_pk": "11111111111111111111111111111111", + "contributor_pk": "HxVCvaatmmNxWANL4Kvh35pb9g451hHLsCyT48G7KzA", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.14/32", + "node_segment_idx": 1, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.16/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Vlan4001", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 8, + "users_count": 9, + "max_users": 128, + "device_health": "ReadyForUsers", + "desired_status": "Activated", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD": { + "account_type": "Device", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 21, + "bump_seed": 254, + "location_pk": "8ivCSPhAs6WwbWY5WR7GCQiChEVcK2kpoj97MugLPwcg", + "exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "device_type": "Edge", + "public_ip": "207.45.216.134", + "status": "Activated", + "code": "lax-dz001", + "dz_prefixes": [ + "207.45.216.224/27" + ], + "metrics_publisher_pk": "D6wvvWrosxojHYjqiEXeDmnXjMjNbQdeebGgjiqUFXLk", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.34/32", + "node_segment_idx": 12, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.41/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1002", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1002, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1003", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1003, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 18, + "users_count": 49, + "max_users": 128, + "device_health": "ReadyForUsers", + "desired_status": "Activated", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL": { + "account_type": "Device", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 18, + "bump_seed": 254, + "location_pk": "7vt8Tnbk15S6JA1uhRQVtbuL7w39zY8jeQ5iqgjsqLfP", + "exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "device_type": "Edge", + "public_ip": "195.219.120.66", + "status": "Activated", + "code": "lon-dz001", + "dz_prefixes": [ + "195.219.121.96/28" + ], + "metrics_publisher_pk": "6LHRkoEGNAPH2fFndCudK94pQU9v5Hk4DEKX253CbNHy", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.32/32", + "node_segment_idx": 10, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.39/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1000", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1000, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1001", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1001, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1004", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1004, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1006", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1006, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 31, + "users_count": 54, + "max_users": 128, + "device_health": "ReadyForUsers", + "desired_status": "Activated", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8": { + "account_type": "Device", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 23, + "bump_seed": 255, + "location_pk": "DJX3x93muX4Tnv2yG4aqLL3YntLurDKeR2SFZEF5qWRV", + "exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "device_type": "Edge", + "public_ip": "180.87.102.98", + "status": "Activated", + "code": "sin-dz001", + "dz_prefixes": [ + "180.87.103.128/27" + ], + "metrics_publisher_pk": "Cgmo8tCWvjm3VQcWLgvZg2nm5v2nBPWZySTcbNrPXHFW", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.35/32", + "node_segment_idx": 13, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.42/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1005", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1005, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1.1006", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 1006, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 11, + "users_count": 26, + "max_users": 128, + "device_health": "ReadyForUsers", + "desired_status": "Activated", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + }, + "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y": { + "account_type": "Device", + "owner": "RoXFXFQAqBxYx6QZYG9AmGMWpSyr7xJPPqAy3FCafpv", + "index": 75, + "bump_seed": 253, + "location_pk": "HiJWeiLKcw6tcBmdX65x1Hd1XtjkQXLgEpPBhfkW2qxw", + "exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "device_type": "Edge", + "public_ip": "195.12.227.250", + "status": "Activated", + "code": "fra-dz-001-x", + "dz_prefixes": [ + "195.12.227.224/29" + ], + "metrics_publisher_pk": "11111111111111111111111111111111", + "contributor_pk": "HxVCvaatmmNxWANL4Kvh35pb9g451hHLsCyT48G7KzA", + "mgmt_vrf": "", + "interfaces": [ + { + "V1": { + "status": "Activated", + "name": "Loopback255", + "interface_type": "Loopback", + "loopback_type": "Vpnv4", + "vlan_id": 0, + "ip_net": "172.16.0.15/32", + "node_segment_idx": 2, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Activated", + "name": "Loopback256", + "interface_type": "Loopback", + "loopback_type": "Ipv4", + "vlan_id": 0, + "ip_net": "172.16.0.17/32", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/1/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + }, + { + "V1": { + "status": "Unlinked", + "name": "Switch1/5/1", + "interface_type": "Physical", + "loopback_type": "None", + "vlan_id": 0, + "ip_net": "0.0.0.0/0", + "node_segment_idx": 0, + "user_tunnel_endpoint": false + } + } + ], + "reference_count": 45, + "users_count": 75, + "max_users": 128, + "device_health": "ReadyForUsers", + "desired_status": "Activated", + "unicast_users_count": 0, + "multicast_subscribers_count": 0, + "max_unicast_users": 0, + "max_multicast_subscribers": 0, + "reserved_seats": 0, + "multicast_publishers_count": 0, + "max_multicast_publishers": 0 + } + }, + "links": { + "4f6tmVrFNFCgaBixqC3BiyZYYmvBzqd8vv5j1aBGTPia": { + "account_type": "Link", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 857, + "bump_seed": 253, + "side_a_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "side_z_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 98710000, + "delay_override_ns": 0, + "jitter_ns": 1200000, + "tunnel_id": 6, + "tunnel_net": "172.16.0.12/31", + "status": "Activated", + "code": "tyo-dz001:lax-dz001", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "side_a_iface_name": "Switch1/1/1.1003", + "side_z_iface_name": "Switch1/1/1.1003", + "link_health": "ReadyForService", + "desired_status": "Activated" + }, + "6PWVQE6pqbpwcU4pn7UvRoEEG1dpa2nQwbD3DLR4AkRT": { + "account_type": "Link", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 854, + "bump_seed": 254, + "side_a_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "side_z_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 152540000, + "delay_override_ns": 0, + "jitter_ns": 1170000, + "tunnel_id": 3, + "tunnel_net": "172.16.0.6/31", + "status": "Activated", + "code": "lon-dz001:sin-dz001", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "side_a_iface_name": "Switch1/1/1.1006", + "side_z_iface_name": "Switch1/1/1.1006", + "link_health": "ReadyForService", + "desired_status": "Activated" + }, + "9BPmBzZSBDUkRVYWAbEDmDxqAaCHFQFCymxLguiz2drj": { + "account_type": "Link", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 851, + "bump_seed": 254, + "side_a_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "side_z_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 5760000, + "delay_override_ns": 0, + "jitter_ns": 1210000, + "tunnel_id": 0, + "tunnel_net": "172.16.0.0/31", + "status": "Activated", + "code": "ams-dz001:lon-dz001", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "side_a_iface_name": "Switch1/1/1.1001", + "side_z_iface_name": "Switch1/1/1.1001", + "link_health": "ReadyForService", + "desired_status": "Activated" + }, + "9WAHrNe8R8X7TaAx7Ge7bowExDtjD2M1nbVNNxXDgnGg": { + "account_type": "Link", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 855, + "bump_seed": 254, + "side_a_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "side_z_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 67200000, + "delay_override_ns": 0, + "jitter_ns": 1220000, + "tunnel_id": 4, + "tunnel_net": "172.16.0.8/31", + "status": "Activated", + "code": "sin-dz001:tyo-dz001", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "side_a_iface_name": "Switch1/1/1.1005", + "side_z_iface_name": "Switch1/1/1.1005", + "link_health": "ReadyForService", + "desired_status": "Activated" + }, + "9kHVMSBtRs75mpchpDviP2dihQ32nTqoEPb73shn4DU5": { + "account_type": "Link", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 858, + "bump_seed": 255, + "side_a_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "side_z_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "link_type": "DZX", + "bandwidth": 10000000000, + "mtu": 2048, + "delay_ns": 1000000, + "delay_override_ns": 0, + "jitter_ns": 1010000, + "tunnel_id": 8, + "tunnel_net": "172.16.0.20/31", + "status": "Activated", + "code": "fra-dz001:fra-dz-001-x", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "side_a_iface_name": "Switch1/11/1", + "side_z_iface_name": "Switch1/5/1", + "link_health": "ReadyForService", + "desired_status": "Activated" + }, + "AWHkNcwF7PSNCJq4vgypxuAYfyeyHTWMySGefSN7VpFn": { + "account_type": "Link", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 853, + "bump_seed": 252, + "side_a_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "side_z_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 11090000, + "delay_override_ns": 0, + "jitter_ns": 1240000, + "tunnel_id": 2, + "tunnel_net": "172.16.0.4/31", + "status": "Activated", + "code": "lon-dz001:fra-dz001", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "side_a_iface_name": "Switch1/1/1.1004", + "side_z_iface_name": "Switch1/1/1.1004", + "link_health": "ReadyForService", + "desired_status": "Activated" + }, + "As7SQm9RggEi1Bp6hpfHMC5TETushYgR7uWbykMZkt4w": { + "account_type": "Link", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 856, + "bump_seed": 255, + "side_a_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "side_z_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 66930000, + "delay_override_ns": 0, + "jitter_ns": 1170000, + "tunnel_id": 5, + "tunnel_net": "172.16.0.10/31", + "status": "Activated", + "code": "nyc-dz001:lon-dz001", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "side_a_iface_name": "Switch1/1/1.1000", + "side_z_iface_name": "Switch1/1/1.1000", + "link_health": "ReadyForService", + "desired_status": "Activated" + }, + "HhnwWoUM1Yw8X7RGWsvG7jHLrBfzzLMdfndsLUWcHPrT": { + "account_type": "Link", + "owner": "RoXFXFQAqBxYx6QZYG9AmGMWpSyr7xJPPqAy3FCafpv", + "index": 1015, + "bump_seed": 254, + "side_a_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "side_z_pk": "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 7000000, + "delay_override_ns": 0, + "jitter_ns": 1000000, + "tunnel_id": 7, + "tunnel_net": "172.16.0.18/31", + "status": "Activated", + "code": "fra-dz-001-x:prg-dz-001-x", + "contributor_pk": "HxVCvaatmmNxWANL4Kvh35pb9g451hHLsCyT48G7KzA", + "side_a_iface_name": "Switch1/1/1", + "side_z_iface_name": "Vlan4001", + "link_health": "ReadyForService", + "desired_status": "Activated" + }, + "YnBTcwD87rvh2zpor9PchchUo28xtgba7w88F16VhZK": { + "account_type": "Link", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 852, + "bump_seed": 254, + "side_a_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "side_z_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "link_type": "WAN", + "bandwidth": 10000000000, + "mtu": 9000, + "delay_ns": 69710000, + "delay_override_ns": 0, + "jitter_ns": 1290000, + "tunnel_id": 1, + "tunnel_net": "172.16.0.2/31", + "status": "Activated", + "code": "lax-dz001:nyc-dz001", + "contributor_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam", + "side_a_iface_name": "Switch1/1/1.1002", + "side_z_iface_name": "Switch1/1/1.1002", + "link_health": "ReadyForService", + "desired_status": "Activated" + } + }, + "users": { + "125A1n4r1ZH3tatbBzybaGRwPSPQy9Ku16YiHvz5ovTN": { + "account_type": "User", + "owner": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj", + "index": 180, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.113.103", + "dz_ip": "67.213.113.103", + "tunnel_id": 507, + "tunnel_net": "169.254.0.22/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ciTyjzN9iyobidMycjyqRRM7vXAHXkFzH3m8vEr6cQj", + "tunnel_endpoint": "0.0.0.0" + }, + "12jooTcob13HLka1BJq6cP249qXde5CRne1FKeUTMeXp": { + "account_type": "User", + "owner": "9cZua5prTSEfednQQc9RkEPpbKDCh1AwnTzv3hE1eq3i", + "index": 1251, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.32.84", + "dz_ip": "84.32.32.84", + "tunnel_id": 564, + "tunnel_net": "169.254.2.200/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "1P5R6bhrzncYnu1U2gtPCKSP8DVRTX6EKESSHnpk8Ek": { + "account_type": "User", + "owner": "GKoe4PVpGR756E39F1PDb7mzENppj41jHWKRtQR3ohMF", + "index": 874, + "bump_seed": 249, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "80.79.7.82", + "dz_ip": "80.79.7.82", + "tunnel_id": 557, + "tunnel_net": "169.254.2.170/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "21QP3y3ieZ5kqQ4usrnX9SDJj7mo79DbdYbMti3r5V6K": { + "account_type": "User", + "owner": "nob1eSPtUzPeQmze3L8Kpz2uzxqSwxWkpsGESDDgbVW", + "index": 894, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "38.244.189.66", + "dz_ip": "38.244.189.66", + "tunnel_id": 556, + "tunnel_net": "169.254.2.22/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6dtVKjb6vRwNAekki2FXhKv8WTNzQ3xW6HWMCNWqtoDy", + "tunnel_endpoint": "0.0.0.0" + }, + "21hj65uwj1r1YH8VtoSXBF3YeBf9dp5S3ofNC9xzxucp": { + "account_type": "User", + "owner": "7TcmJn12spW6KQJp4fvvo45d1hpxS8EnLjKMxihtNZ1V", + "index": 352, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "159.148.20.196", + "dz_ip": "159.148.20.196", + "tunnel_id": 535, + "tunnel_net": "169.254.1.52/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "25ePX7ChoG5j9KgdMax1av4Fk4m3HKmw5bD3fZNzkvsa": { + "account_type": "User", + "owner": "EN5F2BU5juUEWr9zRNNqKuQMi9zBUY1YLPHV5EyMrvnW", + "index": 621, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "37.72.171.250", + "dz_ip": "37.72.171.250", + "tunnel_id": 537, + "tunnel_net": "169.254.2.14/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EN5F2BU5juUEWr9zRNNqKuQMi9zBUY1YLPHV5EyMrvnW", + "tunnel_endpoint": "0.0.0.0" + }, + "27jtqG5KSZ3wPpcUS5ZY53noyF1io8JmfiCLAb8AMSZY": { + "account_type": "User", + "owner": "SP9K2c8Z1aaQaqdQgC6hZMJ5UCTTnE76XNYVse7H94b", + "index": 622, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "109.94.96.59", + "dz_ip": "109.94.96.59", + "tunnel_id": 571, + "tunnel_net": "169.254.2.24/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "E4397FTJ4B6m1MK6Gm1BovBKShjVe5QttJ3uXxTBjtSV", + "tunnel_endpoint": "0.0.0.0" + }, + "2BW2KSM1R8PDq4zQHZYv276L27D2UKAWJEc1GoAhNCoj": { + "account_type": "User", + "owner": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "index": 249, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "189.1.171.177", + "dz_ip": "189.1.171.177", + "tunnel_id": 521, + "tunnel_net": "169.254.0.238/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "rapXHroUoGG3KvZ3qwjvGMdA7siWXwXpiNC1bYarvSC", + "tunnel_endpoint": "0.0.0.0" + }, + "2CeafPVBjNYe8R3yusKU3Gys1t1XozXfs6FRyPypbugV": { + "account_type": "User", + "owner": "FLVgaCPvSGFguumN9ao188izB4K4rxSWzkHneQMtkwQJ", + "index": 1374, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "45.45.156.250", + "dz_ip": "45.45.156.250", + "tunnel_id": 536, + "tunnel_net": "169.254.3.82/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2DNYqVnz1nv1NWmjZnF9v2rBBjwN42sXbnS6RYkgjUxU": { + "account_type": "User", + "owner": "BPKAfGkkzF5u1QRjjB1nWYYbPMUCMPJe1xZPmwEMNMCT", + "index": 1247, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.215", + "dz_ip": "45.139.132.215", + "tunnel_id": 546, + "tunnel_net": "169.254.1.128/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BPKAfGkkzF5u1QRjjB1nWYYbPMUCMPJe1xZPmwEMNMCT", + "tunnel_endpoint": "0.0.0.0" + }, + "2E9xb1DEU9wQvzyUhNTipH5ckmFDL79VP8mvvT57q6pU": { + "account_type": "User", + "owner": "CeC95ByA5rd3cFELBgK5nx2hB8o7FynrB2ciNNwHYEib", + "index": 433, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.43.202", + "dz_ip": "64.130.43.202", + "tunnel_id": 531, + "tunnel_net": "169.254.0.44/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CeC95ByA5rd3cFELBgK5nx2hB8o7FynrB2ciNNwHYEib", + "tunnel_endpoint": "0.0.0.0" + }, + "2GqPAY8cAs4RJn2yopbG7aGvCvwXSyXR1yqeWHFbwiER": { + "account_type": "User", + "owner": "ooc9bBwcrSKVMWNCojjmvikh8NkSPSgRebm3DWMZeyP", + "index": 295, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "209.250.244.17", + "dz_ip": "209.250.244.17", + "tunnel_id": 517, + "tunnel_net": "169.254.0.168/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2HMPpihcmgiYLVpVKBNfc1GG7P6nG5KVwkJNRehwgwVM": { + "account_type": "User", + "owner": "7w8mvD6RL45HM4NKis1TSsyz1BCuzXGGM7e6gLi6iNQx", + "index": 343, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.155.191", + "dz_ip": "177.54.155.191", + "tunnel_id": 521, + "tunnel_net": "169.254.1.40/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2JXEzQ5WkMUrHGnDsUgsrgp9LyPkxssEpHyJmioMNcki": { + "account_type": "User", + "owner": "6122X5K3mo8QMwXZW6wnP2n1j2wQoa1Ks21Ckwj7L6st", + "index": 753, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.43.208", + "dz_ip": "212.83.43.208", + "tunnel_id": 579, + "tunnel_net": "169.254.2.110/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6122X5K3mo8QMwXZW6wnP2n1j2wQoa1Ks21Ckwj7L6st", + "tunnel_endpoint": "0.0.0.0" + }, + "2MDmTJLRqYMBFiustC39CDedGS5qRG2QEkvKVK4dFgRe": { + "account_type": "User", + "owner": "HB3SNp3DWm5jrf52BSAqE4hozEw7e7Ui9zZbdjzCorkj", + "index": 296, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "80.77.161.196", + "dz_ip": "80.77.161.196", + "tunnel_id": 528, + "tunnel_net": "169.254.1.6/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2NSxuUx4X9zkPEGt4Fbij8jEJADYs8bSdBKjUzzqoXsm": { + "account_type": "User", + "owner": "A963nwma1r6tr6VgASiHgj9VKmvXvbFeZHoMW6XT1aiQ", + "index": 1198, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.11.149", + "dz_ip": "185.26.11.149", + "tunnel_id": 530, + "tunnel_net": "169.254.3.148/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "A963nwma1r6tr6VgASiHgj9VKmvXvbFeZHoMW6XT1aiQ", + "tunnel_endpoint": "0.0.0.0" + }, + "2PhkrMVHAe6jvNQLky6N8bKvJGh2WyGGbbWKUXvir6BG": { + "account_type": "User", + "owner": "huinBRP3muBuqZLMW8ARjdn4mBnEmFFcxiBzrkQz553", + "index": 228, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.87", + "dz_ip": "45.139.132.87", + "tunnel_id": 515, + "tunnel_net": "169.254.0.208/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "huinBRP3muBuqZLMW8ARjdn4mBnEmFFcxiBzrkQz553", + "tunnel_endpoint": "0.0.0.0" + }, + "2RHySNikH9pD1rz7gMZ7diw2U89EjfY7UojFohfzhoXP": { + "account_type": "User", + "owner": "6jxte5jrKezgZ8XhnmcXEVEN4xQxbXb1hR4mUg3m6BrB", + "index": 707, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "185.171.202.78", + "dz_ip": "185.171.202.78", + "tunnel_id": 545, + "tunnel_net": "169.254.2.60/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DtY5Bzxd75iWQRvKwM2xLUxqwLT1RRoeNwmVvgS2JANA", + "tunnel_endpoint": "0.0.0.0" + }, + "2Ti4H1et5pnmpw93utbq6np9uZmdozKGHmUty4YvUGUF": { + "account_type": "User", + "owner": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "index": 490, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "149.255.37.170", + "dz_ip": "149.255.37.170", + "tunnel_id": 532, + "tunnel_net": "169.254.0.18/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3s97yjq2MhoPVPC3U9VeE3Z5S643Pweovg88ysvrQPw5", + "tunnel_endpoint": "0.0.0.0" + }, + "2VCgEDiQvRaNiWNgz8HghdQ8byqU9AEYL2PkoFJPSfS9": { + "account_type": "User", + "owner": "8wWxxYfektdmMDoHZUMCpWLqni1Bt4vwm6ejyVZTsoNE", + "index": 1210, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "149.50.110.18", + "dz_ip": "149.50.110.18", + "tunnel_id": 564, + "tunnel_net": "169.254.3.108/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2ZhEdHajXanEiwgXAK4RMrCdn81w6iBngiSvmJGjSSXe": { + "account_type": "User", + "owner": "3viEMMqkPRBiAKXB3Y7yH5GbzqtRn3NmnLPi8JsZmLQw", + "index": 1233, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "200.69.14.232", + "dz_ip": "200.69.14.232", + "tunnel_id": 545, + "tunnel_net": "169.254.3.152/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2cwmhPnRTDZxAuAWvstb9EfVDopSaseczHvmor9jqWaJ": { + "account_type": "User", + "owner": "STPTshazcjH6cZMHzQBrggFSPHXYCTRGB7ctqS1AjkH", + "index": 1121, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "109.61.94.25", + "dz_ip": "109.61.94.25", + "tunnel_id": 538, + "tunnel_net": "169.254.3.40/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2ddAuVZYhgFAE1pHubcVpZ8aK6Vca2zpopWy6PDo7bCR": { + "account_type": "User", + "owner": "SP9K2c8Z1aaQaqdQgC6hZMJ5UCTTnE76XNYVse7H94b", + "index": 627, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "189.1.171.213", + "dz_ip": "189.1.171.213", + "tunnel_id": 572, + "tunnel_net": "169.254.2.26/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SP9K2c8Z1aaQaqdQgC6hZMJ5UCTTnE76XNYVse7H94b", + "tunnel_endpoint": "0.0.0.0" + }, + "2di4ndmXvWBRbaA3oAb4WZdRdFoKMp5BizbNQZMhNSRu": { + "account_type": "User", + "owner": "72qy6WqtSBRHNjTvvzwzcoCAhoef41kwPL2pc2bfGCo8", + "index": 404, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "89.42.231.135", + "dz_ip": "89.42.231.135", + "tunnel_id": 527, + "tunnel_net": "169.254.1.120/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DiveRaPKviyDnQyiiMFdV4rujsCBJzMNvPjKfvGNLGvL", + "tunnel_endpoint": "0.0.0.0" + }, + "2drzCuNXWXH7omMwHaEASkdNVjo2B7L6u3gvMd9H3Whe": { + "account_type": "User", + "owner": "dztjLV3XhbyCfo3RkCSih468oMhcTz4TPKYCoCP6E1u", + "index": 571, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "66.45.234.98", + "dz_ip": "66.45.234.98", + "tunnel_id": 537, + "tunnel_net": "169.254.1.222/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2ei723aANyKXeX5U4zxEyBdBKdkguSrUxqY4KhxZrMAb": { + "account_type": "User", + "owner": "axy3tCRL3wmFMVG4c69rYurcf4fXhBo2RcuBj9ADnJ4", + "index": 1483, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "103.88.234.127", + "dz_ip": "103.88.234.127", + "tunnel_id": 549, + "tunnel_net": "169.254.2.94/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2mbuq2KpGnczboiD4gV3CFPvcmWkos9UBVvmQnMKDbMH": { + "account_type": "User", + "owner": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "index": 730, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "89.42.231.167", + "dz_ip": "89.42.231.167", + "tunnel_id": 548, + "tunnel_net": "169.254.2.92/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FnRqe316RrxVBv85EzMgcuWaVLZYYuyEq9znJnSZAu55", + "tunnel_endpoint": "0.0.0.0" + }, + "2oLhjYacfF62pn4PPWEgSKKn7c19SErSU7YsyvPxgD9q": { + "account_type": "User", + "owner": "DTaZYJr3QqGqqGD4yYqTX7iCQuTVz9CW4YWwQxqJjtaF", + "index": 883, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.134.188", + "dz_ip": "45.139.134.188", + "tunnel_id": 586, + "tunnel_net": "169.254.2.178/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CHED86J97RCtt8HxhNxvUSQWPqFsiftNpWWQd9HZvqvw", + "tunnel_endpoint": "0.0.0.0" + }, + "2prjSpKYzWDs7f8sEZjt4ueX1ny9Azj3LxSy5tSFeUPY": { + "account_type": "User", + "owner": "pdzzu6j8tYN2RwkeEJ6w6fFgHqHPT6mR17qCDBhDXoh", + "index": 1044, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "216.238.102.89", + "dz_ip": "216.238.102.89", + "tunnel_id": 561, + "tunnel_net": "169.254.2.230/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Pid6HQnMCFb9izqX9i7X6ePdUPieGmjHoPxC1Jfooix", + "tunnel_endpoint": "0.0.0.0" + }, + "2ptHYNMxREfEjMVc4m9HgwF4cN9ZtMcSuqZaijTcpewa": { + "account_type": "User", + "owner": "DTELykegBxxEn9c15GbH1zbYFr9CFd8VHQnhTGfz5JLb", + "index": 750, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "142.91.158.164", + "dz_ip": "142.91.158.164", + "tunnel_id": 508, + "tunnel_net": "169.254.0.72/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DTELykegBxxEn9c15GbH1zbYFr9CFd8VHQnhTGfz5JLb", + "tunnel_endpoint": "0.0.0.0" + }, + "2pvMni476EVxVETM3WkW3NRV1m7uMtxui5X3byve2P6h": { + "account_type": "User", + "owner": "GS7tvhfiU36vp8q2d92buz3dgENidvA3bWNpRDFcvnR2", + "index": 1117, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "46.229.232.67", + "dz_ip": "46.229.232.67", + "tunnel_id": 558, + "tunnel_net": "169.254.3.52/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GS7tvhfiU36vp8q2d92buz3dgENidvA3bWNpRDFcvnR2", + "tunnel_endpoint": "0.0.0.0" + }, + "2q79gbbaVguEaxfFWZ9tf2JvgfTYAWsF5jpKD1C8mLBv": { + "account_type": "User", + "owner": "BHCsbYTDVd3wiJiEgjtLcxxj75tYPDbNzUehTeBxMzbY", + "index": 235, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.204", + "dz_ip": "45.139.132.204", + "tunnel_id": 512, + "tunnel_net": "169.254.0.222/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2snTWTepW3xXDMYRz5s4yvR6bJDtyrDgPGV1snAHupxi": { + "account_type": "User", + "owner": "9CYnw2VNWfipQiDKEjgmZsh36xTmDBcSu93mCfSvMRpc", + "index": 1158, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "5.151.82.133", + "dz_ip": "5.151.82.133", + "tunnel_id": 540, + "tunnel_net": "169.254.3.92/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2t8Wz3BQj7XgwoJnwdfdG2HUNJJnjyYotWs1gSBbHbLZ": { + "account_type": "User", + "owner": "ADFvFuC7ii7ReQhN4MYLei47aeB7AA5Tg39jY88F86MY", + "index": 1270, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "216.18.211.210", + "dz_ip": "216.18.211.210", + "tunnel_id": 539, + "tunnel_net": "169.254.3.178/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2uAG6B3X2kq9MjNjt6SJbd3TjG7XMrJtnc5Dtah3Pz5Y": { + "account_type": "User", + "owner": "DRnvWydSjzDkhN1AsZ5oTm8nqNCmxtCxJ8T1sXk5kCmb", + "index": 653, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "185.169.79.114", + "dz_ip": "185.169.79.114", + "tunnel_id": 541, + "tunnel_net": "169.254.2.42/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2uXP9qntqnBSYt6vBmjwRVrxhhQUN5SSJEb9ZveiD3V8": { + "account_type": "User", + "owner": "G71Xp23bPKk8ep3oFseyAjrWQKg9EGZivY8mBnBZWM8X", + "index": 1440, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj", + "cyoa_type": "GREOverDIA", + "client_ip": "139.84.227.71", + "dz_ip": "139.84.227.71", + "tunnel_id": 512, + "tunnel_net": "169.254.2.236/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "2xdfGVkEwPxTVXkKc77pjrek7JZB8d22in5DXhcuJ97M": { + "account_type": "User", + "owner": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "index": 989, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.188", + "dz_ip": "45.139.132.188", + "tunnel_id": 575, + "tunnel_net": "169.254.2.202/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "tunnel_endpoint": "0.0.0.0" + }, + "32X2h6L3CNrfte6e8WYvcMnUZNwSuanZC6wh4wzTpFFD": { + "account_type": "User", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 198, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "172.19.1.33", + "dz_ip": "172.19.1.33", + "tunnel_id": 509, + "tunnel_net": "169.254.0.190/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "32bReWPrR1cEwU6zANAPg3z7kgczZ38ukGs9brztdYNj": { + "account_type": "User", + "owner": "CaT9dSx37Quj1kcAXEVd6ncM6NLvYUSqhtgEnn1JtNKC", + "index": 979, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "57.128.64.53", + "dz_ip": "57.128.64.53", + "tunnel_id": 555, + "tunnel_net": "169.254.0.236/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "34gavgYK35Y4CyZhEY4vUp5vxAmbgr7F5ZYnWBWibs3U": { + "account_type": "User", + "owner": "mrgn4sJJu5GBa5wbKyjuASzhyCifvcedGoLtpKjB3Wf", + "index": 370, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.52.111", + "dz_ip": "64.130.52.111", + "tunnel_id": 525, + "tunnel_net": "169.254.1.78/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "mrgn4sJJu5GBa5wbKyjuASzhyCifvcedGoLtpKjB3Wf", + "tunnel_endpoint": "0.0.0.0" + }, + "35174riqgEScpAQDK3uDsgmk9YNuHXc8DpqKRHQtPXAU": { + "account_type": "User", + "owner": "ET6sihELJYJeiQ6z3MdpSnbHWPPJ5FUFjZag1BtxVX6e", + "index": 1230, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "80.77.161.197", + "dz_ip": "80.77.161.197", + "tunnel_id": 618, + "tunnel_net": "169.254.3.150/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "36D2oEBRqrQsPerh2Y6RXaUWnQ9WPK27qDEtjEFJXktW": { + "account_type": "User", + "owner": "ooc9bBwcrSKVMWNCojjmvikh8NkSPSgRebm3DWMZeyP", + "index": 583, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.7.65", + "dz_ip": "64.176.7.65", + "tunnel_id": 543, + "tunnel_net": "169.254.1.246/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "meshRrDTME9cL2FSQ9E56EncfkZ7vL8apwcCFsw3o6Y", + "tunnel_endpoint": "0.0.0.0" + }, + "39UK9WxyKRuALdBywPo2QvfLqLgHsnmZC7DcuQDMrwWW": { + "account_type": "User", + "owner": "GQqxGEmi6aMBZtcfmfmC5Jgx33X57ksvNYoo8bMH52T9", + "index": 725, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "209.250.232.171", + "dz_ip": "209.250.232.171", + "tunnel_id": 536, + "tunnel_net": "169.254.2.90/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GQqxGEmi6aMBZtcfmfmC5Jgx33X57ksvNYoo8bMH52T9", + "tunnel_endpoint": "0.0.0.0" + }, + "39XNZxWfrcnkuvWJyZnhKz8C29eQ2iageFJegLjQwsrA": { + "account_type": "User", + "owner": "HjbYYj832yabYrGL4WLzfJfsTagTd15tcPB71q76YGDg", + "index": 1164, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "194.126.172.186", + "dz_ip": "194.126.172.186", + "tunnel_id": 568, + "tunnel_net": "169.254.3.102/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3BF4b2QRSwnqGnaYfY6tzGHsPLT8g5MdeF2UuyUm15zi": { + "account_type": "User", + "owner": "ssE7ccqhWxHwoVJCf3oVTtB9pZ9vVaZVmFXvffV9D77", + "index": 383, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "149.248.51.171", + "dz_ip": "149.248.51.171", + "tunnel_id": 526, + "tunnel_net": "169.254.1.90/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SscQkTYV2BFQYGGffAmTzvefrFrw6z9GNYiWHstVZ77", + "tunnel_endpoint": "0.0.0.0" + }, + "3BRFqt9R5TSWbYWYnNXCueZT14oDpT6De51mqYHjBYaL": { + "account_type": "User", + "owner": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw", + "index": 1368, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "5.151.82.131", + "dz_ip": "5.151.82.131", + "tunnel_id": 551, + "tunnel_net": "169.254.3.234/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3DJsizFTcskUNWqnfLwmF89Ep9v5EGM3RJH1LYLyBDbg": { + "account_type": "User", + "owner": "U3hq6THZ5b1hzUQUtxaHRYr7pNAHeMKvfLBL59NjNo9", + "index": 1169, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "5.39.251.201", + "dz_ip": "5.39.251.201", + "tunnel_id": 561, + "tunnel_net": "169.254.3.110/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3DnmLt3VdQMG4hk1nWJWAq8DoQuktKHmi2dQn7cZUcEd": { + "account_type": "User", + "owner": "GnZB2GTH8KJKqU3L4tR42a7BnKXxvgS9rerGMAszNCp", + "index": 1362, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "86.105.224.29", + "dz_ip": "86.105.224.29", + "tunnel_id": 574, + "tunnel_net": "169.254.3.222/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3FhJUGyMDCWTTMLMMN9DmhJnUZtepxgXLLzCyYXnTWZ5": { + "account_type": "User", + "owner": "mrgn28BhocwdAUEenen3Sw2MR9cPKDpLkDvzDdR7DBD", + "index": 368, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "202.8.8.21", + "dz_ip": "202.8.8.21", + "tunnel_id": 524, + "tunnel_net": "169.254.1.74/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "mrgn28BhocwdAUEenen3Sw2MR9cPKDpLkDvzDdR7DBD", + "tunnel_endpoint": "0.0.0.0" + }, + "3HvRakNUKvuXtWJWK8Dd9E8bX2dQkECs1LByTMsHdfRV": { + "account_type": "User", + "owner": "U3hq6THZ5b1hzUQUtxaHRYr7pNAHeMKvfLBL59NjNo9", + "index": 1176, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "5.39.251.205", + "dz_ip": "5.39.251.205", + "tunnel_id": 565, + "tunnel_net": "169.254.3.122/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3JBrcfwGarRBRWpp5cB6D15eEXWbvnfZXYLmNx4HZ24V": { + "account_type": "User", + "owner": "9FXD1NXrK6xFU8i4gLAgjj2iMEWTqJhSuQN8tQuDfm2e", + "index": 1256, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj", + "cyoa_type": "GREOverDIA", + "client_ip": "185.32.162.87", + "dz_ip": "185.32.162.87", + "tunnel_id": 503, + "tunnel_net": "169.254.0.4/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3LDwDDFbPLGf384DBTr8HYsBFPdLVW33PAAQ1zcWUMuC": { + "account_type": "User", + "owner": "FVXSGgGaErGnXTeWAoijfmxTS1kGtr3cY2MSPAo9i9yr", + "index": 1211, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "69.67.151.19", + "dz_ip": "69.67.151.19", + "tunnel_id": 502, + "tunnel_net": "169.254.0.56/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3PARqM9kcWtAuNJhuzKctGBBWjQYLFcPQ68ZtyDsmsBL": { + "account_type": "User", + "owner": "B8td8UgVVFQifTHijPBLp7pbpKjW1R7wdYQvFLGdDRCy", + "index": 637, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.135.173", + "dz_ip": "45.139.135.173", + "tunnel_id": 570, + "tunnel_net": "169.254.2.32/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FJN8ryNvkm3QAQufsjJmJ9eGPpK1D8hG4MawATqZfFhx", + "tunnel_endpoint": "0.0.0.0" + }, + "3VMoo6wmDxnNZJv82vNtzgzK8RdFzgJyxMxQRfAZHZzk": { + "account_type": "User", + "owner": "novaNtnyeW57yyvDgPd1J7jBBLLkAVHdrpryRxHixfZ", + "index": 1375, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "38.92.24.104", + "dz_ip": "38.92.24.104", + "tunnel_id": 548, + "tunnel_net": "169.254.3.238/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3WxGJGfswE5Kcc4CouWw64UKG5YP5sdAHnZ4sTkrLigU": { + "account_type": "User", + "owner": "Frdg1NUoQaaTmASWNTrtDrBU5PbTnWtUvtdCr1XPNn1c", + "index": 1240, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.11.157", + "dz_ip": "185.26.11.157", + "tunnel_id": 547, + "tunnel_net": "169.254.3.158/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3XQ96MFP3UT4CFdnEhpMezntj2fCYvgnHCxTLcFn97t1": { + "account_type": "User", + "owner": "DqBvkYXi7HjdaKz78yakiDsaGuq1BKrQi3Z5JV6STctz", + "index": 1054, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "5.187.35.10", + "dz_ip": "5.187.35.10", + "tunnel_id": 601, + "tunnel_net": "169.254.2.250/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DqBvkYXi7HjdaKz78yakiDsaGuq1BKrQi3Z5JV6STctz", + "tunnel_endpoint": "0.0.0.0" + }, + "3ZAmqrrDJEGdDFQXqz9RWMhj9ftCb8VK4u465naaKAKj": { + "account_type": "User", + "owner": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty", + "index": 581, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "67.209.52.228", + "dz_ip": "67.209.52.228", + "tunnel_id": 524, + "tunnel_net": "169.254.1.242/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty", + "tunnel_endpoint": "0.0.0.0" + }, + "3aFPbNqX1EVQkF8qmdK1a8VE9g5JuGrt63jkvCxukGgJ": { + "account_type": "User", + "owner": "M7Pcv3j8KpX8ZAkeSsvJnexgKrZbBAaMEcRTvf6t2Em", + "index": 665, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "50.115.46.202", + "dz_ip": "50.115.46.202", + "tunnel_id": 531, + "tunnel_net": "169.254.2.50/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3aGiQwaLnwk7btLUZyUurxQUukvVZy6PF13Zxpz1oUW6": { + "account_type": "User", + "owner": "JAdJizeQExgJQpWwxzXpABv66cLYteUXQ1uiwWqCdiTC", + "index": 84, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.197", + "dz_ip": "208.91.110.197", + "tunnel_id": 504, + "tunnel_net": "169.254.0.20/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3bJx4qZ5FWYps7NaRwGQHUSnvTQNfNfaT38faz4odYAN": { + "account_type": "User", + "owner": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "index": 154, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.85.217", + "dz_ip": "72.46.85.217", + "tunnel_id": 511, + "tunnel_net": "169.254.0.176/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3bKVpMuCWiPwxnT3SAFJh7fX4GYo2Fegtxbt9Hspi6yg": { + "account_type": "User", + "owner": "CBUGET5PnvLc3HvEeFYj64iTvdKhYV6pujTPDdDh785K", + "index": 410, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "159.148.20.198", + "dz_ip": "159.148.20.198", + "tunnel_id": 547, + "tunnel_net": "169.254.1.132/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CBUGET5PnvLc3HvEeFYj64iTvdKhYV6pujTPDdDh785K", + "tunnel_endpoint": "0.0.0.0" + }, + "3dbW7NLqubRb1hYADPJkTrcSovzs6jgxadfHQusDnqqZ": { + "account_type": "User", + "owner": "dzmTjnSdbPhsVPFcJVsnr6DvkrmUkrvzhXLqxHXPwoU", + "index": 755, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "83.143.84.202", + "dz_ip": "83.143.84.202", + "tunnel_id": 541, + "tunnel_net": "169.254.2.114/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6xFDLX751L7H9d5fQT9sf2SM5RWWE9LDgqz25pPDbWoJ", + "tunnel_endpoint": "0.0.0.0" + }, + "3eB1ZqNFbBEREZzfx7hPYusE3GTvMKm1tBf7n7eipbDx": { + "account_type": "User", + "owner": "DZt1MAwNcfFnRSyPjWyVY6X3mmyCurugJxuMKLjNNSTm", + "index": 142, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "57.129.87.228", + "dz_ip": "57.129.87.228", + "tunnel_id": 514, + "tunnel_net": "169.254.0.156/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3ej55kGMPYKJzpQ9XkCoN9Nh8V9ukemYmsf6tawA2tpu": { + "account_type": "User", + "owner": "8XT7HWWmJTWmwvqQSAEyCUyeMoKhytK6MEBBt4njSzAp", + "index": 304, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.9.17", + "dz_ip": "185.26.9.17", + "tunnel_id": 501, + "tunnel_net": "169.254.1.18/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3jGZmYHP11WEYPtyTp8tiWo7oba1cJEkFThFCQf7HpcJ": { + "account_type": "User", + "owner": "FugJZepeGfh1Ruunhep19JC4F3Hr2FL3oKUMezoK8ajp", + "index": 1189, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.41", + "dz_ip": "208.91.110.41", + "tunnel_id": 577, + "tunnel_net": "169.254.3.138/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FugJZepeGfh1Ruunhep19JC4F3Hr2FL3oKUMezoK8ajp", + "tunnel_endpoint": "0.0.0.0" + }, + "3opRaUTTyMTNj9cp3CJE6vpj16CCxgbhMCKqEiuxCtMw": { + "account_type": "User", + "owner": "EUDis6LJeJzDHTEBgfHGQyjHp63XZkGkx4E69xunC2Ej", + "index": 1335, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "137.220.62.9", + "dz_ip": "137.220.62.9", + "tunnel_id": 582, + "tunnel_net": "169.254.3.204/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3xhKxNf7GUqVHWF5LqrQbpzTZT5rj6D75KQFyFCHiZSi": { + "account_type": "User", + "owner": "HVKa2M37By5T7AZzgbSqL5qq6hiwZMtcMoF5QLFXppp4", + "index": 478, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "198.244.253.205", + "dz_ip": "198.244.253.205", + "tunnel_id": 521, + "tunnel_net": "169.254.1.150/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "3z1RdPfKQK82Fdkz55BHm1N2uaLMzySscV47pWaEzJsn": { + "account_type": "User", + "owner": "59ec9xRaLoEa5fTpXPjKLcRSLPhHG4abFmVv1RUpYnWx", + "index": 550, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.32.86", + "dz_ip": "84.32.32.86", + "tunnel_id": 536, + "tunnel_net": "169.254.1.194/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GK1VfMARYQh3JTq54VB32CY6vCpw1cpbeqDjr82usHGm", + "tunnel_endpoint": "0.0.0.0" + }, + "42MYYG4e9Jy8pf4jmppPcDowyXKKVzcZNwkwWg1rPxeA": { + "account_type": "User", + "owner": "9BWFAyyHfKUTw5yjg1sfUaVTqaBrev6VjtCxBqFUPFdY", + "index": 1453, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.42.114", + "dz_ip": "64.130.42.114", + "tunnel_id": 578, + "tunnel_net": "169.254.4.0/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "43NPYGDB6J5nzag4D27gDo9DRRniQfspjEphJFfXDe36": { + "account_type": "User", + "owner": "dztk7matJd7ajSH9eSxrD4t3MuQ3vVYAHVJv2vq1vXL", + "index": 1328, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.76.239.188", + "dz_ip": "45.76.239.188", + "tunnel_id": 529, + "tunnel_net": "169.254.1.94/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "dzBhD4wikyy7xqwiJvT49gdrKqWVjfs9M6cTssmRX8Y", + "tunnel_endpoint": "0.0.0.0" + }, + "43xJgFCrP2HmSHpaCqXc5u6UDgBUQDvMAWqxi8rvA9qT": { + "account_type": "User", + "owner": "61QB1Evn9E3noQtpJm4auFYyHSXS5FPgqKtPgwJJfEQk", + "index": 995, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "82.163.195.20", + "dz_ip": "82.163.195.20", + "tunnel_id": 525, + "tunnel_net": "169.254.2.64/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3PqzpBbdozpuqLPDBF2j29gGGmC2TSyzujABFQXhKM9E", + "tunnel_endpoint": "0.0.0.0" + }, + "44LbqfACC8dJkPMiE9A9x84CaMQnno3C6UsAdkFaneUB": { + "account_type": "User", + "owner": "ZpjV1Q4hYczLbSzyuxPetELomP9wSP3jPq9b48ZG3pG", + "index": 234, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.84", + "dz_ip": "45.139.132.84", + "tunnel_id": 516, + "tunnel_net": "169.254.0.220/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8Zh5A5Hs6bJFAyWrLGMaF2VEUVbXFANtfuw7824Hd5XV", + "tunnel_endpoint": "0.0.0.0" + }, + "48cSyoZ4fXxgssgZYBQqD6DTCkSvpqyipdaYCouafoDA": { + "account_type": "User", + "owner": "F1rUdK6ctLyP3yxeMXeMVrsBHGYaGVE9K8VPdbDH8YFH", + "index": 703, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.52.205", + "dz_ip": "64.130.52.205", + "tunnel_id": 526, + "tunnel_net": "169.254.1.140/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "48zfhFs1Dt7vEQWJSZbA51PcGmvHuTmLnfkKanMSLWCn": { + "account_type": "User", + "owner": "9q16BB7WGmBxf1nJTdxH5zPnBUhtHqdqXqRFjSjuM4k7", + "index": 645, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.186.144", + "dz_ip": "84.32.186.144", + "tunnel_id": 539, + "tunnel_net": "169.254.2.38/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "G52Uke6Ss5FHWtZqDX75Yy3SvBFLqwsWBUiGopergvqG", + "tunnel_endpoint": "0.0.0.0" + }, + "498rCXiuHiNSwbGCBiAyTRBsAgb5SPdvKgGGJ8bxTXQ2": { + "account_type": "User", + "owner": "2Xzh8by46XhAwMJrReEgLQVtooibhW7jq9CCBQTZ9Lzy", + "index": 544, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "162.250.124.6", + "dz_ip": "162.250.124.6", + "tunnel_id": 534, + "tunnel_net": "169.254.1.184/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4BSfS92HouiYiFca4KmccDcizm2dEtpkQX6WHDzeURDT": { + "account_type": "User", + "owner": "4wibT3LW6gVrRGjNDk1iqRh5ketvtHsQohDTcJXDHSx5", + "index": 1325, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.114.154", + "dz_ip": "107.155.114.154", + "tunnel_id": 549, + "tunnel_net": "169.254.2.68/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4BxUrhfuRgwKvrjf8GB6DMh66EgJL2rZq1BhWuG6Fuvy": { + "account_type": "User", + "owner": "BZXRhxJq9CpLA1TrjZhMA4TzUSmUGDQSQDHBtSouHAZp", + "index": 290, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "202.8.9.28", + "dz_ip": "202.8.9.28", + "tunnel_id": 502, + "tunnel_net": "169.254.0.24/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4E1XQkYcLvi4gzWtBNu4wiMi1qv7RVSQELisb59HD5Hq": { + "account_type": "User", + "owner": "StaCHeKy7wShGryYDLLdEaqhX8yTKd5YukVpKWMFMG5", + "index": 243, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "38.46.223.227", + "dz_ip": "38.46.223.227", + "tunnel_id": 514, + "tunnel_net": "169.254.0.228/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4Gpsye4KFNKnX9PZ6bPFaRRiQ7UzrSrfmJ53HVQjMVpf": { + "account_type": "User", + "owner": "59ec9xRaLoEa5fTpXPjKLcRSLPhHG4abFmVv1RUpYnWx", + "index": 420, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.32.19", + "dz_ip": "84.32.32.19", + "tunnel_id": 530, + "tunnel_net": "169.254.1.142/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5hV7UqAFiW3HtP6CjLNB2NYaYPfzt8N1S6NQsToZTHBq", + "tunnel_endpoint": "0.0.0.0" + }, + "4MXUpYRobnJdpNJJk5ssXPhhd56BBDPsqniZ3Tw4t2xK": { + "account_type": "User", + "owner": "WnytXvXf2e1mJSWttHfcbMRC2HTHrk8WSWjkXCeWncP", + "index": 1055, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "62.197.45.201", + "dz_ip": "62.197.45.201", + "tunnel_id": 561, + "tunnel_net": "169.254.2.252/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "pidrcoD3t88h8MzJU2EACHL8A6iMoQqwueXPA8KLwUS", + "tunnel_endpoint": "0.0.0.0" + }, + "4SC6nQTXbhVMnhXRaM4zqTf9VYxk5dtAHQKDn7hH9TQb": { + "account_type": "User", + "owner": "vzzAePScm8ZV5oTnKCmLW2ZPGETo9nt2BXhgvoELM9R", + "index": 1123, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "69.67.148.111", + "dz_ip": "69.67.148.111", + "tunnel_id": 568, + "tunnel_net": "169.254.3.26/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4bCdLPBiQdXANimXUyis6D9exmNXwTDtj26qRwR8K65P": { + "account_type": "User", + "owner": "E93pCg9TLT8KhGJpECqUgnFDiQuZm9zP7kSvrCit34ok", + "index": 314, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.142.108", + "dz_ip": "45.77.142.108", + "tunnel_id": 517, + "tunnel_net": "169.254.1.26/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4cKcqpxujXgkdCTk5TVeNiQYZuBfw6xqPqmPRx5WtEYo": { + "account_type": "User", + "owner": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o", + "index": 339, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.11.167", + "dz_ip": "185.26.11.167", + "tunnel_id": 514, + "tunnel_net": "169.254.1.32/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "hnhCMmnrmod4rcyc3QRKkLEC9XnPTvYJ2gBvjgFiV4o", + "tunnel_endpoint": "0.0.0.0" + }, + "4ep6nJGcS4X8PzcrCv9xJ4vdwdb94BeApisgrxCFDjWA": { + "account_type": "User", + "owner": "FxDU2wWwQWyJQgvANDfY3SXsycyBNiTHqhZuovSmjBdU", + "index": 140, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "109.94.99.139", + "dz_ip": "109.94.99.139", + "tunnel_id": 508, + "tunnel_net": "169.254.0.152/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4fekFsVYdgLiEpA1nxTzSWPMJN19faRYX2iE5ZD9FLaY": { + "account_type": "User", + "owner": "grptonHnt7YSmJokGK9TJJTBXDT8ca4LSWMHCCfzzPa", + "index": 381, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.97", + "dz_ip": "45.139.132.97", + "tunnel_id": 539, + "tunnel_net": "169.254.1.88/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "faiCpbit1D1SZYysWiKXaDRo2JHCoKyD3zeGEVTWsxQ", + "tunnel_endpoint": "0.0.0.0" + }, + "4gXiQP5CPrkucETYR2tmRhg8B5TYkYHJSyv7PZXef4MT": { + "account_type": "User", + "owner": "EYTN9eRR4y4zN2yCR9L8cWvvbWbGTSuNrRT1ixMf6wND", + "index": 1041, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.191.116.170", + "dz_ip": "185.191.116.170", + "tunnel_id": 599, + "tunnel_net": "169.254.2.228/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "D3htsc6iRQJLqCNWcC2xcZgUuvcd1JT8zoYNqraNcTQz", + "tunnel_endpoint": "0.0.0.0" + }, + "4jKoZr5dBd3u1nLoVMw5gTJAxX9GQS1MTPmLyV1qRipr": { + "account_type": "User", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 193, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "52.194.235.230", + "dz_ip": "52.194.235.230", + "tunnel_id": 501, + "tunnel_net": "169.254.0.198/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4s9tGUT17Ghh7NaWsRBHkFq5ZxS8bw49oyT2zSwfDvzm": { + "account_type": "User", + "owner": "B8td8UgVVFQifTHijPBLp7pbpKjW1R7wdYQvFLGdDRCy", + "index": 906, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.135.197", + "dz_ip": "45.139.135.197", + "tunnel_id": 591, + "tunnel_net": "169.254.2.188/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FJN8ryNvkm3QAQufsjJmJ9eGPpK1D8hG4MawATqZfFhx", + "tunnel_endpoint": "0.0.0.0" + }, + "4soouq1KtRFkXAhiXwS4h9ZZUF36nNXyD9MjF2yLxdSu": { + "account_type": "User", + "owner": "CK8CoFhP8xQyqtVvyYaPmzPwUGcVBYduM4BmxKsqHZvm", + "index": 57, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "69.67.149.97", + "dz_ip": "69.67.149.97", + "tunnel_id": 503, + "tunnel_net": "169.254.0.42/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "4y4Vk4nm4yyzJHmnqwRGFFkkML9hGNmKjtRCkuG1PyZA": { + "account_type": "User", + "owner": "U3hq6THZ5b1hzUQUtxaHRYr7pNAHeMKvfLBL59NjNo9", + "index": 394, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.134.108.188", + "dz_ip": "45.134.108.188", + "tunnel_id": 541, + "tunnel_net": "169.254.1.102/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9srVyMfpuqGZjTBAZTdStaVEvbaBdx8rNf7stSSr7CUn", + "tunnel_endpoint": "0.0.0.0" + }, + "4zModDPLoYuYzu6fELrwHaMMdd9RyHKyGDfmEnWqC9eg": { + "account_type": "User", + "owner": "Ccw4n1JNzcjdEUTYorfZPATWHfmBKV7BHnJ8YDyzqh5s", + "index": 766, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.40.185", + "dz_ip": "64.130.40.185", + "tunnel_id": 515, + "tunnel_net": "169.254.2.128/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Ccw4n1JNzcjdEUTYorfZPATWHfmBKV7BHnJ8YDyzqh5s", + "tunnel_endpoint": "0.0.0.0" + }, + "53kVJxyEzohaheTZkxp49s7PNhda1jV8D3ojJWFBvSYZ": { + "account_type": "User", + "owner": "9Jun65kZph4NQGoYYXQWafg2JjhVqAr9kay5QTn4EMqB", + "index": 606, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "137.131.53.208", + "dz_ip": "137.131.53.208", + "tunnel_id": 530, + "tunnel_net": "169.254.2.18/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "54NE95J2kfzk7giaWG12yMigfdrd6QjTzCfefTwBgLnB": { + "account_type": "User", + "owner": "6p2vFtcXjGaNK92scmoaWT7TWmVfpmvpdSqeJsTYPnKi", + "index": 1154, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "89.42.231.137", + "dz_ip": "89.42.231.137", + "tunnel_id": 611, + "tunnel_net": "169.254.3.86/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "D8kuk3qEiVBGwYkuMGKfBDwuRi6jjRkzjAZg45fdaRLx", + "tunnel_endpoint": "0.0.0.0" + }, + "56ogghoLMQequTdi8h9u8Wt7hNwg9noo3YdHrzJW6hcV": { + "account_type": "User", + "owner": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4", + "index": 1090, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.113.101", + "dz_ip": "67.213.113.101", + "tunnel_id": 540, + "tunnel_net": "169.254.2.214/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "RoYLttggWwa2st3KAGEjnPhsq4NPD5QwaNVyyR8pTz4", + "tunnel_endpoint": "0.0.0.0" + }, + "57GZGL3q3Fv6WHKK88SszBPruF6vA7ZNSWYyt7QX4DqP": { + "account_type": "User", + "owner": "dzmTjnSdbPhsVPFcJVsnr6DvkrmUkrvzhXLqxHXPwoU", + "index": 756, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.19", + "dz_ip": "64.130.51.19", + "tunnel_id": 552, + "tunnel_net": "169.254.2.116/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "dmycoyQrZsMbW3xUtAUkRVTQVDUsBMbjruvmoX5b9v6", + "tunnel_endpoint": "0.0.0.0" + }, + "5Cayr8C9Rc13zcMxrtRg4ZpZMjj4yLperot4oRtd2n6L": { + "account_type": "User", + "owner": "HfQsx5a64LYtf6HuUyfTQoktNJt119xkrFcVG6g628Hw", + "index": 1239, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.161.197", + "dz_ip": "5.199.161.197", + "tunnel_id": 619, + "tunnel_net": "169.254.3.156/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5DewKiW35uzN5QjBFT6A5cK1PGZDfWgpz4sbicAD3vRw": { + "account_type": "User", + "owner": "TRi12sEaDkgoNSsEpep3YF8QPjqz4qM63mc1Z4tQCvD", + "index": 241, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "104.237.51.122", + "dz_ip": "104.237.51.122", + "tunnel_id": 513, + "tunnel_net": "169.254.0.34/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5GBq8segS8iQCR3EV7umibwaGsP5Qeu7mJRkZoDevyVF": { + "account_type": "User", + "owner": "DGbRAvB1HLNPudNKp92sRBfHawprKVvJrgTYLMmgh2om", + "index": 1026, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "202.8.11.195", + "dz_ip": "202.8.11.195", + "tunnel_id": 506, + "tunnel_net": "169.254.0.146/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "82vucuWCTTQEz6nYe3VetnL3pJYBrfDF2gDAjec9sPUy", + "tunnel_endpoint": "0.0.0.0" + }, + "5GhvQQEoKvJkTKLKyuhxsD4vTFxvMqwZG3aGMHwvQiDQ": { + "account_type": "User", + "owner": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA", + "index": 1093, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.84.115", + "dz_ip": "72.46.84.115", + "tunnel_id": 537, + "tunnel_net": "169.254.3.32/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DCKyEmMENQMtLXgbmUoHRmgP9XdJ9HsR5WxrKnSDCzKA", + "tunnel_endpoint": "0.0.0.0" + }, + "5GtPTkYbAPF4xgPvLXiDoQzTZbi2VaPJFKXgJqeoY4WE": { + "account_type": "User", + "owner": "E8XDVg2poFCXPHjQKZajj6yxGQKG7ECuEyG4ALNCJn59", + "index": 1076, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "45.250.254.69", + "dz_ip": "45.250.254.69", + "tunnel_id": 565, + "tunnel_net": "169.254.3.18/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5L3HnhvAY6h6FtAoPwrymgZp3Dc3MDHjHiJaswwQ4K4o": { + "account_type": "User", + "owner": "JAdJizeQExgJQpWwxzXpABv66cLYteUXQ1uiwWqCdiTC", + "index": 269, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "37.114.51.4", + "dz_ip": "37.114.51.4", + "tunnel_id": 504, + "tunnel_net": "169.254.1.4/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5P72YUV21yWQAooGMCdk7gfvManU5xeExUBUk6hR2KHs": { + "account_type": "User", + "owner": "CN5i9MsNorBe5qZsmu2VtVFBLMF8emqU1e1PcZiCGaCX", + "index": 1115, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "62.197.45.139", + "dz_ip": "62.197.45.139", + "tunnel_id": 566, + "tunnel_net": "169.254.3.50/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4guS5XP2wgDWecZGgvN5UQmV8iywTrKGaA7kv9hj3tk7", + "tunnel_endpoint": "0.0.0.0" + }, + "5PZQx6ch4Qh5FxvMnevujQgPXzNaSx963W8ppDX4Dbr2": { + "account_type": "User", + "owner": "5dB4Ygb8Sf3Sssdxxrpbb4NFX9bMrYnieiz11Vr5xJkJ", + "index": 337, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "193.221.135.102", + "dz_ip": "193.221.135.102", + "tunnel_id": 505, + "tunnel_net": "169.254.1.30/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5RFZd3GXePEdEHxewWbwwNSfY7QHY6ZYx8JUuuEfmmYi": { + "account_type": "User", + "owner": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "index": 565, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.10.233", + "dz_ip": "185.26.10.233", + "tunnel_id": 565, + "tunnel_net": "169.254.1.214/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "D8xKNftHzFcCekENuTEcFC1eoL9y8wNHEg4Q5z57KK4e", + "tunnel_endpoint": "0.0.0.0" + }, + "5Saf2pyJRktXnU1V8gXkcXkkxR5mXXsmai9D6f2oFhBN": { + "account_type": "User", + "owner": "2zWkA52KJ9odtJkcEem5dmnFTLr1Nve84wsRVdnPagEV", + "index": 94, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "195.12.227.249", + "dz_ip": "195.12.227.249", + "tunnel_id": 501, + "tunnel_net": "169.254.0.88/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DZVqmD4QqSWM2gUyEXdQhvt4u3NZtCRxdsn2n2nNiBRL", + "tunnel_endpoint": "0.0.0.0" + }, + "5Td6nUeJkScxsdFfiYkbZDe5j6JtyuQydpzXHvg7z5Cj": { + "account_type": "User", + "owner": "Fr8yndbYqLrjayohTJBeeUK3V161XUdU5fH43cRyv5uA", + "index": 890, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.145.112", + "dz_ip": "45.32.145.112", + "tunnel_id": 590, + "tunnel_net": "169.254.2.184/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ana2y2YvQ3ZPMwm6qhnN3nJoUSiT3qx5Pvetkq9xcfY", + "tunnel_endpoint": "0.0.0.0" + }, + "5VYNPLhJkhu6TKxLCYyDF4q7NYSG8sHd9gpGc98M5c2j": { + "account_type": "User", + "owner": "8cEL2xn3oRQhqR7N1thtXjYmnqssVQ525wDtExRfDVPL", + "index": 60, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "37.122.252.22", + "dz_ip": "37.122.252.22", + "tunnel_id": 502, + "tunnel_net": "169.254.0.48/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5WTarbRLpa8QLJ2BSHbP9yesv7brusH7tAJjS9VfjGRD": { + "account_type": "User", + "owner": "H4BAPHsQ3K3Lj7eEh6JDjmCKGZmm4yr5CbFKxF12yjce", + "index": 635, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "185.52.237.102", + "dz_ip": "185.52.237.102", + "tunnel_id": 538, + "tunnel_net": "169.254.2.30/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "spcti6GQVvinbtHU9UAkbXhjTcBJaba1NVx4tmK4M5F", + "tunnel_endpoint": "0.0.0.0" + }, + "5YeR9MZAVQv1F3n9n7C4C1QnUAtJHsU4qeLQtbm6Pm4P": { + "account_type": "User", + "owner": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "index": 674, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "193.34.212.64", + "dz_ip": "193.34.212.64", + "tunnel_id": 566, + "tunnel_net": "169.254.1.238/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5ZwrJi3ok7UJqe1xxUAgt22Gpig2s25AGY1P5NfHNBcT": { + "account_type": "User", + "owner": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu", + "index": 1323, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "103.88.233.21", + "dz_ip": "103.88.233.21", + "tunnel_id": 570, + "tunnel_net": "169.254.3.78/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "hy1oMaD3ViyJ8i6w1xjP79zAWBBaRd1zWdTW8zYXnwu", + "tunnel_endpoint": "0.0.0.0" + }, + "5amns9qJj45HZMSFcLt3PEncgxBmXUDFPpEdsHRa9tPB": { + "account_type": "User", + "owner": "5ARyghFyLkd22cx4WEj4UMDRRh9QfRdJidRi8XoedRdQ", + "index": 676, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "38.58.177.50", + "dz_ip": "38.58.177.50", + "tunnel_id": 532, + "tunnel_net": "169.254.2.58/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5c2CRutV5aewrFLneB9rKburx5rvFgd5Ayux7Cp7o5ka": { + "account_type": "User", + "owner": "AxhZALsZdN9mSdD4gDqoTEf72xcHs8v2CAdEee8zaAQq", + "index": 1188, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.11.171", + "dz_ip": "185.26.11.171", + "tunnel_id": 544, + "tunnel_net": "169.254.1.248/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5gAe4KogvQU4TU3jpAdXymrsBsJBPxCyebv9hUjvJKN6": { + "account_type": "User", + "owner": "Vivi5hzSGU14pQaWoE4ggVAtwQUEG9c1gX5nBkhJtn7", + "index": 1353, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "142.254.112.138", + "dz_ip": "142.254.112.138", + "tunnel_id": 545, + "tunnel_net": "169.254.3.212/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5h4GhLtpjxPXb3rxqjina55NYhhm6aVSqNUwj9AE3s9F": { + "account_type": "User", + "owner": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "index": 250, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "109.94.97.183", + "dz_ip": "109.94.97.183", + "tunnel_id": 510, + "tunnel_net": "169.254.0.240/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "G1eAmANVWf6ZeoxG4aMbS1APauyEDHqLxHFytzk5hZqN", + "tunnel_endpoint": "0.0.0.0" + }, + "5iAP4uQPVuLVproH6MLQGv6Mqi2fYc4sweN1VBS1TLDN": { + "account_type": "User", + "owner": "NV1TjmjofebF2wBTroaeYRLGJRzWrWqKu2L6PrukUgt", + "index": 122, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj", + "cyoa_type": "GREOverDIA", + "client_ip": "195.12.228.194", + "dz_ip": "195.12.228.194", + "tunnel_id": 500, + "tunnel_net": "169.254.0.120/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5jfqTbPFtqruEK7usrBycXiwxBwWVyAxfDKq7mVSA6kr": { + "account_type": "User", + "owner": "DzFn1LG97hQczGVqcLHjjetnMoGyHG7KohJxwPRUxfQD", + "index": 481, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "195.231.30.71", + "dz_ip": "195.231.30.71", + "tunnel_id": 508, + "tunnel_net": "169.254.0.0/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "NLMSHTjmSiRxGJPs3uaqtsFBC2dTGYwK41U18Nmw5kH", + "tunnel_endpoint": "0.0.0.0" + }, + "5jsXCuYaFR1Wzpvwgazz1dZPMawMy337pm8c8iwX7cxh": { + "account_type": "User", + "owner": "5qzgRKGnpZs27aqR3tkZp2HJ8ZXoxTBjYoayqVG1QKbs", + "index": 357, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "35.212.25.53", + "dz_ip": "35.212.25.53", + "tunnel_id": 524, + "tunnel_net": "169.254.1.58/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5kqg4MEfcAuhMQcHe5fTCdLBiuhjLAhfmdPCy1HU3o5V": { + "account_type": "User", + "owner": "6qwYjs5vCSEKaTMBbHinnW8fvdGj1r8cpzPoAV1EHKsw", + "index": 1161, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "5.151.82.178", + "dz_ip": "5.151.82.178", + "tunnel_id": 543, + "tunnel_net": "169.254.3.98/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Aap8GJLjWFP4oEiWBer1PWDVsv35eqC1LPkuTyh4qUEn", + "tunnel_endpoint": "0.0.0.0" + }, + "5mGrkiZ3Gh87VdMrSUADjGXDNTgWerofcUAtUrG5ac9h": { + "account_type": "User", + "owner": "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf", + "index": 578, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "173.201.36.164", + "dz_ip": "173.201.36.164", + "tunnel_id": 540, + "tunnel_net": "169.254.1.236/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5p1NE1jcKgsUotMTTKeDdDFqCjQfBKQFX1eK9r7bjVxV": { + "account_type": "User", + "owner": "DZ3wDCu2bVVH9yT2vHxLTRrLUBRRHGmytHc3prK3pRGN", + "index": 1118, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "103.28.89.181", + "dz_ip": "103.28.89.181", + "tunnel_id": 512, + "tunnel_net": "169.254.1.198/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "PRGNnb8DxVcP2WjSHfVRGgc8SkA5u6dbMwoTVV1BGKN", + "tunnel_endpoint": "0.0.0.0" + }, + "5qhbHrepx3L9J8S1CRwrU6s9RqG1mpSZEQEsgsHuQGHd": { + "account_type": "User", + "owner": "f1x5NQFQJxXVZWoig2VWeqDhx3D3oLzbDTrDsXVsKbD", + "index": 1133, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.152.160.150", + "dz_ip": "45.152.160.150", + "tunnel_id": 560, + "tunnel_net": "169.254.1.10/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5qiU8LqDD75bsbipPuPGNiiGuKhLsweHkUFLgAJEdko5": { + "account_type": "User", + "owner": "5zuNci3TV79w6zLoJZzbZujMvkVZb2FcSPhgv9aT24AK", + "index": 596, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.239", + "dz_ip": "177.54.154.239", + "tunnel_id": 515, + "tunnel_net": "169.254.2.10/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4SxZEAasqgiaFRJQJ6NqoTFPoCAVjQTQRiuRZasfnZv7", + "tunnel_endpoint": "0.0.0.0" + }, + "5rkTG2LC5CUr7hwW9YAM2M4qM62yxu47jcxoxKtKyATE": { + "account_type": "User", + "owner": "Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s", + "index": 247, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "109.94.97.181", + "dz_ip": "109.94.97.181", + "tunnel_id": 509, + "tunnel_net": "169.254.0.234/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Love31pnbDJNVzZZVbtV4h2ftvTPVcBpXW11BSTCa6s", + "tunnel_endpoint": "0.0.0.0" + }, + "5sQjz6s3zhdg8bV5kcgk4CM364eg27i91b67WwD4EcXV": { + "account_type": "User", + "owner": "3jc6iBZEMN5NQKJ969EHtg9s9uS2NJ1YxwBjMkC4mYpQ", + "index": 1228, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "147.28.165.79", + "dz_ip": "147.28.165.79", + "tunnel_id": 566, + "tunnel_net": "169.254.3.34/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5shcDoSErKAKxAt9SEvgYA1Y7f4ajdWzszVwxhWTpDgB": { + "account_type": "User", + "owner": "StkZAmzUiaUPmg6AhytiWLoRZ1bqefJSjDsqctjCmHb", + "index": 661, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.32.173", + "dz_ip": "64.130.32.173", + "tunnel_id": 531, + "tunnel_net": "169.254.2.46/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "StkZAmzUiaUPmg6AhytiWLoRZ1bqefJSjDsqctjCmHb", + "tunnel_endpoint": "0.0.0.0" + }, + "5v9ytkKhHMbpPyfxzTbCR9xq2AFPjKwXE7d3LnuxVf7N": { + "account_type": "User", + "owner": "HjbYYj832yabYrGL4WLzfJfsTagTd15tcPB71q76YGDg", + "index": 1180, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "5.187.35.9", + "dz_ip": "5.187.35.9", + "tunnel_id": 614, + "tunnel_net": "169.254.3.128/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9T6SNsBimjCRJpkEjiVsc8AcxTBa1XVA7RjnBGGfWP23", + "tunnel_endpoint": "0.0.0.0" + }, + "5w4pn9gRQuxnH1eKYqKco9AYKBdwQgG9nKgph15E2Z3j": { + "account_type": "User", + "owner": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu", + "index": 1091, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.11.145", + "dz_ip": "185.26.11.145", + "tunnel_id": 535, + "tunnel_net": "169.254.3.28/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "sTEVErNNwF2qPnV6DuNPkWpEyCt4UU6k2Y3Hyn7WUFu", + "tunnel_endpoint": "0.0.0.0" + }, + "5xffC18vawFPBj3ykj1iMKpLN2qjvd59YTCmJmPqRF1m": { + "account_type": "User", + "owner": "72qy6WqtSBRHNjTvvzwzcoCAhoef41kwPL2pc2bfGCo8", + "index": 362, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "95.214.55.25", + "dz_ip": "95.214.55.25", + "tunnel_id": 536, + "tunnel_net": "169.254.1.66/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "5zxMTq1dKVhpWhXwbiDPyC1FCoSUZjDtmfvtMBK6P2F8": { + "account_type": "User", + "owner": "vzzAePScm8ZV5oTnKCmLW2ZPGETo9nt2BXhgvoELM9R", + "index": 1099, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.11", + "dz_ip": "177.54.154.11", + "tunnel_id": 519, + "tunnel_net": "169.254.3.36/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GvfaiJUhNCRZGVGumsEF1eHDb8JpAeFAyHSrTifyhrbt", + "tunnel_endpoint": "0.0.0.0" + }, + "65VRZQGkcuNiya6vQxftfHXHc7d3CxYjPy7Gi5wYjzNS": { + "account_type": "User", + "owner": "CK8CoFhP8xQyqtVvyYaPmzPwUGcVBYduM4BmxKsqHZvm", + "index": 912, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "95.173.206.238", + "dz_ip": "95.173.206.238", + "tunnel_id": 559, + "tunnel_net": "169.254.2.196/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "C1ocKDYMCm2ooWptMMnpd5VEB2Nx4UMJgRuYofysyzcA", + "tunnel_endpoint": "0.0.0.0" + }, + "69Tmp2RBbH72Jn41n6KRDijvXKku2fpU79g9Gr7vX3gm": { + "account_type": "User", + "owner": "D4ujBcx3Wwc6rHhx1DFdTZL7vfDJDE6Y2BvRfE8HovBF", + "index": 1006, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "134.119.217.186", + "dz_ip": "134.119.217.186", + "tunnel_id": 550, + "tunnel_net": "169.254.2.216/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "D4ujBcx3Wwc6rHhx1DFdTZL7vfDJDE6Y2BvRfE8HovBF", + "tunnel_endpoint": "0.0.0.0" + }, + "6ATaxjH4o4JGGC2NJwaxQB2kzJjtWVN8fEYNzAdrg9EH": { + "account_type": "User", + "owner": "SLAY6uN1zZpXBTfbuDDCesNmM5D288xrz8uYvfS3n41", + "index": 125, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "65.19.161.132", + "dz_ip": "65.19.161.132", + "tunnel_id": 510, + "tunnel_net": "169.254.0.128/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6BEEQLCVNAFswBc61JCy16oBieMPRXkn5d3wxy8fj699": { + "account_type": "User", + "owner": "TrUtH9WTw1jBVuuExpm3MnC5XF7mW6J3x6oXXA9yX4U", + "index": 384, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.84.217", + "dz_ip": "72.46.84.217", + "tunnel_id": 517, + "tunnel_net": "169.254.0.252/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "TrUtH9WTw1jBVuuExpm3MnC5XF7mW6J3x6oXXA9yX4U", + "tunnel_endpoint": "0.0.0.0" + }, + "6CsN9qnbbjxZ5ZqN5QpS1bGvBBsoqhFgUv24eVMzC8kP": { + "account_type": "User", + "owner": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH", + "index": 1092, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.11.159", + "dz_ip": "185.26.11.159", + "tunnel_id": 536, + "tunnel_net": "169.254.3.30/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "dst2u7mXMyDvb14cSErRNA1mxH1d5VXbSXgZ3DKE9xH", + "tunnel_endpoint": "0.0.0.0" + }, + "6CusU9o9599U9JJC5R1MN853bHzwKbLeZ9BSTsryfWdN": { + "account_type": "User", + "owner": "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4", + "index": 1159, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "5.151.82.130", + "dz_ip": "5.151.82.130", + "tunnel_id": 541, + "tunnel_net": "169.254.3.94/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5DY36rimdoHzZxRnQ9Nhjra6Yag8SV9xcM7khgAVHSXw", + "tunnel_endpoint": "0.0.0.0" + }, + "6EboTuS7cyd964oJMFhhvmWZYZp16Yizr5XscWBTz3Gt": { + "account_type": "User", + "owner": "5ARyghFyLkd22cx4WEj4UMDRRh9QfRdJidRi8XoedRdQ", + "index": 911, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.134.108.254", + "dz_ip": "45.134.108.254", + "tunnel_id": 593, + "tunnel_net": "169.254.2.194/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EK6SjLmNm37ui8mCx6WqZ8dg4aeSfTZkrmHUW3zcegsx", + "tunnel_endpoint": "0.0.0.0" + }, + "6GKnpZtuPFr3mW1TCF2yZfS7u2x99pxgZPxSZ2HoxCRM": { + "account_type": "User", + "owner": "Ft4ADhkxMVfgxNDQFqA3ymaNGC39rCHdUj6H8KEWQqXy", + "index": 1357, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "162.19.233.4", + "dz_ip": "162.19.233.4", + "tunnel_id": 517, + "tunnel_net": "169.254.1.210/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6KFpzSGCkQ4w94M131Sfrx5JN5tCH91gMWe3YToA9qEE": { + "account_type": "User", + "owner": "6p2vFtcXjGaNK92scmoaWT7TWmVfpmvpdSqeJsTYPnKi", + "index": 1166, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "81.16.237.134", + "dz_ip": "81.16.237.134", + "tunnel_id": 561, + "tunnel_net": "169.254.3.104/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6KXCB99njPMmQMXa1XnVhnSmwpCZR1DhpmnMD5RUS7Ui": { + "account_type": "User", + "owner": "odcT4VPY3zHRZbaPkNw4wfTLRbdbnZ51EGcdaJU5wAr", + "index": 781, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "38.46.223.238", + "dz_ip": "38.46.223.238", + "tunnel_id": 537, + "tunnel_net": "169.254.2.146/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6LVx2APfS9ArCv4di18rHqxdrpNqGgoKkQd1DzoDv5Lb": { + "account_type": "User", + "owner": "AfZTWYoFQbzqCMmUBTD7XwxFvjob1FVyCvkaXRryxtKc", + "index": 990, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "207.246.84.247", + "dz_ip": "207.246.84.247", + "tunnel_id": 533, + "tunnel_net": "169.254.1.154/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "AfZTWYoFQbzqCMmUBTD7XwxFvjob1FVyCvkaXRryxtKc", + "tunnel_endpoint": "0.0.0.0" + }, + "6M25VkQRRJFAXAxKEYMNqcHp6yKEpE3aB2xxMAdG7epg": { + "account_type": "User", + "owner": "8Xr43z2SBqcbfabiaupiRRMHZbA5iUevUGkuG1Z32dwp", + "index": 1456, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "149.50.101.43", + "dz_ip": "149.50.101.43", + "tunnel_id": 579, + "tunnel_net": "169.254.4.4/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6M8BpTtG7r62PK1jAEqhBsNa8UsnW87VDvrESisRsYhF": { + "account_type": "User", + "owner": "2ZZkgKcBfp4tW8qCLj2yjxRYh9CuvEVJWb6e2KKS91Mj", + "index": 407, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.158.38.50", + "dz_ip": "45.158.38.50", + "tunnel_id": 523, + "tunnel_net": "169.254.1.126/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6QX8i2k3cmqqGVx1seHLBKaNgB8smEKF97nJYpS7Tf7V": { + "account_type": "User", + "owner": "arm3ZcZ8TtNKXCo5MB6EMuhenyv2iUR8oTB7SjLy3tu", + "index": 423, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.98.198", + "dz_ip": "107.155.98.198", + "tunnel_id": 532, + "tunnel_net": "169.254.1.148/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6Qbd5i52GcRZJAxsQpBDCo1GmExwC43AubNhcxV4Tk9J": { + "account_type": "User", + "owner": "4xPk1pHXPhDcyNCT6Ze2cHq8pWV96pKhxRKpy48q6Npv", + "index": 909, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "95.179.230.90", + "dz_ip": "95.179.230.90", + "tunnel_id": 531, + "tunnel_net": "169.254.2.190/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2zykwzzo1pd3H2oSj5j5SRLTvmpa9Nr2S2Bh8tTVd5Tq", + "tunnel_endpoint": "0.0.0.0" + }, + "6RnwXZkKHzddr7JbvohSuKan5TWFGAodpQpRREwGKH8e": { + "account_type": "User", + "owner": "BFMufPp4wW276nFzB7FVHgtY8FTahzn53kxxJaNpPGu6", + "index": 1265, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "102.211.135.179", + "dz_ip": "102.211.135.179", + "tunnel_id": 547, + "tunnel_net": "169.254.3.168/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6SJyzg1wx1rcLqdSzFhj9wQDbRcqta6yEFGmS21Ak1Yt": { + "account_type": "User", + "owner": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK", + "index": 558, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.113.99", + "dz_ip": "67.213.113.99", + "tunnel_id": 562, + "tunnel_net": "169.254.1.202/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "eyeYaqg9e2L6xw7YwsSLm27eWJfhLNAm6ETQm8TXNoK", + "tunnel_endpoint": "0.0.0.0" + }, + "6TH76wGezhoLtyCK8qbhN1FK8PWmMQsf6iyEHENPWnbc": { + "account_type": "User", + "owner": "TrUtH9WTw1jBVuuExpm3MnC5XF7mW6J3x6oXXA9yX4U", + "index": 252, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.113.97", + "dz_ip": "67.213.113.97", + "tunnel_id": 523, + "tunnel_net": "169.254.0.244/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "TxtxXzLTDQ9W4ya3xgwyaqVa6Tky6Yqhi5BLpPCc9tZ", + "tunnel_endpoint": "0.0.0.0" + }, + "6VuvfVGe5fCe88Y9M53rwA2Q6HfiyUQACAxuCKTQHDqv": { + "account_type": "User", + "owner": "7hMD4oMmGT4GsS4DfBKzJ75wSjDhgu2pvcazbvoKPrNs", + "index": 1307, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.43.6", + "dz_ip": "212.83.43.6", + "tunnel_id": 627, + "tunnel_net": "169.254.3.196/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6WjUmWAYqM8K2gdaDQBYUr4u37pUR2dgnAxRBJr35JVX": { + "account_type": "User", + "owner": "U3hq6THZ5b1hzUQUtxaHRYr7pNAHeMKvfLBL59NjNo9", + "index": 1175, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "5.39.251.204", + "dz_ip": "5.39.251.204", + "tunnel_id": 564, + "tunnel_net": "169.254.3.120/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Dm7L1FMRrHBtVpkYDNqQo4ej9MjJKu7EERaHDAPhBmUY", + "tunnel_endpoint": "0.0.0.0" + }, + "6XFbaZZ9i6zKrKLx5cRjK4CZtpdeZbWzFMGbp7PEbFJ7": { + "account_type": "User", + "owner": "BCjGyexo1i7qpN9CbJ9Zt8avWr4Lb2JRtcm43sJvsgQK", + "index": 1378, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "216.128.150.115", + "dz_ip": "216.128.150.115", + "tunnel_id": 567, + "tunnel_net": "169.254.3.48/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BCjGyexo1i7qpN9CbJ9Zt8avWr4Lb2JRtcm43sJvsgQK", + "tunnel_endpoint": "0.0.0.0" + }, + "6XwLiQwh7joRZa8KMf4t4Z4CCPY9pHrJU7TjVDXTjavi": { + "account_type": "User", + "owner": "novaeuhY2JH2WHhc9KVTHDx2cyJZdXJC6faf4CtARZn", + "index": 1471, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "102.211.135.171", + "dz_ip": "102.211.135.171", + "tunnel_id": 575, + "tunnel_net": "169.254.1.84/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6Y4H18rWHc8i7ZGNyWcPKiuTaNUedr92WPXub79t7fWW": { + "account_type": "User", + "owner": "DzFn1LG97hQczGVqcLHjjetnMoGyHG7KohJxwPRUxfQD", + "index": 547, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "94.142.240.72", + "dz_ip": "94.142.240.72", + "tunnel_id": 533, + "tunnel_net": "169.254.1.190/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6ZUmMLeEpZpZTR4xKuuCiXKLAsZWRhLPFiM4u4Zvog7y": { + "account_type": "User", + "owner": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2", + "index": 144, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.235", + "dz_ip": "177.54.154.235", + "tunnel_id": 504, + "tunnel_net": "169.254.0.160/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2", + "tunnel_endpoint": "0.0.0.0" + }, + "6ccBCyFFpqzvYwJ5Q6XoLcd5tD1WuJ6QACY1wZ78SzRu": { + "account_type": "User", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 196, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "3.65.206.72", + "dz_ip": "3.65.206.72", + "tunnel_id": 501, + "tunnel_net": "169.254.0.204/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6duvXkdXtEdRD2VZF3DcsJJieFhCZtGnnaVJ4JWtVRB6": { + "account_type": "User", + "owner": "tidL6153xE1qvk4NbWeuGVF5w53gDgoQNaJDADNvrNE", + "index": 893, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "62.197.45.241", + "dz_ip": "62.197.45.241", + "tunnel_id": 546, + "tunnel_net": "169.254.1.170/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "idLi1KLjkzEmLvzdB756HweHRmpuC3AGkGnK2zhWJ45", + "tunnel_endpoint": "0.0.0.0" + }, + "6ehwUszjHHZjP3wEqvBJ4VmUrnN8nm2EChMQgBqJ71g6": { + "account_type": "User", + "owner": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "index": 672, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.109.202", + "dz_ip": "107.155.109.202", + "tunnel_id": 516, + "tunnel_net": "169.254.1.56/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6jWnxJmaCZ5hG85GUWhCSJHxPhje2qo1ZC7xndvVp1yz": { + "account_type": "User", + "owner": "5ARyghFyLkd22cx4WEj4UMDRRh9QfRdJidRi8XoedRdQ", + "index": 675, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "38.46.222.221", + "dz_ip": "38.46.222.221", + "tunnel_id": 522, + "tunnel_net": "169.254.2.56/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6kLFWUy5VK7s8pcrPmTEaofKddm4SZw1E3vUCrFwkfsq": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 513, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.107.71", + "dz_ip": "208.91.107.71", + "tunnel_id": 500, + "tunnel_net": "169.254.0.14/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6qURx43oNimGFZKuSxb9C6iw94d1sMpAwo3FpCAFXabv": { + "account_type": "User", + "owner": "DZ8r6dJzbr4NB69rEKCVv1HJQznbp3c3ng1RaZnjx8Qu", + "index": 757, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.50.133", + "dz_ip": "64.130.50.133", + "tunnel_id": 542, + "tunnel_net": "169.254.2.118/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "dmygEwMFAC3v3npKsFnWRLanNQqx1RrBxZFnKgrwJNi", + "tunnel_endpoint": "0.0.0.0" + }, + "6un5B7w94jAjYmyTq6pNmhLzjWHGaxsxg9yTtqogBqHV": { + "account_type": "User", + "owner": "F1rUdK6ctLyP3yxeMXeMVrsBHGYaGVE9K8VPdbDH8YFH", + "index": 991, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.52.201", + "dz_ip": "64.130.52.201", + "tunnel_id": 544, + "tunnel_net": "169.254.1.226/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6vS6fNTpHv7m1HFgRdA6ATTP6eSc9pa4D5RYarCfA3hx": { + "account_type": "User", + "owner": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "index": 1468, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "102.211.135.175", + "dz_ip": "102.211.135.175", + "tunnel_id": 567, + "tunnel_net": "169.254.3.184/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6vyeAPTpM6QV3FrtbMFn7m8brqEkPgHDbvMURQFqiCYK": { + "account_type": "User", + "owner": "93C8y75YR6yHHLVQVrbLU4RqkrzCMzR174Te93MJ3NZF", + "index": 1033, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "141.98.216.168", + "dz_ip": "141.98.216.168", + "tunnel_id": 560, + "tunnel_net": "169.254.2.112/31", + "status": "Activated", + "publishers": "", + "subscribers": "AR8DvEn77GRQ19drMhPCjvFx2StcRJ8XbLVKS6yrgQAV", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6w3wCaHju4iUGvvRTg6hdAMb1JoiHnABzqZxidjykGj6": { + "account_type": "User", + "owner": "4J2aqd4yFxWaxUe5J4Tq4AkpTizbPjWjyhX53GQv9ihD", + "index": 1179, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "173.231.13.42", + "dz_ip": "173.231.13.42", + "tunnel_id": 541, + "tunnel_net": "169.254.3.20/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6wzHhzpY4srJcwbWVEG5Z9uvE5TmCnuGBoewLMYzM8j5": { + "account_type": "User", + "owner": "HWHjje1ahsJgH9wp7YskyPV8L6ruB4YZFa1jqQ2vRweb", + "index": 166, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "140.82.20.6", + "dz_ip": "140.82.20.6", + "tunnel_id": 512, + "tunnel_net": "169.254.0.74/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6xfiFYoBkvd3wJPiGWjQGfConhNaPFyoHiA4thnZcucx": { + "account_type": "User", + "owner": "G71Xp23bPKk8ep3oFseyAjrWQKg9EGZivY8mBnBZWM8X", + "index": 405, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.164.218", + "dz_ip": "5.199.164.218", + "tunnel_id": 510, + "tunnel_net": "169.254.1.122/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4uH4G6YiD5G8rU3mtPg73C2Uqamrqedy3FboTZcZrh6x", + "tunnel_endpoint": "0.0.0.0" + }, + "6yK1BFNAD89Lb8uj6eCqWNr9FYibSE7nCvDiSTHyji1n": { + "account_type": "User", + "owner": "Ste1115xFGdAYK5jaWA3dEFcUc1S5jEbVvD8e327zty", + "index": 1450, + "bump_seed": 248, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.63.45", + "dz_ip": "64.130.63.45", + "tunnel_id": 553, + "tunnel_net": "169.254.0.18/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "6yjmPX6NQ8GsRRfKmbuZzr7k8GFwAUgxvLyynQHA34QD": { + "account_type": "User", + "owner": "EYTN9eRR4y4zN2yCR9L8cWvvbWbGTSuNrRT1ixMf6wND", + "index": 431, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.186.110", + "dz_ip": "84.32.186.110", + "tunnel_id": 530, + "tunnel_net": "169.254.1.156/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "71G6VhHQhAH3a158geEQF5EXZHs14kahuWrLj4NR9nPe": { + "account_type": "User", + "owner": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu", + "index": 1469, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "102.211.135.162", + "dz_ip": "102.211.135.162", + "tunnel_id": 570, + "tunnel_net": "169.254.4.14/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "dcntruDNP5SEcGV4RxnsqXFURdDZGT3DTQv68Q8H7Vu", + "tunnel_endpoint": "0.0.0.0" + }, + "72C4Sr4sMhL3YFHym813JCZkWCNzgm7vhWsE9fPHG5ta": { + "account_type": "User", + "owner": "4EKxPYXmBha7ADnZphFFC13RaKNYLZCiQPKuSV8YWRZc", + "index": 771, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "212.7.200.110", + "dz_ip": "212.7.200.110", + "tunnel_id": 554, + "tunnel_net": "169.254.2.132/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "74r2uBbqZWUR1JxUzrN8kf6hZ8cEd6bJ4xH3gnLdMK46": { + "account_type": "User", + "owner": "4EKxPYXmBha7ADnZphFFC13RaKNYLZCiQPKuSV8YWRZc", + "index": 878, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "212.95.38.67", + "dz_ip": "212.95.38.67", + "tunnel_id": 530, + "tunnel_net": "169.254.2.166/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "79WxJJK6jd954mnbTNVxDVhrETVedvb49T6vBQq2xE9B": { + "account_type": "User", + "owner": "HwBL75xHHKcXSMNcctq3UqWaEJPDWVQz6NazZJNjWaQc", + "index": 1177, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.11.113", + "dz_ip": "64.176.11.113", + "tunnel_id": 575, + "tunnel_net": "169.254.3.124/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5t4shVsKnUqgjmhK3fFNsvyju2E6Rd7cc4S5pmqqEVEW", + "tunnel_endpoint": "0.0.0.0" + }, + "7AYFLssBZN5VqjBJSXF1et6QPKqiWQUtvFnxZxyME4gD": { + "account_type": "User", + "owner": "79jiM1FrLqZpUWt4f1Uo7imRVQ4KiFfKAeb5mhHzJryU", + "index": 1496, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "155.138.217.197", + "dz_ip": "155.138.217.197", + "tunnel_id": 587, + "tunnel_net": "169.254.4.18/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7AbVcJe9SDtsvb3wGZefiAVtw9cetYZA3HcrTpCzM4WM": { + "account_type": "User", + "owner": "U3hq6THZ5b1hzUQUtxaHRYr7pNAHeMKvfLBL59NjNo9", + "index": 1170, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.152.160.240", + "dz_ip": "45.152.160.240", + "tunnel_id": 612, + "tunnel_net": "169.254.3.112/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7C9dKMTRaiEp2R5WRrJGF1BJXaeDneBpMJXffCc3iD16": { + "account_type": "User", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 191, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "18.132.203.9", + "dz_ip": "18.132.203.9", + "tunnel_id": 508, + "tunnel_net": "169.254.0.194/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7D2YCxxaLMoBhqT341ixkMj3euC54EtWn5jeJtD3pVSn": { + "account_type": "User", + "owner": "dzg82bRmEN7rqJLw1L3U6uBYP7uFujht1Aqpzawmouq", + "index": 1327, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.255.82", + "dz_ip": "149.28.255.82", + "tunnel_id": 500, + "tunnel_net": "169.254.0.36/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7EgE9LWULFCT7jTi2ctXUcaetD4yd4AXAsyHvUH6fdNG": { + "account_type": "User", + "owner": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "index": 255, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "103.50.32.193", + "dz_ip": "103.50.32.193", + "tunnel_id": 512, + "tunnel_net": "169.254.0.250/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "jntr1vkzvSujfckGR6ANmFmirVoPBMNr5XJGKP5uDQA", + "tunnel_endpoint": "0.0.0.0" + }, + "7F3Z8VvvsbswV29DqmRPfq8fjxQPgtEMe4xCLCiSnvMp": { + "account_type": "User", + "owner": "DzFn1LG97hQczGVqcLHjjetnMoGyHG7KohJxwPRUxfQD", + "index": 482, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "185.167.205.3", + "dz_ip": "185.167.205.3", + "tunnel_id": 500, + "tunnel_net": "169.254.0.184/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "NLMSHTjmSiRxGJPs3uaqtsFBC2dTGYwK41U18Nmw5kH", + "tunnel_endpoint": "0.0.0.0" + }, + "7GjowgkxeqL1HqFTbLDB2B1vGozkoGs9HBmQdv7RhwXJ": { + "account_type": "User", + "owner": "2KFrkqEeSBKEHiMjUugPxTkBJ2jXepgFBqHu5ZFxtaFg", + "index": 1124, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "38.127.60.128", + "dz_ip": "38.127.60.128", + "tunnel_id": 569, + "tunnel_net": "169.254.3.44/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7K7yWESrZMWPLJhs61MC8spnok4B5JW46ZNmF3zCzxx1": { + "account_type": "User", + "owner": "95A3UmKrAmTuNJkjipBULk5wHopiFvLWfxTKmhR6AzQc", + "index": 1130, + "bump_seed": 249, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.12", + "dz_ip": "45.139.132.12", + "tunnel_id": 608, + "tunnel_net": "169.254.3.68/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "95A3UmKrAmTuNJkjipBULk5wHopiFvLWfxTKmhR6AzQc", + "tunnel_endpoint": "0.0.0.0" + }, + "7NR7fvdbpUuyLpS52DmoE7kMsyrdzwkZooSdQvfeuje1": { + "account_type": "User", + "owner": "DZfHh2vjXFqt8zfNbT1afm8PGuCm3BrQKegC5THtKFdn", + "index": 1472, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.38.64", + "dz_ip": "149.28.38.64", + "tunnel_id": 508, + "tunnel_net": "169.254.0.68/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7PgNrbeWDfTy8MQoBBGh8uqgDWhHUmmctonrrHMn9yH1": { + "account_type": "User", + "owner": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "index": 143, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.45", + "dz_ip": "67.213.122.45", + "tunnel_id": 503, + "tunnel_net": "169.254.0.158/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "radM7PKUpZwJ9bYPAJ7V8FXHeUmH1zim6iaXUKkftP9", + "tunnel_endpoint": "0.0.0.0" + }, + "7XRhzjZqUJdsYEAoEvE8qyWaay84j7CH2JAWh7DMJBpY": { + "account_type": "User", + "owner": "punkzLJgsVnsq9Mzkm4gHsa9iSMMvS3DzxiYcHCP6Qz", + "index": 294, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "15.235.228.93", + "dz_ip": "15.235.228.93", + "tunnel_id": 501, + "tunnel_net": "169.254.0.50/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7ZEggTdmVYYt9osSLhk3GQ5bUE4yP4M1pZK5VNb6AuiS": { + "account_type": "User", + "owner": "5ARyghFyLkd22cx4WEj4UMDRRh9QfRdJidRi8XoedRdQ", + "index": 1463, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "70.34.200.136", + "dz_ip": "70.34.200.136", + "tunnel_id": 592, + "tunnel_net": "169.254.2.192/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "KiNGTLWCgoqLKn266xxT2Zosko3FumNv7Z4V7V9cyKQ", + "tunnel_endpoint": "0.0.0.0" + }, + "7b9zq7azQkDWxtEkVKQ3tX2stgt8LirqQpX4EtQ2k9uv": { + "account_type": "User", + "owner": "6k4oeLB9fcAuNFnBERKqZXPC2vfnMpaeNnqxU3D3zEKo", + "index": 1499, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.135.150", + "dz_ip": "45.139.135.150", + "tunnel_id": 559, + "tunnel_net": "169.254.4.22/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7bybpUqukcizhB7c2onX8uLNsTdSTQ1wb8cb4pWjw2L5": { + "account_type": "User", + "owner": "dcntrvQD4yQ68X4A7ZNWNvuZAbb3SV2ty4DdaMjYTDv", + "index": 1330, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "173.214.163.54", + "dz_ip": "173.214.163.54", + "tunnel_id": 572, + "tunnel_net": "169.254.3.164/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7dVdkKFmt9CGrvysmHuhzXidqZ8rnVfbtrTMW7WYLr61": { + "account_type": "User", + "owner": "3C5HPrFxxanYuV7973hkZSqSWrFXXfKMqGRuu1sPJvVa", + "index": 792, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.70.67", + "dz_ip": "84.32.70.67", + "tunnel_id": 555, + "tunnel_net": "169.254.2.160/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ADjyeNzWd8yhEjCVyAqT87eqoyGRbimERQsNhFQcXjop", + "tunnel_endpoint": "0.0.0.0" + }, + "7gyh4nnJUkWEGN3TMLabrSKp8JXWEFa6hi6dHipyuf2A": { + "account_type": "User", + "owner": "6XYGcK9az9aKvp4o1pJYVCm3hfAUHo1UvUZmsA8v72ko", + "index": 396, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.134.108.184", + "dz_ip": "45.134.108.184", + "tunnel_id": 543, + "tunnel_net": "169.254.1.106/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "nebu15XQKGpxzhhckADBX9PgvGN5qk9RRJCFLKc118w", + "tunnel_endpoint": "0.0.0.0" + }, + "7hTY4etmd72uWSbJFbc7CCt3mTwqB2ge9FFMfVZQt8Mh": { + "account_type": "User", + "owner": "8xJwwdSp8BVG5uxvKGGRGHbZSj8o28ZhiPMmoLb7VrDk", + "index": 1467, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "86.105.224.6", + "dz_ip": "86.105.224.6", + "tunnel_id": 567, + "tunnel_net": "169.254.3.58/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "pitMDEaMmWmr7qP8HsNqarPQkd3jhZbLJibhhQnL5RG", + "tunnel_endpoint": "0.0.0.0" + }, + "7hkH91TziDnPdZydUh1pBYJbfJi33rkrxDMK5gxKy1kP": { + "account_type": "User", + "owner": "A4XSeSJb1MEgqF4k3pFzL5cKg5FRehW8cgzZs95ey3dY", + "index": 527, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.34.6", + "dz_ip": "149.28.34.6", + "tunnel_id": 505, + "tunnel_net": "169.254.0.84/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7i3JZyh8Ag67s5nv9ZhMNJpJmgpSGxziAtKwTSVQkgUb": { + "account_type": "User", + "owner": "A9SMCJ13FPihwfsdankuLbSpjKZSeNpk6DR52N2YEE3h", + "index": 1434, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.134.232", + "dz_ip": "45.139.134.232", + "tunnel_id": 509, + "tunnel_net": "169.254.3.248/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7mTSjDCsJJCczBgpK1t1VhS2yY636MJyMkw9YHBrYnFR": { + "account_type": "User", + "owner": "5cGMA8TgdfEAfaFh2xecUfnSKacRFg3sfNkJ3721TGpX", + "index": 240, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.171", + "dz_ip": "45.139.132.171", + "tunnel_id": 513, + "tunnel_net": "169.254.0.224/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "7tWUCL5r9BdbLygUiLtEssWQ6RfAUZemk7CnFkgHJspS": { + "account_type": "User", + "owner": "2DNHGuehXQarNt63WPdDjb7roSwAEqNNyqsX3XKJoNJ7", + "index": 1031, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.63.76", + "dz_ip": "64.130.63.76", + "tunnel_id": 507, + "tunnel_net": "169.254.0.188/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BM2vE2QqkB9fGtC34WPtM8drbgta13SBkhRq6dRG9J4J", + "tunnel_endpoint": "0.0.0.0" + }, + "7vKcF4fFLDKK9zDne9VJ7DzbAgU1jkXyA93a7Yo6NA2z": { + "account_type": "User", + "owner": "2jHD7HZJbtZbVuGHimBgR2BPsubacyXF1HuutLR6tQVi", + "index": 1303, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "66.45.238.110", + "dz_ip": "66.45.238.110", + "tunnel_id": 581, + "tunnel_net": "169.254.3.190/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "81RvG4HXhgfqLfDCFBp4DoLXJ3GBQx4qEe5JihFNDDVy": { + "account_type": "User", + "owner": "GZMbBC62TfFZj7YBM11AciMSm7ejKRGjzg9ehsmjLtqz", + "index": 1258, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "85.195.124.119", + "dz_ip": "85.195.124.119", + "tunnel_id": 528, + "tunnel_net": "169.254.3.162/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "841uAEnB1Hkjv8gush3pRmx65ihL9wZ4vK6zfDjHh4Bz": { + "account_type": "User", + "owner": "grptonHnt7YSmJokGK9TJJTBXDT8ca4LSWMHCCfzzPa", + "index": 360, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.107", + "dz_ip": "45.139.132.107", + "tunnel_id": 503, + "tunnel_net": "169.254.0.12/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8717yKFE73cpjvxGhqnAENfKpXqLXRC6sGDFPwCa3aDY": { + "account_type": "User", + "owner": "XG5YXBHUpV4Lcaeps6JQ49U3EV14TkRA8TNrx1Q37tX", + "index": 1080, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "91.242.214.245", + "dz_ip": "91.242.214.245", + "tunnel_id": 566, + "tunnel_net": "169.254.3.24/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "23SUe5fzmLws1M58AnGnvnUBRUKJmzCpnFQwv4M4b9Er", + "tunnel_endpoint": "0.0.0.0" + }, + "88V8ybc1bM938Pu9VVU5tfFQxYWwoRxL9m7xwu5yupEN": { + "account_type": "User", + "owner": "3UtHK2ZWwmDKxd6QzrKmh9Pey1gWS2SW1MoaZuGZbc7E", + "index": 1160, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "5.151.82.214", + "dz_ip": "5.151.82.214", + "tunnel_id": 542, + "tunnel_net": "169.254.3.96/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8BkpUutM9sPpPb7MnbSvqf7W5xNxVboG5UkNNi48MXCm": { + "account_type": "User", + "owner": "5gEBNPDWRApyuC2gJCSdyv7RCm4sgXXSCeH8D1EfDCMt", + "index": 307, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "15.204.108.105", + "dz_ip": "15.204.108.105", + "tunnel_id": 519, + "tunnel_net": "169.254.1.24/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8Cc5cuwCxgJGjJSDJMqjwntHWBfZKWgHQ2aM9REt2772": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 1283, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "23.109.62.84", + "dz_ip": "23.109.62.84", + "tunnel_id": 519, + "tunnel_net": "169.254.0.6/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8DHkGES9nekDuE1Mq4Dc4aiE8TfQynAa3s3nH6z1VtWG": { + "account_type": "User", + "owner": "8rWDbEsuz4UWF2ZXiHhMECPkTZm51YrRaQSoSz8RPz2H", + "index": 1039, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.42.87", + "dz_ip": "212.83.42.87", + "tunnel_id": 598, + "tunnel_net": "169.254.2.224/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8rWDbEsuz4UWF2ZXiHhMECPkTZm51YrRaQSoSz8RPz2H", + "tunnel_endpoint": "0.0.0.0" + }, + "8E59GT63EQu5HXtg86QdRHT3mM7afkZrCsinPyCBc3nC": { + "account_type": "User", + "owner": "DZVh4EDpA7xd8FDM3QTmDZyffxG7X6Dn2TvdoSk9Ferb", + "index": 276, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.214", + "dz_ip": "208.91.110.214", + "tunnel_id": 519, + "tunnel_net": "169.254.0.172/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DZVySotZvrvJyVAcgjFtUDm93zoCaq9wBruMAUz83CWW", + "tunnel_endpoint": "0.0.0.0" + }, + "8EDkBGgfqQEa9kvjfdJ6tSsk5RbxRCQn9nQQ4X9rHGAT": { + "account_type": "User", + "owner": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT", + "index": 156, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.59", + "dz_ip": "67.213.122.59", + "tunnel_id": 505, + "tunnel_net": "169.254.0.180/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DZv25oNCWFvGXu9tH63BiAXvG94syweGZhbvdN3HxDxT", + "tunnel_endpoint": "0.0.0.0" + }, + "8FVUpfwp7cSJtSTkAQU25CVjGwjqx7eVnQiiwSdNt4Uz": { + "account_type": "User", + "owner": "FAfKvBBvmSVFhsWM7D3geMeT5ckEdU3neBUPwW8Hh7Ee", + "index": 868, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "204.13.234.82", + "dz_ip": "204.13.234.82", + "tunnel_id": 556, + "tunnel_net": "169.254.2.152/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8FX86JKM6T2NHBW8AHihTwCvFBk4ByRacUjHFSVJnW1r": { + "account_type": "User", + "owner": "EVAsrVQgWCVQXHKAVNsHi41TbxFbdfyusM8AFUjdU8JW", + "index": 1163, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "104.238.220.71", + "dz_ip": "104.238.220.71", + "tunnel_id": 542, + "tunnel_net": "169.254.3.100/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2Eq6YD8P8QXTeoz9h6JHjgZ55t8RSxNdx4waMDCoPmQU", + "tunnel_endpoint": "0.0.0.0" + }, + "8HseBeLBgPtkpn8H6JNrbovKrdMdpd1SnKDioNR9BqWt": { + "account_type": "User", + "owner": "CnevKtH5zaThFqJmpWZSBzjEMY8bsWiVkkeP6GVSMVgf", + "index": 1229, + "bump_seed": 249, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.113.117", + "dz_ip": "67.213.113.117", + "tunnel_id": 527, + "tunnel_net": "169.254.3.140/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8SvGdG35Cf14Q9dw5BD5zG7HiBrfLhJdfq34quLPbBtV": { + "account_type": "User", + "owner": "9eCo4hm3QNaxLjsbXZDC1sLXYN34G4FqJaWT9Df7LfiH", + "index": 492, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "149.50.108.223", + "dz_ip": "149.50.108.223", + "tunnel_id": 500, + "tunnel_net": "169.254.0.18/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8TFcNFAjyMwhpiAoAhTQ9HwqoCE3hDP1zExuxoyyGBeQ": { + "account_type": "User", + "owner": "DZiGTxgDvmBFiNYmukLHYePG2S4CRydoHjQ4kF6vtMJu", + "index": 59, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "103.50.32.128", + "dz_ip": "103.50.32.128", + "tunnel_id": 501, + "tunnel_net": "169.254.0.46/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8TFrmCzF8kUmBYGRmRUqinepXAW2h29u7opmExES3PkV": { + "account_type": "User", + "owner": "2zgJSdhpGHh5kkzrK37NgTDhF8jDTyvKDRxpA2XjNoBH", + "index": 109, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "93.115.25.190", + "dz_ip": "93.115.25.190", + "tunnel_id": 507, + "tunnel_net": "169.254.0.102/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8ToVZoonW3HfixbA4MkiMP5SG87hcHysMe1U5R22mKJJ": { + "account_type": "User", + "owner": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd", + "index": 566, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "103.88.234.123", + "dz_ip": "103.88.234.123", + "tunnel_id": 528, + "tunnel_net": "169.254.1.216/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "vnd1Ps8w3fsi54qUMJxBhUWARES34Qw7JQXDZxvbysd", + "tunnel_endpoint": "0.0.0.0" + }, + "8Vwmi6zLFtMzkRtVA2Bp9k2UAMLSNGyNCGNU1ahuoRir": { + "account_type": "User", + "owner": "8xJwwdSp8BVG5uxvKGGRGHbZSj8o28ZhiPMmoLb7VrDk", + "index": 1181, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "86.105.224.25", + "dz_ip": "86.105.224.25", + "tunnel_id": 569, + "tunnel_net": "169.254.3.130/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "L3oTghmPSoAqMtxmTaAn5jNJrDehWCB6hYA4GAtsiNr", + "tunnel_endpoint": "0.0.0.0" + }, + "8YTfC81HCNYKHuw6sjdYJnamZdAByKUFd2JNM5mf3FNs": { + "account_type": "User", + "owner": "juit9nXU1uKis8ivPz959mJpjQuzHPZ9cJtHAs3vk1Q", + "index": 1329, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "147.28.171.39", + "dz_ip": "147.28.171.39", + "tunnel_id": 571, + "tunnel_net": "169.254.3.76/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8YgfHsssPHzQDVA7797Sb6TEKBF8XMZAd3UTFLvuirnS": { + "account_type": "User", + "owner": "DemMMhqhEZRQxFZUj8kvmdPKKEhswAZGr67tiSwqk7iP", + "index": 1190, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.113.63", + "dz_ip": "149.28.113.63", + "tunnel_id": 520, + "tunnel_net": "169.254.0.134/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "G4GT8z4AKWNoy3x6nuzxW83UfFXLXzrwn7DZQt4GvWdU", + "tunnel_endpoint": "0.0.0.0" + }, + "8e6gKLDq3mp3NrgXSjmpTqDiaEC8gTafVk82yUuPXp2o": { + "account_type": "User", + "owner": "DTaZYJr3QqGqqGD4yYqTX7iCQuTVz9CW4YWwQxqJjtaF", + "index": 574, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.38", + "dz_ip": "45.139.132.38", + "tunnel_id": 567, + "tunnel_net": "169.254.1.228/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CHED86J97RCtt8HxhNxvUSQWPqFsiftNpWWQd9HZvqvw", + "tunnel_endpoint": "0.0.0.0" + }, + "8gccZdu9hUg1mWJRUDBEoXN1HxfJ8fbGkXwa3Ph7wJut": { + "account_type": "User", + "owner": "Fr8yndbYqLrjayohTJBeeUK3V161XUdU5fH43cRyv5uA", + "index": 889, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "147.28.171.51", + "dz_ip": "147.28.171.51", + "tunnel_id": 589, + "tunnel_net": "169.254.2.182/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "kC7mBpLy53EW5U49u9WHVPe65kbQmoRu9Uu3VhwhLhm", + "tunnel_endpoint": "0.0.0.0" + }, + "8gu8A3fvVTW3xwhaWGrEXLAket8kxt8oPYB6WWVLEpGp": { + "account_type": "User", + "owner": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "index": 1178, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "216.18.214.178", + "dz_ip": "216.18.214.178", + "tunnel_id": 544, + "tunnel_net": "169.254.3.126/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8hCkZf8e5X2ZVFRy6uBB9T1TwjJUczbt7KCoAzKntfgr": { + "account_type": "User", + "owner": "N43JWBg42ZoUFMkHsRUVbP7wGVdxaHKanqaF9BBNiFC", + "index": 418, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.135.201.200", + "dz_ip": "45.135.201.200", + "tunnel_id": 549, + "tunnel_net": "169.254.1.144/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "N43JWBg42ZoUFMkHsRUVbP7wGVdxaHKanqaF9BBNiFC", + "tunnel_endpoint": "0.0.0.0" + }, + "8hcQVtpfdb43Cyc382SrnpJ5iHPi4TEkoLT9kYXgtdyY": { + "account_type": "User", + "owner": "donK13ycwd7Xp3ZCGCgRQupemv9s7MedbrQsnpwT3UX", + "index": 1366, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.251", + "dz_ip": "45.139.132.251", + "tunnel_id": 597, + "tunnel_net": "169.254.3.230/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8iJSAnYwCENFDn4u2rK8Y2FfwFETDwbG37GWYZLDxTzs": { + "account_type": "User", + "owner": "STKEbHxS7rRMgL1NE99MqV1VjTypnUV5YmE7TqAC4JY", + "index": 742, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.52.115", + "dz_ip": "64.130.52.115", + "tunnel_id": 551, + "tunnel_net": "169.254.2.96/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EBk678aQvc3cUkfGyoehfw21JQfJXjmWuBeopYc89RSV", + "tunnel_endpoint": "0.0.0.0" + }, + "8kANNJqRE1XfcAdUAEJHh4thHoDE4RYnq2vzS497DJFY": { + "account_type": "User", + "owner": "5zuNci3TV79w6zLoJZzbZujMvkVZb2FcSPhgv9aT24AK", + "index": 591, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "91.191.213.18", + "dz_ip": "91.191.213.18", + "tunnel_id": 545, + "tunnel_net": "169.254.2.2/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8khRj2KagpGmvrQ1FD7yWfCwjN7GqTXwJrKKHrS5zmg": { + "account_type": "User", + "owner": "Fqh8Nritu6PGuscfDxsgwq8KiLimR2D59R4F6EKYdKvt", + "index": 1048, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "91.237.141.128", + "dz_ip": "91.237.141.128", + "tunnel_id": 532, + "tunnel_net": "169.254.2.238/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "LunaowJnt875WWoqDkhHhE93SNYHa6tfFNVn1rqc57c", + "tunnel_endpoint": "0.0.0.0" + }, + "8mnF1cNFgdSMrKwf54s8wAFMiG3Eg24ETDc371spNSgN": { + "account_type": "User", + "owner": "9Wmaz9VPpEnH67ZqrvYd9bcH66DtsGaEKcSQE1ac5wkf", + "index": 1268, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "38.244.189.33", + "dz_ip": "38.244.189.33", + "tunnel_id": 570, + "tunnel_net": "169.254.3.174/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8pEtHvxVUb6z5fahmAM2bqrHD6Ji6YDosasMR4RhCcq1": { + "account_type": "User", + "owner": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "index": 1185, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.241", + "dz_ip": "177.54.154.241", + "tunnel_id": 524, + "tunnel_net": "169.254.0.2/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "tunnel_endpoint": "0.0.0.0" + }, + "8qYqmTZ4zg1ke32dYQvmaFskCijmdBUasBWFiTVXxE4f": { + "account_type": "User", + "owner": "CaT9dSx37Quj1kcAXEVd6ncM6NLvYUSqhtgEnn1JtNKC", + "index": 55, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "198.244.165.235", + "dz_ip": "198.244.165.235", + "tunnel_id": 505, + "tunnel_net": "169.254.0.38/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "8tSPZahQUuASy7BhG3dBP2LJZPiJcLP9Vi4k7EgVNWET": { + "account_type": "User", + "owner": "qZMH9GWnnBkx7aM1h98iKSv2Lz5N78nwNSocAxDQrbP", + "index": 779, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "46.229.232.132", + "dz_ip": "46.229.232.132", + "tunnel_id": 534, + "tunnel_net": "169.254.2.52/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "qZMH9GWnnBkx7aM1h98iKSv2Lz5N78nwNSocAxDQrbP", + "tunnel_endpoint": "0.0.0.0" + }, + "8ubroiTygp1sCMB6D4rXP1tQjD88nCWBcNCwvmCmpnP": { + "account_type": "User", + "owner": "BZXRhxJq9CpLA1TrjZhMA4TzUSmUGDQSQDHBtSouHAZp", + "index": 1020, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.44.108", + "dz_ip": "64.130.44.108", + "tunnel_id": 503, + "tunnel_net": "169.254.2.20/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FttTBmXi5tmGJtiRcbVLwfMnY3ngrxw8DNSWRWMrr1WS", + "tunnel_endpoint": "0.0.0.0" + }, + "8vgk3xcmXbydu1wWinjP6uk8q7CPHdtkwxARn72qQLgT": { + "account_type": "User", + "owner": "rgh2ZRt5ejyQ7saSLPNmYXsNuqwvkn8jzEWWXoAWrhr", + "index": 586, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.241.154", + "dz_ip": "45.77.241.154", + "tunnel_id": 513, + "tunnel_net": "169.254.1.252/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "gridqZmeBcsUKT2Mv4M9YFHFN3tVLFb2TCtTcLD1cAd", + "tunnel_endpoint": "0.0.0.0" + }, + "8xG9KKbwo9VdsM2ZTUVsCNgs8UmtC7sg6mwb9g5sG2mb": { + "account_type": "User", + "owner": "popscoyTKVksa4TyTXw488b3vvFxM7qQEyTBeMQopKu", + "index": 649, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "88.216.197.11", + "dz_ip": "88.216.197.11", + "tunnel_id": 540, + "tunnel_net": "169.254.2.34/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "popscoyTKVksa4TyTXw488b3vvFxM7qQEyTBeMQopKu", + "tunnel_endpoint": "0.0.0.0" + }, + "8zeAaqWje9bWKPkqxVibxWt6BTzAGVcD5NDtdSnbqabo": { + "account_type": "User", + "owner": "GYdXjKUgTWgrLKSBT1jXfwLWQKSpG3RMn6AAa2Uf5ZUY", + "index": 795, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.172.167", + "dz_ip": "5.199.172.167", + "tunnel_id": 588, + "tunnel_net": "169.254.2.164/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3RXKQBRv7xKTQeNdLSPhCiD4QcUfxEQ12rtgUkMf5LnS", + "tunnel_endpoint": "0.0.0.0" + }, + "8zwZC5DdfYc51WxYpPB1gGC1yqWD7byhJdGkbNSn26BB": { + "account_type": "User", + "owner": "2uxEHizFmmnLekKG2LZJwxNabhpymEYfdVCpgDxjt87m", + "index": 1255, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj", + "cyoa_type": "GREOverDIA", + "client_ip": "185.32.162.88", + "dz_ip": "185.32.162.88", + "tunnel_id": 502, + "tunnel_net": "169.254.3.160/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "92R7DULSKKLBJzou9hUcBVtLMMp7eW9udUf18mKvjyZ5": { + "account_type": "User", + "owner": "97jbhVBYcSmwGXjrx5PPWXucDsVBqwyoQ6rzP3B6eeMt", + "index": 1460, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.25", + "dz_ip": "45.139.132.25", + "tunnel_id": 568, + "tunnel_net": "169.254.4.8/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "95QyzLYhQ5EmnXUCbCr8hXAjM8vr8ZorMLaYnts44o7c": { + "account_type": "User", + "owner": "DjdiUGStnZFhxqwXdv7jNK4ZfxfmoAwZZWVixkQAkYhH", + "index": 90, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.49.117", + "dz_ip": "64.130.49.117", + "tunnel_id": 507, + "tunnel_net": "169.254.0.82/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7ZjHeeYEesmBs4N6aDvCQimKdtJX2bs5boXpJmpG2bZJ", + "tunnel_endpoint": "0.0.0.0" + }, + "97yiXSsnxAUtPcQuBjmEhUfcKyZP8a8hV15xH2CRrYnQ": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 521, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "85.195.100.119", + "dz_ip": "85.195.100.119", + "tunnel_id": 554, + "tunnel_net": "169.254.1.124/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "99hmBkcmHUVSsfmvX5i49gvdT9A9ZeTWgYucDziVAhLx": { + "account_type": "User", + "owner": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "index": 1324, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "88.216.197.3", + "dz_ip": "88.216.197.3", + "tunnel_id": 506, + "tunnel_net": "169.254.0.76/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9Bm9szAbQ4mGGu97e7Cc4ubbhGtZjSTDc1CcDRqq7rv7": { + "account_type": "User", + "owner": "U3hq6THZ5b1hzUQUtxaHRYr7pNAHeMKvfLBL59NjNo9", + "index": 1173, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "5.39.251.202", + "dz_ip": "5.39.251.202", + "tunnel_id": 562, + "tunnel_net": "169.254.3.116/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9ERLm6oTAdMz4PGaBHZnQCWz6X3saEv2YxcZznXbLrqc": { + "account_type": "User", + "owner": "4L45W8TgyZbL1Kvpc8yvdnCHcFgVaJUtntHzkS7MdtX5", + "index": 528, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "45.63.111.115", + "dz_ip": "45.63.111.115", + "tunnel_id": 510, + "tunnel_net": "169.254.0.148/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9FYezQoskFFRFdVtL9yTRT1auuMTAeuUTZ2is5wJVgnq": { + "account_type": "User", + "owner": "2zgJSdhpGHh5kkzrK37NgTDhF8jDTyvKDRxpA2XjNoBH", + "index": 568, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.57.216", + "dz_ip": "64.130.57.216", + "tunnel_id": 526, + "tunnel_net": "169.254.1.220/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EvnRmnMrd69kFdbLMxWkTn1icZ7DCceRhvmb2SJXqDo4", + "tunnel_endpoint": "0.0.0.0" + }, + "9GrZXu5PBfts6tQLkXgoinnVYFjNGBXw3URfdfvrvrh6": { + "account_type": "User", + "owner": "GYdXjKUgTWgrLKSBT1jXfwLWQKSpG3RMn6AAa2Uf5ZUY", + "index": 114, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "188.214.130.97", + "dz_ip": "188.214.130.97", + "tunnel_id": 509, + "tunnel_net": "169.254.0.108/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9Hfdeg9tbC1szC6cR6V74q8wqonXkK2HygbAskQDUjZT": { + "account_type": "User", + "owner": "SAgA3V4pD5GtwoxDetudzYdHdjXGJyPxH47QZF96ncu", + "index": 1049, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.9.29", + "dz_ip": "185.26.9.29", + "tunnel_id": 562, + "tunnel_net": "169.254.2.240/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9JBCXKGpaJw39B9FnrVXeUnmwD5aQD1pEQ626ZYRczad": { + "account_type": "User", + "owner": "LoDE8y7vFtmxacxL8gKRVHnX6aFVt1BHwP7cgvTyieY", + "index": 101, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "192.69.209.194", + "dz_ip": "192.69.209.194", + "tunnel_id": 505, + "tunnel_net": "169.254.0.94/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9Q1BiNUSB1pAVASCWaz5aXncCo1cwbkiAmyiMfATntmi": { + "account_type": "User", + "owner": "ASTERhckBQwAM82EQm2S2ivVcQ9mHQHZQs5u4BHMv6JH", + "index": 1129, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.105", + "dz_ip": "45.139.132.105", + "tunnel_id": 607, + "tunnel_net": "169.254.3.66/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ASTERhckBQwAM82EQm2S2ivVcQ9mHQHZQs5u4BHMv6JH", + "tunnel_endpoint": "0.0.0.0" + }, + "9TRQFKdbXQSXYhRAt3VudwuRh3giaNHDWaQRY5vqCrFF": { + "account_type": "User", + "owner": "EAW9vxqogvdPNapq7QTDpiVTHK6o7begUhPVnf854VTc", + "index": 1062, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "137.220.32.24", + "dz_ip": "137.220.32.24", + "tunnel_id": 540, + "tunnel_net": "169.254.3.6/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EAW9vxqogvdPNapq7QTDpiVTHK6o7begUhPVnf854VTc", + "tunnel_endpoint": "0.0.0.0" + }, + "9b6SnDTZXkbHr6ACxzMmPu6uDmC6ShK7huyMmLwrsG9D": { + "account_type": "User", + "owner": "H4BAPHsQ3K3Lj7eEh6JDjmCKGZmm4yr5CbFKxF12yjce", + "index": 43, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "5.255.78.21", + "dz_ip": "5.255.78.21", + "tunnel_id": 502, + "tunnel_net": "169.254.0.16/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9bdLBgPJgK6QtBA26xUWspLcyTfQ3ZGArq9XAzHYKNZX": { + "account_type": "User", + "owner": "Hhn4usDjnktbPURJHbi4YrPdKudBD5Qq35mTcaQ3Uu6", + "index": 261, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "77.81.119.214", + "dz_ip": "77.81.119.214", + "tunnel_id": 513, + "tunnel_net": "169.254.0.254/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Hhn4usDjnktbPURJHbi4YrPdKudBD5Qq35mTcaQ3Uu6", + "tunnel_endpoint": "0.0.0.0" + }, + "9f22sWrfRycGshdQ5XJN9c5GHTPNZgp2AmGyGcSGoWyd": { + "account_type": "User", + "owner": "CNRyYnXZjryxNdSUwztdmVFVuQPXvugQ1d2wtRTjjTb3", + "index": 678, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "31.128.59.209", + "dz_ip": "31.128.59.209", + "tunnel_id": 568, + "tunnel_net": "169.254.1.230/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CNRyYnXZjryxNdSUwztdmVFVuQPXvugQ1d2wtRTjjTb3", + "tunnel_endpoint": "0.0.0.0" + }, + "9hAz3ocytFjGSordkoNfTv2Pn2mxxiUeRD4xpUig4A5C": { + "account_type": "User", + "owner": "Bp2KKQrzY99LJTeDSG9xLFRrVGoiU1VBnknNhH451Qmp", + "index": 793, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "8.52.160.4", + "dz_ip": "8.52.160.4", + "tunnel_id": 533, + "tunnel_net": "169.254.2.70/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9hUWQdU3pCBi3nHSwdYrWJbQMyNK3UgjRHqDc5wdUWKw": { + "account_type": "User", + "owner": "Fr8yndbYqLrjayohTJBeeUK3V161XUdU5fH43cRyv5uA", + "index": 888, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.64.138", + "dz_ip": "45.77.64.138", + "tunnel_id": 544, + "tunnel_net": "169.254.2.180/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GvTwyQnoYLCV2qANCyVYyKEzZ6Q9FzZwfmNCMSZn7xbb", + "tunnel_endpoint": "0.0.0.0" + }, + "9iiZX2Qkknp7wKiofF3jN7RBJ3K544C8Zm93PfGp1mE5": { + "account_type": "User", + "owner": "DJFxo3w8ngqRZ1Qy4Wv3SFeDtu9EeytKvZz9wSBFffq2", + "index": 1138, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "94.158.242.130", + "dz_ip": "94.158.242.130", + "tunnel_id": 529, + "tunnel_net": "169.254.3.80/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9mfK9hvGs463X1NAbqsqe8Pe75QiUKWiZZh3tC6USmyX": { + "account_type": "User", + "owner": "oWPCJQUE4QP4ii1oCSLmryBaVy4sNyN1NVj16TZtyDe", + "index": 587, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "64.176.12.167", + "dz_ip": "64.176.12.167", + "tunnel_id": 544, + "tunnel_net": "169.254.1.254/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "bookoVmqw4QjVj5BbkFacouadx9M7816wyRkfM7A5Lo", + "tunnel_endpoint": "0.0.0.0" + }, + "9ohRXqWrW6Ds2t87SCfA62w3PBFShyPQYiZrvRoU8ivN": { + "account_type": "User", + "owner": "phz1CRbEsCtFCh2Ro5tjyu588VU1WPMwW9BJS9yFNn2", + "index": 74, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.84.221", + "dz_ip": "72.46.84.221", + "tunnel_id": 504, + "tunnel_net": "169.254.0.66/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9qFc5t2fd7Mi4YFFVwwWPY3FQYqxA8RZvHviHdfDvTSa": { + "account_type": "User", + "owner": "Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN", + "index": 359, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "147.75.84.157", + "dz_ip": "147.75.84.157", + "tunnel_id": 522, + "tunnel_net": "169.254.1.62/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9riq3n6tRybnjHmD7VWAViAUM8ZbAiBqM5TzxQeiHoMi": { + "account_type": "User", + "owner": "3ddX9QcC6DjFqPTysrFWtR48v5g3wJjB862sji4s5Tui", + "index": 1051, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "91.189.182.206", + "dz_ip": "91.189.182.206", + "tunnel_id": 554, + "tunnel_net": "169.254.2.244/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3ddX9QcC6DjFqPTysrFWtR48v5g3wJjB862sji4s5Tui", + "tunnel_endpoint": "0.0.0.0" + }, + "9titXYt6PiNT15UjZJizWMwNFzHgqMt5tBKjP2A3Hx9h": { + "account_type": "User", + "owner": "9r2CsyjRTmTRtu8GFk5oJRSQr5YfSENxDkf3eox8iPLa", + "index": 1045, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.55.13", + "dz_ip": "64.130.55.13", + "tunnel_id": 552, + "tunnel_net": "169.254.2.232/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9r2CsyjRTmTRtu8GFk5oJRSQr5YfSENxDkf3eox8iPLa", + "tunnel_endpoint": "0.0.0.0" + }, + "9uAY5brspTodjkeo5mXo3684wYGmq44ZGkjUuv7x7NGD": { + "account_type": "User", + "owner": "Fqh8Nritu6PGuscfDxsgwq8KiLimR2D59R4F6EKYdKvt", + "index": 540, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "91.237.141.224", + "dz_ip": "91.237.141.224", + "tunnel_id": 520, + "tunnel_net": "169.254.1.180/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "9upncEvoPHmcLKRjF39a172BS81VK5Hfi3CXQX2UqwrA": { + "account_type": "User", + "owner": "GZRFDqw5aiiyUVzWcJ7ayfqhAaXvq2HbfvGeCEoyUnHF", + "index": 1220, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "85.195.104.157", + "dz_ip": "85.195.104.157", + "tunnel_id": 556, + "tunnel_net": "169.254.1.98/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6WgdYhhGE53WrZ7ywJA15hBVkw7CRbQ8yDBBTwmBtAHN", + "tunnel_endpoint": "0.0.0.0" + }, + "9v86HpMpVHKsSF32JK2BE58atcWQtRLYg3oZrhG8DSwY": { + "account_type": "User", + "owner": "SWiz7QwnYPm61pWWUUkMhj4r5pZLP1SvYibdHcB2cov", + "index": 679, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.43.180", + "dz_ip": "212.83.43.180", + "tunnel_id": 574, + "tunnel_net": "169.254.2.62/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SWiz7QwnYPm61pWWUUkMhj4r5pZLP1SvYibdHcB2cov", + "tunnel_endpoint": "0.0.0.0" + }, + "9xwDmL3cB4LFNfEVJKscWQE6vQV4cqWUkS4wjAHbB73L": { + "account_type": "User", + "owner": "C4bgengueVA9cRcprjutgu9XgvgoaaFnCqvpZaPy27xx", + "index": 389, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "217.170.192.106", + "dz_ip": "217.170.192.106", + "tunnel_id": 520, + "tunnel_net": "169.254.1.96/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "C4bgengueVA9cRcprjutgu9XgvgoaaFnCqvpZaPy27xx", + "tunnel_endpoint": "0.0.0.0" + }, + "A3THJoHURkhYYJn9w2zrerSn8RQQvYUHQVVXPNY5iyZB": { + "account_type": "User", + "owner": "F1rUdK6ctLyP3yxeMXeMVrsBHGYaGVE9K8VPdbDH8YFH", + "index": 720, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "91.189.180.214", + "dz_ip": "91.189.180.214", + "tunnel_id": 532, + "tunnel_net": "169.254.2.82/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5XKJwdKB2Hs7pkEXzifAysjSk6q7Rt6k5KfHwmAMPtoQ", + "tunnel_endpoint": "0.0.0.0" + }, + "A6KTNhDgnsFh2pPr8rHTgun4U1X4Gb2d7ZGj1rNcNnDu": { + "account_type": "User", + "owner": "DZETFp32xdxwtzY31TCrMaSvVmqG9Hp6DqQ8z36Qoj9U", + "index": 728, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "86.105.224.73", + "dz_ip": "86.105.224.73", + "tunnel_id": 547, + "tunnel_net": "169.254.2.12/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FjYEr2UCeFzNfAKiFrbhG34Zv8LxbmfHYAFhAfc7SLQL", + "tunnel_endpoint": "0.0.0.0" + }, + "AESMvVGDBzATtUGhRUCYS9gbPwcGX1c3imUYorzoqVsy": { + "account_type": "User", + "owner": "EYTN9eRR4y4zN2yCR9L8cWvvbWbGTSuNrRT1ixMf6wND", + "index": 429, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.158.38.30", + "dz_ip": "45.158.38.30", + "tunnel_id": 525, + "tunnel_net": "169.254.1.152/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "AH1GitZ3uqUTwaMCaHDSaimSWidcdqsua5Njbuo8FEcX": { + "account_type": "User", + "owner": "JAdJizeQExgJQpWwxzXpABv66cLYteUXQ1uiwWqCdiTC", + "index": 155, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "173.231.41.194", + "dz_ip": "173.231.41.194", + "tunnel_id": 513, + "tunnel_net": "169.254.0.178/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "AH4pKkrSwNdRFTvSQgSUYjcJRFY7Xw3NVPWJVxzWFL38": { + "account_type": "User", + "owner": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "index": 157, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "109.94.97.111", + "dz_ip": "109.94.97.111", + "tunnel_id": 506, + "tunnel_net": "169.254.0.182/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "ANtS4s4e5TKCAwuJdJvSPZazk8rx6ax6539SiWniV1fV": { + "account_type": "User", + "owner": "J2obR2DK7gnd6H88HjKzEYuMyboDWRNpbzwmGSh31nnu", + "index": 791, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "62.197.45.100", + "dz_ip": "62.197.45.100", + "tunnel_id": 555, + "tunnel_net": "169.254.2.158/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "J2obR2DK7gnd6H88HjKzEYuMyboDWRNpbzwmGSh31nnu", + "tunnel_endpoint": "0.0.0.0" + }, + "ARgFbuFZoATNvATzNKgotU4zCEHvFUc6MJUsDHGtmkN2": { + "account_type": "User", + "owner": "6k4oeLB9fcAuNFnBERKqZXPC2vfnMpaeNnqxU3D3zEKo", + "index": 1058, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.23", + "dz_ip": "45.139.132.23", + "tunnel_id": 569, + "tunnel_net": "169.254.2.102/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ArMBx6veRq33ffEP9sxHafiPRgrtzww4XvbwZbSMfXiM", + "tunnel_endpoint": "0.0.0.0" + }, + "AUdeNiFrrKmR8gsz77XpXCPjkgWWxqbo1NKxcR7e1mdu": { + "account_type": "User", + "owner": "GTAh4uFkY5rYxDuZ54yQuBXoYdEgALHuSg3dFSKpeQuc", + "index": 1454, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.208.196", + "dz_ip": "45.77.208.196", + "tunnel_id": 502, + "tunnel_net": "169.254.3.250/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "AZ2Bv5Fbhks47rdnnUxgCsJhJu7SoTowwXYdRh4MiZSF": { + "account_type": "User", + "owner": "te1ee9rGf369wxYQkuxkvuvMuTJ9cksgZySmNUF8rNY", + "index": 1365, + "bump_seed": 245, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "103.14.27.11", + "dz_ip": "103.14.27.11", + "tunnel_id": 580, + "tunnel_net": "169.254.3.228/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Ab58Zxt3UFSu3jwkXHP4uhxKQVpVP4Wo6r8qBfeNsJn2": { + "account_type": "User", + "owner": "dCENvFQpGSNrrRBiioxwF1ftaXyApiEYF2e8e7tipFV", + "index": 877, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "15.235.232.142", + "dz_ip": "15.235.232.142", + "tunnel_id": 518, + "tunnel_net": "169.254.2.174/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "idCE5k2BtTpwXdwAC7Var1enT9reut9fWECcxQP7LY7", + "tunnel_endpoint": "0.0.0.0" + }, + "AbGDN7L3BAwrAYUtxiZkgGSspm1rnRNm52zPtpXznmJM": { + "account_type": "User", + "owner": "Hpp3K99JubT3LKFxm98LuRcW9onLck46UqYwNTmkXoTe", + "index": 345, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.8.37", + "dz_ip": "185.26.8.37", + "tunnel_id": 522, + "tunnel_net": "169.254.1.42/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "A79u1awz7CqnxmNYEVtzWwSzup3eKPNW6w2Jrd56oZ3y", + "tunnel_endpoint": "0.0.0.0" + }, + "AcBxgHW3XtXLL2qgw8Pn4tjAUUjEWkjUHThcKhF8r5Gf": { + "account_type": "User", + "owner": "4hm5RaZR21k5V3dsc5xzEsVW1RSv7pbPPfNrUCDvseTH", + "index": 1333, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.71.110", + "dz_ip": "84.32.71.110", + "tunnel_id": 574, + "tunnel_net": "169.254.1.14/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Agwaj7G6tsPHWq7puiYeKNmAY4k1suxDaqLtRG1TzKbz": { + "account_type": "User", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 194, + "bump_seed": 248, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "13.214.217.82", + "dz_ip": "13.214.217.82", + "tunnel_id": 507, + "tunnel_net": "169.254.0.200/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "AitCufP8Ut3NWMWJ9ViM7TpvkdbXRv9yts336CbbJ5cn": { + "account_type": "User", + "owner": "45vM2Lm3kaQCRpc6teeyY9BSXBo62q3BbHzCR4hQmu2m", + "index": 303, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.57.142", + "dz_ip": "64.130.57.142", + "tunnel_id": 516, + "tunnel_net": "169.254.1.22/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "AkWDG5VJ8JQAcxJpig8qhHGcTqeuXScpZbGtkzgUs9u8": { + "account_type": "User", + "owner": "ZeRoXF8PpC1t7qfmqdthLdeS6gudnTqyHirSnE5ZzgR", + "index": 398, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "104.238.221.184", + "dz_ip": "104.238.221.184", + "tunnel_id": 526, + "tunnel_net": "169.254.1.110/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "AoHcv4reTNYGp2b8x9pyddDdRdhRpvyZepH6VCpfxfX7": { + "account_type": "User", + "owner": "EmE5KsWqFYFyxytrCQWy91aGZy7nGfd96cdPfi7R5YRE", + "index": 1426, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.152.160.142", + "dz_ip": "45.152.160.142", + "tunnel_id": 560, + "tunnel_net": "169.254.3.192/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "soLStaCk5TiGCpeLKa9Fvv6f5JQGMa6S3uhLh826e9N", + "tunnel_endpoint": "0.0.0.0" + }, + "AtNWNasWfpFULmd7XV7GNbuL2t2k3LqAaXZBB9Jdug2Z": { + "account_type": "User", + "owner": "grptonHnt7YSmJokGK9TJJTBXDT8ca4LSWMHCCfzzPa", + "index": 1119, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.226", + "dz_ip": "45.139.132.226", + "tunnel_id": 605, + "tunnel_net": "169.254.3.54/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "grptonHnt7YSmJokGK9TJJTBXDT8ca4LSWMHCCfzzPa", + "tunnel_endpoint": "0.0.0.0" + }, + "AvW1S3qy6dxkY9MkxQGYxG6XMkVvWUqBvdcQWgNEMtYy": { + "account_type": "User", + "owner": "5zuNci3TV79w6zLoJZzbZujMvkVZb2FcSPhgv9aT24AK", + "index": 592, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.164.220", + "dz_ip": "5.199.164.220", + "tunnel_id": 514, + "tunnel_net": "169.254.2.4/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5zuNci3TV79w6zLoJZzbZujMvkVZb2FcSPhgv9aT24AK", + "tunnel_endpoint": "0.0.0.0" + }, + "AxbyUNUgUCDmMJCCZg8osGWpDeLan1cp9XEeBitLtKqR": { + "account_type": "User", + "owner": "AeTCQ1nzdCrHFWpGxfi1XRu7EnxY7G2zpsEJUBCCjvdc", + "index": 721, + "bump_seed": 255, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.34.187", + "dz_ip": "64.86.248.130", + "tunnel_id": 551, + "tunnel_net": "169.254.2.84/31", + "status": "Activated", + "publishers": "AR8DvEn77GRQ19drMhPCjvFx2StcRJ8XbLVKS6yrgQAV", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "B3mcwnK6LeFqu9oBUeVuQvmiDPZN94Bh86ENH5ds3Fyv": { + "account_type": "User", + "owner": "adramSYKBv1yHoZTub4kepcmF5LybPxwyJcsz4fpfi7", + "index": 1127, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "102.211.135.164", + "dz_ip": "102.211.135.164", + "tunnel_id": 557, + "tunnel_net": "169.254.3.62/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "B4k27tVSERa8Q9VYUiS6rXfKc472REccLvewiB9Q3Fxm": { + "account_type": "User", + "owner": "25YWCasvASJdyD6izQzzoXhUSvvoDQdM6FmFaj9m9tzh", + "index": 1267, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "89.42.231.136", + "dz_ip": "89.42.231.136", + "tunnel_id": 623, + "tunnel_net": "169.254.3.172/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "B6Sq6ihn5kJ5UJYQmnsY4mf1W7efLfM77ZPgLMp7zgrb": { + "account_type": "User", + "owner": "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf", + "index": 668, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.127.125", + "dz_ip": "67.213.127.125", + "tunnel_id": 543, + "tunnel_net": "169.254.2.54/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9ab9JcweshDxrrd63NwFZSAndDc828L6X3RRMQHpXgJN", + "tunnel_endpoint": "0.0.0.0" + }, + "B87iVeubJjRMWLTsyijLJ3VChYpS6VjFLDmKJJtUEuwt": { + "account_type": "User", + "owner": "6mCzwUFcdTuz6fFJRA8nY1iXNRJqPpXU1PvCfANfVXhh", + "index": 1377, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "66.42.82.69", + "dz_ip": "66.42.82.69", + "tunnel_id": 585, + "tunnel_net": "169.254.3.202/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "B8w1oqPPQ5TsrQNrvm1qFe1azd1E9sGPTFHWQrHEa9Wc": { + "account_type": "User", + "owner": "GRn3KfdV1YHF6phjdcWmizAqjVwXRsBuKLT4M2MYCRzv", + "index": 62, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "188.214.130.71", + "dz_ip": "188.214.130.71", + "tunnel_id": 504, + "tunnel_net": "169.254.0.52/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "B8zmp1WmQdURTKaAfBy6h7iSJHLN4zpq9sBndNBgnrr7": { + "account_type": "User", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 192, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "35.159.195.72", + "dz_ip": "35.159.195.72", + "tunnel_id": 502, + "tunnel_net": "169.254.0.196/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "B9bYWiNoVV8ugbw5Q2uV7bJGC6pkirKrSWuSm9TjMdqn": { + "account_type": "User", + "owner": "GiQcU8KJeBVn2DvKvRxgRByp6ZgUEkaoT8VQENYxy3P7", + "index": 1380, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "194.187.206.62", + "dz_ip": "194.187.206.62", + "tunnel_id": 576, + "tunnel_net": "169.254.3.170/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BEpg5KTQEpfMKJcNrEwa3q61arGyaromA3NnynLyb8LW": { + "account_type": "User", + "owner": "GUDk7YkqVHJFKMnximYS4QU4jjGW67v9291CHSk8riPy", + "index": 172, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "66.45.251.114", + "dz_ip": "66.45.251.114", + "tunnel_id": 514, + "tunnel_net": "169.254.0.112/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BG7Wvpd8J4m1JE6xmLpEwovZ72AMqaKxNwngb3KXKdEm": { + "account_type": "User", + "owner": "GWiVLzVLgrb5GM6kRsuXU9HYcvqm6g2Tk3BRVqJG5EMK", + "index": 709, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "66.206.2.170", + "dz_ip": "66.206.2.170", + "tunnel_id": 518, + "tunnel_net": "169.254.0.96/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BJJjSMjwNFJKPGPrk7VB71v139ivgmgU2fep1ZYzqs8t": { + "account_type": "User", + "owner": "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4", + "index": 1369, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "5.101.137.205", + "dz_ip": "5.101.137.205", + "tunnel_id": 552, + "tunnel_net": "169.254.3.236/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BL1Vy1Bis3trondACcy34dr5QdUzLQT2WH3j4YjrE6oN": { + "account_type": "User", + "owner": "8XT7HWWmJTWmwvqQSAEyCUyeMoKhytK6MEBBt4njSzAp", + "index": 1067, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "109.94.97.193", + "dz_ip": "109.94.97.193", + "tunnel_id": 533, + "tunnel_net": "169.254.3.14/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "tkmaiSoZ3F8MofkQBVWG6JYSCzyN6ioe7ReYXohx3WJ", + "tunnel_endpoint": "0.0.0.0" + }, + "BNcw4pQGveBW2A1cJzkWKrATK6evGA15KBvZ1zmc3DVL": { + "account_type": "User", + "owner": "B5vUeuecL61h5nwtdakp8wws8iFQrdUJUB5Y8gFb7BCG", + "index": 1152, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "23.227.220.223", + "dz_ip": "23.227.220.223", + "tunnel_id": 509, + "tunnel_net": "169.254.3.84/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BRh8aRrv9y1Lhpbvwh6HcyHLsorS9zyKsoNC1W8cim31": { + "account_type": "User", + "owner": "CmyoV6S7g8nRqGi21ZEjJc5GoUokmKV9uf2YBUPiCnhZ", + "index": 1187, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.37.3", + "dz_ip": "64.130.37.3", + "tunnel_id": 515, + "tunnel_net": "169.254.1.208/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "fotby1ABxpei2EVH9uXJ6KbHYgPjbg4Sny9eRzQjtRN", + "tunnel_endpoint": "0.0.0.0" + }, + "BVJE2G3AtxLiicgV3J75uoK2PANr5xNuxFCLRPzyF2Ww": { + "account_type": "User", + "owner": "A7nii4QwFSUaz8zCbiy1xFaapnJTYxLLVVWj9TvaFYC4", + "index": 422, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "104.243.33.35", + "dz_ip": "104.243.33.35", + "tunnel_id": 531, + "tunnel_net": "169.254.1.16/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4b1onMDEasBh4BuPekQWijx3BYR64hAE1z2jJyeZUkck", + "tunnel_endpoint": "0.0.0.0" + }, + "BXrtpd1CKETFWLEgLwby4CyPDJ1B9CfMjWCtsZY3Pean": { + "account_type": "User", + "owner": "LKDZajqodHVYB5gQrJM16VUAVMzTP2ZUHgmPGHoASfD", + "index": 179, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "194.126.172.242", + "dz_ip": "194.126.172.242", + "tunnel_id": 513, + "tunnel_net": "169.254.0.186/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BY3Ue7x5xAzoE99uWs6FL1buA89MVjFVdCCVZ25zinj7": { + "account_type": "User", + "owner": "U3hq6THZ5b1hzUQUtxaHRYr7pNAHeMKvfLBL59NjNo9", + "index": 1174, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "5.39.251.203", + "dz_ip": "5.39.251.203", + "tunnel_id": 563, + "tunnel_net": "169.254.3.118/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8KEPEcBY6vLZ8aWLm1eSgCPb3LCPHM2YpwzvSp5Cvi5t", + "tunnel_endpoint": "0.0.0.0" + }, + "Bf2rpZeP2ZWURrQzMkcoRkXmZsmVKsV1ECRm8UPkYWbw": { + "account_type": "User", + "owner": "FJDmjm2bkR49AxtBvABQphrYwjdjB54BP4XCW7ht4E4M", + "index": 783, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.42.35", + "dz_ip": "212.83.42.35", + "tunnel_id": 585, + "tunnel_net": "169.254.2.150/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FJDmjm2bkR49AxtBvABQphrYwjdjB54BP4XCW7ht4E4M", + "tunnel_endpoint": "0.0.0.0" + }, + "BhkX24EX1JdTfGDfEsJwNPUTFFstqtG2wPRxUnZmPUAW": { + "account_type": "User", + "owner": "ChB6C6dmNujAi79XtQLPKLL5SWdNLMShA7KKnrMMFF52", + "index": 751, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.43.14", + "dz_ip": "212.83.43.14", + "tunnel_id": 578, + "tunnel_net": "169.254.2.106/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ChB6C6dmNujAi79XtQLPKLL5SWdNLMShA7KKnrMMFF52", + "tunnel_endpoint": "0.0.0.0" + }, + "BjM44uGZzmWfG8jG9RsrX5F9HHmMZUJMKg5f4wngdUjy": { + "account_type": "User", + "owner": "7dw7HtHwzUo1deu79siVbZ9khtpTw2a5ANzfAXQ8DEr1", + "index": 546, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "154.16.171.107", + "dz_ip": "154.16.171.107", + "tunnel_id": 535, + "tunnel_net": "169.254.1.188/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "93gu5F4pAh7Af1PU2QC5umWk1owr6NHDAJiQ9jWsBwoU", + "tunnel_endpoint": "0.0.0.0" + }, + "Bp7T3qk6odrmcFwZpq7uXWcct4T3zzu7Bdy7ZCE88jCt": { + "account_type": "User", + "owner": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "index": 135, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.32.77", + "dz_ip": "64.130.32.77", + "tunnel_id": 505, + "tunnel_net": "169.254.0.144/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Bv8VFT63QrcaHRAGYm8xsgXRamPnzAXhjW38QbHyhZcF": { + "account_type": "User", + "owner": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "index": 794, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.122.69", + "dz_ip": "67.213.122.69", + "tunnel_id": 517, + "tunnel_net": "169.254.2.162/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "MagiCBYNPD9iTBXqiFybAFCREQzG6MSM4LmFLXQZxuV", + "tunnel_endpoint": "0.0.0.0" + }, + "Bw3aUcKEzDii7hUgc6p1ysNGtswhw3LHPoNeRVDGGSmu": { + "account_type": "User", + "owner": "ungM4fafkQg1e13MAzwzuvCxtTTiTZ4Xcq7KqnJRyVJ", + "index": 1427, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.42.109", + "dz_ip": "212.83.42.109", + "tunnel_id": 506, + "tunnel_net": "169.254.3.242/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BwzybrNMDy872YPLLmiQ4voub2GAxueC5qiDeE9PQ6Vz": { + "account_type": "User", + "owner": "2jHD7HZJbtZbVuGHimBgR2BPsubacyXF1HuutLR6tQVi", + "index": 815, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "162.244.35.60", + "dz_ip": "162.244.35.60", + "tunnel_id": 538, + "tunnel_net": "169.254.2.8/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BxJktEfVcj2XXW6nPCc2XvsSHKMBatFyhE1eNSsgNLFv": { + "account_type": "User", + "owner": "D2gnQuqG8tNVLNL52WeC9VLwfnE6zv4NF49yintVPsZc", + "index": 1317, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.103.29", + "dz_ip": "84.32.103.29", + "tunnel_id": 573, + "tunnel_net": "169.254.2.80/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BxSz7hoxAuRaHL7py1Y3jTkCazgSoQhyfz8tNp1B5Qk1": { + "account_type": "User", + "owner": "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk", + "index": 1034, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.121.169", + "dz_ip": "67.213.121.169", + "tunnel_id": 508, + "tunnel_net": "169.254.2.138/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Fd7btgySsrjuo25CJCj7oE7VPMyezDhnx7pZkj2v69Nk", + "tunnel_endpoint": "0.0.0.0" + }, + "ByxuiPt1bPdqK5JBAVvqDa9imZ65z8kDtnUg8QUoYqVv": { + "account_type": "User", + "owner": "9UuzDqz4m5pvSdE4SPdNuNx8itwKxu9WdHQRHrUk8Ej7", + "index": 1019, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "94.158.242.131", + "dz_ip": "94.158.242.131", + "tunnel_id": 543, + "tunnel_net": "169.254.2.76/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BzYCVR2xba3n29Ya3hz6MuNSzMA483oMDzg8Nesust6K": { + "account_type": "User", + "owner": "5cGMA8TgdfEAfaFh2xecUfnSKacRFg3sfNkJ3721TGpX", + "index": 998, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "8.244.152.28", + "dz_ip": "8.244.152.28", + "tunnel_id": 504, + "tunnel_net": "169.254.0.54/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "BziLgbVHN6SMGXBEtsjbB9MKcmomXEcJHmPa6p3LsvKV": { + "account_type": "User", + "owner": "FFevTkywysWf8PJvH4DZkEp4v9ks9HJPJhZWbhhJiYnr", + "index": 1461, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "86.105.224.116", + "dz_ip": "86.105.224.116", + "tunnel_id": 580, + "tunnel_net": "169.254.4.10/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Bzz3SKSY571WREg2NQx78hkqdQbHH6Lx8zRS9X8uWC4v": { + "account_type": "User", + "owner": "jagBNeXYncnn1hzwSq1JJ16XhWTgQ7DCFVqndSJZ6vT", + "index": 1358, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "103.88.234.131", + "dz_ip": "103.88.234.131", + "tunnel_id": 546, + "tunnel_net": "169.254.3.188/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "C216T3B3wTA378a3GBqbYRGbsWRKV8XtiuxH6ts47RWi": { + "account_type": "User", + "owner": "8GLRbAstsabZuZUx73AoyfGi1FRCWSUhRgMugFyofEz7", + "index": 1332, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.127.113", + "dz_ip": "67.213.127.113", + "tunnel_id": 562, + "tunnel_net": "169.254.3.200/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "C2QTNoY9St95SyRKPPqkrLqK5TVqDzp42HFSARofU93g": { + "account_type": "User", + "owner": "BHCsbYTDVd3wiJiEgjtLcxxj75tYPDbNzUehTeBxMzbY", + "index": 1269, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "95.214.55.5", + "dz_ip": "95.214.55.5", + "tunnel_id": 624, + "tunnel_net": "169.254.3.176/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "C3yZGLaWVcjMJG9rjwxnjrMDTDNyMKjG8ZWpaPFPzXu4": { + "account_type": "User", + "owner": "86BxXaBMNLrug8Py4mjyQ3NFxm8eb26YqTr4PAHN3CFF", + "index": 1241, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "5.39.216.186", + "dz_ip": "5.39.216.186", + "tunnel_id": 523, + "tunnel_net": "169.254.1.72/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "C6b9Jv7yQP9vxUTwjaXDNrmxRmeQQPoaeJoQ9ynPQmgd": { + "account_type": "User", + "owner": "5ghoFEVrsXeAPB6SUmBpZ2xq3KvHEjNMeSaBnxEBXkHV", + "index": 1495, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "38.244.189.30", + "dz_ip": "38.244.189.30", + "tunnel_id": 582, + "tunnel_net": "169.254.1.68/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "C6nDvypiaMXwKBxvbUGpTKpEJWVhSYw5oyuLReqkHPjj": { + "account_type": "User", + "owner": "Hpp3K99JubT3LKFxm98LuRcW9onLck46UqYwNTmkXoTe", + "index": 312, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "46.21.152.10", + "dz_ip": "46.21.152.10", + "tunnel_id": 520, + "tunnel_net": "169.254.0.60/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "C6yBxFXtt8LtkugiCrbDbcAf4maodqudap6pdX5PKJSn": { + "account_type": "User", + "owner": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "index": 132, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "103.106.59.199", + "dz_ip": "103.106.59.199", + "tunnel_id": 507, + "tunnel_net": "169.254.0.138/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "C9KmXKRAa2NJq25bW3QMLc9bk27yuuLxCkK1LihxQVX8": { + "account_type": "User", + "owner": "5iX9Y7422NQN4PMaNGMZc5RA1UCHZJtSBLqN7RJGjZ9s", + "index": 689, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.81", + "dz_ip": "64.130.51.81", + "tunnel_id": 512, + "tunnel_net": "169.254.0.174/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CAVRWVxW1u4zErzeBuJnFv5EynuYTbsW9foDe2tBVTRc": { + "account_type": "User", + "owner": "GUeWVMZJF72Ds3fLkRPtH9ohHqz9bPPLbBoa1ByU2yVk", + "index": 797, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "208.91.110.44", + "dz_ip": "208.91.110.44", + "tunnel_id": 541, + "tunnel_net": "169.254.2.6/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CaveyttUBTKttncu1e4RF814XjuoGfYv8cEsiKGDNCPX", + "tunnel_endpoint": "0.0.0.0" + }, + "CBPyYmEK7NmCKTPawNqEZckZsYr3ZWtGZaDuDmfoQdvV": { + "account_type": "User", + "owner": "H8xcw6tBjAk3xjQhSWC1Mne6wy6B725rJ1xbhoyC9gPz", + "index": 1301, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.10.187", + "dz_ip": "185.26.10.187", + "tunnel_id": 626, + "tunnel_net": "169.254.3.186/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CCUWWZKpj6CKQyE1pP8xeat9JTuKkxbgsNFHXWAaicK5": { + "account_type": "User", + "owner": "mods1kHySGzhKBVcAdsiFpc4am8dKH9nY53KZYxWjns", + "index": 526, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "109.202.206.58", + "dz_ip": "109.202.206.58", + "tunnel_id": 522, + "tunnel_net": "169.254.1.162/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CDFsErWipEX3UTzkb8FCcpaAmbAXtQNVw3AW2UAHk2gK": { + "account_type": "User", + "owner": "7h582s5o3hcDNSou7JptSrD6TiMoaYtjip5kU1K5tYmQ", + "index": 395, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.42.92", + "dz_ip": "212.83.42.92", + "tunnel_id": 542, + "tunnel_net": "169.254.1.104/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "bay3wXfJsu9ds1zQBoQQ4DUwFGs3NP6q4gca9WM5G1z", + "tunnel_endpoint": "0.0.0.0" + }, + "CG7YnYkXdVhEuj14EfKhU8ESQsTMRpaG3ut3yrfkFTgY": { + "account_type": "User", + "owner": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "index": 713, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "185.209.178.161", + "dz_ip": "185.209.178.161", + "tunnel_id": 550, + "tunnel_net": "169.254.2.78/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "PUmpKiNnSVAZ3w4KaFX6jKSjXUNHFShGkXbERo54xjb", + "tunnel_endpoint": "0.0.0.0" + }, + "CLob35ugLgnGsGGR5xFQhtaLDnJJmXNhxpAf3AhjF3pd": { + "account_type": "User", + "owner": "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE", + "index": 460, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "95.67.53.214", + "dz_ip": "95.67.53.214", + "tunnel_id": 552, + "tunnel_net": "169.254.1.158/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4W3jdXyqhLCjzA3Liu8ZNjViwrc6N9YjSB7obbxfjcKE", + "tunnel_endpoint": "0.0.0.0" + }, + "CMdsHEaxQutLRsyqdd7C3fmjJSPAvRktEySEYzvN5YLU": { + "account_type": "User", + "owner": "BPKAfGkkzF5u1QRjjB1nWYYbPMUCMPJe1xZPmwEMNMCT", + "index": 1257, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "103.167.235.224", + "dz_ip": "103.167.235.224", + "tunnel_id": 519, + "tunnel_net": "169.254.2.40/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CQDHckKVPXLUNgxAchnZZg8ETDU21SPRKD94n8HcSysh": { + "account_type": "User", + "owner": "44ZDKo96gQR1h2afAA3oXgutUzHcRXH72RYxhtGxzWYk", + "index": 318, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "93.191.10.71", + "dz_ip": "93.191.10.71", + "tunnel_id": 530, + "tunnel_net": "169.254.1.28/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "44ZDKo96gQR1h2afAA3oXgutUzHcRXH72RYxhtGxzWYk", + "tunnel_endpoint": "0.0.0.0" + }, + "CQjupmFW3yorE4Lp4hbiBqjsseDXCY3n6PDKMCLVTWbi": { + "account_type": "User", + "owner": "F18bnY7JsvVY8tUbjSFwSS4S7sGi2kN2pP5HmuHzD7X1", + "index": 1192, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "192.69.194.218", + "dz_ip": "192.69.194.218", + "tunnel_id": 578, + "tunnel_net": "169.254.3.142/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CR7hKsuDLfKPCDimACVVGT1cK9jXLUVBUCfD1advmns2": { + "account_type": "User", + "owner": "EmE5KsWqFYFyxytrCQWy91aGZy7nGfd96cdPfi7R5YRE", + "index": 348, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.116", + "dz_ip": "45.139.132.116", + "tunnel_id": 532, + "tunnel_net": "169.254.1.46/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "soLStaCk5TiGCpeLKa9Fvv6f5JQGMa6S3uhLh826e9N", + "tunnel_endpoint": "0.0.0.0" + }, + "CRYnnKgZkQWWbX9YvBk2hVGCzgnUUgx8WJFCUJW2G3t9": { + "account_type": "User", + "owner": "4L45W8TgyZbL1Kvpc8yvdnCHcFgVaJUtntHzkS7MdtX5", + "index": 529, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "213.163.64.140", + "dz_ip": "213.163.64.140", + "tunnel_id": 509, + "tunnel_net": "169.254.0.104/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FACb6bbTDRBHCK999V8ox8jga5JBnt1r3vvzmAYAMv2o", + "tunnel_endpoint": "0.0.0.0" + }, + "CTwJbShsFjUmwZZWr7CoK8JhCf7ctwxopzEsCCDVEoMc": { + "account_type": "User", + "owner": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "index": 1250, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "139.84.238.57", + "dz_ip": "139.84.238.57", + "tunnel_id": 527, + "tunnel_net": "169.254.2.72/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "3tm92VTxwyZ5MDhGoYR4tVTkwWYkzfam6hwBjauUACCk", + "tunnel_endpoint": "0.0.0.0" + }, + "CV3M3WJ9whfHVFhKQPF45hdWBCNeyzwE8J2V4XmCXQqA": { + "account_type": "User", + "owner": "DZ3wDCu2bVVH9yT2vHxLTRrLUBRRHGmytHc3prK3pRGN", + "index": 539, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.177.74.54", + "dz_ip": "185.177.74.54", + "tunnel_id": 558, + "tunnel_net": "169.254.1.178/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CVig6e3b95cx6nttSj5w8VNW46RKjst8RneaUGaZjNZ2": { + "account_type": "User", + "owner": "CiJ2HsRXKBbbTzD9xekgoGKWUikAF8VY3VDuMwc5gx1P", + "index": 796, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "195.140.213.74", + "dz_ip": "195.140.213.74", + "tunnel_id": 529, + "tunnel_net": "169.254.1.240/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CW6uvwNksyYg6q1mU9kBSKehVAVrAdT9A4PVjUHw8J2W": { + "account_type": "User", + "owner": "CeC95ByA5rd3cFELBgK5nx2hB8o7FynrB2ciNNwHYEib", + "index": 320, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.42.123", + "dz_ip": "64.130.42.123", + "tunnel_id": 503, + "tunnel_net": "169.254.0.132/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CWuX9MygyV5q59AXesdLCHoAePaCPXNCtPuUGoKds41q": { + "account_type": "User", + "owner": "2NeqnzhgQBUEyMdWyVAXJjCYA3E2UTYXVdqutSQ27h17", + "index": 1131, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.134.38", + "dz_ip": "45.139.134.38", + "tunnel_id": 609, + "tunnel_net": "169.254.3.70/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2NeqnzhgQBUEyMdWyVAXJjCYA3E2UTYXVdqutSQ27h17", + "tunnel_endpoint": "0.0.0.0" + }, + "CcKvbqYBWKBD1Rm9T2e1GShLgCwKYpckwPiXrUJ8YD6j": { + "account_type": "User", + "owner": "9ymPgMb7gf8N6b2vHn3W1fzigBxd2RUfsoHmBXd2fqjH", + "index": 1451, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "164.138.249.100", + "dz_ip": "164.138.249.100", + "tunnel_id": 577, + "tunnel_net": "169.254.3.208/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CgPn5rMKyjHMvcCrEcFqwa9AhiWoWfdA9kg4yCBkjQkS": { + "account_type": "User", + "owner": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC", + "index": 340, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.11.195", + "dz_ip": "185.26.11.195", + "tunnel_id": 515, + "tunnel_net": "169.254.1.34/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "nateKhsYkrVc992UuTfAhEEFQqr2zQfpGg9RafNkxdC", + "tunnel_endpoint": "0.0.0.0" + }, + "Cgf5Tf91qBhJUie7tdHWQSDSAShG5gDzr4cWX1rxjqD2": { + "account_type": "User", + "owner": "mrgn3H4uBbKAWBjdFKSGks3SpLm4q8YaRxUCMGa5ZBY", + "index": 369, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.40.157", + "dz_ip": "64.130.40.157", + "tunnel_id": 506, + "tunnel_net": "169.254.1.76/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "mrgn3H4uBbKAWBjdFKSGks3SpLm4q8YaRxUCMGa5ZBY", + "tunnel_endpoint": "0.0.0.0" + }, + "CnhrAcSy4vQ2RuGKuhUFkMAzcEV1zwFkQ8QWVrELUcuL": { + "account_type": "User", + "owner": "SP9K2c8Z1aaQaqdQgC6hZMJ5UCTTnE76XNYVse7H94b", + "index": 659, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.113.133", + "dz_ip": "67.213.113.133", + "tunnel_id": 542, + "tunnel_net": "169.254.2.44/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SP9K2c8Z1aaQaqdQgC6hZMJ5UCTTnE76XNYVse7H94b", + "tunnel_endpoint": "0.0.0.0" + }, + "CqbT9gAJN5a8yW6odS2NoyrzESmoMgKb93n4gd1TcS4H": { + "account_type": "User", + "owner": "BsS2BWy1qeFLFsbahdzH3A5Sfo7DmMQqiYMbYdi4s5yt", + "index": 1001, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "205.209.109.70", + "dz_ip": "205.209.109.70", + "tunnel_id": 553, + "tunnel_net": "169.254.2.208/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CrjfSbLED2cQoWVFSryQaYdTJuE8XeY91QH81Y8pvB5L": { + "account_type": "User", + "owner": "5oZ4GSP4waw2fphYoUgdnChN29sH8nRXbBnP5Qa1TnEy", + "index": 1132, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "162.19.103.238", + "dz_ip": "162.19.103.238", + "tunnel_id": 610, + "tunnel_net": "169.254.3.72/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5oZ4GSP4waw2fphYoUgdnChN29sH8nRXbBnP5Qa1TnEy", + "tunnel_endpoint": "0.0.0.0" + }, + "Crxp1RdjHL1WVQMaWTQoKzwUTZ32P19AVKjfqu9KdPxf": { + "account_type": "User", + "owner": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy", + "index": 1128, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.98", + "dz_ip": "45.139.132.98", + "tunnel_id": 606, + "tunnel_net": "169.254.3.64/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EPFZFVrXuveEQar9LaEkt5kDRPMnbvK54qu5FwCxpkcy", + "tunnel_endpoint": "0.0.0.0" + }, + "CrzvyQ6LXnbiWzdhVkqNJhX3RdGy923uzgNj7EBxPv4q": { + "account_type": "User", + "owner": "6k4oeLB9fcAuNFnBERKqZXPC2vfnMpaeNnqxU3D3zEKo", + "index": 1000, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "83.143.84.170", + "dz_ip": "83.143.84.170", + "tunnel_id": 548, + "tunnel_net": "169.254.2.206/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CtcgeTiKVHXyK6CbvVyHk3XQ7fLwTJDFT8NeCWjf9z81": { + "account_type": "User", + "owner": "G71Xp23bPKk8ep3oFseyAjrWQKg9EGZivY8mBnBZWM8X", + "index": 139, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.186.77", + "dz_ip": "84.32.186.77", + "tunnel_id": 515, + "tunnel_net": "169.254.0.150/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Cum5NcgZ1osLy9hy1JECSsLWHCXX48kMf4vRtgZnafUN": { + "account_type": "User", + "owner": "chrtyhyeugoiCD3M2kjVmJigLwX7YtNP3YK9HZ1N3F1", + "index": 773, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "38.92.24.98", + "dz_ip": "38.92.24.98", + "tunnel_id": 523, + "tunnel_net": "169.254.2.136/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CvrzqWNs7SZqnybSjcFga7mq1sE9FCbPavptRrM2ha6j": { + "account_type": "User", + "owner": "FzU8ZJmbiEvkCaSgZcT5UKwZqH73Gr1dozmmaeRoxgJn", + "index": 1455, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.32.145.163", + "dz_ip": "45.32.145.163", + "tunnel_id": 544, + "tunnel_net": "169.254.4.2/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CyMptNfCgWBmecyy14vwdxE3LGJpa8GafTp3sn8EAKMD": { + "account_type": "User", + "owner": "H8xcw6tBjAk3xjQhSWC1Mne6wy6B725rJ1xbhoyC9gPz", + "index": 87, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "160.202.131.117", + "dz_ip": "160.202.131.117", + "tunnel_id": 500, + "tunnel_net": "169.254.0.78/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CyNP1gVXTcHqDUi4SnECt9LSHFDgdpQ4Z5jmfTAZXwpc": { + "account_type": "User", + "owner": "5pprCcv9RvsWdNM1nLmXx29QTsfRgL1rk5sciv8tMkn3", + "index": 1197, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "45.250.254.137", + "dz_ip": "45.250.254.137", + "tunnel_id": 579, + "tunnel_net": "169.254.2.210/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "CyodkpwoQJjzAeEv6JufbGpjBZHF1WwVjY4NZBAKfxE4": { + "account_type": "User", + "owner": "B8td8UgVVFQifTHijPBLp7pbpKjW1R7wdYQvFLGdDRCy", + "index": 233, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.156", + "dz_ip": "45.139.132.156", + "tunnel_id": 511, + "tunnel_net": "169.254.0.218/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D1Nfue3ZJ3s1GaWgasDv11vDLpwpojLVdD6rt9obMDr1": { + "account_type": "User", + "owner": "EDBBUovWxTSLumyUNTbrp4XyBa8mX1eRSJU1XbQtnZaK", + "index": 1259, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.92.120.157", + "dz_ip": "185.92.120.157", + "tunnel_id": 625, + "tunnel_net": "169.254.3.180/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D2gHNmoSuKk62zRvKKPtY8sjsYiLQoR8TTFyibccTjse": { + "account_type": "User", + "owner": "DzFn1LG97hQczGVqcLHjjetnMoGyHG7KohJxwPRUxfQD", + "index": 548, + "bump_seed": 247, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "178.239.19.42", + "dz_ip": "178.239.19.42", + "tunnel_id": 534, + "tunnel_net": "169.254.1.192/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D2zqupYaAoenrBVX8i9CgFk8C4YTuezncQ9Xae1J7CE1": { + "account_type": "User", + "owner": "DTtmneTCyWqaT7fK8DgM8oY7U7hKvcJMwkjphidQEJFw", + "index": 1280, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "94.100.18.122", + "dz_ip": "94.100.18.122", + "tunnel_id": 571, + "tunnel_net": "169.254.3.182/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D4AHB2shWCkU7R6a6kQM6NLsSj4PGhiwmhiWWWm1FXMp": { + "account_type": "User", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 195, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "3.71.46.3", + "dz_ip": "3.71.46.3", + "tunnel_id": 518, + "tunnel_net": "169.254.0.202/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D4zrTH36uzRiVfsgQAqecaSVEArBB4JjYjAz27sziQkG": { + "account_type": "User", + "owner": "dzCPvLS7UjGHnjhjCC5HhE8Nupd48EHbzJYW2sLDaPB", + "index": 764, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "173.231.11.118", + "dz_ip": "173.231.11.118", + "tunnel_id": 534, + "tunnel_net": "169.254.2.124/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D5KzV51Tbh1dNZLErcWP8zCBtxA7sJmafKFzMuzwKd3H": { + "account_type": "User", + "owner": "U3hq6THZ5b1hzUQUtxaHRYr7pNAHeMKvfLBL59NjNo9", + "index": 349, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.135.201.224", + "dz_ip": "45.135.201.224", + "tunnel_id": 533, + "tunnel_net": "169.254.1.48/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D5Pdp3AC4kQkWqVXo2wJLGLyrqvywMrPVzMRfM1vu6eu": { + "account_type": "User", + "owner": "SFDZe38ktiSkmDfiqH5BmjkoeAvbS24XBCNgQZTew4P", + "index": 671, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.37", + "dz_ip": "45.139.132.37", + "tunnel_id": 535, + "tunnel_net": "169.254.2.28/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SFundNVpuWk89g211WKUZGkuu4BsKSp7PbnmRsPZLos", + "tunnel_endpoint": "0.0.0.0" + }, + "D5PuUAdV22kGuLuhi9kLiGUEd8DihjY2ELrcZwnF96ZQ": { + "account_type": "User", + "owner": "SPDq686W1yux1rWgahdcU1PukeoCQUFj7MngjpxagKR", + "index": 778, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "82.197.162.51", + "dz_ip": "82.197.162.51", + "tunnel_id": 584, + "tunnel_net": "169.254.2.142/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D6iA8zA6gKSeZA4ZLzU7rcUdZZ2ttXA9u6XZQ33mDcn2": { + "account_type": "User", + "owner": "Asugaagtr1sPMXrspRyNzHEGExdAwWafL7QSHjPyMFJU", + "index": 523, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.64", + "dz_ip": "45.139.132.64", + "tunnel_id": 506, + "tunnel_net": "169.254.0.92/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Asugaagtr1sPMXrspRyNzHEGExdAwWafL7QSHjPyMFJU", + "tunnel_endpoint": "0.0.0.0" + }, + "D7rSWi7Szahikgj8ac65vMt9k39Tap41ExyDqsYLQo1f": { + "account_type": "User", + "owner": "BCjGyexo1i7qpN9CbJ9Zt8avWr4Lb2JRtcm43sJvsgQK", + "index": 1431, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj", + "cyoa_type": "GREOverDIA", + "client_ip": "45.77.82.56", + "dz_ip": "45.77.82.56", + "tunnel_id": 507, + "tunnel_net": "169.254.3.246/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D87WpRG8gom5Ni451Tka8ZMqmwgUrF5hchXtpg5JWqLY": { + "account_type": "User", + "owner": "BsS2BWy1qeFLFsbahdzH3A5Sfo7DmMQqiYMbYdi4s5yt", + "index": 682, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "183.81.168.165", + "dz_ip": "183.81.168.165", + "tunnel_id": 548, + "tunnel_net": "169.254.2.66/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "D9C68gKEQkxi9Fa8y6HviDtXujYiGFALtzwSV6nMB9mj": { + "account_type": "User", + "owner": "mods1kHySGzhKBVcAdsiFpc4am8dKH9nY53KZYxWjns", + "index": 446, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.121.175", + "dz_ip": "67.213.121.175", + "tunnel_id": 553, + "tunnel_net": "169.254.1.164/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SP9K2c8Z1aaQaqdQgC6hZMJ5UCTTnE76XNYVse7H94b", + "tunnel_endpoint": "0.0.0.0" + }, + "D9tjr1AiYVCBjBNFpLagv7SJcPoeQQ39fQHpMrhg6zxg": { + "account_type": "User", + "owner": "59ec9xRaLoEa5fTpXPjKLcRSLPhHG4abFmVv1RUpYnWx", + "index": 787, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "139.84.228.251", + "dz_ip": "139.84.228.251", + "tunnel_id": 519, + "tunnel_net": "169.254.1.146/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "tunnel_endpoint": "0.0.0.0" + }, + "DBcnJgfBbbErdA6Dd2VqVmk4YHvF16ScS7hUVC2sEmqo": { + "account_type": "User", + "owner": "J5AsxaHfWn6KpEcPRT9EZ9szvEMBQeHRe947UeaMPG3z", + "index": 1035, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.42.66", + "dz_ip": "212.83.42.66", + "tunnel_id": 595, + "tunnel_net": "169.254.2.144/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "J5AsxaHfWn6KpEcPRT9EZ9szvEMBQeHRe947UeaMPG3z", + "tunnel_endpoint": "0.0.0.0" + }, + "DBdA3hgPHCKWrWDNgRv8Beg472JeNHCkYwnz6UMSAJRN": { + "account_type": "User", + "owner": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S", + "index": 282, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "103.88.234.129", + "dz_ip": "103.88.234.129", + "tunnel_id": 515, + "tunnel_net": "169.254.0.206/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "dmMwc4RazLHkvDZYrWAfbHQ6cViAvNa5szCJKaiun8S", + "tunnel_endpoint": "0.0.0.0" + }, + "DC3nBi3j3E6hGYtX8iHknK7HbDDvBd9CXvxqaKwBx6nw": { + "account_type": "User", + "owner": "GfJiHPWsrcosgprdH1pzryUyag3Hm3WUyCFVSfZ8zcTe", + "index": 1308, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "45.76.138.26", + "dz_ip": "45.76.138.26", + "tunnel_id": 539, + "tunnel_net": "169.254.2.88/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Ee8dX3qtwrDRnxYK6NGQfmMeKT3Qpp2QZHpxiAiw23W9", + "tunnel_endpoint": "0.0.0.0" + }, + "DMunf9rXQtoLbqeY3EMh7TSfQ8y6K7hWnYGLmShKVmEa": { + "account_type": "User", + "owner": "H6W58ALBHgn4ss9q5wKHEJyv6PryTy1dA4xsHDQM7dDA", + "index": 692, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.121.167", + "dz_ip": "67.213.121.167", + "tunnel_id": 548, + "tunnel_net": "169.254.1.82/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DNgGnTvNnsVKY5edVbWfmv1ctCqnLVcVJcvyBmQK48ZR": { + "account_type": "User", + "owner": "EWARp8Syq8cTWGWHtP5LT9fKAn5GvXfSCH8LfAwpgQ6m", + "index": 986, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "185.189.45.80", + "dz_ip": "185.189.45.80", + "tunnel_id": 546, + "tunnel_net": "169.254.2.172/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "AR8uetaAnHRoPr6jvwKXWqd4YWbkbAXs5yreqo4HQHLQ", + "tunnel_endpoint": "0.0.0.0" + }, + "DPQEcpDutJs1qojSVxeSMWFVouCMUuTPetFBJPcUXh8h": { + "account_type": "User", + "owner": "dzeroGSpoW52q4UJheb6x2AHnwtwcBEusNQnfEMxSXn", + "index": 93, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.231", + "dz_ip": "72.46.87.231", + "tunnel_id": 502, + "tunnel_net": "169.254.0.58/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DPaEURr7JPrcr751MSkCwKhraU5LGdazFG4tNNEGwngf": { + "account_type": "User", + "owner": "59ec9xRaLoEa5fTpXPjKLcRSLPhHG4abFmVv1RUpYnWx", + "index": 1057, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.112.35", + "dz_ip": "67.213.112.35", + "tunnel_id": 539, + "tunnel_net": "169.254.1.234/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "ByszyWdqC3rVMWy8f6jwK5cmwkpwYdwsr7UL58xS5vnm", + "tunnel_endpoint": "0.0.0.0" + }, + "DRRHHQJLzMhEsJvdXHN1DBsxD2Xt9SeBdNcorHhtNYTf": { + "account_type": "User", + "owner": "5aUcsWh8T4HAVcDXUQfcCNTDgkxPsFhsWEgDjftuEh4J", + "index": 415, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "194.126.172.210", + "dz_ip": "194.126.172.210", + "tunnel_id": 529, + "tunnel_net": "169.254.1.138/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DXQwvVP3AgRbBEcvrAG1o31CpjsHZx7MeTW5HapfXKAD": { + "account_type": "User", + "owner": "9maF99FLLAMh5v5JKG1ZyRZVBVsT5VkZnAJzDvduCpJa", + "index": 1046, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.32.206", + "dz_ip": "64.130.32.206", + "tunnel_id": 553, + "tunnel_net": "169.254.2.234/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9maF99FLLAMh5v5JKG1ZyRZVBVsT5VkZnAJzDvduCpJa", + "tunnel_endpoint": "0.0.0.0" + }, + "DXZ6e3DA1bLioyp426oUFCyC8uLEtQf8nThKMy53WpVP": { + "account_type": "User", + "owner": "8xzD48jYsx3yrFidNVHdz3Y8NnY4CXYofieH5Y7qGkgh", + "index": 1040, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "141.98.218.84", + "dz_ip": "141.98.218.84", + "tunnel_id": 527, + "tunnel_net": "169.254.2.226/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DXoZHceQmrHcw4d52kLYuCSjsfojuGfqTAUrcWm1Fn9F": { + "account_type": "User", + "owner": "8RXYL85eGMyuUcBCMHt5owGvasySS4FYbmKTx4CqFkpe", + "index": 1359, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "86.105.224.135", + "dz_ip": "86.105.224.135", + "tunnel_id": 572, + "tunnel_net": "169.254.3.220/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DXyFR6fyjUrkaKJYJiwGSEWRUGFoixGfjvUbVMWgAgip": { + "account_type": "User", + "owner": "hQBS6cu8RHkXcCzE6N8mQxhgrtbNy4kivoRjTMzF2cA", + "index": 1246, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.186.78", + "dz_ip": "84.32.186.78", + "tunnel_id": 620, + "tunnel_net": "169.254.0.126/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DZL9SKngmJwFh6hsL6kgi6Q69r3zvUwx2HHwhmNSGwEm": { + "account_type": "User", + "owner": "oWPCJQUE4QP4ii1oCSLmryBaVy4sNyN1NVj16TZtyDe", + "index": 576, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "145.40.74.211", + "dz_ip": "145.40.74.211", + "tunnel_id": 538, + "tunnel_net": "169.254.1.232/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DbG82ENajH3HMcbmZYhdAKcJ4GJcWL6pY4ZLh5SDunzT": { + "account_type": "User", + "owner": "DZ8r6dJzbr4NB69rEKCVv1HJQznbp3c3ng1RaZnjx8Qu", + "index": 480, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "88.216.197.112", + "dz_ip": "88.216.197.112", + "tunnel_id": 550, + "tunnel_net": "169.254.1.166/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "By8MseMKtZQQaQjMHJiyetmc5AC8RZZv8C2ss33ktrHt", + "tunnel_endpoint": "0.0.0.0" + }, + "DcsUrQ6KYVWU8r1RMi3H8ggvFu4FkFsAfX19vJWiTtgR": { + "account_type": "User", + "owner": "61QB1Evn9E3noQtpJm4auFYyHSXS5FPgqKtPgwJJfEQk", + "index": 1367, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "193.221.135.101", + "dz_ip": "193.221.135.101", + "tunnel_id": 550, + "tunnel_net": "169.254.3.232/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Dk4Aqm266DpAQu6NrZSNSzaCztSRSCcQdKN2uxfuVNvM": { + "account_type": "User", + "owner": "FFevTkywysWf8PJvH4DZkEp4v9ks9HJPJhZWbhhJiYnr", + "index": 1068, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "86.105.224.7", + "dz_ip": "86.105.224.7", + "tunnel_id": 563, + "tunnel_net": "169.254.3.16/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FFevTkywysWf8PJvH4DZkEp4v9ks9HJPJhZWbhhJiYnr", + "tunnel_endpoint": "0.0.0.0" + }, + "DmGKW6MCRKDjDC9wzuitJNTDJNPydyjkoUAB5QdTs1Bx": { + "account_type": "User", + "owner": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "index": 69, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "65.20.105.212", + "dz_ip": "65.20.105.212", + "tunnel_id": 503, + "tunnel_net": "169.254.0.64/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DmoyEH4XfBGk7WGzA16EBs88vtbsup8qEVKLmMeh2EPG": { + "account_type": "User", + "owner": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "index": 440, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.42.33", + "dz_ip": "212.83.42.33", + "tunnel_id": 551, + "tunnel_net": "169.254.1.160/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DpjpDj4gGVH18opJfcg42xWJVWjeH96C4MqX8xK21nKJ": { + "account_type": "User", + "owner": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "index": 971, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.32.60", + "dz_ip": "64.130.32.60", + "tunnel_id": 537, + "tunnel_net": "169.254.0.170/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "FSKbsgvtnKtJZcxmWUkcJjwZBytXeqM5giwaBzVjbpim", + "tunnel_endpoint": "0.0.0.0" + }, + "DrRFM3mnRELyMUayGz3maCao2wk74XPAfcds7hfGgs6": { + "account_type": "User", + "owner": "93C8y75YR6yHHLVQVrbLU4RqkrzCMzR174Te93MJ3NZF", + "index": 776, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "141.98.216.86", + "dz_ip": "141.98.216.86", + "tunnel_id": 554, + "tunnel_net": "169.254.2.140/31", + "status": "Activated", + "publishers": "", + "subscribers": "AR8DvEn77GRQ19drMhPCjvFx2StcRJ8XbLVKS6yrgQAV", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DtdychMWj9yiNBtfSvciwuviyn2umZ1tqLmmMQpBNYkD": { + "account_type": "User", + "owner": "FxEThLk6JNcwLbZyahZny1YVbEnnznMR3tDCey4YnqPQ", + "index": 664, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "148.113.187.37", + "dz_ip": "148.113.187.37", + "tunnel_id": 547, + "tunnel_net": "169.254.2.48/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "DyDxUnzxb53c2WQGFnNxTiCNMhi91XJBL9mZHxeRs6qo": { + "account_type": "User", + "owner": "nymsHergYedT9CJMgtGMvqXUTGcbs5o3MiWTJUbqTGY", + "index": 1167, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.41.137", + "dz_ip": "64.130.41.137", + "tunnel_id": 514, + "tunnel_net": "169.254.3.106/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "nymsHergYedT9CJMgtGMvqXUTGcbs5o3MiWTJUbqTGY", + "tunnel_endpoint": "0.0.0.0" + }, + "E1dJqB41wFU2pnWgW5MGYrpUbToHAMQCAPVbz3441UBS": { + "account_type": "User", + "owner": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "index": 534, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.247", + "dz_ip": "72.46.87.247", + "tunnel_id": 511, + "tunnel_net": "169.254.1.168/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "simpRo1FrQYGa1moicfgnPDp6KyE38d4gYrZzhjXYJb", + "tunnel_endpoint": "0.0.0.0" + }, + "E3fB8UE2SL7x1qdp5HDiBrvSST2xhuoXZLTDaCbZRAWH": { + "account_type": "User", + "owner": "ExCHWgfeJyKRzpfryiQn4W6aYaWhbSAEnsoUnBGNqjWD", + "index": 1425, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "103.14.27.47", + "dz_ip": "103.14.27.47", + "tunnel_id": 516, + "tunnel_net": "169.254.2.168/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "E3n7ZLjaBGn2Jrx9Z9W4cfkHK6LwoSXZJM74NDQsJ37Q": { + "account_type": "User", + "owner": "6XYGcK9az9aKvp4o1pJYVCm3hfAUHo1UvUZmsA8v72ko", + "index": 350, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.134.108.121", + "dz_ip": "45.134.108.121", + "tunnel_id": 534, + "tunnel_net": "169.254.1.50/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "E5QEtm5m49KyvYVwi8EEAH74bTd9KqUhLPNr32FDwbJN": { + "account_type": "User", + "owner": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj", + "index": 559, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.127.33", + "dz_ip": "67.213.127.33", + "tunnel_id": 535, + "tunnel_net": "169.254.1.204/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "hxMhrsuGPDmkLJ4mTxEjyeMST3VGhTiwJvS9XgHwePj", + "tunnel_endpoint": "0.0.0.0" + }, + "E6TM9HBDDS8kQ8177BDJ3DxvYWyzGyqgDLhS3psWxwzB": { + "account_type": "User", + "owner": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "index": 1364, + "bump_seed": 247, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "102.211.135.181", + "dz_ip": "102.211.135.181", + "tunnel_id": 574, + "tunnel_net": "169.254.3.226/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "E75r3QcvUZoxG2zSmdHqm2gPNmJeEqRYymCPtSKQfDZt": { + "account_type": "User", + "owner": "Fr8yndbYqLrjayohTJBeeUK3V161XUdU5fH43cRyv5uA", + "index": 887, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "149.28.111.64", + "dz_ip": "149.28.111.64", + "tunnel_id": 558, + "tunnel_net": "169.254.1.182/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EBHaiW6YnpDpY1FiUkk58JB7bgtBhVjpchJvqArDBQK8": { + "account_type": "User", + "owner": "J7v9ndmcoBuo9to2MnHegLnBkC9x3SAVbQBJo5MMJrN1", + "index": 230, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "74.118.136.173", + "dz_ip": "74.118.136.173", + "tunnel_id": 518, + "tunnel_net": "169.254.0.212/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "ECbhh8dymhCFXgFjrHhcP5EGMSsNg839228DpUaXAZEF": { + "account_type": "User", + "owner": "EQwNaiKWMrQtysHCMfmU2Unkh3dShBjhJGVpJvdUsBEi", + "index": 133, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.49.67", + "dz_ip": "64.130.49.67", + "tunnel_id": 506, + "tunnel_net": "169.254.0.140/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EDyFfsRup8cruW8dNRKm7ETX2vjDQyxcxvs5JiXHxnMJ": { + "account_type": "User", + "owner": "8VBhxkJfcQcK1hAvHAXSLEyPcVLpTK2JHF8B4MrLi9Ng", + "index": 1356, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "207.90.227.31", + "dz_ip": "207.90.227.31", + "tunnel_id": 584, + "tunnel_net": "169.254.3.218/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EF5t2y54LwhFMFoQFKvv3hKP5NWPig3cDNrjcPAZXVsM": { + "account_type": "User", + "owner": "Fx8ATrRvjMnmUCjjDaUFcyjhbLVPzZJicj32bDcraqBz", + "index": 1003, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "134.119.192.242", + "dz_ip": "134.119.192.242", + "tunnel_id": 549, + "tunnel_net": "169.254.2.212/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Fx8ATrRvjMnmUCjjDaUFcyjhbLVPzZJicj32bDcraqBz", + "tunnel_endpoint": "0.0.0.0" + }, + "EFM3WnyQ7EhJwKCu2LiywCZtvJtps9fs5LaKmwwietGZ": { + "account_type": "User", + "owner": "AB821LfpFBwedJEfoNFZRsiPvcSxXPBNMgjyGC7RuNfS", + "index": 752, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.32.184", + "dz_ip": "64.130.32.184", + "tunnel_id": 540, + "tunnel_net": "169.254.2.108/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "AB821LfpFBwedJEfoNFZRsiPvcSxXPBNMgjyGC7RuNfS", + "tunnel_endpoint": "0.0.0.0" + }, + "EFx6HSfe3dzuFSQtYsyGa4Nv585tinGGzMVovtXj2pBC": { + "account_type": "User", + "owner": "GyWWfJuGZD2dGFjYRe3FswA5R9jWpeMzFiyhL3H8RN8z", + "index": 403, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "194.126.172.174", + "dz_ip": "194.126.172.174", + "tunnel_id": 512, + "tunnel_net": "169.254.0.100/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EJNkfaDPvFKaYYX79Tsk89vbhT32LHB1Mqg47aJbdSUm": { + "account_type": "User", + "owner": "3TGjZTpy4Nrm3Ef78npRh5U1uyPQmhN5cdWycoqye9ow", + "index": 992, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.134.141", + "dz_ip": "45.139.134.141", + "tunnel_id": 576, + "tunnel_net": "169.254.2.0/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BDMzcU37JaQGHkkZkdQZU45o8zJWLjmX8DXVxnGtLXfd", + "tunnel_endpoint": "0.0.0.0" + }, + "EJz44sV7zdcL3qpo95oVt24XCZuwYijCGC4EByPpWCaw": { + "account_type": "User", + "owner": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "index": 762, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "109.94.99.211", + "dz_ip": "109.94.99.211", + "tunnel_id": 505, + "tunnel_net": "169.254.2.120/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "tunnel_endpoint": "0.0.0.0" + }, + "EMQ7JzVEgN92ydryk4JGcNy2GDRWFFXYBRFs7U7CfCWB": { + "account_type": "User", + "owner": "M7Pcv3j8KpX8ZAkeSsvJnexgKrZbBAaMEcRTvf6t2Em", + "index": 1299, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.103.210", + "dz_ip": "107.155.103.210", + "tunnel_id": 548, + "tunnel_net": "169.254.3.8/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "ENL9g12sBZSKX7h9AYny1WChnH8Ac6VjSBkVYRfrUpsh": { + "account_type": "User", + "owner": "2ZZkgKcBfp4tW8qCLj2yjxRYh9CuvEVJWb6e2KKS91Mj", + "index": 413, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "84.32.186.112", + "dz_ip": "84.32.186.112", + "tunnel_id": 528, + "tunnel_net": "169.254.1.136/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2Ue9zGmDnvYRrJNEjuAdNkbbickw6fKWtbeNM7T2rakg", + "tunnel_endpoint": "0.0.0.0" + }, + "EPt4d6fjHLTAV3efShC3FkpQ1xZyyy9siJbJ6CmeApkP": { + "account_type": "User", + "owner": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "index": 253, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.10.193", + "dz_ip": "185.26.10.193", + "tunnel_id": 524, + "tunnel_net": "169.254.0.246/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EQtLnW1JXoioSQ6vAzy6cj1Tj2CTqmHBb3seiD8jf19b": { + "account_type": "User", + "owner": "N43JWBg42ZoUFMkHsRUVbP7wGVdxaHKanqaF9BBNiFC", + "index": 538, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "149.50.116.14", + "dz_ip": "149.50.116.14", + "tunnel_id": 557, + "tunnel_net": "169.254.1.176/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "ERotm7GH5oaR4dk4SxYJVAjuwozBWpx54urMVWhEg5vv": { + "account_type": "User", + "owner": "JAdJizeQExgJQpWwxzXpABv66cLYteUXQ1uiwWqCdiTC", + "index": 358, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "89.42.231.104", + "dz_ip": "89.42.231.104", + "tunnel_id": 521, + "tunnel_net": "169.254.1.60/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "ESYDErt99sqpjN5s7LnjaABz8huCJwSrSHdFThW2bVZF": { + "account_type": "User", + "owner": "44ZDKo96gQR1h2afAA3oXgutUzHcRXH72RYxhtGxzWYk", + "index": 237, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.221.164.109", + "dz_ip": "185.221.164.109", + "tunnel_id": 519, + "tunnel_net": "169.254.0.226/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EW5Mujb5zzAXtRjwysh5hPeCmJgTHM16HFFgp1xUv1LT": { + "account_type": "User", + "owner": "AeTCQ1nzdCrHFWpGxfi1XRu7EnxY7G2zpsEJUBCCjvdc", + "index": 879, + "bump_seed": 253, + "user_type": "Multicast", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.51.44", + "dz_ip": "64.86.248.131", + "tunnel_id": 557, + "tunnel_net": "169.254.2.176/31", + "status": "Activated", + "publishers": "AR8DvEn77GRQ19drMhPCjvFx2StcRJ8XbLVKS6yrgQAV", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Eayr68WJHskFjXjXmsapwyueU74kbKd1QmaRPMJfX5CD": { + "account_type": "User", + "owner": "1unCZEcjqNYnpGe8qD82mVEHS1Ab5cMuPbgHAh2Wn9t", + "index": 118, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "89.111.15.150", + "dz_ip": "89.111.15.150", + "tunnel_id": 511, + "tunnel_net": "169.254.0.116/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Ec6ZZrfQDeVFBJ8EtydY7BKJ4Jdmw3ZWmjvwZjrWq291": { + "account_type": "User", + "owner": "36GzimUeoiBaapYaC1yriTJ9moQK1QvJfexppcZv3PaN", + "index": 1343, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "62.122.185.43", + "dz_ip": "62.122.185.43", + "tunnel_id": 583, + "tunnel_net": "169.254.3.210/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EcxArW1LnwaUhjVBsKCy55N1cigjsTPhh6NYTB8YDNWs": { + "account_type": "User", + "owner": "2t9FqcHHFdcsht8aoYDAgcV4b2atjcYJjXaHPxFumgcG", + "index": 717, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "45.76.138.170", + "dz_ip": "45.76.138.170", + "tunnel_id": 526, + "tunnel_net": "169.254.1.116/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8Q7K2irCbYfEG5ZWyBceiytbL1u977gXqw7UaHZ55Awo", + "tunnel_endpoint": "0.0.0.0" + }, + "Ed98PzWbgEid7rRuSrfphGoP49tEFqfj8gBkbZiEB8bv": { + "account_type": "User", + "owner": "dzCPvLS7UjGHnjhjCC5HhE8Nupd48EHbzJYW2sLDaPB", + "index": 765, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.88", + "dz_ip": "45.139.132.88", + "tunnel_id": 581, + "tunnel_net": "169.254.2.126/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "F3tdN8SoakjEPb743VY18YyKJWYHo6rojV3nkas5YJh8", + "tunnel_endpoint": "0.0.0.0" + }, + "EfEpvyfXxE9qkc7efBYwANSzpeuzPA9UbVuZg61sqXKt": { + "account_type": "User", + "owner": "451X5rboJpJtXK2gj4dLsXv8yCGfujqus2HsYjMkkSpE", + "index": 769, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.42.39", + "dz_ip": "212.83.42.39", + "tunnel_id": 583, + "tunnel_net": "169.254.2.104/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "451X5rboJpJtXK2gj4dLsXv8yCGfujqus2HsYjMkkSpE", + "tunnel_endpoint": "0.0.0.0" + }, + "EhYPtideUiJQwdTBHBDJG8qvhSpr4KZ6Ze9oDSqJtWi": { + "account_type": "User", + "owner": "geXn489sgFyF8whjkVAWmvq4Qbp7g1KqPnJBxKie4Re", + "index": 121, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "70.34.211.174", + "dz_ip": "70.34.211.174", + "tunnel_id": 512, + "tunnel_net": "169.254.0.122/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EjLCPqxzDERVyYvis5cuwzVuwSN9GAziWXJEk5erjT8e": { + "account_type": "User", + "owner": "HxmNg4kPUwGhGS7Z9EtdLQKG8Pd9VCg6cDtEsYXLEsoa", + "index": 760, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "46.17.103.70", + "dz_ip": "46.17.103.70", + "tunnel_id": 549, + "tunnel_net": "169.254.0.40/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EjYtKcpnNA4jCdxfojvt2uUWApznp3BWecwErE3JvtgD": { + "account_type": "User", + "owner": "adraJqiL8VvYirJqmdatqhxZXXkPMQoqVotx1zt1q6S", + "index": 774, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "108.171.203.18", + "dz_ip": "108.171.203.18", + "tunnel_id": 535, + "tunnel_net": "169.254.2.134/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Eku8XjoxF5rw6m7nYJG5E6nXYWnDsXwfKsXJbCjzpmEc": { + "account_type": "User", + "owner": "8eZSd4nT6og77eqm3xtQLgb4D2xfoy5RvoP8Cmbgd5Lf", + "index": 1116, + "bump_seed": 249, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "46.229.232.134", + "dz_ip": "46.229.232.134", + "tunnel_id": 538, + "tunnel_net": "169.254.2.86/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8Z7QvPn2w9ERGPYDY4DQh42oSxdXWcX4eZoiHLe3dHcu", + "tunnel_endpoint": "0.0.0.0" + }, + "EmWtQiDcqPkDH7dMYJZKrtY9Wk79BDKZJVjtRVGkectW": { + "account_type": "User", + "owner": "9HXBrMP1E3fsz71z48bwAkrMV8QdDFzgXfHCrs8aDaBR", + "index": 1344, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "93.191.10.74", + "dz_ip": "93.191.10.74", + "tunnel_id": 573, + "tunnel_net": "169.254.3.214/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EpFGcx5Ge7YJ9BrMAUC9ACE9G9NAyfVJHACgcBchtDPA": { + "account_type": "User", + "owner": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "index": 251, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.10.239", + "dz_ip": "185.26.10.239", + "tunnel_id": 522, + "tunnel_net": "169.254.0.242/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "NATsUSZGohWw8xtLdxG4yus21UCkaes4FLfM2eqKbRk", + "tunnel_endpoint": "0.0.0.0" + }, + "EpS8xH8xFuMpicy33FMfgq6kF11DvccF9z4BSgKFX4mz": { + "account_type": "User", + "owner": "mythxvB89eT3C1TKwwhsvdHfYq2aoCt2es8vLoDFYyk", + "index": 1363, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "69.67.148.123", + "dz_ip": "69.67.148.123", + "tunnel_id": 547, + "tunnel_net": "169.254.3.224/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EuxKuiCdSEk5mTHCaT7yJ7Rvd8B2JNNG1xuicdujjG4G": { + "account_type": "User", + "owner": "ZeRoXF8PpC1t7qfmqdthLdeS6gudnTqyHirSnE5ZzgR", + "index": 744, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "192.69.194.82", + "dz_ip": "192.69.194.82", + "tunnel_id": 546, + "tunnel_net": "169.254.2.100/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "zeroT6PTAEjipvZuACTh1mbGCqTHgA6i1ped9DcuidX", + "tunnel_endpoint": "0.0.0.0" + }, + "Ev2KACv1EHqPetZVpFvy15sKNsGVaGDpDyHrhh5ye4hK": { + "account_type": "User", + "owner": "6iBYG2eotferhsciBzoZNm7PLg6GraHyBjGaC36C9mYT", + "index": 262, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj", + "cyoa_type": "GREOverDIA", + "client_ip": "185.32.162.192", + "dz_ip": "185.32.162.192", + "tunnel_id": 501, + "tunnel_net": "169.254.1.0/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "EvfGJ22veyLBZReevctXm2NDfHofxTrg1P3jYQohybyY": { + "account_type": "User", + "owner": "STPT8aR5FxUHHe6MTCSRLqbzbPH6K6LLC2i6wJ3Xd1u", + "index": 1104, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "104.237.63.42", + "dz_ip": "104.237.63.42", + "tunnel_id": 543, + "tunnel_net": "169.254.3.38/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "F39gcK1J1eBKnES6hz1riXpxQCmXAX2X3bG5Bsj3URhc": { + "account_type": "User", + "owner": "EWARp8Syq8cTWGWHtP5LT9fKAn5GvXfSCH8LfAwpgQ6m", + "index": 1248, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "37.61.220.2", + "dz_ip": "37.61.220.2", + "tunnel_id": 503, + "tunnel_net": "169.254.2.16/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "EWARp8Syq8cTWGWHtP5LT9fKAn5GvXfSCH8LfAwpgQ6m", + "tunnel_endpoint": "0.0.0.0" + }, + "F55WVRpoChLMmuPKCioMSnTirraAiAmDkESrpToJx6RV": { + "account_type": "User", + "owner": "7Mvzhg5JyrqvsyzXzS2g9fNa3gqBCUxh5uGzT8ubjzke", + "index": 1373, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "62.197.45.141", + "dz_ip": "62.197.45.141", + "tunnel_id": 575, + "tunnel_net": "169.254.3.60/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "F7FeEdo2SCAZ4LQaqiddjDkYjgbkW7ECbpWaG4SQipM9": { + "account_type": "User", + "owner": "FFevTkywysWf8PJvH4DZkEp4v9ks9HJPJhZWbhhJiYnr", + "index": 1066, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.191.117.158", + "dz_ip": "185.191.117.158", + "tunnel_id": 604, + "tunnel_net": "169.254.3.12/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8vhc44Xia6we1vNdgZp3r8PpPLj5pqntpssnS27iHiVi", + "tunnel_endpoint": "0.0.0.0" + }, + "F9MiwPYesFfHydV8jp69Ud4QrUKMg2JNasTqyRX9K62C": { + "account_type": "User", + "owner": "5nKT1JznKMKyXFmG1KRgSiDbpDrDe6Qf2HTa2FRCj4RL", + "index": 1134, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "149.255.32.194", + "dz_ip": "149.255.32.194", + "tunnel_id": 571, + "tunnel_net": "169.254.3.74/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "FDbsmrKxQWTWTHFF85GGWtsb6mfzKip2uSkx326MqJDv": { + "account_type": "User", + "owner": "DqBvkYXi7HjdaKz78yakiDsaGuq1BKrQi3Z5JV6STctz", + "index": 1182, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "183.81.169.123", + "dz_ip": "183.81.169.123", + "tunnel_id": 615, + "tunnel_net": "169.254.3.132/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "kRUJJGpMGU8geCdogsjknkZuFcJpD6UQxUUgCCWfnAH", + "tunnel_endpoint": "0.0.0.0" + }, + "FDc4BYtKJ6c17woMGamVikuhYcKLQyHLYcyxePAGEc1m": { + "account_type": "User", + "owner": "2AKKnirWVZMhnzuwqpizw9SwfZjGpRFLx2zCCNtPWpbc", + "index": 536, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "216.238.67.40", + "dz_ip": "216.238.67.40", + "tunnel_id": 525, + "tunnel_net": "169.254.1.172/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2AKKnirWVZMhnzuwqpizw9SwfZjGpRFLx2zCCNtPWpbc", + "tunnel_endpoint": "0.0.0.0" + }, + "FJtosrMJj82zvE7yxoeumz8QowNrucufsaVYBNdg8kEJ": { + "account_type": "User", + "owner": "Gmw9GarCUcQNYnqePXNBREuLhcMUwXhQWZMAvxSUf6c2", + "index": 1155, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "158.41.67.133", + "dz_ip": "158.41.67.133", + "tunnel_id": 522, + "tunnel_net": "169.254.3.88/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "FMyHAPn5br1daSTakxPiPSPrjpwp89riKFCvTZCWtJ18": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 511, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "88.211.249.212", + "dz_ip": "88.211.249.212", + "tunnel_id": 500, + "tunnel_net": "169.254.0.8/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "FSVkUcuqkDEbyR78jshP2qVmwMKKS93gcmvBst9KoLgP": { + "account_type": "User", + "owner": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "index": 1146, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "109.94.97.13", + "dz_ip": "109.94.97.13", + "tunnel_id": 511, + "tunnel_net": "169.254.1.12/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "b1ueZK9bWTywN2587zsScyLTaH18wfRfN5W15XnkiqF", + "tunnel_endpoint": "0.0.0.0" + }, + "FUPHBs7VYQ6p6kBRAxLzK17Qbut5b9YriTi2j6Tzrf4V": { + "account_type": "User", + "owner": "3CEYm21Q34ExVHY5hWeuZVY168ooWAHSxbtQ98sc6nKT", + "index": 1184, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "69.67.150.135", + "dz_ip": "69.67.150.135", + "tunnel_id": 576, + "tunnel_net": "169.254.3.136/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "FVRCYQtCrvuPX3YS3E9WycY2Mn4P18AA6SiLHKy1etbH": { + "account_type": "User", + "owner": "GzK6vbP3fejCMqja1veNtN3kF3s8KubDCwApnkVeyGt4", + "index": 1224, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "31.128.59.202", + "dz_ip": "31.128.59.202", + "tunnel_id": 564, + "tunnel_net": "169.254.1.8/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "GzK6vbP3fejCMqja1veNtN3kF3s8KubDCwApnkVeyGt4", + "tunnel_endpoint": "0.0.0.0" + }, + "FhmURy15L36gH5fhDGbfMiEBWwmjfnDhZbABLxbBGZtE": { + "account_type": "User", + "owner": "gojir4WnhS7VS1JdbnanJMzaMfr4UD7KeX1ixWAHEmw", + "index": 1370, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.233", + "dz_ip": "177.54.154.233", + "tunnel_id": 525, + "tunnel_net": "169.254.1.108/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "FkyLjDkMjJZyjo7h1BJG3twYZLhvU5PYV4LJACQZaJ8k": { + "account_type": "User", + "owner": "xkN8xAw8kQAvUjcpqnxBM5hYdrXRUJtHotK8WuK649M", + "index": 1254, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.42.88", + "dz_ip": "64.130.42.88", + "tunnel_id": 536, + "tunnel_net": "169.254.3.10/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "xkN8xAw8kQAvUjcpqnxBM5hYdrXRUJtHotK8WuK649M", + "tunnel_endpoint": "0.0.0.0" + }, + "Fn3mMWaC2nAZuQxye77S4mkYabgUMaueEXwsjy6dAkbo": { + "account_type": "User", + "owner": "D6uUDTEgXDf1yzLuQfFFCEKF9a2Ri5trFAWwaUpKB2ji", + "index": 789, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.43.168", + "dz_ip": "212.83.43.168", + "tunnel_id": 587, + "tunnel_net": "169.254.2.154/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "D6uUDTEgXDf1yzLuQfFFCEKF9a2Ri5trFAWwaUpKB2ji", + "tunnel_endpoint": "0.0.0.0" + }, + "FnPeigx89jHEGGmcqvEL3nbbJvnbyc4KNz71H7o3U2qo": { + "account_type": "User", + "owner": "pfDZjJUvm66mAnpRguLp27eJXRMbbf8EVycpgL38Squ", + "index": 1059, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.132.52", + "dz_ip": "45.139.132.52", + "tunnel_id": 603, + "tunnel_net": "169.254.3.0/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "sf1G9ySUNSWRsiEdc8vuXcBgSeQw93kjr9sgnH3XAik", + "tunnel_endpoint": "0.0.0.0" + }, + "Fs9eTGAooNfsQJ914uJDco7k7xvdCGtdaQNuMEXmueH5": { + "account_type": "User", + "owner": "5acwJLNsaw9Chd11c1R7fB3JEt7Kjb1Ztweo6AreuWA3", + "index": 1196, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.191.118.12", + "dz_ip": "185.191.118.12", + "tunnel_id": 617, + "tunnel_net": "169.254.3.146/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "FsoHPm3MxpjDBSpqXJANnZ5iHUX58KLCKfXMt2gUXQsk": { + "account_type": "User", + "owner": "rgh2ZRt5ejyQ7saSLPNmYXsNuqwvkn8jzEWWXoAWrhr", + "index": 377, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.92.114", + "dz_ip": "107.155.92.114", + "tunnel_id": 524, + "tunnel_net": "169.254.1.86/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "FtjdrqSFBTv2P8dv3F8C4n5BVAU6moqR3fW2QU7ApSRk": { + "account_type": "User", + "owner": "2ZZkgKcBfp4tW8qCLj2yjxRYh9CuvEVJWb6e2KKS91Mj", + "index": 346, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "194.126.172.170", + "dz_ip": "194.126.172.170", + "tunnel_id": 520, + "tunnel_net": "169.254.1.44/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "FuF88sYU7Z5k3prGMp92Jes9Rgme9Q54N3rdkWTXDwaH": { + "account_type": "User", + "owner": "122T2kPh1rgERLbhcQYE3GqmWBpWq9W8WJZivxcZPD5t", + "index": 147, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.55.254", + "dz_ip": "64.130.55.254", + "tunnel_id": 516, + "tunnel_net": "169.254.0.166/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "FwuUKhTwu7ZyShrWR9txorKJDENbcETVFy8mDgbHom8v": { + "account_type": "User", + "owner": "sfgt6jXbjoT4DV9WysSkHY5Xyt88rBBNvddytuhWA67", + "index": 263, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.189.45.221", + "dz_ip": "185.189.45.221", + "tunnel_id": 526, + "tunnel_net": "169.254.1.2/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Fy5aVzz8snsaHFshRWwKZWVEswDmwdNzuVfa2GRCs7HP": { + "account_type": "User", + "owner": "nxtHPreABWb72U23niNidAYSkYXQy1uH6tzsVUpTBMf", + "index": 119, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "23.92.79.26", + "dz_ip": "23.92.79.26", + "tunnel_id": 509, + "tunnel_net": "169.254.0.118/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "G3Pa4L1snEbuGy67KiUgDPrsKQFKNDBkBUjRhT4S41hQ": { + "account_type": "User", + "owner": "BwVDYeT9sUadojNc1JeFz66FktsUHGiFQa7LeuNxSBdh", + "index": 1195, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "93.115.25.175", + "dz_ip": "93.115.25.175", + "tunnel_id": 616, + "tunnel_net": "169.254.3.4/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "G4TJWzkuDmbJJcsgftf97DoD6eMwQpLjR39L3hmV4poK": { + "account_type": "User", + "owner": "8Zh5A5Hs6bJFAyWrLGMaF2VEUVbXFANtfuw7824Hd5XV", + "index": 1346, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "8jyamHfu3rumSEJt9YhtYw3J4a7aKeiztdqux17irGSj", + "cyoa_type": "GREOverDIA", + "client_ip": "185.32.162.193", + "dz_ip": "185.32.162.193", + "tunnel_id": 504, + "tunnel_net": "169.254.3.216/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "G5d6QsZithMGbXdpquLeS7tRLSqZXAn85zXwm7ZP62AU": { + "account_type": "User", + "owner": "6jxte5jrKezgZ8XhnmcXEVEN4xQxbXb1hR4mUg3m6BrB", + "index": 344, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.171.202.77", + "dz_ip": "185.171.202.77", + "tunnel_id": 531, + "tunnel_net": "169.254.0.10/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "G9aZN6bsgQCjhqNA69hgADRjf7tn9BJqSgVYBJQsLYtb": { + "account_type": "User", + "owner": "GTguXAdcqbMEYgpW4REWpq5cMUj54bHBLKHWScFSNTNz", + "index": 1244, + "bump_seed": 247, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "88.216.198.169", + "dz_ip": "88.216.198.169", + "tunnel_id": 503, + "tunnel_net": "169.254.0.90/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GBZVdYv5eEftQxp3UzK3q8LVSGDoawDo49DnRRVDDV29": { + "account_type": "User", + "owner": "GXngqGCgvY8jXbcWkgaqhgSJFiB3hWcf2oBfYv6fHApq", + "index": 354, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "69.10.46.70", + "dz_ip": "69.10.46.70", + "tunnel_id": 523, + "tunnel_net": "169.254.1.54/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GC4cjZEkg5FBkksjtQVFayKJrKcGFjPRoPCZZ3h66LwH": { + "account_type": "User", + "owner": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn", + "index": 1036, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "178.162.238.198", + "dz_ip": "178.162.238.198", + "tunnel_id": 551, + "tunnel_net": "169.254.2.156/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn", + "tunnel_endpoint": "0.0.0.0" + }, + "GFFyCszTdWoFoqsCi4tUfdNAxQYaa4SmyV9AgtB5hFWE": { + "account_type": "User", + "owner": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "index": 95, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "65.20.100.233", + "dz_ip": "65.20.100.233", + "tunnel_id": 505, + "tunnel_net": "169.254.0.62/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GFv1VyQ3Zow2ry3pbrMJ6Wzs8S46auA5CQqt1VSghx4z": { + "account_type": "User", + "owner": "HwBL75xHHKcXSMNcctq3UqWaEJPDWVQz6NazZJNjWaQc", + "index": 905, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "107.182.162.210", + "dz_ip": "107.182.162.210", + "tunnel_id": 516, + "tunnel_net": "169.254.2.74/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GPPVGRZC8XcUhEk8wgioDWU26Uh87S2DakkYv4WFx4XQ": { + "account_type": "User", + "owner": "EmE5KsWqFYFyxytrCQWy91aGZy7nGfd96cdPfi7R5YRE", + "index": 342, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "108.171.217.186", + "dz_ip": "108.171.217.186", + "tunnel_id": 521, + "tunnel_net": "169.254.1.38/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GPwumVi6xddR5WhSXKMNYxyrzk6X3ktTasQZ3Hw4r4qT": { + "account_type": "User", + "owner": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "index": 106, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "136.244.108.105", + "dz_ip": "136.244.108.105", + "tunnel_id": 511, + "tunnel_net": "169.254.0.86/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BNtHBLo1L2vAG7PBQ6mJvWz7GqVPxBnioXsY2Gjtubrg", + "tunnel_endpoint": "0.0.0.0" + }, + "GSZSoCALVXD516a2fpDRYqXCrSeD5S8Sqcrtiqkf2HXu": { + "account_type": "User", + "owner": "7MTjmteQHhthwwTZhUzsc2dP4NBvGNRqj8jzdqNxHFGE", + "index": 1194, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.135.43", + "dz_ip": "45.139.135.43", + "tunnel_id": 577, + "tunnel_net": "169.254.3.134/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7MTjmteQHhthwwTZhUzsc2dP4NBvGNRqj8jzdqNxHFGE", + "tunnel_endpoint": "0.0.0.0" + }, + "GVE6ch3eG989RVw4st19sssvfCrgHUHqtbbcNaJVyhAr": { + "account_type": "User", + "owner": "94jAcuniXhrHxKhTY8SNZE4L6KfNk8t4K1aprGehJz8g", + "index": 232, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.120.195", + "dz_ip": "67.213.120.195", + "tunnel_id": 517, + "tunnel_net": "169.254.0.216/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GVtCj5wFGcLV2GPbP2M1H8jqK1VTe88tbdrD4YCJmUWA": { + "account_type": "User", + "owner": "TrUtH9WTw1jBVuuExpm3MnC5XF7mW6J3x6oXXA9yX4U", + "index": 364, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.10.211", + "dz_ip": "185.26.10.211", + "tunnel_id": 537, + "tunnel_net": "169.254.1.70/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "TrUtH9WTw1jBVuuExpm3MnC5XF7mW6J3x6oXXA9yX4U", + "tunnel_endpoint": "0.0.0.0" + }, + "GXaJaUQ3zYZb9pAF9MpFH5U29DVo2XMZsaPe67qvmYmM": { + "account_type": "User", + "owner": "7xKcmAmHwXzvpXCHw55DcdGwCAhtqj3L83ca8anpJ7kJ", + "index": 1459, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "140.82.43.129", + "dz_ip": "140.82.43.129", + "tunnel_id": 586, + "tunnel_net": "169.254.4.6/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GbVi8ePjsuVQVM6d4jUt6HxDAJUHWR3fn2r3SV2sbvHF": { + "account_type": "User", + "owner": "3C5HPrFxxanYuV7973hkZSqSWrFXXfKMqGRuu1sPJvVa", + "index": 411, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "185.8.106.250", + "dz_ip": "185.8.106.250", + "tunnel_id": 529, + "tunnel_net": "169.254.1.134/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Gc3Xs8uPq835Y6ziGFWAmh6s4tdNqErbdeBkF5KdARD": { + "account_type": "User", + "owner": "5NcDmfD53pKz5yw4Lr6JESeo3FkjwnSgG2Va3LkwbPMX", + "index": 1252, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "23.227.189.30", + "dz_ip": "23.227.189.30", + "tunnel_id": 528, + "tunnel_net": "169.254.1.130/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Ge1TLCkojydtkyWgFxd6M4r816nzerT36zs2APyEskYa": { + "account_type": "User", + "owner": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe", + "index": 341, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.11.139", + "dz_ip": "185.26.11.139", + "tunnel_id": 516, + "tunnel_net": "169.254.1.36/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "chdvWr6T14nqGRFD37KY36dsvhkCtDaufW5rpu3AfHe", + "tunnel_endpoint": "0.0.0.0" + }, + "GgNkf17VYAoBM3qt6DAfqUpAcPpnjAcSDctyukfaEvXK": { + "account_type": "User", + "owner": "ungM4fafkQg1e13MAzwzuvCxtTTiTZ4Xcq7KqnJRyVJ", + "index": 1376, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.121.181", + "dz_ip": "67.213.121.181", + "tunnel_id": 563, + "tunnel_net": "169.254.3.240/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Ghj5X57VvsG78SZsTRZrpa1wuNoadjgco3k8MgCZH1wu": { + "account_type": "User", + "owner": "TRi12sEaDkgoNSsEpep3YF8QPjqz4qM63mc1Z4tQCvD", + "index": 1494, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "185.229.190.79", + "dz_ip": "185.229.190.79", + "tunnel_id": 581, + "tunnel_net": "169.254.4.16/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GiMGw9KrikUj4RgfyauhhDAeyvWLiNqn7kJjj3mYLPDf": { + "account_type": "User", + "owner": "va1i6T6vTcijrCz6G8r89H6igKjwkLfF6g5fnpvZu1b", + "index": 763, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.134.108.155", + "dz_ip": "45.134.108.155", + "tunnel_id": 580, + "tunnel_net": "169.254.2.122/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GjYXh58zsPfh6jyu1muLs5DNjmZEgT1V473AwhULqiyQ": { + "account_type": "User", + "owner": "9F1bGdE573c7DomVRk7we5JjdxAXrn5t9cf1epFTzvK5", + "index": 1336, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "107.182.163.226", + "dz_ip": "107.182.163.226", + "tunnel_id": 517, + "tunnel_net": "169.254.3.206/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GkgyJu34ZAEN84MuCsQgnma9vMXmDs2zwnxY2KiwB3y3": { + "account_type": "User", + "owner": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "index": 1165, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "72.46.87.59", + "dz_ip": "72.46.87.59", + "tunnel_id": 523, + "tunnel_net": "169.254.1.200/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CtzN7ysR5rX69qd168Aosbuc83mPozhi81bEHbG7ecNP", + "tunnel_endpoint": "0.0.0.0" + }, + "GmZJWCnHALh1oD2MCRFAdD67A7v96MXLRP7pxCSf3caD": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 1498, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.15", + "dz_ip": "177.54.154.15", + "tunnel_id": 500, + "tunnel_net": "169.254.4.20/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "5tGM5Ri56WdzhpdPrWpCQPRjM3rp3xQQGn4bpT6acH9V", + "tunnel_endpoint": "0.0.0.0" + }, + "Gqfzisqkgw6Dz8JqsMY2KKaJRzTGY5ZhVHLBcSTUn8Nu": { + "account_type": "User", + "owner": "4hm5RaZR21k5V3dsc5xzEsVW1RSv7pbPPfNrUCDvseTH", + "index": 103, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "38.97.60.51", + "dz_ip": "38.97.60.51", + "tunnel_id": 506, + "tunnel_net": "169.254.0.98/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Gu5qNRonEr32C4bHMXZ6yQpZHVViTcTRsrZJmmbe6LTR": { + "account_type": "User", + "owner": "H8AJgEgQFaaZVXBMz97A8YKu1YFte4GtphNy5Hf7SawS", + "index": 1108, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "149.50.101.248", + "dz_ip": "149.50.101.248", + "tunnel_id": 594, + "tunnel_net": "169.254.3.46/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GuE9kvFh2xkoArcFZhkGfidVFGyo6hSovsJcQYK5eNL1": { + "account_type": "User", + "owner": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ", + "index": 1140, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.223", + "dz_ip": "177.54.154.223", + "tunnel_id": 521, + "tunnel_net": "169.254.1.206/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "adre1Xia7ekGsEqNgHeFc7MYwkfzTQNeJgQmZ2agAKZ", + "tunnel_endpoint": "0.0.0.0" + }, + "Gy7QiYVgcspkQuVz5tzBssYcLkKBNeazDuNprSEadHRi": { + "account_type": "User", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 1473, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.120.9", + "dz_ip": "67.213.120.9", + "tunnel_id": 588, + "tunnel_net": "169.254.1.92/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "GyH2mEVwk8kSF5zndJW1FxDNUiYY2khR8rwRHX8tgzd2": { + "account_type": "User", + "owner": "Hhn4usDjnktbPURJHbi4YrPdKudBD5Qq35mTcaQ3Uu6", + "index": 399, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "77.81.119.154", + "dz_ip": "77.81.119.154", + "tunnel_id": 518, + "tunnel_net": "169.254.1.112/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "Hhn4usDjnktbPURJHbi4YrPdKudBD5Qq35mTcaQ3Uu6", + "tunnel_endpoint": "0.0.0.0" + }, + "GzgSbh9a1gcECmJziawzJ7MaKwMn5PSdq4qqEHY2KqxV": { + "account_type": "User", + "owner": "STKEbHxS7rRMgL1NE99MqV1VjTypnUV5YmE7TqAC4JY", + "index": 706, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "204.16.241.216", + "dz_ip": "204.16.241.216", + "tunnel_id": 549, + "tunnel_net": "169.254.2.36/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "H1uEJA3GChED7akvT6F6FmZAo4QYZqP1T2KsTGyJfMLv": { + "account_type": "User", + "owner": "Ey3DkEVbfBxfWmkTsG7Hqj7jshYf5Zx9H8462Zjjkykf", + "index": 1242, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.134.108.141", + "dz_ip": "45.134.108.141", + "tunnel_id": 559, + "tunnel_net": "169.254.3.56/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "H4SFxqRfDCbL5jggUaUeFuU8a1UuAGvsVCGwsS789e3x": { + "account_type": "User", + "owner": "XG5YXBHUpV4Lcaeps6JQ49U3EV14TkRA8TNrx1Q37tX", + "index": 402, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "188.214.130.101", + "dz_ip": "188.214.130.101", + "tunnel_id": 545, + "tunnel_net": "169.254.1.118/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "H6aKUkTvKtKGt9SRY8UFESG1RarnTrz8CzZB1n8Xm73n": { + "account_type": "User", + "owner": "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d", + "index": 1157, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "94.46.194.194", + "dz_ip": "94.46.194.194", + "tunnel_id": 523, + "tunnel_net": "169.254.3.90/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6xUK9Nbonr4eoJNtHGoUEMmYKoPz5mipKzyDBv6deX4d", + "tunnel_endpoint": "0.0.0.0" + }, + "HABixeCgQue8xuaiuQPBgJbfCsZ7xZzrehE9EUYr5qE1": { + "account_type": "User", + "owner": "DZ8r6dJzbr4NB69rEKCVv1HJQznbp3c3ng1RaZnjx8Qu", + "index": 1429, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "45.139.133.169", + "dz_ip": "45.139.133.169", + "tunnel_id": 521, + "tunnel_net": "169.254.3.244/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "HB5jpt7UFap22JFk8r9YK1Su5Tq3Y57RbtU17CVPQu5w": { + "account_type": "User", + "owner": "BSNJGveGPVYzdt2bhTh3YfqbzWPH5Sq38zT1Br88Pn1N", + "index": 1361, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "86.105.224.133", + "dz_ip": "86.105.224.133", + "tunnel_id": 573, + "tunnel_net": "169.254.2.222/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "HDnY5x6DQGxvaFbi9Qq1CdbT1LzCAaQpotnAYWMEtazL": { + "account_type": "User", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 190, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "54.215.102.227", + "dz_ip": "54.215.102.227", + "tunnel_id": 507, + "tunnel_net": "169.254.0.192/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "HGStSViv3LzcBawEC3dgRVSjno1cth4HfMQ7rj88F914": { + "account_type": "User", + "owner": "4JTfCRjd6SzZdoKqdvStHvaKHBYCe9iENAnG4iDTrGW2", + "index": 770, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "62.197.45.92", + "dz_ip": "62.197.45.92", + "tunnel_id": 553, + "tunnel_net": "169.254.2.130/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4JTfCRjd6SzZdoKqdvStHvaKHBYCe9iENAnG4iDTrGW2", + "tunnel_endpoint": "0.0.0.0" + }, + "HJnLnipV8RJSuFvjeiMhnQGpiHGVL6PntecHvSTATtLE": { + "account_type": "User", + "owner": "dzmTjnSdbPhsVPFcJVsnr6DvkrmUkrvzhXLqxHXPwoU", + "index": 572, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "217.170.206.42", + "dz_ip": "217.170.206.42", + "tunnel_id": 527, + "tunnel_net": "169.254.1.224/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6xFDLX751L7H9d5fQT9sf2SM5RWWE9LDgqz25pPDbWoJ", + "tunnel_endpoint": "0.0.0.0" + }, + "HNyni8E4Af1epoEiMjKRVaCjTHc2S4NHBCxiZmqxxXvK": { + "account_type": "User", + "owner": "7Nn8qBJey7vXtVFMNBbbuN8UkujU8Y6nWzbHVGuf49yV", + "index": 244, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "147.28.171.13", + "dz_ip": "147.28.171.13", + "tunnel_id": 501, + "tunnel_net": "169.254.0.230/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7Nn8qBJey7vXtVFMNBbbuN8UkujU8Y6nWzbHVGuf49yV", + "tunnel_endpoint": "0.0.0.0" + }, + "HPqvor8z8DwuBVXheLM2t8Ab3BJ2xaZSLsMDZ67589vh": { + "account_type": "User", + "owner": "DWGupvBwXjUudG1fPqtcuw4qe6ByDzzLhnbr5z7RGWsL", + "index": 1050, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "62.197.45.108", + "dz_ip": "62.197.45.108", + "tunnel_id": 560, + "tunnel_net": "169.254.2.242/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DWGupvBwXjUudG1fPqtcuw4qe6ByDzzLhnbr5z7RGWsL", + "tunnel_endpoint": "0.0.0.0" + }, + "HSDR76enLUDKug3RbnTB54WnppZRt8umvA94oqfqTiiz": { + "account_type": "User", + "owner": "d9Q3MLqFURWZxskvnNgh7X2C7tK3P1kxNgffGZTz964", + "index": 1306, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "207.121.26.12", + "dz_ip": "207.121.26.12", + "tunnel_id": 500, + "tunnel_net": "169.254.0.30/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "HT7FrupdBEM1iBzjgfpSXc6NPgoayyuj9n1jUTkksNVz": { + "account_type": "User", + "owner": "E8XDVg2poFCXPHjQKZajj6yxGQKG7ECuEyG4ALNCJn59", + "index": 1078, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "109.94.97.191", + "dz_ip": "109.94.97.191", + "tunnel_id": 534, + "tunnel_net": "169.254.3.22/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "pitch9cMruwjDtAnisNS4mwZUPhMsBztNEGu2weMg55", + "tunnel_endpoint": "0.0.0.0" + }, + "HZZJXiRHaw63hccbkjsQj21J38sHmZc2W6LLQyfBqhbz": { + "account_type": "User", + "owner": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup", + "index": 1139, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.221", + "dz_ip": "177.54.154.221", + "tunnel_id": 520, + "tunnel_net": "169.254.0.248/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DEgenZMznWXvg5YHaZM75arVTauV453SeXX1UrxcGNup", + "tunnel_endpoint": "0.0.0.0" + }, + "HaFarP1T6Nn4R3L4cB9BkZZHzuSZ4t3f4K4peMWbZN61": { + "account_type": "User", + "owner": "DCku1zbjf8NU9Sg3yh5TELDLRsq3nxJsCqn1qyY3znin", + "index": 582, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "149.255.32.130", + "dz_ip": "149.255.32.130", + "tunnel_id": 542, + "tunnel_net": "169.254.1.244/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "HaThCyQ5LZjNdt4ieWme1HNjPoFMUMxenFPXUnyzugir": { + "account_type": "User", + "owner": "C5HvMeXdHGxi7nVTFPF6KcyK77RSWLLvEEB3ParXoK1F", + "index": 227, + "bump_seed": 249, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "86.111.48.190", + "dz_ip": "86.111.48.190", + "tunnel_id": 509, + "tunnel_net": "169.254.0.164/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "HcChBAj3m1q2TZJaREhRg2RAxtp6RDmRnrKZUtn5xPYc": { + "account_type": "User", + "owner": "ARhaxHWMJEishoRAwN98gfzXAC9HPeirFTnv6UYs6qgt", + "index": 50, + "bump_seed": 249, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.32.133", + "dz_ip": "64.130.32.133", + "tunnel_id": 504, + "tunnel_net": "169.254.0.28/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "He2E6CfYixcwuKWjPuwPmH47Ffbxtp58SmHJJ9Eqd6wx": { + "account_type": "User", + "owner": "GUDk7YkqVHJFKMnximYS4QU4jjGW67v9291CHSk8riPy", + "index": 128, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "89.42.231.199", + "dz_ip": "89.42.231.199", + "tunnel_id": 514, + "tunnel_net": "169.254.0.130/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "HipKYESgP1tozPA7yWjEVn4cr3ZTftBLgcX2co8Gf3DL": { + "account_type": "User", + "owner": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "index": 300, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "69.67.148.121", + "dz_ip": "69.67.148.121", + "tunnel_id": 518, + "tunnel_net": "169.254.1.20/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "tunnel_endpoint": "0.0.0.0" + }, + "HmyT3k82a5FDTuMPAx6GV1bzB4Pmwd64V8uSDEV13V4L": { + "account_type": "User", + "owner": "2iXZmNQmmgE5ZeTQ1GMhhYGDqDr2BiqdEu3DbGJDo8MA", + "index": 1009, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.42.86", + "dz_ip": "212.83.42.86", + "tunnel_id": 596, + "tunnel_net": "169.254.2.218/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "2iXZmNQmmgE5ZeTQ1GMhhYGDqDr2BiqdEu3DbGJDo8MA", + "tunnel_endpoint": "0.0.0.0" + }, + "HoYNCtjtd5XYjtXodjHxwdqXq8Y8vvXcgDqU4DHykrWv": { + "account_type": "User", + "owner": "H38xoP8VoQrBvH5GxaeQSpc4Eie8fJmLbva7paSVR5wE", + "index": 768, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "173.201.36.4", + "dz_ip": "173.201.36.4", + "tunnel_id": 527, + "tunnel_net": "169.254.1.114/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Hp4GXwuyBmV6BJemAfwaPggkZSFGuagt9ce1PEkh3dzG": { + "account_type": "User", + "owner": "B1w6SZcyvjyp6zEyStcc8u9AxXAh2AbYvNzMmP9rRKE9", + "index": 1056, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "5.187.35.6", + "dz_ip": "5.187.35.6", + "tunnel_id": 602, + "tunnel_net": "169.254.2.254/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "AsMpvJ3DZ2Ydu1WTRMAyMH4QjSLiUG39rKzfzvtE1bWr", + "tunnel_endpoint": "0.0.0.0" + }, + "HpFkt8EKASUcMS4WUy2985xBWte55tR7adr6WP4b33RP": { + "account_type": "User", + "owner": "WUNoB9YQXmXXRcJsjY1G8PfVag5aAfnyGmFd6YwJVwp", + "index": 985, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "46.166.162.139", + "dz_ip": "46.166.162.139", + "tunnel_id": 545, + "tunnel_net": "169.254.2.198/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Hpjj2oqW5Ho1k72Z51XggyvmT4aYbemsZQvW5BaD5M4P": { + "account_type": "User", + "owner": "4PZhSk2xGpadMaHGiHj8nrv8ws9kw9UaFajP9nq4ffDM", + "index": 123, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "31.172.68.190", + "dz_ip": "31.172.68.190", + "tunnel_id": 513, + "tunnel_net": "169.254.0.124/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "HqMv1iMnATznh2mKZ5wfBmRwsxVn7rHL9TA1ohLUrBzn": { + "account_type": "User", + "owner": "C5VDTdJWA1ck6bPiX7d8CurGTfG45zpWdTU5G2y2deSG", + "index": 371, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "64.20.53.122", + "dz_ip": "64.20.53.122", + "tunnel_id": 525, + "tunnel_net": "169.254.1.80/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Hqrd3L18C2peJWtT2kcwmDRni4sXWcHGUh8FUWH8jvpE": { + "account_type": "User", + "owner": "9q16BB7WGmBxf1nJTdxH5zPnBUhtHqdqXqRFjSjuM4k7", + "index": 1482, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "5.199.172.136", + "dz_ip": "5.199.172.136", + "tunnel_id": 550, + "tunnel_net": "169.254.1.186/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "9q16BB7WGmBxf1nJTdxH5zPnBUhtHqdqXqRFjSjuM4k7", + "tunnel_endpoint": "0.0.0.0" + }, + "Hrmg9mk35Dcfae7FGomzhU6vzeyjyerx7QZesanmnvBb": { + "account_type": "User", + "owner": "F5CRSKK34yQ1G43WnnP5vy9sj4YxthBWM4ct3wGzaB6n", + "index": 1037, + "bump_seed": 250, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "91.189.177.162", + "dz_ip": "91.189.177.162", + "tunnel_id": 552, + "tunnel_net": "169.254.2.220/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "F5CRSKK34yQ1G43WnnP5vy9sj4YxthBWM4ct3wGzaB6n", + "tunnel_endpoint": "0.0.0.0" + }, + "HstLTG31MfWWKkPd4tY4xRgug6SYCFiLbpF2L5wbcv3r": { + "account_type": "User", + "owner": "7Nu9ckgtjobZ3MkbadGFKEvRymYuah9HmcxiUJKMM9NB", + "index": 1193, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.44.20", + "dz_ip": "64.130.44.20", + "tunnel_id": 510, + "tunnel_net": "169.254.3.144/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "HvvkL8qzkp51oqQMHs7ADUWdWnEoCJsJyced2P6s1MyC": { + "account_type": "User", + "owner": "Fqh8Nritu6PGuscfDxsgwq8KiLimR2D59R4F6EKYdKvt", + "index": 743, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "91.237.141.80", + "dz_ip": "91.237.141.80", + "tunnel_id": 528, + "tunnel_net": "169.254.2.98/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "G8PRbhRgmsfVycBjSmzswifnZRd4ZEWBiREQSymbKUY9", + "tunnel_endpoint": "0.0.0.0" + }, + "HwCf5jZ98iJ6RJAdouvAUSJ4ZVbtanUs3xfmCvMTDZXB": { + "account_type": "User", + "owner": "4Bi5i2ggQQDg7sPpWM2CKDMBExA8wwEMmKBcuE516Njj", + "index": 1331, + "bump_seed": 255, + "user_type": "IBRLWithAllocatedIP", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "172.96.15.76", + "dz_ip": "64.86.248.129", + "tunnel_id": 573, + "tunnel_net": "169.254.3.198/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Hwr7JBiUT92KgKUNvDXf5Qth8FN1NV2Qz3jhqQxhgy8r": { + "account_type": "User", + "owner": "7Hp1e6BrTBkbBN4wFiNmycPVPsjvyUUBL2tGhYEMT6gt", + "index": 1060, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "69.67.150.181", + "dz_ip": "69.67.150.181", + "tunnel_id": 563, + "tunnel_net": "169.254.3.2/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7Hp1e6BrTBkbBN4wFiNmycPVPsjvyUUBL2tGhYEMT6gt", + "tunnel_endpoint": "0.0.0.0" + }, + "HxdA3vGBxGTY9vYCkvdp6mJFrEpQLkMmJKdEF2Vu4SZS": { + "account_type": "User", + "owner": "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf", + "index": 1106, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "62.197.45.24", + "dz_ip": "62.197.45.24", + "tunnel_id": 565, + "tunnel_net": "169.254.3.42/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf", + "tunnel_endpoint": "0.0.0.0" + }, + "HzsJA9LokNsn74uDDRqfDMEFcAQYeEEkPhdwPYqDtmpC": { + "account_type": "User", + "owner": "wetkjRRRDrSPAzHqfVHtFDbhNnejKm5UPfkHeccFCpo", + "index": 246, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "189.1.171.175", + "dz_ip": "189.1.171.175", + "tunnel_id": 520, + "tunnel_net": "169.254.0.232/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "J2TzQM4mGEp62GjWPa8pq1iAVESVEyYCdGL8unA4HUc4": { + "account_type": "User", + "owner": "BHCsbYTDVd3wiJiEgjtLcxxj75tYPDbNzUehTeBxMzbY", + "index": 996, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "8.245.26.220", + "dz_ip": "8.245.26.220", + "tunnel_id": 509, + "tunnel_net": "169.254.0.214/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "J4yagS5s41tDwF1CbUUSfLagj6jqjGNqTcCCtpRsPuDi": { + "account_type": "User", + "owner": "F1rUdK6ctLyP3yxeMXeMVrsBHGYaGVE9K8VPdbDH8YFH", + "index": 79, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.52.135", + "dz_ip": "64.130.52.135", + "tunnel_id": 507, + "tunnel_net": "169.254.0.70/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "J6CxQAhPNn2pWic4XeR52Zwmf7UdzB2fSNeGR7mtj3JL": { + "account_type": "User", + "owner": "Cn5H2oxjXemT13eeFU45gobRYiJrjCrhGaqKTMd66SZM", + "index": 1435, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "cyoa_type": "GREOverDIA", + "client_ip": "200.69.14.231", + "dz_ip": "200.69.14.231", + "tunnel_id": 546, + "tunnel_net": "169.254.3.154/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "J77KZsSXzK11AA3uLHxZRpodyLNG1ykmZkC986eFgUWY": { + "account_type": "User", + "owner": "SLAY6uN1zZpXBTfbuDDCesNmM5D288xrz8uYvfS3n41", + "index": 131, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.159.47", + "dz_ip": "177.54.159.47", + "tunnel_id": 506, + "tunnel_net": "169.254.0.136/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SLAY6uN1zZpXBTfbuDDCesNmM5D288xrz8uYvfS3n41", + "tunnel_endpoint": "0.0.0.0" + }, + "J8mqm4F5NM63PCGskoSDyWi1xesvC8CwnSaxpdMaqRpS": { + "account_type": "User", + "owner": "SFDZe38ktiSkmDfiqH5BmjkoeAvbS24XBCNgQZTew4P", + "index": 585, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "142.4.55.162", + "dz_ip": "142.4.55.162", + "tunnel_id": 529, + "tunnel_net": "169.254.1.250/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "J9mci6bntpAA5DGf8DktR22VvQQpsxDj3TJ9fpZB3E4C": { + "account_type": "User", + "owner": "4hm5RaZR21k5V3dsc5xzEsVW1RSv7pbPPfNrUCDvseTH", + "index": 1260, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "38.129.137.238", + "dz_ip": "38.129.137.238", + "tunnel_id": 508, + "tunnel_net": "169.254.0.114/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "JALjgjwuaAALGoSGBX1CmW6P7WiJXxEoxQB4wzDQmrPu": { + "account_type": "User", + "owner": "8wWxxYfektdmMDoHZUMCpWLqni1Bt4vwm6ejyVZTsoNE", + "index": 1264, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "185.26.10.97", + "dz_ip": "185.26.10.97", + "tunnel_id": 621, + "tunnel_net": "169.254.3.166/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "JCKChHjPd2mm9doH6kF9UPE3g41GJijZSrEQfiFeJcfJ": { + "account_type": "User", + "owner": "8n9KRHDRDuZErZwdwzhtsTFJxmHqgCQ4ddZcdk6GMzvQ", + "index": 1379, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "57.128.72.192", + "dz_ip": "57.128.72.192", + "tunnel_id": 622, + "tunnel_net": "169.254.1.100/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "JE5PJ8DLq4oXH7iqyzUGVvXwRj9czmFYHXhA3tiZdoyU": { + "account_type": "User", + "owner": "9FQMKWW9LinAhQCKK7NRfashPYm7sntYRLieB86k9j4v", + "index": 89, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "209.38.103.172", + "dz_ip": "209.38.103.172", + "tunnel_id": 510, + "tunnel_net": "169.254.0.80/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "LLTPYpkezF39ghUpG2gdrRJ92yTfrymDj7UktGaaUrX": { + "account_type": "User", + "owner": "4SgoyAwN26iu9Gpf12Bk1rnzp4G4yDUM3XVv4w7VQcAf", + "index": 904, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "67.213.127.17", + "dz_ip": "67.213.127.17", + "tunnel_id": 558, + "tunnel_net": "169.254.2.186/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "N3T66SpnQTeTuFGkqhPk31r3Dmevmk8rAGYJqXfgdZu": { + "account_type": "User", + "owner": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP", + "index": 1141, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "177.54.154.225", + "dz_ip": "177.54.154.225", + "tunnel_id": 522, + "tunnel_net": "169.254.1.218/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BeRtYZnaaZLFwYQRPaZcxuuHBmyFBSGP32C8Ls5xnrZP", + "tunnel_endpoint": "0.0.0.0" + }, + "SAcRTNiKLF7V7Lh6S5yXR21uYPVweW2YkbPmBnuBAJH": { + "account_type": "User", + "owner": "A4XSeSJb1MEgqF4k3pFzL5cKg5FRehW8cgzZs95ey3dY", + "index": 530, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "66.165.246.46", + "dz_ip": "66.165.246.46", + "tunnel_id": 511, + "tunnel_net": "169.254.0.154/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "BoNKmNCGvoHS4CkKvYRnF21iEpUP827pZjhFGdA4t5as", + "tunnel_endpoint": "0.0.0.0" + }, + "VXoKVBcjkQBKwgxpz5Wu9b84gC9uUyD3Bj5uP4hgcyh": { + "account_type": "User", + "owner": "GXngqGCgvY8jXbcWkgaqhgSJFiB3hWcf2oBfYv6fHApq", + "index": 239, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "cyoa_type": "GREOverDIA", + "client_ip": "74.50.79.146", + "dz_ip": "74.50.79.146", + "tunnel_id": 518, + "tunnel_net": "169.254.0.32/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "VjkytjCDXh2MEG8y2xa9S68ghhDgZJw4tT44jy473sQ": { + "account_type": "User", + "owner": "odcvDWH5wHVKz9XtmGGxTj5ZsmawTjCCty3nyBKDGzS", + "index": 1470, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "102.211.135.173", + "dz_ip": "102.211.135.173", + "tunnel_id": 572, + "tunnel_net": "169.254.3.194/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "Y1Uyvq2CUuTy2pCeDsovGBF2ReSpbEegZks3dqLCn4a": { + "account_type": "User", + "owner": "De6Q6aS9JG8qkVUwR3kcrDZ65Y2MPafvwHx5QQdRunnw", + "index": 1452, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "195.3.221.14", + "dz_ip": "195.3.221.14", + "tunnel_id": 538, + "tunnel_net": "169.254.3.254/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "YStjoWyFCVWbFeRUViHaVnqHDoqA2x2wsUKsjQxeiY4": { + "account_type": "User", + "owner": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn", + "index": 993, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "cyoa_type": "GREOverDIA", + "client_ip": "95.168.172.74", + "dz_ip": "95.168.172.74", + "tunnel_id": 559, + "tunnel_net": "169.254.2.204/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "7VZM7YHcX73TpGoXDeBu61g4QKC86GwAEnew8dA7Y2xn", + "tunnel_endpoint": "0.0.0.0" + }, + "YVYW6K4oHSEcvd1VyKFWFy78iQktNVegPNH4aPDPZ7U": { + "account_type": "User", + "owner": "2Ed5TsJ9JwhQ23X2kM5EK4sguTx5kmrPSU34R7AKiPG1", + "index": 48, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "cyoa_type": "GREOverDIA", + "client_ip": "104.237.53.202", + "dz_ip": "104.237.53.202", + "tunnel_id": 501, + "tunnel_net": "169.254.0.26/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "bCohjxaUkXq5G7TdSGztLnCcusbyEtJB1btS91gqJVy": { + "account_type": "User", + "owner": "DzT2PnfyVfa1YZskndEyTs16ZWUnCBdPdV3aiEUJ2Mkj", + "index": 223, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "149.50.116.145", + "dz_ip": "149.50.116.145", + "tunnel_id": 502, + "tunnel_net": "169.254.0.106/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "c2N18veCkMoSsJ4ozzRf1NjNCH85wsjjRY7mfw6M7JS": { + "account_type": "User", + "owner": "ZpjV1Q4hYczLbSzyuxPetELomP9wSP3jPq9b48ZG3pG", + "index": 225, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "cyoa_type": "GREOverDIA", + "client_ip": "8.245.23.252", + "dz_ip": "8.245.23.252", + "tunnel_id": 508, + "tunnel_net": "169.254.0.142/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "et1BU84izg3x5c2UvLJbjhkiKWC9xJofNyQGSigKt4P": { + "account_type": "User", + "owner": "DwGEK1ZSC5SM9e7Tkts5hLpkUffAsFUcqeLr2zifaXZi", + "index": 1053, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "185.101.32.250", + "dz_ip": "185.101.32.250", + "tunnel_id": 555, + "tunnel_net": "169.254.2.248/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DwGEK1ZSC5SM9e7Tkts5hLpkUffAsFUcqeLr2zifaXZi", + "tunnel_endpoint": "0.0.0.0" + }, + "gJbF866smjL4HZqc8nan5FgrvZ7Nf4sNkwSMh9gzBbP": { + "account_type": "User", + "owner": "N43JWBg42ZoUFMkHsRUVbP7wGVdxaHKanqaF9BBNiFC", + "index": 537, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.43.115", + "dz_ip": "212.83.43.115", + "tunnel_id": 556, + "tunnel_net": "169.254.1.174/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "DWwZGTzddxgZ9qCQiGzydcdEbjBNkfSL7Y6c6oYBYk8v", + "tunnel_endpoint": "0.0.0.0" + }, + "jhsaYa875hTeWZUYE9LJWS117szm8x5cvnqKddJtpzt": { + "account_type": "User", + "owner": "SP9K2c8Z1aaQaqdQgC6hZMJ5UCTTnE76XNYVse7H94b", + "index": 667, + "bump_seed": 251, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "82.197.162.50", + "dz_ip": "82.197.162.50", + "tunnel_id": 533, + "tunnel_net": "169.254.1.196/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "SP9K2c8Z1aaQaqdQgC6hZMJ5UCTTnE76XNYVse7H94b", + "tunnel_endpoint": "0.0.0.0" + }, + "kQwtrVocVcJ9AFLDKChi81Jd6zLu8Z3pzdmd4mYJz8a": { + "account_type": "User", + "owner": "2t9FqcHHFdcsht8aoYDAgcV4b2atjcYJjXaHPxFumgcG", + "index": 1052, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "107.155.114.146", + "dz_ip": "107.155.114.146", + "tunnel_id": 600, + "tunnel_net": "169.254.2.246/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "m3ePtcQJiTCi8cM9bSqnJ459BJ9B2zWxhbQyRjenjUR": { + "account_type": "User", + "owner": "4hm5RaZR21k5V3dsc5xzEsVW1RSv7pbPPfNrUCDvseTH", + "index": 115, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "88.216.197.27", + "dz_ip": "88.216.197.27", + "tunnel_id": 510, + "tunnel_net": "169.254.0.110/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "vALigXFg9wnnhVHN16vNxHxXtAXiBv5QjAE6udoniBY", + "tunnel_endpoint": "0.0.0.0" + }, + "mowi28JfbopAkgUcuutTAyCU7gTjFXtauybyKUJkr9Y": { + "account_type": "User", + "owner": "DRnvWydSjzDkhN1AsZ5oTm8nqNCmxtCxJ8T1sXk5kCmb", + "index": 259, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "93.100.241.247", + "dz_ip": "93.100.241.247", + "tunnel_id": 525, + "tunnel_net": "169.254.0.162/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "naYZQdL57WF4PdAa7ctKKrzeFVgtFhQUDGCZgqF6Y98": { + "account_type": "User", + "owner": "4YGgmwyqztpJeAi3pzHQ4Gf9cWrMHCjZaWeWoCK6zz6X", + "index": 229, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "217.170.192.166", + "dz_ip": "217.170.192.166", + "tunnel_id": 510, + "tunnel_net": "169.254.0.210/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "4YGgmwyqztpJeAi3pzHQ4Gf9cWrMHCjZaWeWoCK6zz6X", + "tunnel_endpoint": "0.0.0.0" + }, + "q2AEcvhg5ZGMtiuuHfjPG95PqnnMdJ8UyvVRakyRFJE": { + "account_type": "User", + "owner": "CZ2xJQHwiojrAgrR2BUNheuWxXGjSVSZrkcxFcAGoSUH", + "index": 782, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "64.130.40.217", + "dz_ip": "64.130.40.217", + "tunnel_id": 539, + "tunnel_net": "169.254.2.148/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "CZ2xJQHwiojrAgrR2BUNheuWxXGjSVSZrkcxFcAGoSUH", + "tunnel_endpoint": "0.0.0.0" + }, + "rDzzH1Y9ajh9crytVMBR5ifYNt3VRKTazqzjJuw4f3y": { + "account_type": "User", + "owner": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "index": 564, + "bump_seed": 252, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "102.211.135.167", + "dz_ip": "102.211.135.167", + "tunnel_id": 524, + "tunnel_net": "169.254.1.212/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "YE11a5nVJtUNqsojkphYuWc7StqBzbCeFH6BjhAAUEV", + "tunnel_endpoint": "0.0.0.0" + }, + "rEUqVFUFmyJkhaXNNMcMWoT92cPDR9BmHKMiqt6tcJv": { + "account_type": "User", + "owner": "6pVZhUW9AZMMFuNVMUds8useZHB7VFT4vvxuA3B9JgW4", + "index": 767, + "bump_seed": 253, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "212.83.43.186", + "dz_ip": "212.83.43.186", + "tunnel_id": 582, + "tunnel_net": "169.254.1.64/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "6pVZhUW9AZMMFuNVMUds8useZHB7VFT4vvxuA3B9JgW4", + "tunnel_endpoint": "0.0.0.0" + }, + "v2k88RzCLGvtCGoa3w1nbxTbAuTcGLL8GmryfJnzcVB": { + "account_type": "User", + "owner": "6jxte5jrKezgZ8XhnmcXEVEN4xQxbXb1hR4mUg3m6BrB", + "index": 1462, + "bump_seed": 254, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "cyoa_type": "GREOverDIA", + "client_ip": "91.209.71.13", + "dz_ip": "91.209.71.13", + "tunnel_id": 569, + "tunnel_net": "169.254.4.12/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "11111111111111111111111111111111", + "tunnel_endpoint": "0.0.0.0" + }, + "v866oGLAM8mhhLch4Qxub2fgmQm1rYrjQorMfGe1Lh9": { + "account_type": "User", + "owner": "U3hq6THZ5b1hzUQUtxaHRYr7pNAHeMKvfLBL59NjNo9", + "index": 1171, + "bump_seed": 255, + "user_type": "IBRL", + "tenant_pk": "11111111111111111111111111111111", + "device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "cyoa_type": "GREOverDIA", + "client_ip": "45.134.108.88", + "dz_ip": "45.134.108.88", + "tunnel_id": 613, + "tunnel_net": "169.254.3.114/31", + "status": "Activated", + "publishers": "", + "subscribers": "", + "validator_pubkey": "8SZcsqGPxv5Y2YQfjH2A5XMqvcFSfYgxTKZLNwKhs2sN", + "tunnel_endpoint": "0.0.0.0" + } + }, + "multicast_groups": { + "2xrs7x54tDd6LqXzmSBNVa6yfHnksQeMD52nQZUETWhf": { + "account_type": "MulticastGroup", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "index": 322, + "bump_seed": 252, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.1", + "max_bandwidth": 960000, + "status": "Activated", + "code": "mg01", + "pub_allowlist": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "sub_allowlist": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "publishers": "", + "subscribers": "", + "publisher_count": 0, + "subscriber_count": 0 + }, + "8cw2DHyMtee13pbQrFxTsRE5WChQUjatrVB99BrTppDX": { + "account_type": "MulticastGroup", + "owner": "44NdeuZfjhHg61grggBUBpCvPSs96ogXFDo1eRNSKj42", + "index": 1043, + "bump_seed": 254, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.4", + "max_bandwidth": 200000000, + "status": "Activated", + "code": "jito-shredstream-mainnet", + "pub_allowlist": "", + "sub_allowlist": "", + "publishers": "", + "subscribers": "", + "publisher_count": 0, + "subscriber_count": 0 + }, + "AR8DvEn77GRQ19drMhPCjvFx2StcRJ8XbLVKS6yrgQAV": { + "account_type": "MulticastGroup", + "owner": "44NdeuZfjhHg61grggBUBpCvPSs96ogXFDo1eRNSKj42", + "index": 680, + "bump_seed": 250, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.2", + "max_bandwidth": 2000000000, + "status": "Activated", + "code": "jito-shredstream-testnet", + "pub_allowlist": "AeTCQ1nzdCrHFWpGxfi1XRu7EnxY7G2zpsEJUBCCjvdc", + "sub_allowlist": "93C8y75YR6yHHLVQVrbLU4RqkrzCMzR174Te93MJ3NZF", + "publishers": "AxbyUNUgUCDmMJCCZg8osGWpDeLan1cp9XEeBitLtKqR, EW5Mujb5zzAXtRjwysh5hPeCmJgTHM16HFFgp1xUv1LT", + "subscribers": "DrRFM3mnRELyMUayGz3maCao2wk74XPAfcds7hfGgs6, 6vyeAPTpM6QV3FrtbMFn7m8brqEkPgHDbvMURQFqiCYK", + "publisher_count": 0, + "subscriber_count": 0 + }, + "rUaG7ktLUV4qJRXhRtWVSW91h3mND2Vcsip2MhVb9La": { + "account_type": "MulticastGroup", + "owner": "DZjZR4QB7woRRywaCab9hU5D8QHAtVnbGjFXtK9QFuam", + "index": 222, + "bump_seed": 251, + "tenant_pk": "11111111111111111111111111111111", + "multicast_ip": "233.84.178.0", + "max_bandwidth": 1000000, + "status": "Activated", + "code": "demo", + "pub_allowlist": "", + "sub_allowlist": "", + "publishers": "", + "subscribers": "", + "publisher_count": 0, + "subscriber_count": 0 + } + }, + "contributors": { + "2xtmUDjp7SsyQ42KSB1UCsQcsTrfoXby8bAMcH9wfcBA": { + "account_type": "Contributor", + "owner": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd", + "index": 761, + "bump_seed": 252, + "status": "Activated", + "code": "nd2", + "reference_count": 0, + "ops_manager_pk": "DZfPq5hgfwrSB3aKAvcbua9MXE3CABZ233yj6ymncmnd" + }, + "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yam": { + "account_type": "Contributor", + "owner": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy", + "index": 351, + "bump_seed": 255, + "status": "Activated", + "code": "jump_", + "reference_count": 8, + "ops_manager_pk": "66yfemxTAjCL686R4FFpGugx1myQ7X6m274MzWB82xBy" + }, + "CZBdHn5RArFtXHAiE6r3PbreUYZcqCTudSkcKBYaG9rB": { + "account_type": "Contributor", + "owner": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yBC", + "index": 552, + "bump_seed": 253, + "status": "Activated", + "code": "co03", + "reference_count": 0, + "ops_manager_pk": "3PTvMAYDUTSZe5tjCtPQ8JXjKiasBZkfUrwbDUeQ8yBC" + }, + "HxVCvaatmmNxWANL4Kvh35pb9g451hHLsCyT48G7KzA": { + "account_type": "Contributor", + "owner": "RoXFXFQAqBxYx6QZYG9AmGMWpSyr7xJPPqAy3FCafpv", + "index": 366, + "bump_seed": 255, + "status": "Activated", + "code": "rox", + "reference_count": 1, + "ops_manager_pk": "RoXFXFQAqBxYx6QZYG9AmGMWpSyr7xJPPqAy3FCafpv" + } + }, + "access_passes": { + "Bw59G4T9kQ3aAbg5PbzWEURoRyNFSkjJbpzV3FM7kSJr": { + "account_type": "AccessPass", + "owner": "DZfHh2vjXFqt8zfNbT1afm8PGuCm3BrQKegC5THtKFdn", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "212.83.43.6", + "user_payer": "7hMD4oMmGT4GsS4DfBKzJ75wSjDhgu2pvcazbvoKPrNs", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "tenant_allowlist": [], + "flags": 0 + }, + "85cCT4vyvWRh4UWTiyECnAGKGp44rg8TnBkwgs8dWeVH": { + "account_type": "AccessPass", + "owner": "DZfHh2vjXFqt8zfNbT1afm8PGuCm3BrQKegC5THtKFdn", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "212.83.42.36", + "user_payer": "rmnh7A7y6LuSPph6x9JxNN1dzLZ1NoXSMGBemMJMwZZ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "tenant_allowlist": [], + "flags": 0 + }, + "2wAXMLtEDk89EKfNDU2VujWJVnDnqc4uZSNa9sryTZu3": { + "account_type": "AccessPass", + "owner": "DZfHh2vjXFqt8zfNbT1afm8PGuCm3BrQKegC5THtKFdn", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "74.50.73.142", + "user_payer": "9WXjR7Ea8hKt6Z84EGENQvGR3rFsovcxDYu61TJFcWJ", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "tenant_allowlist": [], + "flags": 0 + }, + "8gUDDzb6XAagwcvNM8YJU6C7LvevArq4YrodvYSGehCc": { + "account_type": "AccessPass", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "15.204.108.105", + "user_payer": "5gEBNPDWRApyuC2gJCSdyv7RCm4sgXXSCeH8D1EfDCMt", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "tenant_allowlist": [], + "flags": 0 + }, + "GJcdNw32VE6hzvVTnWCBJW4eckcEKDXeheWAbpYfsw5J": { + "account_type": "AccessPass", + "owner": "DZfHh2vjXFqt8zfNbT1afm8PGuCm3BrQKegC5THtKFdn", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "216.18.211.210", + "user_payer": "SQDS9iwyWvT2mQbSZzuNKGoxuBug5jRHouF6SuMRBkA", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "tenant_allowlist": [], + "flags": 0 + }, + "XTyyrdkjfjAQqJZPtVnXStx9WiYgLJDqJNA2uFe7iDu": { + "account_type": "AccessPass", + "owner": "DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "5.151.82.130", + "user_payer": "EydLxzdWfD434DDxZYXkTcajvK5VKH7p6CofEDCRUkJ4", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "tenant_allowlist": [], + "flags": 0 + }, + "2pzrXsBFv7V8cEDJA466FTa74h4rHK7kLpDJEfCkVVzY": { + "account_type": "AccessPass", + "owner": "DZfHh2vjXFqt8zfNbT1afm8PGuCm3BrQKegC5THtKFdn", + "bump_seed": 255, + "accesspass_type": "Prepaid", + "client_ip": "188.42.129.244", + "user_payer": "5pPRHniefFjkiaArbGX3Y8NUysJmQ9tMZg3FrFGwHzSm", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "tenant_allowlist": [], + "flags": 0 + }, + "D4dcqEKJPwyHr5BezdquJPqGeFR6dCk4s4vn1PPaUQva": { + "account_type": "AccessPass", + "owner": "DZfHh2vjXFqt8zfNbT1afm8PGuCm3BrQKegC5THtKFdn", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "207.90.227.31", + "user_payer": "8VBhxkJfcQcK1hAvHAXSLEyPcVLpTK2JHF8B4MrLi9Ng", + "last_access_epoch": 18446744073709551615, + "connection_count": 1, + "status": "Connected", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "tenant_allowlist": [], + "flags": 0 + }, + "AQyVgd6EpP7PWL9Qv43cW4HycTNd6xGXR813Eo3tG4BP": { + "account_type": "AccessPass", + "owner": "DZfHh2vjXFqt8zfNbT1afm8PGuCm3BrQKegC5THtKFdn", + "bump_seed": 254, + "accesspass_type": "Prepaid", + "client_ip": "103.219.168.247", + "user_payer": "mythT638QB6T8rqcGS4aKZ5a5z31xakTsRC6CL9KGEe", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "tenant_allowlist": [], + "flags": 0 + }, + "8Zgr2SoFwRSUQjdpLxxBhctYmFprXcMCXN1zNosXhzQA": { + "account_type": "AccessPass", + "owner": "DZfHh2vjXFqt8zfNbT1afm8PGuCm3BrQKegC5THtKFdn", + "bump_seed": 253, + "accesspass_type": "Prepaid", + "client_ip": "70.34.243.134", + "user_payer": "3V2xaccDpFib4DbTksdiveNDmiwpXBqSWyjSof3w1Bg7", + "last_access_epoch": 18446744073709551615, + "connection_count": 0, + "status": "Requested", + "mgroup_pub_allowlist": [], + "mgroup_sub_allowlist": [], + "tenant_allowlist": [], + "flags": 0 + } + } + }, + "dz_telemetry": { + "device_latency_samples": [ + { + "pubkey": "4kNy99krfJ6jq6x2PsfZvSzmfBqUnjjHQXWomPhtcruB", + "epoch": 89, + "origin_device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "target_device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "link_pk": "9WAHrNe8R8X7TaAx7Ge7bowExDtjD2M1nbVNNxXDgnGg", + "origin_device_location_pk": "DJX3x93muX4Tnv2yG4aqLL3YntLurDKeR2SFZEF5qWRV", + "target_device_location_pk": "CJsM8xrShT5YCR8VbaLKR3dDZMA24X9XkMeBKh6eH9z9", + "origin_device_agent_pk": "Cgmo8tCWvjm3VQcWLgvZg2nm5v2nBPWZySTcbNrPXHFW", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242130956364, + "samples": [ + 67202, + 67183, + 67213, + 67230, + 67247, + 67292, + 67221, + 67203, + 67198, + 67203, + 67199, + 67189, + 67232, + 67211, + 67229, + 67219, + 67196, + 67207, + 67215, + 67229, + 67209, + 67272, + 67217, + 67175, + 67177, + 67202, + 67197, + 67183, + 67218, + 67219, + 67208, + 67212, + 67207, + 67244, + 67213, + 67202, + 67212, + 67214, + 67221, + 67196, + 67210, + 67222, + 67214, + 67210, + 67219, + 67194, + 67194, + 67217, + 67195, + 67182, + 67206, + 67191, + 67195, + 67203, + 67275, + 67199, + 67220, + 67195, + 67174, + 67194, + 67211, + 67190, + 67196, + 67236, + 67206, + 67170, + 67211, + 67228, + 67209, + 67256, + 67183, + 67213, + 67215, + 67234, + 67210, + 67216, + 67212, + 67201, + 67179, + 67210, + 67242, + 67234, + 67233, + 67175, + 67234, + 67239, + 67243, + 67223, + 67201, + 67208, + 67267, + 67216, + 67213, + 67183, + 67218, + 67229, + 67211, + 67266, + 67218, + 67209, + 67195, + 67166, + 67201, + 67209, + 67198, + 67193, + 67243, + 67198, + 67197, + 67219, + 67224, + 67229, + 67242, + 67215, + 67349, + 67230, + 67236, + 67197, + 67261, + 67188, + 67201, + 67202, + 67217, + 67218, + 67223, + 80587, + 80343, + 80345, + 80349, + 80372, + 80369, + 80354, + 80327, + 80338, + 80368, + 80363, + 80378, + 80330, + 73757, + 67215, + 67213, + 67201, + 67210, + 67254, + 67258, + 67182, + 67191, + 67233, + 67191, + 67210, + 67211, + 67210, + 67232, + 67247, + 67190, + 67223, + 67232, + 67209, + 67182, + 67220, + 67191, + 67230, + 67188, + 67256, + 67241, + 67224, + 67214, + 67228, + 67223, + 67249, + 67196, + 67216, + 67207, + 67224, + 67250, + 67244, + 67231, + 67185, + 67170, + 67210, + 67214, + 67202, + 67214, + 67205, + 67209, + 67178, + 67209, + 67245, + 67210, + 67181, + 67196, + 67208, + 67219, + 67186, + 67250, + 67221, + 67214, + 67199, + 67218, + 67219, + 67212, + 67218, + 67214, + 67211, + 67218, + 67195, + 67244, + 67228, + 67204, + 67199, + 67199, + 67213, + 67224, + 67238, + 67233, + 67229, + 67254, + 67220, + 67198, + 67176, + 67176, + 67196, + 67220, + 67255, + 67192, + 67223, + 67262, + 67183, + 67200, + 67233, + 67183, + 67201, + 67187, + 67214, + 67236, + 67204, + 67218, + 67183, + 67193, + 67227, + 67177, + 67237, + 67184, + 67235, + 67232, + 67201, + 67186, + 67198, + 67191, + 67195, + 67189, + 67270, + 67230, + 67199, + 67181, + 67214, + 67177, + 67209, + 67226, + 67202, + 67209, + 67188, + 67213, + 67181, + 67226, + 67216, + 67212, + 67190, + 67215, + 67168, + 67222, + 67197, + 67214, + 67217, + 67220, + 67242, + 67182, + 67187, + 67255, + 67243, + 67225, + 67203, + 67190, + 67213, + 67208, + 67192, + 67213, + 67208, + 67193, + 67194, + 67230, + 67223, + 67225, + 67229, + 67180, + 67235, + 67226, + 67216, + 67189, + 67219, + 67207, + 67179, + 67209, + 67214, + 67217, + 67206, + 67178, + 67204, + 67202, + 67221, + 67204, + 67233, + 67178, + 67193, + 67197, + 67217, + 67232, + 67208, + 67257, + 67269, + 67231, + 67196, + 67227, + 67172, + 67211, + 67248, + 67219, + 67193, + 67219, + 67237, + 67181, + 67212, + 67196, + 67225, + 67221, + 67235, + 67232, + 67221, + 67235, + 67207, + 67208, + 67206, + 67236, + 67211, + 67214, + 67220, + 67218, + 67184, + 67257, + 67194, + 67258, + 67215, + 67269, + 67187, + 67208, + 67219, + 67217, + 67263, + 67266, + 67214, + 67221, + 67217, + 67215, + 67197, + 67229, + 67207, + 67181, + 67487, + 67235, + 67214, + 67243, + 67208, + 67189, + 67175, + 67229, + 67215, + 67200, + 67194, + 67224, + 67276, + 67477, + 67183, + 67206, + 67226, + 67192, + 67191, + 67186, + 67201, + 67197, + 67239, + 67164, + 67173, + 67180, + 67219, + 67261, + 67183, + 67179, + 67239, + 67228, + 67211, + 67204, + 67246, + 67225, + 67267, + 67204, + 67228, + 67226, + 67260, + 67186, + 67201, + 67214, + 67207, + 67194, + 67199, + 67263, + 67255, + 67198, + 67211, + 67174, + 67253, + 67214, + 67222, + 67263, + 67194, + 67178, + 67212, + 67176, + 67229, + 67215, + 67214, + 67230, + 67211, + 67247, + 67230, + 67214, + 67200, + 67162, + 67208, + 67173, + 67176, + 67251, + 67188, + 67206, + 67230, + 67185, + 67230, + 67250, + 67189, + 67237, + 67172, + 67197, + 67215, + 67222, + 67274, + 67188, + 67173, + 67213, + 67196, + 67220, + 67175, + 67183, + 67180, + 67242, + 67199, + 67205, + 67228, + 67206, + 67213, + 67199, + 67204, + 67184, + 67186, + 67209, + 67243, + 67185, + 67219, + 67231, + 67214, + 67202, + 67194, + 67202, + 67222, + 67178, + 67231, + 67197, + 67226, + 67228, + 67244, + 67213, + 67211, + 67222, + 67193, + 67199, + 67274, + 67246, + 67236, + 67214, + 67271, + 67232, + 67234, + 67237, + 67227, + 67178, + 67209, + 67229, + 67254, + 67216, + 67239, + 67267, + 67226, + 67201, + 67208, + 67226, + 67205, + 67192, + 67212, + 67197, + 67217, + 67202, + 67224, + 67217, + 67191, + 67221, + 67186, + 67254, + 67176, + 67206, + 67243, + 67206, + 67243, + 67227, + 67227, + 67175, + 67214, + 67229, + 67204, + 67185, + 67263, + 67225, + 67158, + 67184, + 67177, + 67181, + 67195, + 67218, + 67174, + 67179, + 67204, + 67229, + 67187, + 67232, + 67171, + 67221, + 67217, + 67198, + 67217, + 67197, + 67188, + 67237, + 67212, + 67250, + 67208, + 67226, + 67214, + 67210, + 67202, + 67232, + 67264, + 67199, + 67210, + 67197, + 67246, + 67184, + 67199, + 67199, + 67202, + 67224, + 67188, + 67216, + 67207, + 67245, + 67172, + 67234, + 67210, + 67224, + 67196, + 67246, + 67178, + 67217, + 67227, + 67272, + 67193, + 67211, + 67221, + 67224, + 67214, + 67210, + 67215, + 67243, + 67205, + 67193, + 67266, + 67194, + 67218, + 67238, + 67173, + 67184, + 67201, + 67214, + 67257, + 67207, + 67179, + 67217, + 67217, + 67211, + 67186, + 67192, + 67247, + 67211, + 67217, + 67221, + 67205, + 67197, + 67221, + 67194, + 67184, + 67232, + 67200, + 67234, + 67212, + 67198, + 67226, + 67217, + 67254, + 67205, + 67183, + 67183, + 67206, + 67267, + 67201, + 67201, + 67199, + 67219, + 67216, + 67260, + 67227, + 67210, + 67299, + 67211, + 67257, + 67218, + 67253, + 67174, + 67207, + 67175, + 67215, + 67213, + 67215, + 67189, + 67182, + 67221, + 67218, + 67225, + 67229, + 67221, + 67199, + 67187, + 67247, + 67279, + 67199, + 67214, + 67210, + 67176, + 67216, + 67213, + 67220, + 67265, + 67237, + 67200, + 67198, + 67196, + 67236, + 67175, + 67225, + 67230, + 67220, + 67227, + 67219, + 67230, + 67191, + 67187, + 67221, + 67209, + 67223, + 67224, + 67204, + 67198, + 67208, + 67247, + 67222, + 67205, + 67201, + 67195, + 67175, + 67213, + 67260, + 67229, + 67195, + 67233, + 67226, + 67223, + 67213, + 67221, + 67204, + 67199, + 67259, + 67242, + 67241, + 67185, + 67209, + 67209, + 67209, + 67225, + 67210, + 67222, + 67217, + 67215, + 67210, + 67167, + 67187, + 67196, + 67201, + 67275, + 67210, + 67195, + 67223, + 67216, + 67220, + 67252, + 67209, + 67224, + 67233, + 67246, + 67242, + 67293, + 67169, + 67216, + 67230, + 67225, + 67258, + 67208, + 67192, + 67225, + 67205, + 67219, + 67239, + 67182, + 67235, + 67199, + 67187, + 67234, + 67175, + 67179, + 67222, + 67224, + 67215, + 67195, + 67225, + 67168, + 67222, + 67236, + 67184, + 67202, + 67187, + 67215, + 67206, + 67190, + 67201, + 67190, + 67253, + 67233, + 67189, + 67275, + 67206, + 67215, + 67196, + 67251, + 67196, + 67195, + 67225, + 67191, + 67203, + 67216, + 67196, + 67209, + 67169, + 67207, + 67210, + 67198, + 67206, + 67215, + 67181, + 67207, + 67221, + 67159, + 67172, + 67174, + 67210, + 67224, + 67187, + 67194, + 67209, + 67215, + 67187, + 67210, + 67211, + 67179, + 67186, + 67217, + 67169, + 67238, + 67201, + 67184, + 67211, + 67200, + 67203, + 67180, + 67165, + 67155, + 67232, + 67187, + 67216, + 67226, + 67178, + 67208, + 67225, + 67219, + 67196, + 67219, + 67255, + 67266, + 67203, + 67217, + 67192, + 67208, + 67249, + 67238, + 67199, + 67219, + 67170, + 67198, + 67221, + 67195, + 67224, + 67206, + 67174, + 67211, + 67184, + 67188, + 67221, + 67209, + 67197, + 67168, + 67182, + 67170, + 67214, + 67190, + 67205, + 67208, + 67188, + 67179, + 67235, + 67198, + 67212, + 67209, + 67222, + 67227, + 67227, + 67235, + 67192, + 67183, + 67204, + 67202, + 67272, + 67192, + 67230, + 67178, + 67200, + 67189, + 67185, + 67210, + 67189, + 67215, + 67200, + 67211, + 67179, + 67216, + 67205, + 67187, + 67207, + 67189, + 67251, + 67214, + 67207, + 67180, + 67181, + 67201, + 67209, + 67222, + 67197, + 67236, + 67202, + 67197, + 67261, + 67219, + 67200, + 67171, + 67181, + 67198, + 67194, + 67178, + 67188, + 67223, + 67176, + 67208, + 67219, + 67224, + 67201, + 67209, + 67193, + 67176, + 67194, + 67182, + 67225, + 67213, + 67199, + 67205, + 67209, + 67197, + 67223, + 67190, + 67175, + 67191, + 67212, + 67208, + 67232, + 67213, + 67193, + 67213, + 67208, + 67234, + 67204, + 67230, + 67210, + 67231, + 67231, + 67273, + 67204, + 67212, + 67247, + 67202, + 67246, + 67250, + 67266, + 67222, + 67204, + 67269, + 67210, + 67196, + 67209, + 67211, + 67172, + 67209, + 67277, + 67209, + 67190, + 67174, + 67198, + 67223, + 67215, + 67222, + 67176, + 67195, + 67182, + 67212, + 67193, + 67210, + 67234, + 67204, + 67231, + 67205, + 67250, + 67198, + 67214, + 67175, + 67205, + 67202, + 67181, + 67190, + 67212, + 67180, + 67191, + 67218, + 67229, + 67178, + 67193, + 67203, + 67219, + 67190, + 67213, + 67208, + 67206, + 67189, + 67163, + 67182, + 67185, + 67191, + 67230, + 67215, + 67198, + 67225, + 67173, + 67166, + 67184, + 67232, + 67164, + 67161, + 67174, + 67214, + 67213, + 67175, + 67190, + 67179, + 67217, + 67193, + 67219, + 67227, + 67222, + 67180, + 67199, + 67209, + 67221, + 67185, + 67198, + 67193, + 67207, + 67200, + 67176, + 67184, + 67221, + 67168, + 67205, + 67277, + 67200, + 67207, + 67206, + 67189, + 67213, + 67232, + 67227, + 67218, + 67210, + 67240, + 67156, + 67227, + 67206, + 67203, + 67202, + 67220, + 67202, + 67228, + 67196, + 67219, + 67196, + 67209, + 67204, + 67215, + 67208, + 67195, + 67175, + 67191, + 67173, + 67273, + 67201, + 67204, + 67219, + 67186, + 67173, + 67204, + 67226, + 67209, + 67186, + 67206, + 67230, + 67174, + 67209, + 67170, + 67248, + 67226, + 67194, + 67244, + 67219, + 67196, + 67206, + 67213, + 67194, + 67221, + 67209, + 67208, + 67216, + 67170, + 67210, + 67213, + 67206, + 67207, + 67212, + 67193, + 67223, + 67210, + 67211, + 67176, + 67228, + 67192, + 67184, + 67206, + 67208, + 67207, + 67176, + 67193, + 67208, + 67223, + 67206, + 67199, + 67184, + 67184, + 67196, + 67203, + 67188, + 67219, + 67197, + 67221, + 67232, + 67239, + 67189, + 67200, + 67191, + 67189, + 67219, + 67200, + 67162, + 67214, + 67223, + 67214, + 67191, + 67223, + 67175, + 67195, + 67195, + 67203, + 67191, + 67223, + 67179, + 67206, + 67206, + 67199, + 67218, + 67200, + 67228, + 67218, + 67194, + 67217, + 67186, + 67206, + 67177, + 67183, + 67192, + 67219, + 67249, + 67208, + 67214, + 67191, + 67171, + 67205, + 67236, + 67229, + 67240, + 67214, + 67195, + 67206, + 67207, + 67233, + 67185, + 67173, + 67159, + 67196, + 67184, + 67193, + 67177, + 67166, + 67181, + 67185, + 67184, + 67185, + 67211, + 67159, + 67211, + 67161, + 67211, + 67189, + 67197, + 67203, + 67215, + 67205, + 67198, + 67186, + 67206, + 67190, + 67178, + 67172, + 67206, + 67178, + 67195, + 67179, + 67190, + 67201, + 67222, + 67209, + 67234, + 67207, + 67164, + 67225, + 67191, + 67184, + 67225, + 67164, + 67187, + 67206, + 67187, + 67171, + 67207, + 67206, + 67196, + 67227, + 67203, + 67178, + 67204, + 67209, + 67184, + 67248, + 67222, + 67226, + 67201, + 67218, + 67190, + 67192, + 67180, + 67184, + 67236, + 67222, + 67200, + 67209, + 67243, + 67222, + 67222, + 67208, + 67211, + 67172, + 67184, + 67221, + 67191, + 67169, + 67221, + 67188, + 67190, + 67206, + 67208, + 67171, + 67209, + 67181, + 67169, + 67202, + 67217, + 67185, + 67199, + 67192, + 67235, + 67201, + 67220, + 67186, + 67196, + 67207, + 67195, + 67218, + 67227, + 67172, + 67195, + 67214, + 67196, + 67210, + 67230, + 67236, + 67223, + 67208, + 67247, + 67213, + 67198, + 67247, + 67187, + 67194, + 67222, + 67194, + 67229, + 67180, + 67180, + 67207, + 67173, + 67182, + 67176, + 67177, + 67239, + 67182, + 67208, + 67233, + 67239, + 67201, + 67188, + 67206, + 67215, + 67213, + 67229, + 67166, + 67193, + 67178, + 67212, + 67203, + 67199, + 67205, + 67223, + 67186, + 67186, + 67203, + 67202, + 67181, + 67200, + 67260, + 67204, + 67229, + 67213, + 67217, + 67210, + 67182, + 67192, + 67206, + 67229, + 67185, + 67202, + 67261, + 67187, + 67190, + 67223, + 67191, + 67197, + 67175, + 67212, + 67197, + 67214, + 67217, + 67196, + 67216, + 67223, + 67212, + 67208, + 67213, + 67214, + 67213, + 67183, + 67203, + 67227, + 67193, + 67198, + 67176, + 67236, + 67204, + 67203, + 67170, + 67214, + 67203, + 67246, + 67177, + 67247, + 67203, + 67204, + 67160, + 67206, + 67200, + 67191, + 67208, + 67190, + 67218, + 67190, + 67199, + 67189, + 67196, + 67194, + 67167, + 67172, + 67232, + 67212, + 67211, + 67195, + 67228, + 67212, + 67204, + 67229, + 67227, + 67221, + 67200, + 67173, + 67210, + 67194, + 67215, + 67236, + 67222, + 67182, + 67194, + 67210, + 67208, + 67158, + 67209, + 67219, + 67196, + 67205, + 67228, + 67201, + 67198, + 67194, + 67184, + 67201, + 67210, + 67235, + 67198, + 67209, + 67207, + 67211, + 67207, + 67188, + 67216, + 67291, + 67254, + 67198, + 67203, + 67189, + 67229, + 67217, + 67224, + 67219, + 67173, + 67202, + 67198, + 67178, + 67176, + 67197, + 67188, + 67197, + 67256, + 67203, + 67171, + 67192, + 67239, + 67216, + 67216, + 67196, + 67211, + 67198, + 67223, + 67220, + 67199, + 67210, + 67222, + 67199, + 67165, + 67182, + 67211, + 67186, + 67217, + 67173, + 67247, + 67191, + 67192, + 67203, + 67225, + 67189, + 67166, + 67189, + 67189, + 67204, + 67231, + 67230, + 67220, + 67204, + 67172, + 67239, + 67209, + 67182, + 67189, + 67201, + 67184, + 67262, + 67238, + 67193, + 67193, + 67156, + 67184, + 67243, + 67208, + 67181, + 67161, + 67217, + 67222, + 67227, + 67226, + 67248, + 67184, + 67207, + 67216, + 67199, + 67205, + 67170, + 67168, + 67174, + 67185, + 67242, + 67194, + 67198, + 67194, + 67203, + 67205, + 67220, + 67204, + 67185, + 67211, + 67197, + 67169, + 67187, + 67206, + 67187, + 67219, + 67218, + 67218, + 67222, + 67213, + 67190, + 67181, + 67211, + 67205, + 67233, + 67178, + 67204, + 67172, + 67207, + 67212, + 67174, + 67177, + 67192, + 67208, + 67198, + 67204, + 67204, + 67181, + 67224, + 67198, + 67191, + 67197, + 67184, + 67193, + 67209, + 67191, + 67216, + 67194, + 67214, + 67242, + 67192, + 67210, + 67211, + 67208, + 67209, + 67210, + 67181, + 67221, + 67165, + 67189, + 67177, + 67226, + 67223, + 67226, + 67198, + 67444, + 67238, + 67207, + 67183, + 67219, + 67204, + 67192, + 67228, + 67208, + 67208, + 67219, + 67193, + 67183, + 67197, + 67208, + 67202, + 67165, + 67177, + 67159, + 67221, + 67194, + 67198, + 67205, + 67171, + 67204, + 67185, + 67243, + 67276, + 67173, + 67202, + 67239, + 67196, + 67193, + 67206, + 67255, + 67155, + 67220, + 67206, + 67178, + 67202, + 67186, + 67198, + 67164, + 67240, + 67214, + 67190, + 67183, + 67166, + 67230, + 67216, + 67237, + 67197, + 67172, + 67215, + 67202, + 67216, + 67204, + 67178, + 67209, + 67173, + 67337, + 67207, + 67206, + 67204, + 67196, + 67223, + 67167, + 67184, + 67238, + 67202, + 67174, + 67209, + 67158, + 67182, + 67202, + 67167, + 67174, + 67229, + 67177, + 67208, + 67207, + 67188, + 67227, + 67218, + 67196, + 67236, + 67189, + 67179, + 67376, + 67199, + 67212, + 67193, + 67212, + 67205, + 67210, + 67181, + 67176, + 67228, + 67198, + 67194, + 67174, + 67203, + 67194, + 67198, + 67202, + 67186, + 67193, + 67205, + 67195, + 67199, + 67181, + 67219, + 67170, + 67213, + 67206, + 67195, + 67215, + 67217, + 67225, + 67195, + 67198, + 67202, + 67192, + 67213, + 67174, + 67216, + 67201, + 67204, + 67200, + 67213, + 67184, + 67167, + 67207, + 67210, + 67209, + 67192, + 67204, + 67210, + 67194, + 67224, + 67215, + 67174, + 67210, + 67175, + 67209, + 67203, + 67212, + 67204, + 67202, + 67209, + 67251, + 67231, + 67197, + 67205, + 67207, + 67186, + 67172, + 67188, + 67201, + 67180, + 67212, + 67256, + 67199, + 67178, + 67216, + 67208, + 67228, + 67206, + 67201, + 67247, + 67245, + 67197, + 67214, + 67181, + 67191, + 67204, + 67189, + 67194, + 67196, + 67244, + 67197, + 67224, + 67206, + 67231, + 67217, + 67216, + 67171, + 67208, + 67233, + 67206, + 67217, + 67210, + 67200, + 67201, + 67224, + 67246, + 67222, + 67211, + 67210, + 67213, + 67220, + 67219, + 67179, + 67225, + 67203, + 67204, + 67213, + 67246, + 67185, + 67179, + 67256, + 67212, + 67182, + 67198, + 67200, + 67209, + 67196, + 67213, + 67187, + 67229, + 67194, + 67214, + 67179, + 67227, + 67190, + 67193, + 67198, + 67189, + 67183, + 67228, + 67172, + 67175, + 67188, + 67208, + 67178, + 67194, + 67232, + 67462, + 67221, + 67196, + 67197, + 67228, + 67196, + 67214, + 67167, + 67185, + 67219, + 67238, + 67217, + 67163, + 67198, + 67200, + 67212, + 67186, + 67202, + 67201, + 67173, + 67211, + 67218, + 67219, + 67220, + 67206, + 67191, + 67179, + 67211, + 67192, + 67230, + 67215, + 67207, + 67190, + 67217, + 67216, + 67196, + 67169, + 67219, + 67221, + 67211, + 67205, + 67236, + 67397, + 67217, + 67211, + 67233, + 67206, + 67210, + 67203, + 67224, + 67193, + 67180, + 67209, + 67188, + 67192, + 67196, + 67179, + 67230, + 67260, + 67170, + 67254, + 67191, + 67192, + 67198, + 67209, + 67221, + 67201, + 67215, + 67239, + 67206, + 67244, + 67232, + 67218, + 67248, + 67185, + 67241, + 67183, + 67215, + 67227, + 67210, + 67229, + 67210, + 67237, + 67218, + 67213, + 67213, + 67205, + 67211, + 67248, + 67221, + 67238, + 67207, + 67171, + 67195, + 67175, + 67191, + 67185, + 67213, + 67205, + 67244, + 67227, + 67238, + 67226, + 67209, + 67205, + 67198, + 67202, + 67200, + 67231, + 67226, + 67195, + 67209, + 67236, + 67279, + 67216, + 67236, + 67229, + 67217, + 67228, + 67206, + 67217, + 67248, + 67183, + 67207, + 67269, + 67211, + 67264, + 67239, + 67172, + 67202, + 67176, + 67181, + 67206, + 67195, + 67227, + 67203, + 67201, + 67212, + 67218, + 67205, + 67264, + 67201, + 67239, + 67187, + 67193, + 67204, + 67199, + 67200, + 67207, + 67191, + 67235, + 67203, + 67242, + 67206, + 67256, + 67225, + 67237, + 67174, + 67184, + 67183, + 67217, + 67196, + 67206, + 67220, + 67207, + 67213, + 67204, + 67228, + 67206, + 67203, + 67180, + 67185, + 67176, + 67219, + 67213, + 67223, + 67220, + 67192, + 67194, + 67224, + 67218, + 67205, + 67186, + 67195, + 67253, + 67280, + 67214, + 67222, + 67194, + 67209, + 67224, + 67207, + 67202, + 67216, + 67175, + 67227, + 67197, + 67198, + 67197, + 67220, + 67176, + 67204, + 67237, + 67219, + 67220, + 67216, + 67236, + 67166, + 67208, + 67224, + 67195, + 67221, + 67208, + 67236, + 67191, + 67215, + 67201, + 67186, + 67206, + 67208, + 67247, + 67201, + 67212, + 67178, + 67217, + 67234, + 67216, + 67206, + 67205, + 67180, + 67184, + 67222, + 67205, + 67232, + 67194, + 67187, + 67185, + 67177, + 67215, + 67245, + 67211, + 67182, + 67204, + 67243, + 67208, + 67235, + 67218, + 67228, + 67266, + 67197, + 67212, + 67231, + 67226, + 67211, + 67221, + 67201, + 67235, + 67206, + 67237, + 67275, + 67227, + 67207, + 67237, + 67233, + 67226, + 67214, + 67192, + 67169, + 67232, + 67206, + 67203, + 67220, + 67213, + 67222, + 67191, + 67279, + 67185, + 67166, + 67216, + 67245, + 67246, + 67248, + 67211, + 67226, + 67215, + 67198, + 67216, + 67176, + 67221, + 67203, + 67172, + 67172, + 67188, + 67234, + 67213, + 67194, + 67189, + 67205, + 67211, + 67187, + 67181, + 67252, + 67220, + 67175, + 67183, + 67182, + 67187, + 67193, + 67196, + 67212, + 67189, + 67204, + 67210, + 67211, + 67207, + 67208, + 67219, + 67214, + 67189, + 67234, + 67215, + 67217, + 67219, + 67248, + 67188, + 67201, + 67217, + 67253, + 67197, + 67215, + 67212, + 67187, + 67240, + 67209, + 67184, + 67189, + 67222, + 67204, + 67183, + 67242, + 67196, + 67226, + 67209, + 67213, + 67170, + 67238, + 67233, + 67197, + 67203, + 67197, + 67217, + 67214, + 67208, + 67234, + 67253, + 67204, + 67254, + 67188, + 67172, + 67214, + 67216, + 67196, + 67199, + 67227, + 67259, + 67261, + 67225, + 67174, + 67202, + 67182, + 67204, + 67184, + 67215, + 67215, + 67184, + 67263, + 67228, + 67171, + 67250, + 67227, + 67175, + 67190, + 67207, + 67194, + 67245, + 67218, + 67221, + 67202, + 67206, + 67236, + 67184, + 67196, + 67261, + 67204, + 67217, + 67198, + 67245, + 67193, + 67221, + 67229, + 67192, + 67207, + 67241, + 67178, + 67195, + 67226, + 67216, + 67236, + 67239, + 67213, + 67200, + 67188, + 67213, + 67232, + 67188, + 67218, + 67217, + 67202, + 67211, + 67229, + 67171, + 67178, + 67190, + 67193, + 67211, + 67221, + 67191, + 67218, + 67215, + 67207, + 67208, + 67171, + 67219, + 67175, + 67166, + 67227, + 67204, + 67213, + 67180, + 67183, + 67173, + 67167, + 67201, + 67230, + 67256, + 67187, + 67197, + 67184, + 67219, + 67224, + 67245, + 67215, + 67186, + 67221, + 67186, + 67238, + 67205, + 67263, + 67184, + 67273, + 67188, + 67206, + 67219, + 67245, + 67265, + 67219, + 67280, + 67223, + 67194, + 67206, + 67171, + 67226, + 67180, + 67209, + 67201, + 67184, + 67214, + 67245, + 67190, + 67196, + 67268, + 67194, + 67259, + 67176, + 67183, + 67203, + 67266, + 67206, + 67224, + 67167, + 67244, + 67312, + 67235, + 67224, + 67204, + 67178, + 67201, + 67194, + 67204, + 67192, + 67246, + 67252, + 67203, + 67242, + 67233, + 67231, + 67224, + 67223, + 67279, + 67249, + 67214, + 67191, + 67208, + 67238, + 67221, + 67183, + 67235, + 67281, + 67192, + 67211, + 67202, + 67207, + 67190, + 67263, + 67213, + 67255, + 67230, + 67198, + 67223, + 67232, + 67216, + 67215, + 67199, + 67207, + 67196, + 67185, + 67267, + 67219, + 67204, + 67210, + 67250, + 67196, + 67189, + 67209, + 67192, + 67228, + 67189, + 67207, + 67176, + 67215, + 67206, + 67211, + 67217, + 67216, + 67243, + 67272, + 67227, + 67203, + 67231, + 67207, + 67211, + 67230, + 67178, + 67219, + 67209, + 67233, + 67246, + 67209, + 67175, + 67196, + 67227, + 67248, + 67225, + 67174, + 67228, + 67209, + 67231, + 67213, + 67213, + 67189, + 67195, + 67278, + 67182, + 67262, + 67240, + 67225, + 67177, + 67224, + 67183, + 67225, + 67193, + 67186, + 67259, + 67244, + 67198, + 67190, + 67276, + 67223, + 67225, + 67217, + 67218, + 67254, + 67206, + 67217, + 67200, + 67226, + 67213, + 67157, + 67198, + 67202, + 67257, + 67214, + 67214, + 67186, + 67221, + 67189, + 67242, + 67238, + 67221, + 67217, + 67229, + 67212, + 67232, + 67180, + 67176, + 67210, + 67193, + 67198, + 67241, + 67218, + 67268, + 67239, + 67235, + 67206, + 67226, + 67194, + 67219, + 67243, + 67214, + 67222, + 67211, + 67209, + 67250, + 67224, + 67227, + 67227, + 67213, + 67233, + 67244, + 67237, + 67221, + 67218, + 67186, + 67194, + 67305, + 67181, + 67223, + 67178, + 67238, + 67231, + 67215, + 67197, + 67214, + 67241, + 67201, + 67250, + 67283, + 67202, + 67237, + 67205, + 67211, + 67191, + 67180, + 67203, + 67186, + 67223, + 67217, + 67198, + 67240, + 67206, + 67255, + 67207, + 67212, + 67183, + 67171, + 67240, + 67186, + 67197, + 67239, + 67233, + 67196, + 67212, + 67203, + 67203, + 67217, + 67209, + 67224, + 67228, + 67195, + 67177, + 67254, + 67206, + 67222, + 67205, + 67199, + 67177, + 67195, + 67181, + 67213, + 67201, + 67232, + 67225, + 67209, + 67212, + 67201, + 67187, + 67205, + 67173, + 67208, + 67300, + 67246, + 67189, + 67187, + 67179, + 67237, + 67212, + 67231, + 67169, + 67197, + 67233, + 67186, + 67209, + 67263, + 67176, + 67192, + 67167, + 67274, + 67207, + 67248, + 67204, + 67195, + 67283, + 67221, + 67254, + 67236, + 67211, + 67180, + 67193, + 67228, + 67232, + 67242, + 67202, + 67187, + 67213, + 67186, + 67212, + 67210, + 67216, + 67209, + 67223, + 67197, + 67212, + 67214, + 67188, + 67229, + 67248, + 67259, + 67204, + 67280, + 67212, + 67228, + 67198, + 67202, + 67203, + 67222, + 67201, + 67209, + 67190, + 67213, + 67214, + 67183, + 67218, + 67258, + 67240, + 67194, + 67223, + 67205, + 67201, + 67204, + 67185, + 67194, + 67197, + 67214, + 67195, + 67226, + 67200, + 67215, + 67209, + 67193, + 67196, + 67229, + 67201, + 67244, + 67182, + 67251, + 67245, + 67200, + 67207, + 67214, + 67197, + 67302, + 67205, + 67208, + 67222, + 67266, + 67188, + 67219, + 67199, + 67242, + 67232, + 67276, + 67234, + 67219, + 67202, + 67209, + 67210, + 67210, + 67217, + 67180, + 67280, + 67188, + 67169, + 67220, + 67237, + 67220, + 67224, + 67219, + 67226, + 67200, + 67231, + 67235, + 67241, + 67211, + 67215, + 67199, + 67224, + 67218, + 67251, + 67201, + 67220, + 67228, + 67247, + 67253, + 67231, + 67219, + 67247, + 67229, + 67202, + 67236, + 67229, + 67173, + 67231, + 67248, + 67234, + 67191, + 67196, + 67223, + 67192, + 67241, + 67201, + 67191, + 67252, + 67215, + 67186, + 67198, + 67210, + 67221, + 67184, + 67186, + 67220, + 67236, + 67188, + 67192, + 67224, + 67229, + 67180, + 67208, + 67242, + 67232, + 67236, + 67213, + 67171, + 67238, + 67223, + 67221, + 67227, + 67210, + 67233, + 67232, + 67258, + 67215, + 67196, + 67214, + 67247, + 67235, + 67230, + 67265, + 67220, + 67218, + 67200, + 67241, + 67208, + 67199, + 67232, + 67175, + 67245, + 67185, + 67194, + 67219, + 67217, + 67172, + 67210, + 67212, + 67218, + 67188, + 67200, + 67205, + 67168, + 67243, + 67216, + 67199, + 67216, + 67211, + 67212, + 67189, + 67212, + 67224, + 67211, + 67234, + 67221, + 67248, + 67202, + 67229, + 67210, + 67197, + 67207, + 67185, + 67219, + 67241, + 67215, + 67288, + 67218, + 67188, + 67213, + 67220, + 67215, + 67207, + 67202, + 67232, + 67225, + 67252, + 67239, + 67184, + 67216, + 67215, + 67211, + 67221, + 67190, + 67221, + 67199, + 67228, + 67212, + 67233, + 67187, + 67206, + 67210, + 67220, + 67195, + 67209, + 67216, + 67186, + 67201, + 67223, + 67219, + 67225, + 67222, + 67203, + 67215, + 67269, + 67208, + 67268, + 67205, + 67171, + 67208, + 67281, + 67189, + 67238, + 67242, + 67204, + 67207, + 67214, + 67208, + 67220, + 67201, + 67193, + 67204, + 67233, + 67234, + 67195, + 67196, + 67212, + 67201, + 67185, + 67214, + 67236, + 67189, + 67211, + 67215, + 67198, + 67190, + 67217, + 67204, + 67259, + 67185, + 67212, + 67191, + 67230, + 67218, + 67247, + 67239, + 67223, + 67228, + 67211, + 67191, + 67204, + 67209, + 67200, + 67190, + 67222, + 67239, + 67231, + 67191, + 67224, + 67205, + 67231, + 67211, + 67208, + 67189, + 67218, + 67215, + 67198, + 67186, + 67234, + 67219, + 67235, + 67207, + 67217, + 67259, + 67219, + 67252, + 67178, + 67236, + 67239, + 67203, + 67192, + 67245, + 67225, + 67242, + 67218, + 67202, + 67281, + 67186, + 67222, + 67221, + 67224, + 67219, + 67206, + 67180, + 67186, + 67196, + 67222, + 67195, + 67232, + 67226, + 67205, + 67215, + 67230, + 67232, + 67216, + 67209, + 67199, + 67190, + 67203, + 67205, + 67261, + 67218, + 67257, + 67228, + 67197, + 67230, + 67206, + 67235, + 67187, + 67209, + 67222, + 67181, + 67234, + 67197, + 67223, + 67200, + 67204, + 67203, + 67216, + 67172, + 67187, + 67211, + 67211, + 67183, + 67200, + 67217, + 67180, + 67199, + 67201, + 67209, + 67204, + 67227, + 67241, + 67203, + 67214, + 67187, + 67196, + 67233, + 67200, + 67190, + 67189, + 67200, + 67216, + 67204, + 67228, + 67196, + 67210, + 67242, + 67184, + 67209, + 67208, + 67221, + 67247, + 67228, + 67222, + 67182, + 67200, + 67186, + 67198, + 67200, + 67189, + 67216, + 67170, + 67224, + 67211, + 67244, + 67191, + 67171, + 67184, + 67228, + 67195, + 67200, + 67214, + 67182, + 67187, + 67216, + 67233, + 67216, + 67227, + 67258, + 67211, + 67242, + 67174, + 67179, + 67198, + 67219, + 67240, + 67220, + 67279, + 67239, + 67190, + 67177, + 67231, + 67219, + 67219, + 67211, + 67234, + 67168, + 67198, + 67225, + 67230, + 67221, + 67192, + 67209, + 67207, + 67185, + 67239, + 67212, + 67174, + 67205, + 67191, + 67217, + 67241, + 67196, + 67255, + 67223, + 67206, + 67204, + 67203, + 67174, + 67198, + 67194, + 67192, + 67213, + 67256, + 67218, + 67196, + 67225, + 67200, + 67243, + 67198, + 67253, + 67229, + 67182, + 67220, + 67219, + 67214, + 67203, + 67217, + 67205, + 67227, + 67202, + 67189, + 67181, + 67247, + 67211, + 67220, + 67232, + 67248, + 67177, + 67223, + 67184, + 67190, + 67212, + 67179, + 67187, + 67203, + 67205, + 67212, + 67219, + 67195, + 67174, + 67193, + 67195, + 67225, + 67208, + 67217, + 67237, + 67231, + 67227, + 67264, + 67211, + 67192, + 67209, + 67229, + 67202, + 67200, + 67203, + 67191, + 67197, + 67172, + 67209, + 67194, + 67218, + 67184, + 67174, + 67218, + 67210, + 67211, + 67209, + 67222, + 67202, + 67207, + 67251, + 67226, + 67182, + 67212, + 67276, + 67188, + 67204, + 67178, + 67179, + 67251, + 67202, + 67226, + 67209, + 67225, + 67223, + 67215, + 67184, + 67187, + 67181, + 67207, + 67185, + 67235, + 67223, + 67194, + 67237, + 67205, + 67192, + 67211, + 67213, + 67198, + 67213, + 67256, + 67193, + 67195, + 67184, + 67192, + 67204, + 67211, + 67198, + 67204, + 67238, + 67230, + 67222, + 67285, + 67198, + 67194, + 67194, + 67199, + 67218, + 67200, + 67209, + 67200, + 67199, + 67197, + 67204, + 67215, + 67215, + 67195, + 67245, + 67203, + 67220, + 67262, + 67216, + 67210, + 67189, + 67192, + 67194, + 67197, + 67227, + 67225, + 67200, + 67185, + 67256, + 67221, + 67195, + 67206, + 67189, + 67194, + 67192, + 67195, + 67194, + 67226, + 67198, + 67178, + 67217, + 67203, + 67218, + 67207, + 67190, + 67225, + 67187, + 67250, + 67214, + 67236, + 67219, + 67190, + 67230, + 67254, + 67230, + 67187, + 67219, + 67220, + 67227, + 67188, + 67204, + 67207, + 67196, + 67309, + 67180, + 67190, + 67192, + 67250, + 67195, + 67227, + 67209, + 67187, + 67232, + 67207, + 67204, + 67203, + 67207, + 67205, + 67229, + 67189, + 67224, + 67207, + 67198, + 67207, + 67194, + 67217, + 67177, + 67213, + 67172, + 67203, + 67217, + 67239, + 67205, + 67197, + 67202, + 67218, + 67231, + 67214, + 67186, + 67194, + 67228, + 67211, + 67207, + 67218, + 67209, + 67219, + 67178, + 67202, + 67188, + 67281, + 67191, + 67211, + 67212, + 67212, + 67213, + 67239, + 67215, + 67209, + 67201, + 67220, + 67222, + 67220, + 67191, + 67257, + 67190, + 67223, + 67213, + 67202, + 67218, + 67182, + 67217, + 67217, + 67203, + 67196, + 67191, + 67244, + 67183, + 67194, + 67224, + 67189, + 67175, + 67182, + 67169, + 67212, + 67219, + 67205, + 67210, + 67210, + 67190, + 67201, + 67220, + 67209, + 67209, + 67175, + 67194, + 67206, + 67219, + 67215, + 67207, + 67214, + 67194, + 67196, + 67201, + 67260, + 67187, + 67205, + 67177, + 67218, + 67195, + 67208, + 67226, + 67176, + 67186, + 67182, + 67218, + 67211, + 67206, + 67175, + 67198, + 67204, + 67217, + 67194, + 67190, + 67226, + 67210, + 67184, + 67193, + 67203, + 67172, + 67190, + 67192, + 67220, + 67237, + 67281, + 67224, + 67197, + 67221, + 67205, + 67214, + 67190, + 67213, + 67205, + 67212, + 67211, + 67194, + 67248, + 67183, + 67202, + 67227, + 67230, + 67221, + 67329, + 67181, + 67170, + 67180, + 67186, + 67224, + 67242, + 67220, + 67211, + 67208, + 67181, + 67182, + 67212, + 67237, + 67184, + 67171, + 67172, + 67188, + 67183, + 67190, + 67247, + 67175, + 67217, + 67227, + 67197, + 67174, + 67221, + 67186, + 67208, + 67226, + 67238, + 67202, + 67213, + 67207, + 67208, + 67204, + 67210, + 67196, + 67215, + 67205, + 67253, + 67189, + 67239, + 67208, + 67207, + 67182, + 67205, + 67229, + 67240, + 67259, + 67189, + 67164, + 67196, + 67233, + 67173, + 67213, + 67202, + 67228, + 67210, + 67212, + 67223, + 67227, + 67204, + 67264, + 67221, + 67252, + 67229, + 67229, + 67166, + 67184, + 67211, + 67223, + 67203, + 67229, + 67206, + 67214, + 67239, + 67202, + 67175, + 67170, + 67191, + 67220, + 67200, + 67220, + 67219, + 67191, + 67254, + 67205, + 67211, + 67226, + 67188, + 67199, + 67180, + 67950, + 67207, + 67238, + 67204, + 67188, + 67176, + 67230, + 67224, + 67212, + 67208, + 67217, + 67185, + 67199, + 67271, + 67213, + 67185, + 67230, + 67199, + 67197, + 67258, + 67223, + 67202, + 67216, + 67192, + 67205, + 67176, + 67180, + 67227, + 67253, + 67331, + 67205, + 67179, + 67218, + 67194, + 67211, + 67230, + 67181, + 67234, + 67210, + 67190, + 67258, + 67189, + 67236, + 67296, + 67212, + 67210, + 67184, + 67212, + 67186, + 67198, + 67210, + 67235, + 67196, + 67194, + 67248, + 67220, + 67228, + 67216, + 67236, + 67176, + 67182, + 67222, + 67205, + 67214, + 67223, + 67198, + 67191, + 67216, + 67195, + 67185, + 67223, + 67202, + 67195, + 67225, + 67163, + 67218, + 67212, + 67225, + 67221, + 67265, + 67185, + 67264, + 67186, + 67221, + 67206, + 67231, + 67222, + 67223, + 67189, + 67221, + 67171, + 67220, + 67201, + 67230, + 67259, + 67188, + 67213, + 67219, + 67235, + 67212, + 67212, + 67164, + 67212, + 67210, + 67214, + 67234, + 67219, + 67206, + 67205, + 67247, + 67235, + 67186, + 67171, + 67216, + 67198, + 67224, + 67221, + 67248, + 67213, + 67254, + 67185, + 67193, + 67233, + 67203, + 67244, + 67242, + 67216, + 67259, + 67207, + 67242, + 67229, + 67220, + 67195, + 67228, + 67208, + 67209, + 67238, + 67211, + 67205, + 67223, + 67202, + 67214, + 67228, + 67223, + 67181, + 67196, + 67240, + 67184, + 67212, + 67198, + 67236, + 67269, + 67196, + 67203, + 67215, + 67226, + 67186, + 67221, + 67242, + 67183, + 67192, + 67211, + 67179, + 67245, + 67220, + 67236, + 67196, + 67203, + 67210, + 67215, + 67206, + 67198, + 67211, + 67199, + 67193, + 67277, + 67209, + 67212, + 67217, + 67190, + 67185, + 67180, + 67256, + 67226, + 67176, + 67170, + 67187, + 67272, + 67282, + 67226, + 67199, + 67216, + 67238, + 67208, + 67212, + 67218, + 67223, + 67215, + 67195, + 67214, + 67208, + 67180, + 67222, + 67216, + 67191, + 67197, + 67221, + 67212, + 67171, + 67219, + 67225, + 67208, + 67193, + 67197, + 67192, + 67189, + 67224, + 67217, + 67217, + 67197, + 67207, + 67177, + 67184, + 67181, + 67205, + 67186, + 67236, + 67180, + 67230, + 67207, + 67267, + 67208, + 67211, + 67182, + 67178, + 67217, + 67230, + 67284, + 67254, + 67234, + 67227, + 67209, + 67253, + 67200, + 67239, + 67216, + 67259, + 67187, + 67209, + 67198, + 67214, + 67177, + 67185, + 67182, + 67218, + 67227, + 67227, + 67191, + 67253, + 67229, + 67207, + 67217, + 67225, + 67183, + 67195, + 67213, + 67206, + 67216, + 67213, + 67186, + 67188, + 67216, + 67234, + 67224, + 67204, + 67203, + 67196, + 67189, + 67217, + 67198, + 67188, + 67231, + 67190, + 67221, + 67184, + 67181, + 67216, + 67185, + 67221, + 67232, + 67228, + 67219, + 67196, + 67186, + 67180, + 67190, + 67173, + 67194, + 67221, + 67178, + 67238, + 67200, + 67203, + 67211, + 67174, + 67173, + 67189, + 67192, + 67195, + 67230, + 67220, + 67167, + 67213, + 67195, + 67199, + 67198, + 67209, + 67192, + 67240, + 67183, + 67208, + 67242, + 67172, + 67165, + 67241, + 67227, + 67213, + 67245, + 67226, + 67223, + 67256, + 67180, + 67229, + 67197, + 67238, + 67224, + 67196, + 67209, + 67203, + 67205, + 67216, + 67202, + 67218, + 67222, + 67224, + 67247, + 67221, + 67191, + 67207, + 67307, + 67183, + 67209, + 67202, + 67230, + 67203, + 67210, + 67200, + 67254, + 67206, + 67206, + 67208, + 67199, + 67229, + 67180, + 67203, + 67202, + 67167, + 67219, + 67195, + 67210, + 67275, + 67200, + 67219, + 67203, + 67193, + 67240, + 67211, + 67226, + 67221, + 67224, + 67189, + 67259, + 67237, + 67213, + 67186, + 67214, + 67239, + 67175, + 67210, + 67193, + 67242, + 67181, + 67231, + 67188, + 67213, + 67210, + 67224, + 67203, + 67250, + 67220, + 67245, + 67229, + 67189, + 67184, + 67230, + 67203, + 67224, + 67181, + 67279, + 67211, + 67204, + 67169, + 67220, + 67214, + 67206, + 67224, + 67250, + 67186, + 67190, + 67213, + 67243, + 67216, + 67224, + 67232, + 67220, + 67213, + 67255, + 67224, + 67214, + 67240, + 67213, + 67191, + 67260, + 67207, + 67222, + 67212, + 67208, + 67193, + 67179, + 67203, + 67229, + 67212, + 67215, + 67212, + 67197, + 67215, + 67276, + 67223, + 67209, + 67198, + 67229, + 67221, + 67249, + 67222, + 67269, + 67233, + 67214, + 67213, + 67232, + 67223, + 67190, + 67192, + 67182, + 67172, + 67197, + 67218, + 67201, + 67225, + 67171, + 67221, + 67214, + 67212, + 67190, + 67193, + 67193, + 67210, + 67330, + 67204, + 67206, + 67198, + 67214, + 67198, + 67194, + 67211, + 67178, + 67244, + 67218, + 67215, + 67198, + 67232, + 67213, + 67226, + 67218, + 67196, + 67201, + 67157, + 67256, + 67225, + 67169, + 67168, + 67241, + 67206, + 67234, + 67185, + 67220, + 67228, + 67197, + 67216, + 67213, + 67249, + 67170, + 67221, + 67182, + 67224, + 67183, + 67288, + 67204, + 67196, + 67169, + 67215, + 67211, + 67184, + 67222, + 67173, + 67216, + 67195, + 67210, + 67181, + 67169, + 67207, + 67186, + 67205, + 67206, + 67175, + 67227, + 67204, + 67207, + 67201, + 67177, + 67173, + 67223, + 67242, + 67209, + 67228, + 67265, + 67196, + 67219, + 67220, + 67253, + 67205, + 67205, + 67220, + 67200, + 67234, + 67206, + 67218, + 67214, + 67229, + 67250, + 67231, + 67239, + 67240, + 67212, + 67232, + 67194, + 67234, + 67227, + 67210, + 67190, + 67232, + 67198, + 67208, + 67217, + 67202, + 67234, + 67211, + 67203, + 67258, + 67210, + 67255, + 67192, + 67208, + 67210, + 67249, + 67185, + 67229, + 67157, + 67214, + 67281, + 67208, + 67223, + 67201, + 67179, + 67194, + 67185, + 67242, + 67201, + 67219, + 67221, + 67214, + 67258, + 67203, + 67194, + 67233, + 67236, + 67174, + 67196, + 67179, + 67230, + 67210, + 67202, + 67206, + 67226, + 67228, + 67221, + 67213, + 67242, + 67171, + 67217, + 67170, + 67206, + 67198, + 67225, + 67247, + 67261, + 67231, + 67192, + 67206, + 67178, + 67193, + 67163, + 67211, + 67207, + 67271, + 67203, + 67208, + 67194, + 67220, + 67207, + 67223, + 67200, + 67208, + 67209, + 67197, + 67195, + 67231, + 67198, + 67214, + 67220, + 67216, + 67206, + 67213, + 67231, + 67211, + 67225, + 67198, + 67195, + 67239, + 67242, + 67184, + 67177, + 67236, + 67196, + 67221, + 67207, + 67187, + 67207, + 67177, + 67216, + 67246, + 67205, + 67232, + 67229, + 67193, + 67206, + 67172, + 67202, + 67173, + 67198, + 67248, + 67192, + 67202, + 67186, + 67273, + 67184, + 67260, + 67227, + 67163, + 67189, + 67231, + 67210, + 67206, + 67173, + 67207, + 67237, + 67177, + 67200, + 67215, + 67209, + 67221, + 67205, + 67179, + 67180, + 67200, + 67222, + 67177, + 67211, + 67167, + 67197, + 67223, + 67189, + 67209, + 67191, + 67222, + 67230, + 67207, + 67216, + 67178, + 67218, + 67185, + 67205, + 67213, + 67184, + 67211, + 67173, + 67228, + 67191, + 67212, + 67227, + 67182, + 67200, + 67290, + 67194, + 67222, + 67234, + 67192, + 67194, + 67203, + 67206, + 67169, + 67219, + 67187, + 67201, + 67194, + 67173, + 67212, + 67204, + 67210, + 67211, + 67193, + 67206, + 67185, + 67175, + 67226, + 67216, + 67199, + 67223, + 67261, + 67201, + 67260, + 67200, + 67225, + 67207, + 67209, + 67207, + 67179, + 67197, + 67191, + 67222, + 67256, + 67199, + 67236, + 67192, + 67198, + 67189, + 67166, + 67233, + 67230, + 67214, + 67200, + 67212, + 67212, + 67176, + 67180, + 67197, + 67190, + 67232, + 67181, + 67216, + 67185, + 67212, + 67213, + 67178, + 67222, + 67227, + 67180, + 67224, + 67165, + 67247, + 67252, + 67207, + 67265, + 67217, + 67209, + 67190, + 67229, + 67214, + 67182, + 67200, + 67175, + 67159, + 67172, + 67216, + 67206, + 67197, + 67227, + 67174, + 67211, + 67220, + 67218, + 67207, + 67206, + 67205, + 67216, + 67210, + 67223, + 67246, + 67218, + 67213, + 67168, + 67223, + 67231, + 67219, + 67222, + 67217, + 67192, + 67221, + 67224, + 67213, + 67214, + 67201, + 67192, + 67208, + 67205, + 67186, + 67205, + 67225, + 67233, + 67181, + 67203, + 67224, + 67300, + 67201, + 67224, + 67185, + 67261, + 67217, + 67202, + 67221, + 67178, + 67203, + 67178, + 67261, + 67183, + 67207, + 67210, + 67231, + 67176, + 67209, + 67208, + 67181, + 67213, + 67219, + 67250, + 67200, + 67275, + 67186, + 67249, + 67199, + 67239, + 67238, + 67235, + 67208, + 67295, + 67254, + 67200, + 67209, + 67198, + 67212, + 67210, + 67258, + 67210, + 67249, + 67184, + 67242, + 67174, + 67192, + 67194, + 67204, + 67215, + 67245, + 67222, + 67216, + 67211, + 67204, + 67219, + 67181, + 67192, + 67211, + 67186, + 67258, + 67210, + 67241, + 67203, + 67224, + 67202, + 67199, + 67198, + 67180, + 67252, + 67240, + 67208, + 67201, + 67227, + 67222, + 67186, + 67188, + 67208, + 67193, + 67221, + 67192, + 67208, + 67238, + 67239, + 67206, + 67203, + 67209, + 67190, + 67233, + 67203, + 67244, + 67236, + 67227, + 67222, + 67195, + 67180, + 67243, + 67194, + 67215, + 67207, + 67255, + 67196, + 67553, + 67207, + 67190, + 67208, + 67227, + 67205, + 67172, + 67184, + 67244, + 67214, + 67193, + 67221, + 67177, + 67273, + 67183, + 67224, + 67211, + 67184, + 67214, + 67215, + 67215, + 67245, + 67204, + 67193, + 67188, + 67219, + 67185, + 67211, + 67207, + 67246, + 67219, + 67222, + 67224, + 67224, + 67199, + 67189, + 67212, + 67239, + 67185, + 67181, + 67228, + 67203, + 67274, + 67260, + 67209, + 67211, + 67236, + 67213, + 67204, + 67231, + 67247, + 67240, + 67206, + 67235, + 67219, + 67206, + 67186, + 67236, + 67195, + 67271, + 67208, + 67185, + 67195, + 67199, + 67212, + 67236, + 67217, + 67198, + 67290, + 67187, + 67214, + 67247, + 67241, + 67209, + 67182, + 67194, + 67212, + 67209, + 67197, + 67228, + 67183, + 67235, + 67213, + 67215, + 67173, + 67195, + 67175, + 67228, + 67185, + 67198, + 67224, + 67242, + 67218, + 67185, + 67215, + 67229, + 67218, + 67185, + 67172, + 67228, + 67203, + 67209, + 67202, + 67199, + 67187, + 67216, + 67172, + 67216, + 67213, + 67233, + 67190, + 67227, + 67208, + 67197, + 67275, + 67188, + 67213, + 67207, + 67202, + 67204, + 67203, + 67173, + 67219, + 67205, + 67234, + 67246, + 67224, + 67206, + 67212, + 67204, + 67203, + 67253, + 67174, + 67208, + 67223, + 67195, + 67218, + 67202, + 67215, + 67217, + 67210, + 67242, + 67186, + 67196, + 67210, + 67212, + 67203, + 67182, + 67193, + 67187, + 67250, + 67204, + 67179, + 67188, + 67260, + 67187, + 67208, + 67214, + 67187, + 67197, + 67200, + 67241, + 67204, + 67232, + 67230, + 67190, + 67205, + 67192, + 67217, + 67212, + 67174, + 67205, + 67209, + 67188, + 67181, + 67195, + 67317, + 67182, + 67243, + 67206, + 67204, + 67203, + 67230, + 67185, + 67190, + 67196, + 67201, + 67214, + 67185, + 67239, + 67227, + 67202, + 67216, + 67247, + 67209, + 67220, + 67256, + 67225, + 67186, + 67222, + 67198, + 67230, + 67240, + 67202, + 67182, + 67210, + 67203, + 67184, + 67254, + 67187, + 67206, + 67208, + 67240, + 67220, + 67234, + 67239, + 67245, + 67228, + 67211, + 67210, + 67265, + 67200, + 67210, + 67214, + 67211, + 67226, + 67254, + 67286, + 67204, + 67203, + 67230, + 67208, + 67225, + 67202, + 67219, + 67175, + 67230, + 67529, + 67206, + 67228, + 67237, + 67189, + 67232, + 67259, + 67202, + 67188, + 67179, + 67208, + 67220, + 67194, + 67199, + 67186, + 67230, + 67182, + 67181, + 67208, + 67213, + 67218, + 67202, + 67205, + 67264, + 67215, + 67217, + 67211, + 67228, + 67203, + 67241, + 67227, + 67225, + 67201, + 67235, + 67260, + 67244, + 67186, + 67209, + 67211, + 67237, + 67194, + 67211, + 67178, + 67216, + 67234, + 67193, + 67219, + 67169, + 67215, + 67210, + 67194, + 67192, + 67220, + 67287, + 67211, + 67191, + 67188, + 67182, + 67180, + 67200, + 67225, + 67182, + 67173, + 67231, + 67178, + 67193, + 67204, + 67233, + 67306, + 67181, + 67232, + 67208, + 67200, + 67226, + 67234, + 67207, + 67214, + 67209, + 67187, + 67185, + 67239, + 67213, + 67165, + 67208, + 67234, + 67219, + 67219, + 67199, + 67178, + 67215, + 67315, + 67218, + 67232, + 67212, + 67202, + 67202, + 67198, + 67226, + 67202, + 67205, + 67199, + 67201, + 67174, + 67278, + 67221, + 67224, + 67211, + 67226, + 67251, + 67246, + 67196, + 67224, + 67193, + 67200, + 67183, + 67229, + 67181, + 67181, + 67183, + 67262, + 67216, + 67237, + 67204, + 67201, + 67233, + 67228, + 67173, + 67195, + 67214, + 67220, + 67200, + 67232, + 67205, + 67208, + 67243, + 67201, + 67206, + 67246, + 67229, + 67238, + 67214, + 67206, + 67210, + 67230, + 67208, + 67191, + 67199, + 67220, + 67227, + 67236, + 67179, + 67256, + 67247, + 67194, + 67224, + 67240, + 67210, + 67220, + 67201, + 67222, + 67199, + 67251, + 67219, + 67213, + 67166, + 67180, + 67222, + 67185, + 67214, + 67210, + 67192, + 67220, + 67200, + 67234, + 67217, + 67216, + 67190, + 67202, + 67208, + 67201, + 67218, + 67205, + 67201, + 67208, + 67184, + 67194, + 67211, + 67223, + 67213, + 67170, + 67240, + 67168, + 67207, + 67198, + 67199, + 67208, + 67219, + 67182, + 67246, + 67215, + 67200, + 67192, + 67266, + 67178, + 67204, + 67222, + 67253, + 67246, + 67210, + 67225, + 67194, + 67211, + 67196, + 67208, + 67223, + 67191, + 67177, + 67191, + 67244, + 67201, + 67187, + 67215, + 67189, + 67198, + 67264, + 67174, + 67283, + 67204, + 67192, + 67213, + 67227, + 67209, + 67245, + 67199, + 67221, + 67225, + 67226, + 67206, + 67206, + 67185, + 67177, + 67233, + 67244, + 67208, + 67218, + 67178, + 67252, + 67228, + 67204, + 67225, + 67224, + 67228, + 67217, + 67213, + 67210, + 67220, + 67196, + 67166, + 67232, + 67193, + 67201, + 67204, + 67241, + 67179, + 67224, + 67223, + 67217, + 67223, + 67201, + 67174, + 67186, + 67233, + 67212, + 67172, + 67211, + 67217, + 67202, + 67232, + 67210, + 67200, + 67207, + 67173, + 67220, + 67229, + 67191, + 67193, + 67184, + 67204, + 67217, + 67232, + 67180, + 67209, + 67256, + 67263, + 67230, + 67242, + 67211, + 67187, + 67229, + 67217, + 67178, + 67203, + 67176, + 67234, + 67221, + 67247, + 67245, + 67207, + 67215, + 67210, + 67230, + 67182, + 67216, + 67234, + 67229, + 67169, + 67231, + 67199, + 67243, + 67242, + 67195, + 67232, + 67280, + 67173, + 67219, + 67197, + 67243, + 67177, + 67203, + 67230, + 67194, + 67206, + 67212, + 67188, + 67211, + 67184, + 67230, + 67196, + 67230, + 67172, + 67188, + 67222, + 67225, + 67220, + 67228, + 67209, + 67259, + 67210, + 67216, + 67222, + 67214, + 67196, + 67193, + 67208, + 67182, + 67241, + 67221, + 67216, + 67260, + 67205, + 67232, + 67214, + 67203, + 67215, + 67207, + 67227, + 67228, + 67198, + 67248, + 67209, + 67218, + 67216, + 67282, + 67230, + 67252, + 67216, + 67210, + 67176, + 67235, + 67188, + 67201, + 67201, + 67222, + 67210, + 67206, + 67204, + 67234, + 67199, + 67207, + 67226, + 67179, + 67191, + 67223, + 67225, + 67204, + 67196, + 67219, + 67212, + 67203, + 67208, + 67205, + 67218, + 67282, + 67241, + 67211, + 67186, + 67222, + 67204, + 67234, + 67218, + 67257, + 67240, + 67190, + 67208, + 67237, + 67203, + 67212, + 67187, + 67173, + 67197, + 67188, + 67213, + 67206, + 67236, + 67209, + 67180, + 67217, + 67210, + 67213, + 67188, + 67205, + 67180, + 67226, + 67230, + 67198, + 67170, + 67235, + 67230, + 67201, + 67247, + 67197, + 67200, + 67205, + 67200, + 67218, + 67245, + 67213, + 67212, + 67197, + 67224, + 67225, + 67220, + 67216, + 67224, + 67220, + 67231, + 67226, + 67205, + 67188, + 67188, + 67231, + 67229, + 67188, + 67181, + 67205, + 67209, + 67220, + 67230, + 67208, + 67211, + 67235, + 67182, + 67209, + 67260, + 67205, + 67198, + 67231, + 67184, + 67188, + 67242, + 67222, + 67178, + 67241, + 67221, + 67189, + 67278, + 67188, + 67240, + 67234, + 67260, + 67217, + 67214, + 67296, + 67209, + 67209, + 67189, + 67204, + 67219, + 67239, + 67191, + 67238, + 67223, + 67251, + 67217, + 67191, + 67219, + 67200, + 67214, + 67203, + 67227, + 67223, + 67245, + 67214, + 67222, + 67196, + 67168, + 67243, + 67204, + 67197, + 67165, + 67225, + 67166, + 67262, + 67227, + 67209, + 67166, + 67225, + 67209, + 67226, + 67197, + 67209, + 67174, + 67254, + 67192, + 67201, + 67202, + 67184, + 67217, + 67205, + 67189, + 67253, + 67207, + 67206, + 67197, + 67247, + 67232, + 67190, + 67238, + 67208, + 67171, + 67181, + 67182, + 67263, + 67243, + 67205, + 67242, + 67173, + 67257, + 67202, + 67181, + 67214, + 67166, + 67262, + 67195, + 67245, + 67209, + 67272, + 67188, + 67218, + 67186, + 67208, + 67212, + 67180, + 67207, + 67218, + 67184, + 67212, + 67168, + 67209, + 67185, + 67176, + 67196, + 67231, + 67195, + 67232, + 67221, + 67183, + 67168, + 67200, + 67231, + 67224, + 67263, + 67194, + 67219, + 67185, + 67217, + 67245, + 67157, + 67206, + 67200, + 67193, + 67208, + 67204, + 67209, + 67193, + 67211, + 67200, + 67223, + 67207, + 67212, + 67232, + 67241, + 67210, + 67192, + 67252, + 67215, + 67204, + 67205, + 67225, + 67202, + 67224, + 67245, + 67231, + 67182, + 67211, + 67205, + 67190, + 67211, + 67212, + 67207, + 67250, + 67235, + 67207, + 67198, + 67187, + 67195, + 67217, + 67210, + 67248, + 67207, + 67261, + 67221, + 67216, + 67203, + 67199, + 67210, + 67196, + 67188, + 67246, + 67223, + 67210, + 67228, + 67210, + 67254, + 67232, + 67210, + 67189, + 67248, + 67187, + 67194, + 67190, + 67219, + 67230, + 67202, + 67210, + 67249, + 67229, + 67206, + 67229, + 67202, + 67212, + 67237, + 67214, + 67205, + 67226, + 67224, + 67197, + 67187, + 67237, + 67202, + 67197, + 67218, + 67254, + 67256, + 67227, + 67202, + 67206, + 67231, + 67237, + 67224, + 67198, + 67226, + 67194, + 67233, + 67230, + 67174, + 67265, + 67223, + 67221, + 67266, + 67203, + 67235, + 67216, + 67190, + 67232, + 67200, + 67215, + 67158, + 67219, + 67196, + 67205, + 67212, + 67199, + 67220, + 67242, + 67184, + 67185, + 67198, + 67227, + 67194, + 67223, + 67191, + 67178, + 67230, + 67204, + 67172, + 67199, + 67245, + 67220, + 67201, + 67205, + 67246, + 67207, + 67228, + 67212, + 67189, + 67209, + 67202, + 67186, + 67206, + 67209, + 67205, + 67209, + 67203, + 67190, + 67225, + 67206, + 67192, + 67193, + 67216, + 67219, + 67190, + 67197, + 67204, + 67228, + 67213, + 67203, + 67200, + 67193, + 67211, + 67176, + 67229, + 67239, + 67238, + 67201, + 67213, + 67207, + 67241, + 67196, + 67219, + 67248, + 67219, + 67211, + 67236, + 67229, + 67209, + 67211, + 67191, + 67216, + 67243, + 67190, + 67191, + 67271, + 67227, + 67249, + 67243, + 67185, + 67181, + 67185, + 67204, + 67181, + 67217, + 67222, + 67202, + 67205, + 67275, + 67219, + 67190, + 67212, + 67228, + 67215, + 67232, + 67191, + 67209, + 67274, + 67207, + 67217, + 67210, + 67229, + 67211, + 67180, + 67193, + 67222, + 67250, + 67222, + 67162, + 67215, + 67209, + 67223, + 67201, + 67229, + 67205, + 67197, + 67225, + 67213, + 67197, + 67218, + 67232, + 67231, + 67250, + 67227, + 67181, + 67182, + 67241, + 67202, + 67199, + 67210, + 67200, + 67155, + 67215, + 67204, + 67183, + 67207, + 67220, + 67229, + 67208, + 67221, + 67190, + 67198, + 67174, + 67180, + 67209, + 67244, + 67236, + 67227, + 67232, + 67177, + 67168, + 67223, + 67197, + 67251, + 67186, + 67193, + 67175, + 67224, + 67233, + 67168, + 67216, + 67187, + 67156, + 67203, + 67206, + 67201, + 67205, + 67175, + 67208, + 67172, + 67200, + 67201, + 67206, + 67185, + 67186, + 67211, + 67184, + 67250, + 67191, + 67197, + 67206, + 67188, + 67204, + 67193, + 67206, + 67197, + 67206, + 67208, + 67226, + 67203, + 67216, + 67221, + 67200, + 67184, + 67199, + 67225, + 67241, + 67206, + 67183, + 67209, + 67230, + 67216, + 67235, + 67184, + 67231, + 67237, + 67225, + 67202, + 67227, + 67189, + 67201, + 67183, + 67217, + 67206, + 67252, + 67189, + 67235, + 67268, + 67189, + 67203, + 67227, + 67206, + 67174, + 67194, + 67202, + 67201, + 67162, + 67184, + 67182, + 67239, + 67215, + 67231, + 67228, + 67230, + 67195, + 67172, + 67221, + 67213, + 67173, + 67204, + 67213, + 67195, + 67206, + 67175, + 67205, + 67257, + 67220, + 67206, + 67242, + 67189, + 67196, + 67201, + 67191, + 67240, + 67224, + 67204, + 67251, + 67199, + 67208, + 67207, + 67215, + 67212, + 67180, + 67191, + 67205, + 67176, + 67207, + 67196, + 67175, + 67217, + 67187, + 67229, + 67216, + 67199, + 67233, + 67189, + 67217, + 67228, + 67219, + 67251, + 67200, + 67252, + 67170, + 67220, + 67189, + 67231, + 67195, + 67183, + 67180, + 67215, + 67251, + 67218, + 67207, + 67175, + 67181, + 67194, + 67228, + 67197, + 67191, + 67172, + 67211, + 67185, + 67192, + 67224, + 67207, + 67249, + 67193, + 67169, + 67203, + 67207, + 67175, + 67203, + 67193, + 67212, + 67213, + 67196, + 67158, + 67220, + 67209, + 67199, + 67217, + 67178, + 67186, + 67171, + 67177, + 67235, + 67187, + 67177, + 67211, + 67191, + 67232, + 67231, + 67176, + 67249, + 67190, + 67187, + 67181, + 67246, + 67195, + 67279, + 67206, + 67190, + 67187, + 67204, + 67185, + 67224, + 67176, + 67165, + 67217, + 67229, + 67181, + 67200, + 67195, + 67190, + 67222, + 67202, + 67202, + 67187, + 67203, + 67192, + 67179, + 67192, + 67408, + 67241, + 67199, + 67178, + 67199, + 67217, + 67185, + 67201, + 67189, + 67204, + 67220, + 67224, + 67221, + 67224, + 67274, + 67184, + 67190, + 67179, + 67208, + 67218, + 67173, + 67208, + 67215, + 67209, + 67198, + 67190, + 67214, + 67193, + 67237, + 67218, + 67217, + 67218, + 67211, + 67159, + 67200, + 67176, + 67202, + 67198, + 67239, + 67188, + 67214, + 67196, + 67204, + 67210, + 67195, + 67194, + 67216, + 67186, + 67225, + 67178, + 67189, + 67243, + 67206, + 67198, + 67215, + 67208, + 67217, + 67207, + 67175, + 67203, + 67233, + 67209, + 67240, + 67208, + 67213, + 67182, + 67198, + 67209, + 67178, + 67191, + 67229, + 67184, + 67216, + 67226, + 67196, + 67259, + 67224, + 67220, + 67186, + 67235, + 67194, + 67237, + 67192, + 67230, + 67215, + 67231, + 67173, + 67198, + 67218, + 67230, + 67233, + 67214, + 67222, + 67208, + 67230, + 67259, + 67209, + 67166, + 67210, + 67175, + 67201, + 67196, + 67192, + 67262, + 67228, + 67210, + 67235, + 67215, + 67225, + 67269, + 67247, + 67184, + 67206, + 67175, + 67210, + 67172, + 67208, + 67242, + 67192, + 67255, + 67182, + 67303, + 67237, + 67240, + 67208, + 67234, + 67212, + 67210, + 67177, + 67175, + 67206, + 67223, + 67214, + 67196, + 67225, + 67193, + 67277, + 67226, + 67214, + 67189, + 67192, + 67182, + 67194, + 67209, + 67189, + 67248, + 67226, + 67213, + 67210, + 67287, + 67204, + 67190, + 67232, + 67191, + 67200, + 67246, + 67193, + 67196, + 67187, + 67232, + 67246, + 67198, + 67237, + 67240, + 67236, + 67170, + 67209, + 67158, + 67238, + 67164, + 67205, + 67189, + 67200, + 67190, + 67210, + 67185, + 67231, + 67184, + 67200, + 67265, + 67183, + 67196, + 67199, + 67195, + 67183, + 67228, + 67186, + 67194, + 67187, + 67193, + 67172, + 67192, + 67201, + 67203, + 67213, + 67215, + 67213, + 67196, + 67197, + 67214, + 67206, + 67172, + 67203, + 67206, + 67210, + 67212, + 67204, + 67167, + 67225, + 67243, + 67203, + 67168, + 67211, + 67207, + 67198, + 67199, + 67185, + 67220, + 67214, + 67186, + 67188, + 67190, + 67196, + 67191, + 67190, + 67171, + 67243, + 67186, + 67216, + 67216, + 67162, + 67202, + 67167, + 67227, + 67211, + 67203, + 67217, + 67193, + 67214, + 67222, + 67225, + 67189, + 67176, + 67205, + 67219, + 67187, + 67230, + 67225, + 67240, + 67202, + 67201, + 67184, + 67195, + 67198, + 67231, + 67236, + 67255, + 67221, + 67194, + 67181, + 67174, + 67208, + 67200, + 67191, + 67175, + 67192, + 67226, + 67204, + 67220, + 67177, + 67211, + 67214, + 67187, + 67204, + 67231, + 67281, + 67168, + 67230, + 67209, + 67224, + 67196, + 67197, + 67204, + 67194, + 67218, + 67220, + 67203, + 67183, + 67218, + 67174, + 67193, + 67195, + 67196, + 67236, + 67198, + 67182, + 67197, + 67172, + 67249, + 67248, + 67219, + 67202, + 67201, + 67201, + 67198, + 67251, + 67208, + 67175, + 67203, + 67180, + 67179, + 67209, + 67187, + 67182, + 67201, + 67208, + 67219, + 67193, + 67189, + 67225, + 67210, + 67172, + 67246, + 67217, + 67207, + 67194, + 67164, + 67213, + 67165, + 67254, + 67478, + 67204, + 67209, + 67188, + 67166, + 67191, + 67209, + 67207, + 67208, + 67160, + 67179, + 67202, + 67154, + 67216, + 67233, + 67178, + 67212, + 67211, + 67204, + 67185, + 67202, + 67182, + 67170, + 67186, + 67236, + 67217, + 67192, + 67202, + 67177, + 67207, + 67226, + 67209, + 67208, + 67176, + 67248, + 67206, + 67262, + 67243, + 67196, + 67198, + 67212, + 67200, + 67232, + 67199, + 67194, + 67234, + 67210, + 67167, + 67215, + 67219, + 67220, + 67169, + 67196, + 67223, + 67263, + 67241, + 67186, + 67249, + 67200, + 67207, + 67209, + 67223, + 67206, + 67189, + 67173, + 67221, + 67223, + 67203, + 67216, + 67201, + 67188, + 67197, + 67239, + 67221, + 67219, + 67227, + 67208, + 67228, + 67200, + 67196, + 67183, + 67211, + 67207, + 67200, + 67257, + 67236, + 67216, + 67195, + 67182, + 67219, + 67226, + 67223, + 67202, + 67241, + 67208, + 67239, + 67238, + 67226, + 67180, + 67199, + 67215, + 67189, + 67235, + 67185, + 67245, + 67234, + 67157, + 67215, + 67205, + 67238, + 67230, + 67209, + 67173, + 67182, + 67216, + 67197, + 67203, + 67255, + 67188, + 67228, + 67294, + 67214, + 67225, + 67205, + 67171, + 67198, + 67188, + 67208, + 67235, + 67190, + 67166, + 67203, + 67223, + 67238, + 67210, + 67174, + 67206, + 67192, + 67209, + 67244, + 67186, + 67227, + 67273, + 67209, + 67224, + 67197, + 67201, + 67236, + 67183, + 67205, + 67196, + 67218, + 67207, + 67222, + 67187, + 67241, + 67215, + 67191, + 67192, + 67173, + 67202, + 67203, + 67238, + 67203, + 67172, + 67224, + 67208, + 67200, + 67190, + 67250, + 67198, + 67166, + 67211, + 67243, + 67210, + 67197, + 67204, + 67228, + 67199, + 67216, + 67202, + 67234, + 67199, + 67162, + 67240, + 67197, + 67220, + 67221, + 67203, + 67232, + 67195, + 67227, + 67202, + 67212, + 67231, + 67295, + 67208, + 67183, + 67240, + 67226, + 67172, + 67199, + 67203, + 67237, + 67208, + 67215, + 67214, + 67180, + 67186, + 67188, + 67184, + 67228, + 67179, + 67232, + 67217, + 67201, + 67234, + 67217, + 67206, + 67219, + 67192, + 67190, + 67215, + 67231, + 67201, + 67192, + 67172, + 67187, + 67223, + 67238, + 67195, + 67192, + 67199, + 67204, + 67212, + 67220, + 67240, + 67201, + 67203, + 67186, + 67208, + 67251, + 67179, + 67185, + 67211, + 67205, + 67216, + 67233, + 67180, + 67208, + 67168, + 67224, + 67199, + 67254, + 67242, + 67212, + 67201, + 67194, + 67196, + 67208, + 67162, + 67236, + 67226, + 67222, + 67202, + 67192, + 67221, + 67196, + 67218, + 67182, + 67235, + 67232, + 67179, + 67236, + 67240, + 67223, + 67233, + 67213, + 67220, + 67244, + 67214, + 67245, + 67230, + 67220, + 67229, + 67199, + 67212, + 67202, + 67201, + 67230, + 67191, + 67222, + 67221, + 67212, + 67196, + 67204, + 67202, + 67225, + 67211, + 67218, + 67215, + 67194, + 67240, + 67199, + 67180, + 67205, + 67218, + 67226, + 67196, + 67174, + 67205, + 67208, + 67209, + 67211, + 67201, + 67204, + 67199, + 67219, + 67254, + 67246, + 67217, + 67213, + 67188, + 67214, + 67199, + 67192, + 67187, + 67173, + 67176, + 67197, + 67212, + 67254, + 67172, + 67230, + 67195, + 67252, + 67224, + 67211, + 67185, + 67197, + 67161, + 67201, + 67173, + 67217, + 67199, + 67187, + 67229, + 67280, + 67228, + 67254, + 67185, + 67212, + 67228, + 67192, + 67231, + 67207, + 67188, + 67196, + 67331, + 67201, + 67203, + 67245, + 67222, + 67198, + 67202, + 67265, + 67220, + 67206, + 67180, + 67186, + 67213, + 67191, + 67210, + 67217, + 67180, + 67243, + 67188, + 67200, + 67198, + 67188, + 67189, + 67193, + 67223, + 67184, + 67213, + 67203, + 67207, + 67204, + 67228, + 67210, + 67212, + 67223, + 67195, + 67196, + 67185, + 67250, + 67251, + 67228, + 67201, + 67192, + 67201, + 67242, + 67244, + 67212, + 67216, + 67235, + 67177, + 67280, + 67188, + 67207, + 67179, + 67184, + 67222, + 67206, + 67240, + 67231, + 67220, + 67178, + 67217, + 67211, + 67251, + 67213, + 67247, + 67230, + 67165, + 67209, + 67199, + 67230, + 67211, + 67172, + 67221, + 67200, + 67203, + 67205, + 67196, + 67309, + 67191, + 67207, + 67184, + 67220, + 67229, + 67178, + 67194, + 67231, + 67219, + 67249, + 67269, + 67228, + 67197, + 67210, + 67193, + 67229, + 67228, + 67216, + 67178, + 67195, + 67247, + 67209, + 67223, + 67212, + 67213, + 67157, + 67241, + 67224, + 67237, + 67183, + 67170, + 67198, + 67202, + 67206, + 67196, + 67209, + 67216, + 67207, + 67242, + 67221, + 67198, + 67216, + 67223, + 67238, + 67223, + 67196, + 67208, + 67191, + 67164, + 67204, + 67230, + 67203, + 67206, + 67189, + 67241, + 67207, + 67240, + 67260, + 67214, + 67209, + 67266, + 67195, + 67200, + 67227, + 67222, + 67192, + 67218, + 67159, + 67191, + 67218, + 67247, + 67212, + 67162, + 67216, + 67188, + 67216, + 67271, + 67203, + 67205, + 67212, + 67216, + 67184, + 67228, + 67197, + 67182, + 67207, + 67237, + 67255, + 67237, + 67226, + 67180, + 67167, + 67204, + 67196, + 67187, + 67227, + 67179, + 67179, + 67216, + 67203, + 67205, + 67188, + 67238, + 67200, + 67209, + 67193, + 67153, + 67206, + 67203, + 67218, + 67204, + 67227, + 67200, + 67210, + 67205, + 67196, + 67215, + 67217, + 67195, + 67188, + 67253, + 67180, + 67199, + 67172, + 67227, + 67212, + 67175, + 67236, + 67222, + 67212, + 67217, + 67483, + 67184, + 67186, + 67214, + 67205, + 67182, + 67187, + 67180, + 67270, + 67269, + 67205, + 67174, + 67205, + 67159, + 67212, + 67200, + 67259, + 67199, + 67203, + 67209, + 67203, + 67193, + 67202, + 67246, + 67207, + 67232, + 67341, + 67223, + 67184, + 67263, + 67170, + 67229, + 67225, + 67223, + 67214, + 67237, + 67199, + 67168, + 67195, + 67186, + 67212, + 67241, + 67216, + 67255, + 67194, + 67224, + 67254, + 67240, + 67216, + 67235, + 67194, + 67223, + 67220, + 67209, + 67201, + 67168, + 67210, + 67258, + 67219, + 67201, + 67223, + 67207, + 67208, + 67206, + 67200, + 67236, + 67215, + 67235, + 67200, + 67206, + 67284, + 67224, + 67198, + 67180, + 67220, + 67175, + 67209, + 67214, + 67202, + 67199, + 67215, + 67196, + 67195, + 67165, + 67232, + 67198, + 67211, + 67180, + 67193, + 67198, + 67219, + 67185, + 67176, + 67215, + 67219, + 67166, + 67233, + 67212, + 67233, + 67235, + 67227, + 67200, + 67229, + 67165, + 67206, + 67197, + 67219, + 67176, + 67203, + 67172, + 67183, + 67176, + 67200, + 67184, + 67206, + 67181, + 67291, + 67267, + 67234, + 67161, + 67204, + 67211, + 67248, + 67268, + 67227, + 67208, + 67210, + 67210, + 67221, + 67229, + 67196, + 67222, + 67238, + 67229, + 67226, + 67272, + 67218, + 67192, + 67230, + 67202, + 67220, + 67194, + 67201, + 67201, + 67204, + 67169, + 67211, + 67253, + 67287, + 67191, + 67194, + 67215, + 67202, + 67194, + 67189, + 67206, + 67187, + 67246, + 67204, + 67189, + 67212, + 67226, + 67195, + 67240, + 67201, + 67212, + 67195, + 67202, + 67208, + 67176, + 67204, + 67195, + 67203, + 67201, + 67188, + 67167, + 67164, + 67219, + 67210, + 67156, + 67158, + 67172, + 67193, + 67192, + 67175, + 67207, + 67193, + 67254, + 67184, + 67240, + 67210, + 67197, + 67198, + 67180, + 67206, + 67185, + 67168, + 67175, + 67177, + 67204, + 67219, + 67196, + 67208, + 67196, + 67187, + 67196, + 67235, + 67193, + 67592, + 67197, + 67194, + 67201, + 67172, + 67214, + 67180, + 67177, + 67194, + 67175, + 67195, + 67241, + 67267, + 67212, + 67208, + 67250, + 67200, + 67217, + 67201, + 67210, + 67220, + 67173, + 67200, + 67181, + 67195, + 67188, + 67187, + 67217, + 67216, + 67175, + 67203, + 67188, + 67183, + 67175, + 67186, + 67191, + 67246, + 67200, + 67170, + 67243, + 67168, + 67219, + 67211, + 67197, + 67205, + 67167, + 67221, + 67177, + 67207, + 67203, + 67215, + 67171, + 67188, + 67187, + 67204, + 67205, + 67212, + 67197, + 67203, + 67204, + 67200, + 67164, + 67208, + 67181, + 67220, + 67190, + 67244, + 67275, + 67205, + 67181, + 67207, + 67213, + 67219, + 67201, + 67173, + 67237, + 67231, + 67196, + 67189, + 67179, + 67194, + 67214, + 67207, + 67232, + 67170, + 67200, + 67219, + 67216, + 67212, + 67211, + 67244, + 67188, + 67190, + 67190, + 67184, + 67208, + 67195, + 67198, + 67186, + 67178, + 67180, + 67192, + 67186, + 67215, + 67172, + 67229, + 67182, + 67230, + 67383, + 67216, + 67186, + 67179, + 67215, + 67237, + 67202, + 67197, + 67213, + 67229, + 67246, + 67196, + 67298, + 67211, + 67181, + 67152, + 67225, + 67187, + 67203, + 67232, + 67212, + 67182, + 67214, + 67235, + 67169, + 67219, + 67179, + 67167, + 67174, + 67204, + 67190, + 67239, + 67166, + 67204, + 67178, + 67216, + 67268, + 67208, + 67201, + 67208, + 67282, + 67184, + 67190, + 67204, + 67203, + 67194, + 67185, + 67254, + 67208, + 67192, + 67200, + 67169, + 67214, + 67290, + 67212, + 67216, + 67202, + 67176, + 67161, + 67239, + 67220, + 67197, + 67202, + 67283, + 67200, + 67203, + 67203, + 67196, + 67194, + 67216, + 67166, + 67239, + 67205, + 67172, + 67224, + 67211, + 67230, + 67183, + 67206, + 67225, + 67199, + 67203, + 67230, + 67204, + 67223, + 67215, + 67233, + 67206, + 67199, + 67216, + 67186, + 67178, + 67200, + 67180, + 67185, + 67207, + 67209, + 67202, + 67182, + 67178, + 67180, + 67232, + 67200, + 67216, + 67189, + 67268, + 67203, + 67206, + 67173, + 67202, + 67223, + 67184, + 67212, + 67192, + 67256, + 67201, + 67261, + 67206, + 67177, + 67207, + 67254, + 67225, + 67181, + 67273, + 67198, + 67183, + 67213, + 67216, + 67186, + 67186, + 67177, + 67198, + 67176, + 67198, + 67188, + 67192, + 67203, + 67182, + 67220, + 67287, + 67225, + 67242, + 67205, + 67189, + 67228, + 67209, + 67205, + 67271, + 67213, + 67178, + 67195, + 67211, + 67192, + 67204, + 67173, + 67187, + 67207, + 67184, + 67201, + 67213, + 67213, + 67202, + 67205, + 67187, + 67192, + 67178, + 67229, + 67170, + 67185, + 67227, + 67180, + 67206, + 67172, + 67188, + 67203, + 67209, + 67168, + 67217, + 67203, + 67176, + 67193, + 67190, + 67170, + 67189, + 67207, + 67208, + 67209, + 67199, + 67231, + 67174, + 67189, + 67192, + 67177, + 67175, + 67207, + 67218, + 67221, + 67258, + 67212, + 67227, + 67183, + 67210, + 67211, + 67198, + 67200, + 67196, + 67223, + 67161, + 67190, + 67208, + 67198, + 67178, + 67197, + 67184, + 67214, + 67207, + 67188, + 67188, + 67204, + 67201, + 67210, + 67224, + 67191, + 67192, + 67165, + 67211, + 67179, + 67216, + 67162, + 67183, + 67193, + 67219, + 67190, + 67183, + 67192, + 67242, + 67196, + 67149, + 67210, + 67210, + 67204, + 67176, + 67182, + 67178, + 67221, + 67200, + 67188, + 67222, + 67225, + 67219, + 67193, + 67240, + 67186, + 67211, + 67213, + 67213, + 67172, + 67201, + 67202, + 67167, + 67176, + 67209, + 67206, + 67215, + 67195, + 67199, + 67218, + 67182, + 67187, + 67223, + 67192, + 67172, + 67198, + 67202, + 67189, + 67185, + 67226, + 67191, + 67219, + 67220, + 67249, + 67210, + 67202, + 67188, + 67200, + 67210, + 67183, + 67213, + 67198, + 67202, + 67209, + 67214, + 67217, + 67204, + 67238, + 67224, + 67229, + 67188, + 67190, + 67208, + 67175, + 67176, + 67174, + 67175, + 67186, + 67200, + 67190, + 67215, + 67180, + 67204, + 67651, + 67194, + 67180, + 67182, + 67207, + 67189, + 67176, + 67205, + 67201, + 67181, + 67194, + 67174, + 67227, + 67176, + 67213, + 67171, + 67169, + 67165, + 67186, + 67179, + 67175, + 67162, + 67156, + 67195, + 67199, + 67214, + 67195, + 67191, + 67213, + 67208, + 67221, + 67199, + 67215, + 67221, + 67209, + 67220, + 67211, + 67215, + 67219, + 67201, + 67197, + 67202, + 67183, + 67191, + 67223, + 67181, + 67193, + 67252, + 67192, + 67205, + 67206, + 67216, + 67181, + 67163, + 67173, + 67187, + 67168, + 67164, + 67242, + 67219, + 67181, + 67232, + 67197, + 67168, + 67238, + 67231, + 67169, + 67187, + 67180, + 67207, + 67218, + 67191, + 67199, + 67215, + 67204, + 67225, + 67257, + 67217, + 67189, + 67195, + 67189, + 67214, + 67207, + 67206, + 67198, + 67191, + 67181, + 67203, + 67212, + 67204, + 67213, + 67176, + 67186, + 67211, + 67188, + 67200, + 67185, + 67201, + 67208, + 67189, + 67169, + 67253, + 67194, + 67205, + 67217, + 67182, + 67229, + 67168, + 67208, + 67181, + 67176, + 67172, + 67179, + 67207, + 67204, + 67177, + 67217, + 67193, + 67172, + 67243, + 67237, + 67214, + 67211, + 67211, + 67189, + 67218, + 67192, + 67208, + 67192, + 67208, + 67176, + 67200, + 67200, + 67185, + 67188, + 67215, + 67272, + 67195, + 67200, + 67225, + 67210, + 67211, + 67186, + 67272, + 67224, + 67216, + 67219, + 67241, + 67186, + 67181, + 67222, + 67217, + 67179, + 67215, + 67175, + 67202, + 67218, + 67192, + 67207, + 67241, + 67191, + 67199, + 67206, + 67181, + 67189, + 67201, + 67204, + 67213, + 67218, + 67200, + 67214, + 67291, + 67199, + 67198, + 67197, + 67178, + 67158, + 67186, + 67191, + 67208, + 67193, + 67184, + 67180, + 67416, + 67182, + 67230, + 67178, + 67214, + 67207, + 67239, + 67209, + 67226, + 67211, + 67228, + 67183, + 67242, + 67169, + 67197, + 67202, + 67184, + 67186, + 67155, + 67209, + 67169, + 67240, + 67205, + 67213, + 67167, + 67165, + 67197, + 67311, + 67200, + 67226, + 67218, + 67259, + 67234, + 67201, + 67225, + 67221, + 67200, + 67200, + 67214, + 67217, + 67209, + 67194, + 67206, + 67216, + 67198, + 67214, + 67207, + 67211, + 67221, + 67207, + 67217, + 67191, + 67199, + 67227, + 67209, + 67176, + 67219, + 67205, + 67232, + 67199, + 67168, + 67211, + 67191, + 67223, + 67234, + 67194, + 67207, + 67188, + 67228, + 67180, + 67222, + 67207, + 67175, + 67186, + 67162, + 67214, + 67213, + 67175, + 67162, + 67215, + 67191, + 67165, + 67209, + 67253, + 67230, + 67199, + 67213, + 67210, + 67205, + 67193, + 67216, + 67227, + 67198, + 67197, + 67205, + 67217, + 67204, + 67225, + 67226, + 67232, + 67179, + 67205, + 67207, + 67190, + 67212, + 67279, + 67218, + 67171, + 67214, + 67179, + 67168, + 67228, + 67193, + 67222, + 67215, + 67243, + 67165, + 67236, + 67179, + 67233, + 67185, + 67237, + 67202, + 67253, + 67224, + 67231, + 67244, + 67229, + 67193, + 67187, + 67252, + 67198, + 67223, + 67246, + 67217, + 67211, + 67221, + 67236, + 67179, + 67209, + 67207, + 67213, + 67177, + 67192, + 67191, + 67199, + 67171, + 67202, + 67204, + 67209, + 67224, + 67202, + 67188, + 67188, + 67194, + 67173, + 67186, + 67208, + 67154, + 67205, + 67215, + 67205, + 67190, + 67201, + 67218, + 67202, + 67191, + 67213, + 67210, + 67185, + 67233, + 67225, + 67266, + 67212, + 67268, + 67238, + 67225, + 67211, + 67180, + 67187, + 67225, + 67164, + 67207, + 67200, + 67219, + 67204, + 67193, + 67183, + 67267, + 67198, + 67219, + 67193, + 67228, + 67174, + 67178, + 67225, + 67194, + 67219, + 67218, + 67209, + 67209, + 67213, + 67217, + 67199, + 67225, + 67207, + 67217, + 67167, + 67202, + 67206, + 67173, + 67178, + 67197, + 67194, + 67239, + 67184, + 67209, + 67196, + 67193, + 67205, + 67194, + 67198, + 67200, + 67203, + 67230, + 67202, + 67216, + 67237, + 67200, + 67228, + 67193, + 67171, + 67212, + 67216, + 67810, + 67172, + 67211, + 67214, + 67217, + 67200, + 67219, + 67188, + 67222, + 67188, + 67214, + 67259, + 67223, + 67202, + 67215, + 67206, + 67256, + 67250, + 67209, + 67202, + 67251, + 67164, + 67202, + 67235, + 67207, + 67214, + 67190, + 67207, + 67204, + 67235, + 67623, + 67187, + 67194, + 67224, + 67205, + 67177, + 67217, + 67214, + 67199, + 67235, + 67229, + 67226, + 67190, + 67200, + 67223, + 67203, + 67175, + 67226, + 67226, + 67190, + 67215, + 67182, + 67232, + 67213, + 67232, + 67172, + 67205, + 67185, + 67238, + 67243, + 67248, + 67258, + 67184, + 67273, + 67219, + 67199, + 67178, + 67188, + 67219, + 67193, + 67213, + 67208, + 67208, + 67209, + 67202, + 67194, + 67236, + 67209, + 67244, + 67191, + 67166, + 67216, + 67188, + 67217, + 67197, + 67229, + 67196, + 67175, + 67240, + 67221, + 67201, + 67182, + 67230, + 67201, + 67211, + 67259, + 67245, + 67208, + 67195, + 67224, + 67198, + 67195, + 67200, + 67190, + 67192, + 67188, + 67186, + 67207, + 67195, + 67259, + 67167, + 67216, + 67230, + 67188, + 67180, + 67209, + 67182, + 67170, + 67184, + 67218, + 67230, + 67217, + 67164, + 67201, + 67257, + 67238, + 67221, + 67246, + 67193, + 67206, + 67248, + 67201, + 67213, + 67216, + 67214, + 67225, + 67209, + 67206, + 67227, + 67189, + 67243, + 67266, + 67226, + 67186, + 67209, + 67186, + 67191, + 67196, + 67212, + 67203, + 67217, + 67185, + 67190, + 67204, + 67206, + 67251, + 67204, + 67214, + 67176, + 67189, + 67213, + 67176, + 67240, + 67188, + 67193, + 67174, + 67533, + 67214, + 67232, + 67252, + 67205, + 67177, + 67215, + 67198, + 67221, + 67215, + 67190, + 67211, + 67188, + 67183, + 67205, + 67197, + 67193, + 67207, + 67208, + 67194, + 67200, + 67199, + 67224, + 67209, + 67222, + 67194, + 67183, + 67230, + 67165, + 67206, + 67180, + 67225, + 67205, + 67198, + 67187, + 67208, + 67177, + 67222, + 67259, + 67228, + 67177, + 67219, + 67215, + 67235, + 67187, + 67230, + 67186, + 67235, + 67198, + 67189, + 67190, + 67236, + 67178, + 67173, + 67208, + 67180, + 67195, + 67204, + 67273, + 67198, + 67207, + 67199, + 67188, + 67188, + 67228, + 67215, + 67245, + 67228, + 67210, + 67170, + 67241, + 67262, + 67201, + 67209, + 67228, + 67230, + 67207, + 67215, + 67206, + 67193, + 67247, + 67181, + 67207, + 67192, + 67169, + 67213, + 67228, + 67225, + 67237, + 67190, + 67200, + 67224, + 67200, + 67182, + 67205, + 67189, + 67251, + 67203, + 67181, + 67198, + 67218, + 67204, + 67214, + 67184, + 67184, + 67204, + 67202, + 67197, + 67223, + 67249, + 67280, + 67161, + 67159, + 67199, + 67229, + 67331, + 67207, + 67221, + 67233, + 67238, + 67267, + 67199, + 67212, + 67225, + 67180, + 67226, + 67222, + 67190, + 67195, + 67195, + 67181, + 67237, + 67189, + 67196, + 67210, + 67253, + 67249, + 67204, + 67238, + 67191, + 67248, + 67200, + 67237, + 67217, + 67204, + 67214, + 67164, + 67195, + 67252, + 67209, + 67233, + 67193, + 67185, + 67203, + 67169, + 67366, + 67202, + 67204, + 67160, + 67243, + 67185, + 67170, + 67261, + 67209, + 67167, + 67185, + 67167, + 67218, + 67230, + 67209, + 67203, + 67207, + 67179, + 67182, + 67252, + 67203, + 67190, + 67181, + 67195, + 67199, + 67183, + 67199, + 67199, + 67197, + 67187, + 67200, + 67222, + 67181, + 67174, + 67211, + 67183, + 67184, + 67195, + 67197, + 67244, + 67168, + 67211, + 67220, + 67169, + 67195, + 67185, + 67194, + 67175, + 67198, + 67216, + 67195, + 67205, + 67243, + 67194, + 67209, + 67169, + 67227, + 67193, + 67211, + 67168, + 67181, + 67235, + 67219, + 67205, + 67186, + 67189, + 67223, + 67203, + 67227, + 67217, + 67224, + 67212, + 67174, + 67260, + 67235, + 67227, + 67228, + 67219, + 67233, + 67199, + 67224, + 67270, + 67167, + 67173, + 67173, + 67234, + 67248, + 67200, + 67256, + 67232, + 67213, + 67224, + 67230, + 67193, + 67273, + 67209, + 67211, + 67207, + 67182, + 67225, + 67215, + 67181, + 67201, + 67185, + 67198, + 67184, + 67194, + 67203, + 67206, + 67228, + 67174, + 67253, + 67202, + 67217, + 67245, + 67214, + 67176, + 67215, + 67220, + 67195, + 67206, + 67191, + 67167, + 67198, + 67189, + 67208, + 67236, + 67201, + 67257, + 67189, + 67196, + 67208, + 67186, + 67180, + 67207, + 67213, + 67180, + 67206, + 67212, + 67208, + 67200, + 67189, + 67219, + 67196, + 67274, + 67213, + 67235, + 67214, + 67236, + 67166, + 67210, + 67235, + 67222, + 67198, + 67199, + 67202, + 67190, + 67176, + 67222, + 67250, + 67214, + 67182, + 67213, + 67225, + 67184, + 67196, + 67225, + 67180, + 67248, + 67207, + 67232, + 67245, + 67192, + 67193, + 67231, + 67215, + 67172, + 67178, + 67194, + 67233, + 67207, + 67210, + 67250, + 67199, + 67221, + 67225, + 67200, + 67218, + 67170, + 67187, + 67207, + 67162, + 67231, + 67214, + 67203, + 67173, + 67161, + 67167, + 67204, + 67211, + 67175, + 67154, + 67186, + 67188, + 67165, + 67197, + 67201, + 67196, + 67189, + 67176, + 67196, + 67187, + 67226, + 67182, + 67192, + 67246, + 67268, + 67206, + 67255, + 67220, + 67218, + 67254, + 67220, + 67179, + 67208, + 67191, + 67239, + 67185, + 67190, + 67224, + 67196, + 67204, + 67226, + 67208, + 67206, + 67236, + 67213, + 67240, + 67207, + 67169, + 67221, + 67237, + 67210, + 67187, + 67217, + 67221, + 67202, + 67187, + 67192, + 67210, + 67234, + 67219, + 67228, + 67221, + 67210, + 67236, + 67178, + 67260, + 67204, + 67264, + 67211, + 67178, + 67217, + 67178, + 67195, + 67210, + 67262, + 67209, + 67260, + 67202, + 67187, + 67228, + 67233, + 67224, + 67204, + 67227, + 67178, + 67194, + 67198, + 67240, + 67212, + 67215, + 67222, + 67188, + 67242, + 67239, + 67209, + 67203, + 67208, + 67197, + 67178, + 67201, + 67254, + 67227, + 67216, + 67196, + 67232, + 67227, + 67225, + 67235, + 67216, + 67227, + 67217, + 67182, + 67203, + 67951, + 67207, + 67211, + 67178, + 67182, + 67187, + 67228, + 67215, + 67197, + 67247, + 67233, + 67189, + 67191, + 67211, + 67203, + 67206, + 67199, + 67233, + 67196, + 67189, + 67204, + 67233, + 67266, + 67197, + 67208, + 67215, + 67233, + 67200, + 67254, + 67224, + 67237, + 67237, + 67227, + 67219, + 67196, + 67182, + 67194, + 67201, + 67198, + 67182, + 67240, + 67231, + 67210, + 67193, + 67197, + 67171, + 67215, + 67186, + 67188, + 67196, + 67197, + 67250, + 67189, + 67186, + 67223, + 67223, + 67232, + 67260, + 67201, + 67198, + 67453, + 67225, + 67214, + 67283, + 67191, + 67172, + 67225, + 67216, + 67193, + 67200, + 67220, + 67192, + 67209, + 67185, + 67211, + 67207, + 67195, + 67248, + 67215, + 67206, + 67210, + 67272, + 67465, + 67197, + 67198, + 67185, + 67203, + 67204, + 67148, + 67226, + 67212, + 67208, + 67204, + 67208, + 67206, + 67239, + 67197, + 67193, + 67245, + 67206, + 67196, + 67183, + 67216, + 67248, + 67222, + 67221, + 67244, + 67228, + 67241, + 67204, + 67236, + 67279, + 67205, + 67165, + 67241, + 67223, + 67178, + 67217, + 67192, + 67201, + 67207, + 67202, + 67202, + 67220, + 67206, + 67167, + 67213, + 67229, + 67202, + 67266, + 67185, + 67177, + 67175, + 67179, + 67205, + 67231, + 67178, + 67189, + 67207, + 67201, + 67183, + 67219, + 67234, + 67265, + 67211, + 67196, + 67207, + 67237, + 67202, + 67216, + 67248, + 67227, + 67180, + 67189, + 67212, + 67213, + 67203, + 67229, + 67237, + 67172, + 67208, + 67201, + 67211, + 67194, + 67209, + 67206, + 67210, + 67222, + 67223, + 67200, + 67249, + 67185, + 67221, + 67207, + 67200, + 67238, + 67220, + 67250, + 67218, + 67198, + 67193, + 67217, + 67221, + 67205, + 67214, + 67222, + 67233, + 67234, + 67225, + 67211, + 67188, + 67193, + 67208, + 67215, + 67233, + 67205, + 67217, + 67182, + 67225, + 67204, + 67231, + 67231, + 67207, + 67249, + 67233, + 67208, + 67206, + 67204, + 67234, + 67260, + 67225, + 67204, + 67239, + 67227, + 67219, + 67175, + 67256, + 67235, + 67193, + 67237, + 67207, + 67252, + 67244, + 67231, + 67191, + 67207, + 67201, + 67239, + 67205, + 67196, + 67213, + 67230, + 67226, + 67237, + 67258, + 67224, + 67253, + 67191, + 67202, + 67204, + 67223, + 67225, + 67224, + 67204, + 67194, + 67224, + 67206, + 67224, + 67207, + 67235, + 67236, + 67209, + 67166, + 67186, + 67225, + 67223, + 67240, + 67269, + 67192, + 67209, + 67240, + 67187, + 67217, + 67179, + 67187, + 67198, + 67252, + 67240, + 67168, + 67222, + 67223, + 67193, + 67212, + 67203, + 67211, + 67224, + 67217, + 67226, + 67217, + 67203, + 67230, + 67238, + 67172, + 67234, + 67199, + 67208, + 67226, + 67183, + 67227, + 67212, + 67187, + 67220, + 67232, + 67246, + 67181, + 67278, + 67207, + 67214, + 67233, + 67210, + 67259, + 67210, + 67230, + 67215, + 67240, + 67198, + 67213, + 67209, + 67243, + 67227, + 67199, + 67230, + 67217, + 67229, + 67173, + 67191, + 67189, + 67203, + 67212, + 67223, + 67169, + 67219, + 67198, + 67199, + 67244, + 67302, + 67216, + 67250, + 67188, + 67224, + 67219, + 67232, + 67193, + 67201, + 67254, + 67261, + 67198, + 67224, + 67214, + 67234, + 67237, + 67203, + 67243, + 67220, + 67217, + 67202, + 67198, + 67201, + 67230, + 67188, + 67254, + 67226, + 67252, + 67189, + 67169, + 67187, + 67195, + 67240, + 67271, + 67273, + 67223, + 67242, + 67218, + 67232, + 67214, + 67167, + 67189, + 67182, + 67224, + 67274, + 67205, + 67218, + 67244, + 67253, + 67224, + 67207, + 67206, + 67202, + 67231, + 67201, + 67224, + 67250, + 67212, + 67200, + 67206, + 67231, + 67218, + 67205, + 67234, + 67210, + 67205, + 67249, + 67238, + 67220, + 67237, + 67243, + 67199, + 67192, + 67222, + 67209, + 67242, + 67218, + 67211, + 67184, + 67223, + 67242, + 67230, + 67228, + 67233, + 67245, + 67240, + 67216, + 67285, + 67198, + 67229, + 67219, + 67215, + 67242, + 67226, + 67192, + 67232, + 67208, + 67194, + 67238, + 67212, + 67194, + 67253, + 67196, + 67255, + 67166, + 67203, + 67195, + 67181, + 67233, + 67202, + 67209, + 67231, + 67193, + 67179, + 67243, + 67243, + 67223, + 67216, + 67225, + 67251, + 67234, + 67204, + 67225, + 67247, + 67192, + 67202, + 67179, + 67209, + 67172, + 67188, + 67173, + 67197, + 67183, + 67221, + 67232, + 67214, + 67188, + 67204, + 67222, + 67199, + 67213, + 67225, + 67212, + 67187, + 67263, + 67235, + 67304, + 67209, + 67177, + 67246, + 67225, + 67220, + 67223, + 67231, + 67221, + 67170, + 67205, + 67272, + 67205, + 67217, + 67249, + 67182, + 67202, + 67183, + 67237, + 67261, + 67200, + 67254, + 67248, + 67215, + 67193, + 67208, + 67237, + 67255, + 67186, + 67191, + 67202, + 67205, + 67240, + 67231, + 67241, + 67230, + 67213, + 67214, + 67201, + 67217, + 67194, + 67222, + 67200, + 67242, + 67231, + 67225, + 67225, + 67169, + 67212, + 67220, + 67240, + 67201, + 67234, + 67204, + 67216, + 67194, + 67247, + 67221, + 67212, + 67245, + 67355, + 67262, + 67252, + 67186, + 67222, + 67194, + 67266, + 67236, + 67228, + 67223, + 67236, + 67208, + 67239, + 67206, + 67197, + 67208, + 67210, + 67188, + 67190, + 67240, + 67237, + 67190, + 67220, + 67206, + 67182, + 67195, + 67243, + 67217, + 67231, + 67200, + 67198, + 67254, + 67203, + 67194, + 67217, + 67216, + 67201, + 67237, + 67189, + 67182, + 67224, + 67221, + 67268, + 67213, + 67218, + 67187, + 67174, + 67159, + 67227, + 67211, + 67187, + 67221, + 67221, + 67236, + 67212, + 67246, + 67207, + 67239, + 67220, + 67199, + 67191, + 67208, + 67184, + 67208, + 67203, + 67209, + 67213, + 67223, + 67205, + 67269, + 67191, + 67215, + 67265, + 67222, + 67188, + 67206, + 67219, + 67211, + 67197, + 67226, + 67222, + 67216, + 67209, + 67209, + 67243, + 67246, + 67177, + 67232, + 67188, + 67204, + 67177, + 67203, + 67203, + 67194, + 67191, + 67190, + 67181, + 67219, + 67245, + 67212, + 67202, + 67201, + 67222, + 67194, + 67228, + 67200, + 67208, + 67204, + 67254, + 67226, + 67277, + 67231, + 67216, + 67202, + 67244, + 67213, + 67182, + 67223, + 67224, + 67200, + 67194, + 67216, + 67177, + 67203, + 67271, + 67176, + 67197, + 67227, + 67238, + 67229, + 67226, + 67207, + 67220, + 67198, + 67194, + 67192, + 67225, + 67217, + 67200, + 67207, + 67241, + 67221, + 67224, + 67209, + 67205, + 67196, + 67212, + 67189, + 67222, + 67221, + 67223, + 67216, + 67204, + 67204, + 67215, + 67198, + 67223, + 67223, + 67231, + 67199, + 67225, + 67204, + 67188, + 67216, + 67207, + 67264, + 67231, + 67218, + 67220, + 67235, + 67219, + 67274, + 67241, + 67247, + 67217, + 67199, + 67188, + 67210, + 67220, + 67204, + 67222, + 67256, + 67260, + 67164, + 67246, + 67200, + 67204, + 67228, + 67209, + 67172, + 67196, + 67191, + 67200, + 67237, + 67177, + 67183, + 67216, + 67192, + 67165, + 67202, + 67187, + 67206, + 67211, + 67170, + 67240, + 67216, + 67191, + 67211, + 67235, + 67215, + 67200, + 67198, + 67194, + 67232, + 67218, + 67198, + 67274, + 67220, + 67211, + 67182, + 67192, + 67196, + 67180, + 67200, + 67209, + 67240, + 67171, + 67194, + 67202, + 67196, + 67208, + 67202, + 67194, + 67185, + 67245, + 67226, + 67193, + 67237, + 67222, + 67215, + 67172, + 67188, + 67202, + 67216, + 67223, + 67164, + 67236, + 67309, + 67195, + 67248, + 67199, + 67193, + 67198, + 67212, + 67207, + 67215, + 67197, + 67219, + 67202, + 67235, + 67217, + 67221, + 67229, + 67227, + 67178, + 67185, + 67179, + 67228, + 67223, + 67213, + 67201, + 67231, + 67212, + 67220, + 67216, + 67203, + 67196, + 67204, + 67183, + 67206, + 67229, + 67191, + 67221, + 67186, + 67195, + 67209, + 67199, + 67214, + 67213, + 67223, + 67241, + 67169, + 67225, + 67202, + 67181, + 67247, + 67195, + 67206, + 67212, + 67264, + 67236, + 67241, + 67211, + 67208, + 67258, + 67195, + 67271, + 67196, + 67207, + 67210, + 67232, + 67214, + 67240, + 67249, + 67205, + 67200, + 67264, + 67192, + 67183, + 67190, + 67167, + 67237, + 67256, + 67229, + 67240, + 67235, + 67184, + 67237, + 67224, + 67225, + 67213, + 67210, + 67183, + 67273, + 67232, + 67217, + 67224, + 67259, + 67225, + 67188, + 67211, + 67201, + 67279, + 67221, + 67201, + 67213, + 67226, + 67232, + 67222, + 67174, + 67199, + 67204, + 67230, + 67234, + 67207, + 67193, + 67176, + 67210, + 67218, + 67201, + 67207, + 67212, + 67215, + 67203, + 67213, + 67214, + 67183, + 67182, + 67207, + 67164, + 67265, + 67215, + 67257, + 67274, + 67194, + 67181, + 67226, + 67221, + 67227, + 67219, + 67258, + 67229, + 67207, + 67212, + 67210, + 67216, + 67185, + 67172, + 67214, + 67200, + 67214, + 67230, + 67183, + 67248, + 67246, + 67221, + 67217, + 67219, + 67189, + 67186, + 67213, + 67233, + 67174, + 67178, + 67176, + 67250, + 67243, + 67197, + 67225, + 67209, + 67203, + 67235, + 67185, + 67239, + 67205, + 67260, + 67190, + 67264, + 67230, + 67205, + 67215, + 67201, + 67202, + 67166, + 67228, + 67173, + 67182, + 67221, + 67191, + 67218, + 67198, + 67248, + 67189, + 67173, + 67210, + 67211, + 67225, + 67216, + 67255, + 67231, + 67242, + 67232, + 67228, + 67221, + 67187, + 67221, + 67197, + 67196, + 67211, + 67202, + 67213, + 67203, + 67176, + 67181, + 67229, + 67188, + 67212, + 67259, + 67244, + 67219, + 67241, + 67205, + 67185, + 67236, + 67209, + 67210, + 67204, + 67179, + 67224, + 67215, + 67174, + 67233, + 67183, + 67202, + 67221, + 67216, + 67174, + 67214, + 67205, + 67204, + 67216, + 67217, + 67210, + 67245, + 67221, + 67198, + 67203, + 67211, + 67186, + 67208, + 67184, + 67202, + 67232, + 67198, + 67195, + 67217, + 67184, + 67219, + 67229, + 67194, + 67167, + 67208, + 67219, + 67229, + 67217, + 67210, + 67169, + 67216, + 67198, + 67184, + 67177, + 67280, + 67233, + 67168, + 67258, + 67348, + 67261, + 67222, + 67190, + 67267, + 67210, + 67222, + 67203, + 67212, + 67183, + 67209, + 67199, + 67217, + 67210, + 67214, + 67197, + 67201, + 67207, + 67240, + 67242, + 67228, + 67208, + 67231, + 67224, + 67198, + 67207, + 67204, + 67211, + 67250, + 67187, + 67215, + 67207, + 67167, + 67177, + 67258, + 67226, + 67219, + 67184, + 67214, + 67228, + 67265, + 67176, + 67185, + 67205, + 67242, + 67212, + 67173, + 67218, + 67175, + 67213, + 67214, + 67232, + 67177, + 67224, + 67205, + 67174, + 67202, + 67226, + 67234, + 67175, + 67214, + 67238, + 67202, + 67201, + 67182, + 67199, + 67218, + 67232, + 67239, + 67189, + 67232, + 67176, + 67242, + 67236, + 67225, + 67203, + 67243, + 67200, + 67221, + 67226, + 67248, + 67216, + 67240, + 67181, + 67240, + 67232, + 67212, + 67187, + 67203, + 67199, + 67325, + 67234, + 67212, + 67196, + 67278, + 67236, + 67198, + 67216, + 67235, + 67226, + 67258, + 67214, + 67211, + 67254, + 67241, + 67250, + 67257, + 67223, + 67205, + 67222, + 67201, + 67221, + 67194, + 67262, + 67183, + 67224, + 67251, + 67202, + 67163, + 67203, + 67207, + 67250, + 67202, + 67190, + 67218, + 67234, + 67207, + 67231, + 67262, + 67209, + 67236, + 67206, + 67228, + 67224, + 67170, + 67247, + 67281, + 67218, + 67248, + 67221, + 67206, + 67200, + 67180, + 67236, + 67194, + 67180, + 67169, + 67188, + 67184, + 67199, + 67208, + 67210, + 67243, + 67181, + 67212, + 67219, + 67211, + 67255, + 67220, + 67221, + 67260, + 67182, + 67216, + 67172, + 67239, + 67182, + 67255, + 67188, + 67182, + 67264, + 67193, + 67240, + 67219, + 67188, + 67193, + 67219, + 67223, + 67205, + 67191, + 67228, + 67198, + 67207, + 67197, + 67223, + 67224, + 67232, + 67236, + 67243, + 67197, + 67208, + 67294, + 67243, + 67193, + 67229, + 67200, + 67198, + 67228, + 67202, + 67198, + 67212, + 67197, + 67219, + 67232, + 67186, + 67193, + 67254, + 67246, + 67178, + 67203, + 67206, + 67218, + 67204, + 67232, + 67165, + 67212, + 67181, + 67245, + 67218, + 67202, + 67232, + 67229, + 67273, + 67275, + 67181, + 67180, + 67188, + 67212, + 67175, + 67174, + 67243, + 67244, + 67208, + 67218, + 67208, + 67197, + 67230, + 67206, + 67210, + 67243, + 67196, + 67206, + 67207, + 67262, + 67203, + 67184, + 67214, + 67221, + 67195, + 67243, + 67221, + 67206, + 67234, + 67215, + 67213, + 67208, + 67187, + 67208, + 67221, + 67194, + 67192, + 67236, + 67177, + 67202, + 67224, + 67191, + 67261, + 67209, + 67218, + 67205, + 67213, + 67181, + 67197, + 67184, + 67171, + 67197, + 67201, + 67216, + 67185, + 67221, + 67222, + 67207, + 67184, + 67197, + 67225, + 67262, + 67211, + 67207, + 67228, + 67204, + 67203, + 67215, + 67190, + 67271, + 67235, + 67180, + 67196, + 67216, + 67178, + 67211, + 67223, + 67199, + 67188, + 67211, + 67200, + 67181, + 67227, + 67211, + 67230, + 67211, + 67178, + 67248, + 67191, + 67218, + 67240, + 67252, + 67206, + 67224, + 67211, + 67211, + 67187, + 67210, + 67210, + 67188, + 67194, + 67209, + 67199, + 67183, + 67179, + 67206, + 67189, + 67172, + 67220, + 67175, + 67179, + 67211, + 67225, + 67205, + 67165, + 67201, + 67186, + 67202, + 67240, + 67163, + 67214, + 67214, + 67162, + 67221, + 67188, + 67198, + 67221, + 67214, + 67212, + 67262, + 67201, + 67197, + 67206, + 67217, + 67228, + 67218, + 67209, + 67227, + 67212, + 67236, + 67204, + 67232, + 67242, + 67194, + 67188, + 67214, + 67225, + 67227, + 67222, + 67207, + 67202, + 67186, + 67189, + 67185, + 67189, + 67228, + 67212, + 67212, + 67181, + 67219, + 67166, + 67190, + 67222, + 67202, + 67212, + 67236, + 67202, + 67199, + 67208, + 67175, + 67205, + 67224, + 67215, + 67225, + 67190, + 67212, + 67205, + 67203, + 67277, + 67231, + 67247, + 67226, + 67220, + 67197, + 67233, + 67209, + 67185, + 67198, + 67218, + 67207, + 67203, + 67195, + 67232, + 67201, + 67182, + 67181, + 67197, + 67212, + 67169, + 67181, + 67235, + 67213, + 67225, + 67243, + 67199, + 67221, + 67210, + 67185, + 67194, + 67184, + 67174, + 67176, + 67196, + 67242, + 67201, + 67217, + 67204, + 67213, + 67234, + 67195, + 67269, + 67207, + 67196, + 67230, + 67168, + 67185, + 67218, + 67182, + 67211, + 67186, + 67207, + 67185, + 67192, + 67190, + 67171, + 67247, + 67203, + 67240, + 67255, + 67181, + 67190, + 67235, + 67184, + 67190, + 67249, + 67177, + 67199, + 67197, + 67178, + 67231, + 67210, + 67222, + 67216, + 67194, + 67196, + 67563, + 67225, + 67210, + 67223, + 67212, + 67203, + 67192, + 67236, + 67221, + 67233, + 67214, + 67198, + 67185, + 67211, + 67223, + 67225, + 67264, + 67199, + 67215, + 67153, + 67188, + 67178, + 67201, + 67180, + 67245, + 67192, + 67243, + 67236, + 67229, + 67176, + 67195, + 67202, + 67245, + 67238, + 67226, + 67195, + 67256, + 67219, + 67209, + 67182, + 67220, + 67214, + 67235, + 67245, + 67175, + 67204, + 67177, + 67201, + 67204, + 67168, + 67217, + 67231, + 67256, + 67185, + 67223, + 67235, + 67179, + 67205, + 67183, + 67201, + 67562, + 67207, + 67211, + 67221, + 67207, + 67208, + 67204, + 67221, + 67200, + 67253, + 67210, + 67213, + 67217, + 67213, + 67202, + 67236, + 67182, + 67217, + 67198, + 67208, + 67200, + 67177, + 67260, + 67165, + 67212, + 67268, + 67196, + 67217, + 67199, + 67207, + 67196, + 67194, + 67214, + 67197, + 67244, + 67195, + 67190, + 67185, + 67204, + 67246, + 67189, + 67225, + 67209, + 67216, + 67217, + 67224, + 67234, + 67196, + 67186, + 67181, + 67195, + 67204, + 67211, + 67174, + 67253, + 67221, + 67198, + 67191, + 67215, + 67204, + 67245, + 67172, + 67165, + 67239, + 67227, + 67192, + 67230, + 67214, + 67199, + 67211, + 67240, + 67165, + 67179, + 67182, + 67201, + 67189, + 67172, + 67228, + 67257, + 67161, + 67189, + 67185, + 67243, + 67218, + 67188, + 67300, + 67217, + 67174, + 67218, + 67186, + 67202, + 67196, + 67177, + 67210, + 67220, + 67202, + 67174, + 67226, + 67200, + 67197, + 67190, + 67189, + 67199, + 67209, + 67170, + 67215, + 67246, + 67224, + 67233, + 67210, + 67223, + 67205, + 67215, + 67195, + 67168, + 67255, + 67206, + 67215, + 67192, + 67567, + 67201, + 67204, + 67216, + 67195, + 67210, + 67204, + 67176, + 67222, + 67183, + 67215, + 67207, + 67174, + 67195, + 67204, + 67194, + 67183, + 67248, + 67184, + 67231, + 67175, + 67172, + 67214, + 67209, + 67209, + 67228, + 67217, + 67239, + 67179, + 67166, + 67217, + 67221, + 67187, + 67181, + 67191, + 67245, + 67203, + 67237, + 67224, + 67172, + 67226, + 67245, + 67195, + 67221, + 67272, + 67182, + 67220, + 67255, + 67202, + 67234, + 67217, + 67223, + 67216, + 67203, + 67169, + 67206, + 67273, + 67214, + 67200, + 67238, + 67203, + 67209, + 67204, + 67214, + 67213, + 67190, + 67196, + 67221, + 67182, + 67195, + 67221, + 67217, + 67230, + 67176, + 67177, + 67222, + 67184, + 67221, + 67211, + 67182, + 67213, + 67210, + 67206, + 67227, + 67182, + 67207, + 67234, + 67202, + 67227, + 67218, + 67220, + 67195, + 67220, + 67208, + 67194, + 67221, + 67192, + 67204, + 67220, + 67179, + 67210, + 67222, + 67184, + 67230, + 67213, + 67221, + 67235, + 67210, + 67209, + 67222, + 67208, + 67184, + 67220, + 67231, + 67222, + 67219, + 67224, + 67197, + 67192, + 67240, + 67238, + 67212, + 67212, + 67252, + 67273, + 67257, + 67208, + 67235, + 67184, + 67206, + 67211, + 67235, + 67172, + 67179, + 67232, + 67211, + 67251, + 67207, + 67183, + 67255, + 67208, + 67226, + 67203, + 67211, + 67222, + 67221, + 67263, + 67184, + 67210, + 67224, + 67227, + 67170, + 67237, + 67169, + 67209, + 67217, + 67189, + 67213, + 67244, + 67185, + 67165, + 67197, + 67218, + 67282, + 67214, + 67205, + 67215, + 67216, + 67235, + 67220, + 67206, + 67174, + 67220, + 67214, + 67246, + 67232, + 67185, + 67223, + 67241, + 67178, + 67178, + 67207, + 67264, + 67212, + 67195, + 67255, + 67216, + 67207, + 67205, + 67207, + 67192, + 67227, + 67205, + 67233, + 67199, + 67213, + 67222, + 67198, + 67197, + 67226, + 67218, + 67196, + 67230, + 67242, + 67202, + 67174, + 67208, + 67228, + 67215, + 67188, + 67195, + 67215, + 67275, + 67206, + 67221, + 67219, + 67195, + 67215, + 67226, + 67189, + 67240, + 67198, + 67164, + 67187, + 67214, + 67182, + 67231, + 67207, + 67181, + 67173, + 67193, + 67195, + 67203, + 67248, + 67221, + 67173, + 67186, + 67204, + 67231, + 67227, + 67197, + 67208, + 67197, + 67216, + 67284, + 67242, + 67209, + 67253, + 67189, + 67231, + 67231, + 67183, + 67189, + 67247, + 67214, + 67231, + 67195, + 67198, + 67223, + 67206, + 67199, + 67199, + 67205, + 67213, + 67189, + 67180, + 67209, + 67215, + 67226, + 67218, + 67223, + 67217, + 67181, + 67165, + 67251, + 67188, + 67196, + 67177, + 67254, + 67214, + 67217, + 67211, + 67249, + 67227, + 67231, + 67184, + 67210, + 67221, + 67189, + 67165, + 67214, + 67196, + 67189, + 67177, + 67192, + 67224, + 67214, + 67205, + 67209, + 67178, + 67199, + 67234, + 67187, + 67215, + 67222, + 67200, + 67198, + 67219, + 67213, + 67181, + 67188, + 67192, + 67181, + 67243, + 67249, + 67169, + 67207, + 67234, + 67216, + 67188, + 67202, + 67208, + 67227, + 67302, + 67203, + 67204, + 67208, + 67206, + 67212, + 67202, + 67217, + 67253, + 67208, + 67198, + 67217, + 67226, + 67187, + 67212, + 67205, + 67209, + 67212, + 67204, + 67214, + 67216, + 67231, + 67201, + 67177, + 67202, + 67172, + 67234, + 67200, + 67174, + 67207, + 67212, + 67206, + 67219, + 67249, + 67192, + 67197, + 67243, + 67209, + 67188, + 67197, + 67213, + 67219, + 67224, + 67204, + 67202, + 67205, + 67206, + 67213, + 67204, + 67183, + 67236, + 67216, + 67183, + 67224, + 67269, + 67212, + 67223, + 67194, + 67181, + 67194, + 67215, + 67242, + 67190, + 67219, + 67213, + 67224, + 67598, + 67203, + 67228, + 67253, + 67219, + 67214, + 67205, + 67207, + 67240, + 67231, + 67222, + 67182, + 67200, + 67184, + 67209, + 67218, + 67185, + 67204, + 67243, + 67177, + 67213, + 67210, + 67205, + 67181, + 67267, + 67229, + 67215, + 67216, + 67231, + 67219, + 67198, + 67222, + 67205, + 67181, + 67224, + 67238, + 67222, + 67198, + 67192, + 67267, + 67217, + 67202, + 67171, + 67224, + 67218, + 67220, + 67210, + 67262, + 67253, + 67179, + 67212, + 67233, + 67192, + 67214, + 67216, + 67240, + 67193, + 67181, + 67261, + 67241, + 67204, + 67183, + 67187, + 67207, + 67195, + 67180, + 67214, + 67203, + 67200, + 67187, + 67166, + 67216, + 67175, + 67213, + 67185, + 67221, + 67203, + 67214, + 67216, + 67210, + 67234, + 67183, + 67195, + 67212, + 67208, + 67268, + 67210, + 67195, + 67184, + 67256, + 67598, + 67226, + 67190, + 67204, + 67218, + 67213, + 67214, + 67186, + 67183, + 67202, + 67196, + 67209, + 67245, + 67232, + 67233, + 67240, + 67209, + 67219, + 67200, + 67201, + 67226, + 67190, + 67208, + 67200, + 67232, + 67204, + 67264, + 67179, + 67243, + 67270, + 67169, + 67216, + 67153, + 67195, + 67226, + 67202, + 67200, + 67217, + 67230, + 67227, + 67199, + 67224, + 67193, + 67175, + 67175, + 67188, + 67201, + 67212, + 67192, + 67208, + 67231, + 67238, + 67186, + 67191, + 67184, + 67207, + 67183, + 67170, + 67184, + 67209, + 67280, + 67211, + 67207, + 67193, + 67219, + 67188, + 67209, + 67202, + 67194, + 67227, + 67191, + 67214, + 67208, + 67178, + 67288, + 67167, + 67223, + 67213, + 67198, + 67222, + 67232, + 67238, + 67199, + 67178, + 67237, + 67190, + 67233, + 67243, + 67182, + 67199, + 67481, + 67199, + 67231, + 67213, + 67190, + 67206, + 67290, + 67232, + 67184, + 67189, + 67208, + 67180, + 67209, + 67192, + 67226, + 67238, + 67201, + 67215, + 67218, + 67221, + 67196, + 67213, + 67167, + 67221, + 67224, + 67216, + 67189, + 67174, + 67174, + 67196, + 67194, + 67843, + 67175, + 67216, + 67219, + 67236, + 67250, + 67181, + 67227, + 67203, + 67208, + 67227, + 67179, + 67193, + 67248, + 67225, + 67200, + 67212, + 67233, + 67216, + 67236, + 67209, + 67224, + 67226, + 67192, + 67246, + 67234, + 67228, + 67209, + 67202, + 67225, + 67564, + 67200, + 67200, + 67189, + 67214, + 67222, + 67210, + 67211, + 67221, + 67197, + 67196, + 67228, + 67186, + 67200, + 67186, + 67205, + 67252, + 67206, + 67192, + 67220, + 67298, + 67206, + 67193, + 67247, + 67201, + 67191, + 67191, + 67186, + 67188, + 67221, + 67205, + 67179, + 67225, + 67207, + 67183, + 67202, + 67222, + 67200, + 67213, + 67183, + 67213, + 67204, + 67214, + 67213, + 67211, + 67231, + 67288, + 67234, + 67191, + 67224, + 67219, + 67191, + 67209, + 67250, + 67202, + 67204, + 67229, + 67210, + 67191, + 67240, + 67200, + 67193, + 67191, + 67254, + 67252, + 67205, + 67200, + 67227, + 67211, + 67215, + 67299, + 67230, + 67234, + 67209, + 67241, + 67247, + 67197, + 67203, + 67198, + 67190, + 67198, + 67224, + 67216, + 67198, + 67204, + 67225, + 67241, + 67214, + 67223, + 67192, + 67175, + 67242, + 67224, + 67205, + 67218, + 67192, + 67204, + 67211, + 67179, + 67232, + 67251, + 67178, + 67171, + 67220, + 67206, + 67230, + 67201, + 67237, + 67180, + 67232, + 67279, + 67192, + 67235, + 67236, + 67243, + 67245, + 67177, + 67211, + 67231, + 67216, + 67224, + 67241, + 67191, + 67218, + 67174, + 67230, + 67201, + 67198, + 67270, + 67218, + 67203, + 67220, + 67176, + 67238, + 67209, + 67207, + 67219, + 67215, + 67211, + 67234, + 67205, + 67195, + 67202, + 67235, + 67207, + 67214, + 67203, + 67167, + 67209, + 67210, + 67190, + 67210, + 67225, + 67214, + 67202, + 67240, + 67164, + 67174, + 67277, + 67217, + 67219, + 67256, + 67200, + 67218, + 67181, + 67217, + 67207, + 67221, + 67213, + 67224, + 67233, + 67230, + 67207, + 67269, + 67211, + 67201, + 67169, + 67202, + 67174, + 67197, + 67196, + 67173, + 67217, + 67261, + 67206, + 67271, + 67236, + 67214, + 67240, + 67221, + 67248, + 67295, + 67231, + 67282, + 67192, + 67204, + 67180, + 67265, + 67218, + 67205, + 67237, + 67223, + 67192, + 67213, + 67218, + 67291, + 67219, + 67170, + 67188, + 67278, + 67207, + 67198, + 67202, + 67206, + 67196, + 67278, + 67204, + 67230, + 67192, + 67197, + 67204, + 67184, + 67211, + 67195, + 67241, + 67221, + 67221, + 67261, + 67182, + 67159, + 67192, + 67190, + 67219, + 67194, + 67207, + 67232, + 67258, + 67198, + 67204, + 67248, + 67208, + 67238, + 67255, + 67245, + 67251, + 67255, + 67190, + 67246, + 67278, + 67192, + 67241, + 67221, + 67206, + 67215, + 67226, + 67218, + 67204, + 67208, + 67233, + 67199, + 67234, + 67178, + 67215, + 67211, + 67193, + 67228, + 67202, + 67221, + 67180, + 67244, + 67216, + 67224, + 67189, + 67222, + 67224, + 67229, + 67209, + 67200, + 67269, + 67213, + 67228, + 67246, + 67179, + 67194, + 67209, + 67201, + 67226, + 67201, + 67203, + 67160, + 67249, + 67285, + 67221, + 67299, + 67209, + 67211, + 67259, + 67222, + 67190, + 67389, + 67199, + 67226, + 67194, + 67178, + 67214, + 67212, + 67205, + 67219, + 67223, + 67187, + 67199, + 67256, + 67188, + 67220, + 67229, + 67236, + 67210, + 67221, + 67204, + 67308, + 67191, + 67205, + 67175, + 67270, + 67219, + 67204, + 67202, + 67221, + 67235, + 67310, + 67251, + 67248, + 67202, + 67176, + 67203, + 67197, + 67203, + 67185, + 67205, + 67209, + 67186, + 67232, + 67202, + 67262, + 67231, + 67187, + 67202, + 67205, + 67188, + 67191, + 67228, + 67242, + 67187, + 67211, + 67200, + 67225, + 67244, + 67207, + 67218, + 67211, + 67186, + 67234, + 67185, + 67203, + 67206, + 67218, + 67186, + 67249, + 67230, + 67214, + 67266, + 67181, + 67226, + 67218, + 67265, + 67224, + 67231, + 67196, + 67203, + 67217, + 67236, + 67261, + 67225, + 67237, + 67179, + 67254, + 67270, + 67226, + 67290, + 67214, + 67189, + 67232, + 67186, + 67218, + 67272, + 67186, + 67225, + 67173, + 67175, + 67229, + 67238, + 67198, + 67231, + 67198, + 67208, + 67213, + 67211, + 67211, + 67211, + 67192, + 67211, + 67207, + 67209, + 67256, + 67242, + 67191, + 67236, + 67229, + 67196, + 67266, + 67219, + 67271, + 67233, + 67215, + 67188, + 67196, + 67200, + 67212, + 67241, + 67194, + 67236, + 67184, + 67202, + 67260, + 67189, + 67193, + 67256, + 67234, + 67158, + 67208, + 67280, + 67173, + 67232, + 67223, + 67182, + 67212, + 67192, + 67201, + 67208, + 67230, + 67200, + 67216, + 67226, + 67227, + 67202, + 67191, + 67225, + 67210, + 67247, + 67217, + 67280, + 67231, + 67212, + 67221, + 67208, + 67216, + 67205, + 67242, + 67264, + 67219, + 67228, + 67193, + 67251, + 67235, + 67219, + 67220, + 67222, + 67207, + 67223, + 67263, + 67232, + 67235, + 67231, + 67199, + 67268, + 67214, + 67190, + 67187, + 67184, + 67171, + 67214, + 67180, + 67197, + 67232, + 67213, + 67216, + 67189, + 67181, + 67218, + 67210, + 67226, + 67196, + 67203, + 67208, + 67265, + 67221, + 67227, + 67234, + 67335, + 67254, + 67254, + 67217, + 67200, + 67225, + 67210, + 67220, + 67207, + 67199, + 67235, + 67238, + 67233, + 67204, + 67221, + 67239, + 67199, + 67222, + 67201, + 67203, + 67197, + 67235, + 67212, + 67218, + 67185, + 67189, + 67235, + 67185, + 67213, + 67236, + 67176, + 67187, + 67233, + 67204, + 67205, + 67184, + 67224, + 67194, + 67215, + 67224, + 67208, + 67219, + 67253, + 67228, + 67167, + 67209, + 67259, + 67187, + 67184, + 67210, + 67174, + 67220, + 67195, + 67243, + 67208, + 67262, + 67224, + 67206, + 67250, + 67269, + 67320, + 67260, + 67177, + 67213, + 67263, + 67243, + 67230, + 67250, + 67180, + 67208, + 67211, + 67206, + 67208, + 67211, + 67239, + 67219, + 67209, + 67212, + 67231, + 67218, + 67201, + 67198, + 67225, + 67238, + 67286, + 67246, + 67187, + 67198, + 67214, + 67224, + 67378, + 67226, + 67212, + 67193, + 67223, + 67203, + 67197, + 67198, + 67211, + 67190, + 67168, + 67229, + 67208, + 67237, + 67210, + 67230, + 67188, + 67196, + 67241, + 67207, + 67219, + 67200, + 67200, + 67215, + 67193, + 67201, + 67177, + 67218, + 67199, + 67189, + 67217, + 67189, + 67221, + 67230, + 67218, + 67215, + 67195, + 67246, + 67172, + 67200, + 67247, + 67212, + 67241, + 67186, + 67206, + 67225, + 67216, + 67211, + 67207, + 67181, + 67206, + 67181, + 67204, + 67231, + 67218, + 67211, + 67245, + 67212, + 67241, + 67184, + 67177, + 67220, + 67227, + 67197, + 67208, + 67204, + 67221, + 67219, + 67204, + 67226, + 67207, + 67196, + 67223, + 67196, + 67193, + 67212, + 67219, + 67247, + 67244, + 67257, + 67211, + 67223, + 67211, + 67204, + 67223, + 67219, + 67181, + 67223, + 67239, + 67211, + 67204, + 67281, + 67181, + 67221, + 67202, + 67195, + 67232, + 67204, + 67194, + 67211, + 67187, + 67212, + 67189, + 67248, + 67180, + 67193, + 67195, + 67241, + 67231, + 67232, + 67205, + 67227, + 67233, + 67209, + 67253, + 67262, + 67187, + 67264, + 67238, + 68052, + 67186, + 67222, + 67202, + 67268, + 67215, + 67199, + 67215, + 67223, + 67168, + 67180, + 67194, + 67274, + 67231, + 67228, + 67198, + 67224, + 67223, + 67212, + 67181, + 67260, + 67193, + 67221, + 67248, + 67189, + 67206, + 67184, + 67201, + 67232, + 67258, + 67189, + 67217, + 67232, + 67208, + 67277, + 67212, + 67257, + 67205, + 67250, + 67188, + 67288, + 67187, + 67237, + 67244, + 67231, + 67261, + 67230, + 67207, + 67240, + 67238, + 67219, + 67200, + 67221, + 67234, + 67213, + 67191, + 67229, + 67241, + 67252, + 67185, + 67211, + 67233, + 67194, + 67244, + 67194, + 67227, + 67203, + 67224, + 67187, + 67219, + 67202, + 67243, + 67194, + 67206, + 67271, + 67216, + 67247, + 67223, + 67205, + 67220, + 67197, + 67261, + 67249, + 67237, + 67251, + 67195, + 67218, + 67192, + 67229, + 67233, + 67181, + 67230, + 67228, + 67213, + 67222, + 67211, + 67224, + 67240, + 67229, + 67200, + 67176, + 67237, + 67245, + 67248, + 67229, + 67223, + 67173, + 67256, + 67268, + 67260, + 67235, + 67236, + 67210, + 67183, + 67184, + 67267, + 67214, + 67181, + 67260, + 67213, + 67195, + 67201, + 67170, + 67219, + 67197, + 67167, + 67199, + 67226, + 67241, + 67210, + 67223, + 67200, + 67174, + 67226, + 67234, + 67208, + 67183, + 67233, + 67198, + 67217, + 67253, + 67258, + 67253, + 67204, + 67185, + 67208, + 67244, + 67232, + 67198, + 67206, + 67221, + 67204, + 67213, + 67209, + 67165, + 67210, + 67258, + 67196, + 67231, + 67199, + 67141, + 67209, + 67204, + 67220, + 67220, + 67221, + 67212, + 67210, + 67194, + 67207, + 67208, + 67202, + 67204, + 67228, + 67188, + 67228, + 67241, + 67214, + 67165, + 67555, + 67208, + 67213, + 67181, + 67177, + 67223, + 67250, + 67234, + 67258, + 67285, + 67242, + 67200, + 67179, + 67188, + 67306, + 67239, + 67210, + 67252, + 67221, + 67209, + 67211, + 67192, + 67186, + 67242, + 67215, + 67262, + 67216, + 67224, + 67214, + 67178, + 67192, + 67236, + 67263, + 67218, + 67209, + 67193, + 67171, + 67201, + 67214, + 67220, + 67227, + 67228, + 67204, + 67207, + 67243, + 67211, + 67282, + 67207, + 67218, + 67221, + 67244, + 67278, + 67267, + 67226, + 67199, + 67233, + 67217, + 67243, + 67181, + 67241, + 67243, + 67187, + 67227, + 67219, + 67173, + 67233, + 67232, + 67199, + 67278, + 67224, + 67200, + 67280, + 67240, + 67201, + 67242, + 67255, + 67162, + 67271, + 67221, + 67155, + 67191, + 67178, + 67179, + 67222, + 67200, + 67214, + 67207, + 67217, + 67227, + 67213, + 67193, + 67184, + 67224, + 67232, + 67220, + 67244, + 67225, + 67186, + 67203, + 67222, + 67207, + 67244, + 67212, + 67260, + 67214, + 67262, + 67235, + 67277, + 67201, + 67185, + 67212, + 67231, + 67213, + 67210, + 67202, + 67212, + 67209, + 67227, + 67187, + 67218, + 67233, + 67211, + 67249, + 67223, + 67219, + 67184, + 67190, + 67233, + 67198, + 67185, + 67218, + 67216, + 67186, + 67218, + 67245, + 67262, + 67212, + 67217, + 67190, + 67190, + 67220, + 67217, + 67211, + 67222, + 67229, + 67193, + 67225, + 67201, + 67219, + 67213, + 67194, + 67202, + 67230, + 67293, + 67242, + 67198, + 67188, + 67217, + 67235, + 67256, + 67244, + 67225, + 67212, + 67189, + 67225, + 67212, + 67213, + 67291, + 67238, + 67270, + 67289, + 67230, + 67222, + 67261, + 67210, + 67191, + 67240, + 67233, + 67210, + 67201, + 67438, + 67199, + 67215, + 67210, + 67212, + 67304, + 67206, + 67203, + 67220, + 67262, + 67217, + 67193, + 67205, + 67209, + 67279, + 67256, + 67268, + 67282, + 67209, + 67209, + 67186, + 67218, + 67205, + 67231, + 67178, + 67222, + 67275, + 67217, + 67196, + 67219, + 67239, + 67178, + 67245, + 67218, + 67179, + 67276, + 67214, + 67215, + 67220, + 67194, + 67264, + 67248, + 67197, + 67186, + 67232, + 67234, + 67216, + 67239, + 67202, + 67195, + 67251, + 67200, + 67185, + 67247, + 67246, + 67225, + 67219, + 67218, + 67234, + 67235, + 67265, + 67188, + 67243, + 67187, + 67220, + 67188, + 67216, + 67200, + 67251, + 67273, + 67222, + 67262, + 67225, + 67198, + 67277, + 67199, + 67228, + 67243, + 67204, + 67212, + 67197, + 67238, + 67233, + 67218, + 67208, + 67214, + 67239, + 67192, + 67227, + 67258, + 67186, + 67238, + 67237, + 67218, + 67277, + 67207, + 67181, + 67185, + 67192, + 67185, + 67254, + 67197, + 67233, + 67255, + 67206, + 67222, + 67179, + 67201, + 67226, + 67233, + 67276, + 67244, + 67223, + 67208, + 67195, + 67187, + 67225, + 67222, + 67257, + 67194, + 67189, + 67177, + 67205, + 67251, + 67209, + 67209, + 67221, + 67224, + 67257, + 67203, + 67209, + 67249, + 67200, + 67184, + 67193, + 67194, + 67252, + 67202, + 67216, + 67174, + 67216, + 67254, + 67169, + 67274, + 67267, + 67171, + 67213, + 67212, + 67197, + 67286, + 67192, + 67193, + 67277, + 67257, + 67233, + 67179, + 67188, + 67211, + 67260, + 67218, + 67237, + 67228, + 67256, + 67192, + 67184, + 67205, + 67262, + 67235, + 67200, + 67185, + 67235, + 67220, + 67195, + 67243, + 67219, + 67206, + 67226, + 67230, + 67221, + 67237, + 67215, + 67189, + 67207, + 67211, + 67206, + 67185, + 67215, + 67217, + 67204, + 67198, + 67204, + 67246, + 67224, + 67208, + 67196, + 67192, + 67186, + 67221, + 67213, + 67174, + 67236, + 67252, + 67173, + 67294, + 67247, + 67195, + 67243, + 67259, + 67179, + 67489, + 67215, + 67194, + 67235, + 67218, + 67174, + 67283, + 67189, + 67188, + 67206, + 67271, + 67216, + 67193, + 67213, + 67217, + 67249, + 67185, + 67215, + 67242, + 67225, + 67177, + 67230, + 67214, + 67214, + 67201, + 67185, + 67203, + 67215, + 67209, + 67241, + 67217, + 67208, + 67242, + 67252, + 67204, + 67224, + 67256, + 67170, + 67221, + 67225, + 67184, + 67222, + 67228, + 67188, + 67216, + 67201, + 67188, + 67223, + 67259, + 67208, + 67247, + 67211, + 67234, + 67218, + 67225, + 67186, + 67220, + 67183, + 67214, + 67192, + 67230, + 67210, + 67214, + 67215, + 67249, + 67230, + 67207, + 67166, + 67304, + 67269, + 67281, + 67222, + 67212, + 67217, + 67250, + 67233, + 67272, + 67213, + 67254, + 67203, + 67210, + 67226, + 67236, + 67246, + 67245, + 67225, + 67275, + 67248, + 67238, + 67220, + 67247, + 67215, + 67224, + 67254, + 67256, + 67244, + 67234, + 67246, + 67256, + 67284, + 67239, + 67203, + 67258, + 67223, + 67196, + 67242, + 67190, + 67210, + 67240, + 67220, + 67221, + 67235, + 67216, + 67165, + 67277, + 67230, + 67181, + 67201, + 67249, + 67223, + 67215, + 67204, + 67223, + 67189, + 67191, + 67220, + 67187, + 67222, + 67236, + 67274, + 67227, + 67234, + 67238, + 67219, + 67265, + 67219, + 67237, + 67195, + 67244, + 67204, + 67209, + 67214, + 67213, + 67216, + 67211, + 67234, + 67249, + 67201, + 67261, + 67241, + 67217, + 67206, + 67204, + 67198, + 67265, + 67203, + 67195, + 67198, + 67279, + 67211, + 67242, + 67224, + 67263, + 67282, + 67219, + 67218, + 67252, + 67210, + 67213, + 67226, + 67202, + 67209, + 67264, + 67184, + 67184, + 67209, + 67231, + 67211, + 67228, + 67176, + 67199, + 67235, + 67237, + 67215, + 67278, + 67202, + 67245, + 67211, + 67174, + 67172, + 67208, + 67187, + 67243, + 67176, + 67211, + 67203, + 67185, + 67210, + 67259, + 67191, + 67266, + 67189, + 67242, + 67239, + 67211, + 67240, + 67189, + 67183, + 67212, + 67221, + 67205, + 67248, + 67236, + 67183, + 67184, + 67210, + 67200, + 67181, + 67214, + 67216, + 67247, + 67244, + 67207, + 67259, + 67222, + 67228, + 67287, + 67251, + 67208, + 67212, + 67202, + 67217, + 67236, + 67205, + 67190, + 67191, + 67215, + 67197, + 67237, + 67228, + 67226, + 67220, + 67186, + 67193, + 67189, + 67216, + 67253, + 67215, + 67246, + 67224, + 67226, + 67203, + 67186, + 67233, + 67216, + 67221, + 67211, + 67203, + 67234, + 67229, + 67200, + 67211, + 67240, + 67256, + 67187, + 67198, + 67210, + 67191, + 67231, + 67221, + 67208, + 67208, + 67187, + 67183, + 67208, + 67220, + 67248, + 67262, + 67213, + 67209, + 67219, + 67220, + 67211, + 67218, + 67213, + 67161, + 67199, + 67171, + 67224, + 67224, + 67180, + 67284, + 67235, + 67239, + 67189, + 67194, + 67189, + 67269, + 67192, + 67199, + 67186, + 67266, + 67200, + 67212, + 67192, + 67247, + 67191, + 67241, + 67203, + 67199, + 67217, + 67187, + 67210, + 67241, + 67237, + 67183, + 67290, + 67222, + 67280, + 67235, + 67206, + 67211, + 67248, + 67215, + 67196, + 67267, + 67214, + 67197, + 67203, + 67313, + 67185, + 67226, + 67225, + 67218, + 67215, + 67221, + 67198, + 67228, + 67235, + 67205, + 67197, + 67249, + 67225, + 67245, + 67222, + 67263, + 67171, + 67192, + 67196, + 67205, + 67244, + 67219, + 67224, + 67239, + 67200, + 67260, + 67246, + 67211, + 67193, + 67217, + 67198, + 67183, + 67240, + 67240, + 67220, + 67208, + 67202, + 67221, + 67201, + 67185, + 67197, + 67217, + 67182, + 67215, + 67188, + 67194, + 67174, + 67193, + 67192, + 67229, + 67199, + 67220, + 67206, + 67212, + 67188, + 67210, + 67194, + 67198, + 67222, + 67200, + 67177, + 67211, + 67212, + 67253, + 67222, + 67195, + 67220, + 67174, + 67202, + 67254, + 67211, + 67277, + 67217, + 67256, + 67255, + 67236, + 67190, + 67205, + 67213, + 67216, + 67245, + 67237, + 67400, + 67213, + 67180, + 67204, + 67222, + 67257, + 67204, + 67209, + 67210, + 67227, + 67246, + 67196, + 67203, + 67193, + 67205, + 67229, + 67204, + 67255, + 67252, + 67228, + 67231, + 67205, + 67243, + 67220, + 67225, + 67201, + 67227, + 67245, + 67189, + 67211, + 67195, + 67197, + 67244, + 67226, + 67179, + 67258, + 67217, + 67191, + 67225, + 67184, + 67192, + 67241, + 67240, + 67186, + 67248, + 67202, + 67217, + 67197, + 67232, + 67202, + 67249, + 67202, + 67216, + 67201, + 67185, + 67274, + 67188, + 67213, + 67191, + 67218, + 67209, + 67235, + 67268, + 67252, + 67222, + 67231, + 67254, + 67168, + 67265, + 67247, + 67190, + 67188, + 67253, + 67206, + 67246, + 67236, + 67209, + 67242, + 67191, + 67203, + 67256, + 67227, + 67205, + 67215, + 67222, + 67214, + 67295, + 67200, + 67239, + 67249, + 67197, + 67180, + 67182, + 67189, + 67207, + 67222, + 67221, + 67251, + 67212, + 67232, + 67188, + 67197, + 67208, + 67172, + 67200, + 67213, + 67222, + 67212, + 67212, + 67215, + 67230, + 67235, + 67182, + 67232, + 67251, + 67213, + 67232, + 67246, + 67248, + 67208, + 67233, + 67168, + 67269, + 67223, + 67211, + 67226, + 67225, + 67192, + 67228, + 67224, + 67220, + 67229, + 67197, + 67237, + 67195, + 67226, + 67240, + 67207, + 67237, + 67218, + 67263, + 67217, + 67253, + 67225, + 67247, + 67227, + 67220, + 67218, + 67219, + 67244, + 67213, + 67232, + 67237, + 67198, + 67242, + 67259, + 67218, + 67202, + 67211, + 67208, + 67201, + 67232, + 67206, + 67164, + 67189, + 67239, + 67247, + 67295, + 67270, + 67182, + 67268, + 67209, + 67167, + 67229, + 67223, + 67205, + 67196, + 67206, + 67198, + 67228, + 67247, + 67205, + 67222, + 67187, + 67207, + 67232, + 67212, + 67217, + 67185, + 67223, + 67196, + 67248, + 67214, + 67195, + 67275, + 67224, + 67193, + 67210, + 67221, + 67315, + 67228, + 67204, + 67195, + 67216, + 67255, + 67191, + 67200, + 67217, + 67222, + 67236, + 67277, + 67395, + 67227, + 67189, + 67220, + 67252, + 67250, + 67216, + 67179, + 67248, + 67178, + 67254, + 67221, + 67195, + 67180, + 67218, + 67224, + 67224, + 67185, + 67208, + 67229, + 67216, + 67237, + 67190, + 67213, + 67201, + 67180, + 67229, + 67194, + 67243, + 67226, + 67221, + 67230, + 67221, + 67227, + 67208, + 67188, + 67181, + 67207, + 67245, + 67190, + 67239, + 67231, + 67171, + 67188, + 67188, + 67204, + 67213, + 67273, + 67230, + 67228, + 67204, + 67207, + 67214, + 67213, + 67206, + 67214, + 67217, + 67197, + 67256, + 67203, + 67206, + 67189, + 67249, + 67234, + 67250, + 67255, + 67208, + 67196, + 67242, + 67181, + 67199, + 67211, + 67206, + 67198, + 67218, + 67198, + 67179, + 67250, + 67229, + 67215, + 67248, + 67224, + 67205, + 67236, + 67210, + 67194, + 67211, + 67262, + 67207, + 67258, + 67244, + 67175, + 67206, + 67200, + 67226, + 67611, + 67210, + 67222, + 67235, + 67214, + 67214, + 67245, + 67230, + 67190, + 67213, + 67207, + 67203, + 67250, + 67187, + 67215, + 67203, + 67200, + 67157, + 67245, + 67213, + 67216, + 67194, + 67220, + 67199, + 67214, + 67212, + 67190, + 67231, + 67193, + 67186, + 67208, + 67224, + 67180, + 67217, + 67212, + 67211, + 67209, + 67198, + 67193, + 67212, + 67211, + 67254, + 67201, + 67235, + 67221, + 67184, + 67218, + 67213, + 67190, + 67242, + 67249, + 67181, + 67203, + 67230, + 67209, + 67218, + 67242, + 67208, + 67185, + 67219, + 67180, + 67235, + 67202, + 67215, + 67216, + 67248, + 67229, + 67189, + 67208, + 67207, + 67226, + 67188, + 67229, + 67255, + 67233, + 67186, + 67189, + 67176, + 67190, + 67191, + 67216, + 67185, + 67217, + 67220, + 67173, + 67184, + 67263, + 67243, + 67212, + 67220, + 67574, + 67172, + 67218, + 67227, + 67220, + 67238, + 67243, + 67183, + 67241, + 67259, + 67194, + 67227, + 67253, + 67194, + 67218, + 67168, + 67170, + 67261, + 67212, + 67181, + 67252, + 67230, + 67205, + 67233, + 67214, + 67184, + 67258, + 67238, + 67211, + 67215, + 67205, + 67182, + 67223, + 67196, + 67196, + 67224, + 67199, + 67193, + 67227, + 67186, + 67239, + 67266, + 67252, + 67222, + 67242, + 67197, + 67202, + 67211, + 67175, + 67250, + 67210, + 67246, + 67267, + 67197, + 67188, + 67222, + 67220, + 67214, + 67231, + 67232, + 67225, + 67196, + 67210, + 67223, + 67197, + 67211, + 67204, + 67272, + 67227, + 67256, + 67254, + 67207, + 67207, + 67328, + 67206, + 67221, + 67209, + 67235, + 67211, + 67176, + 67180, + 67179, + 67188, + 67221, + 67219, + 67206, + 67199, + 67210, + 67219, + 67224, + 67209, + 67252, + 67201, + 67220, + 67213, + 67196, + 67268, + 67190, + 67214, + 67212, + 67238, + 67238, + 67228, + 67236, + 67190, + 67165, + 67232, + 67190, + 67206, + 67222, + 67223, + 67171, + 67186, + 67182, + 67248, + 67204, + 67202, + 67212, + 67199, + 67210, + 67186, + 67212, + 67181, + 67268, + 67219, + 67219, + 67225, + 67243, + 67204, + 67173, + 67188, + 67185, + 67193, + 67195, + 67239, + 67224, + 67231, + 67202, + 67206, + 67223, + 67219, + 67198, + 67184, + 67212, + 67214, + 67220, + 67218, + 67178, + 67266, + 67211, + 67229, + 67218, + 67250, + 67202, + 67209, + 67206, + 67242, + 67166, + 67207, + 67221, + 67232, + 67213, + 67230, + 67222, + 67194, + 67200, + 67207, + 67255, + 67200, + 67192, + 67204, + 67170, + 67199, + 67198, + 67232, + 67250, + 67217, + 67189, + 67227, + 67158, + 67351, + 67197, + 67202, + 67254, + 67194, + 67196, + 67213, + 67249, + 67254, + 67216, + 67212, + 67220, + 67268, + 67228, + 67209, + 67203, + 67208, + 67195, + 67210, + 67215, + 67194, + 67175, + 67173, + 67248, + 67188, + 67214, + 67217, + 67209, + 67220, + 67168, + 67198, + 67213, + 67219, + 67222, + 67266, + 67222, + 67202, + 67182, + 67192, + 67256, + 67218, + 67202, + 67207, + 67244, + 67213, + 67218, + 67207, + 67263, + 67239, + 67209, + 67252, + 67194, + 67204, + 67263, + 67212, + 67192, + 67232, + 67213, + 67217, + 67576, + 67221, + 67211, + 67215, + 67213, + 67172, + 67231, + 67239, + 67187, + 67210, + 67203, + 67220, + 67224, + 67230, + 67212, + 67253, + 67240, + 67208, + 67166, + 67218, + 67173, + 67237, + 67211, + 67198, + 67236, + 67213, + 67176, + 67203, + 67200, + 67215, + 67256, + 67299, + 67195, + 67213, + 67190, + 67216, + 67236, + 67242, + 67252, + 67201, + 67220, + 67174, + 67186, + 67266, + 67231, + 67282, + 67267, + 67215, + 67176, + 67242, + 67216, + 67208, + 67187, + 67190, + 67229, + 67249, + 67211, + 67205, + 67224, + 67219, + 67197, + 67744, + 67264, + 67222, + 67207, + 67191, + 67198, + 67247, + 67217, + 67253, + 67221, + 67193, + 67276, + 67217, + 67231, + 67266, + 67196, + 67202, + 67197, + 67220, + 67213, + 67277, + 67231, + 67221, + 67194, + 67241, + 67196, + 67214, + 67206, + 67232, + 67161, + 67236, + 67180, + 67260, + 67250, + 67200, + 67182, + 67254, + 67238, + 67195, + 67249, + 67193, + 67247, + 67271, + 67190, + 67254, + 67186, + 67203, + 67203, + 67253, + 67212, + 67211, + 67225, + 67219, + 67189, + 67196, + 67261, + 67232, + 67216, + 67179, + 67219, + 67221, + 67219, + 67234, + 67216, + 67180, + 67211, + 67203, + 67231, + 67202, + 67280, + 67197, + 67207, + 67172, + 67224, + 67199, + 67206, + 67183, + 67174, + 67193, + 67277, + 67253, + 67214, + 67215, + 67194, + 67244, + 67237, + 67186, + 67239, + 67205, + 67238, + 67239, + 67190, + 67208, + 67239, + 67222, + 67207, + 67207, + 67212, + 67211, + 67224, + 67198, + 67211, + 67215, + 67248, + 67321, + 67207, + 67204, + 67191, + 67255, + 67181, + 67217, + 67239, + 67219, + 67195, + 67226, + 67180, + 67225, + 67203, + 67169, + 67218, + 67641, + 67229, + 67188, + 67200, + 67213, + 67197, + 67201, + 67226, + 67182, + 67258, + 67208, + 67222, + 67223, + 67201, + 67204, + 67168, + 67225, + 67180, + 67205, + 67191, + 67246, + 67200, + 67185, + 67194, + 67229, + 67239, + 67212, + 67200, + 67223, + 67208, + 67197, + 67195, + 67244, + 67226, + 67223, + 67170, + 67195, + 67185, + 67218, + 67190, + 67209, + 67192, + 67194, + 67229, + 67184, + 67210, + 67221, + 67205, + 67284, + 67200, + 67202, + 67199, + 67182, + 67204, + 67202, + 67217, + 67228, + 67200, + 67197, + 67194, + 67263, + 67201, + 67213, + 67269, + 67224, + 67207, + 67196, + 67186, + 67179, + 67221, + 67220, + 67228, + 67221, + 67203, + 67229, + 67255, + 67192, + 67201, + 67197, + 67232, + 67187, + 67227, + 67208, + 67257, + 67211, + 67221, + 67209, + 67260, + 67201, + 67216, + 67258, + 67216, + 67219, + 67201, + 67255, + 67237, + 67233, + 67203, + 67286, + 67233, + 67201, + 67237, + 67222, + 67228, + 67192, + 67179, + 67229, + 67249, + 67213, + 67231, + 67230, + 67192, + 67199, + 67228, + 67227, + 67211, + 67247, + 67209, + 67216, + 67248, + 67206, + 67212, + 67231, + 67271, + 67230, + 67210, + 67199, + 67240, + 67192, + 67262, + 67261, + 67243, + 67213, + 67229, + 67228, + 67179, + 67213, + 67245, + 67219, + 67171, + 67221, + 67261, + 67217, + 67248, + 67271, + 67235, + 67195, + 67254, + 67222, + 67264, + 67204, + 67217, + 67245, + 67243, + 67238, + 67191, + 67241, + 67229, + 67232, + 67209, + 67245, + 67199, + 67239, + 67168, + 67246, + 67231, + 67211, + 67205, + 67224, + 67201, + 67213, + 67256, + 67188, + 67221, + 67236, + 67186, + 67242, + 67264, + 67215, + 67221, + 67273, + 67186, + 67173, + 67213, + 67190, + 67250, + 67264, + 67238, + 67229, + 67186, + 67218, + 67199, + 67234, + 67233, + 67206, + 67232, + 67234, + 67220, + 67208, + 67222, + 67211, + 67198, + 67224, + 67205, + 67229, + 67199, + 67189, + 67218, + 67181, + 67217, + 67199, + 67199, + 67217, + 67265, + 67217, + 67203, + 67198, + 67221, + 67219, + 67211, + 67216, + 67256, + 67207, + 67205, + 67237, + 67212, + 67213, + 67222, + 67223, + 67204, + 67232, + 67236, + 67219, + 67296, + 67229, + 67192, + 67226, + 67206, + 67170, + 67213, + 67199, + 67209, + 67187, + 67220, + 67194, + 67226, + 67184, + 67250, + 67188, + 67307, + 67238, + 67172, + 67200, + 67212, + 67213, + 67227, + 67249, + 67206, + 67230, + 67207, + 67239, + 67215, + 67220, + 67267, + 67208, + 67207, + 67246, + 67200, + 67235, + 67195, + 67236, + 67176, + 67167, + 67252, + 67201, + 67231, + 67268, + 67222, + 67227, + 67275, + 67212, + 67190, + 67193, + 67274, + 67204, + 67184, + 67201, + 67230, + 67242, + 67193, + 67208, + 67185, + 67190, + 67185, + 67250, + 67227, + 67209, + 67199, + 67188, + 67228, + 67207, + 67206, + 67249, + 67176, + 67199, + 67228, + 67271, + 67243, + 67253, + 67212, + 67228, + 67207, + 67239, + 67195, + 67256, + 67189, + 67201, + 67219, + 67292, + 67217, + 67245, + 67235, + 67222, + 67213, + 67208, + 67213, + 67268, + 67228, + 67197, + 67439, + 67175, + 67203, + 67247, + 67261, + 67182, + 67206, + 67177, + 67205, + 67176, + 67188, + 67230, + 67233, + 67290, + 67184, + 67231, + 67224, + 67203, + 67199, + 67195, + 67179, + 67228, + 67216, + 67235, + 67177, + 67217, + 67185, + 67247, + 67195, + 67182, + 67234, + 67217, + 67203, + 67234, + 67209, + 67219, + 67232, + 67238, + 67170, + 67212, + 67202, + 67185, + 67186, + 67268, + 67231, + 67242, + 67200, + 67200, + 67213, + 67263, + 67228, + 67199, + 67217, + 67254, + 67217, + 67194, + 67224, + 67200, + 67187, + 67202, + 67606, + 67235, + 67225, + 67240, + 67271, + 67188, + 67227, + 67193, + 67194, + 67191, + 67195, + 67171, + 67234, + 67281, + 67205, + 67177, + 67206, + 67199, + 67220, + 67178, + 67211, + 67219, + 67214, + 67231, + 67246, + 67193, + 67236, + 67231, + 67203, + 67208, + 67192, + 67195, + 67223, + 67206, + 67191, + 67196, + 67211, + 67229, + 67198, + 67228, + 67201, + 67214, + 67204, + 67224, + 67188, + 67226, + 67201, + 67211, + 67248, + 67190, + 67299, + 67211, + 67218, + 67231, + 67260, + 67184, + 67197, + 67227, + 67253, + 67175, + 67254, + 67237, + 67228, + 67254, + 67198, + 67218, + 67224, + 67188, + 67187, + 67193, + 67190, + 67251, + 67215, + 67200, + 67200, + 67212, + 67247, + 67179, + 67261, + 67262, + 67255, + 67257, + 67222, + 67198, + 67240, + 67192, + 67211, + 67293, + 67212, + 67189, + 67206, + 67190, + 67193, + 67236, + 67207, + 67203, + 67273, + 67203, + 67174, + 67216, + 67191, + 67174, + 67227, + 67237, + 67186, + 67236, + 67231, + 67201, + 67191, + 67202, + 67213, + 67202, + 67210, + 67206, + 67238, + 67246, + 67188, + 67212, + 67224, + 67235, + 67224, + 67224, + 67219, + 67205, + 67221, + 67205, + 67205, + 67202, + 67183, + 67209, + 67191, + 67225, + 67225, + 67218, + 67197, + 67222, + 67215, + 67212, + 67210, + 67224, + 67204, + 67203, + 67181, + 67263, + 67230, + 67211, + 67224, + 67225, + 67184, + 67168, + 67208, + 67181, + 67195, + 67190, + 67183, + 67164, + 67228, + 67225, + 67215, + 67240, + 67218, + 67186, + 67199, + 67248, + 67200, + 67261, + 67199, + 67271, + 67262, + 67252, + 67197, + 67180, + 67209, + 67239, + 67227, + 67222, + 67209, + 67179, + 67221, + 67179, + 67204, + 67265, + 67237, + 67194, + 67212, + 67172, + 67204, + 67227, + 67177, + 67204, + 67229, + 67283, + 67214, + 67237, + 67225, + 67262, + 67256, + 67235, + 67238, + 67207, + 67206, + 67189, + 67264, + 67215, + 67221, + 67220, + 67202, + 67237, + 67200, + 67247, + 67177, + 67259, + 67227, + 67181, + 67197, + 67233, + 67185, + 67211, + 67210, + 67253, + 67227, + 67218, + 67208, + 67228, + 67232, + 67243, + 67180, + 67210, + 67216, + 67222, + 67205, + 67254, + 67221, + 67206, + 67232, + 67235, + 67226, + 67245, + 67185, + 67197, + 67194, + 67246, + 67206, + 67229, + 67251, + 67179, + 67297, + 67261, + 67237, + 67256, + 67210, + 67206, + 67232, + 67223, + 67185, + 67186, + 67222, + 67234, + 67185, + 67211, + 67186, + 67280, + 67232, + 67291, + 67238, + 67179, + 67238, + 67243, + 67160, + 67203, + 67240, + 67216, + 67239, + 67249, + 67213, + 67213, + 67194, + 67225, + 67179, + 67188, + 67240, + 67209, + 67213, + 67220, + 67212, + 67197, + 67200, + 67217, + 67197, + 67206, + 67271, + 67196, + 67210, + 67221, + 67306, + 67218, + 67234, + 67256, + 67297, + 67228, + 67229, + 67208, + 67203, + 67259, + 67197, + 67178, + 67227, + 67204, + 67219, + 67248, + 67227, + 67205, + 67216, + 67201, + 67197, + 67293, + 67185, + 67196, + 67171, + 67249, + 67207, + 67219, + 67241, + 67218, + 67211, + 67204, + 67223, + 67212, + 67181, + 67241, + 67229, + 67249, + 67204, + 67281, + 67216, + 67250, + 67214, + 67228, + 67214, + 67215, + 67203, + 67219, + 67201, + 67197, + 67224, + 67169, + 67209, + 67193, + 67230, + 67251, + 67219, + 67256, + 67212, + 67222, + 67226, + 67219, + 67202, + 67279, + 67208, + 67206, + 67211, + 67248, + 67186, + 67246, + 67216, + 67191, + 67205, + 67291, + 67245, + 67169, + 67194, + 67224, + 67233, + 67260, + 67177, + 67239, + 67217, + 67220, + 67218, + 67275, + 67208, + 67182, + 67189, + 67183, + 67210, + 67242, + 67262, + 67198, + 67181, + 67202, + 67204, + 67198, + 67210, + 67194, + 67229, + 67209, + 67194, + 67198, + 67229, + 67272, + 67221, + 67213, + 67218, + 67277, + 67198, + 67247, + 67191, + 67195, + 67183, + 67220, + 67185, + 67187, + 67220, + 67180, + 67221, + 67197, + 67212, + 67254, + 67257, + 67218, + 67176, + 67241, + 67197, + 67223, + 67243, + 67236, + 67176, + 67185, + 67226, + 67232, + 67193, + 67207, + 67226, + 67207, + 67219, + 67178, + 67165, + 67206, + 67232, + 67194, + 67200, + 67214, + 67229, + 67210, + 67227, + 67196, + 67284, + 67243, + 67192, + 67179, + 67181, + 67216, + 67205, + 67225, + 67227, + 67180, + 67245, + 67197, + 67173, + 67209, + 67187, + 67185, + 67230, + 67240, + 67246, + 67200, + 67211, + 67218, + 67220, + 67237, + 67250, + 67197, + 67215, + 67209, + 67208, + 67196, + 67210, + 67264, + 67255, + 67221, + 67254, + 67217, + 67199, + 67255, + 67227, + 67208, + 67202, + 67278, + 67221, + 67197, + 67196, + 67175, + 67286, + 67185, + 67179, + 67197, + 67207, + 67214, + 67237, + 67242, + 67225, + 67198, + 67189, + 67202, + 67276, + 67220, + 67259, + 67192, + 67225, + 67190, + 67236, + 67202, + 67189, + 67230, + 67258, + 67202, + 67256, + 67195, + 67215, + 67252, + 67214, + 67203, + 67215, + 67243, + 67242, + 67198, + 67229, + 67165, + 67186, + 67206, + 67219, + 67258, + 67211, + 67194, + 67205, + 67186, + 67235, + 67199, + 67237, + 67192, + 67260, + 67217, + 67204, + 67275, + 67203, + 67205, + 67225, + 67200, + 67189, + 67223, + 67205, + 67213, + 67185, + 67239, + 67193, + 67208, + 67200, + 67195, + 67229, + 67179, + 67207, + 67222, + 67253, + 67239, + 67254, + 67194, + 67226, + 67221, + 67227, + 67215, + 67181, + 67192, + 67250, + 67235, + 67212, + 67235, + 67197, + 67213, + 67168, + 67259, + 67181, + 67212, + 67197, + 67221, + 67206, + 67254, + 67232, + 67193, + 67237, + 67195, + 67207, + 67196, + 67208, + 67229, + 67209, + 67250, + 67256, + 67281, + 67185, + 67176, + 67220, + 67216, + 67210, + 67219, + 67251, + 67202, + 67265, + 67189, + 67199, + 67257, + 67204, + 67214, + 67226, + 67240, + 67250, + 67248, + 67186, + 67263, + 67202, + 67228, + 67220, + 67274, + 67211, + 67186, + 67174, + 67218, + 67211, + 67219, + 67234, + 67204, + 67238, + 67217, + 67181, + 67221, + 67176, + 67193, + 67230, + 67213, + 67210, + 67198, + 67181, + 67204, + 67214, + 67234, + 67231, + 67179, + 67222, + 67200, + 67226, + 67236, + 67167, + 67230, + 67210, + 67212, + 67207, + 67184, + 67206, + 67206, + 67233, + 67177, + 67242, + 67228, + 67187, + 67206, + 67271, + 67192, + 67213, + 67214, + 67187, + 67193, + 67263, + 67213, + 67217, + 67271, + 67205, + 67181, + 67191, + 67192, + 67245, + 67259, + 67233, + 67267, + 67204, + 67171, + 67218, + 67227, + 67208, + 67246, + 67267, + 67219, + 67221, + 67241, + 67218, + 67204, + 67170, + 67256, + 67178, + 67206, + 67224, + 67248, + 67215, + 67221, + 67188, + 67232, + 67209, + 67257, + 67223, + 67195, + 67206, + 67260, + 67241, + 67234, + 67184, + 67232, + 67219, + 67220, + 67208, + 67225, + 67179, + 67232, + 67246, + 67201, + 67235, + 67269, + 67175, + 67176, + 67220, + 67240, + 67200, + 67184, + 67189, + 67192, + 67195, + 67298, + 67227, + 67281, + 67259, + 67210, + 67174, + 67191, + 67210, + 67219, + 67194, + 67196, + 67193, + 67193, + 67182, + 67192, + 67414, + 67173, + 67225, + 67218, + 67219, + 67249, + 67245, + 67223, + 67237, + 67316, + 67208, + 67254, + 67187, + 67185, + 67230, + 67224, + 67218, + 67230, + 67229, + 67201, + 67195, + 67217, + 67232, + 67240, + 67208, + 67210, + 67176, + 67226, + 67182, + 67201, + 67238, + 67259, + 67177, + 67206, + 67187, + 67247, + 67251, + 67195, + 67196, + 67277, + 67241, + 67172, + 67202, + 67190, + 67213, + 67207, + 67180, + 67267, + 67213, + 67176, + 67210, + 67222, + 67178, + 67218, + 67192, + 67232, + 67218, + 67261, + 67232, + 67215, + 67189, + 67210, + 67193, + 67202, + 67240, + 67205, + 67210, + 67221, + 67204, + 67215, + 67218, + 67274, + 67234, + 67255, + 67227, + 67196, + 67179, + 67204, + 67184, + 67229, + 67196, + 67221, + 67206, + 67240, + 67221, + 67193, + 67190, + 67237, + 67230, + 67199, + 67171, + 67257, + 67163, + 67196, + 67189, + 67211, + 67246, + 67217, + 67204, + 67214, + 67242, + 67186, + 67219, + 67251, + 67181, + 67258, + 67210, + 67210, + 67193, + 67228, + 67212, + 67243, + 67251, + 67241, + 67239, + 67201, + 67221, + 67194, + 67212, + 67256, + 67191, + 67251, + 67218, + 67252, + 67195, + 67227, + 67705, + 67233, + 67222, + 67241, + 67208, + 67205, + 67223, + 67173, + 67224, + 67205, + 67250, + 67176, + 67209, + 67209, + 67236, + 67202, + 67219, + 67207, + 67181, + 67187, + 67222, + 67213, + 67234, + 67210, + 67185, + 67203, + 67223, + 67187, + 67195, + 67199, + 67232, + 67262, + 67187, + 67264, + 67215, + 67255, + 67184, + 67220, + 67163, + 67216, + 67223, + 67221, + 67214, + 67213, + 67215, + 67242, + 67238, + 67268, + 67244, + 67215, + 67215, + 67185, + 67220, + 67242, + 67218, + 67214, + 67211, + 67203, + 67177, + 67206, + 67224, + 67222, + 67168, + 67232, + 67232, + 67242, + 67230, + 67216, + 67217, + 67236, + 67199, + 67246, + 67196, + 67201, + 67215, + 67206, + 67259, + 67234, + 67186, + 67191, + 67216, + 67234, + 67217, + 67191, + 67227, + 67171, + 67235, + 67210, + 67228, + 67215, + 67183, + 67218, + 67230, + 67193, + 67201, + 67179, + 67204, + 67169, + 67195, + 67234, + 67243, + 67174, + 67203, + 67220, + 67186, + 67241, + 67242, + 67195, + 67223, + 67185, + 67211, + 67277, + 67245, + 67207, + 67234, + 67209, + 67248, + 67219, + 67237, + 67229, + 67207, + 67219, + 67184, + 67231, + 67215, + 67244, + 67201, + 67230, + 67229, + 67205, + 67238, + 67213, + 67239, + 67185, + 67207, + 67194, + 67207, + 67189, + 67171, + 67240, + 67222, + 67212, + 67173, + 67181, + 67198, + 67220, + 67196, + 67241, + 67197, + 67210, + 67202, + 67178, + 67194, + 67244, + 67225, + 67230, + 67230, + 67203, + 67226, + 67214, + 67167, + 67224, + 67211, + 67252, + 67211, + 67250, + 67176, + 67210, + 67214, + 67230, + 67214, + 67271, + 67201, + 67209, + 67177, + 67195, + 67235, + 67193, + 67181, + 67174, + 67216, + 67218, + 67190, + 67183, + 67201, + 67293, + 67216, + 67218, + 67226, + 67247, + 67190, + 67200, + 67263, + 67188, + 67277, + 67258, + 67216, + 67225, + 67190, + 67216, + 67232, + 67207, + 67191, + 67190, + 67196, + 67255, + 67191, + 67231, + 67240, + 67235, + 67226, + 67274, + 67209, + 67249, + 67204, + 67217, + 67226, + 67202, + 67216, + 67227, + 67213, + 67240, + 67175, + 67223, + 67270, + 67217, + 67220, + 67288, + 67201, + 67215, + 67202, + 67241, + 67192, + 67192, + 67224, + 67224, + 67220, + 67193, + 67204, + 67208, + 67217, + 67211, + 67170, + 67219, + 67205, + 67181, + 67199, + 67227, + 67187, + 67226, + 67260, + 67205, + 67209, + 67218, + 67209, + 67217, + 67259, + 67250, + 67199, + 67220, + 67219, + 67273, + 67233, + 67221, + 67217, + 67173, + 67206, + 67231, + 67241, + 67264, + 67189, + 67213, + 67202, + 67217, + 67224, + 67276, + 67209, + 67189, + 67206, + 67198, + 67215, + 67213, + 67216, + 67197, + 67208, + 67258, + 67238, + 67251, + 67212, + 67232, + 67193, + 67233, + 67201, + 67207, + 67235, + 67224, + 67199, + 67216, + 67270, + 67268, + 67236, + 67247, + 67219, + 67225, + 67222, + 67205, + 67243, + 67183, + 67206, + 67243, + 67225, + 67214, + 67286, + 67215, + 67208, + 67238, + 67247, + 67277, + 67263, + 67201, + 67194, + 67251, + 67250, + 67220, + 67204, + 67254, + 67226, + 67210, + 67214, + 67189, + 67228, + 67196, + 67222, + 67221, + 67211, + 67243, + 67189, + 67214, + 67189, + 67236, + 67207, + 67234, + 67206, + 67197, + 67246, + 67196, + 67181, + 67220, + 67210, + 67209, + 67184, + 67240, + 67231, + 67163, + 67205, + 67184, + 67187, + 67209, + 67228, + 67216, + 67245, + 67232, + 67197, + 67218, + 67232, + 67211, + 67207, + 67189, + 67217, + 67227, + 67202, + 67195, + 67201, + 67224, + 67215, + 67249, + 67223, + 67202, + 67188, + 67219, + 67196, + 67199, + 67225, + 67231, + 67223, + 67184, + 67189, + 67251, + 67188, + 67181, + 67281, + 67187, + 67223, + 67171, + 67200, + 67211, + 67215, + 67177, + 67208, + 67215, + 67196, + 67207, + 67206, + 67189, + 67184, + 67212, + 67208, + 67216, + 67220, + 67190, + 67183, + 67196, + 67250, + 67248, + 67220, + 67179, + 67209, + 67240, + 67210, + 67201, + 67204, + 67230, + 67232, + 67227, + 67213, + 67221, + 67190, + 67200, + 67188, + 67250, + 67269, + 67267, + 67230, + 67205, + 67204, + 67187, + 67202, + 67233, + 67216, + 67208, + 67216, + 67208, + 67213, + 67173, + 67250, + 67215, + 67236, + 67181, + 67200, + 67244, + 67219, + 67206, + 67217, + 67231, + 67200, + 67169, + 67228, + 67200, + 67196, + 67269, + 67178, + 67238, + 67186, + 67232, + 67220, + 67242, + 67224, + 67212, + 67179, + 67200, + 67246, + 67246, + 67264, + 67238, + 67205, + 67192, + 67212, + 67206, + 67204, + 67221, + 67231, + 67199, + 67233, + 67216, + 67229, + 67220, + 67195, + 67185, + 67256, + 67183, + 67240, + 67240, + 67173, + 67185, + 67206, + 67245, + 67238, + 67250, + 67210, + 67252, + 67190, + 67239, + 67198, + 67266, + 67238, + 67268, + 67264, + 67212, + 67191, + 67223, + 67237, + 67211, + 67211, + 67178, + 67208, + 67208, + 67202, + 67242, + 67218, + 67208, + 67162, + 67227, + 67190, + 67208, + 67237, + 67196, + 67192, + 67238, + 67244, + 67218, + 67227, + 67210, + 67206, + 67208, + 67190, + 67241, + 67225, + 67302, + 67210, + 67210, + 67208, + 67236, + 67230, + 67193, + 67205, + 67198, + 67198, + 67210, + 67250, + 67238, + 67225, + 67269, + 67208, + 67206, + 67255, + 67267, + 67199, + 67215, + 67202, + 67204, + 67275, + 67232, + 67197, + 67199, + 67202, + 67221, + 67209, + 67211, + 67235, + 67222, + 67237, + 67223, + 67185, + 67232, + 67186, + 67177, + 67229, + 67226, + 67214, + 67220, + 67165, + 67241, + 67222, + 67192, + 67235, + 67208, + 67223, + 67223, + 67204, + 67231, + 67239, + 67240, + 67184, + 67170, + 67193, + 67181, + 67185, + 67175, + 67221, + 67256, + 67246, + 67181, + 67225, + 67197, + 67209, + 67254, + 67226, + 67201, + 67243, + 67210, + 67200, + 67218, + 67173, + 67207, + 67208, + 67262, + 67180, + 67212, + 67218, + 67184, + 67182, + 67234, + 67215, + 67207, + 67176, + 67211, + 67200, + 67209, + 67209, + 67220, + 67202, + 67207, + 67203, + 67239, + 67171, + 67220, + 67178, + 67243, + 67244, + 67191, + 67246, + 67258, + 67238, + 67191, + 67280, + 67220, + 67203, + 67211, + 67243, + 67234, + 67268, + 67218, + 67219, + 67160, + 67227, + 67200, + 67189, + 67277, + 67242, + 67252, + 67211, + 67232, + 67214, + 67238, + 67211, + 67262, + 67170, + 67177, + 67172, + 67221, + 67212, + 67238, + 67179, + 67201, + 67204, + 67190, + 67220, + 67265, + 67189, + 67206, + 67201, + 67227, + 67564, + 67213, + 67229, + 67192, + 67222, + 67272, + 67204, + 67176, + 67193, + 67195, + 67219, + 67189, + 67185, + 67271, + 67242, + 67205, + 67239, + 67225, + 67239, + 67291, + 67259, + 67227, + 67241, + 67212, + 67229, + 67298, + 67178, + 67210, + 67239, + 67195, + 67228, + 67188, + 67193, + 67194, + 67218, + 67215, + 67201, + 67288, + 67231, + 67231, + 67229, + 67218, + 67172, + 67242, + 67217, + 67201, + 67284, + 67248, + 67241, + 67202, + 67228, + 67206, + 67208, + 67190, + 67219, + 67243, + 67181, + 67220, + 67176, + 67210, + 67237, + 67205, + 67284, + 67198, + 67200, + 67218, + 67225, + 67240, + 67205, + 67228, + 67206, + 67197, + 67207, + 67208, + 67203, + 67197, + 67221, + 67269, + 67191, + 67195, + 67188, + 67194, + 67202, + 67257, + 67226, + 67232, + 67191, + 67177, + 67211, + 67242, + 67256, + 67189, + 67175, + 67236, + 67235, + 67197, + 67173, + 67196, + 67197, + 67173, + 67195, + 67226, + 67211, + 67205, + 67212, + 67230, + 67192, + 67224, + 67257, + 67228, + 67203, + 67216, + 67232, + 67201, + 67209, + 67187, + 67208, + 67200, + 67192, + 67210, + 67554, + 67192, + 67226, + 67217, + 67272, + 67214, + 67267, + 67165, + 67195, + 67198, + 67191, + 67237, + 67246, + 67218, + 67183, + 67211, + 67202, + 67181, + 67215, + 67255, + 67223, + 67212, + 67196, + 67225, + 67230, + 67211, + 67227, + 67225, + 67199, + 67212, + 67184, + 67179, + 67188, + 67209, + 67198, + 67211, + 67221, + 67236, + 67196, + 67187, + 67216, + 67215, + 67227, + 67222, + 67211, + 67204, + 67223, + 67191, + 67218, + 67196, + 67230, + 67213, + 67184, + 67246, + 67216, + 67190, + 67207, + 67199, + 67211, + 67275, + 67264, + 67164, + 67173, + 67185, + 67251, + 67220, + 67216, + 67239, + 67180, + 67224, + 67221, + 67191, + 67190, + 67174 + ], + "sample_count": 15277 + }, + { + "pubkey": "CtAqgkKYrfnopFnNh4wJ21QcNZ7vrSyp7EvmmsytYo6", + "epoch": 89, + "origin_device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "target_device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "link_pk": "As7SQm9RggEi1Bp6hpfHMC5TETushYgR7uWbykMZkt4w", + "origin_device_location_pk": "7vt8Tnbk15S6JA1uhRQVtbuL7w39zY8jeQ5iqgjsqLfP", + "target_device_location_pk": "9nJjrDoWWbzhqLka3oHYdj2W3vr2UzUCcjoeCEQ7mAai", + "origin_device_agent_pk": "6LHRkoEGNAPH2fFndCudK94pQU9v5Hk4DEKX253CbNHy", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242127283441, + "samples": [ + 67301, + 67791, + 67307, + 67290, + 67266, + 67330, + 67330, + 67262, + 67294, + 67286, + 67296, + 67280, + 67332, + 67348, + 67297, + 67324, + 67332, + 67273, + 67291, + 67296, + 67298, + 67298, + 67281, + 67270, + 67292, + 67273, + 67338, + 67320, + 67275, + 67279, + 67318, + 67323, + 67295, + 67325, + 67283, + 67286, + 67326, + 67291, + 67302, + 67340, + 67308, + 67312, + 67288, + 67311, + 67277, + 67314, + 67291, + 67306, + 67301, + 67297, + 67324, + 67297, + 67340, + 67306, + 67291, + 67299, + 67329, + 67308, + 67305, + 67266, + 67283, + 67300, + 67298, + 67321, + 67301, + 67286, + 67319, + 67321, + 67313, + 67325, + 67287, + 67288, + 67305, + 67278, + 67274, + 67342, + 67269, + 67290, + 67320, + 67315, + 67290, + 67292, + 67360, + 67352, + 67297, + 67313, + 67288, + 67294, + 67296, + 67322, + 67312, + 67279, + 67288, + 67294, + 67301, + 67282, + 67316, + 67344, + 67317, + 67298, + 67340, + 67301, + 67283, + 67271, + 67300, + 67316, + 67288, + 67303, + 67304, + 67308, + 67275, + 67285, + 67293, + 67263, + 67281, + 67308, + 67312, + 67313, + 67344, + 67329, + 67313, + 67264, + 67328, + 67297, + 67309, + 67279, + 67291, + 67284, + 67294, + 67289, + 67317, + 67321, + 67271, + 67302, + 67316, + 67265, + 67292, + 67337, + 67294, + 67329, + 67288, + 67299, + 67340, + 67287, + 67323, + 67300, + 67305, + 67302, + 67268, + 67291, + 67293, + 67267, + 67312, + 67334, + 67278, + 67361, + 67316, + 67300, + 67302, + 67275, + 67326, + 67299, + 67337, + 67300, + 67315, + 67295, + 67277, + 67289, + 67347, + 67317, + 67280, + 67313, + 67308, + 67322, + 67299, + 67302, + 67301, + 71204, + 67320, + 67297, + 67283, + 67267, + 67274, + 67305, + 67295, + 67305, + 67278, + 67277, + 67269, + 67275, + 67302, + 67293, + 67272, + 67332, + 67274, + 67308, + 67270, + 67314, + 67343, + 67285, + 67301, + 67302, + 67323, + 67285, + 67300, + 67291, + 67322, + 67293, + 67299, + 67278, + 67355, + 67348, + 67312, + 67302, + 67324, + 67319, + 67327, + 67303, + 67332, + 67323, + 67314, + 67353, + 67302, + 67299, + 67313, + 67304, + 67293, + 67326, + 67373, + 67264, + 67321, + 67320, + 67270, + 67302, + 67295, + 67298, + 67305, + 67312, + 67296, + 67297, + 67301, + 67304, + 67332, + 67454, + 67334, + 67320, + 67325, + 67329, + 67292, + 67288, + 67306, + 67305, + 67321, + 67336, + 67288, + 67310, + 67314, + 67313, + 67300, + 67279, + 67287, + 67318, + 67290, + 67315, + 67258, + 67352, + 67342, + 67267, + 67286, + 67321, + 67304, + 67266, + 67306, + 67288, + 67286, + 67324, + 67312, + 67344, + 67323, + 67361, + 67327, + 67324, + 67324, + 67296, + 67277, + 67301, + 67301, + 67305, + 67352, + 67304, + 67302, + 67331, + 67320, + 67322, + 67295, + 67288, + 67291, + 67297, + 67316, + 67299, + 67279, + 67309, + 67313, + 67336, + 67296, + 67314, + 67281, + 67302, + 67316, + 67344, + 67281, + 67303, + 67276, + 67275, + 67322, + 67336, + 67284, + 67277, + 67285, + 67294, + 67321, + 67314, + 67285, + 67331, + 67257, + 67278, + 67269, + 67300, + 67289, + 67255, + 67296, + 67294, + 67279, + 67299, + 67315, + 67306, + 67333, + 67296, + 67319, + 67283, + 67290, + 67296, + 67313, + 67296, + 67258, + 67278, + 67278, + 67274, + 67303, + 67310, + 67318, + 67272, + 67336, + 67299, + 67290, + 67265, + 67304, + 67275, + 67349, + 67304, + 67296, + 67297, + 67331, + 67310, + 67328, + 67285, + 67304, + 67320, + 67336, + 67299, + 67292, + 67330, + 67295, + 67293, + 67328, + 67350, + 67294, + 67305, + 67299, + 67320, + 67296, + 67321, + 67312, + 67330, + 67318, + 67322, + 67272, + 67308, + 67301, + 67327, + 67330, + 67324, + 67263, + 67292, + 67326, + 67313, + 67274, + 67279, + 67336, + 67283, + 67345, + 67309, + 67256, + 67354, + 67285, + 67328, + 67297, + 67292, + 67270, + 67298, + 67305, + 67277, + 67317, + 67301, + 67312, + 67305, + 67306, + 67291, + 67318, + 67258, + 67281, + 67303, + 67319, + 67300, + 67281, + 67290, + 67262, + 67297, + 67278, + 67330, + 67288, + 67275, + 67298, + 67284, + 67324, + 67339, + 67268, + 67293, + 67274, + 67283, + 67292, + 67315, + 67306, + 67289, + 67274, + 67260, + 67306, + 67277, + 67307, + 67281, + 67302, + 67279, + 67303, + 67303, + 67317, + 67309, + 67281, + 67299, + 67324, + 67297, + 67308, + 67294, + 67306, + 67316, + 67332, + 67341, + 67282, + 67276, + 67292, + 67305, + 67300, + 67311, + 67268, + 67316, + 67342, + 67294, + 67292, + 67293, + 67297, + 67291, + 67315, + 67263, + 67285, + 67305, + 67304, + 67327, + 67294, + 67270, + 67302, + 67305, + 67296, + 67383, + 67318, + 67285, + 67315, + 67277, + 67327, + 67348, + 67313, + 67275, + 67275, + 67267, + 67309, + 67294, + 67307, + 67297, + 67291, + 67268, + 67298, + 67294, + 67307, + 67298, + 67272, + 67310, + 67260, + 67350, + 67313, + 67281, + 67290, + 67297, + 67291, + 67275, + 67325, + 67299, + 67308, + 67366, + 67318, + 67275, + 67315, + 67275, + 67314, + 67276, + 67252, + 67277, + 67276, + 67270, + 67282, + 67286, + 67336, + 67273, + 67362, + 67267, + 67312, + 67302, + 67317, + 67313, + 67270, + 67283, + 67304, + 67294, + 67341, + 67265, + 67318, + 67305, + 67268, + 67303, + 67274, + 67315, + 67297, + 67294, + 67303, + 67285, + 67287, + 67307, + 67283, + 67313, + 67283, + 67296, + 67339, + 67321, + 67308, + 67302, + 67302, + 67288, + 67278, + 67277, + 67291, + 67311, + 67254, + 67308, + 67300, + 67314, + 67279, + 67309, + 67329, + 67303, + 67281, + 67298, + 67297, + 67303, + 67294, + 67296, + 67295, + 67318, + 67267, + 67357, + 67335, + 67341, + 67313, + 67336, + 67306, + 67296, + 67290, + 67282, + 67349, + 67324, + 67292, + 67274, + 67294, + 67273, + 67328, + 67282, + 67264, + 67291, + 67308, + 67345, + 67327, + 67335, + 67295, + 67285, + 67278, + 67320, + 67303, + 67293, + 67309, + 67316, + 67314, + 67289, + 67275, + 67287, + 67291, + 67283, + 67317, + 67287, + 67295, + 67307, + 67315, + 67276, + 67281, + 67296, + 67333, + 67263, + 67300, + 67325, + 67269, + 67313, + 67288, + 67281, + 67275, + 67325, + 67302, + 67296, + 67272, + 67306, + 67293, + 67310, + 67323, + 67299, + 67267, + 67322, + 67335, + 67305, + 67292, + 67329, + 67332, + 67263, + 67293, + 67292, + 67338, + 67399, + 67360, + 67358, + 67387, + 67316, + 67299, + 67296, + 67287, + 67319, + 67297, + 67295, + 67272, + 67345, + 67281, + 67319, + 67292, + 67309, + 67316, + 67307, + 67279, + 67311, + 67303, + 67299, + 67290, + 67281, + 67357, + 67333, + 67296, + 67311, + 67274, + 67278, + 67305, + 67273, + 67311, + 67305, + 67279, + 67318, + 67325, + 67334, + 67332, + 67313, + 67279, + 67281, + 67282, + 67328, + 67296, + 67296, + 67315, + 67329, + 67283, + 67308, + 67316, + 67287, + 67283, + 67294, + 67297, + 67313, + 67296, + 67326, + 67319, + 67302, + 67379, + 67311, + 67319, + 67282, + 67281, + 67279, + 67318, + 67286, + 67288, + 67263, + 67286, + 67306, + 67312, + 67306, + 67276, + 67310, + 67307, + 67276, + 67321, + 67327, + 67307, + 67345, + 67303, + 67305, + 67258, + 67298, + 67322, + 67334, + 67288, + 67329, + 67338, + 67328, + 67346, + 67282, + 67299, + 67297, + 67298, + 67292, + 67291, + 67286, + 67296, + 67312, + 67329, + 67295, + 67374, + 68684, + 67274, + 67297, + 67293, + 67292, + 67283, + 67311, + 67314, + 67285, + 67293, + 67311, + 67327, + 67253, + 67306, + 67301, + 67298, + 67289, + 67326, + 67321, + 67288, + 67341, + 67306, + 67315, + 67287, + 67283, + 67316, + 67300, + 67312, + 67278, + 67290, + 67276, + 67291, + 67335, + 67284, + 67276, + 67304, + 67299, + 67270, + 67363, + 67301, + 67276, + 67285, + 67261, + 67299, + 67302, + 67300, + 67309, + 67325, + 67304, + 67318, + 67293, + 67325, + 67331, + 67315, + 67272, + 67335, + 67296, + 67294, + 67322, + 67341, + 67299, + 67339, + 67291, + 67334, + 67312, + 67301, + 67318, + 67305, + 67326, + 67314, + 67336, + 67350, + 67343, + 67319, + 67318, + 67265, + 67324, + 67285, + 67256, + 67271, + 67311, + 67283, + 67279, + 67333, + 67292, + 67286, + 67292, + 67303, + 67289, + 67285, + 67294, + 67246, + 67285, + 67277, + 67315, + 67302, + 67257, + 67283, + 67313, + 67295, + 67412, + 67315, + 67268, + 67270, + 67302, + 67318, + 67303, + 67278, + 67329, + 67536, + 67315, + 67268, + 67308, + 67288, + 67265, + 67331, + 67324, + 67305, + 67330, + 67293, + 67329, + 67304, + 67315, + 67280, + 67304, + 67312, + 67307, + 67260, + 67274, + 67311, + 67317, + 67301, + 67286, + 67312, + 67294, + 67287, + 67319, + 67276, + 67324, + 67301, + 67304, + 67281, + 67264, + 67271, + 67298, + 67324, + 67295, + 67282, + 67323, + 67271, + 67319, + 67286, + 67300, + 67272, + 67326, + 67305, + 67293, + 67297, + 67312, + 67303, + 67303, + 67348, + 67337, + 67332, + 67308, + 67282, + 67328, + 67323, + 67352, + 67301, + 67324, + 67277, + 67310, + 67329, + 67288, + 67288, + 67281, + 67293, + 67329, + 67292, + 67301, + 67292, + 67307, + 67281, + 67291, + 67297, + 67286, + 67296, + 67311, + 67325, + 67315, + 67300, + 67313, + 67304, + 67320, + 67343, + 67289, + 67306, + 67310, + 67281, + 67287, + 67285, + 67342, + 67306, + 67297, + 67283, + 67317, + 67292, + 67266, + 67330, + 67316, + 67273, + 67307, + 67281, + 67292, + 67279, + 67295, + 67278, + 67296, + 67273, + 67306, + 67294, + 67309, + 67321, + 67371, + 67292, + 67347, + 67296, + 67328, + 67321, + 67278, + 67294, + 67313, + 67284, + 67289, + 67321, + 67365, + 67280, + 67287, + 67260, + 67281, + 67345, + 67319, + 67296, + 67296, + 67317, + 67384, + 67277, + 67272, + 67304, + 67321, + 67318, + 67302, + 67306, + 67290, + 67296, + 67329, + 67296, + 67312, + 67284, + 67281, + 67302, + 67283, + 67273, + 67284, + 67305, + 67284, + 67326, + 67290, + 67289, + 67318, + 67307, + 67317, + 67269, + 67273, + 67301, + 67276, + 67276, + 67282, + 67303, + 67302, + 67263, + 67309, + 67318, + 67311, + 67322, + 67308, + 67324, + 67283, + 67284, + 67299, + 67295, + 67300, + 67290, + 67283, + 67307, + 67291, + 67286, + 67315, + 67286, + 67312, + 67280, + 67283, + 67317, + 67316, + 67297, + 67270, + 67302, + 67282, + 67315, + 67319, + 67311, + 67301, + 67309, + 67277, + 67304, + 67304, + 67275, + 67278, + 67310, + 67306, + 67290, + 67320, + 67322, + 67289, + 67291, + 67266, + 67309, + 67322, + 67312, + 67301, + 67287, + 67323, + 67345, + 67312, + 67316, + 67304, + 67290, + 67282, + 67281, + 67333, + 67291, + 67349, + 67274, + 67269, + 67313, + 67341, + 67313, + 67286, + 67332, + 67279, + 67329, + 67345, + 67319, + 67322, + 67298, + 67299, + 67309, + 67285, + 67272, + 67255, + 67296, + 67309, + 67294, + 67332, + 67324, + 67297, + 67313, + 67273, + 67283, + 67328, + 67276, + 67279, + 67297, + 67292, + 67254, + 67305, + 67316, + 67280, + 67331, + 67300, + 67336, + 67280, + 67293, + 67290, + 67282, + 67265, + 67308, + 67314, + 67285, + 67267, + 67307, + 67292, + 67306, + 67308, + 67304, + 67312, + 67265, + 67268, + 67319, + 67307, + 67272, + 67323, + 67307, + 67294, + 67292, + 67277, + 67286, + 67296, + 67321, + 67313, + 67297, + 67304, + 67291, + 67292, + 67320, + 67310, + 67314, + 67343, + 67272, + 67274, + 67304, + 67322, + 67319, + 67300, + 67293, + 67288, + 67286, + 67277, + 67258, + 67314, + 67315, + 67322, + 67293, + 67312, + 67312, + 67328, + 67347, + 67342, + 67269, + 67257, + 67377, + 67266, + 67312, + 67272, + 67294, + 67295, + 67313, + 67268, + 67349, + 67299, + 67264, + 67271, + 67298, + 67340, + 67286, + 67315, + 67283, + 67353, + 67315, + 67306, + 67293, + 67349, + 67279, + 67332, + 67283, + 67303, + 67305, + 67313, + 67299, + 67321, + 67326, + 67302, + 67321, + 67297, + 67319, + 67300, + 67313, + 67314, + 67273, + 67306, + 67321, + 67312, + 67272, + 67395, + 67250, + 67275, + 67304, + 67299, + 67306, + 67297, + 67308, + 67326, + 67299, + 67303, + 67294, + 67309, + 67299, + 67295, + 67284, + 67268, + 67322, + 67297, + 67279, + 67316, + 67325, + 67324, + 67295, + 67325, + 67319, + 67305, + 67285, + 67271, + 67291, + 67299, + 67294, + 67290, + 67271, + 67297, + 67297, + 67296, + 67302, + 67299, + 67303, + 67279, + 67321, + 67303, + 67311, + 67344, + 67403, + 67323, + 67295, + 67316, + 67270, + 67319, + 67288, + 67270, + 67273, + 67316, + 67315, + 67321, + 67325, + 67280, + 67317, + 67303, + 67298, + 67333, + 67292, + 67349, + 67319, + 67325, + 67316, + 67317, + 67340, + 67370, + 67292, + 67304, + 67291, + 67309, + 67257, + 67297, + 67285, + 67309, + 67322, + 67288, + 67309, + 67318, + 67338, + 67309, + 67302, + 67309, + 67291, + 67305, + 67291, + 67304, + 67327, + 67336, + 67318, + 67328, + 67348, + 67303, + 67321, + 67298, + 67290, + 67301, + 67302, + 67348, + 67302, + 67308, + 67341, + 67310, + 67290, + 67259, + 67308, + 67320, + 67285, + 67321, + 67294, + 67326, + 67306, + 67274, + 67268, + 67307, + 67276, + 67316, + 67301, + 67308, + 67272, + 67319, + 67306, + 67278, + 67271, + 67304, + 67287, + 67264, + 67301, + 67332, + 67268, + 67268, + 67304, + 67303, + 67302, + 67295, + 67286, + 67290, + 67313, + 67293, + 67315, + 67270, + 67298, + 67315, + 67310, + 67299, + 67305, + 67322, + 67301, + 67335, + 67312, + 67300, + 67286, + 67329, + 67298, + 67315, + 67288, + 67315, + 67309, + 67296, + 67306, + 67259, + 67331, + 67265, + 67296, + 67287, + 67312, + 67298, + 67302, + 67297, + 67301, + 67265, + 67282, + 67295, + 67304, + 67317, + 67299, + 67333, + 67333, + 67283, + 67287, + 67270, + 67325, + 67338, + 67284, + 67299, + 67287, + 67308, + 67289, + 67304, + 67270, + 67317, + 67285, + 67302, + 67289, + 67289, + 67261, + 67345, + 67306, + 67258, + 67274, + 67268, + 67352, + 67323, + 67292, + 67264, + 67318, + 67265, + 67311, + 67292, + 67261, + 67298, + 67277, + 67325, + 67310, + 67307, + 67305, + 67322, + 67320, + 67319, + 67332, + 67306, + 67315, + 67305, + 67284, + 67313, + 67297, + 67304, + 67308, + 67288, + 67336, + 67279, + 67294, + 67335, + 67285, + 67291, + 67318, + 67355, + 67294, + 67274, + 67305, + 67287, + 67279, + 67310, + 67279, + 67320, + 67288, + 67284, + 67307, + 67290, + 67400, + 67329, + 67303, + 67279, + 67346, + 67328, + 67276, + 67300, + 67324, + 67286, + 67279, + 67309, + 67294, + 67592, + 67282, + 67286, + 67282, + 67300, + 67291, + 67271, + 67288, + 67276, + 67302, + 67304, + 67351, + 67282, + 67265, + 67271, + 67340, + 67293, + 67262, + 67310, + 67292, + 67307, + 67291, + 67304, + 67336, + 67282, + 67295, + 67277, + 67275, + 67313, + 67303, + 67285, + 67268, + 67339, + 67304, + 67333, + 67282, + 67304, + 67334, + 67308, + 67378, + 67344, + 67310, + 67318, + 67293, + 67403, + 67294, + 67329, + 67300, + 67370, + 67292, + 67275, + 67296, + 67302, + 67312, + 67305, + 67313, + 67290, + 67315, + 67301, + 67286, + 67311, + 67320, + 67366, + 67334, + 67282, + 67269, + 67312, + 67294, + 67306, + 67293, + 67317, + 67285, + 67320, + 67295, + 67341, + 67313, + 67326, + 67288, + 67265, + 67321, + 67301, + 67325, + 67283, + 67277, + 67322, + 67292, + 67272, + 67294, + 67380, + 67292, + 67287, + 67318, + 67289, + 67298, + 67303, + 67394, + 67302, + 67260, + 67294, + 67278, + 67275, + 67311, + 67316, + 67322, + 67302, + 67298, + 67287, + 67275, + 67313, + 67273, + 67312, + 67285, + 67284, + 67288, + 67317, + 67307, + 67294, + 67258, + 67326, + 67273, + 67315, + 67289, + 67299, + 67289, + 67293, + 67266, + 67276, + 67286, + 67267, + 67322, + 67301, + 67335, + 67334, + 67306, + 67293, + 67314, + 67292, + 67307, + 67285, + 67330, + 67337, + 67330, + 67306, + 67310, + 67305, + 67303, + 67270, + 67301, + 67342, + 67285, + 67312, + 67311, + 67339, + 67302, + 67774, + 67287, + 67299, + 67287, + 67313, + 67344, + 67258, + 67299, + 67344, + 67296, + 67325, + 67298, + 67313, + 67307, + 67306, + 67323, + 67309, + 67263, + 67263, + 67349, + 67297, + 67273, + 67305, + 67304, + 67293, + 67302, + 67411, + 67321, + 67287, + 67298, + 67292, + 67315, + 67315, + 67337, + 67315, + 67310, + 67318, + 67304, + 67285, + 67327, + 67294, + 67296, + 67277, + 67300, + 67278, + 67274, + 67260, + 67329, + 67269, + 67322, + 67292, + 67328, + 67291, + 67307, + 67313, + 67295, + 67326, + 67300, + 67315, + 67296, + 67322, + 67302, + 67287, + 67263, + 67317, + 67299, + 67311, + 67309, + 67277, + 67297, + 67267, + 67279, + 67263, + 67307, + 67276, + 67286, + 67301, + 67255, + 67307, + 67314, + 67324, + 67298, + 67337, + 67314, + 67344, + 67281, + 67294, + 67299, + 67306, + 67300, + 67297, + 67311, + 67287, + 67292, + 67297, + 67307, + 67292, + 67278, + 67324, + 67308, + 67320, + 67334, + 67285, + 67304, + 67306, + 67337, + 67259, + 67322, + 67299, + 67255, + 67312, + 67294, + 67329, + 67308, + 67269, + 67318, + 67299, + 67313, + 67303, + 67336, + 67294, + 67319, + 67322, + 67321, + 67282, + 67280, + 67337, + 67290, + 67300, + 67285, + 67307, + 67273, + 67322, + 67298, + 67674, + 67294, + 67322, + 67307, + 67296, + 67292, + 67299, + 67308, + 67295, + 67299, + 67295, + 67302, + 67269, + 67309, + 67303, + 67271, + 67296, + 67303, + 67287, + 67293, + 67287, + 67296, + 67300, + 67307, + 67312, + 67298, + 67258, + 67286, + 67313, + 67255, + 67288, + 67343, + 67281, + 67291, + 67274, + 67257, + 67345, + 67332, + 67273, + 67308, + 67327, + 67292, + 67321, + 67262, + 67308, + 67276, + 67280, + 67314, + 67292, + 67309, + 67272, + 67282, + 67287, + 67285, + 67286, + 67280, + 67297, + 67357, + 67277, + 67299, + 67278, + 67290, + 67287, + 67273, + 67310, + 67304, + 67297, + 67340, + 67301, + 67324, + 67303, + 67276, + 67334, + 67308, + 67271, + 67300, + 67323, + 67283, + 67328, + 67339, + 67262, + 67294, + 67290, + 67340, + 67332, + 67291, + 67282, + 67304, + 67292, + 67266, + 67313, + 67299, + 67279, + 67317, + 67256, + 67330, + 67291, + 67314, + 67299, + 67265, + 67302, + 67284, + 67312, + 67278, + 67279, + 67336, + 67267, + 67316, + 67260, + 67259, + 67288, + 67289, + 67284, + 67295, + 67342, + 67313, + 67311, + 67285, + 67296, + 67299, + 67262, + 67307, + 67281, + 67300, + 67361, + 67315, + 67298, + 67326, + 67293, + 67315, + 67327, + 67321, + 67326, + 67326, + 67301, + 67266, + 67294, + 67273, + 67281, + 67300, + 67299, + 67285, + 67272, + 67315, + 67303, + 67284, + 67290, + 67335, + 67323, + 67298, + 67328, + 67306, + 67274, + 67318, + 67288, + 67302, + 67293, + 67286, + 67313, + 67314, + 67314, + 67313, + 67316, + 67307, + 67344, + 67348, + 67308, + 67284, + 67339, + 67286, + 67290, + 67312, + 67291, + 67324, + 67317, + 67272, + 67301, + 67287, + 67287, + 67296, + 67295, + 67277, + 67280, + 67357, + 67280, + 67432, + 67299, + 67307, + 67319, + 67282, + 67315, + 67328, + 67348, + 67303, + 67303, + 67285, + 67347, + 67338, + 67295, + 67261, + 67312, + 67305, + 67290, + 67282, + 67304, + 67279, + 67271, + 67306, + 67318, + 67317, + 67330, + 67340, + 67349, + 67283, + 67262, + 67295, + 67281, + 67330, + 67305, + 67334, + 67293, + 67310, + 67287, + 67346, + 67304, + 67279, + 67291, + 67299, + 67312, + 67305, + 67352, + 67338, + 67327, + 67296, + 67291, + 67344, + 67261, + 67293, + 67275, + 67267, + 67264, + 67277, + 67270, + 67271, + 67296, + 67312, + 67303, + 67316, + 67297, + 67289, + 67288, + 67290, + 67329, + 67313, + 67269, + 67301, + 67301, + 67286, + 67383, + 67293, + 67302, + 67289, + 67300, + 67393, + 67275, + 67290, + 67273, + 67318, + 67257, + 67317, + 67294, + 67301, + 67303, + 67303, + 67301, + 67282, + 67319, + 67263, + 67277, + 67328, + 67287, + 67306, + 67305, + 67300, + 67318, + 67295, + 67269, + 67328, + 67273, + 67264, + 67315, + 67303, + 67283, + 67313, + 67305, + 67281, + 67287, + 67266, + 67319, + 67319, + 67297, + 67323, + 67318, + 67267, + 67281, + 67298, + 67293, + 67292, + 67316, + 67321, + 67304, + 67313, + 67308, + 67352, + 67285, + 67256, + 67274, + 67292, + 67311, + 67268, + 67310, + 67313, + 67321, + 67319, + 67363, + 67258, + 67272, + 67328, + 67300, + 67293, + 67318, + 67322, + 67319, + 67292, + 67316, + 67318, + 67326, + 67331, + 67286, + 67277, + 67336, + 67277, + 67285, + 67278, + 67295, + 67311, + 67284, + 67310, + 67276, + 67327, + 67304, + 67341, + 67281, + 67312, + 67311, + 67269, + 67274, + 67315, + 67304, + 67286, + 67271, + 67271, + 67281, + 67266, + 67349, + 67337, + 67341, + 67277, + 67287, + 67301, + 67309, + 67317, + 67305, + 67307, + 67344, + 67298, + 67304, + 67296, + 67267, + 67291, + 67325, + 67319, + 67285, + 67294, + 67292, + 67281, + 67324, + 67314, + 67300, + 67285, + 67305, + 67313, + 67365, + 67326, + 67272, + 67312, + 67340, + 67313, + 67307, + 67325, + 67286, + 67315, + 67313, + 67343, + 67291, + 67325, + 67262, + 67291, + 67332, + 67314, + 67305, + 67299, + 67344, + 67331, + 67297, + 67266, + 67311, + 67310, + 67310, + 67294, + 67282, + 67266, + 67287, + 67295, + 67347, + 67303, + 67289, + 67381, + 67334, + 67305, + 67324, + 67307, + 67369, + 67301, + 67326, + 67313, + 67280, + 67288, + 67294, + 67298, + 67278, + 67269, + 67317, + 67262, + 67270, + 67313, + 67290, + 67287, + 67302, + 67325, + 67292, + 67351, + 67291, + 67280, + 67290, + 67289, + 67301, + 67293, + 67316, + 67282, + 67311, + 67281, + 67308, + 67319, + 67310, + 67297, + 67267, + 67323, + 67299, + 67337, + 67367, + 67320, + 67327, + 67306, + 67312, + 67304, + 67326, + 67350, + 67296, + 67287, + 67305, + 67290, + 67318, + 67266, + 67253, + 67286, + 67313, + 67278, + 67345, + 67327, + 67330, + 67322, + 67307, + 67290, + 67287, + 67318, + 67296, + 67254, + 67327, + 67287, + 67274, + 67287, + 67266, + 67293, + 67275, + 67275, + 67321, + 67290, + 67319, + 67316, + 67277, + 67282, + 67319, + 67336, + 67286, + 67314, + 67305, + 67302, + 67311, + 67323, + 67359, + 67298, + 67274, + 67295, + 67311, + 67300, + 67311, + 67316, + 67324, + 67315, + 67290, + 67317, + 67299, + 67280, + 67318, + 67312, + 67320, + 67299, + 67286, + 67309, + 67282, + 67318, + 67314, + 67261, + 67303, + 67318, + 67368, + 67336, + 67278, + 67301, + 67309, + 67332, + 67306, + 67334, + 67311, + 67300, + 67300, + 67339, + 67282, + 67285, + 67296, + 67290, + 67321, + 67322, + 67288, + 67315, + 67286, + 67280, + 67335, + 67328, + 67320, + 67261, + 67309, + 67273, + 67396, + 67289, + 67298, + 67309, + 67314, + 67284, + 67319, + 67301, + 67282, + 67292, + 67299, + 67297, + 67298, + 67323, + 67279, + 67282, + 67318, + 67301, + 67313, + 67306, + 67309, + 67278, + 67284, + 67308, + 67313, + 67300, + 67290, + 67336, + 67313, + 67314, + 67259, + 67314, + 67332, + 67341, + 67352, + 67279, + 67319, + 67304, + 67294, + 67281, + 67307, + 67277, + 67307, + 67316, + 67303, + 67299, + 67325, + 67274, + 67311, + 67299, + 67306, + 67281, + 67292, + 67302, + 67260, + 67306, + 67325, + 67274, + 67291, + 67314, + 67315, + 67334, + 67277, + 67295, + 67299, + 67355, + 67311, + 67268, + 67341, + 67308, + 67277, + 67297, + 67307, + 67320, + 67287, + 67300, + 67307, + 67326, + 67307, + 67326, + 67322, + 67303, + 67296, + 67299, + 67283, + 67305, + 67304, + 67301, + 67313, + 67275, + 67297, + 67335, + 67304, + 67315, + 67305, + 67290, + 67294, + 67321, + 67316, + 67263, + 67294, + 67301, + 67320, + 67267, + 67312, + 67328, + 67303, + 67268, + 67299, + 67309, + 67303, + 67289, + 67305, + 67333, + 67283, + 67307, + 67312, + 67278, + 67302, + 67281, + 67299, + 67263, + 67314, + 67307, + 67302, + 67297, + 67301, + 67286, + 67288, + 67319, + 67319, + 67296, + 67449, + 67320, + 67290, + 67291, + 67287, + 67294, + 67308, + 67312, + 67286, + 67307, + 67338, + 67261, + 67301, + 67317, + 67281, + 67298, + 67290, + 67298, + 67301, + 67286, + 67311, + 67317, + 67294, + 67269, + 67292, + 67308, + 67308, + 67344, + 67315, + 67307, + 67335, + 67323, + 67343, + 67301, + 67338, + 67333, + 67339, + 67376, + 67312, + 67310, + 67331, + 67308, + 67303, + 67355, + 67336, + 67330, + 67299, + 67321, + 67333, + 67281, + 67312, + 67284, + 67287, + 67302, + 67323, + 67265, + 67312, + 67305, + 67281, + 67319, + 67309, + 67360, + 67323, + 67328, + 67327, + 67324, + 67286, + 67308, + 67300, + 67308, + 67270, + 67295, + 67314, + 67288, + 67305, + 67277, + 67318, + 67290, + 67276, + 67261, + 67286, + 67312, + 67279, + 67281, + 67267, + 67345, + 67265, + 67277, + 67308, + 67291, + 67302, + 67268, + 67291, + 67301, + 67312, + 67284, + 67287, + 67315, + 67342, + 67311, + 67312, + 67300, + 67266, + 67306, + 67327, + 67262, + 67296, + 67287, + 67308, + 67298, + 67299, + 67311, + 67344, + 67272, + 67295, + 67314, + 67409, + 67313, + 67331, + 67303, + 67294, + 67305, + 67323, + 67283, + 67320, + 67298, + 67329, + 67309, + 67284, + 67279, + 67291, + 67340, + 67299, + 67301, + 67279, + 67364, + 67276, + 67302, + 67306, + 67315, + 67304, + 67318, + 67361, + 67310, + 67296, + 67302, + 67280, + 67278, + 67286, + 67270, + 67290, + 67290, + 67291, + 67306, + 67312, + 67278, + 67331, + 67284, + 67257, + 67308, + 67319, + 67284, + 67359, + 67286, + 67318, + 67334, + 67323, + 67310, + 67282, + 67337, + 67299, + 67295, + 67290, + 67318, + 67302, + 67284, + 67348, + 67272, + 67326, + 67276, + 67300, + 67294, + 67317, + 67361, + 67302, + 67292, + 67302, + 67281, + 67299, + 67290, + 67313, + 67288, + 67313, + 67309, + 67274, + 67284, + 67290, + 67329, + 67340, + 67333, + 67303, + 67298, + 67310, + 67312, + 67277, + 67287, + 67295, + 67312, + 67300, + 67300, + 67286, + 67284, + 67277, + 67270, + 67288, + 67290, + 67327, + 67334, + 67292, + 67287, + 67282, + 67270, + 67334, + 67293, + 67288, + 67318, + 67338, + 67317, + 67326, + 67274, + 67280, + 67292, + 67333, + 67312, + 67326, + 67279, + 67255, + 67326, + 67294, + 67263, + 67274, + 67293, + 67270, + 67311, + 67304, + 67301, + 67281, + 67312, + 67364, + 67295, + 67388, + 67341, + 67320, + 67274, + 67315, + 67314, + 67288, + 67299, + 67306, + 67340, + 67310, + 67270, + 67304, + 67279, + 67306, + 67306, + 67287, + 67298, + 67319, + 67318, + 67288, + 67302, + 67344, + 67306, + 67365, + 67331, + 67323, + 67295, + 67322, + 67324, + 67274, + 67306, + 67307, + 67306, + 67289, + 67278, + 67307, + 67276, + 67330, + 67319, + 67299, + 67293, + 67295, + 67273, + 67311, + 67330, + 67297, + 67286, + 67260, + 67305, + 67295, + 67290, + 67278, + 67300, + 67311, + 67301, + 67322, + 67264, + 67260, + 67270, + 67276, + 67326, + 67329, + 67293, + 67283, + 67341, + 67286, + 67290, + 67287, + 67345, + 67329, + 67325, + 67333, + 67336, + 67300, + 67297, + 67298, + 67325, + 67345, + 67319, + 67276, + 67283, + 67294, + 67287, + 67339, + 67324, + 67332, + 67342, + 67324, + 67304, + 67309, + 67315, + 67284, + 67277, + 67309, + 67299, + 67307, + 67293, + 67286, + 67309, + 67301, + 67320, + 67287, + 67364, + 67325, + 67317, + 67329, + 67295, + 67295, + 67323, + 67325, + 67347, + 67318, + 67281, + 67290, + 67304, + 67329, + 67302, + 67280, + 67324, + 67273, + 67273, + 67291, + 67268, + 67283, + 67314, + 67264, + 67262, + 67298, + 67292, + 67310, + 67347, + 67320, + 67309, + 67265, + 67300, + 67262, + 67285, + 67290, + 67275, + 67296, + 67293, + 67290, + 67298, + 67298, + 67289, + 67336, + 67351, + 67326, + 67315, + 67325, + 67339, + 67294, + 67346, + 67327, + 67351, + 67338, + 67355, + 67319, + 67319, + 67298, + 67321, + 67323, + 67316, + 67311, + 67320, + 67293, + 67331, + 67278, + 67289, + 67285, + 67418, + 67289, + 67309, + 67300, + 67319, + 67303, + 67323, + 67278, + 67273, + 67251, + 67279, + 67285, + 67258, + 67310, + 67294, + 67299, + 67310, + 67269, + 67294, + 67288, + 67338, + 67340, + 67296, + 67289, + 67279, + 67314, + 67308, + 67305, + 67273, + 67314, + 67299, + 67252, + 67294, + 67304, + 67285, + 67302, + 67314, + 67346, + 67341, + 67323, + 67310, + 67290, + 67287, + 67306, + 67298, + 67282, + 67304, + 67260, + 67329, + 67295, + 67321, + 67262, + 67289, + 67279, + 67305, + 67330, + 67316, + 67316, + 67319, + 67269, + 67279, + 67301, + 67320, + 67287, + 67312, + 67305, + 67301, + 67308, + 67290, + 67307, + 67286, + 67355, + 67275, + 67362, + 67284, + 67301, + 67266, + 67269, + 67319, + 67289, + 67269, + 67300, + 67283, + 67294, + 67285, + 67269, + 67327, + 67321, + 67319, + 67308, + 67306, + 67337, + 67306, + 67310, + 67308, + 67316, + 67315, + 67307, + 67308, + 67307, + 67268, + 67293, + 67284, + 67284, + 67305, + 67321, + 67272, + 67337, + 67329, + 67303, + 67278, + 67318, + 67304, + 67294, + 67307, + 67308, + 67325, + 67324, + 67287, + 67310, + 67273, + 67333, + 67303, + 67313, + 67269, + 67310, + 67320, + 67322, + 67293, + 67328, + 67338, + 67325, + 67333, + 67293, + 67318, + 67312, + 67287, + 67319, + 67304, + 67296, + 67291, + 67297, + 67271, + 67324, + 67315, + 67317, + 67270, + 67272, + 67289, + 67343, + 67305, + 67331, + 67329, + 67282, + 67281, + 67292, + 67314, + 67336, + 67302, + 67303, + 67314, + 67319, + 67330, + 67326, + 67302, + 67345, + 67332, + 67283, + 67282, + 67270, + 67295, + 67318, + 67285, + 67311, + 67254, + 67275, + 67264, + 67285, + 67272, + 67291, + 67311, + 67315, + 67266, + 67338, + 67324, + 67297, + 67310, + 67261, + 67312, + 67332, + 67336, + 67310, + 67327, + 67299, + 67345, + 67334, + 67323, + 67318, + 67292, + 67266, + 67315, + 67285, + 67316, + 67259, + 67274, + 67309, + 67272, + 67289, + 67278, + 67328, + 67303, + 67308, + 67282, + 67295, + 67274, + 67288, + 67299, + 67291, + 67345, + 67306, + 67302, + 67308, + 67291, + 67311, + 67312, + 67325, + 67275, + 67282, + 67297, + 67290, + 67292, + 67321, + 67279, + 67284, + 67314, + 67292, + 67365, + 67309, + 67315, + 67264, + 67287, + 67300, + 67307, + 67326, + 67312, + 67310, + 67288, + 67313, + 67319, + 67298, + 67281, + 67286, + 67295, + 67315, + 67337, + 67341, + 67307, + 67303, + 67259, + 67321, + 67299, + 67306, + 67292, + 67303, + 67305, + 67303, + 67296, + 67300, + 67323, + 67312, + 67282, + 67333, + 67341, + 67283, + 67289, + 67302, + 67290, + 67285, + 67291, + 67296, + 67337, + 67319, + 67291, + 67311, + 67273, + 67307, + 67288, + 67307, + 67267, + 67286, + 67304, + 67289, + 67301, + 67297, + 67313, + 67286, + 67279, + 67308, + 67303, + 67314, + 67278, + 67375, + 67290, + 67331, + 67292, + 67276, + 67280, + 67279, + 67361, + 67292, + 67319, + 67286, + 67282, + 67301, + 67357, + 67313, + 67279, + 67321, + 67357, + 67318, + 67335, + 67313, + 67270, + 67298, + 67285, + 67307, + 67296, + 67293, + 67282, + 67288, + 67280, + 67270, + 67285, + 67291, + 67269, + 67287, + 67289, + 67278, + 67305, + 67290, + 67344, + 67279, + 67312, + 67284, + 67367, + 67322, + 67320, + 67304, + 67275, + 67274, + 67285, + 67269, + 67309, + 67286, + 67308, + 67297, + 67330, + 67279, + 67324, + 67270, + 67325, + 67306, + 67284, + 67313, + 67285, + 67312, + 67290, + 67285, + 67305, + 67372, + 67336, + 67348, + 67329, + 67293, + 67318, + 67310, + 67304, + 67292, + 67278, + 67301, + 67332, + 67293, + 67299, + 67303, + 67279, + 67257, + 67279, + 67305, + 67272, + 67303, + 67324, + 67300, + 67345, + 67334, + 67273, + 67301, + 67283, + 67262, + 67293, + 67313, + 67317, + 67279, + 67302, + 67323, + 67262, + 67295, + 67332, + 67328, + 67320, + 67293, + 67314, + 67271, + 67326, + 67305, + 67291, + 67316, + 67268, + 67298, + 67278, + 67281, + 67296, + 67310, + 67291, + 67322, + 67314, + 67286, + 67298, + 67328, + 67300, + 67290, + 67318, + 67285, + 67366, + 67268, + 67318, + 67350, + 67328, + 67309, + 67322, + 67306, + 67263, + 67294, + 67287, + 67297, + 67262, + 67288, + 67283, + 67279, + 67303, + 67273, + 67281, + 67289, + 67317, + 67336, + 67293, + 67264, + 67288, + 67304, + 67321, + 67329, + 67258, + 67287, + 67287, + 67336, + 67323, + 67304, + 67290, + 67285, + 67292, + 67329, + 67292, + 67285, + 67376, + 67303, + 67322, + 67304, + 67308, + 67337, + 67273, + 67290, + 67319, + 67288, + 67285, + 67282, + 67288, + 67293, + 67330, + 67276, + 67286, + 67283, + 67328, + 67280, + 67305, + 67298, + 67327, + 67319, + 67280, + 67272, + 67310, + 67282, + 67344, + 67335, + 67345, + 67280, + 67317, + 67289, + 67304, + 67299, + 67284, + 67312, + 67292, + 67264, + 67301, + 67266, + 67312, + 67286, + 67290, + 67303, + 67275, + 67300, + 67279, + 67317, + 67354, + 67291, + 67304, + 67304, + 67309, + 67313, + 67293, + 67263, + 67275, + 67291, + 67283, + 67294, + 67295, + 67282, + 67300, + 67293, + 67302, + 67320, + 67266, + 67309, + 67285, + 67313, + 67342, + 67273, + 67273, + 67318, + 67294, + 67290, + 67305, + 67267, + 67258, + 67319, + 67303, + 67287, + 67326, + 67311, + 67252, + 67294, + 67304, + 67300, + 67269, + 67266, + 67306, + 67306, + 67293, + 67411, + 67372, + 67321, + 67319, + 67310, + 67304, + 67290, + 67289, + 67291, + 67291, + 67271, + 67277, + 67272, + 67331, + 67287, + 67320, + 67291, + 67272, + 67279, + 67282, + 67318, + 67310, + 67290, + 67290, + 67287, + 67276, + 67247, + 67283, + 67361, + 67300, + 67285, + 67282, + 67282, + 67281, + 67270, + 67299, + 67316, + 67283, + 67294, + 67299, + 67298, + 67286, + 67291, + 67298, + 67297, + 67273, + 67296, + 67291, + 67313, + 67336, + 67299, + 67265, + 67264, + 67323, + 67304, + 67316, + 67332, + 67316, + 67269, + 67265, + 67277, + 67247, + 67289, + 67276, + 67308, + 67286, + 67317, + 67263, + 67279, + 67274, + 67271, + 67297, + 71617, + 67283, + 67275, + 67295, + 67276, + 67301, + 67340, + 67316, + 67309, + 67299, + 67325, + 67313, + 67283, + 67271, + 67322, + 67294, + 67278, + 67260, + 67312, + 67296, + 67292, + 67264, + 67330, + 67293, + 67304, + 67299, + 67305, + 67281, + 67291, + 67285, + 67295, + 67268, + 67302, + 67299, + 67318, + 67300, + 67302, + 67311, + 67335, + 67306, + 67265, + 67271, + 67322, + 67276, + 67290, + 67297, + 68066, + 67271, + 67281, + 67458, + 67318, + 67320, + 67272, + 67290, + 67291, + 67278, + 67298, + 67299, + 67269, + 67329, + 67288, + 67331, + 67281, + 67298, + 67367, + 67296, + 67302, + 67327, + 67302, + 67289, + 67325, + 67283, + 67356, + 67310, + 67352, + 67294, + 67298, + 67276, + 67282, + 67348, + 67274, + 67307, + 67305, + 67299, + 67284, + 67297, + 67292, + 67305, + 67289, + 67300, + 67317, + 67354, + 67262, + 67266, + 67287, + 67303, + 67261, + 67291, + 67331, + 67318, + 67287, + 67308, + 67292, + 67301, + 67306, + 67287, + 67282, + 67292, + 67267, + 67294, + 67262, + 67323, + 67290, + 67270, + 67272, + 67298, + 67328, + 67305, + 67326, + 67259, + 67354, + 67269, + 67284, + 67343, + 67282, + 67312, + 67307, + 67294, + 67318, + 67284, + 67295, + 67321, + 67363, + 67262, + 67298, + 67310, + 67283, + 67272, + 67311, + 67306, + 67282, + 67283, + 67294, + 67274, + 67279, + 67287, + 67285, + 67302, + 67273, + 67289, + 67308, + 67354, + 67336, + 67309, + 67329, + 67311, + 67306, + 67302, + 67313, + 67256, + 67283, + 67298, + 67300, + 67303, + 67303, + 67292, + 67309, + 67329, + 67304, + 67280, + 67301, + 67283, + 67283, + 67300, + 67302, + 67293, + 67298, + 67259, + 67299, + 67285, + 67291, + 67328, + 67271, + 67280, + 67273, + 67337, + 67315, + 67292, + 67336, + 67301, + 67299, + 67303, + 67304, + 67306, + 67281, + 67287, + 67279, + 67333, + 67285, + 67280, + 67285, + 67307, + 67301, + 67309, + 67324, + 67299, + 67334, + 67326, + 67284, + 67311, + 67333, + 67337, + 67290, + 67308, + 67296, + 67316, + 67357, + 67332, + 67309, + 67293, + 67299, + 67287, + 67302, + 67320, + 67299, + 67318, + 67295, + 67324, + 67330, + 67289, + 67288, + 67285, + 67314, + 67293, + 67317, + 67294, + 67322, + 67287, + 67304, + 67297, + 67357, + 67296, + 67369, + 67316, + 67316, + 67289, + 67299, + 67272, + 67329, + 67318, + 67303, + 67318, + 67292, + 67319, + 67297, + 67270, + 67261, + 67283, + 67286, + 67294, + 67295, + 67302, + 67273, + 67321, + 67327, + 67302, + 67292, + 67297, + 67302, + 67292, + 67271, + 67264, + 67321, + 67340, + 67351, + 67292, + 67293, + 67295, + 67338, + 67319, + 67288, + 67325, + 67294, + 67270, + 67307, + 67301, + 67260, + 67267, + 67280, + 67297, + 67278, + 67273, + 67284, + 67292, + 67275, + 67280, + 67301, + 67296, + 67282, + 67291, + 67296, + 67315, + 67302, + 67298, + 67285, + 67263, + 67270, + 67285, + 67310, + 67286, + 67292, + 67261, + 67298, + 67273, + 67294, + 67310, + 67302, + 67291, + 67293, + 67298, + 67315, + 67280, + 67297, + 67316, + 67292, + 67319, + 67295, + 67298, + 67301, + 67307, + 67289, + 67286, + 67293, + 67289, + 67309, + 67344, + 67281, + 67265, + 67314, + 67316, + 67307, + 67283, + 67292, + 67305, + 67314, + 67308, + 67276, + 67291, + 67330, + 67311, + 67281, + 67265, + 67316, + 67294, + 67315, + 67318, + 67315, + 67313, + 67268, + 67279, + 67288, + 67303, + 67282, + 67291, + 67287, + 67296, + 67290, + 67283, + 67309, + 67305, + 67325, + 67289, + 67326, + 67311, + 67278, + 67268, + 67272, + 67309, + 67335, + 67298, + 67305, + 67289, + 67288, + 67260, + 67279, + 67270, + 67282, + 67293, + 67317, + 67296, + 67287, + 67308, + 67299, + 67297, + 67268, + 67334, + 67295, + 67292, + 67275, + 67292, + 67321, + 67285, + 67321, + 67293, + 67298, + 67265, + 67303, + 67266, + 67287, + 67266, + 67278, + 67272, + 67267, + 67296, + 67289, + 67271, + 67281, + 67323, + 67295, + 67289, + 67334, + 67322, + 67334, + 67293, + 67288, + 67297, + 67288, + 67312, + 67279, + 67309, + 67272, + 67297, + 67326, + 67283, + 67302, + 67278, + 67285, + 67269, + 67310, + 67276, + 67317, + 67319, + 67325, + 67293, + 67324, + 67336, + 67278, + 67288, + 67294, + 67282, + 67325, + 67288, + 67320, + 67279, + 67278, + 67310, + 67314, + 67312, + 67328, + 67287, + 67297, + 67311, + 67272, + 67269, + 67306, + 67306, + 67313, + 67301, + 67301, + 67309, + 67279, + 67355, + 67315, + 67331, + 67289, + 67283, + 67325, + 67270, + 67337, + 67302, + 67348, + 67315, + 67288, + 67277, + 67277, + 67326, + 67295, + 67298, + 67315, + 67319, + 67275, + 67286, + 67297, + 67299, + 67308, + 67261, + 67309, + 67312, + 67308, + 67317, + 67285, + 67302, + 67307, + 67305, + 67320, + 67319, + 67311, + 67261, + 67334, + 67332, + 67358, + 67348, + 67337, + 67283, + 67271, + 67305, + 67321, + 67267, + 67303, + 67282, + 67302, + 67311, + 67275, + 67300, + 67307, + 67312, + 67307, + 67290, + 67310, + 67330, + 67275, + 67305, + 67262, + 67279, + 67302, + 67284, + 67273, + 67556, + 67322, + 67272, + 67321, + 67338, + 67336, + 67260, + 67296, + 67284, + 67275, + 67304, + 67327, + 67349, + 67316, + 67289, + 67281, + 67321, + 67313, + 67281, + 67247, + 67339, + 67320, + 67300, + 67333, + 67269, + 67293, + 67342, + 67273, + 67310, + 67321, + 67307, + 67281, + 67291, + 67290, + 67293, + 67298, + 67282, + 67299, + 67283, + 67309, + 67327, + 67333, + 67275, + 67316, + 67262, + 67309, + 67285, + 67299, + 67313, + 67298, + 67281, + 67306, + 67271, + 67293, + 67321, + 67309, + 67265, + 67278, + 67300, + 67291, + 67305, + 67306, + 67295, + 67330, + 67328, + 67316, + 67300, + 67283, + 67307, + 67319, + 67347, + 67318, + 67279, + 67293, + 67293, + 67315, + 67314, + 67270, + 67281, + 67289, + 67319, + 67308, + 67292, + 67314, + 67324, + 67299, + 67264, + 67317, + 67333, + 67330, + 67297, + 67290, + 67280, + 67331, + 67335, + 67306, + 67311, + 67335, + 67291, + 67270, + 67316, + 67318, + 67283, + 67302, + 67300, + 67265, + 67304, + 67339, + 67301, + 67299, + 67276, + 67274, + 67302, + 67314, + 67343, + 67286, + 67298, + 67262, + 67289, + 67292, + 67305, + 67299, + 67314, + 67326, + 67315, + 67288, + 67274, + 67300, + 67285, + 67302, + 67311, + 67305, + 67314, + 67283, + 67287, + 67299, + 67298, + 67284, + 67293, + 67292, + 67311, + 67306, + 67299, + 67303, + 67267, + 67302, + 67309, + 67321, + 67293, + 67267, + 67288, + 67293, + 67319, + 67312, + 67295, + 67305, + 67276, + 67316, + 67279, + 67309, + 67314, + 67301, + 67299, + 67328, + 67287, + 67294, + 67286, + 67312, + 67273, + 67313, + 67304, + 67303, + 67344, + 67308, + 67309, + 67321, + 67279, + 67337, + 67269, + 67331, + 67305, + 67335, + 67272, + 67337, + 67304, + 67324, + 67351, + 67310, + 67286, + 67302, + 67284, + 67322, + 67325, + 67358, + 67281, + 67305, + 67299, + 67284, + 67301, + 67308, + 67315, + 67289, + 67313, + 67289, + 67282, + 67295, + 67310, + 67284, + 67313, + 67272, + 67322, + 67278, + 67325, + 67270, + 67274, + 67307, + 67279, + 67341, + 67300, + 67333, + 67286, + 67276, + 67320, + 67295, + 67276, + 67343, + 67291, + 67319, + 67292, + 67278, + 67292, + 67270, + 67286, + 67277, + 67291, + 67344, + 67271, + 67285, + 67269, + 67285, + 67285, + 67279, + 67302, + 67294, + 67284, + 67289, + 67273, + 67333, + 67327, + 67316, + 67335, + 67311, + 67323, + 67334, + 67345, + 67302, + 67275, + 67300, + 67312, + 67316, + 67335, + 67320, + 67298, + 67291, + 67301, + 67316, + 67334, + 67283, + 67274, + 67314, + 67282, + 67301, + 67297, + 67323, + 67312, + 67329, + 67294, + 67343, + 67277, + 67329, + 67336, + 67263, + 67305, + 67331, + 67279, + 67305, + 67296, + 67301, + 67291, + 67305, + 67335, + 67299, + 67292, + 67318, + 67310, + 67279, + 67293, + 67316, + 67307, + 67289, + 67330, + 67332, + 67278, + 67292, + 67333, + 67256, + 67297, + 67274, + 67295, + 67328, + 67345, + 67338, + 67281, + 67285, + 67307, + 67296, + 67311, + 67298, + 67270, + 67288, + 67334, + 67270, + 67304, + 67278, + 67268, + 67306, + 67292, + 67321, + 67310, + 67312, + 67338, + 67292, + 67295, + 67338, + 67324, + 67321, + 67314, + 67310, + 67338, + 67315, + 67312, + 67305, + 67302, + 67322, + 67322, + 67295, + 67334, + 67314, + 67340, + 67322, + 67323, + 67301, + 67271, + 67272, + 67324, + 67275, + 67301, + 67300, + 67320, + 67317, + 67307, + 67303, + 67276, + 67282, + 67263, + 67293, + 67278, + 67288, + 67340, + 67266, + 67320, + 67325, + 67307, + 67300, + 67282, + 67297, + 67330, + 67296, + 67298, + 67285, + 67313, + 67324, + 67306, + 67306, + 67302, + 67323, + 67302, + 67267, + 67302, + 67292, + 67307, + 67349, + 67301, + 67259, + 67298, + 67288, + 67275, + 67306, + 67293, + 67318, + 67292, + 67302, + 67313, + 67322, + 67332, + 67262, + 67297, + 67294, + 67308, + 67346, + 67300, + 67275, + 67281, + 67273, + 67301, + 67287, + 67277, + 67302, + 67291, + 67289, + 67289, + 67317, + 67314, + 67271, + 67304, + 67262, + 67297, + 67294, + 67348, + 67306, + 67310, + 67288, + 67310, + 67316, + 67292, + 67281, + 67297, + 67296, + 67336, + 67284, + 67301, + 67336, + 67297, + 67272, + 67321, + 67319, + 67320, + 67297, + 67335, + 67328, + 67330, + 67319, + 67304, + 67298, + 67310, + 67306, + 67340, + 67323, + 67313, + 67298, + 67315, + 67312, + 67345, + 67306, + 67279, + 67287, + 67365, + 67285, + 67285, + 67307, + 67297, + 67332, + 67323, + 67359, + 67299, + 67259, + 67277, + 67318, + 67323, + 67294, + 67278, + 67298, + 67312, + 67324, + 67326, + 67328, + 67276, + 67331, + 67335, + 67338, + 67291, + 67303, + 67339, + 67307, + 67329, + 67300, + 67272, + 67296, + 67252, + 67316, + 67307, + 67267, + 67295, + 67333, + 67288, + 67333, + 67286, + 67330, + 67298, + 67292, + 67289, + 67321, + 67272, + 67289, + 67301, + 67301, + 67331, + 67287, + 67293, + 67280, + 67309, + 67317, + 67293, + 67267, + 67301, + 67309, + 67303, + 67312, + 67293, + 67290, + 67287, + 67265, + 67342, + 67274, + 67323, + 67339, + 67333, + 67287, + 67308, + 67364, + 67324, + 67277, + 67292, + 67308, + 67262, + 67262, + 67262, + 67299, + 67297, + 67332, + 67315, + 67334, + 67293, + 67308, + 67307, + 67321, + 67295, + 67322, + 67280, + 67268, + 67257, + 67329, + 67301, + 67284, + 67288, + 67308, + 67272, + 67276, + 67296, + 67281, + 67337, + 67310, + 67295, + 67295, + 67333, + 67301, + 67283, + 67313, + 67310, + 67316, + 67338, + 67325, + 67305, + 67321, + 67288, + 67308, + 67320, + 67294, + 67294, + 67323, + 67278, + 67302, + 67285, + 67358, + 67318, + 67333, + 67291, + 67301, + 67302, + 67287, + 67316, + 67303, + 67326, + 67280, + 67280, + 67316, + 67288, + 67318, + 67312, + 67301, + 67275, + 67325, + 67278, + 67317, + 67289, + 67270, + 67315, + 67278, + 67330, + 67291, + 67325, + 67277, + 67304, + 67317, + 67301, + 67282, + 67278, + 67284, + 67302, + 67305, + 67338, + 67340, + 67253, + 67268, + 67300, + 67289, + 67322, + 67303, + 67310, + 67314, + 67289, + 67288, + 67304, + 67311, + 67310, + 67309, + 67304, + 67287, + 67319, + 67319, + 67326, + 67303, + 67287, + 67286, + 67306, + 67286, + 67282, + 67272, + 67293, + 67328, + 67292, + 67324, + 67294, + 67278, + 67318, + 67319, + 67312, + 67330, + 67290, + 67298, + 67310, + 67305, + 67296, + 67272, + 67292, + 67326, + 67312, + 67292, + 67322, + 67303, + 67257, + 67304, + 67259, + 67293, + 67292, + 67290, + 67276, + 67267, + 67275, + 67259, + 67265, + 67269, + 67264, + 67267, + 67291, + 67325, + 67304, + 67270, + 67296, + 67310, + 67271, + 67300, + 67332, + 67319, + 67302, + 67294, + 67310, + 67297, + 67279, + 67291, + 67319, + 67288, + 67296, + 67296, + 67325, + 67295, + 67279, + 67332, + 67322, + 67247, + 67277, + 67294, + 67287, + 67294, + 67319, + 67291, + 67271, + 67272, + 67348, + 67274, + 67275, + 67292, + 67346, + 67307, + 67355, + 67303, + 67271, + 67268, + 67320, + 67258, + 67339, + 67307, + 67310, + 67280, + 67285, + 67339, + 67288, + 67285, + 67263, + 67362, + 67277, + 67258, + 67263, + 67299, + 67336, + 67298, + 67326, + 67332, + 67340, + 67280, + 67329, + 67287, + 67291, + 67280, + 67299, + 67318, + 67310, + 67323, + 67258, + 67286, + 67318, + 67308, + 67567, + 67298, + 67303, + 67261, + 67300, + 67299, + 67280, + 67278, + 67333, + 67304, + 67319, + 67314, + 67335, + 67318, + 67301, + 67320, + 67306, + 67305, + 67290, + 67291, + 67303, + 67285, + 67286, + 67311, + 67308, + 67279, + 67267, + 67288, + 67298, + 67327, + 67292, + 67315, + 67278, + 67273, + 67337, + 67311, + 67303, + 67342, + 67299, + 67294, + 67296, + 67347, + 67309, + 67304, + 67328, + 67291, + 67281, + 67291, + 67287, + 67267, + 67290, + 67292, + 67287, + 67287, + 67306, + 67259, + 67291, + 67315, + 67302, + 67262, + 67280, + 67296, + 67255, + 67285, + 67294, + 67291, + 67333, + 67293, + 67291, + 67311, + 67285, + 67314, + 67272, + 67309, + 67284, + 67295, + 67289, + 67270, + 67305, + 67298, + 67290, + 67261, + 67301, + 67278, + 67309, + 67495, + 67327, + 67299, + 67329, + 67320, + 67301, + 67344, + 67288, + 67296, + 67303, + 67285, + 67326, + 67284, + 67299, + 67309, + 67297, + 67259, + 67297, + 67293, + 67273, + 67281, + 67334, + 67275, + 67288, + 67313, + 67357, + 67703, + 67325, + 67281, + 67309, + 67297, + 67277, + 67304, + 67280, + 67305, + 67294, + 67288, + 67307, + 67284, + 67301, + 67299, + 67308, + 67333, + 67292, + 67256, + 67323, + 67285, + 67289, + 67287, + 67280, + 67287, + 67298, + 67302, + 67275, + 67320, + 67318, + 67327, + 67295, + 67290, + 67347, + 67294, + 67288, + 67268, + 67339, + 67284, + 67271, + 67329, + 67317, + 67323, + 67313, + 67272, + 67325, + 67270, + 67322, + 67298, + 67305, + 67336, + 67324, + 67340, + 67290, + 67270, + 67302, + 67316, + 67335, + 67312, + 67277, + 67331, + 67290, + 67314, + 67299, + 67291, + 67297, + 67312, + 67296, + 67327, + 67304, + 67301, + 67324, + 67320, + 67293, + 67320, + 67261, + 67310, + 67314, + 67320, + 67283, + 67282, + 67250, + 67298, + 67299, + 67318, + 67288, + 67305, + 67280, + 67293, + 67288, + 67319, + 67290, + 67309, + 67298, + 67331, + 67286, + 67306, + 67322, + 67336, + 67302, + 67289, + 67287, + 67293, + 67303, + 67315, + 67347, + 67368, + 67361, + 67282, + 67281, + 67585, + 67251, + 67270, + 67329, + 67306, + 67297, + 67285, + 67344, + 67288, + 67290, + 67344, + 67276, + 67308, + 67310, + 67269, + 67292, + 67309, + 67309, + 67293, + 67326, + 67303, + 67307, + 67265, + 67296, + 67274, + 67254, + 67292, + 67298, + 67324, + 67307, + 67277, + 67294, + 67304, + 67294, + 67322, + 67308, + 67299, + 67323, + 67291, + 67285, + 67322, + 67305, + 67297, + 67314, + 67312, + 67268, + 67288, + 67248, + 67313, + 67319, + 67296, + 67297, + 67321, + 67282, + 67299, + 67275, + 67287, + 67265, + 67296, + 67306, + 67281, + 67292, + 67286, + 67291, + 67305, + 67265, + 67298, + 67263, + 67317, + 67298, + 67300, + 67259, + 67263, + 67296, + 67297, + 67334, + 67275, + 67311, + 67278, + 67287, + 67305, + 67263, + 67331, + 67271, + 67291, + 67287, + 67337, + 67272, + 67319, + 67356, + 67316, + 67284, + 67319, + 67311, + 67311, + 67302, + 67318, + 67266, + 67310, + 67287, + 67269, + 67328, + 67292, + 67259, + 67282, + 67281, + 67311, + 67302, + 67340, + 67258, + 67255, + 67300, + 67305, + 67302, + 67262, + 67293, + 67304, + 67305, + 67285, + 67281, + 67264, + 67292, + 67264, + 67310, + 67285, + 67310, + 67292, + 67301, + 67317, + 67289, + 67258, + 67315, + 67306, + 67424, + 67293, + 67293, + 67286, + 67275, + 67270, + 67306, + 67275, + 67254, + 67341, + 67290, + 67257, + 67308, + 67333, + 67289, + 67298, + 67303, + 67290, + 67293, + 67287, + 67277, + 67279, + 67311, + 67300, + 67305, + 67286, + 67303, + 67306, + 67277, + 67303, + 67293, + 67276, + 67288, + 67341, + 67293, + 67312, + 67285, + 67319, + 67313, + 67327, + 67297, + 67328, + 67312, + 67302, + 67336, + 67308, + 67292, + 67295, + 67321, + 67347, + 67290, + 67330, + 67279, + 67276, + 67292, + 67294, + 67310, + 67301, + 67290, + 67307, + 67296, + 67309, + 67326, + 67240, + 67268, + 67302, + 67295, + 67307, + 67262, + 67283, + 67303, + 67291, + 67347, + 67295, + 67292, + 67318, + 67291, + 67290, + 67275, + 67275, + 67304, + 67276, + 67250, + 67302, + 67331, + 67286, + 67302, + 67300, + 67303, + 67310, + 67394, + 67306, + 67282, + 67307, + 67299, + 67306, + 67292, + 67268, + 67269, + 67286, + 67279, + 67294, + 67287, + 67291, + 67305, + 67278, + 67272, + 67333, + 67296, + 67294, + 67271, + 67317, + 67324, + 67313, + 67267, + 67296, + 67266, + 67297, + 67294, + 67277, + 67256, + 67316, + 67284, + 67278, + 67301, + 67357, + 67302, + 67281, + 67275, + 67287, + 67293, + 67307, + 67271, + 67274, + 67290, + 67284, + 67276, + 67264, + 67292, + 67264, + 67346, + 67292, + 67308, + 67313, + 67666, + 67288, + 67287, + 67263, + 67300, + 67281, + 67338, + 67325, + 67313, + 67294, + 67315, + 67305, + 67320, + 67277, + 67275, + 67332, + 67321, + 67287, + 67310, + 67314, + 67273, + 67335, + 67325, + 67279, + 67269, + 67264, + 67340, + 67286, + 67286, + 67272, + 67273, + 67272, + 67317, + 67270, + 67280, + 67874, + 67315, + 67298, + 67303, + 67264, + 67287, + 67308, + 67296, + 67345, + 67327, + 67297, + 67326, + 67275, + 67309, + 67282, + 67303, + 67283, + 67339, + 67288, + 67300, + 67298, + 67559, + 67767, + 67299, + 67286, + 67257, + 67295, + 67278, + 67296, + 67285, + 67300, + 67307, + 67306, + 67275, + 67293, + 67272, + 67273, + 67299, + 67298, + 67306, + 67272, + 67271, + 67306, + 67289, + 67338, + 67277, + 67316, + 67299, + 67322, + 67331, + 67304, + 67302, + 67314, + 67298, + 67299, + 67291, + 67311, + 67289, + 67293, + 67319, + 67329, + 67356, + 67338, + 67335, + 67292, + 67278, + 67304, + 67290, + 67340, + 67302, + 67262, + 67290, + 67300, + 67304, + 67320, + 67300, + 67323, + 67295, + 67318, + 67301, + 67285, + 67279, + 67310, + 67342, + 67275, + 67315, + 67293, + 67270, + 67284, + 67313, + 67304, + 67313, + 67334, + 67302, + 67271, + 67286, + 67325, + 67311, + 67306, + 67304, + 67282, + 67265, + 67296, + 67278, + 67309, + 67290, + 67296, + 67293, + 67252, + 67340, + 67306, + 67277, + 67293, + 67294, + 67330, + 67294, + 67293, + 67270, + 67294, + 67293, + 67291, + 67250, + 67341, + 67269, + 67305, + 67312, + 67301, + 67262, + 67292, + 67280, + 67307, + 67315, + 67335, + 67300, + 67309, + 67310, + 67295, + 67281, + 67298, + 67293, + 67288, + 67301, + 67288, + 67272, + 67316, + 67289, + 67307, + 67300, + 67758, + 67297, + 67315, + 67305, + 67317, + 67302, + 67287, + 67295, + 67270, + 67326, + 67291, + 67309, + 67266, + 67266, + 67299, + 67293, + 67326, + 67295, + 67301, + 67300, + 67327, + 67278, + 67273, + 67293, + 67294, + 67302, + 67327, + 67325, + 67280, + 67303, + 67309, + 67297, + 67282, + 67277, + 67312, + 67271, + 67266, + 67303, + 67263, + 67295, + 67302, + 67272, + 67285, + 67296, + 67306, + 67311, + 67282, + 67277, + 67294, + 67281, + 67311, + 67260, + 67301, + 67302, + 67337, + 67305, + 67293, + 67318, + 67290, + 67269, + 67334, + 67284, + 67283, + 67336, + 67299, + 67284, + 67284, + 67271, + 67297, + 67281, + 67324, + 67291, + 67296, + 67278, + 67298, + 67316, + 67272, + 67340, + 67286, + 67304, + 67314, + 67358, + 67291, + 67286, + 67309, + 67272, + 67279, + 67272, + 67305, + 67307, + 67292, + 67310, + 67302, + 67334, + 67256, + 67336, + 67258, + 67322, + 67308, + 67289, + 67322, + 67304, + 67278, + 67257, + 67277, + 67262, + 67289, + 67310, + 67266, + 67288, + 67279, + 67275, + 67285, + 67273, + 67287, + 67310, + 67306, + 67269, + 67316, + 67302, + 67292, + 67301, + 67268, + 67261, + 67289, + 67283, + 67303, + 67373, + 67313, + 67292, + 67309, + 67286, + 67297, + 67505, + 67267, + 67304, + 67324, + 67323, + 67299, + 67301, + 67321, + 67298, + 67307, + 67283, + 67276, + 67297, + 67265, + 67288, + 67303, + 67274, + 67296, + 67298, + 67292, + 67273, + 67283, + 67288, + 67279, + 67257, + 67273, + 67320, + 67294, + 67298, + 67290, + 67284, + 67305, + 67270, + 67327, + 67282, + 67322, + 67290, + 67305, + 67303, + 67315, + 67300, + 67265, + 67307, + 67311, + 67357, + 67256, + 67293, + 67301, + 67335, + 67428, + 67291, + 67272, + 67292, + 67281, + 67295, + 67305, + 67277, + 67304, + 67303, + 67327, + 67282, + 67270, + 67287, + 67294, + 67295, + 67298, + 67273, + 67285, + 67299, + 67276, + 67292, + 67297, + 67303, + 67289, + 67312, + 67303, + 67262, + 67320, + 67335, + 67273, + 67317, + 67275, + 67285, + 67288, + 67308, + 67260, + 67289, + 67295, + 67314, + 67290, + 67307, + 67311, + 67333, + 67344, + 67328, + 67286, + 67292, + 67323, + 67267, + 67283, + 67289, + 67328, + 67309, + 67286, + 67332, + 67332, + 67280, + 67297, + 67269, + 67338, + 67280, + 67294, + 67275, + 67296, + 67291, + 67278, + 67323, + 67294, + 67285, + 67291, + 67289, + 67290, + 67289, + 67293, + 67269, + 67296, + 67333, + 67296, + 67315, + 67314, + 67308, + 67289, + 67311, + 67330, + 67306, + 67310, + 67294, + 67259, + 67296, + 67301, + 67275, + 67312, + 67284, + 67278, + 67318, + 67290, + 67289, + 67319, + 67279, + 67291, + 67321, + 67284, + 67339, + 67286, + 67303, + 67279, + 67277, + 67287, + 67322, + 67317, + 67267, + 67277, + 67290, + 67310, + 67272, + 67292, + 67295, + 67298, + 67264, + 67278, + 67311, + 67260, + 67306, + 67298, + 67339, + 67324, + 67296, + 67311, + 67309, + 67302, + 67275, + 67300, + 67341, + 67329, + 67271, + 67324, + 67333, + 67296, + 67285, + 67343, + 67275, + 67278, + 67327, + 67288, + 67277, + 67292, + 67321, + 67268, + 67330, + 67295, + 67283, + 67296, + 67350, + 67324, + 67277, + 67324, + 67329, + 67317, + 67299, + 67331, + 67302, + 67326, + 67264, + 67323, + 67318, + 67293, + 67264, + 67303, + 67296, + 67339, + 67264, + 67306, + 67282, + 67295, + 67288, + 67323, + 67282, + 67304, + 67324, + 67293, + 67326, + 67312, + 67288, + 67280, + 67297, + 67264, + 67271, + 67301, + 67297, + 67286, + 67280, + 67318, + 67289, + 67291, + 67301, + 67302, + 67289, + 67290, + 67284, + 67269, + 67255, + 67317, + 67304, + 67298, + 67270, + 67280, + 67296, + 67259, + 67280, + 67321, + 67307, + 67285, + 67274, + 67283, + 67311, + 67280, + 67286, + 67269, + 67314, + 67295, + 67278, + 67273, + 67361, + 67271, + 67310, + 67347, + 67305, + 67333, + 67306, + 67287, + 67258, + 67314, + 67301, + 67321, + 67300, + 67295, + 67288, + 67276, + 67278, + 67317, + 67289, + 67266, + 67291, + 67306, + 67283, + 67270, + 67285, + 67289, + 67305, + 67294, + 67308, + 67308, + 67276, + 67290, + 67295, + 67300, + 67311, + 67309, + 67300, + 67321, + 67295, + 67300, + 67269, + 67286, + 67276, + 67285, + 67284, + 67269, + 67301, + 67284, + 67335, + 67310, + 67274, + 67276, + 67312, + 67311, + 67324, + 67289, + 67321, + 67296, + 67311, + 67272, + 67309, + 67300, + 67288, + 67293, + 67314, + 67328, + 67428, + 67300, + 67299, + 67296, + 67303, + 67309, + 67302, + 67272, + 67267, + 67273, + 67284, + 67277, + 67323, + 67261, + 67297, + 67290, + 67326, + 67303, + 67284, + 67283, + 67294, + 67270, + 67424, + 67316, + 67275, + 67302, + 67275, + 67293, + 67286, + 67300, + 67314, + 67305, + 67267, + 67296, + 67276, + 67289, + 67290, + 67277, + 67306, + 67290, + 67318, + 67268, + 67293, + 67297, + 67276, + 67315, + 67285, + 67300, + 67277, + 67262, + 67276, + 67288, + 67333, + 67277, + 67302, + 67293, + 67284, + 67302, + 67296, + 67274, + 67276, + 67299, + 67282, + 67312, + 67293, + 67299, + 67338, + 67280, + 67289, + 67309, + 67315, + 67299, + 67287, + 67300, + 67264, + 67282, + 67262, + 67295, + 67308, + 67314, + 67307, + 67319, + 67312, + 67319, + 67281, + 67294, + 67280, + 67302, + 67601, + 67301, + 67307, + 67297, + 67285, + 67310, + 67295, + 67339, + 67305, + 67273, + 67343, + 67327, + 67295, + 67306, + 67301, + 67326, + 67254, + 67264, + 67316, + 67353, + 67291, + 67275, + 67315, + 67302, + 67334, + 67292, + 67282, + 67312, + 67261, + 67293, + 67302, + 67288, + 67273, + 67309, + 67295, + 67266, + 67290, + 67294, + 67309, + 67298, + 67343, + 67250, + 67328, + 67313, + 67311, + 67300, + 67258, + 67290, + 67294, + 67278, + 67277, + 67291, + 67277, + 67269, + 67303, + 67290, + 67380, + 67319, + 67280, + 67254, + 67279, + 67296, + 67276, + 67298, + 67296, + 67295, + 67279, + 67295, + 67283, + 67275, + 67271, + 67268, + 67319, + 67312, + 67293, + 67320, + 67260, + 67314, + 67286, + 67296, + 67273, + 67298, + 67276, + 67285, + 67270, + 67271, + 67282, + 67268, + 67290, + 67336, + 67313, + 67320, + 67345, + 67290, + 67317, + 67286, + 67347, + 67298, + 67308, + 67248, + 67291, + 67334, + 67279, + 67337, + 67299, + 67288, + 67306, + 67317, + 67302, + 67302, + 67293, + 67269, + 67312, + 67295, + 67296, + 67297, + 67268, + 67295, + 67291, + 67356, + 67274, + 67286, + 67292, + 67285, + 67314, + 67300, + 67290, + 67276, + 67286, + 67298, + 67246, + 67271, + 67342, + 67270, + 67284, + 67277, + 67293, + 67267, + 67286, + 67317, + 67322, + 67284, + 67288, + 67303, + 67301, + 67303, + 67293, + 67308, + 67302, + 67271, + 67293, + 67298, + 67289, + 67306, + 67297, + 67283, + 67277, + 67252, + 67297, + 67298, + 67305, + 67264, + 67264, + 67336, + 67299, + 67254, + 67341, + 67276, + 67377, + 67345, + 67290, + 67282, + 67284, + 67344, + 67301, + 67357, + 67287, + 67266, + 67281, + 67300, + 67281, + 67329, + 67304, + 67300, + 67313, + 67291, + 67291, + 67300, + 67282, + 67284, + 67296, + 67292, + 67304, + 67351, + 67343, + 67271, + 67346, + 67306, + 67272, + 67281, + 67320, + 67266, + 67297, + 67290, + 67275, + 67334, + 67296, + 67268, + 67261, + 67265, + 67313, + 67296, + 67273, + 67281, + 67312, + 67303, + 67291, + 67291, + 67306, + 67652, + 67285, + 67276, + 67292, + 67286, + 67282, + 67300, + 67299, + 67300, + 67293, + 67308, + 67301, + 67282, + 67310, + 67284, + 67284, + 67282, + 67314, + 67307, + 67266, + 67323, + 67317, + 67359, + 67312, + 67309, + 67290, + 67285, + 67306, + 67332, + 67278, + 67310, + 67278, + 67311, + 67298, + 67296, + 67287, + 67296, + 67362, + 67326, + 67312, + 67279, + 67305, + 67282, + 67301, + 67330, + 67306, + 67324, + 67309, + 67286, + 67281, + 67273, + 67320, + 67266, + 67290, + 67282, + 67293, + 67309, + 67308, + 67309, + 67268, + 67291, + 67278, + 67301, + 67293, + 67277, + 67333, + 67252, + 67347, + 67341, + 67294, + 67298, + 67302, + 67316, + 67253, + 67296, + 67291, + 67358, + 67342, + 67312, + 67280, + 67298, + 67300, + 67315, + 67304, + 67264, + 67304, + 67312, + 67277, + 67328, + 67313, + 67302, + 67305, + 67313, + 67302, + 67262, + 67295, + 67322, + 67273, + 67325, + 67301, + 67287, + 67295, + 67313, + 67316, + 67264, + 67253, + 67280, + 67268, + 67297, + 67307, + 67300, + 67296, + 67333, + 67294, + 67329, + 67291, + 67310, + 67277, + 67296, + 67316, + 67265, + 67294, + 67306, + 67318, + 67273, + 67278, + 67295, + 67294, + 67307, + 67283, + 67319, + 67301, + 67285, + 67296, + 67260, + 67308, + 67300, + 67312, + 67287, + 67315, + 67330, + 67272, + 67285, + 67290, + 67277, + 67320, + 67298, + 67323, + 67315, + 67288, + 67321, + 67292, + 67266, + 67278, + 67292, + 67298, + 67356, + 67309, + 67331, + 67299, + 67292, + 67266, + 67293, + 67284, + 67274, + 67303, + 67261, + 67278, + 67296, + 67314, + 67317, + 67359, + 67303, + 67338, + 67360, + 67279, + 67370, + 67332, + 67320, + 67355, + 67357, + 67330, + 67331, + 67300, + 67336, + 67310, + 67302, + 67336, + 67280, + 67259, + 67277, + 67305, + 67296, + 67290, + 67302, + 67294, + 67307, + 67284, + 67312, + 67321, + 67309, + 67285, + 67646, + 67336, + 67287, + 67284, + 67307, + 67319, + 67317, + 67311, + 67283, + 67258, + 67282, + 67317, + 67280, + 67308, + 67283, + 67281, + 67299, + 67273, + 67274, + 67273, + 67346, + 67316, + 67296, + 67280, + 67268, + 67262, + 67339, + 67299, + 67287, + 67279, + 67308, + 67365, + 67316, + 67301, + 67293, + 67264, + 67296, + 67263, + 67266, + 67306, + 67338, + 67301, + 67438, + 67300, + 67276, + 67329, + 67300, + 67305, + 67310, + 67305, + 67352, + 67304, + 67327, + 67329, + 67272, + 67273, + 67281, + 67292, + 67304, + 67311, + 67275, + 67330, + 67284, + 67298, + 67302, + 67288, + 67288, + 67360, + 67324, + 67300, + 67296, + 67294, + 67279, + 67333, + 67293, + 67299, + 67295, + 67290, + 67327, + 67352, + 67321, + 67305, + 67310, + 67269, + 67329, + 67356, + 67284, + 67309, + 67313, + 67275, + 67323, + 67287, + 67322, + 67305, + 67343, + 67309, + 67275, + 67283, + 67322, + 67266, + 67360, + 67300, + 67293, + 67349, + 67291, + 67293, + 67285, + 67289, + 67291, + 67304, + 67323, + 67351, + 67276, + 67297, + 67326, + 67279, + 67325, + 67273, + 67262, + 67312, + 67304, + 67278, + 67289, + 67304, + 67296, + 67319, + 67312, + 67289, + 67297, + 67293, + 67332, + 67276, + 67295, + 67347, + 67322, + 67289, + 67281, + 67280, + 67279, + 67278, + 67280, + 67292, + 67302, + 67312, + 67342, + 67267, + 67296, + 67326, + 67313, + 67259, + 67324, + 67299, + 67289, + 67276, + 67285, + 67320, + 67291, + 67410, + 67292, + 67324, + 67312, + 67295, + 67295, + 67276, + 67290, + 67300, + 67274, + 67290, + 67287, + 67273, + 67304, + 67287, + 67308, + 67285, + 67284, + 67301, + 67323, + 67331, + 67324, + 67335, + 67311, + 67315, + 67315, + 67406, + 67321, + 67296, + 67336, + 67299, + 67269, + 67317, + 67264, + 67359, + 67273, + 67281, + 67314, + 67289, + 67291, + 67303, + 67302, + 67303, + 67286, + 67272, + 67293, + 67291, + 67325, + 67340, + 67296, + 67306, + 67290, + 67281, + 67270, + 67276, + 67288, + 67298, + 67298, + 67269, + 67319, + 67282, + 67303, + 67308, + 67279, + 67331, + 67272, + 67297, + 67310, + 67319, + 67267, + 67278, + 67284, + 67307, + 67285, + 67289, + 67312, + 67277, + 67316, + 67288, + 67307, + 67293, + 67315, + 67302, + 67297, + 67288, + 67294, + 67285, + 67323, + 67330, + 67299, + 67286, + 67280, + 67275, + 67318, + 67270, + 67290, + 67359, + 67306, + 67292, + 67280, + 67303, + 67288, + 67350, + 67354, + 67301, + 67257, + 67315, + 67271, + 67306, + 67271, + 67282, + 67316, + 67301, + 67284, + 67306, + 67335, + 67310, + 67292, + 67333, + 67302, + 67297, + 67299, + 67292, + 67307, + 67266, + 67260, + 67267, + 67262, + 67259, + 67284, + 67285, + 67266, + 67308, + 67303, + 67276, + 67340, + 67327, + 67276, + 67299, + 67328, + 67309, + 67291, + 67321, + 67264, + 67305, + 67278, + 67305, + 67277, + 67302, + 67272, + 67315, + 67271, + 67280, + 67303, + 67299, + 67335, + 67284, + 67270, + 67324, + 67309, + 67288, + 67252, + 67324, + 67305, + 67295, + 67338, + 67315, + 67327, + 67273, + 67309, + 67291, + 67276, + 67275, + 67312, + 67321, + 67293, + 67293, + 67327, + 67280, + 67275, + 67321, + 67292, + 67350, + 67366, + 67299, + 67275, + 67308, + 67304, + 67288, + 67313, + 67290, + 67302, + 67291, + 67289, + 67328, + 67288, + 67336, + 67306, + 67295, + 67304, + 67288, + 67335, + 67295, + 67274, + 67294, + 78079, + 67335, + 67315, + 67301, + 67281, + 67299, + 67314, + 67266, + 67269, + 67316, + 67311, + 67267, + 67320, + 67326, + 67272, + 67288, + 67303, + 67311, + 67285, + 67250, + 67287, + 67317, + 67298, + 67287, + 67304, + 67326, + 67310, + 67351, + 67315, + 67339, + 67296, + 67321, + 67288, + 67264, + 67287, + 67326, + 67270, + 67700, + 67325, + 67333, + 67316, + 67278, + 67294, + 67333, + 67292, + 67288, + 67264, + 67245, + 67308, + 67281, + 67301, + 67246, + 67268, + 67268, + 67258, + 67293, + 67268, + 67297, + 67270, + 67285, + 67273, + 67307, + 67293, + 67269, + 67302, + 67303, + 67277, + 67274, + 67287, + 67275, + 67271, + 67320, + 67312, + 67291, + 67329, + 67288, + 67283, + 67294, + 67345, + 67301, + 67307, + 67281, + 67323, + 67274, + 67313, + 67309, + 67288, + 67276, + 67310, + 67261, + 67279, + 67292, + 67324, + 67307, + 67304, + 67255, + 67295, + 67311, + 67301, + 67311, + 67288, + 67310, + 67303, + 67330, + 67288, + 67274, + 67299, + 67281, + 67307, + 67314, + 67271, + 67301, + 67332, + 67283, + 67306, + 67321, + 67284, + 67305, + 67299, + 67289, + 67349, + 67290, + 67311, + 67318, + 67276, + 67302, + 67323, + 67319, + 67298, + 67312, + 67300, + 67312, + 67295, + 67306, + 67314, + 67276, + 67289, + 67324, + 67280, + 67323, + 67364, + 67291, + 67324, + 67293, + 67290, + 67326, + 67290, + 67288, + 67371, + 67296, + 67280, + 67304, + 67324, + 67320, + 67316, + 67341, + 67310, + 67328, + 67290, + 67265, + 67287, + 67293, + 67329, + 67298, + 67302, + 67307, + 67308, + 67292, + 67318, + 67281, + 67352, + 67298, + 67302, + 67292, + 67285, + 67260, + 67276, + 67302, + 67351, + 67328, + 67340, + 67273, + 67304, + 67317, + 67264, + 67293, + 67275, + 67290, + 67319, + 67266, + 67268, + 67346, + 67275, + 67277, + 67303, + 67286, + 67278, + 67268, + 67323, + 67267, + 67284, + 67288, + 67294, + 67291, + 67264, + 67274, + 67303, + 67287, + 67285, + 67310, + 67280, + 67272, + 67260, + 67278, + 67289, + 67283, + 67279, + 67306, + 67269, + 67299, + 67279, + 67296, + 67272, + 67255, + 67358, + 67282, + 67301, + 67308, + 67295, + 67282, + 67243, + 67335, + 67302, + 67309, + 67346, + 67336, + 67330, + 67302, + 67268, + 67338, + 67321, + 67317, + 67286, + 67329, + 67288, + 67285, + 67300, + 67297, + 67291, + 67292, + 67302, + 67333, + 67309, + 67301, + 67298, + 67302, + 67333, + 67305, + 67266, + 67304, + 67306, + 67270, + 67311, + 67334, + 67313, + 67277, + 67254, + 67293, + 67297, + 67263, + 67317, + 67300, + 67258, + 67326, + 67281, + 67274, + 67322, + 67302, + 67323, + 67324, + 67322, + 67309, + 67318, + 67293, + 67330, + 67296, + 67301, + 67318, + 67311, + 67290, + 67321, + 67277, + 67277, + 67320, + 67291, + 67335, + 67293, + 67322, + 67275, + 67292, + 67314, + 67294, + 67310, + 67295, + 67281, + 67260, + 67313, + 67276, + 67329, + 67310, + 67271, + 67285, + 67281, + 67326, + 67312, + 67315, + 67288, + 67338, + 67291, + 67323, + 67346, + 67298, + 67300, + 67263, + 67329, + 67316, + 67272, + 67338, + 67266, + 67261, + 67331, + 67278, + 67282, + 67360, + 67285, + 67303, + 67279, + 67298, + 67376, + 67269, + 67271, + 67284, + 67298, + 67278, + 67311, + 67312, + 67283, + 67314, + 67288, + 67323, + 67293, + 67268, + 67329, + 67324, + 67306, + 67316, + 67264, + 67284, + 67310, + 67286, + 67309, + 67284, + 67328, + 67283, + 67291, + 67304, + 67264, + 67346, + 67304, + 67296, + 67294, + 67299, + 67305, + 67296, + 67307, + 67294, + 67267, + 67273, + 67267, + 67286, + 67276, + 67277, + 67300, + 67261, + 67306, + 67303, + 67299, + 67292, + 67311, + 67300, + 67285, + 67286, + 67318, + 67267, + 67328, + 67309, + 67279, + 67266, + 67290, + 67281, + 67303, + 67295, + 67293, + 67340, + 67300, + 67283, + 67301, + 67339, + 67260, + 67309, + 67260, + 67304, + 67284, + 67269, + 67316, + 67297, + 67302, + 67298, + 67334, + 67313, + 67300, + 67316, + 67321, + 67259, + 67277, + 67264, + 67310, + 67265, + 67318, + 67286, + 67282, + 67282, + 67333, + 67315, + 67254, + 67350, + 67937, + 67287, + 67289, + 67330, + 67333, + 67353, + 67317, + 67312, + 67302, + 67292, + 67339, + 67318, + 67335, + 67268, + 67310, + 67254, + 67329, + 67361, + 67316, + 67286, + 67333, + 67324, + 67281, + 67334, + 67268, + 67277, + 67331, + 67288, + 67292, + 67324, + 67312, + 67274, + 67331, + 67312, + 67305, + 67323, + 67280, + 67310, + 67315, + 67323, + 67315, + 67282, + 67337, + 67308, + 67283, + 67292, + 67302, + 67292, + 67336, + 67273, + 67314, + 67288, + 67298, + 67326, + 67322, + 67314, + 67302, + 67292, + 67310, + 67334, + 67319, + 67293, + 67273, + 67306, + 67310, + 67301, + 67289, + 67503, + 67300, + 67334, + 67267, + 67309, + 67299, + 67329, + 67295, + 67319, + 67296, + 67279, + 67257, + 67307, + 67308, + 67306, + 67294, + 67280, + 67288, + 67333, + 67341, + 67296, + 67301, + 67295, + 67297, + 67266, + 67283, + 67296, + 67306, + 67329, + 67293, + 67345, + 67323, + 67295, + 67290, + 67311, + 67288, + 67305, + 67250, + 67295, + 67286, + 67368, + 67326, + 67338, + 67324, + 67278, + 67298, + 67272, + 67266, + 67292, + 67257, + 67308, + 67294, + 67290, + 67315, + 67316, + 67328, + 67283, + 67283, + 67317, + 67338, + 67330, + 67302, + 67318, + 67276, + 67307, + 67308, + 67302, + 67291, + 75706, + 67296, + 67326, + 67308, + 67265, + 67350, + 67265, + 67311, + 67328, + 67256, + 67282, + 67281, + 67318, + 67339, + 67282, + 67300, + 67301, + 67293, + 67288, + 67257, + 67637, + 67309, + 67259, + 67266, + 67291, + 67306, + 67278, + 67290, + 67294, + 67362, + 67309, + 67303, + 67293, + 67307, + 67323, + 67291, + 67313, + 67255, + 67304, + 67293, + 67269, + 67278, + 67273, + 67259, + 67282, + 67304, + 67275, + 67266, + 67265, + 67316, + 67290, + 67354, + 67312, + 67310, + 67262, + 67309, + 67268, + 67323, + 67317, + 67293, + 67334, + 67323, + 67348, + 67317, + 67286, + 67286, + 67291, + 67290, + 67310, + 67288, + 67292, + 67286, + 67321, + 67322, + 67322, + 67306, + 67329, + 67293, + 67289, + 67330, + 67299, + 67308, + 67268, + 67303, + 67286, + 67299, + 67312, + 67353, + 67320, + 67299, + 67289, + 67288, + 67308, + 67329, + 67330, + 67300, + 67288, + 67290, + 67307, + 67325, + 67262, + 67284, + 67290, + 67303, + 67264, + 67299, + 67328, + 67300, + 67302, + 67372, + 67303, + 67315, + 67292, + 67279, + 67287, + 67313, + 67280, + 67284, + 67294, + 67304, + 67284, + 67344, + 67257, + 67310, + 67330, + 67307, + 67283, + 67293, + 67271, + 67267, + 67302, + 67324, + 67344, + 67287, + 67318, + 67284, + 67278, + 67297, + 67298, + 67319, + 67301, + 67320, + 67304, + 67290, + 67329, + 67320, + 67292, + 67298, + 67282, + 67254, + 67264, + 67323, + 67324, + 67306, + 67290, + 67335, + 67310, + 67261, + 67342, + 67260, + 67310, + 67269, + 67300, + 67351, + 67276, + 67289, + 67315, + 67304, + 67299, + 67315, + 67271, + 67332, + 67331, + 67302, + 67277, + 67329, + 67339, + 67301, + 67292, + 67319, + 67315, + 67303, + 67298, + 67269, + 67266, + 67284, + 67267, + 67298, + 67272, + 67266, + 67321, + 67303, + 67348, + 67294, + 67273, + 67303, + 67272, + 67327, + 67323, + 67334, + 67329, + 67287, + 67305, + 67296, + 67348, + 67310, + 67287, + 67278, + 67261, + 67279, + 67297, + 67339, + 67284, + 67283, + 67327, + 67298, + 67270, + 67287, + 67293, + 67334, + 67333, + 67291, + 67291, + 67293, + 67296, + 67319, + 67313, + 67291, + 67279, + 67272, + 67325, + 67336, + 67322, + 67279, + 67269, + 67298, + 67307, + 67314, + 67300, + 67296, + 67280, + 67299, + 67277, + 67313, + 67304, + 67303, + 67324, + 67273, + 67274, + 67296, + 67318, + 67294, + 67293, + 67318, + 67312, + 67300, + 67303, + 67296, + 67297, + 67325, + 67304, + 67342, + 67304, + 67254, + 67310, + 67315, + 67293, + 67287, + 67278, + 67305, + 67292, + 67340, + 67317, + 67303, + 67243, + 67293, + 67274, + 67310, + 67370, + 67336, + 67286, + 67307, + 67302, + 67288, + 67289, + 67350, + 67300, + 67325, + 67333, + 67316, + 67286, + 67298, + 67313, + 67317, + 67311, + 67307, + 67290, + 67275, + 67294, + 67333, + 67288, + 67311, + 67298, + 67297, + 67333, + 67297, + 67326, + 67302, + 67275, + 67307, + 67314, + 67302, + 67286, + 67312, + 67319, + 67341, + 67307, + 67280, + 67252, + 67298, + 67318, + 67259, + 67333, + 67340, + 67344, + 67281, + 67316, + 67292, + 67303, + 67299, + 67280, + 67296, + 67277, + 67288, + 67288, + 67311, + 67281, + 67266, + 67274, + 67303, + 67297, + 67345, + 67257, + 67322, + 67313, + 67324, + 67311, + 67284, + 67301, + 67341, + 67319, + 67288, + 67323, + 67291, + 67338, + 67306, + 67334, + 67311, + 67295, + 67334, + 67267, + 67335, + 67306, + 67270, + 67285, + 67270, + 67311, + 67276, + 67297, + 67257, + 67283, + 67282, + 67325, + 67293, + 67270, + 67300, + 67270, + 67261, + 67274, + 67274, + 67319, + 67298, + 67296, + 67300, + 67294, + 67285, + 67268, + 67318, + 67282, + 67266, + 67267, + 67260, + 67286, + 67295, + 67308, + 67280, + 67290, + 67321, + 67341, + 67301, + 67320, + 67327, + 67285, + 67308, + 67274, + 67281, + 67298, + 67300, + 67326, + 67320, + 67303, + 67285, + 67314, + 67284, + 67345, + 67309, + 67312, + 67290, + 67272, + 67335, + 67318, + 67327, + 67307, + 67324, + 67254, + 67323, + 67312, + 67255, + 67255, + 67334, + 67278, + 67290, + 67281, + 67316, + 67337, + 67302, + 67279, + 67289, + 67297, + 67298, + 67308, + 67353, + 67286, + 67283, + 67303, + 67298, + 67289, + 67249, + 67300, + 67302, + 67275, + 67290, + 67347, + 67296, + 67282, + 67329, + 67265, + 67368, + 67326, + 67319, + 67277, + 67319, + 67331, + 67282, + 67310, + 67272, + 67306, + 67339, + 67318, + 67307, + 67309, + 67313, + 67292, + 67331, + 67279, + 67328, + 67311, + 67312, + 67306, + 67294, + 67283, + 67289, + 67275, + 67284, + 67295, + 67309, + 67337, + 67294, + 67340, + 67305, + 67283, + 67290, + 67292, + 67331, + 67315, + 67278, + 67284, + 67283, + 67276, + 67314, + 67292, + 67336, + 67306, + 67303, + 67333, + 67304, + 67297, + 67294, + 67445, + 67695, + 67338, + 67328, + 67328, + 67265, + 67284, + 67322, + 67282, + 67286, + 67335, + 67351, + 67290, + 67298, + 67308, + 67305, + 67306, + 67282, + 67316, + 67275, + 67320, + 67277, + 67295, + 67326, + 67288, + 67267, + 67338, + 67298, + 67339, + 67320, + 67300, + 67337, + 67319, + 67333, + 67302, + 67297, + 67284, + 67302, + 67295, + 67266, + 67310, + 67317, + 67298, + 67331, + 67311, + 67310, + 67289, + 67308, + 67263, + 67299, + 67301, + 67330, + 67343, + 67317, + 67304, + 67284, + 67320, + 67333, + 67289, + 67319, + 67275, + 67302, + 67301, + 67278, + 67271, + 67299, + 67335, + 67299, + 67309, + 67287, + 67323, + 67307, + 67299, + 67303, + 67301, + 67289, + 67315, + 67330, + 67296, + 67278, + 67283, + 67300, + 67311, + 67299, + 67295, + 67279, + 67299, + 67321, + 67298, + 67402, + 67287, + 67276, + 67308, + 67259, + 67292, + 67281, + 67304, + 67301, + 67263, + 67430, + 67306, + 67275, + 67270, + 67307, + 67292, + 67319, + 67296, + 67267, + 67303, + 67288, + 67294, + 67272, + 67329, + 67361, + 67327, + 67296, + 67307, + 67302, + 67324, + 67288, + 67270, + 67301, + 67298, + 67271, + 67305, + 67298, + 67283, + 67295, + 67299, + 67276, + 67314, + 67299, + 67302, + 67304, + 67299, + 67316, + 67272, + 67287, + 67275, + 67318, + 67311, + 67314, + 67271, + 67304, + 67284, + 67306, + 67313, + 67301, + 67312, + 67329, + 67321, + 67345, + 67283, + 67344, + 67318, + 67309, + 67299, + 67309, + 67302, + 67307, + 67304, + 67320, + 67314, + 67557, + 67275, + 67328, + 67319, + 67283, + 67291, + 67309, + 67277, + 67283, + 67293, + 67324, + 67357, + 67325, + 67284, + 67327, + 67299, + 67287, + 67257, + 67277, + 67300, + 67304, + 67286, + 67290, + 67321, + 67318, + 67314, + 67291, + 67299, + 67266, + 67274, + 67253, + 67287, + 67294, + 67307, + 67351, + 67291, + 67278, + 67328, + 67300, + 67298, + 67285, + 67279, + 67377, + 67282, + 67305, + 67301, + 67328, + 67290, + 67306, + 67311, + 67281, + 67333, + 67276, + 67268, + 67278, + 67285, + 67278, + 67271, + 67296, + 67303, + 67311, + 67274, + 67300, + 67321, + 67280, + 67285, + 67312, + 67257, + 67313, + 67288, + 67304, + 67370, + 67316, + 67303, + 67276, + 67298, + 67325, + 67307, + 67313, + 67288, + 67339, + 67295, + 67322, + 67315, + 67334, + 67297, + 67313, + 67277, + 67313, + 67288, + 67283, + 67300, + 67298, + 67280, + 67291, + 67279, + 67354, + 67292, + 67297, + 67319, + 67276, + 67298, + 67268, + 67357, + 67292, + 67330, + 67264, + 67292, + 67289, + 67318, + 67311, + 67331, + 67309, + 67268, + 67289, + 67330, + 67316, + 67330, + 67305, + 67270, + 67332, + 67282, + 67286, + 67330, + 67322, + 67319, + 67285, + 67307, + 67314, + 67291, + 67281, + 67309, + 67294, + 67282, + 67303, + 67275, + 67295, + 67350, + 67311, + 67300, + 67336, + 67331, + 67309, + 67354, + 67287, + 67318, + 67312, + 67317, + 67295, + 67287, + 67292, + 67330, + 67350, + 67281, + 67303, + 67251, + 67279, + 67279, + 67297, + 67331, + 67296, + 67301, + 67315, + 67278, + 67319, + 67330, + 67253, + 67312, + 67310, + 67289, + 67276, + 67290, + 67277, + 67300, + 67318, + 67304, + 67277, + 67300, + 67285, + 67355, + 67295, + 67313, + 67282, + 67307, + 67305, + 67280, + 67304, + 67312, + 67303, + 67270, + 67363, + 67304, + 67276, + 67278, + 67279, + 67339, + 67282, + 67317, + 67359, + 67335, + 67338, + 67326, + 67308, + 67301, + 67305, + 67295, + 67298, + 67313, + 67321, + 67320, + 67302, + 67286, + 67296, + 67313, + 67276, + 67275, + 67290, + 67315, + 67318, + 67334, + 67273, + 67287, + 67283, + 67300, + 67281, + 67334, + 67282, + 67276, + 67278, + 67264, + 67296, + 67310, + 67271, + 67281, + 67314, + 67305, + 67358, + 67309, + 67276, + 67288, + 67293, + 67298, + 67289, + 67303, + 67286, + 67317, + 67291, + 67301, + 67337, + 67266, + 67316, + 67313, + 67303, + 67292, + 67281, + 67297, + 67324, + 67304, + 67295, + 67311, + 67279, + 67299, + 67317, + 67266, + 67298, + 67295, + 67294, + 67294, + 67324, + 67310, + 67274, + 67288, + 67304, + 67289, + 67301, + 67299, + 67266, + 67281, + 67320, + 67357, + 67309, + 67307, + 67317, + 67301, + 67326, + 67342, + 67325, + 67296, + 67312, + 67296, + 67316, + 67266, + 67301, + 67269, + 67295, + 67349, + 67324, + 67328, + 67333, + 67281, + 67269, + 67309, + 67284, + 67271, + 67298, + 67341, + 67301, + 67299, + 67285, + 67309, + 67311, + 67283, + 67299, + 67298, + 67329, + 67283, + 67263, + 67320, + 67303, + 67293, + 67311, + 67278, + 67278, + 67300, + 67287, + 67302, + 67339, + 67303, + 67298, + 67283, + 67316, + 67264, + 67303, + 67316, + 67274, + 67302, + 67317, + 67300, + 67270, + 67299, + 67308, + 67280, + 67331, + 67264, + 67340, + 67323, + 67301, + 67286, + 67342, + 67324, + 67284, + 67336, + 67311, + 67276, + 67307, + 67299, + 67268, + 67314, + 67338, + 67293, + 67279, + 67312, + 67252, + 67271, + 67298, + 67307, + 67271, + 67301, + 67290, + 67289, + 67305, + 67271, + 67278, + 67291, + 67310, + 67327, + 67267, + 67273, + 67269, + 67330, + 67281, + 67305, + 67291, + 67268, + 67263, + 67317, + 67292, + 67314, + 67313, + 67270, + 67302, + 67304, + 67307, + 67335, + 67325, + 67322, + 67298, + 67298, + 67301, + 67305, + 67290, + 67296, + 67294, + 67293, + 67278, + 67281, + 67287, + 67247, + 67275, + 67278, + 67278, + 67268, + 67343, + 67295, + 67322, + 67293, + 67289, + 67289, + 67309, + 67286, + 67303, + 67310, + 67296, + 67296, + 67442, + 67264, + 67281, + 67283, + 67275, + 67325, + 67252, + 67287, + 67314, + 67257, + 67285, + 67293, + 67300, + 67308, + 67322, + 67277, + 67287, + 67292, + 67527, + 67294, + 67295, + 67299, + 67297, + 67302, + 67274, + 67320, + 67275, + 67281, + 67282, + 67298, + 67298, + 67307, + 67271, + 67309, + 67317, + 67681, + 67296, + 67285, + 67321, + 67271, + 67307, + 67299, + 67409, + 67304, + 67279, + 67312, + 67282, + 67297, + 67324, + 67303, + 67325, + 67316, + 67307, + 67278, + 67334, + 67278, + 67291, + 67291, + 67304, + 67307, + 67306, + 67287, + 67261, + 67289, + 67306, + 67289, + 67269, + 67276, + 67289, + 67272, + 67280, + 67275, + 67276, + 67277, + 67310, + 67293, + 67310, + 67289, + 67293, + 67305, + 67307, + 67285, + 67287, + 67317, + 67261, + 67302, + 67310, + 67288, + 67303, + 67318, + 67311, + 67290, + 67338, + 67286, + 67298, + 67294, + 67312, + 67288, + 67306, + 67303, + 67291, + 67318, + 67303, + 67295, + 67334, + 67286, + 67321, + 67274, + 67307, + 67295, + 67288, + 67309, + 67293, + 67280, + 67308, + 67270, + 67299, + 67299, + 67290, + 67278, + 67263, + 67300, + 67281, + 67280, + 67330, + 67302, + 67300, + 67301, + 67296, + 67273, + 67264, + 67290, + 67289, + 67322, + 67281, + 67271, + 67290, + 67282, + 67318, + 67293, + 67328, + 67313, + 67275, + 67282, + 67275, + 67269, + 67284, + 67292, + 67270, + 67309, + 67281, + 67265, + 67263, + 67362, + 67268, + 67287, + 67264, + 67327, + 67291, + 67324, + 67292, + 67262, + 67313, + 67303, + 67310, + 67312, + 67280, + 67287, + 67332, + 67297, + 67301, + 67331, + 67288, + 67276, + 67345, + 67260, + 67297, + 67294, + 67303, + 67365, + 67310, + 67281, + 67343, + 67299, + 67279, + 67309, + 67316, + 67297, + 67298, + 67326, + 67272, + 67296, + 67304, + 67266, + 67284, + 67299, + 67341, + 67315, + 67288, + 67313, + 67316, + 67328, + 67300, + 67302, + 67288, + 67279, + 67284, + 67287, + 67304, + 67304, + 67282, + 67264, + 67300, + 67307, + 67306, + 67300, + 67289, + 67286, + 67277, + 67293, + 67300, + 67272, + 67294, + 67328, + 67297, + 67317, + 67288, + 67274, + 67276, + 67276, + 67306, + 67248, + 67279, + 67315, + 67631, + 67333, + 67297, + 67295, + 67291, + 67324, + 67336, + 67314, + 67311, + 67384, + 67339, + 67276, + 67281, + 67302, + 67324, + 67273, + 67311, + 67292, + 67348, + 67278, + 67285, + 67287, + 67296, + 67284, + 67287, + 67361, + 67307, + 67312, + 67336, + 67311, + 67312, + 67321, + 67329, + 67301, + 67301, + 67346, + 67299, + 67294, + 67279, + 67271, + 67261, + 67289, + 67274, + 67258, + 67301, + 67283, + 67285, + 67293, + 67320, + 67296, + 67277, + 67315, + 67305, + 67316, + 67286, + 67311, + 67309, + 67277, + 67283, + 67306, + 67310, + 67323, + 67309, + 67295, + 67304, + 67322, + 67313, + 67298, + 67318, + 67321, + 67303, + 67273, + 67259, + 67309, + 67329, + 67309, + 67301, + 67280, + 67265, + 67299, + 67314, + 67299, + 67296, + 67269, + 67335, + 67320, + 67313, + 67280, + 67292, + 67284, + 67330, + 67297, + 67335, + 67294, + 67312, + 67349, + 67296, + 67289, + 67297, + 67270, + 67302, + 67284, + 67356, + 67273, + 67317, + 67297, + 67343, + 67323, + 67272, + 67265, + 67293, + 67296, + 67272, + 67285, + 67284, + 67300, + 67275, + 67311, + 67305, + 67352, + 67337, + 67302, + 67306, + 67324, + 67318, + 67351, + 67300, + 67342, + 67298, + 67297, + 67321, + 67300, + 67281, + 67293, + 67312, + 67267, + 67285, + 67304, + 67271, + 67287, + 67306, + 67279, + 67261, + 67296, + 67292, + 67354, + 67305, + 67317, + 67348, + 67291, + 67275, + 67430, + 67324, + 67300, + 67292, + 67309, + 67329, + 67344, + 67330, + 67302, + 67297, + 67314, + 67289, + 67320, + 67282, + 67350, + 67313, + 67301, + 67309, + 67269, + 67313, + 67304, + 67331, + 67305, + 67283, + 67312, + 67310, + 67311, + 67304, + 67311, + 67279, + 67263, + 67312, + 67285, + 67291, + 67305, + 67300, + 67304, + 67341, + 67257, + 67315, + 67305, + 67297, + 67324, + 67284, + 67292, + 67292, + 67299, + 67271, + 67274, + 67277, + 67340, + 67266, + 67336, + 67330, + 67266, + 67287, + 67353, + 67329, + 67274, + 67275, + 67271, + 67295, + 67305, + 67273, + 67285, + 67285, + 67306, + 67291, + 67274, + 67288, + 67300, + 67300, + 67276, + 67327, + 67343, + 67283, + 67277, + 67296, + 67301, + 67308, + 67321, + 67295, + 67307, + 67325, + 67280, + 67338, + 67284, + 67324, + 67284, + 67290, + 67302, + 67298, + 67350, + 67303, + 67265, + 67299, + 67303, + 67265, + 67303, + 67305, + 67297, + 67249, + 67295, + 67269, + 67292, + 67284, + 67291, + 67327, + 67270, + 67288, + 67305, + 67308, + 67272, + 67294, + 67282, + 67286, + 67299, + 67281, + 67310, + 67292, + 67291, + 67312, + 67311, + 67290, + 67270, + 67280, + 67276, + 67298, + 67282, + 67252, + 67299, + 67294, + 67283, + 67263, + 67276, + 67300, + 67327, + 67283, + 67645, + 67298, + 67277, + 67275, + 67310, + 67276, + 67266, + 67279, + 67321, + 67313, + 67271, + 67308, + 67299, + 67300, + 67303, + 67315, + 67305, + 67294, + 67283, + 67323, + 67280, + 67255, + 67261, + 67258, + 67274, + 67317, + 67310, + 67280, + 67283, + 67285, + 67299, + 67320, + 67298, + 67280, + 67297, + 67304, + 67287, + 67313, + 67307, + 67336, + 67310, + 67285, + 67281, + 67314, + 67316, + 67288, + 67301, + 67328, + 67334, + 67272, + 67309, + 67337, + 67326, + 67307, + 67277, + 67275, + 67277, + 67287, + 67292, + 67294, + 67287, + 67284, + 67314, + 67287, + 67286, + 67300, + 67276, + 67281, + 67274, + 67293, + 67262, + 67316, + 67302, + 67318, + 67311, + 67327, + 67285, + 67289, + 67290, + 67299, + 67289, + 67300, + 67330, + 67299, + 67299, + 67311, + 67298, + 67291, + 67262, + 67300, + 67340, + 67283, + 67301, + 67350, + 67324, + 67311, + 67324, + 67307, + 67293, + 67304, + 67306, + 67328, + 67296, + 67318, + 67305, + 67297, + 67320, + 67301, + 67346, + 67300, + 67286, + 67295, + 67369, + 67318, + 67283, + 67305, + 67259, + 67308, + 67296, + 67312, + 67276, + 67317, + 67330, + 67299, + 67325, + 67278, + 67272, + 67292, + 67265, + 67280, + 67271, + 67287, + 67264, + 67322, + 67283, + 67281, + 67285, + 67297, + 67304, + 67298, + 67289, + 67287, + 67316, + 67284, + 67307, + 67293, + 67312, + 67274, + 67337, + 67287, + 67305, + 67289, + 67340, + 67316, + 67291, + 67315, + 67296, + 67302, + 67302, + 67291, + 67322, + 67275, + 67276, + 67277, + 67292, + 67275, + 67290, + 67278, + 67296, + 67312, + 67296, + 67287, + 67296, + 67297, + 67298, + 67325, + 67272, + 67309, + 67317, + 67311, + 67318, + 67280, + 67307, + 67286, + 67296, + 67330, + 67290, + 67264, + 67296, + 67277, + 67274, + 67255, + 67263, + 67251, + 67287, + 67299, + 67287, + 67243, + 67304, + 67279, + 67291, + 67297, + 67330, + 67277, + 67272, + 67317, + 67296, + 67281, + 67305, + 67302, + 67282, + 67309, + 67285, + 67308, + 67291, + 67269, + 67298, + 67280, + 67267, + 67338, + 67261, + 67274, + 67308, + 67306, + 67297, + 67305, + 67298, + 67287, + 67291, + 67295, + 67307, + 67312, + 67284, + 67308, + 67280, + 67285, + 67300, + 67299, + 67311, + 67296, + 67311, + 67292, + 67298, + 67347, + 67294, + 67308, + 67286, + 67279, + 67319, + 67305, + 67271, + 67304, + 67317, + 67286, + 67311, + 67311, + 67279, + 67300, + 67301, + 67277, + 67308, + 67288, + 67330, + 67308, + 67310, + 67276, + 67289, + 67267, + 67271, + 67296, + 67272, + 67286, + 67252, + 67284, + 67259, + 67290, + 67322, + 67342, + 67268, + 67336, + 67282, + 67282, + 67278, + 67289, + 67355, + 67311, + 67310, + 67302, + 67309, + 67301, + 67315, + 67294, + 67316, + 67300, + 67274, + 67326, + 67307, + 67322, + 67273, + 67287, + 67309, + 67286, + 67307, + 67320, + 67347, + 67263, + 67311, + 67286, + 67344, + 67305, + 67268, + 67274, + 67298, + 67295, + 67293, + 67284, + 67255, + 67358, + 67273, + 67275, + 67296, + 67326, + 67344, + 67317, + 67272, + 67351, + 67308, + 67332, + 67318, + 67330, + 67304, + 67255, + 67289, + 67268, + 67328, + 67323, + 67277, + 67331, + 67279, + 67332, + 67262, + 67294, + 67308, + 67284, + 67289, + 67296, + 67315, + 67325, + 67302, + 67257, + 67320, + 67277, + 67277, + 67302, + 67264, + 67296, + 67264, + 67266, + 67312, + 67313, + 67311, + 67279, + 67306, + 67295, + 67300, + 67308, + 67304, + 67303, + 67262, + 67302, + 67308, + 67263, + 67313, + 67256, + 67453, + 67302, + 67276, + 67321, + 67276, + 67275, + 67292, + 67289, + 67261, + 67259, + 67264, + 67292, + 67304, + 67255, + 67314, + 67266, + 67294, + 67294, + 67290, + 67291, + 67276, + 67264, + 67306, + 67259, + 67297, + 67273, + 67263, + 67287, + 67299, + 67326, + 67289, + 67360, + 67292, + 67308, + 67284, + 67276, + 67280, + 67295, + 67266, + 67338, + 67277, + 67294, + 67274, + 67302, + 67304, + 67316, + 67298, + 67274, + 67303, + 67445, + 67421, + 67285, + 67292, + 67311, + 67305, + 67315, + 67279, + 67342, + 67268, + 67285, + 67294, + 67307, + 67321, + 67320, + 67268, + 67300, + 67298, + 67362, + 67353, + 67313, + 67335, + 67296, + 67359, + 67265, + 67271, + 67294, + 67294, + 67310, + 67269, + 67293, + 67309, + 67296, + 67288, + 67324, + 67306, + 67307, + 67269, + 67245, + 67294, + 67286, + 67263, + 67284, + 67289, + 67270, + 67260, + 67286, + 67294, + 67300, + 67287, + 67247, + 67296, + 67300, + 67291, + 67283, + 67308, + 67308, + 67316, + 67287, + 67282, + 67306, + 67284, + 67275, + 67299, + 67311, + 67277, + 67285, + 67293, + 67279, + 67307, + 67315, + 67304, + 67315, + 67336, + 67289, + 67267, + 67308, + 67267, + 67319, + 67289, + 67269, + 67288, + 67312, + 67269, + 67301, + 67328, + 67314, + 67294, + 67298, + 67328, + 67296, + 67346, + 67315, + 67313, + 67312, + 67280, + 67312, + 67283, + 67279, + 67286, + 67257, + 67257, + 67294, + 67297, + 67268, + 67257, + 67310, + 67254, + 67326, + 67287, + 67283, + 67261, + 67321, + 67303, + 67307, + 67303, + 67298, + 67322, + 67296, + 67322, + 67281, + 67280, + 67319, + 67380, + 67284, + 67297, + 67292, + 67271, + 67314, + 67299, + 67287, + 67262, + 67316, + 67279, + 67329, + 67265, + 67304, + 67267, + 67313, + 67297, + 67304, + 67299, + 67268, + 67291, + 67298, + 67297, + 67282, + 67479, + 67337, + 67317, + 67309, + 67280, + 67326, + 67363, + 67283, + 67351, + 67326, + 67290, + 67281, + 67301, + 67291, + 67306, + 67288, + 67334, + 67290, + 67310, + 67298, + 67299, + 67304, + 67298, + 67322, + 67358, + 67334, + 67299, + 67296, + 67278, + 67290, + 67274, + 67319, + 67271, + 67351, + 67308, + 67306, + 67291, + 67264, + 67299, + 67251, + 67308, + 67264, + 67262, + 67294, + 67268, + 67281, + 67331, + 67278, + 67350, + 67269, + 67271, + 67311, + 67314, + 67277, + 67262, + 67255, + 67312, + 67267, + 67307, + 67317, + 67260, + 67254, + 67296, + 67312, + 67321, + 67265, + 67267, + 67276, + 67321, + 67314, + 67329, + 67302, + 67325, + 67362, + 67326, + 67287, + 67266, + 67300, + 67304, + 67275, + 67301, + 67281, + 67275, + 67310, + 67299, + 67290, + 67310, + 67308, + 67272, + 67280, + 67289, + 67311, + 67296, + 67257, + 67298, + 67330, + 67329, + 67285, + 67298, + 67317, + 67292, + 67328, + 67312, + 67332, + 67350, + 67284, + 67294, + 67301, + 67394, + 67324, + 67296, + 67280, + 67300, + 67301, + 67323, + 67305, + 67324, + 67305, + 67305, + 67310, + 67296, + 67279, + 67333, + 67295, + 67282, + 67314, + 67325, + 67289, + 67300, + 67308, + 67292, + 67284, + 67363, + 67320, + 67290, + 67288, + 67296, + 67298, + 67308, + 67272, + 67301, + 67302, + 67337, + 67304, + 67331, + 67313, + 67317, + 67306, + 67310, + 67285, + 67326, + 67273, + 67312, + 67273, + 67286, + 67283, + 67308, + 67281, + 67315, + 67304, + 67284, + 67305, + 67285, + 67292, + 67302, + 67302, + 67308, + 67297, + 67284, + 67303, + 67285, + 67308, + 67291, + 67306, + 67297, + 67318, + 67282, + 67296, + 67289, + 67305, + 67290, + 67268, + 67313, + 67305, + 67301, + 67275, + 67255, + 67284, + 67293, + 67330, + 67296, + 67299, + 67310, + 67298, + 67252, + 67294, + 67297, + 67286, + 67323, + 67271, + 67285, + 67316, + 67318, + 67293, + 67294, + 67279, + 67246, + 67285, + 67316, + 67257, + 67307, + 67307, + 67278, + 67325, + 67285, + 67277, + 67269, + 67305, + 67302, + 67294, + 67323, + 67321, + 67275, + 67273, + 67294, + 67322, + 67262, + 67299, + 67268, + 67290, + 67297, + 67268, + 67301, + 67327, + 67299, + 67313, + 67318, + 67286, + 67301, + 67326, + 67311, + 67282, + 67292, + 67272, + 67266, + 67301, + 67277, + 67287, + 67296, + 67292, + 67306, + 67327, + 67260, + 67295, + 67305, + 67317, + 67290, + 67273, + 67307, + 67311, + 67289, + 67307, + 67249, + 67307, + 67320, + 67267, + 67320, + 67288, + 67280, + 67301, + 67312, + 67328, + 67293, + 67271, + 67300, + 67279, + 67294, + 67341, + 67288, + 67270, + 67300, + 67303, + 67290, + 67295, + 67305, + 67286, + 67299, + 67295, + 67286, + 67255, + 67326, + 67322, + 67333, + 67290, + 67300, + 67316, + 67280, + 67305, + 67271, + 67270, + 67326, + 67323, + 67299, + 67278, + 67310, + 67336, + 67300, + 67319, + 67320, + 67316, + 67314, + 67335, + 67307, + 67296, + 67272, + 67297, + 67390, + 67307, + 67326, + 67298, + 67288, + 67261, + 67277, + 67278, + 67279, + 67258, + 67282, + 67315, + 67323, + 67285, + 67299, + 67297, + 67264, + 67325, + 67269, + 67266, + 67289, + 67307, + 67293, + 67286, + 67282, + 67309, + 67298, + 67299, + 67267, + 67261, + 67302, + 67316, + 67305, + 67266, + 67302, + 67271, + 67383, + 67311, + 67314, + 67268, + 67285, + 67288, + 67287, + 67305, + 67315, + 67292, + 67296, + 67263, + 67310, + 67274, + 67289, + 67269, + 67286, + 67308, + 67313, + 67374, + 67337, + 67321, + 67295, + 67271, + 67295, + 67308, + 67329, + 67303, + 67315, + 67324, + 67312, + 67270, + 67281, + 67299, + 67296, + 67289, + 67286, + 67292, + 67288, + 67267, + 67309, + 67277, + 67392, + 67287, + 67280, + 67336, + 67279, + 67293, + 67305, + 67328, + 67285, + 67285, + 67293, + 67292, + 67279, + 67307, + 67289, + 67298, + 67291, + 67373, + 67306, + 67296, + 67304, + 67301, + 67291, + 67341, + 67298, + 67286, + 67291, + 67277, + 67301, + 67292, + 67267, + 67270, + 67292, + 67279, + 67264, + 67286, + 67297, + 67291, + 67307, + 67264, + 67321, + 67286, + 67305, + 67308, + 67325, + 67305, + 67347, + 67314, + 67286, + 67277, + 67288, + 67288, + 67303, + 67282, + 67282, + 67289, + 67267, + 67334, + 67305, + 67265, + 67347, + 67270, + 67287, + 67260, + 67302, + 67299, + 67372, + 67295, + 67287, + 67271, + 67274, + 67267, + 67292, + 67323, + 67251, + 67279, + 67313, + 67309, + 67292, + 67276, + 67281, + 67323, + 67277, + 67266, + 67268, + 67294, + 67280, + 67290, + 67351, + 67331, + 67256, + 67315, + 67283, + 67284, + 67300, + 67322, + 67310, + 67267, + 67277, + 67309, + 67349, + 67307, + 67314, + 67285, + 67302, + 67280, + 67303, + 67278, + 67309, + 67302, + 67276, + 67283, + 67287, + 67292, + 67271, + 67297, + 67285, + 67273, + 67319, + 67277, + 67297, + 67308, + 67290, + 67311, + 67336, + 67350, + 67282, + 67275, + 67281, + 67343, + 67299, + 67300, + 67296, + 67295, + 67283, + 67299, + 67312, + 67273, + 67298, + 67282, + 67300, + 67319, + 67282, + 67284, + 67311, + 67281, + 67337, + 67294, + 67293, + 67300, + 67314, + 67301, + 67287, + 67317, + 67289, + 67347, + 67322, + 67315, + 67313, + 67299, + 67275, + 67252, + 67274, + 67322, + 67304, + 67310, + 67298, + 67312, + 67326, + 67289, + 67330, + 67288, + 67303, + 67284, + 67291, + 67274, + 67328, + 67295, + 67283, + 67300, + 67282, + 67284, + 67279, + 67288, + 67328, + 67315, + 67354, + 67273, + 67281, + 67285, + 67270, + 67256, + 67290, + 67317, + 67334, + 67321, + 67264, + 67266, + 67274, + 67321, + 67260, + 67294, + 67652, + 67307, + 67282, + 67271, + 67305, + 67252, + 67325, + 67330, + 67369, + 67283, + 67289, + 67287, + 67358, + 67304, + 67306, + 67285, + 67282, + 67286, + 67317, + 67320, + 67292, + 67284, + 67319, + 67307, + 67306, + 67287, + 67292, + 67274, + 67301, + 67302, + 67330, + 67292, + 67388, + 67321, + 67295, + 67269, + 67290, + 67336, + 67279, + 67270, + 67290, + 67320, + 67295, + 67292, + 67314, + 67315, + 67259, + 67299, + 67285, + 67313, + 67293, + 67291, + 67306, + 67266, + 67343, + 67329, + 67261, + 67281, + 67309, + 67335, + 67353, + 67341, + 67261, + 67326, + 67295, + 67293, + 67299, + 67293, + 67310, + 67318, + 67297, + 67300, + 67312, + 67272, + 67312, + 67305, + 67258, + 67307, + 67280, + 67301, + 67307, + 67266, + 67272, + 67256, + 67320, + 67290, + 67258, + 67304, + 67334, + 67298, + 67284, + 67589, + 67327, + 67272, + 67288, + 67280, + 67298, + 67290, + 67304, + 67303, + 67338, + 67269, + 67316, + 67283, + 67289, + 67314, + 67295, + 67318, + 67277, + 67340, + 67308, + 67298, + 67335, + 67309, + 67332, + 67573, + 67268, + 67282, + 67308, + 67284, + 67308, + 67286, + 67267, + 67298, + 67290, + 67308, + 67312, + 67273, + 67320, + 67289, + 67304, + 67284, + 67282, + 67306, + 67290, + 67286, + 67278, + 67286, + 67285, + 67299, + 67290, + 67283, + 67286, + 67270, + 67262, + 67329, + 67307, + 67270, + 67305, + 67286, + 67278, + 67293, + 67334, + 67274, + 67302, + 67295, + 67318, + 67300, + 67293, + 67307, + 67252, + 67302, + 67309, + 67282, + 67354, + 67302, + 67287, + 67266, + 67302, + 67302, + 67297, + 67300, + 67317, + 67305, + 67289, + 67262, + 67292, + 67285, + 67323, + 67275, + 67310, + 67306, + 67310, + 67300, + 67314, + 67307, + 67271, + 67294, + 67301, + 67288, + 67296, + 67300, + 67262, + 67325, + 67318, + 68009, + 67286, + 67264, + 67272, + 67322, + 67318, + 67262, + 67288, + 67280, + 67266, + 67323, + 67295, + 67296, + 67306, + 67300, + 67295, + 67281, + 67300, + 67271, + 67279, + 67307, + 67272, + 67344, + 67309, + 67274, + 67298, + 67293, + 67305, + 67325, + 67277, + 67336, + 67296, + 67267, + 67292, + 67279, + 67301, + 67279, + 67305, + 67290, + 67287, + 67406, + 67294, + 67252, + 67317, + 67288, + 67289, + 67281, + 67280, + 67300, + 67271, + 67304, + 67286, + 67300, + 67335, + 67313, + 67308, + 67320, + 67277, + 67298, + 67322, + 67259, + 67300, + 67292, + 67268, + 67278, + 67298, + 67342, + 67341, + 67283, + 67291, + 67307, + 67285, + 67308, + 67269, + 67308, + 67335, + 67302, + 67324, + 67333, + 67295, + 67284, + 67316, + 67294, + 67329, + 67327, + 67309, + 67298, + 67331, + 67301, + 67271, + 67293, + 67310, + 67276, + 67296, + 67269, + 67330, + 67310, + 67268, + 67275, + 67311, + 67297, + 67323, + 67286, + 67265, + 67265, + 67280, + 67275, + 67298, + 67289, + 67294, + 67292, + 67272, + 67264, + 67330, + 67264, + 67327, + 67269, + 67300, + 67264, + 67288, + 67272, + 67305, + 67310, + 67325, + 67325, + 67322, + 67317, + 67277, + 67299, + 67302, + 67325, + 67323, + 67292, + 67309, + 67259, + 67275, + 67290, + 67297, + 67269, + 67273, + 67284, + 67272, + 67264, + 67325, + 67278, + 67266, + 67304, + 67274, + 67280, + 67279, + 67266, + 67293, + 67330, + 67280, + 67315, + 67341, + 67293, + 67336, + 67287, + 67288, + 67280, + 67272, + 67279, + 67297, + 67325, + 67289, + 67367, + 67316, + 67296, + 67275, + 67301, + 67300, + 67313, + 67322, + 67295, + 67286, + 67322, + 67323, + 67318, + 67336, + 67287, + 67264, + 67257, + 67302, + 67327, + 67320, + 67293, + 67288, + 67279, + 67280, + 67291, + 67331, + 67277, + 67289, + 67285, + 67310, + 67308, + 67273, + 67276, + 67312, + 67346, + 67295, + 67278, + 67306, + 67263, + 67307, + 67319, + 67287, + 67323, + 67309, + 67252, + 67312, + 67330, + 67306, + 67291, + 67313, + 67301, + 67311, + 67265, + 67300, + 67284, + 67263, + 67430, + 67295, + 67312, + 67268, + 67282, + 67264, + 67290, + 67370, + 67302, + 67264, + 67276, + 67305, + 67288, + 67301, + 67286, + 67295, + 67312, + 67280, + 67274, + 67285, + 67315, + 67294, + 67308, + 67298, + 67266, + 67282, + 67296, + 67326, + 67325, + 67296, + 67268, + 67260, + 67289, + 67331, + 67316, + 67312, + 67339, + 67317, + 67274, + 67314, + 67294, + 67325, + 67278, + 67293, + 67309, + 67264, + 67294, + 67323, + 67279, + 67281, + 67266, + 67302, + 67302, + 67291, + 67272, + 67272, + 67299, + 67278, + 67311, + 67297, + 67294, + 67318, + 67287, + 67294, + 67267, + 67287, + 67293, + 67283, + 67317, + 67262, + 67265, + 67305, + 67298, + 67281, + 67277, + 67319, + 67295, + 67291, + 67298, + 67316, + 67294, + 67293, + 67277, + 67283, + 67306, + 67299, + 67294, + 67320, + 67325, + 67269, + 67284, + 67283, + 67308, + 67285, + 67292, + 67319, + 67292, + 67300, + 67352, + 67303, + 67331, + 67291, + 67265, + 67286, + 67278, + 67328, + 67297, + 67284, + 67302, + 67320, + 67274, + 67293, + 67319, + 67307, + 67284, + 67287, + 67291, + 67285, + 67299, + 67279, + 67308, + 67319, + 67293, + 67290, + 67285, + 67338, + 67318, + 67315, + 67340, + 67304, + 67241, + 67317, + 67325, + 67285, + 67311, + 67326, + 67267, + 67294, + 67296, + 67294, + 67325, + 67275, + 67263, + 67264, + 67258, + 67308, + 67311, + 67300, + 67272, + 67294, + 67272, + 67301, + 67302, + 67293, + 67261, + 67317, + 67296, + 67298, + 67289, + 67299, + 67280, + 67259, + 67274, + 67303, + 67326, + 67313, + 67289, + 67293, + 67282, + 67295, + 67301, + 67290, + 67306, + 67295, + 67317, + 67299, + 67255, + 67297, + 67311, + 67319, + 67283, + 67259, + 67292, + 67275, + 67301, + 67285, + 67283, + 67295, + 67316, + 67296, + 67279, + 67287, + 67339, + 67291, + 67312, + 67270, + 67277, + 67296, + 67284, + 67293, + 67283, + 67272, + 67268, + 67270, + 67315, + 67312, + 67316, + 67272, + 67285, + 67319, + 67282, + 67256, + 67310, + 67306, + 67318, + 67320, + 67276, + 67305, + 67310, + 67264, + 67308, + 67286, + 67282, + 67254, + 67298, + 67285, + 67334, + 67316, + 67273, + 67281, + 67305, + 67287, + 67308, + 67286, + 67264, + 67305, + 67302, + 67297, + 67294, + 67315, + 67275, + 67298, + 67309, + 67310, + 67287, + 67303, + 67313, + 67273, + 67282, + 67276, + 67278, + 67295, + 67277, + 67316, + 67312, + 67274, + 67268, + 67334, + 67290, + 67311, + 67295, + 67292, + 67255, + 67273, + 67267, + 67330, + 67311, + 67301, + 67316, + 67297, + 67313, + 67320, + 67292, + 67315, + 67332, + 67324, + 67285, + 67296, + 67282, + 67296, + 67275, + 67283, + 67296, + 67299, + 67291, + 67303, + 67311, + 67290, + 67320, + 67282, + 67317, + 67276, + 67279, + 67315, + 67297, + 67294, + 67281, + 67279, + 67318, + 67296, + 67298, + 67283, + 67280, + 67281, + 67293, + 67322, + 67303, + 67280, + 67265, + 67282, + 67307, + 67296, + 67272, + 67289, + 67289, + 67286, + 67301, + 67298, + 67315, + 67289, + 67332, + 67272, + 67278, + 67275, + 67300, + 67279, + 67328, + 67332, + 67303, + 67288, + 67301, + 67260, + 67339, + 67293, + 67264, + 67268, + 67290, + 67303, + 67307, + 67304, + 67268, + 67295, + 67345, + 67312, + 67288, + 67323, + 67267, + 67283, + 67265, + 67263, + 67301, + 67314, + 67310, + 67267, + 67293, + 67307, + 67297, + 67288, + 67286, + 67282, + 67327, + 67282, + 67294, + 67353, + 67345, + 67334, + 67322, + 67275, + 67311, + 67270, + 67331, + 67292, + 67337, + 67346, + 67310, + 67285, + 67298, + 67292, + 67312, + 67289, + 67305, + 67279, + 67298, + 67330, + 67308, + 67302, + 67284, + 67342, + 67284, + 67280, + 67278, + 67297, + 67268, + 67313, + 67294, + 67279, + 67293, + 67258, + 67303, + 67285, + 67305, + 67289, + 67278, + 67308, + 67290, + 67290, + 67286, + 67283, + 67299, + 67294, + 67386, + 67300, + 67279, + 67269, + 67324, + 67343, + 67299, + 67286, + 67331, + 67274, + 67261, + 67340, + 67272, + 67317, + 67258, + 67302, + 67299, + 67334, + 67245, + 67312, + 67283, + 67257, + 67305, + 67302, + 67286, + 67291, + 67290, + 67292, + 67294, + 67330, + 67321, + 67310, + 67295, + 67285, + 67262, + 67295, + 67274, + 67328, + 67279, + 67278, + 67320, + 67274, + 67286, + 67273, + 67293, + 67328, + 67291, + 67266, + 67315, + 67283, + 67320, + 67303, + 67337, + 67315, + 67334, + 67299, + 67306, + 67282, + 67292, + 67277, + 67362, + 67310, + 67320, + 67308, + 67289, + 67319, + 67298, + 67295, + 67318, + 67314, + 67311, + 67334, + 67284, + 67304, + 67313, + 67330, + 67289, + 67299, + 67308, + 67296, + 67943, + 67318, + 67310, + 67282, + 67278, + 67291, + 67276, + 67306, + 67275, + 67272, + 67271, + 67326, + 67290, + 67291, + 67276, + 67271, + 67270, + 67276, + 67291, + 67305, + 67263, + 67283, + 67291, + 67306, + 67304, + 67283, + 67342, + 67334, + 67270, + 67322, + 67288, + 67324, + 67279, + 67286, + 67274, + 67293, + 67286, + 67280, + 67325, + 67259, + 67281, + 67294, + 67333, + 67304, + 67286, + 67280, + 67293, + 67290, + 67297, + 67328, + 67304, + 67298, + 67300, + 67289, + 67316, + 67305, + 67279, + 67280, + 67309, + 67287, + 67240, + 67315, + 67349, + 67304, + 67297, + 67302, + 67296, + 67304, + 67296, + 67293, + 67331, + 67272, + 67295, + 67314, + 67314, + 67265, + 67283, + 67295, + 67248, + 67273, + 67276, + 67294, + 67307, + 67291, + 67281, + 67308, + 67315, + 67329, + 67620, + 67316, + 67327, + 67303, + 67306, + 67306, + 67276, + 67318, + 67277, + 67274, + 67304, + 67291, + 67326, + 67319, + 67320, + 67299, + 67315, + 67293, + 67269, + 67266, + 67280, + 67294, + 67726, + 67424, + 67303, + 67281, + 67314, + 67277, + 67301, + 67261, + 67326, + 67305, + 67300, + 67284, + 67304, + 67260, + 67296, + 67325, + 67297, + 67275, + 67263, + 67339, + 67292, + 67318, + 67391, + 67337, + 67279, + 67316, + 67302, + 67330, + 67285, + 67344, + 67296, + 67397, + 67299, + 67319, + 67299, + 67302, + 67310, + 67265, + 67303, + 67320, + 67284, + 67280, + 67290, + 67302, + 67312, + 67306, + 67300, + 67284, + 67304, + 67313, + 67316, + 67313, + 67315, + 67287, + 67322, + 67320, + 67327, + 67260, + 67303, + 67267, + 67292, + 67321, + 67262, + 67301, + 67284, + 67299, + 67266, + 67303, + 67269, + 67308, + 67314, + 67303, + 67285, + 67279, + 67309, + 67327, + 67290, + 67307, + 67283, + 67310, + 67298, + 67309, + 67284, + 67252, + 67316, + 67294, + 67278, + 67298, + 67281, + 67292, + 67269, + 67301, + 67302, + 67328, + 67302, + 67296, + 67294, + 67267, + 67305, + 67301, + 67287, + 67259, + 67306, + 67309, + 67319, + 67306, + 67287, + 67285, + 67299, + 67347, + 67301, + 67255, + 67297, + 67324, + 67258, + 67301, + 67269, + 67349, + 67292, + 67332, + 67307, + 67300, + 67329, + 67302, + 67288, + 67323, + 67293, + 67268, + 67290, + 67245, + 67319, + 67291, + 67280, + 67331, + 67312, + 67317, + 67305, + 67258, + 67299, + 67280, + 67283, + 67293, + 67278, + 67293, + 67282, + 67299, + 67312, + 67297, + 67295, + 67294, + 67265, + 67284, + 67293, + 67353, + 67305, + 67303, + 67323, + 67367, + 67282, + 67281, + 67282, + 67317, + 67309, + 67277, + 67252, + 67297, + 67287, + 67238, + 67297, + 67320, + 67301, + 67304, + 67264, + 67300, + 67292, + 67350, + 67305, + 67297, + 67263, + 67300, + 67321, + 67286, + 67291, + 67302, + 67314, + 67308, + 67318, + 67294, + 67267, + 67307, + 67263, + 67316, + 67285, + 67304, + 67287, + 67294, + 67282, + 67307, + 67305, + 67291, + 67315, + 67314, + 67307, + 67282, + 67302, + 67321, + 67300, + 67299, + 67311, + 67320, + 67355, + 67284, + 67275, + 67291, + 67310, + 67312, + 67289, + 67297, + 67279, + 67283, + 67285, + 67317, + 67322, + 67320, + 67290, + 67278, + 67300, + 67308, + 67301, + 67311, + 67299, + 67297, + 67344, + 67308, + 67321, + 67349, + 67302, + 67306, + 67286, + 67282, + 67313, + 67281, + 67259, + 67298, + 67299, + 67282, + 67300, + 67298, + 67291, + 67328, + 67302, + 67317, + 67290, + 67303, + 67312, + 67333, + 67297, + 67293, + 67298, + 67311, + 67271, + 67296, + 67301, + 67309, + 67309, + 67297, + 67298, + 67294, + 67274, + 67250, + 67309, + 67289, + 67312, + 67260, + 67258, + 67299, + 67340, + 67283, + 67316, + 67298, + 67302, + 67356, + 67298, + 67305, + 67307, + 67283, + 67276, + 67292, + 67262, + 67245, + 67311, + 67264, + 67272, + 67283, + 67291, + 67308, + 67258, + 67269, + 67302, + 67274, + 67286, + 67306, + 67271, + 67272, + 67311, + 67261, + 67327, + 67285, + 67289, + 67307, + 67307, + 67310, + 67277, + 67325, + 67258, + 67275, + 67313, + 67290, + 67305, + 67324, + 67319, + 67274, + 67278, + 67258, + 67312, + 67295, + 67259, + 67294, + 67302, + 67287, + 67305, + 67286, + 67286, + 67274, + 67268, + 67271, + 67300, + 67315, + 67288, + 67291, + 67320, + 67320, + 67265, + 67287, + 67274, + 67332, + 67283, + 67272, + 67305, + 67257, + 67301, + 67304, + 67274, + 67297, + 67312, + 67263, + 67292, + 67286, + 67272, + 67264, + 67278, + 67320, + 67284, + 67286, + 67291, + 67299, + 67271, + 67297, + 67341, + 67295, + 67311, + 67308, + 67304, + 67328, + 67282, + 67300, + 67336, + 67335, + 67265, + 67313, + 67303, + 67299, + 67297, + 67304, + 67298, + 67288, + 67287, + 67298, + 67320, + 67258, + 67288, + 67274, + 67293, + 67317, + 67303, + 67322, + 67295, + 67288, + 67314, + 67264, + 67300, + 67322, + 67282, + 67284, + 67295, + 67298, + 67306, + 67266, + 67247, + 67281, + 67277, + 67272, + 67297, + 67303, + 67286, + 67361, + 67316, + 67285, + 67293, + 67316, + 67276, + 67293, + 67295, + 67296, + 67336, + 67282, + 67271, + 67329, + 67299, + 67292, + 67293, + 67312, + 67308, + 67313, + 67276, + 67307, + 67302, + 67293, + 67287, + 67286, + 67299, + 67283, + 67292, + 67268, + 67294, + 67325, + 67313, + 67305, + 67317, + 67296, + 67332, + 67271, + 67304, + 67316, + 67275, + 67285, + 67297, + 67293, + 67279, + 67291, + 67293, + 67315, + 67303, + 67323, + 67295, + 67331, + 67329, + 67337, + 67304, + 67283, + 67328, + 67271, + 67314, + 67288, + 67678, + 67274, + 67315, + 67267, + 67299, + 67270, + 67299, + 67282, + 67276, + 67276, + 67303, + 67327, + 67313, + 67284, + 67303, + 67295, + 67269, + 67305, + 67322, + 67291, + 67291, + 67276, + 67309, + 67274, + 67302, + 67326, + 67276, + 67301, + 67262, + 67292, + 67264, + 67330, + 67281, + 67307, + 67302, + 67273, + 67276, + 67301, + 67331, + 67318, + 67304, + 67270, + 67276, + 67300, + 67309, + 67275, + 67300, + 67292, + 67331, + 67312, + 67312, + 67277, + 67292, + 67265, + 67428, + 67293, + 67297, + 67326, + 67312, + 67287, + 67276, + 67375, + 67285, + 67311, + 67323, + 67328, + 67264, + 67308, + 67303, + 67287, + 67298, + 67337, + 67286, + 67280, + 67317, + 67326, + 67349, + 67303, + 67323, + 67301, + 67263, + 67303, + 67301, + 67285, + 67288, + 67324, + 67322, + 67299, + 67286, + 67288, + 67311, + 67297, + 67295, + 67312, + 67268, + 67301, + 67326, + 67316, + 67315, + 67327, + 67261, + 67302, + 67280, + 67294, + 67300, + 67276, + 67277, + 67317, + 67302, + 67334, + 67279, + 67289, + 67315, + 67328, + 67293, + 67285, + 67295, + 67312, + 67284, + 67297, + 67295, + 67269, + 67313, + 67289, + 67249, + 67307, + 67305, + 67330, + 67266, + 67277, + 67270, + 67347, + 67307, + 67294, + 67289, + 67270, + 67292, + 67262, + 67270, + 67327, + 67274, + 67296, + 67283, + 67289, + 67315, + 67328, + 67262, + 67294, + 67305, + 67300, + 67316, + 67321, + 67333, + 67302, + 67281, + 67315, + 67309, + 67315, + 67293, + 67323, + 67336, + 67341, + 67466, + 67309, + 67296, + 67271, + 67299, + 67308, + 67352, + 67318, + 67274, + 67319, + 67562, + 67296, + 67330, + 67308, + 67313, + 67309, + 67308, + 67344, + 67280, + 67294, + 67289, + 67281, + 67309, + 67287, + 67278, + 67259, + 67288, + 67317, + 67302, + 67276, + 67291, + 67305, + 67294, + 67321, + 67274, + 67322, + 67320, + 67324, + 67310, + 67271, + 67308, + 67280, + 67284, + 67303, + 67299, + 67282, + 67282, + 67331, + 67291, + 67301, + 67326, + 67272, + 67315, + 67324, + 67302, + 67257, + 67298, + 67312, + 67292, + 67251, + 67283, + 67304, + 67327, + 67295, + 67314, + 67312, + 67275, + 67285, + 67357, + 67299, + 67300, + 67277, + 67269, + 67324, + 67326, + 67299, + 67289, + 67308, + 67285, + 67301, + 67300, + 67281, + 67272, + 67319, + 67285, + 67307, + 67288, + 67311, + 67323, + 67302, + 67286, + 67282, + 67304, + 67315, + 67271, + 67298, + 67301, + 67304, + 67297, + 67318, + 67299, + 67307, + 67300, + 67348, + 67321, + 67330, + 67300, + 67322, + 67355, + 67304, + 67323, + 67298, + 67321, + 67285, + 67286, + 67254, + 67304, + 67328, + 67320, + 67314, + 67317, + 67268, + 67280, + 67276, + 67268, + 67311, + 67259, + 67284, + 67331, + 67290, + 67316, + 67309, + 67321, + 67350, + 67292, + 67319, + 67343, + 67343, + 67307, + 67298, + 67310, + 67290, + 67278, + 67304, + 67273, + 67305, + 67303, + 67341, + 67311, + 67319, + 67306, + 67350, + 67315, + 67256, + 67284, + 67255, + 67287, + 67275, + 67305, + 67277, + 67286, + 67276, + 67317, + 67312, + 67291, + 67347, + 67284, + 67333, + 67348, + 67352, + 67293, + 67316, + 67292, + 67333, + 67281, + 67300, + 67286, + 67307, + 67313, + 67312, + 67281, + 67315, + 67294, + 67304, + 67281, + 67322, + 67331, + 67321, + 67262, + 67298, + 67309, + 67290, + 67301, + 67279, + 67292, + 67310, + 67283, + 67300, + 67308, + 67298, + 67329, + 67308, + 67355, + 67311, + 67310, + 67325, + 67298, + 67315, + 67305, + 67310, + 67314, + 67350, + 67311, + 67265, + 67346, + 67349, + 67271, + 67331, + 67259, + 67317, + 67291, + 67298, + 67317, + 67331, + 67337, + 67296, + 67339, + 67307, + 67276, + 67328, + 67316, + 67264, + 67293, + 67296, + 67314, + 67304, + 67287, + 67337, + 67291, + 67299, + 67318, + 67335, + 67307, + 67307, + 67290, + 67286, + 67288, + 67323, + 67366, + 67289, + 67306, + 67295, + 67302, + 67305, + 67312, + 67427, + 67389, + 67302, + 67305, + 67324, + 67336, + 67332, + 67305, + 67305, + 67299, + 67293, + 67311, + 67281, + 67287, + 67281, + 67294, + 67331, + 67327, + 67301, + 67284, + 67303, + 67333, + 67288, + 67328, + 67296, + 67337, + 67336, + 67284, + 67348, + 67289, + 67281, + 67294, + 67319, + 67304, + 67272, + 67317, + 67284, + 67283, + 67334, + 67304, + 67340, + 67286, + 67277, + 67314, + 67348, + 67298, + 67281, + 67311, + 67349, + 67326, + 67303, + 67286, + 67290, + 67330, + 67319, + 67315, + 67270, + 67284, + 67301, + 67302, + 67318, + 67302, + 67270, + 67279, + 67318, + 67287, + 67295, + 67322, + 67320, + 67310, + 67337, + 67312, + 67330, + 67282, + 67299, + 67304, + 67319, + 67309, + 67294, + 67275, + 67316, + 67331, + 67275, + 67283, + 67296, + 67288, + 67313, + 67300, + 67309, + 67326, + 67303, + 67294, + 67365, + 67304, + 67321, + 67327, + 67301, + 67295, + 67271, + 67266, + 67283, + 67286, + 67287, + 67272, + 67298, + 67317, + 67295, + 67334, + 67281, + 67302, + 67290, + 67322, + 67290, + 67283, + 67269, + 67298, + 67293, + 67316, + 67302, + 67325, + 67319, + 67303, + 67299, + 67275, + 67295, + 67289, + 67325, + 67319, + 67313, + 67303, + 67267, + 67276, + 67341, + 67318, + 67263, + 67274, + 67285, + 67344, + 67298, + 67281, + 67283, + 67283, + 67289, + 67311, + 67284, + 67295, + 67309, + 67333, + 67306, + 67292, + 67285, + 67273, + 67317, + 67255, + 67323, + 67308, + 67258, + 67345, + 67305, + 67270, + 67300, + 67332, + 67292, + 67279, + 67293, + 67295, + 67302, + 67352, + 67306, + 67288, + 67331, + 67293, + 67275, + 67313, + 67298, + 67315, + 67323, + 67301, + 67286, + 67304, + 67295, + 67323, + 67318, + 67340, + 67272, + 67274, + 67289, + 67291, + 67326, + 67297, + 67309, + 67304, + 67306, + 67328, + 67281, + 67301, + 67283, + 67312, + 67297, + 67298, + 67319, + 67307, + 67294, + 67322, + 67325, + 67319, + 67292, + 67342, + 67337, + 67287, + 67302, + 67293, + 67333, + 67327, + 67318, + 67332, + 67350, + 67310, + 67330, + 67290, + 67312, + 67270, + 67299, + 67332, + 67311, + 67272, + 67292, + 67311, + 67324, + 67300, + 67271, + 67303, + 67329, + 67312, + 67276, + 67326, + 67342, + 67316, + 67343, + 67300, + 67315, + 67339, + 67341, + 67304, + 67316, + 67299, + 67283, + 67311, + 67310, + 67281, + 67297, + 67297, + 67300, + 67313, + 67277, + 67291, + 67316, + 67338, + 67281, + 67356, + 67272, + 67282, + 67260, + 67289, + 67246, + 67277, + 67293, + 67316, + 67321, + 67279, + 67291, + 67262, + 67296, + 67311, + 67273, + 67260, + 67297, + 67279, + 67278, + 67271, + 67280, + 67275, + 67284, + 67309, + 67289, + 67284, + 67271, + 67305, + 67302, + 67297, + 67320, + 67291, + 67302, + 67293, + 67293, + 67303, + 67300, + 67296, + 67283, + 67279, + 67289, + 67301, + 67313, + 67313, + 67326, + 67310, + 67336, + 67280, + 67314, + 67359, + 67330, + 67306, + 67285, + 67285, + 67281, + 67309, + 67296, + 67324, + 67300, + 67301, + 67275, + 67301, + 67336, + 67307, + 67289, + 67333, + 67282, + 67282, + 67313, + 67323, + 67330, + 67323, + 67295, + 67286, + 67298, + 67310, + 67295, + 67308, + 67299, + 67331, + 67334, + 67307, + 67318, + 67308, + 67316, + 67292, + 67284, + 67322, + 67281, + 67304, + 67308, + 67311, + 67286, + 67269, + 67285, + 67301, + 67325, + 67331, + 67289, + 67349, + 67317, + 67330, + 67314, + 67289, + 67293, + 67272, + 67339, + 67321, + 67269, + 67288, + 67278, + 67306, + 67300, + 67304, + 67303, + 67300, + 67279, + 67340, + 67261, + 67250, + 67327, + 67284, + 67327, + 67266, + 67292, + 67765, + 67287, + 67322, + 67273, + 67330, + 67287, + 67320, + 67309, + 67317, + 67282, + 67305, + 67270, + 67303, + 67295, + 67279, + 67275, + 67305, + 67277, + 67246, + 67299, + 67277, + 67317, + 67310, + 67312, + 67331, + 67340, + 67287, + 67281, + 67287, + 67295, + 67267, + 67273, + 67296, + 67284, + 67315, + 67303, + 67279, + 67336, + 67287, + 67287, + 67305, + 67287, + 67311, + 67300, + 67302, + 67291, + 67313, + 67298, + 67270, + 67438, + 67318, + 67280, + 67258, + 67280, + 67299, + 67312, + 67336, + 67331, + 67303, + 67303, + 67284, + 67301, + 67324, + 67278, + 67328, + 67255, + 67310, + 67305, + 67337, + 67337, + 67321, + 67318, + 67309, + 67284, + 67302, + 67295, + 67306, + 67308, + 67311, + 67324, + 67300, + 67292, + 67340, + 67323, + 67307, + 67319, + 67311, + 67255, + 67302, + 67316, + 67294, + 67296, + 67311, + 67260, + 67306, + 67333, + 67313, + 67326, + 67304, + 67305, + 67297, + 67295, + 67257, + 67278, + 67319, + 67284, + 67266, + 67284, + 67315, + 67282, + 67268, + 67312, + 67292, + 67319, + 67279, + 67265, + 67301, + 67298, + 67290, + 67305, + 67316, + 67314, + 67329, + 67320, + 67317, + 67315, + 67362, + 67346, + 67305, + 67291, + 67345, + 67334, + 67337, + 67273, + 67316, + 67689, + 67612, + 67302, + 67292, + 67294, + 67307, + 67268, + 67341, + 67331, + 67272, + 67333, + 67295, + 67298, + 67287, + 67314, + 67279, + 67309, + 67290, + 67281, + 67285, + 67318, + 67350, + 67306, + 67296, + 67265, + 67306, + 67312, + 67286, + 67277, + 67289, + 67287, + 67311, + 67270, + 67342, + 67326, + 67302, + 67267, + 67318, + 67288, + 67314, + 67317, + 67326, + 67306, + 67322, + 67267, + 67570, + 67348, + 67302, + 67293, + 67278, + 67283, + 67296, + 67258, + 67288, + 67277, + 67273, + 67281, + 67287, + 67310, + 67339, + 67312, + 67282, + 67292, + 67313, + 67310, + 67293, + 67294, + 67291, + 67292, + 67306, + 67310, + 67320, + 67296, + 67263, + 67251, + 67323, + 67323, + 67340, + 67300, + 67317, + 67317, + 67304, + 67262, + 67282, + 67322, + 67272, + 67276, + 67282, + 67348, + 67286, + 67283, + 67288, + 67290, + 67280, + 67316, + 67291, + 67322, + 67279, + 67338, + 67291, + 67294, + 67309, + 67290, + 67304, + 67327, + 67297, + 67312, + 67346, + 67271, + 67287, + 67338, + 67318, + 67702, + 67307, + 67271, + 67264, + 67301, + 67270, + 67288, + 67280, + 67293, + 67295, + 67310, + 67289, + 67279, + 67292, + 67268, + 67330, + 67318, + 67312, + 67286, + 67320, + 67323, + 67317, + 67301, + 67340, + 67307, + 67301, + 67296, + 67290, + 67279, + 67303, + 67274, + 67292, + 67297, + 67296, + 67318, + 67285, + 67336, + 67306, + 67318, + 67297, + 67300, + 67265, + 67279, + 67314, + 67286, + 67302, + 67298, + 67308, + 67273, + 67296, + 67308, + 67285, + 67322, + 67297, + 67304, + 67327, + 67331, + 67298, + 67299, + 67302, + 67305, + 67289, + 67320, + 67319, + 67270, + 67258, + 67251, + 67304, + 67298, + 67306, + 67276, + 67304, + 67304, + 67288, + 67258, + 67275, + 67295, + 67328, + 67328, + 67274, + 67270, + 67324, + 67289, + 67287, + 67330, + 67317, + 67320, + 67327, + 67264, + 67304, + 67275, + 67287, + 67318, + 67293, + 67275, + 67269, + 67304, + 67344, + 67298, + 67290, + 67264, + 67323, + 67345, + 67295, + 67289, + 67271, + 67345, + 67259, + 67318, + 67299, + 67320, + 67323, + 67333, + 67288, + 67322, + 67297, + 67295, + 67307, + 67282, + 67303, + 67298, + 67289, + 67343, + 67273, + 67280, + 67303, + 67283, + 67324, + 67330, + 67293, + 67334, + 67273, + 67289, + 67293, + 67293, + 67313, + 67298, + 67316, + 67305, + 67277, + 67345, + 67269, + 67309, + 67293, + 67301, + 67290, + 67310, + 67278, + 67303, + 67273, + 67294, + 67294, + 67280, + 67276, + 67315, + 67289, + 67315, + 67312, + 67285, + 67290, + 67260, + 67306, + 67311, + 67299, + 67291, + 67282, + 67313, + 67303, + 67288, + 67288, + 67299, + 67322, + 67316, + 67317, + 67275, + 67259, + 67260, + 67271, + 67299, + 67287, + 67346, + 67253, + 67288, + 67321, + 67300, + 67282, + 67343, + 67280, + 67297, + 67273, + 67291, + 67272, + 67312, + 67298, + 67286, + 67315, + 67278, + 67278, + 67343, + 67326, + 67315, + 67296, + 67278, + 67316, + 67348, + 67328, + 67295, + 67306, + 67278, + 67331, + 67292, + 67356, + 67310, + 67300, + 67317, + 67286, + 67318, + 67308, + 67276, + 67285, + 67269, + 67319, + 67275, + 67296, + 67265, + 67276, + 67284, + 67282, + 67287, + 67305, + 67322, + 67313, + 67307, + 67296, + 67335, + 67251, + 67288, + 67324, + 67257, + 67292, + 67288, + 67315, + 67336, + 67320, + 67316, + 67309, + 67318, + 67282, + 67309, + 67996, + 67292, + 67268, + 67286, + 67284, + 67259, + 67340, + 67256, + 67350, + 67309, + 67269, + 67282, + 67341, + 67298, + 67264, + 67272, + 67333, + 67279, + 67300, + 67281, + 67300, + 67326, + 67316, + 67292, + 67277, + 67252, + 67308, + 67283, + 67242, + 67370, + 67305, + 67308, + 67279, + 67295, + 67312, + 67336, + 67263, + 67292, + 67279, + 67336, + 67294, + 67299, + 67300, + 67257, + 67463, + 67294, + 67283, + 67302, + 67264, + 67315, + 67260, + 67272, + 67299, + 67327, + 67302, + 67330, + 67307, + 67320, + 67310, + 67273, + 67404, + 67281, + 67302, + 67339, + 67318, + 67290, + 67325, + 67347, + 67315, + 67309, + 67280, + 67265, + 67301, + 67296, + 67265, + 67322, + 67299, + 67308, + 67275, + 67273, + 67259, + 67290, + 67322, + 67302, + 67280, + 67287, + 67268, + 67273, + 67270, + 67277, + 67278, + 67310, + 67303, + 67312, + 67289, + 67299, + 67300, + 67289, + 67296, + 67346, + 67324, + 67316, + 67310, + 67282, + 67330, + 67289, + 67281, + 67279, + 67294, + 67293, + 67280, + 67290, + 67329, + 67309, + 67298, + 67320, + 67331, + 67317, + 67306, + 67330, + 67295, + 67293, + 67318, + 67370, + 67322, + 67299, + 67287, + 67322, + 67285, + 67280, + 67265, + 67293, + 67307, + 67286, + 67306, + 67278, + 67268, + 67287, + 67304, + 67302, + 67301, + 67317, + 67273, + 67325, + 67267, + 67292, + 67298, + 67340, + 67287, + 67301, + 67273, + 67325, + 67282, + 67310, + 67306, + 67316, + 67330, + 67323, + 67276, + 67268, + 67313, + 67273, + 67298, + 67270, + 67269, + 67286, + 67310, + 67309, + 67321, + 67271, + 67329, + 67299, + 67307, + 67308, + 67286, + 67390, + 67279, + 67291, + 67339, + 67318, + 67292, + 67331, + 67282, + 67318, + 67309, + 67283, + 67342, + 67271, + 67300, + 67302, + 67290, + 67271, + 67331, + 67305, + 67311, + 67304, + 67286, + 67293, + 67324, + 67277, + 67323, + 67298, + 67271, + 67292, + 67275, + 67289, + 67275, + 67294, + 67283, + 67285, + 67305, + 67290, + 67304, + 67316, + 67278, + 67304, + 67286, + 67283, + 67288, + 67278, + 67287, + 67286, + 67274, + 67281, + 67282, + 67306, + 67305, + 67270, + 67299, + 67270, + 67267, + 67298, + 67305, + 67304, + 67279, + 67291, + 67318, + 67286, + 67261, + 67298, + 67276, + 67260, + 67316, + 67302, + 67296, + 67309, + 67282, + 67324, + 67294, + 67305, + 67284, + 67298, + 67311, + 67301, + 67285, + 67252, + 67292, + 67291, + 67305, + 67291, + 67291, + 67276, + 67282, + 67272, + 67322, + 67307, + 67290, + 67322, + 67256, + 67256, + 67263, + 67314, + 67277, + 67292, + 67310, + 67265, + 67327, + 67325, + 67257, + 67314, + 67293, + 67306, + 67296, + 67333, + 67305, + 67266, + 67290, + 67299, + 67288, + 67278, + 67318, + 67285, + 67269, + 67267, + 67282, + 67312, + 67273, + 67258, + 67309, + 67273, + 67302, + 67325, + 67264, + 67288, + 67278, + 67302, + 67298, + 67306, + 67335, + 67333, + 67337, + 67255, + 67324, + 67290, + 67312, + 67327, + 67296, + 67269, + 67278, + 67294, + 67315, + 67336, + 67313, + 67324, + 67298, + 67290, + 67282, + 67310, + 67277, + 67311, + 67289, + 67294, + 67315, + 67303, + 67331, + 67281, + 67297, + 67272, + 67298, + 67296, + 67295, + 67267, + 67315, + 67277, + 67358, + 67360, + 67274, + 67305, + 67314, + 67283, + 67425, + 67285, + 67285, + 67307, + 67264, + 67331, + 67314, + 67314, + 67304, + 67352, + 67314, + 67287, + 67285, + 67283, + 67280, + 67312, + 67290, + 67269, + 67304, + 67291, + 67291, + 67311, + 67282, + 67325, + 67305, + 67294, + 67285, + 67304, + 67340, + 67307, + 67321, + 67296, + 67257, + 67279, + 67275, + 67299, + 67274, + 67276, + 67240, + 67271, + 67281, + 67309, + 67296, + 67289, + 67252, + 67247, + 67280, + 67289, + 67289, + 67268, + 67318, + 67307, + 67279, + 67336, + 67264, + 67251, + 67338, + 67325, + 67306, + 67289, + 67359, + 67313, + 67295, + 67331, + 67297, + 67297, + 67292, + 67278, + 67261, + 67288, + 67304, + 67445, + 67293, + 67264, + 67305, + 67282, + 67297, + 67291, + 67306, + 67288, + 67275, + 67293, + 67284, + 67307, + 67307, + 67302, + 67277, + 67309, + 67281, + 67282, + 67287, + 67258, + 67284, + 67260, + 67304, + 67296, + 67312, + 67321, + 67278, + 67301, + 67255, + 67298, + 67283, + 67356, + 67319, + 67309, + 67293, + 67290, + 67307, + 67287, + 67312, + 67294, + 67302, + 67290, + 67325, + 67307, + 67323, + 67278, + 67304, + 67326, + 67267, + 67276, + 67315, + 67323, + 67283, + 67257, + 67270, + 67316, + 67312, + 67337, + 67321, + 67315, + 67291, + 67301, + 67283, + 67313, + 67314, + 67314, + 67318, + 67297, + 67294, + 67306, + 67314, + 67305, + 67289, + 67286, + 67266, + 67313, + 67313, + 67286, + 67307, + 67292, + 67313, + 67286, + 67333, + 67293, + 67320, + 67297, + 67302, + 67297, + 67338, + 67326, + 67292, + 67303, + 67294, + 67324, + 67329, + 67303, + 67308, + 67274, + 67299, + 67326, + 67323, + 67330, + 67260, + 67332, + 67286, + 67299, + 67314, + 67320, + 67302, + 67288, + 67303, + 67298, + 67305, + 67334, + 67330, + 67296, + 67311, + 67302, + 67321, + 67326, + 67316, + 67341, + 67268, + 67288, + 67294, + 67341, + 67331, + 67324, + 67285, + 67289, + 67303, + 67282, + 67281, + 67303, + 67292, + 67302, + 67319, + 67283, + 67277, + 67317, + 67284, + 67292, + 67324, + 67336, + 67315, + 67311, + 67328, + 67293, + 67329, + 67300, + 67287, + 67285, + 67332, + 67320, + 67281, + 67282, + 67337, + 67258, + 67278, + 67305, + 67268, + 67319, + 67294, + 67337, + 67271, + 67333, + 67299, + 67281, + 67294, + 67288, + 67322, + 67277, + 67313, + 67294, + 67321, + 67305, + 67317, + 67299, + 67324, + 67353, + 67337, + 67303, + 67296, + 67303, + 67305, + 67332, + 67298, + 67285, + 67297, + 67288, + 67315, + 67295, + 67314, + 67287, + 67277, + 67253, + 67291, + 67316, + 67303, + 67287, + 67303, + 67249, + 67278, + 67299, + 67283, + 67309, + 67285, + 67324, + 67280, + 67300, + 67297, + 67296, + 67335, + 67287, + 67263, + 67289, + 67316, + 67300, + 67261, + 67294, + 67288, + 67291, + 67280, + 67312, + 67268, + 67309, + 67314, + 67294, + 67275, + 67253, + 67297, + 67262, + 67301, + 67288, + 67264, + 67297, + 67279, + 67274, + 67296, + 67283, + 67300, + 67288, + 67298, + 67300, + 67289, + 67295, + 67282, + 67320, + 67278, + 67314, + 67317, + 67285, + 67314, + 67301, + 67302, + 67316, + 67271, + 67252, + 67293, + 67278, + 67326, + 67291, + 67298, + 67293, + 67296, + 67276, + 67293, + 67311, + 67266, + 67306, + 67381, + 67313, + 67365, + 67318, + 67267, + 67785, + 67276, + 67317, + 67308, + 67326, + 67308, + 67311, + 67312, + 67260, + 67275, + 67336, + 67332, + 67291, + 67292, + 67284, + 67268, + 67286, + 67312, + 67317, + 67313, + 67285, + 67278, + 67286, + 67294, + 67296, + 67267, + 67294, + 67335, + 67277, + 67323, + 67266, + 67312, + 67307, + 67276, + 67290, + 67316, + 67332, + 67270, + 67277, + 67280, + 67272, + 67289, + 67290, + 67287, + 67410, + 67281, + 67283, + 67294, + 67287, + 67260, + 67296, + 67326, + 67315, + 67331, + 67307, + 67323, + 67349, + 67277, + 67332, + 67309, + 67263, + 67303, + 67287, + 67264, + 67284, + 67308, + 67283, + 67284, + 67305, + 67324, + 67303, + 67294, + 67285, + 67284, + 67312, + 67271, + 67292, + 67305, + 67301, + 67298, + 67291, + 67341, + 67337, + 67344, + 67296, + 67333, + 67323, + 67343, + 67291, + 67289, + 67280, + 67307, + 67286, + 67276, + 67257, + 67303, + 67295, + 67307, + 67265, + 67340, + 67300, + 67286, + 67274, + 67314, + 67306, + 67292, + 67301, + 67291, + 67320, + 67266, + 67287, + 67312, + 67315, + 67299, + 67260, + 67313, + 67306, + 67295, + 67266, + 67301, + 67310, + 67276, + 67328, + 67276, + 67303, + 67293, + 67270, + 67286, + 67276, + 67273, + 67305, + 67294, + 67291, + 67296, + 67320, + 67265, + 67299, + 67336, + 67268, + 67295, + 67299, + 67309, + 67803, + 67323, + 67338, + 67291, + 67271, + 67282, + 67352, + 67280, + 67319, + 67407, + 67344, + 67283, + 67283, + 67323, + 67328, + 67329, + 67309, + 67312, + 67279, + 67311, + 67289, + 67279, + 67284, + 67326, + 67383, + 67308, + 67289, + 67283, + 67282, + 67284, + 67307, + 67286, + 67312, + 67301, + 67305, + 67283, + 67265, + 67327, + 67330, + 67307, + 67278, + 67345, + 67265, + 67288, + 67305, + 67295, + 67291, + 67297, + 67296, + 67290, + 67309, + 67292, + 67308, + 67326, + 67309, + 67315, + 67291, + 67309, + 67296, + 67257, + 67300, + 67323, + 67334, + 67307, + 67292, + 67296, + 67314, + 67305, + 67289, + 67313, + 67300, + 67296, + 67325, + 67292, + 67308, + 67264, + 67325, + 67284, + 67275, + 67278, + 67269, + 67282, + 67274, + 67298, + 67297, + 67284, + 67307, + 67355, + 67288, + 67337, + 67316, + 67271, + 67294, + 67318, + 67308, + 67275, + 67259, + 67295, + 67300, + 67292, + 67312, + 67286, + 67348, + 67287, + 67301, + 67286, + 67280, + 67271, + 67282, + 67350, + 67330, + 67298, + 67286, + 67290, + 67283, + 67279, + 67283, + 67274, + 67282, + 67276, + 67257, + 67272, + 67320, + 67295, + 67333, + 67320, + 67269, + 67308, + 67318, + 67278, + 67315, + 67284, + 67299, + 67256, + 67262, + 67266, + 67303, + 67300, + 67314, + 67283, + 67295, + 67283, + 67292, + 67327, + 67292, + 67277, + 67296, + 67325, + 67357, + 67272, + 67316, + 67306, + 67352, + 67304, + 67348, + 67293, + 67287, + 67285, + 67320, + 67321, + 67272, + 67292, + 67276, + 67295, + 67273, + 67313, + 67284, + 67299, + 67259, + 67297, + 67286, + 67321, + 67275, + 67329, + 67303, + 67306, + 67291, + 67295, + 67268, + 67277, + 67278, + 67341, + 67303, + 67310, + 67325, + 67285, + 67367, + 67302, + 67310, + 67293, + 67315, + 67309, + 67270, + 67321, + 67300, + 67283, + 67336, + 67311, + 67310, + 67313, + 67285, + 67295, + 67313, + 67331, + 67300, + 67296, + 67314, + 67363, + 67313, + 67272, + 67310, + 67262, + 67322, + 67293, + 67314, + 67312, + 67279, + 67289, + 67284, + 67288, + 67330, + 67316, + 67276, + 67271, + 67288, + 67296, + 67298, + 67300, + 67277, + 67286, + 67291, + 67310, + 67310, + 67267, + 67280, + 67316, + 67292, + 67275, + 67306, + 67286, + 67296, + 67300, + 67290, + 67268, + 67301, + 67288, + 67277, + 67312, + 67308, + 67292, + 67274, + 67280, + 67293, + 67308, + 67270, + 67353, + 67280, + 67287, + 67271, + 67295, + 67293, + 67241, + 67296, + 67283, + 67291, + 67335, + 67299, + 67283, + 67293, + 67285, + 67294, + 67281, + 67327, + 67280, + 67282, + 67347, + 67277, + 67302, + 67309, + 67317, + 67307, + 67290, + 67294, + 67323, + 67258, + 67279, + 67286, + 67294, + 67268, + 67283, + 67264, + 67263, + 67295, + 67302, + 67289, + 67324, + 67339, + 67289, + 67300, + 67340, + 67317, + 67302, + 67288, + 67301, + 67325, + 67300, + 67293, + 67321, + 67296, + 67330, + 67295, + 67252, + 67276, + 67303, + 67274, + 67271, + 67283, + 67275, + 67295, + 67285, + 67278, + 67271, + 67306, + 67283, + 67298, + 67310, + 67277, + 67361, + 67505, + 67290, + 67297, + 67278, + 67319, + 67302, + 67326, + 67308, + 67331, + 67311, + 67323, + 67323, + 67343, + 67317, + 67299, + 67355, + 67311, + 67312, + 67307, + 67269, + 67335, + 67279, + 67335, + 67294, + 67331, + 67278, + 67282, + 67302, + 67309, + 67309, + 67293, + 67322, + 67295, + 67292, + 67290, + 67280, + 67304, + 67260, + 67310, + 67311, + 67268, + 67280, + 67314, + 67279, + 67314, + 67312, + 67313, + 67276, + 67310, + 67272, + 67292, + 67291, + 67304, + 67301, + 67300, + 67313, + 67313, + 67261, + 67297, + 67265, + 67292, + 67308, + 67292, + 67313, + 67351, + 67301, + 67316, + 67319, + 67287, + 67326, + 67303, + 67325, + 67309, + 67305, + 67297, + 67299, + 67299, + 67286, + 67293, + 67290, + 67313, + 67321, + 67304, + 67315, + 67298, + 67298, + 67336, + 67329, + 67313, + 67288, + 67263, + 67319, + 67292, + 67305, + 67285, + 67304, + 67287, + 67284, + 67325, + 67278, + 67314, + 67256, + 67370, + 67283, + 67277, + 67291, + 67281, + 67314, + 67261, + 67289, + 67285, + 67314, + 67312, + 67337, + 67326, + 67320, + 67271, + 67322, + 67351, + 67309, + 67298, + 67288, + 67320, + 67348, + 67277, + 67306, + 67322, + 67282, + 67311, + 67289, + 67321, + 67332, + 67342, + 67315, + 67310, + 67287, + 67279, + 67320, + 67271, + 67311, + 67264, + 67304, + 67297, + 67341, + 67300, + 67326, + 67291, + 67264, + 67332, + 67311, + 67303, + 67346, + 67323, + 67294, + 67284, + 67256, + 67273, + 67354, + 67298, + 67782, + 67349, + 67315, + 67290, + 67294, + 67284, + 67311, + 67302, + 67307, + 67338, + 67299, + 67306, + 67284, + 67277, + 67302, + 67317, + 67311, + 67287, + 67286, + 67280, + 67302, + 67310, + 67308, + 67281, + 67288, + 67270, + 67277, + 67300, + 67347, + 67330, + 67282, + 67298, + 67300, + 67275, + 67285, + 67274, + 67286, + 67278, + 67280, + 67289, + 67270, + 67310, + 67315, + 67287, + 67294, + 67308, + 67342, + 67290, + 67309, + 67309, + 67275, + 67324, + 67320, + 67292, + 67311, + 67340, + 67319, + 67321, + 67282, + 67324, + 67302, + 67329, + 67275, + 67300, + 67290, + 67290, + 67305, + 67269, + 67312, + 67286, + 67274, + 67269, + 67311, + 67276, + 67271, + 67294, + 67301, + 67307, + 67323, + 67325, + 67276, + 67305, + 67282, + 67293, + 67292, + 67317, + 67311, + 67300, + 67301, + 67309, + 67297, + 67322, + 67300, + 67280, + 67335, + 67279, + 67332, + 67322, + 67312, + 67296, + 67310, + 67315, + 67327, + 67337, + 67293, + 67330, + 67349, + 67317, + 67301, + 67255, + 67288, + 67309, + 67316, + 67291, + 67303, + 67278, + 67320, + 67391, + 67284, + 67339, + 67331, + 67341, + 67343, + 67295, + 67320, + 67318, + 67295, + 67298, + 67328, + 67341, + 67315, + 67318, + 67295, + 67267, + 67318, + 67279, + 67313, + 67314, + 67290, + 67310, + 67312, + 67321, + 67320, + 67322, + 67289, + 67324, + 67285, + 67318, + 67315, + 67279, + 67318, + 67315, + 67318, + 67285, + 67290, + 67299, + 67310, + 67305, + 67293, + 67329, + 67325, + 67281, + 67332, + 67327, + 67307, + 67310, + 67322, + 67301, + 67280, + 67302, + 67295, + 67263, + 67295, + 67308, + 67269, + 67281, + 67255, + 67283, + 67280, + 67302, + 67336, + 67307, + 67298, + 67318, + 67288, + 67264, + 67316, + 67295, + 67295, + 67321, + 67284, + 67295, + 67289, + 67319, + 67307, + 67304, + 67302, + 67281, + 67297, + 67352, + 67311, + 67322, + 67337, + 67303, + 67291, + 67281, + 67291, + 67266, + 67293, + 67334, + 67315, + 67295, + 67279, + 67298, + 67301, + 67330, + 67342, + 67312, + 67328, + 67313, + 67314, + 67304, + 67280, + 67313, + 67275, + 67347, + 67336, + 67306, + 67317, + 67305, + 67307, + 67282, + 67318, + 67308, + 67333, + 67365, + 67272, + 67339, + 67306, + 67287, + 67256, + 67301, + 67298, + 67278, + 67276, + 67259, + 67273, + 67307, + 67376, + 67311, + 67295, + 67287, + 67300, + 67305, + 67312, + 67301, + 67300, + 67320, + 67296, + 67286, + 67324, + 67285, + 67306, + 67314, + 67343, + 67312, + 67281, + 67302, + 67306, + 67284, + 67299, + 67296, + 67309, + 67296, + 67316, + 67267, + 67311, + 67326, + 67272, + 67289, + 67295, + 67330, + 67283, + 67322, + 67284, + 67320, + 67307, + 67296, + 67292, + 67290, + 67341, + 67302, + 67295, + 67324, + 67263, + 67283, + 67304, + 67277, + 67313, + 67314, + 67293, + 67297, + 67291, + 67293, + 67308, + 67325, + 67297, + 67276, + 67301, + 67305, + 67316, + 67315, + 67308, + 67330, + 67305, + 67287, + 67295, + 67282, + 67288, + 67268, + 67294, + 67274, + 67292, + 67314, + 67317, + 67321, + 67264, + 67290, + 67287, + 67309, + 67292, + 67290, + 67302, + 67312, + 67278, + 67284, + 67263, + 67298, + 67313, + 67307, + 67312, + 67286, + 67291, + 67280, + 67290, + 67292, + 67304, + 67300, + 67320, + 67339, + 67321, + 67292, + 67332, + 67301, + 67315, + 67306, + 67291, + 67319, + 67329, + 67321, + 67317, + 67277, + 67330, + 67286, + 67302, + 67280, + 67325, + 67307, + 67283, + 67309, + 67329, + 67279, + 67335, + 67301, + 67301, + 67351, + 67313, + 67313, + 67331, + 67299, + 67284, + 67282, + 67296, + 67313, + 67308, + 67308, + 67334, + 67327, + 67309, + 67302, + 67291, + 67288, + 67312, + 67305, + 67979, + 67283, + 67271, + 67286, + 67294, + 67301, + 67275, + 67300, + 67268, + 67264, + 67276, + 67296, + 67324, + 67282, + 67304, + 67302, + 67270, + 67310, + 67313, + 67274, + 67250, + 67306, + 67310, + 67340, + 67279, + 67283, + 67306, + 67328, + 67297, + 67325, + 67255, + 67314, + 67312, + 67327, + 67295, + 67289, + 67276, + 67276, + 67307, + 67304, + 67298, + 67347, + 67329, + 67351, + 67324, + 67315, + 67301, + 67329, + 67270, + 67298, + 67322, + 67329, + 67330, + 67305, + 67281, + 67267, + 67291, + 67303, + 67286, + 67288, + 67295, + 67269, + 67327, + 67284, + 67314, + 67260, + 67257, + 67327, + 67260, + 67263, + 67270, + 67295, + 67289, + 67285, + 67309, + 67293, + 67300, + 67308, + 67304, + 67330, + 67277, + 67254, + 67312, + 67290, + 67338, + 67288, + 67306, + 67313, + 67283, + 67307, + 67322, + 67286, + 67290, + 67267, + 67270, + 67319, + 67288, + 67315, + 67304, + 67262, + 67289, + 67357, + 67287, + 67342, + 67277, + 67296, + 67352, + 67289, + 67318, + 67287, + 67300, + 67299, + 67282, + 67306, + 67334, + 67294, + 67313, + 67283, + 67302, + 67263, + 67324, + 67316, + 67337, + 67251, + 67270, + 67286, + 67270, + 67253, + 67311, + 67297, + 67300, + 67295, + 67288, + 67272, + 67302, + 67300, + 67263, + 67300, + 67286, + 67284, + 67284, + 67287, + 67286, + 67296, + 67298, + 67317, + 67318, + 67307, + 67271, + 67286, + 67322, + 67268, + 67356, + 67291, + 67320, + 67299, + 67312, + 67294, + 67293, + 67320, + 67329, + 67273, + 67278, + 67284, + 67288, + 67307, + 67301, + 67292, + 67262, + 67302, + 67278, + 67331, + 67278, + 67274, + 67329, + 67305, + 67317, + 67311, + 67285, + 67282, + 67305, + 67270, + 67287, + 67315, + 67298, + 67281, + 67308, + 67297, + 67283, + 67292, + 67305, + 67287, + 67285, + 67301, + 67325, + 67272, + 67292, + 67299, + 67325, + 67301, + 67244, + 67315, + 67276, + 67369, + 67297, + 67264, + 67304, + 67298, + 67299, + 67317, + 67277, + 67250, + 67271, + 67318, + 67302, + 67314, + 67297, + 67270, + 67308, + 67299, + 67281, + 67308, + 67313, + 67284, + 67303, + 67304, + 67272, + 67281, + 67315, + 67277, + 67278, + 67313, + 67307, + 67279, + 67316, + 67292, + 67310, + 67286, + 67325, + 67346, + 67282, + 67325, + 67316, + 67294, + 67273, + 67321, + 67296, + 67298, + 67282, + 67295, + 67327, + 67302, + 67300, + 67275, + 67332, + 67282, + 67290, + 67306, + 67293, + 67329, + 67303, + 67263, + 67273, + 67314, + 67313, + 67290, + 67273, + 67296, + 67343, + 67295, + 67298, + 67293, + 67293, + 67297, + 67279, + 67321, + 67256, + 67297, + 67282, + 67319, + 67334, + 67334, + 67314, + 67297, + 67256, + 67356, + 67300, + 67314, + 67297, + 67295, + 67301, + 67299, + 67307, + 67303, + 67289, + 67308, + 67313, + 67334, + 67269, + 67334, + 67299, + 67332, + 67314, + 67296, + 67315, + 67281, + 67311, + 67299, + 67309, + 67293, + 67287, + 67315, + 67308, + 67333, + 67289, + 67317, + 67305, + 67299, + 67271, + 67277, + 67291, + 67290, + 67310, + 67293, + 67311, + 67275, + 67296, + 67297, + 67306, + 67296, + 67315, + 67266, + 67299, + 67280, + 67261, + 67323, + 67295, + 67294, + 67321, + 67263, + 67292, + 67350, + 67286, + 67299, + 67295, + 67289, + 67264, + 67273, + 67287, + 67309, + 67312, + 67815, + 67286, + 67281, + 67331, + 67326, + 67293, + 67366, + 67276, + 67292, + 67283, + 67303, + 67269, + 67252, + 67293, + 67313, + 67334, + 67312, + 67338, + 67279, + 67318, + 67301, + 67279, + 67300, + 67308, + 67272, + 67324, + 67299, + 67297, + 67347, + 67290, + 67292, + 67320, + 67313, + 67329, + 67296, + 67306, + 67285, + 67275, + 67285, + 67285, + 67316, + 67302, + 67295, + 67307, + 67325, + 67329, + 67308, + 67293, + 67286, + 67292, + 67312, + 67294, + 67295, + 67301, + 67297, + 67312, + 67304, + 67328, + 67282, + 67296, + 67289, + 67286, + 67291, + 67270, + 67272, + 67270, + 67286, + 67290, + 67360, + 67264, + 67278, + 67295, + 67261, + 67275, + 67323, + 67305, + 67315, + 67304, + 67287, + 67310, + 67319, + 67297, + 67268, + 67301, + 67286, + 67310, + 67289, + 67343, + 67307, + 67292, + 67342, + 67317, + 67316, + 67365, + 67314, + 67317, + 67326, + 67336, + 67286, + 67291, + 67281, + 67276, + 67298, + 67268, + 67289, + 67268, + 67294, + 67286, + 67321, + 67336, + 67326, + 67318, + 67300, + 67300, + 67276, + 67284, + 67302, + 67333, + 67278, + 67285, + 67300, + 67271, + 67281, + 67279, + 67293, + 67268, + 67297, + 67307, + 67305, + 67290, + 67298, + 67294, + 67301, + 67275, + 67320, + 67283, + 67296, + 67275, + 67285, + 67309, + 67278, + 67328, + 67323, + 67293, + 67291, + 67286, + 67312, + 67293, + 67282, + 67313, + 67303 + ], + "sample_count": 15277 + }, + { + "pubkey": "5dbLDVZnU3BPS6rLZ54T1hozwCNtFtWqzsiH9bcG8NmF", + "epoch": 89, + "origin_device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "target_device_pk": "hWffRFpLrsZoF5r9qJS6AL2D9TEmSvPUBEbDrLc111Y", + "link_pk": "9kHVMSBtRs75mpchpDviP2dihQ32nTqoEPb73shn4DU5", + "origin_device_location_pk": "HiJWeiLKcw6tcBmdX65x1Hd1XtjkQXLgEpPBhfkW2qxw", + "target_device_location_pk": "HiJWeiLKcw6tcBmdX65x1Hd1XtjkQXLgEpPBhfkW2qxw", + "origin_device_agent_pk": "FawcUyUPosa6MkTsJhds4Wdy4qQvk1z4vcuMryJhrmBi", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242131943636, + "samples": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "sample_count": 15276 + }, + { + "pubkey": "5LVZ34u4vUaFrV6N63NNtKFu4tAfdbpHy9sXWTjc2EVJ", + "epoch": 89, + "origin_device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "target_device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "link_pk": "9WAHrNe8R8X7TaAx7Ge7bowExDtjD2M1nbVNNxXDgnGg", + "origin_device_location_pk": "CJsM8xrShT5YCR8VbaLKR3dDZMA24X9XkMeBKh6eH9z9", + "target_device_location_pk": "DJX3x93muX4Tnv2yG4aqLL3YntLurDKeR2SFZEF5qWRV", + "origin_device_agent_pk": "qEkxzwaSExKenpUZJFhzGz98j4upY64u8n96KJjFiSp", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242126942776, + "samples": [ + 67213, + 67185, + 67171, + 67426, + 67247, + 67179, + 67192, + 67195, + 67194, + 67177, + 67213, + 67200, + 67161, + 67198, + 67204, + 67183, + 67218, + 67176, + 67166, + 67192, + 67181, + 67209, + 67205, + 67177, + 67199, + 67191, + 67182, + 67168, + 67194, + 67198, + 67172, + 67207, + 67200, + 67187, + 67191, + 67195, + 67175, + 67173, + 67182, + 67174, + 67182, + 67175, + 67210, + 67173, + 67168, + 67214, + 67216, + 67185, + 67210, + 67175, + 67204, + 67194, + 67176, + 67212, + 67172, + 67196, + 67201, + 67180, + 67183, + 67187, + 67228, + 67216, + 67198, + 67218, + 67198, + 67217, + 67200, + 67189, + 67194, + 67214, + 67175, + 67191, + 67166, + 67199, + 67198, + 67180, + 67213, + 67200, + 67208, + 67199, + 67192, + 67225, + 67233, + 67198, + 67204, + 67182, + 67223, + 67201, + 67209, + 67170, + 67193, + 67187, + 67213, + 67204, + 67203, + 67203, + 67208, + 67217, + 67227, + 67205, + 67219, + 67216, + 67242, + 67194, + 67199, + 67174, + 67175, + 67172, + 67181, + 67200, + 67192, + 67193, + 67173, + 67204, + 67242, + 67228, + 67183, + 67173, + 67200, + 67180, + 67193, + 67171, + 67223, + 67191, + 67191, + 67198, + 73873, + 80360, + 80373, + 80397, + 80355, + 80339, + 80335, + 80355, + 80341, + 80338, + 80364, + 80357, + 80348, + 67197, + 67203, + 67205, + 67178, + 67199, + 67205, + 67202, + 67204, + 67234, + 67219, + 67213, + 67181, + 67203, + 67229, + 67209, + 67191, + 67170, + 67190, + 67211, + 67231, + 67189, + 67208, + 67208, + 67169, + 67210, + 67209, + 67204, + 67200, + 67249, + 67214, + 67251, + 67243, + 67236, + 67211, + 67228, + 67204, + 67228, + 67187, + 67245, + 67205, + 67165, + 67220, + 67234, + 67238, + 67179, + 67188, + 67213, + 67215, + 67195, + 67187, + 67216, + 67188, + 67185, + 67205, + 67208, + 67223, + 67197, + 67199, + 67218, + 67188, + 67179, + 67179, + 67213, + 67202, + 67213, + 67171, + 67209, + 67211, + 67201, + 67201, + 67231, + 67190, + 67209, + 67171, + 67186, + 67212, + 67203, + 67199, + 67205, + 67207, + 67210, + 67197, + 67198, + 67151, + 67201, + 67188, + 67198, + 67193, + 67211, + 67191, + 67186, + 67185, + 67188, + 67181, + 67214, + 67199, + 67208, + 67195, + 67186, + 67190, + 67218, + 67166, + 67241, + 67206, + 67217, + 67196, + 67181, + 67211, + 67186, + 67232, + 67229, + 67186, + 67181, + 67342, + 67208, + 67217, + 67209, + 67208, + 67180, + 67206, + 67197, + 67191, + 67230, + 67193, + 67245, + 67233, + 67181, + 67182, + 67210, + 67211, + 67191, + 67183, + 67207, + 67218, + 67215, + 67238, + 67196, + 67212, + 67222, + 67230, + 67266, + 67232, + 67189, + 67215, + 67259, + 67221, + 67221, + 67171, + 67182, + 67204, + 67204, + 67195, + 67208, + 67207, + 67202, + 67212, + 67207, + 67196, + 67179, + 67178, + 67198, + 67182, + 67201, + 67197, + 67193, + 67205, + 67208, + 67173, + 67180, + 67210, + 67215, + 67212, + 67208, + 67209, + 67174, + 67204, + 67178, + 67198, + 67182, + 67186, + 67198, + 67201, + 67209, + 67217, + 67155, + 67171, + 67193, + 67191, + 67214, + 67192, + 67216, + 67177, + 67169, + 67198, + 67196, + 67168, + 67216, + 67193, + 67170, + 67216, + 67203, + 67206, + 67207, + 67192, + 67207, + 67219, + 67217, + 67220, + 67210, + 67216, + 67203, + 67186, + 67203, + 67188, + 67174, + 67210, + 67190, + 67173, + 67207, + 67182, + 67220, + 67222, + 67217, + 67200, + 67198, + 67209, + 67176, + 67208, + 67178, + 67190, + 67206, + 67217, + 67184, + 67212, + 67171, + 67180, + 67182, + 67185, + 67164, + 67177, + 67205, + 67218, + 67390, + 67185, + 67178, + 67178, + 67191, + 67213, + 67178, + 67185, + 67175, + 67196, + 67229, + 67240, + 67199, + 67175, + 67210, + 67211, + 67207, + 67213, + 67179, + 67179, + 67161, + 67190, + 67201, + 67213, + 67192, + 67233, + 67212, + 67230, + 67178, + 67211, + 67187, + 67189, + 67184, + 67182, + 67203, + 67204, + 67219, + 67190, + 67193, + 67172, + 67163, + 67191, + 67174, + 67195, + 67201, + 67192, + 67201, + 67221, + 67223, + 67180, + 67242, + 67203, + 67200, + 67161, + 67208, + 67216, + 67162, + 67201, + 67188, + 67217, + 67185, + 67208, + 67197, + 67168, + 67189, + 67229, + 67236, + 67187, + 67181, + 67180, + 67194, + 67234, + 67199, + 67229, + 67210, + 67193, + 67209, + 67183, + 67218, + 67189, + 67173, + 67233, + 67196, + 67188, + 67233, + 67189, + 67200, + 67197, + 67173, + 67218, + 67220, + 67200, + 67221, + 67196, + 67188, + 67175, + 67192, + 67189, + 67158, + 67192, + 67219, + 67209, + 67219, + 67177, + 67188, + 67217, + 67184, + 67202, + 67187, + 67186, + 67214, + 67219, + 67184, + 67214, + 67208, + 67206, + 67222, + 67209, + 67184, + 67177, + 67233, + 67198, + 67247, + 67204, + 67200, + 67233, + 67193, + 67176, + 67260, + 67211, + 67190, + 67167, + 67220, + 67215, + 67208, + 67243, + 67185, + 67199, + 67167, + 67222, + 67214, + 67214, + 67218, + 67204, + 67183, + 67185, + 67158, + 67207, + 67197, + 67186, + 67198, + 67191, + 67189, + 67199, + 67194, + 67211, + 67197, + 67219, + 67203, + 67174, + 67201, + 67213, + 67180, + 67203, + 67180, + 67216, + 67208, + 67175, + 67205, + 67220, + 67193, + 67172, + 67178, + 67228, + 67195, + 67208, + 67193, + 67209, + 67214, + 67204, + 67164, + 67219, + 67212, + 67180, + 67223, + 67187, + 67218, + 67166, + 67197, + 67180, + 67210, + 67198, + 67203, + 67201, + 67175, + 67205, + 67229, + 67184, + 67216, + 67192, + 67206, + 67205, + 67203, + 67219, + 67225, + 67204, + 67194, + 67200, + 67213, + 67211, + 67200, + 67177, + 67208, + 67179, + 67164, + 67193, + 67185, + 67213, + 67217, + 67164, + 67250, + 67205, + 67224, + 67205, + 67221, + 67194, + 67196, + 67221, + 67190, + 67215, + 67202, + 67204, + 67187, + 67189, + 67188, + 67186, + 67207, + 67188, + 67205, + 67209, + 67166, + 67193, + 67191, + 67182, + 67189, + 67213, + 67211, + 67202, + 67220, + 67207, + 67207, + 67203, + 67234, + 67238, + 67262, + 67201, + 67211, + 67214, + 67201, + 67196, + 67208, + 67183, + 67242, + 67190, + 67184, + 67231, + 67208, + 67200, + 67192, + 67186, + 67217, + 67198, + 67215, + 67192, + 67207, + 67181, + 67176, + 67199, + 67156, + 67155, + 67199, + 67172, + 67211, + 67212, + 67233, + 67200, + 67154, + 67204, + 67231, + 67210, + 67181, + 67197, + 67202, + 67191, + 67264, + 67182, + 67200, + 67177, + 67202, + 67212, + 67199, + 67224, + 67171, + 67203, + 67229, + 67187, + 67179, + 67179, + 67185, + 67228, + 67226, + 67187, + 67219, + 67186, + 67235, + 67245, + 67228, + 67253, + 67205, + 67193, + 67201, + 67200, + 67211, + 67245, + 67199, + 67195, + 67210, + 67200, + 67171, + 67215, + 67196, + 67191, + 67209, + 67199, + 67191, + 67196, + 67179, + 67237, + 67188, + 67218, + 67260, + 67235, + 67177, + 67190, + 67215, + 67238, + 67183, + 67175, + 67220, + 67199, + 67183, + 67177, + 67182, + 67224, + 67184, + 67195, + 67199, + 67209, + 67212, + 67194, + 67216, + 67195, + 67225, + 67206, + 67169, + 67191, + 67193, + 67198, + 67213, + 67186, + 67170, + 67164, + 67184, + 67209, + 67240, + 67210, + 67211, + 67214, + 67250, + 67172, + 67191, + 67185, + 67207, + 67211, + 67197, + 67202, + 67165, + 67218, + 67199, + 67211, + 67174, + 67212, + 67244, + 67199, + 67189, + 67218, + 67216, + 67221, + 67230, + 67206, + 67167, + 67188, + 67203, + 67193, + 67182, + 67214, + 67197, + 67188, + 67196, + 67211, + 67258, + 67188, + 67197, + 67214, + 67175, + 67227, + 67180, + 67223, + 67204, + 67187, + 67227, + 67192, + 67242, + 67177, + 67220, + 67175, + 67194, + 67191, + 67214, + 67211, + 67204, + 67232, + 67199, + 67198, + 67203, + 67173, + 67176, + 67196, + 67207, + 67199, + 67187, + 67185, + 67181, + 67201, + 67213, + 67206, + 67218, + 67190, + 67175, + 67176, + 67220, + 67203, + 67211, + 67192, + 67228, + 67195, + 67260, + 67244, + 67214, + 67225, + 67233, + 67240, + 67183, + 67213, + 67211, + 67219, + 67192, + 67217, + 67190, + 67241, + 67205, + 67184, + 67220, + 67182, + 67188, + 67194, + 67212, + 67251, + 67203, + 67247, + 67203, + 67234, + 67216, + 67229, + 67218, + 67208, + 67201, + 67191, + 67179, + 67190, + 67257, + 67197, + 67243, + 67183, + 67234, + 67230, + 67258, + 67203, + 67178, + 67240, + 67171, + 67218, + 67227, + 67182, + 67187, + 67193, + 67214, + 67210, + 67211, + 67215, + 67202, + 67215, + 67187, + 67227, + 67216, + 67260, + 67199, + 67221, + 67235, + 67196, + 67191, + 67206, + 67256, + 67226, + 67207, + 67225, + 67203, + 67187, + 67204, + 67199, + 67206, + 67225, + 67164, + 67188, + 67225, + 67183, + 67246, + 67191, + 67240, + 67250, + 67222, + 67211, + 67202, + 67177, + 67189, + 67228, + 67219, + 67228, + 67224, + 67195, + 67182, + 67228, + 67189, + 67179, + 67184, + 67185, + 67182, + 67192, + 67264, + 67214, + 67178, + 67248, + 67181, + 67216, + 67258, + 67220, + 67195, + 67198, + 67207, + 67202, + 67205, + 67171, + 67204, + 67198, + 67233, + 67199, + 67205, + 67186, + 67257, + 67217, + 67224, + 67202, + 67200, + 67189, + 67199, + 67174, + 67189, + 67253, + 67181, + 67218, + 67214, + 67198, + 67281, + 67210, + 67179, + 67250, + 67235, + 67212, + 67217, + 67192, + 67208, + 67185, + 67191, + 67194, + 67147, + 67184, + 67220, + 67253, + 67260, + 67212, + 67216, + 67211, + 67201, + 67250, + 67184, + 67251, + 67214, + 67196, + 67171, + 67205, + 67210, + 67188, + 67169, + 67212, + 67195, + 67194, + 67183, + 67190, + 67224, + 67205, + 67182, + 67195, + 67239, + 67183, + 67212, + 67221, + 67242, + 67230, + 67213, + 67202, + 67171, + 67205, + 67194, + 67216, + 67202, + 67204, + 67180, + 67202, + 67205, + 67198, + 67181, + 67209, + 67230, + 67213, + 67205, + 67176, + 67226, + 67200, + 67217, + 67178, + 67184, + 67185, + 67224, + 67173, + 67171, + 67173, + 67205, + 67236, + 67208, + 67223, + 67208, + 67243, + 67184, + 67180, + 67205, + 67217, + 67208, + 67232, + 67208, + 67198, + 67166, + 67248, + 67219, + 67172, + 67167, + 67178, + 67186, + 67217, + 67242, + 67189, + 67193, + 67237, + 67201, + 67205, + 67191, + 67198, + 67191, + 67198, + 67180, + 67213, + 67208, + 67180, + 67203, + 67221, + 67176, + 67230, + 67215, + 67220, + 67210, + 67166, + 67172, + 67222, + 67238, + 67228, + 67212, + 67184, + 67234, + 67205, + 67206, + 67188, + 67245, + 67223, + 67192, + 67238, + 67169, + 67240, + 67192, + 67256, + 67176, + 67175, + 67170, + 67191, + 67233, + 67224, + 67215, + 67188, + 67215, + 67215, + 67203, + 67175, + 67212, + 67178, + 67190, + 67175, + 67184, + 67240, + 67209, + 67209, + 67237, + 67183, + 67205, + 67184, + 67185, + 67230, + 67239, + 67240, + 67230, + 67192, + 67177, + 67205, + 67227, + 67189, + 67172, + 67234, + 67219, + 67187, + 67184, + 67226, + 67203, + 67206, + 67209, + 67242, + 67190, + 67181, + 67198, + 67221, + 67208, + 67196, + 67240, + 67222, + 67199, + 67249, + 67190, + 67246, + 67208, + 67196, + 67207, + 67194, + 67209, + 67217, + 67185, + 67215, + 67213, + 67207, + 67202, + 67204, + 67204, + 67183, + 67208, + 67227, + 67209, + 67200, + 67209, + 67213, + 67210, + 67190, + 67192, + 67189, + 67215, + 67205, + 67212, + 67234, + 67197, + 67215, + 67180, + 67190, + 67195, + 67182, + 67187, + 67200, + 67235, + 67227, + 67217, + 67177, + 67209, + 67210, + 67235, + 67193, + 67189, + 67197, + 67200, + 67203, + 67232, + 67193, + 67231, + 67196, + 67229, + 67197, + 67203, + 67242, + 67172, + 67207, + 67225, + 67212, + 67226, + 67206, + 67162, + 67174, + 67229, + 67216, + 67167, + 67189, + 67216, + 67369, + 67163, + 67216, + 67194, + 67181, + 67195, + 67211, + 67222, + 67229, + 67235, + 67181, + 67211, + 67216, + 67236, + 67174, + 67198, + 67181, + 67230, + 67189, + 67204, + 67203, + 67227, + 67191, + 67219, + 67209, + 67210, + 67192, + 67164, + 67235, + 67231, + 67213, + 67176, + 67190, + 67181, + 67242, + 67224, + 67217, + 67254, + 67186, + 67204, + 67181, + 67190, + 67254, + 67181, + 67208, + 67182, + 67181, + 67178, + 67240, + 67173, + 67230, + 67237, + 67175, + 67208, + 67170, + 67194, + 67187, + 67195, + 67177, + 67215, + 67229, + 67202, + 67182, + 67220, + 67193, + 67263, + 67168, + 67241, + 67190, + 67221, + 67222, + 67199, + 67210, + 67219, + 67212, + 67176, + 67205, + 67194, + 67208, + 67196, + 67224, + 67200, + 67199, + 67241, + 67191, + 67237, + 67193, + 67185, + 67274, + 67173, + 67207, + 67172, + 67222, + 67179, + 67223, + 67193, + 67197, + 67211, + 67189, + 67211, + 67173, + 67238, + 67206, + 67197, + 67197, + 67201, + 67242, + 67227, + 67192, + 67209, + 67168, + 67225, + 67207, + 67232, + 67210, + 67220, + 67208, + 67201, + 67198, + 67182, + 67233, + 67204, + 67199, + 67206, + 67190, + 67180, + 67180, + 67236, + 67214, + 67231, + 67174, + 67214, + 67199, + 67179, + 67194, + 67180, + 67205, + 67223, + 67243, + 67196, + 67165, + 67167, + 67203, + 67216, + 67202, + 67178, + 67218, + 67230, + 67218, + 67182, + 67234, + 67162, + 67221, + 67224, + 67205, + 67169, + 67196, + 67190, + 67169, + 67171, + 67210, + 67180, + 67234, + 67214, + 67175, + 67216, + 67198, + 67179, + 67214, + 67190, + 67168, + 67219, + 67200, + 67216, + 67190, + 67183, + 67176, + 67171, + 67176, + 67192, + 67210, + 67200, + 67194, + 67184, + 67234, + 67236, + 67210, + 67187, + 67228, + 67182, + 67200, + 67190, + 67212, + 67216, + 67211, + 67227, + 67218, + 67179, + 67213, + 67181, + 67215, + 67247, + 67202, + 67178, + 67210, + 67200, + 67193, + 67237, + 67230, + 67173, + 67192, + 67223, + 67166, + 67193, + 67179, + 67222, + 67194, + 67197, + 67160, + 67231, + 67197, + 67208, + 67217, + 67182, + 67177, + 67165, + 67182, + 67231, + 67185, + 67181, + 67212, + 67220, + 67211, + 67180, + 67185, + 67167, + 67199, + 67181, + 67215, + 67190, + 67211, + 67258, + 67211, + 67174, + 67270, + 67208, + 67201, + 67179, + 67213, + 67161, + 67200, + 67186, + 67206, + 67194, + 67214, + 67192, + 67203, + 67241, + 67213, + 67229, + 67191, + 67175, + 67196, + 67204, + 67266, + 67185, + 67187, + 67211, + 67211, + 67207, + 67193, + 67228, + 67185, + 67174, + 67187, + 67232, + 67217, + 67193, + 67218, + 67216, + 67187, + 67238, + 67224, + 67220, + 67192, + 67185, + 67209, + 67224, + 67228, + 67295, + 67183, + 67195, + 67201, + 67197, + 67188, + 67218, + 67209, + 67183, + 67197, + 67197, + 67242, + 67204, + 67185, + 67218, + 67266, + 67189, + 67209, + 67214, + 67189, + 67221, + 67180, + 67217, + 67208, + 67168, + 67214, + 67155, + 67177, + 67215, + 67190, + 67208, + 67218, + 67181, + 67215, + 67218, + 67194, + 67197, + 67206, + 67225, + 67178, + 67211, + 67169, + 67202, + 67194, + 67198, + 67213, + 67211, + 67192, + 67192, + 67178, + 67179, + 67210, + 67191, + 67210, + 67217, + 67194, + 67231, + 67166, + 67225, + 67174, + 67206, + 67209, + 67199, + 67172, + 67222, + 67182, + 67174, + 67210, + 67184, + 67193, + 67197, + 67207, + 67216, + 67214, + 67192, + 67221, + 67208, + 67176, + 67183, + 67199, + 67210, + 67218, + 67204, + 67215, + 67196, + 67238, + 67199, + 67209, + 67204, + 67211, + 67226, + 67197, + 67165, + 67199, + 67208, + 67182, + 67189, + 67212, + 67203, + 67180, + 67185, + 67177, + 67194, + 67205, + 67207, + 67188, + 67216, + 67187, + 67199, + 67203, + 67188, + 67203, + 67229, + 67221, + 67168, + 67176, + 67192, + 67207, + 67184, + 67184, + 67233, + 67209, + 67156, + 67214, + 67224, + 67217, + 67198, + 67202, + 67227, + 67181, + 67181, + 67226, + 67188, + 67351, + 67226, + 67191, + 67183, + 67204, + 67177, + 67205, + 67201, + 67222, + 67215, + 67200, + 67174, + 67176, + 67195, + 67217, + 67206, + 67199, + 67192, + 67183, + 67234, + 67191, + 67239, + 67182, + 67213, + 67192, + 67187, + 67166, + 67243, + 67197, + 67183, + 67217, + 67225, + 67184, + 67185, + 67222, + 67194, + 67188, + 67168, + 67179, + 67255, + 67197, + 67195, + 67215, + 67226, + 67203, + 67192, + 67208, + 67217, + 67188, + 67260, + 67210, + 67215, + 67182, + 67173, + 67181, + 67194, + 67197, + 67267, + 67182, + 67194, + 67207, + 67208, + 67181, + 67204, + 67201, + 67216, + 67213, + 67233, + 67194, + 67181, + 67204, + 67213, + 67184, + 67197, + 67191, + 67209, + 67180, + 67231, + 67190, + 67237, + 67186, + 67224, + 67191, + 67248, + 67204, + 67187, + 67203, + 67187, + 67179, + 67208, + 67183, + 67204, + 67211, + 67181, + 67171, + 67221, + 67234, + 67215, + 67209, + 67219, + 67224, + 67245, + 67232, + 67161, + 67200, + 67184, + 67198, + 67206, + 67194, + 67200, + 67210, + 67240, + 67173, + 67189, + 67212, + 67207, + 67199, + 67251, + 67214, + 67175, + 67231, + 67180, + 67223, + 67218, + 67191, + 67172, + 67168, + 67164, + 67168, + 67202, + 67187, + 67213, + 67174, + 67197, + 67223, + 67198, + 67190, + 67215, + 67187, + 67184, + 67217, + 67222, + 67218, + 67191, + 67237, + 67187, + 67183, + 67197, + 67446, + 67175, + 67210, + 67224, + 67205, + 67233, + 67188, + 67201, + 67203, + 67220, + 67214, + 67204, + 67222, + 67184, + 67173, + 67184, + 67194, + 67205, + 67189, + 67203, + 67181, + 67239, + 67216, + 67244, + 67243, + 67225, + 67204, + 67208, + 67199, + 67196, + 67259, + 67200, + 67234, + 67183, + 67206, + 67197, + 67207, + 67166, + 67224, + 67192, + 67211, + 67227, + 67189, + 67178, + 67216, + 67214, + 67204, + 67225, + 67198, + 67200, + 67205, + 67235, + 67172, + 67194, + 67205, + 67228, + 67194, + 67174, + 67202, + 67194, + 67208, + 67205, + 67197, + 67181, + 67218, + 67199, + 67185, + 67207, + 67194, + 67183, + 67214, + 67175, + 67179, + 67176, + 67234, + 67205, + 67196, + 67202, + 67181, + 67228, + 67177, + 67211, + 67200, + 67200, + 67213, + 67225, + 67201, + 67199, + 67195, + 67195, + 67203, + 67195, + 67167, + 67187, + 67262, + 67211, + 67215, + 67198, + 67196, + 67201, + 67193, + 67196, + 67200, + 67192, + 67185, + 67162, + 67231, + 67195, + 67200, + 67184, + 67175, + 67183, + 67181, + 67199, + 67194, + 67195, + 67203, + 67218, + 67176, + 67210, + 67184, + 67205, + 67189, + 67198, + 67204, + 67235, + 67208, + 67227, + 67192, + 67202, + 67180, + 67244, + 67214, + 67218, + 67252, + 67242, + 67206, + 67218, + 67225, + 67168, + 67170, + 67210, + 67208, + 67201, + 67174, + 67204, + 67193, + 67166, + 67155, + 67185, + 67194, + 67199, + 67183, + 67202, + 67186, + 67192, + 67210, + 67174, + 67171, + 67197, + 67176, + 67174, + 67205, + 67175, + 67174, + 67199, + 67286, + 67200, + 67205, + 67166, + 67197, + 67203, + 67185, + 67186, + 67202, + 67206, + 67196, + 67175, + 67190, + 67210, + 67206, + 67193, + 67187, + 67245, + 67192, + 67212, + 67177, + 67211, + 67197, + 67208, + 67239, + 67186, + 67191, + 67170, + 67182, + 67179, + 67189, + 67213, + 67171, + 67173, + 67174, + 67187, + 67204, + 67223, + 67189, + 67165, + 67171, + 67179, + 67196, + 67199, + 67215, + 67227, + 67218, + 67171, + 67185, + 67240, + 67198, + 67216, + 67573, + 67193, + 67206, + 67210, + 67232, + 67195, + 67241, + 67174, + 67196, + 67230, + 67202, + 67187, + 67182, + 67220, + 67222, + 67175, + 67206, + 67219, + 67208, + 67236, + 67225, + 67193, + 67222, + 67202, + 67218, + 67162, + 67245, + 67326, + 67222, + 67202, + 67257, + 67215, + 67215, + 67214, + 67192, + 67188, + 67193, + 67188, + 67191, + 67187, + 67207, + 67207, + 67215, + 67203, + 67211, + 67223, + 67266, + 67202, + 67168, + 67191, + 67204, + 67196, + 67237, + 67190, + 67211, + 67190, + 67186, + 67216, + 67187, + 67181, + 67178, + 67215, + 67167, + 67222, + 67201, + 67223, + 67194, + 67189, + 67185, + 67196, + 67187, + 67171, + 67170, + 67176, + 67213, + 67207, + 67211, + 67247, + 67222, + 67189, + 67224, + 67195, + 67237, + 67176, + 67201, + 67196, + 67227, + 67204, + 67188, + 67205, + 67205, + 67205, + 67226, + 67206, + 67176, + 67199, + 67176, + 67168, + 67182, + 67195, + 67223, + 67188, + 67199, + 67191, + 67190, + 67219, + 67201, + 67226, + 67244, + 67207, + 67327, + 67192, + 67218, + 67181, + 67223, + 67186, + 67240, + 67176, + 67193, + 67206, + 67180, + 67227, + 67175, + 67213, + 67213, + 67242, + 67269, + 67172, + 67204, + 67163, + 67192, + 67221, + 67207, + 67174, + 67222, + 67206, + 67218, + 67199, + 67215, + 67189, + 67212, + 67198, + 67215, + 67198, + 67200, + 67189, + 67251, + 67201, + 67204, + 67170, + 67231, + 67204, + 67196, + 67188, + 67228, + 67204, + 67203, + 67213, + 67217, + 67196, + 67168, + 67214, + 67196, + 67181, + 67200, + 67208, + 67204, + 67204, + 67212, + 67400, + 67192, + 67203, + 67168, + 67201, + 67208, + 67158, + 67192, + 67181, + 67175, + 67196, + 67206, + 67185, + 67210, + 67192, + 67204, + 67192, + 67206, + 67171, + 67213, + 67203, + 67226, + 67260, + 67199, + 67239, + 67222, + 67209, + 67217, + 67199, + 67204, + 67156, + 67191, + 67214, + 67187, + 67178, + 67299, + 67203, + 67221, + 67223, + 67194, + 67237, + 67209, + 67206, + 67190, + 67200, + 67211, + 67206, + 67206, + 67182, + 67210, + 67200, + 67213, + 67187, + 67219, + 67207, + 67238, + 67210, + 67177, + 67234, + 67217, + 67204, + 67201, + 67212, + 67215, + 67274, + 67218, + 67258, + 67218, + 67216, + 67207, + 67197, + 67227, + 67217, + 67199, + 67208, + 67189, + 67197, + 67213, + 67203, + 67231, + 67213, + 67175, + 67242, + 67195, + 67210, + 67214, + 67228, + 67221, + 67220, + 67230, + 67192, + 67199, + 67221, + 67219, + 67214, + 67183, + 67155, + 67188, + 67178, + 67195, + 67209, + 67206, + 67167, + 67182, + 67205, + 67214, + 67170, + 67248, + 67226, + 67221, + 67202, + 67200, + 67206, + 67163, + 67210, + 67217, + 67199, + 67219, + 67277, + 67240, + 67204, + 67211, + 67169, + 67190, + 67240, + 67195, + 67207, + 67198, + 67197, + 67198, + 67191, + 67227, + 67258, + 67243, + 67187, + 67206, + 67198, + 67178, + 67204, + 67168, + 67192, + 67169, + 67190, + 67188, + 67206, + 67205, + 67192, + 67201, + 67182, + 67170, + 67202, + 67197, + 67199, + 67177, + 67180, + 67219, + 67185, + 67207, + 67208, + 67189, + 67233, + 67169, + 67530, + 67187, + 67195, + 67198, + 67191, + 67192, + 67179, + 67199, + 67181, + 67196, + 67206, + 67211, + 67203, + 67181, + 67218, + 67188, + 67178, + 67182, + 67175, + 67188, + 67196, + 67178, + 67174, + 67182, + 67173, + 67185, + 67206, + 67179, + 67188, + 67182, + 67212, + 67206, + 67182, + 67192, + 67182, + 67200, + 67225, + 67170, + 67212, + 67217, + 67171, + 67182, + 67201, + 67171, + 67182, + 67200, + 67206, + 67222, + 67235, + 67197, + 67192, + 67221, + 67202, + 67174, + 67164, + 67176, + 67202, + 67204, + 67197, + 67190, + 67168, + 67250, + 67216, + 67187, + 67231, + 67201, + 67219, + 67196, + 67166, + 67183, + 67174, + 67181, + 67216, + 67220, + 67205, + 67196, + 67227, + 67226, + 67230, + 67199, + 67174, + 67218, + 67203, + 67298, + 67181, + 67175, + 67198, + 67209, + 67202, + 67206, + 67169, + 67188, + 67176, + 67229, + 67201, + 67205, + 67215, + 67169, + 67207, + 67205, + 67175, + 67212, + 67202, + 67225, + 67174, + 67183, + 67179, + 67180, + 67184, + 67186, + 67216, + 67178, + 67176, + 67191, + 67214, + 67184, + 67202, + 67217, + 67206, + 67200, + 67188, + 67199, + 67181, + 67178, + 67196, + 67222, + 67192, + 67177, + 67191, + 67189, + 67167, + 67202, + 67197, + 67196, + 67194, + 67209, + 67219, + 67185, + 67208, + 67209, + 67205, + 67197, + 67226, + 67182, + 67171, + 67171, + 67179, + 67200, + 67172, + 67186, + 67182, + 67179, + 67205, + 67212, + 67200, + 67173, + 67175, + 67192, + 67218, + 67200, + 67163, + 67174, + 67212, + 67200, + 67170, + 67187, + 67200, + 67219, + 67219, + 67195, + 67184, + 67189, + 67208, + 67211, + 67185, + 67194, + 67172, + 67186, + 67202, + 67199, + 67186, + 67185, + 67185, + 67187, + 67165, + 67189, + 67178, + 67179, + 67173, + 67206, + 67207, + 67188, + 67211, + 67183, + 67204, + 67189, + 67180, + 67176, + 67217, + 67211, + 67232, + 67201, + 67173, + 67176, + 67195, + 67207, + 67174, + 67176, + 67179, + 67209, + 67189, + 67198, + 67208, + 67209, + 67220, + 67202, + 67183, + 67215, + 67208, + 67193, + 67215, + 67205, + 67230, + 67196, + 67226, + 67221, + 67184, + 67240, + 67205, + 67205, + 67199, + 67163, + 67217, + 67216, + 67236, + 67191, + 67224, + 67210, + 67195, + 67236, + 67175, + 67207, + 67196, + 67198, + 67200, + 67189, + 67200, + 67212, + 67198, + 67182, + 67214, + 67209, + 67221, + 67200, + 67175, + 67193, + 67190, + 67192, + 67174, + 67191, + 67188, + 67204, + 67176, + 67173, + 67175, + 67205, + 67201, + 67196, + 67217, + 67177, + 67182, + 67217, + 67196, + 67209, + 67205, + 67197, + 67203, + 67192, + 67186, + 67203, + 67181, + 67211, + 67204, + 67209, + 67177, + 67220, + 67199, + 67192, + 67165, + 67182, + 67171, + 67208, + 67216, + 67191, + 67204, + 67208, + 67178, + 67194, + 67212, + 67202, + 67198, + 67185, + 67194, + 67206, + 67204, + 67172, + 67176, + 67217, + 67225, + 67196, + 67175, + 67222, + 67221, + 67204, + 67184, + 67212, + 67190, + 67187, + 67193, + 67198, + 67183, + 67192, + 67179, + 67223, + 67200, + 67206, + 67204, + 67190, + 67158, + 67196, + 67188, + 67220, + 67196, + 67187, + 67231, + 67183, + 67210, + 67171, + 67197, + 67193, + 67177, + 67175, + 67176, + 67215, + 67214, + 67209, + 67184, + 67175, + 67207, + 67182, + 67189, + 67183, + 67213, + 67169, + 67213, + 67200, + 67214, + 67181, + 67208, + 67159, + 67208, + 67200, + 67186, + 67176, + 67185, + 67205, + 67185, + 67183, + 67178, + 67202, + 67211, + 67161, + 67219, + 67202, + 67179, + 67187, + 67195, + 67199, + 67188, + 67224, + 67189, + 67194, + 67218, + 67203, + 67183, + 67190, + 67199, + 67210, + 67188, + 67251, + 67219, + 67204, + 67178, + 67196, + 67195, + 67181, + 67202, + 67217, + 67306, + 67183, + 67193, + 67179, + 67185, + 67506, + 67195, + 67177, + 67191, + 67180, + 67212, + 67190, + 67190, + 67223, + 67180, + 67154, + 67243, + 67186, + 67208, + 67182, + 67179, + 67188, + 67207, + 67216, + 67208, + 67212, + 67182, + 67178, + 67215, + 67222, + 67177, + 67179, + 67195, + 67193, + 67211, + 67163, + 67182, + 67182, + 67221, + 67193, + 67202, + 69120, + 67209, + 67200, + 67182, + 67191, + 67201, + 67203, + 67266, + 67183, + 67202, + 67171, + 67168, + 67195, + 67170, + 67201, + 67216, + 67204, + 67213, + 67180, + 67158, + 67202, + 67170, + 67193, + 67197, + 67206, + 67200, + 67204, + 67181, + 67204, + 67175, + 67195, + 67207, + 67176, + 67212, + 67197, + 67183, + 67195, + 67200, + 67181, + 67204, + 67167, + 67218, + 67209, + 67216, + 67177, + 67206, + 67203, + 67208, + 67209, + 67193, + 67173, + 67201, + 67193, + 67211, + 67200, + 67203, + 67221, + 67214, + 67225, + 67223, + 67212, + 67215, + 67232, + 67214, + 67209, + 67208, + 67180, + 67185, + 67194, + 67209, + 67208, + 67208, + 67214, + 67191, + 67191, + 67175, + 67170, + 67170, + 67196, + 67219, + 67204, + 67198, + 67201, + 67182, + 67196, + 67269, + 67202, + 67174, + 67184, + 67181, + 67190, + 67176, + 67203, + 67211, + 67198, + 67213, + 67216, + 67209, + 67185, + 67204, + 67169, + 67207, + 67177, + 67181, + 67176, + 67186, + 67204, + 67198, + 67177, + 67196, + 67205, + 67198, + 67179, + 67195, + 67197, + 67191, + 67175, + 67176, + 67196, + 67208, + 67176, + 67191, + 67189, + 67176, + 67209, + 67202, + 67179, + 67207, + 67186, + 67198, + 67190, + 67197, + 67185, + 67214, + 67177, + 67163, + 67187, + 67165, + 67202, + 67174, + 67201, + 67281, + 67190, + 67208, + 67198, + 67199, + 67172, + 67195, + 67208, + 67190, + 67193, + 67190, + 67184, + 67184, + 67187, + 67189, + 67213, + 67173, + 67206, + 67189, + 67205, + 67193, + 67175, + 67191, + 67203, + 67199, + 67199, + 67204, + 67170, + 67221, + 67216, + 67211, + 67175, + 67175, + 67209, + 67214, + 67198, + 67220, + 67204, + 67184, + 67213, + 67168, + 67189, + 67209, + 67216, + 67210, + 67183, + 67165, + 67185, + 67198, + 67194, + 67214, + 67204, + 67168, + 67188, + 67183, + 67182, + 67207, + 67190, + 67187, + 67216, + 67207, + 67205, + 67181, + 67180, + 67211, + 67212, + 67214, + 67181, + 67195, + 67214, + 67183, + 67203, + 67197, + 67191, + 67213, + 67246, + 67177, + 67187, + 67196, + 67174, + 67216, + 67215, + 67189, + 67217, + 67172, + 67177, + 67194, + 67189, + 67188, + 67179, + 67218, + 67194, + 67212, + 67181, + 67209, + 67210, + 67199, + 67228, + 67184, + 67211, + 67194, + 67172, + 67201, + 67217, + 67188, + 67209, + 67194, + 67204, + 67211, + 67179, + 67211, + 67206, + 67223, + 67213, + 67184, + 67205, + 67214, + 67218, + 67217, + 67217, + 67176, + 67183, + 67180, + 67223, + 67238, + 67242, + 67197, + 67176, + 67210, + 67177, + 67170, + 67177, + 67191, + 67196, + 67213, + 67203, + 67204, + 67192, + 67210, + 67234, + 67171, + 67218, + 67202, + 67188, + 67202, + 67183, + 67183, + 67193, + 67177, + 67167, + 67203, + 67170, + 67210, + 67184, + 67197, + 67208, + 67178, + 67196, + 67187, + 67194, + 67228, + 67200, + 67209, + 67186, + 67220, + 67177, + 67215, + 67189, + 67173, + 67188, + 67193, + 67182, + 67168, + 67207, + 67218, + 67177, + 67208, + 67197, + 67165, + 67202, + 67203, + 67194, + 67215, + 67204, + 67201, + 67213, + 67207, + 67204, + 67215, + 67207, + 67246, + 67214, + 67196, + 67200, + 67202, + 67192, + 67176, + 67200, + 67214, + 67203, + 67200, + 67216, + 67191, + 67180, + 67203, + 67176, + 67204, + 67220, + 67195, + 67199, + 67200, + 67223, + 67172, + 67200, + 67203, + 67204, + 67190, + 67181, + 67194, + 67178, + 67199, + 67204, + 67222, + 67183, + 67191, + 67181, + 67198, + 67210, + 67194, + 67179, + 67216, + 67166, + 67181, + 67169, + 67208, + 67222, + 67208, + 67203, + 67175, + 67217, + 67215, + 67180, + 67194, + 67199, + 67195, + 67174, + 67200, + 67207, + 67199, + 67181, + 67174, + 67180, + 67197, + 67214, + 67199, + 67209, + 67171, + 67197, + 67188, + 67227, + 67168, + 67221, + 67201, + 67232, + 67200, + 67219, + 67193, + 67212, + 67174, + 67186, + 67189, + 67190, + 67218, + 67203, + 67209, + 67171, + 67244, + 67207, + 67204, + 67183, + 67170, + 67197, + 67192, + 67177, + 67180, + 67218, + 67175, + 67182, + 67223, + 67194, + 67210, + 67208, + 67198, + 67191, + 67173, + 67187, + 67216, + 67231, + 67206, + 67214, + 67239, + 67198, + 67205, + 67204, + 67254, + 67207, + 67214, + 67230, + 67228, + 67202, + 67215, + 67204, + 67194, + 67177, + 67189, + 67215, + 67196, + 67201, + 67195, + 67210, + 67181, + 67182, + 67205, + 67204, + 67203, + 67199, + 67204, + 67183, + 67191, + 67225, + 67212, + 67262, + 67208, + 67188, + 67206, + 67202, + 67217, + 67185, + 67185, + 67188, + 67170, + 67204, + 67203, + 67179, + 67174, + 67206, + 67229, + 67196, + 67206, + 67204, + 67209, + 67209, + 67197, + 67210, + 67202, + 67185, + 67187, + 67198, + 67209, + 67233, + 67199, + 67181, + 67196, + 67221, + 67207, + 67203, + 67220, + 67174, + 67204, + 67203, + 67169, + 67202, + 67211, + 67215, + 67208, + 67207, + 67198, + 67192, + 67170, + 67170, + 67197, + 67206, + 67195, + 67201, + 67177, + 67200, + 67185, + 67215, + 67222, + 67239, + 67214, + 67171, + 67219, + 67189, + 67183, + 67214, + 67188, + 67167, + 67186, + 67188, + 67177, + 67199, + 67207, + 67212, + 67206, + 67187, + 67197, + 67178, + 67209, + 67181, + 67207, + 67198, + 67195, + 67187, + 67195, + 67185, + 67213, + 67205, + 67195, + 67198, + 67204, + 67179, + 67185, + 67167, + 67199, + 67206, + 67195, + 67213, + 67230, + 67202, + 67197, + 67206, + 67219, + 67169, + 67197, + 67219, + 67201, + 67200, + 67186, + 67232, + 67195, + 67174, + 67193, + 67187, + 67237, + 67199, + 67201, + 67182, + 67194, + 67194, + 67201, + 67241, + 67181, + 67257, + 67181, + 67212, + 67176, + 67214, + 67179, + 67189, + 67183, + 67191, + 67196, + 67195, + 67186, + 67195, + 67200, + 67208, + 67210, + 67213, + 67209, + 67206, + 67191, + 67201, + 67199, + 67203, + 67195, + 67208, + 67202, + 67175, + 67203, + 67175, + 67177, + 67209, + 67197, + 67196, + 67169, + 67188, + 67188, + 67176, + 67204, + 67189, + 67185, + 67181, + 67200, + 67201, + 67182, + 67212, + 67205, + 67232, + 67182, + 67223, + 67213, + 67192, + 67190, + 67201, + 67192, + 67202, + 67170, + 67204, + 67218, + 67178, + 67222, + 67256, + 67202, + 67203, + 67199, + 67198, + 67185, + 67198, + 67179, + 67215, + 67190, + 67176, + 67203, + 67202, + 67664, + 67198, + 67178, + 67203, + 67175, + 67211, + 67181, + 67222, + 67188, + 67186, + 67190, + 67228, + 67176, + 67212, + 67220, + 67219, + 67213, + 67202, + 67168, + 67192, + 67239, + 67203, + 67217, + 67213, + 67184, + 67234, + 67208, + 67210, + 67222, + 67229, + 67210, + 67172, + 67184, + 67218, + 67192, + 67203, + 67201, + 67189, + 67173, + 67186, + 67171, + 67179, + 67201, + 67214, + 67180, + 67200, + 67207, + 67173, + 67182, + 67211, + 67172, + 67207, + 67177, + 67192, + 67235, + 67207, + 67201, + 67215, + 67173, + 67229, + 67197, + 67234, + 67178, + 67190, + 67221, + 67185, + 67192, + 67208, + 67194, + 67192, + 67197, + 67170, + 67191, + 67195, + 67209, + 67169, + 67168, + 67188, + 67204, + 67202, + 67187, + 67212, + 67229, + 67179, + 67187, + 67176, + 67199, + 67185, + 67168, + 67203, + 67183, + 67205, + 67192, + 67197, + 67167, + 67224, + 67162, + 67224, + 67168, + 67194, + 67170, + 67216, + 67188, + 67179, + 67200, + 67196, + 67188, + 67208, + 67179, + 67199, + 67192, + 67233, + 67194, + 67195, + 67193, + 67199, + 67212, + 67186, + 67196, + 67180, + 67174, + 67213, + 67209, + 67204, + 67180, + 67177, + 67180, + 67168, + 67237, + 67170, + 67188, + 67181, + 67208, + 67194, + 67205, + 67207, + 67212, + 67221, + 67182, + 67203, + 67169, + 67181, + 67187, + 67192, + 67157, + 67206, + 67192, + 67175, + 67211, + 67185, + 67204, + 67187, + 67200, + 67187, + 67179, + 67209, + 67214, + 67178, + 67199, + 67219, + 67196, + 67219, + 67206, + 67174, + 67189, + 67182, + 67180, + 67186, + 67207, + 67178, + 67205, + 67210, + 67212, + 67204, + 67150, + 67206, + 67222, + 67183, + 67192, + 67212, + 67186, + 67190, + 67188, + 67205, + 67182, + 67161, + 67192, + 67183, + 67196, + 67196, + 67203, + 67215, + 67199, + 67368, + 67185, + 67173, + 67175, + 67225, + 67151, + 67210, + 67203, + 67213, + 67207, + 67179, + 67204, + 67195, + 67194, + 67193, + 67172, + 67196, + 67174, + 67208, + 67194, + 67201, + 67186, + 67194, + 67187, + 67209, + 67232, + 67184, + 67247, + 67184, + 67179, + 67183, + 67180, + 67200, + 67205, + 67269, + 67195, + 67182, + 67171, + 67174, + 67192, + 67187, + 67209, + 67181, + 67209, + 67193, + 67156, + 67183, + 67206, + 67188, + 67192, + 67223, + 67185, + 67229, + 67199, + 67208, + 67260, + 67230, + 67197, + 67200, + 67202, + 67209, + 67174, + 67182, + 67197, + 67166, + 67220, + 67214, + 67177, + 67212, + 67205, + 67214, + 67200, + 67175, + 67187, + 67195, + 67197, + 67218, + 67199, + 67187, + 67196, + 67186, + 67214, + 67214, + 67216, + 67193, + 67190, + 67184, + 67171, + 67203, + 67196, + 67187, + 67198, + 67194, + 67179, + 67213, + 67176, + 67187, + 67193, + 67174, + 67202, + 67169, + 67183, + 67258, + 67163, + 67182, + 67207, + 67192, + 67199, + 67209, + 67202, + 67177, + 67204, + 67210, + 67199, + 67228, + 67189, + 67201, + 67195, + 67206, + 67186, + 67191, + 67160, + 67205, + 67206, + 67184, + 67184, + 67216, + 67202, + 67173, + 67210, + 67195, + 67203, + 67185, + 67174, + 67196, + 67206, + 67195, + 67216, + 67216, + 67202, + 67198, + 67186, + 67184, + 67189, + 67216, + 67204, + 67216, + 67173, + 67206, + 67170, + 67205, + 67190, + 67206, + 67187, + 67200, + 67179, + 67185, + 67173, + 67194, + 67202, + 67195, + 67254, + 67207, + 67206, + 67217, + 67216, + 67207, + 67205, + 67198, + 67201, + 67209, + 67209, + 67192, + 67225, + 67192, + 67173, + 67169, + 67212, + 67181, + 67192, + 67219, + 67218, + 67210, + 67186, + 67182, + 67200, + 67221, + 67232, + 67184, + 67246, + 67200, + 67219, + 67197, + 67208, + 67201, + 67224, + 67207, + 67195, + 67214, + 67186, + 67204, + 67165, + 67207, + 67174, + 67220, + 67189, + 67183, + 67204, + 67172, + 67194, + 67198, + 67183, + 67195, + 67189, + 67195, + 67210, + 67187, + 67176, + 67202, + 67205, + 67198, + 67228, + 67199, + 67206, + 67198, + 67183, + 67188, + 67210, + 67186, + 67168, + 67181, + 67207, + 67177, + 67215, + 67215, + 67171, + 67233, + 67219, + 67197, + 67172, + 67212, + 67172, + 67204, + 67186, + 67209, + 67208, + 67209, + 67209, + 67270, + 67214, + 67197, + 67209, + 67179, + 67205, + 67177, + 67209, + 67202, + 67202, + 67204, + 67187, + 67193, + 67206, + 67207, + 67220, + 67258, + 67186, + 67190, + 67200, + 67211, + 67189, + 67206, + 67166, + 67198, + 67219, + 67215, + 67199, + 67222, + 67210, + 67207, + 67186, + 67205, + 67208, + 67169, + 67202, + 67189, + 67192, + 67207, + 67168, + 67198, + 67238, + 67164, + 67190, + 67194, + 67165, + 67176, + 67185, + 67199, + 67199, + 67217, + 67181, + 67174, + 67177, + 67173, + 67211, + 67199, + 67192, + 67205, + 67185, + 67201, + 67200, + 67193, + 67170, + 67169, + 67206, + 67195, + 67174, + 67208, + 67185, + 67199, + 67188, + 67209, + 67220, + 67190, + 67225, + 67181, + 67193, + 67205, + 67206, + 67205, + 67187, + 67211, + 67232, + 67199, + 67194, + 67183, + 67179, + 67198, + 67178, + 67209, + 67182, + 67258, + 67186, + 67181, + 67183, + 67210, + 67192, + 67191, + 67205, + 67169, + 67196, + 67222, + 67182, + 67190, + 67204, + 67194, + 67178, + 67180, + 67195, + 67209, + 67231, + 67171, + 67187, + 67189, + 67197, + 67211, + 67198, + 67211, + 67184, + 67182, + 67206, + 67168, + 67180, + 67193, + 67179, + 67192, + 67201, + 67183, + 67189, + 67204, + 67186, + 67170, + 67188, + 67197, + 67201, + 67184, + 67209, + 67183, + 67162, + 67213, + 67190, + 67225, + 67178, + 67203, + 67200, + 67192, + 67199, + 67211, + 67186, + 67184, + 67182, + 67179, + 67185, + 67213, + 67204, + 67161, + 67181, + 67208, + 67207, + 67215, + 67194, + 67207, + 67168, + 67181, + 67183, + 67206, + 67184, + 67197, + 67200, + 67202, + 67213, + 67192, + 67195, + 67184, + 67189, + 67172, + 67186, + 67192, + 67168, + 67186, + 67159, + 67198, + 67172, + 67167, + 67170, + 67209, + 67203, + 67169, + 67192, + 67218, + 67199, + 67181, + 67213, + 67236, + 67199, + 67167, + 67225, + 67187, + 67207, + 67184, + 67190, + 67193, + 67184, + 67179, + 67169, + 67229, + 67206, + 67219, + 67159, + 67176, + 67197, + 67214, + 67204, + 67171, + 67217, + 67201, + 67176, + 67228, + 67194, + 67179, + 67204, + 67176, + 67181, + 67240, + 67212, + 67153, + 67152, + 67198, + 67182, + 67201, + 67194, + 67188, + 67181, + 67169, + 67200, + 67182, + 67162, + 67187, + 67177, + 67164, + 67174, + 67200, + 67198, + 67213, + 67202, + 67190, + 67199, + 67185, + 67201, + 67173, + 67198, + 67165, + 67402, + 67162, + 67202, + 67176, + 67200, + 67209, + 67211, + 67194, + 67166, + 67193, + 67148, + 67209, + 67190, + 67180, + 67173, + 67174, + 67203, + 67216, + 67188, + 67174, + 67201, + 67217, + 67206, + 67183, + 67182, + 67214, + 67196, + 67198, + 67196, + 67175, + 67166, + 67188, + 67206, + 67203, + 67198, + 67207, + 67174, + 67207, + 67212, + 67187, + 67189, + 67178, + 67177, + 67179, + 67172, + 67194, + 67219, + 67217, + 67231, + 67176, + 67207, + 67203, + 67218, + 67230, + 67206, + 67209, + 67212, + 67197, + 67177, + 67207, + 67214, + 67193, + 67202, + 67194, + 67198, + 67186, + 67212, + 67215, + 67180, + 67191, + 67223, + 67202, + 67184, + 67207, + 67204, + 67205, + 67208, + 67171, + 67203, + 67186, + 67180, + 67188, + 67202, + 67214, + 67175, + 67173, + 67205, + 67188, + 67206, + 67200, + 67195, + 67208, + 67204, + 67191, + 67215, + 67165, + 67200, + 67214, + 67204, + 67171, + 67176, + 67177, + 67176, + 67179, + 67185, + 67195, + 67182, + 67206, + 67215, + 67199, + 67221, + 67186, + 67195, + 67203, + 67178, + 67206, + 67184, + 67227, + 67422, + 67210, + 67205, + 67195, + 67189, + 67212, + 67192, + 67185, + 67182, + 67185, + 67214, + 67214, + 67203, + 67203, + 67175, + 67209, + 67179, + 67187, + 67207, + 67155, + 67165, + 67173, + 67192, + 67196, + 67221, + 67186, + 67188, + 67176, + 67182, + 67202, + 67186, + 67188, + 67219, + 67208, + 67206, + 67214, + 67225, + 67195, + 67165, + 67216, + 67183, + 67198, + 67150, + 67198, + 67196, + 67217, + 67179, + 67171, + 67177, + 67190, + 67201, + 67218, + 67215, + 67205, + 67178, + 67194, + 67199, + 67199, + 67209, + 67167, + 67202, + 67184, + 67203, + 67216, + 67183, + 67184, + 67185, + 67190, + 67217, + 67189, + 67201, + 67209, + 67215, + 67190, + 67175, + 67195, + 67236, + 67199, + 67170, + 67205, + 67199, + 67195, + 67208, + 67179, + 67188, + 67167, + 67187, + 67191, + 67179, + 67177, + 67204, + 67152, + 67196, + 67188, + 67211, + 67211, + 67197, + 67188, + 67206, + 67201, + 67224, + 67203, + 67180, + 67181, + 67192, + 67208, + 67196, + 67177, + 67183, + 67198, + 67188, + 67203, + 67217, + 67201, + 67189, + 67191, + 67207, + 67182, + 67163, + 67203, + 67205, + 67203, + 67206, + 67181, + 67199, + 67180, + 67202, + 67180, + 67180, + 67201, + 67198, + 67187, + 67178, + 67186, + 67204, + 67181, + 67213, + 67215, + 67163, + 67190, + 67192, + 67194, + 67196, + 67185, + 67189, + 67194, + 67164, + 67193, + 67241, + 67217, + 67179, + 67164, + 67207, + 67200, + 67230, + 67204, + 67196, + 67193, + 67208, + 67179, + 67173, + 67181, + 67173, + 67199, + 67181, + 67188, + 67187, + 67192, + 67161, + 67179, + 67182, + 67216, + 67176, + 67189, + 67211, + 67190, + 67164, + 67205, + 67189, + 67178, + 67179, + 67198, + 67222, + 67175, + 67230, + 67226, + 67183, + 67201, + 67225, + 67213, + 67160, + 67217, + 67211, + 67184, + 67211, + 67189, + 67206, + 67154, + 67184, + 67176, + 67184, + 67228, + 67201, + 67196, + 67163, + 67168, + 67219, + 67200, + 67195, + 68919, + 67177, + 67216, + 67211, + 67202, + 67206, + 67198, + 67200, + 67180, + 67203, + 67213, + 67221, + 67246, + 67185, + 67181, + 67194, + 67208, + 67213, + 67180, + 67210, + 67200, + 67203, + 67248, + 67199, + 67201, + 67202, + 67197, + 67215, + 67178, + 67177, + 67192, + 67207, + 67196, + 67210, + 67178, + 67191, + 67193, + 67196, + 67198, + 67176, + 67214, + 67176, + 67215, + 67189, + 67172, + 67213, + 67189, + 67191, + 67168, + 67205, + 67166, + 67210, + 67165, + 67199, + 67212, + 67189, + 67207, + 67237, + 67208, + 67203, + 67174, + 67223, + 67210, + 67164, + 67218, + 67190, + 67179, + 67186, + 67184, + 67194, + 67178, + 67189, + 67216, + 67193, + 67187, + 67213, + 67191, + 67199, + 67246, + 67206, + 67184, + 67246, + 67219, + 67217, + 67200, + 67230, + 67211, + 67179, + 67212, + 67177, + 67210, + 67186, + 67197, + 67198, + 67184, + 67175, + 67189, + 67217, + 67169, + 67218, + 67215, + 67202, + 67185, + 67175, + 67180, + 67211, + 67191, + 67190, + 67216, + 67193, + 67178, + 67205, + 67201, + 67190, + 67179, + 67211, + 67194, + 67181, + 67227, + 67174, + 67216, + 67179, + 67201, + 67209, + 67248, + 67215, + 67198, + 67191, + 67163, + 67191, + 67185, + 67203, + 67182, + 67208, + 67185, + 67209, + 67208, + 67194, + 67186, + 67206, + 67183, + 67204, + 67191, + 67175, + 67197, + 67183, + 67209, + 67189, + 67210, + 67182, + 67209, + 67198, + 67205, + 67204, + 67235, + 67223, + 67182, + 67214, + 67207, + 67220, + 67185, + 67211, + 67212, + 67227, + 67186, + 67205, + 67205, + 67199, + 67179, + 67167, + 67200, + 67206, + 67184, + 67185, + 67194, + 67219, + 67217, + 67185, + 67214, + 67215, + 67172, + 67202, + 67182, + 67204, + 67203, + 67207, + 67202, + 67225, + 67209, + 67217, + 67207, + 67192, + 67179, + 67183, + 67190, + 67241, + 67242, + 67206, + 67188, + 67204, + 67176, + 67184, + 67187, + 67207, + 67204, + 67210, + 67197, + 67205, + 67200, + 67220, + 67190, + 67173, + 67172, + 67210, + 67197, + 67197, + 67210, + 67182, + 67188, + 67166, + 67203, + 67214, + 67206, + 67249, + 67220, + 67216, + 67180, + 67175, + 67199, + 67195, + 67188, + 67206, + 67210, + 67204, + 67198, + 67162, + 67174, + 67176, + 67224, + 67197, + 67185, + 67197, + 67184, + 67185, + 67222, + 67193, + 67182, + 67162, + 67187, + 67195, + 67180, + 67203, + 67230, + 67217, + 67191, + 67194, + 67188, + 67183, + 67184, + 67213, + 67177, + 67195, + 67198, + 67182, + 67187, + 67173, + 67202, + 67204, + 67224, + 67186, + 67179, + 67203, + 67190, + 67190, + 67206, + 67186, + 67210, + 67189, + 67236, + 67167, + 67193, + 67196, + 67178, + 67207, + 67200, + 67177, + 67213, + 67175, + 67167, + 67207, + 67181, + 67202, + 67199, + 67198, + 67179, + 67219, + 67210, + 67215, + 67227, + 67187, + 67180, + 67205, + 67192, + 67173, + 67209, + 67173, + 67233, + 67161, + 67200, + 67176, + 67202, + 67183, + 67209, + 67213, + 67179, + 67175, + 67203, + 67203, + 67218, + 67198, + 67200, + 67175, + 67203, + 67211, + 67206, + 67159, + 67184, + 67225, + 67219, + 67199, + 67174, + 67187, + 67185, + 67208, + 67187, + 67223, + 67183, + 67192, + 67198, + 67212, + 67219, + 67179, + 67216, + 67167, + 67198, + 67205, + 67209, + 67208, + 67177, + 67181, + 67250, + 67175, + 67261, + 67209, + 67186, + 67221, + 67168, + 67234, + 67174, + 67182, + 67198, + 67205, + 67181, + 67221, + 67164, + 67208, + 67225, + 67205, + 67192, + 67207, + 67165, + 67178, + 67468, + 67203, + 67202, + 67200, + 67215, + 67224, + 67179, + 67210, + 67209, + 67167, + 67198, + 67182, + 67221, + 67213, + 67214, + 67212, + 67220, + 67212, + 67185, + 67201, + 67218, + 67220, + 67190, + 67186, + 67176, + 67207, + 67213, + 67172, + 67204, + 67193, + 67183, + 67205, + 67194, + 67199, + 67238, + 67200, + 67186, + 67217, + 67186, + 67216, + 67224, + 67171, + 67202, + 67214, + 67193, + 67239, + 67200, + 67208, + 67171, + 67166, + 67202, + 67187, + 67211, + 67200, + 67196, + 67177, + 67207, + 67206, + 67201, + 67185, + 67201, + 67175, + 67201, + 67187, + 67210, + 67196, + 67198, + 67206, + 67202, + 67196, + 67228, + 67217, + 67203, + 67207, + 67205, + 67169, + 67183, + 67171, + 67189, + 67206, + 67203, + 67189, + 67210, + 67176, + 67204, + 67205, + 67206, + 67185, + 67189, + 67189, + 67181, + 67182, + 67168, + 67205, + 67193, + 67170, + 67176, + 67188, + 67166, + 67159, + 67234, + 67216, + 67175, + 67202, + 67181, + 67196, + 67220, + 67210, + 67191, + 67181, + 67193, + 67207, + 67180, + 67197, + 67182, + 67185, + 67190, + 67179, + 67203, + 67212, + 67170, + 67203, + 67200, + 67202, + 67174, + 67190, + 67158, + 67181, + 67200, + 67152, + 67194, + 67174, + 67195, + 67201, + 67208, + 67220, + 67166, + 67190, + 67205, + 67183, + 67177, + 67209, + 67206, + 67186, + 67196, + 67203, + 67207, + 67203, + 67207, + 67229, + 67203, + 67182, + 67202, + 67174, + 67223, + 67238, + 67213, + 67165, + 67195, + 67213, + 67206, + 67202, + 67189, + 67191, + 67194, + 67173, + 67191, + 67195, + 67183, + 67196, + 67202, + 67202, + 67214, + 67210, + 67208, + 67198, + 67182, + 67182, + 67180, + 67205, + 67206, + 67182, + 67205, + 67192, + 67209, + 67193, + 67184, + 67232, + 67187, + 67230, + 67226, + 67174, + 67219, + 67202, + 67205, + 67198, + 67187, + 67201, + 67207, + 67193, + 67172, + 67208, + 67194, + 67168, + 67179, + 67163, + 67201, + 67181, + 67225, + 67205, + 67206, + 67232, + 67171, + 67202, + 67188, + 67206, + 67191, + 67189, + 67191, + 67196, + 67203, + 67207, + 67163, + 67203, + 67188, + 67164, + 67203, + 67184, + 67193, + 67203, + 67198, + 67184, + 67199, + 67193, + 67201, + 67184, + 67194, + 67184, + 67178, + 67198, + 67206, + 67194, + 67180, + 67180, + 67204, + 67204, + 67238, + 67173, + 67206, + 67170, + 67171, + 67188, + 67192, + 67216, + 67180, + 67196, + 67203, + 67198, + 67162, + 67207, + 67169, + 67185, + 67206, + 67178, + 67180, + 67192, + 67228, + 67163, + 67176, + 67193, + 67169, + 67193, + 67209, + 67215, + 67168, + 67175, + 67215, + 67158, + 67188, + 67183, + 67175, + 67194, + 67218, + 67237, + 67208, + 67187, + 67198, + 67190, + 67195, + 68792, + 67182, + 67194, + 67215, + 67167, + 67197, + 67163, + 67183, + 67202, + 67191, + 67208, + 67208, + 67196, + 67195, + 67186, + 67180, + 67219, + 67211, + 67211, + 67165, + 67171, + 67213, + 67153, + 67222, + 67193, + 67216, + 67219, + 67187, + 67192, + 67188, + 67197, + 67180, + 67175, + 67235, + 67203, + 67204, + 67192, + 67197, + 67195, + 67173, + 67212, + 67178, + 67213, + 67202, + 67208, + 67193, + 67190, + 67189, + 67198, + 67183, + 67182, + 67180, + 67200, + 67202, + 67211, + 67217, + 67178, + 67189, + 67189, + 67199, + 67242, + 67177, + 67191, + 67199, + 67171, + 67207, + 67165, + 67154, + 67208, + 67217, + 67182, + 67170, + 67197, + 67207, + 67173, + 67215, + 67196, + 67213, + 67214, + 67202, + 67221, + 67223, + 67180, + 67205, + 67190, + 67194, + 67215, + 67173, + 67239, + 67189, + 67197, + 67156, + 67198, + 67185, + 67192, + 67175, + 67231, + 67170, + 67198, + 67199, + 67185, + 67189, + 67171, + 67200, + 67194, + 67221, + 67229, + 67223, + 67173, + 67184, + 67181, + 67201, + 67206, + 67182, + 67202, + 67194, + 67304, + 67206, + 67207, + 67190, + 67184, + 67200, + 67204, + 67171, + 67186, + 67201, + 67182, + 67170, + 67212, + 67199, + 67174, + 67177, + 67176, + 67180, + 67202, + 67171, + 67195, + 67248, + 67240, + 67198, + 67160, + 67205, + 67194, + 67199, + 67228, + 67192, + 67202, + 67200, + 67207, + 67205, + 67177, + 67202, + 67194, + 67206, + 67211, + 67214, + 67214, + 67181, + 67188, + 67197, + 67157, + 67220, + 67161, + 67193, + 67204, + 67214, + 67211, + 67190, + 67206, + 67198, + 67392, + 67190, + 67200, + 67194, + 67252, + 67192, + 67177, + 67184, + 67178, + 67212, + 67199, + 67170, + 67214, + 67207, + 67163, + 67202, + 67168, + 67211, + 67203, + 67189, + 67182, + 67200, + 67207, + 67182, + 67195, + 67196, + 67191, + 67208, + 67206, + 67205, + 67191, + 67210, + 67194, + 67238, + 67174, + 67216, + 67204, + 67188, + 67208, + 67197, + 67209, + 67196, + 67191, + 67204, + 67208, + 67192, + 67178, + 67175, + 67174, + 67196, + 67210, + 67185, + 67185, + 67177, + 67187, + 67179, + 67216, + 67200, + 67169, + 67189, + 67214, + 67218, + 67206, + 67168, + 67196, + 67164, + 67217, + 67203, + 67182, + 67214, + 67207, + 67193, + 67195, + 67179, + 67211, + 67188, + 67206, + 67157, + 67200, + 67210, + 67199, + 67198, + 67203, + 67188, + 67225, + 67205, + 67205, + 67168, + 67190, + 67175, + 67199, + 67218, + 67246, + 67195, + 67176, + 67199, + 67206, + 67171, + 67168, + 67207, + 67215, + 67173, + 67200, + 67188, + 67170, + 67179, + 67193, + 67182, + 67170, + 67176, + 67201, + 67204, + 67175, + 67160, + 67204, + 67194, + 67207, + 67224, + 67195, + 67178, + 67192, + 67213, + 67204, + 67218, + 67192, + 67187, + 67180, + 67209, + 67210, + 67208, + 67193, + 67163, + 67196, + 67199, + 67207, + 67200, + 67172, + 67171, + 67169, + 67219, + 67203, + 67208, + 67186, + 67177, + 67189, + 67206, + 67194, + 67196, + 67191, + 67197, + 67203, + 67181, + 67210, + 67181, + 67196, + 67190, + 67165, + 67203, + 67168, + 67193, + 67166, + 67199, + 67167, + 67188, + 67178, + 67177, + 67199, + 67183, + 67197, + 67167, + 67195, + 67196, + 67206, + 67206, + 67206, + 67186, + 67161, + 67198, + 67180, + 67199, + 67201, + 67229, + 67188, + 67181, + 67197, + 67197, + 67187, + 67216, + 67168, + 67186, + 67189, + 67200, + 67193, + 67165, + 67166, + 67227, + 67222, + 67224, + 67213, + 67207, + 67201, + 67217, + 67200, + 67200, + 67182, + 67172, + 67204, + 67209, + 67176, + 67186, + 67361, + 67190, + 67197, + 67185, + 67193, + 67188, + 67198, + 67216, + 67169, + 67182, + 67166, + 67205, + 67207, + 67204, + 67209, + 67207, + 67205, + 67193, + 67212, + 67194, + 67178, + 67193, + 67198, + 67166, + 67210, + 67186, + 67188, + 67177, + 67207, + 67196, + 67227, + 67208, + 67180, + 67197, + 67190, + 67215, + 67221, + 67213, + 67209, + 67208, + 67181, + 67192, + 67168, + 67180, + 67204, + 67211, + 67183, + 67175, + 67179, + 67204, + 67179, + 67199, + 67206, + 67197, + 67184, + 67171, + 67196, + 67161, + 67192, + 67202, + 67208, + 67178, + 67174, + 67220, + 67209, + 67182, + 67164, + 67177, + 67235, + 67169, + 67188, + 67167, + 67174, + 67203, + 67184, + 67193, + 67205, + 67206, + 67169, + 67190, + 67186, + 67178, + 67177, + 67165, + 67221, + 67197, + 67214, + 67178, + 67206, + 67196, + 67210, + 67209, + 67193, + 67183, + 67194, + 67215, + 67207, + 67209, + 67211, + 67202, + 67215, + 67175, + 67208, + 67164, + 67195, + 67203, + 67198, + 67193, + 67202, + 67216, + 67198, + 67175, + 67171, + 67184, + 67206, + 67173, + 67209, + 67212, + 67207, + 67196, + 67222, + 67182, + 67195, + 67210, + 67187, + 67205, + 67266, + 67172, + 67187, + 67194, + 67171, + 67180, + 67186, + 67226, + 67213, + 67204, + 67165, + 67189, + 67168, + 67219, + 67203, + 67210, + 67182, + 67195, + 67202, + 67183, + 67187, + 67195, + 67181, + 67177, + 67197, + 67215, + 67175, + 67209, + 67157, + 67178, + 67167, + 67194, + 67179, + 67172, + 67189, + 67185, + 67184, + 67176, + 67190, + 67188, + 67177, + 67205, + 67211, + 67241, + 67185, + 67173, + 67243, + 67225, + 67227, + 67203, + 67181, + 67201, + 67201, + 67180, + 67174, + 67178, + 67205, + 67204, + 67192, + 67206, + 67169, + 67170, + 67199, + 67201, + 67198, + 67193, + 67195, + 67206, + 67192, + 67200, + 67198, + 67184, + 67200, + 67211, + 67203, + 67213, + 67213, + 67210, + 67183, + 67211, + 67184, + 67190, + 67203, + 67204, + 67164, + 67204, + 67193, + 67177, + 67190, + 67185, + 67169, + 67202, + 67190, + 67206, + 67189, + 67188, + 67177, + 67217, + 67194, + 67158, + 67204, + 67195, + 67223, + 67216, + 67200, + 67190, + 67165, + 67181, + 67210, + 67187, + 67205, + 67192, + 67230, + 67198, + 67175, + 67191, + 67209, + 67202, + 67220, + 67177, + 67207, + 67224, + 67222, + 67179, + 67215, + 67202, + 67189, + 67199, + 67224, + 67224, + 67217, + 67225, + 67214, + 67194, + 67228, + 67201, + 67220, + 67193, + 67210, + 67190, + 67182, + 67212, + 67214, + 67178, + 67246, + 67203, + 67172, + 67214, + 67185, + 67239, + 67211, + 67179, + 67182, + 67206, + 67230, + 67203, + 67167, + 67231, + 67188, + 67181, + 67214, + 67172, + 67183, + 67195, + 67189, + 67190, + 67193, + 67181, + 67176, + 67173, + 67202, + 67208, + 67192, + 67189, + 67191, + 67172, + 67194, + 67343, + 67185, + 67172, + 67194, + 67214, + 67187, + 67195, + 67152, + 67204, + 67196, + 67202, + 67206, + 67208, + 67193, + 67203, + 67178, + 67218, + 67203, + 67190, + 67199, + 67206, + 67205, + 67200, + 67167, + 67190, + 67205, + 67205, + 67165, + 67241, + 67167, + 67172, + 67192, + 67183, + 67194, + 67185, + 67178, + 67203, + 67178, + 67204, + 67194, + 67211, + 67200, + 67185, + 67194, + 67189, + 67191, + 67215, + 67168, + 67200, + 67204, + 67196, + 67201, + 67179, + 67206, + 67186, + 67202, + 67221, + 67204, + 67246, + 67162, + 67195, + 67209, + 67194, + 67208, + 67187, + 67190, + 67169, + 67163, + 67184, + 67199, + 67196, + 67201, + 67170, + 67171, + 67174, + 67168, + 67180, + 67178, + 67194, + 67189, + 67204, + 67169, + 67197, + 67193, + 67186, + 67206, + 67198, + 67214, + 67175, + 67203, + 67177, + 67206, + 67179, + 67204, + 67166, + 67180, + 67173, + 67210, + 67199, + 67189, + 67217, + 67177, + 67200, + 67190, + 67194, + 67194, + 67191, + 67202, + 67197, + 67159, + 67200, + 67207, + 67204, + 67259, + 67200, + 67197, + 67195, + 67206, + 67181, + 67191, + 67207, + 67205, + 67180, + 67195, + 67187, + 67183, + 67178, + 67191, + 67176, + 67198, + 67178, + 67184, + 67183, + 67174, + 67194, + 67183, + 67203, + 67192, + 67186, + 67217, + 67217, + 67179, + 67222, + 67197, + 67193, + 67219, + 67201, + 67166, + 67182, + 67181, + 67179, + 67169, + 67182, + 67164, + 67174, + 67183, + 67162, + 67220, + 67220, + 67188, + 67199, + 67170, + 67200, + 67186, + 67210, + 67177, + 67200, + 67206, + 67167, + 67200, + 67201, + 67180, + 67214, + 67205, + 67177, + 67208, + 67169, + 67200, + 67283, + 67256, + 67200, + 67206, + 67198, + 67190, + 67211, + 67164, + 67174, + 67188, + 67189, + 67185, + 67202, + 67193, + 67196, + 67230, + 67202, + 67201, + 67197, + 67178, + 67187, + 67202, + 67195, + 67191, + 67178, + 67402, + 67183, + 67206, + 67163, + 67205, + 67209, + 67179, + 67183, + 67197, + 67206, + 67194, + 67206, + 67205, + 67213, + 67169, + 67178, + 67175, + 67223, + 67199, + 67197, + 67159, + 67173, + 67195, + 67175, + 67194, + 67210, + 67167, + 67209, + 67186, + 67190, + 67218, + 67187, + 67193, + 67188, + 67172, + 67178, + 67199, + 67187, + 67165, + 67244, + 67251, + 67179, + 67189, + 67169, + 67191, + 67221, + 67232, + 67196, + 67190, + 67217, + 67201, + 67163, + 67170, + 67208, + 67198, + 67205, + 67203, + 67203, + 67178, + 67197, + 67199, + 67189, + 67149, + 67188, + 67179, + 67188, + 67230, + 67180, + 67205, + 67198, + 67207, + 67206, + 67208, + 67168, + 67189, + 67191, + 67236, + 67207, + 67196, + 67194, + 67211, + 67193, + 67181, + 67207, + 67213, + 67193, + 67196, + 67163, + 67204, + 67216, + 67188, + 67173, + 67200, + 67189, + 67180, + 67223, + 67208, + 67194, + 67173, + 67177, + 67214, + 67185, + 67191, + 67201, + 67185, + 67203, + 67193, + 67208, + 67201, + 67219, + 67202, + 67189, + 67184, + 67170, + 67171, + 67174, + 67200, + 67218, + 67187, + 67970, + 67176, + 67154, + 67186, + 67209, + 67161, + 67175, + 67169, + 67186, + 67216, + 67196, + 67177, + 67243, + 67209, + 67189, + 67179, + 67202, + 67178, + 67218, + 67215, + 67178, + 67172, + 67208, + 67196, + 67205, + 67184, + 67178, + 67175, + 67173, + 67158, + 67169, + 67194, + 67213, + 67197, + 67192, + 67168, + 67230, + 67198, + 67199, + 67199, + 67179, + 67204, + 67209, + 67179, + 67217, + 67190, + 67219, + 67263, + 67218, + 67203, + 67203, + 67189, + 67154, + 67194, + 67198, + 67170, + 67188, + 67176, + 67190, + 67198, + 67483, + 67209, + 67203, + 67194, + 67301, + 67179, + 67214, + 67175, + 67179, + 67166, + 67162, + 67196, + 67206, + 67172, + 67175, + 67185, + 67174, + 67197, + 67166, + 67157, + 67254, + 67177, + 67216, + 67194, + 67217, + 67173, + 67194, + 67176, + 67201, + 67175, + 67211, + 67198, + 67193, + 67189, + 67197, + 67210, + 67193, + 67212, + 67197, + 67209, + 67187, + 67172, + 67187, + 67198, + 67175, + 67193, + 67197, + 67182, + 67174, + 67195, + 67164, + 67202, + 67155, + 67227, + 67196, + 67204, + 67214, + 67195, + 67187, + 67174, + 67205, + 67259, + 67207, + 67191, + 67170, + 67212, + 67211, + 67217, + 67198, + 67166, + 67192, + 67196, + 67211, + 67184, + 67173, + 67197, + 67156, + 67167, + 67219, + 67164, + 67166, + 67196, + 67173, + 67178, + 67211, + 67203, + 67176, + 67164, + 67194, + 67205, + 67194, + 67206, + 67198, + 67197, + 67177, + 67174, + 67187, + 67188, + 67216, + 67175, + 67190, + 67191, + 67203, + 67174, + 67189, + 67211, + 67173, + 67201, + 67201, + 67179, + 67224, + 67206, + 67179, + 67190, + 67180, + 67197, + 67178, + 67199, + 67176, + 67178, + 67199, + 67216, + 67189, + 67171, + 67191, + 67183, + 67178, + 67178, + 67162, + 67174, + 67207, + 67196, + 67213, + 67174, + 67181, + 67207, + 67183, + 67195, + 67194, + 67200, + 67191, + 67197, + 67211, + 67192, + 67213, + 67180, + 67205, + 67187, + 67205, + 67580, + 67237, + 67203, + 67195, + 67277, + 67189, + 67208, + 67229, + 67234, + 67192, + 67179, + 67159, + 67191, + 67195, + 67200, + 67160, + 67202, + 67199, + 67248, + 67207, + 67202, + 67218, + 67210, + 67207, + 67176, + 67172, + 67182, + 67202, + 67180, + 67183, + 67172, + 67160, + 67190, + 67209, + 67214, + 67191, + 67167, + 67209, + 67180, + 67182, + 67181, + 67168, + 67203, + 67196, + 67200, + 67208, + 67173, + 67185, + 67178, + 67200, + 67257, + 67182, + 67207, + 67162, + 67202, + 67193, + 67162, + 67207, + 67175, + 67191, + 67232, + 67218, + 67169, + 67177, + 67159, + 67201, + 67166, + 67178, + 67160, + 67162, + 67174, + 67176, + 67206, + 67197, + 67187, + 67182, + 67203, + 67167, + 67247, + 67169, + 67198, + 67201, + 67204, + 67201, + 67168, + 67212, + 67189, + 67174, + 67172, + 67168, + 67197, + 67203, + 67212, + 67188, + 67167, + 67198, + 67191, + 67211, + 67205, + 67181, + 67176, + 67203, + 67189, + 67199, + 67194, + 67202, + 67217, + 67183, + 67197, + 67207, + 67195, + 67206, + 67177, + 67188, + 67169, + 67183, + 67229, + 67185, + 67159, + 67175, + 67175, + 67187, + 67187, + 67169, + 67166, + 67188, + 67181, + 67203, + 67195, + 67207, + 67177, + 67178, + 67178, + 67193, + 67202, + 67201, + 67188, + 67194, + 67172, + 67195, + 67190, + 67171, + 67175, + 67190, + 67203, + 67197, + 67212, + 67181, + 67173, + 67210, + 67197, + 67213, + 67190, + 67195, + 67179, + 67200, + 67208, + 67190, + 67169, + 67207, + 67166, + 67174, + 67206, + 67188, + 67166, + 67211, + 67195, + 67224, + 67202, + 67196, + 67198, + 67201, + 67179, + 67174, + 67212, + 67180, + 67190, + 67174, + 67173, + 67195, + 67169, + 67197, + 67195, + 67198, + 67206, + 67191, + 67154, + 67211, + 67222, + 67254, + 67163, + 67180, + 67188, + 67192, + 67224, + 67215, + 67178, + 67213, + 67179, + 67235, + 67223, + 67210, + 67164, + 67200, + 67197, + 67197, + 67175, + 67185, + 67167, + 67543, + 67183, + 67174, + 67188, + 67177, + 67168, + 67155, + 67192, + 67217, + 67193, + 67162, + 67204, + 67163, + 67216, + 67194, + 67218, + 67161, + 67194, + 67190, + 67193, + 67178, + 67210, + 67201, + 67172, + 67164, + 67170, + 67193, + 67165, + 67178, + 67174, + 67207, + 67180, + 67195, + 67213, + 67168, + 67206, + 67238, + 67213, + 67199, + 67181, + 67183, + 67211, + 67181, + 67206, + 67194, + 67174, + 67201, + 67199, + 67190, + 67165, + 67227, + 67165, + 67208, + 67180, + 67193, + 67208, + 67214, + 67211, + 67187, + 67226, + 67212, + 67198, + 67192, + 67210, + 67197, + 67166, + 67182, + 67210, + 67163, + 67203, + 67202, + 67213, + 67178, + 67182, + 67168, + 67211, + 67208, + 67157, + 67169, + 67206, + 67197, + 67170, + 67179, + 67183, + 67177, + 67177, + 67201, + 67190, + 67200, + 67160, + 67168, + 67184, + 67560, + 67169, + 67170, + 67216, + 67138, + 67199, + 67178, + 67183, + 67168, + 67213, + 67226, + 67196, + 67217, + 67202, + 67184, + 67162, + 67204, + 67196, + 67169, + 67195, + 67181, + 67180, + 67176, + 67166, + 67202, + 67206, + 67199, + 67540, + 67198, + 67201, + 67230, + 67179, + 67209, + 67160, + 67173, + 67209, + 67228, + 67208, + 67215, + 67188, + 67177, + 67196, + 67184, + 67210, + 67199, + 67190, + 67173, + 67224, + 67218, + 67205, + 67198, + 67198, + 67181, + 67156, + 67181, + 67193, + 67223, + 67197, + 67206, + 67188, + 67186, + 67201, + 67175, + 67244, + 67185, + 67179, + 67188, + 67205, + 67189, + 67194, + 67201, + 67209, + 67202, + 67170, + 67169, + 67204, + 67212, + 67189, + 67204, + 67183, + 67212, + 67195, + 67161, + 67211, + 67228, + 67184, + 67191, + 67191, + 67165, + 67173, + 67195, + 67188, + 67173, + 67197, + 67218, + 67212, + 67186, + 67196, + 67172, + 67224, + 67172, + 67198, + 67166, + 67182, + 67172, + 67174, + 67209, + 67211, + 67213, + 67198, + 67178, + 67213, + 67203, + 67214, + 67165, + 67194, + 67216, + 67174, + 67160, + 67193, + 67199, + 67182, + 67149, + 67197, + 67211, + 67176, + 67203, + 67200, + 67202, + 67201, + 67195, + 67199, + 67176, + 67166, + 67183, + 67217, + 67170, + 67180, + 67220, + 67202, + 67181, + 67180, + 67157, + 67210, + 67211, + 67198, + 67223, + 67202, + 67198, + 67176, + 67179, + 67194, + 67263, + 67214, + 67202, + 67233, + 67203, + 67204, + 67196, + 67218, + 67178, + 67211, + 67194, + 67175, + 67182, + 67190, + 67170, + 67203, + 67177, + 67219, + 67192, + 67201, + 67165, + 67166, + 67213, + 67257, + 67215, + 67193, + 67198, + 67173, + 67240, + 67178, + 67181, + 67191, + 67203, + 67184, + 67204, + 67171, + 67184, + 67196, + 67261, + 67161, + 67195, + 67172, + 67197, + 67190, + 67183, + 67178, + 67178, + 67183, + 67188, + 67192, + 67196, + 67164, + 67163, + 67157, + 67173, + 67160, + 67205, + 67208, + 67208, + 67167, + 67176, + 67202, + 67190, + 67173, + 67190, + 67194, + 67199, + 67181, + 67221, + 67238, + 67173, + 67189, + 67208, + 67198, + 67169, + 67192, + 67192, + 67169, + 67175, + 67157, + 67202, + 67160, + 67185, + 67172, + 67211, + 67159, + 67167, + 67165, + 67187, + 67191, + 67185, + 67178, + 67168, + 67185, + 67234, + 67175, + 67196, + 67217, + 67189, + 67201, + 67156, + 67206, + 67169, + 67204, + 67203, + 67173, + 67196, + 67172, + 67193, + 67161, + 67154, + 67187, + 67178, + 67170, + 67202, + 67154, + 67206, + 67247, + 67165, + 67209, + 67200, + 67205, + 67184, + 67189, + 67203, + 67237, + 67213, + 67207, + 67188, + 67164, + 67203, + 67162, + 67176, + 67165, + 67188, + 67167, + 67184, + 67205, + 67191, + 67209, + 67200, + 67165, + 67257, + 67208, + 67172, + 67176, + 67198, + 67171, + 67196, + 67186, + 67202, + 67165, + 67194, + 67187, + 67210, + 67186, + 67215, + 67167, + 67213, + 67183, + 67186, + 67176, + 67178, + 67187, + 67187, + 67180, + 67210, + 67207, + 67205, + 67160, + 67196, + 67191, + 67187, + 67209, + 67178, + 67237, + 67167, + 67199, + 67232, + 67194, + 67158, + 67207, + 67187, + 67202, + 67173, + 67203, + 67178, + 67158, + 67184, + 67178, + 67175, + 67200, + 67199, + 67183, + 67181, + 67162, + 67171, + 67195, + 67203, + 67199, + 67208, + 67173, + 67212, + 67183, + 67184, + 67194, + 67200, + 67205, + 67248, + 67207, + 67208, + 67205, + 67193, + 67177, + 67196, + 67217, + 67203, + 67208, + 67188, + 67167, + 67195, + 67196, + 67191, + 67197, + 67213, + 67178, + 67167, + 67185, + 67195, + 67201, + 67214, + 67219, + 67176, + 68330, + 67176, + 67173, + 67204, + 67213, + 67201, + 67203, + 67212, + 67193, + 67168, + 67160, + 67172, + 67209, + 67186, + 67191, + 67188, + 67213, + 67194, + 67184, + 67187, + 67195, + 67204, + 67224, + 67207, + 67187, + 67194, + 67161, + 67161, + 67204, + 67212, + 67202, + 67251, + 67208, + 67197, + 67174, + 67208, + 67197, + 67167, + 67180, + 67162, + 67210, + 67297, + 67289, + 67177, + 67197, + 67201, + 67193, + 67184, + 67167, + 67184, + 67200, + 67210, + 67177, + 67187, + 67163, + 67201, + 67155, + 67150, + 67205, + 67188, + 67188, + 67189, + 67206, + 67191, + 67191, + 67188, + 67186, + 67208, + 67199, + 67223, + 67215, + 67193, + 67214, + 67183, + 67201, + 67191, + 67201, + 67200, + 67205, + 67200, + 67209, + 67218, + 67201, + 67209, + 67203, + 67180, + 67199, + 67181, + 67188, + 67214, + 67208, + 67184, + 67178, + 67209, + 67157, + 67231, + 67171, + 67256, + 67209, + 67166, + 67194, + 67229, + 67221, + 67192, + 67183, + 67190, + 67211, + 67211, + 67178, + 67176, + 67205, + 67180, + 67184, + 67258, + 67160, + 67192, + 67165, + 67182, + 67177, + 67198, + 67179, + 67186, + 67175, + 67198, + 67183, + 67203, + 67188, + 67179, + 67206, + 67172, + 67177, + 67166, + 67213, + 67175, + 67169, + 67208, + 67178, + 67164, + 67223, + 67169, + 67208, + 67157, + 67205, + 67197, + 67229, + 67220, + 67165, + 67154, + 67211, + 67206, + 67192, + 67180, + 67178, + 67182, + 67182, + 67175, + 67163, + 67232, + 67182, + 67201, + 67174, + 67187, + 67200, + 67183, + 67194, + 67170, + 67178, + 67193, + 67188, + 67226, + 67192, + 67189, + 67182, + 67201, + 67203, + 67185, + 67215, + 67183, + 67169, + 67204, + 67201, + 67198, + 67192, + 67197, + 67192, + 67175, + 67199, + 67202, + 67184, + 67208, + 67172, + 67201, + 67184, + 67193, + 67158, + 67167, + 67182, + 67215, + 67211, + 67195, + 67204, + 67165, + 67178, + 67201, + 67165, + 67204, + 67191, + 67160, + 67214, + 67183, + 67196, + 67247, + 67162, + 67199, + 67189, + 67177, + 67183, + 67206, + 67204, + 67175, + 67178, + 67199, + 67199, + 67213, + 67199, + 67167, + 67174, + 67161, + 67191, + 67219, + 67166, + 67200, + 67163, + 67175, + 67201, + 67174, + 67173, + 67167, + 67192, + 67185, + 67211, + 67213, + 67192, + 67210, + 67193, + 67193, + 67202, + 67173, + 67190, + 67187, + 67199, + 67213, + 67260, + 67212, + 67180, + 67198, + 67181, + 67206, + 67186, + 67217, + 67202, + 67165, + 67204, + 67170, + 67189, + 67174, + 67154, + 67159, + 67213, + 67165, + 67161, + 67217, + 67153, + 67171, + 67210, + 67173, + 67214, + 67201, + 67157, + 67170, + 67190, + 67181, + 67218, + 67167, + 67204, + 67205, + 67176, + 67176, + 67175, + 67202, + 67196, + 67166, + 67183, + 67195, + 67214, + 67192, + 67187, + 67173, + 67213, + 67196, + 67200, + 67212, + 67162, + 67195, + 67197, + 67171, + 67182, + 67171, + 67185, + 67201, + 67175, + 67185, + 67179, + 67204, + 67203, + 67199, + 67215, + 67210, + 67191, + 67168, + 67169, + 67194, + 67212, + 67191, + 67192, + 67194, + 67206, + 67177, + 67198, + 67170, + 67197, + 67181, + 67173, + 67196, + 67167, + 67195, + 67218, + 67205, + 67210, + 67221, + 67214, + 67194, + 67161, + 67201, + 67164, + 67211, + 67198, + 67198, + 67213, + 67209, + 67181, + 67192, + 67198, + 67170, + 67179, + 67180, + 67207, + 67196, + 67192, + 67176, + 67181, + 67167, + 67174, + 67197, + 67244, + 67174, + 67169, + 67193, + 67185, + 67221, + 67179, + 67171, + 67200, + 67163, + 67205, + 67204, + 67179, + 67200, + 67180, + 67197, + 67213, + 67208, + 67191, + 67209, + 67200, + 67180, + 67194, + 67195, + 67185, + 67199, + 67194, + 67214, + 67189, + 67191, + 67183, + 67180, + 67196, + 67176, + 67211, + 67200, + 67220, + 67203, + 67206, + 67189, + 67206, + 67190, + 67202, + 67184, + 67164, + 67179, + 67198, + 67181, + 67206, + 67183, + 67190, + 67171, + 67324, + 67173, + 67197, + 67181, + 67192, + 67196, + 67198, + 67218, + 67169, + 67202, + 67159, + 67203, + 67210, + 67169, + 67206, + 67211, + 67200, + 67196, + 67176, + 67205, + 67161, + 67194, + 67174, + 67203, + 67203, + 67195, + 67198, + 67199, + 67181, + 67200, + 67270, + 67204, + 67177, + 67162, + 67198, + 67193, + 67199, + 67172, + 67145, + 67186, + 67166, + 67176, + 67196, + 67173, + 67199, + 67207, + 67196, + 67209, + 67200, + 67165, + 67177, + 67206, + 67199, + 67192, + 67196, + 67174, + 67183, + 67173, + 67261, + 67199, + 67226, + 67167, + 67173, + 67198, + 67156, + 67177, + 67183, + 67205, + 67164, + 67168, + 67167, + 67207, + 67200, + 67242, + 67213, + 67195, + 67231, + 67207, + 67177, + 67162, + 67180, + 67170, + 67187, + 67239, + 67176, + 67186, + 67168, + 67178, + 67210, + 67200, + 67191, + 67225, + 67171, + 67200, + 67200, + 67180, + 67188, + 67201, + 67201, + 67191, + 67182, + 67213, + 67157, + 67172, + 67205, + 67167, + 67181, + 67188, + 67162, + 67182, + 67188, + 67177, + 67191, + 67207, + 67214, + 67177, + 67226, + 67193, + 67168, + 67163, + 67195, + 67193, + 67169, + 67182, + 67183, + 67180, + 67159, + 67191, + 67211, + 67171, + 67192, + 67174, + 67197, + 67166, + 67164, + 67209, + 67185, + 67179, + 67158, + 67212, + 67213, + 67181, + 67195, + 67180, + 67166, + 67168, + 67178, + 67205, + 67183, + 67220, + 67181, + 67186, + 67171, + 67207, + 67171, + 67198, + 67180, + 67218, + 67178, + 67214, + 67204, + 67180, + 67224, + 67162, + 67193, + 67206, + 67213, + 67175, + 67179, + 67227, + 67219, + 67197, + 67229, + 67183, + 67161, + 67151, + 67206, + 67211, + 67205, + 67179, + 67191, + 67181, + 67206, + 67208, + 67169, + 67196, + 67167, + 67183, + 67187, + 67150, + 67172, + 67181, + 67198, + 67172, + 67201, + 67199, + 67206, + 67224, + 67190, + 67178, + 67180, + 67172, + 67200, + 67204, + 67193, + 67200, + 67196, + 67176, + 67181, + 67177, + 67198, + 67194, + 67197, + 67220, + 67183, + 67220, + 67182, + 67198, + 67207, + 67198, + 67204, + 67188, + 67204, + 67177, + 67194, + 67236, + 67224, + 67198, + 67209, + 67180, + 67166, + 67178, + 67189, + 67196, + 67191, + 67174, + 67203, + 67182, + 67212, + 67193, + 67177, + 67172, + 67182, + 67214, + 67171, + 67164, + 67213, + 67166, + 67159, + 67155, + 67157, + 67194, + 67207, + 67246, + 67180, + 67176, + 67167, + 67211, + 67191, + 67167, + 67174, + 67193, + 67166, + 67177, + 67201, + 67177, + 67187, + 67177, + 67200, + 67202, + 67176, + 67216, + 67180, + 67181, + 67196, + 67193, + 67184, + 67170, + 67191, + 67193, + 67178, + 67209, + 67196, + 67159, + 67208, + 67204, + 67175, + 67205, + 67209, + 67183, + 67179, + 67199, + 67197, + 67183, + 67175, + 67202, + 67172, + 67193, + 67173, + 67219, + 67189, + 67164, + 67200, + 67203, + 67211, + 67193, + 67182, + 67199, + 67193, + 67196, + 67199, + 67196, + 67227, + 67189, + 67215, + 67198, + 67170, + 67181, + 67176, + 67162, + 67186, + 67205, + 67164, + 67204, + 67182, + 67160, + 67198, + 67201, + 67182, + 67212, + 67219, + 67203, + 67191, + 67196, + 67212, + 67182, + 67231, + 67172, + 67201, + 67193, + 67195, + 67199, + 67204, + 67167, + 67189, + 67231, + 67197, + 67196, + 67172, + 67182, + 67190, + 67213, + 67179, + 67200, + 67215, + 67173, + 67205, + 67199, + 67202, + 67200, + 67178, + 67163, + 67207, + 67207, + 67191, + 67187, + 67160, + 67190, + 67202, + 67183, + 67210, + 67204, + 67206, + 67196, + 67187, + 67217, + 67181, + 67188, + 67214, + 67173, + 67207, + 67173, + 67179, + 67200, + 67166, + 67200, + 67203, + 67182, + 67176, + 67193, + 67175, + 67257, + 67185, + 67188, + 67228, + 67174, + 67210, + 67184, + 67212, + 67223, + 67232, + 67197, + 67180, + 67196, + 67164, + 67211, + 67212, + 67190, + 67194, + 67191, + 67205, + 67214, + 67200, + 67197, + 67171, + 67198, + 67170, + 67177, + 67181, + 67350, + 67165, + 67209, + 67171, + 67194, + 67198, + 67180, + 67229, + 67186, + 67197, + 67186, + 67204, + 67201, + 67239, + 67188, + 67195, + 67178, + 67187, + 67198, + 67162, + 67191, + 67212, + 67189, + 67181, + 67185, + 67176, + 67159, + 67182, + 67171, + 67203, + 67197, + 67230, + 67204, + 67200, + 67189, + 67195, + 67193, + 67193, + 67175, + 67179, + 67197, + 67215, + 67241, + 67207, + 67183, + 67182, + 67170, + 67180, + 67190, + 67197, + 67192, + 67167, + 67205, + 67169, + 67162, + 67173, + 67877, + 67212, + 67200, + 67196, + 67181, + 67175, + 67151, + 67188, + 67172, + 67189, + 67169, + 67173, + 67156, + 67201, + 67172, + 67220, + 67188, + 67200, + 67191, + 67164, + 67197, + 67197, + 67180, + 67156, + 67167, + 67166, + 67179, + 67203, + 67231, + 67218, + 67179, + 67178, + 67191, + 68484, + 67181, + 67177, + 67178, + 67206, + 67206, + 67183, + 67201, + 67204, + 67215, + 67190, + 67176, + 67181, + 67171, + 67158, + 67179, + 67188, + 67183, + 67193, + 67171, + 67193, + 67210, + 67269, + 67202, + 67223, + 67206, + 67164, + 67159, + 67172, + 67177, + 67208, + 67188, + 67243, + 67209, + 67172, + 67166, + 67190, + 67203, + 67183, + 67201, + 67191, + 67197, + 67189, + 67196, + 67201, + 67180, + 67159, + 67221, + 67192, + 67195, + 67244, + 67244, + 67213, + 67170, + 67153, + 67177, + 67170, + 67172, + 67207, + 67196, + 67164, + 67176, + 67170, + 67173, + 67209, + 67208, + 67200, + 67197, + 67156, + 67157, + 67192, + 67194, + 67223, + 67217, + 67162, + 67164, + 67186, + 67198, + 67205, + 67228, + 67176, + 67179, + 67204, + 67172, + 67228, + 67212, + 67179, + 67206, + 67177, + 67210, + 67239, + 67194, + 67172, + 67226, + 67160, + 67199, + 67209, + 67175, + 67166, + 67177, + 67201, + 67198, + 67250, + 67209, + 67196, + 67206, + 67252, + 67198, + 67215, + 67193, + 67166, + 67181, + 67173, + 67180, + 67200, + 67190, + 67172, + 67197, + 67180, + 67186, + 67193, + 67198, + 67178, + 67151, + 67207, + 67207, + 67196, + 67168, + 67182, + 67175, + 67158, + 67206, + 67203, + 67194, + 67237, + 67190, + 67180, + 67180, + 67179, + 67218, + 67192, + 67198, + 67189, + 67206, + 67174, + 67191, + 67202, + 67173, + 67207, + 67191, + 67209, + 67182, + 67210, + 67161, + 67189, + 67185, + 67178, + 67197, + 67200, + 67197, + 67204, + 67501, + 67180, + 67177, + 67208, + 67169, + 67186, + 67214, + 67176, + 67191, + 67230, + 67182, + 67154, + 67211, + 67175, + 67195, + 67229, + 67197, + 67172, + 67210, + 67173, + 67187, + 67224, + 67180, + 67180, + 67180, + 67203, + 67194, + 67165, + 67190, + 67185, + 67204, + 67165, + 67179, + 67197, + 67213, + 67197, + 67249, + 67217, + 67216, + 67198, + 67186, + 67178, + 67229, + 67165, + 67210, + 67167, + 67197, + 67164, + 67175, + 67197, + 67205, + 67188, + 67219, + 67187, + 67202, + 67224, + 67196, + 67198, + 67190, + 67201, + 67178, + 67205, + 67178, + 67191, + 67192, + 67171, + 67177, + 67216, + 67183, + 67201, + 67215, + 67152, + 67188, + 67194, + 67178, + 67167, + 67198, + 67212, + 67214, + 67192, + 67182, + 67197, + 67182, + 67172, + 67215, + 67198, + 67183, + 67201, + 67208, + 67173, + 67179, + 67181, + 67189, + 67199, + 67198, + 67173, + 67173, + 67200, + 67203, + 67173, + 67202, + 67206, + 67204, + 67215, + 67211, + 67182, + 67172, + 67212, + 67177, + 67198, + 67171, + 67251, + 67198, + 67193, + 67206, + 67193, + 67201, + 67187, + 67178, + 67190, + 67192, + 67182, + 67198, + 67180, + 67197, + 67177, + 67213, + 67181, + 67163, + 67211, + 67156, + 67165, + 67187, + 67186, + 67175, + 67185, + 67207, + 67172, + 67210, + 67275, + 67188, + 67202, + 67219, + 67173, + 67186, + 67218, + 67197, + 67190, + 67180, + 67223, + 67174, + 67192, + 67175, + 67204, + 67164, + 67171, + 67181, + 67181, + 67175, + 67174, + 67213, + 67206, + 67203, + 67206, + 67198, + 67191, + 67183, + 68277, + 67199, + 67197, + 67181, + 67185, + 67180, + 67187, + 67174, + 67188, + 67185, + 67223, + 67184, + 67184, + 67217, + 67182, + 67198, + 67177, + 67223, + 67201, + 67190, + 67209, + 67183, + 67200, + 67217, + 67177, + 67192, + 67191, + 67230, + 67185, + 67172, + 67212, + 67223, + 67199, + 67162, + 67188, + 67218, + 67214, + 67176, + 67188, + 67173, + 67203, + 67191, + 67199, + 67207, + 67181, + 67200, + 67209, + 67273, + 67180, + 67222, + 67251, + 67210, + 67196, + 67205, + 67177, + 67211, + 67205, + 67169, + 67198, + 67196, + 67209, + 67171, + 67208, + 67187, + 67174, + 67200, + 67199, + 67209, + 67179, + 67196, + 67209, + 67179, + 67185, + 67167, + 67196, + 67203, + 67201, + 67193, + 67200, + 67197, + 67174, + 67217, + 67192, + 67183, + 67176, + 67168, + 67163, + 67218, + 67197, + 67180, + 67175, + 67182, + 67201, + 67193, + 67192, + 67192, + 67208, + 67208, + 67191, + 67208, + 67195, + 67172, + 67194, + 67177, + 67192, + 67194, + 67202, + 67201, + 67206, + 67168, + 67172, + 67210, + 67220, + 67195, + 67190, + 67162, + 67212, + 67191, + 67203, + 67187, + 67220, + 67199, + 67222, + 67200, + 67210, + 67156, + 67173, + 67201, + 67199, + 67198, + 67201, + 67195, + 67190, + 67166, + 67211, + 67192, + 67203, + 67164, + 67178, + 67204, + 67207, + 67183, + 67195, + 67188, + 67197, + 67189, + 67207, + 67197, + 67193, + 67207, + 67199, + 67178, + 67209, + 67206, + 67164, + 67194, + 67212, + 67215, + 67185, + 67213, + 67182, + 67173, + 67172, + 67190, + 67196, + 67165, + 67258, + 67164, + 67155, + 67201, + 67209, + 67205, + 67171, + 67181, + 67186, + 67195, + 67202, + 67202, + 67200, + 67199, + 67265, + 67191, + 67194, + 67202, + 67190, + 67194, + 67160, + 67193, + 67181, + 67192, + 67200, + 67203, + 67187, + 67251, + 67214, + 67221, + 67190, + 67194, + 67172, + 67200, + 67222, + 67169, + 67209, + 67193, + 67200, + 67174, + 67179, + 67207, + 67182, + 67218, + 67224, + 67234, + 67160, + 67164, + 67180, + 67203, + 67163, + 67174, + 67195, + 67209, + 67194, + 67202, + 67224, + 67184, + 67203, + 67182, + 67255, + 67186, + 67214, + 67206, + 67227, + 67247, + 67222, + 67239, + 67161, + 67211, + 67211, + 67201, + 67182, + 67219, + 67225, + 67175, + 67170, + 67188, + 67218, + 67181, + 67232, + 67217, + 67176, + 67218, + 67246, + 67172, + 67183, + 67181, + 67200, + 67179, + 67185, + 67182, + 67206, + 67208, + 67209, + 67200, + 67179, + 67171, + 67200, + 67222, + 67201, + 67197, + 67202, + 67196, + 67177, + 67200, + 67219, + 67175, + 67195, + 67214, + 67213, + 67241, + 67200, + 67180, + 67199, + 67205, + 67207, + 67183, + 67183, + 67188, + 67178, + 67209, + 67185, + 67222, + 67217, + 67207, + 67195, + 67207, + 67168, + 67204, + 67183, + 67216, + 67227, + 67216, + 67162, + 67202, + 67211, + 67188, + 67227, + 67212, + 67253, + 67185, + 67208, + 67223, + 67211, + 67197, + 67205, + 67183, + 67190, + 67196, + 67194, + 67194, + 67195, + 67220, + 67201, + 67193, + 67178, + 67219, + 67237, + 67183, + 67196, + 67177, + 67197, + 67212, + 67226, + 67188, + 67221, + 67197, + 67206, + 67208, + 67217, + 67189, + 67199, + 67242, + 67204, + 67190, + 67208, + 67194, + 67210, + 67221, + 67211, + 67193, + 67177, + 67197, + 67219, + 67199, + 67182, + 67202, + 67206, + 67193, + 67227, + 67205, + 67193, + 67197, + 67196, + 67204, + 67178, + 67177, + 67182, + 67174, + 67183, + 67185, + 67197, + 67174, + 67204, + 67202, + 67195, + 67212, + 67193, + 67194, + 67181, + 67162, + 67189, + 67175, + 67187, + 67188, + 67172, + 67207, + 67176, + 67217, + 67191, + 67192, + 67194, + 67172, + 67189, + 67170, + 67184, + 67207, + 67184, + 67187, + 67186, + 67211, + 67176, + 67170, + 67214, + 67176, + 67212, + 67176, + 67201, + 67205, + 67211, + 67187, + 67210, + 67223, + 67219, + 67195, + 67207, + 67173, + 67205, + 67198, + 67256, + 67210, + 67173, + 67190, + 67194, + 67199, + 67205, + 67181, + 67149, + 67193, + 67201, + 67198, + 67197, + 67212, + 67162, + 67181, + 67206, + 67225, + 67193, + 67206, + 67184, + 67174, + 67188, + 67199, + 67180, + 67194, + 67225, + 67180, + 67237, + 67226, + 67174, + 67171, + 67209, + 67163, + 67184, + 67179, + 67175, + 67240, + 67188, + 67164, + 67240, + 67201, + 67212, + 67191, + 67214, + 67202, + 67167, + 67180, + 67193, + 67210, + 67209, + 67186, + 67184, + 67224, + 67176, + 67197, + 67200, + 67180, + 67209, + 67203, + 67192, + 67221, + 67199, + 67235, + 67214, + 67172, + 67186, + 67177, + 67182, + 67186, + 67221, + 67222, + 67207, + 67195, + 67197, + 67191, + 67207, + 67192, + 67216, + 67216, + 67181, + 67182, + 67194, + 67198, + 67213, + 67176, + 67210, + 67213, + 67179, + 67192, + 67182, + 67188, + 67348, + 67165, + 67177, + 67212, + 67175, + 67182, + 67185, + 67165, + 67209, + 67180, + 67198, + 67203, + 67178, + 67171, + 67214, + 67218, + 67207, + 67219, + 67179, + 67192, + 67225, + 67211, + 67207, + 67207, + 67159, + 67193, + 67193, + 67186, + 67197, + 67175, + 67223, + 67194, + 67172, + 67181, + 67194, + 67186, + 67181, + 67173, + 67204, + 67163, + 67201, + 67176, + 67191, + 67180, + 67198, + 67190, + 67184, + 67212, + 67184, + 67194, + 67208, + 67182, + 67206, + 67192, + 67158, + 67209, + 67209, + 67192, + 67194, + 67205, + 67219, + 67191, + 67202, + 67204, + 67199, + 67203, + 67214, + 67196, + 67213, + 67202, + 67175, + 67187, + 67206, + 67212, + 67179, + 67176, + 67186, + 67228, + 67246, + 67172, + 67196, + 67254, + 67197, + 67186, + 67170, + 67200, + 67207, + 67189, + 67209, + 67214, + 67178, + 67172, + 67210, + 67213, + 67212, + 67210, + 67189, + 67180, + 67204, + 67226, + 67182, + 67215, + 67230, + 67200, + 67197, + 67210, + 67175, + 67206, + 67179, + 67198, + 67201, + 67175, + 67180, + 67193, + 67181, + 67180, + 67191, + 67210, + 67175, + 67183, + 67170, + 67181, + 67209, + 67199, + 67190, + 67207, + 67171, + 67166, + 67197, + 67183, + 67222, + 67178, + 67186, + 67225, + 67202, + 67232, + 67219, + 67197, + 67189, + 67217, + 67192, + 67205, + 67163, + 67172, + 67171, + 67252, + 67176, + 67205, + 67210, + 67187, + 67199, + 67199, + 67213, + 67198, + 67211, + 67205, + 67187, + 67213, + 67625, + 67207, + 67213, + 67193, + 67198, + 67180, + 67187, + 67212, + 67209, + 67206, + 67204, + 67183, + 67202, + 67205, + 67179, + 67204, + 67180, + 67212, + 67204, + 67183, + 67200, + 67232, + 67252, + 67204, + 67194, + 67184, + 67215, + 67188, + 67222, + 67255, + 67207, + 67202, + 67181, + 67203, + 67219, + 67209, + 67206, + 67261, + 67204, + 67194, + 67214, + 67201, + 67211, + 67185, + 67215, + 67208, + 67233, + 67225, + 67217, + 67197, + 67215, + 67183, + 67212, + 67178, + 67213, + 67212, + 67218, + 67269, + 67197, + 67183, + 67166, + 67183, + 67173, + 67202, + 67240, + 67203, + 67171, + 67196, + 67212, + 67187, + 67215, + 67200, + 67210, + 67193, + 67205, + 67189, + 67224, + 67190, + 67175, + 67178, + 67196, + 67227, + 67181, + 67172, + 67197, + 67208, + 67175, + 67216, + 67197, + 67216, + 67208, + 67178, + 67208, + 67254, + 67201, + 67189, + 67165, + 67211, + 67178, + 67201, + 67174, + 67180, + 67171, + 67200, + 67182, + 67191, + 67204, + 67176, + 67163, + 67183, + 67204, + 67243, + 67192, + 67191, + 67196, + 67191, + 67194, + 67196, + 67159, + 67210, + 67240, + 67204, + 67209, + 67208, + 67197, + 67181, + 67180, + 67208, + 67176, + 67181, + 67169, + 67164, + 67211, + 67202, + 67200, + 67200, + 67200, + 67172, + 67213, + 67200, + 67211, + 67203, + 67229, + 67191, + 67210, + 67223, + 67182, + 67182, + 67183, + 67160, + 67212, + 67167, + 67164, + 67206, + 67185, + 67189, + 67169, + 67177, + 67187, + 67198, + 67212, + 67208, + 67204, + 67207, + 67175, + 67207, + 67206, + 67246, + 67191, + 67190, + 67196, + 67208, + 67180, + 67179, + 67193, + 67195, + 67202, + 67174, + 67180, + 67171, + 67180, + 67180, + 67188, + 67174, + 67177, + 67204, + 67210, + 67193, + 67210, + 67187, + 67175, + 67237, + 67203, + 67191, + 67230, + 67246, + 67245, + 67235, + 67194, + 67210, + 67216, + 67214, + 67167, + 67195, + 67187, + 67246, + 67187, + 67164, + 67176, + 67173, + 67181, + 67169, + 67190, + 67197, + 67206, + 67185, + 67228, + 67192, + 67208, + 67203, + 67205, + 67165, + 67208, + 67399, + 67191, + 67172, + 67169, + 67173, + 67216, + 67213, + 67203, + 67183, + 67204, + 67187, + 67181, + 67216, + 67205, + 67197, + 67164, + 67174, + 67199, + 67201, + 67178, + 67193, + 67216, + 67189, + 67195, + 67196, + 67193, + 67196, + 67177, + 67205, + 67186, + 67197, + 67211, + 67174, + 67181, + 67183, + 67177, + 67171, + 67192, + 67173, + 67207, + 67205, + 67167, + 67195, + 67183, + 67176, + 67205, + 67204, + 67175, + 67198, + 67215, + 67194, + 67188, + 67210, + 67179, + 67220, + 67209, + 67218, + 67241, + 67203, + 67186, + 67181, + 67187, + 67166, + 67197, + 67211, + 67185, + 67201, + 67226, + 67206, + 67174, + 67165, + 67161, + 67203, + 67206, + 67195, + 67174, + 67192, + 67196, + 67176, + 67207, + 67196, + 67163, + 67174, + 67224, + 67215, + 67207, + 67198, + 67202, + 67209, + 67198, + 67198, + 67189, + 67169, + 67199, + 67201, + 67188, + 67304, + 67187, + 67188, + 67198, + 67169, + 67189, + 67208, + 67196, + 67211, + 67201, + 67196, + 67179, + 67247, + 67209, + 67197, + 67249, + 67208, + 67190, + 67185, + 67250, + 67197, + 67182, + 67209, + 67214, + 67217, + 67227, + 67212, + 67225, + 67177, + 67176, + 67198, + 67182, + 67207, + 67188, + 67168, + 67208, + 67204, + 67161, + 67221, + 67167, + 67177, + 67177, + 67214, + 67222, + 67191, + 67217, + 67205, + 67193, + 67202, + 67186, + 67213, + 67201, + 67174, + 67210, + 67200, + 67197, + 67162, + 67157, + 67154, + 67209, + 67187, + 67210, + 67190, + 67173, + 67195, + 67187, + 67205, + 67217, + 67195, + 67189, + 67154, + 67173, + 67186, + 67179, + 67200, + 67186, + 67169, + 67199, + 67198, + 67181, + 67210, + 67321, + 67170, + 67183, + 67231, + 67185, + 67165, + 67170, + 67167, + 67161, + 67208, + 67182, + 67202, + 67177, + 67190, + 67205, + 67184, + 67190, + 67180, + 67175, + 67206, + 67191, + 67181, + 67208, + 67168, + 67209, + 67168, + 67173, + 67171, + 67211, + 67252, + 67207, + 67191, + 67177, + 67213, + 67186, + 67167, + 67185, + 67166, + 67205, + 67202, + 67168, + 67179, + 67171, + 67175, + 67176, + 67205, + 67198, + 67204, + 67198, + 67194, + 67182, + 67211, + 67170, + 67180, + 67193, + 67177, + 67205, + 67220, + 67168, + 67201, + 67163, + 67195, + 67183, + 67197, + 67190, + 67219, + 67233, + 67185, + 67178, + 67201, + 67215, + 67191, + 67187, + 67196, + 67194, + 67229, + 67176, + 67185, + 67207, + 67185, + 67184, + 67187, + 67207, + 67216, + 67199, + 67185, + 67195, + 67192, + 67200, + 67210, + 67175, + 67199, + 67189, + 67211, + 67180, + 67191, + 67183, + 67189, + 67188, + 67197, + 67208, + 67179, + 67209, + 67230, + 67186, + 67213, + 67209, + 67229, + 67189, + 67208, + 67215, + 67215, + 67225, + 67171, + 67197, + 67201, + 67212, + 67213, + 67233, + 67190, + 67166, + 67205, + 67197, + 67203, + 67186, + 67200, + 67183, + 67176, + 67158, + 67208, + 67202, + 67204, + 67198, + 67192, + 67209, + 67190, + 67182, + 67179, + 67207, + 67229, + 67196, + 67207, + 67202, + 67210, + 67216, + 67178, + 67201, + 67192, + 67191, + 67194, + 67227, + 67275, + 67189, + 67196, + 67178, + 67214, + 67221, + 67164, + 67169, + 67214, + 67177, + 67166, + 67162, + 67203, + 67192, + 67222, + 67214, + 67251, + 67210, + 67199, + 67204, + 67229, + 67222, + 67195, + 67207, + 67197, + 67204, + 67212, + 67193, + 67192, + 67197, + 67202, + 67220, + 67218, + 67183, + 67208, + 67193, + 67213, + 67184, + 67227, + 67207, + 67177, + 67215, + 67209, + 67207, + 67211, + 67214, + 67205, + 67187, + 67166, + 67187, + 67214, + 67196, + 67200, + 67192, + 67204, + 67194, + 67209, + 67205, + 67199, + 67183, + 67179, + 67196, + 67202, + 67222, + 67202, + 67212, + 67179, + 67206, + 67434, + 67204, + 67181, + 67210, + 67190, + 67208, + 67190, + 67180, + 67208, + 67211, + 67181, + 67221, + 67210, + 67193, + 67177, + 67187, + 67200, + 67214, + 67198, + 67204, + 67192, + 67246, + 67212, + 67208, + 67247, + 67250, + 67219, + 67167, + 67193, + 67228, + 67191, + 67210, + 67217, + 67174, + 67193, + 67262, + 67202, + 67178, + 67187, + 67177, + 67157, + 67210, + 67204, + 67218, + 67171, + 67172, + 67171, + 67195, + 67168, + 67166, + 67194, + 67204, + 67199, + 67188, + 67177, + 67187, + 67222, + 67182, + 67213, + 67233, + 67166, + 67181, + 67197, + 67194, + 67197, + 67162, + 67173, + 67196, + 67201, + 67188, + 67170, + 67192, + 67209, + 67203, + 67193, + 67167, + 67186, + 67213, + 67230, + 67192, + 67190, + 67211, + 67180, + 67178, + 67178, + 67194, + 67171, + 67224, + 67229, + 67226, + 67186, + 67178, + 67196, + 67158, + 67157, + 67189, + 67175, + 67158, + 67188, + 67218, + 67183, + 67199, + 67204, + 67176, + 67196, + 67177, + 67211, + 67194, + 67201, + 67209, + 67179, + 67193, + 67191, + 67161, + 67193, + 67167, + 67192, + 67198, + 67175, + 67211, + 67209, + 67187, + 67213, + 67171, + 67174, + 67180, + 67189, + 67223, + 67172, + 67161, + 67194, + 67197, + 67204, + 67203, + 67185, + 67190, + 67193, + 67174, + 67178, + 67211, + 67204, + 67187, + 67192, + 67212, + 67208, + 67205, + 67206, + 67186, + 67184, + 67226, + 67205, + 67188, + 67178, + 67187, + 67187, + 67196, + 67191, + 67168, + 67205, + 67173, + 67197, + 67216, + 67218, + 67177, + 67214, + 67160, + 67190, + 67215, + 67207, + 67233, + 67190, + 67178, + 67174, + 67191, + 67223, + 67193, + 67176, + 67208, + 67171, + 67182, + 67199, + 67220, + 67193, + 67180, + 67168, + 67206, + 67185, + 67180, + 67168, + 67212, + 67177, + 67199, + 67200, + 67204, + 67177, + 67220, + 67169, + 67162, + 67223, + 67218, + 67198, + 67196, + 67214, + 67209, + 67179, + 67193, + 67217, + 67183, + 67183, + 67173, + 67183, + 67194, + 67186, + 67193, + 67161, + 67175, + 67187, + 67189, + 67218, + 67175, + 67145, + 67177, + 67233, + 67172, + 67209, + 67170, + 67201, + 67217, + 67175, + 67170, + 67208, + 67201, + 67192, + 67166, + 67175, + 67184, + 67172, + 67209, + 67180, + 67209, + 67198, + 67194, + 67220, + 67178, + 67179, + 67202, + 67187, + 67175, + 67182, + 67179, + 67197, + 67171, + 67190, + 67161, + 67327, + 67222, + 67189, + 67197, + 67180, + 67194, + 67196, + 67242, + 67180, + 67223, + 67185, + 67218, + 67206, + 67170, + 67193, + 67185, + 67187, + 67191, + 67180, + 67163, + 67178, + 67205, + 67215, + 67202, + 67183, + 67177, + 67172, + 67182, + 67210, + 67200, + 67171, + 67198, + 67195, + 67222, + 67157, + 67205, + 67182, + 67176, + 67199, + 67205, + 67202, + 67184, + 67162, + 67177, + 67176, + 67208, + 67185, + 67197, + 67194, + 67191, + 67189, + 67189, + 67171, + 67197, + 67205, + 67181, + 67161, + 67217, + 67205, + 67176, + 67198, + 67221, + 67207, + 67216, + 67188, + 67216, + 67161, + 67186, + 67203, + 67208, + 67172, + 67209, + 67202, + 67196, + 67185, + 67173, + 67210, + 67193, + 67197, + 67148, + 67153, + 67201, + 67231, + 67250, + 67238, + 67217, + 67175, + 67175, + 67215, + 67182, + 67188, + 67160, + 67177, + 67190, + 67189, + 67162, + 67170, + 67169, + 67186, + 67170, + 67204, + 67170, + 67222, + 67218, + 67174, + 67233, + 67202, + 67229, + 67192, + 67213, + 67198, + 67217, + 67179, + 67180, + 67198, + 67186, + 67164, + 67169, + 67223, + 67198, + 67211, + 67181, + 67183, + 67204, + 67195, + 67182, + 67184, + 67184, + 67185, + 67207, + 67285, + 67235, + 67218, + 67206, + 67210, + 67181, + 67208, + 67163, + 67250, + 67169, + 67169, + 67171, + 67217, + 67215, + 67170, + 67195, + 67207, + 67181, + 67190, + 67176, + 67195, + 67207, + 67191, + 67210, + 67178, + 67208, + 67169, + 67185, + 67161, + 67211, + 67168, + 67167, + 67202, + 67191, + 67221, + 67206, + 67565, + 67196, + 67193, + 67173, + 67185, + 67203, + 67184, + 67192, + 67178, + 67203, + 67205, + 67201, + 67213, + 67165, + 67185, + 67194, + 67161, + 67196, + 67204, + 67197, + 67192, + 67192, + 67185, + 67199, + 67177, + 67186, + 67176, + 67190, + 67225, + 67178, + 67209, + 67197, + 67188, + 67215, + 67184, + 67207, + 67166, + 67188, + 67188, + 67188, + 67205, + 67206, + 67186, + 67181, + 67214, + 67166, + 67177, + 67170, + 67193, + 67180, + 67155, + 67209, + 67170, + 67171, + 67218, + 67216, + 67228, + 67223, + 67180, + 67192, + 67196, + 67201, + 67197, + 67164, + 67194, + 67214, + 67199, + 67186, + 67190, + 67189, + 67172, + 67185, + 67214, + 67183, + 67201, + 67188, + 67205, + 67174, + 67212, + 67213, + 67217, + 67170, + 67175, + 67211, + 67175, + 67205, + 67177, + 67205, + 67165, + 67193, + 67208, + 67208, + 67213, + 67177, + 67193, + 67207, + 67211, + 67186, + 67211, + 67179, + 67170, + 67172, + 67208, + 67202, + 67243, + 67203, + 67211, + 67182, + 67198, + 67212, + 67195, + 67168, + 67186, + 67216, + 67174, + 67199, + 67199, + 67221, + 67237, + 67203, + 67182, + 67197, + 67202, + 67210, + 67179, + 67212, + 67166, + 67189, + 67192, + 67170, + 67172, + 67175, + 67178, + 67178, + 67219, + 67207, + 67203, + 67220, + 67184, + 67198, + 67209, + 67242, + 67167, + 67183, + 67218, + 67203, + 67208, + 67171, + 67201, + 67219, + 67166, + 67181, + 67214, + 67178, + 67170, + 67199, + 67211, + 67194, + 67180, + 67202, + 67199, + 67165, + 67205, + 67182, + 67178, + 67174, + 67185, + 67548, + 67171, + 67186, + 67213, + 67170, + 67151, + 67218, + 67190, + 67171, + 67188, + 67190, + 67184, + 67195, + 67185, + 67167, + 67198, + 67190, + 67200, + 67168, + 67213, + 67221, + 67196, + 67209, + 67184, + 67195, + 67178, + 67175, + 67169, + 67246, + 67197, + 67166, + 67191, + 67212, + 67190, + 67181, + 67169, + 67209, + 67173, + 67201, + 67205, + 67203, + 67194, + 67208, + 67201, + 67204, + 67183, + 67205, + 67193, + 67181, + 67226, + 67176, + 67199, + 67182, + 67173, + 67207, + 67176, + 67216, + 67207, + 67188, + 67206, + 67191, + 67203, + 67174, + 67232, + 67212, + 67196, + 67245, + 67189, + 67187, + 67199, + 67192, + 67212, + 67172, + 67198, + 67179, + 67177, + 67184, + 67187, + 67180, + 67176, + 67174, + 67185, + 67186, + 67199, + 67399, + 67200, + 67194, + 67186, + 67159, + 67184, + 67204, + 67212, + 67192, + 67177, + 67204, + 67171, + 67161, + 67215, + 67197, + 67156, + 67215, + 67158, + 67167, + 67188, + 67174, + 67174, + 67167, + 67193, + 67170, + 67201, + 67202, + 67173, + 67328, + 67197, + 67201, + 67217, + 67155, + 67201, + 67167, + 67186, + 67224, + 67161, + 67190, + 67207, + 67173, + 67188, + 67184, + 67197, + 67172, + 67213, + 67216, + 67195, + 67196, + 67173, + 67191, + 67205, + 67210, + 67193, + 67191, + 67186, + 67224, + 67200, + 67232, + 67157, + 67193, + 67197, + 67199, + 67165, + 67180, + 67188, + 67167, + 67189, + 67180, + 67217, + 67237, + 67161, + 67231, + 67269, + 67216, + 67178, + 67181, + 67195, + 67173, + 67211, + 67169, + 67203, + 67203, + 67233, + 67209, + 67200, + 67202, + 67161, + 67176, + 67191, + 67196, + 67225, + 67225, + 67200, + 67168, + 67202, + 67195, + 67234, + 67204, + 67173, + 67189, + 67209, + 67194, + 67208, + 67198, + 67199, + 67185, + 67207, + 67206, + 67196, + 67192, + 67217, + 67263, + 67180, + 67172, + 67214, + 67207, + 67198, + 67179, + 67194, + 67197, + 67216, + 67211, + 67212, + 67202, + 67174, + 67219, + 67201, + 67192, + 67215, + 67182, + 67177, + 67182, + 67215, + 67165, + 67192, + 67178, + 67220, + 67245, + 67198, + 67191, + 67185, + 67169, + 67175, + 67192, + 67200, + 67180, + 67177, + 67175, + 67164, + 67209, + 67283, + 67193, + 67209, + 67195, + 67209, + 67200, + 67172, + 67193, + 67170, + 67195, + 67222, + 67202, + 67180, + 67222, + 67208, + 67219, + 67194, + 67203, + 67219, + 67218, + 67195, + 67211, + 67195, + 67207, + 67188, + 67192, + 67221, + 67172, + 67193, + 67215, + 67168, + 67177, + 67207, + 67176, + 67200, + 67195, + 67189, + 67194, + 67179, + 67187, + 67177, + 67185, + 67192, + 67278, + 67193, + 67195, + 67220, + 67207, + 67208, + 67214, + 67188, + 67201, + 67176, + 67210, + 67204, + 67184, + 67170, + 67171, + 67172, + 67197, + 67175, + 67181, + 67210, + 67205, + 67223, + 67207, + 67201, + 67178, + 67205, + 67193, + 67182, + 67191, + 67193, + 67155, + 67188, + 67194, + 67183, + 67205, + 67199, + 67177, + 67200, + 67172, + 67193, + 67172, + 67187, + 67180, + 67223, + 67212, + 67181, + 67194, + 67192, + 67191, + 67177, + 67224, + 67171, + 67210, + 67191, + 67177, + 67202, + 67259, + 67199, + 67208, + 67189, + 67183, + 67194, + 67185, + 67205, + 67210, + 67186, + 67200, + 67166, + 67195, + 67151, + 67200, + 67165, + 67182, + 67188, + 67214, + 67185, + 67174, + 67199, + 67175, + 67199, + 67163, + 67154, + 67211, + 67211, + 67198, + 67186, + 67194, + 67172, + 67195, + 67177, + 67185, + 67186, + 67218, + 67156, + 67200, + 67201, + 67175, + 67208, + 67202, + 67174, + 67207, + 67208, + 67191, + 67201, + 67199, + 67158, + 67197, + 67178, + 67193, + 67190, + 67166, + 67208, + 67278, + 67175, + 67209, + 67214, + 67198, + 67201, + 67184, + 67197, + 67165, + 67196, + 67189, + 67189, + 67193, + 67178, + 67182, + 67210, + 67174, + 67185, + 67201, + 67238, + 67206, + 67189, + 67169, + 67180, + 67197, + 67179, + 67219, + 67168, + 67197, + 67170, + 67203, + 67212, + 67238, + 67208, + 67179, + 67182, + 67196, + 67197, + 67156, + 67183, + 67203, + 67189, + 67171, + 67166, + 67210, + 67183, + 67189, + 67193, + 67177, + 67204, + 67209, + 67218, + 67229, + 67237, + 67191, + 67207, + 67237, + 67193, + 67172, + 67189, + 67179, + 67182, + 67184, + 67208, + 67195, + 67154, + 67202, + 67169, + 67201, + 67199, + 67174, + 67201, + 67212, + 67209, + 67186, + 67181, + 67196, + 67186, + 67225, + 67211, + 67212, + 67174, + 67192, + 67198, + 67175, + 67201, + 67206, + 67222, + 67180, + 67204, + 67217, + 67217, + 67186, + 67199, + 67164, + 67184, + 67199, + 67231, + 67177, + 67218, + 67193, + 67194, + 67211, + 67180, + 67194, + 67197, + 67167, + 67184, + 67204, + 67200, + 67204, + 67206, + 67210, + 67168, + 67199, + 67178, + 67221, + 67214, + 67185, + 67175, + 67162, + 67209, + 67206, + 67256, + 67227, + 67163, + 67188, + 67220, + 67235, + 67256, + 67201, + 67206, + 67208, + 67222, + 67232, + 67218, + 67214, + 67205, + 67234, + 67213, + 67236, + 67234, + 67199, + 67184, + 67176, + 67195, + 67189, + 67186, + 67213, + 67197, + 67198, + 67202, + 67237, + 67210, + 67161, + 67211, + 67193, + 67176, + 67217, + 67209, + 67200, + 67189, + 67176, + 67197, + 67167, + 67185, + 67207, + 67176, + 67203, + 67201, + 67188, + 67214, + 67210, + 67173, + 67195, + 67200, + 67198, + 67215, + 67203, + 67185, + 67197, + 67215, + 67207, + 67186, + 67174, + 67183, + 67183, + 67185, + 67228, + 67174, + 67213, + 67194, + 67225, + 67194, + 67206, + 67185, + 67232, + 67189, + 67191, + 67205, + 67214, + 67222, + 67221, + 67215, + 67214, + 67210, + 67178, + 67209, + 67189, + 67164, + 67201, + 67169, + 67210, + 67208, + 67191, + 67199, + 67189, + 67171, + 67198, + 67182, + 67183, + 67179, + 67202, + 67221, + 67178, + 67205, + 67181, + 67181, + 67168, + 67187, + 67196, + 67206, + 67188, + 67205, + 67207, + 67219, + 67216, + 67181, + 67211, + 67209, + 67175, + 67233, + 67198, + 67229, + 67208, + 67176, + 67220, + 67163, + 67217, + 67196, + 67208, + 67226, + 67193, + 67175, + 67212, + 67198, + 67166, + 67155, + 67184, + 67175, + 67209, + 67180, + 67181, + 67181, + 67206, + 67169, + 67183, + 67172, + 67192, + 67189, + 67196, + 67186, + 67209, + 67184, + 67172, + 67155, + 67211, + 67208, + 67181, + 67201, + 67189, + 67199, + 67189, + 67205, + 67207, + 67179, + 67185, + 67184, + 67208, + 67210, + 67168, + 67173, + 67194, + 67148, + 67190, + 67220, + 67206, + 67193, + 67173, + 67171, + 67204, + 67211, + 67210, + 67215, + 67175, + 67196, + 67179, + 67205, + 67201, + 67184, + 67176, + 67197, + 67187, + 67209, + 67189, + 67160, + 67183, + 67189, + 67200, + 67206, + 67190, + 67170, + 67174, + 67159, + 67191, + 67193, + 67203, + 67174, + 67158, + 67207, + 67182, + 67181, + 67182, + 67192, + 67219, + 67203, + 67170, + 67189, + 67191, + 67223, + 67187, + 67203, + 67202, + 67167, + 67169, + 67207, + 67146, + 67200, + 67211, + 67185, + 67180, + 67190, + 67202, + 67198, + 67199, + 67176, + 67213, + 67176, + 67192, + 67193, + 67205, + 67192, + 67193, + 67206, + 67191, + 67168, + 67198, + 67179, + 67208, + 67212, + 67182, + 67175, + 67198, + 67190, + 67175, + 67207, + 67198, + 67191, + 67169, + 67201, + 67179, + 67203, + 67165, + 67171, + 67209, + 67205, + 67203, + 67161, + 67163, + 67187, + 67182, + 67222, + 67179, + 67162, + 67185, + 67180, + 67170, + 67209, + 67177, + 67371, + 67186, + 67194, + 67222, + 67183, + 67185, + 67213, + 67181, + 67171, + 67228, + 67220, + 67214, + 67186, + 67204, + 67171, + 67178, + 67175, + 67227, + 67218, + 67183, + 67160, + 67193, + 67237, + 67199, + 67217, + 67206, + 67174, + 67199, + 67228, + 67160, + 67328, + 67205, + 67220, + 67208, + 67196, + 67196, + 67206, + 67187, + 67180, + 67184, + 67209, + 67188, + 67177, + 67206, + 67193, + 67340, + 67189, + 67277, + 67206, + 67180, + 67188, + 67197, + 67203, + 67207, + 67197, + 67198, + 67161, + 67199, + 67211, + 67189, + 67241, + 67177, + 67179, + 67197, + 67193, + 67195, + 67220, + 67200, + 67172, + 67210, + 67194, + 67180, + 67204, + 67222, + 67177, + 67186, + 67170, + 67214, + 67198, + 67196, + 67193, + 67194, + 67164, + 67204, + 67255, + 67213, + 67212, + 67272, + 67281, + 67218, + 67219, + 67207, + 67202, + 67189, + 67195, + 67198, + 67177, + 67222, + 67227, + 67247, + 67205, + 67180, + 67182, + 67201, + 67177, + 67168, + 67182, + 67204, + 67206, + 67208, + 67177, + 67218, + 67201, + 67189, + 67172, + 67197, + 67164, + 67210, + 67208, + 67228, + 67210, + 67194, + 67177, + 67206, + 67209, + 67212, + 67205, + 67198, + 67189, + 67198, + 67188, + 67177, + 67205, + 67205, + 67168, + 67172, + 67171, + 67175, + 67173, + 67200, + 67194, + 67186, + 67203, + 67167, + 67178, + 67224, + 67189, + 67172, + 67192, + 67207, + 67170, + 67174, + 67178, + 67177, + 67184, + 67223, + 67190, + 67194, + 67170, + 67170, + 67220, + 67208, + 67216, + 67228, + 67180, + 67202, + 67213, + 67206, + 67178, + 67176, + 67191, + 67184, + 67201, + 67175, + 67208, + 67181, + 67203, + 67226, + 67209, + 67217, + 67189, + 67182, + 67202, + 67170, + 67192, + 67207, + 67196, + 67165, + 67172, + 67172, + 67180, + 67211, + 67184, + 67172, + 67169, + 67231, + 67209, + 67183, + 67181, + 67193, + 67168, + 67219, + 67212, + 67216, + 67197, + 67220, + 67216, + 67179, + 67192, + 67195, + 67209, + 67192, + 67198, + 67210, + 67203, + 67174, + 67167, + 67181, + 67202, + 67181, + 67209, + 67172, + 67205, + 67200, + 67188, + 67195, + 67217, + 67182, + 67209, + 67150, + 67189, + 67203, + 67212, + 67169, + 67211, + 67181, + 67189, + 67195, + 67235, + 67212, + 67166, + 67205, + 67199, + 67176, + 67187, + 67202, + 67226, + 67173, + 67190, + 67206, + 67172, + 67199, + 67209, + 67201, + 67182, + 67207, + 67209, + 67193, + 67197, + 67151, + 67204, + 67175, + 67196, + 67182, + 67214, + 67154, + 67234, + 67228, + 67197, + 67198, + 67239, + 67203, + 67157, + 67171, + 67205, + 67191, + 67212, + 67184, + 67186, + 67193, + 67187, + 67178, + 67199, + 67166, + 67270, + 67200, + 67213, + 67175, + 67183, + 67195, + 67214, + 67205, + 67206, + 67216, + 67209, + 67162, + 67185, + 67178, + 67213, + 67198, + 67208, + 67166, + 67159, + 67197, + 67173, + 67177, + 67216, + 67190, + 67209, + 67222, + 67229, + 67203, + 67206, + 67175, + 67176, + 67193, + 67207, + 67180, + 67257, + 67224, + 67196, + 67213, + 67218, + 67193, + 67202, + 67205, + 67220, + 67233, + 67213, + 67201, + 67182, + 67182, + 67170, + 67194, + 67196, + 67212, + 67209, + 67191, + 67201, + 67216, + 67205, + 67177, + 67204, + 67190, + 67197, + 67189, + 67192, + 67181, + 67289, + 67191, + 67205, + 67188, + 67216, + 67201, + 67183, + 67163, + 67197, + 67208, + 67191, + 67210, + 67210, + 67187, + 67209, + 67211, + 67188, + 67208, + 67172, + 67159, + 67159, + 67173, + 67204, + 67175, + 67163, + 67201, + 67196, + 67207, + 67221, + 67189, + 67203, + 67219, + 67191, + 67162, + 67178, + 67206, + 67200, + 67177, + 67158, + 67228, + 67189, + 67197, + 67193, + 67219, + 67204, + 67203, + 67182, + 67209, + 67179, + 67210, + 67184, + 67184, + 67201, + 67178, + 67216, + 67175, + 67195, + 67168, + 67179, + 67208, + 67209, + 67190, + 67203, + 67232, + 67169, + 67176, + 67194, + 67228, + 67217, + 67178, + 67185, + 67196, + 67184, + 67202, + 67186, + 67162, + 67197, + 67199, + 67174, + 67180, + 67175, + 67185, + 67212, + 67200, + 67192, + 67190, + 67171, + 67186, + 67196, + 67216, + 67209, + 67210, + 67153, + 67226, + 67213, + 67216, + 67211, + 67225, + 67218, + 67224, + 67338, + 67239, + 67230, + 67212, + 67184, + 67191, + 67188, + 67232, + 67220, + 67187, + 67172, + 67183, + 67212, + 67213, + 67190, + 67221, + 67193, + 67224, + 67213, + 67210, + 67206, + 67201, + 67204, + 67199, + 67170, + 67199, + 67230, + 67198, + 67171, + 67207, + 67206, + 67218, + 67204, + 67226, + 67188, + 67187, + 67176, + 67183, + 67201, + 67197, + 67213, + 67188, + 67195, + 67181, + 67209, + 67197, + 67174, + 67175, + 67213, + 67218, + 67212, + 67189, + 67203, + 67195, + 67175, + 67166, + 67192, + 67202, + 67179, + 67196, + 67198, + 67320, + 67226, + 67171, + 67197, + 67195, + 67205, + 67228, + 67173, + 67197, + 67217, + 67203, + 67206, + 67200, + 67180, + 67192, + 67167, + 67169, + 67184, + 67189, + 67173, + 67196, + 67203, + 67186, + 67186, + 67173, + 67205, + 67191, + 67183, + 67229, + 67229, + 67227, + 67212, + 67184, + 67184, + 67186, + 67195, + 67178, + 67186, + 67217, + 67165, + 67199, + 67171, + 67176, + 67186, + 67180, + 67189, + 67177, + 67205, + 67186, + 67198, + 67183, + 67195, + 67181, + 67201, + 67200, + 67203, + 67317, + 67196, + 67177, + 67213, + 67181, + 67174, + 67169, + 67176, + 67175, + 67191, + 67204, + 67186, + 67189, + 67208, + 67187, + 67176, + 67168, + 67189, + 67212, + 67209, + 67214, + 67185, + 67186, + 67203, + 67166, + 67174, + 67214, + 67217, + 67203, + 67203, + 67225, + 67164, + 67188, + 67236, + 67184, + 67198, + 67183, + 67179, + 67188, + 67243, + 67217, + 67235, + 67191, + 67216, + 67214, + 67227, + 67189, + 67213, + 67213, + 67211, + 67170, + 67186, + 67215, + 67182, + 67193, + 67183, + 67188, + 67173, + 67199, + 67181, + 67175, + 67169, + 67197, + 67193, + 67175, + 67173, + 67203, + 67194, + 67206, + 67202, + 67182, + 67211, + 67181, + 67190, + 67198, + 67189, + 67192, + 67190, + 67214, + 67189, + 67175, + 67188, + 67186, + 67182, + 67231, + 67177, + 67178, + 67255, + 67207, + 67173, + 67232, + 67197, + 67226, + 67232, + 67198, + 67215, + 67184, + 67211, + 67174, + 67172, + 67209, + 67187, + 67168, + 67217, + 67172, + 67181, + 67180, + 67171, + 67200, + 67211, + 67194, + 67218, + 67178, + 67218, + 67215, + 67159, + 67195, + 67210, + 67192, + 67207, + 67209, + 67208, + 67210, + 67187, + 67206, + 67181, + 67181, + 67170, + 67190, + 67174, + 67219, + 67205, + 67187, + 67176, + 67204, + 67194, + 67187, + 67213, + 67188, + 67732, + 67197, + 67171, + 67173, + 67207, + 67202, + 67155, + 67218, + 67190, + 67199, + 67193, + 67168, + 67171, + 67191, + 67429, + 67217, + 67185, + 67190, + 67182, + 67177, + 67209, + 67190, + 67197, + 67192, + 67179, + 67211, + 67231, + 67217, + 67208, + 67204, + 67200, + 67217, + 67181, + 67213, + 67197, + 67189, + 67197, + 67184, + 67221, + 67234, + 67202, + 67168, + 67203, + 67235, + 67198, + 67176, + 67160, + 67167, + 67184, + 67175, + 67187, + 67201, + 67196, + 67195, + 67200, + 67241, + 67185, + 67188, + 67193, + 67166, + 67198, + 67194, + 67181, + 67185, + 67195, + 67189, + 67192, + 67173, + 67173, + 67206, + 67197, + 67205, + 67174, + 67184, + 67194, + 67203, + 67191, + 67183, + 67193, + 67174, + 67208, + 67179, + 67215, + 67174, + 67192, + 67202, + 67209, + 67199, + 67187, + 67170, + 67184, + 67177, + 67187, + 67206, + 67207, + 67220, + 67201, + 67215, + 67191, + 67212, + 67218, + 67225, + 67186, + 67189, + 67257, + 67217, + 67225, + 67226, + 67191, + 67251, + 67186, + 67180, + 67190, + 67206, + 67182, + 67215, + 67209, + 67191, + 67189, + 67175, + 67205, + 67180, + 67247, + 67241, + 67204, + 67192, + 67216, + 67268, + 67202, + 67191, + 67173, + 67190, + 67194, + 67190, + 67158, + 67210, + 67193, + 67229, + 67203, + 67208, + 67190, + 67165, + 67209, + 67171, + 67194, + 67201, + 67196, + 67183, + 67167, + 67200, + 67191, + 67208, + 67174, + 67173, + 67179, + 67194, + 67204, + 67195, + 67187, + 67181, + 67190, + 67245, + 67200, + 67200, + 67212, + 67276, + 67198, + 67176, + 67168, + 67198, + 67191, + 67212, + 67203, + 67205, + 67171, + 67185, + 67236, + 67209, + 67179, + 67224, + 67178, + 67230, + 67188, + 67172, + 67173, + 67188, + 67220, + 67197, + 67199, + 67195, + 67200, + 67182, + 67204, + 67219, + 67201, + 67185, + 67214, + 67200, + 67190, + 67211, + 67185, + 67207, + 67217, + 67201, + 67188, + 67181, + 67193, + 67185, + 67209, + 67188, + 67180, + 67169, + 67179, + 67176, + 67190, + 67207, + 67174, + 67232, + 67222, + 67206, + 67205, + 67216, + 67198, + 67207, + 67180, + 67194, + 67187, + 67186, + 67164, + 67213, + 67196, + 67181, + 67203, + 67217, + 67163, + 67179, + 67209, + 67191, + 67195, + 67157, + 67177, + 67193, + 67197, + 67204, + 67199, + 67179, + 67195, + 67194, + 67182, + 67235, + 67183, + 67213, + 67218, + 67197, + 67282, + 67221, + 67186, + 67202, + 67165, + 67188, + 67177, + 67175, + 67185, + 67174, + 67175, + 67199, + 67201, + 67176, + 67179, + 67210, + 67201, + 67203, + 67197, + 67194, + 67205, + 67185, + 67190, + 67728, + 67178, + 67187, + 67187, + 67216, + 67156, + 67224, + 67198, + 67167, + 67231, + 67172, + 67188, + 67176, + 67256, + 67203, + 67194, + 67233, + 67187, + 67213, + 67194, + 67201, + 67161, + 67193, + 67193, + 67207, + 67207, + 67182, + 67245, + 67176, + 67198, + 67209, + 67182, + 67190, + 67173, + 67193, + 67174, + 67187, + 67180, + 67209, + 67212, + 67187, + 67168, + 67223, + 67202, + 67205, + 67230, + 67188, + 67213, + 67190, + 67217, + 67213, + 67237, + 67228, + 67202, + 67187, + 67245, + 67206, + 67221, + 67209, + 67193, + 67188, + 67204, + 67222, + 67197, + 67176, + 67209, + 67182, + 67229, + 67160, + 67191, + 67205, + 67203, + 67217, + 67218, + 67211, + 67212, + 67193, + 67185, + 67188, + 67222, + 67215, + 67179, + 67176, + 67228, + 67171, + 67193, + 67182, + 67206, + 67207, + 67175, + 67222, + 67231, + 67215, + 67207, + 67168, + 67191, + 67241, + 67210, + 67219, + 67185, + 67183, + 67177, + 67219, + 67206, + 67179, + 67189, + 67192, + 67184, + 67202, + 67214, + 67206, + 67220, + 67171, + 67179, + 67178, + 67183, + 67212, + 67198, + 67174, + 67191, + 67184, + 67229, + 67187, + 67170, + 67181, + 67203, + 67210, + 67219, + 67179, + 67177, + 67209, + 67196, + 67243, + 67174, + 67178, + 67181, + 67209, + 67174, + 67267, + 67221, + 67203, + 67209, + 67168, + 67198, + 67213, + 67186, + 67160, + 67175, + 67208, + 67211, + 67206, + 67184, + 67185, + 67184, + 67172, + 67177, + 67167, + 67216, + 67205, + 67207, + 67182, + 67212, + 67210, + 67209, + 67189, + 67207, + 67252, + 67181, + 67207, + 67196, + 67209, + 67186, + 67208, + 67193, + 67186, + 67205, + 67177, + 67202, + 67203, + 67185, + 67226, + 67211, + 67187, + 67220, + 67204, + 67225, + 67205, + 67275, + 67230, + 67224, + 67225, + 67176, + 67175, + 67213, + 67173, + 67207, + 67219, + 67189, + 67227, + 67215, + 67188, + 67170, + 67173, + 67178, + 67184, + 67172, + 67180, + 67202, + 67205, + 67206, + 67227, + 67204, + 67194, + 67211, + 67172, + 67189, + 67221, + 67192, + 67221, + 67209, + 67200, + 67199, + 67227, + 67178, + 67196, + 67181, + 67212, + 67171, + 67199, + 67176, + 67188, + 67186, + 67184, + 67197, + 67172, + 67210, + 67179, + 67215, + 67216, + 67174, + 67213, + 67179, + 67165, + 67182, + 67208, + 67241, + 67220, + 67208, + 67206, + 67200, + 67185, + 67163, + 67191, + 67193, + 67210, + 67202, + 67169, + 67205, + 67172, + 67175, + 67210, + 67173, + 67206, + 67176, + 79943, + 67197, + 67186, + 67206, + 67168, + 67167, + 67195, + 67211, + 67184, + 67171, + 67177, + 67201, + 67222, + 67178, + 67199, + 67184, + 67224, + 67202, + 67231, + 67193, + 67175, + 67226, + 67209, + 67160, + 67188, + 67205, + 67174, + 67196, + 67172, + 67189, + 67206, + 67217, + 67208, + 67174, + 67206, + 67196, + 67202, + 67195, + 67209, + 67193, + 67187, + 67176, + 67208, + 67206, + 67202, + 67220, + 67212, + 67172, + 67206, + 67213, + 67214, + 67188, + 67175, + 67174, + 67205, + 67202, + 67168, + 67190, + 67190, + 67201, + 67205, + 67214, + 67212, + 67180, + 67199, + 67189, + 67201, + 67204, + 67189, + 67235, + 67153, + 67242, + 67183, + 67199, + 67202, + 67195, + 67184, + 67171, + 67193, + 67203, + 67194, + 67191, + 67215, + 67175, + 67195, + 67233, + 67211, + 67185, + 67201, + 67190, + 67177, + 67187, + 67198, + 67170, + 67170, + 67284, + 67160, + 67191, + 67178, + 67178, + 67190, + 67163, + 67195, + 67191, + 67193, + 67218, + 67186, + 67261, + 67190, + 67225, + 67220, + 67176, + 67182, + 67211, + 67179, + 67217, + 67218, + 67213, + 67230, + 67203, + 67210, + 67216, + 67202, + 67188, + 67258, + 67237, + 67195, + 67209, + 67215, + 67174, + 67181, + 67156, + 67254, + 67202, + 67211, + 67221, + 67266, + 67217, + 67218, + 67254, + 67229, + 67207, + 67214, + 67195, + 67190, + 67245, + 67200, + 67167, + 67173, + 67170, + 67169, + 67242, + 67204, + 67185, + 67207, + 67188, + 67174, + 67172, + 67207, + 67223, + 67185, + 67194, + 67224, + 67193, + 67197, + 67218, + 67215, + 67193, + 67181, + 67184, + 67170, + 67200, + 67193, + 67203, + 67213, + 67192, + 67213, + 67203, + 67186, + 67213, + 67193, + 67200, + 67177, + 67179, + 67197, + 67180, + 67189, + 67201, + 67180, + 67194, + 67185, + 67206, + 67203, + 67208, + 67195, + 67183, + 67167, + 67165, + 67176, + 67197, + 67168, + 67199, + 67210, + 67209, + 67186, + 67189, + 67196, + 67174, + 67189, + 67176, + 67167, + 67166, + 67213, + 67203, + 67184, + 67158, + 67188, + 67172, + 67186, + 67191, + 67216, + 67171, + 67234, + 67206, + 67181, + 67210, + 67218, + 67222, + 67198, + 67188, + 67191, + 67186, + 67207, + 67168, + 67193, + 67190, + 67213, + 67191, + 67246, + 67260, + 67188, + 67216, + 67187, + 67193, + 67207, + 67200, + 67219, + 67206, + 67173, + 67205, + 67202, + 67216, + 67209, + 67198, + 67206, + 67227, + 67160, + 67195, + 67187, + 67197, + 67204, + 67169, + 67231, + 67198, + 67204, + 67218, + 67197, + 67227, + 67206, + 67172, + 67182, + 67188, + 67186, + 67185, + 67213, + 67179, + 67208, + 67205, + 67171, + 67286, + 67245, + 67240, + 67189, + 67294, + 67241, + 67217, + 67219, + 67182, + 67170, + 67259, + 67205, + 67210, + 67187, + 67187, + 67201, + 67215, + 67181, + 67210, + 67214, + 67175, + 67168, + 67159, + 67194, + 67212, + 67175, + 67170, + 67201, + 67214, + 67206, + 67219, + 67266, + 67175, + 67204, + 67206, + 67178, + 67168, + 67181, + 67199, + 67177, + 67181, + 67185, + 67198, + 67178, + 67190, + 67162, + 67169, + 67207, + 67190, + 67198, + 67213, + 67203, + 67210, + 67199, + 67198, + 67201, + 67197, + 67168, + 67188, + 67211, + 67181, + 67204, + 67181, + 67194, + 67201, + 67180, + 67178, + 67175, + 67160, + 67200, + 67205, + 67162, + 67183, + 67212, + 67186, + 67159, + 67195, + 67190, + 67182, + 67172, + 67181, + 67214, + 67184, + 67185, + 67186, + 67169, + 67172, + 67206, + 67193, + 67199, + 67212, + 67167, + 67180, + 67204, + 67211, + 67180, + 67212, + 67178, + 67201, + 67210, + 67178, + 67176, + 67183, + 67200, + 67204, + 67194, + 67173, + 67200, + 67197, + 67192, + 67201, + 67196, + 67227, + 67212, + 67200, + 67164, + 67188, + 67184, + 67203, + 67178, + 67195, + 67199, + 67177, + 67250, + 67183, + 67211, + 67202, + 67218, + 67175, + 67188, + 67191, + 67199, + 67165, + 67172, + 67218, + 67183, + 67243, + 67201, + 67186, + 67185, + 67177, + 67210, + 67184, + 67200, + 67172, + 67178, + 67210, + 67212, + 67182, + 67254, + 67192, + 67216, + 67179, + 67206, + 67197, + 67214, + 67179, + 67174, + 67190, + 67201, + 67210, + 67179, + 67169, + 67190, + 67205, + 67165, + 67209, + 67182, + 67210, + 67172, + 67181, + 67184, + 67206, + 67189, + 67201, + 67169, + 67211, + 67215, + 67206, + 67212, + 67217, + 67217, + 67170, + 67214, + 67197, + 67173, + 67171, + 67196, + 67193, + 67169, + 67186, + 67199, + 67193, + 67163, + 67208, + 67183, + 67204, + 67212, + 67199, + 67185, + 67180, + 67180, + 67209, + 67214, + 67174, + 67216, + 67179, + 67207, + 67183, + 67235, + 67203, + 67193, + 67160, + 67167, + 67214, + 67174, + 67183, + 67210, + 67189, + 67178, + 67251, + 67218, + 67209, + 67177, + 67210, + 67175, + 67193, + 67192, + 67192, + 67197, + 67162, + 67162, + 67160, + 67344, + 67211, + 67212, + 67204, + 67201, + 67158, + 67205, + 67188, + 67211, + 67201, + 67191, + 67209, + 67173, + 67202, + 67162, + 67195, + 67199, + 67201, + 67203, + 67203, + 67166, + 67159, + 67216, + 67183, + 67175, + 67212, + 67196, + 67183, + 67237, + 67225, + 67229, + 67234, + 67208, + 67169, + 67178, + 67176, + 67202, + 67189, + 67198, + 67168, + 67189, + 67222, + 67176, + 67200, + 67182, + 67180, + 67201, + 67175, + 67190, + 67170, + 67209, + 67173, + 67194, + 67182, + 67177, + 67618, + 67165, + 67171, + 67185, + 67199, + 67169, + 67204, + 67190, + 67200, + 67204, + 67210, + 67176, + 67161, + 67214, + 67185, + 67188, + 67218, + 67210, + 67199, + 67150, + 67186, + 67193, + 67185, + 67195, + 67205, + 67160, + 67157, + 67166, + 67235, + 67188, + 67180, + 67204, + 67201, + 67197, + 67205, + 67184, + 67214, + 67163, + 67196, + 67209, + 67205, + 67201, + 67182, + 67165, + 67179, + 67191, + 67201, + 67203, + 67183, + 67175, + 67193, + 67210, + 67192, + 67187, + 67199, + 67184, + 67299, + 67224, + 67191, + 67197, + 67171, + 67172, + 67163, + 67171, + 67185, + 67176, + 67248, + 67197, + 67164, + 67208, + 67174, + 67202, + 67242, + 67345, + 67228, + 67189, + 67188, + 67188, + 67246, + 67209, + 67195, + 67205, + 67167, + 67206, + 67232, + 67219, + 67209, + 67258, + 67173, + 67202, + 67170, + 67212, + 67205, + 67163, + 67205, + 67206, + 67217, + 67199, + 67220, + 67186, + 67184, + 67179, + 67276, + 67198, + 67167, + 67193, + 67229, + 67189, + 67167, + 67190, + 67213, + 67183, + 67211, + 67198, + 67208, + 67196, + 67190, + 67174, + 67210, + 67212, + 67254, + 67187, + 67209, + 67200, + 67212, + 67188, + 67218, + 67185, + 67179, + 67189, + 67217, + 67214, + 67220, + 67212, + 67193, + 67200, + 67198, + 67191, + 67187, + 67167, + 67177, + 67208, + 67176, + 67202, + 67211, + 67185, + 67201, + 67180, + 67189, + 67206, + 67188, + 67221, + 67175, + 67201, + 67192, + 67193, + 67162, + 67204, + 67205, + 67180, + 67181, + 67197, + 67182, + 67199, + 67197, + 67180, + 67190, + 67204, + 67197, + 67208, + 67185, + 67188, + 67210, + 67166, + 67177, + 67230, + 67183, + 67168, + 67178, + 67180, + 67206, + 67181, + 67171, + 67176, + 67218, + 67220, + 67175, + 67228, + 67159, + 67175, + 67177, + 67166, + 67203, + 67210, + 67205, + 67182, + 67214, + 67179, + 67182, + 67213, + 67185, + 67187, + 67223, + 67206, + 67184, + 67162, + 67199, + 67214, + 67172, + 67199, + 67209, + 67202, + 67168, + 67198, + 67162, + 67167, + 67163, + 67224, + 67180, + 67202, + 67198, + 67197, + 67196, + 67212, + 67182, + 67215, + 67178, + 67216, + 67190, + 67214, + 67210, + 67188, + 67185, + 67210, + 67201, + 67200, + 67199, + 67167, + 67166, + 67210, + 67179, + 67165, + 67164, + 67215, + 67228, + 67169, + 67213, + 67175, + 67164, + 67173, + 67199, + 67209, + 67232, + 67189, + 67174, + 67191, + 67195, + 67189, + 67202, + 67162, + 67166, + 67171, + 67173, + 67206, + 67193, + 67191, + 67204, + 67192, + 67220, + 67188, + 67208, + 67194, + 67208, + 67198, + 67201, + 67217, + 67188, + 67206, + 67163, + 67177, + 67177, + 67184, + 67190, + 67215, + 67195, + 67196, + 67182, + 67201, + 67198, + 67191, + 67159, + 67188, + 67191, + 67172, + 67208, + 67175, + 67208, + 67188, + 67231, + 67204, + 67166, + 67175, + 67210, + 67200, + 67190, + 67226, + 67217, + 67170, + 67231, + 67204, + 67184, + 67168, + 67212, + 67200, + 67189, + 67161, + 67206, + 67191, + 67207, + 67205, + 67187, + 67167, + 67196, + 67175, + 67190, + 67170, + 67198, + 67177, + 67162, + 67208, + 67175, + 67201, + 67185, + 67208, + 67191, + 67196, + 67183, + 67166, + 67155, + 67195, + 67176, + 67173, + 67180, + 67183, + 67165, + 67195, + 67193, + 67201, + 67185, + 67196, + 67202, + 67207, + 67200, + 67179, + 67154, + 67178, + 67201, + 67226, + 67203, + 67195, + 67214, + 67227, + 67208, + 67204, + 67224, + 67187, + 67169, + 67172, + 67183, + 67183, + 67201, + 67179, + 67211, + 67163, + 67150, + 67162, + 67202, + 67210, + 67211, + 67186, + 67202, + 67215, + 67200, + 67264, + 67214, + 67182, + 67164, + 67177, + 67180, + 67226, + 67215, + 67210, + 67197, + 67169, + 67206, + 67175, + 67193, + 67182, + 67222, + 67183, + 67192, + 67207, + 67183, + 67181, + 67165, + 67179, + 67195, + 67175, + 67206, + 67211, + 67188, + 67209, + 67197, + 67209, + 67217, + 67219, + 67181, + 67206, + 67176, + 67193, + 67220, + 67224, + 67178, + 67183, + 67255, + 67200, + 67199, + 67170, + 67212, + 67214, + 67196, + 67186, + 67181, + 67222, + 67175, + 67204, + 67217, + 67220, + 67208, + 67195, + 67163, + 67192, + 67186, + 67196, + 67191, + 67211, + 67157, + 67207, + 67206, + 67212, + 67201, + 67180, + 67161, + 67208, + 67192, + 67211, + 67203, + 67161, + 67201, + 67160, + 67210, + 67191, + 67204, + 67183, + 67203, + 67179, + 67200, + 67221, + 67180, + 67201, + 67174, + 67202, + 67178, + 67188, + 67189, + 67188, + 67155, + 67165, + 67181, + 67195, + 67184, + 67194, + 67203, + 67182, + 67208, + 67195, + 67202, + 67173, + 67195, + 67206, + 67200, + 67204, + 67214, + 67195, + 67222, + 67180, + 67201, + 67208, + 67204, + 67184, + 67205, + 67197, + 67210, + 67191, + 67192, + 67175, + 67180, + 67174, + 67215, + 67191, + 67208, + 67169, + 67178, + 67215, + 67178, + 67261, + 67197, + 67177, + 67178, + 67215, + 67196, + 67179, + 67209, + 67204, + 67184, + 67183, + 67227, + 67204, + 67182, + 67178, + 67224, + 67209, + 67179, + 67177, + 67204, + 67187, + 67198, + 67182, + 67188, + 67189, + 67184, + 67220, + 67207, + 67183, + 67198, + 67194, + 67206, + 67184, + 67214, + 67189, + 67165, + 67196, + 67198, + 67178, + 67213, + 67167, + 67210, + 67194, + 67217, + 67166, + 67199, + 67183, + 67199, + 67206, + 67221, + 67230, + 67175, + 67222, + 67192, + 67212, + 67212, + 67189, + 67190, + 67189, + 67191, + 67172, + 67181, + 67169, + 67200, + 67167, + 67221, + 67178, + 67205, + 67187, + 67206, + 67172, + 67209, + 67206, + 67168, + 67209, + 67183, + 67210, + 67201, + 67174, + 67217, + 67191, + 67189, + 67193, + 67205, + 67195, + 67200, + 67203, + 67158, + 67195, + 67195, + 67189, + 67262, + 67198, + 67191, + 67181, + 67214, + 67184, + 67201, + 67188, + 67179, + 67202, + 67192, + 67201, + 67191, + 67189, + 67197, + 67189, + 67193, + 67179, + 67170, + 67199, + 67182, + 67191, + 67172, + 67204, + 67201, + 67185, + 67188, + 67176, + 67197, + 67187, + 67193, + 67214, + 67175, + 67206, + 67192, + 67203, + 67210, + 67168, + 67165, + 67218, + 67200, + 67179, + 67177, + 67175, + 67195, + 67205, + 67203, + 67200, + 67169, + 67195, + 67189, + 67202, + 67203, + 67182, + 67203, + 67197, + 67222, + 67171, + 67192, + 67220, + 67185, + 67214, + 67186, + 67189, + 67197, + 67198, + 67206, + 67169, + 67197, + 67207, + 67184, + 67178, + 67212, + 67205, + 67157, + 67201, + 67211, + 67198, + 67180, + 67178, + 67166, + 67195, + 67184, + 67164, + 67212, + 67257, + 67198, + 67179, + 67230, + 67213, + 67175, + 67182, + 67163, + 67192, + 67176, + 67190, + 67177, + 67196, + 67202, + 67208, + 67213, + 67188, + 67202, + 67208, + 67191, + 67199, + 67180, + 67171, + 67207, + 67172, + 67176, + 67208, + 67204, + 67173, + 67194, + 67212, + 67341, + 67202, + 67186, + 67171, + 67216, + 67212, + 67146, + 67171, + 67186, + 67201, + 67184, + 67164, + 67169, + 67185, + 67208, + 67180, + 67190, + 67197, + 67159, + 67209, + 67186, + 67179, + 67172, + 67204, + 67178, + 67197, + 67199, + 67173, + 67183, + 67244, + 67169, + 67188, + 67222, + 67195, + 67175, + 67220, + 67191, + 67177, + 67212, + 67247, + 67198, + 67208, + 67156, + 67204, + 67211, + 67199, + 67189, + 67191, + 67191, + 67234, + 67221, + 67165, + 67201, + 67186, + 67162, + 67241, + 67188, + 67165, + 67209, + 67198, + 67172, + 67180, + 67177, + 67166, + 67196, + 67168, + 67246, + 67203, + 67163, + 67181, + 67186, + 67228, + 67181, + 67203, + 67227, + 67221, + 67217, + 67201, + 67196, + 67194, + 67208, + 67203, + 67231, + 67200, + 67209, + 67190, + 67200, + 67173, + 67182, + 67191, + 67161, + 67182, + 67169, + 67211, + 67166, + 67202, + 67182, + 67202, + 67178, + 67194, + 67161, + 67159, + 67186, + 67171, + 67225, + 67211, + 67175, + 67209, + 67176, + 67223, + 67248, + 67276, + 67212, + 67190, + 67190, + 67177, + 67169, + 67200, + 67177, + 67175, + 67211, + 67172, + 67200, + 67198, + 67197, + 67187, + 67202, + 67192, + 67169, + 67208, + 67185, + 67263, + 67195, + 67206, + 67178, + 67185, + 67172, + 67213, + 67164, + 67192, + 67202, + 67202, + 67200, + 67191, + 67187, + 67208, + 67199, + 67206, + 67173, + 67173, + 67194, + 67163, + 67193, + 67198, + 67189, + 67204, + 67192, + 67196, + 67206, + 67216, + 67198, + 67201, + 67200, + 67159, + 67173, + 67174, + 67201, + 67219, + 67207, + 67176, + 67215, + 67221, + 67190, + 67200, + 67200, + 67174, + 67198, + 67190, + 67214, + 67169, + 67167, + 67203, + 67216, + 67173, + 67199, + 67190, + 67195, + 67203, + 67204, + 67223, + 67171, + 67188, + 67171, + 67189, + 67204, + 67181, + 67199, + 67179, + 67175, + 67181, + 67197, + 67204, + 67183, + 67169, + 67204, + 67156, + 67167, + 67192, + 67199, + 67204, + 67212, + 67215, + 67198, + 67213, + 67215, + 67210, + 67158, + 67209, + 67199, + 67170, + 67191, + 67204, + 67204, + 67196, + 67185, + 67188, + 67180, + 67217, + 67175, + 67206, + 67183, + 67208, + 67200, + 67194, + 67198, + 67216, + 67215, + 67185, + 67201, + 67181, + 67213, + 67199, + 67202, + 67177, + 67167, + 67186, + 67188, + 67182, + 67196, + 67230, + 67206, + 67219, + 67193, + 67188, + 67201, + 67206, + 67183, + 67188, + 67205, + 67176, + 67190, + 67176, + 67188, + 67175, + 67199, + 67178, + 67212, + 67174, + 67185, + 67179, + 67224, + 67216, + 67182, + 67200, + 67197, + 67170, + 67193, + 67171, + 67247, + 67302, + 67184, + 67175, + 67183, + 67200, + 67191, + 67164, + 67200, + 67187, + 67182, + 67175, + 67208, + 67192, + 67175, + 67166, + 67183, + 67206, + 67181, + 67165, + 67164, + 67163, + 67181, + 67230, + 67175, + 67175, + 67199, + 67237, + 67211, + 67189, + 67203, + 67181, + 67214, + 67210, + 67166, + 67228, + 67207, + 67178, + 67200, + 67180, + 67212, + 67193, + 67219, + 67172, + 67169, + 67193, + 67208, + 67237, + 67215, + 67185, + 67212, + 67173, + 67174, + 67183, + 67186, + 67208, + 67209, + 67193, + 67180, + 67207, + 67186, + 67208, + 67167, + 67219, + 67197, + 67174, + 67171, + 67177, + 67204, + 67168, + 67170, + 67203, + 67213, + 67188, + 67198, + 67167, + 67161, + 67211, + 67208, + 67204, + 67200, + 67201, + 67171, + 67232, + 67195, + 67205, + 67184, + 67165, + 67186, + 67209, + 67199, + 67451, + 67175, + 67176, + 67199, + 67217, + 67180, + 67203, + 67224, + 67198, + 67175, + 67229, + 67216, + 67179, + 67204, + 67203, + 67198, + 67171, + 67172, + 67199, + 67267, + 67214, + 67209, + 67184, + 67199, + 67211, + 67155, + 67185, + 67201, + 67205, + 67204, + 67209, + 67196, + 67187, + 67210, + 67167, + 67188, + 67203, + 67183, + 67191, + 67168, + 67187, + 67200, + 67206, + 67188, + 67169, + 67166, + 67199, + 67227, + 67204, + 67189, + 67180, + 67199, + 67207, + 67205, + 67178, + 67217, + 67204, + 67170, + 67202, + 67192, + 67205, + 67181, + 67223, + 67182, + 67188, + 67208, + 67235, + 67201, + 67179, + 67179, + 67178, + 67173, + 67195, + 67174, + 67220, + 67174, + 67203, + 67224, + 67178, + 67187, + 67216, + 67186, + 67176, + 67185, + 67182, + 67169, + 67182, + 67186, + 67205, + 67177, + 67223, + 67180, + 67177, + 67180, + 67167, + 67225, + 67189, + 67197, + 67219, + 67177, + 67211, + 67189, + 67209, + 67187, + 67200, + 67194, + 67176, + 67191, + 67205, + 67209, + 67215, + 67198, + 67209, + 67200, + 67159, + 67188, + 67177, + 67165, + 67175, + 67214, + 67190, + 67170, + 67179, + 67172, + 67177, + 67225, + 67208, + 67174, + 67195, + 67181, + 67217, + 67250, + 67179, + 67216, + 67209, + 67171, + 67227, + 67184, + 67214, + 67172, + 67247, + 67182, + 67172, + 67204, + 67210, + 67179, + 67226, + 67178, + 67194, + 67209, + 67229, + 67194, + 67217, + 67176, + 67210, + 67158, + 67189, + 67171, + 67172, + 67177, + 67208, + 67184, + 67192, + 67199, + 67208, + 67203, + 67180, + 67199, + 67188, + 67189, + 67162, + 67189, + 67195, + 67181, + 67221, + 67211, + 67197, + 67168, + 67194, + 67203, + 67203, + 67198, + 67201, + 67196, + 67208, + 67271, + 67197, + 67184, + 67183, + 67186, + 67185, + 67211, + 67189, + 67207, + 67203, + 67201, + 67204, + 67216, + 67201, + 67167, + 67193, + 67202, + 67153, + 67212, + 67202, + 67177, + 67169, + 67172, + 67179, + 67494, + 67208, + 67200, + 67219, + 67203, + 67197, + 67193, + 67230, + 67203, + 67212, + 67169, + 67197, + 67175, + 67218, + 67176, + 67161, + 67181, + 67202, + 67208, + 67180, + 67214, + 67182, + 67174, + 67185, + 67188, + 67200, + 67187, + 67191, + 67193, + 67200, + 67223, + 67188, + 67198, + 67172, + 67173, + 67201, + 67212, + 67192, + 67185, + 67159, + 67197, + 67222, + 67204, + 67207, + 67205, + 67187, + 67170, + 67188, + 67205, + 67178, + 67213, + 67166, + 67184, + 67188, + 67164, + 67201, + 67177, + 67214, + 67236, + 67177, + 67210, + 67177, + 67220, + 67191, + 67207, + 67174, + 67202, + 67211, + 67224, + 67166, + 67173, + 67164, + 67193, + 67198, + 67183, + 67194, + 67165, + 67200, + 67181, + 67204, + 67157, + 67176, + 67166, + 67186, + 67206, + 67191, + 67192, + 67179, + 67178, + 67184, + 67170, + 67199, + 67194, + 67173, + 67200, + 67194, + 67172, + 67180, + 67203, + 67166, + 67167, + 67225, + 67214, + 67191, + 67176, + 67170, + 67195, + 67199, + 67162, + 67178, + 67206, + 67167, + 67157, + 67263, + 67189, + 67179, + 67221, + 67183, + 67195, + 67225, + 67195, + 67192, + 67221, + 67176, + 67164, + 67178, + 67197, + 67192, + 67218, + 67191, + 67186, + 67208, + 67186, + 67208, + 67200, + 67202, + 67200, + 67209, + 67169, + 67188, + 67205, + 67185, + 67195, + 67205, + 67174, + 67184, + 67185, + 67185, + 67192, + 67196, + 67186, + 67200, + 67203, + 67198, + 67189, + 67213, + 67192, + 67199, + 67202, + 67184, + 67203, + 67201, + 67166, + 67192, + 67194, + 67217, + 67188, + 67194, + 67162, + 67239, + 67176, + 67184, + 67168, + 67213, + 67236, + 67206, + 67167, + 67195, + 67167, + 67157, + 67171, + 67155, + 67199, + 67179, + 67163, + 67149, + 67213, + 67176, + 67155, + 67198, + 67213, + 67216, + 67173, + 67164, + 67188, + 67179, + 67246, + 67265, + 67224, + 67181, + 67194, + 67203, + 67204, + 67198, + 67168, + 67165, + 67182, + 67187, + 67196, + 67195, + 67187, + 67185, + 67239, + 67201, + 67231, + 67199, + 67237, + 67244, + 67185, + 67214, + 67206, + 67215, + 67188, + 67217, + 67201, + 67234, + 67201, + 67197, + 67173, + 67193, + 67174, + 67196, + 67161, + 67200, + 67202, + 67203, + 67165, + 67179, + 67176, + 67213, + 67185, + 67208, + 67169, + 67180, + 67194, + 67206, + 67213, + 67197, + 67213, + 67212, + 67188, + 67174, + 67172, + 67179, + 67177, + 67180, + 67174, + 67192, + 67176, + 67165, + 67176, + 67246, + 67190, + 67173, + 67195, + 67184, + 67214, + 67210, + 67167, + 67214, + 67213, + 67207, + 67172, + 67172, + 67160, + 67187, + 67200, + 67200, + 67188, + 67247, + 67198, + 67212, + 67172, + 67244, + 67170, + 67200, + 67195, + 67175, + 67176, + 67181, + 67166, + 67201, + 67168, + 67178, + 67189, + 67191, + 67214, + 67211, + 67212, + 67187, + 67192, + 67175, + 67166, + 67215, + 67173, + 67187, + 67215, + 67173, + 67208, + 67201, + 67211, + 67194, + 67207, + 67200, + 67186, + 67214, + 67237, + 67197, + 67217, + 67208, + 67209, + 67233, + 67186, + 67198, + 67200, + 67200, + 67204, + 67219, + 67197, + 67202, + 67217, + 67180, + 67195, + 67199, + 67207, + 67219, + 67176, + 67181, + 67189, + 67206, + 67192, + 67223, + 67209, + 67207, + 67202, + 67190, + 67198, + 67180, + 67220, + 67197, + 67189, + 67200, + 67179, + 67201, + 67201, + 67203, + 67220, + 67202, + 67156, + 67317, + 67214, + 67184, + 67194, + 67206, + 67209, + 67180, + 67181, + 67178, + 67213, + 67191, + 67214, + 67219, + 67231, + 67211, + 67191, + 67185, + 67220, + 67192, + 67184, + 67185, + 67213, + 67208, + 67207, + 67201, + 67203, + 67203, + 67210, + 67217, + 67209, + 67192, + 67201, + 67182, + 67211, + 67193, + 67182, + 67208, + 67219, + 67212, + 67189, + 67175, + 67190, + 67167, + 67212, + 67170, + 67213, + 67204, + 67209, + 67212, + 67182, + 67219, + 67168, + 67203, + 67195, + 67211, + 67175, + 67221, + 67202, + 67194, + 67188, + 67200, + 67166, + 67201, + 67206, + 67206, + 67165, + 67169, + 67206, + 67192, + 67172, + 67204, + 67169, + 67176, + 67179, + 67206, + 67197, + 67187, + 67201, + 67186, + 67170, + 67195, + 67214, + 67161, + 67199, + 67171, + 67168, + 67181, + 67265, + 67198, + 67245, + 67217, + 67188, + 67197, + 67180, + 67189, + 67201, + 67184, + 67209, + 67173, + 67168, + 67191, + 67211, + 67190, + 67193, + 67173, + 67196, + 67194, + 67200, + 67206, + 67198, + 67181, + 67215, + 67164, + 67197, + 67199, + 67209, + 67207, + 67187, + 67186, + 67207, + 67194, + 67208, + 67183, + 67213, + 67202, + 67207, + 67199, + 67208, + 67211, + 67212, + 67182, + 67213, + 67163, + 67215, + 67184, + 67185, + 67177, + 67178, + 67160, + 67178, + 67195, + 67222, + 67180, + 67195, + 67208, + 67202, + 67254, + 67227, + 67210, + 67217, + 67190, + 67224, + 67203, + 67207, + 67175, + 67194, + 67191, + 67223, + 67188, + 67228, + 67208, + 67174, + 67213, + 67201, + 67186, + 67192, + 67198, + 67177, + 67224, + 67189, + 67230, + 67229, + 67237, + 67168, + 67182, + 67204, + 67175, + 67184, + 67206, + 67212, + 67232, + 67215, + 67186, + 67202, + 67170, + 67208, + 67205, + 67212, + 67201, + 67171, + 67178, + 67159, + 67222, + 67212, + 67197, + 67215, + 67203, + 67210, + 67197, + 67231, + 67206, + 67167, + 67202, + 67185, + 67196, + 67214, + 67189, + 67208, + 67185, + 67215, + 67283, + 67235, + 67173, + 67210, + 67272, + 67259, + 67208, + 67191, + 67203, + 67185, + 67202, + 67193, + 67271, + 67225, + 67225, + 67246, + 67203, + 67193, + 67191, + 67212, + 67194, + 67295, + 67213, + 67204, + 67203, + 67176, + 67213, + 67198, + 67198, + 67228, + 67211, + 67204, + 67174, + 67202, + 67193, + 67206, + 67229, + 67204, + 67200, + 67207, + 67218, + 67193, + 67226, + 67593, + 67189, + 67176, + 67171, + 67163, + 67222, + 67172, + 67185, + 67260, + 67206, + 67171, + 67169, + 67189, + 67176, + 67211, + 67203, + 67214, + 67188, + 67211, + 67180, + 67216, + 67176, + 67205, + 67201, + 67198, + 67219, + 67180, + 67176, + 67211, + 67181, + 67190, + 67209, + 67168, + 67200, + 67196, + 67194, + 67200, + 67196, + 67201, + 67168, + 67205, + 67189, + 67210, + 67184, + 67216, + 67173, + 67212, + 67179, + 67221, + 67206, + 67201, + 67213, + 67181, + 67170, + 67205, + 67205, + 67250, + 67180, + 67193, + 67165, + 67201, + 67179, + 67189, + 67163, + 67176, + 67188, + 67196, + 67154, + 67180, + 67204, + 67192, + 67172, + 67206, + 67206, + 67192, + 67174, + 67201, + 67198, + 67183, + 67215, + 67150, + 67190, + 67184, + 67177, + 67330, + 67232, + 67177, + 67188, + 67197, + 67192, + 67191, + 67193, + 67204, + 67226, + 67179, + 67207, + 67248, + 67175, + 67207, + 67161, + 67160, + 67174, + 67188, + 67213, + 67193, + 67173, + 67173, + 67205, + 67173, + 67182, + 67189, + 67188, + 67209, + 67200, + 67197, + 67206, + 67186, + 67187, + 67171, + 67186, + 67211, + 67208, + 67190, + 67177, + 67170, + 67201, + 67179, + 67197, + 67219, + 67181, + 67165, + 67201, + 67172, + 67190, + 67179, + 67203, + 67185, + 67211, + 67205, + 67222, + 67195, + 67214, + 67205, + 67170, + 67183, + 67173, + 67205, + 67180, + 67218, + 67177, + 67197, + 67182, + 67175, + 67165, + 67183, + 67186, + 67188, + 67173, + 67202, + 67196, + 67164, + 67195, + 67208, + 67206, + 67194, + 67187, + 67204, + 67209, + 67176, + 67174, + 67166, + 67207, + 67162, + 67179, + 67209, + 67167, + 67204, + 67211, + 67195, + 67208, + 67211, + 67198, + 67165, + 67195, + 67202, + 67209, + 67185, + 67188, + 67197, + 67165, + 67205, + 67206, + 67210, + 67178, + 67168, + 67243, + 67173, + 67204, + 67212, + 67202, + 67160, + 67204, + 67155, + 67172, + 67192, + 67223, + 67217, + 67175, + 67198, + 67203, + 67200, + 67194, + 67189, + 67185, + 67177, + 67171, + 67205, + 67188, + 67200, + 67173, + 67162, + 67172, + 67178, + 67305, + 67236, + 67198, + 67201, + 67217, + 67229, + 67212, + 67220, + 67200, + 67181, + 67179, + 67191, + 67173, + 67177, + 67214, + 67184, + 67218, + 67200, + 67204, + 67174, + 67165, + 67172, + 67185, + 67194, + 67166, + 67194, + 67192, + 67164, + 67190, + 67189, + 67192, + 67182, + 67207, + 67319, + 67180, + 67237, + 67221, + 67223, + 67177, + 67176, + 67196, + 67185, + 67188, + 67179, + 67156, + 67177, + 67198, + 67209, + 67179, + 67187, + 67226, + 67182, + 67200, + 67174, + 67257, + 67237, + 67174, + 67195, + 67166, + 67185, + 67198, + 67220, + 67173, + 67178, + 67181, + 67195, + 67193, + 67189, + 67154, + 67179, + 67191, + 67175, + 67197, + 67189, + 67171, + 67159, + 67203, + 67187, + 67197, + 67219, + 67179, + 67173, + 67168, + 67176, + 67186, + 67206, + 67196, + 67190, + 67164, + 67208, + 67169, + 67197, + 67167, + 67184, + 67187, + 67181, + 67211, + 67177, + 67241, + 67233, + 67196, + 67177, + 67212, + 67167, + 67221, + 67196, + 67212, + 67184, + 67175, + 67170, + 67229, + 67165, + 67213, + 67166, + 67203, + 67207, + 67190, + 67175, + 67168, + 67201, + 67222, + 67207, + 67213, + 67196, + 67181, + 67185, + 67198, + 67187, + 67174, + 67189, + 67191, + 67182, + 67193, + 67205, + 67211, + 67211, + 67175, + 67202, + 67214, + 67197, + 67200, + 67173, + 67206, + 67172, + 67173, + 67235, + 67188, + 67195, + 67199, + 67184, + 67172, + 67177, + 67215, + 67188, + 67176, + 67211, + 67173, + 67229, + 67182, + 67170, + 67202, + 67187, + 67182, + 67197, + 67196, + 67206, + 67211, + 67225, + 67203, + 67198, + 67228, + 67182, + 67177, + 67182, + 67220, + 67229, + 67178, + 67176, + 67211, + 67181, + 67212, + 67181, + 67168, + 67194, + 67194, + 67170, + 67169, + 67202, + 67223, + 67205, + 67183, + 67209, + 67199, + 67203, + 67212, + 67244, + 67187, + 67179, + 67186, + 67188, + 67182, + 67164, + 67183, + 67186, + 67199, + 67204, + 67211, + 67184, + 67176, + 67195, + 67193, + 67199, + 67180, + 67209, + 67199, + 67200, + 67197, + 67222, + 67211, + 67171, + 67219, + 67193, + 67210, + 67191, + 67211, + 67209, + 67217, + 67216, + 67187, + 67199, + 67167, + 67191, + 67200, + 67203, + 67181, + 67189, + 67191, + 67216, + 67212, + 67201, + 67197, + 67196, + 67187, + 67202, + 67188, + 67168, + 67218, + 67184, + 67186, + 67234, + 67210, + 67211, + 67183, + 67180, + 67189, + 67189, + 67201, + 67183, + 67212, + 67190, + 67172, + 67192, + 67174, + 67199, + 67182, + 67181, + 67189, + 67182, + 67180, + 67210, + 67205, + 67220, + 67199, + 67177, + 67169, + 67192, + 67212, + 67298, + 67172, + 67205, + 67190, + 67202, + 67199, + 67202, + 67195, + 67206, + 67211, + 67177, + 67199, + 67164, + 67158, + 67197, + 67175, + 67178, + 67165, + 67200, + 67193, + 67182, + 67197, + 67197, + 67186, + 67175, + 67194, + 67201, + 67187, + 67193, + 67212, + 67180, + 67168, + 67160, + 67186, + 67226, + 67179, + 67188, + 67218, + 67199, + 67204, + 67176, + 67200, + 67190, + 67190, + 67182, + 67217, + 67172, + 67220, + 67210, + 67227, + 67203, + 67170, + 67190, + 67155, + 67198, + 67168, + 67216, + 67197, + 67180, + 67197, + 67174, + 67177, + 67186, + 67206, + 67193, + 67196, + 67215, + 67185, + 67201, + 67192, + 67194, + 67197, + 67210, + 67193, + 67204, + 67222, + 67175, + 67176, + 67211, + 67207, + 67170, + 67188, + 67213, + 67199, + 67194, + 67214, + 67188, + 67174, + 67174, + 67198, + 67183, + 67187, + 67206, + 67192, + 67198, + 67169, + 67160, + 67184, + 67183 + ], + "sample_count": 15277 + }, + { + "pubkey": "HtRWdLTf8YSYE7H7HMboqip93HBzku7p6mV9MGP6zCdV", + "epoch": 89, + "origin_device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "target_device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "link_pk": "6PWVQE6pqbpwcU4pn7UvRoEEG1dpa2nQwbD3DLR4AkRT", + "origin_device_location_pk": "7vt8Tnbk15S6JA1uhRQVtbuL7w39zY8jeQ5iqgjsqLfP", + "target_device_location_pk": "DJX3x93muX4Tnv2yG4aqLL3YntLurDKeR2SFZEF5qWRV", + "origin_device_agent_pk": "6LHRkoEGNAPH2fFndCudK94pQU9v5Hk4DEKX253CbNHy", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242127283419, + "samples": [ + 152529, + 152535, + 152505, + 152716, + 152490, + 152509, + 152495, + 152493, + 152571, + 152496, + 152490, + 152528, + 152525, + 152555, + 152493, + 152531, + 152531, + 152524, + 152551, + 152522, + 152496, + 152544, + 152536, + 152524, + 152528, + 152521, + 152516, + 152540, + 152530, + 152540, + 152543, + 152551, + 152528, + 152529, + 152513, + 152523, + 152488, + 152532, + 152548, + 152502, + 152569, + 152525, + 152504, + 152519, + 152554, + 152547, + 152523, + 152525, + 152534, + 152510, + 152515, + 152547, + 152506, + 152518, + 152543, + 152551, + 152596, + 152569, + 152510, + 152523, + 152497, + 152522, + 152531, + 152503, + 152549, + 152513, + 152540, + 152508, + 152523, + 152544, + 152534, + 152529, + 152502, + 152538, + 152513, + 152553, + 152508, + 152549, + 152535, + 152550, + 152523, + 152544, + 152596, + 152490, + 152516, + 152549, + 152564, + 152524, + 152545, + 152524, + 152525, + 152533, + 152514, + 152507, + 152551, + 152512, + 152518, + 152525, + 152540, + 152526, + 152517, + 152526, + 152516, + 152522, + 152543, + 152527, + 152503, + 152546, + 152538, + 152554, + 152543, + 152494, + 152503, + 152535, + 152521, + 152541, + 152543, + 152513, + 152514, + 152539, + 152509, + 152514, + 152506, + 152542, + 152507, + 152512, + 152534, + 152534, + 152529, + 152540, + 152532, + 152541, + 152519, + 152500, + 152534, + 152538, + 152525, + 152527, + 152524, + 152505, + 152516, + 152539, + 152534, + 152515, + 152531, + 152495, + 152532, + 152579, + 152512, + 152522, + 152480, + 152523, + 152551, + 152531, + 152536, + 152511, + 152533, + 152534, + 152532, + 152534, + 152500, + 152509, + 152565, + 152507, + 152525, + 152534, + 152533, + 152553, + 152571, + 152916, + 152535, + 152608, + 152547, + 152510, + 152573, + 152577, + 152561, + 152516, + 152518, + 152549, + 152539, + 152530, + 152532, + 152512, + 152539, + 152539, + 152538, + 152534, + 152538, + 152515, + 152526, + 152517, + 152532, + 152532, + 152553, + 152505, + 152549, + 152509, + 152560, + 152515, + 152508, + 152536, + 152537, + 152538, + 152539, + 152517, + 152538, + 152531, + 152517, + 152502, + 152498, + 152558, + 152536, + 152526, + 152544, + 152527, + 152526, + 152512, + 152530, + 152533, + 152525, + 152531, + 152493, + 152504, + 152549, + 152500, + 152501, + 152535, + 152530, + 152529, + 152495, + 152528, + 152530, + 152546, + 152526, + 152551, + 152527, + 152508, + 152562, + 152535, + 152497, + 152527, + 152534, + 152570, + 152524, + 152534, + 152506, + 152518, + 152539, + 152561, + 152558, + 152524, + 152550, + 152541, + 152528, + 152522, + 152517, + 152542, + 152541, + 152524, + 152537, + 152548, + 152525, + 152544, + 152520, + 152505, + 152543, + 152539, + 152557, + 152512, + 152556, + 152525, + 152539, + 152534, + 152525, + 152692, + 152510, + 152534, + 152592, + 152579, + 152553, + 152549, + 152531, + 152570, + 152522, + 152563, + 152525, + 152544, + 152530, + 152529, + 152510, + 152523, + 152519, + 152543, + 152538, + 152543, + 152501, + 152533, + 152516, + 152500, + 152533, + 152519, + 152559, + 152521, + 152527, + 152548, + 152523, + 152501, + 152541, + 152551, + 152530, + 152515, + 152546, + 152533, + 152520, + 152529, + 152506, + 152512, + 152508, + 152534, + 152503, + 152540, + 152529, + 152486, + 152530, + 152516, + 152546, + 152532, + 152520, + 152516, + 152537, + 152512, + 152513, + 152541, + 152565, + 152526, + 152536, + 152500, + 152496, + 152504, + 152516, + 152527, + 152522, + 152534, + 152539, + 152521, + 152505, + 152527, + 152514, + 152516, + 152500, + 152551, + 152513, + 152540, + 152518, + 152524, + 152523, + 152524, + 152541, + 152524, + 152526, + 152525, + 152540, + 152547, + 152566, + 152501, + 152524, + 152509, + 152544, + 152493, + 152540, + 152493, + 152525, + 152541, + 152505, + 152524, + 152494, + 152514, + 152538, + 152526, + 152539, + 152501, + 152514, + 152516, + 152527, + 152554, + 152534, + 152523, + 152498, + 152520, + 152519, + 152529, + 152551, + 152527, + 152546, + 152532, + 152507, + 152539, + 152540, + 152532, + 152527, + 152537, + 152537, + 152529, + 152513, + 152513, + 152537, + 152497, + 152524, + 152536, + 152512, + 152540, + 152512, + 152542, + 152539, + 152547, + 152533, + 152522, + 152546, + 152547, + 152532, + 152544, + 152550, + 152520, + 152539, + 152500, + 152533, + 152504, + 152526, + 152550, + 152494, + 152513, + 152545, + 152499, + 152503, + 152510, + 152509, + 152527, + 152499, + 152533, + 152531, + 152535, + 152518, + 152502, + 152536, + 152526, + 152530, + 152552, + 152500, + 152530, + 152511, + 152534, + 152550, + 152527, + 152487, + 152524, + 152533, + 152531, + 152581, + 152536, + 152537, + 152530, + 152492, + 152542, + 152523, + 152522, + 152546, + 152538, + 152518, + 152504, + 152505, + 152541, + 152513, + 152559, + 152542, + 152545, + 152545, + 152536, + 152539, + 152538, + 152517, + 152537, + 152505, + 152514, + 152515, + 152528, + 152512, + 152560, + 152518, + 152510, + 152509, + 152533, + 152540, + 152525, + 152554, + 152511, + 152545, + 152545, + 152509, + 152527, + 152502, + 152552, + 152549, + 152509, + 152527, + 152538, + 152544, + 152558, + 152506, + 152515, + 152506, + 152537, + 152539, + 152535, + 152524, + 152549, + 152578, + 152556, + 152537, + 152490, + 152521, + 152549, + 152522, + 152535, + 152525, + 152521, + 152560, + 152550, + 152513, + 152549, + 152530, + 152579, + 152521, + 152530, + 152532, + 152556, + 152538, + 152537, + 152533, + 152530, + 152532, + 152520, + 152525, + 152537, + 152536, + 152534, + 152542, + 152505, + 152527, + 152501, + 152524, + 152555, + 152534, + 152494, + 152504, + 152511, + 152559, + 152555, + 152537, + 152543, + 152532, + 152546, + 152542, + 152528, + 152504, + 152555, + 152519, + 152502, + 152561, + 152498, + 152531, + 152525, + 152530, + 152545, + 152547, + 152496, + 152536, + 152527, + 152535, + 152536, + 152531, + 152531, + 152518, + 152536, + 152544, + 152509, + 152554, + 152550, + 152499, + 152507, + 152531, + 152498, + 152508, + 152519, + 152523, + 152510, + 152540, + 152556, + 152558, + 152529, + 152508, + 152544, + 152557, + 152594, + 152537, + 152509, + 152508, + 152542, + 152545, + 152526, + 152515, + 152524, + 152525, + 152549, + 152505, + 152505, + 152520, + 152535, + 152543, + 152527, + 152529, + 152539, + 152515, + 152525, + 152489, + 152542, + 152538, + 152555, + 152528, + 152548, + 152514, + 152548, + 152507, + 152495, + 152530, + 152532, + 152527, + 152537, + 152520, + 152567, + 152515, + 152531, + 152519, + 152527, + 152520, + 152518, + 152492, + 152541, + 152545, + 152517, + 152548, + 152553, + 152506, + 152499, + 152518, + 152528, + 152543, + 152522, + 152530, + 152517, + 152547, + 152517, + 152490, + 152563, + 152489, + 152511, + 152552, + 152529, + 152531, + 152561, + 152523, + 152529, + 152514, + 152491, + 152553, + 152518, + 152511, + 152541, + 152538, + 152528, + 152533, + 152547, + 152512, + 152508, + 152565, + 152555, + 152507, + 152561, + 152567, + 152523, + 152544, + 152565, + 152565, + 152536, + 152507, + 152531, + 152576, + 152529, + 152511, + 152569, + 152506, + 152535, + 152545, + 152558, + 152526, + 152543, + 152551, + 152540, + 152500, + 152549, + 152531, + 152546, + 152527, + 152522, + 152505, + 152532, + 152513, + 152527, + 152536, + 152496, + 152502, + 152521, + 152535, + 152528, + 152502, + 152511, + 152540, + 152546, + 152541, + 152504, + 152556, + 152520, + 152499, + 152516, + 152602, + 152514, + 152498, + 152675, + 152561, + 152535, + 152510, + 152541, + 152556, + 152531, + 152512, + 152547, + 152532, + 152521, + 152538, + 152542, + 152502, + 152546, + 152510, + 152516, + 152534, + 152540, + 152521, + 152530, + 152528, + 152540, + 152521, + 152485, + 152532, + 152515, + 152525, + 152545, + 152512, + 152536, + 152593, + 152527, + 152550, + 152532, + 152560, + 152506, + 152501, + 152547, + 152508, + 152535, + 152573, + 152506, + 152497, + 152482, + 152527, + 152533, + 152527, + 152519, + 152529, + 152520, + 152522, + 152526, + 152546, + 152538, + 152551, + 152542, + 152495, + 152531, + 152543, + 152578, + 152530, + 152542, + 152514, + 152529, + 152547, + 152543, + 152547, + 152529, + 152516, + 152544, + 152543, + 152527, + 152542, + 152552, + 152534, + 152537, + 152524, + 152539, + 152536, + 152511, + 152525, + 152562, + 152532, + 152584, + 152590, + 152534, + 152506, + 152536, + 152549, + 152529, + 152520, + 152527, + 152495, + 152549, + 152543, + 152514, + 152583, + 152557, + 152492, + 152594, + 152517, + 152524, + 152513, + 152493, + 152519, + 152519, + 152534, + 152528, + 152545, + 152501, + 152538, + 152524, + 152585, + 152519, + 152533, + 152532, + 152519, + 152532, + 152524, + 152512, + 152518, + 152513, + 152520, + 152511, + 152542, + 152516, + 152544, + 152513, + 152524, + 152499, + 152581, + 152525, + 152597, + 152541, + 152546, + 152532, + 152564, + 152655, + 152550, + 152551, + 152527, + 152549, + 152563, + 152495, + 152540, + 152531, + 152545, + 152560, + 152527, + 152519, + 152529, + 152548, + 152536, + 152514, + 152549, + 152531, + 152528, + 152532, + 152541, + 152547, + 152527, + 152555, + 152515, + 152495, + 152536, + 152507, + 152520, + 152574, + 152523, + 152527, + 152514, + 152528, + 152531, + 152523, + 152522, + 152497, + 152506, + 152514, + 152516, + 152554, + 152513, + 152537, + 152542, + 152539, + 152523, + 152488, + 152521, + 152523, + 152515, + 152524, + 152557, + 152562, + 152552, + 152501, + 152552, + 152534, + 152523, + 152533, + 152514, + 152541, + 152525, + 152509, + 152540, + 152532, + 152512, + 152514, + 152514, + 152516, + 152537, + 152526, + 152551, + 152541, + 152523, + 152557, + 152601, + 152497, + 152524, + 152504, + 152526, + 152536, + 152563, + 152548, + 152523, + 152593, + 152548, + 152548, + 152529, + 152505, + 152510, + 152512, + 152533, + 152503, + 152556, + 152548, + 152544, + 152530, + 152496, + 152531, + 152564, + 152547, + 152500, + 152517, + 152545, + 152542, + 152566, + 152506, + 152527, + 152545, + 152521, + 152498, + 152560, + 152514, + 152540, + 152525, + 152553, + 152552, + 152526, + 152525, + 152504, + 152523, + 152530, + 152526, + 152511, + 152546, + 152535, + 152542, + 152520, + 152698, + 152540, + 152542, + 152555, + 152506, + 152523, + 152535, + 152513, + 152533, + 152539, + 152519, + 152526, + 152548, + 152547, + 152528, + 152495, + 152547, + 152520, + 152529, + 152541, + 152540, + 152519, + 152536, + 152526, + 152656, + 152552, + 152518, + 152534, + 152567, + 152918, + 152545, + 152536, + 152574, + 152536, + 152560, + 152528, + 152508, + 152551, + 152561, + 152536, + 152524, + 152519, + 152545, + 152544, + 152520, + 152537, + 152530, + 152517, + 152515, + 152543, + 152508, + 152549, + 152550, + 152513, + 152567, + 152522, + 152516, + 152557, + 152505, + 152505, + 152522, + 152546, + 152498, + 152585, + 152491, + 152534, + 152503, + 152507, + 152551, + 152513, + 152536, + 152596, + 152506, + 152498, + 152546, + 152552, + 152544, + 152509, + 152557, + 152536, + 152499, + 152543, + 152531, + 152530, + 152568, + 152507, + 152495, + 152515, + 152546, + 152517, + 152536, + 152523, + 152509, + 152537, + 152498, + 152544, + 152511, + 152535, + 152512, + 152493, + 152490, + 152542, + 152529, + 152535, + 152509, + 152520, + 152519, + 152557, + 152531, + 152543, + 152508, + 152538, + 152573, + 152529, + 152553, + 152535, + 152536, + 152561, + 152561, + 152525, + 152506, + 152535, + 152532, + 152516, + 152541, + 152527, + 152530, + 152554, + 152513, + 152549, + 152553, + 152562, + 152512, + 152509, + 152527, + 152523, + 152510, + 152540, + 152506, + 152536, + 152534, + 152519, + 152545, + 152506, + 152549, + 152534, + 152530, + 152573, + 152515, + 152538, + 152553, + 152515, + 152525, + 152519, + 152558, + 152561, + 152513, + 152537, + 152527, + 152546, + 152540, + 152552, + 152521, + 152541, + 152580, + 152550, + 152529, + 152540, + 152539, + 152518, + 152529, + 152514, + 152542, + 152477, + 152532, + 152579, + 152536, + 152555, + 152517, + 152497, + 152537, + 152530, + 152543, + 152560, + 152500, + 152497, + 152564, + 152541, + 152546, + 152538, + 152570, + 152523, + 152561, + 152523, + 152583, + 152539, + 152546, + 152505, + 152530, + 152534, + 152533, + 152549, + 152536, + 152521, + 152523, + 152543, + 152518, + 152531, + 152546, + 152513, + 152540, + 152529, + 152528, + 152519, + 152499, + 152535, + 152532, + 152560, + 152547, + 152566, + 152526, + 152518, + 152578, + 152525, + 152511, + 152518, + 152531, + 152524, + 152542, + 152569, + 152520, + 152537, + 152507, + 152534, + 152528, + 152542, + 152516, + 152524, + 152504, + 152592, + 152533, + 152577, + 152543, + 152528, + 152526, + 152528, + 152526, + 152511, + 152527, + 152547, + 152537, + 152543, + 152554, + 152535, + 152534, + 152580, + 152510, + 152508, + 152520, + 152548, + 152529, + 152515, + 152530, + 152508, + 152555, + 152525, + 152774, + 152534, + 152524, + 152484, + 152540, + 152529, + 152512, + 152532, + 152515, + 152509, + 152580, + 152534, + 152517, + 152556, + 152561, + 152565, + 152539, + 152514, + 152536, + 152532, + 152539, + 152571, + 152540, + 152524, + 152667, + 152538, + 152491, + 152522, + 152605, + 152532, + 152524, + 152541, + 152545, + 152570, + 152542, + 152560, + 152546, + 152528, + 152483, + 152536, + 152504, + 152537, + 152504, + 152499, + 152510, + 152546, + 152542, + 152539, + 152537, + 152497, + 152529, + 152563, + 152541, + 152534, + 152520, + 152543, + 152547, + 152534, + 152547, + 152546, + 152537, + 152526, + 152521, + 152520, + 152555, + 152564, + 152495, + 152539, + 152589, + 152519, + 152530, + 152532, + 152587, + 152497, + 152536, + 152550, + 152548, + 152574, + 152545, + 152551, + 152543, + 152552, + 152509, + 152525, + 152508, + 152499, + 152516, + 152551, + 152540, + 152500, + 152511, + 152505, + 152528, + 152533, + 152527, + 152519, + 152545, + 152519, + 152507, + 152511, + 152545, + 152514, + 152513, + 152497, + 152531, + 152545, + 152550, + 152518, + 152526, + 152578, + 152555, + 152547, + 152531, + 152550, + 152499, + 152533, + 152510, + 152566, + 152522, + 152522, + 152518, + 152554, + 152490, + 152519, + 152594, + 152582, + 152549, + 152504, + 152554, + 152526, + 152532, + 152534, + 152532, + 152520, + 152539, + 152543, + 152534, + 152554, + 152512, + 152557, + 152517, + 152491, + 152539, + 152527, + 152534, + 152671, + 152516, + 152527, + 152503, + 152543, + 152547, + 152511, + 152521, + 152560, + 152551, + 152564, + 152487, + 152506, + 152561, + 152526, + 152544, + 152525, + 152531, + 152559, + 152509, + 152533, + 152504, + 152541, + 152574, + 152530, + 152509, + 152537, + 152510, + 152544, + 152568, + 152506, + 152538, + 152508, + 152515, + 152533, + 152543, + 152543, + 152494, + 152562, + 152572, + 152529, + 152515, + 152546, + 152511, + 152529, + 152544, + 152565, + 152514, + 152532, + 152571, + 152516, + 152543, + 152545, + 152529, + 152542, + 152487, + 152531, + 152606, + 152535, + 152540, + 152558, + 152563, + 152591, + 152532, + 152559, + 152539, + 152559, + 152503, + 152542, + 152527, + 152545, + 152529, + 152543, + 152519, + 152513, + 152544, + 152527, + 152526, + 152566, + 152572, + 152526, + 152575, + 152531, + 152566, + 152534, + 152528, + 152533, + 152525, + 152555, + 152539, + 152539, + 152531, + 152507, + 152527, + 152547, + 152513, + 152528, + 152554, + 152503, + 152527, + 152538, + 152511, + 152524, + 152531, + 152506, + 152549, + 152524, + 152539, + 152531, + 152550, + 152527, + 152509, + 152514, + 152521, + 152533, + 152556, + 152509, + 152533, + 152526, + 152522, + 152535, + 152530, + 152506, + 152516, + 152520, + 152530, + 152552, + 152540, + 152505, + 152531, + 152630, + 152499, + 152570, + 152539, + 152502, + 152547, + 152550, + 152530, + 152541, + 152556, + 152546, + 152551, + 152555, + 152537, + 152530, + 152556, + 152515, + 152573, + 152515, + 152524, + 152538, + 152497, + 152550, + 152550, + 152500, + 152529, + 152499, + 152534, + 152549, + 152523, + 152565, + 152511, + 152539, + 152541, + 152502, + 152515, + 152534, + 152511, + 152565, + 152503, + 152522, + 152546, + 152528, + 152525, + 152505, + 152507, + 152496, + 152524, + 152535, + 152523, + 152524, + 152554, + 152543, + 152569, + 152549, + 152509, + 152541, + 152529, + 152560, + 152539, + 152563, + 152538, + 152513, + 152555, + 152491, + 152538, + 152521, + 152529, + 152525, + 152526, + 152521, + 152527, + 152527, + 152517, + 152552, + 152508, + 152509, + 152492, + 152507, + 152535, + 152497, + 152530, + 152509, + 152539, + 152539, + 152515, + 152541, + 152529, + 152527, + 152517, + 152555, + 152531, + 152532, + 152567, + 152488, + 152526, + 152538, + 152537, + 152513, + 152525, + 152515, + 152542, + 152537, + 152552, + 152492, + 152533, + 152524, + 152505, + 152577, + 152518, + 152521, + 152587, + 152629, + 152512, + 152530, + 152500, + 152505, + 152512, + 152508, + 152545, + 152523, + 152545, + 152546, + 152508, + 152523, + 152544, + 152528, + 152539, + 152523, + 152544, + 152541, + 152535, + 152526, + 152510, + 152555, + 152533, + 152499, + 152570, + 152566, + 152549, + 152516, + 152597, + 152545, + 152519, + 152553, + 152509, + 152555, + 152509, + 152543, + 152501, + 152505, + 152598, + 152537, + 152532, + 152530, + 152546, + 152577, + 152502, + 152514, + 152563, + 152529, + 152535, + 152514, + 152539, + 152538, + 152533, + 152510, + 152549, + 152534, + 152536, + 152533, + 152528, + 152536, + 152547, + 152518, + 152507, + 152510, + 152557, + 152536, + 152550, + 152542, + 152536, + 152550, + 152604, + 152510, + 152560, + 152542, + 152553, + 152549, + 152542, + 152570, + 152583, + 152506, + 152505, + 152530, + 152547, + 152537, + 152525, + 152544, + 152532, + 152498, + 152515, + 152518, + 152514, + 152546, + 152544, + 152559, + 152526, + 152518, + 152550, + 152550, + 152567, + 152528, + 152559, + 152540, + 152508, + 152508, + 152523, + 152527, + 152543, + 152498, + 152507, + 152556, + 152521, + 152528, + 152516, + 152531, + 152554, + 152517, + 152535, + 152508, + 152514, + 152574, + 152510, + 152501, + 152528, + 152503, + 152518, + 152522, + 152536, + 152521, + 152517, + 152563, + 152517, + 152503, + 152550, + 152510, + 152498, + 152539, + 152517, + 152493, + 152566, + 152513, + 152509, + 152539, + 152519, + 152518, + 152522, + 152518, + 152566, + 152553, + 152530, + 152524, + 152558, + 152512, + 152523, + 152511, + 152547, + 152501, + 152507, + 152518, + 152497, + 152528, + 152542, + 152528, + 152548, + 152567, + 152512, + 152497, + 152551, + 152510, + 152522, + 152564, + 152540, + 152534, + 152543, + 152562, + 152522, + 152544, + 152550, + 152501, + 152560, + 152519, + 152546, + 152544, + 152547, + 152598, + 152500, + 152558, + 152500, + 152545, + 152505, + 152531, + 152538, + 152509, + 152510, + 152541, + 152538, + 152524, + 152574, + 152497, + 152509, + 152511, + 152535, + 152525, + 152492, + 152497, + 152521, + 152579, + 152533, + 152499, + 152540, + 152521, + 152515, + 152542, + 152495, + 152535, + 152507, + 152533, + 152509, + 152505, + 152490, + 152532, + 152539, + 152538, + 152551, + 152532, + 152553, + 152507, + 152557, + 152515, + 152558, + 152532, + 152506, + 152563, + 152529, + 152532, + 152543, + 152495, + 152516, + 152536, + 152508, + 152537, + 152516, + 152566, + 152551, + 152486, + 152516, + 152536, + 152545, + 152535, + 152528, + 152562, + 152523, + 152529, + 152539, + 152523, + 152485, + 152503, + 152539, + 152506, + 152556, + 152510, + 152504, + 152541, + 152542, + 152508, + 152508, + 152551, + 152522, + 152546, + 152546, + 152533, + 152516, + 152525, + 152502, + 152544, + 152503, + 152516, + 152573, + 152544, + 152550, + 152554, + 152560, + 152529, + 152527, + 152534, + 152526, + 152524, + 152535, + 152504, + 152531, + 152533, + 152489, + 152528, + 152499, + 152556, + 152535, + 152539, + 152553, + 152506, + 152536, + 152541, + 152536, + 152524, + 152549, + 152531, + 152524, + 152550, + 152536, + 152536, + 152534, + 152507, + 152519, + 152533, + 152520, + 152522, + 152532, + 152515, + 152515, + 152540, + 152515, + 152520, + 152516, + 152493, + 152531, + 152528, + 152547, + 152526, + 152526, + 152529, + 152545, + 152514, + 152487, + 152509, + 152528, + 152528, + 152550, + 152525, + 152520, + 152493, + 152529, + 152516, + 152536, + 152531, + 152512, + 152497, + 152509, + 152543, + 152490, + 152567, + 152535, + 152540, + 152543, + 152541, + 152533, + 152520, + 152541, + 152542, + 152488, + 152500, + 152501, + 152501, + 152517, + 152534, + 152554, + 152943, + 152515, + 152523, + 152533, + 152545, + 152544, + 152519, + 152538, + 152550, + 152537, + 152501, + 152531, + 152510, + 152533, + 152552, + 152500, + 152506, + 152543, + 152571, + 152517, + 152546, + 152570, + 152486, + 152525, + 152559, + 152529, + 152529, + 152538, + 152556, + 152518, + 152531, + 152560, + 152523, + 152507, + 152554, + 152510, + 152510, + 152551, + 152551, + 152548, + 152506, + 152523, + 152527, + 152519, + 152501, + 152523, + 152521, + 152502, + 152504, + 152837, + 152530, + 152524, + 152522, + 152551, + 152529, + 152526, + 152522, + 152580, + 152541, + 152546, + 152521, + 152546, + 152526, + 152510, + 152525, + 152541, + 152550, + 152506, + 152525, + 152529, + 152531, + 152524, + 152532, + 152536, + 152551, + 152527, + 152526, + 152529, + 152530, + 152520, + 152530, + 152529, + 152573, + 152496, + 152539, + 152529, + 152528, + 152513, + 152508, + 152522, + 152500, + 152534, + 152532, + 152523, + 152509, + 152555, + 152527, + 152487, + 152542, + 152547, + 152567, + 152564, + 152507, + 152543, + 152543, + 152498, + 152543, + 152537, + 152528, + 152531, + 152608, + 152543, + 152513, + 152510, + 152550, + 152567, + 152509, + 152545, + 152527, + 152533, + 152540, + 152543, + 152508, + 152521, + 152514, + 152545, + 152514, + 152482, + 152516, + 152489, + 152534, + 152520, + 152535, + 152514, + 152536, + 152527, + 152507, + 152548, + 152527, + 152560, + 152498, + 152521, + 152535, + 152506, + 152526, + 152501, + 152530, + 152528, + 152503, + 152548, + 152538, + 152490, + 152503, + 152539, + 152509, + 152536, + 152548, + 152512, + 152510, + 152545, + 152517, + 152512, + 152524, + 152530, + 152539, + 152540, + 152512, + 152516, + 152527, + 152530, + 152521, + 152524, + 152535, + 152511, + 152527, + 152517, + 152531, + 152513, + 152539, + 152529, + 152512, + 152529, + 152526, + 152516, + 152558, + 152511, + 152518, + 152538, + 152564, + 152544, + 152510, + 152499, + 152511, + 152550, + 152551, + 152510, + 152536, + 152577, + 152538, + 152497, + 152517, + 152541, + 152544, + 152525, + 152504, + 152545, + 152528, + 152556, + 152551, + 152533, + 152500, + 152525, + 152523, + 152518, + 152515, + 152545, + 152500, + 152533, + 152500, + 152513, + 152544, + 152545, + 152524, + 152545, + 152529, + 152519, + 152533, + 152536, + 152539, + 152501, + 152532, + 152553, + 152509, + 152518, + 152540, + 152548, + 152542, + 152515, + 152528, + 152520, + 152534, + 152498, + 152538, + 152524, + 152511, + 152523, + 152533, + 152544, + 152556, + 152532, + 152530, + 152516, + 152528, + 152539, + 152563, + 152596, + 152542, + 152549, + 152527, + 152556, + 152519, + 152544, + 152563, + 152524, + 152513, + 152538, + 152542, + 152528, + 152548, + 152495, + 152565, + 152512, + 152567, + 152494, + 152534, + 152539, + 152575, + 152534, + 152519, + 152511, + 152543, + 152502, + 152510, + 152485, + 152547, + 152552, + 152499, + 152522, + 152518, + 152533, + 152498, + 152520, + 152506, + 152530, + 152495, + 152531, + 152511, + 152537, + 152547, + 152535, + 152500, + 152501, + 152527, + 152520, + 152506, + 152547, + 152543, + 152553, + 152528, + 152542, + 152548, + 152529, + 152517, + 152534, + 152534, + 152510, + 152525, + 152521, + 152513, + 152538, + 152511, + 152541, + 152537, + 152511, + 152502, + 152508, + 152555, + 152529, + 152537, + 152525, + 152499, + 152594, + 152532, + 152544, + 152535, + 152502, + 152535, + 152500, + 152522, + 152528, + 152504, + 152549, + 152523, + 152506, + 152504, + 152533, + 152512, + 152509, + 152518, + 152544, + 152516, + 152535, + 152499, + 152531, + 152533, + 152516, + 152507, + 152557, + 152536, + 152533, + 152573, + 152512, + 152509, + 152510, + 152532, + 152504, + 152516, + 152549, + 152510, + 152506, + 152556, + 152508, + 152500, + 152508, + 152533, + 152519, + 152567, + 152528, + 152531, + 152556, + 152507, + 152530, + 152555, + 152524, + 152526, + 152546, + 152526, + 152541, + 152537, + 152537, + 152516, + 152503, + 152541, + 152502, + 152545, + 152515, + 152491, + 152509, + 152537, + 152538, + 152494, + 152518, + 152489, + 152529, + 152522, + 152544, + 152502, + 152519, + 152537, + 152546, + 152539, + 152547, + 152566, + 152527, + 152509, + 152544, + 152507, + 152543, + 152529, + 152547, + 152505, + 152510, + 152529, + 152519, + 152541, + 152513, + 152514, + 152557, + 152536, + 152547, + 152501, + 152541, + 152534, + 152517, + 152544, + 152544, + 152527, + 152511, + 152519, + 152535, + 152517, + 152504, + 152516, + 152554, + 152477, + 152526, + 152542, + 152532, + 152521, + 152508, + 152498, + 152533, + 152545, + 152509, + 152506, + 152527, + 152514, + 152537, + 152514, + 152525, + 152516, + 152520, + 152807, + 152501, + 152509, + 152502, + 152534, + 152541, + 152505, + 152529, + 152573, + 152508, + 152532, + 152519, + 152502, + 152536, + 152523, + 152492, + 152528, + 152505, + 152520, + 152511, + 152508, + 152498, + 152564, + 152507, + 152524, + 152533, + 152519, + 152512, + 152587, + 152498, + 152535, + 152529, + 152557, + 152534, + 152522, + 152515, + 152586, + 152528, + 152528, + 152516, + 152543, + 152525, + 152529, + 152514, + 152524, + 152528, + 152520, + 152513, + 152506, + 152504, + 152546, + 152507, + 152504, + 152552, + 152533, + 152544, + 152564, + 152512, + 152511, + 152548, + 152503, + 152551, + 152530, + 152512, + 152534, + 152538, + 152512, + 152534, + 152553, + 152539, + 152511, + 152525, + 152504, + 152534, + 152508, + 152516, + 152506, + 152522, + 152513, + 152511, + 152531, + 152516, + 152545, + 152512, + 152521, + 152499, + 152530, + 152531, + 152527, + 152540, + 152538, + 152553, + 152546, + 152528, + 152537, + 152509, + 152562, + 152531, + 152511, + 152528, + 152516, + 152530, + 152553, + 152552, + 152518, + 152561, + 152559, + 152538, + 152502, + 152530, + 152507, + 152529, + 152514, + 152536, + 152557, + 152534, + 152542, + 152535, + 152519, + 152543, + 152514, + 152535, + 152496, + 152508, + 152543, + 152544, + 152497, + 152540, + 152520, + 152572, + 152519, + 152524, + 152523, + 152539, + 152496, + 152502, + 152521, + 152535, + 152522, + 152524, + 152554, + 152510, + 152551, + 152505, + 152546, + 152513, + 152561, + 152541, + 152547, + 152587, + 152542, + 152528, + 152507, + 152548, + 152543, + 152530, + 152540, + 152519, + 152554, + 152498, + 152537, + 152580, + 152540, + 152495, + 152531, + 152576, + 152517, + 152542, + 152544, + 152528, + 152531, + 152532, + 152544, + 152511, + 152525, + 152552, + 152573, + 152550, + 152515, + 152533, + 152540, + 152529, + 152523, + 152524, + 152536, + 152540, + 152543, + 152509, + 152538, + 152528, + 152489, + 152510, + 152485, + 152529, + 152525, + 152538, + 152542, + 152553, + 152530, + 152515, + 152548, + 153229, + 152560, + 152538, + 152495, + 152541, + 152501, + 152540, + 152536, + 152543, + 152542, + 152559, + 152528, + 152609, + 152516, + 152547, + 152526, + 152554, + 152522, + 152557, + 152536, + 152541, + 152553, + 152528, + 152534, + 152531, + 152552, + 152523, + 152561, + 152535, + 152521, + 152528, + 152509, + 152552, + 152527, + 152535, + 152521, + 152543, + 152537, + 152528, + 152517, + 152537, + 152551, + 152559, + 152558, + 152530, + 152512, + 152540, + 152518, + 152546, + 152509, + 152515, + 152497, + 152538, + 152524, + 152519, + 152538, + 152527, + 152539, + 152544, + 152530, + 152542, + 152535, + 152505, + 152512, + 152548, + 152509, + 152544, + 152536, + 152570, + 152506, + 152544, + 152505, + 152547, + 152557, + 152587, + 152535, + 152523, + 152519, + 152551, + 163678, + 152533, + 152535, + 152999, + 152550, + 152559, + 152511, + 152525, + 152508, + 152516, + 152526, + 152543, + 152545, + 152548, + 152547, + 152573, + 152498, + 152497, + 152512, + 152501, + 152527, + 152543, + 152558, + 152511, + 152540, + 152519, + 152483, + 152506, + 152585, + 152536, + 152533, + 152544, + 152524, + 152534, + 152539, + 152539, + 152521, + 152538, + 152517, + 152539, + 152530, + 152539, + 152531, + 152529, + 152553, + 152509, + 152515, + 152552, + 152517, + 152509, + 152553, + 152525, + 152533, + 152517, + 152540, + 152515, + 152530, + 152496, + 152625, + 152547, + 152533, + 152517, + 152482, + 152518, + 152512, + 152534, + 152517, + 152539, + 152492, + 152515, + 152513, + 152494, + 152528, + 152522, + 152540, + 152535, + 152569, + 152526, + 152507, + 152539, + 152511, + 152501, + 152534, + 152532, + 152537, + 152540, + 152546, + 152506, + 152517, + 152546, + 152524, + 152554, + 152505, + 152514, + 152550, + 152507, + 152503, + 152528, + 152526, + 152556, + 152530, + 152519, + 152514, + 152558, + 152533, + 152531, + 152536, + 152565, + 152528, + 152541, + 152522, + 152535, + 152516, + 152550, + 152593, + 152502, + 152504, + 152576, + 152522, + 152549, + 152510, + 152549, + 152539, + 152510, + 152498, + 152503, + 152534, + 152527, + 152507, + 152503, + 152514, + 152523, + 152566, + 152517, + 152511, + 152511, + 152489, + 152542, + 152487, + 152528, + 152528, + 152902, + 152549, + 152516, + 152527, + 152514, + 152537, + 152519, + 152526, + 152533, + 152514, + 152497, + 152557, + 152515, + 152512, + 152527, + 152501, + 152505, + 152530, + 152545, + 152545, + 152497, + 152509, + 152504, + 152542, + 152526, + 152538, + 152530, + 152535, + 152519, + 152540, + 152502, + 152501, + 152544, + 152524, + 152534, + 152484, + 152541, + 152532, + 152530, + 152504, + 152562, + 152542, + 152532, + 152509, + 152515, + 152543, + 152556, + 152536, + 152524, + 152535, + 152521, + 152516, + 152520, + 152553, + 152498, + 152551, + 152568, + 152497, + 152515, + 152526, + 152522, + 152506, + 152531, + 152512, + 152529, + 152498, + 152496, + 152535, + 152546, + 152527, + 152544, + 152533, + 152517, + 152502, + 152524, + 152505, + 152549, + 152543, + 152509, + 152529, + 152529, + 152570, + 152535, + 152570, + 152549, + 152539, + 152503, + 152528, + 152505, + 152515, + 152675, + 152540, + 152503, + 152511, + 152495, + 152533, + 152531, + 152511, + 152489, + 152542, + 152526, + 152553, + 152567, + 152535, + 152502, + 152520, + 152543, + 152515, + 152525, + 152517, + 152529, + 152544, + 152551, + 152539, + 152517, + 152586, + 152551, + 152512, + 152533, + 152536, + 152529, + 152528, + 152536, + 152523, + 152522, + 152538, + 152527, + 152527, + 152547, + 152507, + 152531, + 152540, + 152505, + 152542, + 152529, + 152545, + 152548, + 152540, + 152517, + 152519, + 152533, + 152505, + 152503, + 152518, + 152524, + 152560, + 152507, + 152503, + 152541, + 152535, + 152528, + 152557, + 152534, + 152516, + 152523, + 152564, + 152522, + 152520, + 152534, + 152550, + 152537, + 152532, + 152543, + 152512, + 152533, + 152556, + 152491, + 152556, + 152523, + 152519, + 152534, + 152492, + 152541, + 152520, + 152511, + 152538, + 152513, + 152525, + 152513, + 152506, + 152537, + 152510, + 152519, + 152533, + 152536, + 152524, + 152514, + 152511, + 152500, + 152540, + 152548, + 152535, + 152521, + 152515, + 152524, + 152538, + 152502, + 152520, + 152519, + 152524, + 152565, + 152526, + 152516, + 152511, + 152514, + 152540, + 152554, + 152513, + 152545, + 152540, + 152519, + 152517, + 152536, + 152530, + 152507, + 152495, + 152515, + 152546, + 152553, + 152538, + 152526, + 152502, + 152537, + 152531, + 152514, + 152551, + 152518, + 152551, + 152503, + 152530, + 152533, + 152502, + 152517, + 152532, + 152538, + 152544, + 152517, + 152526, + 152533, + 152528, + 152514, + 152532, + 152512, + 152546, + 152533, + 152508, + 152544, + 152522, + 152514, + 152560, + 152524, + 152516, + 152497, + 152512, + 152498, + 152549, + 152528, + 152505, + 152476, + 152527, + 152566, + 152502, + 152521, + 152527, + 152526, + 152550, + 152505, + 152536, + 152518, + 152537, + 152545, + 152536, + 152503, + 152518, + 152514, + 152519, + 152513, + 152533, + 152506, + 152522, + 152523, + 152516, + 152488, + 152511, + 152532, + 152514, + 152528, + 152502, + 152536, + 152542, + 152544, + 152532, + 152557, + 152549, + 152535, + 152544, + 152504, + 152566, + 152520, + 152496, + 152552, + 152511, + 152511, + 152492, + 152544, + 152510, + 152525, + 152549, + 152510, + 152528, + 152533, + 152499, + 152479, + 152546, + 152488, + 152523, + 152548, + 152541, + 152490, + 152530, + 152545, + 152518, + 152540, + 152527, + 152531, + 152539, + 152515, + 152542, + 152536, + 152514, + 152549, + 152521, + 152577, + 152546, + 152504, + 152538, + 152616, + 152530, + 152545, + 152532, + 152490, + 152529, + 152565, + 152504, + 152514, + 152558, + 152487, + 152530, + 152511, + 152517, + 152535, + 152510, + 152531, + 152499, + 152528, + 152508, + 152533, + 152566, + 152544, + 152564, + 152560, + 152518, + 152546, + 152507, + 152530, + 152512, + 152501, + 152519, + 152531, + 152542, + 152512, + 152515, + 152551, + 152567, + 152536, + 152534, + 152503, + 152523, + 152542, + 152559, + 152531, + 152535, + 152526, + 152515, + 152537, + 152530, + 152530, + 152594, + 152602, + 152548, + 152504, + 152520, + 152535, + 152534, + 152513, + 152504, + 152530, + 152539, + 152592, + 152528, + 152531, + 152507, + 152519, + 152527, + 152511, + 152543, + 152492, + 152517, + 152499, + 152531, + 152520, + 152510, + 152524, + 152488, + 152539, + 152553, + 152508, + 152544, + 152558, + 152498, + 152491, + 152525, + 152512, + 152530, + 152547, + 152539, + 152505, + 152530, + 152527, + 152553, + 152534, + 152518, + 152524, + 152512, + 152525, + 152535, + 152519, + 152540, + 152545, + 152526, + 152590, + 152513, + 152547, + 152535, + 152517, + 152526, + 152516, + 152504, + 152523, + 152542, + 152516, + 152519, + 152562, + 152503, + 152560, + 152554, + 152543, + 152533, + 152543, + 152551, + 152533, + 152519, + 152525, + 152540, + 152547, + 152522, + 152531, + 152508, + 152508, + 152544, + 152522, + 152547, + 152545, + 152518, + 152554, + 152515, + 152508, + 152545, + 152518, + 152546, + 152564, + 152508, + 152508, + 152501, + 152520, + 152559, + 152543, + 152494, + 152544, + 152525, + 152502, + 152532, + 152551, + 152525, + 152523, + 152551, + 152527, + 152504, + 152537, + 152526, + 152529, + 152515, + 152533, + 152531, + 152660, + 152535, + 152513, + 152550, + 152523, + 152525, + 152528, + 152536, + 152547, + 152534, + 152514, + 152530, + 152525, + 152535, + 152561, + 152526, + 152515, + 152504, + 152534, + 152530, + 152570, + 152567, + 152546, + 152574, + 152547, + 152544, + 152523, + 152516, + 152508, + 152538, + 152527, + 152527, + 152524, + 152541, + 152498, + 152510, + 152527, + 152536, + 152500, + 152525, + 152513, + 152551, + 152509, + 152538, + 152535, + 152545, + 152518, + 152502, + 152522, + 152541, + 152556, + 152546, + 152493, + 152546, + 152522, + 152543, + 152533, + 152519, + 152535, + 152540, + 152525, + 152541, + 152521, + 152513, + 152550, + 152489, + 152547, + 152553, + 152506, + 152557, + 152538, + 152498, + 152494, + 152511, + 152533, + 152572, + 152580, + 152514, + 152528, + 152505, + 152530, + 152535, + 152537, + 152528, + 152548, + 152533, + 152526, + 152536, + 152536, + 152496, + 152531, + 152509, + 152546, + 152507, + 152533, + 152512, + 152540, + 152516, + 152527, + 152502, + 152526, + 152527, + 152510, + 152542, + 152588, + 152555, + 152510, + 152539, + 152542, + 152522, + 152574, + 152540, + 152530, + 152542, + 152553, + 152555, + 152536, + 152536, + 152548, + 152572, + 152559, + 152526, + 152525, + 152531, + 152519, + 152556, + 152529, + 152507, + 152504, + 152562, + 152508, + 152550, + 152973, + 152516, + 152495, + 152536, + 152533, + 152562, + 152503, + 152506, + 152523, + 152491, + 152534, + 152500, + 152508, + 152537, + 152539, + 152530, + 152511, + 152549, + 152512, + 152508, + 152504, + 152505, + 152517, + 152534, + 152486, + 152530, + 152522, + 152504, + 152523, + 152496, + 152532, + 152541, + 152539, + 152534, + 152531, + 152533, + 152519, + 152526, + 152530, + 152528, + 152538, + 152507, + 152512, + 152502, + 152500, + 152517, + 152486, + 152511, + 152548, + 152513, + 152546, + 152555, + 152509, + 152486, + 152525, + 152536, + 152544, + 152481, + 152531, + 152488, + 152538, + 152527, + 152529, + 152514, + 152525, + 152520, + 152560, + 152528, + 152514, + 152514, + 152540, + 152535, + 152496, + 152534, + 152517, + 152513, + 152522, + 152533, + 152518, + 152515, + 152491, + 152534, + 152529, + 152523, + 152584, + 152510, + 152525, + 152547, + 152514, + 152504, + 152515, + 152501, + 152526, + 152559, + 152480, + 152523, + 152506, + 152505, + 152486, + 152548, + 152495, + 152516, + 152519, + 152535, + 152515, + 152525, + 152526, + 152498, + 152526, + 152517, + 152493, + 153726, + 152538, + 152532, + 152489, + 152489, + 152524, + 152530, + 152525, + 152555, + 152504, + 152519, + 152483, + 152525, + 152509, + 152528, + 152484, + 152525, + 152504, + 152519, + 152581, + 152534, + 152495, + 152510, + 152499, + 152515, + 152530, + 152568, + 152572, + 152546, + 152524, + 152498, + 152495, + 152512, + 152522, + 152526, + 152502, + 152514, + 152526, + 152510, + 152534, + 152547, + 152489, + 152529, + 152559, + 152538, + 152511, + 152532, + 152525, + 152589, + 152521, + 152554, + 152522, + 152536, + 152526, + 152529, + 152529, + 152549, + 152551, + 152534, + 152545, + 152516, + 152550, + 152526, + 152505, + 152540, + 152524, + 152537, + 152518, + 152533, + 152506, + 152526, + 152531, + 152512, + 152520, + 152510, + 152518, + 152538, + 152514, + 152497, + 152536, + 152524, + 152548, + 152533, + 152517, + 152542, + 152493, + 152504, + 152504, + 152518, + 152508, + 152507, + 152500, + 152529, + 152554, + 152535, + 152551, + 152503, + 152522, + 152540, + 152538, + 152506, + 152506, + 152522, + 152524, + 152503, + 152531, + 152504, + 152535, + 152522, + 152513, + 152539, + 152503, + 152517, + 152536, + 152525, + 152506, + 152546, + 152524, + 152533, + 152502, + 152525, + 152520, + 152516, + 152511, + 152505, + 152543, + 152563, + 152533, + 152515, + 152529, + 152543, + 152548, + 152510, + 152521, + 152541, + 152544, + 152528, + 152542, + 152532, + 152561, + 152523, + 152530, + 152539, + 152510, + 152523, + 152547, + 152499, + 152517, + 152527, + 152532, + 152536, + 152513, + 152507, + 152511, + 152510, + 152496, + 152487, + 152513, + 152513, + 152537, + 152531, + 152518, + 152549, + 152511, + 152519, + 152541, + 152540, + 152562, + 152536, + 152549, + 152656, + 152550, + 152526, + 152508, + 152530, + 152529, + 152504, + 152553, + 152646, + 152512, + 152563, + 152517, + 152540, + 152495, + 152531, + 152501, + 152587, + 152535, + 152523, + 152545, + 152560, + 152525, + 152523, + 152526, + 152519, + 152551, + 152527, + 152545, + 152500, + 152504, + 152525, + 152532, + 152529, + 152504, + 152503, + 152496, + 152497, + 152525, + 152494, + 152553, + 152542, + 152522, + 152535, + 152516, + 152538, + 152532, + 152537, + 152553, + 152518, + 152523, + 152510, + 152551, + 152545, + 152535, + 152526, + 152540, + 152531, + 152544, + 152529, + 152521, + 152537, + 152518, + 152504, + 152536, + 152550, + 152528, + 152505, + 152509, + 152487, + 152528, + 152524, + 152531, + 152524, + 152520, + 152558, + 152555, + 152506, + 152532, + 152512, + 152546, + 152552, + 152527, + 152506, + 152507, + 152526, + 152532, + 152538, + 152516, + 152505, + 152534, + 152531, + 152532, + 152546, + 152520, + 152516, + 152511, + 152515, + 152523, + 152560, + 152518, + 152510, + 152534, + 152511, + 152529, + 152539, + 152528, + 152570, + 152536, + 152533, + 152511, + 152514, + 152543, + 152516, + 152530, + 152533, + 152507, + 152502, + 152502, + 152547, + 152527, + 152502, + 152511, + 152530, + 152510, + 152538, + 152523, + 152505, + 152523, + 152683, + 152517, + 152534, + 152541, + 152524, + 152530, + 152803, + 152494, + 152521, + 152510, + 152517, + 152495, + 152523, + 152520, + 152510, + 152553, + 152499, + 152490, + 152518, + 152529, + 152525, + 152503, + 152560, + 152534, + 152523, + 152537, + 152524, + 152534, + 152521, + 152529, + 152530, + 152521, + 152512, + 152548, + 152517, + 152543, + 152543, + 152533, + 152525, + 152504, + 152520, + 152541, + 152516, + 152535, + 152509, + 152518, + 152582, + 152523, + 152507, + 152544, + 152516, + 152556, + 152503, + 152519, + 152517, + 152529, + 152526, + 152513, + 152509, + 152566, + 152527, + 152539, + 152557, + 152545, + 152528, + 152520, + 152519, + 152506, + 152520, + 152502, + 152512, + 152526, + 152538, + 152528, + 152504, + 152511, + 152557, + 152517, + 152515, + 152525, + 152535, + 152515, + 152534, + 152513, + 152504, + 152537, + 152525, + 152519, + 152511, + 152530, + 152516, + 152522, + 152510, + 152523, + 152541, + 152554, + 152516, + 152529, + 152535, + 152525, + 152519, + 152508, + 152486, + 152534, + 152536, + 152501, + 152517, + 152540, + 152528, + 152557, + 152518, + 152499, + 152533, + 152528, + 152537, + 152549, + 152499, + 152556, + 152540, + 152518, + 152539, + 152532, + 152532, + 152545, + 152535, + 152554, + 152506, + 152489, + 152530, + 152514, + 152537, + 152518, + 152560, + 152497, + 152520, + 152542, + 152543, + 152541, + 152499, + 152532, + 152540, + 152543, + 152523, + 152499, + 152540, + 152533, + 152521, + 152503, + 152533, + 152538, + 152525, + 152520, + 152531, + 152495, + 152527, + 152536, + 152505, + 152545, + 152511, + 152492, + 152488, + 152520, + 152501, + 152509, + 152530, + 152526, + 152589, + 152552, + 152549, + 152525, + 152518, + 152512, + 152532, + 152507, + 152520, + 152518, + 152538, + 152511, + 152528, + 152550, + 152510, + 152491, + 152518, + 152522, + 152526, + 152525, + 152524, + 152504, + 152524, + 152531, + 152515, + 152495, + 152541, + 152528, + 152539, + 152481, + 152504, + 152518, + 152535, + 152526, + 152571, + 152497, + 152523, + 152518, + 152538, + 152496, + 152557, + 152556, + 152517, + 152518, + 152527, + 152534, + 152559, + 152535, + 152503, + 152528, + 152550, + 152516, + 152552, + 152526, + 152494, + 152518, + 152509, + 152534, + 152542, + 152527, + 152524, + 152493, + 152536, + 152511, + 152511, + 152530, + 152516, + 152533, + 152511, + 152566, + 152523, + 152525, + 152529, + 152517, + 152562, + 152506, + 152512, + 152511, + 152536, + 152547, + 152517, + 152535, + 152578, + 152478, + 152550, + 152557, + 152534, + 152519, + 152490, + 152532, + 152530, + 152580, + 152521, + 152540, + 152535, + 152510, + 152529, + 152525, + 152558, + 152532, + 152520, + 152516, + 152506, + 152530, + 152546, + 152516, + 152544, + 152559, + 152551, + 152543, + 152518, + 152503, + 152540, + 152579, + 152554, + 152541, + 152590, + 152523, + 152529, + 152515, + 152512, + 152517, + 152498, + 152499, + 152512, + 152537, + 152527, + 152513, + 152556, + 152518, + 152507, + 152534, + 152510, + 152508, + 152511, + 152484, + 152535, + 152500, + 152499, + 152562, + 152516, + 152532, + 152499, + 152502, + 152513, + 152555, + 152541, + 152517, + 152543, + 152526, + 152516, + 152526, + 152531, + 152526, + 152519, + 152516, + 152518, + 152537, + 152553, + 152548, + 152507, + 152526, + 152546, + 152530, + 152525, + 152513, + 152529, + 152558, + 152542, + 152540, + 152499, + 152531, + 152531, + 152529, + 152552, + 152520, + 152505, + 152509, + 152505, + 152505, + 152543, + 152550, + 152508, + 152501, + 152539, + 152526, + 152558, + 152526, + 152544, + 152516, + 152538, + 152547, + 152491, + 152504, + 152554, + 152533, + 152495, + 152523, + 152521, + 152546, + 152518, + 152532, + 152535, + 152519, + 152510, + 152550, + 152543, + 152521, + 152527, + 152515, + 152518, + 152568, + 152513, + 152516, + 152536, + 152555, + 152508, + 152562, + 152527, + 152523, + 152516, + 152501, + 152530, + 152520, + 152493, + 152544, + 152533, + 152567, + 152515, + 152490, + 152528, + 152534, + 152543, + 152513, + 152541, + 152497, + 152506, + 152505, + 152544, + 152505, + 152518, + 152528, + 152518, + 152487, + 152528, + 152507, + 152536, + 152570, + 152525, + 152529, + 152535, + 152506, + 152504, + 152528, + 152510, + 152532, + 152514, + 152541, + 152505, + 152537, + 152510, + 152535, + 152508, + 152531, + 152500, + 152522, + 152545, + 152535, + 152544, + 152547, + 152565, + 152528, + 152545, + 152505, + 152541, + 152521, + 152526, + 152501, + 152520, + 152498, + 152528, + 152534, + 152564, + 152535, + 152533, + 152540, + 152517, + 152536, + 152533, + 152524, + 152519, + 152554, + 152517, + 152547, + 152525, + 152543, + 152504, + 152511, + 152531, + 152515, + 152531, + 152510, + 152537, + 152490, + 152526, + 152501, + 152545, + 152526, + 152542, + 152516, + 152573, + 152549, + 152529, + 152535, + 152508, + 152491, + 152503, + 152529, + 152501, + 152530, + 152502, + 152521, + 152551, + 152528, + 152537, + 152548, + 152534, + 152531, + 152509, + 152490, + 152507, + 152504, + 152504, + 152503, + 152525, + 152560, + 152520, + 152529, + 152513, + 152544, + 152506, + 152508, + 152522, + 152521, + 152547, + 152539, + 152507, + 152535, + 152515, + 152506, + 152499, + 152518, + 152537, + 152534, + 152513, + 152519, + 152539, + 152501, + 152540, + 152485, + 152533, + 152532, + 152528, + 152533, + 152557, + 152529, + 152559, + 152511, + 152509, + 152526, + 152559, + 152495, + 152505, + 152502, + 152538, + 152537, + 152518, + 152524, + 152506, + 152543, + 152532, + 152505, + 152529, + 152551, + 152505, + 152511, + 152498, + 152491, + 152551, + 152505, + 152533, + 152513, + 152501, + 152527, + 152580, + 152536, + 152517, + 152550, + 152524, + 152538, + 152523, + 152533, + 152517, + 152525, + 152546, + 152502, + 152525, + 152522, + 152516, + 152521, + 152545, + 152502, + 152523, + 152532, + 152520, + 152537, + 152534, + 152538, + 152535, + 152491, + 152484, + 152581, + 152543, + 152534, + 152505, + 152509, + 152533, + 152530, + 152546, + 152499, + 152542, + 152521, + 152537, + 152553, + 152530, + 152616, + 152508, + 152528, + 152512, + 152552, + 152541, + 152533, + 152538, + 152509, + 152541, + 152554, + 152502, + 152511, + 152559, + 152555, + 152563, + 152531, + 152523, + 152540, + 152519, + 152536, + 152530, + 152552, + 152514, + 152533, + 152506, + 152520, + 152512, + 152542, + 152512, + 152521, + 152541, + 152510, + 152531, + 152491, + 152523, + 152549, + 152487, + 152534, + 152521, + 152493, + 152515, + 152531, + 152518, + 152528, + 152489, + 152521, + 152507, + 152524, + 152548, + 152500, + 152494, + 152507, + 152529, + 152542, + 152525, + 152508, + 152541, + 152528, + 152568, + 152507, + 152540, + 152520, + 152529, + 152541, + 152531, + 152511, + 152549, + 152512, + 152561, + 152534, + 152526, + 152519, + 152523, + 152539, + 152532, + 152533, + 152535, + 152518, + 152556, + 152526, + 152531, + 152562, + 152550, + 152561, + 152515, + 152517, + 152526, + 152496, + 152492, + 152528, + 152533, + 152521, + 152520, + 152509, + 152494, + 152529, + 152559, + 152564, + 152521, + 152522, + 152529, + 152496, + 152502, + 152542, + 152521, + 152529, + 152540, + 152531, + 152511, + 152488, + 152481, + 152534, + 152511, + 152556, + 152541, + 152510, + 152534, + 152505, + 152505, + 152538, + 152514, + 152542, + 152509, + 152519, + 152507, + 152564, + 152505, + 152526, + 152501, + 152534, + 152519, + 152541, + 152540, + 152536, + 152535, + 152508, + 152497, + 152521, + 152538, + 152545, + 152531, + 152523, + 152517, + 152549, + 152510, + 152517, + 152494, + 152520, + 152509, + 152514, + 152526, + 152539, + 152531, + 152566, + 152513, + 152555, + 152537, + 152508, + 152501, + 152519, + 152514, + 152521, + 152528, + 152514, + 152501, + 152520, + 152518, + 152489, + 152524, + 152509, + 152533, + 152517, + 152503, + 152513, + 152495, + 152545, + 152490, + 152530, + 152489, + 152548, + 152530, + 152526, + 152536, + 152513, + 152530, + 152508, + 152526, + 152499, + 152544, + 152500, + 152546, + 152511, + 152533, + 152510, + 152532, + 152524, + 152515, + 152522, + 152527, + 152552, + 152533, + 152544, + 152535, + 152528, + 152536, + 152542, + 152565, + 152509, + 152528, + 152512, + 152539, + 152527, + 152508, + 152555, + 152525, + 152524, + 152521, + 152517, + 152503, + 152553, + 152519, + 152539, + 152535, + 152528, + 152557, + 152619, + 152554, + 152592, + 152538, + 152523, + 152553, + 152507, + 152536, + 152525, + 152544, + 152553, + 152501, + 152526, + 152522, + 152500, + 152532, + 152493, + 152536, + 152523, + 152522, + 152518, + 152551, + 152532, + 152518, + 152542, + 152531, + 152538, + 152521, + 152519, + 152521, + 152547, + 152512, + 152518, + 152494, + 152528, + 152540, + 152521, + 152577, + 152537, + 152521, + 152549, + 152494, + 152527, + 152514, + 152543, + 152504, + 152512, + 152512, + 152531, + 152530, + 152540, + 152534, + 152545, + 152527, + 152535, + 152501, + 152525, + 152533, + 152533, + 152495, + 152527, + 152499, + 152530, + 152525, + 152525, + 152497, + 152516, + 152511, + 152505, + 152483, + 152515, + 152496, + 152536, + 152502, + 152501, + 152554, + 152569, + 152536, + 152546, + 152526, + 152569, + 152572, + 152542, + 152507, + 152520, + 152502, + 152522, + 152493, + 152525, + 152527, + 152498, + 152500, + 152949, + 152541, + 152487, + 152530, + 152538, + 152488, + 152559, + 152524, + 152521, + 152529, + 152521, + 152520, + 152532, + 152521, + 152541, + 152546, + 152509, + 152548, + 152542, + 152513, + 152521, + 152545, + 152509, + 152514, + 152521, + 152520, + 152512, + 152537, + 152564, + 152549, + 152594, + 152540, + 152537, + 152510, + 152504, + 152505, + 152504, + 152529, + 152540, + 152570, + 152487, + 152528, + 152515, + 152532, + 152549, + 152549, + 152518, + 152512, + 152508, + 152641, + 152489, + 152526, + 152534, + 152516, + 152563, + 152516, + 152538, + 152534, + 152534, + 152536, + 152544, + 152548, + 152535, + 152548, + 152545, + 152548, + 152514, + 152528, + 152540, + 152514, + 152492, + 152526, + 152511, + 152494, + 152540, + 152505, + 152537, + 152533, + 152554, + 152525, + 152534, + 152485, + 152532, + 152526, + 152520, + 152563, + 152534, + 152544, + 152529, + 152513, + 152537, + 152555, + 152534, + 152497, + 152501, + 152535, + 152534, + 152515, + 152516, + 152521, + 152516, + 152532, + 152487, + 152510, + 152512, + 152498, + 152510, + 152508, + 152542, + 152509, + 152532, + 152529, + 152507, + 152538, + 152521, + 152524, + 152535, + 152510, + 152536, + 152523, + 152532, + 152545, + 152527, + 152538, + 152507, + 152533, + 152510, + 152505, + 152494, + 152526, + 152533, + 152540, + 152502, + 152523, + 152496, + 152509, + 152537, + 152535, + 152563, + 152543, + 152566, + 152527, + 152541, + 152505, + 152521, + 152496, + 152522, + 152513, + 152529, + 152520, + 152528, + 152526, + 152502, + 152525, + 152530, + 152516, + 152521, + 152528, + 152551, + 152545, + 152530, + 152513, + 152483, + 152547, + 152528, + 152581, + 152489, + 152531, + 152556, + 152526, + 152528, + 152508, + 152518, + 152507, + 152503, + 152535, + 152525, + 152504, + 152495, + 152546, + 152545, + 152506, + 152509, + 152536, + 152495, + 152499, + 152533, + 152525, + 152542, + 152504, + 152514, + 152520, + 152544, + 152540, + 152575, + 152524, + 152537, + 152535, + 152522, + 152530, + 152549, + 152500, + 152512, + 152521, + 152539, + 152539, + 152546, + 152548, + 152499, + 152536, + 152531, + 152534, + 152523, + 152495, + 152493, + 152537, + 152529, + 152536, + 152525, + 152528, + 152536, + 152503, + 152497, + 152510, + 152512, + 152526, + 152526, + 152545, + 152520, + 152500, + 152540, + 152553, + 152539, + 152523, + 152513, + 152540, + 152525, + 152501, + 152516, + 152527, + 152528, + 152515, + 152511, + 152507, + 152516, + 152535, + 152503, + 152524, + 152527, + 152563, + 152514, + 152516, + 152511, + 152540, + 152519, + 152506, + 152518, + 152555, + 152527, + 152532, + 152534, + 152535, + 152515, + 152536, + 152532, + 152539, + 152491, + 152509, + 152519, + 152521, + 152506, + 152532, + 152521, + 152528, + 152509, + 152538, + 152516, + 152538, + 152505, + 152537, + 152576, + 152517, + 152542, + 152529, + 152541, + 152530, + 152536, + 152563, + 152511, + 152546, + 152534, + 152502, + 152544, + 152509, + 152514, + 152516, + 152554, + 152560, + 152523, + 152505, + 152535, + 152514, + 152523, + 152494, + 152510, + 152532, + 152491, + 152506, + 152507, + 152570, + 152511, + 152508, + 152537, + 152524, + 152540, + 152534, + 152503, + 152517, + 152501, + 152515, + 152546, + 152492, + 152525, + 152511, + 152542, + 152507, + 152527, + 152501, + 152518, + 152536, + 152520, + 152525, + 152550, + 152507, + 152534, + 152530, + 152508, + 152534, + 152516, + 152501, + 152577, + 152552, + 152501, + 152512, + 152527, + 152494, + 152509, + 152512, + 152520, + 152526, + 152541, + 152491, + 152543, + 152552, + 152517, + 152523, + 152529, + 152533, + 152541, + 152533, + 152571, + 152547, + 152524, + 152542, + 152495, + 152511, + 152528, + 152519, + 152536, + 152542, + 152522, + 152522, + 152507, + 152509, + 152554, + 152530, + 152522, + 152536, + 152558, + 152562, + 152515, + 152518, + 152522, + 152529, + 152501, + 152547, + 152550, + 152531, + 152545, + 152519, + 152528, + 152521, + 152510, + 152547, + 152530, + 152489, + 152512, + 152522, + 152540, + 152512, + 152524, + 152536, + 152543, + 152498, + 152514, + 152525, + 152525, + 152545, + 152513, + 152580, + 152516, + 152544, + 152521, + 152518, + 152529, + 152530, + 152497, + 152494, + 152534, + 152507, + 152613, + 152540, + 152518, + 152512, + 152493, + 152527, + 152526, + 152491, + 152534, + 152548, + 152517, + 152483, + 152538, + 152492, + 152546, + 152529, + 152511, + 152517, + 152533, + 152547, + 152544, + 152521, + 152724, + 152543, + 152533, + 152531, + 152508, + 152524, + 152518, + 152508, + 152544, + 152547, + 152521, + 152535, + 152519, + 152497, + 152525, + 152547, + 152496, + 152507, + 152538, + 152530, + 152520, + 152511, + 152495, + 152499, + 152550, + 152509, + 152532, + 152797, + 152569, + 152543, + 152562, + 152540, + 152527, + 152529, + 152521, + 152505, + 152527, + 152506, + 152565, + 152534, + 152496, + 152526, + 152514, + 152506, + 152534, + 152510, + 152550, + 152538, + 152559, + 152561, + 152541, + 152544, + 152535, + 152515, + 152536, + 152519, + 152541, + 152544, + 152521, + 152485, + 152541, + 152513, + 152527, + 152522, + 152531, + 152493, + 152537, + 152530, + 152506, + 152526, + 152538, + 152524, + 152525, + 152542, + 152520, + 152760, + 152691, + 152527, + 152502, + 152547, + 152541, + 152525, + 152537, + 152502, + 152539, + 152508, + 152516, + 152511, + 152511, + 152492, + 152518, + 152496, + 152523, + 152543, + 152533, + 152517, + 152566, + 152533, + 152523, + 152511, + 152537, + 152519, + 152540, + 152525, + 152529, + 152500, + 152526, + 152552, + 152533, + 152522, + 152523, + 152561, + 152534, + 152525, + 152555, + 152506, + 152563, + 152536, + 152518, + 152524, + 152489, + 152542, + 152500, + 152532, + 152508, + 152512, + 152528, + 152491, + 152504, + 152513, + 152527, + 152547, + 152532, + 152541, + 152506, + 152524, + 152533, + 152504, + 152538, + 152541, + 152565, + 152527, + 152517, + 152579, + 152515, + 152572, + 152492, + 152533, + 152576, + 152514, + 152532, + 152551, + 152538, + 152505, + 152526, + 152535, + 152518, + 152536, + 152506, + 152520, + 152518, + 152531, + 152505, + 152511, + 152512, + 152537, + 152541, + 152522, + 152520, + 152524, + 152505, + 152525, + 152514, + 152505, + 152525, + 152557, + 152550, + 152501, + 152549, + 152533, + 152535, + 152528, + 152549, + 152520, + 152535, + 152512, + 152537, + 152511, + 152506, + 152522, + 152513, + 152528, + 152558, + 152514, + 152550, + 152538, + 152511, + 152559, + 152528, + 152546, + 152581, + 152532, + 152519, + 152515, + 152527, + 152541, + 152533, + 152503, + 152524, + 152495, + 152523, + 152547, + 152530, + 152529, + 152523, + 152512, + 152534, + 152540, + 152546, + 152513, + 152550, + 152586, + 152539, + 152525, + 152496, + 152499, + 152521, + 152522, + 152504, + 152508, + 152548, + 152498, + 152502, + 152501, + 152526, + 152527, + 152492, + 152543, + 152545, + 152521, + 152527, + 152498, + 152527, + 152531, + 152513, + 152502, + 152518, + 152524, + 152494, + 152508, + 152533, + 152515, + 152506, + 152501, + 152508, + 152530, + 152495, + 152514, + 152531, + 152516, + 152517, + 152500, + 152527, + 152522, + 152542, + 152498, + 152548, + 152525, + 152522, + 152572, + 152509, + 152529, + 152540, + 152525, + 152542, + 152535, + 152546, + 152514, + 152540, + 152521, + 152514, + 152509, + 152523, + 152526, + 152540, + 152516, + 152521, + 152538, + 152511, + 152519, + 152509, + 152538, + 152506, + 152513, + 152539, + 152538, + 152535, + 152531, + 152526, + 152518, + 152543, + 152497, + 152534, + 152509, + 152524, + 152533, + 152519, + 152544, + 152538, + 152532, + 152510, + 152569, + 152531, + 152539, + 152508, + 152506, + 152539, + 152499, + 152499, + 152493, + 152533, + 152504, + 152522, + 152497, + 152527, + 152554, + 152534, + 152521, + 152532, + 152506, + 152518, + 152511, + 152562, + 152543, + 152544, + 152520, + 152528, + 152581, + 152516, + 152559, + 152538, + 152524, + 152539, + 152504, + 152527, + 152503, + 152527, + 152501, + 152497, + 152537, + 152528, + 152544, + 152531, + 152499, + 152514, + 152515, + 152553, + 152541, + 152532, + 152522, + 152525, + 152483, + 152534, + 152541, + 152515, + 152503, + 152541, + 152604, + 152551, + 152534, + 152516, + 152533, + 152573, + 152487, + 152531, + 152530, + 152503, + 152536, + 152545, + 152516, + 152535, + 152520, + 152516, + 152513, + 152521, + 152518, + 152495, + 152488, + 152500, + 152525, + 152507, + 152557, + 152512, + 152499, + 152504, + 152520, + 152529, + 152545, + 152554, + 152500, + 152512, + 152502, + 152536, + 152500, + 152544, + 152528, + 152529, + 152551, + 152525, + 152531, + 152526, + 152512, + 152504, + 152499, + 152530, + 152498, + 152522, + 152562, + 152558, + 152502, + 152492, + 152517, + 152507, + 152550, + 152555, + 152532, + 152504, + 152505, + 152525, + 152543, + 152520, + 152550, + 152512, + 152535, + 152533, + 152522, + 152511, + 152531, + 152539, + 152514, + 152512, + 152500, + 152520, + 152493, + 152529, + 152512, + 152536, + 152520, + 152541, + 152535, + 152533, + 152531, + 152543, + 152516, + 152528, + 152539, + 152509, + 152532, + 152559, + 152526, + 152508, + 152499, + 152491, + 152541, + 152537, + 152499, + 152550, + 152537, + 152525, + 152502, + 152513, + 152530, + 152517, + 152510, + 152507, + 152514, + 152520, + 152533, + 152501, + 152521, + 152546, + 152540, + 152515, + 152543, + 152490, + 152562, + 152528, + 152508, + 152509, + 152551, + 152519, + 152548, + 152547, + 152502, + 152520, + 152516, + 152512, + 152539, + 152531, + 152538, + 152525, + 152514, + 152532, + 152515, + 152514, + 152525, + 152536, + 152542, + 152504, + 152528, + 152524, + 152502, + 152531, + 153079, + 152520, + 152533, + 152510, + 152523, + 152563, + 152543, + 152533, + 152507, + 152562, + 152521, + 152505, + 152525, + 152513, + 152531, + 152543, + 152544, + 152532, + 152551, + 152522, + 152508, + 152514, + 152508, + 152533, + 152512, + 152544, + 152519, + 152523, + 152556, + 152540, + 152541, + 152551, + 152521, + 152543, + 152534, + 152528, + 152544, + 152527, + 152515, + 152481, + 152535, + 152546, + 152489, + 152519, + 152517, + 152500, + 152531, + 152543, + 152524, + 152516, + 152520, + 152536, + 152507, + 152554, + 152525, + 152525, + 152507, + 152511, + 152505, + 152543, + 152508, + 152543, + 152548, + 152500, + 152523, + 152587, + 152535, + 152522, + 152497, + 152513, + 152513, + 152525, + 152533, + 152531, + 152504, + 152503, + 152522, + 152519, + 152535, + 152515, + 152521, + 152541, + 152525, + 152512, + 152560, + 152512, + 152524, + 152503, + 152528, + 152515, + 152507, + 152526, + 152503, + 152507, + 152490, + 152497, + 152503, + 152539, + 152534, + 152543, + 152507, + 152488, + 152513, + 152514, + 152504, + 152531, + 152506, + 152506, + 152543, + 152501, + 152513, + 152524, + 152534, + 152523, + 152527, + 152530, + 152544, + 152544, + 152530, + 152523, + 152500, + 152523, + 152509, + 152550, + 152602, + 152510, + 152538, + 152510, + 152527, + 152562, + 152526, + 152516, + 152540, + 152570, + 152523, + 152530, + 152524, + 152525, + 152550, + 152522, + 152533, + 152552, + 152543, + 152545, + 152525, + 152515, + 152498, + 152541, + 152527, + 152526, + 152524, + 152503, + 152522, + 152503, + 152506, + 152516, + 152504, + 152539, + 152544, + 152546, + 152493, + 152507, + 152575, + 152508, + 152532, + 152517, + 152520, + 152565, + 152499, + 152553, + 152559, + 152549, + 152507, + 152500, + 152544, + 152551, + 152555, + 152567, + 152530, + 152551, + 152544, + 152525, + 152540, + 152524, + 152534, + 152521, + 152531, + 152517, + 152518, + 152533, + 152524, + 152503, + 152501, + 152556, + 152523, + 152522, + 152528, + 152518, + 152523, + 152528, + 152543, + 152506, + 152528, + 152526, + 152510, + 152518, + 152530, + 152529, + 152545, + 152533, + 152542, + 152509, + 152508, + 152496, + 152514, + 152532, + 152528, + 152538, + 152561, + 152553, + 152558, + 152524, + 152567, + 152577, + 152575, + 152531, + 152523, + 152528, + 152530, + 152489, + 152516, + 152506, + 152522, + 152515, + 152525, + 152521, + 152554, + 152512, + 152512, + 152521, + 152525, + 152511, + 152538, + 152520, + 152570, + 152546, + 152550, + 152541, + 152523, + 152515, + 152531, + 152555, + 152520, + 152518, + 152537, + 152518, + 152546, + 152511, + 152497, + 152545, + 152511, + 152498, + 152522, + 152532, + 152543, + 152512, + 152508, + 152525, + 152529, + 152542, + 152514, + 152563, + 152553, + 152513, + 152508, + 152501, + 152517, + 153123, + 152512, + 152524, + 152535, + 152542, + 152541, + 152489, + 152502, + 152520, + 152508, + 152506, + 152510, + 152537, + 152505, + 152535, + 152533, + 152551, + 152493, + 152525, + 152488, + 152505, + 152480, + 152550, + 152500, + 152526, + 152549, + 152562, + 152501, + 152555, + 152483, + 152496, + 152506, + 152498, + 152546, + 152491, + 152536, + 152539, + 152502, + 152515, + 152517, + 152531, + 152513, + 152524, + 152512, + 152517, + 152551, + 152521, + 152479, + 152506, + 152517, + 152525, + 152506, + 152505, + 152506, + 152509, + 152509, + 152548, + 152542, + 152534, + 152513, + 152518, + 152477, + 152532, + 152507, + 152524, + 152516, + 152507, + 152585, + 152532, + 152524, + 152516, + 152566, + 152521, + 152508, + 152583, + 152542, + 152533, + 152527, + 152540, + 152506, + 152509, + 152496, + 152543, + 152534, + 152536, + 152546, + 152537, + 152520, + 152567, + 152554, + 152505, + 152490, + 152520, + 152517, + 152505, + 152489, + 152495, + 152532, + 152525, + 152502, + 152535, + 152498, + 152552, + 152518, + 152517, + 152521, + 152492, + 152520, + 152537, + 152495, + 152542, + 152516, + 152528, + 152498, + 152511, + 152525, + 152539, + 152600, + 152569, + 152539, + 152530, + 152499, + 152517, + 152509, + 152515, + 152542, + 152509, + 152500, + 152541, + 152535, + 152510, + 152512, + 152541, + 152527, + 152493, + 152513, + 152537, + 152530, + 152528, + 152572, + 152541, + 152524, + 152490, + 152517, + 152546, + 152515, + 152483, + 152536, + 152561, + 152512, + 152493, + 152519, + 152553, + 152551, + 152531, + 152512, + 152511, + 152556, + 152516, + 152513, + 152498, + 152511, + 152537, + 152502, + 152529, + 152517, + 152545, + 152530, + 152527, + 152524, + 152499, + 152529, + 152526, + 152527, + 152488, + 152545, + 152533, + 152519, + 152551, + 152519, + 152520, + 152540, + 152531, + 152540, + 152486, + 152526, + 152539, + 152506, + 152538, + 152536, + 152654, + 152537, + 152509, + 152549, + 152533, + 152500, + 152523, + 152531, + 152486, + 152494, + 152515, + 152515, + 152565, + 152515, + 152541, + 152518, + 152501, + 152551, + 152543, + 152563, + 152525, + 152551, + 152550, + 152514, + 152504, + 152527, + 152511, + 152506, + 152540, + 152531, + 152517, + 152516, + 152524, + 152514, + 152550, + 152494, + 152549, + 152557, + 152494, + 152522, + 152519, + 152531, + 152538, + 152509, + 152528, + 152489, + 152509, + 152505, + 152548, + 152533, + 152517, + 152538, + 152513, + 152548, + 152514, + 152559, + 152558, + 152488, + 152528, + 152523, + 152534, + 152509, + 152497, + 152527, + 152516, + 152514, + 152543, + 152539, + 152529, + 152512, + 152516, + 152529, + 152570, + 152526, + 152520, + 152487, + 152540, + 152538, + 152562, + 152500, + 152519, + 152515, + 152528, + 152517, + 152514, + 152559, + 152494, + 152531, + 152541, + 152509, + 152535, + 152495, + 152501, + 152516, + 152505, + 152498, + 152495, + 152530, + 152550, + 152508, + 152528, + 152532, + 152531, + 152531, + 152484, + 152520, + 152537, + 152559, + 152535, + 152512, + 152509, + 152529, + 152535, + 152493, + 152528, + 152537, + 152505, + 152511, + 152544, + 152542, + 152504, + 152552, + 152510, + 152522, + 152532, + 152517, + 152525, + 152538, + 152499, + 152488, + 152503, + 152489, + 152523, + 152547, + 152524, + 152505, + 152504, + 152536, + 152495, + 152514, + 152520, + 152525, + 152552, + 152530, + 152541, + 152506, + 152496, + 152526, + 152520, + 152497, + 152508, + 152505, + 152509, + 152509, + 152515, + 152545, + 152503, + 152535, + 152501, + 152535, + 152543, + 152513, + 152530, + 152509, + 152524, + 152563, + 152535, + 152531, + 152550, + 152512, + 152512, + 152545, + 152545, + 152505, + 152528, + 152515, + 152535, + 152498, + 152533, + 152483, + 152529, + 152535, + 152517, + 152523, + 152514, + 152533, + 152518, + 152511, + 152493, + 152531, + 152509, + 152515, + 152507, + 152512, + 152517, + 152493, + 152522, + 152525, + 152572, + 152514, + 152516, + 152508, + 152502, + 152512, + 152525, + 152520, + 152507, + 152496, + 152529, + 152531, + 152536, + 152537, + 152553, + 152501, + 152524, + 152559, + 152519, + 152505, + 152501, + 152496, + 152489, + 152524, + 152517, + 152538, + 152532, + 152504, + 152531, + 152507, + 152509, + 152531, + 152517, + 152508, + 152538, + 152515, + 152507, + 152538, + 152512, + 152502, + 152521, + 152534, + 152494, + 152497, + 152532, + 152512, + 152533, + 152495, + 152533, + 152496, + 152521, + 152509, + 152523, + 152528, + 152540, + 152589, + 152547, + 152519, + 152510, + 152541, + 152557, + 152529, + 152527, + 152514, + 152514, + 152526, + 152549, + 152531, + 152500, + 152520, + 152508, + 152511, + 152527, + 152527, + 152525, + 152488, + 152508, + 152519, + 152536, + 152533, + 152520, + 152522, + 152506, + 152530, + 152538, + 152532, + 152501, + 152523, + 152539, + 152524, + 152508, + 152536, + 152526, + 152498, + 152533, + 152484, + 152544, + 152512, + 152526, + 152539, + 152531, + 152498, + 152523, + 152481, + 152518, + 152524, + 152540, + 152495, + 152523, + 152518, + 152563, + 152505, + 152514, + 152514, + 152606, + 152544, + 152512, + 152541, + 152546, + 152528, + 152519, + 152500, + 152530, + 152496, + 152515, + 152521, + 152517, + 152517, + 152494, + 152511, + 152536, + 152534, + 152532, + 152530, + 152551, + 152510, + 152515, + 152513, + 152543, + 152595, + 152512, + 152503, + 152519, + 152509, + 152522, + 152490, + 152522, + 152521, + 152550, + 152520, + 152530, + 152510, + 152529, + 152491, + 152519, + 152542, + 152514, + 152520, + 152492, + 152532, + 152553, + 152481, + 152522, + 152501, + 152509, + 152511, + 152509, + 153670, + 152887, + 152580, + 152530, + 152531, + 152521, + 152498, + 152541, + 152494, + 152529, + 152524, + 152536, + 152523, + 152515, + 152513, + 152505, + 152523, + 152502, + 152537, + 152525, + 152566, + 152512, + 152511, + 152526, + 152509, + 152537, + 152502, + 152527, + 152547, + 152498, + 152547, + 152532, + 152486, + 152477, + 152523, + 152596, + 152529, + 152503, + 152535, + 152531, + 152538, + 152537, + 152547, + 152546, + 152522, + 152494, + 152539, + 152526, + 152548, + 152529, + 152550, + 152532, + 152521, + 152569, + 152535, + 152520, + 152511, + 152485, + 152491, + 152504, + 152513, + 152525, + 152548, + 152545, + 152507, + 152493, + 152535, + 152553, + 152542, + 152524, + 152515, + 152529, + 152532, + 152500, + 152494, + 152531, + 152506, + 152549, + 152508, + 152501, + 152535, + 152501, + 152595, + 152523, + 152527, + 152513, + 152553, + 152513, + 152505, + 152508, + 152502, + 152550, + 152507, + 152496, + 152512, + 152516, + 152528, + 152530, + 152511, + 152539, + 152507, + 152536, + 152508, + 152506, + 152508, + 152548, + 152510, + 152522, + 152526, + 152527, + 152532, + 152526, + 152504, + 152541, + 152525, + 152527, + 152501, + 152530, + 152526, + 152520, + 152527, + 152552, + 152543, + 152529, + 152501, + 152509, + 152490, + 152518, + 152491, + 152486, + 152498, + 152525, + 152536, + 152540, + 152523, + 152506, + 152512, + 152539, + 152560, + 152547, + 152501, + 152509, + 152508, + 152499, + 152502, + 152528, + 152512, + 152516, + 152527, + 152516, + 152540, + 152535, + 152516, + 152509, + 152548, + 152547, + 152538, + 152607, + 152533, + 152483, + 152483, + 152516, + 152544, + 152531, + 152541, + 152509, + 152525, + 152525, + 152531, + 152530, + 152539, + 152498, + 152530, + 152528, + 152514, + 152517, + 152524, + 152541, + 152518, + 152514, + 152523, + 152537, + 152540, + 152548, + 152502, + 152482, + 152556, + 152514, + 152506, + 152535, + 152499, + 152491, + 152502, + 152539, + 152560, + 152616, + 152519, + 152525, + 152557, + 152528, + 152526, + 152520, + 152489, + 152495, + 152500, + 152508, + 152500, + 152513, + 152504, + 152559, + 152521, + 152510, + 152542, + 152500, + 152535, + 152524, + 152532, + 152526, + 152521, + 152538, + 152525, + 152536, + 152490, + 152539, + 152522, + 152535, + 152543, + 152509, + 152509, + 152519, + 152515, + 152517, + 152508, + 152509, + 152542, + 152540, + 152524, + 152516, + 152530, + 152525, + 152484, + 152514, + 152508, + 152522, + 152532, + 152521, + 152517, + 152559, + 152500, + 152555, + 152528, + 152504, + 152527, + 152513, + 152557, + 152546, + 152530, + 152505, + 152532, + 152525, + 152523, + 152507, + 152501, + 152506, + 152495, + 152534, + 152484, + 152511, + 152592, + 152513, + 152487, + 152562, + 152514, + 152508, + 152528, + 152496, + 152507, + 152572, + 152509, + 152497, + 152498, + 152546, + 152487, + 152555, + 152508, + 152499, + 152510, + 152522, + 152498, + 152521, + 152530, + 152498, + 152549, + 152524, + 152548, + 152504, + 152491, + 152512, + 152506, + 152524, + 152500, + 152506, + 152521, + 152534, + 152499, + 152532, + 152540, + 152541, + 152506, + 152492, + 152520, + 152531, + 152527, + 152527, + 152522, + 152524, + 152490, + 152521, + 152520, + 152523, + 152518, + 152521, + 152545, + 152535, + 152534, + 152536, + 152543, + 152546, + 152497, + 152544, + 152533, + 152531, + 152507, + 152511, + 152544, + 152514, + 152512, + 152526, + 152523, + 152510, + 152522, + 152516, + 152556, + 152550, + 152518, + 152514, + 152520, + 152531, + 152561, + 152541, + 152530, + 152486, + 152534, + 152492, + 152511, + 152504, + 152495, + 152491, + 152518, + 152509, + 152511, + 152551, + 152523, + 152494, + 152548, + 152507, + 152562, + 152531, + 152529, + 152557, + 152530, + 152543, + 152487, + 152544, + 152531, + 152526, + 152528, + 152508, + 152518, + 152551, + 152498, + 152499, + 152522, + 152521, + 152495, + 152531, + 152504, + 152513, + 152552, + 152575, + 152514, + 152536, + 152554, + 152496, + 152507, + 152496, + 152542, + 152496, + 152548, + 152538, + 152498, + 152504, + 152510, + 152536, + 152535, + 152509, + 152503, + 152485, + 152498, + 152551, + 152524, + 152530, + 152545, + 152556, + 152510, + 152512, + 152511, + 152529, + 152531, + 152514, + 152536, + 152501, + 152490, + 152514, + 152521, + 152519, + 152511, + 152532, + 152522, + 152530, + 152515, + 152531, + 152526, + 152536, + 152540, + 152554, + 152501, + 152522, + 152539, + 152517, + 152517, + 152512, + 152475, + 152507, + 152534, + 152512, + 152546, + 152508, + 152537, + 152540, + 152519, + 152509, + 152500, + 152509, + 152511, + 152518, + 152501, + 152534, + 152508, + 152542, + 152521, + 152490, + 152538, + 152520, + 152514, + 152513, + 152564, + 152544, + 152508, + 152537, + 152498, + 152503, + 152507, + 152527, + 152513, + 152514, + 152536, + 152534, + 152518, + 152544, + 152521, + 152500, + 152501, + 152482, + 152507, + 152539, + 152524, + 152517, + 152527, + 152509, + 152513, + 152504, + 152521, + 152513, + 152472, + 152525, + 152494, + 152509, + 152516, + 152495, + 152540, + 152523, + 152494, + 152485, + 152527, + 152514, + 152502, + 152528, + 152512, + 152476, + 152512, + 152526, + 152489, + 152523, + 152521, + 152526, + 152518, + 152523, + 152520, + 152510, + 152505, + 152525, + 152493, + 152494, + 152524, + 152540, + 152505, + 152498, + 152511, + 152504, + 152552, + 152516, + 152512, + 152510, + 152509, + 152531, + 152547, + 152519, + 152500, + 152546, + 152525, + 152531, + 152505, + 152507, + 152518, + 152546, + 152536, + 152497, + 152559, + 152496, + 152494, + 152498, + 152520, + 152556, + 152565, + 152547, + 152496, + 152529, + 152518, + 152509, + 152515, + 152536, + 152531, + 152530, + 152512, + 152505, + 152515, + 152526, + 152541, + 152498, + 152508, + 152504, + 152503, + 152517, + 152542, + 152514, + 152512, + 152511, + 152518, + 152525, + 152532, + 152538, + 152529, + 152499, + 152526, + 152528, + 152527, + 152583, + 152511, + 152530, + 152560, + 152495, + 152520, + 152497, + 152503, + 152510, + 152497, + 152495, + 152528, + 152526, + 152508, + 152507, + 152546, + 152531, + 152530, + 152561, + 152501, + 152499, + 152509, + 152513, + 152495, + 152499, + 152505, + 152525, + 152531, + 152531, + 152535, + 152522, + 152534, + 152569, + 152487, + 152534, + 152504, + 152546, + 152489, + 152536, + 152523, + 152488, + 152512, + 152502, + 152520, + 152522, + 152541, + 152498, + 152501, + 152512, + 152521, + 152948, + 152552, + 152509, + 152506, + 152482, + 152536, + 152524, + 152529, + 152525, + 152512, + 152525, + 152517, + 152541, + 152502, + 152488, + 152505, + 152507, + 152495, + 152544, + 152530, + 152518, + 152496, + 152541, + 152511, + 152522, + 152551, + 152527, + 152514, + 152537, + 152596, + 152518, + 152531, + 152509, + 152539, + 152533, + 152533, + 152501, + 152502, + 152522, + 152513, + 152545, + 152539, + 152547, + 152508, + 152533, + 152496, + 152495, + 152500, + 152539, + 152538, + 152536, + 152558, + 152501, + 152533, + 152512, + 152504, + 152527, + 152544, + 152532, + 152519, + 152495, + 152522, + 152488, + 152496, + 152515, + 152539, + 152510, + 152506, + 152521, + 152513, + 152510, + 152539, + 152538, + 152494, + 152535, + 152512, + 152526, + 152501, + 152517, + 152517, + 152495, + 152520, + 152532, + 152521, + 152563, + 152513, + 152522, + 152563, + 152520, + 152526, + 152505, + 152527, + 152512, + 152490, + 152534, + 152524, + 152561, + 152577, + 152504, + 152534, + 152532, + 152499, + 152545, + 152502, + 152524, + 152523, + 152516, + 152531, + 152541, + 152505, + 152527, + 152525, + 152566, + 152551, + 152502, + 152542, + 152549, + 152540, + 152503, + 152526, + 152551, + 152496, + 152558, + 152516, + 152503, + 152561, + 152515, + 152521, + 152476, + 152526, + 152510, + 152491, + 152538, + 152497, + 152548, + 152497, + 152512, + 152537, + 152527, + 152582, + 152534, + 152526, + 152548, + 152505, + 152528, + 152541, + 152510, + 152512, + 152548, + 152507, + 152518, + 152526, + 152549, + 152554, + 152547, + 152506, + 152503, + 152535, + 152488, + 152517, + 152527, + 152522, + 152490, + 152541, + 152521, + 152500, + 152555, + 152491, + 152520, + 152552, + 152535, + 152506, + 152512, + 152547, + 152526, + 152534, + 152534, + 152500, + 152531, + 152486, + 152535, + 152498, + 152509, + 152518, + 152487, + 152533, + 152544, + 152538, + 152483, + 152532, + 152530, + 152503, + 152507, + 152544, + 152572, + 152542, + 152537, + 152543, + 152549, + 152496, + 152494, + 152522, + 152507, + 152510, + 152502, + 152508, + 152508, + 152502, + 152510, + 152519, + 152506, + 152504, + 152518, + 152512, + 152506, + 152501, + 152523, + 152534, + 152526, + 152525, + 152506, + 152505, + 152540, + 152538, + 152501, + 152550, + 152541, + 152495, + 152550, + 152511, + 152504, + 152488, + 152518, + 152530, + 152487, + 152533, + 152510, + 152519, + 152522, + 152502, + 152510, + 152526, + 152501, + 152533, + 152529, + 152501, + 152492, + 152519, + 152524, + 152551, + 152499, + 152509, + 152524, + 152531, + 152527, + 152549, + 152527, + 152519, + 152530, + 152503, + 152535, + 152523, + 152525, + 152525, + 152525, + 152531, + 152518, + 152528, + 152534, + 152502, + 152516, + 152507, + 152529, + 152544, + 152507, + 152522, + 152532, + 152533, + 152534, + 152553, + 152511, + 152520, + 152532, + 152528, + 152506, + 152535, + 152533, + 152523, + 152558, + 152512, + 152534, + 152551, + 152509, + 152509, + 152550, + 152513, + 152531, + 152518, + 152539, + 152539, + 152519, + 152524, + 152522, + 152575, + 152478, + 152553, + 152529, + 152520, + 152521, + 152550, + 152543, + 152511, + 152527, + 152510, + 152515, + 152515, + 152542, + 152541, + 152697, + 152514, + 152524, + 152525, + 152548, + 152517, + 152515, + 152523, + 152572, + 152533, + 152555, + 152548, + 152543, + 152486, + 152538, + 152574, + 152536, + 152512, + 152530, + 152520, + 152497, + 152538, + 152496, + 152518, + 152537, + 152513, + 152522, + 152521, + 152508, + 152533, + 152538, + 152534, + 152497, + 152536, + 152496, + 152531, + 152500, + 152524, + 152517, + 152536, + 152509, + 152489, + 152544, + 152536, + 152519, + 152501, + 152534, + 152515, + 152532, + 152495, + 152560, + 152500, + 152513, + 152519, + 152519, + 152514, + 152489, + 152528, + 152509, + 152527, + 152544, + 152487, + 152513, + 152514, + 152490, + 152504, + 152521, + 152523, + 152548, + 152521, + 152535, + 152523, + 152513, + 152533, + 152499, + 152485, + 152530, + 152514, + 152528, + 152516, + 152517, + 152519, + 152529, + 152505, + 152514, + 152501, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 154503, + 154468, + 154490, + 154452, + 154474, + 154478, + 154457, + 154496, + 154487, + 154443, + 154483, + 154490, + 154499, + 154505, + 154485, + 154476, + 154491, + 154506, + 154484, + 154505, + 154490, + 154502, + 154472, + 154492, + 154498, + 154518, + 154510, + 154520, + 154462, + 154475, + 154475, + 154471, + 154465, + 154500, + 154480, + 154489, + 154474, + 154514, + 154487, + 154505, + 154493, + 154472, + 154478, + 154469, + 154489, + 154487, + 154533, + 154470, + 154453, + 154481, + 154520, + 154517, + 154473, + 154490, + 154470, + 154509, + 154479, + 154453, + 154521, + 154499, + 154497, + 154468, + 154496, + 154455, + 154498, + 154495, + 154500, + 154465, + 154463, + 154470, + 154475, + 154488, + 154499, + 154463, + 154519, + 154490, + 154504, + 154528, + 154510, + 154478, + 154476, + 154473, + 154469, + 154490, + 154447, + 154495, + 154510, + 154502, + 154506, + 154490, + 154484, + 154490, + 154489, + 154508, + 154488, + 154507, + 154460, + 154474, + 154481, + 154492, + 154533, + 154491, + 154568, + 154494, + 154503, + 154473, + 154491, + 154464, + 154504, + 154493, + 154498, + 154469, + 154465, + 154473, + 154442, + 154490, + 154483, + 154469, + 154463, + 154515, + 154448, + 154452, + 154473, + 154485, + 154512, + 154477, + 154489, + 154557, + 154507, + 154498, + 154503, + 154484, + 154495, + 154503, + 154522, + 154489, + 154488, + 154501, + 154490, + 154473, + 154491, + 154451, + 154513, + 154455, + 154464, + 154481, + 154498, + 154491, + 154481, + 154489, + 154516, + 154487, + 154490, + 154493, + 154497, + 155115, + 154461, + 154467, + 154515, + 154486, + 154467, + 154525, + 154497, + 154483, + 154491, + 154488, + 154510, + 154455, + 154459, + 154474, + 154431, + 154467, + 154523, + 154497, + 154471, + 154483, + 154477, + 154486, + 154448, + 154501, + 154486, + 154531, + 154486, + 154494, + 154465, + 154496, + 154465, + 154494, + 154453, + 154484, + 154473, + 154468, + 154466, + 154493, + 154489, + 154485, + 154455, + 154493, + 154510, + 154490, + 154490, + 154539, + 154490, + 154515, + 154487, + 154467, + 154463, + 154489, + 154468, + 154479, + 154483, + 155137, + 154477, + 154508, + 154462, + 154499, + 154496, + 154468, + 154482, + 154520, + 154484, + 154460, + 154507, + 154482, + 154498, + 154474, + 154504, + 154486, + 154480, + 154454, + 154502, + 154500, + 154493, + 154465, + 154452, + 154640, + 154448, + 154505, + 154479, + 154505, + 154475, + 154510, + 154494, + 154505, + 154488, + 154464, + 154520, + 154530, + 154444, + 154510, + 154488, + 154460, + 154495, + 154492, + 154503, + 154505, + 154455, + 154510, + 154472, + 154489, + 154509, + 154491, + 154473, + 154479, + 154466, + 154466, + 154502, + 154472, + 154473, + 154481, + 154463, + 154481, + 154503, + 154458, + 154477, + 154473, + 154462, + 154475, + 154467, + 154513, + 154461, + 154488, + 154476, + 154501, + 154459, + 154489, + 154478, + 154484, + 154476, + 154472, + 154478, + 154493, + 154492, + 154505, + 154509, + 154543, + 154500, + 154468, + 154493, + 154465, + 154471, + 154488, + 154520, + 154476, + 154502, + 154525, + 154485, + 154478, + 154527, + 154520, + 154515, + 154494, + 154493, + 154497, + 154466, + 154454, + 154469, + 154494, + 154450, + 154485, + 154507, + 154515, + 154527, + 154484, + 154482, + 154497, + 154471, + 154487, + 154512, + 154516, + 154477, + 154465, + 154459, + 154494, + 154538, + 154486, + 154473, + 154499, + 154455, + 154490, + 154499, + 154485, + 154489, + 154482, + 154480, + 154461, + 154479, + 154481, + 154458, + 154538, + 154463, + 154496, + 154498, + 154475, + 154481, + 154495, + 154467, + 154492, + 154477, + 154464, + 154486, + 154489, + 154493, + 154467, + 154485, + 154481, + 154486, + 154470, + 154480, + 154480, + 154492, + 154456, + 154480, + 154453, + 154473, + 154491, + 154494, + 154492, + 154530, + 154472, + 154491, + 154465, + 154499, + 154494, + 154464, + 154517, + 154474, + 154490, + 154508, + 154484, + 154483, + 154494, + 154487, + 154507, + 154501, + 154459, + 154496, + 154480, + 154467, + 154507, + 154498, + 154476, + 154473, + 154482, + 154481, + 154758, + 154519, + 154444, + 154470, + 154493, + 154486, + 154476, + 154474, + 154507, + 154483, + 154462, + 154468, + 154480, + 154489, + 154482, + 154479, + 154462, + 154487, + 154490, + 154488, + 154496, + 154476, + 154440, + 154493, + 154475, + 154464, + 154479, + 154580, + 154500, + 154481, + 154531, + 154489, + 154459, + 154469, + 154495, + 154481, + 154503, + 154513, + 154498, + 154464, + 154521, + 154482, + 154521, + 154482, + 154487, + 154461, + 154492, + 154503, + 154483, + 154495, + 154497, + 154475, + 154433, + 154469, + 154502, + 154533, + 154506, + 154462, + 154475, + 154463, + 154481, + 154477, + 154497, + 154504, + 154489, + 154492, + 154442, + 154476, + 154516, + 154447, + 154467, + 154455, + 154496, + 154485, + 154490, + 154490, + 154536, + 154464, + 154484, + 154488, + 154469, + 154475, + 154491, + 154490, + 154488, + 154461, + 154467, + 154436, + 154489, + 154470, + 154474, + 154468, + 154471, + 154473, + 154460, + 154481, + 154463, + 154499, + 154540, + 154455, + 154507, + 154470, + 154509, + 154495, + 154480, + 154475, + 154456, + 154504, + 154453, + 154501, + 154493, + 154928, + 154466, + 154475, + 154449, + 154473, + 154485, + 154475, + 154466, + 154498, + 154491, + 154491, + 154507, + 154518, + 154499, + 154478, + 154462, + 154502, + 154514, + 154452, + 154484, + 154502, + 154485, + 154551, + 154490, + 154458, + 154499, + 154455, + 154495, + 154524, + 154505, + 154487, + 154506, + 154451, + 154520, + 154484, + 154489, + 154510, + 154458, + 154450, + 154456, + 154482, + 154467, + 154488, + 154469, + 154456, + 154477, + 154453, + 154461, + 154464, + 154491, + 154497, + 154463, + 154472, + 154485, + 154479, + 154501, + 154519, + 154509, + 154467, + 154479, + 154481, + 154472, + 154525, + 154479, + 154465, + 154497, + 154512, + 154519, + 154513, + 154464, + 154479, + 154488, + 154518, + 154467, + 154490, + 154515, + 154494, + 154488, + 154490, + 154510, + 154466, + 154471, + 154482, + 154491, + 154508, + 154473, + 154507, + 154510, + 154511, + 154502, + 154498, + 154493, + 154448, + 154493, + 154484, + 154504, + 154500, + 154460, + 154496, + 154478, + 154485, + 154473, + 154501, + 154479, + 154486, + 154479, + 154493, + 154492, + 154500, + 154465, + 154467, + 154527, + 154505, + 154490, + 154503, + 154485, + 154489, + 154486, + 154496, + 154474, + 154484, + 154493, + 154461, + 154460, + 154477, + 154477, + 154467, + 154500, + 154480, + 154514, + 154489, + 154502, + 154497, + 154498, + 154480, + 154464, + 154489, + 154488, + 154484, + 154508, + 154476, + 154496, + 154475, + 154479, + 154490, + 154467, + 154499, + 154512, + 154500, + 154448, + 154495, + 154495, + 154479, + 154477, + 154473, + 154485, + 154515, + 154489, + 154514, + 154500, + 154499, + 154532, + 154492, + 154468, + 154509, + 154474, + 154485, + 154487, + 154502, + 154454, + 154486, + 154491, + 154454, + 154484, + 154505, + 154490, + 154490, + 154480, + 154509, + 154462, + 154470, + 154471, + 154488, + 154464, + 154509, + 154511, + 154497, + 154494, + 154484, + 154466, + 154477, + 154502, + 154499, + 154477, + 154467, + 154495, + 154468, + 154511, + 154484, + 154523, + 154470, + 154472, + 154502, + 154505, + 154499, + 154482, + 154480, + 154471, + 154511, + 154488, + 154472, + 154488, + 154465, + 154488, + 154496, + 154484, + 154482, + 154493, + 154467, + 154476, + 154488, + 154471, + 154523, + 154512, + 154469, + 154489, + 154494, + 154534, + 154459, + 154496, + 154477, + 154491, + 154478, + 154479, + 154488, + 154493, + 154496, + 154492, + 154493, + 154456, + 154498, + 154511, + 154526, + 154497, + 154476, + 154479, + 154482, + 154454, + 154510, + 154465, + 154531, + 154514, + 154520, + 154492, + 154462, + 154468, + 154501, + 154490, + 154457, + 154490, + 154492, + 154496, + 154504, + 154504, + 154516, + 154496, + 154540, + 154526, + 154484, + 154530, + 154482, + 154470, + 154475, + 154464, + 154468, + 154459, + 154496, + 154504, + 154510, + 154547, + 154506, + 154481, + 154494, + 154469, + 154479, + 154494, + 154452, + 154466, + 154466, + 154456, + 154549, + 154468, + 154485, + 154489, + 154493, + 154472, + 154509, + 154485, + 154497, + 154508, + 154475, + 154466, + 154497, + 154505, + 154511, + 154508, + 154501, + 154489, + 154468, + 154485, + 154485, + 154497, + 154464, + 154468, + 154444, + 154497, + 154471, + 154493, + 154481, + 154467, + 154482, + 154496, + 154493, + 154468, + 154479, + 154475, + 154481, + 154482, + 154492, + 154474, + 154501, + 154498, + 154467, + 154520, + 154483, + 154480, + 154485, + 154483, + 154484, + 154479, + 154531, + 154470, + 154466, + 154496, + 154478, + 154507, + 154457, + 154478, + 154483, + 154499, + 154488, + 154490, + 154486, + 154493, + 154493, + 154499, + 154488, + 154481, + 154665, + 154510, + 154507, + 154500, + 154494, + 154506, + 154508, + 154490, + 154506, + 154465, + 154473, + 154463, + 154458, + 154483, + 154497, + 154480, + 154480, + 154467, + 154472, + 154471, + 154481, + 154506, + 154515, + 154495, + 154620, + 154462, + 154472, + 154491, + 154517, + 154471, + 154460, + 154499, + 154501, + 154461, + 154492, + 154471, + 154492, + 154501, + 154465, + 154490, + 154463, + 154503, + 154525, + 154515, + 154440, + 154490, + 154489, + 154450, + 154504, + 154481, + 154493, + 154491, + 154499, + 154507, + 154476, + 154499, + 154474, + 154544, + 154507, + 154502, + 154506, + 154472, + 154493, + 154460, + 154504, + 154497, + 154493, + 154471, + 154494, + 154478, + 154468, + 154520, + 154500, + 154470, + 154499, + 154488, + 154492, + 154452, + 154469, + 154475, + 154471, + 154493, + 154498, + 154459, + 154472, + 154512, + 154492, + 154527, + 154464, + 154485, + 154502, + 154458, + 154470, + 154490, + 154478, + 154472, + 154474, + 154485, + 154483, + 154502, + 154481, + 154484, + 154476, + 154484, + 154493, + 154487, + 154481, + 154511, + 154511, + 154455, + 154490, + 154495, + 154493, + 154471, + 154508, + 154522, + 154501, + 154484, + 154472, + 154491, + 154486, + 154478, + 154531, + 154497, + 154467, + 154487, + 154486, + 154473, + 154490, + 154473, + 154511, + 154494, + 154493, + 154491, + 154474, + 154482, + 154513, + 154491, + 154486, + 154487, + 154468, + 154505, + 154506, + 154488, + 154488, + 154490, + 154503, + 154519, + 154508, + 154501, + 154518, + 154475, + 154530, + 154515, + 154489, + 154491, + 154477, + 154504, + 154489, + 154526, + 154450, + 154480, + 154493, + 154456, + 154495, + 154471, + 154493, + 154465, + 154482, + 154479, + 154428, + 154471, + 154475, + 154516, + 154488, + 154501, + 154537, + 154476, + 154472, + 154476, + 154474, + 154507, + 154469, + 154539, + 154506, + 154504, + 154479, + 154488, + 154464, + 154467, + 154498, + 154486, + 154491, + 154472, + 154506, + 154482, + 154466, + 154462, + 154487, + 154505, + 154486, + 154487, + 154491, + 154488, + 154482, + 154486, + 154487, + 154496, + 154518, + 154507, + 154476, + 154481, + 154477, + 154476, + 154493, + 154477, + 154504, + 154475, + 154480, + 154501, + 154500, + 154503, + 154505, + 154498, + 154472, + 154508, + 154517, + 154562, + 154487, + 154510, + 154473, + 154500, + 154485, + 154484, + 154486, + 154548, + 154524, + 154520, + 154474, + 154483, + 154472, + 154471, + 154469, + 154481, + 154623, + 154484, + 154463, + 154533, + 154483, + 154476, + 154498, + 154504, + 154487, + 154486, + 154468, + 154518, + 154467, + 154503, + 154491, + 154499, + 154490, + 154480, + 154509, + 154490, + 154483, + 154514, + 154486, + 154495, + 154494, + 154497, + 154498, + 154498, + 154510, + 154517, + 154472, + 154476, + 154483, + 154464, + 154443, + 154512, + 154478, + 154484, + 154551, + 154508, + 154493, + 154515, + 154493, + 154486, + 154480, + 154506, + 154441, + 154482, + 154461, + 154493, + 154497, + 154506, + 154490, + 154510, + 154503, + 154454, + 154494, + 154488, + 154473, + 154466, + 154478, + 154493, + 154474, + 154493, + 154502, + 154461, + 154490, + 154506, + 154495, + 154469, + 154487, + 154521, + 154453, + 154485, + 154510, + 154475, + 154472, + 154470, + 154509, + 154488, + 154523, + 154470, + 154464, + 154487, + 154498, + 154461, + 154490, + 154458, + 154478, + 154473, + 154485, + 154472, + 154544, + 154527, + 154456, + 154475, + 154503, + 154491, + 154659, + 154492, + 154512, + 154482, + 154488, + 154498, + 154490, + 154494, + 154513, + 154545, + 154500, + 154459, + 154505, + 154491, + 154503, + 154482, + 154459, + 154473, + 154469, + 154449, + 154474, + 154518, + 154504, + 154505, + 154479, + 154464, + 154473, + 154459, + 154478, + 154474, + 154498, + 154482, + 154508, + 154494, + 154502, + 154501, + 154470, + 154499, + 154486, + 154511, + 154467, + 154465, + 154482, + 154506, + 154501, + 154481, + 154472, + 154466, + 154462, + 154478, + 154481, + 154510, + 154483, + 154489, + 154466, + 154500, + 154462, + 154457, + 154493, + 154501, + 154487, + 154492, + 154498, + 154503, + 154459, + 154501, + 154503, + 154502, + 154485, + 154503, + 154486, + 154501, + 154477, + 154473, + 154502, + 154483, + 154490, + 154506, + 154479, + 154463, + 154492, + 154509, + 154488, + 154468, + 154477, + 154460, + 154469, + 154485, + 154500, + 154482, + 154466, + 154474, + 154497, + 154483, + 154493, + 154489, + 154478, + 154495, + 154524, + 154490, + 154499, + 154469, + 154453, + 154480, + 154464, + 154469, + 154491, + 154494, + 154511, + 154484, + 154524, + 154486, + 154496, + 154493, + 154501, + 154494, + 154468, + 154480, + 154450, + 154461, + 154475, + 154486, + 154494, + 154508, + 154453, + 154460, + 154487, + 154516, + 154470, + 154467, + 154465, + 154481, + 154531, + 154546, + 154533, + 154500, + 154470, + 154465, + 154498, + 154510, + 154496, + 154458, + 154493, + 154463, + 154504, + 154494, + 154481, + 154478, + 154471, + 154500, + 154496, + 154470, + 154459, + 154502, + 154510, + 154479, + 154523, + 154490, + 154468, + 154513, + 154491, + 154518, + 154497, + 154469, + 154490, + 154496, + 154508, + 154475, + 154468, + 154499, + 154490, + 154510, + 154496, + 154495, + 154490, + 154498, + 154452, + 154488, + 154515, + 154504, + 154504, + 154533, + 154482, + 154490, + 154496, + 154454, + 154499, + 154464, + 154479, + 154599, + 154510, + 154493, + 154494, + 154477, + 154487, + 154498, + 154500, + 154492, + 154485, + 154491, + 154500, + 154479, + 154526, + 154482, + 154499, + 154486, + 154453, + 154506, + 154529, + 154498, + 154477, + 154526, + 154451, + 154535, + 154465, + 154496, + 154491, + 154520, + 154531, + 154467, + 154491, + 154465, + 154514, + 154498, + 154493, + 154480, + 154504, + 154498, + 154536, + 154502, + 154488, + 154488, + 154519, + 154473, + 154479, + 154492, + 154471, + 154454, + 154488, + 154461, + 154488, + 154512, + 154489, + 154523, + 154462, + 154502, + 154539, + 154506, + 154489, + 154485, + 154485, + 154492, + 154509, + 154471, + 154469, + 154499, + 154463, + 154503, + 154518, + 154492, + 154487, + 154466, + 154453, + 154503, + 154500, + 154489, + 154472, + 154488, + 154497, + 154519, + 154497, + 154511, + 154471, + 154517, + 154491, + 154469, + 154486, + 154487, + 154486, + 154529, + 154477, + 154490, + 154496, + 154477, + 154497, + 154468, + 154504, + 154465, + 154468, + 154497, + 154502, + 154487, + 154467, + 154514, + 154491, + 154476, + 154482, + 154493, + 154467, + 154440, + 154485, + 154509, + 154516, + 154504, + 154499, + 154479, + 154492, + 154499, + 154478, + 154513, + 154501, + 154454, + 154487, + 154491, + 154485, + 154452, + 154503, + 154505, + 154486, + 154505, + 154488, + 154530, + 154498, + 154501, + 154478, + 154500, + 154460, + 154481, + 154467, + 154490, + 154477, + 154503, + 154474, + 154482, + 154494, + 154463, + 154485, + 154489, + 154491, + 154486, + 154500, + 154497, + 154493, + 154500, + 154483, + 154485, + 154531, + 154514, + 154506, + 154501, + 154523, + 154459, + 154465, + 154490, + 154500, + 154514, + 154502, + 154497, + 154523, + 154505, + 154503, + 154488, + 154466, + 154481, + 154513, + 154479, + 154499, + 154487, + 154505, + 154495, + 154486, + 154481, + 154495, + 154488, + 154493, + 154523, + 154480, + 154506, + 154495, + 154484, + 154476, + 154508, + 154478, + 154476, + 154490, + 154470, + 154487, + 154492, + 154492, + 154461, + 154470, + 154489, + 154465, + 154492, + 154502, + 154491, + 154469, + 154482, + 154467, + 154513, + 154491, + 154476, + 154495, + 154510, + 154545, + 154461, + 154484, + 154488, + 154487, + 154507, + 154464, + 154465, + 154503, + 154485, + 154534, + 154468, + 154489, + 154474, + 154465, + 154490, + 154493, + 154483, + 154518, + 154513, + 154513, + 154504, + 154455, + 154491, + 154489, + 154504, + 154505, + 154507, + 154490, + 154465, + 154472, + 154460, + 154464, + 154494, + 154466, + 154484, + 154513, + 154446, + 154504, + 154494, + 154476, + 154467, + 154495, + 154489, + 154477, + 154494, + 154480, + 154491, + 154498, + 154458, + 154483, + 154464, + 154478, + 154485, + 154470, + 154496, + 154502, + 154483, + 154487, + 154485, + 154480, + 154504, + 154518, + 154458, + 154504, + 154497, + 154459, + 154488, + 154465, + 154467, + 154495, + 154477, + 154476, + 154469, + 154518, + 154464, + 154486, + 154488, + 154499, + 154445, + 154493, + 154491, + 154460, + 154497, + 154481, + 154482, + 154487, + 154475, + 154500, + 154524, + 154458, + 154516, + 154520, + 154484, + 154474, + 154465, + 154462, + 154465, + 154474, + 154481, + 154491, + 154507, + 154478, + 154484, + 154490, + 154521, + 154497, + 154507, + 154466, + 154480, + 154499, + 154458, + 154479, + 154496, + 154481, + 154495, + 154475, + 154490, + 154483, + 154515, + 154475, + 154478, + 154467, + 154479, + 154511, + 154469, + 154474, + 154462, + 154464, + 154468, + 154493, + 154466, + 154476, + 154445, + 154496, + 154530, + 154480, + 154510, + 154490, + 154498, + 154495, + 154485, + 154471, + 154510, + 154490, + 154495, + 154491, + 154513, + 154513, + 154501, + 154490, + 154477, + 154486, + 154499, + 154481, + 154488, + 154460, + 154553, + 154519, + 154469, + 154471, + 154503, + 154478, + 154499, + 154476, + 154471, + 154468, + 154518, + 154482, + 154488, + 154467, + 154484, + 154478, + 154510, + 154476, + 154470, + 154507, + 154481, + 154453, + 154516, + 154504, + 154461, + 154483, + 154519, + 154507, + 154528, + 154504, + 154489, + 154488, + 154481, + 154488, + 154499, + 154460, + 154500, + 154493, + 154488, + 154493, + 154492, + 154480, + 154494, + 154485, + 154467, + 154511, + 154488, + 154479, + 154483, + 154514, + 154515, + 154465, + 154489, + 154495, + 154510, + 154456, + 154504, + 154510, + 154478, + 154511, + 154466, + 154476, + 154506, + 154484, + 154486, + 154481, + 154491, + 154481, + 154521, + 154488, + 154437, + 154520, + 154471, + 154494, + 154490, + 154462, + 154499, + 154503, + 154506, + 154489, + 154472, + 154480, + 154508, + 154477, + 154537, + 154488, + 154475, + 154516, + 154491, + 154511, + 154507, + 154499, + 154489, + 154524, + 154463, + 154475, + 154466, + 154493, + 154476, + 154467, + 154512, + 154503, + 154483, + 154521, + 154477, + 154509, + 154530, + 154498, + 154490, + 154514, + 154487, + 154518, + 154492, + 154480, + 154491, + 154495, + 154477, + 154481, + 154504, + 154490, + 154507, + 154507, + 154471, + 154472, + 154492, + 154476, + 154470, + 154504, + 154481, + 154504, + 154458, + 154508, + 154519, + 154486, + 154489, + 154517, + 154521, + 154488, + 154477, + 154538, + 154461, + 154475, + 154495, + 154503, + 154493, + 154516, + 154485, + 154486, + 154477, + 154503, + 154491, + 154489, + 154516, + 154467, + 154469, + 154501, + 154466, + 154473, + 154461, + 154485, + 154484, + 154473, + 154498, + 154473, + 154479, + 154509, + 154466, + 154501, + 154515, + 154478, + 154487, + 154505, + 154482, + 154499, + 154527, + 154482, + 154485, + 154473, + 154509, + 154469, + 154471, + 154463, + 154481, + 154455, + 154501, + 154519, + 154491, + 154454, + 154500, + 154475, + 154497, + 154483, + 154494, + 154491, + 154522, + 154485, + 154502, + 154473, + 154448, + 154472, + 154457, + 154495, + 154495, + 154473, + 154477, + 154462, + 154470, + 154495, + 154474, + 154479, + 154503, + 154464, + 154481, + 154500, + 154516, + 154491, + 154464, + 154508, + 154492, + 154493, + 154509, + 154504, + 154461, + 154493, + 154505, + 154482, + 154501, + 154481, + 154504, + 154458, + 154458, + 154501, + 154466, + 154481, + 154477, + 154491, + 154511, + 154496, + 154506, + 154494, + 154508, + 154489, + 154467, + 154510, + 154489, + 154740, + 154510, + 154477, + 154499, + 154465, + 154499, + 154506, + 154468, + 154489, + 154495, + 154508, + 154477, + 154493, + 154504, + 154479, + 154472, + 154458, + 154504, + 154460, + 154467, + 154497, + 154528, + 154512, + 154503, + 154522, + 154534, + 154471, + 154511, + 154510, + 154499, + 154540, + 154478, + 154509, + 154498, + 154490, + 154500, + 154481, + 154497, + 154497, + 154470, + 154471, + 154528, + 154500, + 154528, + 154508, + 154464, + 154477, + 154504, + 154472, + 154475, + 154476, + 154492, + 154475, + 154522, + 154502, + 154489, + 154506, + 154498, + 154490, + 154517, + 154456, + 154490, + 154504, + 154497, + 154481, + 154490, + 154486, + 154483, + 154449, + 154459, + 154465, + 154479, + 154496, + 154514, + 154474, + 154484, + 154492, + 154518, + 154489, + 154503, + 154497, + 154506, + 154523, + 154486, + 154503, + 154521, + 154529, + 154481, + 154489, + 154503, + 154504, + 154498, + 154458, + 154488, + 154484, + 154481, + 154494, + 154502, + 154488, + 154501, + 154507, + 154507, + 154482, + 154505, + 154495, + 154470, + 154476, + 154475, + 154452, + 154485, + 154482, + 154480, + 154500, + 154493, + 154488, + 154494, + 154481, + 154459, + 154500, + 154483, + 154505, + 154479, + 154466, + 154463, + 154498, + 154487, + 154503, + 154501, + 154477, + 154509, + 154505, + 154466, + 154473, + 154522, + 154465, + 154494, + 154481, + 154492, + 154473, + 154481, + 154513, + 154475, + 154435, + 154514, + 154487, + 154464, + 154457, + 154498, + 154480, + 154480, + 154504, + 154515, + 154515, + 154513, + 154504, + 154507, + 154493, + 154496, + 154562, + 154471, + 154490, + 154500, + 154515, + 154460, + 154500, + 154474, + 154484, + 154512, + 154431, + 154496, + 154473, + 154494, + 154543, + 154482, + 154523, + 154465, + 154484, + 154465, + 154503, + 154453, + 154499, + 154494, + 154458, + 154497, + 154481, + 154477, + 154467, + 154486, + 154491, + 154490, + 154503, + 154478, + 154489, + 154511, + 154471, + 154501, + 154473, + 154490, + 154504, + 154487, + 154491, + 154482, + 154479, + 154478, + 154475, + 154467, + 154481, + 154452, + 154491, + 154466, + 154516, + 154463, + 154496, + 154476, + 154496, + 154496, + 154483, + 154513, + 154490, + 154464, + 154515, + 154518, + 154518, + 154491, + 154505, + 154492, + 154496, + 154550, + 154510, + 154493, + 154493, + 154502, + 154502, + 154466, + 154490, + 154480, + 154470, + 154484, + 154504, + 154509, + 154495, + 154517, + 154469, + 154507, + 154499, + 154494, + 154508, + 154493, + 154497, + 154506, + 154462, + 154489, + 154482, + 154478, + 154509, + 154544, + 154493, + 154474, + 154467, + 154490, + 154509, + 154488, + 154501, + 154456, + 154577, + 154497, + 154479, + 154504, + 154510, + 154477, + 154475, + 154500, + 154512, + 154506, + 154501, + 154471, + 154498, + 154524, + 154511, + 154504, + 154515, + 154473, + 154486, + 154957, + 154507, + 154501, + 154489, + 154473, + 154492, + 154466, + 154492, + 154487, + 154514, + 154506, + 154506, + 154515, + 154506, + 154471, + 154523, + 154492, + 154516, + 154491, + 154494, + 154469, + 154515, + 154499, + 154482, + 154483, + 154470, + 154520, + 154506, + 154537, + 154465, + 154499, + 154505, + 154499, + 154494, + 154516, + 154519, + 154517, + 154496, + 154538, + 154458, + 154505, + 154490, + 154483, + 154492, + 154535, + 154493, + 154485, + 154480, + 154486, + 154497, + 154481, + 154498, + 154466, + 154504, + 154504, + 154488, + 154458, + 154471, + 154482, + 154498, + 154463, + 154487, + 154478, + 154486, + 154478, + 154453, + 154507, + 154496, + 154504, + 154503, + 154495, + 154477, + 154450, + 154524, + 154472, + 154460, + 154488, + 154497, + 154455, + 154471, + 154491, + 154506, + 154501, + 154535, + 154483, + 154492, + 154458, + 154526, + 154505, + 154462, + 154454, + 154504, + 154457, + 154490, + 154497, + 154490, + 154488, + 154482, + 154492, + 154497, + 154487, + 154501, + 154476, + 154513, + 154486, + 154466, + 154493, + 154492, + 154515, + 154485, + 154494, + 154486, + 154497, + 154510, + 154499, + 154472, + 154496, + 154482, + 154483, + 154474, + 154489, + 154475, + 154495, + 154484, + 154476, + 154487, + 154518, + 154457, + 154532, + 154504, + 154498, + 154479, + 154470, + 154480, + 154476, + 154494, + 154494, + 154487, + 154502, + 154530, + 154525, + 154489, + 154469, + 154459, + 154477, + 154527, + 154480, + 154524, + 154474, + 154500, + 154507, + 154470, + 154485, + 154486, + 154504, + 154473, + 154479, + 154496, + 154495, + 154451, + 154484, + 154517, + 154473, + 154468, + 154514, + 154463, + 154503, + 154525, + 154539, + 154516, + 154487, + 154464, + 154487, + 154457, + 154471, + 154497, + 154468, + 154494, + 154490, + 154496, + 154478, + 154505, + 154515, + 154500, + 154497, + 154488, + 154508, + 154497, + 154510, + 154506, + 154494, + 154494, + 154462, + 154481, + 154475, + 154854, + 154479, + 154484, + 154497, + 154465, + 154487, + 154503, + 154495, + 154504, + 154471, + 154475, + 154470, + 154502, + 154528, + 154495, + 154482, + 154512, + 154489, + 154474, + 154463, + 154485, + 154515, + 154461, + 154459, + 154509, + 154477, + 154490, + 154538, + 154537, + 154502, + 154464, + 154448, + 154473, + 154498, + 154448, + 154486, + 154508, + 154465, + 154481, + 154510, + 154476, + 154466, + 154504, + 154453, + 154499, + 154467, + 154495, + 154477, + 154526, + 154520, + 154507, + 154500, + 154517, + 154485, + 154460, + 154498, + 155097, + 154530, + 154487, + 154466, + 154498, + 154490, + 154521, + 154475, + 154525, + 154485, + 154486, + 154492, + 154458, + 154508, + 154500, + 154499, + 154494, + 154497, + 154495, + 154490, + 154482, + 154505, + 154499, + 154491, + 154485, + 154514, + 154528, + 154470, + 154542, + 154487, + 154491, + 154531, + 154454, + 154526, + 154468, + 154484, + 154468, + 154455, + 154506, + 154486, + 154485, + 154499, + 154474, + 154471, + 154497, + 154477, + 154466, + 154491, + 154488, + 154498, + 154518, + 154495, + 154481, + 154480, + 154462, + 154558, + 154559, + 154480, + 154472, + 154474, + 154480, + 154456, + 154490, + 154483, + 154488, + 154499, + 154492, + 154502, + 154445, + 154509, + 154505, + 154452, + 154499, + 154504, + 154516, + 154486, + 154469, + 154452, + 154458, + 154494, + 154508, + 154475, + 154495, + 154488, + 154490, + 154489, + 154493, + 154479, + 154506, + 154493, + 154491, + 154513, + 154502, + 154478, + 154502, + 154473, + 154478, + 154493, + 154507, + 154466, + 154500, + 154499, + 154487, + 154500, + 154518, + 154503, + 154471, + 154501, + 154497, + 154481, + 154533, + 154510, + 154520, + 154464, + 154483, + 154529, + 154486, + 154483, + 154495, + 154490, + 154495, + 154517, + 154483, + 154497, + 154476, + 154504, + 154509, + 154468, + 154502, + 154478, + 154505, + 154471, + 154490, + 154495, + 154497, + 154489, + 154474, + 154464, + 154485, + 154487, + 154506, + 154479, + 154506, + 154519, + 154493, + 154484, + 154491, + 154505, + 154494, + 154502, + 154449, + 154491, + 154529, + 154495, + 154559, + 154497, + 154514, + 154496, + 154515, + 154472, + 154524, + 154476, + 154492, + 154500, + 154497, + 154481, + 154552, + 154521, + 154505, + 154466, + 154462, + 154494, + 154494, + 154488, + 154485, + 154469, + 154487, + 154498, + 154519, + 154497, + 154520, + 154463, + 154470, + 154468, + 154497, + 154500, + 154494, + 154538, + 154492, + 154485, + 154469, + 154488, + 154486, + 154483, + 154509, + 154487, + 154453, + 154486, + 154486, + 154501, + 154532, + 154472, + 154515, + 154480, + 154460, + 154486, + 154484, + 154478, + 154484, + 154469, + 154474, + 154506, + 154503, + 154476, + 154521, + 154473, + 154465, + 154474, + 154487, + 154461, + 154495, + 154500, + 154530, + 154509, + 154468, + 154492, + 154504, + 154519, + 154460, + 154499, + 154461, + 154481, + 154494, + 154470, + 154495, + 154505, + 154460, + 154492, + 154499, + 154486, + 154513, + 154496, + 154486, + 154505, + 154481, + 154514, + 154483, + 154463, + 154482, + 154511, + 154535, + 154517, + 154462, + 154490, + 154489, + 154484, + 154490, + 154505, + 154494, + 154499, + 154521, + 154468, + 154500, + 154500, + 154497, + 154512, + 154467, + 154491, + 154489, + 154483, + 154510, + 154484, + 154495, + 154473, + 154497, + 154451, + 154498, + 154484, + 154515, + 154503, + 154492, + 154507, + 154508, + 154502, + 154483, + 154499, + 154471, + 154465, + 154465, + 154500, + 154488, + 154508, + 154521, + 154486, + 154495, + 154496, + 154489, + 154470, + 154451, + 154496, + 154476, + 154483, + 154465, + 154463, + 154496, + 154475, + 154476, + 154537, + 154504, + 154504, + 154479, + 154510, + 154486, + 154483, + 154491, + 154485, + 154448, + 154501, + 154495, + 154480, + 154496, + 154484, + 154510, + 154509, + 154468, + 154554, + 154482, + 154524, + 154505, + 154509, + 154521, + 154505, + 154513, + 154498, + 154487, + 154509, + 154463, + 154497, + 154460, + 154490, + 154467, + 154530, + 154481, + 154503, + 154486, + 154487, + 154502, + 154488, + 154489, + 154463, + 154495, + 154493, + 154506, + 154505, + 154489, + 154487, + 154533, + 154479, + 154475, + 154472, + 154484, + 154507, + 154500, + 154557, + 154492, + 154522, + 154481, + 154501, + 154473, + 154501, + 154498, + 154448, + 154506, + 154455, + 154513, + 154496, + 154485, + 154526, + 154488, + 154515, + 154481, + 154492, + 154482, + 154474, + 154471, + 154501, + 154481, + 154524, + 154489, + 154499, + 154497, + 154477, + 154476, + 154487, + 154529, + 154506, + 154496, + 154513, + 154487, + 154506, + 154504, + 154479, + 154518, + 154461, + 154481, + 154493, + 154518, + 154509, + 154478, + 154472, + 154509, + 154497, + 154496, + 154509, + 154489, + 154516, + 154501, + 154480, + 154514, + 154501, + 154518, + 154496, + 154468, + 154498, + 154479, + 154507, + 154520, + 154486, + 154504, + 154485, + 154498, + 154492, + 154480, + 154483, + 154497, + 154506, + 154463, + 154475, + 154507, + 154501, + 154473, + 154512, + 154480, + 154464, + 154475, + 154504, + 154526, + 154503, + 154494, + 154494, + 154507, + 154510, + 154459, + 154520, + 154509, + 154503, + 154473, + 154500, + 154487, + 154504, + 154469, + 154467, + 154474, + 154469, + 154503, + 154511, + 154516, + 154505, + 154478, + 154469, + 154498, + 154504, + 154494, + 154494, + 154487, + 154516, + 154478, + 154496, + 154502, + 154491, + 154466, + 154500, + 154470, + 154497, + 154507, + 154472, + 154501, + 154474, + 154480, + 154505, + 154509, + 154513, + 154498, + 154472, + 154519, + 154503, + 154493, + 154518, + 154493, + 154465, + 154507, + 154536, + 154460, + 154476, + 154505, + 154508, + 154505, + 154478, + 154495, + 154496, + 154472, + 154536, + 154513, + 154466, + 154473, + 154516, + 154485, + 154497, + 154483, + 154513, + 154451, + 154502, + 154478, + 154496, + 154487, + 154477, + 154516, + 154524, + 154469, + 154482, + 154501, + 154492, + 154496, + 154501, + 154489, + 154474, + 154461, + 154474, + 154478, + 154500, + 154472, + 154479, + 154495, + 154464, + 154466, + 154482, + 154458, + 154519, + 154525, + 154486, + 154500, + 154466, + 154448, + 154509, + 154474, + 154481, + 154507, + 154502, + 154492, + 154474, + 154494, + 154503, + 154493, + 154488, + 154501, + 154485, + 154461, + 154502, + 154492, + 154457, + 154522, + 154500, + 154506, + 154466, + 154500, + 154474, + 154492, + 154506, + 154483, + 154501, + 154500, + 154499, + 154520, + 154482, + 154445, + 154490, + 154464, + 154458, + 154484, + 154503, + 154453, + 154493, + 154475, + 154489, + 154481, + 154472, + 154495, + 154473, + 154489, + 154523, + 154490, + 154482, + 154479, + 154484, + 154502, + 154496, + 154467, + 154500, + 154454, + 154456, + 154500, + 154550, + 154511, + 154471, + 154493, + 154460, + 154456, + 154484, + 154468, + 154500, + 154466, + 154463, + 154469, + 154461, + 154498, + 154495, + 154515, + 154475, + 154459, + 154480, + 154517, + 154475, + 154480, + 154487, + 154467, + 154474, + 154467, + 154493, + 154522, + 154476, + 154495, + 154465, + 154503, + 154473, + 154468, + 154476, + 154504, + 154491, + 154484, + 154496, + 154494, + 154494, + 154495, + 154457, + 154482, + 154482, + 154504, + 154464, + 154496, + 154481, + 154476, + 154487, + 154483, + 154526, + 154490, + 154487, + 154459, + 154492, + 154479, + 154455, + 154512, + 154490, + 154489, + 154496, + 154493, + 154475, + 154490, + 154482, + 154504, + 154502, + 154512, + 154504, + 154482, + 154532, + 154522, + 154468, + 154514, + 154450, + 154511, + 154497, + 154478, + 154467, + 154455, + 154551, + 154510, + 154499, + 154514, + 154480, + 154487, + 154510, + 154492, + 154488, + 154469, + 154499, + 154523, + 154494, + 154484, + 154470, + 154509, + 154494, + 154476, + 154513, + 154472, + 154503, + 154482, + 154502, + 154467, + 154485, + 154498, + 154479, + 154495, + 154509, + 155183, + 154506, + 154508, + 154526, + 154504, + 154489, + 154500, + 154507, + 154481, + 154508, + 154474, + 154472, + 154493, + 154493, + 154498, + 154510, + 154493, + 154448, + 154470, + 154493, + 154484, + 154482, + 154497, + 154494, + 154504, + 154467, + 154484, + 154473, + 154498, + 154486, + 154497, + 154466, + 154483, + 154491, + 154476, + 154499, + 154471, + 154483, + 154486, + 154484, + 154534, + 154513, + 154502, + 154517, + 154477, + 154533, + 154507, + 154492, + 154512, + 154484, + 154466, + 154493, + 154529, + 154503, + 154538, + 154474, + 154508, + 154497, + 154479, + 154467, + 154479, + 154501, + 154531, + 154522, + 154508, + 154516, + 154459, + 154482, + 154501, + 154491, + 154472, + 154478, + 154480, + 154505, + 154505, + 154500, + 154482, + 154504, + 154468, + 154480, + 154485, + 154469, + 154475, + 154487, + 154489, + 154493, + 154489, + 154514, + 154464, + 154494, + 154490, + 154462, + 154494, + 154471, + 154510, + 154495, + 154497, + 154476, + 154510, + 154466, + 154481, + 154506, + 154479, + 154491, + 154486, + 154496, + 154460, + 154497, + 154494, + 154462, + 154494, + 154521, + 154486, + 154485, + 154485, + 154504, + 154478, + 154530, + 154477, + 154482, + 154475, + 154506, + 154456, + 154500, + 154499, + 154464, + 154507, + 154501, + 154490, + 154500, + 154478, + 154474, + 154492, + 154473, + 154487, + 154497, + 154487, + 154532, + 154499, + 154512, + 154495, + 154489, + 154487, + 154492, + 154489, + 154467, + 154493, + 154482, + 154475, + 154481, + 154561, + 154484, + 154474, + 154457, + 154502, + 154462, + 154492, + 154506, + 154527, + 154525, + 154512, + 154533, + 154498, + 154501, + 154488, + 154507, + 154511, + 154510, + 154481, + 154510, + 154467, + 154477, + 154493, + 154489, + 154469, + 154509, + 154452, + 154470, + 154507, + 154477, + 154516, + 154497, + 154485, + 154476, + 154486, + 154463, + 154511, + 154480, + 154474, + 154524, + 154479, + 154498, + 154505, + 154503, + 154475, + 154480, + 154503, + 154475, + 154508, + 154495, + 154492, + 154504, + 154489, + 154502, + 154502, + 154497, + 154496, + 154511, + 154503, + 154469, + 154478, + 154492, + 154497, + 154503, + 154485, + 154501, + 154480, + 154478, + 154522, + 154502, + 154502, + 154538, + 154485, + 154493, + 154494, + 154490, + 154484, + 154500, + 154503, + 154448, + 154452, + 154463, + 154498, + 154499, + 154486, + 154525, + 154497, + 154542, + 154500, + 154478, + 154487, + 154477, + 154498, + 154519, + 154493, + 154475, + 154496, + 154518, + 154513, + 154460, + 154472, + 154484, + 154502, + 154470, + 154495, + 154504, + 154477, + 154480, + 154462, + 154452, + 154475, + 154457, + 154509, + 154499, + 154503, + 154519, + 154523, + 154471, + 154485, + 154482, + 154509, + 154491, + 154499, + 154499, + 154496, + 154491, + 154495, + 154482, + 154502, + 154468, + 154489, + 154501, + 154492, + 154477, + 154484, + 154482, + 154482, + 154460, + 154494, + 154511, + 154501, + 154493, + 154502, + 154491, + 154502, + 154521, + 154478, + 154478, + 154501, + 154484, + 154492, + 154502, + 154466, + 154528, + 154479, + 154481, + 154501, + 154501, + 154478, + 154502, + 154499, + 154464, + 154496, + 154513, + 154486, + 154490, + 154494, + 154469, + 154472, + 154490, + 154508, + 154460, + 154500, + 154472, + 154475, + 154485, + 154494, + 154468, + 154494, + 154506, + 154473, + 154517, + 154492, + 154474, + 154503, + 154497, + 154461, + 154499, + 154483, + 154463, + 154464, + 154461, + 154485, + 154499, + 154488, + 154498, + 154493, + 154486, + 154502, + 154475, + 154467, + 154486, + 154493, + 154488, + 154482, + 154510, + 154490, + 154503, + 154490, + 154498, + 154501, + 154503, + 154509, + 154488, + 154518, + 154515, + 154493, + 154472, + 154469, + 154481, + 154513, + 154513, + 154490, + 154504, + 154502, + 154466, + 154471, + 154548, + 154473, + 154476, + 154476, + 154477, + 154480, + 154484, + 154468, + 154483, + 154492, + 154505, + 154512, + 154495, + 154541, + 154499, + 154511, + 154474, + 154469, + 154479, + 154494, + 154500, + 154487, + 154495, + 154484, + 154488, + 154483, + 154512, + 154528, + 154515, + 154446, + 154487, + 154478, + 154474, + 154477, + 154466, + 154479, + 154473, + 154492, + 154474, + 154534, + 154474, + 154457, + 154493, + 154510, + 154461, + 154517, + 154499, + 154494, + 154493, + 154502, + 154494, + 154505, + 154493, + 154503, + 154500, + 154483, + 154491, + 154464, + 154521, + 154479, + 154487, + 154452, + 154496, + 154454, + 154480, + 154488, + 154502, + 154472, + 154476, + 154477, + 154521, + 154513, + 154488, + 154513, + 154481, + 154461, + 154488, + 154490, + 154499, + 154491, + 154494, + 154475, + 154465, + 154486, + 154497, + 154466, + 154484, + 154480, + 154510, + 154459, + 154503, + 154500, + 154516, + 154508, + 154497, + 154489, + 154511, + 154499, + 154481, + 154482, + 154477, + 154478, + 154496, + 154461, + 154494, + 154487, + 154504, + 154497, + 154449, + 154485, + 154501, + 154501, + 154518, + 154464, + 154513, + 154510, + 154492, + 154523, + 154502, + 154455, + 154469, + 154491, + 154488, + 154509, + 154494, + 154511, + 154484, + 154484, + 154501, + 154496, + 154479, + 154475, + 154515, + 154489, + 154475, + 154494, + 154511, + 154453, + 154489, + 154499, + 154502, + 154491, + 154491, + 154511, + 154484, + 154481, + 154491, + 154498, + 154482, + 154453, + 154482, + 154487, + 154468, + 154530, + 154514, + 154491, + 154502, + 154494, + 154442, + 154476, + 154557, + 154470, + 154478, + 154486, + 154469, + 154481, + 154480, + 154485, + 154485, + 154506, + 154511, + 154527, + 154503, + 154501, + 154473, + 154439, + 154462, + 154524, + 154507, + 154474, + 154492, + 154444, + 154483, + 154516, + 154485, + 154485, + 154494, + 154495, + 154497, + 154492, + 154492, + 154474, + 154487, + 154491, + 154482, + 154508, + 154472, + 154492, + 154501, + 154495, + 154498, + 154497, + 154465, + 154463, + 154478, + 154461, + 154508, + 154495, + 154468, + 154492, + 154463, + 154507, + 154484, + 154462, + 154521, + 154479, + 154481, + 154493, + 154457, + 154499, + 154509, + 154473, + 154497, + 154486, + 154494, + 154484, + 154492, + 154461, + 154482, + 154488, + 154479, + 154498, + 154482, + 154509, + 154545, + 154502, + 154494, + 154498, + 154467, + 154480, + 154536, + 154465, + 154501, + 154470, + 154497, + 154506, + 154486, + 154474, + 154475, + 154481, + 154512, + 154611, + 154497, + 154492, + 154492, + 154529, + 154483, + 154469, + 154460, + 154501, + 154489, + 154482, + 154491, + 154501, + 154502, + 154491, + 154469, + 154468, + 154448, + 154493, + 154514, + 154499, + 154478, + 154513, + 154502, + 154505, + 154483, + 154528, + 154498, + 154472, + 154488, + 154483, + 154520, + 154491, + 154504, + 154493, + 154464, + 154516, + 154495, + 154489, + 154488, + 154522, + 154496, + 154457, + 154509, + 154491, + 154491, + 154471, + 154494, + 154473, + 154455, + 154461, + 154476, + 154485, + 154479, + 154499, + 154514, + 154479, + 154485, + 154468, + 154478, + 154482, + 154514, + 154479, + 154487, + 154449, + 154492, + 154490, + 154475, + 154502, + 154440, + 154486, + 154514, + 154485, + 154474, + 154460, + 154471, + 154497, + 154493, + 154473, + 154502, + 154467, + 154493, + 154489, + 154464, + 154483, + 154494, + 154505, + 154490, + 154503, + 154475, + 154498, + 154491, + 154510, + 154491, + 154478, + 154502, + 154490, + 154532, + 154463, + 154472, + 154492, + 154483, + 154478, + 154479, + 154504, + 154496, + 154495, + 154489, + 154474, + 154528, + 154494, + 154478, + 154460, + 154476, + 154460, + 154533, + 154477, + 154477, + 154503, + 154461, + 154467, + 154468, + 154483, + 154489, + 154460, + 154477, + 154504, + 154488, + 154496, + 154494, + 154469, + 154481, + 154517, + 154507, + 154472, + 154463, + 154469, + 154469, + 154481, + 154480, + 154464, + 154498, + 154490, + 154500, + 154475, + 154491, + 154484, + 154468, + 154488, + 154469, + 154512, + 154459, + 154483, + 154472, + 154505, + 154499, + 154488, + 154460, + 154488, + 154497, + 154490, + 154493, + 154467, + 154467, + 154516, + 154476, + 154485, + 154478, + 154519, + 154544, + 154483, + 154485, + 154478, + 154465, + 154496, + 154501, + 154483, + 154460, + 154512, + 154499, + 154479, + 154497, + 154475, + 154457, + 154501, + 154504, + 154454, + 154480, + 154504, + 154505, + 154470, + 154470, + 154471, + 154489, + 154501, + 154469, + 154507, + 154510, + 154478, + 154471, + 154486, + 154505, + 154488, + 154470, + 154525, + 154492, + 154474, + 154499, + 154482, + 154481, + 154473, + 154527, + 154501, + 154486, + 154499, + 154469, + 154466, + 154489, + 154483, + 154508, + 154512, + 154496, + 154500, + 154481, + 154488, + 154503, + 154473, + 154503, + 154505, + 154493, + 154463, + 154511, + 154497, + 154484, + 154492, + 154479, + 154480, + 154493, + 154469, + 154499, + 154477, + 154466, + 154494, + 154471, + 154491, + 154498, + 154507, + 154482, + 154509, + 154492, + 154481, + 154475, + 154485, + 154496, + 154488, + 154467, + 154499, + 154473, + 154484, + 154500, + 154511, + 154497, + 154515, + 154501, + 154505, + 154493, + 154486, + 154467, + 154507, + 154481, + 154505, + 154500, + 154502, + 154479, + 154491, + 154506, + 154538, + 154510, + 154495, + 154467, + 154495, + 154505, + 154488, + 154486, + 154455, + 154505, + 154488, + 154503, + 154496, + 154464, + 154520, + 154498, + 154507, + 154495, + 154467, + 154493, + 154488, + 154529, + 154473, + 154494, + 154502, + 154516, + 154497, + 154483, + 154503, + 154471, + 154473, + 154499, + 154513, + 154486, + 154471, + 154499, + 154495, + 154484, + 154508, + 154495, + 154489, + 154492, + 154469, + 154478, + 154511, + 154473, + 154516, + 154512, + 154504, + 154519, + 154481, + 154495, + 154500, + 154470, + 154509, + 154474, + 154503, + 154477, + 154472, + 154570, + 154512, + 154510, + 154505, + 154497, + 154482, + 154516, + 154465, + 154492, + 154482, + 154511, + 154479, + 154498, + 154487, + 154512, + 154497, + 154476, + 154492, + 154505, + 154494, + 154472, + 154487, + 154485, + 154507, + 154506, + 154495, + 154488, + 154472, + 154482, + 154499, + 154512, + 154485, + 154493, + 154490, + 154492, + 154505, + 154490, + 154502, + 154509, + 154500, + 154464, + 154501, + 154505, + 154461, + 154499, + 154506, + 154471, + 154478, + 154484, + 154489, + 154507, + 154458, + 154493, + 154498, + 154534, + 154478, + 154512, + 154519, + 154496, + 154492, + 154466, + 154498, + 154544, + 154455, + 154511, + 154467, + 154482, + 154496, + 154485, + 154496, + 154486, + 154469, + 154474, + 154483, + 154485, + 154497, + 154515, + 154490, + 154499, + 154453, + 154471, + 154490, + 154483, + 154501, + 154511, + 154482, + 154496, + 154480, + 154495, + 154492, + 154492, + 154501, + 154456, + 154502, + 154483, + 154483, + 154510, + 154463, + 154513, + 154516, + 154467, + 154490, + 154474, + 154466, + 154523, + 154479, + 154443, + 154455, + 154477, + 154462, + 154461, + 154518, + 154467, + 154453, + 154487, + 154481, + 154479, + 154446, + 154504, + 154470, + 154483, + 154457, + 154539, + 154459, + 154466, + 154496, + 154456, + 154503, + 154495, + 154482, + 154454, + 154472, + 154492, + 154474, + 154446, + 154514, + 154450, + 154457, + 154510, + 154542, + 154487, + 154492, + 154447, + 154494, + 154508, + 154492, + 154475, + 154504, + 154489, + 154477, + 154483, + 154467, + 154483, + 154478, + 154450, + 154457, + 154497, + 154508, + 154497, + 154467, + 154488, + 154466, + 154480, + 154484, + 154485, + 154494, + 154493, + 154482, + 154487, + 154452, + 154498, + 154469, + 154472, + 154485, + 154504, + 154458, + 154492, + 154480, + 154462, + 154477, + 154492, + 154517, + 154484, + 154468, + 154496, + 154499, + 154518, + 154501, + 154520, + 154512, + 154561, + 154524, + 154493, + 154496, + 154509, + 154531, + 154462, + 154497, + 154479, + 154488, + 154511, + 154487, + 154485, + 154451, + 154478, + 154480, + 154492, + 154463, + 154496, + 154508, + 154479, + 154483, + 154479, + 154493, + 154494, + 154505, + 154472, + 154490, + 154460, + 154488, + 154498, + 154456, + 154476, + 154483, + 154496, + 154471, + 154510, + 154497, + 154505, + 154497, + 154492, + 154511, + 154485, + 154496, + 154486, + 154449, + 154498, + 154508, + 154486, + 154510, + 154523, + 154478, + 154491, + 154496, + 154466, + 154505, + 154493, + 154506, + 154463, + 154460, + 154472, + 154460, + 154477, + 154474, + 154511, + 154478, + 154478, + 154521, + 154486, + 154494, + 154504, + 154504, + 154502, + 154498, + 154485, + 154456, + 154483, + 154499, + 154488, + 154497, + 154498, + 154488, + 154485, + 154496, + 154508, + 154477, + 154501, + 154489, + 154483, + 154510, + 154475, + 154491, + 154506, + 154492, + 154479, + 154463, + 154489, + 154479, + 154484, + 154476, + 154529, + 154522, + 154460, + 154496, + 154486, + 154497, + 154484, + 154490, + 154472, + 154485, + 154493, + 154461, + 154489, + 154481, + 154485, + 154482, + 154519, + 154474, + 154485, + 154468, + 154479, + 154460, + 154463, + 154463, + 154459, + 154516, + 154487, + 154486, + 154490, + 154485, + 154489, + 154467, + 154441, + 154459, + 154467, + 154513, + 154482, + 154485, + 154529, + 154467, + 154547, + 154494, + 154518, + 154459, + 154484, + 154494, + 154471, + 154458, + 154476, + 154495, + 154498, + 154498, + 154500, + 154488, + 154489, + 154488, + 154514, + 154531, + 154484, + 154487, + 154496, + 154495, + 154497, + 154481, + 154514, + 154467, + 154455, + 154484, + 154486, + 154736, + 154500, + 154513, + 154494, + 154479, + 154476, + 154496, + 154486, + 154491, + 154487, + 154480, + 154471, + 154481, + 154482, + 154492, + 154478, + 154477, + 154456, + 154446, + 154491, + 154470, + 154504, + 154502, + 154503, + 154454, + 154519, + 154478, + 154472, + 154479, + 154477, + 154485, + 154471, + 154483, + 154481, + 154479, + 154455, + 154473, + 154495, + 154474, + 154489, + 154502, + 154460, + 154479, + 154512, + 154472, + 154462, + 154503, + 154458, + 154511, + 154500, + 154517, + 154479, + 154492, + 154468, + 154502, + 154506, + 154483, + 154540, + 154502, + 154482, + 154473, + 154488, + 154443, + 154481, + 154460, + 154493, + 154473, + 154494, + 154469, + 154503, + 154506, + 154495, + 154476, + 154525, + 154490, + 154500, + 154515, + 154492, + 154467, + 154489, + 154474, + 154483, + 154511, + 154494, + 154498, + 154485, + 154470, + 154499, + 154459, + 154506, + 154504, + 154495, + 154469, + 154493, + 154503, + 154499, + 154496, + 154520, + 154525, + 154497, + 154471, + 154490, + 154477, + 154517, + 154483, + 154510, + 154485, + 154473, + 154506, + 154499, + 154475, + 154505, + 154498, + 154474, + 154488, + 154467, + 154495, + 154482, + 154497, + 154476, + 154488, + 154492, + 154494, + 154493, + 154478, + 154484, + 154503, + 154495, + 154474, + 154497, + 154506, + 154471, + 154516, + 154535, + 154502, + 154504, + 154469, + 154481, + 154500, + 154453, + 154507, + 154464, + 154474, + 154483, + 154515, + 154468, + 154489, + 154486, + 154491, + 154500, + 154513, + 154484, + 154488, + 154524, + 154490, + 154488, + 154465, + 154519, + 154497, + 154494, + 154536, + 154508, + 154550, + 154516, + 154493, + 154525, + 154444, + 154519, + 154507, + 154477, + 154484, + 154462, + 154558, + 154498, + 154492, + 154463, + 154466, + 154493, + 154515, + 154530, + 154498, + 154470, + 154467, + 154508, + 154523, + 154490, + 154497, + 154471, + 154454, + 154469, + 154486, + 154503, + 154477, + 154467, + 154503, + 154508, + 154508, + 154495, + 154495, + 154475, + 154508, + 154504, + 154463, + 154494, + 154500, + 154480, + 154495, + 154481, + 154492, + 154487, + 154490, + 154490, + 154496, + 154473, + 154482, + 154512, + 154503, + 154487, + 154465, + 154488, + 154492, + 154471, + 154489, + 154500, + 154521, + 154469, + 154469, + 154475, + 154509, + 154497, + 154502, + 154485, + 154476, + 154476, + 154498, + 154485, + 154473, + 154494, + 154483, + 154489, + 154500, + 154477, + 154493, + 154503, + 154518, + 154507, + 154499, + 154477, + 154505, + 154471, + 154504, + 154478, + 154499, + 154476, + 154497, + 154482, + 154502, + 154499, + 154461, + 154503, + 154494, + 154488, + 154528, + 154478, + 154473, + 154496, + 154470, + 154508, + 154490, + 154489, + 154493, + 154479, + 154488, + 154590, + 154479, + 154502, + 154477, + 154521, + 154477, + 154467, + 154463, + 154486, + 154467, + 154486, + 154492, + 154478, + 154499, + 154495, + 154496, + 154468, + 154448, + 154471, + 154509, + 154492, + 154485, + 154465, + 154495, + 154507, + 154501, + 154491, + 154493, + 154467, + 154501, + 154474, + 154502, + 154538, + 154510, + 154537, + 154526, + 154487, + 154501, + 154484, + 154469, + 154501, + 154487, + 154488, + 154495, + 154511, + 154500, + 154467, + 154458, + 154483, + 154483, + 154514, + 154477, + 154474, + 154476, + 154465, + 154497, + 154491, + 154474, + 154492, + 154487, + 154512, + 154487, + 154485, + 154526, + 154481, + 154493, + 154472, + 154494, + 154510, + 154491, + 154497, + 154491, + 154495, + 154505, + 154491, + 154469, + 154507, + 154493, + 154509, + 154495, + 154490, + 154498, + 154478, + 154493, + 154515, + 154457, + 154494, + 154465, + 154472, + 154502, + 154502, + 154476, + 154474, + 154465, + 154494, + 154492, + 154491, + 154496, + 154483, + 154498, + 154476, + 154463, + 154453, + 154496, + 154482, + 154504, + 154473, + 154493, + 154471, + 154498, + 154457, + 154486, + 154481, + 154486, + 154484, + 154485, + 154502, + 154489, + 154495, + 154508, + 154502, + 154471, + 154447, + 154491, + 154504, + 154512, + 154491, + 154498, + 154453, + 154504, + 154479, + 154479, + 154496, + 154493, + 154493, + 154485, + 154490, + 154484, + 154477, + 154500, + 154469, + 154459, + 154497, + 154465, + 154516, + 154497, + 154514, + 154500, + 154458, + 154521, + 154454, + 154499, + 154469, + 154452, + 154485, + 154455, + 154505, + 154520, + 154495, + 154470, + 154496, + 154473, + 154479, + 154469, + 154487, + 154488, + 154501, + 154526, + 154498, + 154470, + 154488, + 154480, + 154517, + 154496, + 154490, + 154462, + 154499, + 154484, + 154512, + 154483, + 154499, + 154502, + 154509, + 154462, + 154464, + 154505, + 154501, + 154500, + 154453, + 154500, + 154501, + 154446, + 154497, + 154464, + 154503, + 154495, + 154505, + 154513, + 154504, + 154503, + 154464, + 154498, + 154482, + 154503, + 154473, + 154484, + 154469, + 154488, + 154488, + 154466, + 154459, + 154482, + 154488, + 154470, + 154457, + 154468, + 154465, + 154499, + 154456, + 154500, + 154486, + 154479, + 154484, + 154482, + 154489, + 154481, + 154489, + 154495, + 154494, + 154497, + 154464, + 154517, + 154454, + 154489, + 154469, + 154489, + 154445, + 154488, + 154488, + 154491, + 154488, + 154498, + 154510, + 154517, + 154519, + 154553, + 154473, + 154510, + 154468, + 154495, + 154502, + 154454, + 154481, + 154474, + 154472, + 154536, + 154475, + 154494, + 154471, + 154478, + 154485, + 154512, + 154467, + 154487, + 154470, + 154495, + 154486, + 154470, + 154474, + 154526, + 154481, + 154498, + 154492, + 154503, + 154497, + 154464, + 154520, + 154482, + 154494, + 154491, + 154470, + 154466, + 154470, + 154471, + 154480, + 154446, + 154516, + 154489, + 154481, + 154528, + 154514, + 154531, + 154488, + 154540, + 154484, + 154476, + 154459, + 154488, + 154497, + 154486, + 154479, + 154466, + 154499, + 154479, + 154462, + 154462, + 154501, + 154483, + 154516, + 154508, + 154501, + 154538, + 154471, + 154485, + 154499, + 154504, + 154493, + 154480, + 154484, + 154477, + 154497, + 154476, + 154464, + 154488, + 154470, + 154483, + 154517, + 154473, + 154462, + 154481, + 154481, + 154502, + 154508, + 154490, + 154484, + 154494, + 154469, + 154519, + 154498, + 154488, + 154503, + 154470, + 154487, + 154505, + 154460, + 154464, + 154460, + 154454, + 154475, + 154474, + 154487, + 154497, + 154507, + 154491, + 154479, + 154474, + 154493, + 154513, + 154449, + 154438, + 154493, + 154488, + 154493, + 154496, + 154483, + 154497, + 154512, + 154477, + 154492, + 154508, + 154466, + 154481, + 154510, + 154488, + 154465, + 154487, + 154494, + 154496, + 154516, + 154495, + 154464, + 154466, + 154501, + 154460, + 154467, + 154481, + 154494, + 154506, + 154457, + 154471, + 154477, + 154490, + 154485, + 154479, + 154485, + 154478, + 154475, + 154512, + 154497, + 154457, + 154473, + 154472, + 154508, + 154500, + 154498, + 154478, + 154477, + 154473, + 154480, + 154478, + 154503, + 154473, + 154468, + 154487, + 154502, + 154499, + 154487, + 154484, + 154466, + 154501, + 154495, + 154461, + 154498, + 154487, + 154465, + 154460, + 154477, + 154505, + 154487, + 154476, + 154455, + 154507, + 154486, + 154476, + 154507, + 154468, + 154483, + 154491, + 154489, + 154633, + 154507, + 154449, + 154501, + 154473, + 154496, + 154525, + 154507, + 154465, + 154468, + 154467, + 154463, + 154487, + 154472, + 154495, + 154479, + 154500, + 154512, + 154493, + 154468, + 154493, + 154485, + 154495, + 154521, + 154472, + 154485, + 154468, + 154479, + 154497, + 154481, + 154491, + 154474, + 154493, + 154470, + 154491, + 154500, + 154532, + 154501, + 154478, + 154559, + 154494, + 154526, + 154488, + 154459, + 154508, + 154494, + 154498, + 154490, + 154496, + 154475, + 154496, + 154472, + 154529, + 154500, + 154469, + 154502, + 154463, + 154494, + 154482, + 154507, + 154503, + 154494, + 154469, + 154469, + 154500, + 154494, + 154503, + 154469, + 154513, + 154469, + 154466, + 154490, + 154473, + 154492, + 154473, + 154482, + 154459, + 154498, + 154459, + 154465, + 154490, + 154485, + 154480, + 154484, + 154484, + 154476, + 154520, + 154492, + 154472, + 154487, + 154500, + 154485, + 154505, + 154509, + 154916, + 154482, + 154468, + 154516, + 154494, + 154498, + 154471, + 154506, + 154516, + 154483, + 154471, + 154459, + 154492, + 154506, + 154493, + 154502, + 154484, + 154477, + 154491, + 154493, + 154506, + 154487, + 154469, + 154486, + 154466, + 154490, + 154501, + 154486, + 154932, + 154493, + 154476, + 154485, + 154466, + 154480, + 154464, + 154481, + 154497, + 154508, + 154518, + 154504, + 154475, + 154504, + 154474, + 154501, + 154487, + 154513, + 154475, + 154479, + 154487, + 154479, + 154507, + 154455, + 154494, + 154493, + 154453, + 154465, + 154537, + 154473, + 154495, + 154490, + 154487, + 154495, + 154502, + 154487, + 154495, + 154444, + 154468, + 154467, + 154506, + 154476, + 154503, + 154494, + 154497, + 154499, + 154498, + 154507, + 154468, + 154469, + 154549, + 154490, + 154501, + 154495, + 154514, + 154494, + 154505, + 154495, + 154487, + 154471, + 154494, + 154488, + 154466, + 154481, + 154505, + 154514, + 154493, + 154462, + 154476, + 154519, + 154470, + 154497, + 154501, + 154484, + 154586, + 154494, + 154473, + 154504, + 154501, + 154460, + 154471, + 154500, + 154471, + 154466, + 154458, + 154490, + 154486, + 154505, + 154467, + 154460, + 154467, + 154462, + 154511, + 154473, + 154480, + 154494, + 154506, + 154515, + 154492, + 154509, + 154496, + 154585, + 154465, + 154516, + 154522, + 154515, + 154498, + 154513, + 154507, + 154509, + 154482, + 154505, + 154504, + 154462, + 154470, + 154465, + 154460, + 154483, + 154522, + 154481, + 154477, + 154487, + 154476, + 154491, + 154452, + 154450, + 154475, + 154465, + 154475, + 154484, + 154494, + 154484, + 154476, + 154462, + 154491, + 154486, + 154457, + 154496, + 154543, + 154497, + 154494, + 154485, + 154482, + 154485, + 154517, + 154466, + 154485, + 154477, + 154461, + 154490, + 154459, + 154477, + 154484, + 154497, + 154493, + 154477, + 154495, + 154497, + 154484, + 154521, + 154484, + 154476, + 154480, + 154514, + 154502, + 154469, + 154448, + 154490, + 154488, + 154496, + 154507, + 154523, + 154506, + 154506, + 154756, + 154463, + 154499, + 154528, + 154537, + 154467, + 154498, + 154506, + 154458, + 154493, + 154478, + 154487, + 154480, + 154515, + 154463, + 154475, + 154523, + 154467, + 154491, + 154472, + 154473, + 154473, + 154490, + 154473, + 154520, + 154475, + 154499, + 154478, + 154488, + 154478, + 154476, + 154474, + 154499, + 154474, + 154485, + 154480, + 154509, + 154503, + 154477, + 154462, + 154517, + 154509, + 154492, + 154495, + 154477, + 154484, + 154494, + 154471, + 154470, + 154457, + 154472, + 154481, + 154485, + 154462, + 154492, + 154449, + 154505, + 154492, + 154461, + 154487, + 154489, + 154527, + 154476, + 154476, + 154500, + 154474, + 154498, + 154475, + 154503, + 154504, + 154501, + 154489, + 154459, + 154469, + 154492, + 154481, + 154472, + 154510, + 154477, + 154507, + 154522, + 154490, + 154490, + 154471, + 154475, + 154476, + 154465, + 154472, + 154502, + 154486, + 154504, + 154456, + 154478, + 154472, + 154482, + 154484, + 154511, + 154513, + 154500, + 154484, + 154496, + 154480, + 154510, + 154507, + 154473, + 154498, + 154478, + 154491, + 154467, + 154533, + 154487, + 154484, + 154477, + 154463, + 154468, + 154465, + 154499, + 154500, + 154482, + 154492, + 154484, + 154506, + 154502, + 154516, + 154512, + 154505, + 154504, + 154483, + 154470, + 154493, + 154475, + 154469, + 154491, + 154467, + 154470, + 154486, + 154483, + 154527, + 154460, + 154486, + 154500, + 154467, + 154513, + 154501, + 154472, + 154513, + 154484, + 154731, + 154503, + 154458, + 154473, + 154465, + 154487, + 154470, + 154479, + 154484, + 154505, + 154504, + 154476, + 155537, + 154527, + 154488, + 154507, + 154482, + 154487, + 154462, + 154483, + 154493, + 154492, + 154475, + 154480, + 154457, + 154553, + 154499, + 154501, + 154481, + 154461, + 154498, + 154512, + 154492, + 154488, + 154465, + 154500, + 154494, + 154462, + 154467, + 154446, + 154485, + 154526, + 154481, + 154504, + 154495, + 154471, + 154486, + 154470, + 154479, + 154474, + 154469, + 154498, + 154497, + 154456, + 154456, + 154499, + 154506, + 154520, + 154500, + 154491, + 154479, + 154516, + 154481, + 154450, + 154553, + 154499, + 154467, + 154514, + 154505, + 154461, + 154514, + 154492, + 154498, + 154472, + 154501, + 154483, + 154497, + 154492, + 154454, + 154512, + 154457, + 154474, + 154477, + 154522, + 154494, + 154485, + 154522, + 154495, + 154512, + 154492, + 154459, + 154498, + 154492, + 154489, + 154515, + 154489, + 154482, + 154460, + 154488, + 154480, + 154488, + 154493, + 154478, + 154474, + 154453, + 154495, + 154501, + 154469, + 154498, + 154498, + 154475, + 154507, + 154498, + 154455, + 154498, + 154486, + 154490, + 154502, + 154524, + 154489, + 154497, + 154495, + 154492, + 154486, + 154575, + 154487, + 154489, + 154459, + 154479, + 154513, + 154497, + 154477, + 154481, + 154483, + 154479, + 154499, + 154503, + 154490, + 154494, + 154494, + 154542, + 154498, + 154492, + 154499, + 154475, + 154457, + 154496, + 154467, + 154634, + 154489, + 154509, + 154453, + 154465, + 154453, + 154481, + 154495, + 154493, + 154468, + 154480, + 154463, + 154498, + 154468, + 154484, + 154513, + 154491, + 154491, + 154508, + 154471, + 154492, + 154446, + 154500, + 154510, + 154491, + 154502, + 154500, + 154518, + 154493, + 154497, + 154504, + 154477, + 154491, + 154498, + 154475, + 154495, + 154498, + 154484, + 154491, + 154443, + 154499, + 154481, + 154482, + 154472, + 154460, + 154505, + 154505, + 154458, + 154498, + 154507, + 154512, + 154471, + 154485, + 154478, + 154514, + 154483, + 154487, + 154462, + 154472, + 154476, + 154506, + 154456, + 154495, + 154484, + 154455, + 154504, + 154483, + 154510, + 154471, + 154539, + 154483, + 154460, + 154488, + 154451, + 154488, + 154479, + 154515, + 154499, + 154480, + 154480, + 154479, + 154476, + 154462, + 154492, + 154483, + 154490, + 154533, + 154496, + 154471, + 154467, + 154465, + 154492, + 154493, + 154502, + 154516, + 154485, + 154506, + 154455, + 154510, + 154475, + 154500, + 154509, + 154478, + 154496, + 154481, + 154467, + 154478, + 154485, + 154502, + 154507, + 154516, + 154478, + 154457, + 154528, + 154487, + 154484, + 154467, + 154484, + 154463, + 154518, + 154460, + 154470, + 154471, + 154515, + 154487, + 154465, + 154486, + 154497, + 154499, + 154488, + 154462, + 154508, + 154492, + 154487, + 154495, + 154492, + 154467, + 154475, + 154471, + 154500, + 154480, + 154471, + 154482, + 154486, + 154496, + 154490, + 154488, + 154530, + 154508, + 154473, + 154450, + 154546, + 154483, + 154498, + 154488, + 154496, + 154479, + 154484, + 154498, + 154484, + 154468, + 154473, + 154479, + 154485, + 154510, + 154468, + 154491, + 154473, + 154490, + 154462, + 154503, + 154493, + 154485, + 154473, + 154518, + 154473, + 154497, + 154458, + 154506, + 154498, + 154468, + 154484, + 154501, + 154477, + 154445, + 154468, + 154472, + 154491, + 154489, + 154484, + 154487, + 154469, + 154463, + 154473, + 154471, + 154474, + 154510, + 154547, + 154517, + 154502, + 154494, + 154472, + 154504, + 154485, + 154513, + 154482, + 154492, + 154460, + 154480, + 154515, + 154477, + 154463, + 154501, + 154480, + 154469, + 154469, + 154499, + 154491, + 154518, + 154513, + 154500, + 154477, + 154474, + 154486, + 154465, + 154503, + 154457, + 154524, + 154479, + 154503, + 154485, + 154495, + 154503, + 154492, + 154489, + 154490, + 154467, + 154505, + 154501, + 154505, + 154465, + 154489, + 154493, + 154482, + 154502, + 154506, + 154494, + 154500, + 154474, + 154499, + 154492, + 154485, + 154529, + 154492, + 154470, + 154485, + 154460, + 154479, + 154492, + 154482, + 154465, + 154490, + 154505, + 154483, + 154481, + 154471, + 154517, + 154502, + 154486, + 154787, + 154604, + 154476, + 154461, + 154488, + 154484, + 154495, + 154502, + 154463, + 154495, + 154476, + 154505, + 154479, + 154488, + 154479, + 154479, + 154492, + 154477, + 154492, + 154492, + 154486, + 154498, + 154506, + 154470, + 154481, + 154472, + 154482, + 154488, + 154503, + 154482, + 154512, + 154455, + 154495, + 154461, + 154481, + 154479, + 154496, + 154474, + 154485, + 154486, + 154494, + 154468, + 154523, + 154466, + 154499, + 154462, + 154508, + 154460, + 154488, + 154487, + 154464, + 154493, + 154457, + 154503, + 154497, + 154511, + 154493, + 154504, + 154462, + 154475, + 154486, + 154494, + 154489, + 154502, + 154496, + 154491, + 154509, + 154498, + 154461, + 154495, + 154466, + 154499, + 154491, + 154500, + 154516, + 154484, + 154510, + 154493, + 154462, + 154455, + 154497, + 154485, + 154491, + 154466, + 154497, + 154496, + 154462, + 154464, + 154492, + 154490, + 154487, + 154502, + 154505, + 154480, + 154494, + 154507, + 154502, + 154486, + 154464, + 154528, + 154481, + 154475, + 154492, + 154487, + 154519, + 154471, + 154487, + 154501, + 154482, + 154474, + 154507, + 154499, + 154471, + 154477, + 154512, + 154507, + 154491, + 154472, + 154501, + 154478, + 154461, + 154473, + 154496, + 154479, + 154477, + 154483, + 154487, + 154501, + 154495, + 154518, + 154456, + 154486, + 154479, + 154495, + 154465, + 154480, + 154495, + 154498, + 154484, + 154497, + 154498, + 154468, + 154482, + 154478, + 154490, + 154487, + 154496, + 154490, + 154509, + 154499, + 154481, + 154473, + 154476, + 154515, + 154507, + 154486, + 154501, + 154487, + 154466, + 154479, + 154467, + 154473, + 154455, + 154456, + 154476, + 154471, + 154472, + 154489, + 154502, + 154503, + 154493, + 154463, + 154497, + 154507, + 154501, + 154458, + 155218, + 154494, + 154474, + 154472, + 154499, + 154493, + 154507, + 154490, + 154501, + 154489, + 154481, + 154488, + 154470, + 154478, + 154492, + 154503, + 154474, + 154495, + 154460, + 154482, + 154484, + 154451, + 154482, + 154504, + 154473, + 154470, + 154477, + 154490, + 154491, + 154497, + 154456, + 154508, + 154498, + 154462, + 154483, + 154458, + 154474, + 154476, + 154487, + 154466, + 154508, + 154459, + 154480, + 154469, + 154459, + 154490, + 154489, + 154491, + 154473, + 154497, + 154494, + 154488, + 154472, + 154472, + 154470, + 154547, + 154497, + 154462, + 154502, + 154592, + 154496, + 154490, + 154519, + 154490, + 154497, + 154484, + 154478, + 154504, + 154496, + 154503, + 154504, + 154478, + 154476, + 154490, + 154490, + 154499, + 154482, + 154504, + 154464, + 154512, + 154499, + 154495, + 154487, + 154470, + 154518, + 154496, + 154462, + 154491, + 154507, + 154488, + 154460, + 154469, + 154463, + 154494, + 154502, + 154497, + 154477, + 154504, + 154503, + 154485, + 154505, + 154472, + 154508, + 154489, + 154493, + 154466, + 154483, + 154497, + 154505, + 154457, + 154525, + 154453, + 154504, + 154516, + 154496, + 154496, + 154496, + 154455, + 154490, + 154479, + 154516, + 154478, + 154499, + 154467, + 154493, + 154489, + 154501, + 154485, + 154492, + 154479, + 154456, + 154492, + 154484, + 154454, + 154475, + 154467, + 154495, + 154507, + 154479, + 154507, + 154499, + 154481, + 154586, + 154469, + 154464, + 154471, + 154495, + 154505, + 154481, + 154478, + 154491, + 154487, + 154481, + 154501, + 154477, + 154489, + 154464, + 154535, + 154468, + 154495, + 154467, + 154481, + 154446, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 152641, + 152559, + 152523, + 152492, + 152515, + 152552, + 152528, + 152595, + 152542, + 152551, + 152523, + 152542, + 152533, + 152525, + 152525, + 152537, + 152518, + 152529, + 152535, + 152511, + 152524, + 152521, + 152550, + 152535, + 152511, + 152551, + 152542, + 152518, + 152508, + 152539, + 152529, + 152519, + 152518, + 152534, + 152521, + 152564, + 152516, + 152515, + 152535, + 152518, + 152498, + 152526, + 152540, + 152541, + 152537, + 152553, + 152525, + 152523, + 152525, + 152528, + 152491, + 152524, + 152525, + 152533, + 152533, + 152539, + 152514, + 152550, + 152515, + 152541, + 152497, + 152551, + 152529, + 152515, + 152516, + 152536, + 152533, + 152495, + 152515, + 152528, + 152543, + 152499, + 152524, + 152485, + 152532, + 152506, + 152510, + 152543, + 152585, + 152538, + 152519, + 152517, + 152527, + 152504, + 152565, + 152505, + 152529, + 152537, + 152545, + 152547, + 152513, + 152500, + 152503, + 152510, + 152516, + 152542, + 152527, + 152536, + 152505, + 152541, + 152532, + 152537, + 152547, + 152559, + 152525, + 152517, + 152551, + 152495, + 152509, + 152506, + 152536, + 152546, + 152483, + 152538, + 152509, + 152540, + 152561, + 152524, + 152533, + 152512, + 152521, + 152544, + 152537, + 152536, + 152505, + 152542, + 152541, + 152513, + 152564, + 152487, + 152522, + 152505, + 152548, + 152526, + 152523, + 152530, + 152539, + 152548, + 152518, + 152560, + 152547, + 152526, + 152516, + 152532, + 152523, + 152552, + 152551, + 152524, + 152536, + 152528, + 152542, + 152514, + 152550, + 152535, + 152517, + 152523, + 152529, + 152535, + 152541, + 152520, + 152509, + 152519, + 152537, + 152541, + 152537, + 152547, + 152553, + 152502, + 152529, + 152506, + 152530, + 152519, + 152488, + 152515, + 152509, + 152503, + 152566, + 152528, + 152536, + 152514, + 152506, + 152527, + 152538, + 152522, + 152560, + 152541, + 152524, + 152502, + 152501, + 152495, + 152495, + 152533, + 152529, + 152558, + 152563, + 152520, + 152547, + 152548, + 152521, + 152545, + 152527, + 152519, + 152547, + 152508, + 152515, + 152543, + 152525, + 152510, + 152508, + 152541, + 152556, + 152504, + 152516, + 152523, + 152540, + 152538, + 152531, + 152503, + 152548, + 152555, + 152514, + 152534, + 152526, + 152529, + 152529, + 152563, + 152505, + 152543, + 152550, + 152565, + 152485, + 152527, + 152537, + 152511, + 152530, + 152524, + 152552, + 152535, + 152506, + 152534, + 152502, + 152508, + 152548, + 152539, + 152511, + 152536, + 152538, + 152547, + 152540, + 152549, + 152538, + 152497, + 152540, + 152532, + 152488, + 152533, + 152569, + 152506, + 152536, + 152508, + 152541, + 152525, + 152507, + 152504, + 152483, + 152533, + 152549, + 152535, + 152521, + 152523, + 152488, + 152482, + 152569, + 152508, + 152524, + 152554, + 152524, + 152529, + 152547, + 152527, + 152512, + 152512, + 152540, + 152534, + 152534, + 152818, + 152530, + 152523, + 152502, + 152519, + 152563, + 152540, + 152503, + 152539, + 152525, + 152539, + 152506, + 152533, + 152530, + 152514, + 152604, + 152523, + 152511, + 152503, + 152509, + 152524, + 152529, + 152534, + 152530, + 152519, + 152508, + 152515, + 153011, + 152527, + 152515, + 152568, + 152532, + 152522, + 152499, + 152535, + 152528, + 152511, + 152515, + 152511, + 152514, + 152550, + 152497, + 152498, + 152542, + 152526, + 152553, + 152522, + 152559, + 152517, + 152526, + 152510, + 152523, + 152551, + 152526, + 152497, + 152519, + 152503, + 152513, + 152567, + 152532, + 152511, + 152538, + 152533, + 152531, + 152524, + 152517, + 152501, + 152544, + 152552, + 152510, + 152534, + 152492, + 152506, + 152527, + 152563, + 152515, + 152509, + 152526, + 152518, + 152530, + 152511, + 152556, + 152527, + 152535, + 152499, + 152495, + 152487, + 152517, + 152529, + 152566, + 152535, + 152578, + 152537, + 152549, + 152543, + 152539, + 152542, + 152566, + 152545, + 152531, + 152510, + 152555, + 152554, + 152547, + 152526, + 152519, + 152551, + 152562, + 152507, + 152577, + 152532, + 152532, + 152528, + 152543, + 152524, + 152496, + 152531, + 152511, + 152519, + 152548, + 152534, + 152524, + 152490, + 152531, + 152520, + 152524, + 152508, + 152542, + 152515, + 152510, + 152549, + 152526, + 152517, + 152493, + 152550, + 152501, + 152544, + 152518, + 152521, + 152512, + 152523, + 152516, + 152529, + 152540, + 152501, + 152507, + 152537, + 152522, + 152547, + 152532, + 152546, + 152551, + 152538, + 152524, + 152509, + 152524, + 152522, + 152511, + 152513, + 152540, + 152523, + 152572, + 152521, + 152544, + 152526, + 152550, + 152535, + 152504, + 152519, + 152505, + 152532, + 152517, + 152535, + 152525, + 152545, + 152542, + 152533, + 152534, + 152547, + 152541, + 152531, + 152516, + 152520, + 152520, + 152531, + 152544, + 152532, + 152527, + 152543, + 152539, + 152577, + 152515, + 152521, + 152604, + 152515, + 152530, + 152530, + 152527, + 152507, + 152534, + 152506, + 152499, + 152507, + 152500, + 152502, + 152500, + 152502, + 152518, + 152507, + 152510, + 152527, + 152509, + 152526, + 152514, + 152548, + 152547, + 152518, + 152538, + 152494, + 152503, + 152529, + 152505, + 152530, + 152502, + 152496, + 152509, + 152543, + 152529, + 152510, + 152500, + 152544, + 152542, + 152495, + 152504, + 152521, + 152531, + 152509, + 152556, + 152510, + 152521, + 152511, + 152536, + 152508, + 152506, + 152555, + 152511, + 152518, + 152535, + 152533, + 152523, + 152551, + 152502, + 152512, + 152495, + 152479, + 152540, + 152511, + 152551, + 152527, + 152507, + 152540, + 152522, + 152540, + 152504, + 152506, + 152528, + 152517, + 152528, + 152517, + 152545, + 152531, + 152499, + 152522, + 152549, + 152536, + 152516, + 152550, + 152521, + 152528, + 152507, + 152527, + 152506, + 152494, + 152527, + 152533, + 152504, + 152524, + 152504, + 152513, + 152521, + 152522, + 152566, + 152526, + 152544, + 152502, + 152547, + 152525, + 152508, + 152537, + 152509, + 152489, + 152543, + 152517, + 152486, + 152581, + 152561, + 152535, + 152523, + 152517, + 152535, + 152555, + 152500, + 152501, + 152533, + 152518, + 152520, + 152546, + 152513, + 152536, + 152490, + 152514, + 152506, + 152538, + 152530, + 152518, + 152544, + 152508, + 152485, + 152499, + 152544, + 152519, + 152516, + 152653, + 152536, + 152542, + 152524, + 152533, + 152542, + 152531, + 152508, + 152532, + 152522, + 152501, + 152521, + 152510, + 152520, + 152524, + 152490, + 152509, + 152531, + 152517, + 152524, + 152535, + 152516, + 152523, + 152513, + 152534, + 152527, + 152506, + 152506, + 152508, + 152565, + 152527, + 152523, + 152523, + 152534, + 152523, + 152533, + 152530, + 152533, + 152526, + 152542, + 152538, + 152502, + 152511, + 152544, + 152531, + 152527, + 152534, + 152543, + 152513, + 152525, + 152523, + 152522, + 152516, + 152544, + 152511, + 152520, + 152511, + 152517, + 152537, + 152501, + 152515, + 152530, + 152518, + 152505, + 152528, + 152514, + 152542, + 152518, + 152501, + 152547, + 152523, + 152504, + 152480, + 152515, + 152545, + 152529, + 152558, + 152540, + 152496, + 152514, + 152519, + 152534, + 152499, + 152536, + 152522, + 152502, + 152507, + 152509, + 152526, + 152507, + 152520, + 152509, + 152515, + 152485, + 152519, + 152532, + 152534, + 152505, + 152515, + 152538, + 152550, + 152521, + 152508, + 152491, + 152505, + 152535, + 152538, + 152512, + 152492, + 152472, + 152507, + 152529, + 152568, + 152481, + 152512, + 152513, + 152535, + 152499, + 152529, + 152542, + 152512, + 152494, + 152538, + 152558, + 152478, + 152517, + 152530, + 152528, + 152572, + 152525, + 152520, + 152508, + 152550, + 152528, + 152540, + 152513, + 152539, + 152539, + 152569, + 152533, + 152512, + 152510, + 152512, + 152537, + 152532, + 152527, + 152554, + 152519, + 152567, + 152514, + 152491, + 152539, + 152505, + 152504, + 152536, + 152530, + 152506, + 152529, + 152520, + 152507, + 152535, + 152488, + 152535, + 152536, + 152506, + 152517, + 152511, + 152535, + 152525, + 152473, + 152479, + 152536, + 152510, + 152537, + 152508, + 152521, + 152537, + 152501, + 152568, + 152507, + 152500, + 152523, + 152528, + 152533, + 152509, + 152514, + 152500, + 152497, + 152527, + 152531, + 152536, + 152540, + 152492, + 152526, + 152537, + 152541, + 152512, + 152534, + 152539, + 152489, + 152527, + 152543, + 152491, + 152512, + 152519, + 152520, + 152539, + 152520, + 152545, + 152512, + 152502, + 152517, + 152509, + 152519, + 152487, + 152488, + 152549, + 152519, + 152512, + 152547, + 152539, + 152496, + 152528, + 152519, + 152553, + 152531, + 152497, + 152524, + 152506, + 152530, + 152497, + 152498, + 152514, + 152500, + 152518, + 152500, + 152509, + 152532, + 152511, + 152512, + 152532, + 152494, + 152501, + 152502, + 152526, + 152522, + 152530, + 152537, + 152536, + 152534, + 152523, + 152535, + 152544, + 152529, + 152536, + 152530, + 152527, + 152548, + 152544, + 152537, + 152525, + 152534, + 152520, + 152542, + 152536, + 152507, + 152569, + 152540, + 152526, + 152551, + 152523, + 152519, + 152508, + 152543, + 152533, + 152499, + 152537, + 152541, + 152501, + 152512, + 152540, + 152551, + 152521, + 152508, + 152539, + 152561, + 152529, + 152566, + 152537, + 152512, + 152528, + 152513, + 152515, + 152521, + 152518, + 152497, + 152513, + 152539, + 152533, + 152491, + 152528, + 152536, + 152514, + 152543, + 152495, + 152560, + 152533, + 152534, + 152545, + 152540, + 152496, + 152481, + 152537, + 152533, + 152558, + 152524, + 152527, + 152530, + 152551, + 152498, + 152529, + 152544, + 152543, + 152496, + 152517, + 152540, + 152537, + 152534, + 152515, + 152521, + 152527, + 152547, + 152531, + 152513, + 152529, + 152515, + 152520, + 152518, + 152535, + 152503, + 152584, + 152513, + 152526, + 152518, + 152518, + 152515, + 152528, + 152536, + 152508, + 152526, + 152537, + 152486, + 152491, + 152519, + 152512, + 152497, + 152518, + 152498, + 152504, + 152518, + 152531, + 152556, + 152547, + 152516, + 152518, + 152515, + 152525, + 152532, + 152519, + 152511, + 152516, + 152507, + 152536, + 152533, + 152506, + 152513, + 152540, + 152508, + 152509, + 152547, + 152512, + 152543, + 152498, + 152540, + 152529, + 152557, + 152491, + 152525, + 152560, + 152527, + 152555, + 152509, + 152531, + 152491, + 152511, + 152518, + 152533, + 152548, + 152526, + 152536, + 152507, + 152526, + 152536, + 152530 + ], + "sample_count": 15277 + }, + { + "pubkey": "533Kd2nuVj4dpZxb6q5v4gpbuc73eBKcvqze1GHfAXbD", + "epoch": 89, + "origin_device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "target_device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "link_pk": "9BPmBzZSBDUkRVYWAbEDmDxqAaCHFQFCymxLguiz2drj", + "origin_device_location_pk": "7vt8Tnbk15S6JA1uhRQVtbuL7w39zY8jeQ5iqgjsqLfP", + "target_device_location_pk": "8Crp8LgRPCapwdzQiFYeyNtwi8FVooCd9si1ujWwLuHQ", + "origin_device_agent_pk": "6LHRkoEGNAPH2fFndCudK94pQU9v5Hk4DEKX253CbNHy", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242127283437, + "samples": [ + 5745, + 5735, + 5748, + 5721, + 5773, + 5738, + 5778, + 5762, + 5752, + 5733, + 5778, + 5760, + 5732, + 5743, + 5772, + 5776, + 5737, + 5731, + 5764, + 5764, + 5725, + 5727, + 5768, + 5751, + 5778, + 5767, + 5798, + 5745, + 5760, + 5743, + 5793, + 5750, + 5763, + 5759, + 5786, + 5728, + 5743, + 5726, + 5744, + 5752, + 5764, + 5745, + 5769, + 5737, + 5793, + 5728, + 5766, + 5731, + 5764, + 5715, + 5797, + 5756, + 5766, + 5740, + 5771, + 5784, + 5739, + 5779, + 5753, + 5728, + 5772, + 5740, + 5806, + 5758, + 5786, + 5732, + 5729, + 5742, + 5731, + 5743, + 5754, + 5743, + 5764, + 5747, + 5740, + 5732, + 5774, + 5738, + 5763, + 5750, + 5716, + 5744, + 5797, + 5782, + 5752, + 5761, + 5754, + 5720, + 5753, + 5742, + 5736, + 5762, + 5712, + 5743, + 5758, + 5749, + 5733, + 5762, + 5741, + 5733, + 5766, + 5773, + 5746, + 5775, + 5813, + 5756, + 5754, + 5744, + 5739, + 5777, + 5740, + 5741, + 5762, + 5760, + 5745, + 5766, + 5736, + 5757, + 5754, + 5724, + 5833, + 5786, + 5792, + 5750, + 5778, + 5716, + 5760, + 5784, + 5746, + 5768, + 5781, + 5729, + 5738, + 5781, + 5769, + 5732, + 5764, + 5775, + 5714, + 5791, + 5796, + 5743, + 5775, + 5749, + 5762, + 5787, + 5785, + 5736, + 5745, + 5736, + 5735, + 5798, + 5741, + 5760, + 5781, + 5758, + 5767, + 5787, + 5724, + 5741, + 5763, + 5739, + 5728, + 5766, + 5798, + 5753, + 5798, + 5783, + 5761, + 5778, + 5780, + 5753, + 5739, + 5769, + 5785, + 5746, + 5800, + 5734, + 5778, + 5733, + 5729, + 5777, + 5786, + 5754, + 5771, + 5763, + 5723, + 5752, + 5788, + 5742, + 5766, + 5754, + 5763, + 5738, + 5772, + 5768, + 5772, + 5789, + 5778, + 5774, + 5735, + 5758, + 5775, + 5757, + 5725, + 5743, + 5735, + 5728, + 5765, + 5772, + 5745, + 5724, + 5759, + 5784, + 5748, + 5765, + 5761, + 5762, + 5733, + 5747, + 5747, + 5763, + 5744, + 5764, + 5778, + 5757, + 5773, + 5725, + 5761, + 5797, + 5786, + 5730, + 5822, + 5771, + 5763, + 5817, + 5731, + 5742, + 5754, + 5745, + 5728, + 5788, + 5747, + 5782, + 5808, + 5777, + 5768, + 5736, + 5755, + 5746, + 5747, + 5819, + 5768, + 5739, + 5770, + 5715, + 5731, + 5743, + 5805, + 5753, + 5792, + 5762, + 5775, + 5770, + 5754, + 5737, + 5784, + 5764, + 5759, + 5729, + 5787, + 5752, + 5774, + 5778, + 5775, + 5785, + 5781, + 5809, + 5818, + 5731, + 5763, + 5792, + 5728, + 5740, + 5789, + 5744, + 5778, + 5751, + 5722, + 5729, + 5777, + 5754, + 5781, + 5796, + 5763, + 5734, + 5773, + 5764, + 5826, + 5761, + 5781, + 5756, + 5743, + 5760, + 5768, + 5749, + 5771, + 5772, + 5757, + 5719, + 5785, + 5739, + 5764, + 5759, + 5757, + 5770, + 5779, + 5766, + 5763, + 5730, + 5758, + 5744, + 5778, + 5761, + 5740, + 5821, + 5752, + 5734, + 5797, + 5782, + 5820, + 5814, + 5749, + 5878, + 5759, + 5761, + 5790, + 5810, + 5759, + 5780, + 5771, + 5735, + 5774, + 5783, + 5723, + 5777, + 5776, + 5735, + 5788, + 5755, + 5735, + 5757, + 5783, + 5754, + 5784, + 5758, + 5771, + 5743, + 5766, + 5775, + 5771, + 5775, + 5740, + 5770, + 5777, + 5786, + 5730, + 5772, + 5770, + 5755, + 5746, + 5718, + 5717, + 5761, + 5757, + 5805, + 5773, + 5729, + 5718, + 5747, + 5783, + 5781, + 5752, + 5786, + 5791, + 5744, + 5771, + 5743, + 5775, + 5720, + 5739, + 5760, + 5750, + 5750, + 5795, + 5798, + 5795, + 5760, + 5763, + 5763, + 5767, + 5749, + 5761, + 5780, + 5727, + 5744, + 5757, + 5752, + 5721, + 5774, + 5798, + 5756, + 5742, + 5717, + 5731, + 5740, + 5738, + 5764, + 5758, + 5754, + 5757, + 5771, + 5818, + 5744, + 5743, + 5735, + 5738, + 5738, + 5760, + 5706, + 5767, + 5726, + 5789, + 5750, + 5790, + 5789, + 5767, + 5777, + 5772, + 5778, + 5768, + 5725, + 5782, + 5745, + 5749, + 5766, + 5725, + 5738, + 5766, + 5744, + 5757, + 5804, + 5818, + 5772, + 5784, + 5740, + 5759, + 5711, + 5764, + 5730, + 5756, + 5758, + 5788, + 5731, + 5743, + 5769, + 5740, + 5773, + 5737, + 5800, + 5764, + 5760, + 5787, + 5795, + 5728, + 5786, + 5768, + 5755, + 5760, + 5723, + 5744, + 5768, + 5749, + 5756, + 5766, + 5781, + 5783, + 5761, + 5777, + 5760, + 5768, + 5764, + 5768, + 5734, + 5787, + 5717, + 5754, + 5756, + 5760, + 5768, + 5725, + 5745, + 5752, + 5762, + 5792, + 5763, + 5773, + 5774, + 5770, + 5749, + 5770, + 5738, + 5747, + 5743, + 5749, + 5739, + 5736, + 5753, + 5770, + 5773, + 5780, + 5789, + 5750, + 5779, + 5862, + 5768, + 5748, + 5765, + 5722, + 5736, + 5723, + 5725, + 5757, + 5754, + 5777, + 5774, + 5734, + 5758, + 5759, + 5756, + 5772, + 5762, + 5778, + 5762, + 5757, + 5751, + 5792, + 5745, + 5753, + 5728, + 5740, + 5762, + 5780, + 5759, + 5725, + 5742, + 5794, + 5784, + 5764, + 5766, + 5732, + 5738, + 5766, + 5772, + 5762, + 5766, + 5781, + 5739, + 5788, + 5719, + 5746, + 5771, + 5765, + 5721, + 5739, + 5749, + 5709, + 5734, + 5771, + 5722, + 5757, + 5751, + 5740, + 5736, + 5787, + 5724, + 5786, + 5775, + 5754, + 5763, + 5766, + 5754, + 5763, + 5741, + 5808, + 5741, + 5814, + 5722, + 5761, + 5742, + 5739, + 5726, + 5769, + 5752, + 5752, + 5769, + 5720, + 5775, + 5722, + 5724, + 5766, + 5739, + 5730, + 5769, + 5759, + 5793, + 5770, + 5735, + 5719, + 5762, + 5771, + 5747, + 5754, + 5770, + 5749, + 5719, + 5772, + 5755, + 5745, + 5758, + 5762, + 5777, + 5774, + 5760, + 5788, + 5812, + 5766, + 5797, + 5791, + 5748, + 5815, + 5743, + 5726, + 5720, + 5753, + 5768, + 5764, + 5765, + 5792, + 5741, + 5748, + 5766, + 5764, + 5762, + 5799, + 5777, + 5777, + 5743, + 5779, + 5776, + 5741, + 5771, + 5739, + 5746, + 5770, + 5751, + 5746, + 5801, + 5733, + 5742, + 5754, + 5730, + 5715, + 5850, + 5783, + 5731, + 5825, + 5732, + 5743, + 5799, + 5742, + 5737, + 5744, + 5753, + 5721, + 5763, + 5779, + 5728, + 5744, + 5782, + 5758, + 5771, + 5772, + 5734, + 5777, + 5744, + 5750, + 5750, + 5734, + 5744, + 5768, + 5764, + 5722, + 5730, + 5766, + 5744, + 5750, + 5748, + 5786, + 5740, + 5756, + 5741, + 5779, + 5762, + 5809, + 5783, + 5763, + 5735, + 5738, + 5734, + 5782, + 5772, + 5725, + 5765, + 5781, + 5768, + 5742, + 5767, + 5762, + 5775, + 5759, + 5740, + 5768, + 5789, + 5741, + 5770, + 5786, + 5747, + 5725, + 5774, + 5739, + 5782, + 5769, + 5732, + 5756, + 5753, + 5763, + 5724, + 5758, + 5721, + 5761, + 5739, + 5737, + 5802, + 5738, + 5810, + 5728, + 5743, + 5786, + 5729, + 5775, + 5735, + 5719, + 5754, + 5746, + 5726, + 5771, + 5726, + 5775, + 5721, + 5759, + 5760, + 5743, + 5744, + 5761, + 5736, + 5732, + 5769, + 5783, + 5750, + 5820, + 5748, + 5753, + 5770, + 5772, + 5768, + 5786, + 5763, + 5749, + 5744, + 5754, + 5756, + 5787, + 6099, + 5758, + 5744, + 5773, + 5786, + 5741, + 5774, + 5775, + 5776, + 5780, + 5749, + 5859, + 5781, + 5800, + 5770, + 5779, + 5734, + 5760, + 5747, + 5786, + 5761, + 5784, + 5726, + 5741, + 5747, + 5720, + 5715, + 5750, + 5739, + 5786, + 5751, + 5739, + 5776, + 5767, + 5724, + 5748, + 5761, + 5755, + 5772, + 5765, + 5747, + 5791, + 5766, + 5755, + 5779, + 5805, + 5737, + 5727, + 5797, + 5761, + 5757, + 5789, + 5722, + 5732, + 5741, + 5782, + 5776, + 5782, + 5755, + 5753, + 5731, + 5741, + 5758, + 5772, + 5741, + 5794, + 5756, + 5753, + 5727, + 5757, + 5756, + 5776, + 5749, + 5742, + 5766, + 5741, + 5761, + 5737, + 5727, + 5782, + 5769, + 5766, + 5855, + 5764, + 5811, + 5782, + 5758, + 5770, + 5756, + 5742, + 5742, + 5757, + 5743, + 5793, + 5777, + 5743, + 5792, + 5735, + 5722, + 5763, + 5787, + 5818, + 5795, + 5748, + 5737, + 5763, + 5750, + 5743, + 5780, + 5724, + 5792, + 5772, + 5758, + 5742, + 5778, + 5773, + 5776, + 5768, + 5775, + 5737, + 5732, + 5764, + 5771, + 5743, + 5754, + 5765, + 5741, + 5831, + 5743, + 5810, + 5717, + 5741, + 5762, + 5728, + 5756, + 5764, + 5756, + 5738, + 5713, + 5769, + 5734, + 5805, + 5722, + 5732, + 5767, + 5770, + 5734, + 5745, + 5785, + 5724, + 5784, + 5737, + 5743, + 5757, + 5761, + 5755, + 5724, + 5794, + 5805, + 5761, + 5758, + 5781, + 5740, + 5756, + 5736, + 5758, + 5730, + 5779, + 5773, + 5773, + 5760, + 5768, + 5727, + 5786, + 5763, + 5731, + 5736, + 5795, + 5779, + 5722, + 5754, + 5780, + 5744, + 5784, + 5724, + 5761, + 5779, + 5777, + 5724, + 5792, + 5739, + 5718, + 5755, + 5761, + 5739, + 5783, + 5764, + 5793, + 5745, + 5776, + 5765, + 5770, + 5740, + 5774, + 5755, + 5769, + 5752, + 5768, + 5767, + 5741, + 5776, + 5784, + 5745, + 5766, + 5733, + 5733, + 5725, + 5770, + 5735, + 5749, + 5715, + 5736, + 5772, + 5780, + 5739, + 5777, + 5724, + 5767, + 5741, + 5795, + 5721, + 5779, + 5761, + 5749, + 5750, + 5770, + 5749, + 5733, + 5726, + 5772, + 5798, + 5789, + 5763, + 5787, + 5787, + 5764, + 5778, + 5778, + 5745, + 5783, + 5736, + 5786, + 5767, + 5799, + 5759, + 5785, + 5778, + 5774, + 5765, + 5744, + 5721, + 5768, + 5760, + 5765, + 5795, + 5736, + 5755, + 5752, + 5728, + 5725, + 5756, + 5722, + 5789, + 5789, + 5744, + 5734, + 5775, + 5768, + 5739, + 5740, + 5754, + 5757, + 5727, + 5750, + 5754, + 5756, + 5741, + 5743, + 5725, + 5744, + 5771, + 5778, + 5725, + 5778, + 5760, + 5712, + 5760, + 5776, + 5712, + 5733, + 5714, + 5758, + 5733, + 5767, + 5739, + 5725, + 5763, + 5757, + 5761, + 5753, + 5737, + 5757, + 5766, + 5785, + 5728, + 5772, + 5730, + 5737, + 5780, + 5811, + 5759, + 5739, + 5732, + 5768, + 5757, + 5752, + 5786, + 5746, + 5756, + 5771, + 5736, + 5728, + 5732, + 5790, + 5748, + 5760, + 5850, + 5746, + 5774, + 5732, + 5748, + 5782, + 5724, + 5723, + 5728, + 5771, + 5722, + 5793, + 5709, + 5770, + 5736, + 5821, + 5764, + 5730, + 5754, + 5783, + 5718, + 5773, + 5738, + 5780, + 5755, + 5740, + 5746, + 5752, + 5751, + 5768, + 5794, + 5768, + 5743, + 5815, + 5773, + 5752, + 5759, + 5728, + 5846, + 5750, + 5730, + 5755, + 5779, + 5730, + 5743, + 5817, + 5728, + 5720, + 5766, + 5741, + 5718, + 5782, + 5742, + 5751, + 5722, + 5784, + 5820, + 5754, + 5715, + 5775, + 5751, + 5773, + 5736, + 5803, + 5766, + 5717, + 5741, + 5774, + 5763, + 5752, + 5754, + 5745, + 5772, + 5765, + 5745, + 5779, + 5754, + 5807, + 5757, + 5772, + 5728, + 5777, + 5738, + 5778, + 5787, + 5793, + 5729, + 5758, + 5723, + 5733, + 5750, + 5770, + 5766, + 5775, + 5756, + 5765, + 5758, + 5734, + 5762, + 5779, + 5754, + 5786, + 5726, + 5767, + 5729, + 5785, + 5729, + 5774, + 5765, + 5739, + 5777, + 5762, + 5754, + 5779, + 5726, + 5774, + 5767, + 5781, + 5726, + 5736, + 5763, + 5730, + 5734, + 5794, + 5717, + 5772, + 5777, + 5752, + 5746, + 5763, + 5735, + 5745, + 5760, + 5735, + 5734, + 5791, + 5745, + 5747, + 5728, + 5776, + 5760, + 5774, + 5711, + 5750, + 5783, + 5760, + 5750, + 5755, + 5757, + 5779, + 5782, + 5742, + 5763, + 5741, + 5745, + 5737, + 5765, + 5775, + 5759, + 5805, + 5761, + 5733, + 5750, + 5789, + 5770, + 5772, + 5758, + 5780, + 5798, + 5778, + 5750, + 5762, + 5737, + 5763, + 5732, + 5804, + 5728, + 5775, + 5730, + 5764, + 5745, + 5773, + 5739, + 5788, + 5771, + 5723, + 5799, + 5735, + 5791, + 5765, + 5755, + 5780, + 5711, + 5791, + 5769, + 5759, + 5734, + 5745, + 5732, + 5756, + 5731, + 5791, + 5762, + 5777, + 5800, + 5799, + 5726, + 5762, + 5761, + 5773, + 5724, + 5777, + 5749, + 5815, + 5723, + 5801, + 5795, + 5762, + 5756, + 5788, + 5779, + 5792, + 5789, + 5774, + 5744, + 5760, + 5740, + 5783, + 5816, + 5799, + 5758, + 5760, + 5757, + 5743, + 5778, + 5770, + 5757, + 5789, + 5752, + 5733, + 5735, + 5742, + 5752, + 5758, + 5731, + 5767, + 5776, + 5791, + 5739, + 5772, + 5733, + 5732, + 5782, + 5771, + 5803, + 5764, + 5769, + 5738, + 5738, + 5776, + 5741, + 5763, + 5719, + 5779, + 5741, + 5773, + 5749, + 5758, + 5825, + 5753, + 5839, + 5724, + 5743, + 5742, + 5729, + 5831, + 5794, + 5749, + 5747, + 5748, + 5746, + 5746, + 5732, + 5769, + 5721, + 5786, + 5759, + 5732, + 5767, + 5770, + 5794, + 5739, + 5744, + 5736, + 5787, + 5761, + 5737, + 5781, + 5782, + 5786, + 5784, + 5771, + 5794, + 5750, + 5732, + 5777, + 5779, + 5765, + 5735, + 5774, + 5754, + 5738, + 5752, + 5758, + 5750, + 5776, + 5730, + 5771, + 5806, + 5744, + 5745, + 5778, + 5728, + 5725, + 5798, + 5773, + 5730, + 5740, + 5727, + 5748, + 5765, + 5723, + 5751, + 5767, + 5858, + 5734, + 5728, + 5770, + 5775, + 5784, + 5730, + 5722, + 5765, + 5766, + 5743, + 5761, + 5746, + 5761, + 5743, + 5776, + 5751, + 5742, + 5726, + 5805, + 5794, + 5746, + 5747, + 5773, + 5763, + 5801, + 5790, + 5771, + 5757, + 5766, + 5710, + 5752, + 5757, + 5737, + 5768, + 5741, + 5740, + 5740, + 5731, + 5761, + 5748, + 5787, + 5734, + 5735, + 5793, + 5763, + 5783, + 5752, + 5740, + 5724, + 5837, + 5763, + 5749, + 5718, + 5721, + 5724, + 5743, + 5780, + 5724, + 5794, + 5728, + 5748, + 5759, + 5765, + 5739, + 5751, + 5775, + 5792, + 5735, + 5737, + 5761, + 5779, + 5760, + 5747, + 5722, + 5725, + 5738, + 5803, + 5718, + 5755, + 5755, + 5759, + 5785, + 5766, + 5799, + 5715, + 5727, + 5793, + 5760, + 5762, + 5737, + 5759, + 5722, + 5776, + 5743, + 5753, + 5718, + 5743, + 5745, + 5752, + 5757, + 5789, + 5729, + 5799, + 5726, + 5777, + 5729, + 5765, + 5731, + 5724, + 5772, + 5769, + 5760, + 5771, + 5746, + 5768, + 5756, + 5742, + 5745, + 5767, + 5751, + 5749, + 5763, + 5776, + 5749, + 5804, + 5727, + 5778, + 5835, + 5823, + 5780, + 5792, + 5768, + 5734, + 5756, + 5769, + 5718, + 5792, + 5733, + 5747, + 5740, + 5771, + 5738, + 5761, + 5720, + 5718, + 5732, + 5765, + 5750, + 5760, + 5764, + 5778, + 5747, + 5738, + 5726, + 5734, + 5727, + 5779, + 5747, + 5760, + 5755, + 5774, + 5732, + 5725, + 5810, + 5801, + 5758, + 5784, + 5759, + 5715, + 5786, + 5760, + 5723, + 5776, + 5748, + 5775, + 5736, + 5799, + 5754, + 5765, + 5754, + 5766, + 5733, + 5758, + 5769, + 5764, + 5764, + 5738, + 5753, + 5776, + 5748, + 5792, + 5725, + 5769, + 5754, + 5806, + 5751, + 5746, + 5720, + 5781, + 5790, + 5788, + 5814, + 5776, + 5759, + 5787, + 5757, + 5799, + 5770, + 5793, + 5724, + 5777, + 5774, + 5753, + 5749, + 5790, + 5782, + 5712, + 5789, + 5790, + 5782, + 5802, + 5745, + 5741, + 5726, + 5737, + 5755, + 5783, + 5743, + 5745, + 5780, + 5789, + 5720, + 5771, + 5729, + 5735, + 5785, + 5780, + 5729, + 5785, + 5756, + 5740, + 5806, + 5727, + 5725, + 5769, + 5732, + 5777, + 5783, + 5763, + 5737, + 5775, + 5761, + 5735, + 5785, + 5719, + 5784, + 5762, + 5767, + 5796, + 5795, + 5770, + 5780, + 5793, + 5742, + 5702, + 5728, + 5743, + 5778, + 5745, + 5787, + 5749, + 5743, + 5772, + 5741, + 5770, + 5734, + 5724, + 5750, + 5738, + 5731, + 5817, + 5742, + 5733, + 5772, + 5765, + 5771, + 5799, + 5773, + 5744, + 5738, + 5759, + 5739, + 5779, + 5769, + 5775, + 5817, + 5747, + 5761, + 5776, + 5787, + 5744, + 5810, + 5799, + 5729, + 5780, + 5730, + 5784, + 5786, + 5738, + 5773, + 5777, + 5785, + 5788, + 5790, + 5820, + 5778, + 5781, + 5727, + 5737, + 5796, + 5733, + 5739, + 5775, + 5725, + 5773, + 5776, + 5770, + 5762, + 5784, + 5753, + 5782, + 5736, + 5773, + 5753, + 5800, + 5747, + 5765, + 5746, + 5766, + 5748, + 5753, + 5752, + 5743, + 5744, + 5768, + 5734, + 5754, + 5729, + 5798, + 5788, + 5775, + 5729, + 5849, + 5725, + 5725, + 5743, + 5781, + 5745, + 5797, + 5759, + 5784, + 5751, + 5782, + 5749, + 5781, + 5886, + 5763, + 5728, + 5741, + 5743, + 5772, + 5739, + 5776, + 5791, + 5710, + 5721, + 5819, + 5799, + 5769, + 5752, + 5744, + 5744, + 5755, + 5722, + 5767, + 5786, + 5723, + 5721, + 5853, + 5737, + 5728, + 5761, + 5791, + 5742, + 5752, + 5767, + 5784, + 5750, + 5744, + 5762, + 5784, + 5775, + 5745, + 5779, + 5727, + 5747, + 5783, + 5768, + 5735, + 5744, + 5787, + 5761, + 5781, + 5793, + 5773, + 5743, + 5776, + 5784, + 5815, + 5786, + 5771, + 5761, + 5746, + 5736, + 5745, + 5803, + 5756, + 5738, + 5773, + 5775, + 5776, + 5725, + 5779, + 5763, + 5745, + 5724, + 5766, + 5728, + 5745, + 5754, + 5770, + 5753, + 5767, + 5739, + 5727, + 5761, + 5742, + 5760, + 5777, + 5738, + 5767, + 5725, + 5754, + 5739, + 5751, + 5719, + 5830, + 5715, + 5732, + 5751, + 5768, + 5775, + 5736, + 5749, + 5736, + 5751, + 5780, + 5801, + 5782, + 5757, + 5754, + 5735, + 5780, + 5797, + 5784, + 5717, + 5776, + 5725, + 5780, + 5730, + 5840, + 5783, + 5743, + 5720, + 5756, + 5754, + 5714, + 5744, + 5811, + 5783, + 5775, + 5750, + 5729, + 5752, + 5763, + 5750, + 5775, + 5739, + 5725, + 5776, + 5769, + 5729, + 5735, + 5784, + 5776, + 5736, + 5766, + 5786, + 5780, + 5725, + 5782, + 5779, + 5718, + 5732, + 5765, + 5739, + 5749, + 5755, + 5760, + 5753, + 5762, + 5724, + 5772, + 5761, + 5785, + 5725, + 5770, + 5730, + 5789, + 5834, + 5755, + 5732, + 5743, + 5740, + 5770, + 5741, + 5762, + 5759, + 5776, + 5764, + 5783, + 5800, + 5763, + 5769, + 5779, + 5746, + 5770, + 5756, + 5758, + 5757, + 5789, + 5737, + 5790, + 5754, + 5817, + 5831, + 5805, + 5731, + 5765, + 5758, + 5744, + 5767, + 5774, + 5734, + 5772, + 5756, + 5728, + 5757, + 5785, + 5731, + 5737, + 5782, + 5746, + 5756, + 5769, + 5776, + 5737, + 5762, + 5719, + 5756, + 5795, + 5720, + 5740, + 5752, + 5753, + 5745, + 5784, + 5767, + 5738, + 5749, + 5717, + 5742, + 5750, + 5757, + 5727, + 5774, + 5752, + 5749, + 5770, + 5787, + 5738, + 5745, + 5752, + 5716, + 5745, + 5745, + 5734, + 6688, + 5739, + 5747, + 5764, + 5739, + 5813, + 5777, + 5762, + 5731, + 5795, + 5785, + 5723, + 5739, + 5762, + 5748, + 5753, + 5724, + 5777, + 5750, + 5738, + 5720, + 5786, + 5723, + 5734, + 5765, + 5759, + 5760, + 5771, + 5721, + 5752, + 5761, + 5778, + 5779, + 5722, + 5789, + 5738, + 5778, + 5809, + 5753, + 5748, + 5721, + 5763, + 5732, + 5765, + 5725, + 5770, + 5752, + 5757, + 5722, + 5754, + 5758, + 5747, + 5747, + 5755, + 5726, + 5770, + 5751, + 5760, + 5750, + 5788, + 5782, + 5730, + 5752, + 5759, + 5745, + 5787, + 5768, + 5763, + 5760, + 5753, + 5767, + 5733, + 5762, + 5854, + 5753, + 5786, + 5758, + 5776, + 5756, + 5804, + 5754, + 5766, + 5718, + 5770, + 5776, + 5786, + 5747, + 5825, + 5722, + 5779, + 5724, + 5733, + 5725, + 5778, + 5773, + 5775, + 5732, + 5739, + 5754, + 5800, + 5748, + 5758, + 5793, + 5782, + 5723, + 5771, + 5728, + 5726, + 5755, + 5748, + 5767, + 5775, + 5749, + 5784, + 5769, + 5812, + 5754, + 5757, + 5775, + 5722, + 5747, + 5734, + 5750, + 5775, + 5760, + 5735, + 5714, + 5756, + 5755, + 5750, + 5768, + 5737, + 5722, + 5730, + 5769, + 5753, + 5742, + 5722, + 5757, + 5774, + 5740, + 5791, + 5784, + 5758, + 5781, + 5777, + 5751, + 5782, + 5739, + 5761, + 5745, + 5757, + 5742, + 5755, + 5750, + 5768, + 5776, + 5777, + 5799, + 5777, + 5734, + 5760, + 5778, + 5766, + 5741, + 5782, + 5765, + 5772, + 5748, + 5720, + 5741, + 5797, + 5730, + 5729, + 5719, + 5760, + 5743, + 5776, + 5743, + 5737, + 5743, + 5758, + 5756, + 5745, + 5752, + 5782, + 5743, + 5770, + 5790, + 5764, + 5731, + 5735, + 5747, + 5788, + 5751, + 5785, + 5734, + 5761, + 5764, + 5759, + 5757, + 5772, + 5738, + 5760, + 5795, + 5780, + 5813, + 5770, + 5740, + 5746, + 5739, + 5739, + 5756, + 5743, + 5766, + 5759, + 5793, + 5811, + 5743, + 5804, + 5763, + 5757, + 5762, + 5763, + 5754, + 5773, + 5725, + 5821, + 5791, + 5789, + 5765, + 5775, + 5734, + 5770, + 5739, + 5817, + 5768, + 5858, + 5776, + 5721, + 5766, + 5738, + 5724, + 5804, + 5753, + 5732, + 5757, + 5728, + 5735, + 5776, + 5726, + 5745, + 5765, + 5785, + 5744, + 5750, + 5745, + 5753, + 5745, + 5760, + 5753, + 5762, + 5768, + 5728, + 5751, + 5777, + 5739, + 5804, + 5770, + 5718, + 5796, + 5793, + 5770, + 5791, + 5741, + 5757, + 5729, + 5722, + 5725, + 5784, + 5741, + 5772, + 5746, + 5776, + 5758, + 5825, + 5736, + 5758, + 5727, + 5737, + 5736, + 5795, + 5760, + 5751, + 5736, + 5793, + 5749, + 5804, + 5767, + 5772, + 5741, + 5791, + 5732, + 5742, + 5727, + 5758, + 5743, + 5738, + 5744, + 5773, + 5787, + 5761, + 5775, + 5795, + 5759, + 5787, + 5724, + 5784, + 5769, + 5798, + 5737, + 5805, + 5742, + 5741, + 5765, + 5734, + 5750, + 5759, + 5758, + 5767, + 5802, + 5774, + 5746, + 5814, + 5762, + 5808, + 5767, + 5806, + 5777, + 5792, + 5725, + 5752, + 5755, + 5728, + 5795, + 5768, + 5754, + 5739, + 5761, + 5793, + 5746, + 5785, + 5740, + 5727, + 5764, + 5781, + 5757, + 5800, + 5772, + 5738, + 5726, + 5782, + 5739, + 5785, + 5725, + 5775, + 5719, + 5780, + 5736, + 5796, + 5749, + 5779, + 5730, + 5819, + 5792, + 5787, + 5735, + 5771, + 5767, + 5758, + 5756, + 5774, + 5776, + 5729, + 5741, + 5753, + 5729, + 5766, + 5743, + 5806, + 5728, + 5774, + 5829, + 5795, + 5721, + 5745, + 5732, + 5733, + 5754, + 5792, + 5784, + 5750, + 5797, + 5790, + 5725, + 5790, + 5742, + 5731, + 5818, + 5726, + 5766, + 5773, + 5743, + 5816, + 5783, + 5728, + 5735, + 5766, + 5724, + 5750, + 5759, + 5742, + 5734, + 5772, + 5724, + 5764, + 5754, + 5744, + 5732, + 5750, + 5755, + 5742, + 5749, + 5796, + 5785, + 5775, + 5728, + 5759, + 5757, + 5763, + 5750, + 5785, + 5744, + 5784, + 5801, + 5777, + 5728, + 5785, + 5807, + 5750, + 5784, + 5735, + 5734, + 5752, + 5742, + 5735, + 5745, + 5770, + 5750, + 5761, + 5718, + 5756, + 5768, + 5765, + 5754, + 5767, + 5773, + 5820, + 5791, + 5739, + 5755, + 5792, + 5724, + 5776, + 5747, + 5765, + 5755, + 5758, + 5764, + 5737, + 5724, + 5754, + 5733, + 5748, + 5755, + 5733, + 5778, + 5726, + 5746, + 5785, + 5798, + 5732, + 5784, + 5765, + 5741, + 5765, + 5732, + 5816, + 5784, + 5783, + 5746, + 5774, + 5744, + 5761, + 5845, + 5747, + 5804, + 5771, + 5761, + 5722, + 5785, + 5789, + 5766, + 5772, + 5732, + 5762, + 5746, + 5738, + 5736, + 5788, + 5752, + 5767, + 5750, + 5751, + 5766, + 5785, + 5726, + 5751, + 5730, + 5731, + 5764, + 5773, + 5783, + 5754, + 5800, + 5744, + 5752, + 5741, + 5747, + 5773, + 5772, + 5744, + 5737, + 5791, + 5748, + 5771, + 5780, + 5768, + 5735, + 5825, + 5723, + 5740, + 5738, + 5769, + 5779, + 5803, + 5727, + 5752, + 5766, + 5748, + 5827, + 5726, + 5745, + 5782, + 5749, + 5802, + 5795, + 5770, + 5755, + 5806, + 5761, + 5749, + 5778, + 5774, + 5726, + 5767, + 5758, + 5738, + 5750, + 5800, + 5748, + 5779, + 5735, + 5768, + 5795, + 5773, + 5740, + 5760, + 5761, + 5784, + 5751, + 5799, + 5744, + 5742, + 5810, + 5777, + 5762, + 5741, + 5725, + 5726, + 5770, + 5755, + 5725, + 5771, + 5817, + 5750, + 5727, + 5745, + 5743, + 5758, + 5805, + 5732, + 5775, + 5747, + 5755, + 5782, + 5742, + 5742, + 5754, + 5761, + 5747, + 5777, + 5742, + 5732, + 5769, + 5771, + 5872, + 5750, + 5757, + 5777, + 5783, + 5737, + 5782, + 5783, + 5767, + 5744, + 5731, + 5757, + 5771, + 5799, + 5760, + 5792, + 5760, + 5750, + 5783, + 5744, + 5733, + 5740, + 5780, + 5785, + 5792, + 5758, + 5720, + 5776, + 5767, + 5773, + 5780, + 5801, + 5742, + 5772, + 5760, + 5801, + 5774, + 5787, + 5746, + 5763, + 5789, + 5809, + 5761, + 5752, + 6005, + 5778, + 5768, + 5742, + 5750, + 5763, + 5741, + 5738, + 5763, + 5782, + 5767, + 5787, + 5780, + 5746, + 5756, + 5752, + 5769, + 5791, + 5784, + 5808, + 5879, + 5741, + 5820, + 5786, + 5771, + 5766, + 5764, + 5754, + 5748, + 5758, + 5733, + 5739, + 5732, + 5751, + 5736, + 5764, + 5739, + 5771, + 5751, + 5750, + 5743, + 5741, + 5722, + 5738, + 5766, + 5770, + 5739, + 5824, + 5764, + 5777, + 5808, + 5757, + 5767, + 5808, + 5850, + 5738, + 5759, + 5760, + 5776, + 5747, + 5747, + 5744, + 5773, + 5796, + 5758, + 5776, + 5721, + 5737, + 5716, + 5727, + 5742, + 5804, + 5744, + 5739, + 5752, + 5727, + 5793, + 5808, + 5776, + 5764, + 5772, + 5748, + 5759, + 5798, + 5761, + 5740, + 5746, + 5793, + 5776, + 5798, + 5733, + 5807, + 5749, + 5764, + 5719, + 5767, + 5724, + 5761, + 5733, + 5760, + 5806, + 5783, + 5794, + 5788, + 5758, + 5738, + 5803, + 5770, + 5762, + 5773, + 5803, + 5739, + 5742, + 5769, + 5748, + 5758, + 5760, + 5732, + 5745, + 5806, + 5719, + 5751, + 5768, + 5733, + 5777, + 5749, + 5769, + 5724, + 5742, + 5752, + 5770, + 5764, + 5750, + 5757, + 5770, + 5769, + 5732, + 5776, + 5774, + 5765, + 5762, + 5774, + 5736, + 5729, + 5759, + 5763, + 5769, + 5742, + 5736, + 5739, + 5717, + 5756, + 5822, + 5768, + 5733, + 5754, + 5719, + 5726, + 5745, + 5788, + 5743, + 5784, + 5754, + 5747, + 5749, + 5717, + 5750, + 5808, + 5743, + 5759, + 5750, + 5732, + 5742, + 5805, + 5747, + 5735, + 5775, + 5780, + 5765, + 5779, + 5791, + 5767, + 5798, + 5781, + 5750, + 5790, + 5719, + 5775, + 5770, + 5727, + 5739, + 5781, + 5726, + 5756, + 5779, + 5759, + 5737, + 5804, + 5794, + 5740, + 5781, + 5769, + 5760, + 5789, + 5790, + 5739, + 5749, + 5742, + 5726, + 5766, + 5755, + 5754, + 5785, + 5774, + 5727, + 5756, + 5723, + 5778, + 5785, + 5751, + 5810, + 5760, + 5711, + 5718, + 5716, + 5766, + 5782, + 5801, + 5736, + 5740, + 5745, + 5736, + 5794, + 5766, + 5733, + 5808, + 5718, + 5759, + 5729, + 5824, + 5740, + 5753, + 5763, + 5739, + 5725, + 5789, + 6301, + 5757, + 5749, + 5737, + 5784, + 5758, + 5718, + 5743, + 5772, + 5783, + 5754, + 5759, + 5715, + 5735, + 5723, + 5777, + 5749, + 5769, + 5725, + 5727, + 5754, + 5766, + 5743, + 5772, + 5746, + 5731, + 5756, + 5748, + 5761, + 5793, + 5734, + 5794, + 5770, + 5784, + 5766, + 5811, + 5785, + 5826, + 5801, + 5796, + 5772, + 5792, + 5752, + 5753, + 5758, + 5762, + 5737, + 5782, + 5734, + 5776, + 5739, + 5791, + 5737, + 5785, + 5753, + 5755, + 5719, + 5785, + 5722, + 5787, + 5752, + 5769, + 5746, + 5741, + 5756, + 5770, + 5768, + 5779, + 5735, + 5748, + 5767, + 5805, + 5722, + 5745, + 5745, + 5768, + 5759, + 5734, + 5741, + 5743, + 5821, + 5747, + 5792, + 5756, + 5789, + 5768, + 5738, + 5743, + 5762, + 5781, + 5742, + 5766, + 5749, + 5741, + 5741, + 5793, + 5724, + 5719, + 5736, + 5771, + 5743, + 5734, + 5735, + 5736, + 5785, + 5720, + 5732, + 5775, + 5745, + 5740, + 5776, + 5766, + 5730, + 5843, + 5740, + 5748, + 5772, + 5762, + 5741, + 5772, + 5759, + 5847, + 5745, + 5763, + 5717, + 5782, + 5739, + 5768, + 5732, + 5842, + 5790, + 5733, + 5769, + 5767, + 5730, + 5741, + 5771, + 5795, + 5742, + 5764, + 5761, + 5725, + 5761, + 5803, + 5736, + 5765, + 5754, + 5772, + 5755, + 5772, + 5767, + 5736, + 5779, + 5773, + 5777, + 11343, + 5772, + 5757, + 5742, + 5719, + 5748, + 5786, + 5764, + 5789, + 5800, + 5764, + 5785, + 5770, + 5781, + 5740, + 5743, + 5765, + 5793, + 5787, + 5729, + 5780, + 5760, + 5791, + 5741, + 5801, + 5749, + 5801, + 5794, + 5773, + 5766, + 5756, + 5762, + 5785, + 5756, + 5789, + 5744, + 5771, + 5729, + 5763, + 5729, + 5733, + 5718, + 5796, + 5746, + 5767, + 5726, + 5760, + 5754, + 5781, + 5761, + 5768, + 5730, + 5771, + 5751, + 5788, + 5722, + 5760, + 5772, + 5810, + 5762, + 5820, + 5725, + 5746, + 5778, + 5744, + 5735, + 5776, + 5755, + 5751, + 5710, + 5793, + 5727, + 5785, + 5769, + 5727, + 5772, + 5812, + 5733, + 5811, + 5767, + 5760, + 5768, + 5775, + 5731, + 5778, + 5766, + 5725, + 5729, + 5736, + 5789, + 5775, + 5737, + 5766, + 5725, + 5799, + 5776, + 5854, + 5711, + 5727, + 5735, + 5737, + 5749, + 5759, + 5767, + 5736, + 5763, + 5756, + 5744, + 5760, + 5737, + 5722, + 5715, + 5749, + 5748, + 5791, + 5755, + 5741, + 5755, + 5791, + 5743, + 5749, + 5739, + 5772, + 5748, + 5769, + 5776, + 5794, + 5784, + 5732, + 5755, + 5743, + 5727, + 5794, + 5735, + 5745, + 5722, + 5757, + 5747, + 5766, + 5778, + 5727, + 5827, + 5785, + 5772, + 5782, + 5766, + 5816, + 5781, + 5743, + 5721, + 5731, + 5811, + 5766, + 5720, + 5788, + 5764, + 5802, + 5767, + 5749, + 5774, + 5732, + 5765, + 5735, + 5763, + 5743, + 5738, + 5796, + 5763, + 5786, + 5745, + 5755, + 5773, + 5737, + 5733, + 5783, + 5754, + 5798, + 5774, + 5727, + 5776, + 5762, + 5735, + 5786, + 5740, + 5755, + 5724, + 5768, + 5754, + 5737, + 5776, + 5741, + 5731, + 5758, + 5740, + 5892, + 5717, + 5758, + 5750, + 5762, + 5748, + 5743, + 5771, + 5806, + 5751, + 5787, + 5769, + 5749, + 5723, + 5767, + 5784, + 5775, + 5719, + 5824, + 5768, + 5746, + 5788, + 5799, + 5732, + 5778, + 5756, + 5769, + 5748, + 5778, + 5763, + 5755, + 5753, + 5722, + 5787, + 5761, + 5752, + 5788, + 5786, + 5809, + 5722, + 5792, + 5714, + 5741, + 5755, + 5745, + 5735, + 5753, + 5738, + 5779, + 5756, + 5807, + 5753, + 5733, + 5723, + 5762, + 5737, + 5723, + 5739, + 5777, + 5760, + 5758, + 5765, + 5744, + 5743, + 5755, + 5734, + 5741, + 5725, + 5821, + 5747, + 5756, + 5732, + 5744, + 5759, + 5737, + 5747, + 5826, + 5756, + 5742, + 5791, + 5731, + 5760, + 5782, + 5743, + 5768, + 5847, + 5763, + 5799, + 5740, + 5726, + 5725, + 5788, + 5729, + 5751, + 5765, + 5794, + 5738, + 5738, + 5777, + 5766, + 5759, + 5753, + 5775, + 5762, + 5846, + 5742, + 5793, + 5762, + 5736, + 5791, + 5807, + 5789, + 5758, + 5754, + 5789, + 5735, + 5780, + 5742, + 5803, + 5723, + 5732, + 5747, + 5784, + 5746, + 5780, + 5750, + 5731, + 5765, + 5730, + 5723, + 5784, + 5781, + 5782, + 5759, + 5751, + 5731, + 5816, + 5757, + 5802, + 5775, + 5747, + 5748, + 5779, + 5728, + 5763, + 5764, + 5732, + 6116, + 5796, + 5777, + 5748, + 5740, + 5782, + 5772, + 5791, + 5745, + 5742, + 5821, + 5762, + 5760, + 5765, + 5772, + 5717, + 5729, + 5725, + 5757, + 5764, + 5736, + 5754, + 5761, + 5722, + 5735, + 5845, + 5780, + 5777, + 5789, + 5752, + 5764, + 5793, + 5749, + 5788, + 5742, + 5778, + 5783, + 5761, + 5748, + 5931, + 5724, + 5756, + 5713, + 5798, + 5721, + 5770, + 5778, + 5757, + 5744, + 5737, + 5716, + 5755, + 5759, + 5776, + 5728, + 5776, + 5738, + 5722, + 5769, + 5816, + 5747, + 5765, + 5728, + 5770, + 5782, + 5753, + 5765, + 5769, + 5752, + 5728, + 5759, + 5761, + 5739, + 5747, + 5728, + 5746, + 5772, + 5747, + 5782, + 5787, + 5737, + 5741, + 5792, + 5769, + 5771, + 5743, + 5749, + 5767, + 5728, + 5765, + 5780, + 5762, + 5762, + 5793, + 5726, + 5755, + 5745, + 5777, + 5726, + 5746, + 5724, + 5781, + 5760, + 5740, + 5728, + 5770, + 5797, + 5735, + 5722, + 5774, + 5731, + 5741, + 5780, + 5744, + 5778, + 5780, + 5745, + 5751, + 5764, + 5822, + 5742, + 5764, + 5797, + 5745, + 5721, + 5733, + 5757, + 5798, + 5712, + 5784, + 5778, + 5752, + 5744, + 5765, + 5800, + 5779, + 5761, + 5750, + 5761, + 5769, + 5777, + 5722, + 5779, + 5734, + 5748, + 5754, + 5737, + 5744, + 5758, + 5750, + 5726, + 5757, + 5712, + 5746, + 5749, + 5751, + 5742, + 5764, + 5769, + 5732, + 5797, + 5763, + 5732, + 5795, + 5724, + 5801, + 5733, + 5762, + 5740, + 5818, + 5764, + 5779, + 5756, + 5744, + 5755, + 5777, + 5753, + 5748, + 5731, + 5775, + 5735, + 5781, + 5741, + 5728, + 5776, + 5783, + 5737, + 5791, + 5752, + 5746, + 5719, + 5765, + 5771, + 5775, + 5731, + 5795, + 5759, + 5798, + 5732, + 5790, + 5756, + 5742, + 5763, + 5728, + 5774, + 5755, + 5729, + 5772, + 5755, + 5744, + 5746, + 5771, + 5754, + 5782, + 5778, + 5777, + 5740, + 5784, + 5741, + 5773, + 5740, + 5732, + 5760, + 5771, + 5727, + 5722, + 5772, + 5784, + 5763, + 5739, + 5738, + 5714, + 5791, + 5747, + 5772, + 5736, + 5725, + 5734, + 5762, + 5740, + 5739, + 5785, + 5721, + 5737, + 5780, + 5790, + 5786, + 5783, + 5753, + 5739, + 5765, + 5740, + 5737, + 5757, + 5720, + 5755, + 5732, + 5739, + 5777, + 5813, + 5743, + 5732, + 5747, + 5793, + 5759, + 5807, + 5770, + 5771, + 5801, + 5792, + 5804, + 5814, + 5786, + 5748, + 5747, + 5741, + 5797, + 5749, + 5781, + 5768, + 5772, + 5792, + 5776, + 5803, + 5740, + 5801, + 5791, + 5796, + 5753, + 5781, + 5726, + 5783, + 5748, + 5774, + 5745, + 5741, + 5735, + 5775, + 5864, + 5787, + 5750, + 5777, + 5736, + 5763, + 5742, + 5751, + 5741, + 5783, + 5758, + 5725, + 5785, + 5738, + 5745, + 5761, + 5758, + 5809, + 5792, + 5791, + 5730, + 5759, + 5713, + 5774, + 5748, + 5742, + 5746, + 5771, + 5724, + 5768, + 5744, + 5781, + 11997, + 5790, + 5727, + 5729, + 5726, + 5781, + 5737, + 5765, + 5702, + 9660, + 5762, + 5776, + 5751, + 5784, + 5722, + 5720, + 5746, + 5749, + 5819, + 5778, + 5778, + 5759, + 5790, + 5780, + 5773, + 5784, + 5739, + 5739, + 5718, + 5780, + 5748, + 5733, + 5715, + 5720, + 5718, + 5755, + 5740, + 5761, + 5729, + 5775, + 5781, + 5752, + 5723, + 5759, + 5778, + 5725, + 5786, + 5779, + 5769, + 5758, + 5767, + 5743, + 5759, + 5712, + 5727, + 5843, + 5731, + 5760, + 5774, + 5787, + 5724, + 5776, + 5758, + 5812, + 5786, + 5733, + 5760, + 5761, + 5732, + 5763, + 5738, + 5732, + 5813, + 5789, + 5739, + 5720, + 5759, + 5767, + 5731, + 5772, + 5749, + 5731, + 5740, + 5723, + 5729, + 5766, + 5734, + 5730, + 5761, + 5777, + 5755, + 5763, + 5771, + 5734, + 5801, + 5761, + 5759, + 5793, + 5796, + 5730, + 5742, + 5747, + 5747, + 5795, + 5738, + 5735, + 5782, + 5738, + 5725, + 5808, + 5747, + 5738, + 5745, + 5816, + 5738, + 5789, + 5701, + 5770, + 5777, + 5737, + 5768, + 5774, + 5714, + 5791, + 5738, + 5734, + 5729, + 5796, + 5740, + 5760, + 5761, + 5751, + 5738, + 5821, + 5739, + 5741, + 5722, + 5774, + 5786, + 5804, + 5738, + 5765, + 5788, + 5748, + 5798, + 5775, + 5722, + 5731, + 5779, + 5747, + 5750, + 5795, + 5757, + 5748, + 5791, + 5824, + 5754, + 5817, + 5741, + 5756, + 5776, + 5758, + 5789, + 5769, + 5762, + 5745, + 5789, + 5729, + 5757, + 5774, + 5735, + 5742, + 5772, + 5719, + 5755, + 5762, + 5731, + 5775, + 5775, + 5718, + 5720, + 5789, + 5729, + 5802, + 5794, + 5794, + 5768, + 5765, + 5744, + 5754, + 5793, + 5737, + 5748, + 5785, + 5776, + 5731, + 5802, + 5726, + 5738, + 5744, + 5725, + 5736, + 5763, + 5736, + 5766, + 5737, + 5781, + 5751, + 5773, + 5782, + 5764, + 5770, + 5733, + 5738, + 5747, + 5778, + 5745, + 5783, + 5727, + 5792, + 5763, + 5760, + 5792, + 5797, + 5737, + 5737, + 5781, + 5778, + 5742, + 5760, + 5759, + 5797, + 5752, + 5789, + 5783, + 5784, + 5736, + 5790, + 5772, + 5798, + 5738, + 5766, + 5743, + 5726, + 5743, + 5726, + 5762, + 5766, + 5739, + 5753, + 5766, + 5766, + 5828, + 5783, + 5737, + 5760, + 5762, + 5759, + 5756, + 5755, + 5735, + 5753, + 5735, + 5754, + 5756, + 5769, + 5774, + 5758, + 5754, + 5778, + 5758, + 5856, + 5711, + 5737, + 5804, + 5741, + 5761, + 5763, + 5734, + 5739, + 5782, + 5745, + 5731, + 5789, + 5714, + 5742, + 5726, + 5775, + 5742, + 5778, + 5739, + 5793, + 5745, + 5796, + 5740, + 5777, + 5757, + 5741, + 5763, + 5731, + 5755, + 5767, + 5724, + 5725, + 5751, + 5738, + 5759, + 5779, + 5763, + 5756, + 5778, + 5727, + 5788, + 5777, + 5721, + 5773, + 5728, + 5790, + 5729, + 5800, + 5771, + 5734, + 5726, + 5739, + 5758, + 5776, + 5739, + 5897, + 5794, + 5785, + 5758, + 5790, + 5746, + 5813, + 5758, + 5772, + 5771, + 5773, + 5759, + 5743, + 5758, + 5780, + 5762, + 5777, + 5713, + 5777, + 5752, + 5748, + 5749, + 5788, + 5748, + 5806, + 5719, + 5741, + 5728, + 5774, + 5729, + 5762, + 5732, + 5761, + 5735, + 5763, + 5757, + 5749, + 5780, + 5750, + 5737, + 5777, + 5766, + 5805, + 5738, + 5744, + 5736, + 5750, + 5755, + 5758, + 5764, + 5745, + 5780, + 5838, + 5766, + 5751, + 5774, + 5732, + 5738, + 5814, + 5770, + 5804, + 5788, + 5800, + 5746, + 5776, + 5761, + 5741, + 5816, + 5821, + 5745, + 5813, + 5747, + 5788, + 5778, + 5772, + 5722, + 5758, + 5727, + 5756, + 5773, + 5806, + 5755, + 5766, + 5739, + 5757, + 5743, + 5720, + 5723, + 5780, + 5756, + 5761, + 5747, + 5780, + 5723, + 5766, + 5750, + 5766, + 5733, + 5783, + 5836, + 5770, + 5761, + 5729, + 5802, + 5728, + 5766, + 5757, + 5757, + 5790, + 5730, + 5750, + 5783, + 5966, + 5726, + 5759, + 5799, + 5754, + 5733, + 5785, + 5784, + 5774, + 5784, + 5774, + 5767, + 5786, + 5720, + 5801, + 5719, + 5753, + 5764, + 5769, + 5733, + 5761, + 5746, + 5742, + 5756, + 5756, + 5736, + 5786, + 5778, + 5736, + 5772, + 5795, + 5762, + 5756, + 5785, + 5784, + 5762, + 5804, + 5727, + 5769, + 5741, + 5742, + 5730, + 5770, + 5723, + 5796, + 5797, + 5754, + 5770, + 5796, + 5725, + 5731, + 5725, + 5769, + 5782, + 5761, + 5778, + 5749, + 5803, + 5770, + 5758, + 5937, + 5777, + 5809, + 5781, + 5788, + 5731, + 5764, + 5772, + 5813, + 5759, + 5745, + 5744, + 5753, + 5741, + 5741, + 5777, + 5722, + 5731, + 5778, + 5722, + 5764, + 5749, + 5765, + 5740, + 5758, + 5726, + 5724, + 5728, + 5740, + 5774, + 5777, + 5746, + 5721, + 5747, + 5750, + 5777, + 5813, + 5777, + 5782, + 5747, + 5752, + 5735, + 5772, + 5728, + 5808, + 5788, + 5764, + 5756, + 5772, + 5878, + 5784, + 5763, + 5763, + 5809, + 5753, + 5759, + 5770, + 5822, + 5806, + 5761, + 5761, + 5793, + 5761, + 5773, + 5744, + 5735, + 5765, + 5728, + 5738, + 5772, + 5772, + 5736, + 5772, + 5736, + 5742, + 5772, + 5777, + 5731, + 5762, + 5736, + 5775, + 5737, + 5767, + 5763, + 5766, + 5752, + 5736, + 5748, + 5798, + 5755, + 5768, + 5783, + 5783, + 5816, + 5767, + 5762, + 5835, + 5735, + 5726, + 5781, + 5747, + 5760, + 5776, + 5718, + 5767, + 5799, + 5769, + 5758, + 5800, + 5728, + 5767, + 5758, + 5781, + 5773, + 5787, + 5766, + 5767, + 5766, + 5781, + 5772, + 5775, + 5736, + 5775, + 5732, + 5786, + 5733, + 5748, + 5786, + 5782, + 5774, + 5810, + 5775, + 5789, + 5732, + 5786, + 5763, + 5760, + 5867, + 5768, + 5736, + 5727, + 5778, + 5778, + 5759, + 5783, + 5712, + 5744, + 5738, + 5735, + 5747, + 5751, + 5728, + 5730, + 5750, + 5796, + 5757, + 5798, + 5732, + 5795, + 5737, + 5767, + 5750, + 5785, + 5730, + 5776, + 5768, + 5730, + 5754, + 5754, + 5756, + 5764, + 5765, + 5760, + 5746, + 5761, + 5737, + 5727, + 5726, + 5731, + 5741, + 5781, + 5766, + 5753, + 5843, + 5789, + 5763, + 5781, + 5721, + 5723, + 5775, + 5791, + 5733, + 5790, + 5747, + 5775, + 5760, + 5814, + 5737, + 5768, + 5747, + 5759, + 5762, + 5774, + 5838, + 5776, + 5773, + 5731, + 5778, + 5785, + 5752, + 5779, + 5775, + 5722, + 5739, + 5742, + 5724, + 5834, + 5760, + 5754, + 5766, + 5781, + 5770, + 5770, + 5743, + 5720, + 5762, + 5787, + 5750, + 5813, + 5733, + 5792, + 5723, + 5764, + 5780, + 5801, + 5760, + 5793, + 5722, + 5744, + 5812, + 5763, + 5732, + 5769, + 5734, + 5766, + 5749, + 5828, + 5804, + 5765, + 5729, + 5766, + 5768, + 5799, + 5727, + 5731, + 5731, + 5721, + 5738, + 5758, + 5753, + 5748, + 5729, + 5813, + 5739, + 5835, + 5741, + 5787, + 5765, + 5772, + 5733, + 5756, + 5752, + 5808, + 5772, + 5715, + 5802, + 5748, + 5788, + 5727, + 5769, + 5735, + 5745, + 5790, + 5744, + 5769, + 5757, + 5779, + 5746, + 5770, + 5757, + 5812, + 5778, + 5744, + 5743, + 5739, + 5757, + 5768, + 5763, + 5772, + 5751, + 5779, + 5743, + 5742, + 5715, + 5781, + 5752, + 5777, + 5727, + 5749, + 5795, + 5723, + 5763, + 5774, + 5726, + 5754, + 5737, + 5762, + 5745, + 5786, + 5743, + 5736, + 5737, + 5724, + 5763, + 5763, + 5809, + 5768, + 5727, + 5755, + 5738, + 5787, + 5766, + 5764, + 5785, + 5785, + 5751, + 5737, + 5705, + 5764, + 5751, + 5784, + 5748, + 5762, + 5776, + 5726, + 5773, + 5772, + 5777, + 5765, + 5756, + 5715, + 5762, + 5742, + 5757, + 5803, + 5753, + 5752, + 5781, + 5754, + 5753, + 5766, + 5740, + 5777, + 5834, + 5743, + 5771, + 5754, + 5765, + 5736, + 5738, + 5722, + 5745, + 5765, + 5716, + 5747, + 5761, + 5766, + 5738, + 5780, + 5733, + 5830, + 5738, + 5769, + 5804, + 5732, + 5762, + 5789, + 5737, + 5755, + 5752, + 5791, + 5711, + 5813, + 5761, + 5745, + 5729, + 5730, + 5778, + 5775, + 5758, + 5842, + 5814, + 5764, + 5750, + 5738, + 5752, + 5774, + 5727, + 5815, + 5773, + 5755, + 5783, + 5761, + 5756, + 5760, + 5756, + 5779, + 5739, + 5783, + 5758, + 5758, + 5711, + 5732, + 5721, + 5763, + 5774, + 5805, + 5749, + 5746, + 5753, + 5771, + 5735, + 5779, + 5715, + 5826, + 5728, + 5723, + 5748, + 5786, + 5729, + 5786, + 5772, + 5785, + 5770, + 5771, + 5762, + 5762, + 5728, + 5755, + 5783, + 5777, + 5711, + 5726, + 5741, + 5733, + 5771, + 5757, + 5751, + 5734, + 5756, + 5749, + 5754, + 5731, + 5747, + 5726, + 5732, + 5761, + 5796, + 5763, + 5727, + 5758, + 5783, + 5739, + 5751, + 5767, + 5735, + 5722, + 5769, + 5773, + 5729, + 5761, + 5722, + 5762, + 5721, + 5748, + 5739, + 5781, + 5780, + 5772, + 5740, + 5778, + 5729, + 5765, + 5719, + 5760, + 5728, + 5745, + 5770, + 5782, + 5746, + 5798, + 5767, + 5738, + 5758, + 5792, + 5730, + 5789, + 5781, + 5770, + 5760, + 5769, + 5764, + 5733, + 5772, + 5762, + 5744, + 5754, + 5746, + 5802, + 5766, + 5723, + 5756, + 5768, + 5759, + 5739, + 5747, + 5722, + 5750, + 5783, + 5754, + 5723, + 5724, + 5772, + 5728, + 5763, + 5736, + 5752, + 5795, + 5775, + 5740, + 5840, + 5849, + 5735, + 5777, + 5773, + 5747, + 5777, + 5750, + 5787, + 5796, + 5757, + 5760, + 5788, + 5734, + 5756, + 5773, + 5761, + 5744, + 5760, + 5727, + 5777, + 5760, + 5761, + 5814, + 5782, + 5797, + 5764, + 5742, + 5757, + 5778, + 5846, + 5732, + 5753, + 5731, + 5784, + 5757, + 5777, + 5726, + 5769, + 5739, + 5754, + 5745, + 5763, + 5745, + 5742, + 5732, + 5836, + 5770, + 5779, + 5735, + 5815, + 5753, + 5735, + 5744, + 5754, + 5755, + 5765, + 5727, + 5747, + 5771, + 5814, + 5727, + 5775, + 5743, + 5759, + 5748, + 5769, + 5744, + 5734, + 5762, + 5760, + 5742, + 5788, + 5721, + 5731, + 5785, + 5817, + 5737, + 5797, + 5776, + 5780, + 5773, + 5728, + 5740, + 5775, + 5763, + 5773, + 5784, + 5737, + 5753, + 5807, + 5831, + 5762, + 5738, + 5762, + 5747, + 5786, + 5751, + 5725, + 5765, + 5771, + 5734, + 5766, + 5777, + 5779, + 5740, + 5737, + 5734, + 5782, + 5760, + 5795, + 5763, + 5756, + 5729, + 5753, + 5733, + 5768, + 5733, + 5742, + 5731, + 5739, + 5755, + 5763, + 5847, + 5750, + 5753, + 5761, + 5727, + 5737, + 5728, + 5745, + 5757, + 5756, + 5788, + 5749, + 5752, + 5742, + 5766, + 5748, + 5720, + 5773, + 5736, + 5760, + 5750, + 5770, + 5768, + 5773, + 5745, + 5737, + 5754, + 5739, + 5737, + 5744, + 5750, + 5723, + 5729, + 5780, + 5727, + 5779, + 5736, + 5757, + 5762, + 5751, + 5735, + 5761, + 5735, + 5789, + 5743, + 5807, + 5727, + 5737, + 5797, + 5777, + 5746, + 5752, + 5763, + 5740, + 5788, + 5755, + 5731, + 5771, + 5760, + 5767, + 5743, + 5774, + 5730, + 5743, + 5764, + 5746, + 5788, + 5774, + 5759, + 5740, + 5734, + 5763, + 5762, + 5741, + 5749, + 5763, + 5776, + 5746, + 5726, + 5751, + 5778, + 5773, + 5750, + 5731, + 5755, + 5740, + 5761, + 5746, + 5751, + 5720, + 5766, + 5784, + 5783, + 5784, + 5774, + 5769, + 5789, + 5763, + 5753, + 5758, + 5760, + 5751, + 5777, + 5746, + 5753, + 5755, + 5744, + 5813, + 5755, + 5778, + 5785, + 5793, + 5751, + 5746, + 5783, + 5784, + 5742, + 5772, + 5763, + 5736, + 5897, + 5751, + 5742, + 5777, + 5792, + 5758, + 5753, + 5748, + 5766, + 5756, + 5728, + 5776, + 5736, + 5796, + 5762, + 5785, + 5761, + 5762, + 5815, + 5799, + 5733, + 5783, + 5742, + 5739, + 5756, + 5792, + 5750, + 5779, + 5728, + 5758, + 5757, + 5766, + 5740, + 5791, + 5772, + 5779, + 5761, + 5745, + 5773, + 5767, + 5782, + 5855, + 5816, + 5809, + 5758, + 5806, + 5746, + 5807, + 5764, + 5745, + 5773, + 5773, + 5787, + 5767, + 5775, + 5728, + 5745, + 5768, + 5781, + 5806, + 5738, + 5761, + 5785, + 5780, + 5735, + 5777, + 5736, + 5746, + 5740, + 5764, + 5732, + 5737, + 5769, + 5736, + 5758, + 5784, + 5735, + 5808, + 5804, + 5761, + 5753, + 5772, + 5751, + 5818, + 5717, + 5763, + 5742, + 5796, + 5732, + 5815, + 5808, + 5817, + 5795, + 5778, + 5731, + 5770, + 5750, + 5767, + 5743, + 5771, + 5753, + 5781, + 5769, + 5750, + 5756, + 5791, + 5725, + 5752, + 5764, + 5801, + 5783, + 5818, + 5721, + 5745, + 5778, + 5745, + 5752, + 5755, + 5715, + 5755, + 5745, + 5855, + 5747, + 5779, + 5747, + 5744, + 5771, + 5803, + 5770, + 5767, + 5769, + 5767, + 5773, + 5773, + 5735, + 5774, + 5771, + 5740, + 5764, + 5760, + 5750, + 5747, + 5740, + 5758, + 5783, + 5802, + 5763, + 5777, + 5752, + 5763, + 5736, + 5726, + 5767, + 5744, + 5770, + 5753, + 5746, + 5746, + 5735, + 5779, + 5822, + 5777, + 5823, + 5775, + 5785, + 5735, + 5749, + 5776, + 5774, + 5791, + 5760, + 5797, + 5766, + 5746, + 5768, + 5768, + 5734, + 5745, + 5761, + 5735, + 5782, + 5730, + 5728, + 5787, + 5741, + 5771, + 5771, + 5760, + 5769, + 5749, + 5746, + 5745, + 5791, + 5795, + 5789, + 5800, + 5776, + 5751, + 5780, + 5766, + 5758, + 5808, + 5747, + 5754, + 5760, + 5781, + 5738, + 5775, + 5740, + 5758, + 5785, + 5714, + 5756, + 5764, + 5774, + 5716, + 5720, + 5769, + 5747, + 5787, + 5748, + 5771, + 5768, + 5730, + 5749, + 5759, + 5738, + 5777, + 5745, + 5745, + 5775, + 5763, + 5739, + 5729, + 5764, + 5765, + 5744, + 5773, + 5763, + 5771, + 5722, + 5735, + 5775, + 5761, + 5774, + 5777, + 5724, + 5756, + 5735, + 5753, + 5747, + 5717, + 5724, + 5730, + 5746, + 5767, + 5767, + 5726, + 5769, + 5784, + 5791, + 5782, + 5798, + 5764, + 5729, + 5762, + 5746, + 5754, + 5749, + 5779, + 5781, + 5764, + 5765, + 5773, + 5731, + 5780, + 5747, + 5796, + 5755, + 5774, + 5781, + 5772, + 5738, + 5749, + 5718, + 5774, + 5745, + 5774, + 5743, + 5803, + 5752, + 5966, + 5769, + 5800, + 5798, + 5744, + 5740, + 5751, + 5739, + 5737, + 5721, + 5747, + 5788, + 5782, + 5776, + 5759, + 5736, + 5764, + 5728, + 5808, + 5732, + 5725, + 5791, + 5769, + 5726, + 5775, + 5710, + 5757, + 5799, + 5733, + 5730, + 5776, + 5742, + 5746, + 5730, + 5770, + 5730, + 5766, + 5763, + 5751, + 5730, + 5743, + 5751, + 5799, + 5756, + 5744, + 5786, + 5737, + 5788, + 5785, + 5726, + 5760, + 5779, + 5738, + 5751, + 5770, + 5727, + 5760, + 5758, + 5714, + 5719, + 5791, + 5730, + 5741, + 5764, + 5776, + 5771, + 5770, + 5761, + 5741, + 5768, + 5795, + 5732, + 5749, + 6035, + 5750, + 5742, + 5777, + 5733, + 5818, + 5746, + 5742, + 5778, + 5759, + 5766, + 5768, + 5753, + 5738, + 5792, + 5780, + 5733, + 5765, + 5721, + 5771, + 5719, + 5747, + 5765, + 5767, + 5757, + 5724, + 5762, + 5788, + 5748, + 5777, + 5783, + 5749, + 5720, + 5738, + 5757, + 5761, + 5721, + 5751, + 5720, + 5768, + 5739, + 5760, + 5738, + 5726, + 5804, + 5720, + 5730, + 5769, + 5772, + 5745, + 5750, + 5789, + 5771, + 5764, + 5747, + 5740, + 5736, + 5735, + 5728, + 5767, + 5765, + 5721, + 5773, + 5725, + 5736, + 5759, + 5772, + 5760, + 5716, + 5733, + 5734, + 5757, + 5764, + 5857, + 5733, + 5720, + 5722, + 5766, + 5795, + 5734, + 5762, + 5752, + 5735, + 5743, + 5772, + 5749, + 5774, + 5733, + 5756, + 5779, + 5766, + 5782, + 5751, + 5771, + 5745, + 5736, + 5799, + 5738, + 5769, + 5759, + 5721, + 5739, + 5745, + 5749, + 5732, + 5758, + 5779, + 5755, + 5767, + 5716, + 5738, + 5772, + 5723, + 5784, + 5727, + 5750, + 5791, + 5760, + 5738, + 5738, + 5753, + 5764, + 5717, + 5765, + 5750, + 5782, + 5773, + 5764, + 5795, + 5745, + 5727, + 5762, + 5753, + 5737, + 5772, + 5772, + 5738, + 5781, + 5721, + 5791, + 5720, + 5773, + 5746, + 5747, + 5720, + 5768, + 5719, + 5744, + 5728, + 5765, + 5734, + 5721, + 5756, + 5780, + 5734, + 5766, + 5739, + 5770, + 5774, + 5740, + 5730, + 5767, + 5732, + 5766, + 5714, + 5773, + 5750, + 5781, + 5788, + 5801, + 5724, + 5783, + 5750, + 5789, + 5783, + 5744, + 5750, + 5744, + 5726, + 5787, + 5769, + 5836, + 5783, + 5739, + 5763, + 5755, + 5758, + 5767, + 5738, + 5747, + 5736, + 5777, + 5733, + 5708, + 5790, + 5790, + 5742, + 5806, + 5747, + 5745, + 5757, + 5750, + 5741, + 5787, + 5795, + 5795, + 5778, + 5739, + 5753, + 5762, + 5738, + 5753, + 5745, + 5766, + 5738, + 5784, + 5782, + 5758, + 5755, + 5778, + 5749, + 5761, + 5728, + 5767, + 5725, + 5734, + 5748, + 5784, + 5735, + 5751, + 5734, + 5750, + 5724, + 5792, + 5729, + 5785, + 5754, + 5779, + 5754, + 5798, + 5752, + 5745, + 5797, + 6034, + 5713, + 5764, + 5719, + 5745, + 5767, + 5773, + 5732, + 5751, + 5716, + 5737, + 5712, + 5765, + 5771, + 5802, + 5724, + 5781, + 5728, + 5767, + 5763, + 5771, + 5772, + 5828, + 5742, + 5782, + 5819, + 5781, + 5814, + 5795, + 5762, + 5749, + 5757, + 5780, + 5769, + 5727, + 5748, + 5779, + 5756, + 5815, + 5794, + 5795, + 5735, + 5783, + 5753, + 5805, + 5697, + 5731, + 5725, + 5731, + 5762, + 5770, + 5731, + 5749, + 5722, + 5782, + 5726, + 5767, + 5759, + 5779, + 5759, + 5769, + 5757, + 5743, + 5723, + 5814, + 5768, + 5752, + 5760, + 5776, + 5807, + 5743, + 5756, + 5750, + 5742, + 8843, + 5773, + 5739, + 5773, + 5770, + 5746, + 5785, + 5730, + 5738, + 5770, + 5749, + 5751, + 5759, + 5736, + 5752, + 5745, + 5736, + 5735, + 5788, + 5720, + 5769, + 5802, + 5767, + 5750, + 5793, + 5721, + 5755, + 5733, + 5719, + 5744, + 5765, + 5768, + 5741, + 5760, + 5735, + 5752, + 5789, + 5726, + 5722, + 5788, + 5799, + 5777, + 5761, + 5744, + 5778, + 5729, + 5764, + 5743, + 5769, + 5740, + 5768, + 5747, + 5769, + 5729, + 5777, + 5784, + 5772, + 5753, + 5794, + 5741, + 5764, + 5754, + 5719, + 5774, + 5767, + 5738, + 5767, + 5738, + 5790, + 5772, + 5732, + 5770, + 5781, + 5722, + 5745, + 5781, + 5776, + 5717, + 5757, + 5814, + 5760, + 5740, + 5777, + 5788, + 5783, + 5721, + 5774, + 5752, + 5745, + 5736, + 5777, + 5732, + 5806, + 5737, + 5744, + 5774, + 5756, + 5757, + 5778, + 5767, + 5723, + 5741, + 5767, + 5758, + 5740, + 5742, + 5761, + 5790, + 5738, + 5764, + 5791, + 5800, + 5736, + 5815, + 5785, + 5791, + 5769, + 5782, + 5736, + 5732, + 5734, + 5746, + 5769, + 5716, + 5754, + 5760, + 5773, + 5765, + 5722, + 5762, + 5739, + 5765, + 5795, + 5738, + 5786, + 5743, + 5744, + 5767, + 5790, + 5725, + 5727, + 5780, + 5756, + 5760, + 5729, + 5768, + 5770, + 5794, + 5733, + 5726, + 5789, + 5730, + 5725, + 5755, + 5766, + 5734, + 5790, + 5716, + 5732, + 5779, + 5765, + 5742, + 5732, + 5786, + 5734, + 5776, + 5792, + 5735, + 5760, + 5764, + 5719, + 5726, + 8659, + 5750, + 5768, + 5773, + 5735, + 5743, + 5758, + 5750, + 5780, + 5782, + 5751, + 5741, + 5754, + 5735, + 5800, + 5770, + 5757, + 5783, + 5774, + 5748, + 5772, + 5768, + 5763, + 5746, + 5790, + 5731, + 5799, + 5747, + 5742, + 5742, + 5762, + 5768, + 5763, + 5742, + 5753, + 5772, + 5778, + 5746, + 5782, + 5739, + 5745, + 5727, + 5771, + 5737, + 5743, + 5750, + 5765, + 5740, + 5799, + 5764, + 5759, + 5784, + 5757, + 5820, + 5777, + 5764, + 5804, + 5770, + 5728, + 5794, + 5785, + 5746, + 5777, + 5754, + 5727, + 5748, + 5788, + 5749, + 5737, + 5754, + 5835, + 5745, + 5794, + 5771, + 5785, + 5755, + 5786, + 5737, + 5762, + 5749, + 5785, + 5727, + 5753, + 5758, + 5742, + 5737, + 5743, + 5766, + 5749, + 5729, + 5724, + 5755, + 5755, + 5738, + 5761, + 5743, + 5777, + 5747, + 5752, + 5725, + 5761, + 5730, + 5796, + 5735, + 5799, + 5748, + 5802, + 5753, + 5782, + 5736, + 5741, + 5732, + 5832, + 5785, + 5748, + 5734, + 5742, + 5732, + 5729, + 5791, + 5760, + 5759, + 5772, + 5740, + 5795, + 5773, + 5787, + 5791, + 5760, + 5733, + 5733, + 5746, + 5762, + 5764, + 5835, + 5751, + 5791, + 5722, + 5761, + 5820, + 5768, + 5760, + 5726, + 5738, + 5746, + 5754, + 5773, + 5733, + 5825, + 5783, + 5756, + 5755, + 5730, + 5717, + 5751, + 5726, + 5732, + 5788, + 5764, + 5712, + 5770, + 5833, + 5804, + 5772, + 5802, + 5785, + 5735, + 5712, + 5777, + 5755, + 5759, + 5737, + 5747, + 5793, + 5749, + 5731, + 5748, + 5721, + 5754, + 5722, + 5774, + 5734, + 5787, + 5747, + 5733, + 5763, + 5779, + 5808, + 5755, + 5752, + 5734, + 5798, + 5760, + 5733, + 5771, + 5797, + 5763, + 5804, + 5756, + 5727, + 5776, + 5740, + 5772, + 5754, + 5788, + 5762, + 5768, + 5777, + 5723, + 5768, + 5744, + 5737, + 5766, + 5758, + 5763, + 5768, + 5780, + 5735, + 5748, + 5753, + 10984, + 5775, + 5795, + 5771, + 5822, + 5750, + 5762, + 5849, + 5750, + 5769, + 5778, + 5759, + 5760, + 5784, + 5769, + 5767, + 5796, + 5776, + 5804, + 5773, + 5744, + 5785, + 5805, + 5726, + 5748, + 5727, + 5740, + 5770, + 5779, + 5779, + 5773, + 5766, + 5757, + 5728, + 5759, + 5760, + 5768, + 5768, + 5771, + 5783, + 5736, + 5738, + 5755, + 5775, + 5752, + 5764, + 5777, + 5783, + 5732, + 5791, + 5731, + 5729, + 5771, + 5729, + 5778, + 5762, + 5757, + 5744, + 5764, + 10432, + 5787, + 5779, + 5775, + 5739, + 5763, + 5759, + 5737, + 5742, + 5724, + 5770, + 5772, + 5751, + 5746, + 5767, + 5765, + 5738, + 5725, + 5750, + 5730, + 5758, + 5733, + 5743, + 5741, + 5749, + 5760, + 5765, + 5761, + 5737, + 5765, + 5751, + 5772, + 5756, + 5745, + 5744, + 5790, + 5748, + 5792, + 5750, + 5745, + 5772, + 5777, + 5737, + 5768, + 5728, + 5722, + 5733, + 5712, + 5757, + 5748, + 5783, + 5715, + 5761, + 5771, + 5721, + 5741, + 5760, + 5719, + 5745, + 5722, + 5759, + 5749, + 5766, + 5766, + 5797, + 5752, + 5718, + 5753, + 5730, + 5736, + 5749, + 5782, + 5719, + 5752, + 5785, + 5729, + 5747, + 5777, + 5753, + 5719, + 5754, + 5782, + 5736, + 5795, + 5743, + 5741, + 5763, + 5734, + 5776, + 5766, + 5730, + 5746, + 5726, + 5756, + 5743, + 5788, + 5722, + 5778, + 5738, + 5736, + 5782, + 5755, + 5742, + 5790, + 5745, + 5729, + 5768, + 5768, + 5739, + 5754, + 5756, + 5732, + 5752, + 5780, + 5749, + 5743, + 5706, + 5743, + 5728, + 5877, + 5744, + 5764, + 5731, + 5727, + 5728, + 5757, + 5759, + 5736, + 5748, + 5780, + 5749, + 5771, + 5772, + 5752, + 5768, + 5753, + 5752, + 5756, + 5725, + 5742, + 5776, + 5744, + 5724, + 5809, + 5723, + 5775, + 5728, + 5799, + 5768, + 5772, + 5726, + 5728, + 5814, + 5773, + 5768, + 5774, + 5746, + 5766, + 5805, + 5744, + 5766, + 5776, + 5782, + 5756, + 5777, + 5782, + 5753, + 5786, + 5762, + 5735, + 5739, + 5804, + 5734, + 5781, + 5771, + 5764, + 5746, + 5732, + 5754, + 5773, + 5743, + 5784, + 5747, + 5769, + 5758, + 5761, + 5740, + 5732, + 5789, + 5731, + 5728, + 5758, + 5754, + 5777, + 5763, + 5742, + 5726, + 5765, + 5715, + 5724, + 5747, + 5763, + 5758, + 5800, + 5745, + 5785, + 5759, + 5755, + 5739, + 5797, + 5765, + 5751, + 5748, + 5734, + 5749, + 5787, + 5778, + 5746, + 5783, + 5765, + 5783, + 5780, + 5741, + 5759, + 5776, + 5756, + 5762, + 5766, + 5757, + 5734, + 5750, + 5758, + 5746, + 5783, + 5763, + 5915, + 5752, + 5730, + 5762, + 5726, + 5716, + 5736, + 5761, + 5754, + 5750, + 5748, + 5731, + 5756, + 5737, + 5770, + 5790, + 5811, + 5735, + 5748, + 5745, + 5731, + 5751, + 5783, + 5774, + 5753, + 5768, + 5744, + 5761, + 5790, + 5793, + 5772, + 5774, + 5767, + 5756, + 5780, + 5745, + 5771, + 5746, + 5770, + 5746, + 5776, + 5740, + 5779, + 5744, + 5757, + 5751, + 5769, + 5790, + 5792, + 5791, + 5725, + 5738, + 5764, + 5732, + 5748, + 5745, + 5732, + 5756, + 5793, + 5739, + 5742, + 5782, + 5725, + 5742, + 5792, + 5731, + 5803, + 5720, + 5773, + 5752, + 5721, + 5723, + 5798, + 5737, + 5756, + 5739, + 5767, + 5753, + 5809, + 5783, + 5717, + 5744, + 5776, + 5744, + 5744, + 5757, + 5756, + 5761, + 5774, + 5727, + 5746, + 5759, + 5719, + 5722, + 5759, + 5766, + 5813, + 5727, + 5800, + 5777, + 5753, + 5763, + 5786, + 5720, + 5756, + 5774, + 5777, + 5783, + 5743, + 5760, + 5740, + 5806, + 5790, + 5753, + 5739, + 5743, + 5776, + 5737, + 5765, + 5733, + 5789, + 5738, + 5788, + 5730, + 5772, + 5738, + 5785, + 5735, + 5745, + 5738, + 5760, + 5742, + 5807, + 5782, + 5764, + 5778, + 5761, + 5727, + 5713, + 5744, + 5757, + 5769, + 5763, + 5717, + 5791, + 5754, + 5816, + 5758, + 5809, + 5773, + 5766, + 5794, + 5735, + 5747, + 5803, + 5741, + 5727, + 5747, + 5761, + 5718, + 5758, + 5744, + 5769, + 5764, + 5754, + 5732, + 5818, + 5733, + 5762, + 5812, + 5776, + 12964, + 5780, + 5721, + 5763, + 5772, + 5776, + 5761, + 5745, + 5737, + 5774, + 5775, + 5739, + 5732, + 5748, + 5738, + 5772, + 5791, + 5758, + 5749, + 5778, + 5744, + 5768, + 5719, + 5762, + 9094, + 5790, + 5735, + 5776, + 5729, + 5728, + 5725, + 5758, + 5753, + 5775, + 5763, + 5791, + 5756, + 5766, + 5766, + 5732, + 5796, + 5733, + 5768, + 5760, + 5725, + 5717, + 5758, + 5763, + 5746, + 5789, + 5722, + 5761, + 5724, + 5738, + 5719, + 5804, + 5748, + 5750, + 5774, + 5730, + 5784, + 5782, + 5714, + 5772, + 5796, + 5775, + 5754, + 5779, + 5753, + 5724, + 5739, + 5795, + 5747, + 5891, + 5752, + 5776, + 5738, + 5727, + 5721, + 5744, + 5735, + 5749, + 5734, + 5734, + 5751, + 5741, + 5756, + 5746, + 5756, + 5754, + 5757, + 5823, + 5732, + 5741, + 5771, + 5718, + 5734, + 5777, + 5755, + 5770, + 5777, + 5760, + 5767, + 5790, + 5754, + 5765, + 5773, + 5729, + 5779, + 5772, + 5743, + 5746, + 5745, + 5742, + 5728, + 5768, + 5746, + 5763, + 5757, + 5749, + 5758, + 5776, + 5733, + 5784, + 5787, + 5758, + 5738, + 5767, + 5750, + 5765, + 5743, + 5767, + 5734, + 5762, + 5783, + 5777, + 5776, + 5760, + 5721, + 5763, + 5797, + 5750, + 5754, + 5727, + 5746, + 5786, + 5754, + 5770, + 5776, + 5786, + 5753, + 5786, + 5751, + 5746, + 5729, + 5780, + 5731, + 5774, + 5764, + 5736, + 5811, + 5782, + 5750, + 5776, + 5748, + 5798, + 5769, + 5796, + 5757, + 5784, + 5718, + 5731, + 5768, + 5760, + 5757, + 5797, + 5770, + 5775, + 5766, + 5722, + 5728, + 5782, + 5747, + 5754, + 5787, + 5785, + 5738, + 5742, + 5721, + 5772, + 5770, + 5784, + 5761, + 5742, + 5721, + 5743, + 5752, + 5748, + 5727, + 5789, + 5735, + 5774, + 5756, + 5743, + 5768, + 5794, + 5777, + 5766, + 5744, + 5722, + 5797, + 5850, + 5740, + 5787, + 5743, + 5793, + 5738, + 5747, + 5794, + 5764, + 5767, + 5748, + 5734, + 5767, + 5733, + 5735, + 5729, + 5762, + 5742, + 5766, + 5754, + 5738, + 5764, + 5750, + 5757, + 5786, + 5735, + 5763, + 5800, + 5790, + 5750, + 5805, + 5736, + 5754, + 5780, + 5735, + 5744, + 5749, + 5731, + 5787, + 5753, + 5748, + 5751, + 5862, + 5762, + 5798, + 5723, + 5761, + 5767, + 5767, + 5727, + 5802, + 5724, + 5787, + 5771, + 5796, + 5763, + 5753, + 5762, + 5778, + 5731, + 5778, + 5793, + 5768, + 5727, + 5788, + 5739, + 5746, + 5789, + 5770, + 5748, + 5739, + 5717, + 5739, + 5736, + 5770, + 5722, + 5759, + 5738, + 5754, + 5744, + 5738, + 5758, + 5774, + 5721, + 5753, + 5734, + 5779, + 5758, + 5758, + 5790, + 5773, + 5738, + 5753, + 5752, + 5756, + 5776, + 5780, + 5733, + 5740, + 5751, + 5766, + 5747, + 5770, + 5754, + 5754, + 5735, + 5799, + 5730, + 5753, + 5761, + 5757, + 5747, + 5774, + 5737, + 5743, + 5767, + 5761, + 5729, + 5743, + 5760, + 5783, + 5750, + 5791, + 5742, + 5766, + 5742, + 5757, + 5757, + 5777, + 5774, + 5768, + 5740, + 5769, + 5729, + 5756, + 5779, + 5724, + 5762, + 5789, + 5738, + 5803, + 5760, + 5746, + 5791, + 5778, + 5757, + 5724, + 5759, + 5735, + 5738, + 5748, + 5750, + 5734, + 5744, + 5745, + 5731, + 5790, + 5768, + 5733, + 5763, + 5777, + 5742, + 5735, + 5716, + 5742, + 5785, + 5754, + 5770, + 5738, + 5739, + 5756, + 5787, + 5727, + 5747, + 5778, + 5789, + 5768, + 5807, + 5739, + 5753, + 5767, + 5748, + 5791, + 5741, + 5740, + 5765, + 5757, + 5780, + 5782, + 5745, + 5738, + 5749, + 5767, + 5735, + 5767, + 5764, + 5740, + 5752, + 5785, + 5723, + 5790, + 5790, + 5728, + 5905, + 5751, + 5745, + 5758, + 5754, + 5766, + 5779, + 5775, + 5736, + 5743, + 5776, + 5764, + 5735, + 5776, + 5777, + 5776, + 5758, + 5787, + 5752, + 5777, + 5767, + 5776, + 5750, + 5760, + 5782, + 5772, + 5771, + 5788, + 5783, + 5758, + 5723, + 5749, + 5781, + 5791, + 5749, + 5730, + 5748, + 5776, + 5764, + 5756, + 5764, + 5734, + 5729, + 5754, + 5762, + 5783, + 5729, + 5789, + 5749, + 5784, + 5739, + 5817, + 5744, + 5781, + 5740, + 5771, + 5786, + 5767, + 5773, + 5720, + 5736, + 5756, + 5754, + 5740, + 5725, + 5721, + 5769, + 5791, + 5760, + 5788, + 5742, + 5792, + 5780, + 5815, + 5798, + 5780, + 5757, + 5773, + 5736, + 5768, + 5771, + 5725, + 5727, + 5723, + 5769, + 5778, + 5740, + 5783, + 5741, + 5828, + 5727, + 5772, + 5771, + 5724, + 5746, + 5728, + 5774, + 5755, + 5750, + 5734, + 5757, + 5769, + 5751, + 5796, + 5782, + 5820, + 5789, + 5819, + 5756, + 5758, + 5707, + 5758, + 5713, + 5740, + 5737, + 5757, + 5728, + 5734, + 5734, + 5763, + 5730, + 5763, + 5762, + 5727, + 5769, + 5773, + 5727, + 5767, + 5732, + 5749, + 5747, + 5719, + 5749, + 5760, + 5756, + 5746, + 5742, + 5727, + 5756, + 5759, + 5732, + 5719, + 5737, + 5831, + 5772, + 5762, + 5731, + 5757, + 5779, + 5725, + 5768, + 5773, + 5783, + 5738, + 5782, + 5781, + 5755, + 5829, + 5773, + 5776, + 5741, + 5789, + 5760, + 5820, + 5778, + 5747, + 5810, + 5791, + 5762, + 5774, + 5770, + 5762, + 9066, + 5769, + 5740, + 5782, + 5770, + 5796, + 5799, + 5786, + 5741, + 5770, + 5763, + 5727, + 5753, + 5784, + 5766, + 5767, + 5769, + 5771, + 5796, + 5779, + 5767, + 5768, + 5782, + 5719, + 5727, + 5744, + 5749, + 5758, + 5764, + 5749, + 5729, + 5801, + 5763, + 5781, + 5726, + 5726, + 5765, + 5746, + 5758, + 5775, + 5774, + 5741, + 5759, + 5781, + 5830, + 5770, + 5775, + 5774, + 5757, + 5758, + 5758, + 5752, + 5748, + 5767, + 5736, + 5762, + 5748, + 5762, + 5731, + 5765, + 5739, + 5784, + 5745, + 5756, + 5751, + 5797, + 5716, + 5784, + 5716, + 5733, + 5735, + 5782, + 5742, + 5775, + 5714, + 5741, + 5732, + 5754, + 5757, + 5776, + 5753, + 5760, + 5799, + 5738, + 5759, + 5733, + 5758, + 5751, + 5734, + 5758, + 5729, + 5752, + 5734, + 5767, + 5727, + 5757, + 5780, + 5743, + 5755, + 5802, + 5739, + 5791, + 5753, + 5724, + 5761, + 5780, + 5751, + 5737, + 5797, + 5786, + 5754, + 5806, + 5734, + 5757, + 5792, + 5730, + 5752, + 5758, + 5738, + 5744, + 5745, + 5751, + 5768, + 5813, + 5738, + 5739, + 5792, + 5730, + 5752, + 5757, + 5779, + 5740, + 5858, + 5781, + 5738, + 5777, + 5764, + 5790, + 5749, + 5735, + 5743, + 5760, + 5776, + 5771, + 5761, + 5799, + 5758, + 5782, + 5771, + 5739, + 5751, + 5807, + 5792, + 5772, + 5729, + 5775, + 5753, + 5747, + 5725, + 5783, + 5746, + 5735, + 5847, + 5791, + 5744, + 5773, + 5736, + 5785, + 5753, + 5776, + 5712, + 5769, + 5771, + 5723, + 5791, + 5721, + 5751, + 5766, + 5733, + 5788, + 5730, + 5721, + 5728, + 5743, + 5731, + 5743, + 5749, + 5735, + 5749, + 5774, + 5755, + 5764, + 5761, + 5766, + 5721, + 5768, + 5758, + 5757, + 5740, + 5761, + 5732, + 5771, + 5740, + 5743, + 5746, + 5744, + 5747, + 5741, + 5741, + 5760, + 5723, + 5775, + 5730, + 5778, + 5760, + 5722, + 5771, + 5757, + 5745, + 5744, + 5734, + 5722, + 5774, + 5759, + 5819, + 5766, + 5731, + 5729, + 5753, + 5758, + 5796, + 5755, + 5745, + 5790, + 5765, + 5735, + 5740, + 5760, + 5770, + 5745, + 5835, + 5736, + 5750, + 5737, + 5736, + 5729, + 5719, + 5755, + 5764, + 5791, + 5742, + 5774, + 5736, + 5775, + 5789, + 5796, + 5784, + 5785, + 5748, + 5747, + 5740, + 5764, + 5738, + 5748, + 5753, + 5800, + 5752, + 5770, + 5766, + 5737, + 5727, + 5743, + 5738, + 5773, + 5738, + 5774, + 5732, + 5774, + 5733, + 5774, + 5720, + 5769, + 5764, + 5730, + 5767, + 5776, + 5715, + 5756, + 5753, + 5731, + 5740, + 5762, + 5754, + 5759, + 5784, + 5737, + 5726, + 5808, + 5747, + 5783, + 5758, + 5735, + 5755, + 5762, + 5736, + 5735, + 5752, + 5772, + 5774, + 5785, + 5751, + 5760, + 5741, + 5747, + 5750, + 5779, + 5736, + 5754, + 5755, + 5764, + 5742, + 5790, + 5742, + 5741, + 5737, + 5728, + 5763, + 5745, + 5748, + 5762, + 5789, + 5774, + 5759, + 5744, + 5715, + 5739, + 5734, + 5715, + 5736, + 5781, + 5734, + 5790, + 5751, + 5796, + 5730, + 5752, + 5752, + 5761, + 5799, + 5726, + 5740, + 5766, + 5738, + 5765, + 5750, + 5774, + 5773, + 5768, + 5753, + 5761, + 5762, + 5728, + 5768, + 5792, + 5752, + 5803, + 5823, + 5771, + 5798, + 5772, + 5753, + 5737, + 5752, + 5738, + 5734, + 5763, + 5739, + 5765, + 5808, + 5788, + 5726, + 5790, + 5732, + 5757, + 5761, + 5735, + 5757, + 5818, + 5740, + 5728, + 5751, + 5746, + 5729, + 5768, + 5794, + 5759, + 5774, + 5743, + 5732, + 5790, + 5727, + 5735, + 5722, + 5726, + 5765, + 5831, + 5765, + 5786, + 5723, + 5770, + 5744, + 5760, + 5721, + 5752, + 5740, + 5760, + 5755, + 5778, + 5795, + 5778, + 5726, + 5779, + 5752, + 5774, + 5709, + 5751, + 5734, + 5758, + 5734, + 5746, + 7013, + 5807, + 5753, + 5782, + 5751, + 5790, + 5789, + 5778, + 5760, + 5756, + 5735, + 5745, + 5753, + 5767, + 5778, + 5732, + 5726, + 5782, + 5728, + 5752, + 5736, + 5765, + 5764, + 5726, + 5777, + 5743, + 5766, + 5725, + 5730, + 5738, + 5765, + 5810, + 5821, + 5775, + 5731, + 5763, + 5736, + 5848, + 5872, + 5780, + 5776, + 5787, + 5799, + 5773, + 5720, + 5766, + 5746, + 5778, + 5727, + 5734, + 5729, + 5787, + 5777, + 5749, + 5713, + 5771, + 5730, + 5755, + 5747, + 5759, + 5759, + 5776, + 5741, + 5761, + 5742, + 5768, + 5768, + 5788, + 5760, + 5738, + 5751, + 5753, + 5759, + 5732, + 5761, + 5780, + 5821, + 5826, + 5760, + 5763, + 5754, + 5798, + 5783, + 5802, + 5733, + 5743, + 5731, + 5751, + 5733, + 5767, + 5736, + 5771, + 5786, + 5766, + 5710, + 5768, + 5736, + 5773, + 5773, + 5753, + 5739, + 5775, + 5771, + 5755, + 5789, + 5799, + 5748, + 5746, + 5731, + 5811, + 5797, + 5821, + 5770, + 5788, + 5715, + 5752, + 5714, + 5735, + 5767, + 5758, + 5802, + 5760, + 5742, + 5750, + 5772, + 5841, + 5733, + 5787, + 5774, + 5771, + 5756, + 5780, + 5709, + 5745, + 5780, + 5723, + 5770, + 5758, + 5742, + 5764, + 5757, + 5774, + 5743, + 5782, + 5776, + 5791, + 5714, + 5731, + 5727, + 5792, + 5723, + 5739, + 5754, + 5718, + 5752, + 5777, + 5725, + 5775, + 5737, + 5780, + 5743, + 5781, + 5756, + 5779, + 5779, + 5764, + 5752, + 5762, + 5737, + 5727, + 5725, + 5715, + 5730, + 5746, + 5769, + 5761, + 5791, + 5768, + 5728, + 5756, + 5720, + 5748, + 5750, + 5786, + 5729, + 5763, + 5735, + 5744, + 5751, + 5737, + 5758, + 5778, + 5763, + 5772, + 5727, + 5730, + 5735, + 5754, + 5762, + 5726, + 5738, + 5735, + 5750, + 5775, + 5725, + 5747, + 5728, + 5781, + 5740, + 5777, + 5761, + 5795, + 5742, + 5763, + 5796, + 5786, + 5738, + 5789, + 5761, + 5750, + 5718, + 5784, + 5723, + 5742, + 5773, + 5728, + 5732, + 5752, + 5781, + 5761, + 5758, + 5806, + 5733, + 5759, + 5750, + 5734, + 5763, + 5749, + 5750, + 5797, + 5725, + 5776, + 5859, + 5755, + 5798, + 5784, + 5773, + 5778, + 5746, + 5798, + 5774, + 5753, + 5742, + 5757, + 5765, + 5725, + 5734, + 5766, + 5753, + 5822, + 5759, + 5764, + 5723, + 5769, + 5782, + 5734, + 5761, + 5817, + 5767, + 5780, + 5738, + 5753, + 5768, + 5766, + 5750, + 5761, + 5731, + 5779, + 5787, + 5740, + 5756, + 5768, + 5727, + 5782, + 5752, + 5747, + 5747, + 5771, + 5755, + 5731, + 5723, + 5776, + 5774, + 5751, + 5721, + 5745, + 5741, + 5738, + 5786, + 5804, + 5757, + 5742, + 5767, + 5765, + 5758, + 5749, + 5759, + 5757, + 5801, + 5728, + 5779, + 5746, + 5738, + 5805, + 5715, + 5765, + 5762, + 5799, + 5781, + 5730, + 5781, + 5732, + 5729, + 5799, + 5765, + 5755, + 5802, + 5745, + 5769, + 5795, + 5723, + 5761, + 5749, + 5750, + 5754, + 5730, + 5785, + 5760, + 5730, + 5786, + 5885, + 5760, + 5737, + 5821, + 5766, + 5771, + 5742, + 5797, + 5762, + 5723, + 5795, + 5780, + 5745, + 5773, + 5768, + 5792, + 5736, + 5737, + 5747, + 5797, + 5748, + 5736, + 5751, + 5739, + 5730, + 5785, + 5780, + 5744, + 5766, + 5769, + 5727, + 5738, + 5775, + 5762, + 5773, + 5716, + 5768, + 5788, + 5776, + 5770, + 5791, + 5775, + 6102, + 5752, + 5758, + 5777, + 5739, + 5739, + 5736, + 5767, + 5725, + 5728, + 5790, + 5732, + 5774, + 5803, + 5756, + 5741, + 5751, + 5741, + 5732, + 5766, + 5732, + 5768, + 5740, + 5797, + 5720, + 5777, + 5779, + 5783, + 5766, + 5716, + 5780, + 5756, + 5754, + 5740, + 5755, + 5731, + 5735, + 5809, + 5729, + 5723, + 5793, + 5763, + 5768, + 5756, + 5775, + 5760, + 5782, + 5743, + 5747, + 5781, + 5785, + 5757, + 5733, + 5757, + 5786, + 5759, + 5752, + 5745, + 5726, + 5758, + 5734, + 5754, + 5738, + 5778, + 5734, + 5746, + 5722, + 5760, + 5731, + 5725, + 5755, + 5765, + 5737, + 5767, + 5761, + 5778, + 5759, + 5759, + 5759, + 5778, + 5745, + 5783, + 5741, + 5743, + 5763, + 5782, + 5743, + 5751, + 5738, + 5777, + 5731, + 5761, + 5758, + 5757, + 5787, + 5766, + 5750, + 5801, + 5759, + 5751, + 5754, + 5756, + 5762, + 5804, + 5778, + 5728, + 5772, + 5779, + 5756, + 5744, + 5738, + 5743, + 5781, + 5785, + 5757, + 5744, + 5744, + 5766, + 5746, + 5742, + 5723, + 5795, + 5736, + 5748, + 5749, + 5776, + 5817, + 5785, + 5773, + 5751, + 5749, + 5744, + 5722, + 5745, + 5746, + 5826, + 5740, + 5773, + 5734, + 5762, + 5742, + 5756, + 5819, + 5776, + 5719, + 5748, + 5750, + 5757, + 5755, + 5804, + 5761, + 5806, + 5793, + 5756, + 5722, + 5811, + 5730, + 5721, + 5730, + 5754, + 5750, + 5722, + 5747, + 5781, + 5736, + 5745, + 5784, + 5724, + 5766, + 5817, + 5758, + 5764, + 5761, + 5762, + 5762, + 5794, + 5745, + 5772, + 5806, + 5760, + 5799, + 5782, + 5751, + 5756, + 5785, + 5743, + 5779, + 5783, + 5764, + 5778, + 5775, + 5737, + 5752, + 5831, + 5781, + 5802, + 5737, + 5773, + 5753, + 5777, + 5755, + 5793, + 5797, + 5775, + 5745, + 5767, + 5772, + 5762, + 5747, + 5741, + 5788, + 5772, + 5735, + 5776, + 5761, + 5735, + 5762, + 5823, + 5745, + 5742, + 5785, + 5765, + 5784, + 5804, + 5713, + 5738, + 5745, + 5777, + 5807, + 5750, + 5763, + 5766, + 5786, + 5810, + 5790, + 5772, + 5764, + 5922, + 5760, + 5763, + 5734, + 5778, + 5741, + 5766, + 5753, + 5806, + 5754, + 5772, + 5727, + 5761, + 5807, + 5777, + 5736, + 5771, + 5716, + 5753, + 5717, + 5740, + 5764, + 5788, + 5732, + 5743, + 5768, + 5742, + 5763, + 5798, + 5708, + 5792, + 5757, + 5790, + 5906, + 5758, + 5763, + 5781, + 5764, + 5773, + 5751, + 5772, + 5727, + 5773, + 5751, + 5737, + 5723, + 5753, + 5748, + 5741, + 5758, + 5750, + 5748, + 5770, + 5715, + 5764, + 5742, + 5836, + 5743, + 5783, + 5759, + 5772, + 5758, + 5730, + 5772, + 5771, + 5733, + 5745, + 5729, + 5732, + 5737, + 5751, + 5760, + 5763, + 5779, + 5779, + 5749, + 5774, + 5758, + 5759, + 5720, + 5767, + 5853, + 5770, + 5727, + 5750, + 5777, + 5761, + 5795, + 5771, + 5774, + 5710, + 5800, + 5719, + 5758, + 5774, + 5722, + 5796, + 5725, + 5766, + 5758, + 5774, + 5739, + 5720, + 5714, + 5741, + 5733, + 5760, + 5726, + 5731, + 5810, + 5726, + 5759, + 5741, + 5716, + 5778, + 5744, + 5744, + 5807, + 5836, + 5782, + 5766, + 5733, + 5787, + 5743, + 5772, + 5738, + 5770, + 5788, + 5748, + 5764, + 5775, + 5769, + 5791, + 5779, + 5784, + 5739, + 5773, + 5723, + 5779, + 5750, + 5740, + 5741, + 5748, + 5789, + 5746, + 5756, + 5771, + 5725, + 5759, + 5754, + 5762, + 5725, + 5735, + 5767, + 5790, + 5790, + 5786, + 5760, + 5729, + 5745, + 5758, + 5710, + 5728, + 5793, + 5785, + 5731, + 5797, + 5788, + 5741, + 5754, + 5753, + 5729, + 5800, + 5748, + 5784, + 5793, + 5775, + 5725, + 5794, + 5738, + 5768, + 5768, + 5767, + 5795, + 5744, + 5734, + 5799, + 5728, + 5762, + 5752, + 5759, + 5775, + 5781, + 5724, + 5737, + 5751, + 5757, + 5726, + 5749, + 5755, + 5775, + 5730, + 5767, + 5762, + 5740, + 5762, + 5781, + 5752, + 5774, + 5748, + 5738, + 5779, + 5741, + 5744, + 5807, + 5764, + 5765, + 5766, + 5824, + 5759, + 5762, + 5773, + 5781, + 5760, + 5768, + 5725, + 5755, + 5738, + 5909, + 5771, + 5820, + 5768, + 5779, + 5762, + 5787, + 5725, + 5725, + 5734, + 5777, + 5731, + 5766, + 5769, + 5735, + 5736, + 5770, + 5725, + 5766, + 5752, + 5748, + 5788, + 5778, + 5756, + 5752, + 5720, + 5819, + 5762, + 5721, + 5738, + 5754, + 5753, + 5781, + 5805, + 5813, + 5746, + 5752, + 5779, + 5739, + 5736, + 5766, + 5732, + 5760, + 5735, + 5729, + 5768, + 5776, + 5743, + 5764, + 5782, + 5798, + 5784, + 5793, + 5789, + 5749, + 5790, + 5770, + 5718, + 5762, + 5734, + 5738, + 5727, + 5749, + 5756, + 5773, + 5748, + 5793, + 5749, + 5763, + 5751, + 5775, + 5730, + 5753, + 5730, + 5762, + 5732, + 5782, + 5773, + 5728, + 5743, + 5765, + 5737, + 5790, + 5719, + 5729, + 5728, + 5771, + 5730, + 5784, + 5746, + 5732, + 5747, + 5746, + 5733, + 5786, + 5750, + 5773, + 5761, + 5729, + 5775, + 5739, + 5739, + 5743, + 5712, + 5789, + 5731, + 5781, + 5714, + 5770, + 5742, + 5743, + 5760, + 5763, + 5735, + 5735, + 5727, + 5730, + 5773, + 5793, + 5737, + 5757, + 5721, + 5753, + 9429, + 5799, + 5746, + 5795, + 5714, + 5717, + 5726, + 5761, + 5768, + 5717, + 5739, + 5789, + 5735, + 5794, + 5760, + 5758, + 5723, + 5740, + 5756, + 5811, + 5741, + 5762, + 5799, + 5751, + 5746, + 5799, + 5784, + 5788, + 5737, + 5773, + 5761, + 5775, + 5730, + 5754, + 5752, + 5776, + 5769, + 5780, + 5762, + 5814, + 5757, + 5762, + 5766, + 5788, + 5729, + 5723, + 5784, + 5787, + 5750, + 5786, + 5749, + 5771, + 5742, + 5770, + 5743, + 5771, + 5726, + 5750, + 5762, + 5818, + 5754, + 5776, + 5771, + 5745, + 5801, + 5774, + 5751, + 5774, + 5746, + 5779, + 5767, + 5748, + 5755, + 5791, + 5730, + 5744, + 5731, + 5794, + 5795, + 5786, + 5741, + 5749, + 5770, + 5741, + 5747, + 5812, + 5745, + 5758, + 5721, + 5779, + 5737, + 5779, + 5758, + 5776, + 5754, + 5765, + 5744, + 5785, + 5737, + 5725, + 5725, + 5721, + 5753, + 5758, + 5768, + 5755, + 5783, + 5761, + 5737, + 5778, + 5747, + 5791, + 5766, + 5750, + 5772, + 5810, + 5726, + 5776, + 5761, + 5777, + 5727, + 5779, + 5772, + 5786, + 5759, + 5766, + 5774, + 5768, + 5721, + 5743, + 5759, + 5725, + 5747, + 5774, + 5749, + 5782, + 5735, + 5816, + 5776, + 5794, + 5794, + 5769, + 5777, + 5809, + 5766, + 5747, + 5734, + 5732, + 5747, + 5760, + 5751, + 5769, + 5773, + 5772, + 5733, + 5766, + 5745, + 5785, + 5734, + 5786, + 5725, + 5759, + 5740, + 5781, + 5725, + 5754, + 5752, + 5798, + 5759, + 5785, + 5723, + 5720, + 5779, + 5733, + 5740, + 5793, + 5742, + 5755, + 5764, + 5772, + 5732, + 5772, + 5741, + 5752, + 5783, + 5785, + 5768, + 5788, + 5772, + 5814, + 5755, + 5729, + 5738, + 5784, + 5733, + 5755, + 5791, + 5765, + 5748, + 5778, + 5755, + 5727, + 5772, + 5818, + 5732, + 5819, + 5764, + 5738, + 5807, + 5784, + 5737, + 5759, + 5726, + 5747, + 5764, + 5722, + 5785, + 5755, + 5730, + 5739, + 5738, + 5733, + 5750, + 5782, + 5760, + 5758, + 5746, + 5758, + 5731, + 5759, + 5718, + 5762, + 5780, + 5794, + 5741, + 5799, + 5735, + 5750, + 5727, + 5732, + 5733, + 5774, + 5715, + 5720, + 5779, + 5751, + 5736, + 5755, + 5732, + 5754, + 5736, + 5799, + 5746, + 5774, + 5758, + 5740, + 5767, + 5780, + 5765, + 5762, + 5753, + 5785, + 5728, + 5750, + 5733, + 5776, + 5739, + 5752, + 5785, + 5793, + 5805, + 5811, + 5796, + 5741, + 5754, + 5756, + 5769, + 5759, + 5762, + 5771, + 5779, + 5751, + 5752, + 5762, + 5750, + 5744, + 5755, + 5734, + 5785, + 5774, + 5773, + 5777, + 5751, + 5771, + 5747, + 5770, + 5766, + 5770, + 5741, + 5748, + 5740, + 5803, + 5742, + 5816, + 5760, + 5726, + 5750, + 5791, + 5791, + 5731, + 5768, + 5740, + 5743, + 5749, + 5753, + 5774, + 5760, + 5782, + 5766, + 5785, + 5762, + 5815, + 5805, + 5765, + 5731, + 5821, + 5727, + 5737, + 5816, + 5792, + 5766, + 5756, + 5761, + 5793, + 5748, + 5757, + 5752, + 5801, + 5744, + 5769, + 5811, + 5751, + 5761, + 5793, + 5760, + 5782, + 5722, + 5751, + 5739, + 5778, + 5763, + 5783, + 5748, + 5780, + 5743, + 5772, + 5771, + 5755, + 5725, + 5771, + 5738, + 5756, + 5801, + 5729, + 5812, + 5727, + 5753, + 5758, + 5758, + 5791, + 5756, + 5802, + 5775, + 5754, + 5760, + 5745, + 5781, + 5778, + 5766, + 5760, + 5796, + 5725, + 5797, + 5751, + 5738, + 5771, + 5749, + 5739, + 5742, + 5795, + 5818, + 5762, + 5763, + 5719, + 5730, + 5730, + 5750, + 5771, + 5794, + 5781, + 5747, + 5717, + 5749, + 5777, + 5761, + 5728, + 5790, + 5730, + 5744, + 5755, + 5726, + 5794, + 5751, + 5880, + 5781, + 5868, + 5763, + 5795, + 5750, + 5775, + 5726, + 5756, + 5753, + 5742, + 5763, + 5746, + 5772, + 5770, + 5742, + 5754, + 5730, + 5749, + 5757, + 5790, + 5785, + 5800, + 5733, + 5727, + 5736, + 5802, + 5752, + 5758, + 5800, + 5760, + 5739, + 5802, + 5796, + 5737, + 5728, + 5750, + 5741, + 5771, + 5738, + 5737, + 5782, + 5771, + 5748, + 5756, + 5758, + 5732, + 5805, + 5758, + 5732, + 5738, + 5724, + 5753, + 5773, + 5767, + 5733, + 5767, + 5842, + 5740, + 5745, + 5807, + 5729, + 5755, + 5736, + 5736, + 5780, + 5769, + 5743, + 5815, + 5734, + 5729, + 5773, + 5719, + 5720, + 5771, + 5714, + 5743, + 5793, + 5722, + 5740, + 5745, + 5775, + 5766, + 5742, + 5791, + 5736, + 5778, + 5730, + 5773, + 5717, + 5767, + 5744, + 5794, + 5711, + 5743, + 5781, + 5782, + 5741, + 5796, + 5734, + 5731, + 5836, + 5761, + 5735, + 5766, + 5739, + 5738, + 5732, + 5762, + 5774, + 5761, + 5767, + 5734, + 5760, + 5773, + 5738, + 5751, + 5732, + 5732, + 5740, + 5742, + 5722, + 5775, + 5738, + 5782, + 5740, + 5753, + 5751, + 5769, + 5737, + 5731, + 5784, + 5776, + 5743, + 5805, + 5765, + 5774, + 5747, + 5763, + 5746, + 5748, + 5752, + 5793, + 5820, + 5727, + 5761, + 5851, + 5793, + 5783, + 5794, + 5765, + 5821, + 5814, + 5734, + 5733, + 5751, + 5788, + 5767, + 5810, + 5771, + 5719, + 5759, + 5767, + 5750, + 5770, + 5778, + 5749, + 5768, + 5738, + 5735, + 5790, + 5777, + 5736, + 5742, + 5768, + 5808, + 5738, + 5712, + 5743, + 5718, + 5764, + 5742, + 5762, + 5757, + 5743, + 5746, + 5745, + 5725, + 5742, + 5756, + 5791, + 5728, + 5754, + 5782, + 5780, + 5754, + 5769, + 5763, + 5816, + 5782, + 5772, + 5774, + 5800, + 5759, + 5795, + 5759, + 5752, + 5767, + 5736, + 5773, + 5776, + 5789, + 5798, + 5755, + 5782, + 5714, + 5723, + 5725, + 5794, + 5740, + 5796, + 5805, + 5771, + 5750, + 5822, + 5775, + 5798, + 5808, + 5783, + 5749, + 5744, + 5746, + 5724, + 5731, + 5753, + 5745, + 5766, + 5738, + 5738, + 5776, + 5810, + 5744, + 5775, + 5757, + 5761, + 5729, + 5749, + 5792, + 5779, + 5751, + 5752, + 5726, + 5736, + 5727, + 5766, + 5750, + 5739, + 5768, + 5774, + 5777, + 5772, + 5740, + 5806, + 5787, + 5772, + 5757, + 5764, + 5738, + 5742, + 5743, + 5730, + 5747, + 5780, + 5732, + 5727, + 5734, + 5746, + 5745, + 5796, + 5714, + 5781, + 5764, + 5733, + 5736, + 5785, + 5720, + 5762, + 5743, + 5745, + 5749, + 5775, + 5719, + 5775, + 5774, + 5804, + 5737, + 5769, + 5730, + 5746, + 5728, + 5738, + 5736, + 5781, + 5745, + 5745, + 5769, + 5786, + 5721, + 5753, + 5749, + 5728, + 5764, + 5780, + 5755, + 5782, + 5750, + 5787, + 5793, + 5733, + 5764, + 5783, + 5781, + 5763, + 5789, + 5757, + 5742, + 5754, + 5750, + 5750, + 5778, + 5779, + 5742, + 5773, + 5728, + 5774, + 5782, + 5730, + 5781, + 5763, + 5729, + 5774, + 5785, + 5771, + 5761, + 5749, + 5736, + 5774, + 5741, + 5755, + 5744, + 5779, + 5731, + 5744, + 5764, + 5783, + 5751, + 5803, + 5798, + 5728, + 5797, + 5785, + 5753, + 5797, + 5759, + 5764, + 5769, + 5734, + 5751, + 5768, + 5719, + 5770, + 5805, + 5738, + 5758, + 5786, + 5735, + 5733, + 5753, + 5734, + 5735, + 5770, + 5761, + 5753, + 5750, + 5750, + 5772, + 5782, + 5748, + 5745, + 5742, + 5759, + 5736, + 5752, + 5710, + 5787, + 5774, + 5763, + 5752, + 5782, + 5771, + 5720, + 5737, + 5751, + 5787, + 5784, + 5777, + 5810, + 5784, + 5768, + 5792, + 5770, + 5734, + 5764, + 5728, + 5779, + 5743, + 5781, + 5774, + 5773, + 5788, + 5790, + 5769, + 5797, + 5761, + 5751, + 5770, + 5768, + 5795, + 5801, + 5747, + 5779, + 5763, + 5747, + 5743, + 5839, + 5776, + 5736, + 5736, + 5802, + 5763, + 5802, + 5772, + 5740, + 5762, + 5774, + 5738, + 5748, + 5727, + 5744, + 5807, + 5788, + 5727, + 5773, + 5744, + 5787, + 5738, + 5745, + 5784, + 5764, + 5753, + 5812, + 5753, + 5799, + 5758, + 5806, + 5773, + 5787, + 5771, + 5768, + 5751, + 5770, + 5758, + 5756, + 5773, + 5734, + 5746, + 5821, + 5739, + 5756, + 5768, + 5703, + 5774, + 5771, + 5738, + 5747, + 5752, + 5781, + 5771, + 5774, + 5754, + 5725, + 5792, + 5800, + 5744, + 5775, + 5734, + 5745, + 5717, + 5772, + 5760, + 5780, + 5758, + 5791, + 5780, + 5721, + 5755, + 5759, + 5712, + 5739, + 5788, + 5778, + 5764, + 5773, + 5758, + 5779, + 5785, + 5731, + 5753, + 5737, + 5760, + 5757, + 5732, + 5731, + 5750, + 5773, + 5759, + 5782, + 5803, + 5771, + 5776, + 5757, + 5733, + 5766, + 5788, + 5746, + 5736, + 5763, + 5743, + 5767, + 5767, + 5776, + 5886, + 5747, + 5730, + 5745, + 5730, + 5769, + 5788, + 5774, + 5745, + 5791, + 5768, + 5770, + 5735, + 5792, + 5820, + 5786, + 5793, + 5739, + 5755, + 5804, + 5753, + 5747, + 5740, + 5780, + 5739, + 5788, + 5794, + 5762, + 5735, + 5762, + 5733, + 5742, + 5710, + 5747, + 5728, + 5739, + 5716, + 5778, + 5770, + 5734, + 5766, + 5848, + 5746, + 5787, + 5772, + 5775, + 5731, + 5761, + 5727, + 5770, + 5752, + 5777, + 5758, + 5745, + 5770, + 5782, + 5732, + 5747, + 5761, + 5767, + 5747, + 5768, + 5810, + 5796, + 5788, + 5750, + 5753, + 5759, + 5780, + 5772, + 5755, + 5786, + 5747, + 5748, + 5741, + 5732, + 5807, + 5756, + 5758, + 5815, + 5754, + 5807, + 5758, + 5791, + 5737, + 5798, + 5771, + 5732, + 5783, + 5713, + 5812, + 5773, + 5763, + 5749, + 5739, + 5786, + 5784, + 5782, + 5732, + 5757, + 5754, + 5778, + 5750, + 5742, + 5791, + 5728, + 5768, + 5723, + 5738, + 5781, + 5756, + 5748, + 5777, + 5728, + 5743, + 5751, + 5728, + 5796, + 5748, + 5756, + 5764, + 5798, + 5754, + 5733, + 5767, + 5779, + 5741, + 5745, + 5726, + 5760, + 5765, + 5738, + 5743, + 5752, + 5723, + 5780, + 5798, + 5747, + 5786, + 5776, + 5802, + 5732, + 5767, + 5762, + 5752, + 5790, + 5729, + 5743, + 5783, + 5769, + 5736, + 5811, + 5761, + 5715, + 5758, + 5736, + 5725, + 5774, + 5766, + 5782, + 5764, + 5780, + 5737, + 5731, + 5753, + 5802, + 5790, + 5739, + 5773, + 5766, + 5743, + 5768, + 5752, + 5762, + 5771, + 5810, + 5757, + 5747, + 5729, + 5709, + 5719, + 5816, + 5747, + 5722, + 5762, + 5736, + 5769, + 5751, + 5736, + 5783, + 5729, + 5735, + 5760, + 5783, + 5744, + 5769, + 5760, + 5777, + 5738, + 5751, + 5783, + 5784, + 5787, + 5779, + 5748, + 5795, + 5740, + 5743, + 5773, + 5757, + 5741, + 5757, + 5752, + 5774, + 5749, + 5728, + 5793, + 5804, + 5758, + 5815, + 5764, + 5728, + 5794, + 5799, + 5730, + 5784, + 5763, + 5768, + 5745, + 5749, + 5780, + 5772, + 5740, + 5789, + 5739, + 5744, + 5739, + 5763, + 5755, + 5780, + 5751, + 5790, + 5743, + 5751, + 5703, + 5740, + 5802, + 5791, + 5741, + 5759, + 5745, + 5779, + 5752, + 5849, + 5740, + 5809, + 5754, + 5762, + 5737, + 5817, + 5770, + 5733, + 5742, + 5774, + 5724, + 5768, + 5703, + 5722, + 5753, + 5748, + 5781, + 5760, + 5763, + 5739, + 5765, + 5745, + 5755, + 5760, + 5770, + 5762, + 5783, + 5744, + 5814, + 5818, + 5770, + 5758, + 5754, + 5770, + 5733, + 5788, + 5730, + 5748, + 5751, + 5768, + 5760, + 5816, + 5764, + 5750, + 5731, + 5793, + 5775, + 5819, + 5746, + 5739, + 5729, + 5756, + 5781, + 5758, + 5736, + 5777, + 5751, + 5755, + 5776, + 5765, + 5761, + 5761, + 5730, + 5740, + 5754, + 5780, + 5730, + 5759, + 5806, + 5748, + 5753, + 5759, + 5765, + 5747, + 5783, + 5777, + 5724, + 5795, + 5739, + 5778, + 5755, + 5773, + 5728, + 5773, + 5739, + 5766, + 5765, + 5746, + 5781, + 5794, + 5744, + 5758, + 5751, + 5771, + 5747, + 5737, + 5720, + 5740, + 5746, + 5760, + 5726, + 5778, + 5749, + 5752, + 5781, + 5738, + 5745, + 5871, + 5750, + 5763, + 5799, + 5755, + 5808, + 5806, + 5735, + 5797, + 5742, + 5732, + 5754, + 5759, + 5751, + 5767, + 5742, + 5743, + 5772, + 5778, + 5768, + 5753, + 5765, + 5790, + 5749, + 5793, + 5759, + 5741, + 5769, + 5747, + 5742, + 5821, + 5738, + 5754, + 5816, + 5740, + 5778, + 5781, + 5737, + 5773, + 5714, + 5784, + 5725, + 5766, + 5761, + 5763, + 5769, + 5777, + 5729, + 5764, + 5721, + 5794, + 5726, + 5721, + 5764, + 5772, + 5775, + 5791, + 5783, + 5787, + 5748, + 5782, + 5736, + 5740, + 5751, + 5756, + 5784, + 5816, + 5737, + 5796, + 5820, + 5804, + 5755, + 5783, + 5737, + 5735, + 5736, + 5763, + 5733, + 5775, + 5777, + 5757, + 5743, + 5741, + 5762, + 5789, + 5733, + 5737, + 5774, + 5722, + 5763, + 5811, + 5780, + 5766, + 5720, + 5765, + 5746, + 5796, + 5771, + 5760, + 5787, + 5779, + 5756, + 5814, + 5745, + 5757, + 5788, + 5747, + 5737, + 5777, + 5731, + 5754, + 5748, + 5769, + 5758, + 5769, + 5799, + 5730, + 5791, + 5798, + 5751, + 5777, + 5721, + 5750, + 5762, + 5728, + 5761, + 5772, + 5729, + 5764, + 5798, + 5760, + 5774, + 5761, + 5748, + 5731, + 5724, + 5730, + 5765, + 5792, + 5748, + 5727, + 5762, + 5760, + 5728, + 5753, + 5798, + 5779, + 5748, + 5745, + 5729, + 5777, + 5746, + 5767, + 5753, + 5783, + 5771, + 5783, + 5762, + 5714, + 5784, + 5790, + 5737, + 5743, + 5729, + 5740, + 5724, + 5772, + 5749, + 5801, + 5753, + 5774, + 5778, + 5765, + 5769, + 5807, + 5752, + 5774, + 5758, + 5749, + 5822, + 5809, + 5754, + 5773, + 5782, + 5770, + 5735, + 5757, + 5796, + 5728, + 5765, + 5736, + 5722, + 5785, + 5746, + 5736, + 5778, + 5778, + 5723, + 5779, + 5769, + 5740, + 5828, + 5745, + 5751, + 5788, + 5739, + 5735, + 5780, + 5761, + 5852, + 5797, + 5742, + 5731, + 5745, + 5796, + 5732, + 5787, + 5749, + 5735, + 5783, + 5755, + 5735, + 5776, + 5756, + 5772, + 5740, + 5799, + 5748, + 5791, + 5742, + 5756, + 5743, + 5746, + 5760, + 5768, + 5737, + 5815, + 5749, + 5724, + 5751, + 5824, + 5792, + 5717, + 5769, + 5775, + 5731, + 5785, + 5733, + 5728, + 5775, + 5735, + 5741, + 5768, + 5740, + 5746, + 5790, + 5811, + 5742, + 5743, + 5778, + 5765, + 5730, + 5809, + 5740, + 5781, + 5734, + 5749, + 5734, + 5771, + 5737, + 5775, + 5731, + 5779, + 5772, + 5784, + 5752, + 5768, + 5723, + 5740, + 5741, + 5745, + 5743, + 5768, + 5771, + 5763, + 5748, + 5740, + 5755, + 5757, + 5847, + 5812, + 5718, + 5790, + 5763, + 5749, + 5786, + 5716, + 5757, + 5765, + 5729, + 5808, + 5735, + 5781, + 5795, + 5791, + 5745, + 5791, + 5722, + 5758, + 5782, + 5742, + 5738, + 5760, + 5752, + 5784, + 5793, + 5759, + 5763, + 5767, + 5769, + 5779, + 5767, + 5767, + 5771, + 5803, + 5778, + 5797, + 5770, + 5776, + 5751, + 5764, + 5738, + 5769, + 5734, + 5767, + 5751, + 5771, + 5745, + 5738, + 5778, + 5729, + 5732, + 5762, + 5744, + 5768, + 5742, + 5796, + 5739, + 5801, + 5784, + 5766, + 5812, + 5773, + 5783, + 5766, + 5763, + 5733, + 5743, + 5716, + 5788, + 5764, + 5730, + 5771, + 5783, + 5798, + 5741, + 5768, + 5806, + 5786, + 5798, + 5747, + 5735, + 5809, + 5739, + 5727, + 5764, + 5709, + 5749, + 5813, + 5727, + 5727, + 5786, + 5792, + 5742, + 5754, + 5750, + 5764, + 5755, + 5791, + 5740, + 5736, + 5779, + 5783, + 5792, + 5804, + 5758, + 5762, + 5720, + 5793, + 5787, + 5760, + 5744, + 5762, + 5726, + 5716, + 5754, + 5755, + 5730, + 5786, + 5736, + 5756, + 5747, + 5791, + 5763, + 5784, + 5734, + 5761, + 5755, + 5765, + 5731, + 5764, + 5755, + 5733, + 5728, + 5735, + 5728, + 5767, + 5825, + 5750, + 5737, + 5791, + 5765, + 5849, + 5741, + 5761, + 5750, + 5783, + 5740, + 5794, + 5723, + 5814, + 5787, + 5784, + 5741, + 5782, + 5831, + 5731, + 7037, + 5796, + 5762, + 5735, + 5763, + 5732, + 5746, + 5729, + 5778, + 5744, + 5784, + 5748, + 5737, + 5746, + 5750, + 5781, + 5797, + 5778, + 5801, + 5729, + 5749, + 5747, + 5760, + 5848, + 5773, + 5742, + 5737, + 5753, + 5750, + 5743, + 5765, + 5792, + 5775, + 5831, + 5762, + 5798, + 5799, + 5772, + 5731, + 5760, + 5797, + 5755, + 5756, + 5756, + 5749, + 5822, + 5745, + 5794, + 5808, + 5725, + 5763, + 5798, + 5816, + 5774, + 5753, + 5801, + 5781, + 5786, + 5748, + 5713, + 5743, + 5719, + 5759, + 5811, + 5713, + 5770, + 5735, + 5745, + 5753, + 5760, + 5783, + 5771, + 5768, + 5787, + 5728, + 5783, + 5763, + 5793, + 5737, + 5815, + 5775, + 5849, + 5741, + 5797, + 5787, + 5738, + 5786, + 5747, + 5728, + 5770, + 5737, + 5752, + 5745, + 5732, + 5722, + 5743, + 5748, + 5787, + 5761, + 5790, + 5741, + 5750, + 5752, + 5724, + 5729, + 5749, + 5767, + 5745, + 5741, + 5793, + 5759, + 5744, + 5767, + 5724, + 5747, + 5742, + 5741, + 5760, + 5793, + 5753, + 5783, + 5717, + 5713, + 5752, + 5809, + 5761, + 5744, + 5762, + 5762, + 5756, + 5740, + 5737, + 5814, + 5769, + 5735, + 5787, + 5760, + 5756, + 5748, + 5747, + 5749, + 5804, + 5718, + 5792, + 5799, + 5883, + 5723, + 5774, + 21139, + 5792, + 5802, + 5744, + 5738, + 5807, + 5749, + 5761, + 5722, + 5739, + 5759, + 5793, + 5790, + 5750, + 5728, + 5732, + 5763, + 5755, + 5754, + 5755, + 5750, + 5714, + 5777, + 5764, + 5774, + 5743, + 5766, + 5787, + 5743, + 5755, + 5838, + 5757, + 5785, + 5796, + 5731, + 5778, + 5800, + 5705, + 5751, + 5740, + 5799, + 5766, + 5751, + 5729, + 5766, + 5744, + 5760, + 5759, + 5774, + 5784, + 5760, + 5747, + 5772, + 5759, + 5810, + 5751, + 5759, + 5753, + 5802, + 5746, + 5797, + 5797, + 5752, + 5796, + 5750, + 5774, + 5725, + 5764, + 5776, + 5751, + 5724, + 5741, + 5780, + 5771, + 5730, + 5756, + 5722, + 5794, + 5774, + 5746, + 5766, + 5741, + 5739, + 5772, + 5752, + 5776, + 5778, + 5747, + 5715, + 5763, + 5772, + 5802, + 5752, + 5769, + 5728, + 5771, + 5760, + 5718, + 5762, + 5752, + 5749, + 5768, + 5732, + 5748, + 5746, + 5774, + 5783, + 5781, + 5730, + 5792, + 5787, + 5779, + 5733, + 5764, + 5775, + 5783, + 5781, + 5830, + 5745, + 5756, + 5797, + 5718, + 5761, + 5747, + 5772, + 5775, + 5746, + 5770, + 5763, + 5749, + 5770, + 5802, + 5741, + 5763, + 5720, + 5759, + 5724, + 5757, + 5793, + 5792, + 5739, + 5754, + 5764, + 5795, + 5740, + 5738, + 5738, + 5794, + 5745, + 5787, + 5720, + 5773, + 5715, + 5731, + 5725, + 5778, + 5745, + 5752, + 5757, + 5769, + 5724, + 5799, + 5798, + 5755, + 5730, + 5737, + 5753, + 5770, + 5773, + 5766, + 5729, + 5770, + 5802, + 5787, + 5749, + 5781, + 5725, + 5728, + 5754, + 5782, + 5751, + 5750, + 5751, + 5789, + 5725, + 5759, + 5729, + 5778, + 5737, + 5792, + 5770, + 5764, + 5749, + 5789, + 5794, + 5776, + 5765, + 5805, + 5738, + 5766, + 5785, + 5761, + 5775, + 5791, + 5798, + 5751, + 5748, + 5769, + 5724, + 5787, + 5823, + 5782, + 5753, + 5797, + 5742, + 5754, + 5787, + 5727, + 5738, + 5738, + 5722, + 5770, + 5754, + 5719, + 5736, + 5796, + 5755, + 5774, + 5721, + 5746, + 5799, + 5762, + 5736, + 5762, + 5759, + 5753, + 5723, + 5721, + 5781, + 5759, + 5772, + 5724, + 5783, + 5795, + 5737, + 5824, + 5731, + 5753, + 5769, + 5756, + 5748, + 5764, + 5758, + 5727, + 5747, + 5777, + 5748, + 5781, + 5735, + 5788, + 5731, + 5783, + 5734, + 5783, + 5720, + 5801, + 5755, + 5737, + 5758, + 5775, + 5711, + 5736, + 5723, + 5733, + 5738, + 5770, + 5730, + 5788, + 5768, + 5790, + 5777, + 5769, + 5767, + 5735, + 5737, + 5767, + 5741, + 5793, + 5755, + 5758, + 5786, + 5728, + 5731, + 5766, + 5759, + 5784, + 5742, + 5761, + 5708, + 5765, + 5779, + 5741, + 5763, + 5763, + 5776, + 5773, + 5787, + 5757, + 5762, + 5757, + 5754, + 5794, + 5729, + 5768, + 5752, + 5787, + 5806, + 5781, + 5743, + 5798, + 5753, + 5777, + 5739, + 5772, + 5778, + 5747, + 5739, + 5715, + 5781, + 5770, + 5716, + 5761, + 5764, + 5734, + 5733, + 5925, + 5770, + 5745, + 5762, + 5763, + 5781, + 5765, + 5754, + 5744, + 5781, + 5746, + 5721, + 5754, + 5750, + 5771, + 5725, + 5767, + 5763, + 5780, + 5726, + 5789, + 5744, + 5751, + 5761, + 5774, + 5778, + 5754, + 5737, + 5762, + 5719, + 5772, + 5731, + 5729, + 5735, + 5772, + 5739, + 5781, + 5810, + 5753, + 5834, + 5793, + 5735, + 5781, + 5775, + 5749, + 5729, + 5785, + 5737, + 5800, + 5733, + 5772, + 5767, + 5745, + 5739, + 5805, + 5747, + 5769, + 5727, + 5743, + 5756, + 5771, + 5745, + 5747, + 5752, + 5755, + 5731, + 5802, + 5772, + 5823, + 5724, + 5732, + 5760, + 5777, + 5745, + 5718, + 5770, + 5735, + 5730, + 5760, + 5730, + 5752, + 5773, + 5727, + 5724, + 5832, + 5756, + 5769, + 5750, + 5774, + 5762, + 5740, + 5755, + 5773, + 5753, + 5797, + 5780, + 5782, + 5752, + 5806, + 5740, + 5756, + 5764, + 5760, + 5725, + 5763, + 5788, + 5740, + 5732, + 5777, + 5773, + 5742, + 5767, + 5773, + 5739, + 5778, + 5741, + 5753, + 5805, + 5768, + 5720, + 5748, + 5814, + 5754, + 5780, + 5767, + 5795, + 5786, + 5739, + 5708, + 5819, + 5762, + 5766, + 5759, + 5773, + 5759, + 5753, + 5808, + 5847, + 5811, + 5790, + 5802, + 5799, + 5735, + 5758, + 5747, + 5752, + 5775, + 5763, + 5825, + 5793, + 5800, + 5740, + 5739, + 5746, + 5736, + 5746, + 5784, + 5829, + 5733, + 5766, + 5770, + 5774, + 5786, + 5753, + 5782, + 5729, + 5790, + 5797, + 5790, + 5770, + 5746, + 5751, + 5748, + 5769, + 5753, + 5732, + 5786, + 5788, + 5794, + 5785, + 5781, + 5731, + 5732, + 5806, + 5765, + 5766, + 5780, + 5759, + 5790, + 5765, + 5769, + 5749, + 5753, + 5727, + 5747, + 5743, + 5754, + 5754, + 5782, + 5758, + 5735, + 5767, + 5729, + 5774, + 5730, + 5762, + 5777, + 5773, + 5776, + 5761, + 5758, + 5731, + 5760, + 5823, + 5725, + 5746, + 5746, + 5785, + 5776, + 5806, + 5726, + 5760, + 5774, + 5776, + 5757, + 5750, + 5799, + 5745, + 5780, + 5767, + 5786, + 5749, + 5779, + 5757, + 5768, + 5770, + 5792, + 5765, + 5789, + 5745, + 5814, + 5771, + 5743, + 5761, + 5762, + 5749, + 5765, + 5729, + 5769, + 5736, + 5789, + 5753, + 5780, + 5756, + 5747, + 5756, + 5778, + 5732, + 5792, + 5718, + 5731, + 5751, + 5769, + 5748, + 5762, + 5718, + 5747, + 5745, + 5734, + 5767, + 5775, + 5758, + 5737, + 5781, + 5748, + 5778, + 5753, + 5799, + 5744, + 5783, + 5722, + 5735, + 5773, + 5722, + 5754, + 5788, + 5831, + 5753, + 5856, + 5774, + 5775, + 5832, + 5787, + 5798, + 5739, + 5783, + 5741, + 5787, + 5779, + 5759, + 5802, + 5738, + 5741, + 5745, + 5783, + 5792, + 5736, + 5779, + 5739, + 5767, + 5757, + 5741, + 5799, + 5753, + 5723, + 5793, + 5790, + 5752, + 5772, + 5745, + 5757, + 5792, + 5796, + 5734, + 5812, + 5753, + 5773, + 5733, + 5766, + 5773, + 5781, + 5721, + 5755, + 5718, + 5767, + 5761, + 5795, + 5765, + 5732, + 5791, + 5787, + 5803, + 5796, + 5738, + 5793, + 5741, + 5760, + 5762, + 5740, + 5779, + 5815, + 5745, + 5795, + 5808, + 5782, + 5754, + 5723, + 5753, + 5760, + 5753, + 5777, + 5742, + 5776, + 5774, + 5766, + 5778, + 5753, + 5775, + 5746, + 5783, + 5768, + 5734, + 5778, + 5725, + 5760, + 5755, + 5766, + 5764, + 5773, + 5745, + 5804, + 5762, + 5797, + 5733, + 5790, + 5743, + 5744, + 5729, + 5786, + 5776, + 5781, + 5751, + 5774, + 5768, + 5769, + 5762, + 5748, + 5773, + 5767, + 5756, + 5763, + 5742, + 5792, + 5771, + 5725, + 5737, + 5804, + 5733, + 5795, + 5758, + 5762, + 5798, + 5775, + 5794, + 5776, + 5747, + 5719, + 5782, + 5757, + 5761, + 5785, + 5738, + 5748, + 5750, + 5829, + 5757, + 5767, + 5764, + 5739, + 5729, + 5778, + 5747, + 5834, + 5773, + 5756, + 5769, + 5786, + 5718, + 5735, + 5738, + 5738, + 5777, + 5759, + 5734, + 5760, + 5754, + 5804, + 5759, + 5746, + 5746, + 5782, + 5752, + 5731, + 5724, + 5742, + 5776, + 5795, + 5761, + 5746, + 5742, + 5752, + 5730, + 5750, + 5792, + 5739, + 5768, + 5766, + 5745, + 5809, + 5720, + 5825, + 5780, + 5755, + 5742, + 5757, + 5759, + 5744, + 5749, + 5727, + 5738, + 5758, + 5723, + 5764, + 5771, + 5743, + 5821, + 5765, + 5760, + 5720, + 5726, + 5755, + 5741, + 5797, + 5764, + 5719, + 5720, + 5753, + 5765, + 5771, + 5772, + 5747, + 5731, + 5785, + 5735, + 5787, + 5751, + 5748, + 5761, + 5754, + 5744, + 5769, + 5749, + 5762, + 5768, + 5781, + 5729, + 5800, + 5728, + 5790, + 5743, + 5782, + 5765, + 5793, + 5773, + 5767, + 5751, + 5750, + 5761, + 5799, + 5767, + 5733, + 5772, + 5768, + 5772, + 5759, + 5739, + 5759, + 5840, + 5736, + 5722, + 5757, + 5778, + 5733, + 5758, + 5790, + 5741, + 5749, + 5775, + 5789, + 5793, + 5755, + 5744, + 5777, + 5760, + 5728, + 5718, + 5727, + 5750, + 5753, + 5727, + 5738, + 5722, + 5777, + 5744, + 5743, + 5763, + 5734, + 5789, + 5744, + 5753, + 5773, + 5756, + 5747, + 5733, + 5793, + 5748, + 5776, + 5804, + 5733, + 5754, + 5758, + 5732, + 5766, + 5721, + 5742, + 5754, + 5774, + 5750, + 5762, + 5758, + 5742, + 5732, + 5776, + 5758, + 5770, + 5743, + 5738, + 5790, + 5774, + 5746, + 5846, + 5744, + 5792, + 5782, + 5739, + 5738, + 5802, + 5725, + 5778, + 5783, + 5752, + 5768, + 5757, + 5766, + 5767, + 5803, + 5725, + 5746, + 5774, + 5751, + 5772, + 5794, + 5783, + 5741, + 5788, + 5776, + 5750, + 5753, + 5752, + 5760, + 5751, + 5737, + 5736, + 5739, + 5777, + 5725, + 5774, + 5730, + 5764, + 5788, + 5834, + 5735, + 5757, + 5723, + 5784, + 5762, + 5782, + 5758, + 5794, + 5731, + 5740, + 5802, + 5771, + 5873, + 5786, + 5752, + 5761, + 5758, + 5817, + 5731, + 5739, + 5736, + 5761, + 5740, + 5772, + 5962, + 5773, + 5829, + 5747, + 5793, + 5711, + 5768, + 5787, + 5793, + 5750, + 5776, + 5752, + 5763, + 5776, + 5724, + 5786, + 5767, + 5843, + 5722, + 5733, + 5839, + 5770, + 5776, + 5732, + 5741, + 5772, + 5778, + 5765, + 5731, + 5758, + 5739, + 5780, + 5739, + 5764, + 5765, + 5779, + 5734, + 5790, + 5727, + 5779, + 5792, + 5743, + 5741, + 5764, + 5771, + 5726, + 5764, + 5783, + 5743, + 5759, + 5719, + 5718, + 5787, + 5789, + 5731, + 5797, + 5761, + 5728, + 5726, + 5757, + 5795, + 5764, + 5735, + 5744, + 5720, + 5740, + 5756, + 5802, + 5738, + 5794, + 5826, + 5751, + 5792, + 5756, + 5764, + 5800, + 5764, + 5754, + 5734, + 5762, + 5747, + 5743, + 5796, + 5738, + 5758, + 5794, + 5764, + 5790, + 5763, + 5774, + 5725, + 5783, + 5738, + 5775, + 5731, + 5784, + 5732, + 5792, + 5765, + 5726, + 5727, + 5780, + 5725, + 5803, + 5733, + 5739, + 5778, + 5741, + 5769, + 5769, + 5730, + 5821, + 5783, + 5733, + 5765, + 5762, + 5724, + 5773, + 5752, + 5761, + 5744, + 5784, + 5729, + 5748, + 5753, + 5742, + 5767, + 5792, + 5742, + 5723, + 5754, + 5777, + 5718, + 5735, + 5757, + 5781, + 5771, + 5786, + 5785, + 5750, + 5725, + 5742, + 5767, + 5722, + 5760, + 5819, + 5753, + 5787, + 5749, + 5755, + 5770, + 5762, + 5731, + 5733, + 5757, + 5729, + 5734, + 5741, + 5754, + 5716, + 5766, + 5786, + 5750, + 5756, + 5742, + 5737, + 5755, + 5766, + 5784, + 5790, + 5772, + 5711, + 5768, + 5784, + 5743, + 5765, + 5762, + 5799, + 5758, + 5733, + 5721, + 5761, + 5766, + 5754, + 5777, + 5738, + 5737, + 5747, + 5749, + 5754, + 5771, + 5832, + 5744, + 5757, + 5769, + 5780, + 5779, + 5778, + 5772, + 5771, + 5760, + 5754, + 5879, + 5784, + 5718, + 5772, + 5733, + 5745, + 5735, + 5733, + 5737, + 5764, + 5741, + 5734, + 5752, + 5764, + 5737, + 5762, + 5741, + 5774, + 5755, + 5753, + 5722, + 5763, + 5737, + 5755, + 5773, + 5771, + 22142, + 5765, + 5739, + 5727, + 5784, + 5782, + 5747, + 5825, + 5775, + 5720, + 5788, + 5757, + 5714, + 5766, + 5804, + 5750, + 5772, + 5771, + 5724, + 5756, + 5728, + 5754, + 5749, + 5744, + 5749, + 5762, + 5774, + 5754, + 5771, + 5746, + 5764, + 5786, + 5717, + 5801, + 5790, + 5759, + 5751, + 5757, + 5769, + 5793, + 5755, + 5740, + 5726, + 5771, + 5741, + 5750, + 5730, + 5744, + 5747, + 5807, + 5778, + 5798, + 5790, + 5754, + 5745, + 5781, + 5787, + 5757, + 5765, + 5746, + 5724, + 5760, + 5709, + 5759, + 5726, + 5756, + 5763, + 5739, + 5749, + 5742, + 5752, + 5731, + 5742, + 5750, + 5746, + 5797, + 5768, + 5793, + 5745, + 5771, + 5732, + 5743, + 5741, + 5724, + 5730, + 5785, + 5783, + 5744, + 5746, + 5782, + 5714, + 5775, + 5763, + 5757, + 5781, + 5762, + 5799, + 5781, + 5749, + 5750, + 5768, + 5770, + 5730, + 5754, + 5763, + 5791, + 5728, + 5746, + 5731, + 5772, + 5746, + 5723, + 5760, + 5724, + 5758, + 5789, + 5765, + 5786, + 5751, + 5765, + 5746, + 5744, + 5773, + 5774, + 5769, + 5785, + 5740, + 5760, + 5813, + 5765, + 5778, + 5753, + 5751, + 5770, + 5733, + 5768, + 5767, + 5756, + 5731, + 5803, + 5759, + 5750, + 5829, + 5749, + 5740, + 5769, + 5784, + 5738, + 5775, + 5796, + 5741, + 5833, + 5829, + 5738, + 5783, + 5817, + 5742, + 5779, + 5729, + 5756, + 5741, + 5733, + 5736, + 5760, + 5744, + 5734, + 5789, + 5758, + 5752, + 5779, + 5723, + 5752, + 12669, + 5727, + 5738, + 5746, + 5744, + 5747, + 5748, + 5804, + 5754, + 5746, + 5748, + 5751, + 5775, + 5717, + 5764, + 5765, + 5743, + 5747, + 5801, + 5755, + 5718, + 5753, + 5761, + 5795, + 5731, + 5776, + 5746, + 5782, + 5753, + 5732, + 5783, + 5712, + 5750, + 5789, + 5738, + 5759, + 5756, + 5749, + 5782, + 5789, + 5778, + 5737, + 5750, + 5729, + 5746, + 5834, + 5738, + 5717, + 5778, + 5773, + 5761, + 5780, + 5756, + 5787, + 5797, + 5770, + 5812, + 5789, + 5797, + 5764, + 5766, + 5736, + 5732, + 5766, + 5737, + 5797, + 5764, + 5804, + 5724, + 5742, + 5748, + 5761, + 5763, + 5744, + 5729, + 5787, + 5791, + 5725, + 5764, + 5763, + 5763, + 5786, + 5736, + 5785, + 5765, + 5749, + 5751, + 5796, + 5760, + 5714, + 5751, + 5750, + 5759, + 5778, + 5746, + 5853, + 5741, + 5756, + 5783, + 5759, + 5766, + 5733, + 5743, + 5722, + 5765, + 5731, + 5727, + 5758, + 5755, + 5762, + 5726, + 5770, + 5722, + 5731, + 5734, + 5767, + 5733, + 5754, + 5769, + 5782, + 5757, + 5790, + 5748, + 5789, + 5754, + 5807, + 5727, + 5718, + 5721, + 5776, + 5745, + 5773, + 5791, + 5732, + 5717, + 5797, + 5771, + 5770, + 5775, + 5762, + 5721, + 5789, + 5732, + 5763, + 5796, + 5733, + 5756, + 5758, + 5738, + 5721, + 5721, + 5788, + 5733, + 5753, + 5737, + 5767, + 5794, + 5715, + 5722, + 5779, + 5770, + 5756, + 5717, + 5741, + 5733, + 5777, + 5722, + 5745, + 5761, + 5792, + 5731, + 5751, + 5763, + 5784, + 5759, + 5759, + 5746, + 5768, + 5769, + 5783, + 5747, + 5757, + 5707, + 5733, + 5788, + 5725, + 5732, + 5741, + 5726, + 5777, + 5758, + 5730, + 5781, + 5795, + 5755, + 5771, + 5757, + 5797, + 5825, + 5750, + 5733, + 5776, + 5770, + 5742, + 5799, + 5731, + 5768, + 5761, + 5745, + 5779, + 5726, + 5720, + 5747, + 5783, + 5765, + 5774, + 5770, + 5809, + 5756, + 5770, + 5781, + 5759, + 5760, + 5785, + 5851, + 5749, + 5737, + 5776, + 5726, + 5772, + 5761, + 5746, + 5788, + 5770, + 5754, + 5729, + 5736, + 5779, + 5734, + 5784, + 5754, + 5744, + 5744, + 5786, + 5776, + 5727, + 5749, + 5786, + 5749, + 5736, + 5756, + 5753, + 5773, + 5743, + 5737, + 5919, + 5847, + 5717, + 5781, + 5796, + 5784, + 5752, + 5724, + 5726, + 5766, + 5720, + 5769, + 5792, + 5753, + 5788, + 5730, + 5738, + 5731, + 5781, + 5779, + 5730, + 5740, + 5751, + 5745, + 5795, + 5743, + 5746, + 5747, + 5794, + 5763, + 5767, + 5763, + 5745, + 5722, + 5759, + 5772, + 5723, + 5734, + 5779, + 5810, + 5781, + 5746, + 5751, + 5762, + 5782, + 5753, + 5725, + 5735, + 5787, + 5752, + 5762, + 5770, + 5734, + 5725, + 5734, + 5756, + 5760, + 5775, + 5775, + 5739, + 5756, + 5789, + 5766, + 5770, + 5778, + 5750, + 5777, + 5764, + 5753, + 5760, + 5770, + 5761, + 5734, + 5770, + 5793, + 5734, + 5727, + 5747, + 5844, + 5746, + 5744, + 5756, + 5744, + 5740, + 5795, + 5752, + 5723, + 5722, + 5785, + 5749, + 5824, + 5784, + 5818, + 5746, + 5768, + 5744, + 5763, + 5781, + 5724, + 5726, + 5757, + 5758, + 5774, + 5804, + 5726, + 5777, + 5753, + 5739, + 5786, + 5728, + 5766, + 5727, + 5760, + 5765, + 5732, + 5714, + 5760, + 5775, + 5716, + 5733, + 5766, + 5780, + 5729, + 5788, + 5764, + 5771, + 5796, + 5782, + 5732, + 5728, + 5828, + 5762, + 5746, + 5759, + 5730, + 5775, + 5795, + 5738, + 5778, + 5765, + 5809, + 5752, + 5762, + 5716, + 5793, + 5750, + 5743, + 5783, + 5745, + 5736, + 5794, + 5792, + 5756, + 5733, + 5746, + 5739, + 5753, + 5768, + 5757, + 5757, + 5768, + 5736, + 5770, + 5733, + 5745, + 5752, + 5741, + 5773, + 5757, + 5781, + 5754, + 5770, + 5756, + 5736, + 5772, + 5740, + 5750, + 5749, + 5746, + 5794, + 5762, + 5785, + 5758, + 5731, + 5745, + 5743, + 5791, + 5726, + 5750, + 5762, + 5746, + 5765, + 5756, + 5780, + 5784, + 5741, + 5759, + 5780, + 5821, + 5741, + 5808, + 5736, + 5751, + 5745, + 5778, + 5779, + 5751, + 5799, + 5757, + 5741, + 5750, + 5758, + 5763, + 5781, + 5769, + 5736, + 5799, + 5727, + 5781, + 5788, + 5731, + 5727, + 5772, + 5730, + 5780, + 5760, + 5770, + 5725, + 5729, + 5757, + 5729, + 5735, + 5752, + 5732, + 5762, + 5735, + 5779, + 5788, + 5716, + 5732, + 5779, + 5722, + 5771, + 5768, + 5731, + 5736, + 5733, + 5757, + 5724, + 5745, + 5739, + 5727, + 5756, + 5746, + 5776, + 5737, + 5728, + 5736, + 5791, + 5801, + 5806, + 5739, + 5783, + 5728, + 5732, + 5740, + 5785, + 5777, + 5743, + 5771, + 5761, + 5773, + 5741, + 5748, + 5730, + 5759, + 5798, + 5769, + 5728, + 5722, + 5746, + 5747, + 5773, + 5739, + 5728, + 5738, + 5759, + 5772, + 5746, + 5772, + 5782, + 5741, + 5765, + 5750, + 5759, + 5739, + 5742, + 5755, + 5755, + 5737, + 5784, + 5732, + 5731, + 5751, + 5751, + 5794, + 5750, + 5791, + 5769, + 5742, + 5745, + 5750, + 5809, + 5764, + 5775, + 5810, + 5734, + 5752, + 5778, + 5757, + 5747, + 5746, + 5759, + 5730, + 5764, + 5739, + 5771, + 5732, + 5728, + 5782, + 5778, + 5795, + 5748, + 5786, + 5764, + 5730, + 5761, + 5751, + 5739, + 5729, + 5775, + 5779, + 5769, + 5726, + 5756, + 5761, + 5767, + 5737, + 5737, + 5766, + 5732, + 5762, + 5723, + 5751, + 5773, + 5745, + 5815, + 5776, + 5747, + 5736, + 5775, + 5778, + 5740, + 5746, + 5781, + 5766, + 5782, + 5718, + 5779, + 5759, + 5780, + 5785, + 5744, + 5746, + 5714, + 5794, + 5727, + 5755, + 5795, + 5732, + 5744, + 5710, + 5755, + 5766, + 5769, + 5742, + 5743, + 5769, + 5736, + 5745, + 5777, + 5776, + 5779, + 5800, + 5744, + 5761, + 5814, + 5754, + 5742, + 5775, + 5781, + 5775, + 5800, + 5731, + 5722, + 5756, + 5753, + 5752, + 5779, + 5742, + 5802, + 5757, + 5781, + 5746, + 5801, + 5735, + 5745, + 5778, + 5789, + 5750, + 5770, + 5739, + 5723, + 5756, + 5749, + 5722, + 5793, + 5734, + 5745, + 5737, + 5756, + 5775, + 5729, + 5727, + 5763, + 5757, + 5734, + 5757, + 5768, + 5759, + 5736, + 5732, + 5728, + 5732, + 5763, + 5726, + 5724, + 5835, + 5759, + 5745, + 5771, + 5724, + 5746, + 5723, + 5777, + 5751, + 5839, + 5745, + 5774, + 5749, + 5741, + 5760, + 5786, + 5760, + 5732, + 5778, + 5761, + 5792, + 5797, + 5738, + 5738, + 5766, + 5774, + 5779, + 5773, + 5733, + 5774, + 5733, + 5771, + 5729, + 5778, + 5734, + 5728, + 5762, + 5739, + 5779, + 5792, + 5738, + 5751, + 5728, + 5745, + 5774, + 5727, + 5738, + 5750, + 5763, + 5756, + 5778, + 5793, + 5774, + 5761, + 5737, + 5739, + 5763, + 5766, + 5748, + 5739, + 5768, + 5768, + 5741, + 5744, + 5746, + 5720, + 5753, + 5782, + 5737, + 5740, + 5766, + 5751, + 5755, + 5740, + 5743, + 5794, + 5755, + 5764, + 5745, + 5740, + 5723, + 5752, + 5910, + 5760, + 5750, + 5746, + 5746, + 5733, + 5762, + 5730, + 5756, + 5807, + 5741, + 5763, + 5773, + 5757, + 5752, + 5790, + 5725, + 5773, + 5732, + 5754, + 5757, + 5746, + 5746, + 5726, + 5743, + 5740, + 13388, + 5792, + 5735, + 5809, + 5731, + 5767, + 5760, + 5760, + 5763, + 5782, + 5760, + 5721, + 5722, + 5748, + 5748, + 5768, + 5794, + 5751, + 5730, + 5802, + 5757, + 5797, + 5743, + 5795, + 5750, + 5744, + 5766, + 5813, + 5781, + 5765, + 5748, + 5817, + 5739, + 5735, + 5747, + 5764, + 5773, + 5765, + 5730, + 5758, + 5772, + 5735, + 5730, + 5764, + 5734, + 5751, + 5824, + 5733, + 5786, + 5750, + 5728, + 5755, + 5742, + 5762, + 5787, + 5803, + 5735, + 5761, + 5735, + 5729, + 5758, + 5778, + 5742, + 5758, + 5739, + 5748, + 5747, + 5774, + 5730, + 5792, + 5741, + 5784, + 5742, + 5768, + 5732, + 5775, + 5768, + 5782, + 5745, + 5738, + 5727, + 5775, + 5725, + 5761, + 5754, + 5744, + 5746, + 5770, + 5742, + 5779, + 5734, + 5717, + 5728, + 5719, + 5759, + 5762, + 5729, + 5776, + 5737, + 5736, + 5767, + 5741, + 5797, + 5729, + 5721, + 5767, + 5762, + 5778, + 5748, + 5745, + 5723, + 5777, + 5729, + 5761, + 5732, + 5732, + 5717, + 5746, + 5781, + 5812, + 5746, + 5754, + 5756, + 5764, + 5783, + 5728, + 5731, + 5722, + 5782, + 5800, + 5724, + 5761, + 5768, + 5753, + 5780, + 5776, + 5715, + 5765, + 5725, + 5757, + 5736, + 5769, + 5793, + 5734, + 5736, + 5735, + 5749, + 5778, + 5754, + 5736, + 5714, + 5727, + 5748, + 5767, + 5775, + 5736, + 5765, + 5738, + 5752, + 5774, + 5745, + 5755, + 5733, + 5813, + 5711, + 5797, + 5725, + 5781, + 5809, + 5747, + 5739, + 5733, + 5767, + 5724, + 5791, + 5712, + 5724, + 5790, + 5723, + 5744, + 5768, + 5715, + 5791, + 5778, + 5725, + 5763, + 5722, + 5725, + 5740, + 5759, + 5737, + 5782, + 5764, + 5731, + 5763, + 5748, + 5830, + 5745, + 5780, + 5799, + 5749, + 5780, + 5762, + 5808, + 5767, + 5770, + 5726, + 5780, + 5739, + 5763, + 5751, + 5736, + 5734, + 5767, + 5736, + 5753, + 5742, + 5746, + 5750, + 5748, + 5721, + 5792, + 5746, + 5720, + 5732, + 5816, + 5750, + 5733, + 5733, + 5728, + 5738, + 5771, + 5770, + 5828, + 5758, + 5735, + 5730, + 5823, + 5763, + 5748, + 5730, + 5785, + 5726, + 5753, + 5782, + 6023, + 5768, + 5789, + 5750, + 5776, + 5773, + 5753, + 5730, + 5749, + 5799, + 5769, + 5711, + 5753, + 5748, + 5768, + 5724, + 5739, + 5747, + 5760, + 5786, + 5808, + 5724, + 5771, + 5757, + 5715, + 5742, + 5764, + 5789, + 5738, + 5739, + 5759, + 5769, + 5763, + 5729, + 5739, + 5731, + 5880, + 5782, + 5726, + 5723, + 5771, + 5743, + 5722, + 5733, + 5730, + 5746, + 5740, + 5738, + 5722, + 5727, + 5753, + 5718, + 5772, + 5862, + 5730, + 5765, + 5737, + 5799, + 5743, + 5774, + 5774, + 5735, + 5750, + 5768, + 5753, + 5736, + 5755, + 5734, + 5760, + 5760, + 5790, + 5757, + 5764, + 5789, + 5773, + 5781, + 5766, + 5743, + 5749, + 5732, + 5736, + 5726, + 5775, + 5724, + 5745, + 5787, + 5756, + 5749, + 5778, + 5767, + 5747, + 5721, + 5764, + 5755, + 5764, + 5728, + 5747, + 5752, + 5730, + 5715, + 5787, + 5811, + 5735, + 5724, + 5770, + 5759, + 5779, + 5733, + 5750, + 5762, + 5771, + 5758, + 5769, + 5747, + 5720, + 5756, + 5729, + 5746, + 5762, + 5726, + 5744, + 5799, + 5753, + 5748, + 5757, + 5731, + 5769, + 5754, + 5820, + 5734, + 5754, + 5738, + 5727, + 5720, + 5748, + 5762, + 5745, + 5736, + 5749, + 5765, + 5745, + 5794, + 5740, + 5734, + 5785, + 5774, + 5755, + 5751, + 5725, + 5761, + 5763, + 5751, + 5732, + 5741, + 5773, + 5790, + 5718, + 5738, + 5724, + 5727, + 5732, + 5779, + 5775, + 5735, + 5742, + 5746, + 5756, + 5745, + 5753, + 5770, + 5758, + 5735, + 5769, + 5768, + 5747, + 5722, + 5794, + 5748, + 5745, + 5762, + 5761, + 5718, + 5734, + 5744, + 5766, + 5725, + 5749, + 5797, + 5755, + 5729, + 5809, + 5733, + 5714, + 5762, + 5731, + 5734, + 5786, + 5724, + 5767, + 5715, + 5742, + 5755, + 5770, + 5726, + 5720, + 5786, + 5731, + 5747, + 5778, + 5720, + 5746, + 5764, + 5740, + 5731, + 5755, + 5738, + 5744, + 5738, + 5743, + 5739, + 5779, + 5730, + 5731, + 5753, + 5749, + 5750, + 5749, + 5742, + 5723, + 5755, + 5734, + 5715, + 5781, + 5722, + 5727, + 5761, + 5792, + 5765, + 5796, + 5751, + 5746, + 5727, + 5752, + 5742, + 5748, + 5800, + 6130, + 5763, + 5760, + 5747, + 5777, + 5745, + 5741, + 5739, + 5796, + 5748, + 5733, + 5757, + 5765, + 5748, + 5760, + 5733, + 5757, + 5781, + 5730, + 5733, + 5791, + 5743, + 5773, + 5777, + 5765, + 5745, + 5779, + 5731, + 5771, + 5752, + 5754, + 5747, + 5727, + 5749, + 5777, + 5735, + 5777, + 5774, + 5732, + 5762, + 5735, + 5730, + 5768, + 5751, + 5728, + 5720, + 5773, + 5763, + 5728, + 5731, + 5743, + 5744, + 5729, + 5754, + 5763, + 5757, + 5779, + 5724, + 5776, + 5717, + 5783, + 5769, + 5763, + 5724, + 5735, + 5734, + 5750, + 5740, + 5779, + 5732, + 5796, + 5777, + 5782, + 5765, + 5743, + 5733, + 5745, + 5742, + 5723, + 5774, + 5754, + 5777, + 5787, + 5726, + 5758, + 5727, + 5725, + 5751, + 5782, + 5740, + 5720, + 5730, + 5757, + 5743, + 5746, + 5745, + 5792, + 5756, + 5744, + 6739, + 5767, + 5761, + 5755, + 5742, + 5716, + 5721, + 5771, + 5711, + 5777, + 5743, + 5755, + 5762, + 5766, + 5749, + 5750, + 5740, + 5713, + 5749, + 5758, + 5754, + 5756, + 5749, + 5731, + 5743, + 5823, + 5768, + 5771, + 5726, + 5754, + 5736, + 5775, + 5749, + 5780, + 5741, + 5773, + 5736, + 5741, + 5740, + 5754, + 5727, + 5727, + 5729, + 5783, + 5746, + 5734, + 5727, + 5764, + 5745, + 5737, + 5811, + 5748, + 5768, + 5736, + 5784, + 5765, + 5731, + 5760, + 5805, + 5740, + 5745, + 5739, + 5765, + 5784, + 5744, + 5748, + 5740, + 5817, + 5718, + 5749, + 5786, + 5743, + 5749, + 5765, + 5717, + 5805, + 5774, + 5770, + 5761, + 5830, + 5752, + 5805, + 5794, + 5772, + 5753, + 5787, + 5794, + 5778, + 5751, + 5755, + 5734, + 5770, + 5725, + 5768, + 5789, + 5763, + 5744, + 5756, + 5743, + 5745, + 5751, + 5722, + 5728, + 5776, + 5757, + 5812, + 5742, + 5758, + 5716, + 5754, + 5747, + 5735, + 5739, + 5743, + 5729, + 5755, + 5789, + 5751, + 5832, + 5735, + 5746, + 5733, + 5768, + 5759, + 5719, + 5729, + 5727, + 5796, + 5737, + 5772, + 5737, + 5717, + 5744, + 5752, + 5726, + 5732, + 5752, + 5754, + 5724, + 5762, + 5715, + 5756, + 5746, + 5756, + 5749, + 5816, + 5738, + 5753, + 5807, + 5768, + 5743, + 5810, + 5738, + 5773, + 5723, + 5742, + 5758, + 5742, + 5731, + 5742, + 5796, + 5794, + 5740, + 5746, + 5751, + 5724, + 5803, + 5753, + 5748, + 5791, + 5728, + 5732, + 5782, + 5773, + 5743, + 5768, + 5806, + 5802, + 5751, + 5793, + 5738, + 5787, + 5741, + 5763, + 5799, + 5747, + 5733, + 5742, + 5744, + 5756, + 5739, + 5745, + 5734, + 5775, + 5771, + 5767, + 5799, + 5745, + 5745, + 5797, + 5752, + 5795, + 5777, + 5752, + 5747, + 5839, + 5781, + 5754, + 5756, + 5758, + 5739, + 5771, + 5735, + 5771, + 5759, + 5709, + 5732, + 5742, + 5739, + 5783, + 5755, + 5782, + 5734, + 5752, + 5735, + 5727, + 5753, + 5725, + 5733, + 5772, + 5763, + 5778, + 5792, + 5767, + 5737, + 5815, + 5764, + 5748, + 5757, + 5746, + 5722, + 5757, + 5766, + 5731, + 5769, + 5756, + 5739, + 5757, + 5776, + 5742, + 5794, + 5719, + 5725, + 5772, + 5728, + 5740, + 5748, + 5714, + 5738, + 5739, + 5751, + 5781, + 5729, + 5742, + 5782, + 5763, + 5797, + 5796, + 5792, + 5736, + 5754, + 5795, + 5785, + 5796, + 5757, + 5766, + 5736, + 5750, + 5727, + 5770, + 5733, + 5744, + 5737, + 5741, + 5739, + 5773, + 5802, + 5731, + 5761, + 5777, + 5759, + 5728, + 5744, + 5730, + 5751, + 5725, + 5731, + 5744, + 5740, + 5765, + 5710, + 5779, + 5725, + 5768, + 5760, + 5714, + 5730, + 5745, + 5746, + 5735, + 5767, + 5731, + 5758, + 5748, + 5763, + 5738, + 5749, + 5727, + 5741, + 5793, + 5741, + 5746, + 5756, + 5776, + 5780, + 5746, + 5735, + 5776, + 5761, + 5762, + 5731, + 5735, + 5754, + 5734, + 5755, + 5725, + 5747, + 5790, + 5742, + 5775, + 5761, + 5758, + 5746, + 5787, + 5756, + 5736, + 5758, + 5758, + 5739, + 5768, + 5776, + 5730, + 5773, + 5726, + 5775, + 5817, + 5730, + 5773, + 5784, + 5778, + 5765, + 5766, + 5777, + 5763, + 5754, + 5765, + 5719, + 5755, + 5747, + 5793, + 5763, + 5733, + 5718, + 5761, + 5719, + 5761, + 5783, + 5777, + 5765, + 5764, + 5731, + 5766, + 5745, + 5764, + 5726, + 5752, + 5750, + 5782, + 5722, + 5796, + 5738, + 5742, + 5776, + 5769, + 5769, + 5745, + 5787, + 5779, + 5786, + 5755, + 5732, + 5755, + 5739, + 5770, + 5759, + 5790, + 5732, + 5723, + 5744, + 5753, + 5729, + 5713, + 5744, + 5731, + 5733, + 5768, + 5743, + 5736, + 5733, + 5769, + 5792, + 5794, + 5732, + 5751, + 5722, + 5779, + 5743, + 5791, + 5773, + 5734, + 5746, + 5781, + 5778, + 5789, + 5749, + 5760, + 5774, + 5786, + 5770, + 5774, + 5723, + 5773, + 5728, + 5759, + 5743, + 5775, + 5727, + 5714, + 5746, + 5747, + 5742, + 5766, + 5787, + 5757, + 5767, + 5767, + 5734, + 5791, + 5751, + 5781, + 5751, + 5733, + 5727, + 5751, + 5718, + 5775, + 5768, + 5754, + 5745, + 5748, + 5788, + 5734, + 5728, + 5717, + 5733, + 5742, + 5764, + 5759, + 5792, + 5745, + 5754, + 5762, + 5728, + 5753, + 5750, + 5755, + 5756, + 5765, + 5781, + 5753, + 5756, + 5723, + 5786, + 5788, + 5726, + 5750, + 5706, + 5720, + 5726, + 5745, + 5754, + 5776, + 5748, + 5794, + 5756, + 5794, + 5724, + 5787, + 5725, + 5764, + 5732, + 5740, + 5729, + 5783, + 5730, + 5736, + 5732, + 5732, + 5730, + 5726, + 5782, + 5736, + 5755, + 5778, + 5729, + 5755, + 5739, + 5725, + 5738, + 5800, + 5751, + 5735, + 5754, + 5735, + 5733, + 5793, + 5771, + 5746, + 5757, + 5733, + 5737, + 5737, + 5764, + 5723, + 5728, + 5768, + 5747, + 5779, + 5769, + 5766, + 5740, + 5731, + 5738, + 5760, + 5762, + 5740, + 5780, + 5735, + 5734, + 5758, + 5761, + 5740, + 5806, + 5777, + 5821, + 5845, + 5766, + 5746, + 5711, + 5775, + 5730, + 5732, + 5763, + 5767, + 5789, + 5775, + 5751, + 5760, + 5762, + 5752, + 5747, + 5775, + 5786, + 5778, + 5728, + 5788, + 5710, + 5787, + 5725, + 5734, + 5737, + 5771, + 5762, + 5768, + 5740, + 5747, + 5735, + 5762, + 5723, + 5748, + 5765, + 5800, + 5733, + 5803, + 5752, + 5784, + 5774, + 5761, + 5736, + 5767, + 5742, + 5733, + 5761, + 5769, + 5780, + 5776, + 5780, + 5773, + 5721, + 5788, + 5741, + 5727, + 5729, + 5789, + 5730, + 5783, + 5726, + 5728, + 5743, + 5735, + 5720, + 5753, + 5719, + 5766, + 5745, + 5763, + 5756, + 5764, + 5763, + 5731, + 5785, + 5797, + 5732, + 5771, + 5760, + 5766, + 5755, + 5739, + 5746, + 5750, + 5737, + 5782, + 5755, + 5773, + 5726, + 5722, + 5755, + 5794, + 5742, + 5756, + 5764, + 5764, + 5773, + 5731, + 5728, + 5791, + 5748, + 5771, + 5721, + 5742, + 5762, + 5728, + 5710, + 5766, + 5771, + 5765, + 5722, + 5722, + 5724, + 5801, + 5733, + 5749, + 5739, + 5754, + 5736, + 5763, + 5763, + 5796, + 5753, + 5763, + 5748, + 5737, + 5766, + 5813, + 5732, + 5767, + 5747, + 5774, + 5744, + 5735, + 5774, + 5785, + 5763, + 5749, + 5753, + 5741, + 5710, + 5745, + 5739, + 5829, + 5774, + 5721, + 5753, + 5726, + 5744, + 5729, + 5715, + 5758, + 5759, + 5761, + 5722, + 5769, + 5746, + 5730, + 5817, + 5766, + 5743, + 5785, + 5719, + 5732, + 5739, + 5729, + 5754, + 5725, + 5727, + 5726, + 5708, + 5783, + 5733, + 5729, + 5748, + 5778, + 5743, + 5793, + 5768, + 5785, + 5795, + 5770, + 5735, + 5746, + 5772, + 5742, + 5726, + 5741, + 5732, + 5757, + 5802, + 5758, + 5776, + 5766, + 5797, + 5741, + 5752, + 5791, + 5741, + 5785, + 5777, + 5727, + 5756, + 5749, + 5798, + 5798, + 5765, + 5719, + 5739, + 5738, + 5807, + 5749, + 5728, + 5724, + 5736, + 5770, + 5730, + 5770, + 5765, + 5744, + 5763, + 5785, + 5743, + 5761, + 5733, + 5745, + 5769, + 5761, + 5764, + 5777, + 5729, + 5742, + 5730, + 5760, + 5762, + 5733, + 5758, + 5746, + 5789, + 5754, + 5764, + 5781, + 5728, + 5761, + 5743, + 5760, + 5714, + 5740, + 5716, + 5780, + 5842, + 5809, + 5756, + 5744, + 5777, + 5732, + 5769, + 5732, + 5737, + 5748, + 5742, + 5778, + 5745, + 5727, + 5722, + 5775, + 5738, + 5759, + 5798, + 5733, + 5752, + 5771, + 5739, + 5786, + 5758, + 5735, + 5724, + 5749, + 5774, + 5798, + 5748, + 5768, + 5775, + 5728, + 5755, + 5742, + 5777, + 5742, + 5734, + 5794, + 5793, + 5741, + 5764, + 5780, + 5776, + 5732, + 5799, + 5737, + 5753, + 5746, + 5769, + 5755, + 5767, + 5727, + 5716, + 5746, + 5739, + 5774, + 5738, + 5768, + 5750, + 5751, + 5750, + 5738, + 5752, + 5782, + 5771, + 5791, + 5740, + 5731, + 5782, + 5732, + 5735, + 5738, + 5756, + 5786, + 5783, + 5768, + 5761, + 5788, + 5753, + 5758, + 5749, + 5777, + 5736, + 5772, + 5772, + 5743, + 5722, + 5737, + 5762, + 5741, + 5767, + 5737, + 5719, + 5757, + 5725, + 5794, + 5795, + 5764, + 5772, + 5756, + 5747, + 5729, + 5722, + 5782, + 5735, + 5749, + 5750, + 5761, + 5733, + 5761, + 5817, + 5717, + 5740, + 5750, + 5803, + 5740, + 5773, + 5785, + 5761, + 5775, + 5726, + 5766, + 5735, + 5764, + 5749, + 5788, + 5732, + 5728, + 5730, + 5722, + 5719, + 5796, + 5741, + 5763, + 5733, + 5757, + 5754, + 5771, + 5766, + 5810, + 5731, + 5810, + 5747, + 5771, + 5736, + 5731, + 5724, + 5738, + 5751, + 5743, + 5745, + 5799, + 5782, + 5770, + 5752, + 5761, + 5773, + 5768, + 5785, + 5776, + 5733, + 5781, + 5747, + 5740, + 6002, + 5758, + 5772, + 5760, + 5761, + 5754, + 5778, + 5748, + 5776, + 5739, + 5759, + 5768, + 5763, + 5740, + 5755, + 5768, + 5732, + 5771, + 5752, + 5724, + 5765, + 5753, + 5746, + 5826, + 5739, + 5777, + 5734, + 5775, + 5718, + 5812, + 5783, + 5815, + 5730, + 5764, + 5758, + 5741, + 5732, + 5751, + 5741, + 5822, + 5749, + 5728, + 5753, + 5738, + 5749, + 5770, + 5765, + 5750, + 5731, + 5751, + 5735, + 5750, + 5774, + 5768, + 5751, + 5762, + 5742, + 5773, + 5728, + 5707, + 6104, + 5782, + 5744, + 5779, + 5732, + 5767, + 5762, + 5719, + 5727, + 5793, + 5729, + 5761, + 5756, + 5775, + 5729, + 5792, + 5745, + 5759, + 5759, + 5770, + 5738, + 5805, + 5783, + 5762, + 5762, + 5739, + 5725, + 5796, + 5731, + 5772, + 5719, + 5760, + 5747, + 5799, + 5778, + 5779, + 5729, + 5778, + 5717, + 5725, + 5726, + 5738, + 5773, + 5741, + 5771, + 5783, + 5793, + 5762, + 5762, + 5752, + 5751, + 5784, + 5740, + 5730, + 5727, + 5750, + 5724, + 5763, + 5741, + 5764, + 5729, + 5735, + 5724, + 5757, + 5745, + 5746, + 5759, + 5757, + 5716, + 5817, + 5726, + 5788, + 5730, + 5734, + 5772, + 5742, + 5735, + 5737, + 5796, + 5773, + 5759, + 5760, + 5780, + 5751, + 5728, + 5749, + 5731, + 5776, + 5761, + 5736, + 5734, + 5786, + 5749, + 5751, + 5750, + 5759, + 5744, + 5750, + 5732, + 5731, + 5742, + 5765, + 5741, + 5775, + 5733, + 5799, + 5793, + 5736, + 5742, + 5738, + 5813, + 5766, + 5769, + 5763, + 5752, + 5745, + 5769, + 5758, + 5723, + 5760, + 5749, + 5760, + 5729, + 5747, + 5735, + 5732, + 5729, + 5751, + 5760, + 5726, + 5773, + 5740, + 5736, + 5744, + 5744, + 5750, + 5750, + 5784, + 5760, + 5759, + 5764, + 5751, + 5825, + 5726, + 5801, + 5746, + 5771, + 5747, + 5727, + 5752, + 5779, + 5732, + 5738, + 5769, + 5745, + 5739, + 5754, + 5753, + 5728, + 5752, + 5748, + 5775, + 5732, + 5742, + 5738, + 5795, + 5732, + 5766, + 5744, + 5747, + 6087, + 5743, + 5766, + 5779, + 5731, + 5721, + 5742, + 5777, + 5744, + 5803, + 5754, + 5770, + 5720, + 5798, + 5714, + 5810, + 5770, + 5760, + 5730, + 5777, + 5781, + 5764, + 5723, + 5757, + 5733, + 5744, + 5715, + 5743, + 5757, + 5762, + 5742, + 5757, + 5735, + 5781, + 5788, + 5732, + 5721, + 5740, + 5742, + 5769, + 5779, + 5749, + 5754, + 5788, + 5785, + 5746, + 5748, + 5740, + 5766, + 5803, + 5762, + 5757, + 5738, + 5753, + 5772, + 5837, + 5778, + 5771, + 5817, + 5767, + 5762, + 5738, + 5738, + 5775, + 5727, + 5773, + 5722, + 5759, + 5746, + 5749, + 5764, + 5756, + 5747, + 5780, + 5763, + 5728, + 5724, + 5757, + 5745, + 5733, + 5734, + 5731, + 5734, + 5751, + 5749, + 5738, + 5745, + 5796, + 5757, + 5774, + 5730, + 5785, + 5757, + 5852, + 5774, + 5779, + 5752, + 5803, + 5749, + 5734, + 5758, + 5782, + 5763, + 5768, + 5716, + 5746, + 5769, + 5757, + 5755, + 5760, + 5740, + 5764, + 5750, + 5735, + 5751, + 5725, + 5783, + 5723, + 5764, + 5765, + 5748, + 5781, + 5762, + 5734, + 5751, + 5718, + 5717, + 5770, + 5731, + 5772, + 5753, + 5781, + 5756, + 5752, + 5734, + 5729, + 5735, + 5784, + 5728, + 5790, + 5729, + 5763, + 5803, + 5739, + 5749, + 5797, + 5770, + 5775, + 5739, + 5770, + 5761, + 5780, + 5741, + 5756, + 5799, + 5773, + 5753, + 5747, + 5798, + 5734, + 5753, + 5741, + 5757, + 5778, + 5736, + 5760, + 5740, + 5806, + 5753, + 5765, + 5725, + 5770, + 5743, + 5754, + 5745, + 5762, + 5770, + 5719, + 5713, + 5721, + 5741, + 5774, + 5795, + 5775, + 5737, + 5762, + 5730, + 5795, + 5720, + 5769, + 5755, + 5807, + 5749, + 5732, + 5761, + 5732, + 5769, + 5738, + 5755, + 5743, + 5738, + 5721, + 5744, + 5738, + 5763, + 5749, + 5731, + 5795, + 5742, + 5777, + 5742, + 5772, + 5744, + 5737, + 5784, + 5749, + 5749, + 5771, + 5764, + 5726, + 5770, + 5771, + 5763, + 5771, + 5731, + 5739, + 5720, + 5743, + 5741, + 5735, + 5755, + 5782, + 5760, + 5793, + 6167, + 5791, + 5732, + 5749, + 5761, + 5746, + 5730, + 5737, + 5723, + 5724, + 5741, + 5745, + 5737, + 5772, + 5740, + 5751, + 5761, + 5770, + 5759, + 5775, + 5789, + 5750, + 5742, + 5722, + 5741, + 5751, + 5735, + 5760, + 5737, + 5740, + 5759, + 5748, + 5729, + 5772, + 5739, + 5756, + 5788, + 5776, + 5722, + 5742, + 5760, + 5721, + 5744, + 5767, + 5749, + 5717, + 5767, + 5752, + 5753, + 5799, + 5778, + 5769, + 5792, + 5778, + 5792, + 5748, + 5745, + 5753, + 5730, + 5743, + 5748, + 5782, + 5785, + 5715, + 5733, + 5739, + 5805, + 5753, + 5725, + 5730, + 5779, + 5753, + 5719, + 5755, + 5776, + 5747, + 5728, + 5730, + 5723, + 5741, + 5775, + 5738, + 5790, + 5714, + 5731, + 5730, + 5725, + 5769, + 5759, + 5773, + 5711, + 5766, + 5745, + 5743, + 5771, + 5770, + 5771, + 5823, + 5738, + 5757, + 5738, + 5749, + 5755, + 5753, + 5713, + 5724, + 5740, + 5768, + 5728, + 5745, + 5737, + 5751, + 5745, + 5752, + 5762, + 5758, + 5757, + 5765, + 5766, + 5761, + 5774, + 5758, + 5775, + 5735, + 5792, + 5741, + 5785, + 5823, + 5787, + 5736, + 5712, + 5766, + 5756, + 5742, + 5748, + 5726, + 5729, + 5730, + 5745, + 5751, + 5754, + 5753, + 5786, + 5774, + 5759, + 5764, + 5801, + 5763, + 5735, + 5744, + 5725, + 5774, + 5752, + 5770, + 5770, + 5757, + 5730, + 5782, + 5747, + 5738, + 5797, + 5752, + 5762, + 5768, + 5768, + 5765, + 5748, + 5728, + 5744, + 5749, + 5754, + 5794, + 5766, + 5756, + 5731, + 5782, + 5733, + 5725, + 5741, + 5712, + 5711, + 5747, + 5751, + 5754, + 5775, + 5780, + 5734, + 5768, + 5770, + 5734, + 5744, + 5719, + 5736, + 5785, + 5720, + 5741, + 5726, + 5778, + 5722, + 5744, + 5722, + 5790, + 5732, + 5767, + 5774, + 5723, + 5728, + 5727, + 5753, + 5741, + 5749, + 5745, + 5718, + 5757, + 5741, + 5751, + 5722, + 5842, + 5718, + 5725, + 5718, + 5769, + 5999, + 5769, + 5800, + 5734, + 5776, + 5759, + 5757, + 5777, + 5757, + 5721, + 5737, + 5734, + 5773, + 5738, + 5723, + 5752, + 5781, + 5796, + 5744, + 5742, + 5714, + 5727, + 5732, + 5859, + 5748, + 5735, + 5730, + 5757, + 5753, + 5771, + 5746, + 5811, + 5762, + 5754, + 5762, + 5761, + 5716, + 5749, + 5731, + 5735, + 5726, + 5759, + 5754, + 5749, + 5733, + 5731, + 5784, + 5762, + 5741, + 6110, + 5756, + 5823, + 5766, + 5772, + 5740, + 5765, + 5745, + 5763, + 5747, + 5785, + 5755, + 5761, + 5741, + 5807, + 5761, + 5743, + 5771, + 5811, + 5766, + 5765, + 5742, + 5747, + 5798, + 5807, + 5749, + 5730, + 5808, + 5775, + 5782, + 5771, + 5749, + 5747, + 5777, + 5737, + 5759, + 5737, + 5719, + 5743, + 5729, + 5734, + 5761, + 5768, + 5718, + 5722, + 5729, + 5773, + 5718, + 5757, + 5731, + 5768, + 5728, + 5725, + 5730, + 5777, + 5721, + 5739, + 5758, + 5763, + 5722, + 5757, + 5772, + 5736, + 5741, + 5741, + 5714, + 5786, + 5733, + 5768, + 5728, + 5722, + 5760, + 5755, + 5725, + 5782, + 5734, + 5759, + 5744, + 5766, + 5759, + 5747, + 5703, + 5727, + 5748, + 5775, + 5743, + 6016, + 5774, + 5774, + 5753, + 5749, + 5792, + 5747, + 5777, + 5775, + 5735, + 5779, + 5757, + 5778, + 5761, + 5798, + 5731, + 5792, + 5727, + 5742, + 5739, + 5768, + 5741, + 5756, + 5731, + 5770, + 5727, + 5753, + 5752, + 5753, + 5753, + 5740, + 5754, + 5772, + 5751, + 5757, + 5752, + 5738, + 5766, + 5733, + 5746, + 5752, + 5733, + 5779, + 5774, + 5744, + 5779, + 5780, + 5773, + 5725, + 5762, + 5742, + 5729, + 5827, + 5751, + 5811, + 5730, + 5743, + 5764, + 5773, + 5796, + 5763, + 5761, + 5720, + 5751, + 5792, + 5750, + 5758, + 5763, + 5753, + 5739, + 5781, + 5757, + 5771, + 5749, + 5799, + 5776, + 5762, + 5751, + 5755, + 5766, + 5747, + 5746, + 5783, + 5745, + 5718, + 5763, + 5737, + 5727, + 5762, + 5734, + 5757, + 5723, + 5742, + 5734, + 5767, + 5770, + 5752, + 5764, + 5756, + 5724, + 5751, + 5765, + 5764, + 5759, + 5723, + 5738, + 5756, + 5753, + 5721, + 5778, + 5767, + 5755, + 5769, + 5767, + 5777, + 5749, + 5722, + 5750, + 5766, + 5756, + 5747, + 5732, + 5742, + 5747, + 5760, + 5725, + 5742, + 5768, + 5766, + 5773, + 5749, + 5745, + 5785, + 5773, + 5737, + 5771, + 5778, + 5771, + 5725, + 5806, + 5712, + 5733, + 5762, + 5796, + 5749 + ], + "sample_count": 15277 + }, + { + "pubkey": "F6C5RmCkh54DD8SUPzJ16QkQFgyd6fkjHi7AxQ4x2DLT", + "epoch": 89, + "origin_device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "target_device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "link_pk": "YnBTcwD87rvh2zpor9PchchUo28xtgba7w88F16VhZK", + "origin_device_location_pk": "9nJjrDoWWbzhqLka3oHYdj2W3vr2UzUCcjoeCEQ7mAai", + "target_device_location_pk": "8ivCSPhAs6WwbWY5WR7GCQiChEVcK2kpoj97MugLPwcg", + "origin_device_agent_pk": "A7yxgJvkU5kaLmvKtL5Yz5tQB9td6DLxtbezhqZVfgsd", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242130060638, + "samples": [ + 68441, + 68404, + 68418, + 68368, + 68406, + 68406, + 68396, + 68412, + 68369, + 68362, + 68391, + 68396, + 68385, + 68382, + 68436, + 68430, + 68410, + 68404, + 68386, + 68402, + 68429, + 68428, + 68384, + 68391, + 68397, + 68408, + 68369, + 68383, + 68413, + 68403, + 68453, + 68429, + 68370, + 68398, + 68361, + 68395, + 68438, + 68431, + 68376, + 68404, + 68418, + 68425, + 68404, + 68374, + 68386, + 68400, + 68373, + 68433, + 68375, + 68392, + 68388, + 68437, + 68392, + 68381, + 68417, + 68401, + 68412, + 68398, + 68409, + 68379, + 68409, + 68402, + 68380, + 68437, + 68392, + 68414, + 68389, + 68409, + 68390, + 68380, + 68397, + 68385, + 68356, + 68407, + 68381, + 68381, + 68400, + 68376, + 68404, + 68386, + 68411, + 68389, + 68401, + 68381, + 68394, + 68413, + 68408, + 68407, + 68395, + 68409, + 68403, + 68399, + 68390, + 68399, + 68371, + 68414, + 68400, + 68396, + 68396, + 68406, + 68426, + 68407, + 68438, + 68388, + 68375, + 68415, + 68385, + 68395, + 68391, + 68363, + 68386, + 68421, + 68445, + 68426, + 68433, + 68381, + 68390, + 68384, + 68414, + 68426, + 68405, + 68378, + 68418, + 68419, + 68461, + 68456, + 68405, + 68421, + 68371, + 68375, + 68401, + 68389, + 68379, + 68417, + 68351, + 68413, + 68386, + 68399, + 68383, + 68381, + 68415, + 68406, + 68434, + 68409, + 68391, + 68430, + 68462, + 68403, + 68430, + 68388, + 68440, + 68418, + 68408, + 68406, + 68385, + 68394, + 68377, + 68407, + 68398, + 68388, + 68422, + 68414, + 68393, + 68404, + 68388, + 68375, + 68423, + 68409, + 68402, + 68384, + 68399, + 68409, + 68405, + 68398, + 68373, + 68368, + 68371, + 68390, + 68391, + 68382, + 68406, + 68399, + 68356, + 68377, + 68382, + 68392, + 68403, + 68417, + 68381, + 68399, + 68380, + 68401, + 68407, + 68396, + 68367, + 68396, + 68396, + 68407, + 68376, + 68391, + 68383, + 68380, + 68387, + 68415, + 68385, + 68374, + 68372, + 68412, + 68382, + 68473, + 68427, + 68396, + 68363, + 68409, + 68377, + 68402, + 68416, + 68421, + 68387, + 68466, + 68430, + 68427, + 68392, + 68407, + 68388, + 68376, + 68382, + 68399, + 68392, + 68384, + 68376, + 68396, + 68407, + 68395, + 68416, + 68407, + 68388, + 68380, + 68410, + 68415, + 68416, + 68405, + 68381, + 68380, + 68395, + 68453, + 68397, + 68424, + 68398, + 68373, + 68397, + 68382, + 68382, + 68404, + 68379, + 68406, + 68418, + 68383, + 68376, + 68370, + 68363, + 68447, + 68398, + 68401, + 68460, + 68405, + 68407, + 68450, + 68410, + 68386, + 68394, + 68412, + 68392, + 68373, + 68382, + 68382, + 68414, + 68416, + 68373, + 68388, + 68411, + 68425, + 68407, + 68457, + 68397, + 68387, + 68383, + 68407, + 68442, + 68456, + 68434, + 68412, + 68379, + 68405, + 68422, + 68423, + 68405, + 68409, + 68415, + 68362, + 68392, + 68430, + 68395, + 68410, + 68416, + 68430, + 68391, + 68426, + 68415, + 68389, + 68422, + 68416, + 68387, + 68386, + 68409, + 68395, + 68416, + 68405, + 68432, + 68420, + 68392, + 68372, + 68401, + 68431, + 68389, + 68394, + 68402, + 68364, + 68421, + 68385, + 68387, + 68397, + 68404, + 68419, + 68402, + 68394, + 68418, + 68394, + 68370, + 68382, + 68391, + 68425, + 68371, + 68408, + 68418, + 68424, + 68416, + 68424, + 68423, + 68408, + 68387, + 68395, + 68406, + 68397, + 68370, + 68370, + 68374, + 68375, + 68386, + 68424, + 68423, + 68414, + 68419, + 68407, + 68432, + 68443, + 68403, + 68413, + 68413, + 68429, + 68396, + 68406, + 68401, + 68432, + 68372, + 68411, + 68429, + 68393, + 68412, + 68427, + 68388, + 68395, + 68395, + 68368, + 68369, + 68421, + 68382, + 68395, + 68395, + 68400, + 68409, + 68394, + 68368, + 68388, + 68440, + 68427, + 68395, + 68376, + 68485, + 68415, + 68461, + 68405, + 68417, + 68422, + 68378, + 68367, + 68416, + 68363, + 68411, + 68373, + 68400, + 68411, + 68391, + 68392, + 68440, + 68373, + 68367, + 68411, + 68389, + 68425, + 68403, + 68425, + 68420, + 68395, + 68420, + 68402, + 68423, + 68446, + 68373, + 68397, + 68396, + 68375, + 68371, + 68392, + 68382, + 68373, + 68403, + 68397, + 68383, + 68427, + 68377, + 68418, + 68371, + 68396, + 68388, + 68433, + 68388, + 68413, + 68406, + 68433, + 68429, + 68372, + 68399, + 68379, + 68384, + 68400, + 68398, + 68424, + 68409, + 68367, + 68413, + 68422, + 68464, + 68395, + 68394, + 68434, + 68406, + 68380, + 68388, + 68395, + 68434, + 68421, + 68398, + 68426, + 68380, + 68411, + 68374, + 68418, + 68408, + 68406, + 68391, + 68379, + 68418, + 68429, + 68449, + 68417, + 68403, + 68421, + 68400, + 68375, + 68424, + 68416, + 68404, + 68438, + 68372, + 68427, + 68422, + 68379, + 68412, + 68407, + 68392, + 68395, + 68408, + 68424, + 68406, + 68408, + 68383, + 68393, + 68398, + 68412, + 68385, + 68363, + 68376, + 68373, + 68365, + 68396, + 68394, + 68416, + 68377, + 68396, + 68411, + 68396, + 68380, + 68417, + 68371, + 68406, + 68370, + 68424, + 68433, + 68409, + 68437, + 68387, + 68426, + 68463, + 68391, + 68408, + 68380, + 68419, + 68379, + 68407, + 68379, + 68434, + 68384, + 68411, + 68386, + 68380, + 68426, + 68403, + 68370, + 68379, + 68394, + 68409, + 68416, + 68398, + 68405, + 68440, + 68423, + 68399, + 68395, + 68369, + 68364, + 68375, + 68396, + 68407, + 68383, + 68389, + 68373, + 68405, + 68389, + 68388, + 68413, + 68424, + 68393, + 68376, + 68380, + 68407, + 68401, + 68408, + 68402, + 68396, + 68399, + 68430, + 68409, + 68430, + 68396, + 68406, + 68442, + 68390, + 68392, + 68396, + 68373, + 68396, + 68382, + 68392, + 68432, + 68427, + 68392, + 68393, + 68392, + 68410, + 68415, + 68396, + 68403, + 68390, + 68417, + 68448, + 68417, + 68397, + 68397, + 68402, + 68387, + 68405, + 68393, + 68398, + 68374, + 68381, + 68413, + 68382, + 68399, + 68426, + 68376, + 68355, + 68381, + 68402, + 68422, + 68422, + 68382, + 68404, + 68412, + 68374, + 68399, + 68388, + 68395, + 68433, + 68384, + 68396, + 68413, + 68403, + 68394, + 68396, + 68411, + 68369, + 68390, + 68420, + 68405, + 68395, + 68388, + 68417, + 68421, + 68402, + 68488, + 68388, + 68393, + 68420, + 68394, + 68420, + 68378, + 68419, + 68396, + 68431, + 68413, + 68453, + 68416, + 68391, + 68418, + 68424, + 68414, + 68389, + 68374, + 68399, + 68383, + 68417, + 68423, + 68399, + 68373, + 68418, + 68376, + 68390, + 68409, + 68401, + 68382, + 68412, + 68365, + 68378, + 68378, + 68398, + 68406, + 68391, + 68378, + 68435, + 68380, + 68394, + 68410, + 68389, + 68432, + 68411, + 68404, + 68403, + 68409, + 68412, + 68393, + 68389, + 68435, + 68408, + 68436, + 68443, + 68409, + 68401, + 68398, + 68416, + 68361, + 68409, + 68396, + 68414, + 68410, + 68399, + 68375, + 68405, + 68422, + 68453, + 68401, + 68399, + 68380, + 68421, + 68410, + 68426, + 68416, + 68404, + 68372, + 68405, + 68386, + 68425, + 68412, + 68403, + 68403, + 68390, + 68412, + 68409, + 68405, + 68375, + 68388, + 68391, + 68398, + 68415, + 68414, + 68385, + 68424, + 68417, + 68400, + 68401, + 68433, + 68430, + 68387, + 68417, + 68384, + 68386, + 68420, + 68396, + 68377, + 68421, + 68400, + 68405, + 68412, + 68377, + 68405, + 68416, + 68370, + 68364, + 68450, + 68401, + 68369, + 68393, + 68407, + 68441, + 68392, + 68413, + 68365, + 68422, + 68412, + 68419, + 68390, + 68380, + 68406, + 68390, + 68397, + 68421, + 68424, + 68376, + 68411, + 68369, + 68416, + 68818, + 68455, + 68406, + 68390, + 68433, + 68367, + 68408, + 68419, + 68404, + 68373, + 68395, + 68394, + 68400, + 68391, + 68420, + 68404, + 68431, + 68380, + 68415, + 68403, + 68389, + 68394, + 68423, + 68376, + 68394, + 68366, + 68453, + 68413, + 68460, + 68377, + 68439, + 68402, + 68400, + 68361, + 68404, + 68371, + 68411, + 68405, + 68394, + 68381, + 68407, + 68388, + 68412, + 68376, + 68393, + 68403, + 68412, + 68407, + 68458, + 68386, + 68408, + 68370, + 68440, + 68429, + 68402, + 68380, + 68404, + 68401, + 68399, + 68404, + 68403, + 68414, + 68423, + 68409, + 68411, + 68387, + 68431, + 68436, + 68424, + 68378, + 68461, + 68388, + 68384, + 68449, + 68413, + 68399, + 68413, + 68395, + 68394, + 68408, + 68382, + 68389, + 68388, + 68437, + 68422, + 68398, + 68403, + 68361, + 68393, + 68428, + 68403, + 68426, + 68422, + 68401, + 68384, + 68394, + 68381, + 68405, + 68397, + 68388, + 68421, + 68368, + 68399, + 68451, + 68410, + 68398, + 68396, + 68425, + 68365, + 68430, + 68414, + 68397, + 68413, + 68395, + 68445, + 68433, + 68392, + 68385, + 68381, + 68402, + 68389, + 68407, + 68364, + 68396, + 68410, + 68395, + 68405, + 68410, + 68397, + 68380, + 68415, + 68394, + 68383, + 68413, + 68400, + 68365, + 68382, + 68595, + 68393, + 68440, + 68409, + 68394, + 68384, + 68386, + 68382, + 68413, + 68432, + 68401, + 68374, + 68375, + 68411, + 68433, + 68379, + 68394, + 68418, + 68424, + 68415, + 68459, + 68367, + 68395, + 68399, + 68399, + 68390, + 68418, + 68445, + 68384, + 68376, + 68405, + 68370, + 68393, + 68456, + 68444, + 68465, + 68399, + 68438, + 68404, + 68418, + 68408, + 68374, + 68382, + 68418, + 68423, + 68441, + 68396, + 68428, + 68379, + 68422, + 68404, + 68424, + 68419, + 68428, + 68383, + 68386, + 68365, + 68417, + 68375, + 68388, + 68450, + 68421, + 68431, + 68430, + 68398, + 68439, + 68390, + 68384, + 68393, + 68391, + 68386, + 68438, + 68436, + 68413, + 68422, + 68414, + 68368, + 68405, + 68378, + 68415, + 68395, + 68421, + 68460, + 68420, + 68433, + 68464, + 68434, + 68410, + 68382, + 68384, + 68372, + 68404, + 68435, + 68378, + 68370, + 68403, + 68409, + 68420, + 68419, + 68377, + 68432, + 68410, + 68360, + 68403, + 68419, + 68395, + 68372, + 68415, + 68394, + 68406, + 68432, + 68440, + 68380, + 68381, + 68458, + 68421, + 68394, + 68383, + 68393, + 68406, + 68392, + 68408, + 68385, + 68433, + 68389, + 68387, + 68410, + 68426, + 68410, + 68381, + 68393, + 68371, + 68414, + 68378, + 68402, + 68363, + 68356, + 68402, + 68391, + 68387, + 68411, + 68406, + 68361, + 68402, + 68369, + 68417, + 68385, + 68362, + 68432, + 68357, + 68357, + 68411, + 68403, + 68392, + 68431, + 68435, + 68426, + 68408, + 68478, + 68433, + 68460, + 68400, + 68405, + 68412, + 68416, + 68404, + 68398, + 68367, + 68371, + 68411, + 68412, + 68417, + 68370, + 68378, + 68378, + 68480, + 68425, + 68422, + 68404, + 68400, + 68428, + 68402, + 68427, + 68385, + 68362, + 68426, + 68404, + 68389, + 68372, + 68419, + 68392, + 68404, + 68401, + 68431, + 68417, + 68403, + 68417, + 68399, + 68402, + 68398, + 68385, + 68377, + 68384, + 68397, + 68405, + 68415, + 68422, + 68418, + 68351, + 68411, + 68409, + 68385, + 68405, + 68397, + 68355, + 68432, + 68418, + 68424, + 68386, + 68423, + 68376, + 68466, + 68413, + 68420, + 68414, + 68412, + 68357, + 68398, + 68433, + 68435, + 68426, + 68400, + 68415, + 68407, + 68453, + 68410, + 68394, + 68421, + 68363, + 68408, + 68392, + 68423, + 68382, + 68384, + 68398, + 68388, + 68418, + 68373, + 68376, + 68389, + 68416, + 68422, + 68403, + 68433, + 68426, + 68413, + 68387, + 68396, + 68369, + 68385, + 68387, + 68381, + 68356, + 68438, + 68427, + 68428, + 68429, + 68435, + 68408, + 68395, + 68398, + 68399, + 68401, + 68404, + 68370, + 68417, + 68361, + 68379, + 68427, + 68406, + 68394, + 68411, + 68415, + 68374, + 68399, + 68415, + 68363, + 68386, + 68411, + 68416, + 68415, + 68423, + 68346, + 68408, + 68425, + 68408, + 68420, + 68416, + 68412, + 68403, + 68368, + 68409, + 68372, + 68407, + 68403, + 68398, + 68417, + 68430, + 68388, + 68388, + 68388, + 68401, + 68363, + 68406, + 68386, + 68412, + 68370, + 68420, + 68389, + 68403, + 68393, + 68423, + 68372, + 68388, + 68370, + 68405, + 68394, + 68404, + 68405, + 68404, + 68379, + 68408, + 68376, + 68384, + 68394, + 68397, + 68397, + 68416, + 68399, + 68398, + 68443, + 68380, + 68418, + 68425, + 68398, + 68411, + 68427, + 68402, + 68398, + 68381, + 68400, + 68412, + 68361, + 68423, + 68409, + 68399, + 68399, + 68404, + 68353, + 68406, + 68446, + 68389, + 68415, + 68392, + 68386, + 68390, + 68366, + 68387, + 68394, + 68398, + 68400, + 68425, + 68391, + 68383, + 68386, + 68409, + 68387, + 68383, + 68374, + 68404, + 68361, + 68415, + 68357, + 68398, + 68418, + 68406, + 68391, + 68418, + 68370, + 68403, + 68380, + 68424, + 68474, + 68362, + 68414, + 68385, + 68358, + 68376, + 68419, + 68406, + 68391, + 68400, + 68402, + 68387, + 68384, + 68394, + 68372, + 68416, + 68404, + 68394, + 68422, + 68395, + 68384, + 68384, + 68413, + 68378, + 68389, + 68405, + 68381, + 68430, + 68395, + 68420, + 68388, + 68376, + 68421, + 68421, + 68393, + 68422, + 68449, + 68391, + 68391, + 68399, + 68394, + 68401, + 68403, + 68407, + 68396, + 68408, + 68427, + 68401, + 68412, + 68403, + 68402, + 68438, + 68405, + 68358, + 68413, + 68378, + 68376, + 68410, + 68393, + 68380, + 68414, + 68452, + 68384, + 68399, + 68401, + 68434, + 68403, + 68412, + 68416, + 68396, + 68399, + 68438, + 68400, + 68433, + 68383, + 68419, + 68403, + 68428, + 68428, + 68380, + 68415, + 68464, + 68402, + 68426, + 68399, + 68424, + 68381, + 68411, + 68464, + 68376, + 68409, + 68379, + 68376, + 68430, + 68407, + 68383, + 68420, + 68391, + 68380, + 68399, + 68399, + 68400, + 68364, + 68411, + 68387, + 68412, + 68399, + 68423, + 68441, + 68439, + 68464, + 68414, + 68427, + 68432, + 68438, + 68406, + 68371, + 68397, + 68372, + 68400, + 68376, + 68404, + 68391, + 68443, + 68404, + 68387, + 68439, + 68592, + 68381, + 68398, + 68402, + 68394, + 68413, + 68413, + 68395, + 68393, + 68396, + 68395, + 68395, + 68377, + 68401, + 68362, + 68400, + 68388, + 68406, + 68427, + 68380, + 68413, + 68382, + 68421, + 68409, + 68394, + 68425, + 68378, + 68397, + 68389, + 68403, + 68402, + 68404, + 68366, + 68423, + 68429, + 68435, + 68391, + 68431, + 68382, + 68376, + 68431, + 68387, + 68438, + 68376, + 68351, + 68398, + 68362, + 68406, + 68409, + 68378, + 68387, + 68426, + 68404, + 68402, + 68407, + 68405, + 68422, + 68403, + 68384, + 68424, + 68466, + 68428, + 68427, + 68382, + 68399, + 68368, + 68381, + 68411, + 68426, + 68394, + 68399, + 68413, + 68416, + 68409, + 68397, + 68396, + 68421, + 68388, + 68424, + 68378, + 68378, + 68419, + 68368, + 68412, + 68396, + 68399, + 68410, + 68392, + 68399, + 68402, + 68381, + 68410, + 68401, + 68412, + 68419, + 68407, + 68387, + 68376, + 68410, + 68431, + 68444, + 68425, + 68417, + 68396, + 68399, + 68432, + 68383, + 68395, + 68408, + 68414, + 68365, + 68402, + 68405, + 68448, + 68429, + 68381, + 68389, + 68419, + 68382, + 68405, + 68402, + 68373, + 68421, + 68449, + 68455, + 68435, + 68414, + 68398, + 68416, + 68410, + 68410, + 68372, + 68436, + 68402, + 68435, + 68392, + 68393, + 68418, + 68373, + 68407, + 68407, + 68393, + 68424, + 68401, + 68376, + 68393, + 68369, + 68405, + 68382, + 68422, + 68426, + 68366, + 68412, + 68413, + 68435, + 68424, + 68398, + 68447, + 68394, + 68417, + 68424, + 68432, + 68409, + 68379, + 68374, + 68396, + 68449, + 68445, + 68409, + 68403, + 68379, + 68401, + 68378, + 68430, + 68397, + 68382, + 68412, + 68392, + 68391, + 68393, + 68407, + 68387, + 68398, + 68405, + 68380, + 68400, + 68378, + 68380, + 68419, + 68390, + 68381, + 68408, + 68428, + 68359, + 68405, + 68423, + 68411, + 68415, + 68418, + 68399, + 68383, + 68432, + 68413, + 68411, + 68405, + 68367, + 68414, + 68439, + 68363, + 68400, + 68696, + 68411, + 68394, + 68402, + 68452, + 68447, + 68390, + 68365, + 68400, + 68385, + 68445, + 68386, + 68392, + 68398, + 68381, + 68387, + 68443, + 68402, + 68400, + 68387, + 68371, + 68430, + 68409, + 68383, + 68406, + 68379, + 68431, + 68416, + 68414, + 68418, + 68459, + 68406, + 68371, + 68414, + 68396, + 68421, + 68398, + 68400, + 68447, + 68409, + 68427, + 68408, + 68422, + 68403, + 68410, + 68413, + 68408, + 68433, + 68448, + 68396, + 68401, + 68388, + 68402, + 68469, + 68435, + 68380, + 68418, + 68398, + 68434, + 68380, + 68398, + 68416, + 68426, + 68396, + 68435, + 68366, + 68408, + 68408, + 68436, + 68397, + 68416, + 68391, + 68425, + 68378, + 68398, + 68426, + 68404, + 68408, + 68417, + 68388, + 68404, + 68383, + 68370, + 68430, + 68395, + 68415, + 68374, + 68365, + 68385, + 68411, + 68383, + 68421, + 68412, + 68439, + 68416, + 68388, + 68379, + 68392, + 68383, + 68432, + 68414, + 68369, + 68404, + 68389, + 68409, + 68416, + 68438, + 68386, + 68403, + 68391, + 68428, + 68391, + 68379, + 68437, + 68467, + 68384, + 68393, + 68451, + 68401, + 68421, + 68406, + 68360, + 68416, + 68411, + 68380, + 68444, + 68452, + 68399, + 68411, + 68419, + 68406, + 68392, + 68393, + 68368, + 68369, + 68374, + 68370, + 68393, + 68414, + 68367, + 68391, + 68434, + 68384, + 68435, + 68436, + 68381, + 68415, + 68406, + 68393, + 68395, + 68417, + 68382, + 68399, + 68395, + 68437, + 68390, + 68408, + 68417, + 68420, + 68413, + 68393, + 68452, + 68420, + 68404, + 68384, + 68436, + 68397, + 68386, + 68409, + 68406, + 68384, + 68402, + 68400, + 68421, + 68436, + 68400, + 68422, + 68401, + 68374, + 68386, + 68404, + 68371, + 68422, + 68414, + 68375, + 68387, + 68412, + 68426, + 68379, + 68406, + 68458, + 68409, + 68409, + 68369, + 68383, + 68401, + 68386, + 68388, + 68422, + 68407, + 68397, + 68398, + 68389, + 68406, + 68459, + 68430, + 68385, + 68404, + 68389, + 68414, + 68413, + 68384, + 68387, + 68403, + 68385, + 68375, + 68396, + 68429, + 68381, + 68390, + 68438, + 68412, + 68364, + 68383, + 68392, + 68374, + 68398, + 68420, + 68405, + 68382, + 68413, + 68414, + 68438, + 68420, + 68404, + 68382, + 68372, + 68396, + 68412, + 68390, + 68403, + 68375, + 68428, + 68373, + 68394, + 68384, + 68386, + 68402, + 68402, + 68390, + 68433, + 68365, + 68429, + 68380, + 68428, + 68395, + 68430, + 68401, + 68395, + 68404, + 68398, + 68420, + 68432, + 68419, + 68404, + 68387, + 68376, + 68499, + 68415, + 68421, + 68447, + 68379, + 68394, + 68373, + 68412, + 68401, + 68439, + 68376, + 68390, + 68408, + 68385, + 68405, + 68413, + 68423, + 68418, + 68435, + 68382, + 68380, + 68431, + 68381, + 68411, + 68386, + 68434, + 68423, + 68410, + 68440, + 68391, + 68388, + 68402, + 68420, + 68425, + 68379, + 68388, + 68376, + 68425, + 68401, + 68400, + 68378, + 68375, + 68398, + 68431, + 68388, + 68442, + 68363, + 68398, + 68410, + 68427, + 68419, + 68411, + 68406, + 68384, + 68379, + 68424, + 68394, + 68401, + 68376, + 68427, + 68373, + 68428, + 68428, + 68416, + 68395, + 68419, + 68405, + 68427, + 68384, + 68416, + 68372, + 68395, + 68400, + 68427, + 68486, + 68389, + 68360, + 68445, + 68399, + 68423, + 68441, + 68408, + 68388, + 68379, + 68408, + 68397, + 68416, + 68406, + 68374, + 68400, + 68402, + 68421, + 68422, + 68399, + 68363, + 68387, + 68397, + 68413, + 68409, + 68399, + 68399, + 68388, + 68449, + 68433, + 68392, + 68412, + 68405, + 68394, + 68405, + 68418, + 68383, + 68389, + 68424, + 68392, + 68398, + 68414, + 68416, + 68462, + 68412, + 68390, + 68384, + 68375, + 68426, + 68419, + 68374, + 68375, + 68399, + 68415, + 68387, + 68400, + 68379, + 68410, + 68557, + 68408, + 68421, + 68390, + 68374, + 68402, + 68379, + 68390, + 68408, + 68415, + 68345, + 68413, + 68434, + 68388, + 68418, + 68384, + 68400, + 68402, + 68380, + 68446, + 68358, + 68393, + 68382, + 68416, + 68388, + 68380, + 68410, + 68387, + 68385, + 68438, + 68434, + 68383, + 68413, + 68418, + 68380, + 68427, + 68399, + 68445, + 68404, + 68419, + 68377, + 68402, + 68394, + 68397, + 68426, + 68413, + 68391, + 68429, + 68388, + 68388, + 68410, + 68409, + 68393, + 68445, + 68375, + 68439, + 68423, + 68372, + 68413, + 68409, + 68420, + 68401, + 68395, + 68449, + 68424, + 68405, + 68388, + 68410, + 68427, + 68424, + 68375, + 68419, + 68419, + 68384, + 68435, + 68412, + 68411, + 68389, + 68416, + 68397, + 68408, + 68409, + 68414, + 68426, + 68406, + 68423, + 68413, + 68398, + 68448, + 68407, + 68383, + 68395, + 68400, + 68384, + 68454, + 68411, + 68400, + 68409, + 68399, + 68452, + 68378, + 68408, + 68391, + 68403, + 68378, + 68399, + 68387, + 68381, + 68406, + 68440, + 68371, + 68408, + 68437, + 68391, + 68415, + 68413, + 68405, + 68417, + 68368, + 68381, + 68376, + 68454, + 68372, + 68436, + 68387, + 68386, + 68417, + 68411, + 68441, + 68404, + 68410, + 68442, + 68403, + 68429, + 68387, + 68406, + 68399, + 68435, + 68398, + 68370, + 68390, + 68418, + 68377, + 68432, + 68411, + 68394, + 68407, + 68415, + 68377, + 68374, + 68371, + 68403, + 68407, + 68419, + 68399, + 68442, + 68418, + 68406, + 68402, + 68406, + 68389, + 68399, + 68389, + 68389, + 68378, + 68407, + 68393, + 68382, + 68461, + 68371, + 68440, + 68409, + 68441, + 68382, + 68420, + 68439, + 68396, + 68405, + 68393, + 68396, + 68405, + 68414, + 68387, + 68384, + 68396, + 68415, + 68408, + 68400, + 68377, + 68399, + 68374, + 68392, + 68385, + 68444, + 68380, + 68446, + 68366, + 68453, + 68401, + 68416, + 68413, + 68414, + 68396, + 68427, + 68403, + 68375, + 68408, + 68387, + 68394, + 68388, + 68382, + 68433, + 68401, + 68433, + 68389, + 68408, + 68421, + 68404, + 68410, + 68387, + 68381, + 68406, + 68396, + 68437, + 68419, + 68389, + 68387, + 68391, + 68401, + 68446, + 68409, + 68444, + 68450, + 68392, + 68351, + 68413, + 68377, + 68392, + 68432, + 68412, + 68371, + 68412, + 68418, + 68452, + 68377, + 68444, + 68373, + 68391, + 68386, + 68445, + 68389, + 68381, + 68396, + 68371, + 68397, + 68396, + 68403, + 68384, + 68377, + 68386, + 68406, + 68404, + 68376, + 68379, + 68415, + 68424, + 68413, + 68387, + 68454, + 68381, + 68378, + 68402, + 68431, + 68387, + 68389, + 68393, + 68443, + 68415, + 68381, + 68426, + 68359, + 68407, + 68400, + 68397, + 68414, + 68359, + 68374, + 68357, + 68382, + 68398, + 68427, + 68380, + 68375, + 68472, + 68437, + 68399, + 68420, + 68409, + 68408, + 68402, + 68429, + 68417, + 68420, + 68367, + 68399, + 68410, + 68419, + 68395, + 68385, + 68791, + 68409, + 68417, + 68413, + 68406, + 68404, + 68396, + 68395, + 68357, + 68392, + 68412, + 68391, + 68442, + 68390, + 68413, + 68377, + 68378, + 68397, + 68400, + 68395, + 68395, + 68365, + 68396, + 68373, + 68402, + 68375, + 68413, + 68399, + 68432, + 68431, + 68386, + 68395, + 68393, + 68436, + 68435, + 68385, + 68412, + 68381, + 68363, + 68429, + 68427, + 68427, + 68388, + 68391, + 68383, + 68438, + 68465, + 68392, + 68359, + 68395, + 68426, + 68433, + 68389, + 68402, + 68376, + 68374, + 68416, + 68415, + 68413, + 68419, + 68422, + 68401, + 68383, + 68407, + 68373, + 68390, + 68410, + 68404, + 68394, + 68384, + 68425, + 68411, + 68448, + 68374, + 68394, + 68415, + 68394, + 68442, + 68391, + 68361, + 68379, + 68382, + 68412, + 68433, + 68358, + 68392, + 68407, + 68427, + 68416, + 68440, + 68407, + 68383, + 68364, + 68397, + 68408, + 68389, + 68365, + 68394, + 68393, + 68377, + 68444, + 68427, + 68402, + 68414, + 68427, + 68398, + 68420, + 68411, + 68390, + 68409, + 68401, + 68433, + 68440, + 68413, + 68391, + 68359, + 68416, + 68387, + 68390, + 68395, + 68418, + 68371, + 68422, + 68416, + 68382, + 68389, + 68432, + 68419, + 68419, + 68398, + 68395, + 68421, + 68381, + 68401, + 68403, + 68384, + 68438, + 68404, + 68426, + 68394, + 68385, + 68411, + 68432, + 68403, + 68445, + 68378, + 68398, + 68420, + 68387, + 68384, + 68371, + 68378, + 68378, + 68412, + 68439, + 68398, + 68349, + 68366, + 68405, + 68414, + 68414, + 68421, + 68393, + 68403, + 68412, + 68385, + 68414, + 68415, + 68383, + 68382, + 68405, + 68425, + 68413, + 68390, + 68424, + 68433, + 68413, + 68393, + 68442, + 68380, + 68408, + 68400, + 68395, + 68460, + 68409, + 68426, + 68389, + 68380, + 68397, + 68438, + 68397, + 68433, + 68442, + 68398, + 68435, + 68432, + 68384, + 68408, + 68402, + 68426, + 68378, + 68404, + 68385, + 68423, + 68442, + 68384, + 68376, + 68376, + 68409, + 68409, + 68388, + 68412, + 68381, + 68358, + 68385, + 68408, + 68388, + 68393, + 68411, + 68432, + 68416, + 68387, + 68495, + 68391, + 68406, + 68415, + 68406, + 68417, + 68430, + 68402, + 68425, + 68416, + 68388, + 68417, + 68415, + 68391, + 68413, + 68371, + 68386, + 68384, + 68416, + 68401, + 68383, + 68472, + 68368, + 68421, + 68414, + 68383, + 68417, + 68416, + 68407, + 68428, + 68453, + 68418, + 68429, + 68425, + 68419, + 68404, + 68418, + 68407, + 68444, + 68433, + 68414, + 68422, + 68443, + 68398, + 68363, + 68387, + 68420, + 68416, + 68407, + 68404, + 68382, + 68382, + 68414, + 68378, + 68400, + 68363, + 68385, + 68415, + 68401, + 68394, + 68394, + 68440, + 68412, + 68407, + 68424, + 68403, + 68389, + 68367, + 68415, + 68399, + 68389, + 68388, + 68404, + 68364, + 68418, + 68415, + 68405, + 68440, + 68388, + 68392, + 68417, + 68383, + 68387, + 68383, + 68427, + 68406, + 68426, + 68398, + 68443, + 68404, + 68419, + 68390, + 68421, + 68399, + 68401, + 68439, + 68430, + 68396, + 68429, + 68377, + 68407, + 68388, + 68413, + 68421, + 68395, + 68404, + 68418, + 68418, + 68395, + 68381, + 68416, + 68428, + 68405, + 68447, + 68440, + 68423, + 68386, + 68429, + 68427, + 68434, + 68430, + 68419, + 68390, + 68413, + 68418, + 68411, + 68420, + 68401, + 68394, + 68398, + 68409, + 68387, + 68431, + 68422, + 68407, + 68395, + 68438, + 68397, + 68378, + 68375, + 68405, + 68420, + 68408, + 68376, + 68414, + 68366, + 68364, + 68413, + 68411, + 68395, + 68457, + 68383, + 68410, + 68410, + 68414, + 68386, + 68426, + 68410, + 68412, + 68432, + 68400, + 68446, + 68387, + 68377, + 68411, + 68395, + 68405, + 68392, + 68385, + 68382, + 68408, + 68387, + 68391, + 68377, + 68419, + 68440, + 68420, + 68394, + 68402, + 68392, + 68384, + 68377, + 68382, + 68367, + 68407, + 68375, + 68414, + 68383, + 68402, + 68414, + 68413, + 68409, + 68395, + 68393, + 68386, + 68402, + 68423, + 68414, + 68434, + 68403, + 68423, + 68415, + 68430, + 68391, + 68395, + 68390, + 68392, + 68398, + 68399, + 68450, + 68447, + 68393, + 68397, + 68420, + 68388, + 68401, + 68389, + 68371, + 68397, + 68433, + 68413, + 68416, + 68436, + 68371, + 68420, + 68406, + 68438, + 68427, + 68394, + 68378, + 68455, + 68378, + 68442, + 68427, + 68396, + 68375, + 68403, + 68419, + 68400, + 68377, + 68419, + 68392, + 68436, + 68444, + 68381, + 68412, + 68368, + 68390, + 68395, + 68430, + 68400, + 68391, + 68394, + 68361, + 68366, + 68426, + 68411, + 68416, + 68404, + 68419, + 68426, + 68399, + 68375, + 68388, + 68438, + 68395, + 68424, + 68411, + 68421, + 68376, + 68385, + 68385, + 68403, + 68420, + 68417, + 68405, + 68404, + 68380, + 68367, + 68435, + 68416, + 68411, + 68381, + 68392, + 68414, + 68416, + 68386, + 68433, + 68438, + 68417, + 68408, + 68335, + 68430, + 68406, + 68434, + 68368, + 68391, + 68409, + 68393, + 68398, + 68428, + 68410, + 68424, + 68402, + 68405, + 68394, + 68428, + 68376, + 68391, + 68420, + 68474, + 68381, + 68426, + 68389, + 68390, + 68422, + 68435, + 68410, + 68424, + 68382, + 68412, + 68450, + 68449, + 68366, + 68370, + 68376, + 68390, + 68407, + 68414, + 68419, + 68405, + 68411, + 68395, + 68436, + 68396, + 68393, + 68399, + 68380, + 68424, + 68559, + 68417, + 68397, + 68411, + 68410, + 68420, + 68431, + 68430, + 68394, + 68377, + 68379, + 68379, + 68448, + 68397, + 68391, + 68422, + 68386, + 68435, + 68401, + 68414, + 68430, + 68493, + 68431, + 68392, + 68420, + 68373, + 68450, + 68414, + 68390, + 68422, + 68434, + 68417, + 68390, + 68455, + 68381, + 68379, + 68417, + 68441, + 68412, + 68409, + 68378, + 68403, + 68411, + 68403, + 68420, + 68410, + 68461, + 68384, + 68402, + 68430, + 68429, + 68420, + 68378, + 68455, + 68401, + 68415, + 68407, + 68399, + 68387, + 68422, + 68372, + 68418, + 68410, + 68397, + 68384, + 68458, + 68402, + 68417, + 68372, + 68418, + 68375, + 68422, + 68402, + 68378, + 68421, + 68494, + 68394, + 68395, + 68376, + 68399, + 68413, + 68432, + 68378, + 68407, + 68418, + 68405, + 68397, + 68424, + 68384, + 68406, + 68401, + 68393, + 68398, + 68425, + 68393, + 68409, + 68445, + 68399, + 68380, + 68413, + 68376, + 68391, + 68399, + 68399, + 68410, + 68396, + 68372, + 68376, + 68393, + 68429, + 68399, + 68392, + 68417, + 68432, + 68390, + 68401, + 68418, + 68451, + 68371, + 68379, + 68401, + 68402, + 68404, + 68419, + 68398, + 68412, + 68392, + 68385, + 68397, + 68393, + 68403, + 68417, + 68374, + 68426, + 68382, + 68430, + 68418, + 68408, + 68395, + 68388, + 68391, + 68415, + 68398, + 68421, + 68411, + 68401, + 68429, + 68438, + 68388, + 68408, + 68379, + 68398, + 68387, + 68464, + 68405, + 68402, + 68386, + 68396, + 68402, + 68393, + 68393, + 68406, + 68407, + 68405, + 68414, + 68405, + 68406, + 68377, + 68413, + 68412, + 68436, + 68400, + 68386, + 68424, + 68410, + 68422, + 68407, + 68418, + 68408, + 68413, + 68429, + 68402, + 68407, + 68378, + 68393, + 68378, + 68374, + 68378, + 68413, + 68408, + 68383, + 68388, + 68404, + 68400, + 68398, + 68419, + 68427, + 68375, + 68422, + 68402, + 68424, + 68409, + 68384, + 68511, + 68392, + 68410, + 68424, + 68439, + 68421, + 68430, + 68398, + 68424, + 68430, + 68398, + 68446, + 68443, + 68426, + 68445, + 68448, + 68389, + 68376, + 68393, + 68381, + 68365, + 68433, + 68445, + 68370, + 68411, + 68400, + 68434, + 68387, + 68405, + 68388, + 68431, + 68428, + 68388, + 68407, + 68398, + 68375, + 68395, + 68407, + 68396, + 68382, + 68422, + 68457, + 68437, + 68408, + 68450, + 68374, + 68414, + 68381, + 68427, + 68388, + 68417, + 68440, + 68389, + 68408, + 68425, + 68413, + 68402, + 68403, + 68417, + 68390, + 68438, + 68426, + 68458, + 68440, + 68381, + 68394, + 68433, + 68464, + 68385, + 68396, + 68394, + 68381, + 68393, + 68401, + 68394, + 68384, + 68413, + 68459, + 68397, + 68400, + 68420, + 68418, + 68394, + 68420, + 68400, + 68414, + 68403, + 68393, + 68390, + 68372, + 68407, + 68393, + 68432, + 68411, + 68420, + 68416, + 68365, + 68382, + 68366, + 68427, + 68398, + 68427, + 68440, + 68391, + 68418, + 68451, + 68409, + 68366, + 68416, + 68405, + 68411, + 68413, + 68392, + 68392, + 68375, + 68442, + 68402, + 68467, + 68394, + 68415, + 68441, + 68393, + 68439, + 68397, + 68446, + 68431, + 68401, + 68416, + 68397, + 68383, + 68380, + 68438, + 68488, + 68429, + 68396, + 68377, + 68396, + 68367, + 68402, + 68445, + 68395, + 68459, + 68374, + 68370, + 68370, + 68404, + 68387, + 68384, + 68382, + 68372, + 68403, + 68414, + 68409, + 68394, + 68396, + 68410, + 68392, + 68375, + 68377, + 68395, + 68423, + 68405, + 68395, + 68390, + 68391, + 68400, + 68411, + 68409, + 68435, + 68457, + 68438, + 68433, + 68392, + 68393, + 68395, + 68408, + 68390, + 68409, + 68392, + 68406, + 68404, + 68414, + 68400, + 68409, + 68379, + 68420, + 68373, + 68421, + 68449, + 68423, + 68405, + 68382, + 68424, + 68396, + 68406, + 68404, + 68380, + 68400, + 68409, + 68421, + 68412, + 68435, + 68419, + 68411, + 68414, + 68409, + 68407, + 68384, + 68454, + 68445, + 68414, + 68371, + 68405, + 68432, + 68412, + 68369, + 68420, + 68392, + 68416, + 68420, + 68420, + 68426, + 68397, + 68378, + 68404, + 68417, + 68401, + 68452, + 68379, + 68396, + 68418, + 68403, + 68381, + 68366, + 68408, + 68399, + 68481, + 68398, + 68395, + 68388, + 68428, + 68390, + 68435, + 68405, + 68406, + 68382, + 68394, + 68425, + 68426, + 68435, + 68444, + 68439, + 68422, + 68448, + 68425, + 68441, + 68422, + 68408, + 68415, + 68439, + 68392, + 68442, + 68398, + 68417, + 68423, + 68395, + 68436, + 68404, + 68428, + 68420, + 68405, + 68463, + 68411, + 68438, + 68441, + 68397, + 68384, + 68413, + 68423, + 68482, + 68426, + 68387, + 68405, + 68428, + 68411, + 68432, + 68394, + 68400, + 68427, + 68419, + 68405, + 68403, + 68392, + 68427, + 68388, + 68378, + 68414, + 68397, + 68408, + 68417, + 68424, + 68433, + 68411, + 68389, + 68384, + 68408, + 68383, + 68413, + 68411, + 68398, + 68385, + 68395, + 68382, + 68379, + 68425, + 68409, + 68378, + 68421, + 68395, + 68384, + 68393, + 68414, + 68407, + 68403, + 68411, + 68370, + 68414, + 68396, + 68405, + 68377, + 68407, + 68386, + 68426, + 68411, + 68403, + 68408, + 68422, + 68412, + 68399, + 68401, + 68408, + 68369, + 68408, + 68399, + 68392, + 68382, + 68389, + 68395, + 68405, + 68395, + 68413, + 68371, + 68411, + 68427, + 68423, + 68397, + 68417, + 68385, + 68404, + 68397, + 68394, + 68418, + 68379, + 68387, + 68484, + 68406, + 68404, + 68426, + 68450, + 68382, + 68421, + 68413, + 68402, + 68393, + 68414, + 68407, + 68364, + 68373, + 68412, + 68421, + 68391, + 68437, + 68399, + 68381, + 68384, + 68392, + 68408, + 68408, + 68385, + 68378, + 68417, + 68426, + 68414, + 68403, + 68411, + 68381, + 68447, + 68395, + 68408, + 68380, + 68370, + 68403, + 68403, + 68396, + 68393, + 68384, + 68419, + 68392, + 68408, + 68421, + 68398, + 68400, + 68411, + 68412, + 68395, + 68417, + 68415, + 68455, + 68396, + 68394, + 68400, + 68407, + 68414, + 68421, + 68388, + 68396, + 68420, + 68377, + 68398, + 68392, + 68421, + 68405, + 68410, + 68386, + 68421, + 68398, + 68404, + 68425, + 68392, + 68405, + 68409, + 68424, + 68390, + 68394, + 68388, + 68393, + 68440, + 68426, + 68382, + 68388, + 68381, + 68449, + 68407, + 68416, + 68444, + 68403, + 68412, + 68377, + 68405, + 68393, + 68407, + 68366, + 68421, + 68402, + 68395, + 68405, + 68399, + 68365, + 68388, + 68403, + 68414, + 68417, + 68417, + 68369, + 68392, + 68399, + 68425, + 68417, + 68405, + 68386, + 68416, + 68409, + 68409, + 68395, + 68392, + 68438, + 68394, + 68391, + 68408, + 68407, + 68426, + 68378, + 68401, + 68420, + 68407, + 68380, + 68413, + 68409, + 68431, + 68371, + 68424, + 68411, + 68403, + 68381, + 68394, + 68403, + 68407, + 68378, + 68366, + 68394, + 68374, + 68394, + 68415, + 68422, + 68412, + 68415, + 68401, + 68391, + 68404, + 68408, + 68389, + 68391, + 68392, + 68373, + 68453, + 68377, + 68397, + 68379, + 68384, + 68373, + 68419, + 68375, + 68398, + 68375, + 68433, + 68385, + 68388, + 68404, + 68377, + 68393, + 68390, + 68426, + 68381, + 68443, + 68393, + 68386, + 68393, + 68391, + 68407, + 68387, + 68445, + 68382, + 68377, + 68430, + 68430, + 68391, + 68402, + 68386, + 68376, + 68393, + 68383, + 68401, + 68422, + 68412, + 68393, + 68444, + 68431, + 68412, + 68411, + 68442, + 68413, + 68382, + 68437, + 68392, + 68397, + 68404, + 68424, + 68396, + 68406, + 68380, + 68403, + 68368, + 68435, + 68404, + 68405, + 68419, + 68434, + 68386, + 68392, + 68385, + 68397, + 68402, + 68422, + 68413, + 68392, + 68424, + 68430, + 68404, + 68380, + 68383, + 68399, + 68360, + 68431, + 68400, + 68402, + 68394, + 68398, + 68432, + 68423, + 68403, + 68420, + 68384, + 68385, + 68386, + 68408, + 68423, + 68385, + 68414, + 68408, + 68376, + 68431, + 68420, + 68408, + 68415, + 68414, + 68390, + 68432, + 68402, + 68402, + 68408, + 68416, + 68377, + 68399, + 68406, + 68399, + 68387, + 68418, + 68381, + 68387, + 68425, + 68419, + 68382, + 68400, + 68416, + 68415, + 68385, + 68385, + 68388, + 68413, + 68423, + 68424, + 68421, + 68419, + 68381, + 68390, + 68379, + 68396, + 68395, + 68382, + 68379, + 68425, + 68394, + 68407, + 68415, + 68407, + 68397, + 68411, + 68425, + 68443, + 68433, + 68416, + 68387, + 68438, + 68376, + 68407, + 68406, + 68408, + 68377, + 68423, + 68412, + 68439, + 68407, + 68397, + 68364, + 68394, + 68407, + 68370, + 68405, + 68378, + 68403, + 68384, + 68415, + 68432, + 68405, + 68402, + 68381, + 68419, + 68389, + 68396, + 68418, + 68418, + 68369, + 68439, + 68358, + 68418, + 68413, + 68420, + 68387, + 68421, + 68442, + 68394, + 68440, + 68427, + 68410, + 68400, + 68389, + 68418, + 68371, + 68406, + 68395, + 68383, + 68394, + 68410, + 68413, + 68422, + 68382, + 68383, + 68391, + 68422, + 68408, + 68422, + 68416, + 68405, + 68414, + 68412, + 68429, + 68364, + 68375, + 68431, + 68395, + 68403, + 68423, + 68444, + 68372, + 68407, + 68412, + 68444, + 68417, + 68414, + 68380, + 68398, + 68426, + 68410, + 68410, + 68413, + 68369, + 68378, + 68412, + 68416, + 68440, + 68437, + 68372, + 68424, + 68393, + 68416, + 68415, + 68392, + 68405, + 68411, + 68423, + 68411, + 68405, + 68393, + 68382, + 68436, + 68410, + 68383, + 68415, + 68425, + 68373, + 68384, + 68418, + 68403, + 68447, + 68407, + 68390, + 68408, + 68382, + 68417, + 68416, + 68407, + 68398, + 68405, + 68431, + 68435, + 68406, + 68383, + 68422, + 68428, + 68411, + 68415, + 68454, + 68394, + 68401, + 68417, + 68382, + 68456, + 68436, + 68424, + 68375, + 68418, + 68387, + 68380, + 68410, + 68377, + 68364, + 68411, + 68417, + 68439, + 68391, + 68403, + 68391, + 68411, + 68440, + 68417, + 68443, + 68394, + 68392, + 68444, + 68419, + 68422, + 68413, + 68403, + 68386, + 68403, + 68388, + 68394, + 68448, + 68411, + 68385, + 68390, + 68475, + 68432, + 68412, + 68391, + 68419, + 68420, + 68426, + 68386, + 68415, + 68383, + 68377, + 68416, + 68421, + 68413, + 68409, + 68373, + 68400, + 68399, + 68394, + 68382, + 68396, + 68424, + 68406, + 68410, + 68407, + 68396, + 68378, + 68376, + 68390, + 68414, + 68403, + 68419, + 68381, + 68395, + 68408, + 68401, + 68406, + 68429, + 68402, + 68412, + 68380, + 68413, + 68395, + 68425, + 68421, + 68405, + 68383, + 68410, + 68427, + 68383, + 68395, + 68392, + 68402, + 68475, + 68387, + 68427, + 68443, + 68409, + 68451, + 68411, + 68469, + 68467, + 68416, + 68418, + 68398, + 68421, + 68378, + 68422, + 68399, + 68409, + 68387, + 68382, + 68427, + 68398, + 68396, + 68403, + 68418, + 68444, + 68399, + 68385, + 68397, + 68397, + 68376, + 68409, + 68434, + 68380, + 68408, + 68400, + 68382, + 68422, + 68387, + 68423, + 68405, + 68428, + 68422, + 68376, + 68393, + 68432, + 68403, + 68411, + 68409, + 68401, + 68402, + 68428, + 68409, + 68432, + 68369, + 68397, + 68381, + 68405, + 68449, + 68400, + 68377, + 68410, + 68397, + 68408, + 68400, + 68452, + 68370, + 68421, + 68457, + 68415, + 68385, + 68409, + 68421, + 68434, + 68430, + 68405, + 68429, + 68428, + 68386, + 68425, + 68425, + 68402, + 68406, + 68389, + 68374, + 68392, + 68402, + 68445, + 68411, + 68404, + 68388, + 68438, + 68419, + 68461, + 68424, + 68433, + 68380, + 68382, + 68403, + 68394, + 68384, + 68392, + 68375, + 68407, + 68407, + 68388, + 68439, + 68422, + 68388, + 68389, + 68411, + 68462, + 68419, + 68412, + 68398, + 68399, + 68419, + 68401, + 68409, + 68408, + 68394, + 68380, + 68389, + 68423, + 68413, + 68398, + 68353, + 68436, + 68434, + 68395, + 68427, + 68416, + 68387, + 68443, + 68408, + 68401, + 68413, + 68450, + 68412, + 68409, + 68429, + 68440, + 68394, + 68396, + 68380, + 68378, + 68375, + 68384, + 68463, + 68411, + 68434, + 68389, + 68383, + 68433, + 68410, + 68421, + 68427, + 68423, + 68381, + 68457, + 68422, + 68415, + 68429, + 68426, + 68400, + 68398, + 68400, + 68374, + 68394, + 68367, + 68419, + 68416, + 68401, + 68426, + 68373, + 68391, + 68394, + 68436, + 68430, + 68402, + 68415, + 68403, + 68397, + 68427, + 68421, + 68381, + 68365, + 68417, + 68418, + 68408, + 68389, + 68398, + 68387, + 68409, + 68387, + 68445, + 68362, + 68371, + 68429, + 68386, + 68384, + 68764, + 68400, + 68404, + 68407, + 68416, + 68397, + 68380, + 68431, + 68376, + 68386, + 68401, + 68381, + 68399, + 68472, + 68437, + 68391, + 68392, + 68411, + 68428, + 68424, + 68441, + 68416, + 68386, + 68399, + 68467, + 68419, + 68406, + 68395, + 68377, + 68402, + 68393, + 68381, + 68424, + 68363, + 68397, + 68412, + 68426, + 68392, + 68411, + 68396, + 68373, + 68387, + 68390, + 68434, + 68472, + 68401, + 68366, + 68380, + 68419, + 68394, + 68394, + 68401, + 68427, + 68399, + 68405, + 68388, + 68419, + 68395, + 68393, + 68368, + 68425, + 68446, + 68426, + 68436, + 68378, + 68424, + 68395, + 68386, + 68404, + 68434, + 68386, + 68411, + 68408, + 68441, + 68413, + 68371, + 68386, + 68377, + 68407, + 68392, + 68396, + 68404, + 68414, + 68400, + 68414, + 68417, + 68407, + 68392, + 68388, + 68373, + 68406, + 68422, + 68372, + 68384, + 68435, + 68413, + 68398, + 68451, + 68416, + 68394, + 68435, + 68396, + 68397, + 68410, + 68424, + 68393, + 68378, + 68425, + 68403, + 68365, + 68368, + 68396, + 68439, + 68400, + 68373, + 68445, + 68360, + 68376, + 68405, + 68417, + 68398, + 68380, + 68448, + 68379, + 68370, + 68394, + 68400, + 68391, + 68397, + 68373, + 68363, + 68397, + 68391, + 68379, + 68384, + 68382, + 68428, + 68409, + 68400, + 68380, + 68406, + 68362, + 68385, + 68412, + 68395, + 68394, + 68414, + 68367, + 68405, + 68399, + 68378, + 68420, + 68438, + 68384, + 68394, + 68426, + 68433, + 68392, + 68392, + 68395, + 68397, + 68408, + 68449, + 68416, + 68410, + 68402, + 68410, + 68385, + 68428, + 68429, + 68400, + 68371, + 68408, + 68412, + 68403, + 68415, + 68409, + 68378, + 68421, + 68396, + 68412, + 68413, + 68425, + 68357, + 68412, + 68424, + 68407, + 68416, + 68391, + 68376, + 68388, + 68412, + 68399, + 68395, + 68418, + 68397, + 68406, + 68431, + 68380, + 68408, + 68392, + 68421, + 68397, + 68408, + 68397, + 68406, + 68427, + 68427, + 68407, + 68403, + 68415, + 68431, + 68420, + 68403, + 68410, + 68436, + 68471, + 68371, + 68403, + 68422, + 68430, + 68399, + 68416, + 68412, + 68403, + 68373, + 68381, + 68440, + 68416, + 68401, + 68398, + 68382, + 68409, + 68381, + 68431, + 68403, + 68418, + 68387, + 68385, + 68419, + 68396, + 68433, + 68386, + 68386, + 68411, + 68387, + 68427, + 68403, + 68420, + 68375, + 68388, + 68395, + 68388, + 68407, + 68404, + 68422, + 68393, + 68369, + 68416, + 68371, + 68428, + 68385, + 68430, + 68423, + 68467, + 68372, + 68384, + 68374, + 68453, + 68421, + 68412, + 68423, + 68437, + 68412, + 68409, + 68401, + 68411, + 68398, + 68418, + 68362, + 68415, + 68433, + 68392, + 68427, + 68404, + 68378, + 68382, + 68397, + 68415, + 68394, + 68398, + 68423, + 68415, + 68394, + 68405, + 68413, + 68400, + 68431, + 68372, + 68378, + 68388, + 68408, + 68421, + 68368, + 68422, + 68409, + 68372, + 68402, + 68410, + 68370, + 68456, + 68409, + 68419, + 68437, + 68421, + 68387, + 68387, + 68385, + 68404, + 68382, + 68396, + 68429, + 68434, + 68388, + 68414, + 68375, + 68416, + 68412, + 68396, + 68417, + 68358, + 68414, + 68388, + 68413, + 68396, + 68424, + 68389, + 68407, + 68389, + 68398, + 68402, + 68370, + 68443, + 68416, + 68388, + 68389, + 68408, + 68508, + 68427, + 68386, + 68375, + 68389, + 68410, + 68408, + 68369, + 68401, + 68433, + 68397, + 68396, + 68405, + 68436, + 68436, + 68432, + 68385, + 68396, + 68385, + 68454, + 68416, + 68419, + 68380, + 68393, + 68409, + 68388, + 68435, + 68400, + 68380, + 68409, + 68407, + 68396, + 68415, + 68403, + 68358, + 68427, + 68404, + 68433, + 68394, + 68430, + 68375, + 68414, + 68376, + 68457, + 68421, + 68407, + 68406, + 68402, + 68406, + 68394, + 68398, + 68384, + 68456, + 68388, + 68433, + 68415, + 68433, + 68391, + 68385, + 68407, + 68431, + 68465, + 68418, + 68398, + 68379, + 68397, + 68422, + 68439, + 68406, + 68384, + 68374, + 68389, + 68377, + 68418, + 68423, + 68395, + 68411, + 68452, + 68405, + 68405, + 68412, + 68385, + 68356, + 68406, + 68421, + 68383, + 68410, + 68375, + 68404, + 68397, + 68419, + 68432, + 68380, + 68398, + 68390, + 68383, + 68397, + 68410, + 68394, + 68383, + 68395, + 68391, + 68381, + 68410, + 68419, + 68407, + 68390, + 68412, + 68425, + 68374, + 68416, + 68423, + 68391, + 68420, + 68415, + 68398, + 68423, + 68436, + 68379, + 68399, + 68433, + 68401, + 68402, + 68411, + 68419, + 68397, + 68402, + 68425, + 68372, + 68397, + 68408, + 68398, + 68408, + 68389, + 68419, + 68408, + 68390, + 68366, + 68380, + 68406, + 68410, + 68406, + 68409, + 68384, + 68410, + 68396, + 68409, + 68388, + 68395, + 68378, + 68600, + 68385, + 68414, + 68394, + 68377, + 68410, + 68414, + 68390, + 68422, + 68423, + 68368, + 68415, + 68423, + 68368, + 68398, + 68419, + 68391, + 68372, + 68391, + 68408, + 68417, + 68416, + 68384, + 68371, + 68373, + 68359, + 68462, + 68446, + 68376, + 68417, + 68392, + 68390, + 68388, + 68385, + 68393, + 68389, + 68387, + 68420, + 68383, + 68408, + 68383, + 68409, + 68390, + 68459, + 68412, + 68402, + 68379, + 68383, + 68402, + 68384, + 68395, + 68426, + 68418, + 68414, + 68427, + 68388, + 68406, + 68390, + 68395, + 68401, + 68417, + 68410, + 68388, + 68392, + 68378, + 68397, + 68403, + 68376, + 68410, + 68378, + 68401, + 68394, + 68390, + 68378, + 68440, + 68373, + 68430, + 68417, + 68401, + 68416, + 68431, + 68384, + 68383, + 68389, + 68394, + 68372, + 68427, + 68465, + 68397, + 68408, + 68416, + 68447, + 68378, + 68412, + 68384, + 68442, + 68398, + 68417, + 68408, + 68398, + 68415, + 68440, + 68380, + 68438, + 68432, + 68424, + 68402, + 68429, + 68373, + 68429, + 68382, + 68387, + 68354, + 68413, + 68412, + 68431, + 68389, + 68419, + 68393, + 68416, + 68388, + 68396, + 68392, + 68415, + 68410, + 68415, + 68410, + 68406, + 68384, + 68408, + 68410, + 68401, + 68399, + 68394, + 68385, + 68376, + 68375, + 68401, + 68428, + 68376, + 68390, + 68404, + 68415, + 68430, + 68433, + 68421, + 68390, + 68409, + 68389, + 68410, + 68450, + 68366, + 68391, + 68414, + 68383, + 68444, + 68389, + 68422, + 68424, + 68438, + 68386, + 68406, + 68399, + 68373, + 68409, + 68418, + 68362, + 68377, + 68408, + 68426, + 68454, + 68380, + 68430, + 68386, + 68373, + 68407, + 68401, + 68399, + 68407, + 68409, + 68394, + 68411, + 68398, + 68396, + 68367, + 68445, + 68379, + 68413, + 68432, + 68423, + 68382, + 68375, + 68371, + 68422, + 68380, + 68366, + 68414, + 68390, + 68396, + 68429, + 68383, + 68416, + 68406, + 68386, + 68409, + 68397, + 68418, + 68428, + 68383, + 68414, + 68365, + 68414, + 68389, + 68441, + 68372, + 68405, + 68434, + 68412, + 68420, + 68415, + 68371, + 68379, + 68377, + 68406, + 68383, + 68420, + 68431, + 68382, + 68431, + 68394, + 68380, + 68397, + 68397, + 68404, + 68393, + 68411, + 68385, + 68392, + 68369, + 68396, + 68409, + 68399, + 68406, + 68392, + 68340, + 68387, + 68425, + 68426, + 68428, + 68405, + 68402, + 68413, + 68405, + 68457, + 68416, + 68372, + 68416, + 68374, + 68398, + 68395, + 68445, + 68413, + 68400, + 68404, + 68397, + 68396, + 68404, + 68413, + 68392, + 68382, + 68406, + 68404, + 68427, + 68380, + 68411, + 68475, + 68391, + 68449, + 68403, + 68385, + 68369, + 68400, + 68381, + 68395, + 68406, + 68402, + 68385, + 68419, + 68384, + 68429, + 68409, + 68413, + 68381, + 68380, + 68380, + 68404, + 68404, + 68383, + 68401, + 68463, + 68403, + 68398, + 68400, + 68417, + 68382, + 68383, + 68392, + 68371, + 68441, + 68392, + 68374, + 68405, + 68428, + 68408, + 68455, + 68387, + 68365, + 68365, + 68395, + 68416, + 68415, + 68397, + 68385, + 68429, + 68411, + 68502, + 68426, + 68426, + 68404, + 68426, + 68413, + 68404, + 68400, + 68413, + 68390, + 68409, + 68397, + 68385, + 68394, + 68406, + 68375, + 68397, + 68383, + 68453, + 68423, + 68391, + 68374, + 68399, + 68426, + 68401, + 68399, + 68380, + 68374, + 68397, + 68371, + 68392, + 68411, + 68394, + 68380, + 68416, + 68364, + 68435, + 68423, + 68428, + 68388, + 68403, + 68396, + 68418, + 68399, + 68415, + 68430, + 68390, + 68410, + 68389, + 68436, + 68418, + 68374, + 68375, + 68374, + 68439, + 68423, + 68378, + 68396, + 68408, + 68401, + 68404, + 68372, + 68393, + 68399, + 68411, + 68440, + 68385, + 68396, + 68386, + 68437, + 68406, + 68387, + 68414, + 68406, + 68409, + 68372, + 68393, + 68388, + 68392, + 68387, + 68406, + 68359, + 68393, + 68385, + 68415, + 68408, + 68403, + 68361, + 68403, + 68407, + 68386, + 68389, + 68377, + 68425, + 68417, + 68405, + 68404, + 68398, + 68411, + 68416, + 68411, + 68399, + 68402, + 68391, + 68370, + 68383, + 68444, + 68381, + 68406, + 68430, + 68459, + 68363, + 68402, + 68390, + 68419, + 68398, + 68396, + 68376, + 68433, + 68401, + 68402, + 68394, + 68394, + 68384, + 68381, + 68415, + 68413, + 68390, + 68405, + 68397, + 68383, + 68391, + 68466, + 68417, + 68432, + 68383, + 68379, + 68426, + 68431, + 68441, + 68386, + 68425, + 68387, + 68383, + 68442, + 68407, + 68380, + 68413, + 68425, + 68388, + 68467, + 68401, + 68389, + 68387, + 68404, + 68428, + 68421, + 68387, + 68379, + 68405, + 68419, + 68399, + 68425, + 68418, + 68389, + 68428, + 68406, + 68402, + 68429, + 68422, + 68408, + 68391, + 68381, + 68404, + 68377, + 68384, + 68415, + 68375, + 68403, + 68391, + 68365, + 68447, + 68398, + 68398, + 68397, + 68396, + 68378, + 68428, + 68402, + 68373, + 68400, + 68390, + 68385, + 68413, + 68393, + 68410, + 68404, + 68434, + 68432, + 68395, + 68438, + 68403, + 68392, + 68420, + 68423, + 68398, + 68393, + 68423, + 68417, + 68394, + 68432, + 68449, + 68430, + 68353, + 68385, + 68384, + 68419, + 68404, + 68400, + 68363, + 68418, + 68388, + 68384, + 68388, + 68398, + 68439, + 68415, + 68421, + 68376, + 68454, + 68390, + 68421, + 68409, + 68418, + 68422, + 68383, + 68378, + 68391, + 68395, + 68406, + 68387, + 68389, + 68404, + 68376, + 68408, + 68389, + 68443, + 68391, + 68392, + 68426, + 68439, + 68386, + 68426, + 68430, + 68409, + 68370, + 68392, + 68400, + 68428, + 68397, + 68402, + 68370, + 68412, + 68402, + 68390, + 68417, + 68405, + 68421, + 68393, + 68453, + 68432, + 68430, + 68388, + 68447, + 68395, + 68419, + 68381, + 68391, + 68389, + 68364, + 68413, + 68423, + 68420, + 68408, + 68397, + 68377, + 68430, + 68390, + 68408, + 68390, + 68373, + 68386, + 68415, + 68419, + 68375, + 68412, + 68388, + 68385, + 68412, + 68372, + 68396, + 68353, + 68382, + 68373, + 68376, + 68379, + 68445, + 68383, + 68405, + 68426, + 68405, + 68386, + 68428, + 68383, + 68406, + 68396, + 68409, + 68397, + 68393, + 68409, + 68419, + 68373, + 68454, + 68388, + 68418, + 68390, + 68373, + 68372, + 68421, + 68399, + 68414, + 68408, + 68446, + 68374, + 68395, + 68430, + 68450, + 68421, + 68394, + 68362, + 68416, + 68415, + 68403, + 68395, + 68388, + 68367, + 68440, + 68417, + 68422, + 68355, + 68413, + 68382, + 68422, + 68422, + 68387, + 68413, + 68401, + 68395, + 68388, + 68364, + 68441, + 68403, + 68373, + 68405, + 68405, + 68387, + 68363, + 68442, + 68370, + 68425, + 68436, + 68377, + 68400, + 68416, + 68429, + 68374, + 68382, + 68429, + 68397, + 68371, + 68387, + 68364, + 68390, + 68404, + 68413, + 68402, + 68392, + 68373, + 68418, + 68439, + 68401, + 68378, + 68400, + 68406, + 68433, + 68374, + 68400, + 68391, + 68420, + 68373, + 68419, + 68408, + 68377, + 68406, + 68404, + 68372, + 68380, + 68397, + 68416, + 68389, + 68398, + 68413, + 68387, + 68395, + 68413, + 68388, + 68384, + 68373, + 68428, + 68412, + 68388, + 68382, + 68398, + 68383, + 68426, + 68414, + 68412, + 68402, + 68422, + 68367, + 68384, + 68421, + 68444, + 68379, + 68391, + 68401, + 68424, + 68419, + 68422, + 68383, + 68406, + 68378, + 68402, + 68394, + 68414, + 68424, + 68411, + 68389, + 68393, + 68394, + 68396, + 68373, + 68415, + 68384, + 68399, + 68396, + 68414, + 68387, + 68385, + 68403, + 68408, + 68398, + 68424, + 68407, + 68412, + 68371, + 68420, + 68406, + 68392, + 68378, + 68419, + 68382, + 68369, + 68405, + 68394, + 68396, + 68378, + 68414, + 68397, + 68404, + 68408, + 68404, + 68439, + 68374, + 68397, + 68384, + 68415, + 68404, + 68401, + 68402, + 68396, + 68420, + 68382, + 68392, + 68398, + 68393, + 68435, + 68380, + 68404, + 68364, + 68384, + 68421, + 68363, + 68371, + 68406, + 68435, + 68425, + 68383, + 68383, + 68426, + 68459, + 68415, + 68402, + 68371, + 68398, + 68390, + 68399, + 68457, + 68399, + 68408, + 68421, + 68378, + 68440, + 68398, + 68404, + 68426, + 68388, + 68399, + 68379, + 68371, + 68368, + 68418, + 68379, + 68410, + 68373, + 68417, + 68384, + 68384, + 68416, + 68376, + 68413, + 68389, + 68389, + 68426, + 68388, + 68385, + 68407, + 68404, + 68420, + 68358, + 68413, + 68399, + 68444, + 68393, + 68413, + 68380, + 68416, + 68404, + 68391, + 68408, + 68385, + 68382, + 68381, + 68392, + 68415, + 68387, + 68398, + 68401, + 68388, + 68419, + 68423, + 68421, + 68438, + 68402, + 68444, + 68406, + 68394, + 68420, + 68431, + 68393, + 68414, + 68394, + 68403, + 68404, + 68391, + 68371, + 68373, + 68448, + 68401, + 68371, + 68415, + 68384, + 68399, + 68423, + 68402, + 68400, + 68371, + 68425, + 68402, + 68421, + 68374, + 68419, + 68383, + 68390, + 68415, + 68366, + 68395, + 68407, + 68382, + 68413, + 68358, + 68364, + 68417, + 68360, + 68396, + 68421, + 68414, + 68403, + 68419, + 68388, + 68375, + 68414, + 68409, + 68363, + 68393, + 68409, + 68403, + 68381, + 68382, + 68388, + 68423, + 68392, + 68379, + 68380, + 68393, + 68427, + 68433, + 68408, + 68411, + 68379, + 68401, + 68397, + 68419, + 68387, + 68391, + 68390, + 68401, + 68428, + 68405, + 68383, + 68427, + 68377, + 68440, + 68387, + 68419, + 68381, + 68441, + 68388, + 68490, + 68415, + 68418, + 68422, + 68431, + 68401, + 68402, + 68399, + 68402, + 68461, + 68437, + 68413, + 68416, + 68382, + 68402, + 68415, + 68359, + 68383, + 68393, + 68391, + 68381, + 68407, + 68409, + 68389, + 68405, + 68390, + 68366, + 68410, + 68406, + 68396, + 68442, + 68405, + 68437, + 68412, + 68418, + 68382, + 68370, + 68397, + 68401, + 68400, + 68386, + 68395, + 68485, + 68408, + 68422, + 68399, + 68415, + 68413, + 68398, + 68403, + 68380, + 68419, + 68464, + 68417, + 68366, + 68393, + 68411, + 68402, + 68391, + 68382, + 68353, + 68393, + 68414, + 68381, + 68401, + 68384, + 68389, + 68429, + 68448, + 68446, + 68429, + 68388, + 68430, + 68377, + 68375, + 68412, + 68400, + 68372, + 68403, + 68403, + 68382, + 68391, + 68420, + 68386, + 68419, + 68392, + 68407, + 68386, + 68380, + 68394, + 68376, + 68398, + 68782, + 68403, + 68408, + 68393, + 68442, + 68415, + 68380, + 68371, + 68417, + 68401, + 68424, + 68414, + 68383, + 68421, + 68393, + 68440, + 68449, + 68400, + 68386, + 68399, + 68378, + 68381, + 68462, + 68414, + 68395, + 68399, + 68575, + 68409, + 68411, + 68421, + 68396, + 68384, + 68437, + 68386, + 68376, + 68391, + 68386, + 68375, + 68438, + 68368, + 68432, + 68480, + 68416, + 68384, + 68420, + 68416, + 68380, + 68411, + 68402, + 68373, + 68362, + 68379, + 68418, + 68400, + 68396, + 68389, + 68373, + 68378, + 68402, + 68396, + 68411, + 68446, + 68405, + 68372, + 68363, + 68420, + 68396, + 68391, + 68397, + 68397, + 68405, + 68373, + 68399, + 68392, + 68433, + 68379, + 68375, + 68387, + 68422, + 68413, + 68379, + 68385, + 68405, + 68408, + 68426, + 68387, + 68394, + 68427, + 68409, + 68410, + 68396, + 68415, + 68430, + 68399, + 68395, + 68412, + 68383, + 68416, + 68381, + 68382, + 68397, + 68389, + 68391, + 68386, + 68399, + 68379, + 68416, + 68413, + 68399, + 68372, + 68401, + 68387, + 68386, + 68381, + 68413, + 68421, + 68414, + 68417, + 68396, + 68392, + 68441, + 68416, + 68401, + 68392, + 68427, + 68409, + 68384, + 68405, + 68408, + 68429, + 68387, + 68409, + 68390, + 68401, + 68413, + 68390, + 68394, + 68428, + 68377, + 68391, + 68411, + 68384, + 68421, + 68380, + 68416, + 68399, + 68383, + 68367, + 68380, + 68370, + 68442, + 68443, + 68381, + 68360, + 68375, + 68365, + 68428, + 68393, + 68406, + 68392, + 68392, + 68386, + 68393, + 68406, + 68397, + 68382, + 68392, + 68446, + 68402, + 68393, + 68417, + 68372, + 68440, + 68410, + 68381, + 68408, + 68403, + 68397, + 68401, + 68401, + 68404, + 68411, + 68415, + 68406, + 68398, + 68405, + 68382, + 68401, + 68404, + 68438, + 68397, + 68382, + 68401, + 68367, + 68377, + 68435, + 68415, + 68377, + 68403, + 68438, + 68434, + 68375, + 68421, + 68405, + 68389, + 68405, + 68404, + 68378, + 68376, + 68406, + 68422, + 68405, + 68373, + 68367, + 68400, + 68396, + 68453, + 68382, + 68376, + 68391, + 68409, + 68377, + 68426, + 68425, + 68415, + 68361, + 68382, + 68436, + 68390, + 68424, + 68365, + 68376, + 68392, + 68391, + 68446, + 68409, + 68376, + 68422, + 68377, + 68425, + 68408, + 68400, + 68413, + 68366, + 68410, + 68407, + 68424, + 68416, + 68369, + 68412, + 68376, + 68389, + 68430, + 68407, + 68420, + 68375, + 68416, + 68419, + 68388, + 68427, + 68425, + 68418, + 68397, + 68381, + 68426, + 68424, + 68422, + 68413, + 68379, + 68400, + 68429, + 68428, + 68405, + 68411, + 68406, + 68385, + 68414, + 68392, + 68421, + 68389, + 68393, + 68396, + 68440, + 68383, + 68411, + 68366, + 68404, + 68409, + 68427, + 68433, + 68379, + 68420, + 68401, + 68391, + 68373, + 68444, + 68394, + 68396, + 68398, + 68406, + 68387, + 68376, + 68390, + 68393, + 68409, + 68393, + 68400, + 68421, + 68403, + 68387, + 68430, + 68377, + 68412, + 68415, + 68392, + 68372, + 68375, + 68443, + 68432, + 68374, + 68416, + 68404, + 68393, + 68388, + 68425, + 68384, + 68396, + 68402, + 68411, + 68394, + 68388, + 68397, + 68402, + 68403, + 68392, + 68391, + 68407, + 68418, + 68432, + 68403, + 68438, + 68396, + 68394, + 68405, + 68414, + 68416, + 68396, + 68396, + 68425, + 68443, + 68401, + 68392, + 68385, + 68394, + 68415, + 68417, + 68423, + 68408, + 68369, + 68408, + 68417, + 68393, + 68420, + 68400, + 68412, + 68424, + 68415, + 68403, + 68401, + 68415, + 68428, + 68441, + 68447, + 68401, + 68388, + 68376, + 68379, + 68385, + 68407, + 68447, + 68423, + 68394, + 68377, + 68414, + 68398, + 68396, + 68420, + 68355, + 68393, + 68406, + 68435, + 68407, + 68413, + 68390, + 68433, + 68387, + 68409, + 68415, + 68409, + 68404, + 68395, + 68405, + 68395, + 68380, + 68436, + 68409, + 68366, + 68400, + 68399, + 68434, + 68387, + 68366, + 68434, + 68372, + 68415, + 68387, + 68429, + 68389, + 68387, + 68417, + 68392, + 68419, + 68392, + 68399, + 68409, + 68382, + 68406, + 68388, + 68395, + 68439, + 68400, + 68403, + 68425, + 68403, + 68419, + 68422, + 68401, + 68385, + 68462, + 68393, + 68389, + 68436, + 68399, + 68387, + 68397, + 68409, + 68397, + 68382, + 68424, + 68399, + 68364, + 68421, + 68411, + 68404, + 68398, + 68385, + 68405, + 68401, + 68418, + 68400, + 68401, + 68387, + 68404, + 68382, + 68413, + 68347, + 68393, + 68388, + 68397, + 68385, + 68423, + 68412, + 68420, + 68387, + 68404, + 68448, + 68412, + 68389, + 68382, + 68353, + 68416, + 68377, + 68382, + 68403, + 68380, + 68413, + 68359, + 68386, + 68406, + 68404, + 68410, + 68394, + 68431, + 68375, + 68389, + 68359, + 68388, + 68393, + 68416, + 68398, + 68426, + 68418, + 68388, + 68413, + 68410, + 68441, + 68395, + 68393, + 68387, + 68403, + 68367, + 68398, + 68373, + 68367, + 68392, + 68426, + 68380, + 68387, + 68402, + 68381, + 68387, + 68403, + 68416, + 68382, + 68424, + 68361, + 68423, + 68351, + 68404, + 68423, + 68396, + 68381, + 68380, + 68424, + 68396, + 68423, + 68387, + 68355, + 68386, + 68393, + 68390, + 68398, + 68392, + 68371, + 68409, + 68410, + 68379, + 68407, + 68387, + 68371, + 68422, + 68384, + 68422, + 68396, + 68380, + 68406, + 68451, + 68406, + 68422, + 68397, + 68445, + 68370, + 68382, + 68379, + 68404, + 68411, + 68378, + 68407, + 68393, + 68411, + 68426, + 68461, + 68382, + 68395, + 68384, + 68444, + 68396, + 68375, + 68413, + 68396, + 68397, + 68434, + 68421, + 68406, + 68405, + 68356, + 68402, + 68386, + 68423, + 68421, + 68419, + 68401, + 68379, + 68391, + 68437, + 68378, + 68370, + 68392, + 68403, + 68402, + 68420, + 68408, + 68395, + 68383, + 68371, + 68393, + 68417, + 68386, + 68393, + 68378, + 68392, + 68386, + 68415, + 68402, + 68387, + 68423, + 68393, + 68401, + 68442, + 68394, + 68426, + 68398, + 68398, + 68397, + 68398, + 68409, + 68383, + 68377, + 68412, + 68445, + 68385, + 68403, + 68414, + 68371, + 68376, + 68405, + 68380, + 68439, + 68394, + 68403, + 68402, + 68406, + 68391, + 68387, + 68377, + 68388, + 68403, + 68424, + 68430, + 68454, + 68407, + 68355, + 68390, + 68381, + 68445, + 68436, + 68396, + 68390, + 68384, + 68386, + 68405, + 68403, + 68451, + 68382, + 68380, + 68418, + 68404, + 68404, + 68449, + 68393, + 68416, + 68357, + 68421, + 68431, + 68376, + 68428, + 68394, + 68413, + 68388, + 68405, + 68394, + 68363, + 68404, + 68427, + 68418, + 68408, + 68375, + 68381, + 68435, + 68459, + 68442, + 68447, + 68422, + 68377, + 68409, + 68380, + 68419, + 68410, + 68393, + 68377, + 68417, + 68405, + 68425, + 68383, + 68413, + 68402, + 68418, + 68418, + 68393, + 68397, + 68406, + 68404, + 68404, + 68407, + 68442, + 68396, + 68397, + 68403, + 68408, + 68412, + 68404, + 68381, + 68416, + 68375, + 68397, + 68431, + 68397, + 68436, + 68435, + 68392, + 68419, + 68429, + 68378, + 68411, + 68424, + 68404, + 68405, + 68386, + 68444, + 68431, + 68405, + 68405, + 68395, + 68382, + 68415, + 68385, + 68412, + 68374, + 68392, + 68416, + 68452, + 68369, + 68370, + 68374, + 68404, + 68419, + 68410, + 68411, + 68398, + 68403, + 68389, + 68424, + 68385, + 68454, + 68437, + 68391, + 68424, + 68389, + 68406, + 68407, + 68426, + 68416, + 68397, + 68398, + 68410, + 68457, + 68401, + 68349, + 68442, + 68422, + 68410, + 68392, + 68407, + 68362, + 68408, + 68424, + 68417, + 68438, + 68410, + 68366, + 68408, + 68402, + 68399, + 68393, + 68409, + 68410, + 68434, + 68375, + 68381, + 68432, + 68379, + 68359, + 68381, + 68368, + 68409, + 68400, + 68425, + 68441, + 68421, + 68408, + 68400, + 68423, + 68375, + 68382, + 68382, + 68422, + 68398, + 68420, + 68413, + 68388, + 68363, + 68582, + 68388, + 68413, + 68371, + 68412, + 68395, + 68391, + 68434, + 68414, + 68398, + 68381, + 68441, + 68407, + 68419, + 68410, + 68380, + 68374, + 68405, + 68391, + 68419, + 68395, + 68382, + 68390, + 68362, + 68411, + 68422, + 68413, + 68384, + 68363, + 68389, + 68405, + 68408, + 68437, + 68418, + 68363, + 68376, + 68404, + 68405, + 68382, + 68422, + 68390, + 68387, + 68401, + 68390, + 68417, + 68407, + 68420, + 68382, + 68381, + 68370, + 68419, + 68404, + 68368, + 68394, + 68412, + 68421, + 68384, + 68397, + 68418, + 68368, + 68421, + 68406, + 68442, + 68401, + 68381, + 68404, + 68385, + 68397, + 68377, + 68386, + 68372, + 68379, + 68389, + 68425, + 68419, + 68380, + 68395, + 68383, + 68400, + 68442, + 68411, + 68375, + 68370, + 68422, + 68420, + 68380, + 68397, + 68372, + 68369, + 68400, + 68376, + 68413, + 68440, + 68421, + 68376, + 68389, + 68391, + 68411, + 68376, + 68392, + 68378, + 68403, + 68385, + 68409, + 68389, + 68419, + 68425, + 68389, + 68352, + 68437, + 68420, + 68386, + 68364, + 68384, + 68384, + 68376, + 68389, + 68427, + 68378, + 68379, + 68367, + 68427, + 68413, + 68400, + 68404, + 68393, + 68423, + 68434, + 68393, + 68433, + 68394, + 68390, + 68407, + 68408, + 68417, + 68392, + 68386, + 68426, + 68434, + 68397, + 68390, + 68396, + 68391, + 68402, + 68386, + 68425, + 68397, + 68375, + 68369, + 68402, + 68373, + 68372, + 68393, + 68417, + 68445, + 68403, + 68424, + 68432, + 68422, + 68430, + 68372, + 68429, + 68388, + 68377, + 68382, + 68427, + 68381, + 68369, + 68399, + 68405, + 68395, + 68378, + 68377, + 68426, + 68386, + 68384, + 68412, + 68411, + 68409, + 68389, + 68388, + 68394, + 68410, + 68417, + 68384, + 68413, + 68404, + 68399, + 68401, + 68429, + 68408, + 68386, + 68378, + 68404, + 68393, + 68371, + 68405, + 68391, + 68403, + 68398, + 68447, + 68396, + 68382, + 68404, + 68405, + 68370, + 68433, + 68369, + 68363, + 68379, + 68421, + 68452, + 68402, + 68397, + 68358, + 68407, + 68384, + 68428, + 68435, + 68385, + 68406, + 68388, + 68389, + 68414, + 68374, + 68388, + 68393, + 68395, + 68396, + 68392, + 68394, + 68416, + 68376, + 68417, + 68394, + 68416, + 68404, + 68379, + 68379, + 68408, + 68405, + 68380, + 68407, + 68408, + 68371, + 68429, + 68436, + 68425, + 68433, + 68405, + 68420, + 68395, + 68399, + 68371, + 68401, + 68417, + 68380, + 68393, + 68386, + 68387, + 68393, + 68387, + 68376, + 68382, + 68368, + 68374, + 68396, + 68370, + 68383, + 68404, + 68393, + 68442, + 68408, + 68412, + 68376, + 68410, + 68382, + 68381, + 68405, + 68407, + 68374, + 68389, + 68389, + 68368, + 68412, + 68387, + 68360, + 68416, + 68365, + 68387, + 68404, + 68383, + 68398, + 68398, + 68371, + 68376, + 68439, + 68431, + 68380, + 68365, + 68394, + 68397, + 68418, + 68369, + 68364, + 68400, + 68418, + 68408, + 68415, + 68424, + 68374, + 68410, + 68416, + 68466, + 68385, + 68427, + 68359, + 68392, + 68395, + 68440, + 68413, + 68432, + 68380, + 68363, + 68415, + 68446, + 68378, + 68406, + 68381, + 68399, + 68408, + 68376, + 68384, + 68379, + 68412, + 68430, + 68391, + 68403, + 68408, + 68422, + 68368, + 68389, + 68405, + 68404, + 68419, + 68389, + 68379, + 68392, + 68412, + 68408, + 68399, + 68385, + 68384, + 68395, + 68387, + 68471, + 68433, + 68430, + 68375, + 68410, + 68391, + 68384, + 68388, + 68375, + 68367, + 68388, + 68411, + 68405, + 68423, + 68411, + 68373, + 68401, + 68374, + 68405, + 68417, + 68385, + 68431, + 68443, + 68408, + 68418, + 68392, + 68399, + 68405, + 68433, + 68393, + 68435, + 68420, + 68415, + 68398, + 68399, + 68385, + 68418, + 68410, + 68405, + 68382, + 68392, + 68388, + 68413, + 68405, + 68407, + 68374, + 68404, + 68384, + 68373, + 68395, + 68386, + 68372, + 68410, + 68385, + 68403, + 68429, + 68388, + 68397, + 68416, + 68402, + 68406, + 68412, + 68413, + 68390, + 68428, + 68418, + 68425, + 68396, + 68409, + 68402, + 68424, + 68402, + 68430, + 68416, + 68411, + 68373, + 68424, + 68460, + 68394, + 68426, + 68394, + 68392, + 68367, + 68387, + 68390, + 68486, + 68419, + 68416, + 68443, + 68411, + 68388, + 68406, + 68385, + 68379, + 68394, + 68371, + 68419, + 68365, + 68367, + 68376, + 68406, + 68450, + 68400, + 68388, + 68370, + 68384, + 68439, + 68377, + 68377, + 68437, + 68399, + 68429, + 68410, + 68384, + 68416, + 68412, + 68383, + 68439, + 68410, + 68371, + 68371, + 68401, + 68408, + 68382, + 68425, + 68374, + 68404, + 68381, + 68420, + 68379, + 68387, + 68399, + 68619, + 68410, + 68409, + 68409, + 68408, + 68383, + 68388, + 68404, + 68416, + 68412, + 68382, + 68420, + 68424, + 68392, + 68406, + 68378, + 68417, + 68397, + 68438, + 68395, + 68366, + 68372, + 68382, + 68399, + 68395, + 68384, + 68390, + 68380, + 68382, + 68418, + 68389, + 68414, + 68418, + 68374, + 68393, + 68391, + 68418, + 68425, + 68402, + 68389, + 68409, + 68443, + 68472, + 68395, + 68425, + 68396, + 68451, + 68416, + 68400, + 68405, + 68393, + 68391, + 68409, + 68374, + 68397, + 68434, + 68397, + 68409, + 68375, + 68405, + 68400, + 68420, + 68429, + 68384, + 68373, + 68417, + 68402, + 68440, + 68397, + 68404, + 68389, + 68409, + 68399, + 68423, + 68438, + 68385, + 68406, + 68416, + 68431, + 68395, + 68426, + 68391, + 68422, + 68411, + 68390, + 68401, + 68403, + 68382, + 68414, + 68378, + 68425, + 68413, + 68394, + 68363, + 68368, + 68370, + 68405, + 68430, + 68402, + 68387, + 68408, + 68389, + 68425, + 68381, + 68416, + 68411, + 68432, + 68379, + 68390, + 68402, + 68435, + 68420, + 68370, + 68396, + 68371, + 68450, + 68427, + 68377, + 68385, + 68378, + 68426, + 68436, + 68397, + 68386, + 68402, + 68414, + 68388, + 68422, + 68404, + 68421, + 68359, + 68414, + 68432, + 68399, + 68393, + 68369, + 68398, + 68414, + 68478, + 68407, + 68420, + 68426, + 68389, + 68410, + 68409, + 68409, + 68403, + 68420, + 68393, + 68389, + 68405, + 68426, + 68416, + 68367, + 68405, + 68411, + 68381, + 68412, + 68423, + 68391, + 68373, + 68386, + 68437, + 68385, + 68378, + 68381, + 68405, + 68388, + 68394, + 68429, + 68407, + 68382, + 68403, + 68412, + 68387, + 68403, + 68439, + 68394, + 68389, + 68370, + 68422, + 68367, + 68406, + 68356, + 68443, + 68414, + 68409, + 68365, + 68421, + 68387, + 68408, + 68386, + 68384, + 68386, + 68412, + 68374, + 68425, + 68400, + 68411, + 68402, + 68441, + 68400, + 68358, + 68409, + 68404, + 68437, + 68392, + 68380, + 68416, + 68403, + 68387, + 68416, + 68381, + 68388, + 68396, + 68383, + 68441, + 68426, + 68434, + 68433, + 68434, + 68398, + 68409, + 68399, + 68385, + 68376, + 68440, + 68393, + 68399, + 68403, + 68397, + 68364, + 68432, + 68393, + 68415, + 68392, + 68376, + 68393, + 68383, + 68367, + 68473, + 68411, + 68411, + 68368, + 68404, + 68403, + 68400, + 68382, + 68431, + 68397, + 68389, + 68419, + 68404, + 68413, + 68383, + 68369, + 68385, + 68415, + 68413, + 68396, + 68430, + 68404, + 68410, + 68391, + 68398, + 68377, + 68408, + 68370, + 68384, + 68408, + 68385, + 68396, + 68438, + 68410, + 68420, + 68424, + 68385, + 68399, + 68408, + 68385, + 68424, + 68422, + 68409, + 68449, + 68404, + 68425, + 68387, + 68430, + 68385, + 68449, + 68382, + 68395, + 68425, + 68371, + 68401, + 68461, + 68379, + 68378, + 68408, + 68375, + 68411, + 68432, + 68384, + 68380, + 68408, + 68378, + 68393, + 68372, + 68390, + 68373, + 68409, + 68424, + 68398, + 68395, + 68387, + 68376, + 68391, + 68412, + 68446, + 68415, + 68387, + 68412, + 68432, + 68387, + 68405, + 68400, + 68426, + 68365, + 68426, + 68410, + 68407, + 68433, + 68372, + 68373, + 68365, + 68384, + 68404, + 68412, + 68388, + 68396, + 68394, + 68427, + 68480, + 68424, + 68403, + 68402, + 68415, + 68413, + 68415, + 68452, + 68424, + 68384, + 68382, + 68393, + 68418, + 68476, + 68418, + 68377, + 68382, + 68370, + 68437, + 68469, + 68374, + 68400, + 68418, + 68403, + 68429, + 68424, + 68407, + 68428, + 68372, + 68373, + 68405, + 68401, + 68376, + 68391, + 68399, + 68421, + 68457, + 68392, + 68411, + 68380, + 68404, + 68415, + 68436, + 68414, + 68413, + 68372, + 68406, + 68433, + 68419, + 68409, + 68358, + 68427, + 68417, + 68408, + 68400, + 68461, + 68412, + 68376, + 68432, + 68414, + 68436, + 68400, + 68374, + 68406, + 68429, + 68392, + 68417, + 68402, + 68400, + 68415, + 68372, + 68428, + 68373, + 68381, + 68397, + 68363, + 68393, + 68371, + 68413, + 68390, + 68377, + 68415, + 68367, + 68375, + 68420, + 68423, + 68395, + 68401, + 68396, + 68421, + 68406, + 68427, + 68449, + 68400, + 68416, + 68410, + 68419, + 68395, + 68455, + 68385, + 68393, + 68441, + 68392, + 68377, + 68437, + 68406, + 68396, + 68387, + 68391, + 68387, + 68452, + 68386, + 68415, + 68391, + 68406, + 68426, + 68413, + 68379, + 68383, + 68390, + 68403, + 68386, + 68386, + 68377, + 68400, + 68408, + 68378, + 68428, + 68395, + 68355, + 68418, + 68397, + 68407, + 68400, + 68391, + 68421, + 68435, + 68409, + 68392, + 68407, + 68409, + 68388, + 68374, + 68372, + 68393, + 68411, + 68394, + 68359, + 68378, + 68408, + 68408, + 68381, + 68411, + 68360, + 68370, + 68447, + 68421, + 68380, + 68407, + 68402, + 68417, + 68400, + 68414, + 68407, + 68422, + 68403, + 68418, + 68401, + 68393, + 68423, + 68424, + 68421, + 68390, + 68422, + 68395, + 68424, + 68409, + 68380, + 68395, + 68397, + 68395, + 68431, + 68420, + 68382, + 68423, + 68442, + 68399, + 68381, + 68426, + 68402, + 68389, + 68426, + 68391, + 68446, + 68371, + 68388, + 68439, + 68382, + 68385, + 68405, + 68381, + 68386, + 68396, + 68382, + 68418, + 68446, + 68399, + 68418, + 68400, + 68369, + 68408, + 68422, + 68369, + 68392, + 68384, + 68393, + 68385, + 68450, + 68391, + 68380, + 68420, + 68405, + 68439, + 68431, + 68368, + 68385, + 68386, + 68429, + 68415, + 68436, + 68413, + 68447, + 68426, + 68394, + 68443, + 68408, + 68402, + 68368, + 68362, + 68365, + 68407, + 68374, + 68391, + 68389, + 68384, + 68368, + 68376, + 68440, + 68404, + 68400, + 68397, + 68367, + 68394, + 68380, + 68380, + 68392, + 68372, + 68448, + 68398, + 68423, + 68397, + 68395, + 68373, + 68411, + 68379, + 68424, + 68412, + 68377, + 68379, + 68385, + 68381, + 68382, + 68384, + 68384, + 68418, + 68381, + 68446, + 68395, + 68386, + 68402, + 68400, + 68400, + 68358, + 68391, + 68406, + 68360, + 68383, + 68375, + 68436, + 68396, + 68392, + 68376, + 68399, + 68392, + 68420, + 68403, + 68371, + 68374, + 68415, + 68397, + 68380, + 68378, + 68404, + 68396, + 68393, + 68398, + 68435, + 68434, + 68390, + 68385, + 68383, + 68403, + 68398, + 68376, + 68420, + 68383, + 68359, + 68396, + 68399, + 68430, + 68406, + 68358, + 68398, + 68418, + 68380, + 68462, + 68384, + 68375, + 68383, + 68371, + 68440, + 68443, + 68419, + 68371, + 68430, + 68388, + 68398, + 68409, + 68412, + 68386, + 68382, + 68378, + 68405, + 68392, + 68421, + 68550, + 68411, + 68381, + 68393, + 68428, + 68417, + 68364, + 68409, + 68412, + 68404, + 68422, + 68443, + 68428, + 68453, + 68428, + 68402, + 68421, + 68529, + 68390, + 68366, + 68383, + 68396, + 68415, + 68429, + 68384, + 68394, + 68410, + 68396, + 68407, + 68392, + 68404, + 68392, + 68395, + 68398, + 68416, + 68388, + 68373, + 68392, + 68427, + 68420, + 68461, + 68362, + 68398, + 68415, + 68361, + 68428, + 68407, + 68408, + 68360, + 68410, + 68402, + 68393, + 68407, + 68422, + 68404, + 68385, + 68382, + 68425, + 68425, + 68467, + 68390, + 68405, + 68404, + 68416, + 68455, + 68394, + 68382, + 68436, + 68403, + 68373, + 68433, + 68359, + 68376, + 68395, + 68393, + 68419, + 68433, + 68397, + 68373, + 68375, + 68424, + 68374, + 68421, + 68377, + 68412, + 68392, + 68397, + 68373, + 68391, + 68391, + 68362, + 68429, + 68380, + 68435, + 68439, + 68408, + 68372, + 68416, + 68370, + 68448, + 68381, + 68403, + 68414, + 68377, + 68380, + 68411, + 68430, + 68409, + 68405, + 68401, + 68415, + 68397, + 68415, + 68420, + 68382, + 68408, + 68402, + 68425, + 68419, + 68375, + 68381, + 68396, + 68365, + 68402, + 68414, + 68415, + 68388, + 68369, + 68430, + 68387, + 68388, + 68379, + 68396, + 68404, + 68385, + 68420, + 68384, + 68426, + 68388, + 68419, + 68419, + 68432, + 68384, + 68409, + 68370, + 68423, + 68399, + 68424, + 68401, + 68410, + 68375, + 68403, + 68368, + 68402, + 68419, + 68385, + 68401, + 68349, + 68407, + 68445, + 68404, + 68394, + 68394, + 68406, + 68390, + 68434, + 68422, + 68403, + 68392, + 68403, + 68425, + 68433, + 68397, + 68389, + 68380, + 68384, + 68392, + 68399, + 68417, + 68402, + 68386, + 68408, + 68411, + 68412, + 68431, + 68401, + 68381, + 68402, + 68410, + 68402, + 68383, + 68408, + 68372, + 68376, + 68406, + 68438, + 68378, + 68377, + 68387, + 68412, + 68408, + 68427, + 68442, + 68383, + 68393, + 68418, + 68425, + 68435, + 68386, + 68428, + 68396, + 68414, + 68414, + 68431, + 68370, + 68398, + 68401, + 68414, + 68385, + 68421, + 68392, + 68425, + 68379, + 68412, + 68412, + 68383, + 68373, + 68426, + 68386, + 68395, + 68380, + 68402, + 68417, + 68413, + 68418, + 68385, + 68400, + 68408, + 68406, + 68400, + 68358, + 68398, + 68376, + 68390, + 68394, + 68429, + 68370, + 68391, + 68395, + 68407, + 68463, + 68418, + 68403, + 68441, + 68431, + 68385, + 68399, + 68401, + 68415, + 68425, + 68405, + 68372, + 68388, + 68431, + 68386, + 68413, + 68400, + 68415, + 68409, + 68418, + 68447, + 68406, + 68416, + 68428, + 68446, + 68410, + 68423, + 68408, + 68412, + 68440, + 68414, + 68413, + 68396, + 68437, + 68403, + 68388, + 68408, + 68401, + 68438, + 68425, + 68410, + 68384, + 68427, + 68378, + 68424, + 68384, + 68364, + 68423, + 68435, + 68385, + 68369, + 68417, + 68386, + 68414, + 68373, + 68367, + 68400, + 68412, + 68375, + 68414, + 68420, + 68437, + 68400, + 68428, + 68417, + 68416, + 68407, + 68405, + 68386, + 68377, + 68428, + 68429, + 68412, + 68392, + 68370, + 68405, + 68422, + 68426, + 68427, + 68424, + 68375, + 68357, + 68388, + 68423, + 68416, + 68393, + 68425, + 68418, + 68386, + 68412, + 68423, + 68410, + 68389, + 68374, + 68403, + 68383, + 68417, + 68370, + 68363, + 68432, + 68411, + 68393, + 68436, + 68424, + 68411, + 68413, + 68376, + 68454, + 68425, + 68431, + 68381, + 68376, + 68420, + 68412, + 68407, + 68450, + 68395, + 68425, + 68362, + 68421, + 68433, + 68387, + 68433, + 68435, + 68398, + 68408, + 68453, + 68448, + 68410, + 68395, + 68401, + 68388, + 68420, + 68413, + 68391, + 68409, + 68417, + 68373, + 68423, + 68425, + 68401, + 68429, + 68436, + 68452, + 68403, + 68410, + 68434, + 68408, + 68428, + 68395, + 68426, + 68425, + 68413, + 68402, + 68405, + 68389, + 68420, + 68393, + 68385, + 68391, + 68392, + 68400, + 68400, + 68401, + 68386, + 68380, + 68409, + 68389, + 68417, + 68394, + 68364, + 68390, + 68412, + 68377, + 68409, + 68401, + 68397, + 68409, + 68362, + 68392, + 68419, + 68423, + 68433, + 68425, + 68399, + 68400, + 68461, + 68397, + 68387, + 68429, + 68429, + 68425, + 68414, + 68459, + 68396, + 68412, + 68439, + 68441, + 68408, + 68395, + 68408, + 68369, + 68407, + 68411, + 68382, + 68377, + 68379, + 68406, + 68388, + 68409, + 68421, + 68396, + 68363, + 68378, + 68384, + 68392, + 68408, + 68409, + 68420, + 68360, + 68427, + 68424, + 68421, + 68379, + 68364, + 68376, + 68376, + 68452, + 68380, + 68420, + 68396, + 68406, + 68384, + 68399, + 68432, + 68430, + 68398, + 68393, + 68408, + 68402, + 68426, + 68418, + 68369, + 68409, + 68421, + 68410, + 68397, + 68405, + 68382, + 68416, + 68421, + 68383, + 68398, + 68382, + 68393, + 68403, + 68393, + 68409, + 68398, + 68414, + 68391, + 68390, + 68357, + 68388, + 68410, + 68400, + 68371, + 68432, + 68421, + 68395, + 68468, + 68392, + 68400, + 68421, + 68400, + 68380, + 68391, + 68404, + 68395, + 68408, + 68395, + 68420, + 68407, + 68375, + 68369, + 68384, + 68402, + 68401, + 68416, + 68421, + 68374, + 68397, + 68403, + 68397, + 68399, + 68443, + 68394, + 68382, + 68411, + 68438, + 68556, + 68411, + 68400, + 68394, + 68375, + 68442, + 68380, + 68405, + 68389, + 68405, + 68418, + 68394, + 68423, + 68381, + 68404, + 68430, + 68389, + 68405, + 68381, + 68420, + 68423, + 68387, + 68427, + 68361, + 68406, + 68412, + 68379, + 68380, + 68417, + 68398, + 68375, + 68408, + 68393, + 68385, + 68392, + 68396, + 68416, + 68346, + 68410, + 68375, + 68349, + 68398, + 68451, + 68377, + 68391, + 68437, + 68406, + 68402, + 68392, + 68380, + 68374, + 68386, + 68394, + 68380, + 68410, + 68387, + 68365, + 68360, + 68376, + 68433, + 68397, + 68383, + 68374, + 68407, + 68362, + 68385, + 68420, + 68386, + 68391, + 68397, + 68392, + 68410, + 68369, + 68411, + 68397, + 68396, + 68383, + 68395, + 68441, + 68413, + 68384, + 68373, + 68426, + 68447, + 68380, + 68405, + 68378, + 68436, + 68393, + 68391, + 68402, + 68400, + 68380, + 68390, + 68405, + 68418, + 68424, + 68400, + 68406, + 68413, + 68380, + 68426, + 68378, + 68399, + 68409, + 68420, + 68380, + 68445, + 68372, + 68410, + 68394, + 68413, + 68403, + 68435, + 68398, + 68365, + 68395, + 68415, + 68404, + 68377, + 68418, + 68381, + 68399, + 68424, + 68417, + 68380, + 68393, + 68411, + 68364, + 68403, + 68377, + 68410, + 68394, + 68377, + 68368, + 68404, + 68404, + 68408, + 68410, + 68376, + 68411, + 68385, + 68363, + 68418, + 68403, + 68386, + 68351, + 68388, + 68413, + 68427, + 68397, + 68434, + 68389, + 68390, + 68420, + 68394, + 68439, + 68381, + 68392, + 68354, + 68389, + 68430, + 68386, + 68405, + 68402, + 68392, + 68415, + 68405, + 68407, + 68422, + 68397, + 68395, + 68407, + 68404, + 68413, + 68370, + 68379, + 68386, + 68384, + 68370, + 68443, + 68407, + 68373, + 68402, + 68403, + 68413, + 68400, + 68417, + 68399, + 68375, + 68370, + 68436, + 68372, + 68420, + 68371, + 68377, + 68412, + 68398, + 68379, + 68394, + 68368, + 68403, + 68409, + 68373, + 68392, + 68374, + 68388, + 68413, + 68384, + 68418, + 68425, + 68412, + 68375, + 68401, + 68423, + 68420, + 68376, + 68412, + 68376, + 68391, + 68360, + 68429, + 68401, + 68382, + 68407, + 68388, + 68417, + 68405, + 68417, + 68386, + 68381, + 68373, + 68368, + 68397, + 68392, + 68405, + 68356, + 68381, + 68423, + 68440, + 68449, + 68426, + 68428, + 68393, + 68401, + 68406, + 68440, + 68413, + 68388, + 68372, + 68413, + 68400, + 68408, + 68428, + 68366, + 68411, + 68372, + 68362, + 68391, + 68384, + 68390, + 68398, + 68384, + 68431, + 68387, + 68407, + 68406, + 68415, + 68470, + 68396, + 68420, + 68434, + 68408, + 68403, + 68388, + 68367, + 68403, + 68401, + 68413, + 68408, + 68389, + 68422, + 68400, + 68384, + 68443, + 68376, + 68375, + 68386, + 68397, + 68432, + 68364, + 68426, + 68388, + 68394, + 68418, + 68395, + 68379, + 68378, + 68398, + 68391, + 68404, + 68407, + 68383, + 68389, + 68383, + 68435, + 68425, + 68393, + 68400, + 68355, + 68408, + 68385, + 68376, + 68403, + 68381, + 68399, + 68390, + 68439, + 68403, + 68394, + 68372, + 68380, + 68387, + 68400, + 68441, + 68398, + 68377, + 68383, + 68433, + 68397, + 68403, + 68391, + 68391, + 68397, + 68411, + 68407, + 68384, + 68400, + 68377, + 68382, + 68391, + 68423, + 68390, + 68418, + 68404, + 68409, + 68400, + 68382, + 68407, + 68425, + 68396, + 68392, + 68404, + 68404, + 68401, + 68404, + 68381, + 68401, + 68384, + 68409, + 68395, + 68391, + 68392, + 68391, + 68408, + 68406, + 68421, + 68416, + 68385, + 68423, + 68438, + 68390, + 68407, + 68379, + 68400, + 68408, + 68400, + 68406, + 68430, + 68386, + 68362, + 68399, + 68421, + 68431, + 68388, + 68398, + 68392, + 68399, + 68379, + 68394, + 68393, + 68408, + 68412, + 68382, + 68416, + 68390, + 68419, + 68396, + 68415, + 68413, + 68398, + 68415, + 68388, + 68395, + 68403, + 68431, + 68420, + 68401, + 68391, + 68476, + 68395, + 68451, + 68413, + 68412, + 68388, + 68397, + 68450, + 68385, + 68388, + 68416, + 68365, + 68405, + 68385, + 68403, + 68414, + 68396, + 68398, + 68401, + 68404, + 68402, + 68404, + 68414, + 68406, + 68408, + 68406, + 68396, + 68459, + 68421, + 68415, + 68403, + 68383, + 68391, + 68371, + 68381, + 68367, + 68422, + 68367, + 68426, + 68431, + 68386, + 68416, + 68387, + 68400, + 68432, + 68392, + 68441, + 68418, + 68382, + 68389, + 68404, + 68404, + 68503, + 68424, + 68416, + 68374, + 68411, + 68400, + 68407, + 68412, + 68402, + 68376, + 68377, + 68391, + 68389, + 68393, + 68423, + 68389, + 68378, + 68400, + 68404, + 68375, + 68440, + 68381, + 68389, + 68420, + 68418, + 68418, + 68382, + 68388, + 68382, + 68403, + 68396, + 68400, + 68428, + 68372, + 68423, + 68402, + 68390, + 68387, + 68387, + 68392, + 68403, + 68399, + 68397, + 68435, + 68390, + 68383, + 68398, + 68420, + 68402, + 68392, + 68433, + 68394, + 68396, + 68411, + 68402, + 68416, + 68429, + 68409, + 68382, + 68454, + 68422, + 68412, + 68398, + 68407, + 68400, + 68427, + 68420, + 68377, + 68387, + 68383, + 68405, + 68365, + 68445, + 68411, + 68379, + 68407, + 68397, + 68368, + 68384, + 68396, + 68411, + 68413, + 68388, + 68407, + 68420, + 68391, + 68464, + 68402, + 68414, + 68407, + 68390, + 68406, + 68405, + 68412, + 68393, + 68395, + 68399, + 68414, + 68405, + 68395, + 68430, + 68399, + 68393, + 68382, + 68401, + 68395, + 68415, + 68390, + 68431, + 68392, + 68421, + 68423, + 68405, + 68391, + 68387, + 68395, + 68436, + 68398, + 68391, + 68376, + 68409, + 68392, + 68378, + 68385, + 68387, + 68409, + 68412, + 68394, + 68412, + 68378, + 68400, + 68400, + 68390, + 68407, + 68444, + 68374, + 68369, + 68376, + 68406, + 68405, + 68388, + 68400, + 68417, + 68388, + 68770, + 68417, + 68396, + 68383, + 68424, + 68421, + 68399, + 68377, + 68415, + 68376, + 68402, + 68444, + 68458, + 68408, + 68368, + 68422, + 68399, + 68400, + 68410, + 68399, + 68395, + 68349, + 68487, + 68382, + 68403, + 68402, + 68422, + 68378, + 68409, + 68375, + 68430, + 68386, + 68411, + 68435, + 68382, + 68392, + 68393, + 68365, + 68446, + 68411, + 68409, + 68429, + 68405, + 68434, + 68683, + 68382, + 68411, + 68417, + 68401, + 68407, + 68420, + 68373, + 68398, + 68401, + 68414, + 68403, + 68381, + 68385, + 68405, + 68404, + 68427, + 68428, + 68436, + 68404, + 68406, + 68439, + 68416, + 68441, + 68430, + 68429, + 68380, + 68355, + 68379, + 68388, + 68411, + 68390, + 68401, + 68389, + 68408, + 68381, + 68424, + 68386, + 68397, + 68367, + 68381, + 68378, + 68391, + 68381, + 68379, + 68383, + 68371, + 68396, + 68378, + 68413, + 68408, + 68388, + 68411, + 68411, + 68408, + 68397, + 68382, + 68363, + 68410, + 68423, + 68436, + 68406, + 68407, + 68404, + 68434, + 68460, + 68396, + 68375, + 68388, + 68384, + 68404, + 68401, + 68374, + 68413, + 68406, + 68413, + 68372, + 68423, + 68429, + 68378, + 68378, + 68401, + 68410, + 68419, + 68400, + 68383, + 68453, + 68373, + 68396, + 68412, + 68389, + 68389, + 68372, + 68418, + 68423, + 68385, + 68437, + 68372, + 68384, + 68417, + 68391, + 68429, + 68427, + 68381, + 68390, + 68379, + 68431, + 68415, + 68381, + 68377, + 68385, + 68399, + 68439, + 68368, + 68404, + 68393, + 68402, + 68419, + 68393, + 68404, + 68414, + 68358, + 68398, + 68438, + 68401, + 68401, + 68389, + 68370, + 68385, + 68393, + 68409, + 68380, + 68378, + 68426, + 68361, + 68444, + 68404, + 68392, + 68376, + 68415, + 68378, + 68364, + 68389, + 68409, + 68410, + 68378, + 68396, + 68356, + 68385, + 68395, + 68438, + 68378, + 68393, + 68443, + 68380, + 68408, + 68401, + 68380, + 68389, + 68391, + 68408, + 68393, + 68405, + 68361, + 68389, + 68423, + 68407, + 68380, + 68411, + 68439, + 68422, + 68428, + 68409, + 68406, + 68430, + 68380, + 68390, + 68389, + 68383, + 68421, + 68404, + 68402, + 68415, + 68411, + 68421, + 68402, + 68412, + 68392, + 68382, + 68415, + 68418, + 68390, + 68426, + 68375, + 68397, + 68396, + 68406, + 68431, + 68411, + 68413, + 68404, + 68396, + 68453, + 68409, + 68433, + 68418, + 68397, + 68411, + 68413, + 68412, + 68391, + 68415, + 68447, + 68428, + 68425, + 68447, + 68436, + 68412, + 68444, + 68419, + 68432, + 68401, + 68411, + 68401, + 68403, + 68405, + 68386, + 68386, + 68388, + 68390, + 68414, + 68407, + 68407, + 68398, + 68443, + 68378, + 68407, + 68418, + 68436, + 68375, + 68427, + 68437, + 68391, + 68411, + 68387, + 68397, + 68414, + 68388, + 68430, + 68385, + 68399, + 68398, + 68393, + 68419, + 68410, + 68424, + 68409, + 68471, + 68398, + 68410, + 68433, + 68388, + 68405, + 68429, + 68409, + 68404, + 68394, + 68370, + 68464, + 68427, + 68401, + 68382, + 68392, + 68376, + 68399, + 68450, + 68365, + 68409, + 68431, + 68416, + 68440, + 68459, + 68419, + 68402, + 68410, + 68378, + 68430, + 68390, + 68414, + 68360, + 68398, + 68376, + 68433, + 68382, + 68413, + 68369, + 68413, + 68411, + 68395, + 68413, + 68377, + 68416, + 68396, + 68392, + 68440, + 68394, + 68413, + 68387, + 68384, + 68423, + 68398, + 68404, + 68434, + 68384, + 68413, + 68413, + 68428, + 68380, + 68404, + 68419, + 68383, + 68406, + 68403, + 68388, + 68394, + 68412, + 68423, + 68377, + 68445, + 68419, + 68384, + 68404, + 68390, + 68426, + 68591, + 68415, + 68418, + 68373, + 68416, + 68430, + 68423, + 68431, + 68420, + 68362, + 68383, + 68397, + 68403, + 68379, + 68414, + 68408, + 68409, + 68454, + 68391, + 68400, + 68420, + 68385, + 68367, + 68393, + 68377, + 68411, + 68404, + 68378, + 68369, + 68421, + 68464, + 68425, + 68386, + 68373, + 68403, + 68399, + 68417, + 68436, + 68406, + 68399, + 68397, + 68408, + 68380, + 68392, + 68396, + 68385, + 68417, + 68416, + 68411, + 68400, + 68416, + 68386, + 68408, + 68437, + 68455, + 68386, + 68396, + 68407, + 68398, + 68377, + 68431, + 68414, + 68387, + 68377, + 68405, + 68403, + 68394, + 68423, + 68437, + 68418, + 68400, + 68390, + 68425, + 68428, + 68416, + 68372, + 68395, + 68383, + 68388, + 68394, + 68415, + 68415, + 68411, + 68426, + 68381, + 68418, + 68412, + 68418, + 68417, + 68404, + 68405, + 68371, + 68407, + 68405, + 68388, + 68404, + 68440, + 68416, + 68418, + 68382, + 68401, + 68377, + 68389, + 68418, + 68392, + 68423, + 68416, + 68416, + 68426, + 68433, + 68413, + 68443, + 68409, + 68374, + 68383, + 68398, + 68418, + 68382, + 68406, + 68409, + 68409, + 68409, + 68425, + 68414, + 68423, + 68373, + 68403, + 68421, + 68408, + 68397, + 68424, + 68441, + 68396, + 68412, + 68400, + 68421, + 68422, + 68427, + 68370, + 68375, + 68379, + 68427, + 68422, + 68443, + 68415, + 68423, + 68425, + 68383, + 68428, + 68419, + 68386, + 68430, + 68430, + 68418, + 68399, + 68389, + 68401, + 68435, + 68431, + 68401, + 68403, + 68427, + 68410, + 68444, + 68456, + 68367, + 68381, + 68437, + 68383, + 68380, + 68432, + 68404, + 68378, + 68404, + 68418, + 68440, + 68403, + 68379, + 68455, + 68424, + 68415, + 68398, + 68414, + 68408, + 68388, + 68420, + 68378, + 68473, + 68394, + 68425, + 68378, + 68408, + 68419, + 68395, + 68413, + 68364, + 68426, + 68415, + 68396, + 68406, + 68454, + 68401, + 68423, + 68404, + 68413, + 68392, + 68485, + 68423, + 68428, + 68410, + 68393, + 68461, + 68427, + 68439, + 68395, + 68404, + 68419, + 68414, + 68419, + 68407, + 68407, + 68410, + 68400, + 68377, + 68394, + 68400, + 68411, + 68413, + 68414, + 68417, + 68418, + 68404, + 68396, + 68413, + 68407, + 68449, + 68445, + 68388, + 68414, + 68382, + 68435, + 68411, + 68391, + 68370, + 68431, + 68427, + 68397, + 68373, + 68411, + 68369, + 68376, + 68402, + 68390, + 68396, + 68410, + 68411, + 68388, + 68404, + 68395, + 68413, + 68381, + 68386, + 68393, + 68430, + 68456, + 68446, + 68416, + 68386, + 68374, + 68399, + 68401, + 68373, + 68404, + 68389, + 68372, + 68378, + 68415, + 68414, + 68414, + 68393, + 68420, + 68418, + 68393, + 68402, + 68400, + 68393, + 68393, + 68413, + 68409, + 68425, + 68402, + 68405, + 68418, + 68385, + 68412, + 68444, + 68405, + 68363, + 68384, + 68411, + 68360, + 68396, + 68438, + 68375, + 68397, + 68426, + 68393, + 68417, + 68454, + 68424, + 68408, + 68412, + 68421, + 68365, + 68365, + 68383, + 68406, + 68434, + 68378, + 68420, + 68381, + 68419, + 68380, + 68398, + 68407, + 68404, + 68402, + 68384, + 68385, + 68407, + 68432, + 68411, + 68381, + 68392, + 68420, + 68393, + 68381, + 68397, + 68433, + 68412, + 68429, + 68390, + 68415, + 68456, + 68439, + 68389, + 68405, + 68380, + 68375, + 68427, + 68373, + 68410, + 68419, + 68401, + 68438, + 68406, + 68402, + 68351, + 68461, + 68377, + 68381, + 68406, + 68409, + 68353, + 68403, + 68391, + 68407, + 68403, + 68375, + 68373, + 68400, + 68431, + 68425, + 68415, + 68387, + 68396, + 68383, + 68411, + 68402, + 68401, + 68398, + 68409, + 68397, + 68407, + 68411, + 68420, + 68418, + 68376, + 68398, + 68401, + 68380, + 68393, + 68420, + 68366, + 68390, + 68385, + 68411, + 68397, + 68349, + 68374, + 68404, + 68396, + 68404, + 68390, + 68421, + 68391, + 68439, + 68428, + 68424, + 68444, + 68403, + 68367, + 68399, + 68359, + 68412, + 68447, + 68375, + 68407, + 68416, + 68429, + 68429, + 68383, + 68413, + 68384, + 68396, + 68395, + 68440, + 68399, + 68439, + 68431, + 68407, + 68428, + 68456, + 68428, + 68401, + 68371, + 68393, + 68381, + 68388, + 68385, + 68384, + 68385, + 68376, + 68404, + 68391, + 68443, + 68444, + 68398, + 68426, + 68413, + 68414, + 68447, + 68406, + 68455, + 68397, + 68424, + 68447, + 68408, + 68392, + 68393, + 68371, + 68366, + 68422, + 68404, + 68392, + 68394, + 68385, + 68416, + 68387, + 68395, + 68395, + 68389, + 68399, + 68369, + 68402, + 68401, + 68392, + 68367, + 68376, + 68415, + 68429, + 68390, + 68400, + 68409, + 68433, + 68402, + 68411, + 68408, + 68447, + 68387, + 68442, + 68372, + 68391, + 68411, + 68378, + 68422, + 68391, + 68391, + 68438, + 68405, + 68408, + 68404, + 68395, + 68364, + 68372, + 68407, + 68410, + 68372, + 68410, + 68392, + 68411, + 68399, + 68424, + 68399, + 68381, + 68410, + 68418, + 68400, + 68382, + 68373, + 68397, + 68428, + 68417, + 68384, + 68418, + 68386, + 68449, + 68402, + 68440, + 68410, + 68414, + 68399, + 68400, + 68418, + 68405, + 68405, + 68405, + 68425, + 68377, + 68378, + 68414, + 68404, + 68440, + 68384, + 68393, + 68407, + 68434, + 68370, + 68414, + 68388, + 68405, + 68392, + 68472, + 68465, + 68410, + 68381, + 68410, + 68381, + 68394, + 68412, + 68400, + 68393, + 68386, + 68421, + 68442, + 68371, + 68417, + 68413, + 68404, + 68419, + 68404, + 68390, + 68374, + 68373, + 68387, + 68435, + 68398, + 68393, + 68350, + 68422, + 68409, + 68403, + 68397, + 68365, + 68454, + 68426, + 68383, + 68408, + 68416, + 68397, + 68396, + 68396, + 68420, + 68453, + 68411, + 68419, + 68356, + 68387, + 68356, + 68396, + 68377, + 68402, + 68399, + 68393, + 68374, + 68405, + 68390, + 68428, + 68371, + 68384, + 68373, + 68362, + 68389, + 68451, + 68420, + 68398, + 68447, + 68387, + 68376, + 68431, + 68378, + 68396, + 68384, + 68421, + 68382, + 68413, + 68390, + 68403, + 68436, + 68395, + 68443, + 68423, + 68416, + 68393, + 68390, + 68428, + 68487, + 68400, + 68385, + 68440, + 68367, + 68396, + 68403, + 68419, + 68443, + 68390, + 68391, + 68423, + 68382, + 68423, + 68429, + 68401, + 68393, + 68405, + 68395, + 68411, + 68447, + 68416, + 68431, + 68373, + 68385, + 68371, + 68412, + 68410, + 68413, + 68381, + 68397, + 68397, + 68386, + 68370, + 68377, + 68406, + 68411, + 68408, + 68396, + 68417, + 68414, + 68414, + 68413, + 68404, + 68425, + 68379, + 68373, + 68403, + 68458, + 68392, + 68411, + 68402, + 68381, + 68416, + 68384, + 68417, + 68377, + 68366, + 68406, + 68395, + 68378, + 68393, + 68389, + 68455, + 68407, + 68384, + 68418, + 68437, + 68417, + 68411, + 68388, + 68391, + 68423, + 68366, + 68373, + 68384, + 68422, + 68407, + 68396, + 68405, + 68419, + 68402, + 68457, + 68415, + 68424, + 68393, + 68380, + 68384, + 68426, + 68365, + 68414, + 68398, + 68390, + 68409, + 68420, + 68398, + 68419, + 68405, + 68417, + 68386, + 68417, + 68405, + 68391, + 68437, + 68376, + 68385, + 68409, + 68411, + 68412, + 68381, + 68391, + 68372, + 68386, + 68382, + 68406, + 68393, + 68350, + 68400, + 68379, + 68393, + 68463, + 68398, + 68364, + 68391, + 68382, + 68414, + 68405, + 68453, + 68395, + 68442, + 68378, + 68392, + 68400, + 68418, + 68399, + 68388, + 68382, + 68403, + 68413, + 68392, + 68390, + 68378, + 68409, + 68419, + 68403, + 68399, + 68414, + 68370, + 68391, + 68409, + 68425, + 68381, + 68442, + 68388, + 68410, + 68381, + 68417, + 68405, + 68412, + 68408, + 68388, + 68374, + 68408, + 68392, + 68382, + 68384, + 68390, + 68393, + 68383, + 68393, + 68426, + 68390, + 68391, + 68425, + 68381, + 68409, + 68423, + 68391, + 68409, + 68421, + 68408, + 68462, + 68413, + 68386, + 68389, + 68392, + 68373, + 68393, + 68424, + 68392, + 68395, + 68439, + 68383, + 68375, + 68409, + 68406, + 68385, + 68375, + 68419, + 68412, + 68406, + 68392, + 68372, + 68397, + 68438, + 68411, + 68428, + 68391, + 68399, + 68381, + 68415, + 68429, + 68392, + 68367, + 68391, + 68429, + 68428, + 68442, + 68437, + 68384, + 68410, + 68416, + 68401, + 68391, + 68415, + 68397, + 68421, + 68369, + 68440, + 68439, + 68420, + 68420, + 68401, + 68384, + 68400, + 68395, + 68392, + 68361, + 68380, + 68387, + 68395, + 68383, + 68428, + 68389, + 68405, + 68410, + 68404, + 68365, + 68393, + 68381, + 68404, + 68393, + 68388, + 68399, + 68412, + 68370, + 68414, + 68437, + 68381, + 68414, + 68414, + 68401, + 68410, + 68411, + 68424, + 68404, + 68379, + 68413, + 68378, + 68426, + 68416, + 68385, + 68387, + 68377, + 68409, + 68405, + 68399, + 68426, + 68387, + 68424, + 68395, + 68419, + 68399, + 68362, + 68408, + 68379, + 68413, + 68401, + 68377, + 68396, + 68412, + 68369, + 68422, + 68393, + 68443, + 68439, + 68368, + 68421, + 68391, + 68397, + 68419, + 68441, + 68370, + 68385, + 68384, + 68403, + 68392, + 68419, + 68402, + 68373, + 68392, + 68424, + 68368, + 68400, + 68390, + 68397, + 68432, + 68382, + 68436, + 68433, + 68399, + 68396, + 68412, + 68385, + 68405, + 68400, + 68405, + 68399, + 68413, + 68380, + 68406, + 68388, + 68411, + 68371, + 68408, + 68422, + 68432, + 68428, + 68420, + 68395, + 68373, + 68379, + 68374, + 68408, + 68405, + 68368, + 68378, + 68378, + 68392, + 68431, + 68383, + 68394, + 68427, + 68414, + 68401, + 68396, + 68397, + 68395, + 68380, + 68400, + 68414, + 68411, + 68425, + 68369, + 68379, + 68397, + 68400, + 68421, + 68403, + 68405, + 68416, + 68363, + 68387, + 68402, + 68399, + 68387, + 68392, + 68376, + 68390, + 68416, + 68382, + 68389, + 68364, + 68402, + 68393, + 68433, + 68357, + 68354, + 68408, + 68385, + 68399, + 68399, + 68388, + 68409, + 68367, + 68355, + 68433, + 68385, + 68384, + 68374, + 68393, + 68404, + 68420, + 68396, + 68414, + 68377, + 68388, + 68402, + 68399, + 68402, + 68378, + 68376, + 68401, + 68372, + 68410, + 68423, + 68401, + 68376, + 68425, + 68393, + 68430, + 68428, + 68384, + 68398, + 68417, + 68418, + 68428, + 68447, + 68427, + 68405, + 68406, + 68386, + 68374, + 68422, + 68415, + 68377, + 68380, + 68398, + 68430, + 68420, + 68413, + 68382, + 68423, + 68434, + 68435, + 68377, + 68369, + 68381, + 68414, + 68423, + 68378, + 68428, + 68378, + 68367, + 68387, + 68441, + 68412, + 68405, + 68397, + 68392, + 68410, + 68418, + 68435, + 68451, + 68398, + 68372, + 68402, + 68406, + 68379, + 68432, + 68400, + 68393, + 68375, + 68401, + 68402, + 68376, + 68411, + 68366, + 68416, + 68370, + 68429, + 68427, + 68418, + 68367, + 68379, + 68410, + 68415, + 68459, + 68387, + 68404, + 68411, + 68427, + 68391, + 68433, + 68408, + 68388, + 68417, + 68430, + 68382, + 68374, + 68400, + 68385, + 68406, + 68419, + 68421, + 68383, + 68414, + 68399, + 68400, + 68405, + 68434, + 68394, + 68445, + 68391, + 68424, + 68409, + 68404, + 68449, + 68455, + 68396, + 68423, + 68380, + 68410, + 68394, + 68421, + 68381, + 68392, + 68453, + 68399, + 68394, + 68421, + 68402, + 68388, + 68434, + 68434, + 68401, + 68408, + 68422, + 68361, + 68407, + 68416, + 68398, + 68368, + 68388, + 68398, + 68405, + 68374, + 68443, + 68400, + 68372, + 68410, + 68395, + 68403, + 68405, + 68416, + 68386, + 68459, + 68438, + 68429, + 68415, + 68413, + 68369, + 68397, + 68418, + 68380, + 68416, + 68409, + 68443, + 68440, + 68406, + 68431, + 68376, + 68427, + 68421, + 68441, + 68436, + 68417, + 68406, + 68420, + 68396, + 68384, + 68438, + 68424, + 68392, + 68431, + 68456, + 68449, + 68479, + 68420, + 68410, + 68422, + 68426, + 68417, + 68409, + 68426, + 68382, + 68439, + 68394, + 68401, + 68449, + 68433, + 68400, + 68442, + 68405, + 68393, + 68422, + 68429, + 68403, + 68388, + 68398, + 68400, + 68415, + 68401, + 68429, + 68418, + 68418, + 68406, + 68387, + 68405, + 68391, + 68414, + 68382, + 68408, + 68399, + 68366, + 68382, + 68431, + 68388, + 68429, + 68416, + 68447, + 68399, + 68395, + 68413, + 68367, + 68395, + 68384, + 68381, + 68430, + 68376, + 68393, + 68396, + 68397, + 68412, + 68378, + 68385, + 68404, + 68410, + 68484, + 68418, + 68398, + 68367, + 68375, + 68406, + 68390, + 68445, + 68385, + 68382, + 68404, + 68389, + 68454, + 68411, + 68430, + 68398, + 68380, + 68388, + 68393, + 68398, + 68384, + 68412, + 68363, + 68432, + 68419, + 68444, + 68445, + 68373, + 68409, + 68419, + 68400, + 68435, + 68394, + 68396, + 68377, + 68390, + 68382, + 68433, + 68409, + 68381, + 68384, + 68396, + 68432, + 68412, + 68423, + 68367, + 68396, + 68444, + 68415, + 68391, + 68394, + 68431, + 68380, + 68450, + 68422, + 68409, + 68387, + 68416, + 68400, + 68406, + 68400, + 68408, + 68445, + 68365, + 68422, + 68416, + 68413, + 68410, + 68428, + 68366, + 68410, + 68390, + 68431, + 68417, + 68380, + 68394, + 68688, + 68406, + 68471, + 68421, + 68402, + 68429, + 68367, + 68395, + 68415, + 68386, + 68425, + 68376, + 68432, + 68371, + 68450, + 68443, + 68399, + 68383, + 68369, + 68380, + 68396, + 68378, + 68395, + 68392, + 68403, + 68376, + 68405, + 68417, + 68373, + 68401, + 68384, + 68419, + 68408, + 68429, + 68433, + 68407, + 68397, + 68415, + 68388, + 68406, + 68395, + 68375, + 68392, + 68383, + 68429, + 68405, + 68410, + 68393, + 68380, + 68358, + 68388, + 68422, + 68405, + 68427, + 68369, + 68439, + 68439, + 68385, + 68412, + 68370, + 68395, + 68405, + 68416, + 68423, + 68393, + 68366, + 68377, + 68421, + 68368, + 68374, + 68415, + 68404, + 68400, + 68399, + 68392, + 68411, + 68400, + 68398, + 68413, + 68428, + 68461, + 68390, + 68389, + 68405, + 68387, + 68413, + 68430, + 68417, + 68386, + 68409, + 68438, + 68377, + 68398, + 68394, + 68407, + 68364, + 68415, + 68373, + 68421, + 68416, + 68402, + 68406, + 68407, + 68390, + 68415, + 68450, + 68387, + 68382, + 68399, + 68391, + 68413, + 68418, + 68364, + 68395, + 68371, + 68414, + 68377, + 68419, + 68416, + 68373, + 68387, + 68407, + 68374, + 68414, + 68419, + 68407, + 68386, + 68396, + 68390, + 68407, + 68463, + 68419, + 68370, + 68421, + 68372, + 68416, + 68406, + 68387, + 68416, + 68387, + 68432, + 68399, + 68390, + 68368, + 68408, + 68403, + 68396, + 68397, + 68409, + 68385, + 68431, + 68371, + 68407, + 68380, + 68421, + 68378, + 68436, + 68377, + 68436, + 68393, + 68436, + 68382, + 68424, + 68424, + 68406, + 68436, + 68393, + 68388, + 68436, + 68427, + 68430, + 68408, + 68401, + 68360, + 68400, + 68419, + 68419, + 68411, + 68385, + 68375, + 68431, + 68426, + 68394, + 68413, + 68385, + 68382, + 68384, + 68392, + 68415, + 68418, + 68427, + 68404, + 68431, + 68420, + 68394, + 68385, + 68421, + 68386, + 68413, + 68404, + 68416, + 68399, + 68414, + 68359, + 68374, + 68446, + 68421, + 68412, + 68378, + 68382, + 68406, + 68400, + 68380, + 68417, + 68407, + 68401, + 68391, + 68385, + 68404, + 68398, + 68400, + 68365, + 68400, + 68395, + 68364, + 68433, + 68436, + 68398, + 68367, + 68381, + 68427, + 68446, + 68377, + 68429, + 68416, + 68383, + 68401, + 68394, + 68391, + 68369, + 68429, + 68380, + 68422, + 68396, + 68389, + 68403, + 68426, + 68385, + 68383, + 68423, + 68440, + 68379, + 68396, + 68404, + 68416, + 68418, + 68380, + 68387, + 68387, + 68386, + 68391, + 68385, + 68403, + 68373, + 68413, + 68406, + 68384, + 68409, + 68426, + 68390, + 68373, + 68383, + 68388, + 68410, + 68433, + 68390, + 68411, + 68396, + 68372, + 68405, + 68393, + 68380, + 68418, + 68392, + 68412, + 68445, + 68419, + 68398, + 68441, + 68397, + 68381, + 68413, + 68414, + 68367, + 68394, + 68393, + 68414, + 68391, + 68404, + 68394, + 68384, + 68403, + 68407, + 68404, + 68416, + 68370, + 68396, + 68431, + 68435, + 68404, + 68410, + 68357, + 68385, + 68377, + 68433, + 68400, + 68410, + 68411, + 68396, + 68430, + 68409, + 68393, + 68370, + 68376, + 68405, + 68379, + 68395, + 68386, + 68402, + 68401, + 68418, + 68369, + 68377, + 68395, + 68396, + 68360, + 68416, + 68402, + 68389, + 68408, + 68429, + 68366, + 68379, + 68411, + 68374, + 68418, + 68405, + 68407, + 68393, + 68393, + 68395, + 68382, + 68428, + 68380, + 68394, + 68418, + 68393, + 68409, + 68378, + 68382, + 68364, + 68405, + 68417, + 68386, + 68393, + 68422, + 68383, + 68406, + 68410, + 68382, + 68405, + 68379, + 68375, + 68397, + 68417, + 68400, + 68424, + 68374, + 68395, + 68479, + 68435, + 68373, + 68420, + 68397, + 68393, + 68390, + 68379, + 68391, + 68368, + 68368, + 68396, + 68404, + 68444, + 68378, + 68413, + 68379, + 68367, + 68362, + 68414, + 68399, + 68393, + 68401, + 68419, + 68373, + 68446, + 68399, + 68425, + 68402, + 68421, + 68393, + 68367, + 68402, + 68410, + 68420, + 68408, + 68395, + 68393, + 68369, + 68407, + 68448, + 68411, + 68369, + 68419, + 68405, + 68382, + 68355, + 68419, + 68403, + 68414, + 68408, + 68402, + 68382, + 68383, + 68410, + 68409, + 68426, + 68441, + 68413, + 68400, + 68400, + 68440, + 68408, + 68412, + 68457, + 68407, + 68394, + 68367, + 68414, + 68367, + 68381, + 68372, + 68381, + 68405, + 68413, + 68408, + 68368, + 68402, + 68404, + 68386, + 68407, + 68444, + 68383, + 68411, + 68416, + 68378, + 68405, + 68399, + 68399, + 68401, + 68401, + 68380, + 68408, + 68416, + 68365, + 68406, + 68445, + 68404, + 68414, + 68371, + 68389, + 68380, + 68428, + 68389, + 68386, + 68425, + 68372, + 68402, + 68394, + 68415, + 68381, + 68375, + 68387, + 68403, + 68396, + 68398, + 68415, + 68378, + 68395, + 68411, + 68378, + 68394, + 68370, + 68418, + 68371, + 68426, + 68419, + 68407, + 68425, + 68365, + 68395, + 68456, + 68391, + 68396, + 68387, + 68409, + 68369, + 68375, + 68448, + 68392, + 68410, + 68391, + 68398, + 68392, + 68408, + 68418, + 68402, + 68378, + 68377, + 68400, + 68435, + 68385, + 68400, + 68393, + 68374, + 68377, + 68405, + 68416, + 68391, + 68387, + 68387, + 68399, + 68382, + 68413, + 68404, + 68405, + 68397, + 68408, + 68432, + 68402, + 68448, + 68422, + 68382, + 68406, + 68377, + 68416, + 68394, + 68391, + 68352, + 68369, + 68406, + 68431, + 68397, + 68477, + 68351, + 68417, + 68394, + 68414, + 68395, + 68379, + 68398, + 68420, + 68421, + 68404, + 68424, + 68391, + 68365, + 68387, + 68437, + 68477, + 68393, + 68388, + 68427, + 68403, + 68388, + 68452, + 68424, + 68407, + 68392, + 68426, + 68455, + 68426, + 68380, + 68436, + 68377, + 68402, + 68396, + 68375, + 68421, + 68378, + 68397, + 68389, + 68383, + 68412, + 68379, + 68374, + 68406, + 68384, + 68390, + 68400, + 68392, + 68398, + 68405, + 68412, + 68420, + 68424, + 68408, + 68380, + 68390, + 68423, + 68413, + 68395, + 68415, + 68409, + 68385, + 68392, + 68418, + 68447, + 68408, + 68474, + 68373, + 68421, + 68393, + 68388, + 68420, + 68416, + 68411, + 68398, + 68389, + 68442, + 68398, + 68392, + 68396, + 68426, + 68392, + 68399, + 68406, + 68375, + 68367, + 68405, + 68387, + 68403, + 68424, + 68374, + 68397, + 68392, + 68406, + 68430, + 68385, + 68409, + 68377, + 68383, + 68398, + 68428, + 68383, + 68400, + 68388, + 68425, + 68431, + 68464, + 68389, + 68437, + 68372, + 68428, + 68384, + 68375, + 68428, + 68391, + 68423, + 68408, + 68425, + 68408, + 68385, + 68379, + 68380, + 68371, + 68370, + 68411, + 68373, + 68393, + 68400, + 68385, + 68385, + 68436, + 68448, + 68394, + 68383, + 68386, + 68409, + 68380, + 68403, + 68390, + 68361, + 68424, + 68396, + 68410, + 68409, + 68392, + 68379, + 68400, + 68396, + 68418, + 68388, + 68397, + 68414, + 68400, + 68393, + 68385, + 68395, + 68379, + 68370, + 68419, + 68430, + 68403, + 68405, + 68438, + 68398, + 68381, + 68395, + 68430, + 68401, + 68383, + 68366, + 68417, + 68430, + 68389, + 68395, + 68387, + 68428, + 68363, + 68390, + 68387, + 68389, + 68407, + 68368, + 68388, + 68374, + 68427, + 68402, + 68388, + 68411, + 68409, + 68398, + 68458, + 68395, + 68420, + 68428, + 68401, + 68419, + 68386, + 68416, + 68424, + 68385, + 68391, + 68416, + 68386, + 68403, + 68405, + 68410, + 68396, + 68419, + 68410, + 68403, + 68416, + 68457, + 68436, + 68398, + 68384, + 68421, + 68403, + 68368, + 68429, + 68415, + 68405, + 68391, + 68391, + 68417, + 68411, + 68406, + 68421, + 68422, + 68431, + 68403, + 68405, + 68447, + 68380, + 68375, + 68385, + 68408, + 68403, + 68397, + 68437, + 68394, + 68429, + 68388, + 68389, + 68417, + 68409, + 68441, + 68379, + 68430, + 68395, + 68367, + 68415, + 68399, + 68382, + 68396, + 68427, + 68425, + 68439, + 68417, + 68413, + 68368, + 68380, + 68442, + 68412, + 68416, + 68392, + 68406, + 68398, + 68390, + 68398, + 68414, + 68422, + 68418, + 68410, + 68440, + 68412, + 68414, + 68390, + 68366, + 68404, + 68387, + 68420, + 68403, + 68423, + 68382, + 68401, + 68404, + 68431, + 68384, + 68403, + 68449, + 68398, + 68426, + 68383, + 68403, + 68393, + 68386, + 68405, + 68383, + 68400, + 68418, + 68421, + 68380, + 68383, + 68416, + 68394, + 68411, + 68410, + 68390, + 68358, + 68439, + 68387, + 68395, + 68371, + 68369, + 68408, + 68412, + 68383, + 68391, + 68394, + 68378, + 68385, + 68448, + 68426, + 68381, + 68414, + 68391, + 68413, + 68390, + 68396, + 68412, + 68397, + 68376, + 68415, + 68379, + 68428, + 68364, + 68420, + 68374, + 68408, + 68397, + 68382, + 68408, + 68416, + 68391, + 68375, + 68404, + 68375, + 68393, + 68381, + 68428, + 68384, + 68406, + 68456, + 68408, + 68401, + 68431, + 68392, + 68419, + 68397, + 68392, + 68382, + 68393, + 68395, + 68408, + 68391, + 68385, + 68369, + 68390, + 68446, + 68604, + 68418, + 68392, + 68387, + 68423, + 68404, + 68382, + 68377, + 68386, + 68377, + 68379, + 68408, + 68363, + 68402, + 68392, + 68397, + 68376, + 68416, + 68392, + 68388, + 68412, + 68402, + 68404, + 68404, + 68422, + 68443, + 68403, + 68390, + 68407, + 68374, + 68392, + 68408, + 68371, + 68396, + 68384, + 68417, + 68413, + 68400, + 68381, + 68410, + 68368, + 68379, + 68431, + 68390, + 68369, + 68654, + 68399, + 68431, + 68399, + 68400, + 68398, + 68386, + 68444, + 68403, + 68379, + 68389, + 68397, + 68421, + 68377, + 68374, + 68418, + 68415, + 68434, + 68398, + 68398, + 68406, + 68384, + 68417, + 68403, + 68389, + 68392, + 68419, + 68389, + 68365, + 68390, + 68389, + 68455, + 68400, + 68427, + 68411, + 68401, + 68421, + 68371, + 68365, + 68415, + 68407, + 68387, + 68444, + 68379, + 68386, + 68416, + 68461, + 68469, + 68409, + 68408, + 68396, + 68413, + 68412, + 68426, + 68381, + 68389, + 68396, + 68409, + 68439, + 68421, + 68355, + 68401, + 68358, + 68377, + 68401, + 68419, + 68434, + 68389, + 68384, + 68383, + 68420, + 68420, + 68407, + 68390, + 68394, + 68438, + 68398, + 68431, + 68394, + 68389, + 68400, + 68443, + 68410, + 68411, + 68440, + 68367, + 68406, + 68407, + 68424, + 68442, + 68406, + 68438, + 68398, + 68411, + 68414, + 68415, + 68394, + 68403, + 68419, + 68408, + 68390, + 68418, + 68415, + 68394, + 68376, + 68457, + 68382, + 68468, + 68390, + 68394, + 68455, + 68426, + 68427, + 68432, + 68418, + 68395, + 68419, + 68402, + 68433, + 68391, + 68409, + 68360, + 68399, + 68435, + 68376, + 68446, + 68350, + 68414, + 68379, + 68407, + 68426, + 68416, + 68382, + 68381, + 68399, + 68401, + 68434, + 68412, + 68418, + 68375, + 68405, + 68442, + 68398, + 68394, + 68381, + 68403, + 68437, + 68418, + 68403, + 68400, + 68414, + 68401, + 68374, + 68398, + 68398, + 68435, + 68404, + 68367, + 68415, + 68366, + 68454, + 68432, + 68391, + 68444, + 68409, + 68398, + 68421, + 68469, + 68386, + 68386, + 68409, + 68428, + 68436, + 68371, + 68401, + 68410, + 68454, + 68415, + 68433, + 68415, + 68446, + 68448, + 68388, + 68442, + 68412, + 68404, + 68398, + 68401, + 68400, + 68391, + 68419, + 68395, + 68424, + 68397, + 68379, + 68367, + 68415, + 68427, + 68385, + 68431, + 68392, + 68397, + 68410, + 68419, + 68407, + 68389, + 68392, + 68419, + 68386, + 68400, + 68391, + 68403, + 68423, + 68420, + 68423, + 68461, + 68419, + 68418, + 68426, + 68429, + 68382, + 68464, + 68415, + 68378, + 68413, + 68416, + 68402, + 68373, + 68382, + 68379, + 68380, + 68376, + 68401, + 68453, + 68375, + 68356, + 68411, + 68403, + 68369, + 68386, + 68432, + 68382, + 68396, + 68396, + 68390, + 68416, + 68406, + 68376, + 68394, + 68388, + 68397, + 68374, + 68405, + 68373, + 68399, + 68414, + 68381, + 68379, + 68402, + 68363, + 68387, + 68421, + 68408, + 68442, + 68427, + 68393, + 68383, + 68411, + 68379, + 68403, + 68374, + 68560, + 68378, + 68407, + 68384, + 68409, + 68413, + 68388, + 68375, + 68402, + 68399, + 68442, + 68392, + 68461, + 68404, + 68454, + 68435, + 68418, + 68401, + 68425, + 68389, + 68460, + 68409, + 68394, + 68376, + 68428, + 68436, + 68384, + 68394, + 68382, + 68408, + 68444, + 68390, + 68436, + 68409, + 68394, + 68432, + 68387, + 68401, + 68418, + 68417, + 68397, + 68386, + 68373, + 68387, + 68431, + 68394, + 68396, + 68399, + 68372, + 68388, + 68421, + 68404, + 68391, + 68415, + 68412, + 68394, + 68428, + 68398, + 68378, + 68400, + 68424, + 68419, + 68439, + 68414, + 68444, + 68389, + 68375, + 68412, + 68404, + 68376, + 68405, + 68411, + 68373, + 68390, + 68354, + 68408, + 68404, + 68380, + 68418, + 68451, + 68374, + 68387, + 68413, + 68396, + 68363, + 68395, + 68424, + 68392, + 68421, + 68449, + 68376, + 68388, + 68396, + 68444, + 68420, + 68413, + 68407, + 68385, + 68410, + 68421, + 68412, + 68448, + 68398, + 68390, + 68394, + 68389, + 68419, + 68391, + 68378, + 68408, + 68394, + 68412, + 68391, + 68394, + 68400, + 68382, + 68416, + 68413, + 68393, + 68365, + 68413, + 68401, + 68396, + 68421, + 68413, + 68403, + 68403, + 68407, + 68411, + 68386, + 68407, + 68391, + 68363, + 68412, + 68425, + 68383, + 68413, + 68372, + 68401, + 68392, + 68397, + 68388, + 68396, + 68383, + 68386, + 68421, + 68398, + 68441, + 68414, + 68400, + 68364, + 68412, + 68406, + 68444, + 68424, + 68417, + 68384, + 68415, + 68394, + 68425, + 68438, + 68399, + 68362, + 68415, + 68417, + 68416, + 68416, + 68367, + 68382, + 68435, + 68382, + 68408, + 68398, + 68392, + 68402, + 68407, + 68365, + 68394, + 68401, + 68400, + 68365, + 68449, + 68403, + 68406, + 68399, + 68391, + 68364, + 68391, + 68387, + 68376, + 68410, + 68370, + 68389, + 68434, + 68381, + 68434, + 68472, + 68390, + 68386, + 68400, + 68353, + 68417, + 68413, + 68370, + 68370, + 68439, + 68435, + 68411, + 68388, + 68395, + 68384, + 68370, + 68404, + 68389, + 68417, + 68347, + 68401, + 68394, + 68403, + 68388, + 68419, + 68395, + 68376, + 68389, + 68411, + 68403, + 68392, + 68394, + 68428, + 68444, + 68425, + 68401, + 68405, + 68419, + 68432, + 68403, + 68395, + 68388, + 68417, + 68397, + 68404, + 68381, + 68394, + 68398, + 68404, + 68401, + 68440, + 68359, + 68390, + 68426, + 68365, + 68390, + 68376, + 68394, + 68384, + 68380, + 68416, + 68397, + 68415, + 68404, + 68375, + 68366, + 68374, + 68392, + 68410, + 68387, + 68396, + 68405, + 68438, + 68423, + 68401, + 68419, + 68401, + 68399, + 68411, + 68373, + 68415, + 68368, + 68406, + 68415, + 68411, + 68390, + 68401, + 68411, + 68384, + 68409, + 68403, + 68401, + 68393, + 68398, + 68402, + 68362, + 68423, + 68398, + 68372, + 68413, + 68390, + 68420, + 68439, + 68430, + 68375, + 68390, + 68394, + 68431, + 68408, + 68390, + 68410, + 68411, + 68405, + 68443, + 68403, + 68420, + 68423, + 68396, + 68389, + 68394, + 68456, + 68401, + 68375, + 68396, + 68371, + 68381, + 68377, + 68423, + 68383, + 68384, + 68379, + 68376, + 68412, + 68417, + 68400, + 68442, + 68403, + 68423, + 68447, + 68395, + 68394, + 68380, + 68382, + 68375, + 68414, + 68417, + 68377, + 68388, + 68406, + 68377, + 68382, + 68387, + 68344, + 68400, + 68388, + 68403, + 68409, + 68403, + 68405, + 68392, + 68386, + 68441, + 68386, + 68391, + 68398, + 68386, + 68392, + 68410, + 68438, + 68385, + 68377, + 68404, + 68398, + 68430, + 68400, + 68418, + 68382, + 68391, + 68412, + 68390, + 68389, + 68379, + 68404, + 68430, + 68393, + 68416, + 68418, + 68399, + 68380, + 68387, + 68430, + 68412, + 68409, + 68385, + 68371, + 68391, + 68397, + 68379, + 68431, + 68379, + 68393, + 68414, + 68401, + 68412, + 68398, + 68387, + 68384, + 68404, + 68396, + 68395, + 68413, + 68399, + 68391, + 68410, + 68379, + 68387, + 68408, + 68378, + 68395, + 68413, + 68466, + 68409, + 68429, + 68436, + 68381, + 68417, + 68387, + 68432, + 68395, + 68446, + 68389, + 68407, + 68392, + 68413, + 68403, + 68411, + 68397, + 68419, + 68405, + 68421, + 68412, + 68393, + 68389, + 68394, + 68421, + 68403, + 68401, + 68354, + 68379, + 68379, + 68365, + 68412, + 68404, + 68908, + 68407, + 68421, + 68429, + 68401, + 68439, + 68409, + 68397, + 68391, + 68408, + 68453, + 68388, + 68409, + 68386, + 68415, + 68415, + 68396, + 68385, + 68407, + 68434, + 68388, + 68385, + 68382, + 68426, + 68421, + 68404, + 68414, + 68404, + 68398, + 68375, + 68413, + 68426, + 68408, + 68403, + 68454, + 68401, + 68390, + 68412, + 68417, + 68382, + 68435, + 68378, + 68394, + 68394, + 68398, + 68383, + 68411, + 68409, + 68406, + 68384, + 68398, + 68428, + 68393, + 68408, + 68405, + 68418, + 68401, + 68413, + 68391, + 68390, + 68379, + 68399, + 68371, + 68409, + 68383, + 68385, + 68354, + 68376, + 68383, + 68396, + 68376, + 68411, + 68364, + 68400, + 68388, + 68406, + 68401, + 68424, + 68404, + 68409, + 68384, + 68423, + 68412, + 68409, + 68384, + 68399, + 68415, + 68415, + 68387, + 68421, + 68419, + 68390, + 68442, + 68400, + 68383, + 68379, + 68410, + 68419, + 68424, + 68419, + 68403, + 68414, + 68417, + 68415, + 68402, + 68412, + 68370, + 68428, + 68388, + 68397, + 68411, + 68434, + 68412, + 68386, + 68423, + 68447, + 68454, + 68401, + 68421, + 68427, + 68387, + 68406, + 68420, + 68464, + 68421, + 68439, + 68380, + 68452, + 68399, + 68384, + 68384, + 68418, + 68419, + 68409, + 68410, + 68439, + 68381, + 68426, + 68398, + 68407, + 68413, + 68418, + 68398, + 68404, + 68405, + 68379, + 68410, + 68429, + 68426, + 68384, + 68364, + 68390, + 68418, + 68421, + 68410, + 68430, + 68373, + 68396, + 68372, + 68458, + 68409, + 68385, + 68377, + 68444, + 68415, + 68383, + 68391, + 68411, + 68422, + 68411, + 75364, + 68394, + 68383, + 68398, + 68423, + 68365, + 68409, + 68369, + 68416, + 68407, + 68409, + 68413, + 68397, + 68370, + 68392, + 68409, + 68393, + 68405, + 68406, + 68392, + 68380, + 68393, + 68378, + 68369, + 68399, + 68397, + 68393, + 68403, + 68423, + 68381, + 68399, + 68399, + 68462, + 68419, + 68397, + 68363, + 68410, + 68392, + 68403, + 68416, + 68426, + 68392, + 68368, + 68426, + 68390, + 68393, + 68364, + 68373, + 68430, + 68400, + 68419, + 68403, + 68407, + 68416, + 68394, + 68415, + 68438, + 68408, + 68426, + 68418, + 68371, + 68393, + 68404, + 68379, + 68403, + 68415, + 68423, + 68444, + 68382, + 68428, + 68395, + 68381, + 68372, + 68390, + 68375, + 68394, + 68415, + 68405, + 68422, + 68451, + 68406, + 68441, + 68441, + 68404, + 68440, + 68420, + 68387, + 68426, + 68421, + 68418, + 68389, + 68428, + 68399, + 68422, + 68371, + 68405, + 68411, + 68417, + 68385, + 68419, + 68396, + 68384, + 68411, + 68390, + 68454, + 68423, + 68434, + 68403, + 68387, + 68431, + 68415, + 68430, + 68386, + 68383, + 68381, + 68412, + 68399, + 68412, + 68409, + 68377, + 68423, + 68435, + 68414, + 68421, + 68384, + 68399, + 68408, + 68385, + 68408, + 68378, + 68384, + 68412, + 68421, + 68424, + 68406, + 68395, + 68376, + 68385, + 68389, + 68418, + 68404, + 68443, + 68411, + 68355, + 68379, + 68411, + 68392, + 68433, + 68403, + 68408, + 68415, + 68400, + 68383, + 68426, + 68409, + 68408, + 68382, + 68391, + 68397, + 68496, + 68397, + 68381, + 68421, + 68395, + 68410, + 68364, + 68381, + 68619, + 68388, + 68393, + 68362, + 68401, + 68421, + 68404, + 68396, + 68369, + 68427, + 68377, + 68381, + 68380, + 68438, + 68373, + 68411, + 68449, + 68409, + 68382, + 68432, + 68415, + 68411, + 68407, + 68409, + 68411, + 68409, + 68427, + 68417, + 68401, + 68387, + 68413, + 68380, + 68380, + 68377, + 68383, + 68438, + 68386, + 68370, + 68405, + 68395, + 68391, + 68392, + 68374, + 68355, + 68370, + 68429, + 68421, + 68390, + 68399, + 68397, + 68404, + 68359, + 68416, + 68397, + 68394, + 68400, + 68408, + 68412, + 68389, + 68407, + 68375, + 68379, + 68383, + 68385, + 68391, + 68422, + 68365, + 68414, + 68426, + 68394, + 68391, + 68422, + 68376, + 68403, + 68415, + 68415, + 68386, + 68411, + 68373, + 68406, + 68403, + 68392, + 68411, + 68410, + 68378, + 68400, + 68362, + 68387, + 68420, + 68371, + 68388, + 68412, + 68378, + 68381, + 68386, + 68384, + 68383, + 68357, + 68400, + 68417, + 68372, + 68394, + 68356, + 68421, + 68387, + 68388, + 68373, + 68387, + 68367, + 68386, + 68387, + 68403, + 68394, + 68412, + 68382, + 68373, + 68385, + 68406, + 68383, + 68384, + 68404, + 68410, + 68403, + 68410, + 68411, + 68408, + 68368, + 68409, + 68402, + 68426, + 68389, + 68387, + 68360, + 68437, + 68403, + 68428, + 68372, + 68409, + 68395, + 68365, + 68363, + 68435, + 68381, + 68362, + 68394, + 68415, + 68386, + 68423, + 68454, + 68416, + 68406, + 68411, + 68434, + 68368, + 68396, + 68398, + 68380, + 68427, + 68382, + 68408, + 68387, + 68418, + 68401, + 68423, + 68417, + 68444, + 68370, + 68402, + 68363, + 68392, + 68385, + 68421, + 68382, + 68376, + 68376, + 68393, + 68373, + 68409, + 68456, + 68409, + 68412, + 68414, + 68411, + 68414, + 68431, + 68408, + 68386, + 68389, + 68403, + 68397, + 68377, + 68418, + 68389, + 68418, + 68391, + 68396, + 68407, + 68402, + 68419, + 68391, + 68418, + 68419, + 68415, + 68407, + 68408, + 68435, + 68402, + 68376, + 68412, + 68400, + 68426, + 68421, + 68362, + 68412, + 68367, + 68378, + 68401, + 68426, + 68410, + 68396, + 68419, + 68418, + 68414, + 68378, + 68382, + 68414, + 68428, + 68397, + 68399, + 68392, + 68395, + 68407, + 68409, + 68393, + 68402, + 68415, + 68395, + 68406, + 68381, + 68395, + 68422, + 68412, + 68377, + 68392, + 68407, + 68387, + 68421, + 68385, + 68406, + 68415, + 68404, + 68443, + 68358, + 68375, + 68397, + 68418, + 68399, + 68416, + 68405, + 68409, + 68427, + 68422, + 68418, + 68380, + 68389, + 68398, + 68420, + 68427, + 68423, + 68380, + 68388, + 68403, + 68384, + 68424, + 68438, + 68444, + 68382, + 68424, + 68397, + 68430, + 68381, + 68407, + 68393, + 68422, + 68425, + 68439, + 68386, + 68401, + 68375, + 68423, + 68413, + 68410, + 68425, + 68387, + 68625, + 68379, + 68463, + 68420, + 68403, + 68434, + 68374, + 68392, + 68377, + 68389, + 68408, + 68406, + 68375, + 68429, + 68368, + 68368, + 68431, + 68396, + 68372, + 68376, + 68422, + 68384, + 68715, + 68405, + 68379, + 68391, + 68381, + 68412, + 68382, + 68386, + 68374, + 68397, + 68401, + 68413, + 68381, + 68395, + 68418, + 68397, + 68407, + 68432, + 68395, + 68376, + 68383, + 68425, + 68403, + 68408, + 68383, + 68403, + 68400, + 68406, + 68447, + 68396, + 68437, + 68391, + 68397, + 68402, + 68393, + 68387, + 68390, + 68401, + 68408, + 68445, + 68421, + 68406, + 68372, + 68361, + 68418, + 68367, + 68421, + 68405, + 68409, + 68399, + 68431, + 68432, + 68403, + 68435, + 68393, + 68401, + 68458, + 68407, + 68397, + 68424, + 68401, + 68393, + 68398, + 68409, + 68421, + 68400, + 68425, + 68401, + 68382, + 68415, + 68410, + 68383, + 68420, + 68407, + 68391, + 68402, + 68406, + 68397, + 68401, + 68407, + 68420, + 68389, + 68408, + 68411, + 68407, + 68434, + 68380, + 68420, + 68377, + 68412, + 68422, + 68407, + 68368, + 68413, + 68434, + 68402, + 68383, + 68409, + 68389, + 68372, + 68426, + 68445, + 68401, + 68409, + 68391, + 68398, + 68397, + 68404, + 68421, + 68407, + 68396, + 68400, + 68392, + 68391, + 68433, + 68430, + 68383, + 68406, + 68387, + 68382, + 68428, + 68389, + 68411, + 68418, + 68401, + 68401, + 68470, + 68413, + 68402, + 68392, + 68387, + 68374, + 68385, + 68416, + 68355, + 68432, + 68408, + 68395, + 68412, + 68452, + 68410, + 68446, + 68421, + 68398, + 68403, + 68418, + 68404, + 68420, + 68377, + 68414, + 68403, + 68452, + 68377, + 68392, + 68402, + 68417, + 68399, + 68409, + 68394, + 68385, + 68388, + 68414, + 68390, + 68444, + 68413, + 68395, + 68410, + 68394, + 68419, + 68431, + 68403, + 68410, + 68400, + 68406, + 68400, + 68427, + 68397, + 68400, + 68390, + 68401, + 68409, + 68412, + 68393, + 68410, + 68410, + 68400, + 68431, + 68444, + 68397, + 68431, + 68418, + 68440, + 68443, + 68416, + 68390, + 68386, + 68422, + 68386, + 68428, + 68401, + 68370, + 68387, + 68407, + 68432, + 68430, + 68420, + 68362, + 68410, + 68399, + 68432, + 68427, + 68392, + 68417, + 68419, + 68393, + 68415, + 68411, + 68413, + 68357, + 68397, + 68409, + 68386, + 68372, + 68410, + 68380, + 68397, + 68499, + 68397, + 68395, + 68388, + 68395, + 68411, + 68380, + 68405, + 68396, + 68436, + 68403, + 68400, + 68397, + 68403, + 68404, + 68439, + 68416, + 68415, + 68406, + 68397, + 68416, + 68371, + 68360, + 68397, + 68364, + 68404, + 68408, + 68397, + 68381, + 68395, + 68411, + 68400, + 68402, + 68407, + 68386, + 68399, + 68401, + 68416, + 68415, + 68422, + 68382, + 68394, + 68408, + 68423, + 68430, + 68412, + 68380, + 68394, + 68412, + 68432, + 68393, + 68443, + 68404, + 68402, + 68378, + 68420, + 68409, + 68407, + 68429, + 68386, + 68419, + 68404, + 68426, + 68402, + 68405, + 68372, + 68391, + 68405, + 68420, + 68422, + 68397, + 68371, + 68390, + 68429, + 68418, + 68458, + 68412, + 68405, + 68416, + 68389, + 68439, + 68390, + 68371, + 68411, + 68382, + 68399, + 68409, + 68390, + 68386, + 68404, + 68411, + 68394, + 68433, + 68375, + 68378, + 68373, + 68405, + 68377, + 68397, + 68404, + 68377, + 68414, + 68410, + 68398, + 68426, + 68401, + 68374, + 68402, + 68415, + 68407, + 68424, + 68416, + 68424, + 68419, + 68391, + 68431, + 68376, + 68390, + 68374, + 68412, + 68387, + 68387, + 68370, + 68371, + 68379, + 68421, + 68436, + 68376, + 68442, + 68370, + 68407, + 68382, + 68407, + 68412, + 68412, + 68386, + 68389, + 68405, + 68389, + 68396, + 68373, + 68446, + 68383, + 68399, + 68380, + 68422, + 68398, + 68400, + 68405, + 68406, + 68388, + 68396, + 68402, + 68405, + 68371, + 68405, + 68411, + 68410, + 68388, + 68389, + 68377, + 68393, + 68374, + 68401, + 68423, + 68377, + 68414, + 68385, + 68396, + 68400, + 68442, + 68385, + 68411, + 68424, + 68377, + 68433, + 68411, + 68395, + 68373, + 68406, + 68416, + 68414, + 68410, + 68366, + 68364, + 68402, + 68397, + 68390, + 68421, + 68421, + 68364, + 68407, + 68392, + 68412, + 68431, + 68391, + 68396, + 68416, + 68381, + 68371, + 68388, + 68398, + 68413, + 68371, + 68370, + 68421, + 68424, + 68412, + 68382, + 68404, + 68382, + 68397, + 68401, + 68380, + 68379, + 68393, + 68420, + 68426, + 68410, + 68413, + 68366, + 68386, + 68443, + 68424, + 68383, + 68394, + 68376, + 68376, + 68379, + 68454, + 68386, + 68386, + 68400, + 68389, + 68394, + 68365, + 68442, + 68413, + 68392, + 68395, + 68370, + 68406, + 68392, + 68385, + 79754, + 69614, + 70806, + 70790, + 70900, + 70788, + 70822, + 70826, + 70817, + 70853, + 70830, + 70783, + 70796, + 70799, + 68403, + 68437, + 68414, + 68421, + 68380, + 68403, + 68366, + 68421, + 68397, + 68400, + 68386, + 68399, + 68415, + 68415, + 68385, + 68405, + 68377, + 68412, + 68374, + 68373, + 68386, + 68418, + 68383, + 68388, + 68374, + 68374, + 68404, + 68417, + 68409, + 68378, + 68381, + 68405, + 68402, + 68399, + 68347, + 68396, + 68414, + 68415, + 68393, + 68408, + 68404, + 68417, + 68398, + 68413, + 68430, + 68366, + 68395, + 68410, + 68400, + 68435, + 68436, + 68401, + 68374, + 68443, + 68392, + 68446, + 68419, + 68403, + 68359, + 68375, + 68390, + 68397, + 68415, + 68429, + 68360, + 68406, + 68386, + 68403, + 68396, + 68374, + 68406, + 68382, + 68408, + 68408, + 68421, + 68449, + 68407, + 68385, + 68380, + 68405, + 68433, + 68436, + 68404, + 68399, + 68415, + 68380, + 68415, + 68422, + 68390, + 68404, + 68393, + 68373, + 68389, + 68402, + 68378, + 68407, + 68432, + 68443, + 68401, + 68402, + 68393, + 68418, + 68443, + 68359, + 68415, + 68396, + 68394, + 68404, + 68415, + 68395, + 68402, + 68374, + 68360, + 68419, + 68378, + 68411, + 68407, + 68370, + 68426, + 68387, + 68373, + 68435, + 68390, + 68409, + 68369, + 68405, + 68400, + 68436, + 68421, + 68387, + 68380, + 68380, + 68410, + 68413, + 68401, + 68424, + 68388, + 68408, + 68379, + 68377, + 68396, + 68407, + 68397, + 68407, + 68416, + 68388, + 68423, + 68401, + 68388, + 68361, + 68359, + 68451, + 68406, + 68397, + 68372, + 68399, + 68378, + 68393, + 68390, + 68393, + 68399, + 68415, + 68390, + 68392, + 68373, + 68405, + 68398, + 68395, + 75008, + 68414, + 68403, + 68413, + 68375, + 68419, + 68416, + 68386, + 68405, + 68400, + 68402, + 68371, + 68383, + 68412, + 68409, + 68392, + 68354, + 68392, + 68428, + 68396, + 68418, + 68405, + 68359, + 68405, + 68422, + 68380, + 68395, + 68408, + 68383, + 68402, + 68425, + 68394, + 68389, + 68388, + 68373, + 68392, + 68405, + 68389, + 68381, + 68401, + 68397, + 68418, + 68406, + 68409, + 68429, + 68414, + 68403, + 68387, + 68378, + 68378, + 68425, + 68388, + 68400, + 68402, + 68394, + 68422, + 68400, + 68388, + 68382, + 68393, + 68393, + 68408, + 68418, + 68399, + 68412, + 68376, + 68438, + 68396, + 68418, + 68388, + 68427, + 68370, + 68401, + 68407, + 68386, + 68389, + 68371, + 68394, + 68376, + 68371, + 68418, + 68394, + 68405, + 68413, + 68426, + 68413, + 68382, + 68404, + 68380, + 68433, + 68382, + 68442, + 68406, + 68425, + 68411, + 68379, + 68381, + 68412, + 68432, + 68385, + 68369, + 68379, + 68402, + 68387, + 68428, + 68405, + 68359, + 68413, + 68400, + 68386, + 68440, + 68367, + 68404, + 68398, + 68412, + 68384, + 68391, + 68398, + 68381, + 68413, + 68397, + 68439, + 68420, + 68392, + 68394, + 68414, + 68392, + 68379, + 68419, + 68415, + 68382, + 68415, + 68380, + 68395, + 68402, + 68421, + 68417, + 68400, + 68400, + 68377, + 68406, + 68390, + 68395, + 68399, + 68369, + 68385, + 68431, + 68384, + 68389, + 68408, + 68364, + 68414, + 68404, + 68413, + 68394, + 68411, + 68412, + 68407, + 68439, + 68392, + 68395, + 68416, + 68412, + 68410, + 68429, + 68409, + 68452, + 68417, + 68404, + 68388, + 68417, + 68473, + 68384, + 68381, + 68442, + 68384, + 68418, + 68386, + 68373, + 68440, + 68418, + 68414, + 68375, + 68414, + 68393, + 68385, + 68411, + 68367, + 68398, + 68426, + 68375, + 68400, + 68380, + 68400, + 68387, + 68396, + 68419, + 68421, + 68375, + 68366, + 68380, + 68394, + 68429, + 68410, + 68393, + 68377, + 68427, + 68408, + 68410, + 68398, + 68419, + 68454, + 68357, + 68403, + 68405, + 68407, + 68392, + 68381, + 68362, + 68393, + 68364, + 68383, + 68422, + 68395, + 68389, + 68396, + 68379, + 68396, + 68399, + 68421, + 68413, + 68430, + 68390, + 68379, + 68393, + 68447, + 68419, + 68414, + 68399, + 68418, + 68429, + 68400, + 68397, + 68391, + 68412, + 68407, + 68380, + 68366, + 68376, + 68389, + 68381, + 68405, + 68394, + 68417, + 68399, + 68372, + 68382, + 68397, + 68368, + 68396, + 68388, + 68405, + 68404, + 68404, + 68380, + 68385, + 68415, + 68415, + 68367, + 68392, + 68384, + 68372, + 68374, + 68381, + 68411, + 68399, + 68387, + 68404, + 68415, + 68419, + 68389, + 68412, + 68403, + 68399, + 68414, + 68416, + 68385, + 68384, + 68409, + 68397, + 68391, + 68382, + 68369, + 68422, + 68407, + 68410, + 68371, + 68444, + 68381, + 68384, + 68376, + 68414, + 68456, + 68413, + 68431, + 68383, + 68395, + 68362, + 68386, + 68417, + 68385, + 68400, + 68447, + 68416, + 68400, + 68417, + 68431, + 68440, + 68406, + 68407, + 68417, + 68438, + 68423, + 68375, + 68379, + 68438, + 68371, + 68420, + 68389, + 68420, + 68392, + 68389, + 68391, + 68401, + 68398, + 68433, + 68410, + 68370, + 68410, + 68396, + 68381, + 68390, + 68382, + 68423, + 68433, + 68412, + 68435, + 68410, + 68399, + 68444, + 68387, + 68430, + 68370, + 68398, + 68422, + 68408, + 68389, + 68395, + 68399, + 68371, + 68403, + 68395, + 68369, + 68391, + 68395, + 68407, + 68397, + 68445, + 68406, + 68427, + 68414, + 68394, + 68441, + 68390, + 68388, + 68392, + 68380, + 68385, + 68418, + 68424, + 68424, + 68406, + 68380, + 68367, + 68418, + 68413, + 68402, + 68397, + 68385, + 68414, + 68417, + 68422, + 68403, + 68415, + 68383, + 68355, + 68427, + 68374, + 68438, + 68403, + 68398, + 68374, + 68410, + 68807, + 68417, + 68428, + 68416, + 68392, + 68390, + 68422, + 68404, + 68394, + 68378, + 68384, + 68385, + 68432, + 68410, + 68379, + 68413, + 68386, + 68386, + 68410, + 68414, + 68393, + 68376, + 68444, + 68461, + 68389, + 68397, + 68418, + 68385, + 68402, + 68439, + 68399, + 68410, + 68408, + 68407, + 68391, + 68394, + 68424, + 68395, + 68389, + 68383, + 68403, + 68429, + 68415, + 68390, + 68396, + 68393, + 68398, + 68421, + 68402, + 68400, + 68405, + 68389, + 68395, + 68421, + 68387, + 68455, + 68374, + 68405, + 68393, + 68427, + 68394, + 68411, + 68390, + 68382, + 68373, + 68399, + 68412, + 68398, + 68409, + 68363, + 68409, + 68389, + 68421, + 68410, + 68410, + 68353, + 68401, + 68386, + 68401, + 68451, + 68381, + 68440, + 68394, + 68436, + 68436, + 68377, + 68427, + 68375, + 68407, + 68558, + 68389, + 68384, + 68396, + 68388, + 68401, + 68371, + 68370, + 68394, + 68397, + 68370, + 68386, + 68418, + 68390, + 68411, + 68405, + 68385, + 68435, + 68416, + 68394, + 68373, + 68349, + 68391, + 68406, + 68384, + 68387, + 68434, + 68429, + 68389, + 68426, + 68390, + 68451, + 68442, + 68452, + 68437, + 68376, + 68381, + 68385, + 68394, + 68404, + 68415, + 68420, + 68442, + 68434, + 68397, + 68403, + 68409, + 68401, + 68441, + 68377, + 68379, + 68372, + 68408, + 68412, + 68376, + 68410, + 68397, + 68388, + 68412, + 68417, + 68392, + 68449, + 68436, + 68411, + 68356, + 68403, + 68398, + 68410, + 68401, + 68396, + 68375, + 68375, + 68408, + 68421, + 68394, + 68398, + 68387, + 68410, + 68396, + 68387, + 68410, + 68402, + 68415, + 68351, + 68414, + 68438, + 68401, + 68406, + 68363, + 68399, + 68372, + 68412, + 68369, + 68426, + 68407, + 68398, + 68426, + 68367, + 68420, + 68403, + 68408, + 68399, + 68372, + 68393, + 68408, + 68394, + 68390, + 68405, + 68403, + 68402, + 68421, + 68447, + 68385, + 68408, + 68409, + 68416, + 68390, + 68388, + 68381, + 68401, + 68397, + 68379, + 68373, + 68418, + 68387, + 68398, + 68358, + 68394, + 68409, + 68379, + 68384, + 68411, + 68382, + 68429, + 68462, + 68403, + 68361, + 68421, + 68415, + 68422, + 68384, + 68391, + 68405, + 68421, + 68420, + 68371, + 68382, + 68411, + 68354, + 68393, + 68372, + 68393, + 68400, + 68399, + 68437, + 68392, + 68381, + 68410, + 68398, + 68385, + 68404, + 68422, + 68398, + 68382, + 68380, + 68412, + 68391, + 68413, + 68396, + 68418, + 68398, + 68373, + 68382, + 68420, + 68435, + 68389, + 68408, + 68420, + 68392, + 68427, + 68442, + 68417, + 68437, + 68436, + 68399, + 68427, + 68414, + 68403, + 68455, + 68425, + 68385, + 68425, + 68364, + 68416, + 68440, + 68403, + 68386, + 68384, + 68403, + 68418, + 68424, + 68419, + 68437, + 68375, + 68414, + 68491, + 68417, + 68388, + 68426, + 68499, + 68421, + 68394, + 68429, + 68402, + 68378, + 68424, + 68415, + 68426, + 68399, + 68401, + 68381, + 68402, + 68413, + 68394, + 68365, + 68448, + 68384, + 68384, + 68394, + 68394, + 68413, + 68397, + 68379, + 68420, + 68415, + 68445, + 68393, + 68388, + 68365, + 68387, + 68382, + 68376, + 68393, + 68419, + 68417, + 68388, + 68393, + 68390, + 68427, + 68396, + 68381, + 68397, + 68404, + 68424, + 68419, + 68419, + 68399, + 68375, + 68388, + 68444, + 68413, + 68381, + 68381, + 68377, + 68401, + 68388, + 68449, + 68393, + 68387, + 68402, + 68383, + 68398, + 68382, + 68393, + 68389, + 68422, + 68429, + 68382, + 68424, + 68372, + 68416, + 68389, + 68400, + 68379, + 68426, + 68417, + 68383, + 68428, + 68350, + 68398, + 68442, + 68406, + 68394, + 68407, + 68423, + 68402, + 68414, + 68396, + 68405, + 68412, + 68397, + 68442, + 68421, + 68374, + 68385, + 68400, + 68421, + 68422, + 68408, + 68402, + 68431, + 68388, + 68373, + 68417, + 68422, + 68415, + 68476, + 68433, + 68429, + 68428, + 68420, + 68413, + 68402, + 68403, + 68392, + 68418, + 68401, + 68404, + 68398, + 68415, + 68415, + 68380, + 68389, + 68379, + 68374, + 68428, + 68467, + 68405, + 68391, + 68433, + 68416, + 68410, + 68422, + 68384, + 68416, + 68391, + 68386, + 68381, + 68412, + 68394, + 68410, + 68398, + 68384, + 68410, + 68397, + 68417, + 68371, + 68398, + 68405, + 68413, + 68417, + 68420, + 68387, + 68402, + 68373, + 68383, + 68389, + 68379, + 68409, + 68389, + 68383, + 68419, + 68374, + 68430, + 68405, + 68439, + 68396, + 68398, + 68365, + 68398, + 68392, + 68411, + 68380, + 68399, + 68376, + 68380, + 68445, + 68405, + 68425, + 68426, + 68410, + 68403, + 68377, + 68381, + 68374, + 68391, + 68396, + 68417, + 68413, + 68394, + 68377, + 68374, + 68417, + 68402, + 68391, + 68391, + 68392, + 68416, + 68422, + 68429, + 68373, + 68394, + 68424, + 68407, + 68393, + 68403, + 68372, + 68388, + 68409, + 68389, + 68383, + 68417, + 68391, + 68401, + 68383, + 68386, + 68372, + 68389, + 68385, + 68397, + 68373, + 68388, + 68381, + 68439, + 68412, + 68410, + 68414, + 68401, + 68412, + 68426, + 68419, + 68410, + 68395, + 68426, + 68380, + 68403, + 68395, + 68387, + 68401, + 68407, + 68388, + 68382, + 68446, + 68397, + 68423, + 68390, + 68436, + 68411, + 68411, + 68407, + 68420, + 68404, + 68436, + 68374, + 68425, + 68364, + 68395, + 68413, + 68444, + 68415, + 68419, + 68401, + 68443, + 68461, + 68415, + 68448, + 68388, + 68428, + 68424, + 68376, + 68421, + 68389, + 68426, + 68388, + 68403, + 68426, + 68409, + 68393, + 68411, + 68407, + 68454, + 68411, + 68428, + 68391, + 68433, + 68384, + 68417, + 68432, + 68384, + 68416, + 68417, + 68379, + 68402, + 68407, + 68394, + 68424, + 68405, + 68440, + 68395, + 68392, + 68470, + 68403, + 68395, + 68405, + 68381, + 68406, + 68378, + 68421, + 68407, + 68427, + 68400, + 68394, + 68372, + 68426, + 68385, + 68393, + 68371, + 68395, + 68390, + 68392, + 68402, + 68395, + 68421, + 68385, + 68398, + 68462, + 68416, + 68382, + 68381, + 68388, + 68404, + 68386, + 68414, + 68407, + 68437, + 68384, + 68391, + 68389, + 68379, + 68441, + 68357, + 68385, + 68370, + 68399, + 68393, + 68404, + 68445, + 68402, + 68374, + 68408, + 68490, + 68406, + 68401, + 68400, + 68404, + 68413, + 68438, + 68387, + 68374, + 68401, + 68376, + 68383, + 68418, + 68388, + 68428, + 68389, + 68414, + 68419, + 68397, + 68415, + 68383, + 68421, + 68423, + 68434, + 68388, + 68411, + 68371, + 68418, + 68447, + 68392, + 68415, + 68398, + 68398, + 68369, + 68420, + 68406, + 68431, + 68416, + 68359, + 68437, + 68379, + 68371, + 68457, + 68385, + 68405, + 68374, + 68426, + 68388, + 68390, + 68409, + 68391, + 68413, + 68423, + 68394, + 68405, + 68437, + 68357, + 68402, + 68402, + 68394, + 68380, + 68434, + 68419, + 68412, + 68357, + 68404, + 68418, + 68410, + 68428, + 68418, + 68412, + 68381, + 68429, + 68383, + 68377, + 68424, + 68484, + 68447, + 68418, + 68381, + 68378, + 68452, + 68407, + 68431, + 68443, + 68413, + 68444, + 68417, + 68404, + 68401, + 68435, + 68384, + 68429, + 68406, + 68412, + 68411, + 68399, + 68412, + 68372, + 68377, + 68406, + 68414, + 68421, + 68398, + 68365, + 68413, + 68431, + 68410, + 68388, + 68397, + 68384, + 68390, + 68364, + 68425, + 68419, + 68435, + 68453, + 68414, + 68406, + 68419, + 68398, + 68393, + 68411, + 68382, + 68402, + 68410, + 68409, + 68405, + 68378, + 68397, + 68384, + 68437, + 68375, + 68375, + 68392, + 68394, + 68382, + 68400, + 68422, + 68400, + 68406, + 68404, + 68404, + 68399, + 68411, + 68476, + 68367, + 68384, + 68383, + 68395, + 68398, + 68396, + 68411, + 68410, + 68434, + 68405, + 68426, + 68385, + 68407, + 68389, + 68416, + 68392, + 68406, + 68417, + 68408, + 68422, + 68425, + 68431, + 68412, + 68416, + 68414, + 68371, + 68374, + 68387, + 68379, + 68396, + 68388, + 68411, + 68384, + 68396, + 68422, + 68411, + 68405, + 68440, + 68426, + 68375, + 68434, + 68394, + 68396, + 68392, + 68389, + 68449, + 68402, + 68387, + 68400, + 68392, + 68420, + 68393, + 68369, + 68400, + 68401, + 68405, + 68443, + 68399, + 68383, + 68389, + 68377, + 68420, + 68411, + 68401, + 68394, + 68387, + 68361, + 68391, + 68405, + 68412, + 68396, + 68396, + 68379, + 68430, + 68367, + 68404, + 68399, + 68376, + 68380, + 68401, + 68377, + 68379, + 68385, + 68383, + 68399, + 68388, + 68394, + 68383, + 68413, + 68394, + 68410, + 68409, + 68370, + 68401, + 68381, + 68398, + 68380, + 68415, + 68395, + 68385, + 68383, + 68375, + 68395, + 68362, + 68390, + 68384, + 68426, + 68377, + 68392, + 68383, + 68417, + 68385, + 68400, + 68396, + 68382, + 68425, + 68381, + 68366, + 68447, + 68433, + 68365, + 68380, + 68412, + 68396, + 68387, + 68422, + 68364, + 68398, + 68392, + 68382, + 68417, + 68396, + 68369, + 68393, + 68421, + 68384, + 68396, + 68419, + 68436, + 68409, + 68408, + 68411, + 68420, + 68402, + 68403, + 68390, + 68402, + 68403, + 68397, + 68383, + 68423, + 68413, + 68374, + 68409, + 68387, + 68412, + 68397, + 68427, + 68389, + 68390, + 68377, + 68423, + 68413, + 68379, + 68422, + 68409, + 68402, + 68433, + 68400, + 68397, + 68390, + 68404, + 68405, + 68437, + 68399, + 68356, + 68411, + 68402, + 68391, + 68382, + 68392, + 68377, + 68402, + 68415, + 68404, + 68404, + 68432, + 68379, + 68401, + 68383, + 68442, + 68406, + 68390, + 68440, + 68440, + 68444, + 68382, + 68405, + 68392, + 68402, + 68419, + 68379, + 68390, + 68386, + 68393, + 68386, + 68387, + 68395, + 68426, + 68403, + 68412, + 68402, + 68389, + 68390, + 68373, + 68421, + 68395, + 68403, + 68396, + 68407, + 68389, + 68363, + 68408, + 68405, + 68361, + 68387, + 68379, + 68375, + 68384, + 68411, + 68420, + 68404, + 68409, + 68412, + 68381, + 68410, + 68380, + 68402, + 68394, + 68449, + 68379, + 68398, + 68422, + 68423, + 68378, + 68415, + 68415, + 68393, + 68382, + 68423, + 68438, + 68377, + 68406, + 68391, + 68399, + 68398, + 68379, + 68376, + 68384, + 68428, + 68369, + 68419, + 68391, + 68411, + 68354, + 68398, + 68372, + 68380, + 68398, + 68393, + 68436, + 68393, + 68403, + 68384, + 68435, + 68403, + 68422, + 68417, + 68386, + 68382, + 68396, + 68435, + 68376, + 68406, + 68413, + 68378, + 68414, + 68419, + 68386, + 68382, + 68419, + 68367, + 68414, + 68394, + 68403, + 68397, + 68365, + 68383, + 68370, + 68397, + 68369, + 68439, + 68418, + 68387, + 68377, + 68400, + 68444, + 68429, + 68384, + 68398, + 68426, + 68384, + 68406, + 68412, + 68440, + 68391, + 68399, + 68386, + 68372, + 68404, + 68440, + 68423, + 68433, + 68403, + 68446, + 68425, + 68386, + 68396, + 68378, + 68417, + 68390, + 68397, + 68414, + 68397, + 68379, + 68439, + 68371, + 68407, + 68408, + 68408, + 68405, + 68371, + 68375, + 68384, + 68363, + 68402, + 68412, + 68413, + 68421, + 68381, + 68393, + 68403, + 68388, + 68384, + 68394, + 68376, + 68375, + 68540, + 68407, + 68390, + 68398, + 68384, + 68407, + 68397, + 68412, + 68413, + 68402, + 68409, + 68388, + 68404, + 68407, + 68409, + 68390, + 68385, + 68407, + 68369, + 68430, + 68406, + 68417, + 68382, + 68416, + 68382, + 68483, + 68412, + 68379, + 68358, + 68395, + 68391, + 68417, + 68428, + 68368, + 68421, + 68363, + 68400, + 68408 + ], + "sample_count": 15277 + }, + { + "pubkey": "6jKCEAJf7H5us4GmMickoWDDzH5vzPnMQS5KfowTuioj", + "epoch": 89, + "origin_device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "target_device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "link_pk": "YnBTcwD87rvh2zpor9PchchUo28xtgba7w88F16VhZK", + "origin_device_location_pk": "8ivCSPhAs6WwbWY5WR7GCQiChEVcK2kpoj97MugLPwcg", + "target_device_location_pk": "9nJjrDoWWbzhqLka3oHYdj2W3vr2UzUCcjoeCEQ7mAai", + "origin_device_agent_pk": "D6wvvWrosxojHYjqiEXeDmnXjMjNbQdeebGgjiqUFXLk", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242126416745, + "samples": [ + 68415, + 68408, + 68445, + 68435, + 68406, + 68436, + 68395, + 68424, + 68438, + 68408, + 68424, + 68405, + 68435, + 68434, + 68444, + 68448, + 68423, + 68379, + 68419, + 68414, + 68417, + 68414, + 68436, + 68375, + 68407, + 68438, + 68435, + 68452, + 68396, + 68425, + 68422, + 68413, + 68374, + 68406, + 68392, + 68423, + 68443, + 68413, + 68437, + 68431, + 68440, + 68463, + 68447, + 68422, + 68454, + 68435, + 68398, + 68408, + 68447, + 68391, + 68404, + 68380, + 68377, + 68393, + 68404, + 68428, + 68458, + 68433, + 68387, + 68431, + 68416, + 68380, + 68429, + 68424, + 68396, + 68430, + 68402, + 68439, + 68405, + 68433, + 68429, + 68412, + 68381, + 68440, + 68427, + 68404, + 68423, + 68419, + 68390, + 68413, + 68427, + 68432, + 68420, + 68427, + 68421, + 68391, + 68431, + 68453, + 68413, + 68366, + 68436, + 68385, + 68401, + 68394, + 68402, + 68396, + 68422, + 68421, + 68415, + 68427, + 68418, + 68429, + 68405, + 68444, + 68455, + 68442, + 68466, + 68420, + 68436, + 68426, + 68410, + 68433, + 68452, + 68416, + 68416, + 68436, + 68457, + 68450, + 68441, + 68426, + 68416, + 68437, + 68436, + 68437, + 68406, + 68431, + 68408, + 68382, + 68416, + 68407, + 68404, + 68430, + 68398, + 68416, + 68426, + 68383, + 68406, + 68446, + 68430, + 68427, + 68401, + 68475, + 68413, + 68453, + 68455, + 68395, + 68423, + 68403, + 68378, + 68408, + 68423, + 68384, + 68456, + 68436, + 68421, + 68431, + 68459, + 68442, + 68402, + 68389, + 68413, + 68421, + 68418, + 68419, + 68391, + 68413, + 68409, + 68394, + 68425, + 68409, + 68413, + 68440, + 68399, + 68413, + 68410, + 68424, + 68404, + 68406, + 68392, + 68434, + 68377, + 68405, + 68405, + 68396, + 68407, + 68424, + 68417, + 68452, + 68427, + 68437, + 68433, + 68395, + 68413, + 68436, + 68420, + 68406, + 68429, + 68411, + 68387, + 68424, + 68402, + 68396, + 68425, + 68452, + 68441, + 68436, + 68422, + 68410, + 68402, + 68392, + 68427, + 68425, + 68408, + 68384, + 68400, + 68457, + 68428, + 68428, + 68446, + 68467, + 68426, + 68559, + 68405, + 68435, + 68444, + 68387, + 68418, + 68461, + 68396, + 68414, + 68404, + 68418, + 68405, + 68422, + 68398, + 68423, + 68412, + 68360, + 68391, + 68403, + 68400, + 68397, + 68436, + 68457, + 68397, + 68451, + 68406, + 68388, + 68438, + 68402, + 68389, + 68429, + 68397, + 68447, + 68410, + 68412, + 68445, + 68389, + 68390, + 68394, + 68463, + 68432, + 68402, + 68417, + 68453, + 68427, + 68472, + 68423, + 68409, + 68437, + 68405, + 68418, + 68406, + 68454, + 68441, + 68397, + 68501, + 68452, + 68455, + 68436, + 68434, + 68428, + 68415, + 68427, + 68422, + 68415, + 68434, + 68432, + 68451, + 68419, + 68461, + 68425, + 68422, + 68401, + 68405, + 68401, + 68423, + 68412, + 68413, + 68391, + 68419, + 68410, + 68394, + 68445, + 68405, + 68462, + 68403, + 68462, + 68422, + 68401, + 68440, + 68413, + 68472, + 68405, + 68414, + 68377, + 68436, + 68426, + 68409, + 68407, + 68407, + 68419, + 68439, + 68399, + 68405, + 68434, + 68402, + 68408, + 68396, + 68439, + 68395, + 68388, + 68474, + 68352, + 68436, + 68385, + 68423, + 68407, + 68392, + 68401, + 68424, + 68431, + 68435, + 68412, + 68416, + 68418, + 68422, + 68440, + 68445, + 68405, + 68459, + 68477, + 68445, + 68388, + 68402, + 68427, + 68454, + 68408, + 68418, + 68413, + 68432, + 68442, + 68413, + 68392, + 68419, + 68435, + 68401, + 68402, + 68426, + 68412, + 68403, + 68436, + 68387, + 68413, + 68417, + 68457, + 68452, + 68425, + 68419, + 68443, + 68439, + 68422, + 68427, + 68448, + 68427, + 68419, + 68431, + 68401, + 68423, + 68436, + 68427, + 68413, + 68445, + 68406, + 68387, + 68423, + 68423, + 68431, + 68436, + 68423, + 68476, + 68448, + 68469, + 68448, + 68402, + 68443, + 68422, + 68448, + 68381, + 68407, + 68387, + 68418, + 68386, + 68453, + 68390, + 68416, + 68413, + 68401, + 68432, + 68387, + 68446, + 68403, + 68462, + 68444, + 68419, + 68445, + 68428, + 68395, + 68423, + 68437, + 68424, + 68404, + 68426, + 68432, + 68408, + 68419, + 68406, + 68426, + 68420, + 68377, + 68441, + 68440, + 68424, + 68402, + 68454, + 68399, + 68440, + 68421, + 68418, + 68415, + 68402, + 68411, + 68412, + 68441, + 68407, + 68420, + 68456, + 68424, + 68383, + 68415, + 68424, + 68423, + 68429, + 68428, + 68451, + 68428, + 68409, + 68421, + 68404, + 68417, + 68408, + 68415, + 68402, + 68386, + 68435, + 68439, + 68474, + 68422, + 68412, + 68398, + 68410, + 68414, + 68401, + 68453, + 68369, + 68405, + 68443, + 68435, + 68377, + 68427, + 68405, + 68436, + 68450, + 68402, + 68409, + 68423, + 68456, + 68399, + 68466, + 68434, + 68415, + 68443, + 68431, + 68400, + 68438, + 68428, + 68449, + 68410, + 68412, + 68441, + 68419, + 68409, + 68414, + 68419, + 68397, + 68433, + 68416, + 68410, + 68407, + 68389, + 68388, + 68393, + 68408, + 68441, + 68409, + 68376, + 68404, + 68416, + 68434, + 68401, + 68364, + 68386, + 68373, + 68405, + 68395, + 68422, + 68452, + 68447, + 68398, + 68446, + 68409, + 68384, + 68439, + 68427, + 68406, + 68397, + 68434, + 68408, + 68441, + 68385, + 68424, + 68400, + 68454, + 68441, + 68423, + 68440, + 68443, + 68436, + 68423, + 68412, + 68417, + 68410, + 68415, + 68402, + 68443, + 68437, + 68405, + 68406, + 68399, + 68408, + 68434, + 68415, + 68386, + 68406, + 68439, + 68407, + 68429, + 68408, + 68431, + 68412, + 68429, + 68434, + 68427, + 68429, + 68403, + 68440, + 68443, + 68421, + 68422, + 68419, + 68408, + 68420, + 68394, + 68422, + 68413, + 68420, + 68472, + 68458, + 68433, + 68432, + 68430, + 68473, + 68418, + 68400, + 68417, + 68397, + 68392, + 68417, + 68422, + 68418, + 68407, + 68393, + 68380, + 68395, + 68464, + 68425, + 68401, + 68432, + 68427, + 68418, + 68423, + 68394, + 68416, + 68377, + 68412, + 68437, + 68401, + 68414, + 68405, + 68377, + 68409, + 68412, + 68418, + 68406, + 68424, + 68424, + 68442, + 68381, + 68380, + 68417, + 68423, + 68399, + 68389, + 68430, + 68440, + 68405, + 68420, + 68431, + 68394, + 68421, + 68414, + 68392, + 68382, + 68405, + 68378, + 68429, + 68388, + 68436, + 68412, + 68427, + 68426, + 68427, + 68403, + 68415, + 68426, + 68380, + 68397, + 68429, + 68432, + 68435, + 68392, + 68426, + 68430, + 68453, + 68460, + 68434, + 68401, + 68403, + 68386, + 68364, + 68405, + 68410, + 68419, + 68427, + 68388, + 68374, + 68438, + 68402, + 68420, + 68424, + 68433, + 68372, + 68411, + 68403, + 68413, + 68404, + 68410, + 68390, + 68406, + 68439, + 68398, + 68399, + 68425, + 68438, + 68428, + 68434, + 68447, + 68408, + 68433, + 68453, + 68389, + 68422, + 68401, + 68422, + 68414, + 68453, + 68450, + 68404, + 68437, + 68391, + 68461, + 68408, + 68449, + 68407, + 68403, + 68413, + 68418, + 68424, + 68411, + 68427, + 68421, + 68438, + 68421, + 68390, + 68415, + 68414, + 68422, + 68418, + 68427, + 68416, + 68420, + 68413, + 68413, + 68423, + 68397, + 68387, + 68430, + 68441, + 68419, + 68436, + 68416, + 68406, + 68431, + 68430, + 68390, + 68439, + 68387, + 68419, + 68410, + 68409, + 68425, + 68442, + 68422, + 68386, + 68393, + 68409, + 68415, + 68408, + 68409, + 68413, + 68424, + 68420, + 68405, + 68432, + 68435, + 68453, + 68401, + 68377, + 68407, + 68406, + 68417, + 68415, + 68397, + 68413, + 68430, + 68379, + 68385, + 68394, + 68465, + 68431, + 68372, + 68430, + 68404, + 68409, + 68384, + 68405, + 68387, + 68394, + 68411, + 68426, + 68425, + 68419, + 68388, + 68383, + 68392, + 68389, + 68458, + 68390, + 68415, + 68450, + 68401, + 68390, + 68382, + 68413, + 68391, + 68376, + 68450, + 68413, + 68421, + 68419, + 68439, + 68411, + 68400, + 68418, + 68424, + 68442, + 68403, + 68428, + 68439, + 68426, + 68387, + 68420, + 68411, + 68434, + 68424, + 68426, + 68439, + 68396, + 68468, + 68407, + 68421, + 68413, + 68416, + 68424, + 68443, + 68406, + 68441, + 68457, + 68405, + 68419, + 68406, + 68394, + 68412, + 68420, + 68378, + 68411, + 68435, + 68396, + 68411, + 68424, + 68398, + 68414, + 68434, + 68414, + 68408, + 68420, + 68429, + 68422, + 68365, + 68432, + 68438, + 68392, + 68434, + 68409, + 68432, + 68390, + 68399, + 68421, + 68408, + 68401, + 68420, + 68390, + 68449, + 68434, + 68390, + 68357, + 68374, + 68396, + 68403, + 68419, + 68422, + 68423, + 68421, + 68450, + 68403, + 68409, + 68423, + 68436, + 68434, + 68430, + 68387, + 68430, + 68403, + 68411, + 68393, + 68459, + 68418, + 68420, + 68422, + 68420, + 68406, + 68423, + 68430, + 68391, + 68476, + 68449, + 68406, + 68389, + 68408, + 68411, + 68420, + 68407, + 68418, + 68410, + 68422, + 68418, + 68421, + 68402, + 68436, + 68382, + 68427, + 68395, + 68451, + 68435, + 68417, + 68390, + 68461, + 68426, + 68412, + 68444, + 68401, + 68427, + 68419, + 68443, + 68434, + 68395, + 68415, + 68410, + 68400, + 68411, + 68443, + 68430, + 68421, + 68441, + 68372, + 68400, + 68412, + 68451, + 68423, + 68411, + 68419, + 68432, + 68392, + 68433, + 68424, + 68436, + 68429, + 68389, + 68434, + 68412, + 68449, + 68443, + 68418, + 68419, + 68461, + 68433, + 68440, + 68399, + 68433, + 68413, + 68378, + 68433, + 68458, + 68407, + 68448, + 68456, + 68376, + 68389, + 68424, + 68424, + 68414, + 68408, + 68395, + 68409, + 68425, + 68393, + 68391, + 68409, + 68436, + 68426, + 68522, + 68412, + 68403, + 68429, + 68423, + 68406, + 68398, + 68388, + 68412, + 68437, + 68409, + 68403, + 68448, + 68410, + 68384, + 68406, + 68396, + 68432, + 68424, + 68389, + 68452, + 68446, + 68437, + 68380, + 68416, + 68403, + 68442, + 68422, + 68428, + 68423, + 68417, + 68396, + 68395, + 68414, + 68388, + 68446, + 68401, + 68421, + 68418, + 68416, + 68423, + 68416, + 68396, + 68420, + 68385, + 68418, + 68452, + 68405, + 68423, + 68431, + 68406, + 68390, + 68400, + 68415, + 68450, + 68411, + 68401, + 68383, + 68437, + 68416, + 68387, + 68420, + 68413, + 68411, + 68428, + 68407, + 68427, + 68442, + 68411, + 68375, + 68388, + 68392, + 68397, + 68411, + 68419, + 68538, + 68377, + 68443, + 68453, + 68472, + 68444, + 68435, + 68430, + 68401, + 68411, + 68411, + 68435, + 68402, + 68420, + 68427, + 68412, + 68409, + 68436, + 68414, + 68426, + 68401, + 68414, + 68400, + 68421, + 68397, + 68425, + 68440, + 68424, + 68392, + 68397, + 68460, + 68428, + 68440, + 68426, + 68423, + 68421, + 68403, + 68416, + 68401, + 68397, + 68426, + 68427, + 68418, + 68412, + 68391, + 68377, + 68418, + 68408, + 68427, + 68403, + 68407, + 68420, + 68465, + 68445, + 68446, + 68418, + 68398, + 68406, + 68398, + 68405, + 68403, + 68411, + 68436, + 68410, + 68404, + 68427, + 68412, + 68396, + 68406, + 68450, + 68385, + 68394, + 68436, + 68401, + 68406, + 68411, + 68404, + 68423, + 68433, + 68387, + 68413, + 68415, + 68446, + 68385, + 68411, + 68429, + 68434, + 68423, + 68414, + 68402, + 68409, + 68399, + 68420, + 68398, + 68418, + 68395, + 68402, + 68390, + 68414, + 68416, + 68438, + 68432, + 68417, + 68396, + 68428, + 68401, + 68426, + 68392, + 68443, + 68404, + 68432, + 68389, + 68440, + 68391, + 68411, + 68390, + 68429, + 68387, + 68463, + 68405, + 68427, + 68416, + 68394, + 68408, + 68421, + 68404, + 68407, + 68391, + 68406, + 68406, + 68443, + 68415, + 68434, + 68401, + 68419, + 68423, + 68421, + 68423, + 68407, + 68382, + 68450, + 68423, + 68373, + 68431, + 68377, + 68395, + 68388, + 68406, + 68420, + 68416, + 68421, + 68423, + 68425, + 68396, + 68415, + 68414, + 68423, + 68400, + 68388, + 68432, + 68412, + 68438, + 68442, + 68422, + 68444, + 68423, + 68434, + 68431, + 68424, + 68409, + 68408, + 68400, + 68374, + 68395, + 68450, + 68435, + 68393, + 68390, + 68423, + 68433, + 68428, + 68404, + 68396, + 68417, + 68427, + 68408, + 68381, + 68431, + 68443, + 68405, + 68450, + 68425, + 68437, + 68408, + 68410, + 68398, + 68417, + 68480, + 68406, + 68434, + 68440, + 68409, + 68422, + 68406, + 68394, + 68456, + 68444, + 68404, + 68420, + 68447, + 68422, + 68373, + 68426, + 68419, + 68389, + 68389, + 68394, + 68422, + 68382, + 68437, + 68419, + 68408, + 68422, + 68427, + 68406, + 68437, + 68409, + 68401, + 68425, + 68420, + 68421, + 68425, + 68424, + 68407, + 68419, + 68417, + 68434, + 68418, + 68380, + 68428, + 68424, + 68450, + 68433, + 68422, + 68435, + 68412, + 68444, + 68372, + 68443, + 68416, + 68415, + 68386, + 68409, + 68464, + 68418, + 68406, + 68418, + 68451, + 68428, + 68436, + 68425, + 68415, + 68385, + 68407, + 68414, + 68439, + 68417, + 68450, + 68418, + 68439, + 68371, + 68392, + 68420, + 68403, + 68414, + 68468, + 68421, + 68448, + 68473, + 68403, + 68424, + 68433, + 68395, + 68394, + 68432, + 68428, + 68376, + 68425, + 68435, + 68449, + 68390, + 68423, + 68422, + 68425, + 68432, + 68430, + 68433, + 68408, + 68436, + 68413, + 68452, + 68446, + 68385, + 68457, + 68403, + 68418, + 68426, + 68405, + 68407, + 68381, + 68420, + 68397, + 68447, + 68443, + 68416, + 68434, + 68375, + 68413, + 68426, + 68403, + 68422, + 68416, + 68412, + 68420, + 68407, + 68437, + 68404, + 68418, + 68394, + 68393, + 68416, + 68423, + 68426, + 68456, + 68407, + 68443, + 68435, + 68436, + 68437, + 68438, + 68423, + 68426, + 68404, + 68427, + 68424, + 68407, + 68413, + 68427, + 68423, + 68419, + 68410, + 68432, + 68427, + 68409, + 68386, + 68417, + 68405, + 68447, + 68410, + 68417, + 68425, + 68398, + 68461, + 68437, + 68449, + 68448, + 68420, + 68410, + 68406, + 68434, + 68408, + 68421, + 68402, + 68408, + 68437, + 68430, + 68431, + 68437, + 68417, + 68426, + 68395, + 68427, + 68417, + 68429, + 68422, + 68433, + 68423, + 68414, + 68432, + 68408, + 68422, + 68369, + 68390, + 68373, + 68379, + 68432, + 68411, + 68377, + 68405, + 68401, + 68428, + 68397, + 68380, + 68451, + 68406, + 68438, + 68437, + 68425, + 68417, + 68449, + 68437, + 68449, + 68420, + 68389, + 68391, + 68405, + 68423, + 68426, + 68430, + 68397, + 68456, + 68401, + 68428, + 68419, + 68406, + 68414, + 68406, + 68413, + 68403, + 68454, + 68407, + 68409, + 68436, + 68422, + 68437, + 68405, + 68450, + 68419, + 68457, + 68432, + 68427, + 68459, + 68427, + 68426, + 68439, + 68411, + 68442, + 68397, + 68401, + 68419, + 68626, + 68417, + 68436, + 68393, + 68449, + 68429, + 68383, + 68400, + 68423, + 68412, + 68378, + 68426, + 68426, + 68428, + 68421, + 68399, + 68442, + 68402, + 68434, + 68431, + 68414, + 68392, + 68429, + 68434, + 68398, + 68411, + 68373, + 68421, + 68446, + 68452, + 68436, + 68446, + 68423, + 68417, + 68400, + 68435, + 68470, + 68455, + 68420, + 68356, + 68421, + 68406, + 68414, + 68477, + 68419, + 68443, + 68434, + 68418, + 68444, + 68432, + 68413, + 68387, + 68427, + 68448, + 68397, + 68409, + 68431, + 68431, + 68409, + 68401, + 68414, + 68439, + 68443, + 68415, + 68408, + 68410, + 68404, + 68408, + 68409, + 68400, + 68403, + 68396, + 68439, + 68427, + 68414, + 68415, + 68415, + 68414, + 68401, + 68446, + 68431, + 68376, + 68413, + 68408, + 68431, + 68459, + 68446, + 68436, + 68407, + 68406, + 68411, + 68434, + 68409, + 68389, + 68441, + 68427, + 68416, + 68413, + 68411, + 68453, + 68416, + 68422, + 68429, + 68416, + 68411, + 68417, + 68398, + 68406, + 68450, + 68412, + 68452, + 68425, + 68424, + 68416, + 68404, + 68402, + 68422, + 68393, + 68388, + 68379, + 68456, + 68426, + 68397, + 68407, + 68437, + 68419, + 68416, + 68433, + 68409, + 68373, + 68400, + 68421, + 68460, + 68425, + 68435, + 68425, + 68423, + 68394, + 68406, + 68450, + 68440, + 68427, + 68411, + 68444, + 68443, + 68394, + 68408, + 68404, + 68405, + 68411, + 68418, + 68414, + 68420, + 68442, + 68481, + 68426, + 68416, + 68391, + 68406, + 68396, + 68419, + 68466, + 68421, + 68428, + 68439, + 68429, + 68439, + 68431, + 68419, + 68412, + 68456, + 68427, + 68397, + 68414, + 68415, + 68407, + 68437, + 68401, + 68397, + 68434, + 68467, + 68439, + 68468, + 68453, + 68430, + 68451, + 68433, + 68459, + 68434, + 68424, + 68407, + 68427, + 68449, + 68439, + 68428, + 68429, + 68424, + 68427, + 68449, + 68456, + 68400, + 68424, + 68422, + 68398, + 68427, + 68418, + 68420, + 68421, + 68413, + 68435, + 68395, + 68456, + 68456, + 68394, + 68450, + 68400, + 68437, + 68431, + 68407, + 68429, + 68430, + 68440, + 68414, + 68444, + 68403, + 68378, + 68380, + 68393, + 68436, + 68430, + 68448, + 68376, + 68449, + 68424, + 68386, + 68391, + 68442, + 68404, + 68415, + 68394, + 68396, + 68428, + 68436, + 68405, + 68413, + 68456, + 68436, + 68429, + 68402, + 68427, + 68407, + 68409, + 68390, + 68432, + 68430, + 68437, + 68437, + 68425, + 68416, + 68445, + 68401, + 68441, + 68434, + 68375, + 68438, + 68429, + 68404, + 68424, + 68393, + 68408, + 68417, + 68433, + 68408, + 68421, + 68423, + 68382, + 68418, + 68458, + 68379, + 68414, + 68444, + 68384, + 68398, + 68436, + 68377, + 68406, + 68408, + 68413, + 68489, + 68384, + 68415, + 68405, + 68413, + 68443, + 68431, + 68401, + 68427, + 68428, + 68389, + 68437, + 68429, + 68413, + 68452, + 68382, + 68431, + 68416, + 68414, + 68442, + 68401, + 68436, + 68421, + 68408, + 68396, + 68411, + 68394, + 68424, + 68424, + 68423, + 68429, + 68461, + 68413, + 68412, + 68366, + 68427, + 68439, + 68406, + 68425, + 68391, + 68462, + 68416, + 68414, + 68411, + 68385, + 68404, + 68422, + 68434, + 68370, + 68384, + 68404, + 68433, + 68421, + 68415, + 68387, + 68439, + 68384, + 68414, + 68429, + 68378, + 68406, + 68428, + 68400, + 68441, + 68410, + 68391, + 68433, + 68393, + 68399, + 68406, + 68388, + 68416, + 68415, + 68427, + 68405, + 68434, + 68442, + 68432, + 68412, + 68420, + 68406, + 68387, + 68420, + 68429, + 68397, + 68484, + 68405, + 68412, + 68495, + 68411, + 68386, + 68364, + 68413, + 68394, + 68448, + 68444, + 68440, + 68390, + 68422, + 68418, + 68396, + 68410, + 68459, + 68375, + 68392, + 68417, + 68432, + 68430, + 68407, + 68406, + 68424, + 68404, + 68455, + 68427, + 68446, + 68404, + 68412, + 68388, + 68409, + 68413, + 68410, + 68415, + 68432, + 68427, + 68444, + 68449, + 68424, + 68428, + 68414, + 68411, + 68408, + 68409, + 68441, + 68449, + 68439, + 68432, + 68423, + 68395, + 68402, + 68434, + 68431, + 68418, + 68412, + 68404, + 68444, + 68440, + 68426, + 68411, + 68395, + 68389, + 68435, + 68396, + 68433, + 68394, + 68406, + 68423, + 68454, + 68437, + 68384, + 68418, + 68411, + 68429, + 68405, + 68392, + 68414, + 68442, + 68410, + 68463, + 68485, + 68449, + 68410, + 68435, + 68443, + 68437, + 68431, + 68403, + 68444, + 68426, + 68394, + 68412, + 68418, + 68432, + 68398, + 68437, + 68415, + 68399, + 68427, + 68435, + 68437, + 68446, + 68426, + 68420, + 68444, + 68419, + 68417, + 68413, + 68448, + 68440, + 68417, + 68408, + 68399, + 68390, + 68468, + 68425, + 68404, + 68455, + 68426, + 68447, + 68439, + 68424, + 68452, + 68454, + 68447, + 68392, + 68397, + 68408, + 68405, + 68399, + 68408, + 68427, + 68426, + 68399, + 68405, + 68466, + 68409, + 68429, + 68436, + 68423, + 68397, + 68455, + 68456, + 68454, + 68435, + 68408, + 68419, + 68422, + 68411, + 68412, + 68426, + 68458, + 68378, + 68407, + 68394, + 68421, + 68438, + 68425, + 68399, + 68441, + 68438, + 68398, + 68413, + 68430, + 68414, + 68422, + 68382, + 68412, + 68398, + 68387, + 68422, + 68432, + 68443, + 68434, + 68395, + 68447, + 68392, + 68422, + 68398, + 68411, + 68418, + 68443, + 68391, + 68429, + 68411, + 68398, + 68408, + 68423, + 68432, + 68425, + 68452, + 68401, + 68404, + 68447, + 68413, + 68385, + 68426, + 68417, + 68402, + 68407, + 68456, + 68401, + 68416, + 68435, + 68386, + 68462, + 68424, + 68426, + 68425, + 68402, + 68384, + 68406, + 68413, + 68411, + 68442, + 68425, + 68424, + 68399, + 68392, + 68403, + 68416, + 68446, + 68417, + 68452, + 68431, + 68412, + 68421, + 68409, + 68415, + 68416, + 68427, + 68452, + 68434, + 68439, + 68410, + 68421, + 68433, + 68419, + 68402, + 68436, + 68436, + 68416, + 68434, + 68438, + 68469, + 68422, + 68434, + 68427, + 68408, + 68444, + 68430, + 68427, + 68414, + 68397, + 68432, + 68407, + 68401, + 68373, + 68519, + 68393, + 68409, + 68426, + 68431, + 68450, + 68439, + 68414, + 68415, + 68433, + 68405, + 68406, + 68428, + 68434, + 68392, + 68399, + 68417, + 68394, + 68391, + 68397, + 68422, + 68403, + 68408, + 68398, + 68393, + 68417, + 68431, + 68453, + 68446, + 68400, + 68429, + 68384, + 68420, + 68394, + 68422, + 68391, + 68409, + 68434, + 68408, + 68444, + 68473, + 68432, + 68407, + 68416, + 68426, + 68405, + 68441, + 68419, + 68408, + 68443, + 68371, + 68432, + 68401, + 68415, + 68417, + 68420, + 68436, + 68415, + 68390, + 68452, + 68409, + 68435, + 68424, + 68420, + 68433, + 68440, + 68441, + 68456, + 68384, + 68401, + 68387, + 68412, + 68421, + 68409, + 68408, + 68410, + 68397, + 68398, + 68388, + 68442, + 68395, + 68428, + 68427, + 68422, + 68427, + 68430, + 68409, + 68443, + 68416, + 68431, + 68413, + 68414, + 68418, + 68487, + 68396, + 68436, + 68465, + 68405, + 68430, + 68422, + 68422, + 68384, + 68459, + 68400, + 68444, + 68421, + 68428, + 68402, + 68437, + 68420, + 68405, + 68406, + 68404, + 68451, + 68446, + 68426, + 68425, + 68380, + 68445, + 68427, + 68416, + 68465, + 68443, + 68396, + 68411, + 68412, + 68414, + 68422, + 68430, + 68416, + 68391, + 68428, + 68395, + 68414, + 68434, + 68446, + 68422, + 68407, + 68411, + 68417, + 68415, + 68406, + 68418, + 68415, + 68443, + 68443, + 68408, + 68416, + 68399, + 68422, + 68432, + 68440, + 68401, + 68395, + 68414, + 68415, + 68420, + 68408, + 68423, + 68410, + 68405, + 68398, + 68423, + 68430, + 68436, + 68411, + 68402, + 68404, + 68456, + 68410, + 68449, + 68443, + 68424, + 68439, + 68422, + 68422, + 68415, + 68427, + 68408, + 68425, + 68431, + 68429, + 68442, + 68400, + 68449, + 68400, + 68411, + 68426, + 68400, + 68415, + 68428, + 68384, + 68416, + 68388, + 68406, + 68462, + 68403, + 68364, + 68404, + 68391, + 68425, + 68397, + 68437, + 68421, + 68353, + 68435, + 68436, + 68432, + 68432, + 68426, + 68423, + 68420, + 68439, + 68416, + 68439, + 68388, + 68438, + 68429, + 68405, + 68419, + 68384, + 68414, + 68421, + 68441, + 68437, + 68428, + 68438, + 68373, + 68447, + 68398, + 68418, + 68444, + 68427, + 68389, + 68424, + 68427, + 68405, + 68412, + 68402, + 68431, + 68437, + 68429, + 68399, + 68405, + 68422, + 68428, + 68410, + 68424, + 68419, + 68432, + 68447, + 68393, + 68443, + 68440, + 68422, + 68412, + 68421, + 68424, + 68443, + 68444, + 68409, + 68436, + 68430, + 68409, + 68411, + 68415, + 68430, + 68415, + 68429, + 68406, + 68409, + 68406, + 68435, + 68395, + 68419, + 68419, + 68447, + 68428, + 68423, + 68402, + 68431, + 68380, + 68438, + 68400, + 68428, + 68423, + 68425, + 68413, + 68414, + 68401, + 68395, + 68401, + 68411, + 68414, + 68427, + 68407, + 68434, + 68421, + 68379, + 68396, + 68428, + 68408, + 68455, + 68439, + 68437, + 68425, + 68416, + 68450, + 68449, + 68423, + 68413, + 68443, + 68428, + 68400, + 68399, + 68459, + 68413, + 68407, + 68387, + 68388, + 68410, + 68413, + 68409, + 68385, + 68392, + 68418, + 68407, + 68412, + 68427, + 68407, + 68436, + 68400, + 68430, + 68420, + 68379, + 68430, + 68424, + 68411, + 68425, + 68387, + 68445, + 68422, + 68415, + 68409, + 68428, + 68412, + 68387, + 68432, + 68432, + 68412, + 68418, + 68451, + 68394, + 68409, + 68389, + 68384, + 68409, + 68406, + 68447, + 68380, + 68408, + 68428, + 68442, + 68358, + 68405, + 68403, + 68418, + 68438, + 68413, + 68428, + 68449, + 68442, + 68412, + 68423, + 68399, + 68468, + 68422, + 68420, + 68373, + 68393, + 68446, + 68409, + 68416, + 68427, + 68423, + 68416, + 68430, + 68405, + 68428, + 68417, + 68428, + 68450, + 68427, + 68416, + 68419, + 68415, + 68421, + 68441, + 68412, + 68445, + 68422, + 68410, + 68426, + 68392, + 68472, + 68420, + 68402, + 68413, + 68455, + 68422, + 68418, + 68450, + 68406, + 68392, + 68404, + 68422, + 68404, + 68437, + 68405, + 68397, + 68431, + 68442, + 68426, + 68389, + 68411, + 68410, + 68396, + 68456, + 68471, + 68471, + 68448, + 68410, + 68420, + 68402, + 68433, + 68442, + 68425, + 68431, + 68456, + 68413, + 68416, + 68449, + 68423, + 68398, + 68459, + 68409, + 68379, + 68412, + 68390, + 68409, + 68408, + 68413, + 68411, + 68367, + 68423, + 68398, + 68433, + 68453, + 68416, + 68447, + 68442, + 68449, + 68392, + 68419, + 68413, + 68454, + 68431, + 68412, + 68392, + 68468, + 68425, + 68416, + 68456, + 68423, + 68375, + 68414, + 68399, + 68412, + 68420, + 68392, + 68397, + 68416, + 68418, + 68413, + 68397, + 68357, + 68434, + 68420, + 68421, + 68388, + 68402, + 68441, + 68434, + 68405, + 68415, + 68403, + 68412, + 68397, + 68450, + 68372, + 68435, + 68460, + 68448, + 68433, + 68399, + 68405, + 68381, + 68427, + 68418, + 68430, + 68401, + 68423, + 68417, + 68393, + 68412, + 68410, + 68412, + 68411, + 68415, + 68437, + 68436, + 68418, + 68396, + 68419, + 68435, + 68418, + 68414, + 68455, + 68440, + 68454, + 68437, + 68414, + 68440, + 68435, + 68403, + 68428, + 68417, + 68396, + 68441, + 68402, + 68399, + 68432, + 68464, + 68419, + 68404, + 68407, + 68377, + 68415, + 68412, + 68401, + 68423, + 68432, + 68423, + 68401, + 68417, + 68444, + 68400, + 68416, + 68449, + 68427, + 68437, + 68407, + 68411, + 68405, + 68435, + 68388, + 68398, + 68426, + 68389, + 68378, + 68412, + 68402, + 68417, + 68405, + 68424, + 68398, + 68433, + 68409, + 68405, + 68397, + 68383, + 68387, + 68434, + 68408, + 68411, + 68387, + 68438, + 68425, + 68428, + 68395, + 68400, + 68462, + 68425, + 68384, + 68420, + 68406, + 68395, + 68451, + 68419, + 68385, + 68381, + 68379, + 68414, + 68389, + 68504, + 68393, + 68454, + 68424, + 68417, + 68406, + 68398, + 68468, + 68447, + 68402, + 68438, + 68461, + 68438, + 68425, + 68416, + 68397, + 68412, + 68406, + 68401, + 68421, + 68410, + 68419, + 68436, + 68467, + 68457, + 68429, + 68448, + 68461, + 68432, + 68442, + 68413, + 68437, + 68446, + 68412, + 68417, + 68417, + 68427, + 68442, + 68377, + 68422, + 68402, + 68421, + 68443, + 68416, + 68431, + 68453, + 68409, + 68450, + 68437, + 68391, + 68416, + 68423, + 68423, + 68380, + 68383, + 68413, + 68413, + 68418, + 68385, + 68402, + 68416, + 68404, + 68415, + 68417, + 68409, + 68405, + 68429, + 68436, + 68458, + 68445, + 68417, + 68442, + 68445, + 68427, + 68411, + 68420, + 68420, + 68448, + 68437, + 68455, + 68417, + 68437, + 68462, + 68425, + 68427, + 68422, + 68395, + 68433, + 68438, + 68438, + 68431, + 68448, + 68432, + 68436, + 68426, + 68446, + 68421, + 68445, + 68454, + 68444, + 68378, + 68425, + 68420, + 68430, + 68402, + 68433, + 68402, + 68429, + 68421, + 68413, + 68401, + 68430, + 68449, + 68435, + 68426, + 68442, + 68434, + 68414, + 68444, + 68425, + 68402, + 68426, + 68413, + 68427, + 68422, + 68376, + 68395, + 68409, + 68417, + 68416, + 68385, + 68443, + 68423, + 68389, + 68391, + 68438, + 68413, + 68457, + 68441, + 68423, + 68454, + 68407, + 68444, + 68413, + 68411, + 68417, + 68420, + 68425, + 68397, + 68387, + 68383, + 68432, + 68429, + 68445, + 68469, + 68427, + 68426, + 68452, + 68445, + 68428, + 68429, + 68413, + 68474, + 68413, + 68420, + 68409, + 68399, + 68424, + 68444, + 68399, + 68439, + 68402, + 68440, + 68409, + 68435, + 68393, + 68413, + 68420, + 68392, + 68400, + 68426, + 68408, + 68429, + 68444, + 68400, + 68386, + 68425, + 68414, + 68406, + 68375, + 68415, + 68412, + 68450, + 68440, + 68385, + 68396, + 68385, + 68440, + 68410, + 68438, + 68404, + 68416, + 68427, + 68410, + 68435, + 68421, + 68426, + 68426, + 68414, + 68398, + 68399, + 68440, + 68412, + 68454, + 68426, + 68374, + 68435, + 68440, + 68451, + 68421, + 68448, + 68419, + 68416, + 68415, + 68403, + 68399, + 68415, + 68386, + 68440, + 68417, + 68443, + 68443, + 68462, + 68431, + 68435, + 68403, + 68411, + 68414, + 68406, + 68422, + 68412, + 68419, + 68391, + 68389, + 68422, + 68418, + 68418, + 68381, + 68405, + 68422, + 68410, + 68438, + 68418, + 68444, + 68437, + 68436, + 68427, + 68410, + 68417, + 68414, + 68405, + 68404, + 68391, + 68450, + 68435, + 68422, + 68435, + 68410, + 68431, + 68462, + 68465, + 68439, + 68426, + 68433, + 68483, + 68411, + 68450, + 68394, + 68441, + 68440, + 68431, + 68431, + 68424, + 68391, + 68400, + 68415, + 68446, + 68425, + 68424, + 68400, + 68420, + 68401, + 68422, + 68395, + 68444, + 68433, + 68405, + 68398, + 68426, + 68441, + 68457, + 68451, + 68448, + 68409, + 68417, + 68408, + 68434, + 68419, + 68441, + 68421, + 68401, + 68449, + 68409, + 68495, + 68424, + 68424, + 68433, + 68400, + 68411, + 68575, + 68491, + 68423, + 68426, + 68404, + 68388, + 68371, + 68406, + 68404, + 68419, + 68448, + 68406, + 68414, + 68433, + 68450, + 68393, + 68465, + 68461, + 68445, + 68435, + 68421, + 68447, + 68421, + 68427, + 68472, + 68418, + 68382, + 68403, + 68418, + 68395, + 68420, + 68406, + 68397, + 68408, + 68414, + 68439, + 68394, + 68428, + 68453, + 68435, + 68405, + 68398, + 68457, + 68425, + 68391, + 68402, + 68449, + 68441, + 68405, + 68425, + 68438, + 68451, + 68473, + 68427, + 68421, + 68403, + 68414, + 68430, + 68406, + 68412, + 68453, + 68471, + 68395, + 68400, + 68406, + 68437, + 68384, + 68409, + 68423, + 68391, + 68388, + 68403, + 68455, + 68391, + 68415, + 68404, + 68422, + 68433, + 68434, + 68404, + 68402, + 68433, + 68420, + 68416, + 68437, + 68406, + 68386, + 68445, + 68436, + 68388, + 68433, + 68383, + 68425, + 68397, + 68442, + 68407, + 68412, + 68419, + 68413, + 68436, + 68436, + 68430, + 68410, + 68438, + 68425, + 68419, + 68413, + 68439, + 68372, + 68386, + 68407, + 68447, + 68397, + 68449, + 68431, + 68409, + 68423, + 68402, + 68453, + 68402, + 68419, + 68454, + 68454, + 68464, + 68430, + 68424, + 68426, + 68418, + 68421, + 68409, + 68442, + 68432, + 68412, + 68429, + 68429, + 68395, + 68429, + 68430, + 68387, + 68424, + 68396, + 68394, + 68414, + 68408, + 68411, + 68393, + 68387, + 68429, + 68423, + 68407, + 68429, + 68409, + 68416, + 68413, + 68417, + 68406, + 68442, + 68400, + 68425, + 68421, + 68459, + 68444, + 68414, + 68415, + 68398, + 68419, + 68415, + 68408, + 68425, + 68396, + 68469, + 68422, + 68473, + 68407, + 68421, + 68436, + 68406, + 68399, + 68405, + 68414, + 68442, + 68430, + 68406, + 68406, + 68430, + 68417, + 68432, + 68394, + 68391, + 68419, + 68427, + 68498, + 68404, + 68408, + 68422, + 68420, + 68410, + 68388, + 68395, + 68428, + 68428, + 68434, + 68455, + 68435, + 68458, + 68407, + 68474, + 68422, + 68392, + 68423, + 68390, + 68490, + 68464, + 68371, + 68442, + 68418, + 68435, + 68385, + 68449, + 68439, + 68458, + 68401, + 68414, + 68405, + 68393, + 68409, + 68436, + 68435, + 68462, + 68420, + 68437, + 68416, + 68424, + 68414, + 68402, + 68394, + 68414, + 68426, + 68432, + 68402, + 68398, + 68473, + 68415, + 68408, + 68435, + 68432, + 68411, + 68416, + 68426, + 68431, + 68451, + 68448, + 68418, + 68369, + 68463, + 68420, + 68416, + 68410, + 68455, + 68415, + 68435, + 68428, + 68389, + 68445, + 68443, + 68436, + 68444, + 68422, + 68442, + 68418, + 68385, + 68401, + 68391, + 68422, + 68429, + 68403, + 68426, + 68414, + 68418, + 68391, + 68413, + 68447, + 68420, + 68430, + 68417, + 68437, + 68409, + 68412, + 68398, + 68414, + 68429, + 68433, + 68415, + 68410, + 68451, + 68434, + 68459, + 68404, + 68438, + 68409, + 68460, + 68441, + 68398, + 68413, + 68396, + 68403, + 68400, + 68468, + 68412, + 68439, + 68402, + 68397, + 68379, + 68447, + 68432, + 68419, + 68422, + 68404, + 68404, + 68376, + 68408, + 68396, + 68414, + 68393, + 68424, + 68381, + 68408, + 68415, + 68431, + 68392, + 68409, + 68421, + 68430, + 68418, + 68390, + 68443, + 68425, + 68385, + 68485, + 68432, + 68393, + 68428, + 68409, + 68415, + 68443, + 68415, + 68424, + 68415, + 68434, + 68409, + 68424, + 68386, + 68425, + 68437, + 68414, + 68402, + 68438, + 68407, + 68393, + 68436, + 68420, + 68435, + 68442, + 68422, + 68372, + 68417, + 68422, + 68393, + 68385, + 68438, + 68392, + 68401, + 68440, + 68419, + 68386, + 68422, + 68408, + 68390, + 68423, + 68416, + 68443, + 68407, + 68408, + 68426, + 68383, + 68396, + 68425, + 68429, + 68416, + 68392, + 68412, + 68439, + 68423, + 68376, + 68425, + 68407, + 68428, + 68451, + 68437, + 68385, + 68412, + 68431, + 68403, + 68431, + 68399, + 68417, + 68391, + 68429, + 68387, + 68414, + 68433, + 68416, + 68416, + 68432, + 68426, + 68403, + 68393, + 68419, + 68410, + 68391, + 68393, + 68391, + 68430, + 68441, + 68466, + 68445, + 68416, + 68454, + 68407, + 68413, + 68417, + 68413, + 68409, + 68418, + 68409, + 68411, + 68386, + 68402, + 68435, + 68442, + 68425, + 68428, + 68423, + 68420, + 68406, + 68392, + 68389, + 68414, + 68426, + 68389, + 68392, + 68415, + 68433, + 68396, + 68399, + 68442, + 68424, + 68401, + 68421, + 68411, + 68434, + 68431, + 68416, + 68398, + 68443, + 68457, + 68420, + 68415, + 68403, + 68429, + 68447, + 68417, + 68447, + 68420, + 68439, + 68422, + 68438, + 68420, + 69164, + 68433, + 68429, + 68395, + 68420, + 68423, + 68401, + 68371, + 68397, + 68429, + 68426, + 68429, + 68418, + 68450, + 68414, + 68428, + 68431, + 68404, + 68403, + 68380, + 68384, + 68423, + 68440, + 68425, + 68403, + 68422, + 68427, + 68397, + 68414, + 68434, + 68430, + 68397, + 68388, + 68426, + 68418, + 68433, + 68416, + 68420, + 68414, + 68417, + 68417, + 68410, + 68400, + 68404, + 68436, + 68385, + 68404, + 68396, + 68422, + 68396, + 68413, + 68450, + 68403, + 68390, + 68395, + 68413, + 68408, + 68391, + 68412, + 68413, + 68445, + 68436, + 68424, + 68413, + 68403, + 68395, + 68461, + 68427, + 68422, + 68408, + 68421, + 68409, + 68396, + 68394, + 68416, + 68392, + 68420, + 68390, + 68394, + 68403, + 68412, + 68421, + 68415, + 68392, + 68415, + 68396, + 68421, + 68403, + 68430, + 68428, + 68404, + 68402, + 68376, + 68426, + 68442, + 68427, + 68412, + 68408, + 68429, + 68389, + 68405, + 68433, + 68459, + 68400, + 68418, + 68391, + 68389, + 68412, + 68428, + 68438, + 68467, + 68413, + 68410, + 68409, + 68417, + 68383, + 68412, + 68426, + 68419, + 68403, + 68409, + 68401, + 68408, + 68417, + 68436, + 68402, + 68378, + 68397, + 68401, + 68390, + 68420, + 68403, + 68407, + 68391, + 68426, + 68405, + 68443, + 68400, + 68410, + 68397, + 68404, + 68422, + 68412, + 68402, + 68444, + 68413, + 68447, + 68431, + 68413, + 68379, + 68405, + 68392, + 68434, + 68404, + 68430, + 68423, + 68435, + 68422, + 68426, + 68453, + 68457, + 68401, + 68417, + 68420, + 68411, + 68391, + 68435, + 68392, + 68415, + 68428, + 68459, + 68408, + 68425, + 68410, + 68426, + 68421, + 68400, + 68427, + 68402, + 68397, + 68411, + 68366, + 68428, + 68414, + 68413, + 68413, + 68422, + 68441, + 68394, + 68402, + 68402, + 68410, + 68414, + 68412, + 68420, + 68425, + 68432, + 68408, + 68415, + 68411, + 68461, + 68467, + 68414, + 68432, + 68432, + 68409, + 68386, + 68466, + 68412, + 68454, + 68459, + 68400, + 68429, + 68421, + 68427, + 68419, + 68411, + 68447, + 68427, + 68400, + 68413, + 68434, + 68430, + 68424, + 68392, + 68432, + 68437, + 68433, + 68462, + 68425, + 68456, + 68467, + 68442, + 68421, + 68434, + 68379, + 68412, + 68418, + 68441, + 68453, + 68429, + 68429, + 68421, + 68498, + 68408, + 68404, + 68441, + 68469, + 68428, + 68450, + 68445, + 68439, + 68441, + 68442, + 68396, + 68404, + 68426, + 68419, + 68460, + 68459, + 68451, + 68408, + 68448, + 68394, + 68435, + 68427, + 68429, + 68445, + 68438, + 68442, + 68422, + 68383, + 68448, + 68404, + 68422, + 68419, + 68449, + 68402, + 68399, + 68432, + 68416, + 68412, + 68416, + 68444, + 68419, + 68426, + 68389, + 68443, + 68434, + 68415, + 68445, + 68438, + 68441, + 68414, + 68439, + 68430, + 68458, + 68444, + 68451, + 68408, + 68430, + 68451, + 68432, + 68396, + 68410, + 68415, + 68455, + 68430, + 68393, + 68404, + 68498, + 68406, + 68413, + 68417, + 68388, + 68364, + 68396, + 68395, + 68432, + 68382, + 68390, + 68426, + 68376, + 68429, + 68423, + 68413, + 68415, + 68454, + 68425, + 68405, + 68430, + 68420, + 68411, + 68406, + 68442, + 68423, + 68419, + 68389, + 68413, + 68407, + 68477, + 68421, + 68488, + 68392, + 68418, + 68402, + 68420, + 68426, + 68469, + 68413, + 68436, + 68411, + 68440, + 68422, + 68437, + 68405, + 68381, + 68430, + 68423, + 68433, + 68417, + 68398, + 68414, + 68407, + 68397, + 68424, + 68397, + 68414, + 68369, + 68392, + 68460, + 68451, + 68420, + 68412, + 68418, + 68449, + 68421, + 68448, + 68404, + 68414, + 68436, + 68405, + 68416, + 68429, + 68412, + 68411, + 68398, + 68457, + 68452, + 68423, + 68409, + 68439, + 68423, + 68392, + 68432, + 68402, + 68394, + 68416, + 68419, + 68376, + 68429, + 68420, + 68412, + 68436, + 68375, + 68429, + 68398, + 68432, + 68386, + 68400, + 68420, + 68502, + 68395, + 68394, + 68412, + 68429, + 68435, + 68425, + 68439, + 68441, + 68401, + 68380, + 68382, + 68428, + 68382, + 68417, + 68422, + 68427, + 68414, + 68393, + 68409, + 68409, + 68403, + 68404, + 68398, + 68404, + 68467, + 68416, + 68431, + 68429, + 68407, + 68447, + 68433, + 68407, + 68384, + 68388, + 68419, + 68392, + 68406, + 68430, + 68438, + 68434, + 68414, + 68403, + 68421, + 68415, + 68402, + 68412, + 68392, + 68412, + 68419, + 68386, + 68416, + 68432, + 68412, + 68409, + 68437, + 68405, + 68406, + 68480, + 68425, + 68473, + 68431, + 68407, + 68426, + 68424, + 68442, + 68427, + 68476, + 68419, + 68446, + 68432, + 68419, + 68427, + 68406, + 68435, + 68418, + 68452, + 68441, + 68437, + 68461, + 68424, + 68421, + 68409, + 68444, + 68452, + 68422, + 68453, + 68519, + 68449, + 68434, + 68443, + 68415, + 68405, + 68431, + 68392, + 68377, + 68416, + 68406, + 68441, + 68474, + 68429, + 68406, + 68438, + 68399, + 68447, + 68451, + 68399, + 68410, + 68399, + 68424, + 68405, + 68383, + 68400, + 68421, + 68453, + 68413, + 68418, + 68436, + 68455, + 68391, + 68408, + 68430, + 68414, + 68429, + 68397, + 68443, + 68450, + 68425, + 68398, + 68422, + 68421, + 68446, + 68437, + 68413, + 68405, + 68430, + 68398, + 68408, + 68410, + 68405, + 68381, + 68388, + 68438, + 68428, + 68375, + 68438, + 68436, + 68432, + 68409, + 68411, + 68415, + 68398, + 68445, + 68430, + 68385, + 68448, + 68402, + 68438, + 68384, + 68411, + 68421, + 68431, + 68409, + 68403, + 68407, + 68483, + 68439, + 68410, + 68432, + 68404, + 68388, + 68381, + 68399, + 68416, + 68409, + 68435, + 68424, + 68426, + 68395, + 68427, + 68401, + 68390, + 68387, + 68418, + 68420, + 68384, + 68449, + 68437, + 68437, + 68403, + 68415, + 68412, + 68424, + 68416, + 68393, + 68437, + 68406, + 68375, + 68426, + 68376, + 68414, + 68391, + 68418, + 68389, + 68401, + 68463, + 68410, + 68420, + 68401, + 68435, + 68434, + 68460, + 68434, + 68437, + 68405, + 68426, + 68410, + 68404, + 68416, + 68410, + 68424, + 68410, + 68446, + 68415, + 68401, + 68478, + 68466, + 68462, + 68430, + 68399, + 68392, + 68425, + 68431, + 68431, + 68405, + 68433, + 68430, + 68401, + 68390, + 68397, + 68371, + 68412, + 68405, + 68450, + 68439, + 68428, + 68427, + 68427, + 68408, + 68423, + 68408, + 68397, + 68444, + 68441, + 68436, + 68418, + 68396, + 68427, + 68419, + 68442, + 68437, + 68410, + 68389, + 68416, + 68424, + 68450, + 68410, + 68445, + 68384, + 68410, + 68422, + 68419, + 68402, + 68406, + 68503, + 68413, + 68421, + 68429, + 68373, + 68434, + 68419, + 68418, + 68424, + 68427, + 68411, + 68411, + 68420, + 68424, + 68406, + 68399, + 68419, + 68430, + 68397, + 68436, + 68411, + 68456, + 68448, + 68462, + 68384, + 68401, + 68413, + 68405, + 68407, + 68423, + 68407, + 68430, + 68414, + 68420, + 68417, + 68451, + 68434, + 68418, + 68460, + 68414, + 68384, + 68442, + 68394, + 68433, + 68520, + 68453, + 68406, + 68372, + 68400, + 68427, + 68438, + 68416, + 68453, + 68406, + 68432, + 68413, + 68395, + 68416, + 68402, + 68441, + 68417, + 68402, + 68440, + 68465, + 68449, + 68440, + 68422, + 68415, + 68411, + 68417, + 68427, + 68418, + 68413, + 68389, + 68459, + 68411, + 68426, + 68432, + 68400, + 68396, + 68436, + 68420, + 68399, + 68430, + 68445, + 68388, + 68404, + 68430, + 68455, + 68430, + 68460, + 68373, + 68416, + 68427, + 68418, + 68427, + 68422, + 68416, + 68424, + 68451, + 68421, + 68408, + 68420, + 68416, + 68399, + 68425, + 68419, + 68430, + 68404, + 68420, + 68430, + 68443, + 68424, + 68441, + 68404, + 68419, + 68407, + 68411, + 68387, + 68416, + 68421, + 68396, + 68417, + 68436, + 68410, + 68392, + 68411, + 68403, + 68423, + 68431, + 68426, + 68413, + 68474, + 68421, + 68478, + 68402, + 68411, + 68448, + 68469, + 68401, + 68394, + 68389, + 68429, + 68410, + 68435, + 68413, + 68443, + 68439, + 68416, + 68462, + 68433, + 68442, + 68435, + 68418, + 68421, + 68412, + 68426, + 68433, + 68406, + 68413, + 68420, + 68420, + 68418, + 68393, + 68437, + 68433, + 68413, + 68437, + 68427, + 68397, + 68437, + 68423, + 68420, + 68424, + 68431, + 68416, + 68387, + 68417, + 68407, + 68439, + 68412, + 68426, + 68448, + 68410, + 68383, + 68405, + 68408, + 68423, + 68433, + 68395, + 68410, + 68427, + 68377, + 68405, + 68398, + 68410, + 68400, + 68398, + 68476, + 68405, + 68406, + 68428, + 68421, + 68448, + 68418, + 68381, + 68399, + 68442, + 68395, + 68483, + 68448, + 68444, + 68388, + 68423, + 68407, + 68447, + 68458, + 68446, + 68411, + 68437, + 68411, + 68432, + 68429, + 68446, + 68382, + 68416, + 68404, + 68412, + 68425, + 68408, + 68405, + 68441, + 68425, + 68436, + 68417, + 68431, + 68400, + 68423, + 68414, + 68420, + 68406, + 68427, + 68421, + 68420, + 68417, + 68428, + 68442, + 68435, + 68396, + 68427, + 68423, + 68454, + 68430, + 68428, + 68442, + 68404, + 68399, + 68424, + 68390, + 68405, + 68441, + 68399, + 68392, + 68415, + 68397, + 68388, + 68409, + 68414, + 68411, + 68394, + 68390, + 68374, + 68393, + 68415, + 68436, + 68431, + 68387, + 68414, + 68428, + 68444, + 68461, + 68409, + 68417, + 68502, + 68396, + 68402, + 68431, + 68440, + 68403, + 68410, + 68434, + 68386, + 68418, + 68418, + 68426, + 68436, + 68416, + 68422, + 68400, + 68447, + 68441, + 68398, + 68424, + 68432, + 68425, + 68400, + 68396, + 68432, + 68445, + 68438, + 68420, + 68473, + 68410, + 68412, + 68458, + 68457, + 68394, + 68422, + 68451, + 68391, + 68414, + 68472, + 68397, + 68438, + 68405, + 68502, + 68421, + 68437, + 68403, + 68436, + 68421, + 68426, + 68410, + 68398, + 68436, + 68430, + 68403, + 68390, + 68402, + 68400, + 68432, + 68453, + 68477, + 68425, + 68411, + 68418, + 68410, + 68427, + 68411, + 68422, + 68394, + 68421, + 68423, + 68438, + 68435, + 68429, + 68431, + 68422, + 68364, + 68410, + 68417, + 68421, + 68436, + 68394, + 68393, + 68400, + 68403, + 68462, + 68457, + 68431, + 68422, + 68378, + 68404, + 68420, + 68421, + 68410, + 68452, + 68385, + 68415, + 68428, + 68362, + 68448, + 68395, + 68412, + 68405, + 68386, + 68455, + 68445, + 68419, + 68417, + 68428, + 68433, + 68426, + 68427, + 68383, + 68407, + 68429, + 68419, + 68428, + 68430, + 68416, + 68419, + 68414, + 68419, + 68383, + 68425, + 68461, + 68444, + 68425, + 68443, + 68410, + 68454, + 68423, + 68428, + 68427, + 68396, + 68398, + 68383, + 68424, + 68389, + 68404, + 68387, + 68429, + 68424, + 68407, + 68393, + 68408, + 68409, + 68458, + 68423, + 68416, + 68432, + 68414, + 68395, + 68400, + 68412, + 68417, + 68405, + 68372, + 68431, + 68424, + 68436, + 68470, + 68430, + 68435, + 68416, + 68423, + 68439, + 68453, + 68416, + 68428, + 68417, + 68402, + 68439, + 68407, + 68389, + 68429, + 68407, + 68431, + 68447, + 68428, + 68396, + 68424, + 68423, + 68381, + 68479, + 68430, + 68445, + 68440, + 68423, + 68413, + 68432, + 68439, + 68432, + 68414, + 68421, + 68399, + 68422, + 68450, + 68429, + 68400, + 68449, + 68385, + 68410, + 68402, + 68410, + 68462, + 68418, + 68400, + 68420, + 68426, + 68443, + 68421, + 68418, + 68416, + 68403, + 68417, + 68396, + 68404, + 68408, + 68378, + 68470, + 68423, + 68428, + 68385, + 68425, + 68411, + 68409, + 68399, + 68858, + 68449, + 68408, + 68420, + 68413, + 68388, + 68405, + 68408, + 68419, + 68410, + 68439, + 68433, + 68430, + 68419, + 68429, + 68428, + 68440, + 68408, + 68432, + 68406, + 68426, + 68409, + 68392, + 68398, + 68387, + 68400, + 68402, + 68401, + 68406, + 68436, + 68444, + 68377, + 68403, + 68420, + 68419, + 68413, + 68439, + 68432, + 68417, + 68460, + 68423, + 68387, + 68416, + 68370, + 68411, + 68429, + 68462, + 68434, + 68419, + 68384, + 68413, + 68398, + 68460, + 68403, + 68387, + 68416, + 68414, + 68411, + 68400, + 68429, + 68399, + 68428, + 68415, + 68413, + 68439, + 68408, + 68443, + 68410, + 68420, + 68421, + 68399, + 68430, + 68407, + 68391, + 68433, + 68564, + 68416, + 68444, + 68427, + 68404, + 68419, + 68417, + 68438, + 68414, + 68414, + 68415, + 68411, + 68449, + 68405, + 68416, + 68392, + 68418, + 68417, + 68379, + 68409, + 68411, + 68379, + 68375, + 68396, + 68431, + 68412, + 68380, + 68423, + 68402, + 68427, + 68393, + 68392, + 68435, + 68401, + 68427, + 68443, + 68409, + 68445, + 68421, + 68387, + 68414, + 68417, + 68396, + 68447, + 68438, + 68419, + 68434, + 68410, + 68425, + 68420, + 68409, + 68436, + 68435, + 68423, + 68450, + 68398, + 68466, + 68377, + 68412, + 68871, + 68409, + 68396, + 68406, + 68413, + 68384, + 68409, + 68437, + 68406, + 68424, + 68377, + 68423, + 68410, + 68398, + 68371, + 68373, + 68426, + 68441, + 68393, + 68387, + 68402, + 68393, + 68490, + 68436, + 68388, + 68441, + 68402, + 68378, + 68397, + 68409, + 68390, + 68414, + 68393, + 68451, + 68441, + 68387, + 68421, + 68377, + 68435, + 68412, + 68408, + 68398, + 68393, + 68403, + 68428, + 68396, + 68429, + 68403, + 68410, + 68404, + 68430, + 68415, + 68401, + 68399, + 68415, + 68427, + 68417, + 68431, + 68394, + 68412, + 68405, + 68436, + 68385, + 68411, + 68422, + 68412, + 68396, + 68404, + 68407, + 68454, + 68401, + 68396, + 68402, + 68430, + 68393, + 68397, + 68417, + 68415, + 68408, + 68413, + 68448, + 68386, + 68410, + 68419, + 68414, + 68416, + 68401, + 68412, + 68415, + 68401, + 68403, + 68431, + 68423, + 68440, + 68416, + 68450, + 68396, + 68383, + 68422, + 68383, + 68396, + 68390, + 68370, + 68451, + 68370, + 68393, + 68415, + 68410, + 68431, + 68450, + 68414, + 68432, + 68409, + 68420, + 68424, + 68428, + 68407, + 68421, + 68430, + 68386, + 68428, + 68433, + 68420, + 68433, + 68425, + 68388, + 68423, + 68418, + 68407, + 68412, + 68414, + 68384, + 68564, + 68420, + 68389, + 68402, + 68388, + 68399, + 68425, + 68421, + 68438, + 68441, + 68426, + 68428, + 68425, + 68424, + 68408, + 68380, + 68466, + 68398, + 68420, + 68402, + 68429, + 68401, + 68445, + 68428, + 68434, + 68421, + 68437, + 68407, + 68431, + 68435, + 68432, + 68429, + 68440, + 68389, + 68418, + 68442, + 68391, + 68393, + 68388, + 68387, + 68447, + 68406, + 68427, + 68405, + 68426, + 68454, + 68407, + 68432, + 68447, + 68434, + 68430, + 68439, + 68446, + 68428, + 68411, + 68428, + 68450, + 68395, + 68405, + 68399, + 68416, + 68410, + 68404, + 68436, + 68429, + 68405, + 68416, + 68420, + 68389, + 68429, + 68407, + 68395, + 68420, + 68405, + 68422, + 68412, + 68400, + 68418, + 68412, + 68411, + 68449, + 68382, + 68428, + 68455, + 68393, + 68429, + 68437, + 68469, + 68456, + 68450, + 68380, + 68432, + 68420, + 68392, + 68428, + 68378, + 68396, + 68404, + 68358, + 68386, + 68429, + 68439, + 68432, + 68413, + 68420, + 68396, + 68419, + 68390, + 68460, + 68418, + 68429, + 68408, + 68424, + 68412, + 68442, + 68446, + 68404, + 68437, + 68439, + 68408, + 68423, + 68434, + 68386, + 68400, + 68408, + 68401, + 68421, + 68427, + 68400, + 68400, + 68416, + 68432, + 68421, + 68423, + 68411, + 68397, + 68387, + 68412, + 68420, + 68411, + 68376, + 68382, + 68419, + 68413, + 68399, + 68386, + 68387, + 68402, + 68395, + 68432, + 68439, + 68451, + 68428, + 68412, + 68399, + 68426, + 68425, + 68441, + 68413, + 68420, + 68379, + 68416, + 68407, + 68435, + 68418, + 68434, + 68396, + 68397, + 68400, + 68409, + 68404, + 68436, + 68399, + 68404, + 68407, + 68425, + 68411, + 68430, + 68446, + 68420, + 68382, + 68403, + 68397, + 68447, + 68422, + 68414, + 68427, + 68392, + 68393, + 68386, + 68433, + 68391, + 68411, + 68425, + 68394, + 68416, + 68422, + 68408, + 68393, + 68411, + 68470, + 68407, + 68434, + 68386, + 68383, + 68461, + 68398, + 68412, + 68427, + 68435, + 68422, + 68414, + 68443, + 68368, + 68411, + 68386, + 68384, + 68411, + 68418, + 68438, + 68399, + 68420, + 68411, + 68424, + 68432, + 68413, + 68445, + 68428, + 68413, + 68426, + 68395, + 68381, + 68383, + 68401, + 68420, + 68435, + 68428, + 68435, + 68418, + 68359, + 68421, + 68397, + 68422, + 68450, + 68505, + 68411, + 68395, + 68424, + 68379, + 68395, + 68402, + 68442, + 68418, + 68364, + 68429, + 68424, + 68435, + 68420, + 68417, + 68444, + 68426, + 68451, + 68437, + 68424, + 68456, + 68396, + 68435, + 68433, + 68409, + 68410, + 68402, + 68401, + 68435, + 68421, + 68389, + 68447, + 68416, + 68421, + 68426, + 68405, + 68413, + 68452, + 68376, + 68381, + 68408, + 68428, + 68434, + 68430, + 68430, + 68415, + 68380, + 68404, + 68439, + 68404, + 68425, + 68380, + 68430, + 68387, + 68402, + 68397, + 68400, + 68416, + 68406, + 68419, + 68412, + 68416, + 68365, + 68419, + 68438, + 68413, + 68404, + 68413, + 68400, + 68450, + 68385, + 68399, + 68418, + 68427, + 68399, + 68393, + 68418, + 68401, + 68403, + 68444, + 68390, + 68422, + 68413, + 68437, + 68415, + 68425, + 68420, + 68428, + 68413, + 68404, + 68427, + 68422, + 68366, + 68425, + 68448, + 68400, + 68472, + 68406, + 68420, + 68385, + 68386, + 68394, + 68384, + 68441, + 68403, + 68425, + 68424, + 68404, + 68396, + 68439, + 68440, + 68450, + 68405, + 68403, + 68419, + 68422, + 68402, + 68403, + 68394, + 68415, + 68437, + 68365, + 68393, + 68410, + 68398, + 68396, + 68459, + 68409, + 68430, + 68436, + 68424, + 68433, + 68406, + 68432, + 68432, + 68430, + 68405, + 68431, + 68409, + 68428, + 68434, + 68419, + 68453, + 68400, + 68436, + 68412, + 68402, + 68396, + 68413, + 68434, + 68384, + 68412, + 68386, + 68394, + 68391, + 68397, + 68452, + 68420, + 68390, + 68396, + 68387, + 68414, + 68420, + 68426, + 68415, + 68399, + 68392, + 68434, + 68448, + 68391, + 68446, + 68399, + 68406, + 68406, + 68389, + 68387, + 68402, + 68420, + 68434, + 68416, + 68398, + 68428, + 68396, + 68429, + 68391, + 68414, + 68381, + 68387, + 68395, + 68410, + 68422, + 68398, + 68430, + 68387, + 68420, + 68443, + 68442, + 68421, + 68415, + 68422, + 68397, + 68444, + 68396, + 68415, + 68407, + 68374, + 68441, + 68405, + 68391, + 68383, + 68405, + 68415, + 68410, + 68413, + 68424, + 68442, + 68400, + 68435, + 68443, + 68430, + 68406, + 68401, + 68425, + 68415, + 68397, + 68405, + 68382, + 68414, + 68452, + 68389, + 68426, + 68444, + 68426, + 68426, + 68409, + 68410, + 68400, + 68405, + 68393, + 68384, + 68457, + 68400, + 68416, + 68404, + 68415, + 68421, + 68398, + 68424, + 68418, + 68430, + 68420, + 68424, + 68415, + 68442, + 68444, + 68438, + 68405, + 68422, + 68423, + 68438, + 68399, + 68448, + 68391, + 68406, + 68408, + 68408, + 68375, + 68388, + 68414, + 68418, + 68404, + 68404, + 68419, + 68401, + 68423, + 68449, + 68423, + 68392, + 68407, + 68417, + 68400, + 68414, + 68386, + 68414, + 68446, + 68409, + 68436, + 68391, + 68433, + 68429, + 68431, + 68420, + 68437, + 68433, + 68395, + 68371, + 68410, + 68389, + 68418, + 68423, + 68371, + 68398, + 68413, + 68390, + 68421, + 68445, + 68400, + 68379, + 68393, + 68432, + 68430, + 68388, + 68498, + 68407, + 68408, + 68442, + 68411, + 68415, + 68445, + 68406, + 68438, + 68387, + 68393, + 68443, + 68446, + 68382, + 68404, + 68392, + 68412, + 68428, + 68417, + 68412, + 68408, + 68419, + 68431, + 68406, + 68438, + 68425, + 68368, + 68422, + 68398, + 68444, + 68422, + 68415, + 68429, + 68393, + 68425, + 68419, + 68425, + 68408, + 68374, + 68391, + 68422, + 68425, + 68418, + 68447, + 68416, + 68429, + 68418, + 68434, + 68460, + 68412, + 68412, + 68422, + 68392, + 68468, + 68380, + 68376, + 68406, + 68412, + 68391, + 68419, + 68413, + 68414, + 68430, + 68446, + 68408, + 68398, + 68412, + 68421, + 68421, + 68424, + 68413, + 68425, + 68449, + 68458, + 68403, + 68390, + 68402, + 68430, + 68389, + 68425, + 68412, + 68424, + 68439, + 68405, + 68398, + 68412, + 68376, + 68408, + 68454, + 68406, + 68396, + 68429, + 68405, + 68430, + 68413, + 68404, + 68400, + 68424, + 68402, + 68406, + 68379, + 68488, + 68432, + 68425, + 68477, + 68409, + 68416, + 68396, + 68396, + 68392, + 68423, + 68428, + 68407, + 68442, + 68426, + 68423, + 68390, + 68430, + 68388, + 68438, + 68391, + 68450, + 68424, + 68427, + 68464, + 68407, + 68394, + 68382, + 68393, + 68434, + 68415, + 68427, + 68407, + 68388, + 68418, + 68413, + 68421, + 68397, + 68426, + 68420, + 68450, + 68394, + 68417, + 68430, + 68445, + 68423, + 68399, + 68415, + 68438, + 68425, + 68433, + 68411, + 68390, + 68403, + 68381, + 68413, + 68401, + 68459, + 68408, + 68420, + 68414, + 68411, + 68385, + 68403, + 68409, + 68415, + 68437, + 68433, + 68381, + 68395, + 68381, + 68405, + 68411, + 68395, + 68422, + 68388, + 68391, + 68369, + 68407, + 68385, + 68457, + 68390, + 68406, + 68402, + 68416, + 68411, + 68416, + 68422, + 68421, + 68417, + 68421, + 68372, + 68406, + 68425, + 68406, + 68455, + 68406, + 68421, + 68399, + 68440, + 68419, + 68424, + 68432, + 68419, + 68392, + 68400, + 68389, + 68408, + 68410, + 68431, + 68402, + 68421, + 68421, + 68377, + 68407, + 68411, + 68408, + 68410, + 68397, + 68404, + 68409, + 68378, + 68412, + 68424, + 68405, + 68399, + 68426, + 68465, + 68416, + 68409, + 68419, + 68445, + 68407, + 68412, + 68400, + 68402, + 68406, + 68419, + 68382, + 68388, + 68430, + 68404, + 68395, + 68389, + 68423, + 68432, + 68428, + 68413, + 68409, + 68440, + 68428, + 68403, + 68414, + 68433, + 68394, + 68407, + 68427, + 68415, + 68421, + 68419, + 68395, + 68427, + 68391, + 68397, + 68402, + 68372, + 68404, + 68434, + 68405, + 68404, + 68435, + 68399, + 68400, + 68423, + 68421, + 68431, + 68417, + 68388, + 68420, + 68404, + 68444, + 68433, + 68394, + 68410, + 68404, + 68411, + 68430, + 68412, + 68408, + 68405, + 68407, + 68425, + 68402, + 68395, + 68401, + 68404, + 68400, + 68383, + 68397, + 68476, + 68447, + 68411, + 68394, + 68387, + 68408, + 68431, + 68395, + 68413, + 68369, + 68429, + 68429, + 68416, + 68406, + 68396, + 68392, + 68407, + 68429, + 68421, + 68402, + 68473, + 68418, + 68418, + 68405, + 68404, + 68438, + 68434, + 68378, + 68411, + 68405, + 68427, + 68377, + 68439, + 68408, + 68415, + 68406, + 68377, + 68466, + 68399, + 68409, + 68421, + 68464, + 68436, + 68404, + 68408, + 68443, + 68407, + 68437, + 68376, + 68392, + 68398, + 68410, + 68393, + 68432, + 68403, + 68438, + 68406, + 68411, + 68433, + 68394, + 68411, + 68407, + 68445, + 68404, + 68452, + 68402, + 68397, + 68396, + 68410, + 68408, + 68425, + 68414, + 68407, + 68440, + 68384, + 68396, + 68408, + 73333, + 68389, + 68429, + 68415, + 68417, + 68420, + 68437, + 68439, + 68450, + 68422, + 68384, + 68417, + 68410, + 68394, + 68419, + 68413, + 68401, + 68406, + 68430, + 68426, + 68398, + 68393, + 68404, + 68423, + 68402, + 68421, + 68423, + 68426, + 68421, + 68391, + 68392, + 68414, + 68424, + 68420, + 68390, + 68427, + 68437, + 68430, + 68397, + 68407, + 68407, + 68382, + 68412, + 68431, + 68395, + 68406, + 68400, + 68423, + 68381, + 68408, + 68423, + 68426, + 68397, + 68413, + 68475, + 68403, + 68443, + 68385, + 68423, + 68411, + 68421, + 68401, + 68388, + 68410, + 68418, + 68396, + 68394, + 68378, + 68416, + 68412, + 68396, + 68446, + 68402, + 68408, + 68446, + 68408, + 68414, + 68403, + 68446, + 68423, + 68446, + 68403, + 68490, + 68412, + 68456, + 68391, + 68407, + 68413, + 68445, + 68380, + 68407, + 68430, + 68394, + 68475, + 68414, + 68411, + 68375, + 68405, + 68376, + 68384, + 68419, + 68405, + 68449, + 68445, + 68420, + 68380, + 68431, + 68384, + 68413, + 68416, + 68416, + 68464, + 68429, + 68424, + 68408, + 68439, + 68433, + 68407, + 68368, + 68409, + 68436, + 68408, + 68417, + 68411, + 68411, + 68444, + 68411, + 68411, + 68390, + 68407, + 68419, + 68405, + 68427, + 68402, + 68396, + 68418, + 68416, + 68399, + 68388, + 68419, + 68401, + 68431, + 68412, + 68414, + 68429, + 68414, + 68426, + 68387, + 68417, + 68369, + 68430, + 68411, + 68400, + 68426, + 68385, + 68421, + 68394, + 68393, + 68405, + 68423, + 68434, + 68436, + 68444, + 68404, + 68410, + 68429, + 68450, + 68384, + 68403, + 68437, + 68415, + 68403, + 68427, + 68410, + 68389, + 68382, + 68395, + 68402, + 68397, + 68404, + 68461, + 68415, + 68437, + 68405, + 68400, + 68416, + 68387, + 68401, + 68424, + 68392, + 68397, + 68395, + 68463, + 68402, + 68433, + 68426, + 68393, + 68443, + 68408, + 68420, + 68441, + 68400, + 68418, + 68422, + 68388, + 68419, + 68381, + 68395, + 68392, + 68432, + 68413, + 68400, + 68425, + 68381, + 68433, + 68427, + 68402, + 68408, + 68449, + 68399, + 68436, + 68430, + 68370, + 68376, + 68420, + 68395, + 68439, + 68429, + 68446, + 68390, + 68386, + 68431, + 68389, + 68442, + 68407, + 68414, + 68380, + 68429, + 68428, + 68406, + 68412, + 68400, + 68412, + 68481, + 68412, + 68412, + 68394, + 68431, + 68426, + 68411, + 68403, + 68405, + 68400, + 68421, + 68451, + 68432, + 68405, + 68425, + 68416, + 68419, + 68378, + 68391, + 68420, + 68414, + 68402, + 68802, + 68436, + 68423, + 68387, + 68395, + 68413, + 68408, + 68421, + 68445, + 68423, + 68401, + 68400, + 68413, + 68401, + 68418, + 68453, + 68443, + 68414, + 68433, + 68429, + 68398, + 68408, + 68402, + 68390, + 68428, + 68406, + 68435, + 68398, + 68382, + 68420, + 68428, + 68408, + 68419, + 68436, + 68417, + 68426, + 68433, + 68389, + 68414, + 68426, + 68414, + 68389, + 68416, + 68463, + 68425, + 68422, + 68393, + 68398, + 68384, + 68397, + 68427, + 68399, + 68396, + 68403, + 68468, + 68415, + 68445, + 68424, + 68416, + 68416, + 68406, + 68435, + 68431, + 68422, + 68422, + 68413, + 68417, + 68374, + 68433, + 68370, + 68388, + 68412, + 68407, + 68396, + 68400, + 68386, + 68392, + 68431, + 68416, + 68414, + 68426, + 68386, + 68439, + 68401, + 68375, + 68407, + 68405, + 68398, + 68438, + 68374, + 68420, + 68404, + 68436, + 68399, + 68421, + 68404, + 68390, + 68409, + 68421, + 68382, + 68445, + 68404, + 68416, + 68415, + 68435, + 68398, + 68414, + 68443, + 68406, + 68404, + 68430, + 68407, + 68426, + 68405, + 68422, + 68391, + 68417, + 68400, + 68409, + 68440, + 68417, + 68401, + 68418, + 68416, + 68404, + 68442, + 68384, + 68422, + 68445, + 68428, + 68398, + 68408, + 68382, + 68390, + 68405, + 68393, + 68432, + 68404, + 68447, + 68414, + 68419, + 68429, + 68429, + 68425, + 68420, + 68404, + 68407, + 68411, + 68433, + 68418, + 68376, + 68405, + 68402, + 68412, + 68426, + 68400, + 68415, + 68412, + 68423, + 68432, + 68409, + 68439, + 68447, + 68408, + 68408, + 68436, + 68415, + 68400, + 68428, + 68434, + 68391, + 68415, + 68377, + 68375, + 68418, + 68413, + 68402, + 68416, + 68472, + 68390, + 68419, + 68394, + 68394, + 68411, + 68407, + 68394, + 68401, + 68402, + 68415, + 68394, + 68400, + 68393, + 68432, + 68454, + 68397, + 68411, + 68436, + 68428, + 68405, + 68427, + 68390, + 68412, + 68416, + 68427, + 68430, + 68385, + 68401, + 68403, + 68433, + 68436, + 68443, + 68388, + 68400, + 68395, + 68468, + 68415, + 68405, + 68412, + 68411, + 68423, + 68418, + 68399, + 68442, + 68417, + 68401, + 68412, + 68407, + 68409, + 68411, + 68389, + 68421, + 68430, + 68427, + 68402, + 68394, + 68423, + 68411, + 68411, + 68428, + 68399, + 68426, + 68436, + 68414, + 68417, + 68403, + 68404, + 68416, + 68414, + 68422, + 68400, + 68408, + 68436, + 68393, + 68409, + 68405, + 68425, + 68395, + 68399, + 68412, + 68391, + 68426, + 68418, + 68384, + 68416, + 68387, + 68421, + 68394, + 68411, + 68401, + 68400, + 68377, + 68421, + 68418, + 68409, + 68422, + 68403, + 68428, + 68423, + 68396, + 68389, + 68414, + 68408, + 68396, + 68430, + 68413, + 68415, + 68398, + 68472, + 68448, + 68416, + 68432, + 68423, + 68424, + 68438, + 68408, + 68393, + 68424, + 68442, + 68422, + 68435, + 68410, + 68391, + 68389, + 68371, + 68412, + 68387, + 68417, + 68421, + 68417, + 68427, + 68407, + 68423, + 68407, + 68455, + 68421, + 68445, + 68411, + 68455, + 68386, + 68379, + 68403, + 68516, + 68414, + 68433, + 68417, + 68428, + 68413, + 68422, + 68424, + 68386, + 68426, + 68444, + 68412, + 68438, + 68431, + 68419, + 68433, + 68435, + 68433, + 68432, + 68408, + 68423, + 68422, + 68395, + 68407, + 68442, + 68416, + 68418, + 68403, + 68419, + 68420, + 68398, + 68427, + 68402, + 68409, + 68418, + 68427, + 68409, + 68447, + 68452, + 68379, + 68423, + 68389, + 68406, + 68415, + 68378, + 68445, + 68398, + 68445, + 68405, + 68453, + 68396, + 68414, + 68411, + 68404, + 68394, + 68435, + 68425, + 68410, + 68426, + 68418, + 68431, + 68420, + 68424, + 68403, + 68401, + 68381, + 68436, + 68401, + 68415, + 68405, + 68453, + 68423, + 68389, + 68436, + 68417, + 68454, + 68423, + 68418, + 68431, + 68432, + 68433, + 68412, + 68416, + 68401, + 68445, + 68401, + 68448, + 68445, + 68375, + 68383, + 68409, + 68431, + 68393, + 68407, + 68416, + 68407, + 68413, + 68390, + 68402, + 68431, + 68427, + 68410, + 68420, + 68431, + 68419, + 68442, + 68406, + 68409, + 68381, + 68403, + 68413, + 68447, + 68418, + 68425, + 68445, + 68389, + 68408, + 68371, + 68425, + 68391, + 68396, + 68397, + 68474, + 68433, + 68434, + 68451, + 68468, + 68431, + 68424, + 68445, + 68395, + 68415, + 68416, + 68396, + 68414, + 68442, + 68416, + 68431, + 68408, + 68426, + 68401, + 68451, + 68451, + 68423, + 68424, + 68415, + 68422, + 68457, + 68418, + 68403, + 68414, + 68386, + 68428, + 68419, + 68412, + 68430, + 68431, + 68395, + 68413, + 68415, + 68412, + 68423, + 68385, + 68411, + 68421, + 68488, + 68422, + 68394, + 68390, + 68404, + 68421, + 68412, + 68409, + 68434, + 68373, + 68445, + 68404, + 68435, + 68397, + 68401, + 68443, + 68407, + 68406, + 68405, + 68421, + 68412, + 68424, + 68447, + 68452, + 68410, + 68428, + 68466, + 68435, + 68420, + 68462, + 68441, + 68441, + 68433, + 68414, + 68412, + 68402, + 68393, + 68414, + 68374, + 68415, + 68393, + 68417, + 68392, + 68409, + 68410, + 68422, + 68449, + 68403, + 68399, + 68428, + 68459, + 68400, + 68423, + 68404, + 68441, + 68437, + 68420, + 68444, + 68487, + 68406, + 68409, + 68380, + 68404, + 68397, + 68447, + 68396, + 68417, + 68394, + 68432, + 68382, + 68433, + 68422, + 68404, + 68436, + 68359, + 68399, + 68374, + 68383, + 68474, + 68417, + 68429, + 68394, + 68432, + 68416, + 68391, + 68421, + 68434, + 68426, + 68419, + 68407, + 68403, + 68434, + 68381, + 68416, + 68392, + 68439, + 68450, + 68411, + 68410, + 68391, + 68434, + 68414, + 68378, + 68473, + 68417, + 68443, + 68439, + 68447, + 68438, + 68408, + 68415, + 68415, + 68431, + 68404, + 68407, + 68415, + 68389, + 68457, + 68390, + 68427, + 68436, + 68438, + 68421, + 68428, + 68399, + 68393, + 68404, + 68444, + 68396, + 68406, + 68411, + 68410, + 68395, + 68406, + 68415, + 68448, + 68438, + 68408, + 68409, + 68393, + 68419, + 68398, + 68434, + 68418, + 68430, + 68422, + 68417, + 68419, + 68461, + 68380, + 68420, + 68409, + 68403, + 68405, + 68387, + 68397, + 68428, + 68456, + 68410, + 68390, + 68418, + 68429, + 68427, + 68444, + 68414, + 68388, + 68390, + 68465, + 68382, + 68382, + 68416, + 68410, + 68351, + 68406, + 68372, + 68414, + 68403, + 68431, + 68409, + 68423, + 68439, + 68432, + 68461, + 68382, + 68398, + 68457, + 68406, + 68434, + 68438, + 68422, + 68402, + 68395, + 68404, + 68677, + 68389, + 68428, + 68436, + 68406, + 68395, + 68448, + 68387, + 68414, + 68444, + 68456, + 68441, + 68394, + 68411, + 68404, + 68451, + 68436, + 68444, + 68415, + 68425, + 68407, + 68405, + 68428, + 68442, + 68371, + 68460, + 68399, + 68389, + 68410, + 68400, + 68408, + 68407, + 68417, + 68443, + 68408, + 68430, + 68389, + 68413, + 68428, + 68406, + 68406, + 68428, + 68397, + 68417, + 68383, + 68391, + 68395, + 68422, + 68403, + 68415, + 68418, + 68420, + 68430, + 68417, + 68434, + 68438, + 68430, + 68435, + 68432, + 68420, + 68409, + 68406, + 68405, + 68424, + 68396, + 68411, + 68395, + 68397, + 68429, + 68392, + 68412, + 68391, + 68430, + 68384, + 68425, + 68365, + 68384, + 68416, + 68394, + 68424, + 68408, + 68444, + 68396, + 68419, + 68414, + 68426, + 68419, + 68405, + 68415, + 68424, + 68427, + 68426, + 68398, + 68430, + 68432, + 68416, + 68415, + 68418, + 68397, + 68400, + 68517, + 68392, + 68442, + 68405, + 68387, + 68384, + 68412, + 68418, + 68433, + 68404, + 68416, + 68393, + 68422, + 68407, + 68402, + 68447, + 68430, + 68438, + 68400, + 68395, + 68406, + 68443, + 68410, + 68392, + 68399, + 68384, + 68403, + 68420, + 68416, + 68410, + 68420, + 68394, + 68408, + 68399, + 68376, + 68478, + 68418, + 68394, + 68418, + 68404, + 68417, + 68429, + 68445, + 68440, + 68426, + 68416, + 68416, + 68399, + 68396, + 68399, + 68403, + 68415, + 68398, + 68428, + 68476, + 68406, + 68390, + 68441, + 68391, + 68379, + 68430, + 68407, + 68394, + 68427, + 68409, + 68403, + 68410, + 68401, + 68432, + 68404, + 68409, + 68393, + 68409, + 68390, + 68445, + 68398, + 68423, + 68409, + 68391, + 68409, + 68397, + 68393, + 68413, + 68372, + 68400, + 68437, + 68422, + 68400, + 68423, + 68401, + 68421, + 68388, + 68390, + 68481, + 68418, + 68413, + 68384, + 68383, + 68387, + 68411, + 68405, + 68407, + 68393, + 68404, + 68403, + 68443, + 68431, + 68407, + 68444, + 68415, + 68428, + 68407, + 68422, + 68428, + 68430, + 68444, + 68415, + 68417, + 68437, + 68428, + 68412, + 68429, + 68442, + 68396, + 68403, + 68393, + 68411, + 68381, + 68416, + 68417, + 68413, + 68396, + 68439, + 68400, + 68419, + 68422, + 68403, + 68426, + 68451, + 68418, + 68423, + 68424, + 68386, + 68402, + 68420, + 68396, + 68399, + 68433, + 68378, + 68411, + 68455, + 68425, + 68414, + 68374, + 68445, + 68396, + 68409, + 68411, + 68422, + 68417, + 68435, + 68428, + 68478, + 68409, + 68405, + 68445, + 68400, + 68421, + 68396, + 68422, + 68414, + 68420, + 68427, + 68393, + 68444, + 68416, + 68395, + 68431, + 68451, + 68443, + 68436, + 68373, + 68426, + 68414, + 68386, + 68423, + 68408, + 68432, + 68440, + 68397, + 68372, + 68395, + 68470, + 68424, + 68439, + 68429, + 68420, + 68437, + 68408, + 68395, + 68389, + 68425, + 68390, + 68390, + 68438, + 68406, + 68424, + 68427, + 68416, + 68398, + 68410, + 68390, + 68418, + 68410, + 68537, + 68427, + 68420, + 68428, + 68403, + 68443, + 68412, + 68398, + 68386, + 68413, + 68387, + 68431, + 68409, + 68406, + 68405, + 68400, + 68438, + 68409, + 68396, + 68399, + 68430, + 68415, + 68404, + 68432, + 68380, + 68430, + 68414, + 68507, + 68453, + 68434, + 68406, + 68406, + 68416, + 68398, + 68411, + 68424, + 68421, + 68410, + 68405, + 68415, + 68404, + 68402, + 68442, + 68404, + 68410, + 68438, + 68433, + 68404, + 68412, + 68409, + 68420, + 68431, + 68431, + 68448, + 68427, + 68432, + 68402, + 68373, + 68432, + 68429, + 68414, + 68414, + 68408, + 68393, + 68975, + 68409, + 68399, + 68428, + 68388, + 68447, + 68432, + 68429, + 68407, + 68376, + 68407, + 68395, + 68404, + 68400, + 68396, + 68424, + 68455, + 68396, + 68393, + 68412, + 68393, + 68396, + 68433, + 68428, + 68421, + 68377, + 68391, + 68393, + 68409, + 68370, + 68390, + 68388, + 68411, + 68405, + 68446, + 68395, + 68394, + 68398, + 68416, + 68430, + 68444, + 68424, + 68376, + 68401, + 68400, + 68427, + 68431, + 68425, + 68397, + 68419, + 68406, + 68405, + 68408, + 68403, + 68428, + 68402, + 68467, + 68446, + 68424, + 68420, + 68412, + 68383, + 68409, + 68422, + 68415, + 68444, + 68425, + 68429, + 68430, + 68425, + 68444, + 68406, + 68439, + 68430, + 68423, + 68406, + 68443, + 68418, + 68438, + 68405, + 68426, + 68421, + 68414, + 68425, + 68433, + 68433, + 68417, + 68450, + 68393, + 68380, + 68435, + 68443, + 68423, + 68440, + 68412, + 68501, + 68431, + 68408, + 68400, + 68435, + 68467, + 68444, + 68413, + 68417, + 68426, + 68427, + 68413, + 68388, + 68434, + 68415, + 68432, + 68405, + 68426, + 68449, + 68408, + 68396, + 68393, + 68444, + 68441, + 68430, + 68394, + 68419, + 68394, + 68401, + 68414, + 68469, + 68425, + 68440, + 68419, + 68413, + 68415, + 68439, + 68408, + 68432, + 68393, + 68421, + 68430, + 68407, + 68440, + 68382, + 68414, + 68414, + 68429, + 68392, + 68425, + 68414, + 68383, + 68439, + 68468, + 68374, + 68389, + 68389, + 68435, + 68447, + 68433, + 68406, + 68437, + 68414, + 68400, + 68427, + 68441, + 68420, + 68394, + 68419, + 68396, + 68414, + 68448, + 68406, + 68384, + 68420, + 68437, + 68445, + 68415, + 68411, + 68454, + 68457, + 68444, + 68414, + 68399, + 68409, + 68393, + 68415, + 68429, + 68445, + 68408, + 68390, + 68407, + 68384, + 68409, + 68396, + 68424, + 68421, + 68424, + 68410, + 68422, + 68413, + 68400, + 68401, + 68429, + 68445, + 68429, + 68452, + 68429, + 68414, + 68391, + 68423, + 68452, + 68409, + 68419, + 68422, + 68402, + 68439, + 68405, + 68450, + 68423, + 68429, + 68446, + 68384, + 68406, + 68397, + 68443, + 68398, + 68427, + 68408, + 68428, + 68390, + 68409, + 68393, + 68407, + 68410, + 68421, + 68419, + 68415, + 68414, + 68425, + 68408, + 68439, + 68449, + 68432, + 68435, + 68413, + 68437, + 68432, + 68426, + 68439, + 68433, + 68404, + 68400, + 68417, + 68423, + 68446, + 68417, + 68414, + 68422, + 68398, + 68402, + 68417, + 68465, + 68394, + 68425, + 68423, + 68395, + 68367, + 68434, + 68395, + 68422, + 68415, + 68446, + 68409, + 68430, + 68413, + 68448, + 68458, + 68409, + 68397, + 68433, + 68411, + 68408, + 68392, + 68409, + 68413, + 68434, + 68432, + 68422, + 68404, + 68437, + 68429, + 68403, + 68406, + 68432, + 68400, + 68393, + 68427, + 68416, + 68436, + 68454, + 68401, + 68441, + 68403, + 68416, + 68399, + 68469, + 68418, + 68417, + 68432, + 68412, + 68444, + 68417, + 68399, + 68462, + 68392, + 68421, + 68377, + 68438, + 68446, + 68421, + 68422, + 68431, + 68385, + 68429, + 68402, + 68412, + 68427, + 68423, + 68416, + 68432, + 68443, + 68431, + 68417, + 68396, + 68409, + 68395, + 68438, + 68427, + 68389, + 68418, + 68406, + 68411, + 68440, + 68380, + 68412, + 68414, + 68434, + 68451, + 68393, + 68418, + 68433, + 68411, + 68423, + 68396, + 68466, + 68416, + 68428, + 68401, + 68408, + 68423, + 68412, + 68405, + 68377, + 68427, + 68436, + 68414, + 68424, + 68404, + 68430, + 68406, + 68388, + 68434, + 68450, + 68446, + 68413, + 68441, + 68391, + 68379, + 68409, + 68414, + 68420, + 68386, + 68392, + 68431, + 68401, + 68411, + 68389, + 68439, + 68464, + 68411, + 68438, + 68429, + 68480, + 68469, + 68403, + 68374, + 68403, + 68430, + 68402, + 68403, + 68414, + 68432, + 68414, + 68390, + 68431, + 68422, + 68397, + 68392, + 68434, + 68442, + 68381, + 68390, + 68428, + 68396, + 68404, + 68418, + 68397, + 68389, + 68419, + 68408, + 68440, + 68386, + 68418, + 68446, + 68397, + 68411, + 68433, + 68457, + 68405, + 68406, + 68434, + 68427, + 68451, + 68426, + 68395, + 68397, + 68444, + 68413, + 68384, + 68424, + 68438, + 68410, + 68429, + 68422, + 68435, + 68370, + 68408, + 68427, + 68422, + 68394, + 68413, + 68404, + 68377, + 68410, + 68375, + 68410, + 68424, + 68413, + 68434, + 68396, + 68396, + 68446, + 68424, + 68390, + 68406, + 68426, + 68446, + 68379, + 68387, + 68404, + 68393, + 68407, + 68438, + 68463, + 68420, + 68406, + 68411, + 68405, + 68418, + 68418, + 68402, + 68420, + 68466, + 68411, + 68419, + 68423, + 68405, + 68439, + 68424, + 68397, + 68415, + 68395, + 68422, + 68397, + 68422, + 68419, + 68386, + 68416, + 68399, + 68439, + 68480, + 68387, + 68405, + 68417, + 68386, + 68424, + 68435, + 68418, + 68426, + 68394, + 68414, + 68402, + 68410, + 68424, + 68417, + 68442, + 68428, + 68422, + 68418, + 68419, + 68402, + 68411, + 68368, + 68437, + 68417, + 68435, + 68417, + 68453, + 68432, + 68408, + 68425, + 68404, + 68432, + 68492, + 68434, + 68430, + 68428, + 68402, + 68437, + 68420, + 68422, + 68402, + 68387, + 68381, + 68425, + 68412, + 68409, + 68452, + 68404, + 68380, + 68421, + 68464, + 68435, + 68423, + 68398, + 68425, + 68445, + 68392, + 68422, + 68433, + 68424, + 68439, + 68448, + 68407, + 68409, + 68444, + 68418, + 68403, + 68446, + 68420, + 68419, + 68460, + 68426, + 68427, + 68420, + 68396, + 68443, + 68432, + 68402, + 68382, + 68401, + 68381, + 68432, + 68427, + 68406, + 68420, + 68429, + 68411, + 68423, + 68440, + 68423, + 68407, + 68397, + 68398, + 68389, + 68407, + 68391, + 68426, + 68400, + 68408, + 68415, + 68395, + 68399, + 68407, + 68447, + 68418, + 68395, + 68416, + 68428, + 68431, + 68445, + 68412, + 68436, + 68434, + 68444, + 68433, + 68425, + 68408, + 68415, + 68414, + 68390, + 68409, + 68392, + 68434, + 68456, + 68416, + 68448, + 68431, + 68439, + 68418, + 68414, + 68423, + 68445, + 68428, + 68444, + 68402, + 68390, + 68402, + 68438, + 68402, + 68415, + 68423, + 68405, + 68409, + 68398, + 68410, + 68434, + 68373, + 68383, + 68462, + 68429, + 68398, + 68404, + 68425, + 68423, + 68402, + 68437, + 68423, + 68408, + 68432, + 68394, + 68424, + 68364, + 68416, + 68384, + 68409, + 68414, + 68418, + 68393, + 68415, + 68447, + 68419, + 68402, + 68441, + 68448, + 68397, + 68422, + 68389, + 68434, + 68382, + 68405, + 68389, + 68421, + 68447, + 68420, + 68404, + 68413, + 68396, + 68413, + 68407, + 68417, + 68445, + 68414, + 68422, + 68413, + 68417, + 68393, + 68404, + 68423, + 68465, + 68440, + 68393, + 68449, + 68386, + 68439, + 68438, + 68462, + 68423, + 68396, + 68396, + 68427, + 68443, + 68435, + 68399, + 68405, + 68392, + 68417, + 68389, + 68420, + 68390, + 68441, + 68393, + 68851, + 68436, + 68445, + 68377, + 68389, + 68402, + 68384, + 68433, + 68464, + 68393, + 68406, + 68422, + 68445, + 68404, + 68419, + 68431, + 68446, + 68386, + 68460, + 68393, + 68410, + 68430, + 68402, + 68437, + 68437, + 68406, + 68421, + 68455, + 68410, + 68448, + 68458, + 68398, + 68460, + 68433, + 68394, + 68398, + 68430, + 68434, + 68438, + 68424, + 68386, + 68412, + 68407, + 68439, + 68426, + 68394, + 68403, + 68426, + 68417, + 68457, + 68438, + 68458, + 68387, + 68408, + 68400, + 68423, + 68388, + 68413, + 68427, + 68429, + 68413, + 68432, + 68400, + 68413, + 68488, + 68502, + 68413, + 68402, + 68440, + 68432, + 68429, + 68437, + 68447, + 68429, + 68459, + 68393, + 68432, + 68441, + 68410, + 68385, + 68426, + 68453, + 68425, + 68419, + 68386, + 68417, + 68444, + 68366, + 68395, + 68413, + 68424, + 68412, + 68423, + 77841, + 68421, + 68405, + 68391, + 68406, + 68451, + 68404, + 68449, + 68390, + 68381, + 68413, + 68420, + 68420, + 68423, + 68439, + 68392, + 68424, + 68428, + 68449, + 68421, + 68434, + 68420, + 68394, + 68407, + 68435, + 68415, + 68439, + 68383, + 68378, + 68410, + 68407, + 68381, + 68435, + 68423, + 68430, + 68434, + 68403, + 68393, + 68409, + 68435, + 68415, + 68398, + 68381, + 68372, + 68433, + 68415, + 68406, + 68411, + 68383, + 68392, + 68408, + 68412, + 68413, + 68460, + 68406, + 68395, + 68437, + 68417, + 68406, + 68423, + 68409, + 68432, + 68408, + 68425, + 68425, + 68395, + 68430, + 68397, + 68424, + 68389, + 68439, + 68422, + 68384, + 68389, + 68431, + 68396, + 68418, + 68444, + 68477, + 68431, + 68435, + 68439, + 68422, + 68392, + 68375, + 68414, + 68432, + 68429, + 68408, + 68383, + 68419, + 68430, + 68417, + 68417, + 68412, + 68424, + 68432, + 68433, + 68416, + 68420, + 68431, + 68437, + 68438, + 68425, + 68430, + 68428, + 68415, + 68412, + 68392, + 68411, + 68445, + 68412, + 68422, + 68411, + 68403, + 68390, + 68411, + 68439, + 68436, + 68429, + 68407, + 68407, + 68412, + 68412, + 68437, + 68384, + 68433, + 68423, + 68450, + 68380, + 68429, + 68430, + 68416, + 68415, + 68391, + 68407, + 68418, + 68426, + 68422, + 68431, + 68434, + 68395, + 68416, + 68434, + 68414, + 68408, + 68404, + 68422, + 68463, + 68435, + 68420, + 68451, + 68417, + 68372, + 68420, + 68406, + 68363, + 68414, + 68408, + 68375, + 68390, + 68394, + 68419, + 68417, + 68413, + 68434, + 68414, + 68414, + 68445, + 68431, + 68429, + 68379, + 68395, + 68385, + 68446, + 68407, + 68388, + 68407, + 68406, + 68450, + 68420, + 68412, + 68430, + 68444, + 68387, + 68425, + 68442, + 68389, + 68390, + 68439, + 68397, + 68429, + 68423, + 68409, + 68390, + 68428, + 68422, + 68432, + 68415, + 68409, + 68417, + 68449, + 68425, + 68386, + 68422, + 68463, + 68450, + 68407, + 68457, + 68434, + 68457, + 68429, + 68417, + 68426, + 68422, + 68440, + 68431, + 68408, + 68428, + 68422, + 68414, + 68398, + 68426, + 68417, + 68403, + 68393, + 68399, + 68426, + 68452, + 68390, + 68407, + 68448, + 68411, + 68428, + 68429, + 68426, + 68410, + 68402, + 68405, + 68425, + 68430, + 68390, + 68440, + 68433, + 68422, + 68374, + 68438, + 68419, + 68402, + 68396, + 68392, + 68407, + 68389, + 68392, + 68413, + 68418, + 68396, + 68389, + 68415, + 68379, + 68406, + 68424, + 68402, + 68400, + 68435, + 68408, + 68383, + 68418, + 68430, + 68431, + 68436, + 68419, + 68398, + 68420, + 68376, + 68429, + 68433, + 68470, + 68420, + 68420, + 68414, + 68435, + 68419, + 68422, + 68415, + 68422, + 68451, + 68415, + 68411, + 68408, + 68397, + 68407, + 68471, + 68460, + 68387, + 68390, + 68422, + 68406, + 68419, + 68409, + 68434, + 68419, + 68441, + 68435, + 68451, + 68410, + 68398, + 68416, + 68439, + 68439, + 68444, + 68429, + 68409, + 68423, + 68421, + 68428, + 68479, + 68414, + 68409, + 68401, + 68433, + 68405, + 68381, + 68401, + 68430, + 68477, + 68431, + 68421, + 68403, + 68443, + 68413, + 68439, + 68412, + 68393, + 68424, + 68443, + 76127, + 68410, + 68461, + 68417, + 68412, + 68432, + 68380, + 68375, + 68420, + 68415, + 68424, + 68384, + 68400, + 68451, + 68422, + 68434, + 68399, + 68435, + 68434, + 68418, + 68422, + 68417, + 68411, + 68395, + 68395, + 68401, + 68403, + 68436, + 68408, + 68414, + 68428, + 68432, + 68437, + 68433, + 68445, + 68417, + 68404, + 68442, + 68414, + 68427, + 68438, + 68413, + 68415, + 68391, + 68416, + 68418, + 68442, + 68386, + 68428, + 68382, + 68408, + 68447, + 68423, + 68422, + 68404, + 68407, + 68400, + 68425, + 68413, + 68396, + 68411, + 68397, + 68447, + 68395, + 68433, + 68430, + 68419, + 68401, + 68389, + 68405, + 68428, + 68404, + 68425, + 68411, + 68431, + 68406, + 68400, + 68445, + 68409, + 68422, + 68462, + 68424, + 68423, + 68446, + 68430, + 68431, + 68450, + 68408, + 68401, + 68410, + 68432, + 68405, + 68398, + 68421, + 68443, + 68450, + 68374, + 68436, + 68421, + 68410, + 68432, + 68407, + 68437, + 68410, + 68393, + 68395, + 68393, + 68391, + 68400, + 68429, + 68429, + 68405, + 68414, + 68424, + 68412, + 68391, + 68371, + 68439, + 68388, + 68421, + 68389, + 68421, + 68441, + 68437, + 68407, + 68456, + 68444, + 68423, + 68404, + 68407, + 68409, + 68406, + 68443, + 68396, + 68425, + 68407, + 68395, + 68393, + 68415, + 68413, + 68417, + 68440, + 68399, + 68383, + 68408, + 68411, + 68419, + 68403, + 68427, + 68431, + 68412, + 68404, + 68420, + 68388, + 68427, + 68391, + 68425, + 68412, + 68411, + 68449, + 68432, + 68459, + 68383, + 68406, + 68414, + 68419, + 68396, + 68436, + 68422, + 68389, + 68417, + 68417, + 68433, + 68413, + 68400, + 68421, + 68446, + 68410, + 68422, + 68414, + 68378, + 68368, + 68422, + 68467, + 68419, + 68438, + 68420, + 68407, + 68418, + 68386, + 68432, + 68437, + 68408, + 68411, + 68407, + 68434, + 68415, + 68420, + 68387, + 68453, + 68374, + 68434, + 68391, + 68426, + 68398, + 68464, + 68406, + 68417, + 68408, + 68413, + 68403, + 68410, + 68376, + 68406, + 68431, + 68431, + 68405, + 68393, + 68415, + 68404, + 68413, + 68389, + 68408, + 68398, + 68445, + 68408, + 68422, + 68416, + 68391, + 68409, + 68424, + 68400, + 68433, + 68414, + 68420, + 68384, + 68804, + 68409, + 68409, + 68453, + 68399, + 68406, + 68414, + 68429, + 68402, + 68427, + 68401, + 68393, + 68375, + 68421, + 68394, + 68394, + 68408, + 68396, + 68415, + 68386, + 68427, + 68470, + 68417, + 68421, + 68415, + 68392, + 68383, + 68394, + 68447, + 68414, + 68399, + 68408, + 68411, + 68432, + 68435, + 68399, + 68419, + 68405, + 68420, + 68413, + 68407, + 68413, + 68400, + 68433, + 68403, + 68474, + 68398, + 68446, + 68420, + 68408, + 68417, + 68422, + 68441, + 68403, + 68389, + 68388, + 68436, + 68428, + 68423, + 68395, + 68432, + 68441, + 68409, + 68406, + 68425, + 68431, + 68438, + 68423, + 68383, + 68425, + 68456, + 68423, + 68453, + 68426, + 68403, + 68427, + 68407, + 68385, + 68420, + 68431, + 68425, + 68396, + 68423, + 68381, + 68414, + 68403, + 68418, + 68393, + 68444, + 68391, + 68421, + 68409, + 68393, + 68407, + 68447, + 68386, + 68452, + 68412, + 68442, + 68464, + 68403, + 68387, + 68418, + 68393, + 68419, + 68426, + 68444, + 68425, + 68406, + 68419, + 68419, + 68442, + 68421, + 68388, + 68421, + 68441, + 68440, + 68433, + 68458, + 68424, + 68421, + 68436, + 68415, + 68452, + 68423, + 68412, + 68421, + 68406, + 68414, + 68378, + 68387, + 68387, + 68416, + 68388, + 68410, + 68384, + 68432, + 68417, + 68432, + 68402, + 68394, + 68425, + 68442, + 68417, + 68448, + 68423, + 68438, + 68427, + 68421, + 68439, + 68424, + 68424, + 68421, + 68427, + 68458, + 68433, + 68434, + 68458, + 68404, + 68414, + 68448, + 68429, + 68412, + 68388, + 68426, + 68441, + 68422, + 68370, + 68447, + 68425, + 68430, + 68424, + 68439, + 68405, + 68408, + 68449, + 68450, + 68432, + 68453, + 68403, + 68401, + 68441, + 68448, + 68410, + 68420, + 68416, + 68402, + 68479, + 68417, + 68437, + 68395, + 68405, + 68379, + 68403, + 68411, + 68383, + 68418, + 68384, + 68406, + 68413, + 68420, + 68412, + 68433, + 68376, + 68404, + 68403, + 68422, + 68394, + 68403, + 68409, + 68419, + 68428, + 68391, + 68429, + 68427, + 68421, + 68406, + 68410, + 68431, + 68444, + 68431, + 68442, + 68411, + 68400, + 68443, + 68463, + 68426, + 68415, + 68427, + 68392, + 68397, + 68424, + 68397, + 68418, + 68408, + 68415, + 68389, + 68397, + 68404, + 68408, + 68421, + 68389, + 68416, + 68423, + 68446, + 68416, + 68420, + 68413, + 68431, + 68440, + 68464, + 68393, + 68418, + 68423, + 68420, + 68407, + 68398, + 68411, + 68442, + 68450, + 68416, + 68410, + 68418, + 68398, + 68390, + 68410, + 68432, + 69018, + 68414, + 68435, + 68430, + 68457, + 68406, + 68433, + 68411, + 68434, + 68414, + 68392, + 68447, + 68406, + 68423, + 68444, + 68394, + 68401, + 68440, + 68416, + 68437, + 68401, + 68431, + 68406, + 68417, + 68470, + 68388, + 68434, + 68411, + 68430, + 68408, + 68463, + 68388, + 68393, + 68381, + 68419, + 68420, + 68416, + 68418, + 68422, + 68404, + 68428, + 68398, + 68432, + 68441, + 68415, + 68445, + 68405, + 68439, + 68407, + 68428, + 68441, + 68389, + 68412, + 68392, + 68404, + 68432, + 68412, + 68414, + 68379, + 68400, + 68402, + 68423, + 68399, + 68434, + 68416, + 68393, + 68436, + 68419, + 68396, + 68420, + 68382, + 68431, + 68417, + 68413, + 68375, + 68402, + 68428, + 68425, + 68396, + 68411, + 68417, + 68422, + 68405, + 68396, + 68389, + 68409, + 68421, + 68391, + 68418, + 68431, + 68439, + 68393, + 68427, + 68405, + 68405, + 68420, + 68414, + 68406, + 68431, + 68424, + 68459, + 68416, + 68417, + 68411, + 68417, + 68423, + 68431, + 68398, + 68446, + 68415, + 68420, + 68418, + 68410, + 68416, + 68459, + 68414, + 68431, + 68460, + 68395, + 68434, + 68408, + 68427, + 68402, + 68418, + 68410, + 68419, + 68418, + 68492, + 68385, + 68402, + 68420, + 68397, + 68433, + 68393, + 68423, + 68405, + 68410, + 68426, + 68445, + 68423, + 68421, + 68417, + 68427, + 68457, + 68373, + 68421, + 68408, + 68450, + 68411, + 68426, + 68397, + 68424, + 68428, + 68379, + 68409, + 68421, + 68426, + 68414, + 68424, + 68403, + 68440, + 68387, + 68407, + 68424, + 68376, + 68374, + 68429, + 68402, + 68425, + 68404, + 68391, + 68412, + 68409, + 68426, + 68401, + 68426, + 68396, + 68429, + 68376, + 68412, + 68401, + 68427, + 68382, + 68390, + 68423, + 68421, + 68414, + 68407, + 68426, + 68411, + 68403, + 68411, + 68410, + 68406, + 68412, + 68404, + 68396, + 68411, + 68412, + 68409, + 68402, + 68389, + 68409, + 68427, + 68442, + 68418, + 68387, + 68376, + 68385, + 68407, + 68420, + 68418, + 68407, + 68439, + 68368, + 68417, + 68416, + 68406, + 68391, + 68411, + 68413, + 68385, + 68433, + 68445, + 68440, + 68410, + 68418, + 68456, + 68479, + 68380, + 68416, + 68420, + 68406, + 68442, + 68417, + 68412, + 68410, + 68416, + 68435, + 68409, + 68393, + 68423, + 68433, + 68374, + 68429, + 68416, + 68410, + 68416, + 68425, + 68420, + 68454, + 68409, + 68385, + 68415, + 68398, + 68369, + 68386, + 68403, + 68420, + 68424, + 68397, + 68385, + 68439, + 68439, + 68457, + 68449, + 68406, + 68424, + 68422, + 68387, + 68464, + 68409, + 68396, + 68453, + 68453, + 68438, + 68408, + 68412, + 68409, + 68475, + 68388, + 68453, + 68392, + 68435, + 68415, + 68396, + 68446, + 68440, + 68379, + 68468, + 68416, + 68423, + 68395, + 68454, + 68430, + 68448, + 68424, + 68394, + 68440, + 68417, + 68443, + 68425, + 68416, + 68383, + 68387, + 68446, + 68428, + 68435, + 68363, + 68440, + 68412, + 68390, + 68396, + 68410, + 68414, + 68413, + 68403, + 68394, + 68402, + 68466, + 68394, + 68414, + 68424, + 68385, + 68494, + 68408, + 68425, + 68414, + 68404, + 68417, + 68419, + 68446, + 68438, + 68408, + 68419, + 68412, + 68425, + 68421, + 68421, + 68395, + 68394, + 68381, + 68409, + 68394, + 68401, + 68429, + 68405, + 68402, + 68405, + 68402, + 68415, + 68398, + 68400, + 68424, + 68427, + 68416, + 68406, + 68398, + 68410, + 68455, + 68403, + 68435, + 68399, + 68390, + 68416, + 68424, + 68404, + 68410, + 68437, + 68408, + 68422, + 68421, + 68422, + 68413, + 68433, + 68401, + 68426, + 68406, + 68423, + 68428, + 68421, + 68416, + 68389, + 68400, + 68402, + 68413, + 68417, + 68425, + 68411, + 68436, + 68386, + 68403, + 68386, + 68372, + 68460, + 68429, + 68432, + 68407, + 68421, + 68452, + 68451, + 68414, + 68412, + 68422, + 68371, + 68427, + 68431, + 68440, + 68429, + 68409, + 68415, + 68401, + 68405, + 68371, + 68385, + 68425, + 68440, + 68421, + 68440, + 68457, + 68451, + 68429, + 68389, + 68413, + 68388, + 68418, + 68415, + 68387, + 68411, + 68409, + 68412, + 68432, + 68429, + 68399, + 68407, + 68417, + 68408, + 68400, + 68415, + 68400, + 68396, + 68373, + 68387, + 68423, + 68433, + 68376, + 68421, + 68415, + 68385, + 68457, + 68375, + 68445, + 68389, + 68380, + 68400, + 68442, + 68408, + 68429, + 68390, + 68394, + 68405, + 68423, + 68388, + 68399, + 68434, + 68405, + 68434, + 68419, + 68414, + 68432, + 68429, + 68404, + 68429, + 68437, + 68418, + 68425, + 68404, + 68407, + 68407, + 68415, + 68459, + 68425, + 68395, + 68398, + 68439, + 68377, + 68371, + 68416, + 68433, + 68409, + 68403, + 68429, + 68399, + 68409, + 68411, + 68427, + 68441, + 68390, + 68418, + 68390, + 68397, + 68423, + 68421, + 68383, + 68461, + 68413, + 68390, + 68430, + 68432, + 68404, + 68408, + 68422, + 68388, + 68419, + 68425, + 68434, + 68410, + 68386, + 68396, + 68409, + 68403, + 68415, + 68420, + 68416, + 68396, + 68417, + 68418, + 68390, + 68429, + 68424, + 68427, + 68421, + 68390, + 68409, + 68408, + 68414, + 68405, + 68417, + 68416, + 68399, + 68413, + 68454, + 68415, + 68430, + 68424, + 68424, + 68438, + 68424, + 68424, + 68407, + 68424, + 68401, + 68389, + 68364, + 68425, + 68404, + 68383, + 68441, + 68407, + 68396, + 68390, + 68440, + 68403, + 68402, + 68419, + 68403, + 68423, + 68404, + 68419, + 68364, + 68389, + 68366, + 68430, + 68448, + 68395, + 68421, + 68402, + 68454, + 68414, + 68405, + 68401, + 68427, + 68403, + 68374, + 68422, + 68421, + 68428, + 68408, + 68427, + 68431, + 68388, + 68394, + 68424, + 68425, + 68417, + 68423, + 68425, + 68407, + 68419, + 68430, + 68477, + 68376, + 68398, + 68395, + 68402, + 68417, + 68464, + 68376, + 68413, + 68432, + 68404, + 68361, + 68433, + 68396, + 68409, + 68412, + 68437, + 68430, + 68421, + 68433, + 68414, + 68389, + 68398, + 68420, + 68395, + 68411, + 68405, + 68427, + 68424, + 68409, + 68406, + 68403, + 68450, + 68463, + 68416, + 68425, + 68418, + 68372, + 68409, + 68402, + 68415, + 68424, + 68414, + 68425, + 68393, + 68400, + 68437, + 68427, + 68419, + 68393, + 68393, + 68437, + 68401, + 68393, + 68399, + 68431, + 68422, + 68391, + 68412, + 68398, + 68418, + 68430, + 68433, + 68365, + 68443, + 68407, + 68418, + 68390, + 68389, + 68383, + 68418, + 68394, + 68419, + 68406, + 68407, + 68373, + 68422, + 68390, + 68419, + 68384, + 68422, + 68436, + 68400, + 68396, + 68431, + 68430, + 68407, + 68431, + 68430, + 68410, + 68442, + 68406, + 68410, + 68427, + 68460, + 68374, + 68420, + 68413, + 68392, + 68413, + 68449, + 68384, + 68381, + 68484, + 68391, + 68430, + 68463, + 68413, + 68422, + 68379, + 68416, + 68435, + 68397, + 68400, + 68392, + 68400, + 68385, + 68424, + 68372, + 68409, + 68434, + 68422, + 68419, + 68403, + 68415, + 68417, + 68391, + 68411, + 68384, + 68400, + 68392, + 68419, + 68426, + 68456, + 68375, + 68399, + 68388, + 68412, + 68430, + 68432, + 68402, + 68403, + 68424, + 68398, + 68411, + 68431, + 68389, + 68412, + 68394, + 68414, + 68413, + 68411, + 68390, + 68401, + 68419, + 68388, + 68421, + 68421, + 68402, + 68395, + 68443, + 68411, + 68445, + 68406, + 68424, + 68411, + 68423, + 68389, + 68422, + 68416, + 68388, + 68400, + 68416, + 68407, + 68414, + 68408, + 68412, + 68397, + 68434, + 68446, + 68419, + 68434, + 68400, + 68408, + 68405, + 68405, + 68414, + 68403, + 68375, + 68433, + 68407, + 68445, + 68424, + 68386, + 68399, + 68414, + 68384, + 68388, + 68418, + 68394, + 68404, + 68408, + 68426, + 68411, + 68419, + 68432, + 68404, + 68410, + 68444, + 68426, + 68414, + 68439, + 68408, + 68404, + 68370, + 68424, + 68398, + 68437, + 68426, + 68391, + 68410, + 68434, + 68442, + 68401, + 68398, + 68385, + 68420, + 68407, + 68434, + 68403, + 68424, + 68429, + 68455, + 68396, + 68406, + 68375, + 68379, + 68403, + 68436, + 68448, + 68417, + 68441, + 68408, + 68338, + 68430, + 68391, + 68386, + 68410, + 68410, + 68384, + 68432, + 68408, + 68451, + 68428, + 68381, + 68421, + 68401, + 68382, + 68406, + 68412, + 68410, + 68401, + 68426, + 68399, + 68397, + 68399, + 68447, + 68416, + 68428, + 68395, + 68397, + 68423, + 68424, + 68401, + 68405, + 68400, + 68391, + 68414, + 68426, + 68407, + 68411, + 68418, + 68440, + 68426, + 68419, + 68395, + 68399, + 68399, + 68412, + 68422, + 68468, + 68413, + 68426, + 68395, + 68398, + 68422, + 68407, + 68410, + 68379, + 68424, + 68424, + 68394, + 68388, + 68430, + 68382, + 68427, + 68422, + 68379, + 68391, + 68391, + 68435, + 68445, + 68412, + 68412, + 68427, + 68419, + 68416, + 68437, + 68386, + 68404, + 68401, + 68425, + 68416, + 68421, + 68419, + 68413, + 68395, + 68381, + 68398, + 68413, + 68414, + 68437, + 68397, + 68405, + 68398, + 68406, + 68437, + 68428, + 68424, + 68419, + 68387, + 68401, + 68406, + 68431, + 68435, + 68360, + 68412, + 68403, + 68431, + 68418, + 68403, + 68393, + 68380, + 68437, + 68435, + 68432, + 68473, + 68382, + 68423, + 68411, + 68428, + 68389, + 68412, + 68414, + 68400, + 68401, + 68432, + 68437, + 68409, + 68429, + 68447, + 68438, + 68425, + 68420, + 68399, + 68418, + 68410, + 68437, + 68401, + 69050, + 68442, + 68375, + 68434, + 68409, + 68387, + 68426, + 68438, + 68435, + 68419, + 68423, + 68413, + 68407, + 68409, + 68394, + 68388, + 68406, + 68420, + 68433, + 68444, + 68380, + 68408, + 68424, + 68410, + 68387, + 68419, + 68403, + 68430, + 68413, + 68463, + 68382, + 68407, + 68397, + 68428, + 68405, + 68420, + 68409, + 68419, + 68425, + 68412, + 68431, + 68419, + 68415, + 68417, + 68419, + 68442, + 68404, + 68405, + 68403, + 68400, + 68410, + 68433, + 68427, + 68391, + 68418, + 68366, + 68419, + 68423, + 68440, + 68442, + 68416, + 68418, + 68437, + 68448, + 68406, + 68425, + 68420, + 68474, + 68430, + 68401, + 68416, + 68437, + 68433, + 68420, + 68419, + 68434, + 68422, + 68461, + 68440, + 68426, + 68553, + 68397, + 68443, + 68462, + 68423, + 68429, + 68422, + 68426, + 68413, + 68411, + 68451, + 68420, + 68383, + 68405, + 68385, + 68439, + 68426, + 68419, + 68378, + 68405, + 68426, + 68419, + 68398, + 68394, + 68367, + 68405, + 68407, + 68413, + 68362, + 68431, + 68414, + 68425, + 68416, + 68432, + 68422, + 68428, + 68408, + 68401, + 68410, + 68414, + 68454, + 68406, + 68431, + 68424, + 68453, + 68387, + 68411, + 68420, + 68408, + 68431, + 68380, + 68414, + 68439, + 68375, + 68382, + 68390, + 68412, + 68433, + 68448, + 68463, + 68417, + 68409, + 68445, + 68432, + 68409, + 68412, + 68419, + 68433, + 68409, + 68421, + 68394, + 68423, + 68401, + 68366, + 68392, + 68414, + 68417, + 68401, + 68387, + 68459, + 68407, + 68432, + 68397, + 68434, + 68388, + 68418, + 68425, + 68423, + 68404, + 68416, + 68424, + 68407, + 68408, + 68429, + 68438, + 68405, + 68447, + 68427, + 68453, + 68405, + 68384, + 68416, + 68461, + 68412, + 68400, + 68426, + 68437, + 68408, + 68407, + 68417, + 68422, + 68411, + 68391, + 68375, + 68422, + 68397, + 68415, + 68409, + 68427, + 68384, + 68460, + 68414, + 68432, + 68421, + 68410, + 68425, + 68416, + 68382, + 68407, + 68407, + 68395, + 68426, + 68428, + 68422, + 68402, + 68408, + 68404, + 68392, + 68406, + 68419, + 68392, + 68416, + 68414, + 68445, + 68402, + 68417, + 68436, + 68392, + 68398, + 68420, + 68479, + 68473, + 68419, + 68429, + 68400, + 68399, + 68410, + 68443, + 68406, + 68405, + 68407, + 68437, + 68412, + 68416, + 68397, + 68427, + 68396, + 68414, + 68406, + 68429, + 68416, + 68391, + 68409, + 68407, + 68437, + 68422, + 68442, + 68394, + 68431, + 68396, + 68395, + 68394, + 68403, + 68401, + 68404, + 68413, + 68384, + 68408, + 68403, + 68491, + 68414, + 68441, + 68396, + 68421, + 68420, + 68406, + 68414, + 68425, + 68411, + 68428, + 68391, + 68429, + 68443, + 68417, + 68423, + 68471, + 68410, + 68429, + 68421, + 68384, + 68438, + 68419, + 68436, + 68389, + 68423, + 68417, + 68412, + 68395, + 68405, + 68434, + 68406, + 68415, + 68417, + 68387, + 68419, + 68413, + 68429, + 68455, + 68412, + 68384, + 68427, + 68389, + 68424, + 68415, + 68416, + 68412, + 68410, + 68358, + 68400, + 68380, + 68436, + 68412, + 68427, + 68385, + 68416, + 68387, + 68390, + 68424, + 68402, + 68372, + 68407, + 68419, + 68386, + 68415, + 68406, + 68394, + 68430, + 68438, + 68397, + 68415, + 68423, + 68383, + 68398, + 68414, + 68413, + 68401, + 68404, + 68415, + 68423, + 68407, + 68402, + 68417, + 68394, + 68400, + 68418, + 68388, + 68389, + 68413, + 68382, + 68397, + 68412, + 68372, + 68408, + 68451, + 68402, + 68402, + 68421, + 68406, + 68401, + 68402, + 68412, + 68398, + 68408, + 68405, + 68429, + 68382, + 68396, + 68430, + 68405, + 68452, + 68412, + 68400, + 68381, + 68406, + 68440, + 68432, + 68407, + 68395, + 68380, + 68396, + 68424, + 68402, + 68416, + 68430, + 68419, + 68425, + 68418, + 68414, + 68413, + 68404, + 68392, + 68408, + 68410, + 68411, + 68441, + 68435, + 68398, + 68410, + 68373, + 68443, + 68393, + 68417, + 68403, + 68398, + 68435, + 68392, + 68385, + 68435, + 68375, + 68408, + 68393, + 68424, + 68407, + 68404, + 68416, + 68449, + 68442, + 68431, + 68419, + 68389, + 68443, + 68379, + 68431, + 68414, + 68419, + 68408, + 68394, + 68404, + 68409, + 68399, + 68406, + 68411, + 68441, + 68427, + 68409, + 68412, + 68395, + 68430, + 68411, + 68424, + 68387, + 68426, + 68388, + 68384, + 68424, + 68419, + 68452, + 68427, + 68401, + 68366, + 68430, + 68415, + 68397, + 68429, + 68395, + 68392, + 68431, + 68428, + 68411, + 68388, + 68415, + 68396, + 68418, + 68397, + 68418, + 68402, + 68449, + 68409, + 68409, + 68411, + 68431, + 68391, + 68431, + 68394, + 68401, + 68395, + 68427, + 68434, + 68432, + 68404, + 68420, + 68397, + 68408, + 68421, + 68425, + 68442, + 68435, + 68428, + 68397, + 68406, + 68391, + 68391, + 68397, + 68415, + 68402, + 68423, + 68376, + 68412, + 68436, + 68415, + 68417, + 68421, + 68386, + 68410, + 68403, + 68381, + 68417, + 68387, + 68432, + 68414, + 68431, + 68446, + 68430, + 68401, + 68374, + 68420, + 68420, + 68397, + 68426, + 68433, + 68395, + 68375, + 68433, + 68418, + 68426, + 68440, + 68414, + 68405, + 68406, + 68418, + 68419, + 68435, + 68427, + 68393, + 68450, + 68401, + 68460, + 68444, + 68392, + 68410, + 68421, + 68419, + 68414, + 68457, + 68451, + 68425, + 68444, + 68386, + 68420, + 68424, + 68376, + 68393, + 68429, + 68439, + 68414, + 68414, + 68450, + 68390, + 68410, + 68442, + 68410, + 68423, + 68406, + 68420, + 68400, + 68452, + 68425, + 68401, + 68408, + 68381, + 68410, + 68401, + 68446, + 68391, + 68441, + 68388, + 68458, + 68409, + 68432, + 68420, + 68450, + 68406, + 68447, + 68401, + 68413, + 68420, + 68412, + 68430, + 68380, + 68398, + 68365, + 68427, + 68440, + 68427, + 68430, + 68397, + 68403, + 68423, + 68404, + 68389, + 68428, + 68436, + 68451, + 68448, + 68413, + 68389, + 68377, + 68411, + 68415, + 68460, + 68411, + 68418, + 68435, + 68405, + 68399, + 68421, + 68402, + 68405, + 68387, + 68429, + 68393, + 68403, + 68423, + 68411, + 68436, + 68416, + 68443, + 68401, + 68390, + 68434, + 68395, + 68431, + 68400, + 68413, + 68392, + 68453, + 68445, + 68405, + 68429, + 68440, + 68416, + 68439, + 68451, + 68431, + 68436, + 68403, + 68396, + 68394, + 68426, + 68401, + 68440, + 68423, + 68424, + 68368, + 68415, + 68425, + 68406, + 68389, + 68382, + 68411, + 68396, + 68408, + 68376, + 68381, + 68417, + 68411, + 68411, + 68404, + 68427, + 68427, + 68406, + 68382, + 68424, + 68426, + 68434, + 68421, + 68402, + 68438, + 68411, + 68451, + 68417, + 68435, + 68400, + 68400, + 68393, + 68393, + 68412, + 68455, + 68434, + 68387, + 68401, + 68369, + 68404, + 68411, + 68385, + 68416, + 68428, + 68407, + 68424, + 68400, + 68394, + 68414, + 68424, + 68429, + 68381, + 68430, + 68443, + 68406, + 68413, + 68404, + 68419, + 68396, + 68409, + 68404, + 68410, + 68421, + 68440, + 68412, + 68421, + 68397, + 68393, + 68428, + 68420, + 68413, + 68412, + 68434, + 68386, + 68404, + 68418, + 68401, + 68403, + 68381, + 68424, + 68421, + 68395, + 68400, + 68426, + 68417, + 68388, + 68428, + 68434, + 68439, + 68428, + 68407, + 68414, + 68409, + 68424, + 68406, + 68426, + 68403, + 68446, + 68457, + 68411, + 68423, + 68394, + 68401, + 68389, + 68400, + 68410, + 68396, + 68397, + 68414, + 68406, + 68407, + 68456, + 68440, + 68408, + 68391, + 68418, + 68421, + 68494, + 68418, + 68377, + 68426, + 68428, + 68442, + 68357, + 68391, + 68464, + 68357, + 68373, + 68408, + 68427, + 68432, + 68431, + 68422, + 68401, + 68421, + 68391, + 68417, + 68414, + 68397, + 68409, + 68410, + 68406, + 68402, + 68383, + 68431, + 68434, + 68416, + 68413, + 68427, + 68430, + 68396, + 68415, + 68436, + 68428, + 68408, + 68405, + 68426, + 68407, + 68427, + 68436, + 68416, + 68390, + 68427, + 68387, + 68403, + 68426, + 68425, + 68394, + 68431, + 68446, + 68418, + 68398, + 68410, + 68415, + 68419, + 68422, + 68426, + 68407, + 68410, + 68418, + 68418, + 68470, + 68411, + 68432, + 68409, + 68428, + 68398, + 68416, + 68421, + 68431, + 68389, + 68426, + 68428, + 68424, + 68446, + 68416, + 68422, + 68457, + 68444, + 68418, + 68425, + 68436, + 68398, + 68380, + 68399, + 68402, + 68451, + 68396, + 68399, + 68433, + 68451, + 68403, + 68444, + 68383, + 68442, + 68404, + 68416, + 68382, + 68436, + 68420, + 68374, + 68401, + 68401, + 68432, + 68401, + 68433, + 68400, + 68402, + 68431, + 68450, + 68449, + 68391, + 68416, + 68426, + 68398, + 68396, + 68382, + 68400, + 68447, + 68421, + 68394, + 68383, + 68441, + 68422, + 68372, + 68443, + 68419, + 68406, + 68435, + 68455, + 68412, + 68411, + 68416, + 68390, + 68413, + 68389, + 68410, + 68437, + 68430, + 68418, + 68419, + 68417, + 68439, + 68391, + 68419, + 68436, + 68425, + 68411, + 68379, + 68446, + 68416, + 68417, + 68409, + 68422, + 68434, + 68407, + 68403, + 68423, + 68427, + 68444, + 68411, + 68400, + 68430, + 68420, + 68410, + 68451, + 68413, + 68435, + 68413, + 68404, + 68442, + 68438, + 68410, + 68381, + 68442, + 68410, + 68427, + 68416, + 68384, + 68413, + 68425, + 68386, + 68415, + 68405, + 68405, + 68444, + 68443, + 68408, + 68406, + 68464, + 68409, + 68394, + 68426, + 68412, + 68422, + 68444, + 68399, + 68418, + 68390, + 68431, + 68398, + 68408, + 68418, + 68442, + 68397, + 68426, + 68408, + 68417, + 68415, + 68421, + 68407, + 68415, + 68423, + 68407, + 68400, + 68377, + 68389, + 68429, + 68412, + 68406, + 68417, + 68404, + 68398, + 68437, + 68436, + 68411, + 68409, + 68381, + 68409, + 68418, + 68426, + 68407, + 68434, + 68397, + 68389, + 68433, + 68418, + 68369, + 68418, + 68402, + 68418, + 68431, + 68392, + 68421, + 68430, + 68416, + 68447, + 68422, + 68401, + 68419, + 68429, + 68391, + 68383, + 68372, + 68463, + 68405, + 68421, + 68418, + 68400, + 68374, + 68417, + 68395, + 68394, + 68423, + 68383, + 68376, + 68406, + 68433, + 68375, + 68434, + 68406, + 68431, + 68441, + 68412, + 68413, + 68422, + 68471, + 68425, + 68443, + 68390, + 68370, + 68406, + 68376, + 68467, + 68408, + 68459, + 68403, + 68406, + 68425, + 68415, + 68391, + 68408, + 68425, + 68416, + 68430, + 68410, + 68431, + 68412, + 68413, + 68394, + 68459, + 68447, + 68464, + 68382, + 68426, + 68388, + 68443, + 68429, + 68415, + 68410, + 68431, + 68428, + 68423, + 68386, + 68423, + 68412, + 68392, + 68403, + 68410, + 68428, + 68385, + 68426, + 68376, + 68431, + 68415, + 68417, + 68422, + 68419, + 68405, + 68425, + 68382, + 68437, + 68387, + 68405, + 68387, + 68432, + 68411, + 68387, + 68418, + 68418, + 68401, + 68357, + 68422, + 68437, + 68414, + 68427, + 68425, + 68450, + 68422, + 68385, + 68415, + 68410, + 68453, + 68373, + 68425, + 68413, + 68434, + 68405, + 68422, + 68394, + 68484, + 68421, + 68453, + 68404, + 68422, + 68441, + 68398, + 68409, + 68396, + 68394, + 68425, + 68396, + 68412, + 68414, + 68399, + 68439, + 68422, + 68418, + 68404, + 68414, + 68420, + 68468, + 68417, + 68396, + 68419, + 68423, + 68414, + 68412, + 68438, + 68358, + 68439, + 68425, + 68421, + 68370, + 68427, + 68421, + 68399, + 68475, + 68415, + 68397, + 68391, + 68397, + 68433, + 68366, + 68416, + 68397, + 68402, + 68395, + 68392, + 68393, + 68421, + 68417, + 68422, + 68407, + 68376, + 68396, + 68396, + 68465, + 68444, + 68419, + 68412, + 68403, + 68385, + 68397, + 68415, + 68422, + 68412, + 68389, + 68406, + 68384, + 68423, + 68421, + 68396, + 68425, + 68429, + 68417, + 68432, + 68385, + 68436, + 68428, + 68385, + 68387, + 68426, + 68399, + 68438, + 68435, + 68436, + 68420, + 68416, + 68454, + 68379, + 68421, + 68396, + 68425, + 68443, + 68429, + 68433, + 68433, + 68455, + 68443, + 68409, + 68424, + 68406, + 68413, + 68417, + 68420, + 68414, + 68449, + 68418, + 68423, + 68416, + 68427, + 68442, + 68400, + 68450, + 68391, + 68441, + 68442, + 68409, + 68394, + 68414, + 68418, + 68429, + 68433, + 68411, + 68441, + 68402, + 68385, + 68412, + 68420, + 68426, + 68389, + 68410, + 68374, + 68414, + 68400, + 68421, + 68410, + 68462, + 68393, + 68386, + 68374, + 68402, + 68410, + 68375, + 68407, + 68414, + 68435, + 68421, + 68375, + 68453, + 68377, + 68444, + 68466, + 68461, + 68386, + 68429, + 68425, + 68398, + 68408, + 68426, + 68409, + 68433, + 68438, + 68394, + 68425, + 68398, + 68390, + 68407, + 68394, + 68419, + 68393, + 68410, + 68426, + 68413, + 68427, + 68410, + 68390, + 68429, + 68409, + 68396, + 68416, + 68412, + 68441, + 68426, + 68401, + 68406, + 68452, + 68408, + 68365, + 68388, + 68471, + 68414, + 68396, + 68377, + 68396, + 68418, + 68398, + 68441, + 68420, + 68406, + 68403, + 68400, + 68428, + 68414, + 68399, + 68418, + 68387, + 68414, + 68379, + 68397, + 68411, + 68458, + 68454, + 68422, + 68437, + 68411, + 68409, + 68436, + 68404, + 68378, + 68405, + 68473, + 68381, + 68409, + 68418, + 68421, + 68432, + 68401, + 68388, + 68395, + 68400, + 68422, + 68383, + 68402, + 68402, + 68414, + 68420, + 68420, + 68415, + 68401, + 68411, + 68410, + 68442, + 68400, + 68411, + 68427, + 68426, + 68391, + 68451, + 68384, + 68430, + 68461, + 68420, + 68441, + 68408, + 68386, + 68401, + 68422, + 68429, + 68435, + 68442, + 68406, + 68441, + 68414, + 68413, + 68397, + 68449, + 68423, + 68414, + 68408, + 68413, + 68457, + 68438, + 68409, + 68411, + 68384, + 68419, + 68428, + 68414, + 68422, + 68401, + 68400, + 68451, + 68403, + 68408, + 68429, + 68386, + 68396, + 68408, + 68482, + 68394, + 68393, + 68437, + 68418, + 68408, + 68417, + 68425, + 68422, + 68416, + 68421, + 68448, + 68415, + 68417, + 68435, + 68411, + 68434, + 68422, + 68414, + 68405, + 68411, + 68433, + 68406, + 68429, + 68402, + 68407, + 68422, + 68423, + 68410, + 68460, + 68449, + 68427, + 68428, + 68388, + 68447, + 68416, + 68400, + 68381, + 68414, + 68402, + 68399, + 68419, + 68407, + 68438, + 68408, + 68398, + 68401, + 68408, + 68428, + 68418, + 68400, + 68396, + 68435, + 68429, + 68445, + 68430, + 68443, + 68464, + 68419, + 68429, + 68443, + 68467, + 68429, + 68440, + 68476, + 68362, + 68454, + 68447, + 68438, + 68427, + 68452, + 68382, + 68427, + 68397, + 68433, + 68431, + 68383, + 68478, + 68424, + 68423, + 68413, + 68454, + 68445, + 68404, + 68445, + 68417, + 68404, + 68436, + 68487, + 68392, + 68420, + 68441, + 68416, + 68440, + 68442, + 68413, + 68398, + 68376, + 68420, + 68408, + 68448, + 68426, + 68409, + 68439, + 68426, + 68447, + 68439, + 68390, + 68416, + 68433, + 68397, + 68390, + 68429, + 68418, + 68402, + 68443, + 68421, + 68398, + 68422, + 68395, + 68408, + 68404, + 68416, + 68406, + 68438, + 68375, + 68414, + 68385, + 68405, + 68413, + 68401, + 68402, + 68454, + 68413, + 68403, + 68423, + 68404, + 68396, + 68434, + 68378, + 68405, + 68394, + 68420, + 68445, + 68421, + 68371, + 68405, + 68396, + 68382, + 68391, + 68412, + 68404, + 68390, + 68399, + 68408, + 68422, + 68406, + 68417, + 68414, + 68399, + 68415, + 68420, + 68421, + 68427, + 68428, + 68435, + 68449, + 68400, + 68407, + 68420, + 68436, + 68423, + 68406, + 68404, + 68419, + 68411, + 68434, + 68414, + 68425, + 68438, + 68442, + 68416, + 68446, + 68381, + 68385, + 68389, + 68413, + 68405, + 68412, + 68410, + 68434, + 68424, + 68408, + 68417, + 68440, + 68400, + 68404, + 68426, + 68421, + 68441, + 68407, + 68398, + 68435, + 68387, + 68421, + 68398, + 68402, + 68372, + 68424, + 68387, + 68433, + 68375, + 68384, + 68401, + 68427, + 68404, + 68409, + 68412, + 68406, + 68398, + 68406, + 68391, + 68408, + 68432, + 68407, + 68404, + 68429, + 68408, + 68379, + 68402, + 68423, + 68406, + 68424, + 68417, + 68422, + 68476, + 68412, + 68411, + 68429, + 68411, + 68412, + 68372, + 68454, + 68418, + 68421, + 68401, + 68403, + 68436, + 68381, + 68410, + 68418, + 68420, + 68408, + 68435, + 68410, + 68430, + 68453, + 68443, + 68421, + 68410, + 68420, + 68387, + 68402, + 68388, + 68409, + 68411, + 68402, + 68398, + 68424, + 68419, + 68407, + 68462, + 68405, + 68388, + 68412, + 68416, + 68430, + 68476, + 68419, + 68408, + 68417, + 68405, + 68408, + 68420, + 68399, + 68415, + 68399, + 68431, + 68426, + 68402, + 68400, + 68417, + 68419, + 68409, + 68428, + 68394, + 68399, + 68420, + 68429, + 68384, + 68398, + 68423, + 68415, + 68409, + 68442, + 68418, + 68416, + 68435, + 68416, + 68385, + 68378, + 68387, + 68418, + 68401, + 68408, + 68450, + 68409, + 68416, + 68411, + 68395, + 68399, + 68401, + 68427, + 68430, + 68432, + 68372, + 68363, + 68381, + 68410, + 68421, + 68431, + 68417, + 68398, + 68411, + 68421, + 68399, + 68402, + 68387, + 68398, + 68415, + 68403, + 68419, + 68420, + 68374, + 68386, + 68415, + 68406, + 68385, + 68455, + 68391, + 68429, + 68376, + 68368, + 68394, + 68396, + 68392, + 68393, + 68394, + 68385, + 68399, + 68392, + 68459, + 68383, + 68430, + 68405, + 68388, + 68408, + 68407, + 68426, + 68407, + 68403, + 68418, + 68420, + 68397, + 68435, + 68454, + 68415, + 68410, + 68438, + 68375, + 68403, + 68412, + 68407, + 68412, + 68382, + 68446, + 68397, + 68420, + 68385, + 68396, + 68415, + 68418, + 68433, + 68411, + 68421, + 68398, + 68392, + 68396, + 68417, + 68398, + 68409, + 68404, + 68405, + 68384, + 68438, + 68444, + 68418, + 68428, + 68418, + 68411, + 68431, + 68383, + 68461, + 68428, + 68378, + 68392, + 68404, + 68416, + 68414, + 68389, + 68409, + 68426, + 68400, + 68438, + 68376, + 68372, + 68425, + 68405, + 68397, + 68461, + 68414, + 68411, + 68430, + 68406, + 68410, + 68438, + 68431, + 68416, + 68389, + 68415, + 68408, + 68480, + 68442, + 68418, + 68402, + 68403, + 68419, + 68374, + 68407, + 68408, + 68392, + 68420, + 68430, + 68380, + 68436, + 68397, + 68414, + 68418, + 68405, + 68392, + 68434, + 68422, + 68406, + 68394, + 68396, + 68408, + 68409, + 68418, + 68437, + 68417, + 68421, + 68388, + 68455, + 68418, + 68422, + 68434, + 68431, + 68398, + 68424, + 68413, + 68410, + 68429, + 68435, + 68377, + 68411, + 68398, + 68394, + 68388, + 68410, + 68393, + 68422, + 68406, + 68414, + 68416, + 68413, + 68413, + 68430, + 68418, + 68428, + 68431, + 68431, + 68420, + 68419, + 68426, + 68452, + 68411, + 68414, + 68405, + 68384, + 68408, + 68433, + 68423, + 68412, + 68402, + 68425, + 68398, + 68409, + 68420, + 68411, + 68408, + 68390, + 68403, + 68412, + 68428, + 68409, + 68410, + 68401, + 68390, + 68445, + 68391, + 68420, + 68367, + 68417, + 68395, + 68418, + 68409, + 68438, + 68431, + 68390, + 68409, + 68383, + 68418, + 68415, + 68382, + 68432, + 68430, + 68446, + 68410, + 68454, + 68453, + 68433, + 68435, + 68454, + 68406, + 68387, + 68424, + 68408, + 68407, + 68415, + 68393, + 68396, + 68381, + 68434, + 68415, + 68438, + 68431, + 68399, + 68423, + 68420, + 68411, + 68435, + 68445, + 68403, + 68414, + 68432, + 68411, + 68417, + 68423, + 68439, + 68433, + 68419, + 68425, + 68412, + 68427, + 68416, + 68388, + 68404, + 68439, + 68459, + 68386, + 68424, + 68380, + 68459, + 68406, + 68402, + 68405, + 68440, + 68419, + 68416, + 68418, + 68443, + 68412, + 68393, + 68425, + 68414, + 68425, + 68389, + 68416, + 68406, + 68410, + 68428, + 68425, + 68452, + 68407, + 68402, + 68417, + 68385, + 68378, + 68431, + 68423, + 68435, + 68401, + 68428, + 68415, + 68423, + 68419, + 68419, + 68365, + 68434, + 68435, + 68415, + 68397, + 68407, + 68424, + 68424, + 68450, + 68435, + 68408, + 68386, + 68433, + 68386, + 68421, + 68392, + 68416, + 68448, + 68415, + 68403, + 68417, + 68409, + 68398, + 68425, + 68418, + 68430, + 68440, + 68407, + 68414, + 68438, + 68440, + 68466, + 68399, + 68454, + 68419, + 68399, + 68409, + 68400, + 68428, + 68403, + 68404, + 68405, + 68416, + 68408, + 68447, + 68411, + 68406, + 68391, + 68406, + 68436, + 68401, + 68420, + 68408, + 68424, + 68381, + 68401, + 68410, + 68414, + 68443, + 68468, + 68438, + 68450, + 68400, + 68415, + 68385, + 68384, + 68383, + 68414, + 68425, + 68432, + 68394, + 68405, + 68410, + 68432, + 68428, + 68393, + 68434, + 68414, + 68391, + 68431, + 68416, + 68442, + 68420, + 68406, + 68436, + 68414, + 68402, + 68441, + 68432, + 68417, + 68424, + 68412, + 68430, + 68407, + 68399, + 68413, + 68430, + 68407, + 68409, + 68419, + 68413, + 68422, + 68405, + 68409, + 68410, + 68451, + 68427, + 68432, + 68415, + 68386, + 68434, + 68371, + 68419, + 68383, + 68422, + 68434, + 68415, + 68418, + 68426, + 68428, + 68385, + 68421, + 68410, + 68436, + 68416, + 68468, + 68414, + 68385, + 68429, + 68423, + 68438, + 68423, + 68411, + 68386, + 68411, + 68419, + 68387, + 68419, + 68392, + 68435, + 68412, + 68412, + 68452, + 68417, + 68402, + 68383, + 68380, + 68412, + 68437, + 68399, + 68425, + 68375, + 68435, + 68417, + 68435, + 68432, + 68404, + 68419, + 68438, + 68389, + 68444, + 68432, + 68438, + 68443, + 68416, + 68450, + 68431, + 68419, + 68429, + 68438, + 68465, + 68379, + 68387, + 68409, + 68386, + 68436, + 68442, + 68390, + 68406, + 68393, + 68426, + 68421, + 68394, + 68407, + 68432, + 68402, + 68391, + 68400, + 68398, + 68407, + 68397, + 68422, + 68406, + 68513, + 68419, + 68401, + 68481, + 68440, + 68438, + 68410, + 68433, + 68448, + 68409, + 68380, + 68436, + 68439, + 68410, + 68394, + 68386, + 68388, + 68463, + 68423, + 68425, + 68428, + 68434, + 68452, + 68428, + 68429, + 68410, + 68408, + 68404, + 68451, + 68386, + 68400, + 68419, + 68389, + 68419, + 68381, + 68405, + 68401, + 68433, + 68414, + 68407, + 68448, + 68445, + 68426, + 68427, + 68444, + 68410, + 68436, + 68416, + 68419, + 68407, + 68440, + 68406, + 68381, + 68432, + 68416, + 68404, + 68390, + 68409, + 68420, + 68402, + 68388, + 68456, + 68423, + 68409, + 68426, + 68437, + 68423, + 68427, + 68417, + 68395, + 68389, + 68453, + 68442, + 68423, + 68399, + 68405, + 68440, + 68430, + 68429, + 68406, + 68392, + 68399, + 68403, + 68410, + 68387, + 68406, + 68436, + 68416, + 68415, + 68403, + 68447, + 68421, + 68444, + 68414, + 68425, + 68442, + 68404, + 68410, + 68438, + 68447, + 68428, + 68384, + 68422, + 68411, + 68378, + 68424, + 68396, + 68416, + 68426, + 68452, + 68395, + 68408, + 68431, + 68427, + 68429, + 68416, + 68400, + 68394, + 68434, + 68404, + 68408, + 68394, + 68462, + 68456, + 68425, + 68467, + 68425, + 68429, + 68409, + 68415, + 68409, + 68424, + 68406, + 68404, + 68422, + 68396, + 68395, + 68409, + 68412, + 68405, + 68418, + 68397, + 68431, + 68382, + 68414, + 68396, + 68422, + 68389, + 68399, + 68408, + 68385, + 68420, + 68430, + 68417, + 68425, + 68416, + 68417, + 68421, + 68416, + 68434, + 68421, + 68428, + 68399, + 68414, + 68432, + 68452, + 68442, + 68408, + 68418, + 68396, + 68408, + 68411, + 68411, + 68438, + 68441, + 68419, + 68423, + 68399, + 68388, + 68383, + 68427, + 68408, + 68418, + 68401, + 68431, + 68435, + 68424, + 68408, + 68373, + 68417, + 68412, + 68403, + 68395, + 68407, + 68437, + 68389, + 68431, + 68431, + 68401, + 68382, + 68470, + 68398, + 68409, + 68403, + 68402, + 68416, + 68412, + 68433, + 68455, + 68419, + 68433, + 68400, + 68420, + 68426, + 68430, + 68428, + 68400, + 68438, + 68441, + 68354, + 68402, + 68435, + 68421, + 68438, + 68406, + 68429, + 68370, + 68406, + 68415, + 68422, + 68399, + 68439, + 68385, + 68411, + 68458, + 68412, + 68410, + 68389, + 68412, + 68442, + 68448, + 68379, + 68423, + 68406, + 68423, + 68411, + 68418, + 68405, + 68414, + 68448, + 68485, + 68409, + 68402, + 68400, + 68403, + 68454, + 68430, + 68408, + 68450, + 68405, + 68427, + 68423, + 68398, + 68694, + 68391, + 68400, + 68477, + 68443, + 68413, + 68431, + 68425, + 68401, + 68377, + 68413, + 68429, + 68414, + 68401, + 68408, + 68420, + 68397, + 68398, + 68427, + 68401, + 68438, + 68417, + 68437, + 68448, + 68422, + 68410, + 68420, + 68408, + 68416, + 68413, + 68412, + 68442, + 68415, + 68405, + 68397, + 68407, + 68433, + 68414, + 68426, + 68409, + 68453, + 68424, + 68428, + 68414, + 68441, + 68407, + 68400, + 68408, + 68408, + 68434, + 68401, + 68398, + 68417, + 68420, + 68391, + 68431, + 68406, + 68423, + 68437, + 68416, + 68457, + 68451, + 68427, + 68415, + 68444, + 68440, + 68425, + 68398, + 68417, + 68437, + 68378, + 68393, + 68437, + 68413, + 68422, + 68431, + 68465, + 68447, + 68470, + 68441, + 68428, + 68422, + 68453, + 68441, + 68439, + 68447, + 68430, + 68455, + 68428, + 68417, + 68453, + 68421, + 68384, + 68413, + 68408, + 68413, + 68429, + 68415, + 68414, + 68400, + 68430, + 68391, + 68478, + 68427, + 68408, + 68394, + 68415, + 68378, + 68391, + 68450, + 68406, + 68441, + 68462, + 68399, + 68442, + 68420, + 68395, + 68432, + 68420, + 68396, + 68450, + 68435, + 68419, + 68377, + 68427, + 68396, + 68445, + 68402, + 68413, + 68425, + 68383, + 68395, + 68432, + 68431, + 68414, + 68423, + 68430, + 68542, + 68448, + 68405, + 68391, + 68406, + 68424, + 68410, + 68410, + 68424, + 68383, + 68454, + 68434, + 68446, + 68423, + 68440, + 68422, + 68416, + 68418, + 68398, + 68421, + 68430, + 68403, + 68405, + 68392, + 68380, + 68424, + 68459, + 68458, + 68449, + 68424, + 68394, + 68406, + 68413, + 68427, + 68403, + 68417, + 68400, + 68430, + 68454, + 68414, + 68406, + 68420, + 68439, + 68398, + 68411, + 68391, + 68394, + 68431, + 68411, + 68386, + 68414, + 68424, + 68393, + 68405, + 68408, + 68401, + 68408, + 68421, + 68451, + 68447, + 68411, + 68425, + 68396, + 68409, + 68431, + 68400, + 68394, + 68433, + 68422, + 68411, + 68423, + 68460, + 68416, + 68446, + 68458, + 68439, + 68444, + 68412, + 68382, + 68422, + 68427, + 68431, + 68418, + 68416, + 68413, + 68439, + 68448, + 68426, + 68428, + 68411, + 68374, + 68411, + 68430, + 68418, + 68402, + 68422, + 68389, + 68443, + 68413, + 68395, + 68373, + 68426, + 68415, + 68401, + 68406, + 68407, + 68396, + 68406, + 68389, + 68377, + 68424, + 68429, + 68410, + 68431, + 68408, + 68405, + 68408, + 68443, + 68419, + 68416, + 68431, + 68420, + 68409, + 68431, + 68451, + 68432, + 68424, + 68421, + 68418, + 68433, + 68401, + 68402, + 68414, + 68410, + 68418, + 68406, + 68454, + 68420, + 68396, + 68466, + 68396, + 68390, + 68425, + 68418, + 68452, + 68435, + 68424, + 68411, + 68410, + 68415, + 68394, + 68417, + 68430, + 68411, + 68424, + 68414, + 68412, + 68418, + 68474, + 68444, + 68434, + 68435, + 68423, + 68372, + 68394, + 68424, + 68410, + 68401, + 68390, + 68445, + 68409, + 68394, + 68435, + 68404, + 68381, + 68425, + 68457, + 68393, + 68440, + 68403, + 68408, + 68401, + 68424, + 68411, + 68416, + 68422, + 68426, + 68458, + 68397, + 68400, + 68388, + 68410, + 68412, + 68390, + 68406, + 68394, + 68451, + 68413, + 68390, + 68394, + 68385, + 68398, + 68400, + 68399, + 68397, + 68433, + 68386, + 68378, + 68374, + 68380, + 68421, + 68380, + 68423, + 68420, + 68419, + 68409, + 68430, + 68429, + 68423, + 68381, + 68404, + 68390, + 68422, + 68398, + 68380, + 68397, + 68418, + 68422, + 68385, + 68419, + 68417, + 68412, + 68389, + 68402, + 68391, + 68399, + 68395, + 68425, + 68422, + 68384, + 68412, + 68397, + 68397, + 68408, + 68382, + 68396, + 68397, + 68393, + 68423, + 68427, + 68391, + 68399, + 68431, + 68456, + 68364, + 68408, + 68405, + 68387, + 68423, + 68383, + 68412, + 68390, + 68403, + 68405, + 68404, + 68458, + 68406, + 68400, + 68444, + 68441, + 68421, + 68452, + 68441, + 68444, + 68370, + 68391, + 68432, + 68409, + 68401, + 68399, + 68394, + 68410, + 68376, + 68365, + 68432, + 68418, + 68387, + 68434, + 68436, + 68405, + 68430, + 68402, + 68401, + 68448, + 68402, + 68412, + 68420, + 68400, + 68417, + 68392, + 68422, + 68393, + 68440, + 68424, + 68384, + 68398, + 68436, + 68410, + 68476, + 68388, + 68418, + 68402, + 68431, + 68423, + 68398, + 68395, + 68412, + 68436, + 68417, + 68397, + 68416, + 68430, + 68446, + 68402, + 68400, + 68405, + 68406, + 68416, + 68441, + 68417, + 68387, + 68400, + 68421, + 68437, + 68435, + 68430, + 68408, + 68456, + 68386, + 68434, + 68416, + 68400, + 68443, + 68433, + 68407, + 68388, + 68443, + 68440, + 68419, + 68406, + 68408, + 68404, + 68513, + 68464, + 68392, + 68406, + 68444, + 68418, + 68406, + 68457, + 68411, + 68411, + 68405, + 68401, + 68750, + 68404, + 68435, + 68427, + 68406, + 68446, + 68402, + 68433, + 68433, + 68411, + 68381, + 68382, + 68414, + 68428, + 68451, + 68442, + 68462, + 68421, + 68398, + 68401, + 68418, + 68413, + 68385, + 68438, + 68451, + 68417, + 68431, + 68393, + 68450, + 68379, + 68436, + 68468, + 68432, + 68421, + 68408, + 68413, + 68403, + 68406, + 68430, + 68389, + 68418, + 68410, + 68440, + 68467, + 68423, + 68724, + 68406, + 68421, + 68433, + 68427, + 68398, + 68399, + 68454, + 68446, + 68399, + 68430, + 68447, + 68425, + 68411, + 68415, + 68400, + 68408, + 68415, + 68413, + 68389, + 68386, + 68413, + 68422, + 68419, + 68436, + 68446, + 68425, + 68453, + 68473, + 68428, + 68429, + 68399, + 68376, + 68404, + 68382, + 68406, + 68455, + 68416, + 68414, + 68428, + 68416, + 68419, + 68452, + 68484, + 68386, + 68415, + 68380, + 68392, + 68422, + 68418, + 68423, + 68434, + 68424, + 68431, + 68423, + 68415, + 68441, + 68423, + 68446, + 68437, + 68425, + 68440, + 68411, + 68411, + 68447, + 68394, + 68426, + 68418, + 68374, + 68397, + 68426, + 68429, + 68439, + 68446, + 68405, + 68426, + 68419, + 68387, + 68424, + 68429, + 68387, + 68414, + 68436, + 68444, + 68398, + 68434, + 68416, + 68461, + 68413, + 68430, + 68439, + 68399, + 68396, + 68391, + 68397, + 68397, + 68419, + 68368, + 68377, + 68425, + 68368, + 68371, + 68378, + 68441, + 68399, + 68394, + 68441, + 68398, + 68453, + 68372, + 68407, + 68432, + 68393, + 68420, + 68469, + 68403, + 68423, + 68407, + 68390, + 68362, + 68396, + 68387, + 68384, + 68403, + 68393, + 68375, + 68417, + 68413, + 68428, + 68417, + 68441, + 68402, + 68405, + 68435, + 68419, + 68408, + 68419, + 68394, + 68426, + 68431, + 68408, + 68405, + 68432, + 68425, + 68409, + 68428, + 68420, + 68433, + 68445, + 68433, + 68423, + 68416, + 68412, + 68416, + 68440, + 68447, + 68436, + 68423, + 68437, + 68415, + 68387, + 68429, + 68419, + 68419, + 68396, + 68366, + 68391, + 68401, + 68427, + 68427, + 68382, + 68421, + 68398, + 68411, + 68391, + 68414, + 68419, + 68435, + 68421, + 68422, + 68446, + 68434, + 68418, + 68417, + 68398, + 68413, + 68404, + 68401, + 68415, + 68434, + 68433, + 68425, + 68430, + 68419, + 68416, + 68405, + 68415, + 68397, + 68435, + 68418, + 68425, + 68413, + 68623, + 68422, + 68434, + 68435, + 68455, + 68422, + 68418, + 68433, + 68418, + 68433, + 68441, + 68439, + 68409, + 68430, + 68450, + 68420, + 68421, + 68400, + 68424, + 68420, + 68449, + 68420, + 68408, + 68432, + 68399, + 68408, + 68442, + 68424, + 68389, + 68409, + 68412, + 68441, + 68389, + 68427, + 68388, + 68421, + 68392, + 68457, + 68389, + 68386, + 68389, + 68425, + 68439, + 68393, + 68400, + 68446, + 68416, + 68439, + 68420, + 68431, + 68405, + 68429, + 68396, + 68390, + 68409, + 68404, + 68424, + 68385, + 68401, + 68438, + 68392, + 68459, + 68407, + 68415, + 68420, + 68420, + 68448, + 68419, + 68402, + 68463, + 68395, + 68438, + 68384, + 68421, + 68466, + 68411, + 68386, + 68433, + 68405, + 68407, + 68420, + 68408, + 68423, + 68406, + 68422, + 68428, + 68413, + 68403, + 68409, + 68397, + 68399, + 68421, + 68424, + 68443, + 68385, + 68419, + 68435, + 68419, + 68397, + 68430, + 68384, + 68415, + 68450, + 68377, + 68428, + 68410, + 68400, + 68382, + 68385, + 68415, + 68394, + 68419, + 68413, + 68382, + 68400, + 68373, + 68409, + 68443, + 68447, + 68427, + 68433, + 68378, + 68408, + 68407, + 68399, + 68424, + 68401, + 68414, + 68437, + 68417, + 68423, + 68436, + 68372, + 68411, + 68451, + 68423, + 68415, + 68416, + 68409, + 68398, + 68445, + 68398, + 68387, + 68403, + 68413, + 68400, + 68415, + 68424, + 68389, + 68415, + 68444, + 68432, + 68429, + 68417, + 68459, + 68420, + 68392, + 68404, + 68458, + 68423, + 68449, + 68407, + 68397, + 68394, + 68391, + 68419, + 68423, + 68403, + 68445, + 68411, + 68427, + 68425, + 68441, + 68403, + 68377, + 68429, + 68414, + 68419, + 68445, + 68383, + 68410, + 68438, + 68405, + 68415, + 68437, + 68429, + 68424, + 68421, + 68425, + 68410, + 68423, + 68394, + 68419, + 68393, + 68428, + 68396, + 68422, + 68389, + 68442, + 68448, + 68384, + 68412, + 68446, + 68411, + 68430, + 80858, + 68364, + 68401, + 68376, + 68439, + 68450, + 68436, + 68398, + 68411, + 68413, + 68413, + 68422, + 68393, + 68401, + 68422, + 68432, + 68492, + 68471, + 68403, + 68388, + 68420, + 68386, + 68415, + 68409, + 68425, + 68390, + 68461, + 68434, + 68399, + 68418, + 68434, + 68410, + 68416, + 68428, + 68410, + 68412, + 68407, + 68418, + 68410, + 68426, + 68429, + 68431, + 68372, + 68407, + 68430, + 68382, + 68431, + 68429, + 68418, + 68429, + 68391, + 68414, + 68447, + 68431, + 68443, + 68407, + 68443, + 68404, + 68417, + 68405, + 68376, + 68452, + 68476, + 68388, + 68426, + 68388, + 68418, + 68425, + 68413, + 68428, + 68410, + 68391, + 68403, + 68411, + 68381, + 68384, + 68424, + 68427, + 68409, + 68448, + 68404, + 68408, + 68430, + 68429, + 68430, + 68416, + 68374, + 68393, + 68443, + 68424, + 68435, + 68448, + 68437, + 68403, + 68394, + 68387, + 68400, + 68425, + 68390, + 68420, + 68419, + 68410, + 68468, + 68412, + 68463, + 68427, + 68470, + 68392, + 68419, + 68392, + 68900, + 68416, + 68427, + 68407, + 68415, + 68414, + 68432, + 68414, + 68407, + 68429, + 68426, + 68393, + 68418, + 68431, + 68450, + 68474, + 68418, + 68429, + 68447, + 68415, + 68429, + 68381, + 69719, + 70804, + 70845, + 70853, + 70856, + 70824, + 70843, + 70854, + 70822, + 70853, + 70831, + 70840, + 68414, + 68380, + 68419, + 68416, + 68393, + 68393, + 68382, + 68410, + 68420, + 68403, + 68402, + 68413, + 68392, + 68417, + 68417, + 68423, + 68409, + 68420, + 68399, + 68393, + 68427, + 68406, + 68436, + 68427, + 68453, + 68434, + 68422, + 68436, + 68432, + 68432, + 68438, + 68421, + 68403, + 69030, + 68423, + 68403, + 68452, + 68412, + 68397, + 68402, + 68401, + 68405, + 68382, + 68395, + 68413, + 68363, + 68396, + 68403, + 68410, + 68421, + 68412, + 68416, + 68481, + 68448, + 68407, + 68413, + 68423, + 68408, + 68408, + 68454, + 68415, + 68451, + 68437, + 68417, + 68396, + 68431, + 68397, + 68432, + 68445, + 68391, + 68423, + 68431, + 68433, + 68431, + 68558, + 68407, + 68434, + 68416, + 68442, + 68416, + 68410, + 68387, + 68423, + 68431, + 68411, + 68429, + 68420, + 68437, + 68417, + 68416, + 68441, + 68414, + 68449, + 68417, + 68394, + 68426, + 68431, + 68433, + 68406, + 68456, + 68419, + 68392, + 68431, + 68414, + 68452, + 68418, + 68414, + 68433, + 68419, + 68423, + 68413, + 68394, + 68401, + 68427, + 68413, + 68395, + 68397, + 68372, + 68393, + 68384, + 68415, + 68419, + 68402, + 68385, + 68401, + 68392, + 68407, + 68415, + 68407, + 68421, + 68383, + 68409, + 68385, + 68418, + 68409, + 68400, + 68425, + 68417, + 68418, + 68418, + 68433, + 68416, + 68427, + 68441, + 68433, + 68424, + 68454, + 68411, + 68437, + 68395, + 68458, + 68415, + 68439, + 68435, + 68376, + 68406, + 68423, + 68407, + 68424, + 68415, + 68395, + 68425, + 68405, + 68431, + 68419, + 68400, + 68418, + 68396, + 68404, + 68434, + 68417, + 68389, + 68404, + 68400, + 68404, + 68377, + 68422, + 68404, + 68403, + 68416, + 68421, + 68379, + 68399, + 68378, + 68425, + 68432, + 68376, + 68420, + 68420, + 68411, + 68393, + 68415, + 68427, + 68406, + 68452, + 68388, + 68416, + 68441, + 68414, + 68452, + 68412, + 68403, + 68414, + 68386, + 68414, + 68436, + 68441, + 68405, + 68422, + 68426, + 68401, + 68428, + 68400, + 68412, + 68418, + 68429, + 68444, + 68426, + 68406, + 68414, + 68409, + 68390, + 68392, + 68423, + 68403, + 68400, + 68417, + 68412, + 68429, + 68401, + 68379, + 68403, + 68410, + 68445, + 68404, + 68397, + 68407, + 68422, + 68409, + 68427, + 68375, + 68415, + 68424, + 68393, + 68411, + 68433, + 68398, + 68469, + 68418, + 68374, + 68415, + 68410, + 68395, + 68420, + 68431, + 68431, + 68386, + 68386, + 68435, + 68427, + 68406, + 68434, + 68457, + 68429, + 68401, + 68499, + 68417, + 68385, + 68388, + 68405, + 68398, + 68432, + 68424, + 68382, + 68419, + 68436, + 68390, + 68389, + 68393, + 68413, + 68408, + 68461, + 68394, + 68390, + 68375, + 68421, + 68400, + 68403, + 68426, + 68419, + 68396, + 68433, + 68401, + 68404, + 68392, + 68374, + 68422, + 68438, + 68385, + 68432, + 68413, + 68424, + 68411, + 68378, + 68386, + 68401, + 68427, + 68414, + 68384, + 68410, + 68435, + 68414, + 68408, + 68406, + 68391, + 68420, + 68388, + 68421, + 68384, + 68417, + 68450, + 68388, + 68437, + 68413, + 68378, + 68401, + 68419, + 68377, + 68402, + 68412, + 68424, + 68382, + 68436, + 68388, + 68386, + 68381, + 68416, + 68422, + 68435, + 68416, + 68407, + 68404, + 68409, + 68406, + 68443, + 68380, + 68408, + 68434, + 68395, + 68428, + 68442, + 68423, + 68427, + 68400, + 68434, + 68413, + 68394, + 68376, + 68412, + 68450, + 68441, + 68417, + 68396, + 68418, + 68402, + 68385, + 68391, + 68415, + 68387, + 68404, + 69102, + 68412, + 68389, + 68423, + 68395, + 68432, + 68416, + 68379, + 68407, + 68398, + 68401, + 68388, + 68401, + 68396, + 68407, + 68406, + 68448, + 68408, + 68431, + 68368, + 68407, + 68427, + 68782, + 68386, + 68398, + 68400, + 68403, + 68414, + 68436, + 68397, + 68410, + 68406, + 68413, + 68425, + 68521, + 68384, + 68409, + 68416, + 68478, + 68405, + 68437, + 68396, + 68423, + 68371, + 68377, + 68430, + 68414, + 68428, + 68418, + 68446, + 68393, + 68437, + 68393, + 68409, + 68388, + 68404, + 68422, + 68396, + 68420, + 68421, + 68456, + 68439, + 68407, + 68414, + 68441, + 68444, + 68435, + 68457, + 68400, + 68427, + 68440, + 68399, + 68376, + 68427, + 68427, + 68396, + 68421, + 68411, + 68431, + 68446, + 68388, + 68415, + 68415, + 68406, + 68409, + 68413, + 68405, + 68378, + 68420, + 68438, + 68432, + 68422, + 68417, + 68423, + 68418, + 68421, + 68401, + 68400, + 68409, + 68393, + 68771, + 68652, + 68425, + 68394, + 68408, + 68408, + 68411, + 68414, + 68402, + 68392, + 68409, + 68408, + 68385, + 68394, + 68416, + 68382, + 68404, + 68401, + 68407, + 68377, + 68420, + 68437, + 68441, + 68420, + 68402, + 68424, + 68410, + 68420, + 68412, + 68412, + 68443, + 68399, + 68400, + 68406, + 68439, + 68418, + 68384, + 68403, + 68447, + 68415, + 68410, + 68390, + 68405, + 68384, + 68428, + 68398, + 68404, + 68414, + 68421, + 68417, + 68444, + 68394, + 68390, + 68415, + 68406, + 68431, + 68408, + 68384, + 68412, + 68382, + 68405, + 68387, + 68448, + 68421, + 68402, + 68385, + 68408, + 68397, + 68388, + 68429, + 68373, + 68401, + 68392, + 68397, + 68419, + 68434, + 68433, + 68410, + 68411, + 68411, + 68389, + 68390, + 68438, + 68413, + 68405, + 68427, + 68416, + 68460, + 68409, + 68434, + 68414, + 68417, + 68431, + 68420, + 68385, + 68398, + 68429, + 68422, + 68447, + 68409, + 68406, + 68411, + 68417, + 68400, + 68429, + 68427, + 68430, + 68444, + 68415, + 68412, + 68434, + 68461, + 68403, + 68413, + 68383, + 68413, + 68451, + 68423, + 68425, + 68403, + 68406, + 68394, + 68384, + 68444, + 68430, + 68393, + 68365, + 68389, + 68430, + 68424, + 68393, + 68382, + 68380, + 68416, + 68457, + 68406, + 68381, + 68392, + 68383, + 68397, + 68414, + 68431, + 68401, + 68411, + 68419, + 68388, + 68374, + 68408, + 68411, + 68410, + 68412, + 68419, + 68436, + 68432, + 68419, + 68417, + 68386, + 68431, + 68415, + 68417, + 68383, + 68372, + 68382, + 68426, + 68376, + 68368, + 68457, + 68406, + 68415, + 68401, + 68416, + 68394, + 68419, + 68440, + 68414, + 68404, + 68407, + 68416, + 68399, + 68410, + 68419, + 68453, + 68391, + 68407, + 68387, + 68389, + 68406, + 68426, + 68431, + 68434, + 68353, + 68420, + 68403, + 68422, + 68427, + 68435, + 68402, + 68435, + 68386, + 68440, + 68400, + 68429, + 68406, + 68401, + 68400, + 68418, + 68398, + 68410, + 68405, + 68431, + 68429, + 68388, + 68419, + 68432, + 68398, + 68404, + 68419, + 68401, + 68411, + 68394, + 68408, + 68428, + 68421, + 68422, + 68389, + 68410, + 68405, + 68399, + 68407, + 68415, + 68429, + 68366, + 68404, + 68430, + 68428, + 68429, + 68399, + 68412, + 68380, + 68433, + 68385, + 68399, + 68431, + 68439, + 68448, + 68453, + 68376, + 68416, + 68434, + 68417, + 68396, + 68437, + 68418, + 68432, + 68417, + 68413, + 68405, + 68406, + 68440, + 68434, + 68437, + 68373, + 68429, + 68425, + 68413, + 68418, + 68402, + 68444, + 68419, + 68377, + 68456, + 68439, + 68408, + 68438, + 68422, + 68415, + 68374, + 68407, + 68384, + 68424, + 68422, + 68405, + 68450, + 68404, + 68437, + 68418, + 68379, + 68415, + 68420, + 68394, + 68391, + 68428, + 68389, + 68392, + 68387, + 68425, + 68417, + 68500, + 68426, + 68435, + 68442, + 68419, + 68392, + 68431, + 68428, + 68427, + 68439, + 68439, + 68385, + 68425, + 68409, + 68439, + 68458, + 68385, + 68407, + 68389, + 68413, + 68401, + 68407, + 68419, + 68436, + 68447, + 68412, + 68450, + 68417, + 68425, + 68390, + 68406, + 68413, + 68413, + 68416, + 68422, + 68387, + 68401, + 68421, + 68434, + 68404, + 68421, + 68419, + 68430, + 68404, + 68402, + 68384, + 68423, + 68426, + 68402, + 68410, + 68424, + 68405, + 68406, + 68422, + 68424, + 68388, + 68382, + 68413, + 68405, + 68399, + 68410, + 68406, + 68442, + 68450, + 68371, + 68459, + 68445, + 68388, + 68477, + 68408, + 68409, + 68430, + 68422, + 68427, + 68436, + 68430, + 68443, + 68406, + 68435, + 68434, + 68402, + 68419, + 68402, + 68403, + 68435, + 68407, + 68398, + 68414, + 68389, + 68390, + 68458, + 68418, + 68438, + 68384, + 68396, + 68408, + 68391, + 68401, + 68441, + 68411, + 68423, + 68376, + 68431, + 68434, + 68425, + 68404, + 68376, + 68391, + 68425, + 68438, + 68440, + 68396, + 68401, + 68408, + 68389, + 68458, + 68409, + 68440, + 68426, + 68437, + 68422, + 68405, + 68440, + 68429, + 68444, + 68430, + 68423, + 68427, + 68455, + 68427, + 68430, + 68413, + 68387, + 68376, + 68404, + 68451, + 68435, + 68408, + 68407, + 68422, + 68409, + 68423, + 68415, + 68415, + 68431, + 68411, + 68413, + 68414, + 68399, + 68424, + 68389, + 68429, + 68404, + 68418, + 68412, + 68407, + 68399, + 68392, + 68404, + 68413, + 68420, + 68410, + 68383, + 68404, + 68417, + 68395, + 68413, + 68409, + 68380, + 68427, + 68435, + 68451, + 68418, + 68414, + 68433, + 68417, + 68406, + 68442, + 68391, + 68437, + 68429, + 68449, + 68439, + 68447, + 68395, + 68391, + 68430, + 68417, + 68416, + 68391, + 68438, + 68442, + 68416, + 68398, + 68445, + 68450, + 68432, + 68421, + 68406, + 68469, + 68429, + 68449, + 68422, + 68407, + 68423, + 68411, + 68424, + 68410, + 68391, + 68453, + 68425, + 68393, + 68438, + 68426, + 68425, + 68451, + 68403, + 68437, + 68412, + 68414, + 68391, + 68435, + 68410, + 68404, + 68452, + 68400, + 68430, + 68431, + 68436, + 68438, + 68391, + 68412, + 68443, + 68434, + 68427, + 68428, + 68432, + 68419, + 68376, + 68418, + 68421, + 68415, + 68445, + 68401, + 68412, + 68408, + 68385, + 68409, + 68418, + 68403, + 68409, + 68408, + 68413, + 68412, + 68441, + 68419, + 68425, + 68440, + 68454, + 68417, + 68421, + 68429, + 68426, + 68411, + 68432, + 68454, + 68410, + 68459, + 68424, + 68399, + 68423, + 68402, + 68384, + 68397, + 68406, + 68424, + 68404, + 68415, + 68423, + 68475, + 68424, + 68430, + 68406, + 68412, + 68454, + 68428, + 68404, + 68422, + 68388, + 68381, + 68426, + 68456, + 68424, + 68405, + 68441, + 68428, + 68397, + 68420, + 68430, + 68468, + 68434, + 68418, + 68434, + 68432, + 68417, + 68469, + 68426, + 68385, + 68409, + 68438, + 68390, + 68436, + 68439, + 68426, + 68410, + 68419, + 68419, + 68399, + 68370, + 68407, + 68417, + 68433, + 68408, + 68417, + 68425, + 68438, + 68444, + 68430, + 68415, + 68413, + 68456, + 68432, + 68422, + 68435, + 68395, + 68424, + 68454, + 68398, + 68414, + 68380, + 68388, + 68402, + 68421, + 68423, + 68385, + 68447, + 68403, + 68423, + 68435, + 68392, + 68414, + 68441, + 68410, + 68445, + 68421, + 68424, + 68459, + 68375, + 68413, + 68372, + 68429, + 68414, + 68421, + 68428, + 68426, + 68402, + 68405, + 68428, + 68404, + 68424, + 68423, + 68373, + 68423, + 68419, + 68417, + 68456, + 68426, + 68408, + 68410, + 68430, + 68391, + 68432, + 68405, + 68370, + 68423, + 68405, + 68395, + 68422, + 68431, + 68462, + 68437, + 68409, + 68398, + 68423, + 68390, + 68428, + 68449, + 68417, + 68387, + 68421, + 68381, + 68447, + 68393, + 68392, + 68417, + 68429, + 68428, + 68414, + 68403, + 68426, + 68430, + 68446, + 68420, + 68420, + 68399, + 68420, + 68412, + 68426, + 68394, + 68412, + 68391, + 68399, + 68399, + 68456, + 68420, + 68406, + 68404, + 68390, + 68450, + 68396, + 68406, + 68427, + 68438, + 68416, + 68407, + 68401, + 68437, + 68436, + 68421, + 68406, + 68441, + 68442, + 68411, + 68395, + 68440, + 68397, + 68403, + 68429, + 68394, + 68450, + 68416, + 68421, + 68418, + 68415, + 68414, + 68422, + 68448, + 68450, + 68433, + 68420, + 68397, + 68416, + 68424, + 68391, + 68435, + 68484, + 68425, + 68394, + 68415, + 68371, + 68490, + 68419, + 68418, + 68461, + 68452, + 68440, + 68473, + 68388, + 68404, + 68430, + 68446, + 68406, + 68402, + 68411, + 68435, + 68413, + 68407, + 68431, + 68413, + 68416, + 68371, + 68416, + 68419, + 68429, + 68430, + 68427, + 68393, + 68419, + 68450, + 68419, + 68425, + 68430, + 68389, + 68407, + 68427, + 68397, + 68391, + 68435, + 68416, + 68431, + 68437, + 68413, + 68451, + 68418, + 68414, + 68421, + 68431, + 68344, + 68389, + 68404, + 68391, + 68387, + 68414, + 68401, + 68425, + 68448, + 68402, + 68396, + 68431, + 68412, + 68447, + 68423, + 68407, + 68429, + 68454, + 68419, + 68413, + 68446, + 68436, + 68425, + 68407, + 68415, + 68431, + 68437, + 68440, + 68405, + 68418, + 68397, + 68408, + 68401, + 68415, + 68413, + 68414, + 68386, + 68427, + 68429, + 68424, + 68411, + 68407, + 68443, + 68416, + 68402, + 68373, + 68390, + 68429, + 68397, + 68388, + 68399, + 68426, + 68430, + 68448, + 68420, + 68420, + 68392, + 68418, + 68444, + 68403, + 68415, + 68444, + 68422, + 68422, + 68399, + 68396, + 68377, + 68416, + 68443, + 68424, + 68421, + 68385, + 68404, + 68415, + 68393, + 68426, + 68440, + 68411, + 68429, + 68457, + 68414, + 68407, + 68406, + 68417, + 68412, + 68409, + 68427, + 68441, + 68395, + 68381, + 68409, + 68408, + 68425, + 68412, + 68390, + 68397, + 68429, + 68439, + 68406, + 68412, + 68413, + 68415, + 68415, + 68385, + 68411, + 68417, + 68385, + 68394, + 68398, + 68386, + 68384, + 68446, + 68399, + 68400, + 68435, + 68449, + 68387, + 68413, + 68418, + 68407, + 68388, + 68388, + 68841, + 68373, + 68423, + 68422, + 68375, + 68449, + 68428, + 68402, + 68425, + 68416, + 68409, + 68434, + 68412, + 68412, + 68406, + 68405, + 68416, + 68374, + 68456, + 68408, + 68412, + 68403, + 68389, + 68415, + 68420, + 68414, + 68411, + 68455, + 68457, + 68430, + 68412, + 68387, + 68398, + 68418, + 68391, + 68393, + 68409, + 68421, + 68369, + 68391, + 68400, + 68431, + 68403, + 68408, + 68397, + 68393, + 68407, + 68451, + 68435, + 68433, + 68403, + 68404, + 79236, + 68403, + 68423, + 68391, + 68406, + 68405, + 68387, + 68462, + 68370, + 68435, + 68426, + 68420, + 68419, + 68375, + 68443, + 68422, + 68440, + 68377, + 68370, + 68421, + 68407, + 68401, + 68414, + 68409, + 68373, + 68396, + 68397, + 68389, + 68419, + 68384, + 68399, + 68411, + 68414, + 68404, + 68383, + 68423, + 68419, + 68403, + 68377, + 68407, + 68401, + 68396, + 68404, + 68411, + 68381, + 68413, + 68394, + 68414, + 68446, + 68436, + 68437, + 68423, + 68408, + 68409, + 68399, + 68381, + 68380, + 68404, + 68416, + 68397, + 68420, + 68406, + 68421, + 68410, + 68415, + 68434, + 68404, + 68406, + 68393, + 68417, + 68401, + 68390, + 68369, + 68441, + 68393, + 68406, + 68366, + 68381, + 68404, + 68399, + 68430, + 68419, + 68389, + 68400, + 68448, + 68411, + 68474, + 68422, + 68386, + 68458, + 68432, + 68423, + 68400, + 68388, + 68435, + 68391, + 68411, + 68386, + 68422, + 68388, + 68436, + 68432, + 68427, + 68410, + 68474, + 68406, + 68427, + 68427, + 68427, + 68447, + 68410, + 68404, + 68436, + 68392, + 68445, + 68443, + 68443, + 68449, + 68420, + 68422, + 68422, + 68388, + 68388, + 68388, + 68434, + 68427, + 68420, + 68431, + 68448, + 68403, + 68419, + 68370, + 68418, + 68382, + 68395, + 68409, + 68392, + 68403, + 68411, + 68413, + 68405, + 68384, + 68429, + 68465, + 68430, + 68393, + 68377, + 68404, + 68434, + 68395, + 68380, + 68408, + 68394, + 68410, + 68421, + 68418, + 68400, + 68449, + 68410, + 68372, + 68416, + 68409, + 68392, + 68413, + 68412, + 68395, + 68386, + 68412, + 68398, + 68427, + 68412, + 68421, + 68385, + 68441, + 68418, + 68436, + 68432, + 68463, + 68400, + 68400, + 68407, + 68395, + 68419, + 68410, + 68427, + 68424, + 68402, + 68428, + 68423, + 68408, + 68431, + 68422, + 68402, + 68420, + 68384, + 68423, + 68422, + 68406, + 68406, + 68393, + 68432, + 68396, + 68388, + 68426, + 68394, + 68418, + 68435, + 68392, + 68412, + 68401, + 68428, + 68415, + 68412, + 68415, + 68389, + 68403, + 68367, + 68412, + 68413, + 68410, + 68930, + 68413, + 68390, + 68398, + 68410, + 68383, + 68429, + 68392, + 68382, + 68390, + 68412, + 68439, + 68415, + 68435, + 68403, + 68416, + 68460, + 68436, + 68431, + 68416, + 68448, + 68401, + 68471, + 68408, + 68454, + 68422, + 68435, + 68397, + 68405, + 68426, + 68427, + 68449, + 68396, + 68411, + 68413, + 68416, + 68404, + 68406, + 68411, + 68394, + 68416, + 68388, + 68428, + 68445, + 68411, + 68398, + 68378, + 68396, + 68435, + 68384, + 68433, + 68381, + 68406, + 68442, + 68397, + 68429, + 68409, + 68415, + 68419, + 68420, + 68424, + 68419, + 68406, + 68380, + 68420, + 68372, + 68431, + 68409, + 68400, + 68411, + 68422, + 68403, + 68435, + 68427, + 68434, + 68446, + 68441, + 68408, + 68411, + 68419, + 68409, + 68390, + 68403 + ], + "sample_count": 15277 + }, + { + "pubkey": "5HA9AndxymWsd4x71oEqUJ3fJ2uB5ojkgTXVJCjGxuEc", + "epoch": 89, + "origin_device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "target_device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "link_pk": "AWHkNcwF7PSNCJq4vgypxuAYfyeyHTWMySGefSN7VpFn", + "origin_device_location_pk": "7vt8Tnbk15S6JA1uhRQVtbuL7w39zY8jeQ5iqgjsqLfP", + "target_device_location_pk": "HiJWeiLKcw6tcBmdX65x1Hd1XtjkQXLgEpPBhfkW2qxw", + "origin_device_agent_pk": "6LHRkoEGNAPH2fFndCudK94pQU9v5Hk4DEKX253CbNHy", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242127283425, + "samples": [ + 11016, + 11019, + 11056, + 11090, + 11035, + 11036, + 11027, + 11015, + 11049, + 11005, + 11020, + 11024, + 11019, + 11038, + 11029, + 11025, + 11010, + 11041, + 11048, + 11033, + 11016, + 11042, + 11025, + 11062, + 11044, + 11009, + 11035, + 11033, + 11053, + 11026, + 11096, + 11051, + 11086, + 11030, + 11079, + 11042, + 11033, + 11020, + 11005, + 11012, + 11039, + 11045, + 11045, + 11031, + 11046, + 11056, + 11051, + 11000, + 11034, + 11029, + 11046, + 11049, + 11045, + 11019, + 11062, + 11013, + 11022, + 11006, + 11031, + 11006, + 11021, + 11021, + 11019, + 11033, + 11018, + 11021, + 11028, + 11015, + 11067, + 11039, + 11051, + 11024, + 11047, + 11017, + 11040, + 11016, + 11050, + 11010, + 11046, + 11049, + 11040, + 11026, + 11047, + 11021, + 11017, + 11054, + 11013, + 11034, + 11063, + 11035, + 11030, + 11038, + 11023, + 11024, + 11059, + 11036, + 11052, + 11061, + 11024, + 11030, + 11054, + 11072, + 11045, + 11024, + 11021, + 11030, + 11100, + 11048, + 11022, + 10998, + 11012, + 11002, + 11021, + 11014, + 11026, + 11057, + 11028, + 10999, + 11067, + 10993, + 11021, + 11009, + 11047, + 11010, + 11096, + 11007, + 11019, + 11019, + 11080, + 11024, + 11043, + 11023, + 11069, + 11022, + 11038, + 11016, + 11055, + 11058, + 11019, + 11013, + 11021, + 11036, + 11085, + 11025, + 11011, + 11052, + 11072, + 10999, + 11040, + 11057, + 11078, + 11052, + 11017, + 11032, + 11058, + 11016, + 11107, + 11026, + 11024, + 11040, + 11048, + 11014, + 11047, + 11032, + 11042, + 11032, + 11988, + 11020, + 11022, + 11035, + 11049, + 11038, + 11060, + 11030, + 11052, + 11039, + 11035, + 11060, + 11038, + 11017, + 11040, + 11041, + 11040, + 11079, + 11042, + 11077, + 11051, + 11044, + 11051, + 11021, + 11036, + 11043, + 11052, + 11021, + 11058, + 11024, + 11052, + 11033, + 11036, + 11045, + 11028, + 11023, + 11028, + 11036, + 11024, + 11022, + 11052, + 11024, + 11052, + 11019, + 11054, + 11025, + 11058, + 11018, + 11040, + 11011, + 11023, + 11107, + 10997, + 11052, + 11076, + 11024, + 11036, + 11035, + 11051, + 11014, + 11059, + 11021, + 11064, + 11034, + 11026, + 11014, + 11108, + 11052, + 11040, + 11138, + 11073, + 11029, + 11046, + 11000, + 11013, + 11017, + 10988, + 11021, + 11072, + 11054, + 11029, + 11011, + 11022, + 11057, + 11077, + 11021, + 11015, + 11059, + 11019, + 11029, + 11051, + 11073, + 11010, + 11033, + 11047, + 11058, + 11053, + 11059, + 11005, + 11019, + 11022, + 11025, + 11063, + 11047, + 11039, + 11000, + 11035, + 11018, + 11064, + 11024, + 11047, + 11013, + 11074, + 11011, + 11061, + 11014, + 11020, + 11005, + 11003, + 11014, + 11063, + 11023, + 11030, + 11017, + 11016, + 11026, + 11057, + 11048, + 11034, + 11032, + 11016, + 11007, + 11033, + 11015, + 11049, + 11033, + 11021, + 11023, + 11060, + 11039, + 11073, + 11039, + 11009, + 11029, + 11052, + 11016, + 11052, + 11029, + 11083, + 11026, + 11034, + 11017, + 11035, + 11029, + 11057, + 11047, + 11067, + 11002, + 11036, + 11023, + 11034, + 11020, + 11049, + 11046, + 11025, + 11062, + 11022, + 11064, + 11030, + 11033, + 11029, + 11051, + 11045, + 11074, + 11028, + 11051, + 11010, + 11084, + 11024, + 11004, + 11046, + 11003, + 11063, + 11008, + 11017, + 11039, + 11069, + 11044, + 11017, + 11029, + 11056, + 11008, + 11072, + 11040, + 11026, + 11034, + 11041, + 11017, + 11020, + 11040, + 11072, + 11023, + 11028, + 11031, + 11060, + 11048, + 11015, + 11010, + 11025, + 13071, + 11043, + 11010, + 11006, + 11026, + 11084, + 11034, + 11074, + 11024, + 11035, + 11014, + 11057, + 11050, + 11040, + 11012, + 11014, + 11026, + 11017, + 11053, + 11059, + 10995, + 11024, + 11059, + 11043, + 11024, + 11024, + 11016, + 11009, + 11038, + 11048, + 11049, + 11031, + 11014, + 11039, + 11048, + 11091, + 11035, + 11037, + 11006, + 11058, + 11000, + 11032, + 11034, + 11069, + 11027, + 11014, + 11020, + 11249, + 11025, + 11043, + 11054, + 11062, + 11005, + 11011, + 11016, + 11060, + 11028, + 11345, + 11019, + 11059, + 11038, + 11018, + 11040, + 11020, + 11010, + 11017, + 11017, + 11035, + 11032, + 11069, + 11036, + 11008, + 11038, + 11028, + 11022, + 11041, + 11023, + 11034, + 11040, + 11032, + 11012, + 11056, + 11039, + 11095, + 11025, + 11044, + 11043, + 11026, + 11024, + 11055, + 11068, + 11059, + 11018, + 11053, + 11031, + 11017, + 11077, + 11070, + 11029, + 11033, + 11074, + 11083, + 11033, + 11040, + 11013, + 11032, + 11026, + 11022, + 11029, + 11078, + 11070, + 11036, + 11014, + 11033, + 11055, + 11027, + 11024, + 11042, + 11024, + 11025, + 11027, + 11057, + 11022, + 11028, + 11022, + 11032, + 11029, + 11075, + 11061, + 11043, + 11035, + 11046, + 11007, + 11064, + 11022, + 11020, + 11018, + 11057, + 11129, + 11055, + 11025, + 11030, + 11035, + 11018, + 11047, + 11016, + 11048, + 11045, + 11089, + 11009, + 10989, + 11051, + 11018, + 11016, + 11065, + 11032, + 11031, + 11060, + 11010, + 11020, + 11035, + 11021, + 11047, + 11040, + 11045, + 11023, + 11010, + 11027, + 11212, + 11060, + 11046, + 11017, + 11021, + 11037, + 11063, + 11057, + 11026, + 11051, + 11019, + 11027, + 11024, + 11103, + 11003, + 11156, + 11063, + 11018, + 11032, + 11031, + 11040, + 10993, + 11038, + 11049, + 11053, + 11066, + 11023, + 11024, + 10995, + 11013, + 11014, + 11019, + 11057, + 11013, + 11015, + 11021, + 11011, + 11052, + 11020, + 11008, + 11017, + 11037, + 11010, + 11055, + 11000, + 11036, + 11009, + 11032, + 11018, + 11025, + 11054, + 11044, + 11031, + 11050, + 11010, + 11035, + 11005, + 11036, + 11005, + 11036, + 11025, + 11044, + 11025, + 11006, + 11047, + 11024, + 11009, + 11071, + 11032, + 11007, + 11008, + 11030, + 11012, + 11066, + 11025, + 11091, + 11038, + 11014, + 11049, + 11098, + 11028, + 11153, + 11023, + 11020, + 11027, + 11041, + 11026, + 11021, + 11065, + 11022, + 11031, + 11047, + 11025, + 11059, + 11014, + 11096, + 11012, + 11029, + 11042, + 11062, + 11036, + 11014, + 11017, + 11055, + 11069, + 11060, + 11040, + 11047, + 11021, + 11032, + 11050, + 11069, + 11061, + 11055, + 11029, + 11050, + 11031, + 11011, + 11043, + 11026, + 11027, + 11039, + 11037, + 11033, + 11123, + 11064, + 11023, + 11052, + 11067, + 11059, + 11558, + 11073, + 11040, + 11087, + 11019, + 11033, + 11031, + 11039, + 11055, + 11079, + 11012, + 11033, + 11040, + 11044, + 11054, + 11096, + 11033, + 11047, + 11055, + 11057, + 11063, + 11096, + 11026, + 11026, + 11053, + 11046, + 11044, + 11065, + 11039, + 11109, + 11020, + 11029, + 11403, + 11036, + 11017, + 11080, + 11045, + 11028, + 11035, + 11079, + 11010, + 11018, + 11037, + 11039, + 11024, + 11029, + 11042, + 11022, + 11020, + 11055, + 11030, + 11068, + 11023, + 11006, + 11080, + 11059, + 11047, + 11033, + 11071, + 11023, + 11020, + 11004, + 11012, + 11021, + 11048, + 11025, + 11048, + 11014, + 11044, + 11057, + 11003, + 11016, + 11011, + 11043, + 11049, + 11038, + 11036, + 11029, + 11027, + 11000, + 11007, + 11055, + 11033, + 11027, + 11014, + 11009, + 11022, + 11037, + 11057, + 11044, + 11069, + 11024, + 11046, + 11065, + 10994, + 11050, + 11054, + 11020, + 11031, + 11072, + 11017, + 11037, + 11037, + 11014, + 11008, + 11033, + 11003, + 11063, + 11010, + 11053, + 11027, + 11040, + 11019, + 11025, + 11050, + 11013, + 11032, + 11050, + 11017, + 11066, + 11019, + 11024, + 11041, + 11040, + 11037, + 11027, + 11052, + 11037, + 11014, + 11049, + 11010, + 11023, + 11092, + 11030, + 11023, + 11023, + 11011, + 11075, + 11030, + 11045, + 11023, + 11058, + 11060, + 11095, + 11009, + 11028, + 11026, + 11056, + 11025, + 11069, + 11029, + 11070, + 11000, + 11068, + 11029, + 11048, + 11008, + 11058, + 11042, + 11042, + 11022, + 11089, + 11018, + 11021, + 11034, + 11043, + 10998, + 11039, + 11056, + 11066, + 11033, + 11054, + 11022, + 11009, + 11033, + 11047, + 11030, + 11045, + 11032, + 11031, + 11038, + 11021, + 11026, + 11048, + 11036, + 11082, + 11076, + 11042, + 11009, + 11053, + 11038, + 11049, + 11102, + 11336, + 11018, + 11049, + 11045, + 11020, + 11025, + 11042, + 11012, + 11038, + 11042, + 11022, + 11034, + 11042, + 11035, + 11063, + 11008, + 11026, + 11053, + 11052, + 11018, + 11074, + 11035, + 11046, + 11045, + 11018, + 11020, + 11025, + 11045, + 11013, + 11027, + 11030, + 11026, + 11083, + 11013, + 11051, + 11028, + 11021, + 11010, + 11047, + 11073, + 11010, + 11049, + 11049, + 11015, + 11058, + 11020, + 11026, + 11032, + 11016, + 11054, + 11049, + 11056, + 11038, + 11034, + 11089, + 10993, + 11053, + 11016, + 11025, + 11011, + 11004, + 11004, + 11035, + 11013, + 11036, + 11056, + 11045, + 11038, + 11067, + 11092, + 11020, + 11012, + 11012, + 11018, + 11087, + 11010, + 10995, + 11021, + 11037, + 11036, + 11064, + 11034, + 11025, + 11042, + 11096, + 11009, + 11046, + 11023, + 11018, + 11021, + 11064, + 11015, + 11075, + 11052, + 11029, + 11023, + 11027, + 11013, + 11044, + 11035, + 11100, + 11027, + 11012, + 11007, + 11060, + 11032, + 11045, + 11000, + 11047, + 11024, + 11070, + 11046, + 11017, + 11021, + 11048, + 11006, + 11030, + 11058, + 11011, + 11053, + 11037, + 11020, + 11031, + 11057, + 11110, + 11048, + 11079, + 11086, + 11055, + 11024, + 11009, + 11042, + 11037, + 11011, + 11032, + 11027, + 11032, + 11009, + 11078, + 11034, + 11063, + 11010, + 11029, + 11023, + 11015, + 11027, + 11060, + 11057, + 11002, + 11012, + 11030, + 11024, + 11051, + 11111, + 11043, + 11028, + 11062, + 11040, + 11034, + 11013, + 11027, + 11043, + 11080, + 11052, + 11049, + 11047, + 11021, + 11003, + 11052, + 11051, + 11065, + 11030, + 11024, + 11066, + 11082, + 11068, + 11030, + 11058, + 11000, + 11039, + 10995, + 11082, + 11031, + 11029, + 11019, + 11037, + 11008, + 11014, + 11042, + 11087, + 11040, + 11032, + 11020, + 11019, + 11038, + 11017, + 11024, + 11046, + 11010, + 11071, + 11025, + 11013, + 11032, + 11019, + 11078, + 11027, + 11038, + 11022, + 11021, + 11010, + 11044, + 11020, + 11041, + 11049, + 11010, + 11012, + 11022, + 11049, + 11054, + 11023, + 11049, + 11028, + 11007, + 11075, + 11021, + 11008, + 11007, + 11045, + 11029, + 11015, + 11058, + 11021, + 11004, + 11003, + 11030, + 11057, + 11046, + 11076, + 11045, + 11011, + 11014, + 11030, + 11058, + 11012, + 11036, + 11024, + 11034, + 11023, + 11085, + 11068, + 11027, + 11024, + 11060, + 11045, + 11058, + 11034, + 11087, + 11033, + 11032, + 11035, + 11034, + 11006, + 11038, + 11065, + 11046, + 11043, + 11036, + 11032, + 11052, + 11026, + 11026, + 11035, + 11068, + 11035, + 11033, + 11021, + 11043, + 11033, + 11100, + 11073, + 11016, + 11010, + 11013, + 10997, + 11020, + 11029, + 11056, + 11027, + 11013, + 11089, + 11065, + 11004, + 11047, + 11025, + 11039, + 11019, + 11034, + 11009, + 11030, + 11014, + 11066, + 11819, + 11028, + 11020, + 11034, + 11017, + 11035, + 11030, + 11025, + 11002, + 11015, + 11030, + 11075, + 11008, + 11024, + 11018, + 11015, + 11007, + 11022, + 11070, + 11062, + 11030, + 11072, + 11026, + 11011, + 11033, + 11047, + 11040, + 11073, + 11028, + 11007, + 11054, + 11028, + 11351, + 11053, + 11057, + 11028, + 11013, + 11022, + 11023, + 11067, + 11014, + 11015, + 11034, + 11055, + 11020, + 11010, + 11010, + 11058, + 11030, + 11031, + 11018, + 11026, + 11022, + 11019, + 11025, + 11062, + 11018, + 11077, + 11015, + 11053, + 11004, + 11041, + 12842, + 11010, + 11030, + 11006, + 11023, + 11026, + 11111, + 11036, + 11007, + 11004, + 11020, + 11010, + 11033, + 11017, + 11031, + 11017, + 11071, + 11061, + 11035, + 11067, + 11018, + 11011, + 11017, + 11050, + 11036, + 11033, + 11049, + 11043, + 11012, + 11081, + 11009, + 11018, + 11014, + 11022, + 11050, + 11094, + 11037, + 11017, + 11017, + 11011, + 11025, + 11086, + 11047, + 11019, + 11017, + 11075, + 11028, + 11048, + 11026, + 11037, + 11024, + 11004, + 11020, + 11044, + 11038, + 11052, + 11043, + 11032, + 11054, + 11074, + 11017, + 11047, + 11008, + 11016, + 11049, + 11025, + 11052, + 11050, + 11042, + 11056, + 11013, + 11046, + 11013, + 11033, + 11016, + 11029, + 11003, + 11059, + 11009, + 11025, + 11036, + 11064, + 11007, + 11020, + 11061, + 11007, + 11027, + 11017, + 11035, + 11037, + 11033, + 11074, + 11045, + 11095, + 11075, + 11091, + 11047, + 11086, + 11073, + 11027, + 11010, + 11033, + 11016, + 11037, + 11033, + 11115, + 11020, + 11053, + 11037, + 11074, + 11026, + 11017, + 11026, + 11071, + 11074, + 11026, + 11070, + 11049, + 11025, + 11077, + 11059, + 11051, + 11057, + 11016, + 11009, + 11060, + 11018, + 11022, + 11066, + 11078, + 11037, + 11058, + 11008, + 11019, + 11037, + 11034, + 11020, + 11039, + 11038, + 11021, + 11048, + 11068, + 11044, + 11049, + 11026, + 11061, + 11019, + 11012, + 11018, + 11051, + 11071, + 11012, + 11067, + 11045, + 11039, + 11057, + 11024, + 11030, + 11048, + 11000, + 11001, + 11016, + 11007, + 11024, + 11015, + 11046, + 11010, + 11038, + 11023, + 11018, + 11072, + 11040, + 11017, + 11037, + 11025, + 11047, + 11011, + 11007, + 11018, + 11047, + 11021, + 11075, + 11023, + 11053, + 11061, + 11096, + 11028, + 11038, + 11011, + 11048, + 11013, + 11048, + 11040, + 11012, + 11046, + 11057, + 11025, + 11066, + 11015, + 11022, + 11041, + 11048, + 11021, + 11084, + 11040, + 11004, + 11064, + 11010, + 11036, + 11062, + 11030, + 11020, + 11051, + 11030, + 11024, + 11044, + 11017, + 11001, + 11030, + 11037, + 11032, + 11049, + 11021, + 11034, + 11008, + 11032, + 11050, + 11031, + 11013, + 11019, + 11064, + 11023, + 11040, + 11068, + 11060, + 11032, + 11025, + 11057, + 11047, + 11061, + 11025, + 11044, + 11037, + 11006, + 11011, + 11042, + 11033, + 11041, + 11023, + 11047, + 11035, + 11033, + 11029, + 11044, + 11013, + 11004, + 11038, + 11021, + 11023, + 11052, + 11013, + 11028, + 11055, + 11030, + 11069, + 11023, + 11008, + 11027, + 11014, + 11035, + 11057, + 11028, + 11007, + 11036, + 11024, + 11047, + 11014, + 11013, + 11002, + 11050, + 11015, + 11036, + 11023, + 11042, + 11035, + 11007, + 11020, + 11040, + 11030, + 11048, + 11004, + 11041, + 11036, + 11045, + 11029, + 11009, + 11034, + 11014, + 11040, + 11051, + 11029, + 11035, + 11060, + 11009, + 11011, + 11066, + 11016, + 11037, + 11075, + 11028, + 11060, + 11025, + 11029, + 11029, + 11014, + 11038, + 11024, + 11030, + 11056, + 11016, + 11010, + 11015, + 11003, + 11043, + 11023, + 11033, + 11040, + 11044, + 11028, + 11054, + 11050, + 11031, + 11045, + 11291, + 11055, + 11076, + 11043, + 11092, + 11061, + 11025, + 11022, + 11049, + 11038, + 11013, + 11036, + 11044, + 11019, + 11071, + 11010, + 11011, + 11024, + 11021, + 11027, + 11086, + 11008, + 11055, + 11036, + 11051, + 11039, + 11060, + 11023, + 11018, + 11034, + 11013, + 11053, + 11050, + 11051, + 11070, + 11031, + 11043, + 11042, + 11027, + 11047, + 11039, + 10998, + 11034, + 11044, + 11047, + 11067, + 11012, + 11013, + 11028, + 11062, + 11019, + 11045, + 11046, + 11003, + 11006, + 11059, + 11045, + 11025, + 11050, + 11016, + 10993, + 11026, + 11076, + 11031, + 11032, + 11023, + 11022, + 11012, + 11044, + 11030, + 11019, + 11016, + 11044, + 11008, + 11020, + 11013, + 11051, + 11018, + 11060, + 11011, + 11071, + 11018, + 11033, + 11035, + 11014, + 11012, + 11052, + 11020, + 11011, + 11014, + 10999, + 11007, + 11044, + 11045, + 11041, + 11044, + 11049, + 11023, + 11063, + 11036, + 11029, + 11068, + 11045, + 11020, + 11020, + 11033, + 11070, + 11021, + 11051, + 11013, + 11058, + 11054, + 11077, + 11003, + 11018, + 11000, + 11053, + 11003, + 11054, + 11029, + 11005, + 11050, + 11038, + 11021, + 11048, + 11036, + 11021, + 11036, + 11033, + 11013, + 11012, + 11042, + 11015, + 11023, + 11063, + 11021, + 11033, + 11044, + 11060, + 11056, + 11042, + 11064, + 11058, + 11037, + 11051, + 11039, + 11038, + 11024, + 11009, + 11014, + 11000, + 11010, + 11038, + 11058, + 11002, + 11077, + 11028, + 11032, + 11054, + 11017, + 11016, + 11025, + 11040, + 11036, + 11043, + 11029, + 11082, + 11020, + 11046, + 11049, + 11130, + 11015, + 11043, + 11018, + 11029, + 10999, + 11070, + 11066, + 11030, + 11002, + 11021, + 11016, + 11067, + 11040, + 11031, + 11031, + 11024, + 11026, + 11077, + 11011, + 11401, + 11040, + 11027, + 11014, + 11064, + 11006, + 11044, + 11038, + 11035, + 11018, + 11060, + 11096, + 11005, + 11029, + 11058, + 11017, + 11040, + 10995, + 11091, + 11025, + 11038, + 11037, + 11055, + 11025, + 11047, + 11006, + 11021, + 11039, + 11039, + 11019, + 11016, + 11073, + 11006, + 11034, + 11036, + 11012, + 11019, + 11010, + 11055, + 11033, + 11043, + 11035, + 11042, + 11020, + 11047, + 11010, + 11066, + 11064, + 11038, + 11020, + 11102, + 11054, + 11055, + 11023, + 10999, + 11020, + 11027, + 11040, + 11055, + 11034, + 11025, + 11032, + 11030, + 11008, + 11038, + 11032, + 11012, + 11044, + 11051, + 11034, + 11075, + 11019, + 11005, + 11055, + 11028, + 11019, + 11068, + 11043, + 11014, + 11025, + 11048, + 11080, + 11056, + 11038, + 11029, + 11064, + 11040, + 11029, + 11084, + 11061, + 11032, + 11059, + 11032, + 11022, + 11079, + 11027, + 11037, + 11071, + 11018, + 11054, + 11048, + 11016, + 11008, + 11039, + 11034, + 11028, + 11035, + 10998, + 11049, + 11006, + 11021, + 11037, + 11084, + 11009, + 11046, + 11027, + 11050, + 11014, + 11061, + 11044, + 11053, + 11049, + 11009, + 11063, + 11060, + 11030, + 11062, + 11046, + 11097, + 11027, + 11056, + 11004, + 11031, + 10990, + 11024, + 11015, + 11069, + 11021, + 11010, + 11010, + 11003, + 11023, + 11064, + 11045, + 11043, + 11028, + 11043, + 10999, + 11029, + 11043, + 11053, + 11038, + 11061, + 11010, + 11051, + 11050, + 11059, + 11049, + 11077, + 11053, + 11039, + 11042, + 11025, + 11021, + 11005, + 11036, + 11044, + 11017, + 11432, + 11014, + 11005, + 11046, + 11093, + 11099, + 11041, + 11029, + 11034, + 11050, + 11013, + 11022, + 11009, + 11034, + 11033, + 11004, + 11049, + 13015, + 11094, + 11021, + 11015, + 11005, + 11062, + 10999, + 11013, + 11010, + 11018, + 11029, + 11030, + 11032, + 10996, + 11037, + 11028, + 11043, + 11025, + 11019, + 11016, + 10993, + 12369, + 11027, + 11067, + 11022, + 11055, + 11040, + 11035, + 11044, + 11045, + 11024, + 11025, + 11040, + 11014, + 11076, + 11043, + 11026, + 11066, + 11041, + 11018, + 11009, + 11053, + 11041, + 11012, + 11024, + 11053, + 11039, + 11068, + 11003, + 11022, + 11036, + 11008, + 11067, + 11051, + 11009, + 11083, + 11038, + 11051, + 11019, + 11064, + 11020, + 11094, + 11044, + 11020, + 11031, + 11042, + 11020, + 11058, + 11039, + 11029, + 11012, + 11089, + 11051, + 10997, + 11069, + 11032, + 11019, + 11053, + 11003, + 11022, + 11048, + 11049, + 11037, + 11064, + 11034, + 11044, + 11004, + 11088, + 11062, + 11072, + 11015, + 11039, + 11033, + 11035, + 11034, + 11057, + 11027, + 11019, + 11037, + 11040, + 11013, + 11067, + 11034, + 11023, + 11014, + 11023, + 11034, + 11045, + 11011, + 11008, + 11078, + 14492, + 11039, + 11067, + 11058, + 11017, + 11020, + 11006, + 11007, + 11069, + 11040, + 11034, + 11030, + 11046, + 11012, + 11011, + 11029, + 11017, + 11059, + 11051, + 11006, + 11035, + 11046, + 11034, + 11082, + 11011, + 11024, + 11036, + 11024, + 11035, + 11030, + 11027, + 11022, + 11070, + 11169, + 11014, + 11040, + 11043, + 11036, + 11064, + 11022, + 11071, + 11026, + 11011, + 11010, + 11061, + 11026, + 11024, + 11033, + 11022, + 11013, + 11071, + 11011, + 11027, + 11042, + 11046, + 11020, + 11055, + 11052, + 11004, + 11035, + 11114, + 11011, + 11049, + 11005, + 11022, + 11024, + 11031, + 11045, + 11086, + 11052, + 11055, + 11019, + 11028, + 11018, + 11031, + 11032, + 11032, + 11045, + 11036, + 11072, + 11048, + 11020, + 11041, + 11036, + 11054, + 11071, + 11088, + 11041, + 11042, + 11028, + 11183, + 11091, + 11123, + 11028, + 11024, + 11037, + 11051, + 11028, + 11102, + 11018, + 11047, + 11022, + 11062, + 11024, + 11052, + 11002, + 11027, + 11061, + 11037, + 11038, + 11065, + 11028, + 11083, + 11018, + 11014, + 11032, + 11042, + 11032, + 11039, + 11020, + 11063, + 11055, + 11075, + 11029, + 11062, + 11018, + 11012, + 11005, + 11057, + 11014, + 11021, + 11022, + 11024, + 11048, + 11047, + 11019, + 11016, + 11014, + 11027, + 11033, + 11065, + 11065, + 11008, + 11022, + 11022, + 11023, + 11059, + 11021, + 11030, + 11041, + 11043, + 11022, + 11054, + 11033, + 11018, + 11026, + 11013, + 11022, + 11107, + 11021, + 11007, + 10994, + 11006, + 11037, + 11048, + 11037, + 11025, + 11025, + 11035, + 11042, + 11050, + 11019, + 11053, + 11028, + 11015, + 11031, + 11034, + 11030, + 11020, + 11023, + 11006, + 11016, + 11021, + 11014, + 11012, + 10991, + 11015, + 11008, + 11039, + 11043, + 11025, + 11048, + 11029, + 11040, + 11040, + 11000, + 11011, + 11010, + 11073, + 11033, + 11092, + 11038, + 11028, + 11012, + 11016, + 11041, + 11036, + 11311, + 11018, + 11006, + 11056, + 11078, + 11036, + 11015, + 11032, + 11016, + 11003, + 11032, + 11061, + 11070, + 11013, + 11006, + 11035, + 11029, + 11083, + 11027, + 11054, + 11021, + 11037, + 11049, + 11054, + 11029, + 11011, + 11014, + 11025, + 11019, + 11086, + 11048, + 10999, + 11020, + 11001, + 11015, + 11044, + 11024, + 11060, + 10997, + 11025, + 11005, + 11061, + 10989, + 11051, + 10994, + 11051, + 11069, + 11090, + 11025, + 11039, + 11058, + 11086, + 11032, + 11133, + 11069, + 11031, + 11017, + 11048, + 11018, + 11066, + 11016, + 11024, + 11033, + 11032, + 11000, + 11065, + 11054, + 11030, + 11006, + 11057, + 10998, + 11053, + 11030, + 11070, + 11040, + 11007, + 11015, + 11070, + 11047, + 11012, + 11045, + 11025, + 11011, + 11023, + 11014, + 11008, + 11025, + 11061, + 11034, + 11049, + 11019, + 11023, + 11051, + 11035, + 11043, + 11049, + 11052, + 11087, + 11021, + 11025, + 11027, + 11060, + 11005, + 11020, + 11050, + 11053, + 11032, + 11068, + 11025, + 11012, + 11008, + 11024, + 11001, + 11101, + 11064, + 11071, + 11027, + 11045, + 11055, + 11078, + 11043, + 11071, + 11055, + 11015, + 11052, + 11038, + 11025, + 11050, + 11053, + 11035, + 11034, + 11069, + 11049, + 11057, + 11024, + 11045, + 11033, + 11081, + 11036, + 11058, + 11020, + 11017, + 11042, + 11040, + 11042, + 11006, + 11032, + 11042, + 11040, + 11050, + 11036, + 11049, + 11034, + 11004, + 11027, + 11059, + 11033, + 11029, + 11038, + 11020, + 18378, + 11024, + 11018, + 11018, + 11025, + 11018, + 11045, + 11032, + 11022, + 11024, + 11017, + 11013, + 11060, + 11051, + 11015, + 11010, + 11017, + 11029, + 11004, + 11086, + 10993, + 11021, + 11019, + 11031, + 11066, + 11099, + 11023, + 11011, + 11016, + 11030, + 11053, + 11047, + 11029, + 11058, + 11010, + 11021, + 11031, + 11067, + 11031, + 11030, + 11012, + 11019, + 11004, + 11047, + 11041, + 11011, + 11020, + 11045, + 11095, + 11052, + 11029, + 11047, + 11016, + 11051, + 11036, + 11075, + 11053, + 11019, + 11055, + 11035, + 11005, + 11069, + 11023, + 11031, + 11040, + 11007, + 11038, + 11037, + 11032, + 11043, + 11037, + 11041, + 11018, + 11047, + 11048, + 11037, + 11016, + 11017, + 11039, + 11056, + 11078, + 11036, + 11023, + 11193, + 11030, + 11048, + 11032, + 11015, + 11022, + 11030, + 11021, + 11036, + 11028, + 11063, + 11070, + 11018, + 11043, + 11055, + 11023, + 11056, + 11013, + 11043, + 11016, + 11031, + 11011, + 11054, + 11063, + 11015, + 11031, + 11031, + 11011, + 11044, + 11020, + 11051, + 11036, + 11045, + 11010, + 11066, + 11082, + 11040, + 11072, + 11069, + 11061, + 11061, + 11044, + 11045, + 11013, + 11070, + 11062, + 11041, + 11046, + 11025, + 11083, + 11015, + 11028, + 11034, + 11045, + 11013, + 11016, + 11024, + 11009, + 11030, + 11010, + 11037, + 11010, + 11078, + 11053, + 11023, + 11054, + 11039, + 11017, + 11055, + 11062, + 11059, + 11016, + 11042, + 11006, + 11045, + 11056, + 11019, + 11018, + 11078, + 10997, + 11036, + 11053, + 11026, + 11016, + 11035, + 11014, + 11051, + 11004, + 11061, + 11016, + 11102, + 11053, + 11019, + 11047, + 11082, + 11074, + 11020, + 11035, + 11031, + 11031, + 11045, + 11045, + 11014, + 11028, + 11082, + 11089, + 11009, + 11027, + 11027, + 11010, + 11064, + 11043, + 11046, + 11037, + 11040, + 11028, + 11059, + 11062, + 11031, + 11085, + 11025, + 11000, + 11056, + 11013, + 11029, + 11007, + 11043, + 11017, + 11061, + 11136, + 11108, + 11005, + 11029, + 11037, + 11052, + 11042, + 11027, + 11034, + 11090, + 11033, + 11029, + 11017, + 11008, + 11015, + 11035, + 11023, + 11055, + 11022, + 11045, + 11023, + 11056, + 11021, + 11128, + 11039, + 11065, + 11007, + 11018, + 11031, + 11027, + 11027, + 11077, + 11033, + 11055, + 11045, + 11034, + 11009, + 11009, + 11012, + 11029, + 10998, + 11066, + 11027, + 11018, + 11016, + 11028, + 11028, + 11044, + 11036, + 11044, + 11038, + 11059, + 11031, + 11049, + 11039, + 11039, + 11017, + 11017, + 11041, + 11055, + 11000, + 11056, + 11080, + 11001, + 11022, + 11041, + 11028, + 11067, + 11010, + 11038, + 11022, + 11031, + 11126, + 11049, + 11040, + 11054, + 11054, + 11063, + 11081, + 11055, + 11027, + 11054, + 11105, + 11031, + 11028, + 11056, + 11058, + 11033, + 11012, + 11016, + 11106, + 11040, + 11082, + 11022, + 11020, + 11056, + 11008, + 11021, + 11035, + 11083, + 11038, + 11059, + 11030, + 11082, + 11035, + 11037, + 11047, + 11079, + 11051, + 11027, + 11050, + 11071, + 11046, + 11069, + 13838, + 11007, + 11044, + 11074, + 11023, + 11039, + 11041, + 11027, + 11116, + 11097, + 11031, + 11065, + 11030, + 11019, + 11031, + 11022, + 11029, + 11060, + 11030, + 11030, + 11070, + 11026, + 11016, + 11035, + 11131, + 11028, + 11028, + 11020, + 11015, + 11057, + 11008, + 11076, + 11007, + 11053, + 11039, + 11038, + 11000, + 11026, + 11048, + 11063, + 11001, + 11041, + 11074, + 11056, + 11058, + 11045, + 11038, + 11039, + 11025, + 11010, + 11040, + 11005, + 11040, + 11056, + 11023, + 11016, + 11037, + 11052, + 11015, + 11032, + 11031, + 11016, + 11015, + 11022, + 11034, + 11063, + 11057, + 11085, + 11024, + 11017, + 11043, + 11039, + 11057, + 11011, + 11086, + 11023, + 11038, + 11036, + 11051, + 11020, + 11017, + 11114, + 11026, + 11052, + 11696, + 11012, + 11050, + 11061, + 11057, + 11062, + 11043, + 11005, + 11027, + 11053, + 11011, + 11025, + 11006, + 11063, + 11031, + 11029, + 11022, + 11077, + 11029, + 11062, + 11053, + 11026, + 11044, + 11074, + 11038, + 11031, + 11040, + 11045, + 11020, + 11060, + 11060, + 11032, + 11008, + 11064, + 11029, + 11317, + 11039, + 11018, + 11110, + 11053, + 11013, + 11057, + 11082, + 11045, + 11043, + 11016, + 11051, + 11061, + 11015, + 11056, + 11058, + 11054, + 11025, + 11058, + 11020, + 11052, + 11055, + 11111, + 11013, + 11049, + 11051, + 11018, + 11030, + 11035, + 11037, + 11017, + 11012, + 11064, + 11086, + 11076, + 11020, + 11037, + 11027, + 11018, + 11022, + 11018, + 11047, + 11012, + 11052, + 11018, + 11046, + 11018, + 11020, + 11020, + 11020, + 11021, + 11062, + 11050, + 11031, + 11080, + 11034, + 11074, + 11025, + 11029, + 11025, + 11072, + 11022, + 11038, + 11018, + 11059, + 11034, + 11116, + 11029, + 11012, + 11029, + 11008, + 11022, + 11076, + 11042, + 11030, + 11052, + 11003, + 11060, + 11076, + 11057, + 11004, + 11051, + 11013, + 11024, + 11054, + 11044, + 11041, + 11026, + 11030, + 11011, + 11064, + 11031, + 11064, + 11016, + 11032, + 11008, + 11037, + 11038, + 11046, + 11048, + 11021, + 11037, + 11021, + 11020, + 11041, + 11026, + 11025, + 11038, + 11088, + 11031, + 11062, + 11062, + 11062, + 11031, + 11046, + 11062, + 11094, + 11025, + 11024, + 11051, + 11039, + 11052, + 11036, + 11022, + 11097, + 11017, + 11087, + 13716, + 11014, + 11338, + 11030, + 11015, + 11030, + 11032, + 11006, + 11018, + 11061, + 11088, + 11039, + 11035, + 11081, + 11026, + 11011, + 11041, + 11012, + 11011, + 11032, + 11064, + 11030, + 11034, + 11085, + 11052, + 11015, + 11037, + 11024, + 11018, + 11012, + 11018, + 11077, + 11030, + 11130, + 11747, + 11040, + 11086, + 11027, + 11056, + 11053, + 11049, + 11054, + 11039, + 11049, + 11026, + 11046, + 11045, + 11052, + 11048, + 11045, + 11015, + 11041, + 11023, + 11040, + 11020, + 11085, + 11004, + 11084, + 11001, + 11084, + 12709, + 11025, + 11020, + 11023, + 11012, + 11047, + 11047, + 11032, + 11023, + 11057, + 11061, + 11051, + 11031, + 11047, + 11026, + 11041, + 11105, + 11067, + 11056, + 11022, + 11032, + 11051, + 11039, + 11062, + 11040, + 11037, + 11027, + 11057, + 11008, + 11028, + 11022, + 11045, + 11057, + 11041, + 11013, + 11650, + 11062, + 11012, + 11045, + 11080, + 11045, + 11023, + 11014, + 11030, + 11055, + 11046, + 11054, + 11050, + 11030, + 11026, + 11074, + 11070, + 11044, + 11047, + 11015, + 11041, + 11080, + 11078, + 11046, + 11030, + 11051, + 11040, + 11026, + 11027, + 11012, + 11048, + 11007, + 11061, + 11034, + 11077, + 11070, + 11018, + 11058, + 11060, + 11052, + 11034, + 11036, + 11052, + 11056, + 11082, + 11037, + 11018, + 11015, + 11068, + 11044, + 11021, + 11046, + 11071, + 11048, + 11076, + 11037, + 11034, + 11040, + 11024, + 11007, + 23018, + 11020, + 11038, + 11044, + 11011, + 11002, + 11048, + 11114, + 11055, + 11050, + 11022, + 11045, + 11084, + 11041, + 11082, + 11021, + 11029, + 11039, + 11036, + 11025, + 11021, + 11003, + 11014, + 11019, + 11108, + 11038, + 11032, + 11073, + 11017, + 11033, + 11028, + 11016, + 11028, + 11014, + 11049, + 11028, + 11049, + 11017, + 11032, + 11011, + 11036, + 11036, + 11055, + 11015, + 11044, + 11022, + 11070, + 11039, + 11060, + 10996, + 11048, + 11011, + 11014, + 11067, + 11084, + 11118, + 11037, + 11062, + 11039, + 11019, + 11126, + 10995, + 11017, + 11200, + 11048, + 11024, + 11041, + 11050, + 11025, + 11038, + 11047, + 11016, + 11029, + 11065, + 11024, + 11020, + 11037, + 11000, + 11046, + 11021, + 11004, + 11007, + 11007, + 11008, + 11090, + 11045, + 11057, + 11057, + 11037, + 11015, + 11020, + 11048, + 11019, + 11028, + 11064, + 11037, + 11079, + 11088, + 11017, + 11043, + 11052, + 11011, + 11043, + 11031, + 11011, + 11061, + 11048, + 11029, + 11026, + 11054, + 11057, + 11017, + 11033, + 11008, + 11062, + 11028, + 11034, + 11028, + 11075, + 11055, + 11063, + 11011, + 11033, + 11013, + 11047, + 11031, + 11053, + 11052, + 11065, + 11035, + 11061, + 11087, + 11058, + 11074, + 11026, + 11048, + 11039, + 11019, + 11030, + 11010, + 11007, + 11084, + 11030, + 11072, + 11085, + 11068, + 11069, + 11057, + 11058, + 11008, + 11041, + 11035, + 11039, + 10999, + 11037, + 11016, + 11047, + 11189, + 11036, + 11064, + 11013, + 11024, + 11044, + 11001, + 11041, + 11043, + 11081, + 11062, + 11051, + 11059, + 11011, + 11059, + 11033, + 11001, + 11035, + 11055, + 11050, + 11041, + 11059, + 11056, + 11045, + 11030, + 11022, + 11048, + 11025, + 11009, + 11035, + 11030, + 11026, + 11037, + 11082, + 11051, + 11066, + 11032, + 11048, + 11035, + 11017, + 11018, + 11055, + 11021, + 11058, + 11015, + 11031, + 11021, + 11062, + 11015, + 11036, + 11014, + 11020, + 11163, + 11068, + 11019, + 11095, + 11057, + 11042, + 11043, + 11020, + 11035, + 11207, + 11097, + 11077, + 11018, + 11060, + 11090, + 11032, + 11089, + 11065, + 11029, + 11090, + 11015, + 11073, + 11024, + 11115, + 11035, + 11085, + 11035, + 11086, + 11093, + 11018, + 11034, + 11081, + 11020, + 11058, + 11022, + 11071, + 11035, + 11048, + 11041, + 11044, + 11031, + 11021, + 11037, + 11036, + 11026, + 11011, + 11054, + 11016, + 11009, + 11070, + 11011, + 11024, + 11037, + 11098, + 11030, + 11028, + 11007, + 11031, + 11037, + 11068, + 11039, + 11042, + 10997, + 11052, + 11055, + 11043, + 11041, + 11037, + 11041, + 11034, + 11077, + 11066, + 11014, + 11052, + 11006, + 11006, + 11062, + 11016, + 11055, + 11073, + 11054, + 11013, + 11043, + 11060, + 11063, + 11034, + 11028, + 11031, + 11067, + 12839, + 11035, + 11065, + 11015, + 11020, + 11063, + 11063, + 11040, + 11046, + 11038, + 11090, + 11012, + 11053, + 11031, + 11092, + 11096, + 11025, + 11063, + 11027, + 11012, + 11073, + 11015, + 11023, + 11047, + 11053, + 11048, + 11062, + 11028, + 11073, + 11060, + 11004, + 11029, + 11591, + 11055, + 11005, + 11018, + 11032, + 11028, + 11022, + 11047, + 11020, + 11076, + 11047, + 21660, + 11050, + 11017, + 11040, + 11045, + 11045, + 11000, + 11025, + 11028, + 11065, + 11059, + 11023, + 11037, + 11042, + 11027, + 11074, + 11028, + 11030, + 11024, + 11046, + 11033, + 11061, + 11044, + 11010, + 11049, + 11088, + 11054, + 11042, + 11059, + 11000, + 11012, + 11057, + 11030, + 11013, + 11032, + 11071, + 11017, + 11073, + 11075, + 11058, + 11043, + 11058, + 11026, + 11077, + 11035, + 11053, + 11050, + 11095, + 11055, + 11068, + 11031, + 11079, + 11043, + 11035, + 11023, + 11030, + 11071, + 11060, + 11027, + 11028, + 11046, + 11056, + 11044, + 11120, + 11027, + 11020, + 11053, + 11031, + 11015, + 11015, + 11037, + 11032, + 11029, + 11070, + 11088, + 11088, + 11020, + 11006, + 11032, + 11056, + 11039, + 11053, + 11033, + 11026, + 11049, + 11016, + 11055, + 11064, + 11016, + 11016, + 11039, + 11036, + 11046, + 11060, + 11013, + 11032, + 11045, + 11049, + 11019, + 11117, + 11033, + 11075, + 11016, + 11064, + 11026, + 11039, + 11026, + 11024, + 11021, + 11034, + 11047, + 11049, + 11062, + 11051, + 11111, + 11033, + 11041, + 11023, + 11042, + 11077, + 11009, + 11216, + 11106, + 11063, + 11034, + 11022, + 11059, + 11045, + 11008, + 11048, + 11034, + 11040, + 11027, + 11030, + 11060, + 11029, + 11017, + 11028, + 11034, + 11048, + 11063, + 11020, + 11042, + 11003, + 11028, + 11045, + 11011, + 11036, + 11037, + 11042, + 11031, + 11065, + 11049, + 11044, + 11067, + 11012, + 11021, + 11087, + 11062, + 11026, + 11006, + 11004, + 11027, + 11075, + 11075, + 11019, + 11025, + 11061, + 11031, + 11044, + 11032, + 11033, + 11052, + 11051, + 11017, + 11064, + 11074, + 11105, + 11029, + 11078, + 11009, + 11034, + 11061, + 11061, + 11055, + 11046, + 11016, + 11069, + 11037, + 11048, + 11052, + 11064, + 11012, + 11034, + 11001, + 11034, + 11055, + 11030, + 11013, + 11076, + 11008, + 11031, + 11037, + 11004, + 11006, + 11087, + 11047, + 11026, + 11077, + 11002, + 11021, + 11048, + 11018, + 11031, + 11017, + 11074, + 11007, + 11067, + 11026, + 11109, + 11017, + 11017, + 11008, + 11074, + 11037, + 11010, + 11107, + 11033, + 11037, + 11019, + 11013, + 11014, + 11074, + 11035, + 11022, + 11036, + 11051, + 11020, + 11045, + 11057, + 11074, + 11074, + 11051, + 11020, + 15507, + 11025, + 11036, + 11046, + 11020, + 11066, + 11058, + 11004, + 11026, + 11066, + 11055, + 11061, + 11041, + 11080, + 11022, + 11054, + 11044, + 11028, + 11051, + 11053, + 11040, + 11077, + 11009, + 11198, + 11015, + 11046, + 11012, + 11039, + 11041, + 11053, + 11040, + 11030, + 11047, + 11078, + 11078, + 11023, + 11026, + 11020, + 11026, + 11067, + 11010, + 11023, + 11014, + 11032, + 11036, + 11019, + 11025, + 11036, + 11049, + 11069, + 11027, + 11067, + 11039, + 11059, + 11027, + 11016, + 11015, + 11072, + 11030, + 11036, + 11095, + 11071, + 11014, + 11045, + 11000, + 11016, + 11015, + 11044, + 11008, + 11076, + 11051, + 11011, + 11011, + 11067, + 11012, + 11053, + 11023, + 11022, + 11017, + 11165, + 11021, + 11046, + 11017, + 11050, + 11003, + 11014, + 11000, + 11074, + 11053, + 11050, + 11027, + 11039, + 11029, + 11021, + 11012, + 23927, + 11062, + 11012, + 11026, + 11094, + 11023, + 11063, + 11022, + 11062, + 11017, + 11013, + 11067, + 11000, + 11014, + 11037, + 11038, + 11060, + 11070, + 11014, + 11023, + 11032, + 11050, + 11045, + 10998, + 11026, + 11027, + 11058, + 11006, + 11047, + 11012, + 11073, + 11066, + 11024, + 11005, + 11034, + 11025, + 11012, + 11073, + 11069, + 11057, + 11030, + 11036, + 11026, + 11017, + 11031, + 11048, + 11018, + 11088, + 11026, + 11038, + 11036, + 11031, + 11028, + 11065, + 11051, + 11047, + 11016, + 11024, + 11063, + 11020, + 11041, + 11079, + 11055, + 11035, + 11058, + 11035, + 11010, + 11057, + 11020, + 11011, + 11045, + 11041, + 11035, + 11081, + 11048, + 10993, + 11056, + 11018, + 11040, + 11065, + 11044, + 11054, + 11036, + 11040, + 11008, + 11037, + 11050, + 11034, + 11044, + 11047, + 11018, + 11032, + 11074, + 11039, + 11080, + 11039, + 11035, + 11010, + 11017, + 11034, + 11080, + 11053, + 11026, + 11013, + 11035, + 11064, + 11008, + 11008, + 11033, + 11072, + 11038, + 11010, + 11075, + 11009, + 11021, + 11021, + 11058, + 11042, + 11045, + 11020, + 11033, + 11053, + 11066, + 11034, + 11050, + 11008, + 11040, + 11042, + 11040, + 11041, + 11084, + 11095, + 11028, + 11026, + 11199, + 11027, + 11050, + 11029, + 11030, + 11015, + 11075, + 11027, + 11026, + 11026, + 11020, + 11031, + 11012, + 11040, + 11086, + 11012, + 11048, + 11013, + 11024, + 11017, + 11068, + 11046, + 11038, + 11033, + 11042, + 11026, + 11042, + 11004, + 11044, + 11090, + 11014, + 11051, + 11051, + 11042, + 11020, + 11017, + 11025, + 11030, + 11055, + 11042, + 11029, + 11057, + 11027, + 11087, + 11031, + 11047, + 10998, + 11021, + 11041, + 11014, + 11045, + 11018, + 11021, + 11016, + 11030, + 11003, + 11035, + 11058, + 11096, + 11044, + 11005, + 11032, + 11017, + 11146, + 11051, + 11024, + 11039, + 11028, + 11039, + 11032, + 11015, + 11069, + 11060, + 11015, + 11059, + 11095, + 11091, + 11018, + 11056, + 11058, + 11075, + 11054, + 11020, + 11018, + 11053, + 11033, + 11080, + 11016, + 11051, + 11035, + 11044, + 11778, + 11067, + 11051, + 11022, + 11022, + 11056, + 11010, + 11045, + 10998, + 11059, + 11035, + 11040, + 11078, + 11096, + 11075, + 11017, + 11037, + 11016, + 11036, + 11046, + 11020, + 11048, + 11024, + 11029, + 11021, + 11010, + 11104, + 11045, + 11040, + 11040, + 11014, + 11029, + 11021, + 11057, + 11053, + 11024, + 11030, + 11231, + 11032, + 11013, + 11073, + 11030, + 11064, + 11079, + 11081, + 11014, + 11014, + 11049, + 11028, + 11095, + 11014, + 11079, + 11034, + 11055, + 11054, + 11099, + 11014, + 11066, + 11008, + 11008, + 11020, + 11041, + 11013, + 11022, + 11033, + 11024, + 11060, + 11043, + 11016, + 11020, + 11022, + 11059, + 11046, + 11035, + 11117, + 11031, + 11049, + 11011, + 11028, + 11044, + 11026, + 11033, + 11025, + 11055, + 11013, + 11029, + 11051, + 11033, + 11047, + 11030, + 11067, + 11038, + 11035, + 11034, + 11043, + 11035, + 11022, + 11032, + 11011, + 11050, + 11008, + 11016, + 11052, + 11051, + 11015, + 11052, + 11021, + 12452, + 11032, + 11047, + 11016, + 11014, + 11031, + 11074, + 11083, + 11078, + 11018, + 11029, + 11015, + 11016, + 11073, + 11033, + 11081, + 11050, + 11034, + 11002, + 11055, + 11046, + 11025, + 11070, + 11084, + 11023, + 11003, + 11050, + 11056, + 11065, + 11053, + 11020, + 11000, + 11039, + 11068, + 11054, + 11097, + 11017, + 11056, + 13949, + 11015, + 11051, + 11082, + 11018, + 11024, + 11076, + 11033, + 11058, + 11060, + 11063, + 11013, + 11043, + 11021, + 11062, + 11001, + 11065, + 11023, + 11058, + 11020, + 11069, + 11057, + 11031, + 11020, + 11052, + 11054, + 11043, + 11053, + 11040, + 11009, + 11100, + 11035, + 11038, + 11028, + 11019, + 11012, + 11059, + 11032, + 11024, + 11010, + 11059, + 11027, + 11076, + 11065, + 11038, + 11026, + 11069, + 11037, + 11030, + 11067, + 11039, + 11024, + 11074, + 11040, + 11041, + 11063, + 11010, + 11056, + 11027, + 11026, + 14112, + 11036, + 12040, + 11038, + 11045, + 11015, + 11047, + 11040, + 11097, + 11020, + 11025, + 11039, + 11034, + 11016, + 11037, + 11031, + 11042, + 11048, + 11053, + 11045, + 11032, + 11029, + 11018, + 11062, + 11064, + 11025, + 11033, + 11042, + 11019, + 11085, + 11103, + 11050, + 11042, + 11097, + 11046, + 11047, + 11046, + 11044, + 11046, + 11059, + 11040, + 11026, + 11052, + 11030, + 11041, + 11038, + 11062, + 14072, + 11042, + 11047, + 11024, + 11024, + 11074, + 11020, + 11041, + 11017, + 11040, + 11048, + 11017, + 10997, + 11055, + 11029, + 11027, + 11019, + 11051, + 11028, + 11055, + 11026, + 11021, + 11024, + 11022, + 11054, + 11056, + 11058, + 11028, + 11060, + 11010, + 11016, + 11101, + 11012, + 11026, + 11004, + 11052, + 11013, + 11043, + 10999, + 11030, + 11037, + 11048, + 11023, + 11051, + 11017, + 11036, + 11168, + 11049, + 11022, + 11050, + 11031, + 11017, + 11040, + 11039, + 11013, + 11049, + 11033, + 11038, + 11086, + 11038, + 11043, + 11080, + 11021, + 11072, + 11054, + 11056, + 11027, + 11052, + 11025, + 11030, + 11035, + 11043, + 11029, + 11019, + 11046, + 11029, + 11066, + 11065, + 11039, + 11086, + 11008, + 11055, + 11047, + 11077, + 11031, + 11034, + 11020, + 11040, + 11049, + 11037, + 11051, + 11085, + 11075, + 11019, + 11019, + 11040, + 11026, + 11049, + 11052, + 11005, + 11021, + 11035, + 11048, + 11041, + 11030, + 11025, + 11132, + 11033, + 11023, + 11069, + 11089, + 11031, + 11063, + 11021, + 11013, + 11026, + 11027, + 11039, + 11092, + 11067, + 11021, + 11086, + 11012, + 11012, + 11026, + 11075, + 11025, + 11057, + 11073, + 11101, + 11054, + 11064, + 11012, + 11048, + 11048, + 11060, + 11027, + 11038, + 11023, + 11051, + 11030, + 11040, + 11028, + 11040, + 11017, + 11042, + 11008, + 11029, + 11025, + 11014, + 11026, + 11052, + 11043, + 11053, + 11064, + 11046, + 11013, + 11049, + 11022, + 11026, + 11103, + 11005, + 11041, + 11028, + 11032, + 11040, + 11071, + 11038, + 11062, + 11066, + 11011, + 11082, + 11034, + 11063, + 11031, + 11063, + 11024, + 11038, + 11013, + 11042, + 11047, + 11069, + 11011, + 11036, + 11047, + 11061, + 11036, + 11054, + 11054, + 11011, + 11022, + 11019, + 11021, + 11039, + 11008, + 11015, + 11017, + 11018, + 11008, + 11057, + 11024, + 11045, + 11039, + 11044, + 11002, + 11024, + 11023, + 11054, + 11059, + 11027, + 11029, + 11038, + 11021, + 11000, + 11020, + 11028, + 11014, + 11038, + 11049, + 11015, + 11026, + 11060, + 11025, + 11096, + 11036, + 11031, + 11031, + 11030, + 11021, + 11033, + 11021, + 11041, + 11021, + 11030, + 11036, + 11059, + 11052, + 11011, + 11040, + 11047, + 11021, + 11085, + 11053, + 11089, + 11000, + 11037, + 11021, + 11074, + 11006, + 11050, + 11051, + 11102, + 11065, + 11063, + 11042, + 11052, + 11048, + 11025, + 11041, + 11034, + 11072, + 11090, + 11020, + 11004, + 11017, + 11079, + 11021, + 11032, + 11046, + 11009, + 11032, + 11050, + 11047, + 11049, + 11050, + 11029, + 11021, + 11059, + 11009, + 11039, + 11016, + 11010, + 11016, + 11044, + 11016, + 11067, + 11036, + 11053, + 11011, + 11039, + 11050, + 11036, + 11046, + 11031, + 11027, + 11126, + 11035, + 11036, + 11044, + 11076, + 11021, + 11023, + 11078, + 11027, + 11080, + 11015, + 11031, + 11023, + 11012, + 11026, + 11044, + 11090, + 11044, + 11034, + 11027, + 11070, + 11022, + 11053, + 11007, + 11049, + 11023, + 11040, + 11041, + 11058, + 11025, + 11057, + 11075, + 11023, + 11016, + 11064, + 11042, + 11060, + 11017, + 11012, + 11009, + 11010, + 11009, + 11050, + 11056, + 11045, + 11008, + 11020, + 11075, + 11059, + 11020, + 11081, + 11041, + 10999, + 10999, + 11079, + 11010, + 11009, + 11026, + 11035, + 11016, + 11046, + 11021, + 11027, + 11030, + 11002, + 11043, + 11038, + 11041, + 11049, + 11036, + 11029, + 11034, + 11047, + 11024, + 10994, + 11035, + 11031, + 11007, + 11052, + 11034, + 11025, + 11048, + 11037, + 11032, + 11037, + 11045, + 11018, + 11017, + 11017, + 11025, + 11047, + 10979, + 11019, + 11002, + 11018, + 11023, + 11065, + 11012, + 11084, + 11014, + 11012, + 11028, + 11014, + 11046, + 11048, + 11024, + 11020, + 11023, + 11050, + 11202, + 11023, + 11011, + 11003, + 11010, + 11027, + 11043, + 11046, + 11018, + 11017, + 11017, + 11037, + 11029, + 11012, + 11029, + 11113, + 11062, + 11033, + 11004, + 11047, + 11038, + 11019, + 11017, + 11012, + 11012, + 11012, + 11012, + 11026, + 11024, + 11041, + 11027, + 11004, + 11069, + 11007, + 11013, + 11040, + 11042, + 11035, + 11021, + 11027, + 11044, + 11058, + 11004, + 11099, + 11028, + 11011, + 11095, + 11056, + 11022, + 11022, + 11027, + 11017, + 11034, + 11061, + 11030, + 11030, + 11043, + 11050, + 11024, + 11071, + 11053, + 11091, + 11038, + 11026, + 11016, + 11073, + 11058, + 11056, + 11095, + 11021, + 11018, + 11051, + 11025, + 11032, + 11040, + 11034, + 11044, + 11023, + 11024, + 11030, + 11056, + 11022, + 11019, + 11031, + 11033, + 11031, + 11010, + 11029, + 11006, + 11053, + 11006, + 11059, + 11021, + 11016, + 11004, + 11034, + 11011, + 11056, + 11045, + 11023, + 11030, + 11033, + 11023, + 11077, + 11003, + 10996, + 11053, + 11055, + 11020, + 11074, + 11053, + 11060, + 11036, + 11083, + 11011, + 11072, + 11023, + 11049, + 11029, + 11059, + 11026, + 11014, + 11013, + 11023, + 11049, + 11049, + 11028, + 11018, + 11020, + 11020, + 11010, + 11045, + 11024, + 11039, + 11051, + 11029, + 11064, + 11057, + 11031, + 11006, + 11012, + 11058, + 11019, + 11014, + 11057, + 11041, + 11066, + 11019, + 10998, + 11033, + 13309, + 11013, + 11029, + 11029, + 11036, + 11026, + 11015, + 11034, + 11033, + 11043, + 11006, + 11051, + 11020, + 11047, + 11063, + 11051, + 11016, + 11160, + 11006, + 11020, + 11033, + 11057, + 11005, + 11045, + 11028, + 11044, + 11009, + 11049, + 11073, + 11056, + 11039, + 11044, + 11039, + 11003, + 11012, + 11055, + 11009, + 11006, + 11024, + 11016, + 11027, + 11034, + 11038, + 11025, + 11027, + 11022, + 11023, + 11076, + 11045, + 11045, + 11037, + 11003, + 11023, + 11063, + 11018, + 11061, + 11059, + 11048, + 11058, + 11062, + 11042, + 11014, + 11036, + 11025, + 11042, + 11055, + 11041, + 11048, + 11038, + 11049, + 11034, + 11080, + 11028, + 11027, + 11074, + 11027, + 11018, + 11036, + 11015, + 11017, + 11041, + 11002, + 11046, + 11089, + 11047, + 11027, + 11017, + 11016, + 11029, + 11086, + 11047, + 11021, + 11030, + 11023, + 11022, + 11070, + 11015, + 11006, + 11008, + 11035, + 11018, + 11026, + 11019, + 11017, + 11012, + 11019, + 11019, + 11068, + 11019, + 11055, + 11047, + 11058, + 11002, + 11017, + 11050, + 11059, + 11028, + 11056, + 11022, + 11051, + 11029, + 11060, + 11020, + 11022, + 11026, + 11030, + 11049, + 11050, + 11053, + 11029, + 11022, + 11038, + 11028, + 11033, + 11026, + 11052, + 11017, + 11046, + 11020, + 11030, + 11047, + 11014, + 11036, + 11058, + 11025, + 11037, + 11031, + 11016, + 11039, + 11069, + 11010, + 11026, + 11023, + 11019, + 11022, + 11071, + 11039, + 11020, + 11023, + 11057, + 11018, + 11043, + 11025, + 11021, + 11058, + 11035, + 11020, + 11063, + 11032, + 11003, + 11044, + 11023, + 11017, + 11059, + 11023, + 11020, + 11068, + 11012, + 11042, + 11048, + 11005, + 11016, + 11044, + 11024, + 11044, + 11077, + 11040, + 11045, + 11054, + 11008, + 11010, + 11046, + 11012, + 11020, + 11020, + 11009, + 11014, + 11047, + 11014, + 11031, + 11019, + 11015, + 11017, + 11041, + 11022, + 11029, + 11013, + 11023, + 11000, + 11064, + 11021, + 11016, + 11071, + 11032, + 11033, + 11064, + 11022, + 11027, + 11044, + 11026, + 11006, + 11065, + 11671, + 11017, + 11021, + 11016, + 11023, + 11067, + 11046, + 11010, + 11013, + 11007, + 10996, + 11068, + 11041, + 11017, + 11022, + 11014, + 11028, + 11071, + 11021, + 11021, + 11012, + 11060, + 11015, + 11047, + 11024, + 11048, + 11031, + 11035, + 11092, + 11052, + 11007, + 11051, + 11013, + 11034, + 11033, + 11032, + 11012, + 11018, + 11035, + 11016, + 11006, + 11042, + 11029, + 11008, + 11039, + 11021, + 11016, + 11052, + 11027, + 11030, + 11009, + 11037, + 10996, + 11063, + 11015, + 11017, + 11020, + 11045, + 11061, + 11085, + 11028, + 11038, + 11003, + 11006, + 11014, + 11057, + 11011, + 11065, + 11043, + 11040, + 11011, + 11072, + 11006, + 11047, + 11049, + 11007, + 11013, + 11044, + 11008, + 11035, + 11018, + 11068, + 11039, + 11028, + 11043, + 11045, + 11038, + 11320, + 11021, + 11057, + 11052, + 11026, + 11031, + 11012, + 11016, + 11061, + 11027, + 11026, + 11011, + 10998, + 11006, + 11060, + 11006, + 11017, + 11019, + 11012, + 11030, + 11058, + 11019, + 11030, + 11014, + 11065, + 11015, + 11066, + 11022, + 11033, + 11030, + 11024, + 11012, + 11033, + 11011, + 11069, + 11065, + 11032, + 11024, + 11054, + 11005, + 11006, + 11075, + 11019, + 11024, + 11047, + 11053, + 11073, + 11035, + 11058, + 11050, + 11081, + 11022, + 11035, + 11034, + 11068, + 11022, + 11017, + 11022, + 11016, + 11084, + 11021, + 11011, + 11035, + 11008, + 11017, + 11036, + 11023, + 11031, + 11066, + 11008, + 11048, + 11031, + 11011, + 11032, + 11046, + 11016, + 11012, + 11010, + 11008, + 11002, + 11020, + 11017, + 11061, + 11030, + 11021, + 11017, + 11057, + 11041, + 10997, + 11008, + 11018, + 11029, + 11076, + 11026, + 11026, + 11300, + 11055, + 11064, + 11044, + 11032, + 11050, + 11043, + 11041, + 11018, + 11070, + 11032, + 11039, + 11008, + 11032, + 11028, + 11063, + 11019, + 11026, + 11000, + 11061, + 11094, + 11078, + 11079, + 11020, + 11057, + 11015, + 11002, + 11060, + 11019, + 11032, + 11032, + 11070, + 11059, + 11059, + 11015, + 11034, + 11015, + 11057, + 11003, + 11052, + 11033, + 11075, + 11018, + 11029, + 11031, + 11046, + 11032, + 11031, + 11012, + 11013, + 11036, + 11063, + 11012, + 11046, + 11027, + 11026, + 11022, + 11065, + 11021, + 11047, + 11035, + 11004, + 11064, + 11110, + 11014, + 11049, + 11012, + 11011, + 11011, + 11037, + 11015, + 11033, + 11027, + 11017, + 11041, + 11063, + 11020, + 11053, + 11060, + 11044, + 11032, + 11040, + 10994, + 11017, + 11016, + 11024, + 11012, + 11044, + 11015, + 11004, + 11010, + 11047, + 11003, + 11076, + 11051, + 11035, + 11023, + 11013, + 11042, + 11058, + 11047, + 11047, + 11027, + 11046, + 11029, + 11200, + 11056, + 11085, + 11020, + 11032, + 11021, + 11042, + 11046, + 11044, + 11033, + 11022, + 11025, + 11043, + 12299, + 11019, + 11034, + 11034, + 11015, + 11031, + 11021, + 11060, + 11009, + 11089, + 11014, + 20115, + 11069, + 11062, + 11015, + 11046, + 10996, + 11032, + 11004, + 11037, + 11012, + 11033, + 11058, + 11045, + 11072, + 11069, + 11024, + 11043, + 11023, + 11039, + 11036, + 11016, + 11055, + 11080, + 11018, + 11089, + 11034, + 11069, + 11044, + 11021, + 11029, + 11080, + 11044, + 11030, + 11038, + 11036, + 11018, + 11052, + 11001, + 11028, + 11014, + 11037, + 11016, + 11129, + 11002, + 11024, + 11025, + 11054, + 11020, + 11030, + 11023, + 11044, + 11047, + 11066, + 11038, + 11057, + 11025, + 11007, + 11011, + 11097, + 11011, + 11050, + 11014, + 11037, + 10999, + 11024, + 11031, + 11019, + 11024, + 11024, + 11009, + 11163, + 11030, + 11044, + 20655, + 11028, + 11012, + 11035, + 11054, + 11058, + 11075, + 11053, + 11045, + 11059, + 11036, + 11046, + 11029, + 11015, + 11026, + 11051, + 11009, + 11075, + 11028, + 11010, + 11007, + 11039, + 11004, + 11045, + 11029, + 11014, + 11044, + 11091, + 11051, + 11048, + 11035, + 11010, + 11011, + 11006, + 11011, + 11060, + 11007, + 10990, + 11016, + 11039, + 11016, + 11056, + 11033, + 11027, + 11025, + 11031, + 11010, + 11050, + 11009, + 11027, + 11014, + 11048, + 11057, + 11056, + 11021, + 11035, + 11022, + 11065, + 11035, + 11076, + 11075, + 11010, + 10989, + 11005, + 11031, + 11081, + 11025, + 11032, + 11028, + 11065, + 11011, + 11091, + 11034, + 11092, + 11058, + 11078, + 11009, + 11026, + 11035, + 11026, + 11011, + 11019, + 11014, + 11044, + 11080, + 11059, + 11032, + 11055, + 11030, + 11079, + 11031, + 11016, + 11023, + 11028, + 11010, + 11045, + 11062, + 11048, + 11036, + 11066, + 11022, + 11042, + 11000, + 11027, + 11026, + 11055, + 11043, + 11002, + 11030, + 11041, + 11024, + 11050, + 11011, + 11062, + 11033, + 11044, + 11027, + 11011, + 11076, + 11056, + 11035, + 11030, + 11044, + 11071, + 11027, + 11051, + 11047, + 11043, + 11020, + 11009, + 11019, + 11046, + 11061, + 11010, + 11048, + 11018, + 11028, + 11066, + 11026, + 11022, + 11003, + 11022, + 11015, + 11051, + 11016, + 11131, + 11043, + 11089, + 11030, + 11071, + 11035, + 11014, + 11012, + 11032, + 11022, + 11028, + 11034, + 11021, + 11070, + 11015, + 11043, + 11053, + 11010, + 11027, + 11015, + 11030, + 11030, + 11026, + 11391, + 11052, + 11033, + 11038, + 11008, + 11050, + 11031, + 11060, + 11041, + 11013, + 11019, + 11021, + 11012, + 11051, + 11026, + 11025, + 11040, + 11056, + 11068, + 11032, + 11049, + 11034, + 11087, + 11077, + 11010, + 11035, + 11029, + 11048, + 11022, + 11054, + 11019, + 11043, + 11049, + 11012, + 11036, + 11053, + 11053, + 11032, + 11019, + 11013, + 11030, + 11050, + 11059, + 11005, + 11017, + 11025, + 11028, + 11055, + 11023, + 11012, + 11015, + 11065, + 11014, + 11033, + 10996, + 11037, + 11026, + 11014, + 11020, + 11064, + 11053, + 11035, + 11017, + 11047, + 11043, + 11071, + 11047, + 11055, + 11049, + 11070, + 11064, + 11080, + 11026, + 11037, + 11058, + 19706, + 11019, + 11039, + 11029, + 11030, + 11013, + 11089, + 11011, + 11044, + 11066, + 11027, + 11021, + 10997, + 11038, + 11018, + 11013, + 11015, + 11020, + 11018, + 11013, + 11055, + 11044, + 11085, + 11064, + 11087, + 11021, + 11058, + 11024, + 11006, + 11038, + 10992, + 11027, + 11036, + 11054, + 11041, + 11024, + 11033, + 11013, + 11062, + 11027, + 11028, + 11005, + 11023, + 11030, + 11060, + 11054, + 11027, + 11026, + 11110, + 11040, + 11046, + 11029, + 11036, + 11037, + 11025, + 11026, + 11072, + 11013, + 11043, + 11040, + 11025, + 11024, + 11032, + 11025, + 11063, + 11083, + 11069, + 11045, + 11051, + 11056, + 11026, + 11038, + 11095, + 11000, + 23370, + 11014, + 11010, + 11038, + 11093, + 11025, + 11060, + 11022, + 11044, + 11062, + 11029, + 11008, + 11042, + 11007, + 11081, + 11016, + 11054, + 11000, + 11035, + 11061, + 11004, + 11035, + 11044, + 11019, + 11114, + 11026, + 11019, + 11044, + 11072, + 11045, + 11031, + 11049, + 11031, + 11013, + 11062, + 11030, + 11069, + 11044, + 11016, + 11054, + 11033, + 11031, + 11027, + 11068, + 11070, + 11060, + 11073, + 11050, + 11057, + 11026, + 11017, + 11033, + 11026, + 11015, + 11086, + 11007, + 11042, + 11003, + 11050, + 11004, + 11048, + 11043, + 11013, + 11015, + 11021, + 11061, + 11072, + 11045, + 11103, + 11047, + 11021, + 11034, + 11309, + 11032, + 11015, + 11058, + 11083, + 11013, + 11064, + 10999, + 11027, + 11077, + 11027, + 11003, + 11096, + 11019, + 11041, + 11044, + 11080, + 11043, + 11016, + 11034, + 11038, + 11023, + 11043, + 11018, + 11072, + 11034, + 11027, + 11030, + 11007, + 11025, + 11063, + 11022, + 11029, + 11030, + 11033, + 11013, + 11041, + 11035, + 11026, + 11029, + 11037, + 11065, + 11053, + 11040, + 11022, + 11029, + 11040, + 11020, + 11040, + 11045, + 11045, + 11025, + 11043, + 11063, + 11033, + 11062, + 11027, + 11056, + 11010, + 11012, + 11058, + 11008, + 11067, + 11013, + 11039, + 11062, + 11019, + 11031, + 11027, + 11048, + 11011, + 11029, + 11078, + 11013, + 11009, + 11015, + 11057, + 11027, + 11069, + 11386, + 11018, + 11076, + 11036, + 11026, + 11048, + 11074, + 11068, + 11047, + 11035, + 11057, + 11046, + 11065, + 11031, + 11009, + 11032, + 11057, + 11058, + 11055, + 11018, + 11011, + 23462, + 11020, + 11098, + 11034, + 11052, + 11064, + 11031, + 11028, + 11061, + 11050, + 11057, + 11073, + 11022, + 11010, + 11076, + 11031, + 11057, + 11053, + 11051, + 11048, + 11039, + 11093, + 11016, + 10991, + 11033, + 11047, + 11050, + 11010, + 11028, + 11018, + 11047, + 11048, + 11043, + 11035, + 11118, + 11027, + 11073, + 11019, + 11045, + 10997, + 11073, + 10999, + 11042, + 11017, + 11069, + 11005, + 11009, + 11051, + 11020, + 11016, + 11028, + 11015, + 11050, + 11024, + 11028, + 11063, + 11055, + 11032, + 11032, + 11008, + 11071, + 11010, + 11077, + 11144, + 11054, + 11068, + 11052, + 11023, + 11041, + 11020, + 10998, + 11009, + 11013, + 11078, + 11126, + 11058, + 11073, + 11037, + 11019, + 11029, + 11041, + 11032, + 11053, + 11035, + 11044, + 11040, + 11082, + 11051, + 11036, + 11034, + 11067, + 11050, + 11049, + 11031, + 11065, + 11019, + 11023, + 11012, + 11084, + 11038, + 11012, + 11014, + 11078, + 11002, + 11078, + 11076, + 11065, + 11034, + 11032, + 10996, + 11055, + 11048, + 11032, + 11023, + 11037, + 11001, + 11071, + 11016, + 11018, + 11024, + 11085, + 11013, + 11054, + 11030, + 11040, + 11009, + 11037, + 11012, + 11026, + 11049, + 11018, + 11014, + 11091, + 11042, + 11073, + 11011, + 11026, + 11010, + 11072, + 11051, + 11065, + 11070, + 11028, + 11009, + 11035, + 11021, + 11036, + 11027, + 11028, + 11025, + 11045, + 11025, + 11042, + 11069, + 11026, + 11029, + 11056, + 11033, + 11045, + 11042, + 11011, + 11021, + 11057, + 11045, + 11043, + 11033, + 11051, + 11030, + 11096, + 11031, + 11044, + 11026, + 11029, + 11168, + 11060, + 11011, + 11039, + 11042, + 11030, + 11010, + 11009, + 11024, + 11039, + 11024, + 11039, + 11004, + 11024, + 11065, + 11118, + 11417, + 11042, + 11051, + 11054, + 11011, + 11043, + 11031, + 11000, + 11009, + 11080, + 11023, + 11084, + 11023, + 11034, + 11047, + 11044, + 11037, + 11030, + 11024, + 11018, + 11011, + 11031, + 11033, + 11064, + 11077, + 11055, + 11017, + 11074, + 11024, + 11025, + 11052, + 26206, + 11020, + 11024, + 11019, + 11065, + 11077, + 11037, + 11042, + 11055, + 11042, + 11028, + 11082, + 11022, + 11006, + 11018, + 11008, + 11042, + 11016, + 11017, + 11031, + 11030, + 11022, + 11033, + 11039, + 11094, + 11038, + 11078, + 11035, + 11046, + 11046, + 11058, + 11017, + 11026, + 11040, + 11084, + 11033, + 11010, + 11011, + 11018, + 11023, + 11041, + 10998, + 11046, + 11027, + 11040, + 11021, + 11072, + 11035, + 11021, + 11043, + 11032, + 11048, + 11077, + 11018, + 11042, + 11043, + 11034, + 11023, + 11070, + 11003, + 11050, + 11061, + 11042, + 11040, + 11047, + 10998, + 11065, + 11047, + 11040, + 11009, + 11063, + 11013, + 11041, + 11055, + 11049, + 10998, + 11036, + 11023, + 11042, + 11044, + 11037, + 11022, + 11050, + 11016, + 11058, + 11053, + 11042, + 11017, + 11052, + 11018, + 11044, + 11041, + 10991, + 11019, + 11096, + 11058, + 11073, + 11063, + 11083, + 11035, + 11114, + 11018, + 11017, + 11024, + 11065, + 11010, + 11016, + 11046, + 11010, + 11057, + 10994, + 11012, + 11022, + 11023, + 11031, + 11028, + 11040, + 11011, + 11074, + 11037, + 11036, + 11036, + 11016, + 11023, + 11066, + 11044, + 11035, + 11056, + 11021, + 11018, + 11017, + 10993, + 11055, + 11071, + 11067, + 11046, + 11070, + 11003, + 11055, + 11050, + 11040, + 11029, + 11029, + 11063, + 11034, + 11084, + 11016, + 11023, + 11024, + 11008, + 11059, + 11040, + 11063, + 11015, + 11095, + 11029, + 11049, + 11023, + 11075, + 11069, + 11096, + 11030, + 11030, + 11058, + 10996, + 11007, + 11020, + 11008, + 11039, + 11036, + 11033, + 11030, + 11031, + 11028, + 11014, + 11056, + 11071, + 11028, + 11077, + 11023, + 11053, + 11084, + 11025, + 11045, + 11063, + 11059, + 11045, + 11021, + 11063, + 11004, + 11043, + 11061, + 11045, + 11035, + 11094, + 11021, + 11068, + 11003, + 11009, + 11058, + 11068, + 11015, + 11048, + 11073, + 11042, + 11047, + 11040, + 11046, + 11036, + 11020, + 11022, + 12676, + 11050, + 11007, + 11040, + 11021, + 11044, + 11014, + 11046, + 11046, + 11103, + 11022, + 11030, + 11043, + 11020, + 11036, + 11411, + 11022, + 11040, + 11012, + 11094, + 11019, + 11038, + 11052, + 11094, + 11045, + 11070, + 11019, + 11044, + 11037, + 11438, + 11022, + 11065, + 11024, + 11064, + 11065, + 11042, + 11069, + 11021, + 11012, + 11059, + 11013, + 11028, + 11032, + 11008, + 11005, + 11025, + 11008, + 11001, + 11022, + 11045, + 11018, + 11062, + 11008, + 11078, + 11020, + 11051, + 11006, + 11029, + 11023, + 11048, + 11037, + 11067, + 11007, + 11067, + 11086, + 11028, + 11034, + 11023, + 11016, + 11042, + 11063, + 11031, + 11058, + 11066, + 11052, + 11074, + 11072, + 11067, + 11021, + 11036, + 11032, + 11021, + 11024, + 11086, + 11027, + 11007, + 11037, + 11042, + 11014, + 11047, + 11014, + 11029, + 11026, + 11028, + 11049, + 11086, + 11028, + 11011, + 11029, + 11049, + 11017, + 11016, + 11059, + 11008, + 11018, + 11026, + 11045, + 11182, + 11074, + 11035, + 11016, + 11056, + 11036, + 11566, + 11043, + 11061, + 11047, + 11058, + 11015, + 11043, + 11051, + 11043, + 11055, + 11018, + 11032, + 11011, + 11070, + 11063, + 11024, + 11078, + 11031, + 11062, + 11090, + 11089, + 11010, + 11060, + 11035, + 11067, + 10999, + 11022, + 11039, + 11079, + 11026, + 11026, + 11059, + 11022, + 11012, + 11057, + 11027, + 11052, + 11029, + 11017, + 11040, + 11050, + 11019, + 11055, + 11022, + 11045, + 11015, + 11045, + 11022, + 11036, + 11044, + 11063, + 11033, + 11048, + 11010, + 11028, + 11018, + 11038, + 11026, + 11046, + 11036, + 11064, + 11037, + 11013, + 11083, + 11046, + 11014, + 11032, + 11013, + 11044, + 11036, + 11052, + 11033, + 11022, + 11028, + 11019, + 11001, + 11064, + 11039, + 11044, + 11016, + 11065, + 11009, + 11056, + 11048, + 11014, + 11007, + 11039, + 11041, + 11020, + 11018, + 11031, + 11020, + 11061, + 11013, + 11022, + 11017, + 11052, + 11015, + 11038, + 11021, + 11052, + 11016, + 11045, + 11051, + 11030, + 11043, + 11066, + 11041, + 11001, + 11023, + 11009, + 11029, + 11049, + 11027, + 11011, + 11012, + 11067, + 11034, + 11096, + 11021, + 11061, + 11062, + 11012, + 11018, + 11021, + 11060, + 11032, + 11074, + 11087, + 11013, + 11026, + 11017, + 11083, + 11022, + 11029, + 11054, + 11038, + 11040, + 11021, + 11024, + 11033, + 26842, + 11062, + 11009, + 11093, + 11055, + 11035, + 11032, + 11027, + 11039, + 11016, + 11042, + 11023, + 11033, + 11091, + 11097, + 11042, + 11019, + 11024, + 11024, + 11047, + 11015, + 11012, + 11012, + 11002, + 22995, + 11052, + 11116, + 11046, + 11048, + 11034, + 11003, + 11056, + 11029, + 11014, + 10996, + 11053, + 11037, + 11076, + 11008, + 11001, + 11039, + 11037, + 11024, + 11013, + 11006, + 11084, + 11073, + 11034, + 11030, + 11023, + 11039, + 11060, + 11008, + 11063, + 11020, + 11023, + 11038, + 11100, + 11027, + 11020, + 11031, + 11077, + 11029, + 11030, + 11030, + 11017, + 11029, + 11067, + 11031, + 11025, + 11046, + 11035, + 11016, + 11247, + 11008, + 11043, + 11044, + 11011, + 11030, + 11035, + 11026, + 11014, + 11039, + 11075, + 11048, + 11042, + 11030, + 11047, + 11019, + 11006, + 11014, + 11035, + 11028, + 11006, + 11021, + 11016, + 11028, + 11038, + 11016, + 11035, + 11013, + 11015, + 11009, + 11072, + 11033, + 11037, + 11040, + 11019, + 11059, + 11061, + 11025, + 11045, + 11083, + 11029, + 11021, + 11076, + 11042, + 11040, + 11073, + 11029, + 11039, + 11041, + 11028, + 11030, + 11048, + 11026, + 10999, + 11058, + 11033, + 11001, + 11026, + 11065, + 11019, + 11061, + 11045, + 11018, + 11014, + 11035, + 11027, + 11050, + 12541, + 11025, + 11088, + 11022, + 11030, + 11075, + 11037, + 11018, + 11055, + 11016, + 11009, + 11020, + 11063, + 11014, + 11019, + 11048, + 11008, + 11059, + 11032, + 11050, + 11052, + 11021, + 11031, + 11051, + 11036, + 11059, + 11057, + 10990, + 11012, + 11185, + 11024, + 11002, + 11028, + 11029, + 11019, + 11037, + 11035, + 11069, + 11008, + 11013, + 11007, + 11055, + 11017, + 11033, + 11057, + 11026, + 11039, + 11035, + 11041, + 11034, + 11004, + 11061, + 11022, + 11080, + 11018, + 11043, + 11027, + 11039, + 11011, + 11074, + 11019, + 11019, + 11010, + 11026, + 11043, + 11055, + 11023, + 11023, + 11031, + 11063, + 11033, + 11046, + 11031, + 11012, + 11061, + 11057, + 11032, + 11068, + 11036, + 11013, + 11120, + 11031, + 11012, + 11038, + 11023, + 11012, + 11016, + 11058, + 11035, + 11074, + 11001, + 11102, + 11028, + 11077, + 11020, + 11033, + 11006, + 11007, + 11053, + 11045, + 11043, + 11063, + 11032, + 11059, + 11067, + 11047, + 11000, + 11052, + 11032, + 11040, + 11018, + 11011, + 11023, + 11027, + 11020, + 11046, + 11044, + 11070, + 11006, + 11067, + 11022, + 11049, + 11041, + 11003, + 11023, + 11042, + 11041, + 11020, + 11038, + 11025, + 11016, + 11054, + 11009, + 11048, + 11017, + 11024, + 11042, + 11008, + 11072, + 11021, + 11014, + 11025, + 11061, + 11041, + 11034, + 11053, + 11086, + 11051, + 11033, + 11070, + 11029, + 11040, + 11026, + 11071, + 11019, + 11055, + 11059, + 11033, + 11008, + 11035, + 11026, + 11059, + 11063, + 11047, + 11048, + 11069, + 11053, + 11076, + 11057, + 11020, + 11010, + 11011, + 11025, + 11055, + 11029, + 11068, + 11020, + 11033, + 11011, + 11060, + 11052, + 11001, + 11022, + 11062, + 11029, + 11069, + 11023, + 11063, + 11020, + 11085, + 11018, + 11037, + 11042, + 11035, + 11010, + 10998, + 11016, + 11091, + 11033, + 11049, + 11084, + 11051, + 11029, + 11061, + 11092, + 11003, + 11259, + 11019, + 11036, + 11050, + 11080, + 11033, + 11062, + 11032, + 11019, + 11025, + 11019, + 11042, + 11069, + 11021, + 11043, + 11053, + 11083, + 11028, + 11013, + 11034, + 11030, + 11059, + 11024, + 11014, + 11063, + 11070, + 11051, + 11033, + 11014, + 11057, + 11034, + 11007, + 11023, + 11031, + 11228, + 11070, + 11012, + 11011, + 11012, + 11049, + 11016, + 11028, + 11081, + 11003, + 11013, + 11034, + 11036, + 11038, + 11007, + 11032, + 11054, + 11024, + 11015, + 11072, + 11018, + 11063, + 10998, + 11046, + 11007, + 11049, + 11019, + 11050, + 11012, + 11035, + 11046, + 11087, + 11030, + 11021, + 11018, + 11057, + 11035, + 11042, + 11070, + 11065, + 11023, + 11061, + 11079, + 11020, + 11053, + 11033, + 11023, + 11026, + 11008, + 11014, + 11017, + 11081, + 11030, + 11056, + 11060, + 11074, + 11037, + 11015, + 11021, + 11024, + 11041, + 11040, + 11024, + 11037, + 11042, + 11032, + 11029, + 11032, + 11022, + 11052, + 11012, + 11081, + 11037, + 11014, + 11057, + 11067, + 11008, + 11051, + 11023, + 11033, + 11088, + 11043, + 11024, + 11069, + 11018, + 11034, + 11029, + 11034, + 11029, + 11063, + 11011, + 11085, + 11064, + 11060, + 11054, + 11114, + 11026, + 11045, + 11019, + 11027, + 11034, + 11087, + 11051, + 11042, + 11036, + 11068, + 11039, + 11082, + 11009, + 11071, + 11012, + 11054, + 11046, + 11070, + 11072, + 11086, + 11043, + 11001, + 11019, + 11052, + 11022, + 11067, + 11022, + 11060, + 11014, + 11029, + 11041, + 11072, + 11046, + 11070, + 11025, + 11075, + 11036, + 11037, + 11023, + 11087, + 11026, + 11033, + 11019, + 11034, + 11017, + 11017, + 11026, + 11037, + 11019, + 11065, + 11038, + 11035, + 11005, + 11060, + 11063, + 11022, + 11067, + 11034, + 11015, + 11027, + 11129, + 11032, + 11070, + 11074, + 11060, + 11060, + 11034, + 11017, + 11011, + 11022, + 11036, + 11012, + 11072, + 11073, + 11011, + 11038, + 11011, + 11028, + 11040, + 11023, + 11025, + 11068, + 11023, + 11059, + 11029, + 11012, + 11071, + 11032, + 11053, + 11058, + 11014, + 11065, + 11028, + 11043, + 11029, + 11045, + 11005, + 11051, + 11085, + 11040, + 11015, + 11160, + 11031, + 11007, + 11034, + 11027, + 11035, + 11050, + 11044, + 11008, + 24166, + 11040, + 11022, + 11042, + 11040, + 11023, + 11048, + 11039, + 11039, + 11054, + 10998, + 11040, + 11074, + 11023, + 11038, + 11075, + 11020, + 11042, + 11091, + 11021, + 11012, + 11076, + 11016, + 11014, + 11046, + 11060, + 11027, + 11107, + 11064, + 11130, + 11033, + 11076, + 11016, + 11040, + 11031, + 11032, + 11037, + 11053, + 11041, + 11050, + 11058, + 11027, + 11066, + 11033, + 11016, + 11077, + 11031, + 11049, + 11026, + 11076, + 11034, + 11030, + 11075, + 11035, + 11055, + 11025, + 11021, + 11018, + 11114, + 11034, + 11036, + 11055, + 11032, + 11056, + 11021, + 11068, + 10998, + 11051, + 11008, + 11026, + 11013, + 11038, + 10998, + 11026, + 11039, + 11058, + 11027, + 11017, + 11028, + 11066, + 11033, + 11045, + 11032, + 11020, + 11020, + 11007, + 11037, + 11082, + 11020, + 11083, + 11013, + 11032, + 11030, + 11016, + 11036, + 11029, + 11031, + 11074, + 11041, + 11077, + 11008, + 11021, + 11047, + 11041, + 11022, + 11053, + 11115, + 11031, + 11053, + 11060, + 11041, + 11021, + 11050, + 11050, + 11036, + 11058, + 11035, + 11029, + 11024, + 11017, + 11028, + 11017, + 11015, + 11039, + 11054, + 11028, + 11001, + 11028, + 11035, + 11065, + 11024, + 11073, + 11003, + 11026, + 11055, + 11060, + 11025, + 11049, + 11037, + 11018, + 11034, + 11071, + 11067, + 11077, + 11066, + 11074, + 11021, + 11078, + 11060, + 11027, + 11020, + 11070, + 11025, + 11054, + 11008, + 11089, + 11016, + 11024, + 11024, + 11029, + 11057, + 11032, + 11042, + 11057, + 11084, + 11016, + 11002, + 11037, + 11062, + 11050, + 11018, + 11042, + 11032, + 11011, + 11047, + 11042, + 11012, + 11021, + 11050, + 11080, + 11027, + 11020, + 11038, + 11089, + 11037, + 11021, + 11020, + 11083, + 11047, + 11025, + 11051, + 11030, + 11026, + 11027, + 11038, + 11010, + 11069, + 11068, + 11055, + 11001, + 11063, + 11064, + 11017, + 11060, + 11022, + 11028, + 11048, + 11041, + 11040, + 11035, + 11021, + 11094, + 11047, + 11056, + 11006, + 10996, + 11054, + 11048, + 11022, + 11051, + 11080, + 11031, + 11045, + 11072, + 11012, + 11078, + 11079, + 11061, + 11029, + 11070, + 11026, + 11031, + 11077, + 11065, + 11049, + 11068, + 11010, + 11047, + 11038, + 11073, + 11108, + 11057, + 11024, + 11038, + 11026, + 11030, + 11018, + 11030, + 11042, + 11087, + 11065, + 11032, + 11042, + 11041, + 11061, + 11052, + 11035, + 11044, + 11017, + 11036, + 11014, + 11079, + 11061, + 11011, + 11077, + 11051, + 11019, + 11054, + 11012, + 11059, + 11043, + 11059, + 11028, + 11071, + 11029, + 11046, + 11034, + 11039, + 11013, + 11066, + 11003, + 11101, + 11072, + 11067, + 11008, + 11028, + 11028, + 11049, + 11076, + 11081, + 11021, + 11069, + 11033, + 11037, + 11037, + 11056, + 11019, + 11034, + 11021, + 11071, + 11034, + 11014, + 11022, + 11039, + 11045, + 11023, + 11004, + 11043, + 11005, + 11049, + 11026, + 11019, + 11033, + 11062, + 11038, + 11035, + 11038, + 11037, + 11061, + 11090, + 11059, + 11020, + 11016, + 11012, + 11015, + 11021, + 11010, + 11070, + 11063, + 11040, + 11019, + 11074, + 11013, + 11053, + 11056, + 11053, + 11039, + 11015, + 11017, + 11035, + 11031, + 11007, + 11024, + 11020, + 11009, + 11014, + 11038, + 11036, + 11009, + 11041, + 11008, + 11034, + 11039, + 11028, + 11057, + 11065, + 11041, + 11067, + 11017, + 11071, + 11057, + 11005, + 11030, + 11035, + 11012, + 10992, + 11028, + 11053, + 11038, + 11010, + 11025, + 11065, + 11045, + 11020, + 11078, + 11012, + 11069, + 11004, + 11029, + 11070, + 11029, + 11053, + 11015, + 11072, + 11032, + 11013, + 11013, + 11054, + 11031, + 11010, + 11052, + 11045, + 11001, + 11021, + 11049, + 11039, + 11019, + 11040, + 11022, + 11056, + 11035, + 11040, + 11012, + 11031, + 11029, + 11066, + 11040, + 11038, + 11012, + 11039, + 11062, + 11059, + 11004, + 11031, + 11027, + 11018, + 11008, + 11063, + 11063, + 11042, + 11027, + 11052, + 11052, + 11083, + 11048, + 11048, + 11051, + 11019, + 11038, + 11037, + 11038, + 11033, + 11055, + 11050, + 11024, + 11068, + 11014, + 11046, + 11024, + 11079, + 11036, + 11067, + 11076, + 11039, + 11050, + 11037, + 11034, + 11049, + 11045, + 11041, + 11021, + 11060, + 11041, + 11109, + 11038, + 11030, + 11071, + 11042, + 11012, + 11051, + 11027, + 11055, + 11013, + 11019, + 11016, + 11032, + 11060, + 12191, + 11035, + 11053, + 11019, + 11024, + 11009, + 11050, + 11023, + 11034, + 11011, + 11057, + 11067, + 11033, + 11041, + 11038, + 11012, + 11073, + 11013, + 11057, + 11040, + 11048, + 11009, + 11054, + 11051, + 11078, + 11009, + 11023, + 11027, + 11040, + 11034, + 11030, + 11039, + 10999, + 11014, + 11074, + 11079, + 11068, + 11001, + 11028, + 11010, + 11043, + 11032, + 11075, + 11046, + 11064, + 11030, + 11048, + 11016, + 11059, + 11011, + 11137, + 11022, + 11054, + 11034, + 11064, + 11065, + 11066, + 11016, + 11034, + 11033, + 11072, + 11095, + 11080, + 11027, + 11086, + 11056, + 11023, + 11067, + 11089, + 11058, + 11068, + 11006, + 11142, + 11073, + 11752, + 11055, + 11069, + 11017, + 11055, + 11020, + 11040, + 11040, + 11048, + 11071, + 11047, + 11069, + 11033, + 11042, + 11154, + 11033, + 11023, + 11053, + 11071, + 11026, + 11041, + 11036, + 11027, + 11138, + 11020, + 11014, + 11075, + 11044, + 11062, + 11068, + 11092, + 11048, + 11066, + 11031, + 11034, + 11051, + 11016, + 11029, + 11051, + 11052, + 11072, + 11081, + 11034, + 11012, + 11055, + 11070, + 11090, + 11014, + 11037, + 11036, + 11063, + 11037, + 11022, + 11073, + 11014, + 11026, + 11080, + 11006, + 11029, + 11005, + 11054, + 11019, + 11086, + 11045, + 11073, + 11084, + 11013, + 11006, + 11007, + 11025, + 11054, + 11039, + 11039, + 11000, + 11040, + 11065, + 11027, + 11057, + 11020, + 11042, + 11027, + 11026, + 11052, + 11072, + 11027, + 11016, + 11037, + 11005, + 11035, + 11050, + 11038, + 11016, + 11047, + 11031, + 11064, + 11039, + 11062, + 11040, + 11023, + 11025, + 11027, + 11041, + 11017, + 11024, + 11046, + 11040, + 11041, + 11057, + 11060, + 11008, + 11050, + 11023, + 11085, + 11059, + 11067, + 11016, + 11031, + 11048, + 11056, + 11013, + 11087, + 11004, + 11057, + 11015, + 11051, + 11088, + 11058, + 11011, + 11042, + 11006, + 11088, + 11029, + 11027, + 11029, + 11016, + 11019, + 11084, + 11017, + 11074, + 11028, + 11018, + 11015, + 11050, + 11016, + 11033, + 11019, + 11048, + 11036, + 11059, + 11017, + 11039, + 11010, + 11061, + 11075, + 11054, + 11010, + 11025, + 11017, + 11078, + 11027, + 11039, + 11030, + 11031, + 11029, + 11070, + 11068, + 11032, + 11073, + 11034, + 11067, + 11048, + 11081, + 11027, + 11022, + 11051, + 11005, + 11048, + 11015, + 11019, + 11020, + 11018, + 11043, + 11055, + 11018, + 11033, + 11036, + 11014, + 11020, + 11029, + 11041, + 11041, + 11065, + 11043, + 11024, + 11063, + 11020, + 11083, + 11020, + 11004, + 11016, + 11034, + 11020, + 11031, + 11023, + 11055, + 11021, + 11083, + 11018, + 11014, + 11056, + 11020, + 10994, + 11083, + 11045, + 11005, + 11032, + 10997, + 11081, + 11057, + 11046, + 11026, + 11033, + 11006, + 11042, + 11005, + 11022, + 11038, + 11032, + 11061, + 13292, + 11039, + 11047, + 12404, + 11040, + 11048, + 11024, + 11038, + 11068, + 11071, + 11052, + 11031, + 11014, + 11054, + 11043, + 11018, + 11031, + 11058, + 11004, + 11014, + 11033, + 11040, + 11061, + 11038, + 11023, + 11056, + 11065, + 11047, + 11048, + 11023, + 11021, + 11005, + 11055, + 11050, + 11048, + 11052, + 11032, + 11055, + 11071, + 11028, + 11037, + 11196, + 11073, + 11036, + 11038, + 11023, + 11001, + 11033, + 10995, + 11036, + 11018, + 11018, + 11024, + 11039, + 11023, + 11061, + 11014, + 11011, + 11017, + 11031, + 11007, + 11080, + 11086, + 11015, + 11030, + 11043, + 11023, + 11075, + 11043, + 11022, + 11041, + 11053, + 11141, + 11039, + 11055, + 11097, + 11033, + 10993, + 11016, + 11028, + 11249, + 11002, + 11017, + 11018, + 11029, + 11025, + 11008, + 11022, + 11002, + 11052, + 11033, + 11026, + 11030, + 11055, + 11024, + 11065, + 11018, + 11037, + 11048, + 11074, + 11065, + 11032, + 11013, + 11015, + 11027, + 11031, + 11050, + 11010, + 11019, + 11051, + 11033, + 11017, + 11037, + 11047, + 11015, + 11089, + 11035, + 11038, + 11042, + 11037, + 11028, + 11034, + 11024, + 11056, + 11032, + 11057, + 11029, + 11022, + 11030, + 11016, + 11058, + 11051, + 11543, + 11038, + 11046, + 11089, + 11015, + 11027, + 11008, + 11045, + 11023, + 11059, + 11067, + 11027, + 11005, + 11123, + 11016, + 11023, + 11072, + 11056, + 11005, + 11056, + 11046, + 11016, + 11056, + 11046, + 11038, + 11041, + 11013, + 11025, + 11012, + 11021, + 10999, + 11042, + 11011, + 11120, + 11044, + 11046, + 11048, + 11025, + 11032, + 11039, + 11042, + 11002, + 11071, + 11054, + 11029, + 11087, + 11029, + 11012, + 11006, + 11033, + 11053, + 11032, + 11049, + 11044, + 11019, + 11031, + 11040, + 11072, + 11076, + 11073, + 11006, + 11064, + 11063, + 11049, + 11006, + 11032, + 11064, + 11039, + 11023, + 11096, + 11027, + 11013, + 11019, + 11027, + 11024, + 11056, + 11005, + 11019, + 11011, + 11043, + 11059, + 11024, + 11022, + 11025, + 11025, + 11052, + 11002, + 11025, + 11018, + 11056, + 11019, + 11086, + 11024, + 11012, + 11091, + 11029, + 11014, + 11041, + 10993, + 11027, + 11077, + 11025, + 11025, + 11058, + 11064, + 11043, + 11014, + 11071, + 11050, + 11059, + 11064, + 11031, + 11078, + 11029, + 11083, + 11048, + 11033, + 11066, + 11035, + 11066, + 11054, + 11055, + 11007, + 11011, + 11085, + 11035, + 11042, + 11080, + 11076, + 11011, + 11100, + 11065, + 11021, + 11026, + 11044, + 11021, + 11012, + 11042, + 11027, + 11014, + 11005, + 11011, + 11020, + 11042, + 11030, + 11060, + 11036, + 11014, + 10990, + 11035, + 11021, + 11033, + 11007, + 11050, + 11036, + 11133, + 11082, + 11026, + 11006, + 11018, + 10992, + 11007, + 11016, + 11080, + 11021, + 11044, + 11060, + 11008, + 11036, + 11071, + 11008, + 11014, + 11027, + 11065, + 11022, + 11072, + 11021, + 11037, + 11023, + 11051, + 11021, + 11033, + 11039, + 11030, + 11088, + 11003, + 11034, + 11048, + 11040, + 11008, + 11018, + 11038, + 11007, + 11032, + 11026, + 11021, + 11020, + 11010, + 11013, + 11077, + 11010, + 11016, + 11018, + 11322, + 11031, + 11070, + 11041, + 11059, + 11020, + 11022, + 11017, + 11067, + 11024, + 11044, + 11036, + 11024, + 11050, + 11030, + 11025, + 11030, + 11019, + 11024, + 11034, + 11082, + 11039, + 11070, + 11012, + 11044, + 11020, + 11052, + 11045, + 11028, + 11030, + 11033, + 11027, + 11017, + 11024, + 11000, + 11031, + 11010, + 11018, + 11065, + 11060, + 11477, + 11016, + 11030, + 11005, + 11085, + 11061, + 11011, + 11019, + 11018, + 10991, + 11070, + 11088, + 11022, + 11014, + 11014, + 11015, + 11055, + 11013, + 11038, + 11010, + 11023, + 11028, + 11105, + 11080, + 10993, + 11037, + 11078, + 10999, + 11033, + 11027, + 11034, + 11044, + 11019, + 11021, + 11038, + 11025, + 11059, + 11027, + 11076, + 11022, + 11067, + 11024, + 11000, + 11036, + 11037, + 11040, + 11065, + 11016, + 11016, + 11014, + 11071, + 11031, + 11054, + 11019, + 11062, + 11081, + 11023, + 11050, + 11044, + 11015, + 11035, + 11066, + 11011, + 11003, + 11039, + 11004, + 11025, + 11037, + 11009, + 11023, + 11059, + 11061, + 11079, + 11060, + 11063, + 11039, + 11077, + 11035, + 11059, + 11048, + 11035, + 11001, + 11032, + 11039, + 11027, + 11082, + 11025, + 11028, + 11045, + 11033, + 11016, + 11003, + 11028, + 11008, + 11037, + 11031, + 11021, + 11016, + 11030, + 11029, + 11108, + 11044, + 11030, + 11045, + 11037, + 11016, + 11035, + 11052, + 11034, + 11021, + 11042, + 11012, + 11060, + 11049, + 11018, + 11026, + 11024, + 11031, + 11048, + 11034, + 11045, + 11038, + 11022, + 11022, + 11060, + 11059, + 11027, + 11059, + 11013, + 11048, + 11049, + 11035, + 11026, + 11053, + 11048, + 11040, + 11082, + 11049, + 11026, + 11018, + 11024, + 11043, + 11035, + 11035, + 11043, + 11022, + 11041, + 11042, + 11039, + 11030, + 11059, + 11035, + 11102, + 11066, + 11082, + 11090, + 11102, + 11037, + 11029, + 11018, + 11053, + 11016, + 11054, + 11039, + 11037, + 11074, + 11061, + 11041, + 11031, + 11005, + 11024, + 11087, + 11085, + 11044, + 11031, + 11015, + 11022, + 11042, + 11046, + 11029, + 11003, + 11033, + 11036, + 11002, + 11034, + 11038, + 11016, + 11037, + 11047, + 11023, + 11069, + 11027, + 11035, + 11046, + 10998, + 11017, + 11042, + 11012, + 11017, + 11013, + 11043, + 11039, + 11043, + 11009, + 11042, + 11017, + 11071, + 11010, + 11050, + 11008, + 11044, + 11035, + 10998, + 11029, + 11036, + 11072, + 11018, + 11057, + 11078, + 11067, + 11033, + 11031, + 11081, + 11275, + 11057, + 11029, + 11019, + 11041, + 11029, + 11021, + 11000, + 11469, + 11027, + 11016, + 11022, + 11030, + 11055, + 11036, + 11048, + 11011, + 11044, + 11029, + 11050, + 11246, + 11059, + 11013, + 11037, + 11030, + 11009, + 11012, + 11048, + 11020, + 11022, + 11007, + 11063, + 21545, + 11044, + 11065, + 11047, + 11020, + 11024, + 11027, + 11048, + 11026, + 11027, + 11052, + 11049, + 11012, + 11054, + 11033, + 11103, + 11030, + 11016, + 11026, + 11058, + 11037, + 11022, + 11086, + 11081, + 11058, + 11076, + 11029, + 11053, + 11002, + 11021, + 11081, + 11093, + 11031, + 11054, + 11057, + 11040, + 11027, + 11077, + 11044, + 11072, + 11062, + 11008, + 11078, + 11003, + 11047, + 11025, + 11053, + 11036, + 11020, + 11038, + 11047, + 11007, + 11042, + 11039, + 11020, + 11038, + 11026, + 11030, + 11052, + 11034, + 11021, + 11084, + 11036, + 11026, + 11057, + 11047, + 11032, + 11058, + 11024, + 11006, + 11065, + 11057, + 11029, + 11062, + 11007, + 11050, + 11023, + 11079, + 11040, + 11045, + 11022, + 11034, + 11015, + 11029, + 11533, + 11065, + 11035, + 11028, + 11038, + 11012, + 11022, + 11076, + 11033, + 11057, + 11007, + 11049, + 11012, + 11067, + 11052, + 11014, + 11047, + 11020, + 11034, + 11029, + 11011, + 11050, + 11067, + 11053, + 11034, + 11055, + 11028, + 11135, + 11041, + 11035, + 11076, + 11022, + 11089, + 11053, + 11045, + 11029, + 11022, + 11023, + 11057, + 11050, + 11046, + 11017, + 11079, + 11062, + 11062, + 11022, + 11026, + 11046, + 11028, + 11053, + 11012, + 11049, + 11014, + 11074, + 11016, + 11072, + 11074, + 11061, + 11052, + 11085, + 10998, + 11072, + 11075, + 11012, + 11049, + 11046, + 11049, + 11023, + 11078, + 11016, + 11014, + 11121, + 11036, + 11078, + 11046, + 11011, + 11050, + 11034, + 10999, + 11056, + 11080, + 11077, + 11051, + 11136, + 11018, + 11058, + 11034, + 11053, + 11029, + 11009, + 11010, + 11058, + 11048, + 11029, + 11017, + 11087, + 11013, + 11023, + 11111, + 11035, + 11027, + 11048, + 11008, + 11025, + 11019, + 11068, + 11022, + 11017, + 11032, + 11048, + 11025, + 11039, + 11017, + 11068, + 11044, + 11069, + 11017, + 11057, + 11020, + 11078, + 11021, + 11108, + 11064, + 11031, + 11102, + 11055, + 11045, + 11046, + 11049, + 11034, + 11034, + 11066, + 11050, + 11069, + 11070, + 11029, + 11045, + 11048, + 11007, + 11184, + 11045, + 11080, + 11039, + 11038, + 11001, + 11035, + 11033, + 11030, + 11038, + 11051, + 11017, + 11125, + 11016, + 11007, + 11042, + 11018, + 11021, + 11033, + 11016, + 11066, + 11048, + 11109, + 11008, + 11054, + 11041, + 11016, + 11027, + 11018, + 11030, + 11068, + 11027, + 11050, + 11034, + 11036, + 11007, + 11054, + 11052, + 11069, + 11061, + 11034, + 11042, + 11050, + 11066, + 11047, + 11026, + 11048, + 11008, + 11061, + 11019, + 11042, + 11052, + 11029, + 11009, + 11075, + 11073, + 11035, + 11040, + 11071, + 11043, + 11061, + 11012, + 11020, + 11014, + 11051, + 11013, + 11060, + 11033, + 11044, + 11024, + 11026, + 11023, + 11070, + 11041, + 11029, + 11012, + 11012, + 11012, + 11036, + 11029, + 11086, + 11054, + 11006, + 11021, + 11033, + 11062, + 11022, + 11051, + 11023, + 11054, + 11034, + 11057, + 11056, + 11040, + 11032, + 11029, + 11055, + 11053, + 11016, + 11062, + 10996, + 10998, + 11019, + 11015, + 11005, + 11048, + 11029, + 11020, + 11016, + 11065, + 11034, + 11020, + 11012, + 11053, + 11033, + 11004, + 11068, + 11075, + 11018, + 11025, + 11037, + 11006, + 11058, + 11122, + 11086, + 11040, + 11033, + 11036, + 11023, + 11062, + 11036, + 11042, + 11095, + 11031, + 11011, + 11029, + 11069, + 11032, + 11018, + 11048, + 11015, + 11067, + 11089, + 11030, + 11053, + 11004, + 11046, + 11020, + 11030, + 11019, + 11050, + 11032, + 11018, + 11012, + 11053, + 11015, + 11076, + 11023, + 11061, + 11042, + 11041, + 11025, + 11044, + 11034, + 11028, + 11101, + 11058, + 11019, + 11015, + 11033, + 11064, + 11019, + 11057, + 11034, + 11052, + 10989, + 11089, + 11059, + 11052, + 11042, + 11038, + 11012, + 11026, + 11041, + 11017, + 11017, + 11050, + 11003, + 11026, + 11060, + 11045, + 11007, + 11060, + 11083, + 11045, + 10983, + 11003, + 11041, + 11084, + 11198, + 11041, + 11016, + 11076, + 11007, + 11062, + 11013, + 11089, + 11037, + 11021, + 11062, + 11050, + 13302, + 11029, + 11022, + 11036, + 11035, + 11041, + 11033, + 11020, + 11080, + 11013, + 11055, + 11037, + 11049, + 11056, + 11053, + 11019, + 11064, + 11045, + 11025, + 11073, + 11048, + 11008, + 11059, + 11045, + 11039, + 11034, + 11009, + 11061, + 11047, + 11087, + 11053, + 11050, + 11040, + 11065, + 11015, + 11033, + 11038, + 11027, + 11051, + 11064, + 11039, + 11025, + 11025, + 11057, + 11067, + 11062, + 11014, + 11210, + 11005, + 11061, + 11019, + 11020, + 11007, + 11032, + 11019, + 11086, + 11077, + 11008, + 11018, + 11056, + 11006, + 11060, + 11031, + 11007, + 11015, + 11015, + 11041, + 11033, + 11038, + 11046, + 11023, + 11049, + 11014, + 11031, + 11059, + 11038, + 11212, + 11052, + 11015, + 11016, + 11019, + 11021, + 11027, + 11108, + 11016, + 11005, + 11037, + 11074, + 11032, + 11038, + 11081, + 11012, + 11045, + 11024, + 11031, + 11027, + 10999, + 11041, + 11015, + 11017, + 10999, + 11129, + 11047, + 11021, + 11007, + 11076, + 11045, + 11086, + 11023, + 11028, + 11024, + 11009, + 11047, + 11140, + 11030, + 11068, + 11032, + 11019, + 11031, + 11039, + 11071, + 11028, + 12891, + 11053, + 11041, + 11089, + 11015, + 11051, + 11016, + 11043, + 11049, + 11084, + 11044, + 11081, + 11024, + 11029, + 11036, + 11030, + 11016, + 11036, + 11061, + 11042, + 11036, + 11055, + 11057, + 11014, + 11076, + 11047, + 11014, + 11007, + 11008, + 11010, + 11015, + 11033, + 11041, + 11027, + 11042, + 11021, + 11026, + 11047, + 11027, + 11052, + 11033, + 11003, + 11053, + 11043, + 11037, + 11045, + 11080, + 11039, + 11010, + 11092, + 11036, + 11064, + 11060, + 11071, + 11013, + 11081, + 11060, + 11080, + 11043, + 11038, + 11072, + 11042, + 11037, + 11077, + 11145, + 11053, + 11022, + 11079, + 11035, + 11021, + 11050, + 11076, + 11018, + 11120, + 11020, + 11042, + 11043, + 11044, + 11025, + 11016, + 11009, + 11064, + 11037, + 11033, + 11025, + 11033, + 11020, + 11028, + 11064, + 11036, + 11013, + 11021, + 11064, + 11091, + 11035, + 11020, + 11012, + 11003, + 11037, + 11054, + 11041, + 11050, + 11028, + 11069, + 11064, + 11039, + 11044, + 11029, + 11022, + 11092, + 11035, + 11115, + 11025, + 11071, + 11047, + 11123, + 11019, + 11008, + 11011, + 11010, + 11044, + 11041, + 11022, + 11040, + 11041, + 11018, + 11084, + 11049, + 11024, + 11049, + 11015, + 11013, + 11044, + 11002, + 10998, + 11017, + 11057, + 11035, + 11022, + 11032, + 11005, + 11034, + 11058, + 11022, + 11067, + 11048, + 11021, + 11045, + 11023, + 11012, + 11019, + 11053, + 11044, + 11049, + 11014, + 11062, + 11051, + 11037, + 11013, + 11066, + 10997, + 11040, + 11000, + 11019, + 11020, + 11047, + 11010, + 11012, + 11039, + 11027, + 11017, + 11015, + 11010, + 11037, + 11069, + 11044, + 11029, + 11072, + 11092, + 11007, + 11081, + 11035, + 11027, + 11057, + 11021, + 11029, + 11047, + 11064, + 11020, + 11049, + 11028, + 11037, + 11080, + 11143, + 11011, + 11055, + 11005, + 11020, + 11023, + 11014, + 11027, + 11044, + 11035, + 11040, + 11007, + 11050, + 11025, + 11021, + 11023, + 11024, + 11017, + 11037, + 11029, + 11054, + 11014, + 11018, + 11081, + 11026, + 11009, + 11053, + 11049, + 11030, + 11033, + 11012, + 11015, + 11017, + 11026, + 11032, + 11075, + 11033, + 11020, + 11054, + 11000, + 11085, + 11024, + 11042, + 11039, + 11096, + 11016, + 11022, + 11074, + 11021, + 11005, + 11060, + 11058, + 11011, + 11026, + 11057, + 11032, + 11030, + 11030, + 11056, + 11019, + 11022, + 11023, + 11048, + 11030, + 11038, + 11011, + 11032, + 11018, + 11055, + 11070, + 11025, + 11014, + 11031, + 11005, + 11046, + 11030, + 11034, + 11036, + 11037, + 11015, + 11069, + 11028, + 11052, + 11025, + 11034, + 11035, + 11065, + 11025, + 11027, + 11003, + 11043, + 11029, + 11045, + 11023, + 11054, + 11023, + 11034, + 11026, + 11067, + 11066, + 11017, + 11034, + 11059, + 11051, + 11065, + 11024, + 11008, + 11063, + 11018, + 11020, + 11028, + 11072, + 11017, + 11025, + 11054, + 11026, + 11074, + 11013, + 11038, + 11041, + 11052, + 11013, + 11051, + 11012, + 11014, + 11013, + 11057, + 11036, + 11064, + 11054, + 11014, + 11075, + 11020, + 11013, + 11053, + 11015, + 11044, + 11064, + 11021, + 11021, + 11067, + 11073, + 10996, + 11046, + 11015, + 11023, + 11075, + 11078, + 11074, + 11027, + 11042, + 11038, + 11079, + 11013, + 11069, + 11035, + 11158, + 11039, + 11046, + 11027, + 11051, + 11006, + 11061, + 11065, + 11068, + 11024, + 11035, + 11041, + 11034, + 11023, + 11030, + 11019, + 11041, + 11069, + 11067, + 11102, + 11042, + 11046, + 11017, + 11008, + 11038, + 11014, + 11059, + 11082, + 11027, + 11020, + 11024, + 11025, + 11061, + 11074, + 11059, + 11032, + 11073, + 11045, + 11046, + 11066, + 11006, + 11013, + 11077, + 11037, + 11078, + 11042, + 11053, + 11050, + 11016, + 11010, + 11089, + 11067, + 11044, + 11046, + 11027, + 11009, + 11077, + 11035, + 11041, + 11048, + 11018, + 11020, + 11050, + 11035, + 11002, + 11028, + 11036, + 11016, + 11029, + 11061, + 11038, + 11026, + 11033, + 11024, + 11038, + 11016, + 11035, + 11031, + 11029, + 11069, + 11058, + 11034, + 11074, + 11071, + 11054, + 11023, + 11032, + 11008, + 11121, + 11071, + 11069, + 11008, + 11070, + 11042, + 11129, + 11030, + 11004, + 11019, + 11047, + 11020, + 11016, + 11011, + 11051, + 11458, + 11060, + 11008, + 11049, + 11039, + 11022, + 11019, + 11072, + 11108, + 11050, + 11022, + 11098, + 11039, + 11048, + 11060, + 11086, + 11065, + 11016, + 11005, + 11027, + 11016, + 11022, + 11047, + 11020, + 11014, + 11053, + 11048, + 11008, + 11025, + 11024, + 11010, + 11050, + 11012, + 11049, + 11031, + 11025, + 11059, + 11083, + 11019, + 11028, + 11011, + 11033, + 11029, + 11038, + 11022, + 11068, + 11048, + 11019, + 11007, + 11041, + 11052, + 11012, + 11041, + 11023, + 11016, + 11053, + 11026, + 11007, + 11082, + 11017, + 11027, + 11042, + 11071, + 11012, + 11026, + 11064, + 11014, + 11042, + 11010, + 11027, + 11131, + 11047, + 11003, + 11041, + 11035, + 11026, + 11052, + 11013, + 11018, + 11034, + 11030, + 11031, + 11068, + 11016, + 11039, + 11036, + 11033, + 11035, + 11032, + 11060, + 11037, + 11072, + 11020, + 11016, + 11041, + 11024, + 11047, + 11023, + 11039, + 11020, + 11022, + 11050, + 11033, + 11077, + 11034, + 11042, + 11037, + 11053, + 11053, + 11056, + 11072, + 11034, + 11036, + 11023, + 11023, + 11018, + 11036, + 11054, + 11035, + 11005, + 11042, + 11058, + 11004, + 11010, + 11044, + 11013, + 11011, + 11047, + 11057, + 11024, + 11040, + 11022, + 11024, + 11047, + 11052, + 11055, + 11029, + 11004, + 11030, + 11050, + 11024, + 11024, + 11018, + 11023, + 11055, + 11048, + 11007, + 11009, + 11009, + 11047, + 11006, + 11043, + 11030, + 11024, + 11050, + 11061, + 11011, + 11033, + 11000, + 11055, + 11024, + 11026, + 11008, + 11028, + 11022, + 11083, + 11017, + 11021, + 11038, + 11087, + 11008, + 11040, + 11043, + 11014, + 11037, + 11079, + 11032, + 11101, + 11028, + 11022, + 11095, + 11034, + 11035, + 11058, + 11041, + 11044, + 11014, + 11077, + 11031, + 11024, + 10996, + 11024, + 11050, + 11014, + 11088, + 11036, + 11021, + 10999, + 11027, + 11063, + 11041, + 11018, + 11025, + 11044, + 11027, + 11044, + 11030, + 11018, + 11109, + 11004, + 11000, + 11045, + 11000, + 11042, + 11038, + 11047, + 11031, + 11040, + 11044, + 11077, + 11029, + 11035, + 11004, + 11058, + 11020, + 11036, + 11096, + 11044, + 11033, + 11060, + 11027, + 11039, + 11026, + 11017, + 11031, + 11036, + 11027, + 11021, + 11032, + 11018, + 11016, + 11085, + 11011, + 11020, + 11032, + 11037, + 11068, + 11074, + 11047, + 11077, + 11000, + 11045, + 11525, + 11035, + 10999, + 11040, + 11021, + 11014, + 11029, + 11121, + 11176, + 11051, + 11052, + 11075, + 11005, + 11074, + 11002, + 11045, + 11040, + 11035, + 11023, + 11018, + 11099, + 10995, + 11073, + 11003, + 11036, + 11110, + 11043, + 11048, + 11038, + 11076, + 11009, + 11036, + 11019, + 11026, + 11062, + 11036, + 11000, + 11014, + 11066, + 11029, + 11086, + 11071, + 11038, + 11027, + 11072, + 11019, + 11050, + 11069, + 11030, + 11066, + 11077, + 11034, + 11404, + 11063, + 11044, + 11037, + 11028, + 11107, + 11049, + 11040, + 11010, + 11049, + 11017, + 11032, + 11013, + 11052, + 11015, + 11041, + 11023, + 11018, + 11016, + 11017, + 11000, + 11075, + 11043, + 11040, + 11020, + 11079, + 11025, + 11071, + 11042, + 11030, + 11044, + 11042, + 11020, + 11031, + 11046, + 11038, + 11018, + 11031, + 11018, + 11046, + 11042, + 11024, + 11020, + 11110, + 11020, + 11065, + 11059, + 11025, + 11019, + 11057, + 11039, + 11024, + 11010, + 11047, + 11025, + 11056, + 11021, + 11061, + 11109, + 11016, + 10999, + 11040, + 11034, + 11020, + 11031, + 11012, + 11016, + 11053, + 11016, + 11021, + 11025, + 11033, + 11025, + 11031, + 11017, + 11023, + 11048, + 11044, + 11010, + 11058, + 11045, + 11031, + 11066, + 11021, + 11039, + 11043, + 11032, + 11047, + 11021, + 11036, + 11026, + 11041, + 11044, + 11064, + 11011, + 11086, + 11041, + 11084, + 11046, + 11087, + 11045, + 11035, + 11016, + 11053, + 11031, + 11040, + 11003, + 11016, + 11051, + 11284, + 11009, + 11091, + 11091, + 10997, + 11047, + 11050, + 11031, + 11044, + 11087, + 11077, + 11040, + 11038, + 11062, + 11057, + 11043, + 11026, + 11029, + 11077, + 11010, + 11030, + 11022, + 11016, + 11048, + 11020, + 10998, + 11113, + 11030, + 11023, + 11028, + 11015, + 11019, + 11100, + 11002, + 11031, + 11054, + 11016, + 11069, + 11053, + 11038, + 11007, + 11060, + 11057, + 11003, + 11055, + 11002, + 11063, + 11029, + 11059, + 11056, + 11063, + 11056, + 11022, + 11025, + 11082, + 11015, + 11034, + 11002, + 11016, + 11034, + 11082, + 11013, + 11057, + 11063, + 11085, + 11021, + 11018, + 11054, + 11066, + 11040, + 11014, + 11035, + 11005, + 11032, + 11105, + 11046, + 11037, + 11024, + 11051, + 11004, + 11043, + 11014, + 11020, + 11038, + 11030, + 11045, + 11033, + 11018, + 11023, + 11042, + 11035, + 11019, + 11051, + 11020, + 11024, + 11067, + 11035, + 11043, + 11059, + 11008, + 11035, + 11023, + 11022, + 11015, + 11016, + 11050, + 11039, + 11032, + 11036, + 11039, + 11024, + 11039, + 11002, + 11067, + 11012, + 11048, + 11094, + 11038, + 11033, + 11011, + 11021, + 11028, + 11077, + 11038, + 11022, + 11011, + 11097, + 11020, + 11064, + 11072, + 11063, + 11028, + 11019, + 11010, + 11050, + 11045, + 11068, + 11029, + 11052, + 11013, + 11029, + 11015, + 11022, + 11080, + 11061, + 11027, + 11075, + 11053, + 11039, + 11027, + 11025, + 11017, + 11045, + 11026, + 11043, + 11016, + 11029, + 11002, + 11054, + 11027, + 11027, + 11026, + 11086, + 11008, + 11041, + 11064, + 11021, + 11030, + 11031, + 11029, + 11068, + 11031, + 11052, + 11024, + 11047, + 11030, + 11036, + 11028, + 11049, + 11010, + 11003, + 11019, + 11035, + 13141, + 11042, + 11018, + 11031, + 11026, + 11054, + 11046, + 11068, + 11013, + 11077, + 11030, + 11032, + 11026, + 11045, + 11045, + 11019, + 11048, + 11047, + 11033, + 11056, + 11032, + 11073, + 11024, + 11055, + 11029, + 11013, + 11027, + 11074, + 11048, + 11068, + 11042, + 11030, + 11063, + 11048, + 11015, + 11081, + 11024, + 11030, + 11047, + 11038, + 11044, + 11026, + 11047, + 11058, + 11026, + 11030, + 11051, + 11066, + 11014, + 10999, + 11030, + 11042, + 11024, + 11056, + 11010, + 11051, + 11025, + 11029, + 11002, + 11031, + 11111, + 11025, + 11041, + 11044, + 11026, + 11049, + 11001, + 11049, + 11017, + 11042, + 11004, + 11082, + 11032, + 11055, + 11025, + 11115, + 11022, + 11093, + 11038, + 11074, + 11028, + 11012, + 11002, + 11056, + 11096, + 11027, + 11060, + 11016, + 11041, + 11065, + 11043, + 11009, + 11039, + 11051, + 11055, + 11053, + 11062, + 11022, + 11079, + 11076, + 11025, + 11009, + 11038, + 11036, + 11070, + 11018, + 11019, + 11027, + 11025, + 11095, + 11040, + 11037, + 11033, + 11046, + 11015, + 11033, + 11032, + 11011, + 11025, + 11028, + 11030, + 11121, + 11022, + 11043, + 11007, + 11042, + 11030, + 11045, + 11012, + 11056, + 11010, + 11036, + 11030, + 11024, + 11024, + 11024, + 11039, + 11066, + 11011, + 11049, + 11057, + 11007, + 11014, + 11071, + 11006, + 11031, + 11004, + 11048, + 11023, + 11083, + 11023, + 11026, + 11058, + 11036, + 11034, + 11051, + 11003, + 11038, + 25132, + 11061, + 11010, + 11083, + 11049, + 11056, + 11050, + 11022, + 11034, + 11068, + 11108, + 11044, + 10999, + 11076, + 11026, + 11080, + 12244, + 11044, + 11032, + 11042, + 11016, + 11050, + 11028, + 11043, + 11057, + 11025, + 11016, + 11029, + 11047, + 11071, + 11026, + 11021, + 11035, + 11025, + 11035, + 11061, + 11021, + 11089, + 11036, + 11037, + 11054, + 11025, + 11039, + 11032, + 11022, + 11089, + 11055, + 11039, + 11048, + 11034, + 11046, + 11064, + 11101, + 11037, + 11073, + 11034, + 11032, + 11034, + 11066, + 11103, + 11043, + 11037, + 11007, + 11057, + 11034, + 11041, + 11028, + 11097, + 16727, + 11041, + 11077, + 11036, + 11039, + 11051, + 11033, + 11071, + 11032, + 11024, + 11038, + 11082, + 11016, + 11075, + 11047, + 11094, + 11074, + 11039, + 11022, + 11082, + 11060, + 11061, + 11022, + 11068, + 11024, + 11104, + 11030, + 11026, + 11056, + 11031, + 11016, + 11035, + 11018, + 11039, + 11010, + 11010, + 11005, + 11052, + 11038, + 11058, + 11021, + 11050, + 11019, + 11067, + 11023, + 11039, + 11043, + 11032, + 11026, + 11021, + 11041, + 11044, + 11060, + 11027, + 11026, + 11076, + 11788, + 11022, + 11044, + 11047, + 11042, + 11054, + 11035, + 11020, + 11062, + 11021, + 11012, + 11046, + 11021, + 11034, + 11038, + 11042, + 11136, + 11061, + 11097, + 11027, + 11022, + 11058, + 11026, + 11037, + 21844, + 11051, + 11056, + 11028, + 11048, + 11071, + 11025, + 11094, + 11023, + 11011, + 11016, + 11019, + 11045, + 11032, + 11009, + 10991, + 11036, + 11064, + 11048, + 11033, + 11035, + 11039, + 11050, + 11064, + 11033, + 11028, + 11039, + 11027, + 11101, + 11031, + 11028, + 11025, + 11032, + 11048, + 11031, + 11073, + 11047, + 11038, + 11053, + 11043, + 11035, + 11048, + 11015, + 11053, + 11017, + 11038, + 11008, + 11023, + 11054, + 11009, + 11010, + 11008, + 11027, + 11052, + 11039, + 11027, + 11019, + 11021, + 11003, + 11072, + 11051, + 11056, + 11016, + 11012, + 11003, + 11061, + 11020, + 11025, + 11060, + 11030, + 11000, + 11031, + 11079, + 11052, + 11008, + 11386, + 11041, + 11067, + 11060, + 11020, + 11118, + 11026, + 11056, + 11075, + 11053, + 11035, + 11095, + 11044, + 11015, + 11095, + 11068, + 11030, + 11050, + 11012, + 11004, + 11102, + 11063, + 11008, + 11042, + 10996, + 11011, + 11070, + 11059, + 11021, + 11009, + 11064, + 11028, + 11085, + 11021, + 11045, + 11015, + 11045, + 11010, + 11103, + 11019, + 11060, + 11059, + 11015, + 11019, + 11050, + 11052, + 11040, + 11042, + 11026, + 11058, + 11073, + 11023, + 11316, + 11051, + 11026, + 11021, + 11070, + 11012, + 11104, + 11030, + 11021, + 11025, + 11027, + 11014, + 11052, + 11049, + 11044, + 11018, + 11057, + 11014, + 11061, + 11043, + 11016, + 11027, + 11027, + 11022, + 11092, + 11054, + 11037, + 11008, + 11024, + 11075, + 11034, + 11017, + 11040, + 10992, + 11039, + 11058, + 11006, + 11054, + 11058, + 11014, + 11055, + 11047, + 11012, + 11011, + 11052, + 11003, + 11020, + 11053, + 11042, + 11036, + 11023, + 11019, + 11020, + 11045, + 11033, + 11067, + 11012, + 11034, + 11070, + 11038, + 11054, + 11034, + 11052, + 11016, + 11097, + 11016, + 11037, + 10996, + 11040, + 11043, + 11052, + 11025, + 11013, + 11019, + 11018, + 11015, + 11067, + 11022, + 11011, + 11093, + 11025, + 11034, + 11068, + 11151, + 11059, + 11031, + 11054, + 11015, + 11032, + 11032, + 11016, + 11007, + 11033, + 11027, + 11008, + 11055, + 11018, + 11013, + 11055, + 11052, + 11032, + 11015, + 11061, + 11014, + 11094, + 11003, + 11063, + 11000, + 11029, + 11021, + 11041, + 11027, + 11040, + 11040, + 11032, + 11052, + 11007, + 11021, + 11081, + 11022, + 11018, + 11074, + 11038, + 11039, + 11044, + 11039, + 11058, + 11025, + 11065, + 11010, + 11019, + 11021, + 11042, + 11066, + 11055, + 11036, + 11064, + 11028, + 11045, + 11024, + 11056, + 11026, + 11042, + 11178, + 11007, + 11055, + 11011, + 11018, + 11050, + 11056, + 11017, + 11057, + 11028, + 11016, + 11050, + 11046, + 11071, + 11028, + 11027, + 11023, + 11017, + 11066, + 11034, + 11042, + 11041, + 11039, + 11033, + 11064, + 11030, + 11063, + 11060, + 10993, + 11034, + 11022, + 11069, + 11034, + 11060, + 11017, + 11074, + 11029, + 11039, + 11060, + 11049, + 11002, + 11050, + 11061, + 11055, + 11085, + 11021, + 11020, + 11056, + 11049, + 11023, + 11062, + 11043, + 11029, + 11055, + 11019, + 11060, + 11007, + 11009, + 11027, + 11050, + 11007, + 11067, + 11129, + 11021, + 11017, + 12659, + 11020, + 11061, + 11030, + 11028, + 11025, + 11068, + 11033, + 11021, + 11031, + 10997, + 11012, + 11024, + 11037, + 11089, + 11021, + 11064, + 11011, + 11044, + 11027, + 11044, + 11007, + 11034, + 11015, + 11035, + 11043, + 11036, + 11073, + 11008, + 11018, + 11051, + 11057, + 11028, + 11033, + 11037, + 11011, + 11047, + 11024, + 11018, + 11098, + 11025, + 11027, + 11026, + 11017, + 11014, + 11019, + 11071, + 11036, + 11061, + 11055, + 11027, + 11061, + 11016, + 11012, + 11027, + 11068, + 11044, + 11047, + 11005, + 11047, + 11024, + 11086, + 11044, + 11015, + 11046, + 11018, + 11059, + 11044, + 11107, + 11050, + 11055, + 11045, + 11040, + 11067, + 11034, + 11008, + 11022, + 11052, + 11072, + 11055, + 11026, + 11031, + 11028, + 11068, + 11066, + 11013, + 11048, + 11014, + 11027, + 11672, + 11034, + 11011, + 11039, + 11028, + 11030, + 11365, + 11075, + 11025, + 11031, + 11040, + 11035, + 11032, + 11070, + 11029, + 11079, + 11066, + 11010, + 11044, + 11049, + 11083, + 11068, + 11027, + 11009, + 11022, + 11044, + 11036, + 11008, + 11018, + 11008, + 11017, + 11068, + 11068, + 11026, + 11048, + 11013, + 11093, + 11060, + 11044, + 11006, + 11065, + 11022, + 11016, + 11041, + 11004, + 11063, + 11013, + 11065, + 11057, + 11036, + 11023, + 11025, + 11053, + 11029, + 11017, + 11032, + 11037, + 11019, + 11015, + 11019, + 11016, + 11066, + 11055, + 11046, + 11046, + 11023, + 11019, + 11119, + 11108, + 11030, + 11014, + 11025, + 10999, + 11075, + 11015, + 11074, + 11054, + 11019, + 11022, + 11043, + 11085, + 11050, + 12043, + 11048, + 11012, + 11022, + 11036, + 11017, + 11026, + 11019, + 11015, + 11066, + 11083, + 11031, + 11105, + 11034, + 11013, + 11041, + 11049, + 11005, + 11077, + 11024, + 11013, + 11048, + 11029, + 11018, + 11023, + 11014, + 11011, + 11090, + 11048, + 11046, + 11010, + 11066, + 11022, + 11042, + 11033, + 11039, + 11015, + 11065, + 11040, + 11079, + 11034, + 11027, + 11020, + 11013, + 11010, + 11065, + 11052, + 11044, + 11035, + 11051, + 11023, + 11043, + 11036, + 11027, + 11011, + 11108, + 11009, + 11054, + 11031, + 11024, + 11024, + 11009, + 11060, + 11057, + 11075, + 11079, + 11033, + 11008, + 11013, + 11072, + 11070, + 11009, + 11019, + 11046, + 11016, + 11093, + 11012, + 11085, + 11010, + 11070, + 11032, + 11085, + 11021, + 11061, + 11064, + 11039, + 11001, + 11070, + 11052, + 11003, + 11026, + 11031, + 11019, + 11063, + 11028, + 11018, + 11013, + 10998, + 11100, + 11097, + 11019, + 11057, + 11032, + 11014, + 11042, + 11077, + 11065, + 11038, + 11021, + 11086, + 11034, + 11042, + 11050, + 11033, + 11026, + 11032, + 11032, + 11028, + 11045, + 11022, + 11032, + 11089, + 11371, + 11057, + 11038, + 11023, + 11212, + 11033, + 11037, + 11073, + 11026, + 11051, + 11006, + 11051, + 11007, + 11055, + 11046, + 11008, + 11039, + 11060, + 11002, + 11051, + 11028, + 11014, + 11086, + 11049, + 11016, + 11033, + 11047, + 11046, + 11021, + 11045, + 11003, + 11084, + 11034, + 11035, + 11044, + 11049, + 11003, + 11056, + 11031, + 11050, + 11039, + 11000, + 11217, + 11054, + 11052, + 11024, + 11045, + 11085, + 11061, + 11083, + 11077, + 11044, + 11028, + 11069, + 11047, + 11045, + 11112, + 11100, + 11041, + 11046, + 11021, + 11064, + 11025, + 11004, + 11032, + 11041, + 11052, + 11062, + 11022, + 11048, + 11029, + 11028, + 11027, + 11028, + 11018, + 11024, + 11042, + 11077, + 11026, + 11060, + 11036, + 11028, + 11053, + 11081, + 11047, + 11048, + 11038, + 11016, + 11064, + 11018, + 11015, + 11085, + 11087, + 11073, + 11018, + 11048, + 11041, + 11062, + 11057, + 11005, + 11080, + 11043, + 11053, + 11084, + 11048, + 11030, + 11029, + 11070, + 11038, + 11076, + 11051, + 11015, + 11052, + 11018, + 11022, + 11021, + 11024, + 11019, + 11049, + 11085, + 11031, + 11054, + 11022, + 11032, + 11044, + 11063, + 11024, + 11058, + 11076, + 11055, + 11025, + 11039, + 11026, + 11049, + 11028, + 11036, + 11024, + 11044, + 11020, + 11049, + 11004, + 10996, + 11013, + 11011, + 11015, + 11029, + 11031, + 11053, + 11036, + 11087, + 11027, + 11047, + 11018, + 11053, + 11076, + 11045, + 11039, + 11082, + 11049, + 11310, + 11030, + 11032, + 11018, + 11118, + 11045, + 11083, + 11049, + 11045, + 11051, + 11064, + 11060, + 11031, + 11069, + 11072, + 11026, + 11065, + 11038, + 11039, + 11030, + 11062, + 11032, + 11077, + 11026, + 11067, + 11031, + 11004, + 11012, + 11029, + 10998, + 11051, + 11009, + 11047, + 11033, + 11066, + 11050, + 11052, + 11017, + 11032, + 11069, + 11033, + 11025, + 11066, + 10999, + 11027, + 11054, + 11045, + 11052, + 11051, + 11042, + 11023, + 11034, + 11057, + 11032, + 11018, + 11026, + 11040, + 11034, + 11059, + 11044, + 11050, + 11082, + 11033, + 11022, + 11055, + 11001, + 11051, + 11004, + 11044, + 11036, + 11026, + 11027, + 11022, + 11036, + 11006, + 11013, + 11065, + 11064, + 11028, + 11032, + 11088, + 11011, + 11051, + 10999, + 10994, + 11059, + 11075, + 11019, + 11093, + 11033, + 11007, + 11042, + 11020, + 11037, + 11055, + 11079, + 11057, + 11063, + 11033, + 11026, + 11047, + 11045, + 11006, + 11026, + 11011, + 11025, + 11026, + 11001, + 11028, + 11040, + 11059, + 11038, + 11038, + 11035, + 11040, + 11051, + 11015, + 11006, + 11012, + 11010, + 11027, + 11029, + 11073, + 11025, + 11050, + 11093, + 11060, + 11007, + 11002, + 11020, + 11059, + 11014, + 11050, + 11005, + 11000, + 11014, + 11051, + 11013, + 11034, + 11023, + 11017, + 11013, + 11033, + 11017, + 11018, + 10993, + 11014, + 11020, + 11095, + 11007, + 11007, + 11052, + 11020, + 11017, + 11105, + 11058, + 11082, + 11038, + 11057, + 11021, + 11054, + 11052, + 11015, + 11012, + 11050, + 11022, + 11051, + 11019, + 11051, + 11058, + 11029, + 11051, + 11038, + 11053, + 11036, + 11042, + 11032, + 11023, + 11053, + 11039, + 11037, + 11085, + 11032, + 11008, + 11046, + 11006, + 11036, + 11010, + 11138, + 11030, + 11055, + 11039, + 11036, + 11022, + 11030, + 11060, + 11044, + 11004, + 11088, + 11054, + 11024, + 11065, + 11042, + 11053, + 11067, + 11064, + 11073, + 11021, + 11036, + 11023, + 11068, + 11028, + 11048, + 11007, + 11034, + 11062, + 11033, + 11063, + 11024, + 11029, + 11059, + 11028, + 11067, + 11065, + 11058, + 11054, + 11046, + 11029, + 11070, + 11048, + 11057, + 11011, + 11039, + 11142, + 11012, + 11093, + 11017, + 11038, + 11094, + 11007, + 11048, + 11003, + 11041, + 10994, + 11030, + 10994, + 11054, + 11032, + 11068, + 11055, + 11018, + 11044, + 11090, + 11041, + 11033, + 11439, + 11069, + 11016, + 11072, + 11054, + 11038, + 11059, + 11074, + 11057, + 11039, + 11086, + 11071, + 11048, + 11067, + 11052, + 11003, + 11015, + 11056, + 11031, + 11039, + 11046, + 11045, + 11028, + 11049, + 11006, + 11024, + 11022, + 11024, + 11050, + 11013, + 11045, + 11021, + 11046, + 11048, + 11035, + 11051, + 11036, + 11056, + 11044, + 11016, + 11029, + 11025, + 11051, + 11073, + 11017, + 11007, + 11030, + 11043, + 11007, + 11066, + 11045, + 11041, + 11029, + 11051, + 11040, + 11044, + 11034, + 11027, + 11034, + 11051, + 11018, + 11027, + 11008, + 11031, + 11042, + 11221, + 11008, + 11041, + 11037, + 11030, + 11086, + 11007, + 11066, + 11063, + 11064, + 11014, + 11058, + 11022, + 11004, + 11052, + 11108, + 11057, + 11033, + 11065, + 11015, + 11067, + 11008, + 11012, + 11006, + 11015, + 11005, + 11058, + 11029, + 11083, + 11012, + 11027, + 11027, + 11042, + 11034, + 11003, + 11035, + 11036, + 11031, + 11030, + 11017, + 11051, + 11065, + 11024, + 11012, + 11047, + 11044, + 11013, + 11050, + 11027, + 11061, + 11064, + 11003, + 11017, + 11053, + 11023, + 11035, + 11016, + 11014, + 11034, + 11021, + 11049, + 11012, + 11082, + 11043, + 11015, + 11044, + 11045, + 11011, + 11057, + 11026, + 11059, + 11014, + 11028, + 10998, + 11052, + 11026, + 11015, + 11009, + 11018, + 11042, + 11100, + 11009, + 11038, + 11047, + 11064, + 11080, + 11060, + 11033, + 11059, + 11050, + 11050, + 11017, + 11052, + 11088, + 11048, + 11034, + 11053, + 11011, + 11083, + 11046, + 11062, + 11007, + 11031, + 11012, + 11036, + 11021, + 11066, + 11021, + 11028, + 11027, + 11032, + 11067, + 11012, + 11037, + 11053, + 11058, + 11067, + 11033, + 11030, + 11059, + 11012, + 38148, + 11039, + 11061, + 11030, + 11059, + 11027, + 11022, + 11052, + 11033, + 11017, + 11043, + 11013, + 11032, + 11058, + 11048, + 11026, + 11067, + 11059, + 11036, + 11029, + 11052, + 11033, + 11023, + 11020, + 11011, + 11026, + 11036, + 11011, + 11024, + 11043, + 11018, + 11078, + 11023, + 11064, + 11036, + 11047, + 11042, + 11072, + 11077, + 11069, + 11060, + 11079, + 11025, + 11052, + 11058, + 11022, + 11044, + 11081, + 11007, + 11058, + 11033, + 11012, + 11018, + 11013, + 11006, + 11072, + 11032, + 11062, + 11041, + 11059, + 11046, + 11031, + 11030, + 11080, + 11016, + 11105, + 11013, + 11094, + 11041, + 11044, + 11004, + 11026, + 11013, + 11186, + 11027, + 11126, + 11026, + 11019, + 11009, + 11042, + 11083, + 11041, + 11073, + 11020, + 11018, + 11074, + 11021, + 11046, + 11022, + 11016, + 11023, + 11065, + 11060, + 11085, + 11050, + 11010, + 11018, + 11062, + 11039, + 11044, + 11080, + 11051, + 11033, + 11061, + 11016, + 11031, + 11042, + 11049, + 11041, + 11049, + 11043, + 11027, + 11053, + 11049, + 11026, + 11033, + 11028, + 11051, + 11034, + 11052, + 11052, + 11037, + 11069, + 11054, + 11015, + 11026, + 11030, + 11059, + 11029, + 11044, + 11047, + 11036, + 11012, + 11070, + 11030, + 11022, + 11051, + 11074, + 11005, + 11097, + 11016, + 11036, + 11060, + 11027, + 11031, + 11057, + 11029, + 11002, + 11030, + 11032, + 11035, + 11069, + 11029, + 11056, + 11030, + 11041, + 11018, + 11058, + 11071, + 11056, + 11046, + 11065, + 11008, + 11069, + 11027, + 11028, + 11054, + 11054, + 11063, + 11049, + 11030, + 11147, + 30477, + 11036, + 11007, + 11032, + 11014, + 11029, + 11021, + 11019, + 11024, + 11051, + 11016, + 11037, + 11035, + 11054, + 11002, + 11079, + 11017, + 11019, + 11027, + 11031, + 11020, + 11050, + 11077, + 11074, + 11057, + 11052, + 11018, + 11024, + 11035, + 11036, + 11031, + 11023, + 11086, + 11060, + 11064, + 11051, + 11087, + 11041, + 11019, + 11030, + 11048, + 11047, + 11038, + 11016, + 11020, + 11042, + 11017, + 11010, + 11034, + 11012, + 11032, + 11024, + 11032, + 11042, + 11012, + 11071, + 11036, + 11020, + 11023, + 11040, + 11032, + 11058, + 11008, + 11062, + 11029, + 11056, + 11032, + 11032, + 11007, + 11049, + 11052, + 11101, + 11038, + 11024, + 11024, + 11058, + 11030, + 11278, + 11042, + 11043, + 11028, + 11044, + 11042, + 11062, + 11037, + 11060, + 11021, + 11042, + 11057, + 11004, + 11045, + 11021, + 11026, + 11039, + 11037, + 11081, + 11041, + 11026, + 11041, + 11039, + 11018, + 11038, + 11024, + 11007, + 11018, + 11073, + 11000, + 11046, + 11016, + 11028, + 11023, + 11081, + 11068, + 11015, + 11039, + 11018, + 11025, + 11053, + 11087, + 11070, + 11022, + 11033, + 10998, + 11091, + 11048, + 11020, + 11021, + 11012, + 11013, + 11055, + 11087, + 11011, + 11052, + 11024, + 11041, + 11104, + 11048, + 11046, + 11021, + 11023, + 11020, + 11193, + 11022, + 11063, + 11027, + 11021, + 11011, + 11026, + 11030, + 11018, + 11037, + 11046, + 11032, + 11048, + 11053, + 11315, + 11068, + 11025, + 10999, + 11024, + 11020, + 11076, + 11022, + 11032, + 11009, + 11070, + 11001, + 11046, + 11051, + 11002, + 11036, + 11070, + 11045, + 11028, + 11310, + 11102, + 11007, + 11059, + 11018, + 11019, + 11061, + 11018, + 11006, + 11036, + 11130, + 11052, + 11026, + 11044, + 11028, + 11067, + 11023, + 11039, + 11032, + 11035, + 11020, + 11028, + 11066, + 11126, + 11035, + 11045, + 11016, + 11068, + 11029, + 11017, + 11046, + 11059, + 11025, + 11062, + 11055, + 11063, + 11037, + 11027, + 11025, + 11082, + 11041, + 11037, + 11053, + 11030, + 11009, + 11047, + 11053, + 11020, + 11035, + 11042, + 11038, + 11071, + 11026, + 10999, + 11025, + 11125, + 11035, + 11067, + 11019, + 11018, + 11061, + 11095, + 11011, + 11072, + 11040, + 11032, + 11030, + 11042, + 11006, + 11080, + 11025, + 11048, + 11018, + 11058, + 11037, + 11050, + 11017, + 11051, + 11040, + 11024, + 11034, + 11050, + 11565, + 11068, + 11029, + 11016, + 11037, + 11064, + 11058, + 11060, + 11024, + 11013, + 11018, + 11110, + 11046, + 11014, + 11053, + 11061, + 11021, + 11052, + 11100, + 11014, + 11056, + 11044, + 11047, + 11029, + 11015, + 11022, + 11048, + 11027, + 11034, + 11055, + 11051, + 11082, + 11029, + 11027, + 11042, + 11011, + 11050, + 11019, + 11042, + 11075, + 11044, + 11051, + 11053, + 11058, + 11037, + 11012, + 11033, + 11040, + 11014, + 11046, + 11096, + 11010, + 11020, + 11063, + 11042, + 11039, + 11018, + 11023, + 11035, + 11058, + 11046, + 11394, + 11019, + 11067, + 11042, + 11044, + 11010, + 11040, + 11024, + 11061, + 11048, + 11054, + 11046, + 11489, + 11035, + 11033, + 11032, + 11063, + 11020, + 11042, + 11027, + 11020, + 11054, + 11062, + 11022, + 11066, + 11030, + 11063, + 11039, + 11068, + 11060, + 11067, + 11025, + 11074, + 11027, + 11052, + 11016, + 11053, + 11013, + 11045, + 11026, + 11053, + 11060, + 11073, + 11080, + 11137, + 11053, + 11114, + 11036, + 11062, + 11012, + 11067, + 11024, + 11077, + 11057, + 11096, + 11022, + 11026, + 11020, + 11049, + 11032, + 11019, + 11037, + 11008, + 11037, + 11046, + 11042, + 11025, + 11049, + 11003, + 11003, + 11063, + 11054, + 11069, + 11005, + 11064, + 11001, + 11061, + 11093, + 11342, + 11036, + 11050, + 11065, + 11079, + 11034, + 11006, + 11105, + 11010, + 11010, + 11071, + 11045, + 11011, + 11008, + 11027, + 11032, + 11057, + 11021, + 11019, + 11041, + 11015, + 11025, + 11033, + 11029, + 11030, + 11019, + 11025, + 11062, + 11084, + 11054, + 11024, + 11022, + 11065, + 11030, + 11044, + 11058, + 11038, + 11064, + 11016, + 11114, + 11092, + 11024, + 11032, + 11010, + 11028, + 11029, + 11029, + 11018, + 11045, + 11048, + 11009, + 11012, + 11039, + 11044, + 11054, + 11027, + 11028, + 11019, + 11052, + 11027, + 11064, + 11018, + 11045, + 11012, + 11022, + 11009, + 11023, + 11047, + 11019, + 11023, + 11105, + 11036, + 11076, + 11018, + 11072, + 11023, + 11069, + 11038, + 11132, + 11048, + 11014, + 11035, + 11057, + 11020, + 11022, + 11016, + 11036, + 11017, + 11026, + 11029, + 11081, + 11046, + 11025, + 11024, + 11051, + 11097, + 11027, + 11007, + 11016, + 11014, + 11029, + 11015, + 11025, + 11035, + 11035, + 11019, + 11024, + 11071, + 11017, + 11074, + 11079, + 11046, + 11071, + 11041, + 11060, + 11022, + 11069, + 11013, + 11045, + 11014, + 11059, + 11035, + 11037, + 11042, + 11044, + 11011, + 11003, + 11055, + 11005, + 11064, + 11044, + 11041, + 11028, + 11010, + 11026, + 11001, + 11065, + 11063, + 11014, + 11036, + 11055, + 11023, + 11062, + 11030, + 11004, + 11063, + 11007, + 11004, + 11019, + 11064, + 11058, + 11083, + 11078, + 11062, + 11049, + 11107, + 11050, + 11015, + 11075, + 11046, + 11030, + 11041, + 11030, + 11024, + 11021, + 11023, + 11061, + 11063, + 11039, + 11022, + 11035, + 11015, + 11052, + 11027, + 11033, + 11714, + 11029, + 11060, + 11024, + 11011, + 11035, + 11043, + 11059, + 11039, + 11031, + 11065, + 11038, + 11038, + 11061, + 11018, + 11059, + 11075, + 11018, + 11017, + 11041, + 11014, + 11066, + 11028, + 11006, + 11014, + 11051, + 11029, + 11059, + 11009, + 11068, + 11015, + 11108, + 11025, + 11054, + 11013, + 11029, + 11022, + 11028, + 10992, + 11028, + 11025, + 11038, + 11044, + 11106, + 11022, + 11019, + 11000, + 11050, + 11021, + 11052, + 11016, + 11025, + 11049, + 11064, + 11008, + 11054, + 11023, + 11043, + 11014, + 11046, + 11101, + 11032, + 11049, + 11053, + 11060, + 11043, + 11041, + 11069, + 11033, + 11089, + 11060, + 11028, + 11039, + 11034, + 11040, + 11081, + 11009, + 11048, + 11030, + 11049, + 11056, + 11045, + 11019, + 11009, + 11088, + 11010, + 11055, + 11076, + 11037, + 11022, + 11096, + 11010, + 11036, + 11103, + 11017, + 11024, + 11067, + 11085, + 11005, + 11050, + 11101, + 11053, + 11015, + 11298, + 11010, + 11072, + 11030, + 11138, + 11051, + 11060, + 11017, + 11035, + 11006, + 11084, + 11040, + 11034, + 11016, + 11024, + 11042, + 11026, + 11043, + 11015, + 11051, + 11063, + 11047, + 11071, + 11034, + 11040, + 11025, + 11064, + 11062, + 11029, + 11014, + 11069, + 11078, + 11070, + 11028, + 11013, + 11051, + 11051, + 11012, + 11093, + 11038, + 11018, + 11055, + 11030, + 11014, + 11079, + 11048, + 11034, + 11030, + 11015, + 11010, + 11055, + 11056, + 11075, + 11016, + 11072, + 11011, + 11044, + 11007, + 11045, + 11068, + 11055, + 11020, + 11032, + 11010, + 11002, + 11024, + 11017, + 11013, + 11034, + 11023, + 11062, + 11025, + 11052, + 11007, + 11090, + 11091, + 11023, + 11052, + 11037, + 11029, + 11039, + 11025, + 11043, + 11011, + 11037, + 11038, + 11043, + 11038, + 11021, + 11052, + 11031, + 11020, + 11054, + 11026, + 11012, + 11018, + 11052, + 11039, + 11053, + 11056, + 11031, + 11042, + 11025, + 11029, + 11062, + 11043, + 11074, + 11017, + 11067, + 11021, + 11067, + 11214, + 11069, + 11029, + 10995, + 11008, + 11040, + 11067, + 11093, + 11026, + 11027, + 11033, + 11045, + 11037, + 11050, + 11015, + 11007, + 11051, + 11055, + 11026, + 11074, + 11071, + 11029, + 11016, + 11055, + 11062, + 11014, + 32312, + 11067, + 11002, + 11050, + 11027, + 11057, + 11036, + 11099, + 11007, + 11070, + 11009, + 11044, + 11054, + 11029, + 11033, + 11080, + 11027, + 11022, + 11059, + 11052, + 11037, + 11053, + 11020, + 11075, + 11041, + 11042, + 11011, + 11051, + 10997, + 11008, + 11027, + 11080, + 11029, + 11038, + 11050, + 11165, + 11045, + 11077, + 11047, + 11066, + 11012, + 11021, + 11022, + 11060, + 11039, + 11039, + 11054, + 11008, + 11002, + 11029, + 11033, + 11038, + 11027, + 11035, + 11046, + 11353, + 11014, + 11028, + 11005, + 11050, + 11051, + 11010, + 11040, + 11037, + 11033, + 11032, + 11047, + 11101, + 11017, + 11097, + 11030, + 11038, + 11041, + 11058, + 11010, + 11027, + 11027, + 11030, + 11009, + 11007, + 11025, + 11050, + 11041, + 11061, + 11044, + 11046, + 11048, + 11056, + 11025, + 11029, + 11025, + 11015, + 11008, + 11012, + 11044, + 11093, + 11030, + 11028, + 11077, + 11052, + 11032, + 11025, + 11043, + 11009, + 11029, + 11049, + 11058, + 11017, + 11060, + 11030, + 11026, + 11076, + 11040, + 11036, + 11007, + 11029, + 11022, + 11061, + 11027, + 11040, + 11047, + 11047, + 11020, + 11037, + 11099, + 11042, + 11074, + 11038, + 11049, + 11079, + 11036, + 11061, + 11030, + 11001, + 11023, + 11063, + 11011, + 11043, + 11037, + 11024, + 11007, + 11041, + 11030, + 11032, + 11015, + 11076, + 11017, + 11051, + 11046, + 11063, + 11014, + 11016, + 11038, + 11067, + 11040, + 11037, + 11001, + 11009, + 12917, + 11066, + 11011, + 11010, + 11020, + 11094, + 11043, + 11026, + 11020, + 11014, + 11023, + 11008, + 11022, + 10998, + 11064, + 11050, + 11037, + 11054, + 11033, + 11080, + 11016, + 11026, + 11036, + 11042, + 11027, + 11053, + 11021, + 11009, + 11031, + 11026, + 11017, + 11068, + 11018, + 11048, + 11016, + 11013, + 11042, + 11032, + 11040, + 11057, + 11020, + 11021, + 11059, + 11089, + 11102, + 11070, + 11043, + 11056, + 11056, + 11071, + 11000, + 11039, + 11017, + 11052, + 11040, + 11029, + 11019, + 11019, + 11010, + 10992, + 11014, + 11048, + 11012, + 11030, + 11055, + 11043, + 11023, + 11067, + 11053, + 11041, + 11034, + 11030, + 11061, + 11106, + 11019, + 11018, + 11019, + 11030, + 11030, + 11069, + 11033, + 11034, + 11034, + 11078, + 11011, + 11047, + 11041, + 11019, + 11031, + 11073, + 11001, + 11046, + 11011, + 11031, + 11021, + 11035, + 11054, + 11045, + 11028, + 13189, + 11037, + 11041, + 11024, + 11019, + 11033, + 11042, + 11057, + 11011, + 11012, + 11046, + 11114, + 11052, + 11049, + 11047, + 11021, + 11079, + 11021, + 11081, + 11069, + 11051, + 11033, + 11029, + 11048, + 11044, + 11031, + 11044, + 11015, + 11033, + 11033, + 11028, + 11049, + 11033, + 11022, + 11049, + 11023, + 11044, + 11010, + 11050, + 11043, + 11069, + 11019, + 11070, + 11055, + 11048, + 11023, + 11056, + 11042, + 11029, + 11026, + 11041, + 10999, + 11056, + 11033, + 11040, + 11069, + 11036, + 11019, + 11020, + 11048, + 11012, + 11045, + 11023, + 11012, + 11055, + 11043, + 11173, + 11037, + 11028, + 11011, + 11039, + 11025, + 11020, + 11008, + 11022, + 11038, + 11046, + 11024, + 11099, + 11040, + 11026, + 11035, + 11026, + 11015, + 11047, + 11067, + 11040, + 11006, + 11034, + 11033, + 11029, + 11045, + 11061, + 11103, + 11074, + 11570, + 11032, + 11042, + 11044, + 11051, + 11040, + 11046, + 11024, + 11039, + 11042, + 11042, + 11065, + 11070, + 11051, + 11044, + 11072, + 11020, + 11048, + 11024, + 11007, + 11054, + 11435, + 11041, + 11025, + 11033, + 11019, + 11003, + 11033, + 11081, + 11023, + 11055, + 11014, + 11030, + 11024, + 11006, + 11075, + 11018, + 11055, + 11021, + 11060, + 11020, + 11046, + 11019, + 11023, + 11013, + 11055, + 11026, + 11024, + 11027, + 11032, + 11034, + 11029, + 11017, + 11035, + 11963, + 11045, + 11035, + 11020, + 11039, + 11024, + 11030, + 11048, + 11054, + 11030, + 11003, + 11034, + 11033, + 11062, + 11018, + 11035, + 11052, + 11058, + 11043, + 11031, + 11063, + 11037, + 11009, + 11035, + 11025, + 11063, + 11037, + 11011, + 11004, + 11067, + 11036, + 11041, + 11049, + 11011, + 11019, + 11057, + 11050, + 11061, + 11008, + 11021, + 11039, + 11040, + 11050, + 11030, + 11016, + 11027, + 11005, + 11047, + 11030, + 11065, + 11097, + 11015, + 11023, + 11063, + 11016, + 11049, + 11052, + 11022, + 11019, + 11051, + 11026, + 11065, + 11059, + 11039, + 11023, + 11011, + 11027, + 11062, + 11063, + 11014, + 11009, + 11066, + 11039, + 11000, + 11021, + 11052, + 11015, + 11042, + 11035, + 11078, + 11030, + 11029, + 11015, + 11050, + 11266, + 11087, + 11073, + 11074, + 11023, + 11046, + 11007, + 11048, + 11045, + 11056, + 11238, + 11025, + 11051, + 11060, + 11009, + 11066, + 11019, + 11066, + 11021, + 11040, + 11018, + 11052, + 11012, + 11066, + 11042, + 11004, + 11039, + 11029, + 11019, + 11101, + 11028, + 11054, + 11017, + 11032, + 11037, + 11053, + 11103, + 11030, + 11057, + 11027, + 11052, + 11032, + 11038, + 11078, + 11029, + 11011, + 11009, + 11058, + 11027, + 11044, + 11004, + 11030, + 11022, + 11048, + 11008, + 11021, + 11043, + 11044, + 11016, + 11074, + 10999, + 11052, + 11021, + 11093, + 11013, + 11042, + 11016, + 11073, + 11012, + 11032, + 11009, + 11047, + 11020, + 11067, + 11074, + 11074, + 11011, + 11079, + 11056, + 11025, + 11044, + 11060, + 11030, + 11062, + 11007, + 11002, + 11014, + 11039, + 11010, + 11033, + 11022, + 11027, + 11002, + 11024, + 11011, + 11056, + 11068, + 11028, + 11062, + 11048, + 13816, + 11020, + 11054, + 11056, + 11024, + 11006, + 11011, + 11068, + 11021, + 11078, + 11026, + 11051, + 11042, + 11056, + 11070, + 11124, + 11027, + 11059, + 10999, + 11037, + 11073, + 11073, + 11054, + 11056, + 11028, + 11058, + 11021, + 11044, + 10999, + 11053, + 11057, + 11051, + 11025, + 11033, + 11008, + 11063, + 11021, + 11025, + 11053, + 11041, + 11048, + 11019, + 11040, + 11049, + 11060, + 11013, + 11083, + 11054, + 10988, + 11047, + 11032, + 11073, + 11071, + 11121, + 11010, + 11020, + 11024, + 11051, + 11011, + 11034, + 11026, + 11028, + 11040, + 11027, + 11028, + 11023, + 11008, + 11064, + 11037, + 11030, + 11037, + 11033, + 11050, + 11053, + 11006, + 11134, + 11073, + 11041, + 11020, + 11093, + 11050, + 11018, + 11018, + 11048, + 11011, + 11021, + 11041, + 11053, + 11037, + 11070, + 11021, + 11048, + 11009, + 11055, + 11016, + 11045, + 11025, + 11030, + 11010, + 11141, + 11040, + 11035, + 11005, + 11081, + 11036, + 11094, + 11020, + 11083, + 11007, + 11272, + 11062, + 11023, + 11002, + 11032, + 11013, + 11021, + 11013, + 11100, + 11058, + 11014, + 11013, + 11036, + 11013, + 11039, + 11007, + 11009, + 11007, + 11054, + 11015, + 11091, + 11019, + 11059, + 11018, + 11053, + 11005, + 11053, + 11003, + 11038, + 11017, + 11032, + 11010, + 11044, + 11047, + 11046, + 11031, + 11041, + 11048, + 11074, + 11060, + 11060, + 11050, + 11023, + 11005, + 10995, + 11015, + 11045, + 11036, + 11065, + 11025, + 11040, + 11058, + 11042, + 11012, + 11034, + 11020, + 11037, + 11009, + 11074, + 11031, + 11043, + 11046, + 11067, + 11088, + 11051, + 11026, + 11042, + 11040, + 11054, + 11014, + 11075, + 11006, + 11094, + 11300, + 11049, + 11011, + 11016, + 11019, + 11069, + 11025, + 11081, + 11049, + 11022, + 11035, + 11050, + 11060, + 11080, + 11104, + 11059, + 11022, + 11029, + 11026, + 11014, + 11011, + 11029, + 11018, + 11070, + 11032, + 11050, + 11012, + 11021, + 11028, + 11060, + 11039, + 11063, + 11074, + 11053, + 11034, + 11047, + 11003, + 11034, + 11010, + 11014, + 11021, + 11021, + 11041, + 11033, + 11071, + 11041, + 11022, + 11038, + 11055, + 11070, + 11048, + 11050, + 11041, + 11042, + 11066, + 11029, + 11021, + 11035, + 11057, + 11071, + 11054, + 11081, + 11039, + 11036, + 11018, + 11039, + 11043, + 11041, + 11029, + 11010, + 11040, + 11073, + 11006, + 11073, + 11037, + 11030, + 11007, + 11063, + 11036, + 11037, + 11025, + 11055, + 11018, + 11020, + 11044, + 11055, + 11086, + 11028, + 11039, + 11019, + 11038, + 11087, + 11021, + 11454, + 11026, + 11068, + 11363, + 11039, + 11039, + 11078, + 11006, + 11021, + 11018, + 11025, + 11087, + 11051, + 11033, + 11047, + 11019, + 11040, + 11058, + 11021, + 11012, + 11051, + 11034, + 11137, + 11054, + 11004, + 11018, + 11050, + 11059, + 11058, + 11061, + 11078, + 11076, + 11037, + 11019, + 11019, + 11287, + 11031, + 11017, + 11086, + 11012, + 11084, + 11095, + 11031, + 11019, + 11033, + 11010, + 11061, + 11019, + 11047, + 11037, + 11061, + 11022, + 11021, + 11485, + 11039, + 11026, + 11049, + 11023, + 11033, + 11026, + 11063, + 11040, + 11044, + 11035, + 11035, + 11029, + 11029, + 11029, + 11090, + 11069, + 11036, + 11057, + 11052, + 11015, + 11015, + 11042, + 11042, + 11012, + 11015, + 11022, + 11046, + 11017, + 11003, + 11020, + 11050, + 11052, + 11016, + 11046, + 11041, + 11097, + 11010, + 11006, + 11062, + 11041, + 11071, + 11034, + 11030, + 10995, + 11035, + 11022, + 11011, + 11065, + 11027, + 11034, + 11061, + 11049, + 11037, + 11027, + 11051, + 11029, + 11014, + 11021, + 11047, + 11016, + 11025, + 11026, + 11053, + 11030, + 11044, + 11017, + 11201, + 11020, + 11054, + 11020, + 11013, + 11017, + 11051, + 11019, + 11031, + 11037, + 11007, + 11036, + 11082, + 11062, + 11040, + 11020, + 11018, + 11023, + 11034, + 11022, + 11043, + 11053, + 11028, + 11032, + 11080, + 11044, + 11049, + 11020, + 11084, + 11053, + 11035, + 11015, + 11079, + 11016, + 11016, + 11020, + 11023, + 11029, + 11071, + 11035, + 11039, + 11035, + 11035, + 11074, + 11029, + 11066, + 11037, + 11057, + 11023, + 11043, + 11016, + 11053, + 11016, + 11010, + 11040, + 11027, + 11026, + 11040, + 11076, + 11036, + 11011, + 11031, + 11034, + 11025, + 11042, + 11003, + 11039, + 10997, + 11043, + 11000, + 11051, + 11067, + 11058, + 11044, + 11064, + 11011, + 11002, + 10989, + 10999, + 11040, + 11044, + 11054, + 11019, + 11021, + 11073, + 11055, + 11057, + 11019, + 11037, + 11008, + 11069, + 11023, + 11048, + 11061, + 11063, + 11061, + 11013, + 11072, + 11043, + 11041, + 11085, + 10997, + 10997, + 11020, + 11017, + 11058, + 11047, + 11004, + 11804, + 11046, + 11076, + 11034, + 11068, + 11008, + 11012, + 11055, + 11029, + 11020, + 11040, + 11036, + 11020, + 11007, + 11043, + 11052, + 11012, + 11002, + 11060, + 11028, + 11061, + 11032, + 11054, + 11055, + 11019, + 11025, + 11021, + 11054, + 11053, + 11048, + 11053, + 11037, + 11046, + 11018, + 11026, + 11048, + 11024, + 11012, + 11095, + 11071, + 11038, + 11042, + 11057, + 11055, + 11013, + 11031, + 11027, + 11017, + 11040, + 11042, + 11042, + 11049, + 11029, + 11000, + 11050, + 11014, + 11056, + 11000, + 11038, + 12004, + 11028, + 11063, + 11312, + 11050, + 11067, + 11021, + 11054, + 11030, + 11040, + 11097, + 11025, + 11066, + 11045, + 11039, + 11038, + 11062, + 11050, + 11216, + 11044, + 11085, + 11081, + 11021, + 11044, + 11051, + 11053, + 11038, + 11058, + 11092, + 11105, + 11059, + 11042, + 11048, + 11060, + 11013, + 11070, + 11053, + 11068, + 11011, + 11062, + 11015, + 11059, + 11024, + 11029, + 11034, + 11055, + 11021, + 11056, + 11004, + 11099, + 11413, + 11049, + 11024, + 11023, + 10995, + 11034, + 11058, + 11054, + 11031, + 11011, + 11070, + 10994, + 11028, + 11051, + 11007, + 11046, + 11049, + 11079, + 11052, + 11034, + 11038, + 11021, + 11017, + 11052, + 11017, + 11062, + 11040, + 11037, + 11072, + 11014, + 11019, + 11057, + 15807, + 11023, + 11038, + 11004, + 11026, + 11050, + 11033, + 11023, + 11039, + 11075, + 11035, + 11030, + 11142, + 11005, + 11020, + 11038, + 11028, + 11037, + 11027, + 11022, + 11011, + 11056, + 11049, + 11045, + 10998, + 11021, + 11021, + 11058, + 11019, + 11099, + 11016, + 11045, + 11000, + 11049, + 11028, + 11074, + 11057, + 11052, + 11078, + 11012, + 11044, + 11073, + 11042, + 11073, + 11029, + 11022, + 11031, + 11048, + 11050, + 11082, + 11035, + 11072, + 11085, + 11025, + 11026, + 11026, + 11058, + 11033, + 11017, + 11052, + 11008, + 11060, + 11023, + 11049, + 11042, + 11090, + 11019, + 11012, + 11012, + 11158, + 11003, + 11029, + 11010, + 11057, + 11038, + 11032, + 11085, + 11053, + 11022, + 11080, + 11062, + 11049, + 11032, + 11046, + 11046, + 11038, + 11024, + 11021, + 11024, + 11040, + 11041, + 11046, + 11024, + 11020, + 11017, + 11030, + 11025, + 11008, + 11109, + 11053, + 11021, + 11050, + 11027, + 11063, + 11026, + 11011, + 11016, + 11016, + 11013, + 11027, + 11018, + 11068, + 11077, + 11043, + 11056, + 11032, + 11059, + 11031, + 11022, + 11050, + 11031, + 11027, + 11049, + 11004, + 11028, + 11069, + 11033, + 11069, + 11041, + 11038, + 11020, + 11042, + 11034, + 11062, + 11039, + 11069, + 11044, + 11051, + 11001, + 11033, + 11002, + 11031, + 11008, + 11063, + 11032, + 11036, + 11027, + 11025, + 11005, + 11044, + 11036, + 11063, + 11027, + 11081, + 11041, + 11048, + 11026, + 11022, + 11017, + 11011, + 11023, + 11038, + 11035, + 11004, + 11016, + 11069, + 11024, + 11030, + 11046, + 11023, + 11017, + 11160, + 13055, + 11032, + 11026, + 11050, + 11050, + 10992, + 11022, + 11037, + 11018, + 11014, + 11057, + 11055, + 11013, + 11020, + 11029, + 11034, + 11044, + 11030, + 11045, + 11070, + 11034, + 11041, + 11017, + 11063, + 11017, + 11057, + 11019, + 11047, + 11006, + 11055, + 11012, + 11061, + 11034, + 11017, + 11063, + 11081, + 11063, + 11049, + 11055, + 11059, + 11062, + 11052, + 11040, + 11058, + 11009, + 11048, + 11071, + 11035, + 11069, + 11083, + 11063, + 11059, + 11044, + 11045, + 11027, + 11030, + 11041, + 11026, + 11035, + 11063, + 11009, + 11062, + 10998, + 11018, + 11015, + 11050, + 11009, + 11028, + 11043, + 11025, + 11055, + 11031, + 11026, + 11049, + 11049, + 11006, + 11058, + 11068, + 11010, + 11058, + 11029, + 11042, + 11018, + 11068, + 11023, + 11056, + 11010, + 11070, + 11037, + 11059, + 11037, + 11030, + 11024, + 11025, + 11035, + 11028, + 11013, + 11049, + 11025, + 11031, + 11031, + 11024, + 11037, + 11017, + 11554, + 11046, + 11042, + 11082, + 11045, + 11034, + 11011, + 11054, + 11045, + 11053, + 11012, + 11020, + 11040, + 11057, + 11056, + 11026, + 11012, + 11063, + 11029, + 11059, + 11012, + 11063, + 11015, + 11048, + 11044, + 11015, + 11070, + 11055, + 11051, + 11051, + 11079, + 11048, + 11050, + 11045, + 11050, + 11045, + 11049, + 11040, + 11010, + 11061, + 11010, + 11065, + 11046, + 11032, + 11017, + 11054, + 11007, + 11056, + 11011, + 11032, + 11045, + 11018, + 11043, + 11054, + 11015, + 11037, + 11020, + 11062, + 11027, + 11068, + 11038, + 11059, + 11010, + 11039, + 11060, + 11080, + 11035, + 11016, + 11063, + 11023, + 11013, + 11039, + 11027, + 11049, + 11043, + 11043, + 11018, + 11041, + 11002, + 11018, + 11056, + 11005, + 11027, + 11063, + 11020, + 11053, + 11015, + 11066, + 11022, + 11076, + 11031, + 11851, + 11024, + 11028, + 11016, + 11020, + 11045, + 11032, + 11040, + 11027, + 11008, + 11031, + 11032, + 11031, + 11044, + 11016, + 11028, + 11040, + 11062, + 11012, + 11017, + 11036, + 11032, + 11029, + 11007, + 11014, + 11019, + 11049, + 11028, + 11043, + 11018, + 11022, + 11027, + 11021, + 11187, + 11052, + 11023, + 11028, + 11027, + 11038, + 11030, + 11046, + 11119, + 11091, + 11062, + 11027, + 11011, + 11017, + 11053, + 11032, + 11029, + 11046, + 11007, + 11064, + 11006, + 11014, + 11053, + 11062, + 11026, + 11067, + 11007, + 11035, + 11033, + 11041, + 11032, + 11071, + 11013, + 11051, + 11020, + 11037, + 11023, + 11019, + 11060, + 11004, + 11028, + 11049, + 11002, + 11021, + 11024, + 11030, + 11058, + 11044, + 11038, + 11056, + 11072, + 11021, + 11063, + 11032, + 11027, + 11022, + 11006, + 11049, + 11014, + 11011, + 11026, + 11042, + 11043, + 11059, + 11021, + 11038, + 11045, + 11284, + 11047, + 11037, + 11025, + 11040, + 11031, + 11058, + 11040, + 11066, + 11031, + 11069, + 11071, + 11043, + 11023, + 11050, + 11075, + 11053, + 11040, + 11019, + 11020, + 11047, + 11144, + 11066, + 11041, + 11052, + 11054, + 11001, + 10996, + 11103, + 11012, + 11035, + 11034, + 11038, + 11056, + 11074, + 11021, + 11040, + 11043, + 11049, + 11077, + 11013, + 11063, + 11074, + 11032, + 11069, + 11059, + 11038, + 11039, + 11046, + 11018, + 11036, + 11055, + 11024, + 11005, + 11046, + 11017, + 11020, + 11025, + 11035, + 13708, + 11060, + 11042, + 11029, + 11017, + 11011, + 11015, + 11056, + 11044, + 11037, + 11051, + 11053, + 11042, + 11025, + 11022, + 11059, + 11051, + 11015, + 11050, + 11038, + 11039, + 11005, + 11144, + 11014, + 11037, + 11064, + 11039, + 11019, + 11035, + 11007, + 11055, + 11108, + 11033, + 11030, + 11016, + 11025, + 11036, + 11058, + 11031, + 11083, + 11023, + 11030, + 18205, + 11020, + 11012, + 11021, + 11012, + 11017, + 11025, + 11069, + 11011, + 11413, + 11017, + 11010, + 11018, + 11084, + 11019, + 11050, + 11046, + 11017, + 11012, + 11046, + 11009, + 11035, + 11008, + 11018, + 11015, + 11019, + 11032, + 11028, + 11016, + 11035, + 11015, + 11043, + 11002, + 11022, + 11010, + 11042, + 11051, + 11060, + 11033, + 11051, + 11043, + 11011, + 11029, + 11050, + 11030, + 11023, + 11016, + 11030, + 11059, + 11059, + 11019, + 11052, + 11039, + 11052, + 11054, + 11072, + 11019, + 11029, + 11020, + 11024, + 11002, + 11025, + 10989, + 11062, + 11037, + 11038, + 11057, + 11073, + 11055, + 11058, + 11064, + 11036, + 10989, + 11020, + 11614, + 11059, + 11016, + 11039, + 11048, + 11018, + 11008, + 11009, + 11000, + 11064, + 11015, + 11037, + 10996, + 11041, + 11023, + 11064, + 11004, + 11069, + 11007, + 11043, + 11036, + 10993, + 11020, + 11099, + 11032, + 11031, + 11018, + 11047, + 11010, + 11061, + 11054, + 11027, + 11060, + 11018, + 11027, + 11016, + 11026, + 11032, + 11040, + 11045, + 11029, + 11041, + 11071, + 11006, + 11020, + 11045, + 11037, + 11049, + 11019, + 11039, + 11007, + 11048, + 11040, + 11092, + 11030, + 11044, + 11040, + 11015, + 11022, + 11092, + 11042, + 11035, + 11036, + 13901, + 11006, + 11051, + 11018, + 11037, + 11006, + 11017, + 11032, + 11072, + 10998, + 11019, + 11022, + 11027, + 11031, + 11030, + 11040, + 11018, + 11045, + 11058, + 11019, + 10995, + 11013, + 11008, + 11015, + 11035, + 11038, + 11036, + 11044, + 11029, + 11053, + 11066, + 11032, + 11048, + 11014, + 11013, + 11016, + 11055, + 11019, + 11038, + 11040, + 11045, + 11038, + 11076, + 11038, + 11058, + 11026, + 11037, + 11006, + 11050, + 11051, + 11032, + 10999, + 11045, + 11020, + 11036, + 11023, + 11042, + 11009, + 11041, + 11031, + 11011, + 11058, + 11053, + 11058, + 11025, + 11016, + 11062, + 11044, + 11062, + 11021, + 11001, + 11057, + 11036, + 11010, + 11051, + 11067, + 11004, + 11037, + 11032, + 11017, + 11055, + 11023, + 11040, + 11014, + 11020, + 10999, + 11037, + 11014, + 10992, + 11048, + 11025, + 11027, + 11073, + 11020, + 11070, + 11008, + 11072, + 11652, + 11037, + 11035, + 11043, + 11091, + 11045, + 11022, + 11033, + 11028, + 11037, + 11080, + 11035, + 11036, + 11067, + 11026, + 11023, + 11061, + 11082, + 11023, + 11090, + 11041, + 11019, + 11048, + 11003, + 11009, + 11041, + 11023, + 11078, + 11035, + 11026, + 11091, + 11057, + 11063, + 11051, + 11043, + 11081, + 11040, + 11095, + 11021, + 11021, + 11036, + 11094, + 11039, + 11041, + 11076, + 11038, + 11019, + 11069, + 11024, + 11076, + 11019, + 11034, + 11069, + 11053, + 11078, + 11093, + 11035, + 11036, + 11040, + 11032, + 11057, + 11050, + 11057, + 11017, + 11037, + 11064, + 11042, + 11040, + 11010, + 11023, + 11051, + 11052, + 11006, + 11041, + 11032, + 11059, + 11005, + 11010, + 11035, + 11066, + 11046, + 11034, + 11506, + 11026, + 11020, + 11078, + 11053, + 11068, + 11020, + 11023, + 11015, + 11036, + 11019, + 11016, + 11029, + 11088, + 11009, + 11134, + 11054, + 11054, + 11033, + 11059, + 11015, + 11066, + 11020, + 11032, + 11027, + 11066, + 11027, + 11034, + 11037, + 11311, + 11057, + 11032, + 11016, + 11041, + 11056, + 11028, + 11023, + 11022, + 11061, + 11026, + 11042, + 11047, + 11043, + 11031, + 11018, + 13739, + 11025, + 11017, + 11027, + 11056, + 11018, + 11019, + 11021, + 11044, + 11056, + 11010, + 11017, + 11032, + 11047, + 11094, + 11065, + 11008, + 11032, + 11141, + 11081, + 11070, + 11020, + 11035, + 11018, + 11043, + 11064, + 11046, + 11015, + 11063, + 11009, + 11040, + 11012, + 11055, + 11001, + 11043, + 11020, + 11048, + 11059, + 11053, + 11022, + 11018, + 11006, + 11061, + 11175, + 11043, + 11034, + 11044, + 11020, + 11078, + 11004, + 11018, + 11055, + 11019, + 11029, + 11026, + 11043, + 11048, + 11044, + 11017, + 11008, + 11064, + 11043, + 11010, + 11063, + 11024, + 11050, + 11057, + 11025, + 11010, + 11036, + 11038, + 11030, + 11062, + 11021, + 11043, + 11029, + 11097, + 11055, + 11068, + 11026, + 11041, + 11016, + 11057, + 11010, + 11051, + 11005, + 11031, + 11020, + 11040, + 11020, + 11069, + 11009, + 11043, + 11021, + 11096, + 11029, + 11065, + 11417, + 11015, + 11035, + 11013, + 11005, + 11072, + 11019, + 11065, + 11039, + 11046, + 11019, + 11070, + 11039, + 11053, + 11061, + 11164, + 11037, + 11084, + 11021, + 11041, + 11025, + 11065, + 11025, + 11034, + 11027, + 11078, + 11017, + 11032, + 11032, + 11053, + 11090, + 11075, + 11043, + 11042, + 11014, + 11096, + 11046, + 11037, + 11045, + 11072, + 11047, + 11060, + 11016, + 11063, + 11030, + 11021, + 11033, + 11043, + 11022, + 11044, + 11028, + 11035, + 11010, + 11040, + 11043, + 11046, + 11037, + 11072, + 11020, + 11016, + 11041, + 11003, + 11064, + 11065, + 11031, + 11049, + 11047, + 11058, + 11021, + 11057, + 11008, + 11037, + 11033, + 11034, + 11060, + 11055, + 11025, + 11076, + 11026, + 11045, + 11013, + 11033, + 11027, + 11041, + 11029, + 11026, + 11042, + 11015, + 11014, + 11045, + 11032, + 11049, + 11031, + 11120, + 11020, + 11064, + 10986, + 11034, + 11000, + 11031, + 11029, + 11060, + 11047, + 11018, + 11022, + 11043, + 11025, + 11056, + 11022, + 11051, + 11017, + 11012, + 11007, + 11058, + 11020, + 11023, + 11017, + 11090, + 11017, + 11063, + 11016, + 11054, + 11040, + 11041, + 11022, + 11048, + 11040, + 11025, + 11039, + 11041, + 11014, + 11027, + 11045, + 11081, + 11014, + 11093, + 11005, + 11061, + 11057, + 11012, + 11058, + 11029, + 11010, + 11041, + 11031, + 11030, + 11040, + 11003, + 11056, + 11027, + 11040, + 11054, + 11002, + 11071, + 11032, + 11068, + 11034, + 11066, + 11053, + 11028, + 11007, + 11044, + 11053, + 11061, + 11066, + 11021, + 11027, + 11034, + 11021, + 11079, + 11022, + 11021, + 11036, + 11091, + 10997, + 11033, + 11015, + 11020, + 11013, + 11053, + 11017, + 11034, + 11061, + 11028, + 11039, + 11063, + 11019, + 11085, + 11022, + 11052, + 11016, + 11051, + 11037, + 11015, + 11031, + 11059, + 11075, + 11076, + 11033, + 11041, + 11063, + 11057, + 11020, + 11085, + 11039, + 11045, + 11044, + 11083, + 11039, + 11027, + 11055, + 11048, + 11026, + 11051, + 11030, + 11040, + 11061, + 11009, + 11037, + 11061, + 11009, + 11018, + 11046, + 11017, + 11012, + 11041, + 11009, + 11051, + 11080, + 11067, + 11091, + 11133, + 11017, + 11055, + 11059, + 11057, + 11023, + 11027, + 11025, + 11043, + 11035, + 11020, + 11043, + 11039, + 11032, + 11037, + 11057, + 11023, + 11021, + 11049, + 11005, + 11066, + 11018, + 11007, + 11016, + 11037, + 11008, + 11069, + 11139, + 11068, + 11073, + 11052, + 11000, + 11082, + 11012, + 11026, + 11030, + 11040, + 11001, + 11036, + 11021, + 11034, + 11032, + 11022, + 11049, + 11012, + 11025, + 11035 + ], + "sample_count": 15277 + }, + { + "pubkey": "EyEC5kKHFHR8Y71bbAUWzH5ywBKmVhLPFYKgNUdVeeDX", + "epoch": 89, + "origin_device_pk": "D3ZjDiLzvrGi5NJGzmM7b3YZg6e2DrUcBCQznJr3KfC8", + "target_device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "link_pk": "6PWVQE6pqbpwcU4pn7UvRoEEG1dpa2nQwbD3DLR4AkRT", + "origin_device_location_pk": "DJX3x93muX4Tnv2yG4aqLL3YntLurDKeR2SFZEF5qWRV", + "target_device_location_pk": "7vt8Tnbk15S6JA1uhRQVtbuL7w39zY8jeQ5iqgjsqLfP", + "origin_device_agent_pk": "Cgmo8tCWvjm3VQcWLgvZg2nm5v2nBPWZySTcbNrPXHFW", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242130956357, + "samples": [ + 152516, + 152535, + 152587, + 152580, + 152524, + 152522, + 152564, + 152527, + 152535, + 152522, + 152508, + 152509, + 152531, + 152557, + 152552, + 152531, + 152553, + 152566, + 152519, + 152507, + 152514, + 152541, + 152546, + 152524, + 152518, + 152550, + 152523, + 152533, + 152540, + 152567, + 152545, + 152520, + 152539, + 152534, + 152512, + 152518, + 152526, + 152521, + 152562, + 152531, + 152519, + 152533, + 152557, + 152553, + 152534, + 152524, + 152537, + 152490, + 152522, + 152567, + 152555, + 152552, + 152505, + 152542, + 152556, + 152536, + 152529, + 152552, + 152506, + 152519, + 152565, + 152548, + 152562, + 152566, + 152543, + 152546, + 152536, + 152564, + 152533, + 152551, + 152545, + 152561, + 152553, + 152522, + 152543, + 152567, + 152561, + 152505, + 152510, + 152547, + 152522, + 152532, + 152544, + 152538, + 152529, + 152536, + 152556, + 152558, + 152532, + 152541, + 152526, + 152531, + 152562, + 152542, + 152529, + 152506, + 152530, + 152544, + 152551, + 152547, + 152538, + 152502, + 152550, + 152563, + 152576, + 152536, + 152535, + 152523, + 152533, + 152560, + 152556, + 152569, + 152559, + 152541, + 152550, + 152518, + 152549, + 152551, + 152524, + 152562, + 152537, + 152550, + 152540, + 152542, + 152511, + 152529, + 152514, + 152521, + 152541, + 152532, + 152553, + 152533, + 152580, + 152533, + 152558, + 152524, + 152526, + 152583, + 152530, + 152547, + 152541, + 152567, + 152604, + 152550, + 152542, + 152555, + 152541, + 152550, + 152551, + 152558, + 152529, + 152554, + 152534, + 152536, + 152517, + 152548, + 152513, + 152568, + 152534, + 152540, + 152524, + 152530, + 152531, + 152524, + 152560, + 152574, + 152523, + 152542, + 152554, + 152573, + 152545, + 152515, + 152512, + 152507, + 152525, + 152551, + 152556, + 152536, + 152584, + 152494, + 152523, + 152516, + 152609, + 152556, + 152526, + 152506, + 152533, + 152588, + 152526, + 152539, + 152535, + 152534, + 152530, + 152550, + 152591, + 152537, + 152537, + 152579, + 152555, + 152517, + 152553, + 152523, + 152508, + 152544, + 152535, + 152559, + 152528, + 152541, + 152528, + 152534, + 152529, + 152498, + 152516, + 152534, + 152525, + 152526, + 152540, + 152518, + 152539, + 152542, + 152554, + 152526, + 152548, + 152536, + 152564, + 152577, + 152541, + 152547, + 152522, + 152496, + 152532, + 152557, + 152519, + 152505, + 152540, + 152546, + 152551, + 152572, + 152555, + 152532, + 152519, + 152568, + 152509, + 152570, + 152515, + 152553, + 152551, + 152517, + 152516, + 152541, + 152555, + 152514, + 152511, + 152555, + 152579, + 152497, + 152524, + 152532, + 152532, + 152542, + 152540, + 152511, + 152507, + 152529, + 152509, + 152533, + 152550, + 152567, + 152502, + 152511, + 152519, + 152525, + 152540, + 152540, + 152532, + 152581, + 152523, + 152569, + 152543, + 152557, + 152571, + 152545, + 152542, + 152525, + 152569, + 152544, + 152538, + 152546, + 152525, + 152566, + 152526, + 152531, + 152547, + 152530, + 152529, + 152523, + 152534, + 152521, + 152496, + 152522, + 152507, + 152513, + 152567, + 152563, + 152517, + 152550, + 152532, + 152516, + 152550, + 152528, + 152543, + 152497, + 152509, + 152550, + 152547, + 152534, + 152511, + 152535, + 152522, + 152589, + 152536, + 152555, + 152545, + 152529, + 152520, + 152539, + 152554, + 152534, + 152530, + 152503, + 152548, + 152557, + 152548, + 152579, + 152524, + 152552, + 152518, + 152531, + 152538, + 152586, + 152518, + 152537, + 152553, + 152562, + 152506, + 152549, + 152536, + 152510, + 152542, + 152544, + 152524, + 152527, + 152563, + 152549, + 152511, + 152533, + 152528, + 152530, + 152511, + 152522, + 152557, + 152549, + 152564, + 152527, + 152520, + 152514, + 152577, + 152545, + 152539, + 152521, + 152539, + 152574, + 152533, + 152573, + 152555, + 152563, + 152554, + 152529, + 152545, + 152513, + 152570, + 152507, + 152540, + 152521, + 152538, + 152550, + 152578, + 152542, + 152494, + 152501, + 152530, + 152517, + 152542, + 152534, + 152502, + 152526, + 152511, + 152572, + 152510, + 152524, + 152507, + 152553, + 152510, + 152501, + 152591, + 152538, + 152531, + 152546, + 152520, + 152524, + 152507, + 152526, + 152569, + 152508, + 152516, + 152537, + 152569, + 152504, + 152539, + 152565, + 152524, + 152555, + 152549, + 152496, + 152514, + 152536, + 152505, + 152575, + 152537, + 152539, + 152529, + 152592, + 152543, + 152528, + 152532, + 152545, + 152556, + 152518, + 152519, + 152542, + 152513, + 152504, + 152513, + 152527, + 152558, + 152574, + 152565, + 152516, + 152532, + 152549, + 152523, + 152521, + 152531, + 152511, + 152531, + 152549, + 152539, + 152539, + 152537, + 152547, + 152506, + 152532, + 152566, + 152514, + 152526, + 152525, + 152561, + 152575, + 152516, + 152556, + 152529, + 152517, + 152497, + 152545, + 152571, + 152531, + 152543, + 152514, + 152535, + 152541, + 152556, + 152525, + 152572, + 152500, + 152522, + 152560, + 152507, + 152539, + 152559, + 152534, + 152550, + 152502, + 152519, + 152506, + 152561, + 152513, + 152517, + 152552, + 152561, + 152513, + 152589, + 152550, + 152534, + 152546, + 152531, + 152507, + 152544, + 152543, + 152523, + 152554, + 152557, + 152581, + 152539, + 152524, + 152566, + 152539, + 152552, + 152577, + 152552, + 152526, + 152561, + 152572, + 152519, + 152538, + 152554, + 152521, + 152537, + 152576, + 152542, + 152535, + 152517, + 152522, + 152533, + 152506, + 152574, + 152547, + 152532, + 152528, + 152517, + 152602, + 152523, + 152514, + 152574, + 152522, + 152556, + 152551, + 152539, + 152525, + 152517, + 152567, + 152529, + 152527, + 152538, + 152597, + 152526, + 152512, + 152552, + 152541, + 152533, + 152552, + 152541, + 152539, + 152550, + 152564, + 152529, + 152579, + 152560, + 152542, + 152504, + 152512, + 152542, + 152573, + 152558, + 152518, + 152515, + 152509, + 152533, + 152497, + 152515, + 152547, + 152526, + 152540, + 152539, + 152527, + 152556, + 152518, + 152510, + 152510, + 152545, + 152587, + 152526, + 152556, + 152551, + 152514, + 152532, + 152526, + 152571, + 152554, + 152558, + 152532, + 152513, + 152555, + 152550, + 152518, + 152558, + 152564, + 152530, + 152530, + 152542, + 152536, + 152514, + 152515, + 152533, + 152525, + 152526, + 152582, + 152525, + 152526, + 152528, + 152535, + 152575, + 152549, + 152533, + 152560, + 152515, + 152565, + 152573, + 152580, + 152523, + 152503, + 152545, + 152528, + 152530, + 152536, + 152562, + 152507, + 152541, + 152520, + 152536, + 152554, + 152536, + 152509, + 152587, + 152523, + 152535, + 152532, + 152519, + 152515, + 152511, + 152526, + 152561, + 152561, + 152501, + 152533, + 152500, + 152548, + 152547, + 152518, + 152509, + 152510, + 152537, + 152523, + 152535, + 152589, + 152510, + 152581, + 152544, + 152547, + 152526, + 152497, + 152581, + 152528, + 152557, + 152542, + 152530, + 152548, + 152581, + 152526, + 152558, + 152608, + 152591, + 152563, + 152530, + 152537, + 152527, + 152505, + 152515, + 152522, + 152547, + 152524, + 152583, + 152568, + 152571, + 152529, + 152545, + 152535, + 152537, + 152578, + 152584, + 152556, + 152547, + 152552, + 152504, + 152510, + 152566, + 152518, + 152548, + 152509, + 152578, + 152530, + 152553, + 152545, + 152547, + 152569, + 152517, + 152549, + 152530, + 152550, + 152567, + 152533, + 152513, + 152521, + 152524, + 152565, + 152563, + 152550, + 152507, + 152549, + 152578, + 152522, + 152552, + 152567, + 152552, + 152569, + 152519, + 152510, + 152571, + 152584, + 152570, + 152544, + 152577, + 152533, + 152525, + 152519, + 152555, + 152492, + 152522, + 152570, + 152512, + 152515, + 152547, + 152589, + 152550, + 152550, + 152523, + 152575, + 152500, + 152606, + 152534, + 152536, + 152523, + 152578, + 152513, + 152520, + 152505, + 152523, + 152531, + 152527, + 152510, + 152570, + 152570, + 152541, + 152529, + 152517, + 152541, + 152536, + 152544, + 152561, + 152529, + 152543, + 152542, + 152538, + 152534, + 152543, + 152552, + 152520, + 152524, + 152569, + 152592, + 152572, + 152514, + 152509, + 152520, + 152523, + 152528, + 152564, + 152535, + 152557, + 152548, + 152527, + 152596, + 152509, + 152547, + 152536, + 152535, + 152521, + 152535, + 152564, + 152552, + 152515, + 152535, + 152520, + 152534, + 152533, + 152546, + 152551, + 152531, + 152544, + 152525, + 152539, + 152527, + 152516, + 152509, + 152517, + 152516, + 152520, + 152547, + 152529, + 152525, + 152588, + 152519, + 152542, + 152544, + 152523, + 152497, + 152522, + 152558, + 152526, + 152540, + 152549, + 152505, + 152558, + 152529, + 152550, + 152552, + 152596, + 152545, + 152542, + 152558, + 152548, + 152563, + 152561, + 152536, + 152517, + 152554, + 152550, + 152515, + 152545, + 152545, + 152537, + 152563, + 152550, + 152549, + 152517, + 152514, + 152556, + 152515, + 152560, + 152548, + 152511, + 152518, + 152557, + 152519, + 152563, + 152530, + 152505, + 152521, + 152563, + 152535, + 152559, + 152508, + 152518, + 152527, + 152552, + 152512, + 152517, + 152509, + 152548, + 152540, + 152552, + 152552, + 152574, + 152567, + 152529, + 152550, + 152543, + 152551, + 152527, + 152524, + 152532, + 152545, + 152513, + 152534, + 152506, + 152535, + 152528, + 152558, + 152516, + 152537, + 152533, + 152571, + 152524, + 152567, + 152521, + 152524, + 152554, + 152501, + 152551, + 152532, + 152617, + 152566, + 152581, + 152548, + 152497, + 152542, + 152566, + 152525, + 152532, + 152531, + 152550, + 152518, + 152540, + 152599, + 152500, + 152505, + 152500, + 152505, + 152532, + 152511, + 152592, + 152555, + 152503, + 152552, + 152516, + 152551, + 152513, + 152580, + 152532, + 152530, + 152573, + 152551, + 152541, + 152537, + 152526, + 152567, + 152509, + 152559, + 152542, + 152531, + 152529, + 152552, + 152547, + 152530, + 152561, + 152547, + 152508, + 152520, + 152517, + 152539, + 152498, + 152518, + 152530, + 152520, + 152534, + 152558, + 152523, + 152540, + 152499, + 152587, + 152558, + 152538, + 152532, + 152545, + 152545, + 152504, + 152558, + 152520, + 152577, + 152520, + 152521, + 152537, + 152517, + 152512, + 152512, + 152557, + 152545, + 152502, + 152544, + 152516, + 152592, + 152528, + 152536, + 152547, + 152521, + 152512, + 152540, + 152515, + 152535, + 152504, + 152559, + 152529, + 152542, + 152506, + 152510, + 152503, + 152545, + 152558, + 152519, + 152551, + 152523, + 152536, + 152496, + 152549, + 152524, + 152572, + 152543, + 152538, + 152560, + 152525, + 152577, + 152546, + 152540, + 152558, + 152545, + 152540, + 152546, + 152555, + 152539, + 152523, + 152524, + 152576, + 152514, + 152565, + 152546, + 152507, + 152499, + 152549, + 152498, + 152561, + 152507, + 152585, + 152514, + 152543, + 152594, + 152549, + 152530, + 152512, + 152526, + 152584, + 152554, + 152550, + 152582, + 152557, + 152553, + 152547, + 152517, + 152534, + 152511, + 152495, + 152545, + 152564, + 152522, + 152525, + 152511, + 152529, + 152533, + 152546, + 152539, + 152519, + 152501, + 152543, + 152495, + 152544, + 152514, + 152566, + 152565, + 152531, + 152501, + 152534, + 152566, + 152539, + 152579, + 152526, + 152509, + 152537, + 152529, + 152578, + 152546, + 152600, + 152564, + 152514, + 152595, + 152500, + 152558, + 152551, + 152578, + 152520, + 152523, + 152541, + 152523, + 152540, + 152527, + 152532, + 152519, + 152501, + 152540, + 152560, + 152526, + 152532, + 152508, + 152498, + 152514, + 152556, + 152550, + 152585, + 152531, + 152528, + 152517, + 152535, + 152549, + 152531, + 152514, + 152537, + 152525, + 152517, + 152526, + 152535, + 152534, + 152518, + 152561, + 152537, + 152539, + 152541, + 152569, + 152543, + 152528, + 152519, + 152538, + 152515, + 152539, + 152573, + 152535, + 152528, + 152539, + 152585, + 152503, + 152544, + 152559, + 152508, + 152571, + 152518, + 152508, + 152548, + 152547, + 152564, + 152504, + 152510, + 152524, + 152531, + 152521, + 152525, + 152513, + 152551, + 152553, + 152514, + 152520, + 152493, + 152533, + 152546, + 152549, + 152536, + 152552, + 152524, + 152538, + 152553, + 152558, + 152538, + 152525, + 152526, + 152531, + 152531, + 152517, + 152554, + 152540, + 152541, + 152565, + 152526, + 152533, + 152539, + 152522, + 152556, + 152521, + 152517, + 152541, + 152515, + 152537, + 152565, + 152551, + 152537, + 152508, + 152550, + 152531, + 152522, + 152518, + 152543, + 152530, + 152521, + 152569, + 152528, + 152573, + 152538, + 152551, + 152539, + 152567, + 152544, + 152512, + 152532, + 152546, + 152547, + 152562, + 152539, + 152546, + 152557, + 152548, + 152496, + 152514, + 152549, + 152542, + 152540, + 152542, + 152552, + 152539, + 152528, + 152575, + 152523, + 152538, + 152539, + 152559, + 152550, + 152540, + 152563, + 152552, + 152564, + 152538, + 152535, + 152543, + 152539, + 152531, + 152518, + 152516, + 152520, + 152520, + 152581, + 152525, + 152594, + 152548, + 152510, + 152541, + 152546, + 152526, + 152545, + 152570, + 152533, + 152563, + 152523, + 152531, + 152546, + 152527, + 152512, + 152534, + 152567, + 152546, + 152550, + 152539, + 152540, + 152545, + 152551, + 152566, + 152502, + 152524, + 152527, + 152563, + 152539, + 152552, + 152533, + 152591, + 152545, + 152531, + 152568, + 152556, + 152530, + 152546, + 152585, + 152565, + 152545, + 152517, + 152515, + 152532, + 152541, + 152543, + 152527, + 152545, + 152514, + 152560, + 152528, + 152572, + 152558, + 152534, + 152574, + 152539, + 152546, + 152576, + 152518, + 152533, + 152522, + 152576, + 152521, + 152576, + 152598, + 164550, + 152521, + 152581, + 152535, + 152566, + 152549, + 152531, + 152550, + 152542, + 152524, + 152527, + 152515, + 152533, + 152531, + 152518, + 152542, + 152534, + 152510, + 152530, + 152535, + 152519, + 152506, + 152531, + 152528, + 152567, + 152509, + 152549, + 152527, + 152516, + 152542, + 152513, + 152501, + 152525, + 152553, + 152506, + 152552, + 152570, + 152532, + 152567, + 152508, + 152502, + 152566, + 152532, + 152556, + 152543, + 152537, + 152568, + 152562, + 152542, + 152552, + 152499, + 152549, + 152527, + 152558, + 152571, + 152537, + 152540, + 152572, + 152515, + 152555, + 152601, + 152531, + 152520, + 152517, + 152511, + 152567, + 152550, + 152544, + 152523, + 152498, + 152534, + 152533, + 152527, + 152525, + 152559, + 152536, + 152540, + 152554, + 152561, + 152509, + 152504, + 152527, + 152510, + 152513, + 152519, + 152581, + 152567, + 152504, + 152513, + 152521, + 152537, + 152557, + 152520, + 152527, + 152548, + 152534, + 152561, + 152529, + 152548, + 152526, + 152522, + 152545, + 152536, + 152544, + 152555, + 152518, + 152588, + 152549, + 152502, + 152560, + 152538, + 152564, + 152591, + 152541, + 152520, + 152518, + 152579, + 152530, + 152525, + 152540, + 152535, + 152520, + 152537, + 152514, + 152541, + 152527, + 152549, + 152579, + 152529, + 152526, + 152515, + 152518, + 152528, + 152519, + 152552, + 152514, + 152512, + 152555, + 152539, + 152517, + 152527, + 152543, + 152546, + 152512, + 152552, + 152558, + 152548, + 152496, + 152502, + 152557, + 152521, + 152545, + 152558, + 152532, + 152546, + 152541, + 152541, + 152550, + 152516, + 152559, + 152594, + 152535, + 152507, + 152538, + 152519, + 152514, + 152532, + 152521, + 152554, + 152535, + 152527, + 152533, + 152532, + 152569, + 152550, + 152549, + 152521, + 152550, + 152533, + 152536, + 152510, + 152538, + 152513, + 152513, + 152509, + 152546, + 152511, + 152545, + 152524, + 152508, + 152539, + 152534, + 152532, + 152550, + 152491, + 152511, + 152537, + 152550, + 152531, + 152548, + 152509, + 152513, + 152546, + 152531, + 152543, + 152560, + 152507, + 152534, + 152537, + 152620, + 152549, + 152546, + 152519, + 152529, + 152544, + 152524, + 152537, + 152541, + 152570, + 152545, + 152509, + 152526, + 152546, + 152534, + 152534, + 152537, + 152549, + 152549, + 152545, + 152525, + 152520, + 152557, + 152531, + 152550, + 152541, + 152513, + 152536, + 152542, + 152517, + 152554, + 152514, + 152515, + 152544, + 152513, + 152528, + 152579, + 152520, + 152540, + 152529, + 152520, + 152550, + 152527, + 152550, + 152565, + 152584, + 152532, + 152546, + 152566, + 152547, + 152546, + 152528, + 152560, + 152550, + 152549, + 152524, + 152575, + 152552, + 152554, + 152602, + 152523, + 152557, + 152554, + 152543, + 152530, + 152560, + 152556, + 152507, + 152559, + 152531, + 152525, + 152519, + 152524, + 152546, + 152500, + 152530, + 152502, + 152552, + 152561, + 152545, + 152513, + 152513, + 152534, + 152564, + 152542, + 152514, + 152507, + 152496, + 152506, + 152527, + 152513, + 152521, + 152552, + 152509, + 152533, + 152514, + 152568, + 152542, + 152545, + 152505, + 152526, + 152552, + 152532, + 152515, + 152558, + 152523, + 152527, + 152524, + 152506, + 152554, + 152516, + 152523, + 152547, + 152563, + 152533, + 152532, + 152525, + 152579, + 152529, + 152509, + 152532, + 152546, + 152542, + 152546, + 152516, + 152536, + 152538, + 152531, + 152539, + 152501, + 152503, + 152527, + 152564, + 152531, + 152553, + 152546, + 152532, + 152501, + 152543, + 152547, + 152577, + 152546, + 152526, + 152512, + 152534, + 152522, + 152546, + 152531, + 152512, + 152550, + 152548, + 152574, + 152547, + 152530, + 152516, + 152565, + 152528, + 152574, + 152520, + 152519, + 152542, + 152558, + 152525, + 152507, + 152541, + 152535, + 152513, + 152619, + 152557, + 152542, + 152513, + 152538, + 152502, + 152530, + 152511, + 152578, + 152501, + 152538, + 152513, + 152562, + 152552, + 152519, + 152543, + 152550, + 152550, + 152571, + 152550, + 152561, + 152561, + 152514, + 152541, + 152524, + 152556, + 152534, + 152546, + 152558, + 152526, + 152566, + 152527, + 152513, + 152538, + 152513, + 152535, + 152518, + 152527, + 152501, + 152540, + 152557, + 152501, + 152585, + 152539, + 152534, + 152535, + 152533, + 152506, + 152594, + 152537, + 152547, + 152542, + 152550, + 152502, + 152555, + 152530, + 152524, + 152540, + 152532, + 152548, + 152514, + 152537, + 152513, + 152520, + 152539, + 152525, + 152565, + 152522, + 152531, + 152546, + 152559, + 152546, + 152566, + 152524, + 152533, + 152548, + 152565, + 152524, + 152536, + 152536, + 152529, + 152503, + 152538, + 152565, + 152535, + 152576, + 152515, + 152507, + 152537, + 152533, + 152562, + 152528, + 152533, + 152530, + 152520, + 152537, + 152530, + 152500, + 152530, + 152534, + 152553, + 152525, + 152554, + 152511, + 152552, + 152524, + 152517, + 152539, + 152559, + 152526, + 152530, + 152578, + 152523, + 152548, + 152578, + 152575, + 152517, + 152550, + 152617, + 152498, + 152541, + 152544, + 152605, + 152538, + 152536, + 152573, + 152507, + 152541, + 152564, + 152525, + 152517, + 152557, + 152545, + 152518, + 152526, + 152534, + 152536, + 152537, + 152555, + 152539, + 152532, + 152523, + 152559, + 152538, + 152581, + 152555, + 152535, + 152542, + 152482, + 152521, + 152535, + 152562, + 152552, + 152559, + 152534, + 152500, + 152547, + 152536, + 152546, + 152541, + 152561, + 152567, + 152552, + 152551, + 152543, + 152509, + 152578, + 152532, + 152571, + 152542, + 152529, + 152519, + 152538, + 152519, + 152523, + 152530, + 152534, + 152524, + 152590, + 152517, + 152585, + 152534, + 152520, + 152514, + 152546, + 152570, + 152514, + 152519, + 152511, + 152549, + 152532, + 152555, + 152580, + 152556, + 152563, + 152512, + 152539, + 152535, + 152535, + 152543, + 152513, + 152551, + 152533, + 152533, + 152540, + 152540, + 152583, + 152497, + 152513, + 152523, + 152509, + 152536, + 152560, + 152525, + 152520, + 152505, + 152534, + 152564, + 152515, + 152507, + 152524, + 152508, + 152525, + 152538, + 152530, + 152546, + 152541, + 152583, + 152558, + 152560, + 152573, + 152549, + 152558, + 152549, + 152542, + 152535, + 152525, + 152503, + 152512, + 152575, + 152512, + 152524, + 152513, + 152505, + 152512, + 152526, + 152528, + 152522, + 152545, + 152555, + 152529, + 152505, + 152587, + 152544, + 152527, + 152534, + 152508, + 152519, + 152567, + 152532, + 152549, + 152542, + 152540, + 152501, + 152533, + 152532, + 152532, + 152511, + 152536, + 152581, + 152524, + 152516, + 152527, + 152531, + 152540, + 152540, + 152519, + 152557, + 152546, + 152523, + 152509, + 152504, + 152580, + 152510, + 152541, + 152542, + 152552, + 152512, + 152556, + 152542, + 152537, + 152535, + 152572, + 152571, + 152584, + 152532, + 152566, + 152509, + 152527, + 152529, + 152529, + 152527, + 152518, + 152553, + 152557, + 152517, + 152569, + 152539, + 152539, + 152519, + 152517, + 152520, + 152546, + 152530, + 152523, + 152535, + 152513, + 152599, + 152553, + 152543, + 152521, + 152560, + 152504, + 152530, + 152505, + 152534, + 152555, + 152528, + 152535, + 152519, + 152527, + 152571, + 152498, + 152529, + 152537, + 152545, + 152547, + 152523, + 152571, + 152527, + 152535, + 152554, + 152515, + 152531, + 152549, + 152534, + 152510, + 152549, + 152547, + 152517, + 152526, + 152521, + 152533, + 152533, + 152531, + 152586, + 152514, + 152561, + 152518, + 152504, + 152514, + 152543, + 152543, + 152568, + 152529, + 152541, + 152516, + 152530, + 152524, + 152534, + 152568, + 152535, + 152568, + 152551, + 152527, + 152558, + 152501, + 152555, + 152543, + 152559, + 152541, + 152584, + 152535, + 152540, + 152546, + 152535, + 152541, + 152540, + 152535, + 152561, + 152543, + 152549, + 152533, + 152545, + 152546, + 152528, + 152557, + 152537, + 152543, + 152533, + 152555, + 152505, + 152560, + 152525, + 152552, + 152531, + 152497, + 152514, + 152541, + 152527, + 152528, + 152507, + 152522, + 152542, + 152604, + 152531, + 152520, + 152559, + 152524, + 152506, + 152525, + 152525, + 152523, + 152545, + 152532, + 152522, + 152572, + 152510, + 152541, + 152535, + 152519, + 152541, + 152534, + 152538, + 152534, + 152523, + 152545, + 152513, + 152554, + 152546, + 152505, + 152517, + 152529, + 152541, + 152526, + 152558, + 152534, + 152559, + 152511, + 152518, + 152576, + 152565, + 152519, + 152524, + 152524, + 152551, + 152556, + 152548, + 152547, + 152598, + 152542, + 152612, + 152573, + 152530, + 152532, + 152571, + 152552, + 152492, + 152547, + 152565, + 152543, + 152517, + 152527, + 152522, + 152506, + 152502, + 152542, + 152504, + 152578, + 152552, + 152536, + 152561, + 152517, + 152529, + 152530, + 152573, + 152509, + 152554, + 152578, + 152519, + 152526, + 152550, + 152525, + 152554, + 152552, + 152531, + 152568, + 152515, + 152530, + 152548, + 152537, + 152518, + 152526, + 152536, + 152507, + 152516, + 152525, + 152538, + 152520, + 152533, + 152566, + 152551, + 152535, + 152536, + 152508, + 152544, + 152547, + 152532, + 152523, + 152536, + 152503, + 152552, + 152596, + 152557, + 152563, + 152561, + 152520, + 152534, + 152543, + 152573, + 152522, + 152518, + 152555, + 152551, + 152536, + 152547, + 152520, + 152526, + 152515, + 152540, + 152526, + 152557, + 152531, + 152573, + 152509, + 152544, + 152585, + 152547, + 152543, + 152547, + 152547, + 152537, + 152584, + 152535, + 152590, + 152543, + 152559, + 152526, + 152525, + 152571, + 152536, + 152536, + 152527, + 152540, + 152509, + 152557, + 152547, + 152554, + 152528, + 152536, + 152539, + 152555, + 152547, + 152578, + 152547, + 152530, + 152546, + 152530, + 152512, + 152600, + 152545, + 152568, + 152558, + 152563, + 152539, + 152524, + 152553, + 152542, + 152555, + 152544, + 152516, + 152502, + 152551, + 152533, + 152559, + 152599, + 152499, + 152558, + 152524, + 152507, + 152511, + 152618, + 152557, + 152528, + 152523, + 152569, + 152538, + 152534, + 152523, + 152528, + 152547, + 152545, + 152520, + 152569, + 152521, + 152507, + 152574, + 152532, + 152512, + 152561, + 152553, + 152532, + 152498, + 152513, + 152555, + 152550, + 152529, + 152544, + 152554, + 152561, + 152529, + 152549, + 152553, + 152522, + 152508, + 152522, + 152582, + 152534, + 152508, + 152593, + 152500, + 152539, + 152516, + 152542, + 152543, + 152562, + 152545, + 152536, + 152535, + 152569, + 152523, + 152523, + 152561, + 152511, + 152540, + 152545, + 152517, + 152516, + 152536, + 152610, + 152560, + 152527, + 152544, + 152571, + 152541, + 152537, + 152571, + 152547, + 152512, + 152533, + 152572, + 152546, + 152531, + 152544, + 152506, + 152548, + 152545, + 152544, + 152535, + 152508, + 152517, + 152516, + 152544, + 152496, + 152570, + 152573, + 152538, + 152512, + 152588, + 152532, + 152552, + 152553, + 152539, + 152555, + 152594, + 152558, + 152536, + 152535, + 152558, + 152522, + 152557, + 152561, + 152557, + 152529, + 152540, + 152541, + 152525, + 152548, + 152535, + 152527, + 152544, + 152546, + 152528, + 152552, + 152525, + 152565, + 152527, + 152544, + 152538, + 152550, + 152507, + 152550, + 152540, + 152541, + 152546, + 152538, + 152586, + 152581, + 152594, + 152529, + 152503, + 152524, + 152512, + 152571, + 152519, + 152524, + 152518, + 152529, + 152513, + 152527, + 152545, + 152519, + 152505, + 152536, + 152530, + 152563, + 152573, + 152497, + 152546, + 152559, + 152564, + 152562, + 152565, + 152572, + 152554, + 152560, + 152509, + 152525, + 152513, + 152511, + 152501, + 152538, + 152529, + 152528, + 152525, + 152536, + 152589, + 152546, + 152564, + 152561, + 152528, + 152510, + 152520, + 152490, + 152555, + 152551, + 152541, + 152535, + 152507, + 152520, + 152546, + 152539, + 152546, + 152515, + 152526, + 152490, + 152527, + 152562, + 152560, + 152512, + 152557, + 152534, + 152542, + 152582, + 152553, + 152538, + 152526, + 152535, + 152516, + 152520, + 152519, + 152551, + 152518, + 152546, + 152534, + 152541, + 152532, + 152509, + 152512, + 152528, + 152540, + 152522, + 152511, + 152537, + 152519, + 152553, + 152562, + 152541, + 152553, + 152560, + 152548, + 152535, + 152535, + 152542, + 152554, + 152531, + 152518, + 152544, + 152560, + 152612, + 152557, + 152538, + 152553, + 152530, + 152537, + 152518, + 152557, + 152516, + 152496, + 152562, + 152550, + 152529, + 152525, + 152533, + 152514, + 152543, + 152524, + 152560, + 152558, + 152585, + 152500, + 152573, + 152532, + 152555, + 152549, + 152508, + 152513, + 152538, + 152516, + 152527, + 152532, + 152520, + 152545, + 152523, + 152543, + 152535, + 152529, + 152557, + 152491, + 152522, + 152553, + 152524, + 152539, + 152519, + 152544, + 152558, + 152524, + 152573, + 152553, + 152515, + 152532, + 152546, + 152585, + 152548, + 152525, + 152510, + 152556, + 152536, + 152553, + 152558, + 152517, + 152527, + 152546, + 152578, + 152567, + 152553, + 152535, + 152515, + 152532, + 152523, + 152542, + 152551, + 152555, + 152503, + 152539, + 152546, + 152558, + 152587, + 152520, + 152535, + 152516, + 152546, + 152541, + 152539, + 152552, + 152514, + 152508, + 152520, + 152519, + 152549, + 152603, + 152547, + 152535, + 152577, + 152553, + 152541, + 152545, + 152556, + 152524, + 152552, + 152547, + 152541, + 152557, + 152505, + 152531, + 152541, + 152508, + 152529, + 152534, + 152548, + 152507, + 152546, + 152524, + 152537, + 152525, + 152515, + 152526, + 152564, + 152557, + 152533, + 152522, + 152540, + 152532, + 152522, + 152542, + 152531, + 152526, + 152523, + 152529, + 152517, + 152527, + 152529, + 152537, + 152514, + 152532, + 152510, + 152505, + 152547, + 152548, + 152522, + 152548, + 152555, + 152533, + 152538, + 152511, + 152517, + 152512, + 152527, + 152548, + 152531, + 152544, + 152495, + 152519, + 152539, + 152534, + 152552, + 152528, + 152569, + 152553, + 152537, + 152552, + 152547, + 152529, + 152569, + 152541, + 152520, + 152529, + 152532, + 152558, + 152522, + 152574, + 152496, + 152554, + 152572, + 152535, + 152526, + 152529, + 152556, + 152509, + 152531, + 152555, + 152507, + 152534, + 152508, + 152552, + 152563, + 152562, + 152547, + 152551, + 152548, + 152541, + 152623, + 152536, + 152522, + 152501, + 152531, + 152545, + 152560, + 152566, + 152538, + 152506, + 152555, + 152519, + 152536, + 152560, + 152517, + 152556, + 152567, + 152505, + 152528, + 152557, + 152546, + 152514, + 152561, + 152517, + 152573, + 152501, + 152539, + 152501, + 152498, + 152547, + 152564, + 152537, + 152543, + 152509, + 152555, + 152553, + 152528, + 152535, + 152522, + 152536, + 152534, + 152570, + 152527, + 152527, + 152552, + 152514, + 152554, + 152553, + 152528, + 152508, + 152533, + 152536, + 152525, + 152537, + 152544, + 152524, + 152550, + 152507, + 152531, + 152524, + 152581, + 152524, + 152517, + 152514, + 152533, + 152550, + 152538, + 152529, + 152511, + 152505, + 152526, + 152535, + 152552, + 152541, + 152511, + 152519, + 152528, + 152518, + 152515, + 152520, + 152531, + 152516, + 152507, + 152510, + 152523, + 152535, + 152509, + 152555, + 152529, + 152570, + 152546, + 152521, + 152522, + 152530, + 152511, + 152525, + 152535, + 152535, + 152545, + 152533, + 152536, + 152519, + 152529, + 152551, + 152554, + 152555, + 152544, + 152523, + 152525, + 152544, + 152527, + 152519, + 152537, + 152538, + 152529, + 152523, + 152568, + 152490, + 152506, + 152550, + 152537, + 152558, + 152511, + 152538, + 152550, + 152552, + 152556, + 152514, + 152515, + 152501, + 152544, + 152536, + 152522, + 152515, + 152533, + 152501, + 152520, + 152543, + 152569, + 152523, + 152529, + 152540, + 152523, + 152570, + 152535, + 152564, + 152572, + 152553, + 152545, + 152537, + 152560, + 152522, + 152522, + 152543, + 152510, + 152539, + 152546, + 152560, + 152500, + 152526, + 152520, + 152570, + 152551, + 152543, + 152513, + 152541, + 152560, + 152539, + 152556, + 152526, + 152555, + 152545, + 152514, + 152508, + 152532, + 152555, + 152508, + 152511, + 152509, + 152560, + 152545, + 152551, + 152528, + 152499, + 152550, + 152527, + 152511, + 152527, + 152519, + 152514, + 152516, + 152533, + 152526, + 152490, + 152538, + 152516, + 152556, + 152534, + 152537, + 152523, + 152545, + 152499, + 152569, + 152527, + 152521, + 152549, + 152567, + 152525, + 152556, + 152563, + 152565, + 152537, + 152523, + 152498, + 152525, + 152531, + 152525, + 152546, + 152514, + 152503, + 152514, + 152516, + 152537, + 152578, + 152519, + 152520, + 152534, + 152535, + 152577, + 152515, + 152520, + 152528, + 152526, + 152541, + 152554, + 152527, + 152515, + 152526, + 152519, + 152537, + 152552, + 152557, + 152543, + 152517, + 152540, + 152530, + 152532, + 152517, + 152556, + 152505, + 152536, + 152506, + 152502, + 152539, + 152584, + 152502, + 152526, + 152505, + 152509, + 152555, + 152521, + 152557, + 152707, + 152543, + 152547, + 152544, + 152554, + 152541, + 152501, + 152596, + 152562, + 152529, + 152517, + 152558, + 152548, + 152545, + 152549, + 152514, + 152554, + 152573, + 152511, + 152526, + 152550, + 152550, + 152548, + 152503, + 152536, + 152559, + 152537, + 152536, + 152521, + 152535, + 152531, + 152540, + 152553, + 152547, + 152541, + 152525, + 152501, + 152507, + 152572, + 152517, + 152521, + 152544, + 152535, + 152495, + 152569, + 152509, + 152518, + 152550, + 152512, + 152548, + 152520, + 152554, + 152512, + 152529, + 152545, + 152554, + 152534, + 152517, + 152530, + 152533, + 152546, + 152545, + 152506, + 152528, + 152512, + 152515, + 152514, + 152531, + 152564, + 152558, + 152501, + 152537, + 152499, + 152524, + 152540, + 152518, + 152553, + 152517, + 152533, + 152530, + 152538, + 152502, + 152560, + 152499, + 152529, + 152512, + 152580, + 152570, + 152563, + 152549, + 152499, + 152570, + 152526, + 152559, + 152518, + 152523, + 152548, + 152540, + 152519, + 152512, + 152513, + 152544, + 152537, + 152528, + 152548, + 152507, + 152510, + 152568, + 152518, + 152518, + 152568, + 152517, + 152506, + 152509, + 152504, + 152532, + 152516, + 152531, + 152513, + 152534, + 152507, + 152549, + 152526, + 152531, + 152549, + 152544, + 152531, + 152524, + 152549, + 152538, + 152537, + 152511, + 152521, + 152534, + 152547, + 152546, + 152549, + 152541, + 152559, + 152562, + 152534, + 152557, + 152566, + 152510, + 152531, + 152530, + 152518, + 152541, + 152527, + 152527, + 152533, + 152534, + 152543, + 152505, + 152525, + 152514, + 152555, + 152509, + 152524, + 152533, + 152533, + 152516, + 152561, + 152531, + 152519, + 152525, + 152556, + 152514, + 152535, + 152538, + 152555, + 152513, + 152526, + 152496, + 152515, + 152529, + 152528, + 152548, + 152528, + 152484, + 152524, + 152566, + 152522, + 152557, + 152543, + 152522, + 152504, + 152552, + 152530, + 152537, + 152522, + 152499, + 152530, + 152630, + 152513, + 152568, + 152520, + 152530, + 152534, + 152556, + 152565, + 152534, + 152500, + 152571, + 152503, + 152551, + 152513, + 152544, + 152549, + 152580, + 152544, + 152556, + 152544, + 152544, + 152522, + 152528, + 152488, + 152547, + 152518, + 152557, + 152548, + 152520, + 152562, + 152504, + 152523, + 152512, + 152541, + 152483, + 152545, + 152534, + 152549, + 152506, + 152520, + 152516, + 152524, + 152543, + 152526, + 152545, + 152519, + 152490, + 152535, + 152547, + 152530, + 152571, + 152528, + 152529, + 152524, + 152525, + 152552, + 152548, + 152517, + 152542, + 152527, + 152534, + 152566, + 152532, + 152537, + 152496, + 152502, + 152525, + 152514, + 152569, + 152516, + 152542, + 152533, + 152516, + 152558, + 152550, + 152549, + 152532, + 152535, + 152559, + 152579, + 152542, + 152510, + 152515, + 152513, + 152510, + 152534, + 152553, + 152493, + 152558, + 152527, + 152549, + 152530, + 152572, + 152522, + 152504, + 152510, + 152560, + 152610, + 152543, + 152572, + 152536, + 152510, + 152538, + 152519, + 152525, + 152538, + 152517, + 152512, + 152550, + 152560, + 152530, + 152510, + 152506, + 152487, + 152534, + 152509, + 152509, + 152525, + 152536, + 152558, + 152542, + 152550, + 152536, + 152500, + 152525, + 152508, + 152530, + 152532, + 152505, + 152542, + 152521, + 152504, + 152530, + 152565, + 152554, + 152548, + 152539, + 152535, + 152532, + 152557, + 152566, + 152532, + 152557, + 152510, + 152541, + 152531, + 152547, + 152541, + 152523, + 152514, + 152524, + 152548, + 152513, + 152516, + 152532, + 152514, + 152561, + 152546, + 152509, + 152524, + 152507, + 152488, + 152525, + 152530, + 152546, + 152526, + 152544, + 152529, + 152558, + 152531, + 152520, + 152519, + 152587, + 152562, + 152541, + 152514, + 152547, + 152544, + 152527, + 152528, + 152597, + 152532, + 152538, + 152499, + 152499, + 152527, + 152550, + 152558, + 152522, + 152551, + 152523, + 152508, + 152541, + 152520, + 152542, + 152537, + 152517, + 152509, + 152583, + 152568, + 152552, + 152521, + 152512, + 152556, + 152554, + 152562, + 152580, + 152500, + 152544, + 152537, + 152528, + 152512, + 152516, + 152529, + 152572, + 152517, + 152555, + 152556, + 152522, + 152543, + 152514, + 152547, + 152517, + 152572, + 152533, + 152575, + 152531, + 152521, + 152577, + 152573, + 152530, + 152517, + 152535, + 152522, + 152535, + 152537, + 152537, + 152532, + 152548, + 152560, + 152579, + 152566, + 152554, + 152559, + 152510, + 152530, + 152516, + 152542, + 152531, + 152523, + 152557, + 152560, + 152616, + 152549, + 152550, + 152541, + 152543, + 152562, + 152581, + 152528, + 152570, + 152541, + 152519, + 152539, + 152538, + 152527, + 152552, + 152511, + 152522, + 152562, + 152520, + 152525, + 152547, + 152523, + 152522, + 152544, + 152521, + 152565, + 152551, + 152548, + 152493, + 152499, + 152547, + 152545, + 152569, + 152548, + 152551, + 152549, + 152520, + 152525, + 152582, + 152535, + 152569, + 152567, + 152600, + 152569, + 152557, + 152550, + 152500, + 152506, + 152560, + 152552, + 152512, + 152532, + 152534, + 152556, + 152541, + 152552, + 152509, + 152525, + 152517, + 152516, + 152534, + 152542, + 152541, + 152545, + 152510, + 152526, + 152503, + 152521, + 152519, + 152525, + 152493, + 152532, + 152557, + 152527, + 152561, + 152520, + 152517, + 152544, + 152517, + 152496, + 152500, + 152549, + 152511, + 152527, + 152507, + 152561, + 152529, + 152529, + 152521, + 152554, + 152550, + 152554, + 152536, + 152499, + 152531, + 152510, + 152536, + 152525, + 152518, + 152515, + 152552, + 152497, + 152519, + 152563, + 152538, + 152554, + 152520, + 152512, + 152539, + 152598, + 152540, + 152517, + 152538, + 152504, + 152513, + 152519, + 152511, + 152517, + 152531, + 152516, + 152535, + 152536, + 152531, + 152555, + 152515, + 152561, + 152533, + 152526, + 152538, + 152507, + 152577, + 152558, + 152564, + 152537, + 152548, + 152512, + 152550, + 152537, + 152511, + 152540, + 152556, + 152519, + 152509, + 152557, + 152537, + 152546, + 152518, + 152501, + 152498, + 152559, + 152538, + 152506, + 152566, + 152514, + 152535, + 152520, + 152511, + 152548, + 152553, + 152527, + 152548, + 152539, + 152513, + 152526, + 152550, + 152531, + 152505, + 152524, + 152504, + 152540, + 152553, + 152534, + 152531, + 152498, + 152564, + 152530, + 152530, + 152534, + 152529, + 152532, + 152514, + 152531, + 152528, + 152538, + 152508, + 152513, + 152533, + 152567, + 152531, + 152545, + 152523, + 152482, + 152556, + 152542, + 152500, + 152508, + 152544, + 152497, + 152547, + 152530, + 152542, + 152540, + 152550, + 152510, + 152525, + 152542, + 152536, + 152542, + 152525, + 152513, + 152531, + 152554, + 152556, + 152556, + 152520, + 152565, + 152531, + 152538, + 152552, + 152513, + 152575, + 152512, + 152530, + 152559, + 152534, + 152502, + 152503, + 152550, + 152532, + 152542, + 152522, + 152509, + 152537, + 152565, + 152531, + 152558, + 152566, + 152546, + 152514, + 152528, + 152527, + 152542, + 152509, + 152522, + 152610, + 152518, + 152529, + 152572, + 152554, + 152491, + 152524, + 152516, + 152567, + 152554, + 152559, + 152559, + 152540, + 152548, + 152543, + 152510, + 152549, + 152567, + 152502, + 152594, + 152551, + 152541, + 152504, + 152529, + 152558, + 152538, + 152525, + 152570, + 152532, + 152564, + 152565, + 152511, + 152534, + 152590, + 152548, + 152543, + 152567, + 152519, + 152491, + 152525, + 152539, + 152549, + 152538, + 152551, + 152521, + 152503, + 152567, + 152532, + 152562, + 152515, + 152537, + 152583, + 152547, + 152528, + 152537, + 152513, + 152531, + 152566, + 152514, + 152526, + 152537, + 152551, + 152541, + 152549, + 152551, + 152506, + 152551, + 152535, + 152514, + 152515, + 152524, + 152512, + 152516, + 152534, + 152497, + 152555, + 152554, + 152528, + 152501, + 152562, + 152542, + 152562, + 152562, + 152520, + 152519, + 152498, + 152527, + 152535, + 152517, + 152563, + 152547, + 152510, + 152507, + 152530, + 152535, + 152519, + 152523, + 152574, + 152531, + 152515, + 152519, + 152546, + 152540, + 152552, + 152519, + 152535, + 152504, + 152565, + 152546, + 152560, + 152544, + 152522, + 152527, + 152552, + 152504, + 152538, + 152523, + 152529, + 152542, + 152556, + 152532, + 152532, + 152537, + 152514, + 152535, + 152532, + 152545, + 152519, + 152536, + 152547, + 152576, + 152571, + 152512, + 152524, + 152552, + 152563, + 152545, + 152522, + 152516, + 152522, + 152578, + 152516, + 152529, + 152506, + 152537, + 152553, + 152558, + 152536, + 152525, + 152510, + 152498, + 152513, + 152572, + 152539, + 152523, + 152510, + 152539, + 152513, + 152559, + 152540, + 152507, + 152539, + 152597, + 152526, + 152543, + 152520, + 152512, + 152525, + 152513, + 152511, + 152598, + 152540, + 152546, + 152555, + 152530, + 152549, + 152546, + 152542, + 152554, + 152538, + 152510, + 152510, + 152540, + 152533, + 152557, + 152553, + 152530, + 152559, + 152526, + 152567, + 152550, + 152512, + 152517, + 152539, + 152497, + 152534, + 152530, + 152548, + 152508, + 152531, + 152552, + 152587, + 152516, + 152519, + 152520, + 152555, + 152542, + 152518, + 152557, + 152516, + 152521, + 152540, + 152509, + 152524, + 152544, + 152594, + 152556, + 152528, + 152583, + 152524, + 152504, + 152561, + 152534, + 152490, + 152531, + 152544, + 152554, + 152503, + 152524, + 152523, + 152510, + 152539, + 152554, + 152508, + 152508, + 152535, + 152537, + 152524, + 152548, + 152536, + 152524, + 152519, + 152514, + 152548, + 152505, + 152523, + 152511, + 152516, + 152542, + 152549, + 152509, + 152531, + 152529, + 152513, + 152512, + 152512, + 152516, + 152519, + 152503, + 152526, + 152521, + 152552, + 152542, + 152515, + 152582, + 152498, + 152568, + 152595, + 152527, + 152539, + 152512, + 152547, + 152561, + 152545, + 152558, + 152550, + 152554, + 152531, + 152526, + 152580, + 152512, + 152529, + 152512, + 152513, + 152558, + 152541, + 152573, + 152548, + 152536, + 152583, + 152510, + 152519, + 152559, + 152563, + 152513, + 152519, + 152523, + 152556, + 152548, + 152544, + 152562, + 152562, + 152535, + 152556, + 152542, + 152506, + 152591, + 152557, + 152533, + 152506, + 152518, + 152492, + 152521, + 152576, + 152524, + 152544, + 152513, + 152505, + 152498, + 152553, + 152542, + 152550, + 152537, + 152558, + 152527, + 152533, + 152566, + 152547, + 152537, + 152530, + 152519, + 152536, + 152521, + 152529, + 152502, + 152545, + 152518, + 152539, + 152541, + 152513, + 152546, + 152544, + 152517, + 152496, + 152512, + 152502, + 152561, + 152507, + 152545, + 152529, + 152568, + 152561, + 152492, + 152527, + 152541, + 152510, + 152545, + 152535, + 152578, + 152510, + 152516, + 152540, + 152572, + 152545, + 152518, + 152530, + 152532, + 152543, + 152570, + 152560, + 152539, + 152521, + 152499, + 152503, + 152534, + 152568, + 152551, + 152514, + 152544, + 152543, + 152548, + 152583, + 152540, + 152559, + 152524, + 152519, + 152499, + 152539, + 152549, + 152532, + 152515, + 152513, + 152578, + 152530, + 152517, + 152553, + 152486, + 152525, + 152533, + 152543, + 152536, + 152516, + 152528, + 152516, + 152545, + 152560, + 152549, + 152512, + 152563, + 152508, + 152522, + 152541, + 152537, + 152552, + 152526, + 152521, + 152546, + 152509, + 152542, + 152559, + 152533, + 152511, + 152574, + 152525, + 152514, + 152546, + 152559, + 152577, + 152553, + 152625, + 152542, + 152521, + 152563, + 152509, + 152541, + 152560, + 152506, + 152534, + 152531, + 152525, + 152548, + 152527, + 152574, + 152536, + 152553, + 152566, + 152535, + 152547, + 152547, + 152530, + 152531, + 152593, + 152526, + 152546, + 152545, + 152524, + 152546, + 152526, + 152538, + 152527, + 152568, + 152512, + 152511, + 152585, + 152519, + 152515, + 152566, + 152563, + 152513, + 152510, + 152502, + 152563, + 152553, + 152565, + 152494, + 152500, + 152520, + 152552, + 152509, + 152508, + 152530, + 152534, + 152524, + 152538, + 152510, + 152530, + 152510, + 152539, + 152540, + 152555, + 152541, + 152507, + 152535, + 152515, + 152543, + 152559, + 152560, + 152594, + 152507, + 152542, + 152544, + 152595, + 152519, + 152529, + 152500, + 152550, + 152499, + 152512, + 152527, + 152528, + 152550, + 152517, + 152530, + 152522, + 152508, + 152560, + 152520, + 152526, + 152559, + 152570, + 152531, + 152535, + 152526, + 152532, + 152534, + 152532, + 152524, + 152503, + 152493, + 152510, + 152551, + 152544, + 152572, + 152525, + 152524, + 152552, + 152526, + 152540, + 152544, + 152497, + 152538, + 152522, + 152525, + 152578, + 152505, + 152542, + 152530, + 152537, + 152528, + 152540, + 152557, + 152529, + 152517, + 152524, + 152551, + 152539, + 152544, + 152527, + 152536, + 152540, + 152538, + 152524, + 152560, + 152533, + 152545, + 152543, + 152523, + 152543, + 152532, + 152540, + 152556, + 152547, + 152523, + 152543, + 152510, + 152546, + 152536, + 152542, + 152543, + 152541, + 152538, + 152547, + 152497, + 152517, + 152564, + 152523, + 152553, + 152533, + 152516, + 152568, + 152508, + 152530, + 152540, + 152524, + 152527, + 152524, + 152525, + 152563, + 152505, + 152542, + 152517, + 152524, + 152523, + 152549, + 152513, + 152558, + 152561, + 152522, + 152540, + 152536, + 152524, + 152541, + 152544, + 152517, + 152483, + 152568, + 152521, + 152575, + 152509, + 152516, + 152545, + 152524, + 152521, + 152554, + 152551, + 152538, + 152583, + 152538, + 152534, + 152535, + 152520, + 152530, + 152540, + 152563, + 152525, + 152575, + 152541, + 152538, + 152530, + 152526, + 152518, + 152539, + 152520, + 152565, + 152532, + 152532, + 152521, + 152505, + 152533, + 152582, + 152551, + 152575, + 152542, + 152512, + 152518, + 152544, + 152522, + 152555, + 152499, + 152522, + 152511, + 152519, + 152548, + 152550, + 152517, + 152549, + 152511, + 152540, + 152545, + 152521, + 152515, + 152546, + 152508, + 152541, + 152557, + 152542, + 152527, + 152511, + 152500, + 152513, + 152562, + 152552, + 152537, + 152509, + 152575, + 152513, + 152544, + 152550, + 152517, + 152515, + 152552, + 152535, + 152559, + 152528, + 152561, + 152538, + 152527, + 152523, + 152542, + 152567, + 152546, + 152536, + 152487, + 152538, + 152516, + 152562, + 152538, + 152549, + 152549, + 152508, + 152508, + 152507, + 152520, + 152513, + 152529, + 152506, + 152546, + 152540, + 152556, + 152551, + 152543, + 152532, + 152519, + 152508, + 152540, + 152524, + 152524, + 152515, + 152568, + 152565, + 152553, + 152545, + 152521, + 152509, + 152583, + 152518, + 152548, + 152526, + 152508, + 152508, + 152507, + 152527, + 152546, + 152550, + 152522, + 152534, + 152565, + 152549, + 152531, + 152559, + 152514, + 152549, + 152529, + 152566, + 152512, + 152566, + 152513, + 152535, + 152548, + 152556, + 152525, + 152531, + 152535, + 152506, + 152555, + 152551, + 152546, + 152535, + 152532, + 152510, + 152521, + 152623, + 152557, + 152521, + 152513, + 152531, + 152538, + 152552, + 152563, + 152528, + 152554, + 152580, + 152532, + 152523, + 152504, + 152505, + 152533, + 152523, + 152558, + 152555, + 152503, + 152538, + 152547, + 152561, + 152557, + 152531, + 152526, + 152507, + 152539, + 152498, + 152501, + 152567, + 152522, + 152547, + 152525, + 152523, + 152531, + 152951, + 152521, + 152547, + 152504, + 152529, + 152505, + 152547, + 152547, + 152506, + 152531, + 152525, + 152538, + 152548, + 152559, + 152518, + 152525, + 152509, + 152541, + 152539, + 152541, + 152520, + 152542, + 152539, + 152523, + 152536, + 152533, + 152523, + 152530, + 152557, + 152520, + 152531, + 152536, + 152516, + 152488, + 152557, + 152525, + 152504, + 152538, + 152521, + 152528, + 152526, + 152545, + 152510, + 152531, + 152563, + 152527, + 152592, + 152522, + 152543, + 152520, + 152537, + 152522, + 152563, + 152585, + 152528, + 152516, + 152568, + 152534, + 152546, + 152514, + 152501, + 152553, + 152507, + 152506, + 152543, + 152521, + 152558, + 152509, + 152498, + 152520, + 152557, + 152525, + 152510, + 152543, + 152561, + 152491, + 152531, + 152534, + 152535, + 152577, + 152513, + 152502, + 152507, + 152490, + 152538, + 152501, + 152554, + 152554, + 152565, + 152522, + 152531, + 152521, + 152562, + 152530, + 152513, + 152553, + 152541, + 152528, + 152538, + 152514, + 152573, + 152541, + 152528, + 152521, + 152529, + 152543, + 152540, + 152516, + 152527, + 152543, + 152532, + 152527, + 152527, + 152534, + 152583, + 152563, + 152530, + 152510, + 152530, + 152530, + 152537, + 152550, + 152545, + 152501, + 152524, + 152531, + 152553, + 152544, + 152563, + 152581, + 152533, + 152524, + 152521, + 152558, + 152531, + 152504, + 152565, + 152509, + 152517, + 152556, + 152530, + 152553, + 152543, + 152538, + 152542, + 152517, + 152492, + 152534, + 152570, + 152537, + 152572, + 152553, + 152531, + 152524, + 152589, + 152540, + 152607, + 152529, + 152537, + 152559, + 152587, + 152511, + 152539, + 152635, + 152599, + 152514, + 152550, + 152547, + 152559, + 152522, + 152508, + 152485, + 152533, + 152537, + 152509, + 152534, + 152508, + 152538, + 152540, + 152546, + 152515, + 152518, + 152510, + 152552, + 152554, + 152523, + 152540, + 152538, + 152502, + 152540, + 152548, + 152517, + 152563, + 152531, + 152516, + 152515, + 152500, + 152530, + 152574, + 152521, + 152559, + 152511, + 152484, + 152541, + 152535, + 152511, + 152554, + 152493, + 152510, + 152534, + 152530, + 152506, + 152517, + 152523, + 152563, + 152536, + 152544, + 152554, + 152511, + 152587, + 152513, + 152529, + 152523, + 152531, + 152541, + 152519, + 152523, + 152505, + 152511, + 152585, + 152521, + 152501, + 152530, + 152533, + 152537, + 152553, + 152507, + 152554, + 152551, + 152552, + 152583, + 152536, + 152510, + 152514, + 152577, + 152521, + 152520, + 152563, + 152542, + 152541, + 152511, + 152532, + 152527, + 152551, + 152527, + 152508, + 152557, + 152531, + 152523, + 152530, + 152532, + 152525, + 152538, + 152556, + 152539, + 152561, + 152548, + 152506, + 152529, + 152566, + 152502, + 152508, + 152550, + 152566, + 152499, + 152533, + 152517, + 152576, + 152519, + 152500, + 152534, + 152514, + 152574, + 152511, + 152538, + 152507, + 152523, + 152538, + 152531, + 152544, + 152497, + 152511, + 152566, + 152531, + 152562, + 152527, + 152547, + 152521, + 152523, + 152543, + 152540, + 152537, + 152523, + 152482, + 152498, + 152539, + 152532, + 152555, + 152531, + 152520, + 152547, + 152510, + 152546, + 152507, + 152518, + 152510, + 152563, + 152520, + 152538, + 152588, + 152558, + 152508, + 152523, + 152534, + 152515, + 152566, + 152532, + 152488, + 152525, + 152548, + 152572, + 152546, + 152549, + 152519, + 152539, + 152519, + 152558, + 152521, + 152545, + 152531, + 152547, + 152570, + 152529, + 152537, + 152534, + 152529, + 152512, + 152603, + 152527, + 152526, + 152528, + 152508, + 152549, + 152509, + 152540, + 152532, + 152529, + 153121, + 152535, + 152546, + 152566, + 152534, + 152538, + 152486, + 152530, + 152533, + 152602, + 152503, + 152513, + 152502, + 152529, + 152538, + 152601, + 152543, + 152524, + 152537, + 152504, + 152525, + 152525, + 152568, + 152546, + 152519, + 152529, + 152559, + 152516, + 152537, + 152530, + 152528, + 152537, + 152512, + 152543, + 152559, + 152496, + 152542, + 152538, + 152511, + 152546, + 152559, + 152521, + 152516, + 152537, + 152533, + 152584, + 152537, + 152534, + 152538, + 152513, + 152526, + 152510, + 152547, + 152511, + 152573, + 152534, + 152541, + 152544, + 152554, + 152498, + 152518, + 152544, + 152527, + 152532, + 152508, + 152524, + 152522, + 152539, + 152557, + 152531, + 152558, + 152516, + 152525, + 152510, + 152512, + 152513, + 152550, + 152567, + 152513, + 152511, + 152513, + 152555, + 152555, + 152527, + 152531, + 152519, + 152553, + 152522, + 152530, + 152580, + 152536, + 152525, + 152520, + 152530, + 152549, + 152538, + 152529, + 152529, + 152515, + 152532, + 152534, + 152529, + 152534, + 152505, + 152567, + 152554, + 152525, + 152491, + 152479, + 152503, + 152587, + 152516, + 152517, + 152538, + 152527, + 152519, + 152521, + 152531, + 152530, + 152508, + 152545, + 152545, + 152544, + 152511, + 152552, + 152485, + 152526, + 152507, + 152547, + 152528, + 152528, + 152537, + 152575, + 152506, + 152536, + 152515, + 152520, + 152541, + 152526, + 152533, + 152561, + 152531, + 152522, + 152512, + 152533, + 152545, + 152525, + 152572, + 152512, + 152509, + 152510, + 152550, + 152506, + 152559, + 152530, + 152498, + 152497, + 152529, + 152570, + 152511, + 152548, + 152557, + 152516, + 152536, + 152545, + 152520, + 152545, + 152553, + 152534, + 152542, + 152525, + 152538, + 152534, + 152514, + 152525, + 152531, + 152546, + 152544, + 152516, + 152505, + 152543, + 152570, + 152546, + 152506, + 152523, + 152554, + 152519, + 152514, + 152541, + 152515, + 152564, + 152522, + 152529, + 152514, + 152543, + 152585, + 152530, + 152528, + 152513, + 152525, + 152538, + 152529, + 152569, + 152514, + 152519, + 152544, + 152543, + 152543, + 152550, + 152509, + 152499, + 152539, + 152568, + 152549, + 152522, + 152532, + 152514, + 152536, + 152532, + 152569, + 152523, + 152534, + 152503, + 152558, + 152534, + 152530, + 152531, + 152514, + 152542, + 152527, + 152561, + 152546, + 152569, + 152534, + 152508, + 152497, + 152507, + 152598, + 152559, + 152562, + 152527, + 152528, + 152511, + 152522, + 152538, + 152555, + 152507, + 152531, + 152503, + 152517, + 152525, + 152552, + 152514, + 152527, + 152501, + 152545, + 152514, + 152529, + 152531, + 152564, + 152570, + 152568, + 152557, + 152521, + 152543, + 152522, + 152535, + 152538, + 152546, + 152512, + 152519, + 152539, + 152539, + 152547, + 152520, + 152521, + 152538, + 152574, + 152550, + 152587, + 152513, + 152529, + 152510, + 152518, + 152542, + 152537, + 152540, + 152548, + 152517, + 152564, + 152511, + 152560, + 152523, + 152532, + 152528, + 152542, + 152536, + 152521, + 152527, + 152501, + 152514, + 152548, + 152536, + 152541, + 152558, + 152533, + 152520, + 152540, + 152521, + 152536, + 152558, + 152520, + 152549, + 152510, + 152545, + 152559, + 152556, + 152518, + 152502, + 152552, + 152547, + 152545, + 152522, + 152514, + 152537, + 152544, + 152552, + 152527, + 152529, + 152519, + 152532, + 152538, + 152540, + 152569, + 152504, + 152503, + 152536, + 152502, + 152567, + 152546, + 152559, + 152503, + 152517, + 152505, + 152523, + 152554, + 152566, + 152526, + 152545, + 152531, + 152538, + 152533, + 152545, + 152504, + 152494, + 152508, + 152529, + 152524, + 152516, + 152515, + 152528, + 152528, + 152525, + 152536, + 152576, + 152533, + 152510, + 152504, + 152533, + 152533, + 152520, + 152571, + 152559, + 152526, + 152566, + 152568, + 152515, + 152539, + 152501, + 152509, + 152534, + 152581, + 152542, + 152501, + 152526, + 152553, + 152527, + 152510, + 152567, + 152507, + 152550, + 152522, + 152550, + 152546, + 152539, + 152517, + 152524, + 152528, + 152536, + 152533, + 152538, + 152521, + 152493, + 152541, + 152572, + 152542, + 152584, + 152555, + 152536, + 152523, + 152565, + 152530, + 152533, + 152519, + 152513, + 152522, + 152515, + 152537, + 152529, + 152543, + 152506, + 152540, + 152542, + 152545, + 152512, + 152491, + 152514, + 152527, + 152543, + 152521, + 152501, + 152521, + 152543, + 152520, + 152515, + 152505, + 152501, + 152519, + 152519, + 152529, + 152547, + 152523, + 152539, + 152534, + 152499, + 152510, + 152507, + 152547, + 152517, + 152548, + 152487, + 152550, + 152552, + 152527, + 152513, + 152501, + 152560, + 152524, + 152568, + 152556, + 152528, + 152506, + 152545, + 152550, + 152574, + 152523, + 152542, + 152566, + 152536, + 152496, + 152560, + 152535, + 152522, + 152525, + 152523, + 152513, + 152505, + 152512, + 152525, + 152537, + 152558, + 152518, + 152522, + 152498, + 152527, + 152513, + 152534, + 152525, + 152544, + 152541, + 152515, + 152544, + 152535, + 152509, + 152521, + 152522, + 152534, + 152515, + 152522, + 152512, + 152548, + 152554, + 152538, + 152529, + 152541, + 152557, + 152573, + 152535, + 152521, + 152523, + 152542, + 152526, + 152518, + 152542, + 152530, + 152525, + 152500, + 152536, + 152564, + 152533, + 152533, + 152559, + 152505, + 152509, + 152530, + 152564, + 152534, + 152573, + 152520, + 152537, + 152518, + 152550, + 152499, + 152529, + 152535, + 152544, + 152538, + 152518, + 152532, + 152552, + 152505, + 152555, + 152525, + 152546, + 152559, + 152550, + 152536, + 152514, + 152552, + 152536, + 152576, + 152541, + 152538, + 152505, + 152579, + 152527, + 152551, + 152537, + 152508, + 152542, + 152527, + 152508, + 152506, + 152529, + 152550, + 152539, + 152513, + 152530, + 152538, + 152526, + 152524, + 152522, + 152579, + 152502, + 152510, + 152519, + 152507, + 152543, + 152559, + 152564, + 152521, + 152548, + 152526, + 152535, + 152577, + 152566, + 152525, + 152510, + 152539, + 152567, + 152543, + 152530, + 152526, + 152518, + 152512, + 152529, + 152543, + 152504, + 152536, + 152519, + 152506, + 152561, + 152567, + 152548, + 152521, + 152505, + 152497, + 152534, + 152557, + 152529, + 152517, + 152500, + 152507, + 152556, + 152510, + 152548, + 152787, + 152528, + 152530, + 152528, + 152533, + 152560, + 152512, + 152495, + 152574, + 152545, + 152542, + 152540, + 152539, + 152495, + 152523, + 152546, + 152515, + 152553, + 152557, + 152502, + 152531, + 152537, + 152500, + 152536, + 152533, + 152537, + 152560, + 152519, + 152535, + 152508, + 152561, + 152536, + 152510, + 152570, + 152512, + 152545, + 152533, + 152499, + 152541, + 152544, + 152510, + 152525, + 152519, + 152537, + 152522, + 152520, + 152517, + 152517, + 152535, + 152520, + 152556, + 152545, + 152550, + 152550, + 152546, + 152535, + 152521, + 152538, + 152587, + 152571, + 152522, + 152515, + 152539, + 152533, + 152594, + 152501, + 152521, + 152541, + 152559, + 152521, + 152547, + 152525, + 152547, + 152551, + 152502, + 152550, + 152534, + 152517, + 152500, + 152530, + 152525, + 152567, + 152512, + 152532, + 152522, + 152504, + 152498, + 152548, + 152535, + 152552, + 152495, + 152513, + 152513, + 152538, + 152537, + 152546, + 152552, + 152528, + 152515, + 152528, + 152540, + 152514, + 152519, + 152540, + 152527, + 152551, + 152531, + 152556, + 152565, + 152589, + 152539, + 152518, + 152489, + 152545, + 152523, + 152527, + 152536, + 152530, + 152547, + 152519, + 152521, + 152508, + 152506, + 152585, + 152550, + 152567, + 152532, + 152552, + 152544, + 152525, + 152540, + 152516, + 152480, + 152517, + 152543, + 152536, + 152534, + 152572, + 152523, + 152563, + 152509, + 152559, + 152528, + 152551, + 152541, + 152504, + 152529, + 152616, + 152527, + 152496, + 152570, + 152530, + 152548, + 152535, + 152549, + 152524, + 152536, + 152559, + 152515, + 152511, + 152515, + 152515, + 152570, + 152495, + 152519, + 152551, + 152575, + 152539, + 152544, + 152525, + 152561, + 152521, + 152564, + 152527, + 152524, + 152511, + 152533, + 152498, + 152546, + 152599, + 152532, + 152550, + 152506, + 152499, + 152548, + 152536, + 152560, + 152562, + 152499, + 152529, + 152538, + 152574, + 152538, + 152545, + 152565, + 152525, + 152932, + 152556, + 152568, + 152558, + 152508, + 152514, + 152528, + 152538, + 152566, + 152508, + 152512, + 152523, + 152516, + 152545, + 152515, + 152512, + 152532, + 152538, + 152522, + 152517, + 152504, + 152502, + 152532, + 152504, + 152535, + 152510, + 152525, + 152514, + 152554, + 152548, + 152566, + 152540, + 152552, + 152499, + 152528, + 152540, + 152518, + 152526, + 152523, + 152540, + 152544, + 152540, + 152545, + 152517, + 152514, + 152537, + 152519, + 152541, + 152538, + 152571, + 152554, + 152516, + 152508, + 152513, + 152518, + 152504, + 152505, + 152522, + 152493, + 152545, + 152565, + 152534, + 152535, + 152541, + 152537, + 152547, + 152532, + 152555, + 152527, + 152527, + 152547, + 152528, + 152528, + 152536, + 152546, + 152549, + 152519, + 152545, + 152568, + 152532, + 152550, + 152528, + 152541, + 152510, + 152541, + 152517, + 152524, + 152605, + 152503, + 152565, + 152552, + 152560, + 152563, + 152531, + 152515, + 152584, + 152530, + 152546, + 152575, + 152530, + 152517, + 152508, + 152534, + 152542, + 152502, + 152549, + 152505, + 152511, + 152547, + 152542, + 152594, + 152501, + 152503, + 152557, + 152530, + 152502, + 152546, + 152545, + 152492, + 152551, + 152572, + 152540, + 152498, + 152579, + 152523, + 152516, + 152568, + 152546, + 152536, + 152519, + 152487, + 152497, + 152519, + 152565, + 152519, + 152530, + 152507, + 152509, + 152560, + 152549, + 152547, + 152522, + 152576, + 152536, + 152537, + 152593, + 152574, + 152544, + 152506, + 152514, + 152516, + 152535, + 152525, + 152545, + 152563, + 152530, + 152543, + 152508, + 152574, + 152504, + 152534, + 152502, + 152520, + 152530, + 152510, + 152610, + 152496, + 152534, + 152504, + 152548, + 152546, + 152561, + 152547, + 152540, + 152539, + 152555, + 152575, + 152521, + 152536, + 152509, + 152549, + 152525, + 152514, + 152583, + 152550, + 152533, + 152519, + 152575, + 152517, + 152575, + 152552, + 152528, + 152514, + 152575, + 152534, + 152546, + 152506, + 152528, + 152518, + 152518, + 152542, + 152547, + 152533, + 152533, + 152520, + 152593, + 152550, + 152510, + 152552, + 152562, + 152538, + 152572, + 152535, + 152504, + 152504, + 152531, + 152508, + 152498, + 152531, + 152529, + 152546, + 152516, + 152517, + 152541, + 152528, + 152522, + 152505, + 152533, + 152538, + 152520, + 152517, + 152521, + 152525, + 152533, + 152534, + 152542, + 152549, + 152515, + 152558, + 152530, + 152521, + 152566, + 152534, + 152526, + 152523, + 152510, + 152615, + 152547, + 152545, + 152535, + 152524, + 152555, + 152540, + 152554, + 152555, + 152531, + 152536, + 152528, + 152502, + 152554, + 152539, + 152528, + 152560, + 152500, + 152552, + 152536, + 152527, + 152568, + 152545, + 152509, + 152532, + 152549, + 152568, + 152557, + 152502, + 152519, + 152548, + 152546, + 152550, + 152536, + 152515, + 152524, + 152507, + 152546, + 152544, + 152525, + 152533, + 152559, + 152567, + 152532, + 152548, + 152520, + 152566, + 152530, + 152542, + 152580, + 152530, + 152522, + 152515, + 152517, + 152532, + 152558, + 152512, + 152509, + 152577, + 152545, + 152527, + 152565, + 152550, + 152529, + 152553, + 152537, + 152540, + 152551, + 152537, + 152543, + 152508, + 152528, + 152569, + 152564, + 152534, + 152504, + 152551, + 152535, + 152533, + 152566, + 152552, + 152551, + 152538, + 152504, + 152546, + 152551, + 152536, + 152498, + 152498, + 152506, + 152544, + 152555, + 152548, + 152518, + 152540, + 152567, + 152552, + 152550, + 152537, + 152534, + 152496, + 152549, + 152521, + 152586, + 152517, + 152513, + 152515, + 152530, + 152512, + 152516, + 152536, + 152558, + 152544, + 152495, + 152535, + 152568, + 152538, + 152515, + 152534, + 152547, + 152529, + 152559, + 152599, + 152553, + 152557, + 152575, + 152531, + 152496, + 152535, + 152590, + 152561, + 152512, + 152519, + 152533, + 152519, + 152550, + 152566, + 152555, + 152541, + 152556, + 152505, + 152539, + 152536, + 152526, + 152542, + 152563, + 152544, + 152566, + 152510, + 152523, + 152555, + 152540, + 152549, + 152510, + 152521, + 152532, + 152568, + 152536, + 152540, + 152560, + 152558, + 152526, + 152538, + 152534, + 152563, + 152560, + 152512, + 152530, + 152555, + 152569, + 152523, + 152608, + 152517, + 152538, + 152536, + 152535, + 152576, + 152533, + 152586, + 152554, + 152538, + 152547, + 152504, + 152547, + 152515, + 152521, + 152522, + 152581, + 152540, + 152544, + 152507, + 152549, + 152505, + 152559, + 152526, + 152542, + 152569, + 152529, + 152535, + 152537, + 152547, + 152532, + 152522, + 152521, + 152530, + 152538, + 152581, + 152552, + 152522, + 152527, + 152561, + 152528, + 152538, + 152569, + 152518, + 152572, + 152553, + 152569, + 152576, + 152519, + 152498, + 152541, + 152565, + 152524, + 152525, + 152486, + 152529, + 152543, + 152519, + 152575, + 152516, + 152501, + 152508, + 152541, + 152505, + 152526, + 152556, + 152532, + 152532, + 152535, + 152526, + 152542, + 152524, + 152532, + 152550, + 152532, + 152532, + 152543, + 152530, + 152530, + 152527, + 152546, + 152505, + 152504, + 152547, + 152528, + 152562, + 152523, + 152539, + 152518, + 152552, + 152535, + 152546, + 152544, + 152534, + 152543, + 152571, + 152503, + 152548, + 152570, + 152537, + 152553, + 152530, + 152533, + 152518, + 152531, + 152493, + 152527, + 152530, + 152531, + 152581, + 152529, + 152533, + 152520, + 152507, + 152556, + 152516, + 152547, + 152526, + 152532, + 152553, + 152509, + 152513, + 152545, + 152575, + 152526, + 152577, + 152512, + 152539, + 152518, + 152540, + 152556, + 152557, + 152535, + 152537, + 152567, + 152526, + 152520, + 152552, + 152537, + 152542, + 152526, + 152553, + 152521, + 152563, + 152509, + 152573, + 152543, + 152513, + 152528, + 152535, + 152558, + 152530, + 152507, + 152552, + 152531, + 152503, + 152511, + 152529, + 152506, + 152546, + 152565, + 152529, + 152543, + 152502, + 152527, + 152582, + 152566, + 152533, + 152504, + 152531, + 152558, + 152549, + 152562, + 152557, + 152548, + 152549, + 152536, + 152548, + 152562, + 152554, + 152534, + 152522, + 152536, + 152519, + 152521, + 152522, + 152552, + 152523, + 152516, + 152560, + 152528, + 152560, + 152562, + 152541, + 152509, + 152528, + 152571, + 152598, + 152564, + 152571, + 152539, + 152494, + 152564, + 152559, + 152534, + 152541, + 152575, + 152508, + 152546, + 152534, + 152499, + 152543, + 152518, + 152565, + 152514, + 152521, + 152526, + 152482, + 152524, + 152531, + 152513, + 152553, + 152509, + 152513, + 152506, + 152542, + 152525, + 152517, + 152507, + 152505, + 152524, + 152527, + 152556, + 152562, + 152534, + 152529, + 152561, + 152541, + 152538, + 152554, + 152523, + 152524, + 152562, + 152531, + 152528, + 152538, + 152503, + 152557, + 152534, + 152501, + 152528, + 152547, + 152517, + 152513, + 152520, + 152536, + 152551, + 152554, + 152549, + 152529, + 152540, + 152489, + 152543, + 152553, + 152525, + 152544, + 152539, + 152557, + 152558, + 152512, + 152556, + 152525, + 152525, + 152522, + 152504, + 152515, + 152544, + 152508, + 152549, + 152532, + 152519, + 152502, + 152528, + 152502, + 152522, + 152536, + 152556, + 152538, + 152542, + 152534, + 152517, + 152556, + 152577, + 152577, + 152566, + 152516, + 152561, + 152525, + 152576, + 152582, + 152575, + 152484, + 152546, + 152508, + 152506, + 152517, + 152552, + 152510, + 152502, + 152540, + 152527, + 152519, + 152530, + 152511, + 152520, + 152502, + 152538, + 152504, + 152573, + 152558, + 152543, + 152537, + 152522, + 152545, + 152514, + 152516, + 152505, + 152526, + 152517, + 152532, + 152573, + 152521, + 152552, + 152543, + 152550, + 152524, + 152515, + 152503, + 152517, + 152516, + 152530, + 152501, + 152533, + 152495, + 152527, + 152527, + 152522, + 152533, + 152526, + 152522, + 152527, + 152535, + 152539, + 152573, + 152546, + 152540, + 152534, + 152522, + 152536, + 152537, + 152504, + 152519, + 152502, + 152575, + 152548, + 152515, + 152561, + 152535, + 152524, + 152508, + 152526, + 152571, + 152484, + 152543, + 152554, + 152519, + 152542, + 152560, + 152529, + 152504, + 152527, + 152540, + 152606, + 152551, + 152509, + 152520, + 152516, + 152512, + 152552, + 152554, + 152550, + 152511, + 152547, + 152537, + 152510, + 152551, + 152501, + 152525, + 152509, + 152522, + 152544, + 152552, + 152547, + 152538, + 152526, + 152539, + 152513, + 152538, + 152559, + 152518, + 152515, + 152548, + 152521, + 152537, + 152544, + 152530, + 152577, + 152530, + 152558, + 152575, + 152481, + 152527, + 152521, + 152528, + 152562, + 152531, + 152519, + 152495, + 152573, + 152535, + 152525, + 152548, + 152520, + 152509, + 152554, + 152558, + 152518, + 152523, + 152534, + 152493, + 152512, + 152528, + 152518, + 152519, + 152550, + 152496, + 152495, + 152553, + 152570, + 152519, + 152512, + 152509, + 152522, + 152525, + 152534, + 152518, + 152530, + 152521, + 152545, + 152565, + 152524, + 152551, + 152537, + 152572, + 152520, + 152540, + 152561, + 152520, + 152548, + 152505, + 152533, + 152543, + 152525, + 152510, + 152511, + 152550, + 152511, + 152533, + 152561, + 152564, + 152500, + 152540, + 152515, + 152527, + 152590, + 152545, + 152582, + 152517, + 152517, + 152560, + 152522, + 152515, + 152557, + 152516, + 152514, + 152525, + 152512, + 152524, + 152556, + 152509, + 152534, + 152537, + 152566, + 152524, + 152510, + 152520, + 152540, + 152524, + 152534, + 152573, + 152522, + 152503, + 152536, + 152515, + 152517, + 152533, + 152540, + 152528, + 152530, + 152505, + 152529, + 152515, + 152537, + 152520, + 152538, + 152569, + 152549, + 152533, + 152560, + 152510, + 152535, + 152545, + 152559, + 152519, + 152529, + 152549, + 152509, + 152546, + 152531, + 152528, + 152514, + 152547, + 152532, + 152524, + 152542, + 152523, + 152526, + 152548, + 152504, + 152531, + 152566, + 152521, + 152560, + 152512, + 152528, + 152504, + 152538, + 152494, + 152541, + 152552, + 152501, + 152527, + 152559, + 152633, + 152574, + 152527, + 152515, + 152550, + 152527, + 152550, + 152567, + 152545, + 152585, + 152550, + 152591, + 152561, + 152527, + 152491, + 152512, + 152541, + 152538, + 152502, + 152510, + 152504, + 152553, + 152678, + 152533, + 152544, + 152519, + 152511, + 152529, + 152555, + 152504, + 152527, + 152509, + 152507, + 152581, + 152515, + 152519, + 152570, + 152534, + 152540, + 152547, + 152521, + 152524, + 152540, + 152491, + 152530, + 152510, + 152509, + 152550, + 152507, + 152554, + 152499, + 152549, + 152537, + 152538, + 152595, + 152574, + 152506, + 152507, + 152542, + 152550, + 152532, + 152522, + 152545, + 152536, + 152534, + 152524, + 152529, + 152523, + 152517, + 152540, + 152556, + 152519, + 152549, + 152577, + 152535, + 152505, + 152550, + 152537, + 152519, + 152502, + 152551, + 152550, + 152544, + 152523, + 152508, + 152538, + 152536, + 152568, + 152555, + 152541, + 152526, + 152562, + 152552, + 152542, + 152540, + 152542, + 152498, + 152534, + 152524, + 152551, + 152513, + 152506, + 152502, + 152541, + 152561, + 152537, + 152555, + 152569, + 152549, + 152559, + 152545, + 152497, + 152534, + 152545, + 152550, + 152533, + 152503, + 152517, + 152538, + 152561, + 152544, + 152518, + 152508, + 152492, + 152489, + 152522, + 152561, + 152519, + 152566, + 152527, + 152513, + 152539, + 152512, + 152514, + 152541, + 152513, + 152544, + 152547, + 152565, + 152511, + 152539, + 152556, + 152521, + 152553, + 152534, + 152571, + 152501, + 152565, + 152548, + 152548, + 152529, + 152530, + 152550, + 152538, + 152522, + 152535, + 152522, + 152541, + 156848, + 152523, + 152522, + 152527, + 152574, + 152518, + 152538, + 152546, + 152549, + 152533, + 152580, + 152599, + 152519, + 152517, + 152523, + 152525, + 152514, + 152547, + 152562, + 152519, + 152578, + 152545, + 152499, + 152520, + 152534, + 152519, + 152566, + 152553, + 152519, + 152541, + 152515, + 152506, + 152514, + 152549, + 152529, + 152550, + 152529, + 152533, + 152510, + 152585, + 152547, + 152532, + 152490, + 152530, + 152571, + 152502, + 152521, + 152537, + 152520, + 152513, + 152550, + 152519, + 152528, + 152535, + 152516, + 152492, + 152541, + 152545, + 152551, + 152537, + 152533, + 152565, + 152553, + 152523, + 152529, + 152514, + 152545, + 152509, + 152562, + 152576, + 152516, + 152504, + 152550, + 152515, + 152518, + 152540, + 152535, + 152547, + 152532, + 152517, + 152520, + 152540, + 152561, + 152501, + 152540, + 152534, + 152527, + 152542, + 152573, + 152536, + 152524, + 152572, + 152527, + 152519, + 152516, + 152560, + 152535, + 152510, + 152522, + 152554, + 152578, + 152524, + 152569, + 152534, + 152520, + 152517, + 152581, + 152527, + 152555, + 152559, + 152526, + 152564, + 152535, + 152543, + 152603, + 152534, + 152533, + 152534, + 152544, + 152534, + 152530, + 152548, + 152563, + 152528, + 152523, + 152526, + 152520, + 152518, + 152543, + 152518, + 152547, + 152533, + 152516, + 152531, + 152522, + 152559, + 152513, + 152552, + 152549, + 152526, + 152511, + 152526, + 152523, + 152610, + 152536, + 152521, + 152577, + 152552, + 152505, + 152512, + 152523, + 152509, + 152532, + 152513, + 152543, + 152505, + 152532, + 152515, + 152570, + 152513, + 152529, + 152557, + 152508, + 152505, + 152531, + 152579, + 152586, + 152535, + 152553, + 152520, + 152518, + 152519, + 152534, + 152541, + 152556, + 152577, + 152530, + 152526, + 152559, + 152496, + 152494, + 152497, + 152508, + 152537, + 152543, + 152533, + 152524, + 152513, + 152574, + 152600, + 152538, + 152503, + 152516, + 152506, + 152555, + 152546, + 152527, + 152522, + 152507, + 152545, + 152516, + 152537, + 152549, + 152540, + 152498, + 152551, + 152528, + 152535, + 152528, + 152567, + 152529, + 152537, + 152595, + 152541, + 152497, + 152530, + 152556, + 152525, + 152532, + 152538, + 152513, + 152561, + 152535, + 152518, + 152550, + 152524, + 152574, + 152515, + 152534, + 152527, + 152540, + 152554, + 152524, + 152556, + 152521, + 152540, + 152527, + 152558, + 152501, + 152596, + 152559, + 152556, + 152547, + 152549, + 152518, + 152559, + 152542, + 152537, + 152514, + 152575, + 152525, + 152522, + 152508, + 152519, + 152512, + 152515, + 152545, + 152554, + 152549, + 152545, + 152549, + 152515, + 152556, + 152552, + 152536, + 152507, + 152512, + 152541, + 152548, + 152557, + 152565, + 152525, + 152549, + 152525, + 152536, + 152529, + 152520, + 152547, + 152566, + 152501, + 152530, + 152512, + 152484, + 152534, + 152545, + 152524, + 152533, + 152525, + 152529, + 152512, + 152519, + 152562, + 152537, + 152551, + 152507, + 152539, + 152577, + 152512, + 152539, + 152531, + 152525, + 152528, + 152541, + 152518, + 152551, + 152515, + 152504, + 152524, + 152527, + 152509, + 152551, + 152559, + 152545, + 152529, + 152539, + 152518, + 152526, + 152533, + 152541, + 152516, + 152535, + 152555, + 152538, + 152525, + 152522, + 152540, + 152535, + 152546, + 152539, + 152524, + 152534, + 152565, + 152526, + 152543, + 152526, + 152535, + 152546, + 152554, + 152515, + 152522, + 152516, + 152517, + 152526, + 152573, + 152528, + 152550, + 152527, + 152589, + 152538, + 152542, + 152548, + 152555, + 152513, + 152535, + 152495, + 152501, + 152472, + 152506, + 152536, + 152545, + 152514, + 152521, + 152544, + 152550, + 152543, + 152506, + 152550, + 152501, + 152521, + 152562, + 152529, + 152535, + 152562, + 152565, + 152539, + 152528, + 152546, + 152508, + 152554, + 152543, + 152533, + 152516, + 152517, + 152519, + 152548, + 152520, + 152539, + 152559, + 152564, + 152529, + 152515, + 152534, + 152593, + 152533, + 152541, + 152539, + 152564, + 152526, + 152510, + 152557, + 152528, + 152554, + 152553, + 152555, + 152535, + 152508, + 152559, + 152563, + 152554, + 152563, + 152530, + 152524, + 152541, + 152543, + 152520, + 152567, + 152526, + 152546, + 152542, + 152536, + 152557, + 152530, + 152534, + 152521, + 152527, + 152516, + 152518, + 152539, + 152568, + 152513, + 152518, + 152529, + 152518, + 152515, + 152518, + 152552, + 152540, + 152560, + 152532, + 152584, + 152527, + 152523, + 152515, + 152516, + 152550, + 152508, + 152524, + 152530, + 152551, + 152548, + 152534, + 152531, + 152549, + 152542, + 152532, + 152520, + 152501, + 152520, + 152514, + 152524, + 152517, + 152533, + 152553, + 152537, + 152560, + 152514, + 152499, + 152569, + 152510, + 152518, + 152515, + 152541, + 152539, + 152505, + 152475, + 152520, + 152585, + 152528, + 152560, + 152535, + 152532, + 152550, + 152485, + 152503, + 152533, + 152532, + 152547, + 152531, + 152528, + 152597, + 152521, + 152559, + 152569, + 152541, + 152559, + 152549, + 152518, + 152503, + 152530, + 152481, + 152522, + 152557, + 152529, + 152508, + 152531, + 152543, + 152530, + 152541, + 152534, + 152513, + 152520, + 152531, + 152533, + 152510, + 152518, + 152560, + 152537, + 152516, + 152541, + 152541, + 152513, + 152558, + 152559, + 152527, + 152543, + 152563, + 152525, + 152571, + 152530, + 152529, + 152573, + 152532, + 152501, + 152527, + 152524, + 152509, + 152548, + 152535, + 152523, + 152530, + 152562, + 152555, + 152505, + 152546, + 152562, + 152512, + 152517, + 152537, + 152552, + 152495, + 152529, + 152546, + 152521, + 152538, + 152525, + 152509, + 152514, + 152514, + 152526, + 152580, + 152612, + 152548, + 152553, + 152554, + 152509, + 152526, + 152586, + 152526, + 152609, + 152520, + 152524, + 152520, + 152531, + 152551, + 152569, + 152510, + 152511, + 152511, + 152532, + 152559, + 152546, + 152518, + 152526, + 152512, + 152541, + 152569, + 152571, + 152541, + 152513, + 152583, + 152538, + 152538, + 152508, + 152532, + 152577, + 152530, + 152516, + 152536, + 152564, + 152520, + 152541, + 152518, + 152513, + 152540, + 152532, + 152530, + 152520, + 152516, + 152559, + 152526, + 152550, + 152506, + 152513, + 152566, + 152540, + 152529, + 152529, + 152533, + 152559, + 152503, + 152510, + 152567, + 152534, + 152522, + 152542, + 152565, + 152528, + 152562, + 152546, + 152550, + 152566, + 152519, + 152537, + 152554, + 152577, + 152502, + 152535, + 152520, + 152533, + 152531, + 152501, + 152744, + 152508, + 152557, + 152541, + 152492, + 152565, + 152506, + 152524, + 152542, + 152570, + 152562, + 152530, + 152513, + 152526, + 152575, + 152513, + 152546, + 152518, + 152568, + 152539, + 152543, + 152579, + 152518, + 152512, + 152513, + 152559, + 152521, + 152586, + 152560, + 152526, + 152490, + 152541, + 152523, + 152516, + 152512, + 152548, + 152493, + 152529, + 152520, + 152518, + 152535, + 152506, + 152535, + 152518, + 152531, + 152497, + 152561, + 152540, + 152554, + 152542, + 152528, + 152518, + 152561, + 152504, + 152556, + 152530, + 152527, + 152578, + 152518, + 152521, + 152554, + 152543, + 152566, + 152525, + 152517, + 152549, + 152537, + 152493, + 152523, + 152503, + 152572, + 152547, + 152529, + 152500, + 152510, + 152541, + 152525, + 152523, + 152524, + 152503, + 152520, + 152535, + 152531, + 152563, + 152507, + 152531, + 152551, + 152547, + 152544, + 152531, + 152497, + 152533, + 152547, + 152572, + 152540, + 152529, + 152508, + 152521, + 152506, + 152533, + 152508, + 152569, + 152544, + 152543, + 152533, + 152549, + 152555, + 152488, + 152509, + 152530, + 152520, + 152558, + 152541, + 152545, + 152557, + 152511, + 152522, + 152516, + 152559, + 152528, + 152540, + 152507, + 152541, + 152537, + 152534, + 152504, + 152527, + 152524, + 152501, + 152532, + 152579, + 152549, + 152533, + 152536, + 152496, + 152523, + 152532, + 152537, + 152502, + 152519, + 152532, + 152623, + 152574, + 152507, + 152532, + 152505, + 152507, + 152513, + 152546, + 152540, + 152508, + 152539, + 152533, + 152514, + 152564, + 152532, + 152512, + 152537, + 152543, + 152511, + 152505, + 152524, + 152505, + 152541, + 152560, + 152504, + 152567, + 152551, + 152519, + 152494, + 152550, + 152534, + 152535, + 152525, + 152516, + 152533, + 152538, + 152515, + 152553, + 152569, + 152521, + 152529, + 152587, + 152518, + 152530, + 152501, + 152531, + 152528, + 152541, + 152545, + 152544, + 152537, + 152504, + 152587, + 152521, + 152521, + 152537, + 152574, + 152526, + 152509, + 152548, + 152511, + 152543, + 152524, + 152551, + 152535, + 152547, + 152520, + 152510, + 152579, + 152549, + 152541, + 152522, + 152545, + 152545, + 152531, + 152469, + 152516, + 152512, + 152537, + 152541, + 152546, + 152528, + 152542, + 152530, + 152535, + 152526, + 152535, + 152554, + 152546, + 152511, + 152555, + 152542, + 152504, + 152509, + 152528, + 152563, + 152519, + 152547, + 152577, + 152516, + 152515, + 152579, + 152502, + 152528, + 152523, + 152512, + 152518, + 152533, + 152520, + 152585, + 152522, + 152527, + 152545, + 152533, + 152546, + 152529, + 152564, + 152564, + 152510, + 152501, + 152541, + 152532, + 152509, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 154527, + 154464, + 154488, + 154492, + 154500, + 154500, + 154466, + 154508, + 154494, + 154487, + 154555, + 154502, + 154529, + 154466, + 154514, + 154574, + 154522, + 154502, + 154470, + 154481, + 154540, + 154502, + 154479, + 154481, + 154502, + 154509, + 154516, + 154513, + 154484, + 154504, + 154519, + 154512, + 154476, + 154472, + 154523, + 154551, + 154480, + 154463, + 154489, + 154467, + 154482, + 154469, + 154472, + 154524, + 154509, + 154499, + 154545, + 154544, + 154492, + 154476, + 154472, + 154462, + 154517, + 154486, + 154476, + 154515, + 154495, + 154516, + 154506, + 154513, + 154487, + 154487, + 154487, + 154488, + 154521, + 154474, + 154511, + 154477, + 154510, + 154516, + 154504, + 154503, + 154486, + 154515, + 154473, + 154509, + 154478, + 154548, + 154487, + 154511, + 154498, + 154502, + 154506, + 154502, + 154492, + 154526, + 154517, + 154500, + 154556, + 154487, + 154466, + 154500, + 154511, + 154481, + 154474, + 154524, + 154493, + 154507, + 154486, + 154503, + 154518, + 154500, + 154482, + 154504, + 154507, + 154493, + 154502, + 154487, + 154475, + 154479, + 154489, + 154485, + 154492, + 154525, + 154519, + 154484, + 154515, + 154476, + 154505, + 154495, + 154478, + 154489, + 154478, + 154499, + 154503, + 154497, + 154496, + 154521, + 154500, + 154527, + 154497, + 154472, + 154505, + 154497, + 154501, + 154505, + 154494, + 154479, + 154520, + 154505, + 154533, + 154499, + 154502, + 154497, + 154464, + 154493, + 154510, + 154482, + 154498, + 154482, + 154480, + 154476, + 154497, + 154490, + 154492, + 154491, + 154475, + 154566, + 154488, + 154491, + 154497, + 154465, + 154497, + 154480, + 154479, + 154506, + 154531, + 154476, + 154465, + 154499, + 154510, + 154525, + 154517, + 154529, + 154464, + 154497, + 154494, + 154493, + 154496, + 154488, + 154507, + 154490, + 154515, + 154473, + 154473, + 154489, + 154579, + 154497, + 154514, + 154478, + 154496, + 154563, + 154504, + 154494, + 154470, + 154488, + 154480, + 154498, + 154498, + 154509, + 154492, + 154524, + 154500, + 154513, + 154471, + 154498, + 154495, + 154471, + 154496, + 154497, + 154502, + 154492, + 154486, + 154496, + 154511, + 154493, + 154504, + 154481, + 154500, + 154454, + 154499, + 154505, + 154488, + 154487, + 154516, + 154531, + 154499, + 154473, + 154472, + 154466, + 154524, + 154478, + 154495, + 154484, + 154501, + 154526, + 154529, + 154452, + 154504, + 154536, + 154523, + 154497, + 154487, + 154595, + 154490, + 154521, + 154523, + 154458, + 154503, + 154508, + 154771, + 154484, + 154539, + 154510, + 154504, + 154486, + 154493, + 154488, + 154494, + 154511, + 154503, + 154530, + 154499, + 154497, + 154521, + 154497, + 154484, + 154514, + 154485, + 154464, + 154518, + 154509, + 154494, + 154537, + 154493, + 154485, + 154520, + 154507, + 154497, + 154495, + 154483, + 154495, + 154517, + 154545, + 154515, + 154553, + 154497, + 154506, + 154531, + 154507, + 154503, + 154509, + 154514, + 154502, + 154489, + 154491, + 154482, + 154469, + 154493, + 154502, + 154476, + 154498, + 154510, + 154515, + 154502, + 154470, + 154489, + 154507, + 154522, + 154507, + 154511, + 154482, + 154464, + 154458, + 154521, + 154495, + 154510, + 154493, + 154563, + 154493, + 154498, + 154481, + 154536, + 154501, + 154517, + 154495, + 154500, + 154499, + 154466, + 154514, + 154498, + 154527, + 154518, + 154498, + 154503, + 154480, + 154494, + 154525, + 154527, + 154509, + 154544, + 154523, + 154481, + 154480, + 154464, + 154531, + 154496, + 154497, + 154496, + 154530, + 154532, + 154491, + 154600, + 154497, + 154545, + 154514, + 154562, + 154482, + 154503, + 154521, + 154483, + 154515, + 154543, + 154496, + 154478, + 154479, + 154487, + 154477, + 154475, + 154469, + 154510, + 154461, + 154497, + 154523, + 154528, + 154539, + 154527, + 154477, + 154479, + 154513, + 154543, + 154484, + 154550, + 154484, + 154509, + 154492, + 154476, + 154501, + 154475, + 154480, + 154517, + 154456, + 154484, + 154488, + 154485, + 154488, + 154462, + 154523, + 154455, + 154505, + 154495, + 154486, + 154503, + 154482, + 154481, + 154520, + 154499, + 154485, + 154507, + 154500, + 154488, + 154499, + 154484, + 154485, + 154504, + 154483, + 154470, + 154536, + 154499, + 154539, + 154490, + 154473, + 154456, + 154492, + 154487, + 154477, + 154481, + 154531, + 154511, + 154495, + 154503, + 154510, + 154496, + 154545, + 154523, + 154516, + 154552, + 154471, + 154475, + 154533, + 154499, + 154522, + 154508, + 154476, + 154508, + 154485, + 154504, + 154467, + 154546, + 154509, + 154483, + 154495, + 154477, + 154519, + 154526, + 154501, + 154596, + 154497, + 154490, + 154496, + 154593, + 154477, + 154471, + 154499, + 154483, + 154474, + 154503, + 154487, + 154528, + 154509, + 154513, + 154503, + 154521, + 154509, + 154490, + 154511, + 154492, + 154524, + 154492, + 154480, + 154494, + 154502, + 154576, + 154511, + 154527, + 154505, + 154479, + 154499, + 154484, + 154508, + 154488, + 154493, + 154481, + 154523, + 154470, + 154491, + 154472, + 154488, + 154516, + 154498, + 154493, + 154479, + 154508, + 154530, + 154473, + 154503, + 154478, + 154497, + 154518, + 154482, + 154467, + 154480, + 154532, + 154499, + 154555, + 154534, + 154479, + 154488, + 154511, + 154497, + 154480, + 154482, + 154555, + 154455, + 154478, + 154496, + 154510, + 154482, + 154478, + 154524, + 154468, + 154535, + 154512, + 154519, + 154500, + 154505, + 154495, + 154509, + 154527, + 154518, + 154502, + 154504, + 154469, + 154504, + 154605, + 154513, + 154515, + 154518, + 154519, + 154511, + 154491, + 154467, + 154514, + 154493, + 154512, + 154508, + 154514, + 154521, + 154511, + 154449, + 154503, + 154476, + 154472, + 154475, + 154470, + 154511, + 154504, + 154500, + 154512, + 154506, + 154474, + 154516, + 154537, + 154500, + 154541, + 154494, + 154488, + 154473, + 154502, + 154506, + 154500, + 154533, + 154453, + 154452, + 154511, + 154517, + 154475, + 154488, + 154463, + 154482, + 154507, + 154521, + 154500, + 154477, + 154494, + 154481, + 154483, + 154504, + 154501, + 154482, + 154521, + 154486, + 154496, + 154507, + 154501, + 154525, + 154474, + 154487, + 154501, + 154501, + 154461, + 154460, + 154454, + 154516, + 154493, + 154481, + 154499, + 154489, + 154466, + 154470, + 154484, + 154496, + 154520, + 154515, + 154472, + 154512, + 154459, + 154535, + 154538, + 154520, + 154532, + 154471, + 154468, + 154507, + 154514, + 154520, + 154478, + 154480, + 154538, + 154483, + 154519, + 154498, + 154491, + 154486, + 154506, + 154525, + 154513, + 154527, + 154513, + 154488, + 154483, + 154496, + 154460, + 154511, + 154484, + 154505, + 154503, + 154553, + 154536, + 154503, + 154497, + 154501, + 154491, + 154508, + 154544, + 154476, + 154486, + 154496, + 154490, + 154524, + 154512, + 154504, + 154492, + 154465, + 154472, + 154517, + 154532, + 154511, + 154512, + 154561, + 154492, + 154544, + 154518, + 154498, + 154478, + 154503, + 154513, + 154472, + 154501, + 154490, + 154491, + 154485, + 154496, + 154544, + 154505, + 154496, + 154501, + 154453, + 154543, + 154495, + 154464, + 154490, + 154504, + 154521, + 154502, + 154483, + 154518, + 154490, + 154513, + 154485, + 154512, + 154503, + 154476, + 154498, + 154482, + 154493, + 154511, + 154490, + 154533, + 154471, + 154487, + 154493, + 154471, + 154513, + 154493, + 154513, + 154524, + 154488, + 154498, + 154477, + 154521, + 154479, + 154479, + 154490, + 154481, + 154483, + 154545, + 154488, + 154456, + 154495, + 154535, + 154516, + 154505, + 154497, + 154518, + 154503, + 154511, + 154510, + 154500, + 154477, + 154540, + 154473, + 154509, + 154514, + 154495, + 154495, + 154490, + 154504, + 154501, + 154516, + 154494, + 154522, + 154533, + 154492, + 154490, + 154531, + 154508, + 154523, + 154485, + 154496, + 154514, + 154480, + 154519, + 154523, + 154487, + 154509, + 154539, + 154506, + 154504, + 154495, + 154500, + 154527, + 154509, + 154499, + 154500, + 154504, + 154520, + 154488, + 154495, + 154512, + 154523, + 154484, + 154508, + 154479, + 154477, + 154504, + 154511, + 154501, + 154475, + 154506, + 154523, + 154525, + 154504, + 154551, + 154486, + 154512, + 154501, + 154520, + 154542, + 154549, + 154479, + 154513, + 154493, + 154509, + 154507, + 154503, + 154597, + 154503, + 154490, + 154521, + 154558, + 154518, + 154541, + 154488, + 154481, + 154487, + 154534, + 154466, + 154476, + 154518, + 154495, + 154509, + 154518, + 154498, + 154518, + 154491, + 154517, + 154489, + 154505, + 154509, + 154451, + 154491, + 154478, + 154491, + 154501, + 154522, + 154507, + 154503, + 154504, + 154508, + 154472, + 154461, + 154515, + 154499, + 154502, + 154497, + 154491, + 154478, + 154522, + 154483, + 154498, + 154485, + 154528, + 154510, + 154524, + 154494, + 154490, + 154528, + 154485, + 154479, + 154537, + 154493, + 154526, + 154500, + 154488, + 154471, + 154511, + 154542, + 154476, + 154497, + 154536, + 154562, + 154496, + 154510, + 154502, + 154467, + 154480, + 154488, + 154481, + 154503, + 154510, + 154482, + 154495, + 154500, + 154515, + 154497, + 154530, + 154499, + 154508, + 154572, + 154482, + 154538, + 154495, + 154527, + 154536, + 154508, + 154486, + 154507, + 154507, + 154535, + 154494, + 154515, + 154533, + 154520, + 154499, + 154498, + 154526, + 154525, + 154534, + 154541, + 154536, + 154496, + 154489, + 154507, + 154503, + 154526, + 154533, + 154509, + 154531, + 154490, + 154512, + 154486, + 154494, + 154508, + 154534, + 154484, + 154553, + 154485, + 154488, + 154488, + 154489, + 154524, + 154528, + 154476, + 154514, + 154476, + 154503, + 154547, + 154530, + 154491, + 154485, + 154479, + 154483, + 154523, + 154502, + 154483, + 154469, + 154505, + 154480, + 154502, + 154532, + 154540, + 154517, + 154468, + 154514, + 154483, + 154505, + 154487, + 154521, + 154488, + 154518, + 154485, + 154472, + 154512, + 154517, + 154534, + 154506, + 154501, + 154530, + 154468, + 154493, + 154479, + 154559, + 154474, + 154510, + 154475, + 154484, + 154513, + 154511, + 154470, + 154515, + 154532, + 154468, + 154519, + 154475, + 154520, + 154487, + 154481, + 154475, + 154487, + 154507, + 154510, + 154493, + 154518, + 154481, + 154516, + 154544, + 154515, + 154512, + 154518, + 154479, + 154531, + 154495, + 154466, + 154494, + 154501, + 154487, + 154526, + 154524, + 154504, + 154492, + 154541, + 154492, + 154548, + 154477, + 154501, + 154508, + 154522, + 154472, + 154477, + 154467, + 154482, + 154477, + 154520, + 154481, + 154477, + 154496, + 154494, + 154512, + 154494, + 154518, + 154509, + 154506, + 154507, + 154529, + 154511, + 154521, + 154519, + 154521, + 154527, + 154502, + 154482, + 154530, + 154490, + 154507, + 154507, + 154478, + 154509, + 154486, + 154498, + 154487, + 154496, + 154531, + 154502, + 154492, + 154513, + 154560, + 154494, + 154498, + 154503, + 154490, + 154460, + 154503, + 154502, + 154510, + 154508, + 154491, + 154505, + 154509, + 154507, + 154499, + 154538, + 154510, + 154492, + 154498, + 154492, + 154488, + 154517, + 154496, + 154474, + 154516, + 154508, + 154493, + 154481, + 154473, + 154541, + 154474, + 154528, + 154535, + 154502, + 154554, + 154523, + 154507, + 154479, + 154550, + 154498, + 154464, + 154474, + 154556, + 154495, + 154529, + 154497, + 154478, + 154506, + 154485, + 154496, + 154522, + 154525, + 154534, + 154519, + 154496, + 154511, + 154494, + 154477, + 154529, + 154487, + 154543, + 154478, + 154477, + 154479, + 154520, + 154539, + 154513, + 154504, + 154491, + 154462, + 154494, + 154520, + 154488, + 154469, + 154495, + 154483, + 154475, + 154507, + 154520, + 154521, + 154478, + 154498, + 154483, + 154543, + 154529, + 154486, + 154510, + 154481, + 154506, + 154505, + 154520, + 154502, + 154485, + 154540, + 154518, + 154501, + 154463, + 154484, + 154525, + 154473, + 154516, + 154467, + 154525, + 154492, + 154464, + 154494, + 154497, + 154534, + 154505, + 154515, + 154521, + 154505, + 154479, + 154499, + 154491, + 154500, + 154489, + 154545, + 154523, + 154478, + 154479, + 154534, + 154460, + 154501, + 154484, + 154493, + 154511, + 154491, + 154487, + 154487, + 154498, + 154501, + 154503, + 154475, + 154498, + 154485, + 154496, + 154494, + 154503, + 154522, + 154499, + 154489, + 154495, + 154507, + 154511, + 154515, + 154484, + 154550, + 154491, + 154505, + 154512, + 154506, + 154494, + 154521, + 154473, + 154519, + 154492, + 154494, + 154486, + 154522, + 154500, + 154504, + 154491, + 154488, + 154484, + 154462, + 154508, + 154482, + 154516, + 154547, + 154500, + 154487, + 154557, + 154490, + 154496, + 154536, + 154497, + 154515, + 154459, + 154521, + 154474, + 154517, + 154485, + 154482, + 154455, + 154457, + 154483, + 154501, + 154539, + 154510, + 154481, + 154485, + 154491, + 154450, + 154526, + 154491, + 154480, + 154480, + 154507, + 154498, + 154503, + 154458, + 154535, + 154486, + 154534, + 154470, + 154513, + 154511, + 154527, + 154542, + 154479, + 154494, + 154484, + 154471, + 154505, + 154536, + 154506, + 154481, + 154479, + 154499, + 154499, + 154561, + 154495, + 154493, + 154480, + 154546, + 154494, + 154464, + 154512, + 154499, + 154489, + 154500, + 154492, + 154478, + 154518, + 154517, + 154515, + 154493, + 154501, + 154483, + 154484, + 154507, + 154497, + 154500, + 154504, + 154514, + 154485, + 154510, + 154529, + 154468, + 154493, + 154518, + 154515, + 154540, + 154530, + 154489, + 154478, + 154475, + 154487, + 154485, + 154529, + 154505, + 154480, + 154523, + 154494, + 154502, + 154523, + 154511, + 154503, + 154515, + 154512, + 154510, + 154501, + 154509, + 154504, + 154506, + 154492, + 154497, + 154514, + 154505, + 154481, + 154500, + 154491, + 154497, + 154573, + 154487, + 154498, + 154487, + 154492, + 154501, + 154460, + 154477, + 154493, + 154500, + 154552, + 154487, + 154480, + 154482, + 154499, + 154521, + 154485, + 154520, + 154470, + 154473, + 154470, + 154524, + 154479, + 154525, + 154476, + 154487, + 154453, + 154519, + 154507, + 154480, + 154521, + 154514, + 154485, + 154447, + 154523, + 154484, + 154534, + 154560, + 154493, + 154488, + 154475, + 154472, + 154514, + 154505, + 154505, + 154503, + 154515, + 154474, + 154493, + 154477, + 154523, + 154489, + 154493, + 154460, + 154461, + 154482, + 154517, + 154466, + 154504, + 154506, + 154507, + 154482, + 154498, + 154503, + 154491, + 154474, + 154489, + 154481, + 154490, + 154525, + 154479, + 154525, + 154498, + 154541, + 154493, + 154507, + 154512, + 154478, + 154501, + 154503, + 154506, + 154481, + 154563, + 154522, + 154481, + 154492, + 154483, + 154472, + 154509, + 154483, + 154500, + 154502, + 154504, + 154477, + 154512, + 154492, + 154510, + 154485, + 154490, + 154508, + 154484, + 154480, + 154513, + 154489, + 154507, + 154527, + 154484, + 154497, + 154484, + 154475, + 154506, + 154492, + 154534, + 154514, + 154532, + 154467, + 154473, + 154484, + 154520, + 154518, + 154470, + 154487, + 154481, + 154460, + 154477, + 154505, + 154523, + 154519, + 154479, + 154495, + 154510, + 154465, + 154473, + 154495, + 154522, + 154483, + 154528, + 154506, + 154514, + 154518, + 154510, + 154472, + 154483, + 154525, + 154500, + 154500, + 154490, + 154499, + 154503, + 154539, + 154497, + 154471, + 154513, + 154489, + 154501, + 154512, + 154488, + 154465, + 154485, + 154498, + 154530, + 154508, + 154492, + 154491, + 154497, + 154511, + 154489, + 154509, + 154501, + 154491, + 154508, + 154539, + 154514, + 154536, + 154479, + 154492, + 154504, + 154499, + 154532, + 154539, + 154516, + 154500, + 154477, + 154467, + 154507, + 154482, + 154506, + 154526, + 154479, + 154490, + 154537, + 154481, + 154556, + 154504, + 154480, + 154514, + 154489, + 154542, + 154520, + 154494, + 154480, + 154473, + 154488, + 154510, + 154496, + 154522, + 154507, + 154521, + 154511, + 154462, + 154524, + 154504, + 154514, + 154484, + 154529, + 154496, + 154490, + 154483, + 154492, + 154480, + 154515, + 154476, + 154536, + 154524, + 154465, + 154507, + 154521, + 154485, + 154515, + 154510, + 154572, + 154482, + 154486, + 154478, + 154512, + 154517, + 154494, + 154480, + 154501, + 154507, + 154539, + 154458, + 154505, + 154501, + 154527, + 154491, + 154519, + 154476, + 154528, + 154467, + 154484, + 154505, + 154503, + 154520, + 154480, + 154483, + 154471, + 154490, + 154504, + 154522, + 154514, + 154491, + 154492, + 154511, + 154515, + 154476, + 154515, + 154529, + 154503, + 154528, + 154473, + 154475, + 154476, + 154498, + 154532, + 154464, + 154467, + 154494, + 154477, + 154505, + 154495, + 154489, + 154526, + 154504, + 154515, + 154486, + 154507, + 154524, + 154501, + 154513, + 154462, + 154520, + 154532, + 154506, + 154509, + 154469, + 154464, + 154487, + 154496, + 154489, + 154488, + 154490, + 154486, + 154482, + 154518, + 154501, + 154488, + 154491, + 154481, + 154484, + 154470, + 154501, + 154477, + 154526, + 154467, + 154493, + 154521, + 154502, + 154520, + 154494, + 154475, + 154472, + 154493, + 154515, + 154470, + 154477, + 154526, + 154480, + 154503, + 154516, + 154539, + 154503, + 154514, + 154531, + 154523, + 154509, + 154507, + 154499, + 154460, + 154519, + 154468, + 154500, + 154491, + 154557, + 154482, + 154511, + 154488, + 154517, + 154500, + 154508, + 154517, + 154537, + 154527, + 154475, + 154470, + 154506, + 154484, + 154466, + 154509, + 154478, + 154485, + 154512, + 154489, + 154484, + 154501, + 154519, + 154506, + 154493, + 154466, + 154563, + 154504, + 154482, + 154477, + 154528, + 154457, + 154488, + 154514, + 154492, + 154475, + 154495, + 154504, + 154508, + 154506, + 154470, + 154481, + 154510, + 154505, + 154519, + 154480, + 154510, + 154496, + 154474, + 154461, + 154524, + 154504, + 154478, + 154471, + 154511, + 154498, + 154518, + 154648, + 154491, + 154481, + 154479, + 154559, + 154506, + 154540, + 154507, + 154515, + 154536, + 154528, + 154503, + 154473, + 154480, + 154512, + 154493, + 154472, + 154491, + 154514, + 154493, + 154518, + 154459, + 154480, + 154469, + 154473, + 154518, + 154491, + 154490, + 154503, + 154459, + 154486, + 154489, + 154485, + 154472, + 154513, + 154485, + 154525, + 154546, + 154487, + 154490, + 154500, + 154491, + 154499, + 154486, + 154513, + 154503, + 154470, + 154530, + 154468, + 154502, + 154523, + 154544, + 154500, + 154560, + 154484, + 154495, + 154487, + 154512, + 154481, + 154460, + 154509, + 154509, + 154499, + 154491, + 154490, + 154482, + 154502, + 154528, + 154508, + 154503, + 154486, + 154512, + 154476, + 154511, + 154494, + 154520, + 154475, + 154484, + 154504, + 154482, + 154498, + 154491, + 154501, + 154508, + 154508, + 154510, + 154491, + 154487, + 154495, + 154525, + 154491, + 154497, + 154469, + 154533, + 154483, + 154489, + 154508, + 154496, + 154501, + 154501, + 154485, + 154496, + 154473, + 154550, + 154450, + 154505, + 154516, + 154491, + 154533, + 154529, + 154494, + 154511, + 154532, + 154504, + 154518, + 154511, + 154566, + 154490, + 154486, + 154489, + 154488, + 154475, + 154515, + 154483, + 154487, + 154480, + 154495, + 154480, + 154507, + 154489, + 154495, + 154515, + 154508, + 154525, + 154503, + 154469, + 154469, + 154523, + 154521, + 154547, + 154480, + 154518, + 154502, + 154517, + 154462, + 154507, + 154487, + 154513, + 154493, + 154535, + 154568, + 154533, + 154471, + 154483, + 154497, + 154466, + 154476, + 154528, + 154502, + 154521, + 154514, + 154507, + 154472, + 154526, + 154498, + 154513, + 154478, + 154505, + 154493, + 154500, + 154498, + 154504, + 154497, + 154540, + 154512, + 154500, + 154492, + 154511, + 154464, + 154499, + 154504, + 154474, + 154481, + 154532, + 154508, + 154499, + 154507, + 154476, + 154523, + 154497, + 154487, + 154492, + 154526, + 154482, + 154481, + 154486, + 154500, + 154489, + 154546, + 154524, + 154539, + 154480, + 154494, + 154489, + 154505, + 154527, + 154497, + 154488, + 154501, + 154505, + 154532, + 154547, + 154537, + 154474, + 154553, + 154499, + 154502, + 154489, + 154486, + 154478, + 154491, + 154481, + 154535, + 154501, + 154552, + 154479, + 154451, + 154539, + 154482, + 154476, + 154485, + 154493, + 154486, + 154511, + 154519, + 154514, + 154521, + 154477, + 154504, + 154522, + 154483, + 154482, + 154517, + 154496, + 154498, + 154454, + 154472, + 154504, + 154465, + 154479, + 154453, + 154486, + 154496, + 154519, + 154527, + 154474, + 154514, + 154473, + 154496, + 154506, + 154533, + 154482, + 154504, + 154493, + 154521, + 154545, + 154523, + 154539, + 154527, + 154521, + 154533, + 154507, + 154496, + 154542, + 154514, + 154497, + 154523, + 154487, + 154519, + 154513, + 154527, + 154505, + 154490, + 154478, + 154472, + 154512, + 154531, + 154478, + 154532, + 154485, + 154505, + 154454, + 154455, + 154471, + 154484, + 154504, + 154465, + 154487, + 154480, + 154500, + 154511, + 154465, + 154565, + 154486, + 154507, + 154544, + 154494, + 154511, + 154522, + 154493, + 154496, + 154489, + 154499, + 154496, + 154498, + 154473, + 154492, + 154491, + 154510, + 154512, + 154500, + 154517, + 154551, + 154534, + 154476, + 154512, + 154518, + 154530, + 154543, + 154488, + 154500, + 154513, + 154486, + 154501, + 154471, + 154522, + 154513, + 154461, + 154488, + 154518, + 154492, + 154520, + 154532, + 154476, + 154523, + 154516, + 154492, + 154508, + 154514, + 154510, + 154521, + 154485, + 154493, + 154463, + 154481, + 154507, + 154503, + 154487, + 154487, + 154521, + 154488, + 154469, + 154532, + 154500, + 154491, + 154467, + 154512, + 154499, + 154508, + 154486, + 154496, + 154495, + 154502, + 154509, + 154470, + 154506, + 154514, + 154473, + 154519, + 154488, + 154501, + 154477, + 154501, + 154493, + 154533, + 154468, + 154484, + 154516, + 154481, + 154522, + 154513, + 154483, + 154521, + 154465, + 154490, + 154532, + 154481, + 154458, + 154515, + 154510, + 154534, + 154504, + 154499, + 154488, + 154504, + 154513, + 154479, + 154472, + 154468, + 154520, + 154508, + 154500, + 154491, + 154485, + 154508, + 154487, + 154524, + 154519, + 154490, + 154501, + 154471, + 154516, + 154468, + 154499, + 154470, + 154481, + 154510, + 154475, + 154468, + 154489, + 154500, + 154490, + 154520, + 154532, + 154530, + 154485, + 154471, + 154474, + 154567, + 154480, + 154476, + 154469, + 154493, + 154480, + 154526, + 154505, + 154487, + 154494, + 154476, + 154462, + 154518, + 154500, + 154482, + 154456, + 154455, + 154495, + 154521, + 154519, + 154478, + 154472, + 154466, + 154507, + 154531, + 154519, + 154504, + 154496, + 154501, + 154493, + 154500, + 154504, + 154466, + 154495, + 154502, + 154517, + 154516, + 154546, + 154512, + 154512, + 154467, + 154516, + 154514, + 154521, + 154485, + 154509, + 154499, + 154478, + 154511, + 154509, + 154510, + 154496, + 154517, + 154509, + 154505, + 154502, + 154498, + 154490, + 154502, + 154495, + 154529, + 154510, + 154529, + 154486, + 154486, + 154477, + 154486, + 154486, + 154526, + 154469, + 154518, + 154501, + 154499, + 154492, + 154497, + 154494, + 154506, + 154522, + 154489, + 154522, + 154522, + 154491, + 154486, + 154491, + 154472, + 154511, + 154520, + 154515, + 154469, + 154534, + 154554, + 154501, + 154531, + 154497, + 154457, + 154516, + 154475, + 154496, + 154534, + 154466, + 154487, + 154510, + 154492, + 154498, + 154481, + 154500, + 154504, + 154524, + 154529, + 154497, + 154492, + 154529, + 154488, + 154521, + 154506, + 154506, + 154512, + 154489, + 154474, + 154549, + 154474, + 154526, + 154528, + 154481, + 154513, + 154487, + 154495, + 154493, + 154525, + 154483, + 154491, + 154582, + 154519, + 154499, + 154519, + 154488, + 154482, + 154518, + 154492, + 154521, + 154494, + 154509, + 154524, + 154533, + 154459, + 154519, + 154517, + 154541, + 154528, + 154469, + 154504, + 154499, + 154478, + 154477, + 154491, + 154482, + 154542, + 154519, + 154514, + 154485, + 154493, + 154524, + 154535, + 154531, + 154478, + 154485, + 154503, + 154518, + 154483, + 154500, + 154488, + 154483, + 154465, + 154518, + 154509, + 154487, + 154482, + 154469, + 154499, + 154474, + 154520, + 154481, + 154510, + 154481, + 154501, + 154483, + 154491, + 154493, + 154507, + 154484, + 154497, + 154481, + 154523, + 154478, + 154513, + 154492, + 154489, + 154460, + 154478, + 154494, + 154507, + 154494, + 154479, + 154467, + 154516, + 154484, + 154529, + 154490, + 154484, + 154513, + 154530, + 154529, + 154509, + 154488, + 154503, + 154506, + 154484, + 154521, + 154480, + 154487, + 154489, + 154498, + 154499, + 154503, + 154499, + 154497, + 154466, + 154484, + 154461, + 154461, + 154487, + 154501, + 154530, + 154455, + 154494, + 154517, + 154504, + 154483, + 154495, + 154490, + 154485, + 154539, + 154497, + 154501, + 154503, + 154514, + 154499, + 154545, + 154474, + 154484, + 154496, + 154497, + 154511, + 154514, + 154469, + 154501, + 154492, + 154534, + 154479, + 154509, + 154492, + 154498, + 154476, + 154472, + 154495, + 154528, + 154487, + 154517, + 154503, + 154468, + 154484, + 154488, + 154478, + 154468, + 154470, + 154480, + 154513, + 154573, + 154484, + 154526, + 154479, + 154487, + 154502, + 154478, + 154470, + 154477, + 154497, + 154542, + 154473, + 154505, + 154499, + 154459, + 154474, + 154491, + 154539, + 154500, + 154501, + 154531, + 154498, + 154499, + 154515, + 154531, + 154530, + 154517, + 154470, + 154519, + 154523, + 154494, + 154486, + 154481, + 154501, + 154563, + 154470, + 154530, + 154450, + 154478, + 154508, + 154530, + 154512, + 154500, + 154522, + 154471, + 154486, + 154493, + 154509, + 154542, + 154491, + 154465, + 154492, + 154506, + 154496, + 154516, + 154513, + 154471, + 154487, + 154507, + 154528, + 154482, + 154480, + 154494, + 154538, + 154533, + 154479, + 154478, + 154479, + 154483, + 154525, + 154492, + 154532, + 154516, + 154524, + 154478, + 154487, + 154541, + 154528, + 154493, + 154508, + 154479, + 154483, + 154504, + 154499, + 154468, + 154529, + 154491, + 154511, + 154514, + 154487, + 154455, + 154454, + 154508, + 154481, + 154504, + 154509, + 154513, + 154481, + 154474, + 154467, + 154499, + 154505, + 154522, + 154507, + 154516, + 154478, + 154514, + 154513, + 154549, + 154518, + 154470, + 154495, + 154475, + 154498, + 154519, + 154509, + 154505, + 154509, + 154513, + 154492, + 154478, + 154491, + 154479, + 154505, + 154481, + 154517, + 154480, + 154480, + 154529, + 154492, + 154500, + 154486, + 154471, + 154487, + 154474, + 154496, + 154480, + 154532, + 154501, + 154492, + 154490, + 154471, + 154500, + 154474, + 154509, + 154534, + 154569, + 154495, + 154513, + 154505, + 154502, + 154499, + 154494, + 154501, + 154456, + 154493, + 154538, + 154482, + 154484, + 154496, + 154472, + 154497, + 154498, + 154481, + 154514, + 154498, + 154464, + 154486, + 154455, + 154496, + 154462, + 154529, + 154489, + 154475, + 154479, + 154475, + 154507, + 154481, + 154492, + 154482, + 154527, + 154509, + 154486, + 154512, + 154509, + 154502, + 154478, + 154454, + 154513, + 154507, + 154514, + 154471, + 154518, + 154497, + 154488, + 154567, + 154490, + 154508, + 154483, + 154513, + 154539, + 154532, + 154496, + 154489, + 154498, + 154486, + 154501, + 154469, + 154469, + 154504, + 154514, + 154513, + 154471, + 154509, + 154499, + 154486, + 154481, + 154511, + 154493, + 154532, + 154500, + 154513, + 154468, + 154510, + 154514, + 154480, + 154513, + 154504, + 154505, + 154499, + 154457, + 154489, + 154511, + 154479, + 154509, + 154486, + 154494, + 154503, + 154472, + 154502, + 154529, + 154514, + 154465, + 154535, + 154539, + 154488, + 154485, + 154492, + 154483, + 154520, + 154476, + 154493, + 154495, + 154470, + 154481, + 154467, + 154501, + 154512, + 154500, + 154512, + 154494, + 154497, + 154503, + 154505, + 154534, + 154497, + 154502, + 154517, + 154502, + 154489, + 154476, + 154458, + 154478, + 154486, + 154504, + 154525, + 154529, + 154489, + 154508, + 154519, + 154487, + 154468, + 154481, + 154508, + 154484, + 154491, + 154504, + 154530, + 154510, + 154499, + 154548, + 154458, + 154499, + 154498, + 154471, + 154504, + 154491, + 154501, + 154490, + 154565, + 154517, + 154483, + 154472, + 154496, + 154527, + 154494, + 154504, + 154501, + 154481, + 154541, + 154465, + 154463, + 154487, + 154472, + 154708, + 154509, + 154480, + 154490, + 154488, + 154515, + 154500, + 154496, + 154520, + 154528, + 154501, + 154493, + 154461, + 154512, + 154507, + 154482, + 154498, + 154477, + 154489, + 154479, + 154488, + 154501, + 154493, + 154503, + 154524, + 154503, + 154508, + 154494, + 154522, + 154510, + 154500, + 154516, + 154509, + 154553, + 154524, + 154499, + 154460, + 154517, + 154493, + 154484, + 154492, + 154493, + 154521, + 154489, + 154475, + 154479, + 154483, + 154512, + 154534, + 154490, + 154524, + 154515, + 154482, + 154488, + 154452, + 154461, + 154508, + 154499, + 154484, + 154504, + 154490, + 154499, + 154493, + 154471, + 154526, + 154490, + 154477, + 154488, + 154460, + 154533, + 154514, + 154519, + 154504, + 154506, + 154500, + 154532, + 154539, + 154511, + 154500, + 154531, + 154505, + 154479, + 154477, + 154472, + 154521, + 154462, + 154504, + 154485, + 154503, + 154482, + 154501, + 154484, + 154501, + 154515, + 154516, + 154498, + 154480, + 154461, + 154498, + 154497, + 154524, + 154508, + 154502, + 154497, + 154496, + 154507, + 154506, + 154468, + 154481, + 154494, + 154487, + 154477, + 154517, + 154490, + 154470, + 154494, + 154489, + 154515, + 154489, + 154523, + 154505, + 154502, + 154482, + 154558, + 154505, + 154487, + 154511, + 154477, + 154489, + 154477, + 154504, + 154482, + 154494, + 154476, + 154530, + 154485, + 154488, + 154502, + 154493, + 154461, + 154506, + 154475, + 154485, + 154522, + 154476, + 154505, + 154487, + 154488, + 154463, + 154477, + 154468, + 154460, + 154517, + 154507, + 154492, + 154514, + 154474, + 154470, + 154521, + 154500, + 154456, + 154485, + 154475, + 154479, + 154486, + 154497, + 154472, + 154468, + 154528, + 154466, + 154504, + 154489, + 154486, + 154512, + 154496, + 154488, + 154508, + 154509, + 154522, + 154490, + 154480, + 154505, + 154469, + 154494, + 154522, + 154523, + 154478, + 154495, + 154487, + 154482, + 154490, + 154527, + 154538, + 154508, + 154500, + 154544, + 154540, + 154470, + 154478, + 154512, + 154504, + 154490, + 154470, + 154530, + 154476, + 154506, + 154481, + 154561, + 154540, + 154532, + 154455, + 154508, + 154483, + 154507, + 154506, + 154470, + 154465, + 154507, + 154519, + 154500, + 154502, + 154510, + 154504, + 154514, + 154525, + 154580, + 154536, + 154521, + 154482, + 154538, + 154508, + 154515, + 154501, + 154477, + 154487, + 154481, + 154509, + 154526, + 154451, + 154496, + 154470, + 154491, + 154474, + 154473, + 154483, + 154512, + 154494, + 154511, + 154496, + 154488, + 154484, + 154680, + 154535, + 154510, + 154485, + 154524, + 154491, + 154513, + 154519, + 154473, + 154479, + 154528, + 154476, + 154511, + 154498, + 154490, + 154470, + 154509, + 154480, + 154459, + 154493, + 154487, + 154513, + 154472, + 154483, + 154470, + 154495, + 154509, + 154502, + 154531, + 154493, + 154514, + 154536, + 154485, + 154484, + 154518, + 154482, + 154501, + 154484, + 154506, + 154520, + 154517, + 154478, + 154487, + 154500, + 154510, + 154501, + 154504, + 154494, + 154484, + 154507, + 154492, + 154515, + 154502, + 154481, + 154502, + 154539, + 154505, + 154548, + 154499, + 154485, + 154518, + 154503, + 154515, + 154493, + 154474, + 154493, + 154495, + 154505, + 154488, + 154512, + 154502, + 154496, + 154562, + 154498, + 154555, + 154499, + 154552, + 154501, + 154534, + 154517, + 154498, + 154484, + 154482, + 154502, + 154543, + 154493, + 154469, + 154503, + 154543, + 154481, + 154500, + 154513, + 154507, + 154490, + 154472, + 154479, + 154481, + 154527, + 154517, + 154481, + 154534, + 154493, + 154494, + 154494, + 154503, + 154503, + 154514, + 154467, + 154479, + 154515, + 154492, + 154478, + 154529, + 154500, + 154475, + 154516, + 154495, + 154500, + 154485, + 154484, + 154496, + 154466, + 154512, + 154514, + 154460, + 154479, + 154490, + 154476, + 154497, + 154527, + 154483, + 154464, + 154533, + 154473, + 154505, + 154492, + 154526, + 154481, + 154503, + 154482, + 154470, + 154493, + 154489, + 154478, + 154495, + 154495, + 154494, + 154496, + 154502, + 154482, + 154486, + 154498, + 154470, + 154485, + 154504, + 154467, + 154518, + 154466, + 154508, + 154499, + 154471, + 154478, + 154506, + 154503, + 154512, + 154480, + 154508, + 154479, + 154502, + 154500, + 154500, + 154486, + 154479, + 154525, + 154475, + 154498, + 154496, + 154511, + 154497, + 154495, + 154473, + 154504, + 154464, + 154525, + 154530, + 154522, + 154506, + 154481, + 154515, + 154499, + 154525, + 154480, + 154497, + 154512, + 154469, + 154498, + 154518, + 154478, + 154521, + 154519, + 154488, + 154499, + 154518, + 154472, + 154489, + 154494, + 154546, + 154500, + 154521, + 154552, + 154482, + 154520, + 154499, + 154478, + 154494, + 154508, + 154483, + 154531, + 154484, + 154501, + 154511, + 154479, + 154537, + 154517, + 154504, + 154458, + 154481, + 154483, + 154475, + 154495, + 154499, + 154500, + 154516, + 154497, + 154493, + 154491, + 154501, + 154489, + 154517, + 154478, + 154480, + 154484, + 154483, + 154464, + 154512, + 154460, + 154489, + 154529, + 154502, + 154498, + 154517, + 154527, + 154494, + 154494, + 154462, + 154486, + 154510, + 154524, + 154501, + 154479, + 154544, + 154483, + 154498, + 154504, + 154468, + 154501, + 154469, + 154480, + 154497, + 154520, + 154487, + 154513, + 154509, + 154471, + 154540, + 154538, + 154494, + 154531, + 154514, + 154504, + 154501, + 154531, + 154472, + 154477, + 154494, + 154481, + 154497, + 154503, + 154465, + 154497, + 154545, + 154511, + 154533, + 154556, + 154513, + 154494, + 154530, + 154509, + 154507, + 154494, + 154563, + 154523, + 154475, + 154549, + 154510, + 154490, + 154488, + 154494, + 154475, + 154495, + 154492, + 154539, + 154468, + 154511, + 154496, + 154477, + 154537, + 154516, + 154493, + 154467, + 154464, + 154483, + 154525, + 154523, + 154492, + 154511, + 154508, + 154500, + 154510, + 154505, + 154503, + 154509, + 154495, + 154514, + 154498, + 154526, + 154522, + 154530, + 154493, + 154526, + 154496, + 154492, + 154519, + 154510, + 154486, + 154490, + 154516, + 154524, + 154520, + 154513, + 154475, + 154543, + 154518, + 154481, + 154503, + 154514, + 154476, + 154505, + 154540, + 154515, + 154488, + 154494, + 154465, + 154492, + 154518, + 154496, + 154474, + 154487, + 154493, + 154477, + 154500, + 154495, + 154505, + 154498, + 154492, + 154479, + 154501, + 154509, + 154469, + 154493, + 154475, + 154480, + 154516, + 154489, + 154525, + 154520, + 154479, + 154511, + 154485, + 154479, + 154512, + 154509, + 154477, + 154498, + 154521, + 154495, + 154452, + 154537, + 154535, + 154465, + 154482, + 154513, + 154528, + 154522, + 154471, + 154489, + 154530, + 154512, + 154554, + 154477, + 154540, + 154506, + 154503, + 154497, + 154533, + 154485, + 154505, + 154497, + 154461, + 154511, + 154497, + 154488, + 154501, + 154516, + 154508, + 154487, + 154504, + 154505, + 154501, + 154486, + 154514, + 154534, + 154493, + 154483, + 154525, + 154539, + 154524, + 154499, + 154507, + 154488, + 154491, + 154523, + 154499, + 154506, + 154507, + 154519, + 154478, + 154515, + 154506, + 154477, + 154475, + 154468, + 154474, + 154466, + 154480, + 154464, + 154481, + 154472, + 154499, + 154484, + 154474, + 154534, + 154506, + 154480, + 154478, + 154545, + 154506, + 154474, + 154535, + 154482, + 154559, + 154527, + 154509, + 154527, + 154492, + 154483, + 154469, + 154491, + 154487, + 154461, + 154480, + 154535, + 154486, + 154507, + 154510, + 154470, + 154470, + 154496, + 154482, + 154478, + 154510, + 154473, + 154499, + 154494, + 154502, + 154475, + 154482, + 154476, + 154484, + 154508, + 154480, + 154462, + 154483, + 154495, + 154456, + 154471, + 154474, + 154546, + 154534, + 154461, + 154572, + 154496, + 154475, + 154466, + 154522, + 154483, + 154493, + 154515, + 154479, + 154516, + 154539, + 154466, + 154454, + 154505, + 154521, + 154493, + 154501, + 154477, + 154480, + 154506, + 154530, + 154498, + 154532, + 154487, + 154501, + 154516, + 154488, + 154504, + 154517, + 154485, + 154493, + 154486, + 154460, + 154485, + 154486, + 154495, + 154519, + 154519, + 154494, + 154492, + 154522, + 154500, + 154497, + 154537, + 154514, + 154483, + 154507, + 154515, + 154545, + 154500, + 154471, + 154481, + 154503, + 154548, + 154516, + 154501, + 154478, + 154521, + 154510, + 154504, + 154508, + 154481, + 154510, + 154519, + 154487, + 154472, + 154498, + 157098, + 154485, + 154476, + 154512, + 154474, + 154506, + 154506, + 154489, + 154530, + 154505, + 154478, + 154491, + 154510, + 154523, + 154535, + 154520, + 154515, + 154493, + 154484, + 154478, + 154576, + 154559, + 154485, + 154508, + 154492, + 154482, + 154491, + 154545, + 154483, + 154475, + 154479, + 154506, + 154575, + 154502, + 154509, + 154509, + 154472, + 154469, + 154517, + 154511, + 154447, + 154489, + 154507, + 154467, + 154494, + 154494, + 154450, + 154481, + 154526, + 154476, + 154487, + 154485, + 154514, + 154494, + 154483, + 154488, + 154492, + 154539, + 154511, + 154487, + 154518, + 154539, + 154517, + 154506, + 154505, + 154513, + 154514, + 154470, + 154514, + 154510, + 154474, + 154528, + 154479, + 154466, + 154492, + 154488, + 154557, + 154489, + 154474, + 154480, + 154466, + 154506, + 154520, + 154443, + 154467, + 154508, + 154479, + 154524, + 154518, + 154534, + 154494, + 154490, + 154510, + 154495, + 154512, + 154477, + 154475, + 154501, + 154524, + 154498, + 154524, + 154490, + 154487, + 154520, + 154510, + 154532, + 154490, + 154536, + 154516, + 154509, + 154489, + 154514, + 154525, + 154520, + 154469, + 154489, + 154523, + 154489, + 154516, + 154481, + 154483, + 154492, + 154512, + 154507, + 154542, + 154521, + 154535, + 154503, + 154503, + 154486, + 154460, + 154504, + 154491, + 154509, + 154487, + 154497, + 154596, + 154472, + 154480, + 154478, + 154502, + 154486, + 154495, + 154514, + 154510, + 154478, + 154509, + 154511, + 154508, + 154513, + 154501, + 154512, + 154481, + 154512, + 154536, + 154530, + 154474, + 154491, + 154474, + 154583, + 154527, + 154484, + 154483, + 154498, + 154522, + 154527, + 154522, + 154502, + 154484, + 154484, + 154484, + 154533, + 154490, + 154495, + 154461, + 154519, + 154473, + 154488, + 154510, + 154471, + 154470, + 154471, + 154498, + 154484, + 154505, + 154480, + 154521, + 154533, + 154480, + 154474, + 154508, + 154556, + 154485, + 154499, + 154513, + 154509, + 154472, + 154508, + 154470, + 154486, + 154528, + 154501, + 154481, + 154480, + 154501, + 154478, + 154482, + 154525, + 154524, + 154529, + 154533, + 154476, + 154464, + 154491, + 154474, + 154499, + 154513, + 154516, + 154479, + 154574, + 154496, + 154463, + 154486, + 154502, + 154502, + 154505, + 154503, + 154503, + 154490, + 154480, + 154477, + 154564, + 154506, + 154488, + 154503, + 154522, + 154497, + 154496, + 154507, + 154521, + 154521, + 154496, + 154497, + 154524, + 154519, + 154494, + 154478, + 154485, + 154519, + 154490, + 154510, + 154497, + 154514, + 154464, + 154469, + 154479, + 154489, + 154551, + 154475, + 154544, + 154489, + 154491, + 154523, + 154504, + 154482, + 154506, + 154485, + 154502, + 154491, + 154469, + 154490, + 154499, + 154503, + 154504, + 154533, + 154513, + 154513, + 154527, + 154480, + 154506, + 154511, + 154510, + 154539, + 154524, + 154520, + 154504, + 154473, + 154508, + 154520, + 154509, + 154510, + 154488, + 154501, + 154523, + 154502, + 154487, + 154498, + 154497, + 154547, + 154474, + 154522, + 154534, + 154507, + 154490, + 154497, + 154507, + 154483, + 154471, + 154511, + 154522, + 154518, + 154506, + 154520, + 154498, + 154496, + 154489, + 154505, + 154517, + 154557, + 154497, + 154518, + 154502, + 154494, + 154502, + 154540, + 154507, + 154508, + 154505, + 154502, + 154480, + 154516, + 154571, + 154561, + 154535, + 154510, + 154509, + 154520, + 154523, + 154515, + 154547, + 154537, + 154478, + 154483, + 154522, + 154497, + 154521, + 154504, + 154514, + 154487, + 154481, + 154515, + 154505, + 154494, + 154508, + 154511, + 154460, + 154505, + 154528, + 154523, + 154539, + 154494, + 154484, + 154496, + 154495, + 154499, + 154504, + 154498, + 154483, + 154491, + 154514, + 154489, + 154543, + 154482, + 154462, + 154499, + 154534, + 154504, + 154471, + 154497, + 154489, + 154517, + 154507, + 154470, + 154552, + 154473, + 154498, + 154551, + 154472, + 154458, + 154511, + 154553, + 154524, + 154507, + 154500, + 154503, + 154491, + 154483, + 154496, + 154502, + 154497, + 154512, + 154493, + 154514, + 154490, + 154474, + 154484, + 154478, + 154473, + 154494, + 154503, + 154503, + 154531, + 154527, + 154525, + 154546, + 154463, + 154553, + 154491, + 154527, + 154525, + 154510, + 154544, + 154507, + 154481, + 154488, + 154487, + 154506, + 154493, + 154507, + 154512, + 154485, + 154509, + 154527, + 154476, + 154499, + 154482, + 154512, + 154497, + 154493, + 154477, + 154469, + 154498, + 154500, + 154475, + 154484, + 154477, + 154496, + 154526, + 154510, + 154504, + 154501, + 154511, + 154497, + 154496, + 154503, + 154498, + 154485, + 154509, + 154506, + 154520, + 154508, + 154487, + 154477, + 154504, + 154517, + 154492, + 154495, + 154565, + 154524, + 154479, + 154474, + 154499, + 154493, + 154509, + 154514, + 154503, + 154501, + 154492, + 154553, + 154489, + 154483, + 154479, + 154478, + 154507, + 154509, + 154466, + 154452, + 154475, + 154515, + 154509, + 154472, + 154518, + 154509, + 154516, + 154475, + 154485, + 154514, + 154506, + 154521, + 154506, + 154535, + 154524, + 154482, + 154546, + 154532, + 154510, + 154532, + 154539, + 154505, + 154540, + 154465, + 154505, + 154497, + 154511, + 154480, + 154505, + 154494, + 154522, + 154503, + 154504, + 154519, + 154474, + 154450, + 154528, + 154496, + 154473, + 154503, + 154483, + 154528, + 154475, + 154457, + 154521, + 154510, + 154501, + 154471, + 154533, + 154474, + 154488, + 154517, + 154480, + 154505, + 154497, + 154496, + 154523, + 154480, + 154502, + 154542, + 154541, + 154492, + 154534, + 154503, + 154469, + 154546, + 154496, + 154499, + 154533, + 154512, + 154503, + 154478, + 154474, + 154520, + 154502, + 154519, + 154465, + 154493, + 154527, + 154523, + 154479, + 154474, + 154480, + 154500, + 154481, + 154491, + 154467, + 154566, + 154463, + 154486, + 154507, + 154507, + 154500, + 154607, + 154513, + 154537, + 154555, + 154489, + 154508, + 154486, + 154517, + 154483, + 154473, + 154478, + 154504, + 154510, + 154501, + 154504, + 154495, + 154535, + 154483, + 154478, + 154488, + 154470, + 154510, + 154535, + 154566, + 154521, + 154518, + 154521, + 154479, + 154540, + 154503, + 154481, + 154508, + 154496, + 154496, + 154514, + 154533, + 154504, + 154496, + 154519, + 154489, + 154512, + 154568, + 154533, + 154496, + 154554, + 154496, + 154508, + 154507, + 154472, + 154477, + 154506, + 154479, + 154501, + 154466, + 154507, + 154497, + 154477, + 154491, + 154489, + 154520, + 154468, + 154497, + 154502, + 154460, + 154472, + 154505, + 154507, + 154477, + 154467, + 154509, + 154471, + 154505, + 154502, + 154511, + 154502, + 154536, + 154493, + 154516, + 154531, + 154482, + 154497, + 154502, + 154511, + 154484, + 154486, + 154508, + 154495, + 154489, + 154532, + 154509, + 154485, + 154486, + 154520, + 154511, + 154511, + 154525, + 154486, + 154509, + 154472, + 154494, + 154503, + 154519, + 154502, + 154480, + 154476, + 154541, + 154502, + 154533, + 154523, + 154502, + 154497, + 154498, + 154505, + 154494, + 154533, + 154501, + 154486, + 154490, + 154490, + 154477, + 154528, + 154487, + 154510, + 154493, + 154526, + 154562, + 154544, + 154464, + 154493, + 154479, + 154474, + 154487, + 154545, + 154493, + 154462, + 154464, + 154474, + 154529, + 154469, + 154519, + 154494, + 154493, + 154498, + 154480, + 154510, + 154587, + 154545, + 154514, + 154493, + 154511, + 154499, + 154471, + 154459, + 154517, + 154478, + 154503, + 154483, + 154527, + 154494, + 154467, + 154479, + 154512, + 154478, + 154500, + 154509, + 154474, + 154481, + 154473, + 154499, + 154532, + 154475, + 154492, + 154485, + 154490, + 154503, + 154496, + 154495, + 154479, + 154467, + 154498, + 154494, + 154490, + 154483, + 154495, + 154532, + 154503, + 154508, + 154505, + 154507, + 154483, + 154477, + 154483, + 154509, + 154523, + 154464, + 154506, + 154469, + 154498, + 154506, + 154535, + 154487, + 154496, + 154486, + 154494, + 154508, + 154549, + 154474, + 154517, + 154504, + 154502, + 154511, + 154492, + 154501, + 154473, + 154503, + 154476, + 154500, + 154487, + 154469, + 154481, + 154520, + 154486, + 154527, + 154540, + 154534, + 154462, + 154502, + 154505, + 154492, + 154508, + 154490, + 154508, + 154520, + 154493, + 154466, + 154504, + 154538, + 154529, + 154505, + 154479, + 154498, + 154506, + 154462, + 154509, + 154501, + 154532, + 154472, + 154505, + 154528, + 154501, + 154493, + 154525, + 154524, + 154485, + 154485, + 154510, + 154503, + 154524, + 154477, + 154464, + 154476, + 154489, + 154545, + 154491, + 154473, + 154488, + 154496, + 154560, + 154495, + 154515, + 154505, + 154497, + 154501, + 154486, + 154477, + 154490, + 154478, + 154519, + 154516, + 154520, + 154505, + 154515, + 154477, + 154468, + 154489, + 154494, + 154542, + 154473, + 154476, + 154473, + 154513, + 154454, + 154519, + 154478, + 154487, + 154474, + 154460, + 154466, + 154490, + 154501, + 154479, + 154502, + 154500, + 154446, + 154507, + 154491, + 154471, + 154474, + 154500, + 154499, + 154537, + 154511, + 154506, + 154485, + 154492, + 154475, + 154505, + 154492, + 154508, + 154486, + 154472, + 154516, + 154496, + 154516, + 154481, + 154467, + 154473, + 154508, + 154469, + 154481, + 154517, + 154499, + 154494, + 154486, + 154515, + 154474, + 154518, + 154530, + 154495, + 154505, + 154502, + 154487, + 154473, + 154494, + 154503, + 154500, + 154496, + 154513, + 154507, + 154482, + 154512, + 154485, + 154472, + 154463, + 154517, + 154479, + 154464, + 154502, + 154467, + 154499, + 154461, + 154477, + 154543, + 154520, + 154460, + 154570, + 154484, + 154516, + 154459, + 154539, + 154504, + 154517, + 154463, + 154468, + 154513, + 154519, + 154513, + 154506, + 154468, + 154490, + 154491, + 154471, + 154512, + 154503, + 154478, + 154492, + 154496, + 154471, + 154480, + 154516, + 154478, + 154500, + 154485, + 154482, + 154523, + 154502, + 154479, + 154484, + 154527, + 154522, + 154551, + 154509, + 154482, + 154476, + 154529, + 154485, + 154497, + 154500, + 154528, + 154509, + 154504, + 154489, + 154515, + 154467, + 154536, + 154508, + 154470, + 154476, + 154515, + 154534, + 154492, + 154478, + 154538, + 154518, + 154534, + 154503, + 154527, + 154533, + 154469, + 154541, + 154475, + 154526, + 154530, + 154497, + 154490, + 154471, + 154497, + 154530, + 154490, + 154484, + 154495, + 154494, + 154485, + 154502, + 154504, + 154500, + 154497, + 154530, + 154498, + 154502, + 154479, + 154499, + 154565, + 154475, + 154477, + 154509, + 154473, + 154516, + 154458, + 154483, + 154535, + 154499, + 154461, + 154513, + 154579, + 154492, + 154481, + 154531, + 154479, + 154490, + 154464, + 154492, + 154488, + 154529, + 154506, + 154512, + 154520, + 154470, + 154471, + 154536, + 154513, + 154517, + 154492, + 154481, + 154503, + 154472, + 154529, + 154512, + 154488, + 154501, + 154481, + 154480, + 154476, + 154537, + 154486, + 154497, + 154525, + 154490, + 154506, + 154470, + 154521, + 154500, + 154513, + 154523, + 154497, + 154497, + 154502, + 154475, + 154528, + 154521, + 154490, + 154467, + 154494, + 154504, + 154521, + 154485, + 154488, + 154490, + 154511, + 154504, + 154522, + 154545, + 154474, + 154474, + 154516, + 154475, + 154495, + 154482, + 154483, + 154528, + 154478, + 154530, + 154497, + 154496, + 154478, + 154474, + 154456, + 154474, + 154496, + 154556, + 154497, + 154473, + 154477, + 154506, + 154559, + 154469, + 154502, + 154490, + 154487, + 154499, + 154518, + 154544, + 154493, + 154498, + 154541, + 154508, + 154505, + 154469, + 154491, + 154510, + 154531, + 154522, + 154522, + 154472, + 154495, + 154501, + 154519, + 154495, + 154500, + 154480, + 154475, + 154502, + 154542, + 154498, + 154493, + 154537, + 154554, + 154586, + 154471, + 154501, + 154500, + 154513, + 154489, + 154504, + 154517, + 154459, + 154550, + 154473, + 154510, + 154465, + 154489, + 154496, + 154528, + 154500, + 154471, + 154527, + 154517, + 154560, + 154477, + 154515, + 154495, + 154460, + 154490, + 154503, + 154528, + 154496, + 154478, + 154494, + 154516, + 154500, + 154505, + 154461, + 154456, + 154512, + 154464, + 154488, + 154472, + 154536, + 154455, + 154460, + 154515, + 154527, + 154516, + 154511, + 154487, + 154461, + 154538, + 154499, + 154516, + 154515, + 154479, + 154465, + 154519, + 154477, + 154479, + 154509, + 154475, + 154468, + 154525, + 154483, + 154484, + 154551, + 154509, + 154460, + 154495, + 154515, + 154502, + 154495, + 154470, + 154465, + 154506, + 154488, + 154501, + 154516, + 154471, + 154506, + 154538, + 154492, + 154503, + 154493, + 154505, + 154508, + 154485, + 154462, + 154472, + 154482, + 154505, + 154499, + 154535, + 154471, + 154522, + 154549, + 154488, + 154487, + 154495, + 154503, + 154538, + 154480, + 154488, + 154472, + 154476, + 154509, + 154465, + 154491, + 154476, + 154533, + 154454, + 154513, + 154490, + 154471, + 154528, + 154490, + 154505, + 154521, + 154509, + 154521, + 154470, + 154491, + 154490, + 154483, + 154503, + 154482, + 154470, + 154518, + 154478, + 154492, + 154509, + 154502, + 154516, + 154470, + 154494, + 154513, + 154505, + 154529, + 154497, + 154492, + 154476, + 154493, + 154481, + 154479, + 154509, + 154492, + 154496, + 154475, + 154500, + 154514, + 154490, + 154474, + 154453, + 154484, + 154487, + 154496, + 154491, + 154540, + 154519, + 154512, + 154495, + 154492, + 154492, + 154482, + 154492, + 154488, + 154544, + 154525, + 154458, + 154487, + 154476, + 154509, + 154522, + 154504, + 154519, + 154469, + 154521, + 154454, + 154509, + 154480, + 154461, + 154493, + 154485, + 154518, + 154476, + 154505, + 154524, + 154480, + 154523, + 154498, + 154507, + 154468, + 154470, + 154500, + 154497, + 154480, + 154503, + 154497, + 154488, + 154529, + 154484, + 154476, + 154492, + 154510, + 154497, + 154486, + 154550, + 154477, + 154475, + 154478, + 154521, + 154500, + 154478, + 154480, + 154534, + 154502, + 154485, + 154516, + 154499, + 154496, + 154472, + 154539, + 154535, + 154474, + 154464, + 154492, + 154515, + 154507, + 154462, + 154475, + 154470, + 154465, + 154461, + 154469, + 154487, + 154489, + 154539, + 154497, + 154477, + 154493, + 154512, + 154507, + 154486, + 154537, + 154495, + 154463, + 154508, + 154517, + 154495, + 154515, + 154507, + 154521, + 154490, + 154499, + 154519, + 154536, + 154525, + 154491, + 154516, + 154491, + 154529, + 154507, + 154475, + 154496, + 154528, + 154505, + 154486, + 154511, + 154478, + 154519, + 154498, + 154495, + 154486, + 154503, + 154512, + 154499, + 154483, + 154530, + 154507, + 154495, + 154506, + 154506, + 154474, + 154467, + 154486, + 154504, + 154481, + 154501, + 154492, + 154491, + 154477, + 154543, + 154468, + 154545, + 154479, + 154512, + 154496, + 154499, + 154503, + 154524, + 154471, + 154505, + 154543, + 154496, + 154492, + 154500, + 154463, + 154496, + 154495, + 154478, + 154513, + 154496, + 154537, + 154480, + 154504, + 154526, + 154525, + 154521, + 154494, + 154505, + 154482, + 154476, + 154506, + 154512, + 154508, + 154521, + 154499, + 154488, + 154502, + 154484, + 154453, + 154467, + 154468, + 154477, + 154478, + 154494, + 154495, + 154477, + 154514, + 154524, + 154490, + 154478, + 154495, + 154513, + 154527, + 154512, + 154513, + 154483, + 154501, + 154489, + 154488, + 154478, + 154512, + 154538, + 154528, + 154507, + 154492, + 154529, + 154483, + 154546, + 154487, + 154490, + 154544, + 154536, + 154515, + 154492, + 154522, + 154474, + 154493, + 154504, + 154509, + 154478, + 154498, + 154504, + 154512, + 154462, + 154484, + 154476, + 154482, + 154491, + 154474, + 154528, + 154501, + 154525, + 154510, + 154494, + 154498, + 154489, + 154485, + 154501, + 154481, + 154505, + 154481, + 154495, + 154528, + 154473, + 154490, + 154532, + 154489, + 154484, + 154484, + 154534, + 154572, + 154480, + 154478, + 154492, + 154464, + 154511, + 154528, + 154471, + 154473, + 154454, + 154476, + 154514, + 154481, + 154459, + 154478, + 154532, + 154474, + 154501, + 154504, + 154505, + 154490, + 154491, + 154588, + 154477, + 154503, + 154526, + 154549, + 154496, + 154497, + 154515, + 154463, + 154506, + 154527, + 154525, + 154507, + 154529, + 154498, + 154502, + 154468, + 154503, + 154500, + 154478, + 154494, + 154459, + 154509, + 154478, + 154501, + 154475, + 154464, + 154494, + 154520, + 154503, + 154530, + 154492, + 154504, + 154492, + 154453, + 154503, + 154502, + 154512, + 154504, + 154558, + 154509, + 154492, + 154520, + 154530, + 154530, + 154507, + 154508, + 154483, + 154459, + 154491, + 154505, + 154507, + 154480, + 154512, + 154530, + 154521, + 154525, + 154494, + 154508, + 154507, + 154527, + 154516, + 154491, + 154499, + 154500, + 154501, + 154510, + 154529, + 154520, + 154512, + 154490, + 154470, + 154504, + 154524, + 154510, + 154518, + 154520, + 154486, + 154508, + 154519, + 154490, + 154534, + 154476, + 154512, + 154521, + 154482, + 154494, + 154489, + 154481, + 154497, + 154501, + 154489, + 154509, + 154466, + 154500, + 154514, + 154506, + 154493, + 154494, + 154482, + 154497, + 154494, + 154482, + 154524, + 154518, + 154472, + 154509, + 154505, + 154496, + 154606, + 154514, + 154465, + 154516, + 154482, + 154472, + 154519, + 154497, + 154497, + 154489, + 154497, + 154535, + 154481, + 154495, + 154492, + 154494, + 154516, + 154547, + 154515, + 154479, + 154506, + 154511, + 154506, + 154535, + 154516, + 154473, + 154513, + 154501, + 154510, + 154547, + 154483, + 154490, + 154514, + 154492, + 154547, + 154507, + 154520, + 154498, + 154502, + 154501, + 154488, + 154519, + 154500, + 154587, + 154498, + 154493, + 154498, + 154479, + 154509, + 154468, + 154476, + 154481, + 154494, + 154510, + 154501, + 154477, + 154483, + 154544, + 154497, + 154459, + 154518, + 154518, + 154492, + 154500, + 154512, + 154481, + 154513, + 154489, + 154529, + 154469, + 154524, + 154485, + 154493, + 154490, + 154485, + 154500, + 154505, + 154498, + 154501, + 154519, + 154501, + 154476, + 154467, + 154500, + 154496, + 154496, + 154532, + 154492, + 154511, + 154473, + 154470, + 154512, + 154520, + 154479, + 154485, + 154509, + 154492, + 154484, + 154480, + 154451, + 154500, + 154477, + 154526, + 154503, + 154519, + 154478, + 154488, + 154502, + 154479, + 154515, + 154464, + 154480, + 154490, + 154499, + 154485, + 154493, + 154542, + 154518, + 154509, + 154512, + 154482, + 154504, + 154516, + 154478, + 154527, + 154488, + 154484, + 154485, + 154479, + 154523, + 154508, + 154477, + 154537, + 154497, + 154485, + 154512, + 154468, + 154515, + 154482, + 154528, + 154489, + 154483, + 154497, + 154528, + 154523, + 154513, + 154492, + 154490, + 154471, + 154553, + 154499, + 154485, + 154467, + 154537, + 154530, + 154453, + 154484, + 154554, + 154494, + 154525, + 154505, + 154499, + 154519, + 154494, + 154465, + 154501, + 154513, + 154508, + 154517, + 154515, + 154517, + 154467, + 154500, + 154495, + 154477, + 154502, + 154512, + 154480, + 154491, + 154508, + 154473, + 154509, + 154473, + 154543, + 154491, + 154494, + 154503, + 154504, + 154508, + 154499, + 154485, + 154492, + 154474, + 154534, + 154493, + 154458, + 154471, + 154496, + 154521, + 154490, + 154522, + 154518, + 154493, + 154495, + 154546, + 154469, + 154491, + 154462, + 154496, + 154487, + 154515, + 154463, + 154493, + 154591, + 154490, + 154500, + 154499, + 154469, + 154479, + 154485, + 154496, + 154472, + 154497, + 154516, + 154512, + 154502, + 154508, + 154502, + 154483, + 154471, + 154475, + 154505, + 154505, + 154494, + 154478, + 154526, + 154476, + 154464, + 154531, + 154478, + 154520, + 154522, + 154521, + 154476, + 154488, + 154506, + 154538, + 154492, + 154522, + 154503, + 154513, + 154486, + 154509, + 154502, + 154477, + 154511, + 154459, + 154477, + 154488, + 154519, + 154477, + 154557, + 154471, + 154478, + 154509, + 154536, + 154462, + 154492, + 154465, + 154488, + 154502, + 154518, + 154479, + 154486, + 154499, + 154487, + 154519, + 154528, + 154504, + 154455, + 154487, + 154477, + 154524, + 154491, + 154525, + 154466, + 154502, + 154498, + 154489, + 154492, + 154496, + 154460, + 154471, + 154480, + 154522, + 154489, + 154462, + 154517, + 154464, + 154504, + 154520, + 154483, + 154529, + 154525, + 154463, + 154488, + 154506, + 154532, + 154472, + 154508, + 154488, + 154464, + 154525, + 154513, + 154497, + 154462, + 154488, + 154492, + 154518, + 154519, + 154477, + 154512, + 154469, + 154518, + 154505, + 154508, + 154489, + 154529, + 154519, + 154476, + 154502, + 154472, + 154501, + 154500, + 154540, + 154503, + 154471, + 154496, + 154510, + 154517, + 154479, + 154488, + 154494, + 154499, + 154506, + 154498, + 154481, + 154501, + 154505, + 154499, + 154504, + 154487, + 154490, + 154523, + 154490, + 154539, + 154495, + 154464, + 154475, + 154464, + 154488, + 154486, + 154469, + 154525, + 154508, + 154501, + 154508, + 154514, + 154473, + 154507, + 154517, + 154516, + 154494, + 154482, + 154523, + 154475, + 154503, + 154507, + 154485, + 154485, + 154476, + 154503, + 154518, + 154495, + 154519, + 154533, + 154501, + 154488, + 154503, + 154509, + 154499, + 154489, + 154469, + 154488, + 154515, + 154539, + 154521, + 154514, + 154476, + 154483, + 154513, + 154513, + 154483, + 154483, + 154495, + 154472, + 154506, + 154476, + 154502, + 154477, + 154476, + 154482, + 154518, + 154501, + 154489, + 154480, + 154496, + 154490, + 154485, + 154512, + 154486, + 154549, + 154498, + 154488, + 154486, + 154502, + 154470, + 154505, + 154538, + 154476, + 154483, + 154491, + 154497, + 154562, + 154505, + 154488, + 154492, + 154514, + 154505, + 154492, + 154519, + 154494, + 154520, + 154517, + 154500, + 154505, + 154491, + 154514, + 154505, + 154495, + 154481, + 154504, + 154487, + 154524, + 154517, + 154497, + 154521, + 154503, + 154461, + 154547, + 154524, + 154532, + 154497, + 154559, + 154513, + 154515, + 154489, + 154505, + 154502, + 154502, + 154506, + 154481, + 154509, + 154500, + 154500, + 154504, + 154475, + 154484, + 154494, + 154500, + 154531, + 154543, + 154461, + 154515, + 154495, + 154517, + 154461, + 154504, + 154505, + 154493, + 154488, + 154504, + 154515, + 154480, + 154486, + 154480, + 154484, + 154473, + 154515, + 154490, + 154485, + 154479, + 154486, + 154520, + 154473, + 154507, + 154476, + 154506, + 154505, + 154502, + 154502, + 154516, + 154478, + 154530, + 154486, + 154496, + 154480, + 154493, + 154483, + 154495, + 154520, + 154527, + 154508, + 154490, + 154505, + 154514, + 154524, + 154506, + 154527, + 154494, + 154478, + 154515, + 154527, + 154466, + 154527, + 154495, + 154468, + 154468, + 154502, + 154507, + 154468, + 154535, + 154488, + 154507, + 154512, + 154495, + 154507, + 154473, + 154533, + 154500, + 154522, + 154502, + 154498, + 154550, + 154470, + 154488, + 154519, + 154488, + 154497, + 154539, + 154462, + 154513, + 154551, + 154470, + 154512, + 154488, + 154510, + 154536, + 154489, + 154487, + 154477, + 154484, + 154485, + 154451, + 154484, + 154523, + 154505, + 154492, + 154468, + 154496, + 154530, + 154498, + 154487, + 154505, + 154519, + 154490, + 154501, + 154516, + 154551, + 154478, + 154471, + 154489, + 154497, + 154486, + 154507, + 154502, + 154492, + 154491, + 154514, + 154476, + 154478, + 154460, + 154497, + 154478, + 154517, + 154513, + 154536, + 154510, + 154458, + 154520, + 154519, + 154509, + 154475, + 154495, + 154495, + 154488, + 154525, + 154486, + 154509, + 154509, + 154477, + 154521, + 154509, + 154525, + 154503, + 154498, + 154491, + 154529, + 154478, + 154495, + 154504, + 154483, + 154539, + 154532, + 154567, + 154496, + 154518, + 154480, + 154501, + 154481, + 154499, + 154490, + 154488, + 154518, + 154513, + 154494, + 154450, + 154509, + 154508, + 154475, + 154484, + 154490, + 154484, + 154487, + 154541, + 154499, + 154496, + 154504, + 154475, + 154502, + 154500, + 154516, + 154474, + 154466, + 154493, + 154481, + 154496, + 154496, + 154503, + 154507, + 154516, + 154491, + 154485, + 154472, + 154487, + 154475, + 154506, + 154502, + 154517, + 154517, + 154484, + 154505, + 154527, + 154488, + 154521, + 154543, + 154481, + 154508, + 154497, + 154512, + 154481, + 154488, + 154475, + 154485, + 154508, + 154476, + 154477, + 154528, + 154505, + 154507, + 154487, + 154508, + 154534, + 154525, + 154549, + 154509, + 154520, + 154479, + 154496, + 154496, + 154471, + 154504, + 154498, + 154503, + 154488, + 154517, + 154465, + 154467, + 154480, + 154508, + 154535, + 154502, + 154492, + 154503, + 154540, + 154490, + 154539, + 154519, + 154477, + 154481, + 154527, + 154523, + 154496, + 154501, + 154544, + 154495, + 154495, + 154494, + 154496, + 154470, + 154489, + 154499, + 154472, + 154482, + 154491, + 154495, + 154483, + 154477, + 154495, + 154469, + 154500, + 154485, + 154457, + 154476, + 154509, + 154512, + 154490, + 154473, + 154485, + 154508, + 154515, + 154550, + 154547, + 154524, + 154473, + 154527, + 154482, + 154517, + 154492, + 154513, + 154528, + 154499, + 154505, + 154492, + 154525, + 154510, + 154531, + 154484, + 154484, + 154494, + 154481, + 154501, + 154494, + 154526, + 154499, + 154497, + 154500, + 154515, + 154489, + 154509, + 154474, + 154504, + 154524, + 154513, + 154501, + 154497, + 154517, + 154489, + 154493, + 154481, + 154522, + 154494, + 154529, + 154488, + 154548, + 154503, + 154480, + 154510, + 154478, + 154493, + 154516, + 154531, + 154482, + 154503, + 154486, + 154473, + 154480, + 154503, + 154489, + 154516, + 154506, + 154486, + 154476, + 154489, + 154488, + 154533, + 154523, + 154528, + 154518, + 154486, + 154485, + 154509, + 154471, + 154511, + 154498, + 154485, + 154490, + 154545, + 154504, + 154492, + 154492, + 154502, + 154533, + 154515, + 154507, + 154506, + 154470, + 154473, + 154476, + 154475, + 154462, + 154534, + 154469, + 154472, + 154483, + 154464, + 154489, + 154520, + 154486, + 154515, + 154535, + 154500, + 154505, + 154493, + 154539, + 154563, + 154494, + 154500, + 154506, + 154500, + 154471, + 154474, + 154518, + 154478, + 154482, + 154528, + 154484, + 154501, + 154462, + 154545, + 154547, + 154501, + 154542, + 154465, + 154493, + 154459, + 154497, + 154489, + 154489, + 154516, + 154472, + 154468, + 154481, + 154518, + 154495, + 154477, + 154499, + 154490, + 154497, + 154490, + 154507, + 154484, + 154494, + 154507, + 154507, + 154498, + 154535, + 154496, + 154518, + 154474, + 154517, + 154512, + 154468, + 154473, + 154497, + 154532, + 154511, + 154501, + 154516, + 154502, + 154494, + 154481, + 154492, + 154516, + 154498, + 154510, + 154556, + 154529, + 154497, + 154502, + 154517, + 154479, + 154453, + 154520, + 154449, + 154512, + 154480, + 154522, + 154512, + 154488, + 154511, + 154472, + 154513, + 154533, + 154491, + 154449, + 154512, + 154495, + 154522, + 154495, + 154477, + 154511, + 154511, + 154514, + 154520, + 154485, + 154518, + 154488, + 154501, + 154473, + 154508, + 154475, + 154484, + 154513, + 154474, + 154487, + 154519, + 154532, + 154485, + 154497, + 154504, + 154501, + 154515, + 154497, + 154476, + 154485, + 154503, + 154463, + 154468, + 154484, + 154514, + 154494, + 154507, + 154532, + 154548, + 154514, + 154540, + 154524, + 154547, + 154514, + 154514, + 154508, + 154509, + 154501, + 154515, + 154508, + 154501, + 154490, + 154509, + 154488, + 154496, + 154474, + 154539, + 154506, + 154510, + 154529, + 154510, + 154478, + 154477, + 154510, + 154515, + 154501, + 154483, + 154508, + 154581, + 154480, + 154524, + 154461, + 154515, + 154495, + 154522, + 154527, + 154508, + 154494, + 154526, + 154506, + 154518, + 154524, + 154510, + 154484, + 154468, + 154506, + 154514, + 154493, + 154468, + 154532, + 154487, + 154489, + 154489, + 154542, + 154492, + 154525, + 154554, + 154516, + 154500, + 154533, + 154501, + 154442, + 154486, + 154538, + 154466, + 154470, + 154474, + 154489, + 154481, + 154534, + 154512, + 154502, + 154515, + 154508, + 154494, + 154485, + 154477, + 154501, + 154487, + 154480, + 154510, + 154506, + 154457, + 154509, + 154503, + 154495, + 154537, + 154872, + 154503, + 154501, + 154498, + 154488, + 154502, + 154517, + 154475, + 154493, + 154473, + 154492, + 154483, + 154494, + 154522, + 154486, + 154485, + 154485, + 154481, + 154478, + 154495, + 154509, + 154515, + 154467, + 154467, + 154477, + 154527, + 154504, + 154480, + 154445, + 154493, + 154471, + 154550, + 154511, + 154528, + 154479, + 154490, + 154502, + 154513, + 154487, + 154496, + 154495, + 154488, + 154481, + 154505, + 154491, + 154503, + 154489, + 154490, + 154506, + 154528, + 154504, + 154483, + 154488, + 154527, + 154522, + 154506, + 154518, + 154482, + 154519, + 154486, + 154519, + 154491, + 154528, + 154492, + 154454, + 154509, + 154502, + 154489, + 154502, + 154517, + 154472, + 154503, + 154480, + 154531, + 154512, + 154501, + 154469, + 154517, + 154496, + 154475, + 154486, + 154504, + 154505, + 154488, + 154489, + 154496, + 154495, + 154494, + 154509, + 154507, + 154492, + 154498, + 154494, + 154468, + 154519, + 154505, + 154506, + 154530, + 154490, + 154532, + 154514, + 154509, + 154486, + 154526, + 154507, + 154468, + 154466, + 154530, + 154472, + 154500, + 154512, + 154492, + 154529, + 154516, + 154468, + 154472, + 154473, + 154483, + 154458, + 154499, + 154531, + 154499, + 154492, + 154519, + 154484, + 154492, + 154474, + 154474, + 154509, + 154494, + 154475, + 154498, + 154550, + 154489, + 154545, + 154522, + 154501, + 154507, + 154520, + 154518, + 154483, + 154512, + 154461, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 152520, + 152537, + 152535, + 152556, + 152550, + 152587, + 152579, + 152586, + 152573, + 152553, + 152540, + 152545, + 152539, + 152533, + 152533, + 152545, + 152503, + 152548, + 152549, + 152517, + 152542, + 152522, + 152499, + 152531, + 152536, + 152549, + 152535, + 152578, + 152519, + 152532, + 152535, + 152536, + 152528, + 152563, + 152543, + 152502, + 152500, + 152547, + 152530, + 152560, + 152552, + 152518, + 152509, + 152530, + 152533, + 152525, + 152543, + 152522, + 152558, + 152532, + 152538, + 152552, + 152542, + 152492, + 152554, + 152528, + 152530, + 152519, + 152537, + 152544, + 152495, + 152530, + 152571, + 152552, + 152544, + 152516, + 152564, + 152543, + 152586, + 152552, + 152517, + 152524, + 152561, + 152532, + 152494, + 152546, + 152506, + 152506, + 152538, + 152525, + 152563, + 152523, + 152528, + 152557, + 152550, + 152551, + 152521, + 152548, + 152574, + 152511, + 152539, + 152544, + 152586, + 152517, + 152548, + 152523, + 152538, + 152530, + 152525, + 152601, + 152537, + 152526, + 152529, + 152584, + 152534, + 152545, + 152510, + 152530, + 152517, + 152533, + 152521, + 152572, + 152507, + 152500, + 152559, + 152553, + 152509, + 152552, + 152540, + 152574, + 152551, + 152521, + 152541, + 152569, + 152577, + 152540, + 152505, + 152563, + 152545, + 152522, + 152554, + 152512, + 152539, + 152540, + 152520, + 152528, + 152556, + 152579, + 152541, + 152542, + 152537, + 152504, + 152539, + 152527, + 152531, + 152564, + 152516, + 152501, + 152548, + 152509, + 152538, + 152541, + 152547, + 152542, + 152535, + 152550, + 152554, + 152582, + 152533, + 152560, + 152539, + 152552, + 152510, + 152553, + 152515, + 152561, + 152545, + 152540, + 152537, + 152544, + 152543, + 152527, + 152501, + 152569, + 152519, + 152548, + 152531, + 152506, + 152543, + 152526, + 152536, + 152523, + 152529, + 152510, + 152559, + 152529, + 152584, + 152565, + 152530, + 152540, + 152551, + 152527, + 152527, + 152593, + 152559, + 152530, + 152519, + 152530, + 152516, + 152526, + 152540, + 152536, + 152610, + 152533, + 152555, + 152540, + 152522, + 152559, + 152542, + 152560, + 152541, + 152533, + 152511, + 152545, + 152513, + 152523, + 152520, + 152493, + 152518, + 152546, + 152548, + 152549, + 152605, + 152534, + 152502, + 152505, + 152522, + 152590, + 152523, + 152553, + 152505, + 152555, + 152547, + 152559, + 152516, + 152537, + 152565, + 152516, + 152542, + 152538, + 152533, + 152563, + 152517, + 152508, + 152558, + 152546, + 152521, + 152585, + 152503, + 152522, + 152548, + 152574, + 152507, + 152531, + 152544, + 152529, + 152570, + 152532, + 152505, + 152520, + 152524, + 152544, + 152521, + 152541, + 152568, + 152520, + 152541, + 152559, + 152538, + 152543, + 152522, + 152558, + 152557, + 152541, + 152513, + 152532, + 152523, + 152509, + 152521, + 152538, + 152527, + 152531, + 152514, + 152562, + 152537, + 152524, + 152556, + 152559, + 152535, + 152554, + 152526, + 152547, + 152554, + 152576, + 152551, + 152522, + 152542, + 152544, + 152520, + 152525, + 152546, + 152552, + 152558, + 152534, + 152546, + 152520, + 152565, + 152499, + 152529, + 152525, + 152549, + 152529, + 152549, + 152529, + 152524, + 152518, + 152513, + 152521, + 152565, + 152552, + 152549, + 152566, + 152532, + 152514, + 152560, + 152572, + 152544, + 152536, + 152519, + 152601, + 152577, + 152548, + 152569, + 152608, + 152559, + 152484, + 152524, + 152598, + 152602, + 152587, + 152555, + 152575, + 152515, + 152511, + 152535, + 152535, + 152550, + 152502, + 152542, + 152539, + 152523, + 152552, + 152524, + 152549, + 152550, + 152521, + 152553, + 152568, + 152504, + 152536, + 152519, + 152519, + 152583, + 152565, + 152548, + 152519, + 152518, + 152537, + 152532, + 152570, + 152548, + 152586, + 152523, + 152575, + 152528, + 152510, + 152561, + 152527, + 152584, + 152549, + 152571, + 152539, + 152589, + 152578, + 152546, + 152573, + 152531, + 152528, + 152538, + 152500, + 152573, + 152552, + 152531, + 152534, + 152572, + 152576, + 152584, + 152553, + 152575, + 152513, + 152518, + 152561, + 152550, + 152522, + 152550, + 152539, + 152560, + 152543, + 152543, + 152614, + 152527, + 152535, + 152524, + 152514, + 152548, + 152533, + 152532, + 152522, + 152531, + 152565, + 152515, + 152551, + 152540, + 152535, + 152514, + 152540, + 152552, + 152526, + 152538, + 152518, + 152567, + 152513, + 152550, + 152505, + 152550, + 152540, + 152543, + 152517, + 152532, + 152571, + 152543, + 152530, + 152576, + 152574, + 152548, + 152522, + 152550, + 152553, + 152547, + 152542, + 152548, + 152541, + 152544, + 152536, + 152564, + 152509, + 152519, + 152528, + 152550, + 152539, + 152556, + 152532, + 152547, + 152529, + 152526, + 152548, + 152538, + 152551, + 152536, + 152510, + 152571, + 152575, + 152538, + 152543, + 152549, + 152531, + 152593, + 152550, + 152565, + 152534, + 152509, + 152523, + 152548, + 152518, + 152532, + 152542, + 152544, + 152494, + 152516, + 152538, + 152527, + 152516, + 152553, + 152540, + 152508, + 152534, + 152492, + 152557, + 152530, + 152520, + 152569, + 152505, + 152545, + 152525, + 152536, + 152542, + 152546, + 152514, + 152532, + 152543, + 152535, + 152523, + 152514, + 152516, + 152527, + 152532, + 152523, + 152543, + 152513, + 152509, + 152558, + 152508, + 152535, + 152505, + 152548, + 152536, + 152553, + 152554, + 152521, + 152546, + 152535, + 152561, + 152506, + 152540, + 152518, + 152543, + 152550, + 152561, + 152509, + 152548, + 152544, + 152544, + 152570, + 152532, + 152502, + 152532, + 152579, + 152517, + 152542, + 152552, + 152503, + 152513, + 152556, + 152538, + 152515, + 152508, + 152553, + 152561, + 152555, + 152542, + 152511, + 152551, + 152527, + 152543, + 152551, + 152523, + 152503, + 152541, + 152534, + 152548, + 152519, + 152547, + 152545, + 152520, + 152537, + 152526, + 152586, + 152564, + 152543, + 152540, + 152513, + 152541, + 152545, + 152553, + 152534, + 152544, + 152533, + 152538, + 152546, + 152564, + 152509, + 152535, + 152527, + 152520, + 152533, + 152529, + 152502, + 152501, + 152535, + 152504, + 152501, + 152520, + 152546, + 152577, + 152537, + 152529, + 152520, + 152530, + 152544, + 152504, + 152502, + 152528, + 152535, + 152588, + 152519, + 152549, + 152589, + 152531, + 152561, + 152541, + 152525, + 152533, + 152526, + 152536, + 152530, + 152560, + 152562, + 152525, + 152571, + 152555, + 152541, + 152538, + 152530, + 152595, + 152551, + 152534, + 152515, + 152561, + 152510, + 152519, + 152557, + 152544, + 152527, + 152570, + 152588, + 152576, + 152498, + 152532, + 152552, + 152522, + 152514, + 152525, + 152497, + 152539, + 152553, + 152545, + 152521, + 152511, + 152524, + 152517, + 152520, + 152532, + 152560, + 152542, + 152504, + 152511, + 152552, + 152522, + 152554, + 152550, + 152503, + 152543, + 152548, + 152568, + 152512, + 152550, + 152546, + 152564, + 152511, + 152541, + 152557, + 152545, + 152538, + 152497, + 152537, + 152560, + 152549, + 152520, + 152556, + 152566, + 152526, + 152525, + 152516, + 152544, + 152521, + 152515, + 152525, + 152539, + 152547, + 152553, + 152547, + 152558, + 152499, + 152533, + 152528, + 152534, + 152513, + 152547, + 152542, + 152522, + 152540, + 152537, + 152516, + 152509, + 152555, + 152510, + 152536, + 152545, + 152497, + 152537, + 152547, + 152520, + 152537, + 152563, + 152514, + 152544, + 152538, + 152536, + 152529, + 152561, + 152569, + 152548, + 152532, + 152531, + 152571, + 152545, + 152553, + 152498, + 152516, + 152538, + 152495, + 152517, + 152522, + 152490, + 152523, + 152530, + 152524, + 152496, + 152555, + 152510, + 152541, + 152545, + 152563, + 152524, + 152537, + 152562, + 152550, + 152537, + 152554, + 152531, + 152530, + 152536, + 152508, + 152509, + 152564, + 152538, + 152545, + 152551, + 152502, + 152535, + 152549, + 152520, + 152528, + 152523, + 152543, + 152507, + 152542, + 152538, + 152545, + 152497, + 152527, + 152556, + 152555, + 152544, + 152529, + 152526, + 152524, + 152533, + 152505, + 152542, + 152536, + 152521, + 152555, + 152588, + 152530, + 152584, + 152531, + 152559, + 152541, + 152524, + 152561, + 152510, + 152523, + 152494, + 152545, + 152520, + 152569, + 152555, + 152512, + 152522, + 152510, + 152513, + 152527, + 152529, + 152512, + 152517, + 152524, + 152544, + 152495, + 152526, + 152515, + 152536, + 152513, + 152556, + 152552, + 152497, + 152563, + 152531, + 152539, + 152521, + 152507, + 152520, + 152543, + 152540, + 152532, + 152543, + 152508, + 152569, + 152564, + 152523, + 152512, + 152571, + 152510, + 152553, + 152532, + 152510, + 152523, + 152546, + 152567, + 152539, + 152513, + 152510, + 152556, + 152539, + 152529, + 152520, + 152556, + 152512, + 152518, + 152527, + 152526, + 152531, + 152513, + 152551, + 152531, + 152521, + 152552, + 152525, + 152545, + 152524, + 152543, + 152520, + 152495, + 152559, + 152549, + 152545, + 152537, + 152541, + 152540, + 152511, + 152541, + 152515, + 152531, + 152513, + 152554, + 152505, + 152548, + 152588, + 152530, + 152535, + 152555, + 152555, + 152534, + 152539, + 152535, + 152520, + 152574, + 152537, + 152557, + 152549, + 152571, + 152515, + 152550, + 152520, + 152545, + 152523, + 152514, + 152558, + 152534, + 152538, + 152513, + 152549, + 152563, + 152555, + 152505, + 152504, + 152538, + 152565, + 152510, + 152546, + 152547, + 152549, + 152543, + 152509, + 152493, + 152581, + 152504, + 152521, + 152541, + 152514, + 152490, + 152534, + 152534, + 152540, + 152546, + 152506, + 152557, + 152549, + 152524, + 152509, + 152554, + 152562, + 152523, + 152549, + 152531, + 152544, + 152577, + 152532, + 152560, + 152522, + 152533, + 152555, + 152539, + 152501, + 152539, + 152513, + 152562, + 152550, + 152545, + 152553, + 152517, + 152540, + 152517, + 152526, + 152567, + 152568, + 152563, + 152587, + 152523, + 152510, + 152505, + 152544, + 152555, + 152523, + 152535, + 152523, + 152506, + 152499, + 152544, + 152519, + 152521, + 152511, + 152533, + 152546, + 152519, + 152512, + 152529, + 152524, + 152535, + 152532, + 152528, + 152543, + 152555, + 152526, + 152538, + 152520, + 152532, + 152565, + 152523, + 152538, + 152535, + 152539, + 152541, + 152522, + 152578, + 152553, + 152645, + 152513, + 152512, + 152540, + 152539, + 152515, + 152491, + 152520, + 152559, + 152539, + 152531, + 152528, + 152530, + 152556, + 152529 + ], + "sample_count": 15277 + }, + { + "pubkey": "76aSq1QhuSdnbE9iDbQSCxu6WanJ4LdG2ByTQ43JtWub", + "epoch": 89, + "origin_device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "target_device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "link_pk": "4f6tmVrFNFCgaBixqC3BiyZYYmvBzqd8vv5j1aBGTPia", + "origin_device_location_pk": "8ivCSPhAs6WwbWY5WR7GCQiChEVcK2kpoj97MugLPwcg", + "target_device_location_pk": "CJsM8xrShT5YCR8VbaLKR3dDZMA24X9XkMeBKh6eH9z9", + "origin_device_agent_pk": "D6wvvWrosxojHYjqiEXeDmnXjMjNbQdeebGgjiqUFXLk", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242126416740, + "samples": [ + 98788, + 98742, + 98745, + 98749, + 98760, + 98755, + 98760, + 98764, + 98726, + 98740, + 98719, + 98753, + 98720, + 98734, + 98779, + 98754, + 98752, + 98768, + 98735, + 98740, + 98745, + 98750, + 98739, + 98779, + 98764, + 98748, + 98762, + 98758, + 98740, + 98747, + 98767, + 98732, + 98747, + 98748, + 98729, + 98749, + 98745, + 98753, + 98766, + 98743, + 98744, + 98795, + 98794, + 98762, + 98771, + 98734, + 98772, + 98782, + 98778, + 98771, + 98776, + 98776, + 98769, + 98774, + 98759, + 98760, + 98740, + 98735, + 98747, + 98750, + 98766, + 98760, + 98778, + 98757, + 98755, + 98756, + 98766, + 98777, + 98762, + 98743, + 98762, + 98763, + 98759, + 98757, + 98760, + 98758, + 98765, + 98755, + 98744, + 98738, + 98760, + 98754, + 98746, + 98774, + 98767, + 98785, + 98756, + 98760, + 98769, + 98777, + 98737, + 98750, + 98736, + 98748, + 98751, + 98737, + 98774, + 98768, + 98770, + 98736, + 98738, + 98748, + 98774, + 98775, + 98761, + 98736, + 98756, + 98784, + 98762, + 98750, + 98762, + 98768, + 98758, + 98759, + 98971, + 98749, + 98746, + 98759, + 98818, + 98807, + 98736, + 98758, + 98762, + 98758, + 98766, + 98730, + 98758, + 98751, + 98730, + 98776, + 98763, + 98794, + 98773, + 98737, + 98762, + 98751, + 98751, + 98781, + 98739, + 98756, + 98769, + 98788, + 98767, + 98778, + 98763, + 98764, + 98759, + 98735, + 98755, + 98744, + 98763, + 98754, + 98768, + 98733, + 98778, + 98772, + 98776, + 98769, + 98776, + 98753, + 98735, + 98745, + 98733, + 98786, + 98764, + 98754, + 98767, + 98753, + 98752, + 98731, + 98779, + 98780, + 98751, + 98787, + 98779, + 98726, + 98786, + 98764, + 98733, + 98753, + 98757, + 98767, + 98754, + 98752, + 98766, + 98780, + 98762, + 98741, + 98739, + 98765, + 98762, + 98759, + 98751, + 98765, + 98776, + 98752, + 98751, + 98777, + 98759, + 98757, + 98759, + 98738, + 98742, + 98756, + 98745, + 98748, + 98751, + 98763, + 98771, + 98758, + 98738, + 98756, + 98774, + 98748, + 98751, + 98750, + 98767, + 98730, + 98760, + 98770, + 98762, + 98736, + 98738, + 98766, + 98766, + 98748, + 98764, + 98788, + 98733, + 98743, + 98766, + 98767, + 98753, + 98809, + 98774, + 98753, + 98769, + 98740, + 98750, + 98756, + 98734, + 98766, + 98771, + 98762, + 98772, + 98744, + 98764, + 98750, + 98759, + 98739, + 98757, + 98752, + 98759, + 98753, + 98754, + 98742, + 98774, + 98770, + 98753, + 98746, + 98758, + 98786, + 98767, + 98761, + 98761, + 98757, + 98765, + 98792, + 98757, + 98735, + 98773, + 98773, + 98777, + 98772, + 98743, + 98745, + 98747, + 98747, + 98766, + 98759, + 98752, + 98751, + 98755, + 98738, + 98743, + 98754, + 98743, + 98739, + 98741, + 98742, + 98772, + 98813, + 98745, + 98753, + 98732, + 98750, + 98760, + 98758, + 98767, + 98757, + 98732, + 98781, + 98758, + 98762, + 98776, + 98800, + 98774, + 98756, + 98761, + 98760, + 98741, + 98799, + 98761, + 98766, + 98742, + 98766, + 98755, + 98742, + 98756, + 98736, + 98731, + 98765, + 98768, + 98794, + 98768, + 98758, + 98755, + 98744, + 98750, + 98767, + 98735, + 98771, + 98762, + 98756, + 98761, + 98766, + 98771, + 98768, + 98738, + 98747, + 98783, + 98746, + 98759, + 98752, + 98778, + 98776, + 98759, + 98762, + 98770, + 98764, + 98760, + 98861, + 98767, + 98777, + 98760, + 98764, + 98772, + 98781, + 98745, + 98760, + 98763, + 98759, + 98772, + 98750, + 98758, + 98759, + 98735, + 98760, + 98738, + 98738, + 98776, + 98774, + 98749, + 98754, + 98770, + 98765, + 98766, + 98745, + 98743, + 98754, + 98744, + 99225, + 98730, + 98760, + 98729, + 98742, + 98765, + 98768, + 98754, + 98749, + 98768, + 98753, + 98771, + 98742, + 98771, + 98772, + 98754, + 98736, + 98749, + 98748, + 98740, + 98760, + 98748, + 98735, + 98781, + 98764, + 98766, + 98763, + 98771, + 98732, + 98773, + 98779, + 98765, + 98763, + 98762, + 98754, + 98771, + 98763, + 98771, + 98736, + 98725, + 98756, + 98775, + 98759, + 98752, + 98771, + 98756, + 98735, + 98776, + 98752, + 98769, + 98760, + 98773, + 98764, + 98737, + 98766, + 98751, + 98747, + 98745, + 98760, + 98815, + 98770, + 98767, + 98775, + 98753, + 98766, + 98778, + 98724, + 98770, + 98769, + 98770, + 98757, + 98757, + 98763, + 98779, + 98762, + 98734, + 98766, + 98783, + 98770, + 98766, + 98764, + 98729, + 98768, + 98758, + 98745, + 98765, + 98800, + 98760, + 98772, + 98737, + 98739, + 98750, + 98764, + 98756, + 98748, + 98777, + 98750, + 98774, + 98739, + 98765, + 98729, + 98768, + 98746, + 98745, + 98785, + 98760, + 98765, + 98756, + 98763, + 98756, + 98778, + 98743, + 98772, + 98737, + 98737, + 98737, + 98798, + 98773, + 98761, + 98763, + 98744, + 98747, + 98761, + 98742, + 98777, + 98792, + 98773, + 98761, + 98760, + 98758, + 98790, + 98784, + 98751, + 98750, + 98762, + 98732, + 98732, + 98747, + 98754, + 98759, + 98771, + 98764, + 98764, + 98777, + 98734, + 98746, + 98765, + 98745, + 98762, + 98756, + 98756, + 98735, + 98763, + 98724, + 98756, + 98777, + 98769, + 98732, + 98758, + 98750, + 98762, + 98758, + 98772, + 98760, + 98744, + 98744, + 98736, + 98778, + 98733, + 98755, + 98734, + 98785, + 98767, + 98756, + 98752, + 98741, + 98776, + 98743, + 98760, + 98814, + 98760, + 98767, + 98736, + 98741, + 98774, + 98764, + 98748, + 98765, + 98771, + 98773, + 98755, + 98765, + 98760, + 98765, + 98760, + 98734, + 98763, + 98756, + 98755, + 98774, + 98762, + 98762, + 98768, + 98766, + 98763, + 98737, + 98761, + 98758, + 98757, + 98779, + 98744, + 98771, + 98751, + 98769, + 98756, + 98757, + 98764, + 98763, + 98785, + 98765, + 98797, + 98744, + 98780, + 98758, + 98772, + 98736, + 98774, + 98765, + 98730, + 98735, + 98768, + 98752, + 98752, + 98760, + 98747, + 98752, + 98812, + 98763, + 98765, + 98776, + 98754, + 98740, + 98798, + 98769, + 98763, + 98751, + 98739, + 98770, + 98729, + 98759, + 98741, + 98769, + 98750, + 98761, + 98769, + 98764, + 98788, + 98737, + 98764, + 98760, + 98751, + 98768, + 98759, + 98761, + 98768, + 98745, + 98765, + 98759, + 98752, + 98759, + 98748, + 98771, + 98755, + 98768, + 98760, + 98763, + 98776, + 98733, + 98734, + 98739, + 98765, + 98780, + 98758, + 98775, + 98772, + 98788, + 98762, + 98750, + 98754, + 98755, + 98743, + 98737, + 98728, + 98753, + 98767, + 98735, + 98775, + 98747, + 98729, + 98793, + 98775, + 98778, + 98780, + 98752, + 98758, + 98788, + 98758, + 98745, + 98733, + 98769, + 98758, + 98753, + 98736, + 98760, + 98763, + 98779, + 98762, + 98761, + 98761, + 98775, + 98775, + 98760, + 98771, + 98784, + 98765, + 98757, + 98773, + 98755, + 98743, + 98744, + 98757, + 98758, + 98768, + 98728, + 98765, + 98771, + 98768, + 98775, + 98761, + 98769, + 98741, + 98775, + 98765, + 98753, + 98760, + 98748, + 98744, + 98763, + 98746, + 98751, + 98768, + 98749, + 98737, + 98761, + 98756, + 98736, + 98759, + 98725, + 98763, + 98755, + 98786, + 98763, + 98775, + 98750, + 98748, + 98775, + 98755, + 98758, + 98757, + 98753, + 98767, + 98768, + 98772, + 98745, + 98747, + 98715, + 98733, + 98773, + 98755, + 98772, + 98764, + 98728, + 98730, + 98779, + 98761, + 98766, + 98772, + 98743, + 98759, + 98754, + 98769, + 98777, + 98753, + 98765, + 98789, + 98760, + 98766, + 98770, + 98740, + 98736, + 98740, + 98750, + 98772, + 98766, + 98767, + 98732, + 98725, + 98769, + 98768, + 98757, + 98755, + 98759, + 98768, + 98752, + 98802, + 98765, + 98744, + 98747, + 98752, + 98752, + 98780, + 98755, + 98771, + 98757, + 98755, + 98750, + 98763, + 98758, + 98744, + 98772, + 98757, + 98795, + 98789, + 98760, + 98766, + 98764, + 98739, + 98761, + 98765, + 98767, + 98755, + 98730, + 98731, + 98757, + 98752, + 98748, + 98774, + 98752, + 98731, + 98754, + 98731, + 98761, + 98740, + 98758, + 98748, + 98760, + 98755, + 98747, + 98765, + 98734, + 98758, + 98777, + 98738, + 98783, + 98752, + 98760, + 98739, + 98767, + 98752, + 98761, + 98761, + 98766, + 98752, + 98769, + 98763, + 98739, + 98758, + 98758, + 98766, + 98752, + 98751, + 98735, + 98772, + 98758, + 98742, + 98766, + 98764, + 98763, + 98765, + 98746, + 98745, + 98740, + 98740, + 98781, + 98780, + 98767, + 98766, + 98781, + 98734, + 98784, + 98741, + 98758, + 98763, + 98759, + 98778, + 98767, + 98775, + 98744, + 98756, + 98765, + 98744, + 98763, + 98745, + 98791, + 98757, + 98768, + 98761, + 98767, + 98756, + 98754, + 98763, + 98757, + 98755, + 98757, + 98732, + 98774, + 98764, + 98756, + 98770, + 98792, + 98745, + 98764, + 98761, + 98771, + 98771, + 98762, + 98756, + 98746, + 98735, + 98753, + 98759, + 98746, + 98756, + 98771, + 98762, + 98768, + 98733, + 98758, + 98760, + 98751, + 98730, + 98766, + 98761, + 98754, + 98767, + 98754, + 98770, + 98755, + 98754, + 98763, + 98765, + 98770, + 98763, + 98811, + 98761, + 98732, + 98743, + 98753, + 98746, + 98764, + 98758, + 98748, + 98763, + 98768, + 98774, + 98759, + 98774, + 98773, + 98780, + 98781, + 98748, + 98784, + 98733, + 98740, + 98773, + 98769, + 98766, + 98761, + 98753, + 98733, + 98759, + 98737, + 98793, + 98787, + 98770, + 98769, + 98738, + 98744, + 98756, + 98776, + 98749, + 98773, + 98775, + 98761, + 98753, + 98747, + 98768, + 98758, + 98747, + 98765, + 98732, + 98777, + 98766, + 98725, + 98751, + 98750, + 98752, + 98775, + 98763, + 98780, + 98749, + 98764, + 98767, + 98737, + 98760, + 98749, + 98724, + 98765, + 98755, + 98766, + 98733, + 98756, + 98735, + 98749, + 98743, + 98762, + 98736, + 98755, + 98757, + 98743, + 98756, + 98762, + 98730, + 98762, + 98728, + 98750, + 98740, + 98758, + 98757, + 98732, + 98749, + 98722, + 98761, + 98752, + 98769, + 98764, + 98772, + 98739, + 98760, + 98780, + 98779, + 98722, + 98738, + 98732, + 98742, + 98764, + 98741, + 98785, + 98769, + 98724, + 98740, + 98763, + 98753, + 98761, + 98758, + 98744, + 98748, + 98737, + 98765, + 98746, + 98758, + 98761, + 98772, + 98766, + 98765, + 98742, + 98774, + 98761, + 98763, + 98777, + 98753, + 98779, + 98788, + 98761, + 98773, + 98755, + 98764, + 98739, + 98745, + 98729, + 98773, + 98775, + 98761, + 98777, + 98757, + 98741, + 98745, + 98748, + 98755, + 98753, + 98790, + 98797, + 98770, + 98768, + 98782, + 98736, + 98761, + 98754, + 98768, + 98780, + 98758, + 98765, + 98766, + 98730, + 98785, + 98763, + 98737, + 98762, + 98776, + 98776, + 98756, + 98778, + 98756, + 98772, + 98777, + 98745, + 98760, + 98760, + 98771, + 98758, + 98766, + 98768, + 98731, + 98764, + 98756, + 98733, + 98769, + 98766, + 98746, + 98770, + 98762, + 98760, + 98766, + 98744, + 98766, + 98746, + 98758, + 98745, + 98782, + 98748, + 98749, + 98754, + 98754, + 98772, + 98751, + 98753, + 98759, + 98768, + 98729, + 98758, + 98759, + 98764, + 98752, + 98758, + 98750, + 98771, + 98802, + 98765, + 98756, + 98761, + 98747, + 98761, + 98763, + 98739, + 98754, + 98734, + 98768, + 98755, + 98762, + 98767, + 98754, + 98734, + 98728, + 98785, + 98779, + 98749, + 98777, + 98753, + 98735, + 98744, + 98768, + 98755, + 98771, + 98765, + 98763, + 98754, + 98744, + 98762, + 98769, + 98781, + 98734, + 98720, + 98725, + 98755, + 98749, + 98753, + 98742, + 98753, + 98744, + 98752, + 98753, + 98731, + 98756, + 98760, + 98756, + 98755, + 98738, + 98763, + 98774, + 98758, + 98807, + 98737, + 98763, + 98757, + 98761, + 98758, + 98759, + 98788, + 98757, + 98757, + 98751, + 98740, + 98767, + 98739, + 98759, + 98769, + 98772, + 98772, + 98757, + 98757, + 98752, + 98759, + 98739, + 98756, + 98734, + 98770, + 98741, + 98729, + 98770, + 98762, + 98773, + 98808, + 98745, + 98737, + 98758, + 98751, + 98771, + 98742, + 98741, + 98742, + 98734, + 98765, + 98760, + 98752, + 98741, + 98761, + 98762, + 98778, + 98737, + 98761, + 98754, + 98770, + 98762, + 98756, + 98771, + 98765, + 98741, + 98780, + 98763, + 98741, + 98789, + 98741, + 98765, + 98764, + 98753, + 98744, + 98778, + 98751, + 98764, + 98740, + 98756, + 98746, + 98768, + 98766, + 98749, + 98741, + 98764, + 98760, + 98760, + 98768, + 98731, + 98753, + 98756, + 98730, + 98779, + 98764, + 98778, + 98738, + 98737, + 98771, + 98749, + 98764, + 98756, + 98745, + 98761, + 98751, + 98756, + 98754, + 98752, + 98763, + 98789, + 98784, + 98759, + 98739, + 98761, + 98812, + 98753, + 98798, + 98747, + 98735, + 98773, + 98719, + 98741, + 98761, + 98779, + 98757, + 98780, + 98753, + 98777, + 98781, + 98761, + 98759, + 98750, + 98759, + 98760, + 98776, + 98776, + 98760, + 98769, + 98780, + 98756, + 98752, + 98759, + 98734, + 98727, + 98749, + 98783, + 98745, + 98772, + 98762, + 98774, + 98758, + 98745, + 98772, + 98752, + 98731, + 98768, + 98766, + 98772, + 98729, + 98773, + 98732, + 98770, + 98760, + 98747, + 98762, + 98768, + 98767, + 98763, + 98777, + 98728, + 98749, + 98742, + 98741, + 98771, + 98738, + 98750, + 98757, + 98735, + 98764, + 98768, + 98732, + 98742, + 98760, + 98780, + 98743, + 98763, + 98766, + 98775, + 98770, + 98762, + 98749, + 98731, + 98768, + 98740, + 98762, + 98776, + 98741, + 98738, + 98737, + 98771, + 98742, + 98761, + 98735, + 98775, + 98759, + 98759, + 98766, + 98768, + 98760, + 98741, + 98769, + 98750, + 98754, + 98763, + 98788, + 98764, + 98745, + 98776, + 98779, + 98781, + 98744, + 98757, + 98773, + 98755, + 98734, + 98761, + 98736, + 98771, + 98763, + 98763, + 98751, + 98766, + 98742, + 98735, + 98758, + 98743, + 98741, + 98781, + 98735, + 98769, + 98753, + 98729, + 98761, + 98771, + 98731, + 98778, + 98772, + 98754, + 98780, + 98776, + 98760, + 98754, + 98751, + 98760, + 98754, + 98758, + 98756, + 98762, + 98779, + 98759, + 98761, + 98770, + 98751, + 98771, + 98769, + 98740, + 98759, + 98768, + 98738, + 98761, + 98750, + 98767, + 98759, + 98772, + 98759, + 98760, + 98769, + 98760, + 98775, + 98769, + 98743, + 98768, + 98772, + 98766, + 98753, + 98770, + 98761, + 98757, + 98761, + 98756, + 98763, + 98763, + 98729, + 98759, + 98744, + 98758, + 98744, + 98736, + 98778, + 98777, + 98762, + 98779, + 98780, + 98743, + 98752, + 98749, + 98797, + 98845, + 98759, + 98748, + 98768, + 98736, + 98764, + 98761, + 98746, + 98772, + 98773, + 98788, + 98778, + 98752, + 98777, + 98750, + 98767, + 98757, + 98770, + 98771, + 98757, + 98768, + 98753, + 98750, + 98770, + 98765, + 98742, + 98763, + 98761, + 98783, + 98780, + 98754, + 98756, + 98765, + 98754, + 98766, + 98762, + 98780, + 98742, + 98767, + 98767, + 98771, + 98773, + 98779, + 98752, + 98758, + 98744, + 98761, + 98776, + 98751, + 98758, + 98764, + 98747, + 98747, + 98797, + 98763, + 98759, + 98767, + 98781, + 98804, + 98793, + 98773, + 98771, + 98777, + 98744, + 98781, + 98770, + 98763, + 98760, + 98749, + 98762, + 98761, + 98772, + 98768, + 98765, + 98784, + 98767, + 98761, + 98784, + 98733, + 98736, + 98753, + 98730, + 98797, + 98744, + 98760, + 98742, + 98769, + 98762, + 98755, + 98758, + 98790, + 98762, + 98764, + 98775, + 98730, + 98755, + 98729, + 98758, + 98761, + 98772, + 98734, + 98770, + 98762, + 98738, + 98755, + 98720, + 98755, + 98749, + 98777, + 98751, + 98756, + 98733, + 98766, + 98753, + 98772, + 98766, + 98730, + 98750, + 98766, + 98764, + 98744, + 98727, + 98749, + 98738, + 98765, + 98773, + 98766, + 98764, + 98768, + 98765, + 98740, + 98776, + 98748, + 98770, + 98760, + 98755, + 98765, + 98763, + 98758, + 98764, + 98806, + 98745, + 98757, + 98751, + 98764, + 98751, + 98752, + 98746, + 98767, + 98753, + 98745, + 98744, + 98753, + 98731, + 98725, + 98742, + 98751, + 98758, + 98732, + 98750, + 98751, + 98748, + 98738, + 98738, + 98734, + 98749, + 98749, + 98757, + 98751, + 98760, + 98735, + 98761, + 98756, + 98763, + 98769, + 98775, + 98762, + 98768, + 98755, + 98763, + 98771, + 98750, + 98740, + 98739, + 98772, + 98799, + 98774, + 98778, + 98764, + 98741, + 98755, + 98754, + 98760, + 98758, + 98774, + 98756, + 98772, + 98776, + 98765, + 98755, + 98763, + 98766, + 98730, + 98764, + 98756, + 98762, + 98775, + 98753, + 98771, + 98765, + 98757, + 98731, + 98773, + 98822, + 98761, + 98768, + 98742, + 98744, + 98758, + 98760, + 98751, + 98753, + 98765, + 98763, + 98747, + 98755, + 98753, + 98729, + 98760, + 98742, + 98801, + 98773, + 98770, + 98775, + 98750, + 98753, + 98794, + 98756, + 98759, + 98793, + 98770, + 98767, + 98758, + 98765, + 98748, + 98769, + 98756, + 98726, + 98767, + 98759, + 98755, + 98766, + 98752, + 98778, + 98756, + 98770, + 98775, + 98749, + 98723, + 98754, + 98770, + 98727, + 98756, + 98737, + 98770, + 98731, + 98736, + 98745, + 98755, + 98765, + 98767, + 98755, + 98746, + 98769, + 98721, + 98775, + 98764, + 98752, + 98745, + 98749, + 98756, + 98760, + 98775, + 98826, + 98745, + 98736, + 98741, + 98759, + 98725, + 98750, + 98780, + 98755, + 98761, + 98740, + 98750, + 98736, + 98752, + 98747, + 98734, + 98746, + 98776, + 98751, + 98745, + 98748, + 98740, + 98766, + 98760, + 98735, + 98757, + 98749, + 98765, + 98780, + 98767, + 98754, + 98735, + 98757, + 98770, + 98738, + 98765, + 98759, + 98761, + 98767, + 98762, + 98744, + 98758, + 98782, + 98765, + 98765, + 98756, + 98771, + 98729, + 98771, + 98769, + 98729, + 98742, + 98731, + 98758, + 98750, + 98755, + 98733, + 98757, + 98754, + 98763, + 98738, + 98784, + 98767, + 98765, + 98780, + 98753, + 98771, + 98779, + 98738, + 98772, + 98765, + 98767, + 98784, + 98739, + 98765, + 98739, + 98744, + 98771, + 98772, + 98749, + 98751, + 98765, + 98757, + 98742, + 98758, + 98772, + 98770, + 98761, + 98764, + 98741, + 98756, + 98767, + 98726, + 98754, + 98774, + 98759, + 98755, + 98743, + 98733, + 98753, + 98787, + 98767, + 98757, + 98763, + 98764, + 98772, + 98782, + 98759, + 98766, + 98752, + 98733, + 98758, + 98796, + 98756, + 98767, + 98736, + 98760, + 98733, + 98774, + 98764, + 98762, + 98763, + 98782, + 98765, + 98763, + 98744, + 98729, + 98766, + 98732, + 98777, + 98772, + 98774, + 98764, + 98804, + 98752, + 98763, + 98760, + 98747, + 98733, + 98752, + 98753, + 98733, + 98754, + 98730, + 98733, + 98761, + 98755, + 98760, + 98768, + 98762, + 98760, + 98764, + 98724, + 98764, + 98757, + 98743, + 98752, + 98772, + 98764, + 98748, + 98744, + 98748, + 98745, + 98748, + 98762, + 98745, + 98779, + 98734, + 98767, + 98754, + 98762, + 98756, + 98773, + 98766, + 98760, + 98760, + 98756, + 98730, + 98785, + 98737, + 98761, + 98782, + 98761, + 98760, + 98762, + 98756, + 98751, + 98755, + 98751, + 98770, + 98762, + 98776, + 98755, + 98775, + 98748, + 98720, + 98796, + 98756, + 98734, + 98759, + 98769, + 98763, + 98755, + 98753, + 98764, + 98763, + 98756, + 98759, + 98765, + 98735, + 98741, + 98770, + 98757, + 98770, + 98764, + 98763, + 98728, + 98754, + 98730, + 98765, + 98794, + 98735, + 98756, + 98750, + 98760, + 98759, + 98773, + 98750, + 98765, + 98777, + 98762, + 98763, + 98770, + 98743, + 98777, + 98747, + 98761, + 98763, + 98769, + 98760, + 98774, + 98767, + 98776, + 98764, + 98811, + 98740, + 98749, + 98778, + 98749, + 98770, + 98807, + 98755, + 98771, + 98767, + 98762, + 98759, + 98765, + 98763, + 98772, + 98773, + 98769, + 98770, + 98755, + 98746, + 98769, + 98765, + 98768, + 98758, + 98758, + 98755, + 98753, + 98763, + 98760, + 98749, + 98774, + 98734, + 98741, + 98753, + 98763, + 98764, + 98806, + 98756, + 98789, + 98745, + 98763, + 98761, + 98771, + 98771, + 98766, + 98747, + 98751, + 98739, + 98747, + 98775, + 98770, + 98760, + 98748, + 98762, + 98754, + 98776, + 98755, + 98779, + 98755, + 98776, + 98735, + 98738, + 98738, + 98763, + 98738, + 98766, + 98745, + 98759, + 98759, + 98737, + 98737, + 98769, + 98767, + 98786, + 98762, + 98754, + 98776, + 98782, + 98742, + 98768, + 98746, + 98784, + 98732, + 98783, + 98750, + 98753, + 98769, + 98742, + 98755, + 98737, + 98747, + 98765, + 98735, + 98800, + 98731, + 98805, + 98767, + 98763, + 98759, + 98781, + 98730, + 98763, + 98758, + 98754, + 98754, + 98769, + 98746, + 98768, + 98760, + 98734, + 98755, + 98747, + 98750, + 98745, + 98757, + 98735, + 98762, + 98754, + 98772, + 98763, + 98777, + 98760, + 98740, + 98761, + 98772, + 98747, + 98764, + 98748, + 98730, + 98766, + 98737, + 98759, + 98778, + 98754, + 98747, + 98770, + 98766, + 98768, + 98744, + 98752, + 98739, + 98735, + 98734, + 98733, + 98741, + 98762, + 98756, + 98773, + 98739, + 98760, + 98746, + 98795, + 98738, + 98742, + 98770, + 98761, + 98812, + 98764, + 98759, + 98728, + 98738, + 98775, + 98772, + 98846, + 98768, + 98765, + 98768, + 98759, + 98760, + 98766, + 98742, + 98753, + 98725, + 98757, + 98766, + 98748, + 98748, + 98752, + 98750, + 98757, + 98750, + 98792, + 98779, + 98773, + 98757, + 98735, + 98740, + 98768, + 98765, + 98748, + 98755, + 98771, + 98739, + 98734, + 98776, + 98763, + 98747, + 98759, + 98742, + 98753, + 98757, + 98776, + 98737, + 98757, + 98734, + 98757, + 98733, + 98775, + 98731, + 98729, + 98773, + 98760, + 98760, + 98769, + 99007, + 98763, + 98733, + 98753, + 98769, + 98762, + 98770, + 98759, + 98789, + 98769, + 98767, + 98751, + 98726, + 98736, + 98778, + 98759, + 98775, + 98801, + 98765, + 98777, + 98754, + 98772, + 98752, + 98754, + 98785, + 98782, + 98755, + 98777, + 98766, + 98763, + 98768, + 98758, + 98760, + 98756, + 98750, + 98746, + 98758, + 98752, + 98737, + 98754, + 98766, + 98763, + 98739, + 98763, + 98767, + 98754, + 98755, + 98757, + 98726, + 98762, + 98772, + 98751, + 98761, + 98755, + 98755, + 98750, + 98741, + 98770, + 98763, + 98785, + 98761, + 98752, + 98775, + 98771, + 98762, + 98754, + 98754, + 98759, + 98752, + 98748, + 98735, + 98755, + 98748, + 98768, + 98737, + 98765, + 98740, + 98746, + 98728, + 98756, + 98769, + 98761, + 98751, + 98756, + 98732, + 98765, + 98775, + 98733, + 98767, + 98780, + 98763, + 98745, + 98790, + 98761, + 98750, + 98760, + 98737, + 98733, + 98774, + 98746, + 98753, + 98758, + 98744, + 98747, + 98751, + 98758, + 98757, + 98734, + 98765, + 98755, + 98738, + 98754, + 98753, + 98755, + 98743, + 98753, + 98759, + 98754, + 98767, + 98729, + 98748, + 98732, + 98770, + 98740, + 98750, + 98765, + 98754, + 98762, + 98766, + 98737, + 98757, + 98787, + 98744, + 98753, + 98757, + 98732, + 98750, + 98776, + 98758, + 98785, + 98776, + 98759, + 98751, + 98766, + 98730, + 98753, + 98751, + 98767, + 98766, + 98772, + 98757, + 98762, + 98813, + 98796, + 98784, + 98781, + 98777, + 98760, + 98732, + 98740, + 98750, + 98751, + 98761, + 98752, + 98755, + 98757, + 98763, + 98739, + 98739, + 98757, + 98736, + 98755, + 98759, + 98733, + 98760, + 98758, + 98767, + 98780, + 98774, + 98780, + 98788, + 98760, + 98773, + 98764, + 98759, + 98770, + 98763, + 98735, + 98771, + 98758, + 98742, + 98754, + 98763, + 98735, + 98772, + 98769, + 98759, + 98759, + 98734, + 98775, + 98746, + 98756, + 98767, + 98760, + 98721, + 98767, + 98763, + 98753, + 98755, + 98778, + 98745, + 98759, + 98762, + 98762, + 98772, + 98760, + 98735, + 98754, + 98763, + 98788, + 98774, + 98776, + 98762, + 98742, + 98735, + 98753, + 98783, + 98777, + 98729, + 98767, + 98758, + 98756, + 98735, + 98771, + 98750, + 98725, + 98756, + 98746, + 98755, + 98818, + 98763, + 98761, + 98782, + 98743, + 98731, + 98740, + 98764, + 98767, + 98767, + 98778, + 98789, + 98780, + 98773, + 98768, + 98739, + 98777, + 98776, + 98773, + 98782, + 98769, + 98802, + 98806, + 98762, + 98777, + 98765, + 98744, + 98749, + 98727, + 98754, + 98734, + 98727, + 98730, + 98764, + 98762, + 98757, + 98761, + 98725, + 98734, + 98769, + 98753, + 98758, + 98723, + 98750, + 98769, + 98787, + 98749, + 98769, + 98753, + 98766, + 98760, + 98735, + 98727, + 98756, + 98766, + 98762, + 98743, + 98759, + 98735, + 99197, + 98755, + 98772, + 98760, + 98768, + 98749, + 98755, + 98795, + 98758, + 98743, + 98765, + 98762, + 98766, + 98759, + 98743, + 98746, + 98808, + 98782, + 98763, + 98777, + 98765, + 98776, + 98778, + 98756, + 98764, + 98755, + 98758, + 98761, + 98763, + 98765, + 98795, + 98764, + 98759, + 98758, + 98777, + 98735, + 98758, + 98774, + 98742, + 98757, + 98762, + 98739, + 98762, + 98754, + 98765, + 98739, + 98774, + 98764, + 98756, + 98762, + 98761, + 98759, + 98745, + 98765, + 98767, + 98767, + 98768, + 98790, + 98771, + 98760, + 98760, + 98763, + 98766, + 98755, + 98767, + 98829, + 98765, + 98764, + 98766, + 98754, + 98767, + 98753, + 98726, + 98719, + 98732, + 98830, + 98768, + 98779, + 98755, + 98763, + 98761, + 98746, + 98750, + 98737, + 98762, + 98775, + 98765, + 98792, + 98752, + 98778, + 98758, + 98760, + 98746, + 98721, + 98763, + 98764, + 98735, + 98771, + 98771, + 98736, + 98745, + 98756, + 98737, + 98785, + 98781, + 98738, + 98775, + 98738, + 98757, + 98763, + 98756, + 98764, + 98772, + 98737, + 98734, + 98747, + 98763, + 98755, + 98762, + 99736, + 98769, + 98766, + 98764, + 98751, + 98760, + 98760, + 98769, + 98764, + 98755, + 98775, + 98735, + 98750, + 98766, + 98752, + 98762, + 98755, + 98758, + 98785, + 98727, + 98797, + 98772, + 98753, + 98763, + 98767, + 98753, + 98758, + 98743, + 98778, + 98761, + 98779, + 98790, + 98761, + 98732, + 98797, + 98776, + 98740, + 98762, + 98740, + 98730, + 98786, + 98781, + 98740, + 98743, + 98750, + 98768, + 98758, + 98769, + 98757, + 98751, + 98763, + 98729, + 98753, + 98759, + 98740, + 98762, + 98753, + 98760, + 98740, + 98794, + 98767, + 98736, + 98766, + 98758, + 98763, + 98759, + 98734, + 98759, + 98770, + 98750, + 98750, + 98751, + 98778, + 98770, + 98773, + 98748, + 98824, + 98772, + 98730, + 98757, + 98773, + 98747, + 98770, + 98768, + 98730, + 98753, + 98758, + 98754, + 98754, + 99146, + 98790, + 98777, + 98777, + 98722, + 98754, + 98808, + 98758, + 98762, + 98788, + 98761, + 98763, + 98762, + 98763, + 98759, + 98747, + 98726, + 98755, + 98762, + 98763, + 98762, + 98743, + 98767, + 98757, + 98764, + 98753, + 98736, + 98818, + 98738, + 98767, + 98746, + 98736, + 98761, + 98757, + 98763, + 98735, + 98768, + 98756, + 98759, + 98763, + 98752, + 98745, + 98751, + 98735, + 98772, + 98769, + 98763, + 98738, + 98743, + 98762, + 98743, + 98748, + 98758, + 98761, + 98766, + 98740, + 98760, + 98779, + 98754, + 98779, + 98767, + 98773, + 98808, + 98737, + 98761, + 98750, + 98757, + 98760, + 98762, + 98776, + 98740, + 98749, + 98764, + 98749, + 98735, + 98774, + 98749, + 98764, + 98743, + 98773, + 98732, + 98764, + 98729, + 98767, + 98765, + 98745, + 98766, + 98728, + 98783, + 98791, + 98743, + 98766, + 98755, + 98735, + 98746, + 98766, + 98760, + 98774, + 98780, + 98755, + 98774, + 98767, + 98762, + 98747, + 98761, + 98763, + 98735, + 98768, + 98758, + 98773, + 98782, + 98771, + 98716, + 98721, + 98754, + 98758, + 98761, + 98729, + 98736, + 98757, + 98744, + 98757, + 98775, + 98751, + 98757, + 98735, + 98768, + 98771, + 98778, + 98758, + 98762, + 98732, + 98753, + 98736, + 98738, + 98779, + 98765, + 98777, + 98751, + 98766, + 98736, + 98772, + 98745, + 98734, + 98755, + 98729, + 98770, + 98782, + 98798, + 98762, + 98763, + 98735, + 98764, + 98766, + 98758, + 98755, + 98770, + 98778, + 98766, + 98738, + 98736, + 98755, + 98737, + 98767, + 98740, + 98753, + 98774, + 98768, + 98753, + 98775, + 98757, + 98760, + 98755, + 98741, + 98766, + 98735, + 98763, + 98796, + 98754, + 98722, + 98760, + 98768, + 98761, + 98748, + 98749, + 98735, + 98739, + 98739, + 98770, + 98761, + 98758, + 98765, + 98737, + 98764, + 98739, + 98759, + 98738, + 98767, + 98751, + 98756, + 98773, + 98786, + 98751, + 98764, + 98722, + 98732, + 98740, + 98773, + 98763, + 98780, + 98779, + 98761, + 98772, + 98748, + 98732, + 98732, + 98764, + 98755, + 98755, + 98786, + 98762, + 98763, + 98760, + 98760, + 98765, + 98740, + 98745, + 98758, + 98765, + 98757, + 98765, + 98756, + 98725, + 98751, + 98756, + 98755, + 98729, + 98772, + 98736, + 98771, + 98769, + 98750, + 98749, + 98753, + 98727, + 98758, + 98742, + 98759, + 98765, + 98766, + 98746, + 98735, + 98764, + 98775, + 98765, + 98758, + 98753, + 98752, + 98766, + 98738, + 98779, + 98736, + 98741, + 98744, + 98772, + 98785, + 98760, + 98791, + 98755, + 98757, + 98747, + 98756, + 98768, + 98749, + 98769, + 98762, + 98753, + 98777, + 98777, + 98733, + 98767, + 98768, + 98784, + 98764, + 98731, + 98776, + 98750, + 98773, + 98763, + 98760, + 98790, + 98748, + 98743, + 98746, + 98747, + 98736, + 98790, + 98778, + 98758, + 98772, + 98759, + 98756, + 98760, + 98735, + 98739, + 98750, + 98737, + 98758, + 98747, + 98760, + 98731, + 98746, + 98776, + 98735, + 98755, + 98815, + 98736, + 98735, + 98765, + 98749, + 98763, + 98773, + 98744, + 98757, + 98765, + 98770, + 98754, + 98775, + 98738, + 98767, + 98776, + 98782, + 98765, + 98738, + 98719, + 98768, + 98758, + 98762, + 98780, + 98756, + 98752, + 98765, + 98772, + 98749, + 98780, + 98779, + 98750, + 98757, + 98758, + 98765, + 98744, + 98757, + 98763, + 98760, + 98740, + 98743, + 98727, + 98756, + 98768, + 98775, + 98759, + 98765, + 98773, + 98765, + 98765, + 98774, + 98784, + 98764, + 98742, + 98764, + 98768, + 98757, + 98785, + 98755, + 98754, + 98795, + 98770, + 98774, + 98792, + 98791, + 98771, + 98763, + 98765, + 98756, + 98739, + 98799, + 98791, + 98785, + 98790, + 98762, + 98756, + 98768, + 98758, + 98775, + 98765, + 98753, + 98767, + 98764, + 98741, + 98774, + 98769, + 98761, + 98759, + 98761, + 98744, + 98772, + 98741, + 98778, + 98774, + 98776, + 98742, + 98757, + 98732, + 98734, + 98744, + 98776, + 98778, + 98776, + 98745, + 98755, + 98744, + 98769, + 98754, + 98771, + 98759, + 98776, + 98752, + 98760, + 98745, + 98741, + 98773, + 98734, + 98756, + 98771, + 98767, + 98737, + 98765, + 98756, + 98765, + 98755, + 98726, + 98800, + 98734, + 98731, + 98762, + 98768, + 98785, + 98769, + 98723, + 98757, + 98777, + 98747, + 98760, + 98754, + 98729, + 98772, + 98775, + 98760, + 98764, + 98779, + 98776, + 98742, + 98768, + 98766, + 98732, + 98742, + 98734, + 98769, + 98741, + 98768, + 98726, + 98770, + 98748, + 98743, + 98754, + 98754, + 98752, + 98764, + 98718, + 98768, + 98780, + 98761, + 98755, + 98786, + 98764, + 98752, + 98773, + 98783, + 98735, + 98797, + 98737, + 98730, + 98764, + 98738, + 98764, + 98756, + 98770, + 98743, + 98768, + 98753, + 98738, + 98765, + 98757, + 98754, + 98762, + 98751, + 98734, + 98760, + 98768, + 98766, + 98750, + 98778, + 98738, + 98787, + 98777, + 98785, + 98751, + 98761, + 98793, + 98769, + 98751, + 98755, + 98767, + 98739, + 98761, + 98753, + 98734, + 98741, + 98735, + 98762, + 98757, + 98753, + 98729, + 98760, + 98807, + 98784, + 98777, + 98746, + 98771, + 98741, + 98765, + 98755, + 98731, + 98766, + 98763, + 98757, + 98769, + 98774, + 98765, + 98768, + 98761, + 98736, + 98746, + 98755, + 98736, + 98751, + 98752, + 98764, + 98758, + 98766, + 98761, + 98736, + 98754, + 98758, + 98831, + 98776, + 98760, + 98784, + 98738, + 98737, + 98739, + 98763, + 98761, + 98775, + 98763, + 98762, + 98770, + 98750, + 98730, + 98766, + 98756, + 98756, + 98759, + 98759, + 98764, + 98758, + 98763, + 98768, + 98739, + 98756, + 98762, + 98752, + 98728, + 98749, + 98739, + 98761, + 98746, + 98748, + 98723, + 98737, + 98752, + 98775, + 98776, + 98731, + 98773, + 98774, + 98756, + 98745, + 98736, + 98763, + 98753, + 98747, + 98764, + 98741, + 98756, + 98748, + 98744, + 98751, + 98770, + 98764, + 98759, + 98771, + 98750, + 98757, + 98772, + 98758, + 98762, + 98776, + 98759, + 98766, + 98762, + 98777, + 98765, + 98738, + 98776, + 98747, + 98773, + 98757, + 98760, + 98752, + 98727, + 98750, + 98761, + 98761, + 98771, + 98758, + 98739, + 98742, + 98760, + 98743, + 98750, + 98733, + 98740, + 98787, + 98783, + 98750, + 98771, + 98743, + 98753, + 98759, + 98749, + 98782, + 98740, + 98762, + 98759, + 98728, + 98762, + 98748, + 98745, + 98745, + 98728, + 98748, + 98764, + 98760, + 98765, + 98748, + 98747, + 98768, + 98762, + 98735, + 98763, + 98806, + 98730, + 98813, + 98754, + 98752, + 98752, + 98780, + 98757, + 98781, + 98741, + 98733, + 98768, + 98753, + 98745, + 98737, + 98755, + 98750, + 98771, + 98765, + 98747, + 98768, + 98746, + 98759, + 98768, + 98770, + 98743, + 98736, + 98749, + 98730, + 98740, + 98740, + 98749, + 98768, + 98756, + 98757, + 98751, + 98757, + 98756, + 98744, + 98749, + 98787, + 98755, + 98785, + 98738, + 98753, + 98764, + 98788, + 98787, + 98764, + 98756, + 98781, + 98759, + 98738, + 98765, + 98753, + 98749, + 98727, + 98764, + 98764, + 98752, + 98739, + 98743, + 98767, + 98754, + 98733, + 98757, + 98759, + 98751, + 98741, + 98743, + 98766, + 98764, + 98751, + 98719, + 98731, + 98773, + 98735, + 98767, + 98727, + 98761, + 98795, + 98752, + 98767, + 98770, + 98772, + 98761, + 98763, + 98762, + 98761, + 98758, + 98797, + 98736, + 98737, + 98770, + 98753, + 98774, + 98775, + 98769, + 98753, + 98742, + 98745, + 98774, + 98781, + 98753, + 98741, + 98805, + 98759, + 98758, + 98755, + 98748, + 98751, + 98732, + 98759, + 98738, + 98763, + 98761, + 98744, + 98768, + 98768, + 98765, + 98746, + 98762, + 98768, + 98759, + 98760, + 98765, + 98766, + 98740, + 98730, + 98743, + 98765, + 98739, + 98738, + 98743, + 98762, + 98740, + 98774, + 98747, + 98748, + 98777, + 98756, + 98748, + 98736, + 98736, + 98761, + 98745, + 98740, + 98756, + 98789, + 98769, + 98861, + 98734, + 98769, + 98761, + 98747, + 98742, + 98778, + 98757, + 98752, + 98739, + 98758, + 98731, + 98747, + 98758, + 98761, + 98769, + 98752, + 98740, + 98762, + 98753, + 98761, + 98781, + 98728, + 98740, + 98746, + 98773, + 98756, + 98764, + 98737, + 98762, + 98786, + 98781, + 98759, + 98738, + 98756, + 98760, + 98762, + 98770, + 98751, + 98743, + 98735, + 98764, + 98745, + 98762, + 98763, + 98777, + 98755, + 98747, + 98765, + 98733, + 98764, + 98744, + 98741, + 98733, + 98727, + 98760, + 98750, + 98732, + 98755, + 98751, + 99376, + 98760, + 98758, + 98734, + 98771, + 98725, + 98769, + 98756, + 98738, + 98779, + 98758, + 98732, + 98779, + 98771, + 98760, + 98747, + 98758, + 98736, + 98747, + 98762, + 98755, + 98764, + 98729, + 98758, + 98760, + 98735, + 98758, + 98773, + 98757, + 98763, + 98755, + 98753, + 98759, + 98774, + 98772, + 98757, + 98736, + 98758, + 98772, + 98761, + 98738, + 98776, + 98761, + 98757, + 98762, + 98769, + 98753, + 98757, + 98766, + 98762, + 98758, + 98748, + 98766, + 98732, + 98779, + 98736, + 98765, + 98775, + 98802, + 98760, + 98805, + 98738, + 98746, + 98759, + 98765, + 98757, + 98746, + 98772, + 98760, + 98745, + 98734, + 98736, + 98775, + 98751, + 98753, + 98776, + 98747, + 98758, + 98772, + 98762, + 98761, + 98759, + 98761, + 98743, + 98729, + 98743, + 98733, + 98768, + 98734, + 98763, + 98792, + 98743, + 98767, + 98764, + 98774, + 98718, + 98760, + 98759, + 98748, + 98770, + 98764, + 98767, + 98779, + 98764, + 98757, + 98774, + 98733, + 98784, + 98773, + 98772, + 98775, + 98771, + 98764, + 98810, + 98742, + 98764, + 98753, + 98767, + 98748, + 98749, + 98778, + 98769, + 98782, + 98765, + 98754, + 98768, + 98769, + 98761, + 98733, + 98785, + 98771, + 98751, + 98785, + 98759, + 98782, + 98733, + 98765, + 98748, + 98778, + 98773, + 98761, + 98772, + 98752, + 98774, + 98770, + 98779, + 98750, + 98794, + 98767, + 98764, + 98760, + 98800, + 98765, + 98780, + 98740, + 98756, + 98762, + 98776, + 98741, + 98778, + 98753, + 98743, + 98738, + 98763, + 98754, + 98726, + 98754, + 98737, + 98767, + 98757, + 98761, + 98754, + 98760, + 98784, + 98754, + 98770, + 98767, + 98769, + 98763, + 98778, + 98768, + 98754, + 98764, + 98761, + 98773, + 98753, + 98758, + 98757, + 98748, + 98767, + 98757, + 98766, + 98771, + 98767, + 98768, + 98772, + 98777, + 98832, + 98809, + 98744, + 98787, + 98786, + 98797, + 98793, + 98775, + 98751, + 98763, + 98770, + 98779, + 98772, + 98782, + 98754, + 98753, + 98762, + 98761, + 98758, + 98783, + 98747, + 98769, + 98766, + 98763, + 98768, + 98779, + 98791, + 98762, + 98767, + 98752, + 98718, + 98751, + 98762, + 98737, + 98767, + 98745, + 98746, + 98761, + 98756, + 98746, + 98755, + 98763, + 98742, + 98770, + 98766, + 98790, + 98750, + 98750, + 98769, + 98783, + 98804, + 98744, + 98774, + 98728, + 98739, + 98748, + 98740, + 98792, + 98795, + 98754, + 98736, + 98764, + 98755, + 98783, + 98789, + 98778, + 98760, + 98774, + 98737, + 98740, + 98789, + 98783, + 98761, + 98733, + 98763, + 98754, + 98765, + 98773, + 98784, + 98761, + 98762, + 98758, + 98839, + 98742, + 98753, + 98772, + 98759, + 98735, + 98758, + 98761, + 98771, + 98775, + 98743, + 98754, + 98756, + 98777, + 98723, + 98798, + 98728, + 98752, + 98828, + 98743, + 98770, + 98766, + 98772, + 98767, + 98767, + 98765, + 98756, + 98776, + 98756, + 98756, + 98796, + 98757, + 98784, + 98754, + 98735, + 98752, + 98773, + 98733, + 98762, + 98757, + 98737, + 98754, + 98755, + 98765, + 98767, + 98758, + 98739, + 98754, + 98749, + 98746, + 98747, + 98763, + 98733, + 98731, + 98724, + 98777, + 98746, + 98789, + 98764, + 98766, + 98770, + 98764, + 98731, + 98772, + 98778, + 98731, + 98753, + 98762, + 98765, + 98743, + 98753, + 98742, + 98750, + 98759, + 98769, + 98761, + 98760, + 98739, + 98760, + 98761, + 98770, + 98772, + 98751, + 98758, + 98753, + 98759, + 98755, + 98746, + 98747, + 98741, + 98751, + 98769, + 98805, + 98763, + 98717, + 98739, + 98766, + 98749, + 98739, + 98739, + 98812, + 98755, + 98747, + 98728, + 98766, + 98740, + 98761, + 98806, + 98792, + 98784, + 98786, + 98784, + 98764, + 98733, + 98725, + 98733, + 98739, + 98759, + 98731, + 98766, + 98770, + 98754, + 98754, + 98758, + 98752, + 98765, + 98772, + 98751, + 98745, + 98753, + 98754, + 98759, + 98771, + 98758, + 98758, + 98764, + 98754, + 99563, + 98766, + 98751, + 98792, + 98782, + 98724, + 98754, + 98754, + 98729, + 98731, + 98758, + 98778, + 98733, + 98756, + 98760, + 98757, + 98756, + 98760, + 98755, + 98737, + 98739, + 98757, + 98764, + 98760, + 98741, + 98747, + 98759, + 98771, + 98769, + 98724, + 98771, + 98742, + 98755, + 98762, + 98768, + 98727, + 98750, + 98730, + 98764, + 98747, + 98759, + 98762, + 98742, + 98770, + 98761, + 98753, + 98764, + 98744, + 98733, + 98747, + 98761, + 98757, + 98740, + 98760, + 98730, + 98751, + 98768, + 98771, + 98776, + 98742, + 98739, + 98747, + 98775, + 98765, + 98765, + 98748, + 98789, + 98765, + 98757, + 98744, + 98760, + 98759, + 98727, + 98747, + 98768, + 98781, + 98736, + 98782, + 98769, + 98759, + 98752, + 98777, + 98769, + 98770, + 98734, + 98765, + 98768, + 98752, + 98729, + 98759, + 98719, + 98729, + 98765, + 98761, + 98748, + 98729, + 98763, + 98761, + 98758, + 98764, + 98773, + 98776, + 98751, + 98739, + 98754, + 98760, + 98769, + 98749, + 98717, + 98774, + 98763, + 98728, + 98722, + 98758, + 98754, + 98778, + 98758, + 98775, + 98775, + 98752, + 98758, + 98818, + 98725, + 98748, + 98770, + 98743, + 98756, + 98732, + 98729, + 98760, + 98732, + 98728, + 98757, + 98739, + 98751, + 98743, + 98739, + 98760, + 98779, + 98738, + 98781, + 98811, + 98767, + 98737, + 98736, + 98740, + 98736, + 98783, + 98752, + 98760, + 98751, + 98749, + 98756, + 98736, + 98742, + 98727, + 98772, + 98746, + 98721, + 98743, + 98765, + 98725, + 98774, + 98762, + 98761, + 98764, + 98762, + 98735, + 98740, + 98769, + 98750, + 98744, + 98758, + 98747, + 98731, + 98756, + 98736, + 98751, + 98764, + 98759, + 98772, + 98801, + 98759, + 98747, + 98755, + 98751, + 98772, + 98751, + 98759, + 98756, + 98753, + 98726, + 98765, + 98738, + 98752, + 98749, + 98742, + 98764, + 98750, + 98752, + 98757, + 98727, + 98778, + 98773, + 98729, + 98749, + 98777, + 98754, + 99327, + 98749, + 98745, + 98769, + 98727, + 98754, + 98759, + 98726, + 98765, + 98748, + 98748, + 98731, + 98763, + 98764, + 98759, + 98751, + 98751, + 98765, + 98769, + 98758, + 98731, + 98756, + 98753, + 98756, + 98777, + 98759, + 98768, + 98743, + 98765, + 98733, + 98772, + 98740, + 98741, + 98761, + 98749, + 98751, + 98758, + 98728, + 98738, + 98772, + 98722, + 98757, + 98761, + 98754, + 98735, + 98756, + 98744, + 98777, + 98744, + 98737, + 98740, + 98748, + 98786, + 98772, + 98780, + 98735, + 98757, + 98757, + 98762, + 98736, + 98806, + 98771, + 98757, + 98766, + 98772, + 98756, + 98761, + 98758, + 98787, + 98780, + 98762, + 98757, + 98782, + 98773, + 98751, + 98780, + 98758, + 98768, + 98782, + 98758, + 98762, + 98791, + 98789, + 98749, + 98785, + 98778, + 98745, + 98766, + 98758, + 98782, + 98773, + 98752, + 98747, + 98742, + 98745, + 98745, + 98743, + 98725, + 98763, + 98743, + 98752, + 98750, + 98768, + 98758, + 98758, + 98759, + 98749, + 98757, + 98754, + 98744, + 98762, + 98767, + 98772, + 98751, + 98748, + 98760, + 98760, + 98779, + 98766, + 98771, + 98775, + 98776, + 98754, + 98752, + 98757, + 98750, + 98757, + 98751, + 98770, + 98743, + 98766, + 98766, + 98734, + 98749, + 98769, + 98784, + 98738, + 98761, + 98772, + 98727, + 98763, + 98750, + 98761, + 98719, + 98774, + 98758, + 98732, + 98752, + 98768, + 98776, + 98822, + 98762, + 98770, + 98764, + 98762, + 98762, + 98762, + 98758, + 98757, + 98763, + 98713, + 98780, + 98767, + 98754, + 98778, + 98762, + 98768, + 98771, + 98765, + 98735, + 98750, + 98747, + 98738, + 98757, + 98766, + 98726, + 98760, + 98757, + 98782, + 98759, + 98796, + 98750, + 98771, + 98771, + 98786, + 98744, + 98762, + 98766, + 98736, + 98751, + 98753, + 98740, + 98761, + 98726, + 98754, + 98772, + 98769, + 98771, + 98761, + 98761, + 98756, + 98755, + 98763, + 98764, + 98777, + 98756, + 98783, + 98766, + 98761, + 98780, + 98757, + 98749, + 98739, + 98765, + 98760, + 98796, + 98750, + 98754, + 98744, + 98750, + 98766, + 98771, + 98755, + 98741, + 98823, + 98760, + 98760, + 98727, + 98792, + 98757, + 98768, + 98777, + 98771, + 98770, + 98731, + 98750, + 98766, + 98762, + 98753, + 98759, + 98780, + 98770, + 98742, + 98739, + 98795, + 98735, + 98745, + 98747, + 98758, + 98739, + 98770, + 98739, + 98753, + 98746, + 98766, + 98776, + 98798, + 98775, + 98796, + 98758, + 98752, + 98760, + 98743, + 98752, + 98777, + 98761, + 98766, + 98734, + 99113, + 98784, + 98784, + 98757, + 98741, + 98747, + 98768, + 98754, + 98770, + 98783, + 98769, + 98744, + 98800, + 98743, + 98773, + 98727, + 98763, + 98781, + 98737, + 98801, + 98803, + 98755, + 98787, + 98757, + 98760, + 98769, + 98772, + 98765, + 98740, + 98753, + 98734, + 98770, + 98783, + 98754, + 98749, + 98759, + 98744, + 98767, + 98781, + 98765, + 98748, + 98768, + 98757, + 98777, + 98756, + 98765, + 98773, + 98752, + 98771, + 98788, + 98763, + 98773, + 98762, + 98786, + 98764, + 98756, + 98748, + 98761, + 98735, + 99045, + 98734, + 98756, + 98758, + 98730, + 98762, + 98755, + 98754, + 98764, + 98750, + 98741, + 98768, + 98767, + 98768, + 98742, + 98724, + 98754, + 98733, + 98768, + 98760, + 98768, + 98762, + 98738, + 98762, + 98744, + 98764, + 98755, + 98751, + 98761, + 98739, + 98741, + 98742, + 98762, + 98754, + 98745, + 98754, + 98771, + 98758, + 98785, + 98794, + 98753, + 98765, + 98793, + 98785, + 98769, + 98753, + 98747, + 98769, + 98771, + 98762, + 98775, + 98776, + 98758, + 98736, + 98776, + 98783, + 98756, + 98736, + 98738, + 98784, + 98795, + 98775, + 98738, + 98738, + 98753, + 98734, + 98741, + 98766, + 98773, + 98742, + 98752, + 98758, + 98740, + 98748, + 98738, + 98769, + 98734, + 98762, + 98773, + 98777, + 98764, + 98764, + 98742, + 98750, + 98749, + 98759, + 98767, + 98730, + 98742, + 98757, + 98766, + 98765, + 98767, + 98748, + 98768, + 98777, + 98765, + 98751, + 98735, + 98756, + 98768, + 98736, + 98764, + 98772, + 98790, + 98794, + 98773, + 98739, + 98744, + 98746, + 98770, + 98742, + 98764, + 98735, + 98755, + 98763, + 98794, + 98778, + 98755, + 98760, + 98756, + 98749, + 98758, + 98752, + 98772, + 98778, + 98756, + 98733, + 98751, + 98756, + 98763, + 98764, + 98755, + 98763, + 98735, + 98765, + 98753, + 98743, + 98752, + 98740, + 98771, + 98736, + 98758, + 98770, + 98764, + 98765, + 98747, + 98751, + 98770, + 98772, + 98743, + 98739, + 98791, + 98763, + 98769, + 98756, + 98768, + 98797, + 98774, + 98746, + 98759, + 98760, + 98740, + 98742, + 98790, + 98776, + 98755, + 98767, + 98742, + 98759, + 98759, + 98757, + 98737, + 98785, + 98745, + 98739, + 98750, + 98757, + 98766, + 98741, + 98769, + 98754, + 98745, + 98734, + 98750, + 98744, + 98742, + 98762, + 98745, + 98748, + 98734, + 98746, + 98746, + 98755, + 98765, + 98754, + 98758, + 98756, + 98750, + 98732, + 98752, + 98736, + 98728, + 98739, + 98773, + 98787, + 98762, + 98771, + 98760, + 98749, + 98778, + 98762, + 98760, + 98751, + 98753, + 98771, + 98768, + 98773, + 98750, + 98765, + 98736, + 98784, + 98758, + 98763, + 98756, + 98747, + 98758, + 98763, + 98768, + 98769, + 98756, + 98769, + 98774, + 98757, + 98738, + 98765, + 98769, + 98743, + 98730, + 98727, + 98747, + 98767, + 98775, + 98778, + 98753, + 98759, + 98751, + 98758, + 98752, + 98775, + 98727, + 98759, + 98757, + 98776, + 98761, + 98773, + 98755, + 98756, + 98765, + 98755, + 98749, + 98759, + 98764, + 98766, + 98772, + 98766, + 98774, + 98775, + 98776, + 98741, + 98754, + 98762, + 98746, + 98746, + 98756, + 98749, + 98763, + 98728, + 98781, + 98782, + 98767, + 98753, + 98772, + 98757, + 98767, + 98750, + 98760, + 98760, + 98764, + 98764, + 98748, + 98792, + 98762, + 98757, + 98751, + 98761, + 98758, + 98759, + 98767, + 98770, + 98769, + 98762, + 98783, + 98793, + 98767, + 98740, + 98761, + 98768, + 98740, + 98773, + 98734, + 98788, + 98741, + 98753, + 98754, + 98746, + 98769, + 98768, + 98766, + 98754, + 98778, + 98789, + 98765, + 98789, + 98735, + 98720, + 98774, + 98828, + 98747, + 98759, + 98764, + 98760, + 98764, + 98766, + 98747, + 98763, + 98755, + 98755, + 98784, + 98776, + 98775, + 98753, + 98754, + 98751, + 98762, + 98762, + 98736, + 98780, + 98743, + 98766, + 98726, + 98750, + 98759, + 98760, + 98800, + 98769, + 98753, + 99134, + 98737, + 98727, + 98762, + 98758, + 98768, + 98773, + 98756, + 98753, + 98758, + 98769, + 98770, + 98778, + 98798, + 98762, + 98790, + 98760, + 98745, + 98778, + 98737, + 98771, + 98753, + 98751, + 98745, + 98764, + 98775, + 98763, + 98769, + 98787, + 98740, + 98781, + 98810, + 98746, + 98764, + 98758, + 98741, + 98761, + 98760, + 98764, + 98752, + 98751, + 98754, + 98762, + 98752, + 98744, + 98778, + 98763, + 98763, + 98780, + 98752, + 98743, + 98780, + 98766, + 98770, + 98749, + 98730, + 98770, + 98768, + 98741, + 98759, + 98793, + 98744, + 98769, + 98757, + 98728, + 98770, + 98751, + 98728, + 98773, + 98783, + 98785, + 98788, + 98760, + 98750, + 98728, + 98766, + 98766, + 98752, + 98771, + 98762, + 98778, + 98772, + 98757, + 98747, + 98778, + 98765, + 98767, + 98761, + 98737, + 98769, + 98796, + 98746, + 98762, + 98771, + 98826, + 98787, + 98787, + 98772, + 98772, + 98773, + 98747, + 98796, + 98771, + 98765, + 98763, + 98796, + 98735, + 98779, + 98764, + 98761, + 98740, + 98751, + 98760, + 98760, + 98751, + 98746, + 98754, + 98761, + 98788, + 98736, + 98792, + 98747, + 98756, + 98772, + 98744, + 98731, + 98786, + 98750, + 98787, + 98756, + 98761, + 98752, + 98774, + 98759, + 98768, + 98762, + 98762, + 98762, + 98769, + 98767, + 98768, + 98770, + 98730, + 98780, + 98778, + 98756, + 98769, + 98784, + 98754, + 98774, + 98749, + 98747, + 98763, + 98770, + 98763, + 98763, + 98782, + 98757, + 98753, + 98751, + 98758, + 98752, + 98744, + 98762, + 98740, + 98762, + 98762, + 98735, + 98772, + 98741, + 98778, + 98775, + 98747, + 98769, + 98746, + 98771, + 98763, + 98741, + 98761, + 98770, + 98772, + 98731, + 98737, + 98744, + 98754, + 98770, + 98761, + 98760, + 98756, + 98731, + 98753, + 98777, + 98743, + 98748, + 98763, + 98759, + 98719, + 98767, + 98784, + 98735, + 98763, + 98761, + 98764, + 98751, + 98774, + 98749, + 98773, + 98772, + 98771, + 98749, + 98774, + 98762, + 98759, + 98764, + 98782, + 98777, + 98763, + 98760, + 98741, + 98738, + 98765, + 98751, + 98767, + 98758, + 98849, + 98777, + 98749, + 98761, + 98757, + 98739, + 98741, + 98744, + 98755, + 98740, + 98806, + 98755, + 98761, + 98762, + 98756, + 98789, + 98761, + 98752, + 98763, + 98769, + 98760, + 98764, + 98777, + 98771, + 98769, + 98758, + 98753, + 98741, + 98764, + 98761, + 98735, + 98734, + 98760, + 98775, + 98778, + 98760, + 98735, + 98751, + 98741, + 98748, + 98773, + 98735, + 98740, + 98749, + 98738, + 98750, + 98768, + 98757, + 98766, + 98742, + 98749, + 98755, + 98764, + 98752, + 98736, + 98762, + 98752, + 98763, + 98766, + 98758, + 98767, + 98746, + 98758, + 98763, + 98763, + 98717, + 98739, + 98729, + 98751, + 98753, + 98766, + 98721, + 98763, + 98746, + 98754, + 98762, + 98776, + 98754, + 98767, + 98756, + 98770, + 98763, + 98762, + 98771, + 98767, + 98737, + 98765, + 98747, + 98757, + 98786, + 98788, + 98796, + 98782, + 98783, + 98785, + 98729, + 98731, + 98746, + 98740, + 98796, + 98783, + 98748, + 98733, + 98769, + 98764, + 98752, + 98764, + 98725, + 98757, + 98762, + 98727, + 98761, + 98748, + 98760, + 98757, + 98763, + 98736, + 98740, + 98784, + 98740, + 98770, + 98754, + 98751, + 98735, + 98758, + 98765, + 98742, + 98791, + 98782, + 98764, + 98782, + 98763, + 98759, + 98793, + 98811, + 98793, + 98755, + 98769, + 98739, + 98758, + 98765, + 98783, + 98787, + 98763, + 98736, + 98749, + 98773, + 98738, + 98768, + 98780, + 98762, + 98755, + 98754, + 98759, + 98796, + 98762, + 98756, + 98762, + 98743, + 98768, + 98756, + 98775, + 98777, + 98762, + 98749, + 98771, + 98770, + 98739, + 98735, + 98770, + 98734, + 98778, + 98759, + 98767, + 98772, + 98765, + 98761, + 98746, + 98750, + 98790, + 98762, + 98756, + 98752, + 98764, + 98767, + 98747, + 98759, + 98772, + 98733, + 98730, + 98777, + 98757, + 98759, + 99133, + 98746, + 98759, + 98733, + 98762, + 98740, + 98769, + 98763, + 98767, + 98765, + 98757, + 98735, + 98802, + 98747, + 98731, + 98753, + 98759, + 98757, + 98766, + 98744, + 98772, + 98757, + 98771, + 98737, + 98752, + 98761, + 98772, + 98733, + 98733, + 98761, + 98778, + 98773, + 98753, + 98771, + 98787, + 98751, + 98782, + 98764, + 98767, + 98733, + 98746, + 98732, + 98756, + 98743, + 98738, + 98749, + 98773, + 98767, + 98750, + 98753, + 98751, + 98775, + 98759, + 98732, + 98742, + 98755, + 98767, + 98757, + 98741, + 98756, + 98749, + 98772, + 98780, + 98766, + 98774, + 98767, + 98777, + 98765, + 98742, + 98758, + 98765, + 98728, + 98740, + 98774, + 98764, + 98758, + 98732, + 98753, + 98764, + 98744, + 98754, + 98756, + 98764, + 98751, + 98739, + 98760, + 98756, + 98728, + 98755, + 98726, + 98773, + 98784, + 98751, + 98762, + 98779, + 98766, + 98805, + 98741, + 98768, + 98750, + 98765, + 98758, + 98761, + 98744, + 98774, + 98760, + 98755, + 98762, + 98767, + 98770, + 98752, + 98782, + 98733, + 98728, + 98770, + 98765, + 98749, + 98766, + 98740, + 98767, + 99258, + 98736, + 98762, + 98738, + 98749, + 98730, + 98776, + 98762, + 98733, + 98764, + 98754, + 98764, + 98763, + 98761, + 98757, + 98756, + 98750, + 98734, + 98761, + 98790, + 98759, + 98765, + 98731, + 98750, + 98759, + 98765, + 98775, + 98761, + 98762, + 98791, + 98732, + 98761, + 98741, + 98778, + 98725, + 98756, + 98738, + 98763, + 98759, + 98764, + 98766, + 98729, + 98757, + 98780, + 98748, + 98761, + 98760, + 98761, + 98738, + 98762, + 98768, + 98779, + 98730, + 98754, + 98746, + 98756, + 98777, + 98767, + 98769, + 98770, + 98768, + 98756, + 98764, + 98771, + 98768, + 98738, + 98769, + 98766, + 98761, + 98755, + 98772, + 98777, + 98755, + 98758, + 98739, + 98767, + 98763, + 98750, + 98756, + 98737, + 98760, + 98720, + 98740, + 98752, + 98762, + 98737, + 98751, + 98769, + 98764, + 98800, + 98740, + 98748, + 98751, + 98756, + 98755, + 98775, + 98729, + 98758, + 98757, + 98756, + 98764, + 98765, + 98766, + 98775, + 98758, + 98754, + 98728, + 98751, + 98755, + 98788, + 98745, + 98748, + 98738, + 98755, + 98764, + 98756, + 98769, + 98738, + 98733, + 98746, + 98738, + 98759, + 98750, + 98778, + 98762, + 98739, + 98744, + 98756, + 98762, + 98744, + 98727, + 98750, + 98777, + 98764, + 98738, + 98737, + 98745, + 98733, + 98760, + 98767, + 98752, + 98777, + 98749, + 98730, + 98772, + 98743, + 98770, + 98737, + 98791, + 98768, + 98785, + 98818, + 98791, + 98763, + 98793, + 98747, + 98754, + 98757, + 98756, + 98760, + 98729, + 98761, + 98773, + 98741, + 98763, + 98740, + 98750, + 98763, + 98765, + 98764, + 98754, + 98774, + 98760, + 98744, + 98754, + 98766, + 98777, + 98760, + 98756, + 98764, + 98740, + 98731, + 98745, + 98741, + 98729, + 98744, + 98777, + 98768, + 98752, + 98760, + 98747, + 98752, + 98752, + 98733, + 98774, + 98745, + 98768, + 98767, + 98754, + 98778, + 98757, + 98741, + 98736, + 98764, + 98770, + 98788, + 98777, + 98765, + 98756, + 98766, + 98768, + 98763, + 98762, + 98775, + 98786, + 98771, + 98759, + 98756, + 98753, + 98736, + 98745, + 98767, + 98773, + 98739, + 98781, + 98766, + 98733, + 98768, + 98744, + 98822, + 98733, + 98742, + 98758, + 98764, + 98737, + 98778, + 98769, + 98774, + 98753, + 98771, + 98766, + 98766, + 98773, + 98764, + 98741, + 98756, + 98756, + 98759, + 98772, + 98759, + 98741, + 98756, + 98766, + 98760, + 98766, + 98774, + 98775, + 98731, + 98744, + 98734, + 98732, + 98770, + 98778, + 98734, + 98772, + 98755, + 98730, + 98759, + 98743, + 98772, + 98761, + 98731, + 98748, + 98776, + 98760, + 98743, + 98773, + 98776, + 98752, + 98764, + 98766, + 98739, + 98765, + 98752, + 98745, + 98730, + 98760, + 98749, + 98756, + 98738, + 98759, + 98759, + 98774, + 98736, + 98753, + 98760, + 98761, + 98829, + 98737, + 98758, + 98745, + 98762, + 98738, + 98756, + 98743, + 98772, + 98768, + 98768, + 98738, + 98769, + 98731, + 98780, + 98770, + 98782, + 98767, + 98781, + 98751, + 98760, + 98801, + 98720, + 98762, + 98723, + 98732, + 98772, + 98772, + 98730, + 98736, + 98785, + 98746, + 98763, + 98767, + 98758, + 98760, + 98768, + 98723, + 98760, + 98743, + 98751, + 98744, + 98754, + 98763, + 98770, + 98738, + 98744, + 98779, + 98780, + 98723, + 98766, + 98755, + 98761, + 98764, + 98749, + 98741, + 98783, + 98755, + 98753, + 98761, + 98764, + 98763, + 98776, + 98767, + 98760, + 98741, + 98759, + 98726, + 98764, + 98748, + 98776, + 98752, + 98760, + 98758, + 98756, + 98768, + 98763, + 98765, + 98761, + 98760, + 98774, + 98767, + 98780, + 98750, + 98755, + 98759, + 98769, + 98764, + 98762, + 98754, + 98774, + 98732, + 98763, + 98756, + 98738, + 98755, + 98783, + 98757, + 98759, + 98745, + 98774, + 98745, + 98749, + 98745, + 98728, + 98757, + 98761, + 98798, + 98776, + 98751, + 98743, + 98772, + 98743, + 98757, + 98760, + 98754, + 98727, + 98777, + 98763, + 98742, + 98783, + 98763, + 98762, + 98750, + 98751, + 98763, + 98733, + 98737, + 98751, + 98750, + 98743, + 98756, + 98759, + 98779, + 98743, + 98768, + 98756, + 98756, + 98732, + 98743, + 98767, + 98762, + 98749, + 98760, + 98767, + 98759, + 98743, + 98764, + 98766, + 99144, + 98740, + 98762, + 98766, + 98761, + 98746, + 98769, + 98785, + 98765, + 98753, + 98746, + 98739, + 98732, + 98766, + 98753, + 98793, + 98781, + 98759, + 98768, + 98776, + 98735, + 98766, + 98733, + 98752, + 98768, + 98760, + 98762, + 98760, + 98749, + 98755, + 98765, + 98781, + 98731, + 98723, + 98731, + 98759, + 98760, + 98750, + 98768, + 98768, + 98732, + 98765, + 98765, + 98751, + 98726, + 98759, + 98776, + 98760, + 98766, + 98765, + 98728, + 98752, + 98753, + 98732, + 98748, + 98765, + 98759, + 98768, + 98791, + 98808, + 98738, + 98783, + 98733, + 98760, + 98771, + 98760, + 98766, + 98733, + 98749, + 98753, + 98758, + 98758, + 98758, + 98786, + 98734, + 98765, + 98743, + 98756, + 98727, + 98773, + 98734, + 98789, + 98761, + 98768, + 98729, + 98758, + 98757, + 98761, + 98760, + 98923, + 98729, + 98731, + 98756, + 98769, + 98766, + 98753, + 98776, + 98760, + 98742, + 98766, + 98759, + 98762, + 98744, + 98764, + 98754, + 98754, + 98732, + 98766, + 98759, + 98727, + 98748, + 98758, + 98748, + 98763, + 98778, + 98770, + 98727, + 98767, + 98746, + 98771, + 98759, + 98773, + 98734, + 98758, + 98767, + 98770, + 98728, + 98735, + 98727, + 98751, + 98769, + 98761, + 98782, + 98770, + 98759, + 98755, + 98761, + 98748, + 98772, + 98760, + 98768, + 98829, + 98752, + 98735, + 98733, + 98761, + 98751, + 98750, + 98754, + 98779, + 98741, + 98766, + 98748, + 98742, + 98750, + 98745, + 98781, + 98757, + 98764, + 98738, + 98766, + 98744, + 98757, + 98757, + 98736, + 98767, + 98758, + 98761, + 98785, + 98778, + 98769, + 98780, + 98784, + 98753, + 98764, + 98754, + 98771, + 98754, + 98784, + 98764, + 98767, + 98781, + 98745, + 98732, + 98740, + 98727, + 98761, + 98759, + 98755, + 98725, + 98766, + 98763, + 98765, + 98757, + 98766, + 98755, + 98769, + 98748, + 98768, + 98776, + 98757, + 98773, + 98777, + 98758, + 98735, + 98765, + 98763, + 98822, + 99156, + 98773, + 98774, + 98760, + 98757, + 98732, + 98765, + 98747, + 98758, + 98760, + 98769, + 98761, + 98766, + 98749, + 98744, + 98809, + 98766, + 98762, + 98766, + 98790, + 98780, + 98765, + 98732, + 98775, + 98771, + 98795, + 98777, + 98755, + 98753, + 98756, + 98756, + 98780, + 98753, + 98765, + 98738, + 98741, + 98766, + 98761, + 98781, + 98775, + 98733, + 98762, + 98759, + 98760, + 98756, + 98749, + 98775, + 98760, + 98766, + 98728, + 98734, + 98747, + 98798, + 98773, + 98755, + 98755, + 98769, + 98741, + 98760, + 98754, + 98823, + 98770, + 98757, + 98728, + 98765, + 98750, + 98748, + 98751, + 98770, + 98747, + 98763, + 98755, + 98749, + 98762, + 98748, + 98737, + 98756, + 98792, + 98760, + 98762, + 98783, + 98761, + 98757, + 98766, + 98753, + 98761, + 98754, + 98761, + 98757, + 98767, + 98814, + 98721, + 98769, + 98747, + 98761, + 98767, + 98767, + 98766, + 98767, + 98758, + 98746, + 98786, + 98736, + 98754, + 98775, + 98742, + 98752, + 98779, + 98775, + 98734, + 98767, + 98784, + 98775, + 98764, + 98738, + 98749, + 98769, + 98782, + 98736, + 98747, + 98739, + 98746, + 98771, + 98775, + 98754, + 98798, + 98763, + 98757, + 98739, + 98765, + 98767, + 98732, + 98761, + 98758, + 98770, + 98784, + 98731, + 98758, + 98772, + 98765, + 98785, + 98787, + 98787, + 98773, + 98746, + 98748, + 98776, + 98743, + 98741, + 98743, + 98758, + 98734, + 98736, + 98771, + 98748, + 98761, + 98756, + 98765, + 98751, + 98771, + 98768, + 98767, + 98778, + 98784, + 98765, + 98746, + 98751, + 98756, + 98744, + 98740, + 98785, + 98787, + 98732, + 98750, + 98742, + 98758, + 98779, + 98770, + 98741, + 98733, + 98754, + 98764, + 98755, + 98778, + 98732, + 98741, + 98736, + 98736, + 98757, + 98784, + 98747, + 98793, + 98787, + 98781, + 98771, + 98750, + 98774, + 98745, + 98756, + 98746, + 98777, + 98755, + 98760, + 98780, + 98770, + 98755, + 98786, + 98780, + 98728, + 98759, + 98751, + 98772, + 98734, + 98785, + 98756, + 98743, + 98754, + 98837, + 98777, + 98758, + 98731, + 98740, + 98782, + 98731, + 98765, + 98736, + 98746, + 98776, + 98793, + 98770, + 98781, + 98746, + 98757, + 98758, + 98790, + 98762, + 98757, + 98763, + 98733, + 98769, + 98766, + 98789, + 98758, + 98790, + 98757, + 98755, + 98769, + 98778, + 98761, + 98723, + 98761, + 98768, + 98763, + 98752, + 98767, + 98808, + 98751, + 98752, + 98748, + 98745, + 98732, + 98748, + 98727, + 98767, + 98785, + 98813, + 98767, + 98760, + 98777, + 98741, + 98750, + 98754, + 98763, + 98783, + 98769, + 98751, + 98749, + 98752, + 98761, + 98778, + 98745, + 98750, + 98735, + 98768, + 98749, + 98760, + 98758, + 98766, + 98772, + 98774, + 98771, + 98768, + 98760, + 98749, + 98763, + 98729, + 98728, + 98771, + 98769, + 98772, + 98776, + 98799, + 98767, + 98760, + 98763, + 98761, + 98754, + 98773, + 98750, + 98765, + 98756, + 98733, + 98771, + 98771, + 98768, + 98774, + 98782, + 98765, + 98736, + 98757, + 98769, + 98758, + 98756, + 98805, + 98756, + 98724, + 98759, + 98766, + 98746, + 98752, + 98746, + 98762, + 98739, + 98756, + 98761, + 98761, + 98769, + 98771, + 98756, + 98770, + 98746, + 98764, + 98733, + 98771, + 98757, + 98762, + 98737, + 98758, + 98749, + 98739, + 98746, + 98753, + 98730, + 98757, + 98766, + 98764, + 98761, + 98774, + 98762, + 98773, + 98742, + 98765, + 98768, + 98760, + 98754, + 98755, + 98768, + 98757, + 98746, + 98753, + 98761, + 98754, + 98756, + 98755, + 98764, + 98759, + 98763, + 98773, + 98758, + 98753, + 98771, + 98777, + 98752, + 98730, + 98757, + 98756, + 98796, + 98802, + 98804, + 98779, + 98744, + 98759, + 98742, + 98775, + 98762, + 98742, + 98753, + 98745, + 98761, + 98761, + 98769, + 98745, + 98735, + 98756, + 98749, + 98747, + 98792, + 98748, + 98754, + 98754, + 98767, + 98761, + 98741, + 98764, + 98758, + 98765, + 98754, + 98738, + 98756, + 98764, + 98779, + 98761, + 98759, + 98735, + 98735, + 98760, + 98774, + 98758, + 98765, + 98765, + 98767, + 98734, + 98756, + 98765, + 98746, + 98751, + 98722, + 98763, + 98748, + 98763, + 98747, + 98755, + 98725, + 98746, + 98793, + 98773, + 98750, + 98843, + 98752, + 98777, + 98756, + 98775, + 98767, + 98796, + 98752, + 98776, + 98791, + 98796, + 98759, + 98753, + 98728, + 98763, + 98793, + 98774, + 98756, + 98773, + 98746, + 98773, + 98735, + 98747, + 98758, + 98767, + 98762, + 98759, + 98738, + 98746, + 98765, + 98745, + 98743, + 98749, + 98742, + 98751, + 98761, + 98757, + 98762, + 98761, + 98745, + 98748, + 98742, + 98767, + 98755, + 98760, + 98733, + 98768, + 98771, + 98761, + 98764, + 98759, + 98764, + 98761, + 98760, + 98763, + 98730, + 98757, + 98749, + 98758, + 98728, + 98776, + 98741, + 98738, + 98771, + 98784, + 98761, + 98752, + 98728, + 98768, + 98767, + 98764, + 98765, + 98773, + 98769, + 98770, + 98781, + 98759, + 98772, + 98782, + 98754, + 98735, + 98769, + 98756, + 98774, + 98752, + 98757, + 98772, + 98760, + 98755, + 98737, + 98798, + 98792, + 98761, + 98766, + 98732, + 98754, + 98777, + 98734, + 98755, + 98744, + 98762, + 98773, + 98768, + 98757, + 98769, + 98782, + 98728, + 98771, + 98761, + 98759, + 98749, + 98781, + 98730, + 98776, + 98765, + 98750, + 98763, + 98768, + 98759, + 98758, + 98788, + 98731, + 98763, + 98760, + 98759, + 98771, + 98827, + 98719, + 98765, + 98728, + 98793, + 98719, + 98764, + 98748, + 98752, + 98749, + 98742, + 98732, + 98745, + 98758, + 98785, + 98758, + 98772, + 98745, + 98765, + 98743, + 98758, + 98760, + 98779, + 98748, + 98739, + 98744, + 98732, + 98746, + 98754, + 98734, + 98741, + 98767, + 98731, + 98760, + 98756, + 98755, + 98788, + 98780, + 98768, + 98759, + 98756, + 98749, + 98744, + 98747, + 98763, + 98732, + 98749, + 98760, + 98732, + 98749, + 98740, + 98769, + 98770, + 98761, + 98764, + 98733, + 98785, + 98756, + 98749, + 98754, + 98767, + 98754, + 98768, + 98800, + 98761, + 98777, + 98761, + 98756, + 98736, + 98760, + 98736, + 98758, + 98746, + 98754, + 98765, + 98768, + 98750, + 98746, + 98744, + 98756, + 98760, + 98763, + 98768, + 98755, + 98723, + 98737, + 98758, + 98738, + 98745, + 98763, + 98757, + 98744, + 98749, + 98762, + 98759, + 98754, + 98735, + 98777, + 98750, + 98740, + 98747, + 98733, + 98741, + 98758, + 98770, + 98738, + 98770, + 98738, + 98765, + 98731, + 98762, + 98765, + 98746, + 98766, + 98767, + 98743, + 98761, + 98742, + 98764, + 98770, + 98729, + 98735, + 98784, + 98739, + 98745, + 98733, + 98787, + 98748, + 98772, + 98768, + 98764, + 98755, + 98759, + 98786, + 98764, + 98795, + 98756, + 98756, + 98757, + 98770, + 98758, + 98764, + 98736, + 98744, + 98789, + 98733, + 98734, + 98777, + 98766, + 98774, + 98776, + 98737, + 98739, + 98758, + 98748, + 98748, + 98753, + 98751, + 98757, + 98725, + 98730, + 98768, + 98745, + 98747, + 98760, + 98758, + 98731, + 98761, + 98745, + 98744, + 98764, + 98746, + 98784, + 98784, + 98766, + 98735, + 98754, + 98764, + 98757, + 98758, + 98760, + 98756, + 98768, + 98737, + 98732, + 98759, + 98734, + 98736, + 98764, + 98755, + 98750, + 98769, + 98741, + 98771, + 98764, + 98754, + 98740, + 98773, + 98761, + 98761, + 98770, + 98754, + 99183, + 98777, + 98754, + 98753, + 98757, + 98762, + 98729, + 98755, + 98777, + 98751, + 98730, + 98779, + 98761, + 98739, + 98783, + 98768, + 98760, + 98767, + 98733, + 98768, + 98765, + 98768, + 98767, + 98764, + 98772, + 98771, + 98772, + 98759, + 98772, + 98766, + 98756, + 98775, + 98783, + 98735, + 98756, + 98769, + 98771, + 98759, + 98766, + 98760, + 98740, + 98751, + 98765, + 98735, + 98782, + 98751, + 98771, + 98771, + 98761, + 98732, + 98771, + 98754, + 98765, + 98756, + 98752, + 98756, + 98765, + 98739, + 98774, + 98775, + 98778, + 98765, + 98740, + 98730, + 98773, + 98770, + 98774, + 98756, + 98749, + 98776, + 98746, + 98762, + 98756, + 98761, + 98742, + 98791, + 98751, + 98754, + 98752, + 98770, + 98827, + 98745, + 98764, + 98728, + 98745, + 98762, + 98776, + 98722, + 98783, + 98770, + 98758, + 98734, + 98769, + 98724, + 98764, + 98734, + 98736, + 98743, + 98771, + 98773, + 98754, + 98759, + 98761, + 98762, + 98769, + 98746, + 98764, + 98764, + 98736, + 98765, + 98730, + 98754, + 98762, + 98750, + 98785, + 98760, + 98741, + 98744, + 98756, + 98798, + 98770, + 98768, + 98728, + 98727, + 98736, + 98745, + 98789, + 98735, + 98766, + 98742, + 98767, + 98774, + 98739, + 98769, + 98764, + 98763, + 98743, + 98754, + 98754, + 98737, + 98783, + 98741, + 98764, + 98762, + 98755, + 98734, + 98773, + 98750, + 98743, + 98761, + 98769, + 98757, + 98739, + 98762, + 98765, + 98732, + 98740, + 98820, + 98813, + 98729, + 98764, + 98783, + 98786, + 98787, + 98768, + 98757, + 98760, + 98755, + 98785, + 98835, + 98778, + 98770, + 98770, + 98767, + 98754, + 98767, + 98763, + 98765, + 98785, + 98760, + 98763, + 98760, + 98775, + 98770, + 98762, + 98758, + 98727, + 98779, + 98787, + 98767, + 98757, + 98769, + 98750, + 98763, + 98778, + 98770, + 98760, + 98784, + 98755, + 98769, + 98744, + 98964, + 98765, + 98806, + 98759, + 98757, + 98787, + 98753, + 98749, + 98786, + 98757, + 98770, + 98796, + 98775, + 98782, + 98779, + 98770, + 98737, + 98743, + 98759, + 98746, + 98777, + 98768, + 98760, + 98766, + 98762, + 98762, + 98757, + 98737, + 98762, + 98760, + 98758, + 98751, + 98784, + 98756, + 98772, + 98761, + 98763, + 98760, + 98777, + 98771, + 98758, + 98751, + 98733, + 98760, + 98757, + 98756, + 98758, + 98755, + 98749, + 98738, + 98789, + 98751, + 98759, + 98741, + 98780, + 98756, + 98741, + 98770, + 98761, + 98730, + 98768, + 98760, + 98767, + 98737, + 98756, + 98769, + 98771, + 98798, + 98730, + 98764, + 98748, + 98768, + 98744, + 98733, + 98735, + 98768, + 98751, + 98735, + 98769, + 98756, + 98728, + 98772, + 98778, + 98805, + 98745, + 98762, + 98769, + 98763, + 98765, + 98784, + 98744, + 98757, + 98787, + 98753, + 98752, + 98765, + 98761, + 98767, + 98773, + 98768, + 98747, + 98734, + 98754, + 98744, + 98736, + 98740, + 98741, + 98739, + 98773, + 98739, + 98755, + 98767, + 98766, + 98771, + 98733, + 98769, + 98771, + 98766, + 98731, + 98759, + 98766, + 98750, + 98767, + 98784, + 98768, + 98765, + 98781, + 98788, + 98784, + 98740, + 98770, + 98755, + 98745, + 98742, + 98759, + 98758, + 98754, + 98747, + 98757, + 98753, + 98765, + 98748, + 98759, + 98775, + 98754, + 98754, + 98755, + 98759, + 98754, + 98737, + 98755, + 98747, + 99906, + 98760, + 98762, + 98775, + 98758, + 98763, + 98759, + 98743, + 98741, + 98759, + 98755, + 98766, + 98773, + 98779, + 98773, + 98765, + 98762, + 98740, + 98776, + 98757, + 98737, + 98771, + 98758, + 98758, + 98775, + 98760, + 98732, + 98786, + 98761, + 98762, + 98731, + 98763, + 98734, + 98770, + 98731, + 98783, + 98748, + 98752, + 98772, + 98762, + 98746, + 98732, + 98776, + 98768, + 98764, + 98745, + 98760, + 98791, + 98826, + 98773, + 98765, + 98766, + 98734, + 98755, + 98734, + 98779, + 98779, + 98765, + 98769, + 98764, + 98760, + 98756, + 98756, + 98745, + 98739, + 98770, + 98749, + 98742, + 98747, + 98732, + 98733, + 98750, + 98746, + 98757, + 98731, + 98752, + 98741, + 98738, + 98777, + 98768, + 98754, + 98754, + 98749, + 98747, + 98771, + 98766, + 98770, + 98746, + 98747, + 98746, + 98751, + 98755, + 98781, + 98743, + 98777, + 98764, + 98773, + 98764, + 98725, + 98768, + 98736, + 98740, + 98778, + 98763, + 98741, + 98773, + 98767, + 98742, + 98752, + 98760, + 98736, + 98749, + 98771, + 98776, + 98766, + 98754, + 98762, + 98767, + 98758, + 98741, + 98750, + 98752, + 98765, + 98759, + 98749, + 98738, + 98757, + 98749, + 98777, + 98754, + 98760, + 98734, + 98763, + 98751, + 98754, + 98783, + 98774, + 98737, + 98780, + 98758, + 98750, + 98761, + 98762, + 98763, + 98772, + 98747, + 98757, + 98770, + 98740, + 98761, + 98771, + 98754, + 98746, + 98767, + 98741, + 98768, + 98762, + 98740, + 98750, + 98775, + 98783, + 98783, + 98731, + 98774, + 98772, + 98764, + 98764, + 98767, + 98777, + 98794, + 98768, + 98755, + 98734, + 98763, + 98775, + 98736, + 98767, + 98754, + 98750, + 98756, + 98767, + 98763, + 98758, + 98760, + 98778, + 98721, + 98811, + 98752, + 98772, + 98763, + 98760, + 98720, + 98770, + 98732, + 98766, + 98767, + 98752, + 98769, + 98744, + 98757, + 98765, + 98775, + 98761, + 98750, + 98781, + 98754, + 98749, + 98761, + 98765, + 98762, + 98761, + 98753, + 98771, + 98784, + 98787, + 98763, + 98726, + 98766, + 98760, + 98747, + 98763, + 98761, + 98766, + 98752, + 98755, + 98761, + 98748, + 98737, + 98774, + 98755, + 98745, + 98724, + 98769, + 98770, + 98782, + 98747, + 98749, + 98776, + 98750, + 98757, + 98753, + 98761, + 98733, + 99077, + 98739, + 98754, + 98761, + 98763, + 98762, + 98739, + 98761, + 98760, + 98823, + 98761, + 98775, + 98738, + 98760, + 98763, + 98775, + 98734, + 98761, + 98752, + 98732, + 98765, + 98771, + 98799, + 98762, + 98759, + 98746, + 98767, + 98766, + 98759, + 98752, + 99058, + 98777, + 98720, + 98776, + 98751, + 98774, + 98788, + 98757, + 98776, + 98760, + 98799, + 98776, + 98773, + 98766, + 98755, + 98767, + 98768, + 98755, + 98745, + 98766, + 98770, + 98763, + 98797, + 98741, + 98767, + 98739, + 98794, + 98734, + 98755, + 98776, + 98754, + 98742, + 98765, + 98740, + 98777, + 98760, + 98750, + 98736, + 98729, + 98768, + 98762, + 98759, + 98748, + 98752, + 98749, + 98767, + 98773, + 98754, + 98768, + 98775, + 98767, + 98727, + 98732, + 98761, + 98770, + 98750, + 98750, + 98773, + 98779, + 98784, + 98766, + 98769, + 98756, + 98759, + 98768, + 98744, + 98770, + 98767, + 98765, + 98765, + 98755, + 98758, + 98751, + 98745, + 98757, + 98768, + 98760, + 98779, + 98761, + 98747, + 98755, + 98760, + 98770, + 98771, + 98767, + 98741, + 98733, + 98727, + 98756, + 98773, + 98771, + 98750, + 98736, + 98768, + 98772, + 98752, + 98759, + 98751, + 98751, + 98760, + 98715, + 98729, + 98757, + 98760, + 98761, + 98738, + 98768, + 98756, + 98752, + 98757, + 98761, + 98762, + 98766, + 98763, + 98762, + 98755, + 98771, + 98774, + 98753, + 98757, + 98778, + 98753, + 98783, + 98768, + 98771, + 98770, + 98756, + 98740, + 98765, + 98785, + 98730, + 98755, + 98767, + 98769, + 98753, + 98762, + 98767, + 98757, + 98768, + 98736, + 98746, + 98779, + 98779, + 98778, + 98758, + 98722, + 98755, + 98795, + 98764, + 98758, + 98782, + 98743, + 98758, + 98734, + 98736, + 98736, + 98767, + 98756, + 98736, + 98765, + 98734, + 98771, + 98785, + 98766, + 98749, + 98773, + 98783, + 98747, + 98768, + 98752, + 98764, + 98761, + 98760, + 98741, + 98732, + 98757, + 98762, + 98771, + 98761, + 98780, + 98743, + 98761, + 98752, + 98767, + 98752, + 98771, + 98766, + 98721, + 98760, + 98776, + 98754, + 98742, + 98734, + 98737, + 98745, + 98762, + 98762, + 98742, + 98758, + 98759, + 98770, + 98752, + 98752, + 98720, + 98769, + 98763, + 98727, + 98756, + 98759, + 98759, + 98776, + 98729, + 98759, + 98763, + 98772, + 98761, + 98767, + 98771, + 98759, + 98782, + 98761, + 98754, + 98767, + 98733, + 98760, + 98764, + 98759, + 98751, + 98771, + 98760, + 98751, + 98763, + 98744, + 98760, + 98761, + 98763, + 98755, + 98776, + 98729, + 98759, + 98746, + 98766, + 98766, + 98765, + 98760, + 98775, + 98777, + 98767, + 98741, + 98765, + 98770, + 98753, + 98763, + 98731, + 98736, + 98770, + 98768, + 98762, + 98761, + 98745, + 98735, + 98763, + 98781, + 98774, + 98758, + 98730, + 98755, + 98741, + 98771, + 98759, + 98735, + 98758, + 98741, + 98736, + 98771, + 98769, + 98761, + 98731, + 98766, + 98777, + 98758, + 98754, + 98788, + 98755, + 98731, + 98752, + 98734, + 98761, + 98763, + 98728, + 98745, + 98753, + 98725, + 98771, + 98786, + 98800, + 98723, + 98782, + 98773, + 98793, + 98783, + 98778, + 98780, + 98783, + 98749, + 98774, + 98758, + 98735, + 98779, + 98776, + 98739, + 98762, + 98778, + 98745, + 98754, + 98781, + 98741, + 98769, + 98743, + 98748, + 98763, + 98741, + 98743, + 98756, + 98765, + 98770, + 98769, + 98771, + 98773, + 98760, + 98761, + 98770, + 98758, + 98769, + 98758, + 98766, + 98767, + 98759, + 98762, + 98737, + 98759, + 98731, + 98765, + 98755, + 98756, + 98743, + 98782, + 98750, + 98728, + 98728, + 98768, + 98759, + 98761, + 98779, + 98749, + 98763, + 98742, + 98773, + 99097, + 98751, + 98782, + 98751, + 98746, + 98804, + 98776, + 98756, + 98764, + 98721, + 98754, + 98742, + 98773, + 98769, + 98742, + 98731, + 98734, + 98743, + 98772, + 98725, + 98780, + 98748, + 98761, + 98783, + 98766, + 98741, + 98743, + 98755, + 98757, + 98784, + 98735, + 98774, + 98762, + 98738, + 98758, + 98746, + 98760, + 98771, + 98772, + 98769, + 98773, + 98739, + 98756, + 98767, + 98771, + 98731, + 98754, + 98752, + 98765, + 98738, + 98757, + 98762, + 98754, + 98753, + 98766, + 98760, + 98761, + 98757, + 98755, + 98730, + 98747, + 98757, + 98759, + 98764, + 98782, + 98769, + 98755, + 98748, + 98774, + 98743, + 98751, + 98792, + 98749, + 98757, + 98743, + 98732, + 98744, + 98757, + 98733, + 98741, + 98767, + 98731, + 98751, + 98738, + 98772, + 98776, + 98777, + 98758, + 98770, + 98785, + 98770, + 98764, + 98758, + 98747, + 98766, + 98770, + 98761, + 98728, + 98763, + 98767, + 98759, + 98777, + 98740, + 98762, + 98749, + 98767, + 98764, + 98745, + 98761, + 98773, + 98745, + 98758, + 98756, + 98771, + 98759, + 98757, + 98777, + 98744, + 98757, + 98761, + 98802, + 98769, + 98770, + 98736, + 98742, + 98726, + 98756, + 98753, + 98765, + 98729, + 98744, + 98735, + 98760, + 98764, + 98769, + 98759, + 98768, + 98774, + 98772, + 98735, + 98778, + 98755, + 98776, + 98775, + 98758, + 98769, + 98762, + 98766, + 98745, + 98779, + 98766, + 98762, + 98802, + 98755, + 98775, + 98778, + 98772, + 98757, + 98733, + 98762, + 98781, + 98777, + 98735, + 98765, + 98768, + 98760, + 98755, + 98773, + 98792, + 98727, + 98776, + 98756, + 98759, + 98794, + 98773, + 98774, + 98762, + 98761, + 98755, + 98738, + 99264, + 98755, + 98760, + 98772, + 98745, + 98753, + 98762, + 98739, + 98781, + 98756, + 98762, + 98766, + 98761, + 98755, + 98740, + 98733, + 98745, + 98768, + 98766, + 98759, + 98780, + 98759, + 98767, + 98759, + 98763, + 98758, + 98763, + 98746, + 98768, + 98808, + 98774, + 98747, + 98771, + 98746, + 98744, + 98761, + 98763, + 98744, + 98765, + 98768, + 98768, + 98745, + 98745, + 98771, + 98762, + 98760, + 98774, + 98760, + 98736, + 98741, + 98762, + 98725, + 98738, + 98733, + 98730, + 98763, + 98770, + 98753, + 98761, + 98791, + 98744, + 98754, + 98764, + 98733, + 98757, + 98759, + 98726, + 98776, + 98763, + 98750, + 98777, + 98759, + 98785, + 98764, + 98729, + 98764, + 98746, + 98744, + 98826, + 98740, + 98734, + 98764, + 98764, + 98740, + 98778, + 98767, + 98745, + 98785, + 98787, + 98778, + 98743, + 98762, + 98762, + 98748, + 98730, + 98766, + 98739, + 98740, + 98742, + 98751, + 98740, + 98753, + 98766, + 98747, + 98742, + 98758, + 98727, + 98748, + 98765, + 98763, + 98777, + 98730, + 98731, + 98753, + 98763, + 98735, + 98751, + 98725, + 98796, + 98816, + 98757, + 98752, + 98755, + 98762, + 98765, + 98795, + 98766, + 98767, + 98776, + 98761, + 98739, + 98769, + 98753, + 98763, + 98748, + 98787, + 98744, + 98743, + 98738, + 98756, + 98762, + 98735, + 98718, + 98760, + 98775, + 98745, + 98731, + 98748, + 98808, + 98769, + 98766, + 98745, + 98751, + 98730, + 98763, + 98756, + 98763, + 98761, + 98755, + 98761, + 98738, + 98764, + 98767, + 98751, + 98780, + 98765, + 98766, + 98743, + 98767, + 98762, + 98735, + 98730, + 98756, + 98755, + 98769, + 98745, + 98773, + 98733, + 98789, + 98751, + 98744, + 98771, + 98755, + 98758, + 98751, + 98759, + 98779, + 98791, + 98753, + 98724, + 98784, + 98739, + 98747, + 98758, + 98768, + 98756, + 98773, + 98758, + 98741, + 98732, + 98768, + 98750, + 98741, + 98762, + 98768, + 98770, + 98772, + 98764, + 99950, + 98755, + 98764, + 98730, + 98767, + 98758, + 98754, + 98747, + 98803, + 98759, + 98758, + 98752, + 98759, + 98757, + 98775, + 98738, + 98775, + 98759, + 98749, + 98781, + 98792, + 98775, + 98768, + 98732, + 98780, + 98767, + 98764, + 98749, + 98774, + 98759, + 98763, + 98765, + 98750, + 98760, + 98765, + 98753, + 98760, + 98763, + 98733, + 98766, + 98761, + 98754, + 98765, + 98769, + 98759, + 98754, + 98763, + 98732, + 98769, + 98734, + 98769, + 98757, + 98739, + 98746, + 98771, + 98771, + 98759, + 98752, + 98755, + 98746, + 98754, + 98774, + 98726, + 98760, + 98772, + 98776, + 98758, + 98766, + 98774, + 98766, + 98750, + 98730, + 98764, + 98812, + 98769, + 98756, + 98800, + 98775, + 98741, + 98764, + 98803, + 98766, + 98759, + 98748, + 98803, + 98773, + 98776, + 98759, + 98751, + 98758, + 98774, + 98761, + 98757, + 98763, + 98784, + 98722, + 98742, + 98765, + 98752, + 98769, + 98759, + 98724, + 98772, + 98772, + 98759, + 98766, + 98750, + 98751, + 98836, + 98760, + 98743, + 98726, + 98803, + 98756, + 98771, + 98746, + 98736, + 98762, + 98746, + 98730, + 98754, + 98750, + 98750, + 98760, + 98762, + 98768, + 98749, + 98748, + 98761, + 98759, + 98764, + 98769, + 98759, + 98757, + 98746, + 98790, + 98756, + 98769, + 98764, + 98738, + 98748, + 98771, + 98783, + 98760, + 98775, + 98756, + 98768, + 98757, + 98826, + 98773, + 98759, + 98726, + 98729, + 98756, + 98758, + 98749, + 98771, + 98781, + 98787, + 98764, + 98768, + 98762, + 98764, + 98763, + 98775, + 98793, + 98737, + 98738, + 98765, + 98761, + 98766, + 98734, + 98751, + 98747, + 98772, + 98767, + 98754, + 98729, + 98769, + 98751, + 98755, + 98751, + 98768, + 98753, + 98737, + 98788, + 98760, + 98786, + 98751, + 98742, + 98758, + 98747, + 98766, + 98771, + 98743, + 98745, + 98754, + 98770, + 98768, + 98776, + 98732, + 98756, + 98747, + 98760, + 98772, + 98784, + 98753, + 98742, + 98778, + 98744, + 99384, + 98742, + 98747, + 98760, + 98772, + 98743, + 98764, + 98771, + 98771, + 98734, + 98775, + 98767, + 98772, + 98773, + 98773, + 98774, + 98795, + 98767, + 98810, + 98785, + 98835, + 98754, + 98751, + 98753, + 98752, + 98773, + 98775, + 98762, + 98742, + 99009, + 98737, + 98759, + 98754, + 98761, + 98767, + 98768, + 98774, + 98757, + 98755, + 98758, + 98750, + 98759, + 98757, + 98750, + 98743, + 98748, + 98755, + 98764, + 98744, + 98755, + 98751, + 98753, + 98753, + 98766, + 98748, + 98765, + 98743, + 98771, + 98786, + 98776, + 98760, + 98744, + 98759, + 98751, + 98759, + 98746, + 98773, + 98754, + 98753, + 98758, + 98765, + 98743, + 98770, + 98766, + 98741, + 98774, + 98771, + 98771, + 98779, + 98763, + 98781, + 98753, + 98780, + 98759, + 98769, + 98737, + 98735, + 98731, + 98778, + 98754, + 98732, + 98790, + 98754, + 98765, + 98752, + 98753, + 98742, + 98762, + 98752, + 98765, + 98763, + 98768, + 98768, + 98754, + 98763, + 98758, + 98775, + 98743, + 98769, + 98746, + 98760, + 98764, + 98773, + 98790, + 98758, + 98742, + 98776, + 98773, + 98794, + 98758, + 98728, + 98764, + 98743, + 98819, + 98747, + 98730, + 98760, + 98743, + 98758, + 98771, + 98779, + 98737, + 98753, + 98739, + 98759, + 98762, + 98776, + 98744, + 98755, + 98740, + 98767, + 98762, + 98739, + 98751, + 98762, + 98754, + 98730, + 98774, + 98833, + 98745, + 98731, + 98749, + 98747, + 98754, + 98731, + 98764, + 98738, + 98760, + 98772, + 98739, + 98763, + 98763, + 98764, + 98757, + 98737, + 98764, + 98737, + 98760, + 98760, + 98760, + 98746, + 98740, + 98770, + 98731, + 98764, + 98775, + 98758, + 98758, + 99126, + 98729, + 98745, + 98787, + 98730, + 98754, + 98750, + 98762, + 98733, + 98765, + 98757, + 98758, + 98755, + 98724, + 98769, + 98759, + 98749, + 98759, + 98738, + 98754, + 98773, + 98779, + 98766, + 98747, + 98766, + 98752, + 98736, + 98765, + 98762, + 98757, + 98768, + 98746, + 98760, + 98739, + 98741, + 98758, + 98750, + 98732, + 98747, + 98768, + 98768, + 98762, + 98766, + 98752, + 98771, + 98759, + 98824, + 98739, + 98770, + 98740, + 98770, + 98743, + 98755, + 98755, + 98749, + 98741, + 98745, + 98759, + 98747, + 98762, + 99109, + 98774, + 98755, + 98740, + 98751, + 98746, + 98766, + 98744, + 98764, + 98770, + 98771, + 98752, + 98764, + 98726, + 98771, + 98722, + 98753, + 98740, + 98747, + 98728, + 98772, + 98755, + 98762, + 98756, + 98760, + 98720, + 98739, + 98793, + 98757, + 98734, + 98817, + 98780, + 98757, + 98764, + 98766, + 98768, + 98777, + 98754, + 98749, + 98735, + 98758, + 98763, + 98727, + 98746, + 98755, + 98759, + 98757, + 98761, + 98775, + 98762, + 98769, + 98767, + 98770, + 98755, + 98744, + 98756, + 98732, + 98775, + 98782, + 98722, + 98767, + 98762, + 98767, + 98764, + 98761, + 98759, + 98772, + 98726, + 98767, + 98734, + 98745, + 98737, + 98732, + 98736, + 98777, + 98764, + 98766, + 98745, + 98762, + 98765, + 98759, + 98745, + 98756, + 98731, + 98767, + 98734, + 98763, + 98759, + 98755, + 98748, + 98791, + 98728, + 98760, + 98757, + 98756, + 98758, + 98823, + 98760, + 98740, + 98763, + 98734, + 98764, + 98775, + 98741, + 98775, + 98769, + 98758, + 98776, + 98748, + 98746, + 98775, + 98776, + 98749, + 98745, + 98756, + 98750, + 98753, + 98761, + 98757, + 98749, + 98793, + 98770, + 98735, + 98770, + 98772, + 98761, + 98752, + 98763, + 98754, + 98769, + 98781, + 98776, + 98781, + 98733, + 98775, + 98767, + 98746, + 98739, + 98757, + 98725, + 98756, + 98764, + 98768, + 98751, + 98770, + 98751, + 98771, + 98768, + 98739, + 98980, + 98783, + 98785, + 98766, + 98776, + 98758, + 98775, + 98762, + 98745, + 98738, + 98745, + 98749, + 98761, + 98734, + 98736, + 98775, + 98764, + 98768, + 98735, + 98764, + 98730, + 98773, + 98735, + 98744, + 98738, + 98767, + 98721, + 98765, + 98795, + 98739, + 98777, + 98789, + 98759, + 98758, + 98779, + 98776, + 98755, + 98748, + 98764, + 98773, + 98776, + 98739, + 98752, + 98754, + 98765, + 98740, + 98765, + 98764, + 98780, + 98748, + 98739, + 98760, + 98766, + 98758, + 98756, + 98743, + 98730, + 98767, + 98751, + 98742, + 98787, + 98743, + 98725, + 98770, + 98762, + 98752, + 98730, + 98742, + 98738, + 98762, + 98757, + 98749, + 98762, + 98770, + 98730, + 98733, + 98769, + 98748, + 98719, + 98766, + 98742, + 98777, + 98775, + 98767, + 98751, + 98769, + 98752, + 98768, + 98738, + 98768, + 98761, + 98760, + 98740, + 98769, + 98755, + 98756, + 98755, + 98766, + 98768, + 98769, + 98768, + 98759, + 98736, + 98783, + 98735, + 98753, + 98777, + 98759, + 98750, + 98762, + 98761, + 98768, + 98773, + 98747, + 98750, + 98766, + 98752, + 98770, + 98744, + 98762, + 98795, + 98779, + 98752, + 98763, + 98769, + 98771, + 98735, + 98732, + 98739, + 98764, + 98767, + 98764, + 98758, + 98766, + 98726, + 98751, + 98790, + 98745, + 98817, + 98733, + 98756, + 98758, + 98761, + 98768, + 98778, + 98763, + 98772, + 98761, + 98772, + 98765, + 98760, + 98759, + 98766, + 98785, + 98767, + 98743, + 98741, + 98754, + 98736, + 98744, + 98761, + 98768, + 98787, + 98747, + 98780, + 98747, + 98760, + 98762, + 98761, + 98771, + 98765, + 98772, + 98756, + 98757, + 98755, + 98763, + 98770, + 98761, + 98751, + 98765, + 98770, + 98759, + 98758, + 98752, + 98761, + 98755, + 98783, + 98764, + 98747, + 98760, + 98759, + 98758, + 98738, + 98742, + 98737, + 98767, + 98749, + 98769, + 98761, + 98762, + 98733, + 98737, + 98757, + 98761, + 98761, + 98740, + 98755, + 98757, + 98732, + 98754, + 99814, + 98733, + 98736, + 98764, + 98770, + 98766, + 98767, + 98753, + 98774, + 98737, + 98748, + 98736, + 98773, + 98732, + 98759, + 98760, + 98758, + 98763, + 98764, + 98764, + 98766, + 98736, + 98732, + 98758, + 98772, + 98761, + 98743, + 98735, + 98753, + 98738, + 98757, + 98773, + 98728, + 98758, + 98781, + 98762, + 98762, + 98770, + 98750, + 98766, + 98763, + 98773, + 98765, + 98764, + 98733, + 98762, + 98778, + 98758, + 98749, + 98763, + 98729, + 98774, + 98769, + 98743, + 98754, + 98734, + 98737, + 98756, + 98776, + 98771, + 98732, + 98761, + 98749, + 98760, + 98745, + 98751, + 98767, + 98760, + 98727, + 98763, + 98745, + 98777, + 98752, + 98766, + 98732, + 98755, + 98759, + 98735, + 98765, + 98758, + 98758, + 98764, + 98781, + 98745, + 98763, + 98772, + 98736, + 98740, + 98775, + 98733, + 98767, + 98779, + 98735, + 98739, + 98772, + 98785, + 98768, + 98730, + 98767, + 98766, + 98749, + 98778, + 98750, + 98763, + 98738, + 98758, + 98747, + 98799, + 98776, + 98729, + 98759, + 98770, + 98747, + 98757, + 98762, + 98762, + 98730, + 98781, + 98766, + 98764, + 98739, + 98773, + 98767, + 98776, + 98771, + 98757, + 98756, + 98743, + 98774, + 98741, + 98771, + 98762, + 98765, + 98795, + 98745, + 98743, + 98770, + 98763, + 98781, + 98794, + 98765, + 98802, + 98769, + 98752, + 98804, + 98764, + 98761, + 98759, + 98769, + 98745, + 98733, + 98773, + 98732, + 98750, + 98767, + 98745, + 98749, + 98730, + 98736, + 98744, + 98777, + 98756, + 98746, + 98781, + 98751, + 98740, + 98782, + 98788, + 98759, + 98773, + 98739, + 98754, + 98759, + 98768, + 98739, + 98730, + 98733, + 98741, + 98760, + 98738, + 98759, + 98761, + 98763, + 98763, + 98759, + 98759, + 98733, + 98755, + 98728, + 98761, + 98739, + 98772, + 98734, + 98762, + 98739, + 98742, + 98764, + 98771, + 98763, + 98767, + 98726, + 98780, + 98767, + 98761, + 98752, + 98762, + 98773, + 98772, + 98791, + 98744, + 98764, + 98756, + 98749, + 98768, + 98768, + 98753, + 98748, + 98771, + 98752, + 98757, + 98747, + 98767, + 98761, + 98763, + 98717, + 98760, + 98733, + 98750, + 98764, + 98737, + 98746, + 98757, + 98733, + 98735, + 98759, + 98749, + 98751, + 98745, + 98765, + 98773, + 98781, + 98779, + 98766, + 98737, + 98781, + 98757, + 98764, + 98749, + 98755, + 98772, + 98760, + 98761, + 98767, + 98770, + 98732, + 98770, + 98744, + 98753, + 98736, + 98752, + 98755, + 98761, + 98774, + 98756, + 98768, + 98736, + 98726, + 98757, + 98765, + 98738, + 98755, + 98757, + 98720, + 98763, + 98745, + 98745, + 98740, + 98724, + 98752, + 98731, + 98773, + 98753, + 98776, + 98781, + 98783, + 98753, + 98771, + 98755, + 98728, + 98754, + 98759, + 98766, + 98743, + 98790, + 98768, + 98758, + 98750, + 98756, + 98793, + 98803, + 98732, + 98751, + 98731, + 98736, + 98800, + 98762, + 98762, + 98761, + 98765, + 98732, + 98756, + 98752, + 98766, + 98808, + 98746, + 98775, + 98759, + 98752, + 98752, + 98788, + 98745, + 98738, + 98790, + 98769, + 98759, + 98770, + 98738, + 98733, + 99307, + 98752, + 98758, + 98756, + 98782, + 98738, + 98770, + 98773, + 98757, + 98771, + 98754, + 98757, + 98762, + 98735, + 98779, + 98782, + 98795, + 98735, + 98765, + 98759, + 98747, + 98782, + 98750, + 98740, + 98723, + 98737, + 98748, + 98757, + 98756, + 98768, + 98769, + 98738, + 98755, + 98757, + 98739, + 98772, + 98780, + 98772, + 98792, + 98762, + 98771, + 98774, + 98746, + 98788, + 98766, + 98766, + 98789, + 98752, + 98758, + 98734, + 98763, + 98767, + 98775, + 98742, + 98760, + 98751, + 98764, + 98745, + 98748, + 98735, + 98814, + 98782, + 98759, + 98735, + 98765, + 98769, + 98763, + 98740, + 98765, + 98768, + 98758, + 98741, + 98763, + 98758, + 98761, + 98766, + 98748, + 98761, + 98755, + 98761, + 98740, + 98756, + 98764, + 98740, + 98762, + 98796, + 98757, + 98774, + 98754, + 98775, + 98801, + 98775, + 98763, + 98774, + 98770, + 98760, + 98751, + 98746, + 98766, + 98796, + 98802, + 98785, + 98765, + 98737, + 98769, + 98740, + 98719, + 98763, + 98768, + 98737, + 98753, + 98748, + 98763, + 98764, + 98756, + 98762, + 98731, + 98761, + 98745, + 98757, + 98757, + 98761, + 98760, + 98729, + 98738, + 98758, + 98737, + 98770, + 98743, + 98725, + 98757, + 98789, + 98761, + 98786, + 98766, + 98750, + 98731, + 98763, + 98762, + 98759, + 98755, + 98767, + 98761, + 98764, + 98771, + 98768, + 98772, + 98751, + 98766, + 98770, + 98789, + 98747, + 98739, + 98747, + 98733, + 98735, + 98735, + 98777, + 98760, + 98797, + 98773, + 98760, + 98772, + 98759, + 98740, + 98766, + 98760, + 98755, + 98764, + 98743, + 98814, + 98743, + 98735, + 98779, + 98787, + 98793, + 98805, + 98760, + 98732, + 98751, + 98748, + 98772, + 98824, + 98792, + 98740, + 98745, + 98751, + 98736, + 98752, + 98758, + 98739, + 98744, + 98768, + 98766, + 98766, + 98754, + 98731, + 98759, + 98735, + 98726, + 98759, + 98741, + 98742, + 98731, + 98733, + 98740, + 98760, + 98764, + 98755, + 98756, + 98765, + 98757, + 98753, + 98770, + 98758, + 98763, + 98755, + 98736, + 98769, + 98751, + 98759, + 98737, + 98765, + 98723, + 98767, + 98758, + 98766, + 98779, + 98736, + 98756, + 98765, + 98745, + 98744, + 98751, + 98778, + 98763, + 98778, + 98780, + 98770, + 98772, + 98831, + 98762, + 98763, + 98752, + 98755, + 98750, + 98762, + 98756, + 98763, + 98754, + 98749, + 98759, + 98744, + 98753, + 98731, + 98732, + 98717, + 98751, + 98739, + 98750, + 98767, + 98769, + 98750, + 98750, + 98740, + 98791, + 98783, + 98787, + 98783, + 98797, + 98771, + 98763, + 98799, + 98806, + 98794, + 98792, + 98789, + 98724, + 98763, + 98774, + 98735, + 98782, + 98777, + 98753, + 98756, + 98752, + 98735, + 98772, + 98774, + 98757, + 98734, + 98763, + 98722, + 98764, + 98767, + 98773, + 98776, + 98736, + 98763, + 98790, + 98761, + 98754, + 98745, + 98773, + 98740, + 98749, + 98761, + 98769, + 98759, + 98738, + 98760, + 98749, + 98747, + 98749, + 98759, + 98761, + 98750, + 98764, + 98731, + 98771, + 98735, + 98760, + 98780, + 98753, + 98756, + 98753, + 98754, + 98728, + 98756, + 98775, + 98762, + 98811, + 98760, + 98763, + 98735, + 98801, + 98798, + 98756, + 98753, + 98765, + 98726, + 98780, + 98771, + 98754, + 98746, + 98775, + 98758, + 98766, + 98758, + 98757, + 98759, + 98782, + 98749, + 98787, + 98762, + 98754, + 98759, + 98766, + 98755, + 98768, + 98760, + 98760, + 98761, + 98768, + 98752, + 98756, + 98764, + 98757, + 98723, + 98755, + 98732, + 98770, + 98749, + 98758, + 98754, + 98758, + 98726, + 98780, + 98776, + 98770, + 98731, + 98745, + 98727, + 98748, + 98751, + 98748, + 98761, + 98745, + 98749, + 98773, + 98761, + 98748, + 98731, + 98728, + 98757, + 98755, + 98761, + 98769, + 98744, + 98743, + 98768, + 98746, + 98791, + 98734, + 98748, + 98779, + 98743, + 98786, + 98757, + 98760, + 98765, + 98723, + 98721, + 98760, + 98745, + 98750, + 98737, + 98745, + 98751, + 98756, + 98768, + 98757, + 98740, + 98768, + 98753, + 98765, + 98745, + 98762, + 98756, + 98732, + 98741, + 98761, + 98760, + 98742, + 98775, + 98733, + 98758, + 98762, + 98758, + 98753, + 98755, + 98759, + 98742, + 98770, + 98730, + 98763, + 98741, + 98752, + 98722, + 98742, + 98753, + 98755, + 98746, + 98742, + 98760, + 98750, + 98764, + 98734, + 98752, + 98749, + 98731, + 98756, + 98775, + 98777, + 98744, + 98731, + 98762, + 98756, + 98751, + 98753, + 98771, + 98769, + 98745, + 98746, + 98770, + 98744, + 98746, + 98733, + 98722, + 98776, + 98752, + 98761, + 98758, + 98764, + 98731, + 98739, + 98758, + 98760, + 98761, + 98758, + 98737, + 98760, + 98762, + 98788, + 98751, + 98734, + 98758, + 98738, + 98767, + 98762, + 98747, + 98763, + 98759, + 98760, + 98776, + 98748, + 98765, + 98757, + 98770, + 98812, + 98761, + 98768, + 98759, + 98790, + 98735, + 98745, + 98776, + 98755, + 98733, + 98731, + 98748, + 98764, + 98775, + 98780, + 98735, + 98769, + 98733, + 98762, + 98765, + 98745, + 98800, + 98766, + 98748, + 98759, + 98755, + 98825, + 98792, + 98758, + 98759, + 98765, + 98741, + 98765, + 98792, + 98763, + 98751, + 98728, + 98787, + 98763, + 98746, + 98777, + 98739, + 98758, + 98738, + 98760, + 98760, + 98781, + 98785, + 98753, + 98770, + 98766, + 98742, + 98770, + 98728, + 98756, + 98776, + 98740, + 98741, + 98750, + 98741, + 98745, + 98770, + 98754, + 98771, + 98767, + 98759, + 98762, + 98764, + 98779, + 98789, + 98760, + 98743, + 98738, + 98758, + 98756, + 98759, + 98768, + 98740, + 98767, + 98764, + 98752, + 98739, + 98759, + 98758, + 98769, + 98779, + 98742, + 98753, + 98756, + 98764, + 98745, + 98756, + 98745, + 98782, + 98755, + 98773, + 98752, + 98766, + 98715, + 98760, + 98772, + 98772, + 98762, + 98761, + 98737, + 98769, + 98759, + 98744, + 98764, + 98730, + 98743, + 98757, + 98721, + 98774, + 98733, + 98772, + 98778, + 98754, + 98754, + 98768, + 98758, + 98756, + 98785, + 98762, + 98768, + 98726, + 98749, + 98760, + 98765, + 98731, + 98744, + 98783, + 98767, + 98754, + 98764, + 98781, + 98770, + 98759, + 98738, + 98761, + 98765, + 98756, + 98778, + 98775, + 98777, + 98772, + 98770, + 98749, + 98746, + 98739, + 98749, + 98775, + 98729, + 98756, + 98754, + 98733, + 98773, + 98764, + 98761, + 98739, + 98772, + 98722, + 98762, + 98768, + 98776, + 98763, + 98739, + 98761, + 98769, + 98782, + 98775, + 98759, + 98755, + 98736, + 98766, + 98766, + 98763, + 98724, + 98787, + 99188, + 98762, + 98771, + 98766, + 98751, + 98759, + 98730, + 98737, + 98766, + 98734, + 98761, + 98772, + 98730, + 98766, + 98773, + 98769, + 98765, + 98773, + 98729, + 98743, + 98769, + 98757, + 98760, + 98759, + 98747, + 98746, + 98741, + 98729, + 98743, + 98748, + 98761, + 98789, + 98754, + 98769, + 98736, + 98763, + 98741, + 98758, + 98737, + 98738, + 98763, + 98808, + 98729, + 98761, + 98756, + 98722, + 98736, + 98764, + 98733, + 98759, + 98778, + 98760, + 98764, + 98755, + 98736, + 98760, + 98761, + 98771, + 98746, + 98756, + 98757, + 98758, + 98764, + 98770, + 98777, + 98765, + 98746, + 98769, + 98767, + 98753, + 98750, + 98762, + 98736, + 98771, + 98737, + 98757, + 98760, + 98749, + 98735, + 98772, + 98755, + 98774, + 98758, + 98753, + 98756, + 98738, + 98762, + 98753, + 98756, + 98743, + 98738, + 98758, + 98756, + 98781, + 98760, + 98758, + 98716, + 98745, + 98763, + 98745, + 98732, + 98762, + 98746, + 98758, + 98737, + 98754, + 98747, + 98739, + 98754, + 98735, + 98754, + 98748, + 98767, + 98729, + 98760, + 98756, + 98750, + 98761, + 98761, + 98762, + 98754, + 98757, + 98776, + 98748, + 98759, + 98760, + 98722, + 98767, + 98769, + 98769, + 98739, + 98780, + 98757, + 98728, + 98754, + 98735, + 98739, + 98758, + 98734, + 98739, + 98775, + 98759, + 98752, + 98764, + 98754, + 98734, + 98755, + 98753, + 98738, + 98749, + 98746, + 98744, + 98765, + 98763, + 98752, + 98736, + 98737, + 98735, + 98771, + 98767, + 98755, + 98758, + 98761, + 98769, + 98780, + 98761, + 98769, + 98782, + 98747, + 98754, + 98769, + 98762, + 98756, + 98743, + 98762, + 98764, + 98767, + 98747, + 98759, + 98769, + 98760, + 98818, + 98782, + 98744, + 98735, + 98783, + 98746, + 98764, + 98758, + 98768, + 98767, + 98759, + 98751, + 98746, + 98766, + 98736, + 98780, + 98765, + 98777, + 98801, + 98768, + 98771, + 98780, + 98785, + 98755, + 98780, + 98786, + 98780, + 98800, + 98799, + 98741, + 98735, + 98733, + 98750, + 98783, + 98731, + 98742, + 98759, + 98745, + 98753, + 98758, + 98772, + 98762, + 98762, + 98747, + 98774, + 98752, + 98767, + 98725, + 98773, + 98777, + 98772, + 98755, + 98767, + 98736, + 98765, + 98742, + 98766, + 98750, + 98824, + 98781, + 98773, + 98741, + 98762, + 98749, + 98742, + 98731, + 98735, + 98773, + 98769, + 98762, + 98731, + 98742, + 98764, + 98746, + 98732, + 98757, + 98755, + 98723, + 98751, + 98755, + 98769, + 98744, + 98773, + 98763, + 98740, + 98772, + 98767, + 98770, + 98807, + 98789, + 98767, + 98758, + 98762, + 98753, + 98734, + 98754, + 98783, + 98779, + 98757, + 98772, + 98744, + 98734, + 98763, + 98759, + 98755, + 98767, + 98773, + 98765, + 98772, + 98753, + 98758, + 98755, + 98772, + 98731, + 98759, + 98778, + 98765, + 98773, + 98823, + 98792, + 98757, + 98761, + 98759, + 98760, + 98794, + 98754, + 98738, + 98747, + 98792, + 98767, + 98769, + 98764, + 98792, + 98750, + 98757, + 98764, + 98749, + 98744, + 98763, + 98761, + 98767, + 98762, + 98760, + 98754, + 98744, + 98771, + 98761, + 98770, + 98797, + 98737, + 98778, + 98740, + 98768, + 98771, + 98751, + 98749, + 98749, + 98771, + 98766, + 98762, + 98759, + 98764, + 98752, + 98751, + 98775, + 98754, + 98745, + 98760, + 98758, + 98783, + 98776, + 98757, + 98814, + 98774, + 98776, + 98744, + 98742, + 98765, + 99222, + 98770, + 98757, + 98783, + 98757, + 98756, + 98753, + 98743, + 98767, + 98758, + 98756, + 98755, + 98746, + 98781, + 98730, + 98757, + 98750, + 98734, + 98763, + 98769, + 98759, + 98736, + 98767, + 98751, + 98754, + 98747, + 98753, + 98778, + 98762, + 98793, + 98789, + 98741, + 98777, + 98777, + 98758, + 98734, + 98738, + 98755, + 98732, + 98765, + 98749, + 98761, + 98745, + 98724, + 98738, + 98755, + 98760, + 98750, + 98744, + 98742, + 98756, + 98764, + 98743, + 98737, + 98749, + 98759, + 98757, + 98761, + 98769, + 98740, + 98769, + 98759, + 98760, + 98763, + 98738, + 98784, + 98751, + 98733, + 98743, + 98757, + 98745, + 98728, + 98726, + 98762, + 98751, + 98739, + 98758, + 98770, + 98758, + 98736, + 98732, + 98768, + 98751, + 98782, + 98762, + 98759, + 98756, + 98749, + 98742, + 98748, + 98749, + 98753, + 98772, + 98766, + 98761, + 98761, + 98770, + 98758, + 98757, + 98749, + 98746, + 98732, + 98762, + 98729, + 98770, + 98744, + 98760, + 98733, + 98757, + 98741, + 98733, + 98746, + 98734, + 98742, + 98732, + 98802, + 98741, + 98736, + 98751, + 98757, + 98748, + 98761, + 98764, + 98764, + 98722, + 98751, + 98796, + 98752, + 98739, + 98743, + 98764, + 98767, + 98745, + 98742, + 98780, + 98760, + 98739, + 98757, + 98770, + 98722, + 98770, + 98767, + 98743, + 98772, + 98783, + 98737, + 98755, + 98748, + 98748, + 98739, + 98732, + 98769, + 98770, + 98765, + 98762, + 98761, + 98764, + 98822, + 98761, + 98741, + 98746, + 98760, + 98762, + 98736, + 98750, + 98770, + 98754, + 98776, + 98769, + 98773, + 98759, + 98778, + 98757, + 98768, + 98757, + 98759, + 98772, + 98762, + 98745, + 98767, + 98757, + 98795, + 98734, + 98759, + 98776, + 98753, + 98745, + 98761, + 98753, + 98762, + 98751, + 98776, + 98779, + 98767, + 98754, + 98736, + 98762, + 98772, + 98747, + 98731, + 98760, + 98735, + 98755, + 98788, + 98752, + 98755, + 98771, + 98776, + 98801, + 98771, + 98759, + 98758, + 98766, + 98759, + 98798, + 98749, + 98763, + 98764, + 98737, + 98774, + 98769, + 98775, + 98765, + 98764, + 98767, + 98757, + 98753, + 98762, + 98730, + 98785, + 98739, + 98765, + 98753, + 98765, + 98761, + 98759, + 98766, + 98757, + 98768, + 98782, + 98777, + 98752, + 98766, + 98765, + 98736, + 98775, + 98763, + 98762, + 98767, + 98756, + 98796, + 98756, + 98819, + 98757, + 98766, + 98743, + 98774, + 98768, + 98765, + 98755, + 98737, + 98771, + 98753, + 98771, + 98772, + 98766, + 98737, + 98758, + 98752, + 98770, + 98772, + 98742, + 98730, + 98765, + 98760, + 98770, + 98766, + 98724, + 98745, + 98743, + 98778, + 98763, + 98752, + 98731, + 98755, + 98777, + 98741, + 98767, + 98741, + 98746, + 98748, + 98784, + 98740, + 98771, + 98729, + 98753, + 98754, + 98789, + 98766, + 98747, + 98790, + 98786, + 98727, + 98747, + 98753, + 98757, + 98777, + 98753, + 98760, + 98761, + 98736, + 98751, + 98769, + 98754, + 98766, + 98743, + 98757, + 98739, + 98764, + 98751, + 98741, + 98774, + 98757, + 98768, + 98828, + 98782, + 98779, + 98788, + 98758, + 98763, + 98774, + 98760, + 98751, + 98771, + 98754, + 98792, + 98781, + 98766, + 98767, + 98757, + 98768, + 98773, + 98757, + 98836, + 98761, + 98800, + 98762, + 98787, + 98774, + 98757, + 98761, + 98782, + 98761, + 98781, + 98758, + 98759, + 98730, + 98780, + 98753, + 98751, + 98745, + 98773, + 98751, + 98744, + 98752, + 98764, + 98761, + 98751, + 98761, + 98773, + 98768, + 98742, + 98778, + 98783, + 98799, + 98759, + 98763, + 98759, + 98792, + 98758, + 98770, + 98783, + 98757, + 98789, + 98765, + 98752, + 98766, + 98779, + 98764, + 98752, + 98760, + 98764, + 98757, + 98771, + 98772, + 98757, + 98755, + 98778, + 98772, + 98782, + 98789, + 98731, + 98768, + 98759, + 98747, + 98811, + 98765, + 98770, + 98750, + 98768, + 98764, + 98783, + 98761, + 98736, + 98746, + 98754, + 98763, + 98768, + 98775, + 98795, + 98749, + 98748, + 98759, + 98771, + 98740, + 98768, + 98753, + 98733, + 98734, + 98774, + 98743, + 98759, + 98762, + 98770, + 98759, + 98754, + 98789, + 98750, + 98759, + 98749, + 98754, + 98758, + 98770, + 98769, + 98763, + 98737, + 98733, + 98743, + 98763, + 98793, + 98796, + 98741, + 98764, + 98745, + 98756, + 98767, + 98803, + 98748, + 98734, + 98776, + 98772, + 98764, + 98785, + 98727, + 98752, + 98769, + 98791, + 98760, + 98754, + 98768, + 98765, + 98766, + 98725, + 98762, + 98753, + 98726, + 98740, + 98748, + 98774, + 98796, + 98807, + 98783, + 98761, + 98743, + 98754, + 98771, + 98772, + 98773, + 98756, + 98768, + 98765, + 98735, + 98750, + 98756, + 98781, + 98765, + 98760, + 98790, + 98778, + 98770, + 98764, + 98744, + 98758, + 98771, + 98768, + 98727, + 98776, + 98786, + 98763, + 98781, + 98750, + 98754, + 98760, + 98779, + 98773, + 98752, + 98754, + 98737, + 98757, + 98843, + 98766, + 98771, + 98760, + 98740, + 98764, + 98771, + 98758, + 98758, + 98768, + 98728, + 98764, + 98756, + 98747, + 98760, + 98752, + 98753, + 98769, + 98777, + 98737, + 98762, + 98782, + 98723, + 98779, + 98743, + 98755, + 98757, + 98776, + 98762, + 98772, + 98781, + 98788, + 98750, + 98737, + 98771, + 98771, + 98787, + 98765, + 98726, + 98777, + 98710, + 98757, + 98749, + 98764, + 98800, + 98759, + 98745, + 98768, + 98727, + 98764, + 98770, + 98788, + 98754, + 98743, + 98774, + 98761, + 98741, + 98779, + 98750, + 98752, + 98730, + 98757, + 98778, + 98762, + 98753, + 98740, + 98781, + 98746, + 98751, + 98764, + 98779, + 98771, + 98792, + 98733, + 98771, + 98762, + 98736, + 98752, + 98773, + 98751, + 98754, + 98738, + 98749, + 98764, + 98762, + 98738, + 98741, + 98757, + 98760, + 98766, + 98743, + 98757, + 98751, + 98757, + 98789, + 98768, + 98767, + 98740, + 98750, + 98767, + 98732, + 98765, + 98749, + 98735, + 98746, + 98765, + 98736, + 98750, + 98735, + 98750, + 98778, + 98762, + 98746, + 98750, + 98757, + 98719, + 98752, + 98760, + 98769, + 98843, + 98752, + 98774, + 98754, + 98749, + 98732, + 98756, + 98769, + 98726, + 98751, + 98764, + 98751, + 98747, + 98762, + 98740, + 98738, + 98732, + 98761, + 98771, + 98760, + 98758, + 98736, + 98738, + 98734, + 98769, + 98759, + 98759, + 98758, + 98758, + 98758, + 98765, + 98776, + 98764, + 98753, + 98734, + 98783, + 98741, + 98774, + 98762, + 98750, + 98786, + 98763, + 98768, + 98779, + 98758, + 98758, + 98753, + 98728, + 98756, + 98754, + 98762, + 98777, + 98736, + 98743, + 98753, + 98774, + 98736, + 98730, + 98771, + 98725, + 98736, + 98773, + 98808, + 98734, + 98758, + 98720, + 98757, + 98777, + 98754, + 98769, + 98741, + 98756, + 98759, + 98754, + 98756, + 98765, + 98780, + 98737, + 98756, + 98765, + 99005, + 98781, + 98742, + 98742, + 98766, + 98780, + 98757, + 98773, + 98741, + 98744, + 98753, + 98747, + 98755, + 98767, + 98745, + 98748, + 98747, + 98750, + 98748, + 98726, + 98763, + 98743, + 98774, + 98750, + 98749, + 98766, + 98767, + 98742, + 98745, + 98731, + 98755, + 98776, + 98733, + 98759, + 98762, + 98767, + 98764, + 98735, + 98732, + 98775, + 98766, + 98766, + 98757, + 98757, + 98759, + 98756, + 98772, + 98769, + 98736, + 98739, + 98760, + 98752, + 98759, + 98735, + 98756, + 98756, + 98749, + 98752, + 98758, + 98768, + 98764, + 98751, + 98767, + 98757, + 98763, + 98786, + 98754, + 98767, + 98766, + 98764, + 98759, + 98739, + 98746, + 98732, + 98763, + 98791, + 98752, + 98763, + 98769, + 98769, + 98772, + 98737, + 98760, + 98754, + 98749, + 98760, + 98741, + 98737, + 98768, + 98756, + 98841, + 98780, + 98742, + 98751, + 98749, + 98778, + 98765, + 98760, + 98751, + 98776, + 98755, + 98755, + 98734, + 98753, + 98748, + 98751, + 98761, + 98748, + 98749, + 98748, + 98753, + 98731, + 98756, + 98774, + 98733, + 98774, + 98744, + 98776, + 98798, + 98777, + 98749, + 98759, + 98774, + 98764, + 98747, + 98770, + 98762, + 98775, + 98764, + 98777, + 98772, + 98809, + 98749, + 98771, + 98733, + 98735, + 98779, + 98805, + 98784, + 98774, + 98783, + 98772, + 98776, + 98792, + 98768, + 98784, + 98760, + 98764, + 98771, + 98756, + 98756, + 98734, + 98732, + 98784, + 98777, + 98779, + 98738, + 98765, + 98757, + 98752, + 98769, + 98756, + 98762, + 98753, + 98786, + 98765, + 98752, + 98730, + 98761, + 98762, + 98807, + 98759, + 98761, + 98760, + 98736, + 98783, + 98748, + 98741, + 98756, + 98764, + 98736, + 98743, + 98759, + 98746, + 98758, + 98772, + 98758, + 98736, + 98754, + 98735, + 98777, + 98790, + 98737, + 98779, + 98754, + 98752, + 98769, + 98783, + 98767, + 98746, + 98763, + 98770, + 98761, + 98759, + 98791, + 98764, + 98784, + 98754, + 98742, + 98923, + 98756, + 98778, + 98761, + 98778, + 98760, + 98745, + 98788, + 98759, + 98803, + 98763, + 98774, + 98751, + 98739, + 98758, + 98785, + 98734, + 98754, + 98757, + 98739, + 98764, + 98763, + 98757, + 98738, + 98765, + 98757, + 98768, + 98770, + 98766, + 98759, + 98799, + 98733, + 98773, + 98757, + 98761, + 98754, + 98732, + 98766, + 98742, + 98730, + 98779, + 98765, + 98746, + 98744, + 98738, + 98754, + 98790, + 98761, + 98757, + 98762, + 98770, + 98759, + 98725, + 98734, + 98786, + 98779, + 98765, + 98754, + 98776, + 98776, + 98785, + 98751, + 98786, + 98772, + 98770, + 98791, + 98767, + 98763, + 98745, + 98768, + 98738, + 98761, + 98775, + 98752, + 98754, + 98739, + 98745, + 98731, + 98790, + 98752, + 98742, + 98763, + 98759, + 98757, + 98787, + 98754, + 98792, + 98743, + 98735, + 98765, + 98814, + 98769, + 98760, + 98731, + 98722, + 98750, + 98746, + 98738, + 98741, + 98759, + 98749, + 98737, + 98777, + 98755, + 98739, + 98786, + 98744, + 98734, + 98762, + 98774, + 98760, + 98769, + 98765, + 98749, + 98765, + 98739, + 98765, + 98760, + 98737, + 98765, + 98797, + 98723, + 98755, + 98726, + 98745, + 98743, + 98769, + 98751, + 98725, + 98764, + 98741, + 98756, + 98765, + 98764, + 98763, + 98741, + 98762, + 98735, + 98771, + 98770, + 98742, + 98767, + 98748, + 98761, + 98767, + 98766, + 98742, + 98789, + 98745, + 98758, + 98749, + 98734, + 98761, + 98753, + 98724, + 98755, + 98740, + 98745, + 98752, + 98774, + 98763, + 98763, + 98762, + 98767, + 98751, + 98738, + 98768, + 98756, + 98755, + 98752, + 98752, + 98742, + 98751, + 98759, + 98759, + 98761, + 98805, + 98779, + 98789, + 98748, + 98797, + 98724, + 98760, + 98760, + 98758, + 98743, + 98763, + 98759, + 98762, + 98776, + 98762, + 98764, + 98740, + 98754, + 98770, + 98753, + 98730, + 98750, + 98747, + 98763, + 98758, + 98771, + 98759, + 98753, + 98740, + 98767, + 98755, + 98761, + 98754, + 98752, + 98795, + 98767, + 98762, + 98741, + 98742, + 98737, + 98755, + 98752, + 98758, + 98757, + 98739, + 98742, + 98769, + 98791, + 98793, + 98778, + 98759, + 98748, + 98753, + 98756, + 98759, + 98771, + 98776, + 98765, + 98752, + 98762, + 98757, + 98739, + 98775, + 98785, + 98767, + 98778, + 98757, + 98764, + 98749, + 98775, + 98766, + 98760, + 98740, + 98770, + 98763, + 98772, + 98739, + 98734, + 98752, + 98770, + 98772, + 98746, + 98767, + 98757, + 98764, + 98775, + 98768, + 98755, + 98775, + 98756, + 98727, + 98776, + 98740, + 98752, + 98777, + 98766, + 98759, + 98745, + 98758, + 98784, + 98778, + 98769, + 98743, + 98773, + 98756, + 98768, + 98728, + 98753, + 98769, + 98791, + 98783, + 98771, + 98784, + 98779, + 98774, + 98814, + 98750, + 98762, + 98759, + 98767, + 98738, + 98745, + 98758, + 98751, + 98779, + 98764, + 98755, + 98773, + 98740, + 98749, + 98798, + 98747, + 98767, + 98751, + 98737, + 98737, + 98761, + 98802, + 98739, + 98728, + 98772, + 98756, + 98779, + 98751, + 98760, + 98773, + 98765, + 98765, + 98736, + 98760, + 98760, + 98737, + 98746, + 98744, + 98778, + 98765, + 98744, + 98757, + 98747, + 98763, + 98765, + 98788, + 98754, + 98765, + 98761, + 98738, + 98775, + 98757, + 98740, + 98781, + 98769, + 98778, + 98779, + 98761, + 98746, + 98765, + 98803, + 98751, + 98770, + 98764, + 98765, + 98756, + 98724, + 98783, + 98787, + 98757, + 98756, + 98819, + 98758, + 98736, + 98789, + 98752, + 98826, + 98762, + 98732, + 98777, + 98767, + 98754, + 98766, + 98792, + 98727, + 98758, + 98780, + 98767, + 98741, + 98730, + 98746, + 98757, + 98743, + 98777, + 98747, + 98728, + 98723, + 98727, + 98773, + 98758, + 98748, + 98732, + 98759, + 98769, + 98769, + 98742, + 98750, + 98768, + 98758, + 98732, + 98735, + 98785, + 98740, + 98760, + 98729, + 98762, + 98755, + 98770, + 98750, + 98743, + 98779, + 98752, + 98783, + 98767, + 98762, + 98767, + 98756, + 98763, + 98789, + 98747, + 98760, + 98740, + 98754, + 98784, + 98769, + 98759, + 98764, + 98770, + 98731, + 98767, + 98746, + 98768, + 98763, + 98768, + 98781, + 98750, + 98770, + 98751, + 98759, + 98766, + 98767, + 98759, + 98755, + 98736, + 98790, + 98750, + 98748, + 98744, + 98763, + 98740, + 98792, + 98751, + 98766, + 98753, + 98760, + 98762, + 98740, + 98733, + 98762, + 98769, + 98777, + 98753, + 98779, + 98758, + 98723, + 98737, + 98777, + 98772, + 98786, + 98769, + 98777, + 98756, + 98766, + 98769, + 98743, + 98746, + 98731, + 98757, + 98770, + 98758, + 98788, + 98775, + 98726, + 98749, + 98747, + 98773, + 98748, + 98731, + 98760, + 98728, + 98741, + 98745, + 98753, + 98768, + 98755, + 98759, + 98759, + 98744, + 98757, + 98757, + 98758, + 98735, + 98755, + 98738, + 98765, + 98744, + 98749, + 98761, + 98777, + 98762, + 98746, + 98759, + 98720, + 98734, + 98771, + 98769, + 98755, + 98761, + 98724, + 98764, + 98762, + 98788, + 98746, + 98751, + 98759, + 98751, + 98767, + 98737, + 98752, + 98743, + 98725, + 98755, + 98764, + 98755, + 98757, + 98762, + 98745, + 98750, + 98781, + 98732, + 98742, + 98773, + 98731, + 98763, + 98778, + 98743, + 98752, + 98740, + 98763, + 98756, + 98748, + 98738, + 98730, + 98754, + 98741, + 98763, + 98765, + 98756, + 98756, + 98762, + 98738, + 98733, + 98777, + 98729, + 98752, + 98771, + 98758, + 98765, + 98730, + 98760, + 98760, + 98735, + 98750, + 98761, + 98767, + 98766, + 98772, + 98742, + 98742, + 98762, + 98746, + 98782, + 98794, + 98728, + 98751, + 98753, + 98748, + 98765, + 98743, + 98761, + 98782, + 98794, + 98771, + 98756, + 98760, + 98735, + 98737, + 98767, + 98760, + 98759, + 98750, + 98756, + 98756, + 98746, + 98762, + 98741, + 98764, + 98744, + 98734, + 98763, + 98743, + 98751, + 98767, + 98786, + 98731, + 98739, + 98792, + 98764, + 98731, + 98775, + 98757, + 98750, + 98774, + 98738, + 98754, + 98746, + 98767, + 98764, + 98746, + 98748, + 98788, + 98774, + 98720, + 98767, + 98761, + 98779, + 98756, + 98764, + 98747, + 98763, + 98733, + 98743, + 98759, + 98734, + 98731, + 98763, + 98749, + 98756, + 98748, + 98735, + 98742, + 98763, + 98782, + 98756, + 98766, + 98797, + 98713, + 98744, + 98751, + 98726, + 98736, + 98735, + 98729, + 98728, + 98735, + 98727, + 98757, + 98767, + 98756, + 98775, + 98768, + 98749, + 98735, + 98752, + 98769, + 98757, + 98765, + 98760, + 98793, + 98731, + 98764, + 98766, + 98761, + 98749, + 98750, + 98763, + 98724, + 98754, + 98754, + 98747, + 98760, + 98736, + 98740, + 98760, + 98769, + 98738, + 98731, + 98753, + 98748, + 98727, + 98768, + 98756, + 98766, + 98757, + 98768, + 98725, + 98784, + 98756, + 98760, + 98769, + 98748, + 98751, + 98753, + 98750, + 98793, + 98797, + 98748, + 98772, + 98740, + 98750, + 98770, + 98766, + 98766, + 98759, + 98767, + 98765, + 98740, + 98746, + 98786, + 98759, + 98779, + 98757, + 98746, + 98762, + 98736, + 98808, + 98775, + 98780, + 98756, + 98765, + 98738, + 98768, + 98782, + 98765, + 98763, + 98770, + 98747, + 98756, + 98774, + 98745, + 98739, + 98750, + 98742, + 98735, + 98784, + 98748, + 98744, + 98768, + 98857, + 98754, + 98780, + 98760, + 98769, + 98767, + 98739, + 98751, + 98768, + 98766, + 98766, + 98779, + 98747, + 98737, + 98752, + 98760, + 98740, + 98765, + 98781, + 98763, + 98732, + 98741, + 98756, + 98784, + 98741, + 98752, + 98752, + 98761, + 98765, + 98770, + 98744, + 98733, + 98758, + 98779, + 98757, + 98746, + 98760, + 98783, + 98768, + 98728, + 98748, + 98768, + 98742, + 98770, + 98773, + 98763, + 98753, + 98740, + 98760, + 98755, + 98795, + 98741, + 98759, + 98748, + 98736, + 98752, + 98747, + 98740, + 98764, + 98748, + 98753, + 98747, + 98755, + 98738, + 98744, + 98756, + 98746, + 98769, + 98777, + 98769, + 98747, + 98751, + 98766, + 98758, + 98742, + 98741, + 98776, + 98754, + 98773, + 98760, + 98735, + 98754, + 98735, + 98722, + 98732, + 98756, + 98761, + 98736, + 98729, + 98744, + 98759, + 98777, + 98765, + 98765, + 98785, + 98743, + 98722, + 98740, + 98730, + 98729, + 98765, + 98755, + 98769, + 98743, + 98728, + 98773, + 98735, + 98734, + 98770, + 98727, + 98762, + 98734, + 98754, + 98764, + 98743, + 98765, + 98746, + 98746, + 98755, + 98754, + 98734, + 98747, + 98754, + 98867, + 98744, + 98776, + 98761, + 98763, + 98733, + 98753, + 98732, + 98774, + 98719, + 98777, + 98731, + 98749, + 98759, + 98733, + 98744, + 98798, + 98752, + 98728, + 98731, + 98760, + 98760, + 98756, + 98741, + 98771, + 98745, + 98737, + 98757, + 98757, + 98758, + 98726, + 98758, + 98765, + 98747, + 98732, + 98775, + 98773, + 98740, + 98778, + 98735, + 98763, + 98760, + 98731, + 98759, + 98763, + 98744, + 98756, + 98761, + 98766, + 98733, + 98729, + 98756, + 98752, + 98750, + 98754, + 98767, + 98749, + 98745, + 98730, + 98774, + 98730, + 98763, + 98742, + 98733, + 98742, + 98765, + 98744, + 98750, + 98788, + 98759, + 98745, + 98876, + 98764, + 98763, + 98735, + 98811, + 98790, + 98757, + 98743, + 98758, + 98789, + 98763, + 98803, + 98767, + 98768, + 98784, + 98725, + 98750, + 98786, + 98775, + 98759, + 98749, + 98786, + 98764, + 98808, + 98752, + 98735, + 98759, + 98752, + 98732, + 98775, + 98778, + 98778, + 98766, + 98773, + 98759, + 98725, + 98770, + 98788, + 98753, + 98752, + 98761, + 98742, + 98755, + 98757, + 98759, + 98735, + 98732, + 98752, + 98757, + 98763, + 98757, + 98761, + 98779, + 98747, + 98733, + 98759, + 98743, + 98752, + 98747, + 98764, + 98768, + 98759, + 98759, + 98756, + 98756, + 98767, + 98793, + 98747, + 98731, + 98747, + 98759, + 98752, + 98760, + 98769, + 98739, + 98743, + 98756, + 98779, + 98778, + 98743, + 98744, + 98753, + 98723, + 98742, + 98755, + 98731, + 98766, + 98730, + 98753, + 98735, + 98758, + 98755, + 98755, + 98767, + 98799, + 98759, + 98745, + 98759, + 98765, + 98757, + 98738, + 98762, + 98769, + 98738, + 98749, + 98727, + 98748, + 98743, + 98778, + 98757, + 98782, + 98768, + 98752, + 98777, + 98732, + 98752, + 98770, + 98759, + 98729, + 98750, + 98764, + 98799, + 98765, + 98791, + 98775, + 98764, + 98803, + 98778, + 98773, + 98802, + 98749, + 98759, + 98763, + 98737, + 98758, + 98762, + 98774, + 98761, + 98736, + 98743, + 98724, + 98767, + 98735, + 98731, + 98759, + 98758, + 98759, + 98753, + 98735, + 98734, + 98749, + 98770, + 98744, + 98775, + 98728, + 98764, + 98752, + 98748, + 98760, + 98760, + 98768, + 98757, + 98782, + 98738, + 98738, + 98795, + 98726, + 98758, + 98768, + 98724, + 98758, + 98762, + 98758, + 98750, + 98742, + 98730, + 98752, + 98779, + 98770, + 98754, + 98773, + 98735, + 98749, + 98770, + 98805, + 98763, + 98760, + 98766, + 98779, + 98771, + 98795, + 98749, + 98748, + 98757, + 98765, + 98735, + 98776, + 98760, + 98769, + 98758, + 98774, + 98780, + 98741, + 98754, + 98760, + 98752, + 98762, + 98745, + 98752, + 98753, + 98762, + 98745, + 98740, + 98761, + 98728, + 98756, + 98740, + 98769, + 98785, + 98733, + 98768, + 98756, + 98744, + 98736, + 98738, + 98737, + 98780, + 98729, + 98755, + 98739, + 98760, + 98739, + 98743, + 98773, + 98757, + 98739, + 98760, + 98730, + 98738, + 98757, + 98719, + 98748, + 98771, + 98741, + 98782, + 98760, + 98749, + 98764, + 98759, + 98759, + 98763, + 98753, + 98759, + 98738, + 98760, + 98757, + 98750, + 98752, + 98763, + 98742, + 98800, + 98760, + 98751, + 98748, + 98782, + 98749, + 98737, + 98755, + 98753, + 98761, + 98780, + 98765, + 98771, + 98824, + 98747, + 98753, + 98736, + 98771, + 98751, + 98779, + 98772, + 98757, + 98761, + 98743, + 98765, + 98772, + 98774, + 98755, + 98790, + 98759, + 98740, + 98763, + 98740, + 98747, + 98750, + 98758, + 98720, + 98784, + 98761, + 98751, + 98755, + 98733, + 98767, + 98788, + 98736, + 98730, + 98765, + 98784, + 98763, + 98735, + 98748, + 98779, + 98771, + 98720, + 98747, + 98750, + 98766, + 98759, + 98744, + 98729, + 98730, + 98743, + 98764, + 98729, + 98747, + 98773, + 98722, + 98756, + 98727, + 98739, + 98815, + 98754, + 98773, + 98758, + 98732, + 98742, + 98761, + 98756, + 98736, + 98757, + 98757, + 98736, + 98758, + 98759, + 98759, + 98729, + 98749, + 98753, + 98741, + 98748, + 98752, + 98763, + 98746, + 98763, + 98779, + 98759, + 98796, + 98753, + 98766, + 98782, + 98729, + 98777, + 98728, + 98771, + 98726, + 98763, + 98775, + 98756, + 98770, + 98771, + 98773, + 98799, + 98757, + 98774, + 98781, + 98719, + 98730, + 98750, + 98745, + 98748, + 98735, + 98763, + 98751, + 98769, + 98785, + 98754, + 98769, + 98721, + 98755, + 98740, + 98751, + 98772, + 98743, + 98803, + 98753, + 98747, + 98760, + 98745, + 98725, + 98739, + 98758, + 98752, + 98780, + 98753, + 98761, + 98737, + 98744, + 98738, + 98773, + 98761, + 98766, + 98751, + 98765, + 98756, + 98792, + 98757, + 98749, + 98740, + 98768, + 98774, + 98753, + 98756, + 98768, + 98769, + 98809, + 98757, + 98759, + 98754, + 98792, + 98775, + 98767, + 98750, + 98754, + 98768, + 98773, + 98726, + 98743, + 98770, + 98740, + 98757, + 98732, + 98742, + 98751, + 98779, + 98760, + 98751, + 98756, + 98766, + 98734, + 98771, + 98757, + 98748, + 98762, + 98784, + 98724, + 98768, + 98764, + 98736, + 98752, + 98748, + 98731, + 98763, + 98762, + 98736, + 98730, + 98746, + 98724, + 98762, + 98762, + 98734, + 98764, + 98755, + 98731, + 98744, + 98763, + 98723, + 98736, + 98782, + 98731, + 98758, + 98769, + 98756, + 98769, + 98886, + 98811, + 98764, + 98793, + 98722, + 98777, + 98778, + 98762, + 98762, + 98747, + 98738, + 98762, + 98813, + 98739, + 98746, + 98774, + 98742, + 98761, + 98755, + 98753, + 98757, + 98764, + 98754, + 98768, + 98742, + 98727, + 98777, + 98741, + 98760, + 98761, + 98749, + 98747, + 98729, + 98743, + 98729, + 98743, + 98736, + 98761, + 98750, + 98755, + 98729, + 98756, + 98757, + 98788, + 98757, + 98747, + 98789, + 98758, + 98759, + 98736, + 98754, + 98751, + 98763, + 98750, + 98756, + 98725, + 98755, + 98757, + 98754, + 99186, + 98821, + 98789, + 98750, + 98786, + 98755, + 98742, + 98813, + 98729, + 98766, + 98749, + 98731, + 98746, + 98775, + 98728, + 98764, + 98760, + 98750, + 98763, + 98746, + 98748, + 98737, + 98732, + 98724, + 98756, + 98783, + 98756, + 98751, + 98794, + 98791, + 98777, + 98736, + 98732, + 98735, + 98726, + 98758, + 98751, + 98777, + 98753, + 98734, + 98758, + 98746, + 98754, + 98770, + 98732, + 98753, + 98759, + 98755, + 98765, + 98748, + 98783, + 98771, + 98750, + 98779, + 98774, + 98767, + 98739, + 98757, + 98765, + 98754, + 98742, + 98748, + 98747, + 98766, + 98763, + 98733, + 98756, + 98761, + 98748, + 98736, + 98785, + 98764, + 98733, + 98775, + 98752, + 98738, + 98772, + 98756, + 98774, + 98761, + 98740, + 98784, + 98748, + 98762, + 98732, + 98729, + 98746, + 98743, + 98733, + 98758, + 98766, + 98788, + 98724, + 98734, + 98784, + 98779, + 98736, + 98759, + 98731, + 98765, + 98776, + 98738, + 98733, + 98765, + 98736, + 98754, + 98751, + 98752, + 98753, + 98765, + 98752, + 98730, + 98757, + 98777, + 98726, + 98759, + 98754, + 98735, + 98781, + 98749, + 98786, + 98770, + 98757, + 98762, + 98729, + 98746, + 98768, + 98773, + 98740, + 98763, + 98765, + 98747, + 98765, + 98755, + 98732, + 98761, + 98757, + 98761, + 98774, + 98749, + 98745, + 98752, + 98757, + 98763, + 98758, + 98728, + 98773, + 98763, + 98740, + 98740, + 98765, + 98776, + 98750, + 98761, + 98754, + 98746, + 98758, + 98757, + 98748, + 98731, + 98748, + 98751, + 98749, + 98773, + 98751, + 98732, + 98815, + 98755, + 98727, + 98741, + 98752, + 98759, + 98734, + 98728, + 98736, + 98761, + 98748, + 98718, + 98755, + 98762, + 98818, + 98756, + 98752, + 98738, + 98743, + 98727, + 98754, + 98767, + 98759, + 98756, + 98731, + 98750, + 98738, + 98778, + 98739, + 98725, + 98754, + 98773, + 98777, + 98747, + 98775, + 98781, + 98741, + 98790, + 98758, + 98746, + 98753, + 98743, + 98772, + 98749, + 98776, + 98749, + 98752, + 98729, + 98755, + 98759, + 98763, + 98780, + 98756, + 98728, + 98752, + 98743, + 98740, + 98767, + 98765, + 98756, + 98731, + 98741, + 98733, + 98733, + 98726, + 98755, + 98766, + 98736, + 98748, + 98723, + 98751, + 98769, + 98736, + 98736, + 98740, + 98784, + 98753, + 98738, + 98779, + 98750, + 98768, + 98759, + 98723, + 98777, + 98754, + 98772, + 98766, + 98752, + 98756, + 98763, + 98761, + 98743, + 98754, + 98757, + 98761, + 98754, + 98782, + 98749, + 98772, + 98718, + 98764, + 98770, + 98769, + 98770, + 98764, + 98732, + 98714, + 98756, + 98735, + 98746, + 98756, + 98735, + 98755, + 98758, + 98736, + 98722, + 98737, + 98773, + 98754, + 98774, + 98767, + 98778, + 98761, + 98744, + 98729, + 98759, + 98764, + 98767, + 98767, + 98763, + 98724, + 98766, + 98752, + 98752, + 98777, + 98790, + 98769, + 98759, + 98780, + 98813, + 98775, + 99879, + 98730, + 98756, + 98771, + 98765, + 98746, + 98794, + 98735, + 98754, + 98765, + 98753, + 98747, + 98760, + 98767, + 98753, + 98740, + 98757, + 98768, + 98770, + 98747, + 98757, + 98750, + 98777, + 98765, + 98768, + 98730, + 98747, + 98773, + 98753, + 98762, + 98762, + 98733, + 98741, + 98779, + 98780, + 98760, + 98782, + 98752, + 98759, + 98769, + 98752, + 98756, + 98721, + 98758, + 98736, + 98741, + 98757, + 98744, + 98748, + 98755, + 98735, + 98756, + 98748, + 98774, + 98741, + 98723, + 98759, + 98768, + 98746, + 98754, + 98761, + 98766, + 98733, + 98781, + 98767, + 98746, + 98735, + 98767, + 98758, + 98762, + 98766, + 98755, + 98762, + 98732, + 98727, + 98761, + 98753, + 98777, + 98773, + 98745, + 98753, + 98775, + 98776, + 98782, + 98737, + 98764, + 98758, + 98760, + 98756, + 98764, + 98748, + 98748, + 98753, + 98769, + 98764, + 98735, + 98763, + 98762, + 98756, + 98745, + 98731, + 98756, + 98727, + 98739, + 98756, + 98732, + 98767, + 98766, + 98747, + 98748, + 98763, + 98741, + 98761, + 98764, + 98785, + 98764, + 98748, + 98775, + 98733, + 98756, + 98759, + 98753, + 98765, + 98795, + 98746, + 98739, + 98745, + 98770, + 98771, + 98729, + 98755, + 98758, + 98737, + 98726, + 98784, + 98729, + 98741, + 98768, + 98761, + 98745, + 98772, + 98771, + 98772, + 98746, + 98762, + 98780, + 98736, + 98782, + 98744, + 98779, + 98744, + 98771, + 98775, + 98767, + 98761, + 98754, + 98748, + 98762, + 98784, + 98747, + 98745, + 98753, + 98729, + 98737, + 98761, + 98763, + 98737, + 98769, + 98731, + 98730, + 98722, + 98757, + 98761, + 98753, + 98724, + 98733, + 98743, + 98763, + 98736, + 98746, + 98757, + 98773, + 98736, + 98751, + 98756, + 98756, + 98761, + 98755, + 98734, + 98768, + 98748, + 98739, + 98744, + 98743, + 98743, + 98734, + 98752, + 98767, + 98749, + 98743, + 98769, + 98739, + 98771, + 98771, + 98778, + 98758, + 98771, + 98769, + 98748, + 98768, + 98763, + 98783, + 98762, + 98754, + 98813, + 98794, + 98760, + 98734, + 98776, + 98760, + 98747, + 98744, + 98733, + 98787, + 98760, + 98747, + 98754, + 98775, + 98764, + 98791, + 98737, + 98735, + 98812, + 98779, + 98772, + 98725, + 98754, + 98759, + 98759, + 98776, + 98771, + 98747, + 98771, + 98750, + 98745, + 98759, + 98780, + 98733, + 98772, + 98755, + 98752, + 98763, + 98747, + 98751, + 98735, + 98758, + 98759, + 98768, + 98753, + 98729, + 98734, + 98743, + 98733, + 98786, + 98757, + 98738, + 98745, + 98736, + 98758, + 98747, + 98752, + 98761, + 98755, + 98784, + 98737, + 98742, + 98785, + 98748, + 98762, + 98761, + 98737, + 98750, + 98766, + 98738, + 98783, + 98759, + 98759, + 98771, + 98752, + 98732, + 98763, + 98738, + 98783, + 98757, + 98765, + 98736, + 98761, + 98740, + 98761, + 98769, + 98759, + 98789, + 98754, + 98748, + 98753, + 98769, + 98766, + 98746, + 98765, + 98732, + 98738, + 98751, + 98759, + 98738, + 98745, + 98748, + 98744, + 98763, + 98768, + 98765, + 98755, + 98732, + 98738, + 98755, + 98766, + 98736, + 98767, + 98747, + 98721, + 98760, + 98763, + 98750, + 98754, + 98751, + 98751, + 98761, + 98737, + 98745, + 98756, + 98745, + 98735, + 98727, + 98752, + 98730, + 98761, + 98770, + 98756, + 98782, + 98745, + 98725, + 98760, + 98773, + 98762, + 98745, + 98793, + 98772, + 98763, + 98730, + 98743, + 98763, + 98758, + 98762, + 98763, + 98778, + 98736, + 98749, + 98741, + 98757, + 98760, + 98766, + 98753, + 98752, + 98755, + 98765, + 98745, + 98781, + 98753, + 98750, + 98736, + 98806, + 98770, + 98765, + 98779, + 98769, + 98764, + 98733, + 98739, + 98754, + 98742, + 98771, + 98740, + 98758, + 98757, + 98728, + 98762, + 98765, + 98784, + 98766, + 98756, + 98747, + 98741, + 98733, + 98755, + 98757, + 98748, + 98767, + 98768, + 98731, + 98754, + 98751, + 98768, + 98774, + 98772, + 98765, + 98769, + 98774, + 98750, + 98742, + 98734, + 98765, + 98749, + 98717, + 98730, + 98769, + 98778, + 98765, + 98765, + 98748, + 98785, + 98747, + 98732, + 98738, + 98760, + 98743, + 98787, + 98767, + 98753, + 98725, + 98761, + 98743, + 98760, + 98763, + 98790, + 98748, + 98764, + 98758, + 98772, + 98744, + 98762, + 98747, + 98770, + 98761, + 98735, + 98760, + 98726, + 98759, + 98748, + 98805, + 98752, + 98737, + 98763, + 98760, + 98770, + 98766, + 98784, + 98788, + 98758, + 98748, + 98764, + 98828, + 98753, + 98745, + 100000, + 98785, + 98810, + 98793, + 98782, + 98811, + 98807, + 98747, + 98771, + 98776, + 98758, + 98794, + 98778, + 98727, + 98736, + 98759, + 98758, + 98766, + 98746, + 98759, + 98734, + 98760, + 98761, + 98748, + 98748, + 98750, + 98761, + 98758, + 98751, + 98810, + 98782, + 98730, + 98774, + 98764, + 98745, + 98751, + 98748, + 98782, + 98759, + 98761, + 98760, + 98740, + 98749, + 98771, + 98771, + 98774, + 98777, + 98763, + 98770, + 98751, + 98769, + 98773, + 98756, + 98735, + 98764, + 98727, + 98801, + 98768, + 98776, + 98762, + 98764, + 98758, + 98763, + 98759, + 98751, + 98759, + 98764, + 98765, + 98782, + 98753, + 98788, + 98763, + 98796, + 98775, + 98769, + 98775, + 98761, + 98776, + 98774, + 98773, + 98762, + 98758, + 98773, + 98789, + 98813, + 98747, + 98764, + 98760, + 98771, + 98763, + 98750, + 98750, + 98786, + 98794, + 98783, + 98781, + 98778, + 98765, + 98769, + 98750, + 98744, + 98753, + 98758, + 98748, + 98755, + 98736, + 98745, + 98764, + 98728, + 98766, + 98744, + 98773, + 98737, + 98788, + 98745, + 98762, + 98771, + 98764, + 98745, + 98759, + 98762, + 98743, + 98752, + 98761, + 98734, + 98752, + 98755, + 98781, + 98763, + 98748, + 98780, + 98748, + 98731, + 98767, + 98751, + 98749, + 98772, + 98739, + 98771, + 98762, + 98761, + 98736, + 98739, + 98754, + 98746, + 98741, + 98725, + 98746, + 98758, + 98760, + 98729, + 98764, + 98767, + 98747, + 98764, + 98753, + 98753, + 98744, + 98737, + 98754, + 98760, + 98762, + 98736, + 98756, + 98758, + 98764, + 98771, + 98775, + 98762, + 98760, + 98774, + 98748, + 98769, + 98767, + 98764, + 98741, + 98763, + 98761, + 98734, + 98755, + 98758, + 98766, + 98762, + 98764, + 98749, + 98790, + 98758, + 98764, + 98765, + 98741, + 98773, + 98763, + 98755, + 98760, + 98762, + 98768, + 98739, + 98746, + 98747, + 98755, + 98736, + 98763, + 98771, + 98765, + 98744, + 98779, + 98783, + 98741, + 98780, + 99025, + 98769, + 98760, + 98764, + 98722, + 98767, + 98730, + 98769, + 98784, + 98757, + 98739, + 98732, + 98795, + 98728, + 98743, + 98769, + 98731, + 98746, + 98756, + 98755, + 98759, + 98769, + 98725, + 98727, + 98767, + 98775, + 98757, + 98761, + 98744, + 98753, + 98750, + 98766, + 98753, + 98764, + 98809, + 98729, + 98815, + 98774, + 98858, + 98765, + 98737, + 98782, + 98759, + 98748, + 98768, + 98738, + 98735, + 98758, + 98760, + 98752, + 98751, + 98764, + 98763, + 98722, + 98764, + 98736, + 98761, + 98767, + 98768, + 98819, + 98776, + 98740, + 98769, + 98758, + 98731, + 98769, + 98772, + 98778, + 98762, + 98758, + 98734, + 98745, + 98765, + 98733, + 98758, + 98782, + 98744, + 98735, + 98745, + 98750, + 98749, + 98761, + 98751, + 98756, + 98761, + 98760, + 98726, + 98766, + 98765, + 98783, + 98770, + 98763, + 98740, + 98733, + 98780, + 98764, + 98738, + 98742, + 98750, + 98759, + 98991, + 98766, + 98756, + 98738, + 98758, + 98756, + 98741, + 98770, + 98765, + 98770, + 98779, + 98770, + 98747, + 98760, + 98740, + 98756, + 98742, + 98744, + 98737, + 98801, + 98775, + 98771, + 98762, + 98723, + 98727, + 98738, + 98774, + 98778, + 98789, + 98768, + 98774, + 98736, + 98767, + 98760, + 98774, + 98773, + 98725, + 98753, + 98791, + 98755, + 98735, + 98805, + 98764, + 98765, + 98751, + 98741, + 98771, + 98774, + 98731, + 98762, + 98737, + 98761, + 98732, + 98763, + 98734, + 98766, + 98765, + 98736, + 98740, + 98756, + 98753, + 98764, + 98772, + 98768, + 98747, + 98758, + 98752, + 98768, + 98773, + 98765, + 98748, + 98765, + 98718, + 98745, + 98777, + 98763, + 98752, + 98758, + 98761, + 98767, + 98735, + 98748, + 98762, + 98771, + 98750, + 98776, + 98769, + 98771, + 98785, + 98765, + 98749, + 98741, + 98744, + 98762, + 98749, + 98737, + 98737, + 98780, + 98756, + 98765, + 98731, + 98751, + 98764, + 98742, + 98760, + 98796, + 98755, + 98748, + 98763, + 98759, + 98748, + 98747, + 98771, + 98769, + 98763, + 98751, + 98772, + 98750, + 98741, + 98764, + 98768, + 98757, + 98775, + 98783, + 98799, + 98751, + 98739, + 98766, + 98791, + 98760, + 98729, + 98776, + 98772, + 98759, + 98763, + 98758, + 98738, + 98731, + 98740, + 98731, + 98756, + 98776, + 98746, + 98760, + 98770, + 98764, + 98750, + 98738, + 98758, + 98767, + 98756, + 98765, + 98764, + 98761, + 98761, + 98742, + 98727, + 98726, + 98759, + 98757, + 98765, + 98758, + 98765, + 98766, + 98758, + 98748, + 98756, + 98730, + 98737, + 98751, + 98748, + 98779, + 98762, + 98751, + 98721, + 98764, + 98770, + 98752, + 98762, + 98764, + 98753, + 98756, + 98762, + 98730, + 98758, + 98760, + 98759, + 98759, + 98767, + 98726, + 98744, + 98762, + 98734, + 98766, + 98754, + 98757, + 98769, + 98760, + 98763, + 98773, + 98775, + 98751, + 98755, + 98764, + 98780, + 98739, + 98765, + 98763, + 98754, + 98794, + 98757, + 98747, + 98753, + 98771, + 98771, + 98764, + 98730, + 98745, + 98744, + 98762, + 98749, + 98739, + 98723, + 98756, + 98755, + 98756, + 98757, + 98748, + 98771, + 98762, + 98782, + 98727, + 98758, + 98749, + 98791, + 98773, + 98748, + 98759, + 98763, + 98786, + 98765, + 98754, + 98783, + 98754, + 98758, + 98785, + 98744, + 98750, + 98765, + 98736, + 98762, + 98758, + 98757, + 98766, + 98762, + 98754, + 98774, + 98738, + 98761, + 98745, + 98778, + 98761, + 98758, + 98745, + 98741, + 98763, + 98779, + 98742, + 98752, + 98747, + 98764, + 98783, + 98765, + 98774, + 98775, + 98725, + 98761, + 98751, + 98735, + 98739, + 98751, + 98763, + 98764, + 98744, + 98756, + 98763, + 98736, + 98773, + 98745, + 98749, + 98784, + 98764, + 98790, + 98774, + 98756, + 98767, + 98803, + 98809, + 98777, + 98755, + 98765, + 98782, + 98736, + 98760, + 98777, + 98739, + 98774, + 98777, + 98768, + 98751, + 98757, + 98775, + 98817, + 98734, + 98740, + 98732, + 98756, + 98769, + 98771, + 98745, + 98768, + 98754, + 98754, + 98761, + 98789, + 98781, + 98765, + 98734, + 98764, + 98756, + 98769, + 98776, + 98756, + 98761, + 98756, + 98772, + 98758, + 98748, + 98730, + 98764, + 98771, + 98758, + 98760, + 98767, + 98783, + 98778, + 98734, + 98749, + 98748, + 98780, + 98805, + 98754, + 98774, + 98732, + 98752, + 98784, + 98767, + 98737, + 98772, + 98758, + 98769, + 98739, + 98737, + 98765, + 98780, + 98747, + 98754, + 98754, + 98737, + 98758, + 98745, + 98739, + 98756, + 98743, + 98764, + 98740, + 98745, + 98766, + 98740, + 98781, + 98816, + 98764, + 98758, + 98720, + 98755, + 98775, + 98745, + 98755, + 98750, + 98735, + 98738, + 98767, + 98777, + 98732, + 98751, + 98761, + 98758, + 98758, + 98766, + 98760, + 98758, + 98752, + 98738, + 98763, + 98756, + 98741, + 98777, + 98764, + 98761, + 98803, + 98756, + 98761, + 98730, + 98758, + 98741, + 98782, + 98760, + 98784, + 98738, + 98738, + 98742, + 98758, + 98752, + 98730, + 98748, + 98773, + 98729, + 98762, + 98764, + 98759, + 98768, + 98725, + 98761, + 98756, + 98758, + 98764, + 98759, + 98746, + 98788, + 98804, + 98779, + 98758, + 98768, + 98756, + 98749, + 98762, + 98770, + 98773, + 98753, + 98762, + 98745, + 98754, + 98745, + 98771, + 98743, + 98762, + 98754, + 98756, + 98727, + 98754, + 98755, + 98763, + 98761, + 98756, + 98765, + 98747, + 98754, + 98765, + 98750, + 98772, + 98785, + 98764, + 98739, + 98761, + 98752, + 98764, + 98733, + 98767, + 98769, + 98815, + 98741, + 98751, + 98736, + 98756, + 98746, + 98770, + 98738, + 98764, + 98756, + 98738, + 98767, + 98775, + 98756, + 98768, + 98773, + 98757, + 98779, + 98755, + 98749, + 98752, + 98777, + 98744, + 98773, + 98769, + 98755, + 98742, + 98735, + 98755, + 98787, + 98761, + 98774, + 98756, + 98758, + 98757, + 98749, + 98774, + 98760, + 98762, + 98777, + 98747, + 98758, + 98763, + 98736, + 98767, + 98769, + 98737, + 98779, + 98767, + 98751, + 98746, + 98746, + 98754, + 98761, + 98761, + 98775, + 98760, + 98757, + 98771, + 98758, + 98732, + 98746, + 98764, + 98747, + 98733, + 98765, + 98757, + 98724, + 98754, + 98762, + 98733, + 98767, + 98766, + 98736, + 98764, + 98743, + 98750, + 98756, + 98757, + 98761, + 98729, + 98766, + 98748, + 98769, + 98745, + 98741, + 98775, + 98742, + 98753, + 98781, + 98752, + 98750, + 98777, + 98762, + 98762, + 98746, + 98767, + 98729, + 98758, + 98736, + 98759, + 98756, + 98762, + 98756, + 98764, + 98745, + 98754, + 98767, + 98760, + 98768, + 98764, + 98772, + 98760, + 98766, + 98736, + 98737, + 98757, + 98739, + 98760, + 98758, + 98779, + 98730, + 98770, + 98767, + 98770, + 98745, + 98735, + 98735, + 98736, + 98771, + 98770, + 98759, + 98721, + 98754, + 98766, + 98741, + 98750, + 98757, + 98758, + 98766, + 98797, + 98749, + 98768, + 98773, + 98758, + 98729, + 98757, + 98752, + 98762, + 98776, + 98723, + 98761, + 98762, + 98770, + 98732, + 98763, + 98729, + 98733, + 98729, + 98776, + 98742, + 98764, + 98758, + 98721, + 98755, + 98764, + 98726, + 98764, + 98740, + 98763, + 99198, + 98773, + 98777, + 98766, + 98791, + 98754, + 98730, + 98743, + 98784, + 98786, + 98723, + 98730, + 98761, + 98741, + 98752, + 98776, + 98734, + 98775, + 98759, + 98769, + 98753, + 98737, + 98790, + 98725, + 98743, + 98754, + 98766, + 98740, + 98768, + 98760, + 98741, + 98770, + 98767, + 98775, + 98737, + 98724, + 98760, + 98765, + 98737, + 98758, + 98729, + 98731, + 98748, + 98768, + 98730, + 98771, + 98745, + 98766, + 98750, + 98762, + 98726, + 98765, + 98759, + 98762, + 98764, + 98776, + 98748, + 98795, + 98765, + 98783, + 98740, + 98760, + 98755, + 98728, + 98769, + 98731, + 98759, + 98749, + 98769, + 98754, + 98728, + 98765, + 98764, + 98764, + 98766, + 98756, + 98745, + 98746, + 98735, + 98744, + 98725, + 98765, + 98738, + 98743, + 98748, + 98768, + 98754, + 98764, + 98764, + 98737, + 98764, + 98755, + 98781, + 98764, + 98741, + 98736, + 98730, + 98736, + 98831, + 98765, + 98738, + 98764, + 98780, + 98761, + 98763, + 98736, + 98771, + 98761, + 98753, + 98758, + 98750, + 98757, + 98754, + 98752, + 98728, + 98761, + 98760, + 98768, + 98770, + 98786, + 98776, + 98756, + 98765, + 98764, + 98763, + 98742, + 98762, + 98745, + 98760, + 98754, + 98728, + 98759, + 98729, + 98767, + 98779, + 98730, + 98728, + 98741, + 98745, + 98764, + 98727, + 98754, + 98751, + 98741, + 98750, + 98780, + 98739, + 98766, + 98761, + 98757, + 98743, + 98738, + 98767, + 98782, + 98759, + 98743, + 98737, + 98743, + 98739, + 98764, + 98782, + 98738, + 98759, + 98757, + 98759, + 98770, + 98767, + 98755, + 98736, + 98752, + 98749, + 98732, + 98764, + 98735, + 98760, + 98775, + 98769, + 98769, + 98748, + 98797, + 98766, + 98796, + 98916, + 98753, + 98742, + 98758, + 98759, + 98785, + 98925, + 98764, + 98750, + 98771, + 98764, + 98750, + 98738, + 98758, + 98756, + 98734, + 98727, + 98761, + 98755, + 98763, + 98758, + 98781, + 98740, + 98792, + 98756, + 98768, + 98742, + 98738, + 98771, + 98774, + 98767, + 98758, + 98759, + 98796, + 98751, + 98729, + 98787, + 98775, + 98772, + 98773, + 98780, + 98755, + 98737, + 98770, + 98759, + 98770, + 98766, + 98763, + 98762, + 98758, + 98759, + 98741, + 98734, + 98772, + 98765, + 98756, + 98776, + 98808, + 98750, + 98752, + 98760, + 98729, + 98741, + 98761, + 98758, + 98768, + 98762, + 98763, + 98742, + 98744, + 98760, + 98782, + 98754, + 98801, + 98758, + 98771, + 98744, + 98785, + 98748, + 98763, + 98745, + 98769, + 98760, + 98739, + 98756, + 98755, + 98760, + 98807, + 98817, + 98778, + 98778, + 98772, + 98739, + 98745, + 98775, + 98772, + 98758, + 98748, + 98763, + 98752, + 98772, + 98764, + 98773, + 98761, + 98730, + 98758, + 98758, + 98762, + 98754, + 98774, + 98769, + 98785, + 98769, + 98748, + 98781, + 98753, + 98754, + 98759, + 98743, + 98770, + 98759, + 98776, + 98773, + 98744, + 98737, + 98766, + 98742, + 98765, + 98769, + 98771, + 98771, + 98766, + 98755, + 98787, + 98756, + 98766, + 98766, + 98740, + 98763, + 98757, + 98741, + 98783, + 98771, + 98779, + 98761, + 98760, + 98752, + 98779, + 98811, + 98747, + 98791, + 98767, + 98736, + 98778, + 98751, + 98728, + 98761, + 98777, + 98732, + 98772, + 98746, + 98760, + 98739, + 98745, + 98772, + 98789, + 98778, + 98770, + 98757, + 98764, + 98747, + 98779, + 98773, + 98765, + 98737, + 98754, + 98759, + 98739, + 98782, + 98747, + 98741, + 98767, + 98786, + 98732, + 98774, + 98766, + 98777, + 98826, + 98752, + 98739, + 98764, + 98773, + 98730, + 98769, + 98754, + 98753, + 98765, + 98765, + 98745, + 98772, + 98762, + 98752, + 98764, + 98744, + 98758, + 98733, + 98776, + 98728, + 98784, + 98756, + 98741, + 98760, + 98758, + 98733, + 98751, + 98759, + 98849, + 98753, + 98777, + 98760, + 98739, + 98770, + 98777, + 98760, + 98770, + 98763, + 98754, + 98777, + 98765, + 98738, + 98765, + 98745, + 98768, + 98786, + 98777, + 98736, + 98731, + 98782, + 98750, + 98766, + 98773, + 98733, + 98755, + 98745, + 98754, + 98778, + 98738, + 98752, + 98772, + 98765, + 98771, + 98763, + 98775, + 98738, + 98740, + 98749, + 98750, + 98747, + 98768, + 98759, + 98751, + 98764, + 98771, + 98745, + 98741, + 98757, + 98779, + 99185, + 98740, + 98744, + 98771, + 98771, + 98742, + 98758, + 98744, + 98734, + 98765, + 98771, + 98734, + 98749, + 98757, + 98763, + 98731, + 98768, + 98765, + 98774, + 98776, + 98776, + 98768, + 98752, + 98801, + 98723, + 98744, + 98768, + 98739, + 98778, + 98751, + 98744, + 98739, + 98772, + 98773, + 98754, + 98753, + 98763, + 98765, + 98758, + 98755, + 98771, + 98766, + 98745, + 98756, + 98769, + 98757, + 98724, + 98777, + 98793, + 98758, + 98745, + 98737, + 98738, + 98753, + 98760, + 98760, + 98761, + 98755, + 98740, + 98741, + 98754, + 98762, + 98756, + 98780, + 98758, + 98731, + 98791, + 98745, + 98782, + 98760, + 98765, + 98767, + 98741, + 98731, + 98776, + 98744, + 98764, + 98745, + 98719, + 98742, + 98752, + 98739, + 98759, + 98744, + 98749, + 98757, + 98780, + 98744, + 98751, + 98766, + 98749, + 98775, + 98730, + 98769, + 98767, + 98764, + 98767, + 98773, + 98780, + 98746, + 98750, + 98758, + 98753, + 98750, + 98774, + 98759, + 98769, + 98736, + 98751, + 98735, + 98768, + 98755, + 98733, + 98753, + 98739, + 98726, + 98767, + 98734, + 98784, + 98775, + 98774, + 98751, + 98759, + 98756, + 98745, + 98736, + 98752, + 98758, + 98767, + 98764, + 98760, + 98754, + 98764, + 98767, + 98808, + 98754, + 98760, + 98768, + 98742, + 98764, + 98752, + 98746, + 98775, + 98757, + 98756, + 98743, + 98752, + 98716, + 98755, + 98748, + 98802, + 98766, + 98774, + 98749, + 98763, + 98799, + 98773, + 98785, + 98775, + 98755, + 98761, + 98730, + 98720, + 98784, + 98760, + 98739, + 98766, + 98759, + 98736, + 98766, + 98798, + 98764, + 98742, + 98728, + 98720, + 98760, + 98745, + 98756, + 98735, + 98763, + 98748, + 98759, + 98768, + 98765, + 98784, + 98757, + 98772, + 98758, + 98764, + 98733, + 98744, + 98747, + 98732 + ], + "sample_count": 15277 + }, + { + "pubkey": "9cDMr6jvHX7pzPSk2ut26u2DdUwEWCBjDf2X9eJtNcbV", + "epoch": 89, + "origin_device_pk": "4Wr7PQr5kyqCNJo3RKa8675K7ZtQ6fBUeorcexgp49Zp", + "target_device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "link_pk": "9BPmBzZSBDUkRVYWAbEDmDxqAaCHFQFCymxLguiz2drj", + "origin_device_location_pk": "8Crp8LgRPCapwdzQiFYeyNtwi8FVooCd9si1ujWwLuHQ", + "target_device_location_pk": "7vt8Tnbk15S6JA1uhRQVtbuL7w39zY8jeQ5iqgjsqLfP", + "origin_device_agent_pk": "HFNP25XgSPMqCZTMxScHfVsUkrZJgqdHS8drHf2xL897", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242125634381, + "samples": [ + 5784, + 5741, + 5734, + 5740, + 5782, + 5748, + 5733, + 5760, + 5733, + 5763, + 5777, + 5734, + 5747, + 5790, + 5749, + 5732, + 5791, + 5733, + 5743, + 5734, + 5760, + 5727, + 5766, + 5796, + 5755, + 5776, + 5782, + 5772, + 5745, + 5750, + 5758, + 5745, + 5791, + 5741, + 5749, + 5762, + 5758, + 5763, + 5781, + 5785, + 5796, + 5779, + 5737, + 5740, + 5778, + 5767, + 5762, + 5763, + 5755, + 5743, + 5797, + 5773, + 5767, + 5755, + 5787, + 5752, + 5795, + 5754, + 5768, + 5758, + 5773, + 5779, + 5746, + 5801, + 5766, + 5756, + 5801, + 5783, + 5788, + 5753, + 5789, + 5765, + 5759, + 5744, + 5774, + 5778, + 5748, + 5758, + 5740, + 5750, + 5909, + 5760, + 5773, + 5765, + 5750, + 5817, + 5749, + 5780, + 5755, + 5793, + 5768, + 5784, + 5779, + 5782, + 5793, + 5786, + 5758, + 5736, + 5731, + 5768, + 5780, + 5780, + 5767, + 5771, + 5804, + 5774, + 5780, + 5816, + 5781, + 5753, + 5764, + 5768, + 5745, + 5776, + 5754, + 5762, + 5784, + 5774, + 5758, + 5749, + 5732, + 5777, + 5784, + 5762, + 5789, + 5785, + 5746, + 5753, + 5758, + 5736, + 5743, + 5800, + 5738, + 5763, + 5774, + 5753, + 5759, + 5762, + 5781, + 5748, + 5765, + 5756, + 5781, + 5753, + 5744, + 5740, + 5732, + 5778, + 5812, + 5822, + 5804, + 5780, + 5773, + 5771, + 5786, + 5741, + 5741, + 5752, + 5755, + 5783, + 5751, + 5764, + 5773, + 5767, + 5795, + 5770, + 5777, + 5789, + 5775, + 5762, + 5760, + 5756, + 5772, + 5744, + 5747, + 5741, + 5755, + 5769, + 5773, + 5778, + 5751, + 5774, + 5757, + 5761, + 5799, + 5740, + 5785, + 5791, + 5754, + 5843, + 5732, + 5759, + 5759, + 5785, + 5786, + 5787, + 5814, + 5755, + 5741, + 5762, + 5750, + 5766, + 5797, + 5763, + 5755, + 5789, + 5737, + 5786, + 5750, + 5748, + 5739, + 5762, + 5732, + 5752, + 5738, + 5796, + 5790, + 5761, + 5762, + 5737, + 5769, + 5782, + 5761, + 5730, + 5761, + 5736, + 5774, + 5769, + 5741, + 5763, + 5753, + 5765, + 5751, + 5737, + 5748, + 5751, + 5753, + 5759, + 5742, + 5745, + 5739, + 5748, + 5841, + 5786, + 5752, + 5765, + 5787, + 5759, + 5761, + 5828, + 5732, + 5783, + 5791, + 5769, + 5769, + 5759, + 5773, + 5763, + 5746, + 5751, + 5837, + 5732, + 5767, + 5732, + 5746, + 5783, + 5751, + 5780, + 5745, + 5787, + 5776, + 5741, + 5746, + 5839, + 5750, + 5735, + 5774, + 5752, + 5743, + 5801, + 5772, + 5746, + 5743, + 5813, + 5751, + 5744, + 5746, + 5772, + 5759, + 5748, + 5765, + 5762, + 5731, + 5724, + 5757, + 5766, + 5775, + 5741, + 5809, + 5751, + 5784, + 5766, + 5747, + 5764, + 5773, + 5727, + 5754, + 5791, + 5743, + 5773, + 5772, + 5769, + 5819, + 5758, + 5746, + 5748, + 5765, + 5773, + 5832, + 5758, + 5755, + 5757, + 5796, + 5770, + 5798, + 5772, + 5762, + 5778, + 5773, + 5799, + 5732, + 5770, + 5755, + 5771, + 5766, + 5742, + 5771, + 5830, + 5767, + 5747, + 5741, + 5747, + 5754, + 5760, + 5758, + 5763, + 5772, + 5746, + 5751, + 5800, + 5768, + 5768, + 5776, + 5822, + 5735, + 5791, + 5758, + 5764, + 5777, + 5765, + 5772, + 5761, + 5792, + 5779, + 5764, + 5729, + 5738, + 5747, + 5773, + 5763, + 5795, + 5734, + 5765, + 5745, + 5742, + 5736, + 5760, + 5796, + 5761, + 5809, + 5758, + 5753, + 5797, + 5768, + 5798, + 5761, + 5746, + 5751, + 5753, + 5763, + 5773, + 5746, + 5739, + 5737, + 5743, + 5819, + 5751, + 5773, + 5741, + 5743, + 5764, + 5765, + 5780, + 5750, + 5784, + 5771, + 5767, + 5743, + 5760, + 5748, + 5770, + 5785, + 5762, + 5762, + 5814, + 5758, + 5740, + 5777, + 5761, + 5770, + 5739, + 5735, + 5780, + 5742, + 5805, + 5789, + 5781, + 5743, + 5791, + 5745, + 5758, + 5759, + 5761, + 5786, + 5760, + 5746, + 5742, + 5771, + 5754, + 5768, + 5738, + 5824, + 5765, + 5747, + 5772, + 5740, + 5740, + 5765, + 5765, + 5768, + 5764, + 5742, + 5758, + 5799, + 5764, + 5739, + 5758, + 5768, + 5767, + 5787, + 5775, + 5761, + 5789, + 5757, + 5743, + 5775, + 5759, + 5777, + 5755, + 5730, + 5757, + 5763, + 5769, + 5771, + 5763, + 5756, + 5764, + 5735, + 5745, + 5787, + 5753, + 5754, + 5797, + 5763, + 5743, + 5734, + 5769, + 5769, + 5800, + 5760, + 5770, + 5794, + 5795, + 5762, + 5756, + 5736, + 5763, + 5772, + 5770, + 5863, + 5779, + 5735, + 5771, + 5737, + 5770, + 5769, + 5767, + 5765, + 5799, + 5752, + 5764, + 5774, + 5764, + 5732, + 5757, + 5768, + 5767, + 5763, + 5740, + 5745, + 5788, + 5753, + 5752, + 5753, + 5806, + 5778, + 5767, + 5739, + 5750, + 5755, + 5789, + 5770, + 5742, + 5758, + 5755, + 5800, + 5753, + 5771, + 5768, + 5806, + 5741, + 5744, + 5828, + 5841, + 5768, + 5742, + 5749, + 5778, + 5786, + 5767, + 5778, + 5775, + 5886, + 5770, + 5805, + 5771, + 5771, + 5768, + 5784, + 5775, + 5791, + 5749, + 5847, + 5762, + 5737, + 5749, + 5783, + 5784, + 5745, + 5757, + 5736, + 5737, + 5780, + 5809, + 5735, + 5738, + 5778, + 5769, + 5793, + 5761, + 5745, + 5768, + 5749, + 5728, + 5773, + 5751, + 5789, + 5776, + 5786, + 5769, + 5741, + 5767, + 5752, + 5758, + 5788, + 5802, + 5775, + 5793, + 5797, + 5772, + 5766, + 5745, + 5823, + 5773, + 5777, + 5770, + 5743, + 5788, + 5824, + 5748, + 5783, + 5780, + 5750, + 5775, + 5777, + 5755, + 5766, + 5780, + 5744, + 5764, + 5776, + 5788, + 5756, + 5758, + 5767, + 5743, + 5755, + 5768, + 5772, + 5714, + 5759, + 5775, + 5764, + 5741, + 5762, + 5792, + 5767, + 5741, + 5773, + 5770, + 5807, + 5771, + 5762, + 5738, + 5825, + 5748, + 5761, + 5778, + 5773, + 5787, + 5737, + 5783, + 5781, + 5798, + 5769, + 5792, + 5824, + 5759, + 5786, + 5780, + 5740, + 5780, + 5782, + 5778, + 5772, + 5751, + 5733, + 5759, + 5756, + 5764, + 5782, + 5772, + 5775, + 5787, + 5757, + 5745, + 5775, + 5745, + 5768, + 5743, + 5782, + 5900, + 5773, + 5745, + 5749, + 5766, + 5725, + 5722, + 5787, + 5787, + 5752, + 5769, + 5771, + 5784, + 5796, + 5776, + 5764, + 5742, + 5782, + 5738, + 5774, + 5764, + 5754, + 5773, + 5762, + 5766, + 5761, + 5761, + 5758, + 5784, + 5781, + 5796, + 5784, + 5774, + 5760, + 5786, + 5782, + 5738, + 5775, + 5740, + 5754, + 5782, + 5771, + 5737, + 5759, + 5773, + 5752, + 5779, + 5765, + 5800, + 5796, + 5761, + 5762, + 5763, + 5771, + 5770, + 5744, + 5762, + 5755, + 5807, + 5807, + 5760, + 5765, + 5739, + 5732, + 5746, + 5759, + 5745, + 5744, + 5750, + 5807, + 5762, + 5763, + 5784, + 5783, + 5742, + 5758, + 5749, + 5756, + 5755, + 5771, + 5768, + 5785, + 5789, + 5803, + 5778, + 5774, + 5762, + 5735, + 5756, + 5738, + 5750, + 5793, + 5776, + 5762, + 5753, + 5773, + 5780, + 5786, + 5746, + 5830, + 5781, + 5774, + 5734, + 5766, + 5775, + 5747, + 5794, + 5763, + 5801, + 5745, + 5748, + 5765, + 5792, + 5776, + 5772, + 5770, + 5756, + 5749, + 5789, + 5756, + 5744, + 5750, + 5764, + 5774, + 5744, + 5780, + 5744, + 5734, + 5735, + 5764, + 5808, + 5758, + 5758, + 5769, + 5777, + 5730, + 5769, + 5756, + 5733, + 5837, + 5754, + 5733, + 5751, + 5777, + 5742, + 5777, + 5768, + 5746, + 5757, + 5756, + 5779, + 5788, + 5801, + 5774, + 5817, + 5752, + 5749, + 5748, + 5747, + 5738, + 5758, + 5756, + 5765, + 5758, + 5786, + 5743, + 5751, + 5739, + 5769, + 5779, + 5763, + 5746, + 5768, + 5757, + 5747, + 5809, + 5780, + 5740, + 5742, + 5775, + 5759, + 5752, + 5752, + 5758, + 5771, + 5768, + 5780, + 5770, + 5766, + 5755, + 5775, + 5727, + 5742, + 5775, + 5798, + 5766, + 5741, + 5781, + 5784, + 5777, + 5742, + 5787, + 5753, + 5779, + 5739, + 5793, + 5789, + 5743, + 5759, + 5744, + 5742, + 5804, + 5771, + 5740, + 5737, + 5758, + 5792, + 5768, + 5789, + 5737, + 5773, + 5799, + 5796, + 5773, + 5817, + 5735, + 5742, + 5768, + 5741, + 5821, + 5750, + 5729, + 5755, + 5740, + 5764, + 5766, + 5766, + 5742, + 5762, + 5788, + 5757, + 5774, + 5763, + 5759, + 5766, + 5758, + 5736, + 5760, + 5779, + 5741, + 5728, + 5742, + 5746, + 5757, + 5741, + 5750, + 5739, + 5741, + 5803, + 5768, + 5738, + 5744, + 5762, + 5741, + 5772, + 5744, + 5767, + 5775, + 5767, + 5739, + 5771, + 5753, + 5761, + 5755, + 5758, + 5724, + 5748, + 5733, + 5775, + 5751, + 5751, + 5739, + 5737, + 5772, + 5734, + 5772, + 5762, + 5775, + 5770, + 5769, + 5768, + 5755, + 5771, + 5765, + 5787, + 5755, + 5795, + 5734, + 5806, + 5744, + 5765, + 5745, + 5740, + 5786, + 5751, + 5792, + 5737, + 5781, + 5790, + 5781, + 5739, + 5817, + 5759, + 5797, + 5796, + 5774, + 5768, + 5751, + 5786, + 5761, + 5773, + 5732, + 5783, + 5790, + 5767, + 5785, + 5763, + 5767, + 5765, + 5733, + 5745, + 5749, + 5750, + 5748, + 5784, + 5751, + 5755, + 5770, + 5770, + 5762, + 5728, + 5795, + 5742, + 5772, + 5767, + 5742, + 5768, + 5739, + 5780, + 5747, + 5732, + 5818, + 5775, + 5788, + 5789, + 5776, + 5760, + 5751, + 5782, + 5762, + 5785, + 5748, + 5747, + 5798, + 5760, + 5731, + 5750, + 5798, + 5760, + 5774, + 5748, + 5732, + 5754, + 5774, + 5760, + 5747, + 5788, + 5741, + 5744, + 5832, + 5776, + 5728, + 5833, + 5763, + 5768, + 5754, + 5802, + 5783, + 5775, + 5813, + 5749, + 5771, + 5753, + 5761, + 5762, + 5816, + 5776, + 5775, + 5757, + 5776, + 5798, + 5789, + 5747, + 5741, + 5780, + 5739, + 5827, + 5757, + 5739, + 5757, + 5757, + 5739, + 5770, + 5728, + 5763, + 5776, + 5808, + 5739, + 5762, + 5739, + 5765, + 5772, + 5794, + 5754, + 5737, + 5758, + 5740, + 5814, + 5759, + 5738, + 5747, + 5775, + 5784, + 5759, + 5761, + 5751, + 5768, + 5761, + 5749, + 5738, + 5750, + 5769, + 5729, + 5738, + 5761, + 5761, + 5757, + 5765, + 5773, + 5747, + 5783, + 5777, + 5768, + 5777, + 5760, + 5796, + 5739, + 5746, + 5740, + 5793, + 5786, + 5750, + 5760, + 5759, + 5762, + 5781, + 5761, + 5764, + 5761, + 5754, + 5782, + 5770, + 5778, + 5779, + 5801, + 5784, + 5772, + 5768, + 5761, + 5740, + 5770, + 5750, + 5761, + 5760, + 5786, + 5772, + 5743, + 5736, + 5765, + 5758, + 5767, + 5740, + 5753, + 5767, + 5761, + 5756, + 5782, + 5809, + 5782, + 5774, + 5743, + 5789, + 5786, + 5771, + 5763, + 5788, + 5780, + 5741, + 5776, + 5744, + 5781, + 5775, + 5764, + 5794, + 5772, + 5821, + 5788, + 5758, + 5797, + 5741, + 5750, + 5742, + 5805, + 5769, + 5784, + 5786, + 5800, + 5774, + 5757, + 5737, + 5778, + 5774, + 5738, + 5758, + 5775, + 5753, + 5729, + 5765, + 5741, + 5769, + 5751, + 5798, + 5740, + 5744, + 5756, + 5745, + 5783, + 5759, + 5739, + 5762, + 5786, + 5737, + 5806, + 5757, + 5793, + 5761, + 5787, + 5759, + 5765, + 5780, + 5739, + 5763, + 5765, + 5748, + 5760, + 5775, + 5716, + 5737, + 5755, + 5751, + 5760, + 5767, + 5738, + 5746, + 5774, + 5741, + 5753, + 5728, + 5770, + 5759, + 5800, + 5781, + 5751, + 5804, + 5777, + 5776, + 5783, + 5790, + 5777, + 5757, + 5771, + 5768, + 5774, + 5801, + 5751, + 5781, + 5769, + 5765, + 5754, + 5783, + 5778, + 5773, + 5790, + 5782, + 5761, + 5737, + 5809, + 5773, + 5823, + 5751, + 5748, + 5790, + 5744, + 5776, + 5764, + 5732, + 7209, + 5798, + 5760, + 5786, + 5783, + 5749, + 5734, + 5749, + 5771, + 5756, + 5757, + 5752, + 5788, + 5735, + 5777, + 5746, + 5758, + 5770, + 5801, + 5743, + 5754, + 5763, + 5778, + 5763, + 5805, + 5792, + 5760, + 5781, + 5773, + 5805, + 5733, + 5767, + 5796, + 5754, + 5757, + 5758, + 5730, + 5735, + 5774, + 5742, + 5767, + 5749, + 5776, + 5773, + 5751, + 5790, + 5753, + 5766, + 5787, + 5774, + 5730, + 5760, + 5773, + 5737, + 5745, + 5750, + 5756, + 5786, + 5743, + 5746, + 5781, + 5781, + 5800, + 5762, + 5739, + 5734, + 5769, + 5762, + 5754, + 5752, + 5773, + 5800, + 5735, + 5762, + 5753, + 5772, + 5762, + 5736, + 5738, + 5761, + 5814, + 5744, + 5752, + 5757, + 5741, + 5757, + 5766, + 5769, + 5825, + 5752, + 5792, + 5788, + 5742, + 5748, + 5773, + 5802, + 5846, + 5745, + 5753, + 5759, + 5778, + 5774, + 5750, + 5783, + 5746, + 5759, + 5731, + 5825, + 5747, + 5741, + 5738, + 5773, + 5751, + 5790, + 5828, + 5851, + 5782, + 5749, + 5728, + 5747, + 5797, + 5730, + 5779, + 5724, + 5766, + 5769, + 5791, + 5758, + 5777, + 5802, + 5748, + 5755, + 5789, + 5771, + 5782, + 5775, + 5741, + 5754, + 5779, + 5739, + 5768, + 5747, + 5774, + 5737, + 5737, + 5794, + 5747, + 5778, + 5821, + 5749, + 5762, + 5786, + 5767, + 5767, + 5800, + 5751, + 5790, + 5756, + 5769, + 5758, + 5747, + 5753, + 5807, + 5806, + 5744, + 5792, + 5791, + 5771, + 5733, + 5790, + 5763, + 5737, + 5760, + 5799, + 5785, + 5751, + 5743, + 5759, + 5764, + 5741, + 5759, + 5749, + 5765, + 5746, + 5754, + 5784, + 5785, + 5765, + 5779, + 5746, + 5777, + 5874, + 5783, + 5776, + 5761, + 5760, + 5750, + 5763, + 5778, + 5773, + 5761, + 5758, + 5775, + 5765, + 5750, + 5750, + 5806, + 5754, + 5872, + 5790, + 5757, + 5762, + 5763, + 5773, + 5769, + 5752, + 5796, + 5777, + 5759, + 5762, + 5751, + 5793, + 5813, + 5766, + 5786, + 5778, + 5763, + 5758, + 5740, + 5752, + 5758, + 5762, + 5751, + 5771, + 5754, + 5768, + 5744, + 5780, + 5802, + 5753, + 5763, + 5776, + 5739, + 5744, + 5742, + 5790, + 5761, + 5768, + 5794, + 5769, + 5804, + 5774, + 5774, + 5816, + 5790, + 5736, + 5793, + 5776, + 5772, + 5784, + 5820, + 5776, + 5757, + 5764, + 5766, + 5790, + 5800, + 5788, + 5751, + 5744, + 5765, + 5801, + 5764, + 5793, + 5747, + 5746, + 5759, + 5794, + 5776, + 5744, + 5749, + 5738, + 5727, + 5763, + 5755, + 5790, + 5773, + 5752, + 5794, + 5790, + 5760, + 5740, + 5756, + 5761, + 5735, + 5774, + 5768, + 5773, + 5761, + 5733, + 5756, + 5773, + 5774, + 5732, + 5792, + 5768, + 5816, + 5792, + 5786, + 5781, + 5743, + 5755, + 5755, + 5739, + 5776, + 5760, + 5761, + 5761, + 5763, + 5746, + 5767, + 5732, + 5780, + 5765, + 5770, + 5764, + 5748, + 5747, + 5731, + 5760, + 5805, + 5759, + 5743, + 5745, + 5769, + 5754, + 5760, + 5763, + 5748, + 5776, + 5775, + 5734, + 5754, + 5736, + 5793, + 5758, + 5765, + 5752, + 5781, + 5765, + 5749, + 5741, + 5754, + 5759, + 5773, + 5774, + 5781, + 5750, + 5773, + 5822, + 5772, + 5828, + 5759, + 5795, + 5783, + 5758, + 5834, + 5806, + 5789, + 5756, + 5809, + 5739, + 5772, + 5796, + 5773, + 5775, + 5775, + 5800, + 5759, + 5794, + 5775, + 5780, + 5789, + 5764, + 5844, + 5766, + 5779, + 5779, + 5799, + 5738, + 5765, + 5730, + 5748, + 5823, + 5758, + 5740, + 5745, + 5758, + 5771, + 5740, + 5748, + 5797, + 5749, + 5774, + 5727, + 5757, + 5788, + 5743, + 5789, + 5797, + 5767, + 5740, + 5735, + 5759, + 5733, + 5766, + 5769, + 5781, + 5749, + 5787, + 5807, + 5745, + 5801, + 5759, + 5763, + 5762, + 5790, + 5786, + 5812, + 5760, + 5735, + 5776, + 5752, + 5765, + 5747, + 5792, + 5768, + 5735, + 5760, + 5810, + 5763, + 5784, + 5756, + 5780, + 5762, + 5762, + 5804, + 5795, + 5752, + 5751, + 5771, + 5774, + 5756, + 5769, + 5764, + 5774, + 5750, + 5758, + 5761, + 5750, + 5784, + 5866, + 5796, + 5754, + 5778, + 5763, + 5754, + 5775, + 5792, + 5759, + 5735, + 5742, + 5767, + 5769, + 5787, + 5732, + 5779, + 5764, + 5782, + 5759, + 5806, + 5796, + 5793, + 5739, + 5781, + 5828, + 5737, + 5760, + 5773, + 5750, + 5742, + 5745, + 5793, + 5776, + 5823, + 5801, + 5751, + 5752, + 5749, + 5766, + 5742, + 5740, + 5761, + 5771, + 5740, + 5810, + 5779, + 5768, + 5778, + 5760, + 5741, + 5773, + 5766, + 5751, + 5764, + 5773, + 5742, + 5771, + 5729, + 5767, + 5797, + 5760, + 5778, + 5768, + 5744, + 5876, + 5749, + 5733, + 5770, + 5761, + 5760, + 5785, + 5826, + 5751, + 5760, + 5766, + 5745, + 5743, + 5728, + 5802, + 5743, + 5754, + 5753, + 5753, + 5769, + 5736, + 5742, + 5756, + 5774, + 5771, + 5765, + 5795, + 5774, + 5761, + 5744, + 5783, + 5748, + 5748, + 5754, + 5758, + 5746, + 5769, + 5774, + 5776, + 5748, + 5750, + 5767, + 5749, + 5772, + 5757, + 5790, + 5743, + 5756, + 5787, + 5803, + 5797, + 5780, + 5741, + 5767, + 5745, + 5777, + 5757, + 5733, + 5749, + 5792, + 5821, + 5764, + 5743, + 5774, + 5758, + 5765, + 5764, + 5804, + 5753, + 5776, + 5736, + 5779, + 5767, + 5765, + 5776, + 5748, + 5790, + 5785, + 5744, + 5773, + 5772, + 5767, + 5767, + 5758, + 5744, + 5726, + 5767, + 5741, + 5788, + 5780, + 5826, + 5763, + 5784, + 5746, + 5767, + 5760, + 5768, + 5766, + 5785, + 5777, + 5788, + 5799, + 5769, + 5757, + 5745, + 5781, + 5778, + 5733, + 5749, + 5743, + 5744, + 5762, + 5740, + 5735, + 5812, + 5746, + 5788, + 5814, + 5736, + 5739, + 5737, + 5805, + 5766, + 5778, + 5764, + 5766, + 5789, + 5749, + 5777, + 5757, + 5735, + 5747, + 5746, + 5802, + 5754, + 5731, + 5763, + 5775, + 5756, + 5772, + 5762, + 5845, + 5792, + 5772, + 5766, + 5759, + 5780, + 5783, + 5742, + 5790, + 5767, + 5764, + 5781, + 5761, + 5750, + 5750, + 5805, + 5775, + 5737, + 5765, + 5752, + 5818, + 5768, + 5754, + 5754, + 5778, + 5763, + 5729, + 5755, + 5777, + 5781, + 5746, + 5762, + 5736, + 5738, + 5783, + 5767, + 5761, + 5734, + 5747, + 5737, + 5757, + 5758, + 5742, + 5748, + 5776, + 5752, + 5772, + 5743, + 5786, + 5789, + 5761, + 5767, + 5747, + 5767, + 5796, + 5740, + 5765, + 5760, + 5760, + 5767, + 5771, + 5767, + 5824, + 5828, + 5791, + 5790, + 5779, + 5760, + 5792, + 5765, + 5742, + 5723, + 5730, + 5776, + 5797, + 5776, + 5780, + 5729, + 5773, + 5753, + 5769, + 5754, + 5737, + 5769, + 5811, + 5742, + 5754, + 5769, + 5765, + 5755, + 5788, + 5801, + 5756, + 5774, + 5766, + 5773, + 5746, + 5767, + 5740, + 5779, + 5742, + 5759, + 5746, + 5750, + 5749, + 5752, + 5764, + 5763, + 5761, + 5796, + 5745, + 5757, + 5779, + 5788, + 5756, + 5771, + 5765, + 5795, + 5738, + 5769, + 5783, + 5825, + 5794, + 5760, + 5759, + 5792, + 5792, + 5767, + 5766, + 5760, + 5766, + 5792, + 5809, + 5772, + 5740, + 5775, + 5772, + 5782, + 5763, + 5751, + 5752, + 5773, + 5773, + 5740, + 5766, + 5775, + 5780, + 5784, + 5770, + 5743, + 5789, + 5740, + 5752, + 5759, + 5746, + 5753, + 5814, + 5779, + 5777, + 5767, + 5769, + 5786, + 5734, + 5764, + 5753, + 5769, + 5763, + 5770, + 5738, + 5783, + 5759, + 5739, + 5736, + 5751, + 5800, + 5750, + 5796, + 5744, + 5754, + 5745, + 5735, + 5773, + 5777, + 5756, + 5761, + 5749, + 5744, + 5789, + 5738, + 5751, + 5791, + 5738, + 5796, + 5787, + 5774, + 5777, + 5793, + 5771, + 5764, + 5744, + 5777, + 5755, + 5745, + 5761, + 5776, + 5775, + 5803, + 5838, + 5760, + 5738, + 5765, + 5768, + 5738, + 5767, + 5769, + 5756, + 5758, + 5740, + 5753, + 5766, + 5753, + 5754, + 5744, + 5726, + 5734, + 5783, + 5771, + 5764, + 5753, + 5771, + 5743, + 5818, + 5766, + 5781, + 5772, + 5750, + 5767, + 5777, + 5788, + 5752, + 5788, + 5745, + 5776, + 5758, + 5772, + 5723, + 5741, + 5751, + 5763, + 5770, + 5748, + 5784, + 5749, + 5822, + 5750, + 5785, + 5793, + 5799, + 5786, + 5761, + 5768, + 5742, + 5799, + 5775, + 5769, + 5745, + 5771, + 5763, + 5775, + 5787, + 5740, + 5743, + 5749, + 5746, + 5767, + 5767, + 5764, + 5818, + 5746, + 5800, + 5778, + 5786, + 5737, + 5754, + 5767, + 5763, + 5763, + 5798, + 5738, + 5757, + 5759, + 5785, + 5749, + 5745, + 5773, + 5765, + 5777, + 5756, + 5782, + 5757, + 5761, + 5761, + 5776, + 5754, + 5772, + 5788, + 5772, + 5807, + 5792, + 5802, + 5756, + 5770, + 5786, + 5740, + 5784, + 5808, + 5793, + 5775, + 5880, + 5751, + 5732, + 5754, + 5738, + 5763, + 5781, + 5773, + 5738, + 5727, + 5739, + 5732, + 5783, + 5773, + 5782, + 5764, + 5780, + 5752, + 5755, + 5809, + 5772, + 5772, + 5779, + 5761, + 5809, + 5758, + 5750, + 5763, + 5753, + 5741, + 5762, + 5778, + 5732, + 5812, + 5753, + 5743, + 5743, + 5784, + 5775, + 5767, + 5734, + 5801, + 5763, + 5758, + 5778, + 5746, + 5730, + 5769, + 5787, + 5778, + 5762, + 5769, + 5769, + 5756, + 5741, + 5805, + 5747, + 5764, + 5749, + 5766, + 5746, + 5749, + 5775, + 5763, + 5755, + 5727, + 5793, + 5747, + 5730, + 5766, + 5753, + 5751, + 5740, + 5783, + 5763, + 5789, + 5751, + 5739, + 5729, + 5776, + 5770, + 5756, + 5743, + 5727, + 5787, + 5775, + 5754, + 5774, + 5757, + 5759, + 5789, + 5790, + 5739, + 5754, + 5777, + 5741, + 5747, + 5750, + 5744, + 5757, + 5743, + 5782, + 5826, + 5776, + 5770, + 5777, + 5730, + 5796, + 5771, + 5779, + 5738, + 5772, + 5761, + 5761, + 5786, + 5727, + 5762, + 5780, + 5805, + 5759, + 5765, + 5794, + 5791, + 5773, + 5768, + 5743, + 5799, + 5813, + 5759, + 5772, + 5787, + 5770, + 5768, + 5774, + 5790, + 5834, + 5727, + 5752, + 5774, + 5756, + 5809, + 5743, + 5779, + 5768, + 5778, + 5766, + 5772, + 5769, + 5764, + 5793, + 5771, + 5767, + 5758, + 5788, + 5758, + 5774, + 5747, + 5786, + 5773, + 5770, + 5766, + 5755, + 5760, + 5759, + 5751, + 5775, + 5758, + 5769, + 5748, + 5798, + 5743, + 5770, + 5735, + 5746, + 5764, + 5800, + 5760, + 5773, + 5762, + 5817, + 5757, + 5733, + 5780, + 5760, + 5748, + 5752, + 5771, + 5771, + 5758, + 5787, + 5739, + 5849, + 5774, + 5749, + 5765, + 5768, + 5768, + 5781, + 5818, + 5757, + 5787, + 5754, + 5742, + 5731, + 5788, + 5782, + 5745, + 5790, + 5791, + 5759, + 5773, + 5738, + 5800, + 5764, + 5770, + 5800, + 5737, + 5749, + 5764, + 5740, + 5796, + 5743, + 5767, + 5765, + 5798, + 5778, + 5764, + 5743, + 5818, + 5752, + 5748, + 5763, + 5755, + 5762, + 5740, + 5767, + 5731, + 5782, + 5763, + 5728, + 5745, + 5771, + 5769, + 5781, + 5755, + 5742, + 5771, + 5780, + 5761, + 5786, + 5752, + 5744, + 5773, + 5766, + 5788, + 5803, + 5778, + 5785, + 5740, + 5747, + 5737, + 5770, + 5755, + 5742, + 5737, + 5730, + 5756, + 5756, + 5759, + 5747, + 5748, + 5744, + 5769, + 5760, + 5792, + 5756, + 5760, + 5735, + 5753, + 5748, + 5751, + 5793, + 5756, + 5779, + 5774, + 5756, + 5769, + 5762, + 5822, + 5765, + 5745, + 5759, + 5775, + 5749, + 5764, + 5770, + 5737, + 5769, + 5832, + 5759, + 5806, + 5802, + 5819, + 5768, + 5761, + 5742, + 5748, + 5774, + 5749, + 5764, + 5763, + 5797, + 5732, + 5762, + 5765, + 5792, + 5761, + 5760, + 5761, + 5770, + 5750, + 5775, + 5781, + 5749, + 5770, + 5742, + 5758, + 5744, + 5757, + 5746, + 5775, + 5789, + 5767, + 5783, + 5749, + 5757, + 5736, + 5846, + 5769, + 5795, + 5766, + 5738, + 5781, + 5740, + 5759, + 5749, + 5777, + 5730, + 5761, + 5775, + 5751, + 5778, + 5764, + 5773, + 5751, + 5774, + 5773, + 5781, + 5814, + 5769, + 5745, + 5761, + 5784, + 5754, + 5766, + 5735, + 5755, + 5744, + 5734, + 5763, + 5761, + 5757, + 5769, + 5780, + 5753, + 5754, + 5761, + 5810, + 5743, + 5745, + 5771, + 5750, + 5781, + 5796, + 5781, + 5775, + 5729, + 5751, + 5728, + 5759, + 5730, + 5749, + 5783, + 5796, + 5742, + 5744, + 5801, + 5776, + 5757, + 5746, + 5746, + 5792, + 5857, + 5771, + 5772, + 5776, + 5804, + 5775, + 5758, + 5734, + 5770, + 5804, + 5766, + 5754, + 5764, + 5776, + 5737, + 5784, + 5773, + 5756, + 5785, + 5754, + 5737, + 5762, + 5741, + 5759, + 5744, + 5740, + 5731, + 5773, + 5790, + 5736, + 5775, + 5773, + 5773, + 5812, + 5782, + 5764, + 5746, + 5767, + 5743, + 5773, + 5762, + 5815, + 5766, + 5792, + 5769, + 5745, + 5788, + 5776, + 5759, + 5758, + 5770, + 5776, + 5740, + 5786, + 5792, + 5770, + 5782, + 5806, + 5769, + 5751, + 5761, + 5793, + 5758, + 5766, + 5857, + 5749, + 5773, + 5801, + 5755, + 5798, + 5738, + 5790, + 5748, + 5761, + 5800, + 5756, + 5775, + 5742, + 5761, + 5776, + 5758, + 5738, + 5724, + 5803, + 5781, + 5761, + 5760, + 5786, + 5781, + 5761, + 5767, + 5777, + 5738, + 5762, + 5746, + 5783, + 5765, + 5778, + 5770, + 5771, + 5792, + 5740, + 5747, + 5763, + 5743, + 5779, + 5774, + 5765, + 5794, + 5771, + 5776, + 5756, + 5744, + 5771, + 5779, + 5749, + 5803, + 5743, + 5795, + 5789, + 5770, + 5746, + 5751, + 5769, + 5748, + 5744, + 5795, + 5735, + 5733, + 5796, + 5747, + 5776, + 5760, + 5751, + 5749, + 5777, + 5753, + 5753, + 5756, + 5752, + 5750, + 5751, + 5784, + 5755, + 5782, + 5756, + 5763, + 5746, + 5736, + 5749, + 5755, + 5776, + 5761, + 5749, + 5757, + 5749, + 5773, + 5764, + 5786, + 5781, + 5748, + 5779, + 5765, + 5762, + 5776, + 5748, + 5744, + 5742, + 5772, + 5771, + 5746, + 5783, + 5791, + 5778, + 5767, + 5758, + 5760, + 5811, + 5781, + 5765, + 5774, + 5770, + 5793, + 5766, + 5772, + 5753, + 5740, + 5764, + 5751, + 5753, + 5776, + 5747, + 5772, + 5741, + 5755, + 5750, + 5769, + 5736, + 5757, + 5780, + 5767, + 5734, + 5765, + 5771, + 5760, + 5798, + 5777, + 5749, + 5746, + 5741, + 5744, + 5776, + 5749, + 5804, + 5824, + 5721, + 5764, + 5742, + 5757, + 5740, + 5742, + 5747, + 5748, + 5742, + 5745, + 5746, + 5738, + 5758, + 5757, + 5797, + 5769, + 5780, + 5725, + 5735, + 5786, + 5781, + 5790, + 5776, + 5753, + 5749, + 5737, + 5767, + 5768, + 5780, + 5751, + 5732, + 5757, + 5747, + 5777, + 5755, + 5744, + 5772, + 5784, + 5761, + 5759, + 5772, + 5736, + 5772, + 5746, + 5757, + 5741, + 5768, + 5754, + 5801, + 5764, + 5778, + 5769, + 5758, + 5772, + 5764, + 5809, + 5751, + 5758, + 5745, + 5822, + 5777, + 5811, + 5758, + 5756, + 5772, + 5799, + 5749, + 5772, + 5774, + 5742, + 5793, + 5754, + 5752, + 5772, + 5789, + 5784, + 5774, + 5746, + 5769, + 5739, + 5784, + 5786, + 5766, + 5736, + 5749, + 5741, + 5759, + 5744, + 5825, + 5769, + 5745, + 5808, + 5803, + 5780, + 5788, + 5768, + 5775, + 5809, + 5798, + 5783, + 5761, + 5775, + 5770, + 5772, + 5760, + 5781, + 5802, + 5767, + 5778, + 5749, + 5766, + 5767, + 5792, + 5758, + 5760, + 5736, + 5764, + 5740, + 5799, + 5783, + 5731, + 5792, + 5824, + 5779, + 5765, + 5792, + 5723, + 5771, + 5788, + 5741, + 5741, + 5748, + 5732, + 5770, + 5752, + 5782, + 5796, + 5744, + 5777, + 5752, + 5765, + 5776, + 5751, + 5754, + 5758, + 5734, + 5755, + 5771, + 5770, + 5761, + 5767, + 5796, + 5787, + 5754, + 5781, + 5735, + 5778, + 5760, + 5770, + 5768, + 5735, + 5760, + 5723, + 5739, + 5783, + 5742, + 5752, + 5746, + 5753, + 5763, + 5762, + 5772, + 5761, + 5785, + 5770, + 5744, + 5770, + 5764, + 5746, + 5757, + 5770, + 5786, + 5744, + 5737, + 5788, + 5804, + 5768, + 5750, + 5784, + 5751, + 5762, + 5780, + 5778, + 5755, + 5765, + 5735, + 5774, + 5737, + 5745, + 5753, + 5769, + 5736, + 5739, + 5755, + 5760, + 5782, + 5743, + 5758, + 5765, + 5759, + 5812, + 5770, + 5759, + 5755, + 5777, + 5773, + 5766, + 5772, + 5780, + 5787, + 5769, + 5754, + 5775, + 5786, + 5759, + 5799, + 5783, + 5762, + 5771, + 5778, + 5735, + 5745, + 5766, + 5786, + 5789, + 5757, + 5748, + 5777, + 5781, + 5770, + 5758, + 5773, + 5813, + 5761, + 5735, + 5753, + 5750, + 5758, + 5773, + 5789, + 5791, + 5763, + 5792, + 5779, + 5754, + 5764, + 5824, + 5769, + 5738, + 5760, + 5778, + 5772, + 5781, + 5755, + 5750, + 5736, + 5755, + 5746, + 5792, + 5772, + 5775, + 5792, + 5760, + 5764, + 5756, + 5770, + 5757, + 5780, + 5742, + 5784, + 5788, + 5754, + 5746, + 5780, + 5762, + 5767, + 5818, + 5742, + 5869, + 5746, + 5751, + 5756, + 5789, + 5766, + 5747, + 5780, + 5746, + 5738, + 5786, + 5789, + 5788, + 5771, + 5766, + 5761, + 5754, + 5758, + 5777, + 5763, + 5798, + 5841, + 5757, + 5740, + 5762, + 5792, + 5733, + 5784, + 5832, + 5761, + 5791, + 5771, + 5770, + 5732, + 5764, + 5793, + 5794, + 5779, + 5742, + 5771, + 5763, + 5726, + 5761, + 5751, + 5759, + 5767, + 5755, + 5770, + 5767, + 5779, + 5757, + 5784, + 5757, + 5742, + 5794, + 5760, + 5765, + 5802, + 5748, + 5742, + 5760, + 5751, + 5768, + 5742, + 5726, + 5769, + 5755, + 5767, + 5758, + 5783, + 5762, + 5759, + 5779, + 5760, + 5760, + 5770, + 5744, + 5782, + 5767, + 5790, + 5776, + 5777, + 5770, + 5752, + 5749, + 5788, + 5769, + 5758, + 5751, + 5765, + 5748, + 5780, + 5736, + 5740, + 5756, + 5806, + 5766, + 5772, + 5782, + 5744, + 5766, + 5826, + 5753, + 5757, + 5746, + 5786, + 5807, + 5785, + 5779, + 5764, + 5741, + 5785, + 5742, + 5756, + 5760, + 5765, + 5764, + 5775, + 5754, + 5768, + 5782, + 5746, + 5765, + 5734, + 5795, + 5785, + 5747, + 5765, + 5783, + 5773, + 5726, + 5781, + 5762, + 5770, + 5831, + 5801, + 5744, + 5780, + 5768, + 5730, + 5743, + 5768, + 5776, + 5749, + 5778, + 5739, + 5748, + 5753, + 5789, + 5762, + 5754, + 5741, + 5736, + 5755, + 5799, + 5754, + 5764, + 5745, + 5780, + 5774, + 5749, + 5773, + 5733, + 5779, + 5775, + 5752, + 5741, + 5758, + 5736, + 5728, + 5779, + 5769, + 5771, + 5793, + 5790, + 5774, + 5768, + 5787, + 5752, + 5770, + 5773, + 5791, + 5817, + 5756, + 5766, + 5738, + 5750, + 5750, + 5773, + 5755, + 5770, + 5782, + 5768, + 5847, + 5766, + 5766, + 5784, + 5791, + 5775, + 5753, + 5751, + 5773, + 5763, + 5788, + 5772, + 5741, + 5732, + 5743, + 5734, + 5746, + 5798, + 5777, + 5762, + 5774, + 5767, + 5749, + 5723, + 5785, + 5785, + 5775, + 5793, + 5763, + 5735, + 5766, + 5758, + 5783, + 5751, + 5749, + 5765, + 5742, + 5765, + 5797, + 5818, + 5816, + 5826, + 5820, + 5795, + 5791, + 5772, + 5766, + 5763, + 5794, + 5725, + 5766, + 5754, + 5767, + 5787, + 5761, + 5790, + 5779, + 5795, + 5767, + 5795, + 5779, + 5766, + 5765, + 5760, + 5829, + 5757, + 5742, + 5809, + 5751, + 5748, + 5780, + 5774, + 5748, + 5735, + 5785, + 5784, + 5769, + 5797, + 5774, + 5775, + 5742, + 5738, + 5741, + 5758, + 5756, + 5759, + 5760, + 5754, + 5770, + 5742, + 5748, + 5750, + 5763, + 5754, + 5743, + 5788, + 5778, + 5759, + 5768, + 5762, + 5784, + 5739, + 5716, + 5755, + 5795, + 5767, + 5757, + 5765, + 5740, + 5784, + 5828, + 5742, + 5810, + 5763, + 5790, + 5800, + 5769, + 5759, + 5809, + 5750, + 5747, + 5801, + 5751, + 5746, + 5749, + 5756, + 5761, + 5724, + 5768, + 5768, + 5762, + 5735, + 5741, + 5753, + 5730, + 5740, + 5770, + 5780, + 5801, + 5750, + 5732, + 5734, + 5779, + 5752, + 5793, + 5794, + 5746, + 5793, + 5738, + 5765, + 5744, + 5733, + 5754, + 5804, + 5757, + 5760, + 5813, + 5857, + 5755, + 5748, + 5779, + 5748, + 5777, + 5761, + 5756, + 5741, + 5787, + 5749, + 5773, + 5754, + 5750, + 5772, + 5739, + 5781, + 5744, + 5751, + 5764, + 5824, + 5729, + 5744, + 5746, + 5767, + 5764, + 5813, + 5780, + 5764, + 5789, + 5745, + 5746, + 5744, + 5755, + 5742, + 5797, + 5743, + 5749, + 5752, + 5779, + 5774, + 5762, + 5752, + 5753, + 5764, + 5754, + 5745, + 5763, + 5777, + 5749, + 5764, + 5733, + 5767, + 5752, + 5776, + 5770, + 5758, + 5738, + 5761, + 5801, + 5753, + 5757, + 5775, + 5847, + 5766, + 5751, + 5777, + 5777, + 5749, + 5786, + 5748, + 5755, + 5747, + 5758, + 5810, + 5752, + 5775, + 5756, + 5745, + 5737, + 5767, + 5733, + 5777, + 5773, + 5729, + 5747, + 5769, + 5758, + 5775, + 5761, + 5731, + 5736, + 5760, + 5798, + 5758, + 5737, + 5739, + 5775, + 5766, + 5761, + 5746, + 5784, + 5758, + 5816, + 5763, + 5809, + 5735, + 5748, + 5772, + 5758, + 5799, + 5745, + 5782, + 5785, + 5751, + 5762, + 5783, + 5790, + 5749, + 5768, + 5753, + 5751, + 5761, + 5773, + 5764, + 5760, + 5751, + 5735, + 5760, + 5764, + 5772, + 5741, + 5746, + 5772, + 5767, + 5771, + 5780, + 5741, + 5813, + 5766, + 5779, + 5768, + 5765, + 5770, + 5741, + 5776, + 5776, + 5758, + 5760, + 5751, + 5737, + 5759, + 5741, + 5790, + 5744, + 5749, + 5771, + 5767, + 5750, + 5770, + 5737, + 5864, + 5757, + 5769, + 5728, + 5774, + 5762, + 5773, + 5757, + 5769, + 5766, + 5752, + 5775, + 5760, + 5753, + 5772, + 5771, + 5744, + 5756, + 5758, + 5754, + 5842, + 5754, + 5793, + 5777, + 5758, + 5755, + 5735, + 5767, + 5770, + 5755, + 5801, + 5772, + 5741, + 5765, + 5761, + 5740, + 5775, + 5792, + 5778, + 5755, + 5726, + 5755, + 5772, + 5775, + 5767, + 5767, + 5755, + 5744, + 5758, + 5790, + 5737, + 5790, + 5747, + 5791, + 5742, + 5799, + 5742, + 5759, + 5744, + 5757, + 5750, + 5788, + 5774, + 5803, + 5766, + 5805, + 5753, + 5747, + 5750, + 5770, + 5732, + 5776, + 5806, + 5775, + 5735, + 5751, + 5785, + 5759, + 5738, + 5785, + 5767, + 5746, + 5793, + 5780, + 5752, + 5743, + 5798, + 5784, + 5765, + 5763, + 5780, + 5763, + 5762, + 5760, + 5743, + 5756, + 5756, + 5728, + 5749, + 5747, + 5749, + 5757, + 5792, + 5814, + 5735, + 5793, + 5768, + 5738, + 5748, + 5777, + 5789, + 5769, + 5732, + 5762, + 5748, + 5736, + 5767, + 5783, + 5762, + 5748, + 5760, + 5767, + 5750, + 5742, + 5768, + 5788, + 5782, + 5741, + 5754, + 5757, + 5731, + 5732, + 5756, + 5802, + 5745, + 5764, + 5781, + 5765, + 5747, + 5784, + 5752, + 5768, + 5802, + 5750, + 5734, + 5767, + 5786, + 5799, + 5819, + 5785, + 5839, + 5776, + 5796, + 5780, + 5744, + 5734, + 5756, + 5763, + 5777, + 5777, + 5770, + 5798, + 5799, + 5769, + 5776, + 5785, + 5756, + 5737, + 5794, + 5751, + 5762, + 5781, + 5762, + 5766, + 5764, + 5761, + 5778, + 5782, + 5783, + 5794, + 5765, + 5760, + 5777, + 5781, + 5733, + 5750, + 5750, + 5770, + 5767, + 5751, + 5743, + 5761, + 5863, + 5770, + 5740, + 5764, + 5782, + 5800, + 5799, + 5785, + 5743, + 5735, + 5774, + 5758, + 5777, + 5773, + 5801, + 5746, + 5784, + 5799, + 5764, + 5740, + 5793, + 5777, + 5801, + 5764, + 5760, + 5769, + 5770, + 5780, + 5766, + 5762, + 5742, + 5830, + 5766, + 5809, + 5730, + 5791, + 5779, + 5742, + 5770, + 5754, + 5771, + 5737, + 5732, + 5737, + 5759, + 5767, + 5757, + 5736, + 5735, + 5783, + 5747, + 5803, + 5790, + 5736, + 5760, + 5796, + 5780, + 5738, + 5772, + 5763, + 5738, + 5770, + 5728, + 5754, + 5729, + 5755, + 5762, + 5771, + 5730, + 5746, + 5755, + 5778, + 5731, + 5746, + 5748, + 5773, + 5745, + 5774, + 5752, + 5834, + 5834, + 5829, + 5762, + 5725, + 5754, + 5764, + 5755, + 5741, + 5747, + 5772, + 5757, + 5792, + 5747, + 5763, + 5763, + 5733, + 5720, + 5769, + 5735, + 5763, + 5738, + 5750, + 5771, + 5769, + 5774, + 5729, + 5761, + 5745, + 5739, + 5741, + 5787, + 5759, + 5736, + 5739, + 5750, + 5732, + 5739, + 5765, + 5775, + 5730, + 5792, + 5742, + 5740, + 5737, + 5781, + 5761, + 5959, + 5743, + 5760, + 5761, + 5769, + 5797, + 5766, + 5754, + 5773, + 5761, + 5775, + 5740, + 5769, + 5764, + 5758, + 5743, + 5743, + 5753, + 5723, + 5749, + 5750, + 5818, + 5774, + 5744, + 5803, + 5759, + 5765, + 5770, + 5780, + 5721, + 5766, + 5776, + 5743, + 5744, + 5764, + 5731, + 5791, + 5771, + 5838, + 5777, + 5800, + 5774, + 5749, + 5745, + 5762, + 5765, + 5746, + 5731, + 5772, + 5763, + 5758, + 5746, + 5739, + 5757, + 5759, + 5752, + 5809, + 5735, + 5771, + 5754, + 5782, + 5771, + 5734, + 5772, + 5738, + 5774, + 5804, + 5774, + 5753, + 5775, + 5747, + 5765, + 5737, + 5772, + 5745, + 5825, + 5762, + 5753, + 5768, + 5777, + 5772, + 5794, + 5773, + 5770, + 5751, + 5765, + 5751, + 5796, + 5767, + 5790, + 5790, + 5754, + 5811, + 5763, + 5776, + 5786, + 5766, + 5790, + 5784, + 5788, + 5739, + 5838, + 5794, + 5809, + 5770, + 5769, + 5750, + 5760, + 5748, + 5786, + 5780, + 5750, + 5766, + 5789, + 5754, + 5733, + 5764, + 5774, + 5809, + 5788, + 5779, + 5772, + 5745, + 5787, + 5766, + 5787, + 5747, + 5728, + 5791, + 5767, + 5768, + 5760, + 5758, + 5773, + 5772, + 5759, + 5762, + 5765, + 5792, + 5732, + 5763, + 5763, + 5791, + 5737, + 5767, + 5767, + 5743, + 5756, + 5767, + 5746, + 5778, + 5809, + 5752, + 5742, + 5742, + 5757, + 5860, + 5754, + 5758, + 5767, + 5744, + 5738, + 5756, + 5736, + 5806, + 5784, + 5757, + 5794, + 5753, + 5744, + 5799, + 5764, + 5790, + 5759, + 5761, + 5751, + 5744, + 5781, + 5814, + 5740, + 5819, + 5751, + 5787, + 5735, + 5778, + 5779, + 5759, + 5748, + 5763, + 5745, + 5758, + 5791, + 5754, + 5753, + 5777, + 5739, + 5790, + 5761, + 5777, + 5827, + 5772, + 5781, + 5759, + 5762, + 5775, + 5778, + 5813, + 5733, + 5842, + 5762, + 5766, + 5769, + 5769, + 5775, + 5756, + 5785, + 5766, + 5773, + 5752, + 5734, + 5747, + 5763, + 5778, + 5760, + 5771, + 5748, + 5756, + 5794, + 5729, + 5757, + 5761, + 5746, + 5774, + 5750, + 5748, + 5785, + 5740, + 5771, + 5759, + 5741, + 5741, + 5740, + 5771, + 5777, + 5744, + 5738, + 5750, + 5767, + 5831, + 5743, + 5762, + 5731, + 5756, + 5771, + 5775, + 5748, + 5743, + 5763, + 5782, + 5748, + 5740, + 5738, + 5779, + 5770, + 5756, + 5754, + 5796, + 5764, + 5765, + 5739, + 5820, + 5777, + 5797, + 5818, + 5778, + 5756, + 5772, + 5738, + 5792, + 5755, + 5770, + 5737, + 5773, + 5751, + 5771, + 5786, + 5772, + 5751, + 5782, + 5791, + 5752, + 5739, + 5755, + 5741, + 5816, + 5759, + 5758, + 5750, + 5756, + 5769, + 5783, + 5801, + 5750, + 5781, + 5749, + 5772, + 5789, + 5757, + 5770, + 5744, + 5843, + 5757, + 5739, + 5768, + 5772, + 5742, + 5776, + 5753, + 5768, + 5754, + 5779, + 5773, + 5769, + 5740, + 5773, + 5760, + 5726, + 5769, + 5759, + 5724, + 5749, + 5802, + 5745, + 5760, + 5768, + 5723, + 5762, + 5756, + 5758, + 5784, + 5732, + 5768, + 5770, + 5778, + 5775, + 5776, + 5763, + 5778, + 5743, + 5756, + 5761, + 5775, + 5768, + 5729, + 5738, + 5797, + 5749, + 5796, + 5769, + 5766, + 5777, + 5740, + 5739, + 5805, + 5751, + 5777, + 5755, + 5775, + 5766, + 5744, + 5776, + 5770, + 5734, + 5797, + 5778, + 5764, + 5751, + 5762, + 5744, + 5762, + 5737, + 5764, + 5774, + 5784, + 5740, + 5768, + 5778, + 5787, + 5750, + 5780, + 5803, + 5794, + 5744, + 5815, + 5804, + 5763, + 5785, + 5777, + 5789, + 5776, + 5818, + 5746, + 5770, + 5788, + 5765, + 5808, + 5732, + 5757, + 5761, + 5763, + 5820, + 5741, + 5738, + 5769, + 5777, + 5803, + 5804, + 5767, + 5761, + 5745, + 5780, + 5798, + 5778, + 5758, + 5819, + 5730, + 5767, + 5740, + 5769, + 5807, + 5801, + 5795, + 5767, + 5789, + 5741, + 5739, + 5784, + 5787, + 5759, + 5761, + 5791, + 5781, + 5762, + 5759, + 5741, + 5814, + 5762, + 5733, + 5774, + 5728, + 5762, + 5737, + 5766, + 5750, + 5774, + 5787, + 5763, + 5765, + 5765, + 5737, + 5759, + 5786, + 5747, + 5764, + 5763, + 5779, + 5760, + 5751, + 5787, + 5739, + 5754, + 5792, + 5745, + 5734, + 5778, + 5769, + 5798, + 5761, + 5777, + 5850, + 5779, + 5769, + 5797, + 5758, + 5802, + 5778, + 5731, + 5765, + 5742, + 5774, + 5791, + 5764, + 5778, + 5765, + 5778, + 5771, + 5751, + 5740, + 5799, + 5787, + 5752, + 5758, + 5797, + 5778, + 5751, + 5766, + 5777, + 5737, + 5758, + 5763, + 5779, + 5776, + 5740, + 5813, + 5765, + 5772, + 5754, + 5770, + 5761, + 5767, + 5764, + 5819, + 5774, + 5770, + 5734, + 5785, + 5777, + 5764, + 5762, + 5772, + 5762, + 5765, + 5734, + 5768, + 5769, + 5745, + 5745, + 5763, + 5768, + 5738, + 5746, + 5804, + 5752, + 5823, + 5746, + 5745, + 5781, + 5738, + 5758, + 5759, + 5749, + 5765, + 5744, + 5758, + 5828, + 5754, + 5821, + 5798, + 5763, + 5783, + 5748, + 5813, + 5774, + 5741, + 5747, + 5777, + 5747, + 5808, + 5777, + 5760, + 5777, + 5786, + 5774, + 5756, + 5789, + 5733, + 5722, + 5770, + 5781, + 5763, + 5795, + 5745, + 5751, + 5745, + 5762, + 5746, + 5726, + 5748, + 5768, + 5753, + 5756, + 5774, + 5792, + 5756, + 5784, + 5753, + 5764, + 5785, + 5760, + 5740, + 5734, + 5741, + 5758, + 5772, + 5760, + 5765, + 5748, + 5761, + 5743, + 5758, + 5773, + 5817, + 5770, + 5787, + 5741, + 5767, + 5763, + 5822, + 5751, + 5793, + 5780, + 5794, + 5760, + 5776, + 5826, + 5750, + 5726, + 5732, + 5763, + 5780, + 5798, + 5776, + 5745, + 5778, + 5758, + 5786, + 5828, + 5732, + 5759, + 5776, + 5784, + 5734, + 5757, + 5773, + 5763, + 5755, + 5821, + 5768, + 5774, + 5749, + 5780, + 5740, + 5771, + 5754, + 5753, + 5755, + 5845, + 5760, + 5773, + 5728, + 5766, + 5761, + 5768, + 5768, + 5774, + 5766, + 5734, + 5784, + 5790, + 5764, + 5735, + 5728, + 5773, + 5770, + 5744, + 5789, + 5812, + 5745, + 5772, + 5756, + 5772, + 5755, + 5752, + 5766, + 5758, + 5755, + 5783, + 5765, + 5724, + 5745, + 5777, + 5740, + 5733, + 5751, + 5784, + 5759, + 5764, + 5739, + 5759, + 5797, + 5783, + 5762, + 5746, + 5760, + 5756, + 5782, + 5768, + 5795, + 5753, + 5765, + 5771, + 5787, + 5785, + 5777, + 5785, + 5780, + 5799, + 5758, + 5740, + 5736, + 5756, + 5754, + 5784, + 5784, + 5745, + 5762, + 5758, + 5781, + 5755, + 5768, + 5756, + 5736, + 5748, + 5732, + 5737, + 5789, + 5778, + 5751, + 5755, + 5734, + 5765, + 5750, + 5760, + 5778, + 5809, + 5743, + 5783, + 5826, + 5781, + 5726, + 5788, + 5778, + 5765, + 5759, + 5746, + 5802, + 5739, + 5757, + 5783, + 5742, + 5736, + 5731, + 5751, + 5753, + 5761, + 5786, + 5748, + 5748, + 5746, + 5761, + 5728, + 5765, + 5768, + 5761, + 5727, + 5735, + 5793, + 5737, + 5800, + 5802, + 5766, + 5746, + 5758, + 5780, + 5768, + 5797, + 5802, + 5741, + 5750, + 5748, + 5753, + 5793, + 5773, + 5763, + 5762, + 5847, + 5783, + 5809, + 5773, + 5755, + 5800, + 5772, + 5741, + 5770, + 5751, + 5786, + 5757, + 5738, + 5784, + 5773, + 5776, + 5813, + 5783, + 5816, + 5742, + 5735, + 5759, + 5758, + 5746, + 5800, + 5753, + 5754, + 5746, + 5749, + 5753, + 5746, + 5766, + 5738, + 5750, + 5772, + 5821, + 5804, + 5779, + 5745, + 5769, + 5741, + 5742, + 5744, + 5778, + 5780, + 5728, + 5791, + 5783, + 5788, + 5753, + 5742, + 5821, + 5748, + 5773, + 5818, + 5757, + 5766, + 5752, + 5754, + 5736, + 5775, + 5769, + 5759, + 5769, + 5787, + 5789, + 5753, + 5760, + 5767, + 5795, + 5731, + 5775, + 5782, + 5760, + 5799, + 5766, + 5766, + 5787, + 5758, + 5782, + 5747, + 5753, + 5736, + 5775, + 5754, + 5805, + 5765, + 5757, + 5787, + 5818, + 5767, + 5741, + 5762, + 5768, + 5776, + 5798, + 5783, + 5745, + 5756, + 5760, + 5763, + 5767, + 5752, + 5791, + 5778, + 5754, + 5826, + 5751, + 5754, + 5748, + 5740, + 5765, + 5763, + 5754, + 5827, + 5772, + 5758, + 5770, + 5777, + 5774, + 5783, + 5806, + 5796, + 5770, + 5785, + 5790, + 5805, + 5782, + 5764, + 5742, + 5774, + 5747, + 5779, + 5761, + 5777, + 5796, + 5773, + 5751, + 5786, + 5779, + 5737, + 5767, + 5767, + 5794, + 5830, + 5759, + 5741, + 5734, + 5729, + 5747, + 5744, + 5761, + 5752, + 5774, + 5793, + 5750, + 5753, + 5798, + 5762, + 5784, + 5781, + 5738, + 5782, + 5772, + 5740, + 5729, + 5805, + 5817, + 5744, + 5770, + 5740, + 5761, + 5747, + 5769, + 5763, + 5727, + 5763, + 5742, + 5741, + 5751, + 5758, + 5760, + 5741, + 5759, + 5746, + 5744, + 5771, + 5786, + 5773, + 5739, + 5760, + 5746, + 5801, + 5755, + 5762, + 5737, + 5758, + 5766, + 5768, + 5732, + 5749, + 5760, + 5785, + 5758, + 5761, + 5778, + 5764, + 5734, + 5790, + 5769, + 5734, + 5748, + 5789, + 5729, + 5778, + 5782, + 5744, + 5770, + 5802, + 5744, + 5758, + 5785, + 5779, + 5764, + 5763, + 5780, + 5802, + 5750, + 5786, + 5800, + 5785, + 5760, + 5757, + 5750, + 5791, + 5741, + 5753, + 5780, + 5802, + 5744, + 5805, + 5760, + 5735, + 5796, + 5746, + 5746, + 5770, + 5759, + 5746, + 5732, + 5754, + 5767, + 5775, + 5750, + 5796, + 5780, + 5796, + 5752, + 5783, + 5765, + 5758, + 5748, + 5811, + 5760, + 5798, + 5761, + 5740, + 5774, + 5782, + 5785, + 5750, + 5804, + 5763, + 5744, + 5755, + 5762, + 5747, + 5759, + 5769, + 5742, + 5793, + 5831, + 5771, + 5790, + 5796, + 5792, + 5756, + 5744, + 5749, + 5764, + 5788, + 5750, + 5801, + 5745, + 5760, + 5795, + 5762, + 5795, + 5743, + 5778, + 5740, + 5760, + 5748, + 5765, + 5791, + 5777, + 5799, + 5772, + 5765, + 5773, + 5801, + 5773, + 5762, + 5785, + 5768, + 5748, + 5765, + 5757, + 5753, + 5763, + 5794, + 5791, + 5765, + 5765, + 5839, + 5746, + 5751, + 5809, + 5773, + 5738, + 5773, + 5792, + 5742, + 5771, + 5790, + 5784, + 5762, + 5764, + 5767, + 5750, + 5739, + 5777, + 5768, + 5770, + 5780, + 5738, + 5789, + 5787, + 5773, + 5771, + 5775, + 5766, + 5776, + 5762, + 5769, + 5736, + 5785, + 5745, + 5748, + 5756, + 5771, + 5782, + 5778, + 5745, + 5750, + 5740, + 5765, + 5757, + 5808, + 5790, + 5739, + 5771, + 5803, + 5789, + 5762, + 5755, + 5777, + 5776, + 5784, + 5764, + 5755, + 5775, + 5736, + 5748, + 5753, + 5740, + 5758, + 5732, + 5741, + 5744, + 5767, + 5769, + 5738, + 5799, + 5788, + 5729, + 5776, + 5824, + 5775, + 5754, + 5744, + 5745, + 5792, + 5762, + 5796, + 5769, + 5795, + 5767, + 5772, + 5782, + 5783, + 5774, + 5774, + 5753, + 5747, + 5771, + 5740, + 5746, + 5754, + 5766, + 5756, + 5755, + 5756, + 5740, + 5774, + 5755, + 5821, + 5768, + 5736, + 5800, + 5765, + 5744, + 5766, + 5768, + 5808, + 5774, + 5764, + 5757, + 5765, + 5761, + 5751, + 5792, + 5775, + 5767, + 5756, + 5779, + 5783, + 5767, + 5742, + 5779, + 5776, + 5780, + 5789, + 5790, + 5813, + 5762, + 5771, + 5748, + 5767, + 5739, + 5759, + 5763, + 5763, + 5774, + 5753, + 5761, + 5759, + 5780, + 5782, + 5766, + 5797, + 5751, + 5766, + 5774, + 5785, + 5732, + 5823, + 5762, + 5769, + 5799, + 5771, + 5761, + 5763, + 5806, + 5786, + 5751, + 5760, + 5763, + 5752, + 5770, + 5765, + 5799, + 5766, + 5748, + 5761, + 5731, + 5770, + 5788, + 5794, + 5751, + 5777, + 5757, + 5769, + 5738, + 5844, + 5782, + 5728, + 5747, + 5779, + 5756, + 5763, + 5781, + 5777, + 5764, + 5737, + 5764, + 5775, + 5800, + 5800, + 5742, + 5785, + 5794, + 5746, + 5758, + 5793, + 5807, + 5738, + 5779, + 5796, + 5769, + 5797, + 5733, + 5735, + 5774, + 5729, + 5761, + 5758, + 5760, + 5784, + 5819, + 5764, + 5736, + 5773, + 5773, + 5739, + 5786, + 5752, + 5743, + 5733, + 5786, + 5730, + 5756, + 5728, + 5765, + 5780, + 5755, + 5769, + 5759, + 5765, + 5739, + 5770, + 5804, + 5768, + 5763, + 5742, + 5770, + 5753, + 5751, + 5780, + 5736, + 5741, + 5772, + 5779, + 5741, + 5756, + 5769, + 5745, + 5736, + 5769, + 5777, + 5753, + 5797, + 5745, + 5729, + 5885, + 5773, + 5744, + 5788, + 5741, + 5740, + 5781, + 5779, + 5763, + 5781, + 5766, + 5768, + 5763, + 5757, + 5733, + 5754, + 5774, + 5774, + 5742, + 5756, + 5790, + 5760, + 5771, + 5739, + 5763, + 5750, + 5761, + 5758, + 5742, + 5736, + 5744, + 5767, + 5734, + 5788, + 5762, + 5739, + 5740, + 5752, + 5772, + 5743, + 5834, + 5798, + 5770, + 5758, + 5790, + 5742, + 5831, + 5791, + 5742, + 5750, + 5790, + 5765, + 5769, + 5802, + 5772, + 5784, + 5765, + 5783, + 5781, + 5768, + 5744, + 5756, + 5786, + 5764, + 5759, + 5776, + 5761, + 5742, + 5802, + 5765, + 5780, + 5798, + 5749, + 5734, + 5776, + 5739, + 5755, + 5759, + 5762, + 5764, + 5787, + 5755, + 5750, + 5743, + 5741, + 5743, + 5759, + 5775, + 5755, + 5746, + 5838, + 5737, + 5752, + 5769, + 5757, + 5794, + 5753, + 5778, + 5762, + 5744, + 5750, + 5782, + 5737, + 5737, + 5755, + 5743, + 5742, + 5764, + 5742, + 5761, + 5761, + 5744, + 5768, + 5780, + 5822, + 5775, + 5767, + 5763, + 5765, + 5795, + 5812, + 5782, + 5764, + 5792, + 5777, + 5743, + 5733, + 5762, + 5757, + 5752, + 5801, + 5743, + 5766, + 5758, + 5819, + 5750, + 5809, + 5800, + 5790, + 5781, + 5740, + 5734, + 5750, + 5745, + 5761, + 5789, + 5850, + 5744, + 5769, + 5747, + 5742, + 5770, + 5758, + 5763, + 5801, + 5774, + 5796, + 5744, + 5738, + 5742, + 5781, + 5827, + 5754, + 5748, + 5734, + 5739, + 5740, + 5778, + 5756, + 5780, + 5786, + 5754, + 5806, + 5769, + 5746, + 5739, + 5752, + 5787, + 5759, + 5759, + 5737, + 5763, + 5768, + 5750, + 5767, + 5745, + 5766, + 5741, + 5744, + 5763, + 5761, + 5749, + 5794, + 5757, + 5752, + 5752, + 5775, + 5767, + 5764, + 5768, + 5760, + 5794, + 5756, + 5785, + 5782, + 5762, + 5777, + 5768, + 5738, + 5884, + 5741, + 5747, + 5778, + 5774, + 5762, + 5808, + 5730, + 5891, + 5800, + 5775, + 5774, + 5741, + 5739, + 5755, + 5737, + 5811, + 5769, + 5767, + 5754, + 5762, + 5759, + 5775, + 5762, + 5743, + 5768, + 5762, + 5767, + 5757, + 5750, + 5747, + 5754, + 5761, + 5736, + 5758, + 5765, + 5752, + 5750, + 5748, + 5799, + 5757, + 5763, + 5743, + 5794, + 5744, + 5762, + 5748, + 5801, + 5767, + 5734, + 5748, + 5778, + 5769, + 5752, + 5776, + 5737, + 5759, + 5736, + 5749, + 5764, + 5764, + 5761, + 5777, + 5743, + 5792, + 5766, + 5773, + 5762, + 5756, + 5764, + 5760, + 5755, + 5777, + 5768, + 5789, + 5783, + 5754, + 5746, + 5778, + 5774, + 5763, + 5760, + 5754, + 5769, + 5777, + 5783, + 5759, + 5746, + 5744, + 5767, + 5731, + 5738, + 5780, + 5752, + 5732, + 5787, + 5763, + 5769, + 5771, + 5737, + 5753, + 5753, + 5733, + 5750, + 5757, + 5837, + 5805, + 5776, + 5768, + 5742, + 5730, + 5753, + 5732, + 5758, + 5793, + 5735, + 5806, + 5760, + 5812, + 5766, + 5762, + 5739, + 5766, + 5759, + 5780, + 5753, + 5761, + 5750, + 5805, + 5757, + 5734, + 5764, + 5798, + 5770, + 5749, + 5756, + 5765, + 5799, + 5780, + 5758, + 5750, + 5761, + 5761, + 5773, + 5771, + 5748, + 5740, + 5734, + 5758, + 5748, + 5737, + 5735, + 5743, + 5757, + 5777, + 5767, + 5782, + 5741, + 5765, + 5744, + 5795, + 5783, + 5760, + 5760, + 5817, + 5752, + 5744, + 5792, + 5767, + 5744, + 5738, + 5770, + 5735, + 5819, + 5744, + 5761, + 5785, + 5752, + 5799, + 5782, + 5741, + 5788, + 5740, + 5744, + 5765, + 5797, + 5760, + 5764, + 5758, + 5782, + 5768, + 5760, + 5768, + 5725, + 5744, + 5748, + 5756, + 5760, + 5789, + 5782, + 5760, + 5778, + 5761, + 5751, + 5749, + 5812, + 5792, + 5739, + 5777, + 5762, + 5783, + 5771, + 5743, + 5730, + 5757, + 5779, + 5764, + 5738, + 5788, + 5737, + 5793, + 5759, + 5773, + 5782, + 5765, + 5753, + 5775, + 5775, + 5761, + 5761, + 5752, + 5780, + 5758, + 5750, + 5753, + 5756, + 5759, + 5782, + 5747, + 5776, + 5738, + 5750, + 5756, + 5781, + 5799, + 5750, + 5777, + 5770, + 5744, + 5796, + 5735, + 5800, + 5742, + 5749, + 5764, + 5794, + 5730, + 5753, + 5773, + 5769, + 5782, + 5773, + 5765, + 5771, + 5797, + 5744, + 5761, + 5743, + 5758, + 5798, + 5756, + 5786, + 5774, + 5776, + 5798, + 5799, + 5769, + 5725, + 5770, + 5757, + 5778, + 5763, + 5752, + 5778, + 5745, + 5796, + 5761, + 5751, + 5803, + 5747, + 5789, + 5765, + 5762, + 5740, + 5797, + 5734, + 5793, + 5784, + 5763, + 5783, + 5754, + 5771, + 5775, + 5758, + 5745, + 5790, + 5758, + 5746, + 5734, + 5779, + 5763, + 5801, + 5763, + 5757, + 5822, + 5764, + 5741, + 5783, + 5759, + 5786, + 5759, + 5757, + 5765, + 5728, + 5764, + 5759, + 5770, + 5734, + 5742, + 5760, + 5772, + 5740, + 5740, + 5771, + 5767, + 5803, + 5751, + 5769, + 5757, + 5754, + 5747, + 5775, + 5737, + 5767, + 5775, + 5764, + 5798, + 5743, + 5762, + 5732, + 5767, + 5761, + 5736, + 5794, + 5788, + 5750, + 5772, + 5796, + 5757, + 5759, + 5806, + 5728, + 5746, + 5765, + 5760, + 5797, + 5785, + 5763, + 5761, + 5742, + 5741, + 5783, + 5764, + 5762, + 5764, + 5768, + 5740, + 5752, + 5750, + 5760, + 5764, + 5767, + 5749, + 5776, + 5779, + 5738, + 5751, + 5787, + 5750, + 5769, + 5764, + 5759, + 5737, + 5753, + 5807, + 5780, + 5773, + 5747, + 5806, + 5772, + 5765, + 5806, + 5764, + 5745, + 5742, + 5768, + 5782, + 5785, + 5750, + 5789, + 5774, + 5772, + 5782, + 5751, + 5768, + 5747, + 5734, + 5739, + 5776, + 5776, + 5743, + 5779, + 5734, + 5745, + 5775, + 5737, + 5751, + 5735, + 5756, + 5743, + 5757, + 5765, + 5759, + 5822, + 5773, + 5754, + 5766, + 5798, + 5760, + 5746, + 5738, + 5773, + 5745, + 5812, + 5757, + 5771, + 5743, + 5733, + 5794, + 5748, + 5758, + 5765, + 5729, + 5772, + 5738, + 5782, + 5753, + 5788, + 5747, + 5745, + 5755, + 5765, + 5763, + 5747, + 5784, + 5743, + 5788, + 5824, + 5732, + 5766, + 5778, + 5763, + 5774, + 5767, + 5745, + 5761, + 5745, + 5747, + 5745, + 5777, + 5732, + 5766, + 5748, + 5756, + 5742, + 5748, + 5754, + 5743, + 5759, + 5773, + 5805, + 5720, + 5836, + 5788, + 5736, + 5763, + 5793, + 5748, + 5741, + 5776, + 5743, + 5766, + 5741, + 5733, + 5794, + 5736, + 5751, + 5794, + 5747, + 5763, + 5725, + 5773, + 5742, + 5744, + 5752, + 5758, + 5805, + 5733, + 5796, + 5786, + 5750, + 5738, + 5729, + 5766, + 5771, + 5766, + 5797, + 5758, + 5777, + 5778, + 5759, + 5739, + 5791, + 5743, + 5776, + 5761, + 5753, + 5728, + 5760, + 5755, + 5752, + 5741, + 5751, + 5775, + 5746, + 5760, + 5735, + 5794, + 5753, + 5742, + 5784, + 5748, + 5802, + 5751, + 5797, + 5781, + 5754, + 5752, + 5776, + 5745, + 5764, + 5791, + 5775, + 5753, + 5802, + 5796, + 5775, + 5768, + 5753, + 5781, + 5764, + 5762, + 5771, + 5754, + 5775, + 5745, + 5783, + 5755, + 5748, + 5765, + 5768, + 5785, + 5737, + 5766, + 5761, + 5805, + 5798, + 5971, + 5763, + 5756, + 5776, + 5759, + 5769, + 5761, + 5768, + 5769, + 5798, + 5786, + 5745, + 5758, + 5771, + 5744, + 5746, + 5760, + 5763, + 5790, + 5740, + 5757, + 5761, + 5753, + 5756, + 5741, + 5763, + 5762, + 5769, + 5757, + 5755, + 5771, + 5779, + 5757, + 5752, + 5752, + 5781, + 5764, + 5776, + 5785, + 5795, + 5760, + 5750, + 5745, + 5769, + 5762, + 5756, + 5738, + 5786, + 5791, + 5789, + 5756, + 5727, + 5810, + 5721, + 5748, + 5767, + 5779, + 5766, + 5747, + 5760, + 5761, + 5760, + 5753, + 5773, + 5750, + 5807, + 5748, + 5761, + 5783, + 5761, + 5772, + 5766, + 5774, + 5762, + 5746, + 5751, + 5743, + 5759, + 5746, + 5738, + 5748, + 5745, + 5782, + 5752, + 5782, + 5737, + 5752, + 5779, + 5743, + 5743, + 5732, + 5743, + 5775, + 5741, + 5756, + 5736, + 5745, + 5745, + 5762, + 5777, + 5724, + 5791, + 5758, + 5769, + 5733, + 5742, + 5737, + 5768, + 5786, + 5733, + 5760, + 5770, + 5801, + 5786, + 5776, + 5741, + 5757, + 5771, + 5749, + 5764, + 5769, + 5787, + 5803, + 5783, + 5774, + 5765, + 5822, + 5792, + 5764, + 5769, + 5743, + 5738, + 5748, + 5780, + 5748, + 5750, + 5758, + 5761, + 5744, + 5761, + 5754, + 5776, + 5766, + 5746, + 5760, + 5746, + 5759, + 5749, + 5799, + 5741, + 5776, + 5739, + 5758, + 5745, + 5781, + 5760, + 5793, + 5747, + 5774, + 5764, + 5755, + 5754, + 5749, + 5753, + 5769, + 5765, + 5785, + 5761, + 5778, + 5772, + 5716, + 5797, + 5751, + 5803, + 5778, + 5787, + 5758, + 5807, + 5775, + 5771, + 5739, + 5746, + 5739, + 5768, + 5768, + 5773, + 5740, + 5762, + 5782, + 5764, + 5774, + 5766, + 5826, + 5723, + 5749, + 5738, + 5769, + 5768, + 5792, + 5799, + 5784, + 5749, + 5746, + 5735, + 5749, + 5756, + 5747, + 5777, + 5781, + 5788, + 5755, + 5793, + 5773, + 5794, + 5789, + 5811, + 5771, + 5764, + 5741, + 5772, + 5784, + 5769, + 5769, + 5755, + 5769, + 5772, + 5815, + 5760, + 5783, + 5753, + 5790, + 5757, + 5749, + 5739, + 5758, + 5774, + 5777, + 5755, + 5802, + 5770, + 5754, + 5728, + 5734, + 5773, + 5757, + 5769, + 5774, + 5792, + 5725, + 5732, + 5785, + 5781, + 5795, + 5794, + 5735, + 5853, + 5753, + 5746, + 5769, + 5790, + 5743, + 5801, + 5776, + 5769, + 5747, + 5771, + 5818, + 5776, + 5777, + 5776, + 5746, + 5773, + 5789, + 5821, + 5784, + 5758, + 5760, + 5736, + 5749, + 5775, + 5761, + 5838, + 5751, + 5746, + 5766, + 5761, + 5761, + 5755, + 5788, + 5751, + 5785, + 5791, + 5757, + 5774, + 5781, + 5777, + 5743, + 5801, + 5776, + 5814, + 5782, + 5757, + 5763, + 5761, + 5724, + 5762, + 5755, + 5797, + 5765, + 5798, + 5730, + 5753, + 5798, + 5759, + 5760, + 5761, + 5814, + 5758, + 5773, + 5750, + 5747, + 5766, + 5778, + 5746, + 5764, + 5758, + 5765, + 5795, + 5758, + 5756, + 5768, + 5733, + 5757, + 5782, + 5754, + 5737, + 5764, + 5829, + 5752, + 5752, + 5748, + 5751, + 5772, + 5752, + 5729, + 5754, + 5770, + 5729, + 5741, + 5786, + 5758, + 5746, + 5759, + 5764, + 5785, + 5739, + 5764, + 5794, + 5775, + 5751, + 5736, + 5752, + 5762, + 5786, + 5748, + 5755, + 5738, + 5746, + 5741, + 5774, + 5850, + 5782, + 5820, + 5746, + 5770, + 5783, + 5780, + 5849, + 5792, + 5750, + 5780, + 5772, + 5773, + 5751, + 5791, + 5764, + 5734, + 5750, + 5767, + 5736, + 5769, + 5757, + 5729, + 5763, + 5749, + 5753, + 5798, + 5752, + 5752, + 5751, + 5741, + 5743, + 5761, + 5790, + 5789, + 5740, + 5797, + 5754, + 5790, + 5754, + 5773, + 5774, + 5756, + 5763, + 5799, + 5789, + 5755, + 5751, + 5795, + 5807, + 5765, + 5751, + 5768, + 5745, + 5779, + 5762, + 5748, + 5742, + 5754, + 5779, + 5743, + 5771, + 5743, + 5782, + 5751, + 5737, + 5770, + 5762, + 5735, + 5757, + 5771, + 5751, + 5740, + 5765, + 5778, + 5750, + 5736, + 5765, + 5769, + 5779, + 5756, + 5770, + 5742, + 5771, + 5760, + 5779, + 5774, + 5732, + 5764, + 5758, + 5730, + 5730, + 5731, + 5787, + 5755, + 5761, + 5748, + 5740, + 5754, + 5796, + 5768, + 5781, + 5768, + 5768, + 5774, + 5778, + 5749, + 5753, + 5793, + 5771, + 5745, + 5754, + 5740, + 5783, + 5748, + 5735, + 5749, + 5803, + 5755, + 5748, + 5771, + 5755, + 5758, + 5782, + 5792, + 5779, + 5822, + 5726, + 5761, + 5746, + 5767, + 5784, + 5746, + 5784, + 5755, + 5748, + 5786, + 5777, + 5768, + 5741, + 5786, + 5813, + 5767, + 5751, + 5750, + 5779, + 5775, + 5775, + 5755, + 5764, + 5765, + 5757, + 5799, + 5731, + 5746, + 5756, + 5763, + 5798, + 5807, + 5759, + 5735, + 5781, + 5754, + 5769, + 5769, + 5785, + 5740, + 5760, + 5756, + 5753, + 5759, + 5770, + 5764, + 5772, + 5754, + 5771, + 5832, + 5760, + 5735, + 5798, + 5779, + 5757, + 5757, + 5768, + 5748, + 5769, + 5761, + 5753, + 5766, + 5767, + 5788, + 5779, + 5756, + 5740, + 5776, + 5750, + 5777, + 5771, + 5772, + 5752, + 5764, + 5788, + 5753, + 5736, + 5744, + 5730, + 5761, + 5736, + 5746, + 5740, + 5731, + 5792, + 5810, + 5742, + 5747, + 5735, + 5775, + 5777, + 5764, + 5764, + 5742, + 5764, + 5767, + 5782, + 5812, + 5784, + 5742, + 5784, + 5769, + 5761, + 5760, + 5810, + 5734, + 5769, + 5753, + 5797, + 5754, + 5775, + 5777, + 5732, + 5743, + 5765, + 5820, + 5735, + 5763, + 5764, + 5752, + 5763, + 5791, + 5765, + 5758, + 5779, + 5779, + 5752, + 5754, + 5743, + 5742, + 5759, + 5748, + 5773, + 5761, + 5729, + 5769, + 5805, + 5758, + 5755, + 5792, + 5750, + 5767, + 5764, + 5734, + 5750, + 5761, + 5735, + 5761, + 5746, + 5778, + 5775, + 5792, + 5779, + 5772, + 5773, + 5762, + 5767, + 5771, + 5774, + 5753, + 5736, + 5738, + 5772, + 5751, + 5775, + 5750, + 5750, + 5761, + 5759, + 5762, + 5750, + 5735, + 5766, + 5748, + 5735, + 5745, + 5762, + 5756, + 5803, + 5744, + 5739, + 5750, + 5742, + 5766, + 5774, + 5800, + 5793, + 5788, + 5769, + 5747, + 5767, + 5754, + 5795, + 5757, + 5803, + 5795, + 5786, + 5761, + 5799, + 5744, + 5793, + 5787, + 5775, + 5762, + 5766, + 5771, + 5767, + 5758, + 5752, + 5725, + 5752, + 5740, + 5739, + 5748, + 5777, + 5741, + 5783, + 5785, + 5742, + 5740, + 5743, + 5765, + 5760, + 5777, + 5767, + 5785, + 5780, + 5740, + 5752, + 5752, + 5736, + 5740, + 5744, + 5797, + 5755, + 5724, + 5764, + 5771, + 5842, + 5782, + 5765, + 5748, + 5777, + 5772, + 5765, + 5797, + 5765, + 5773, + 5780, + 5748, + 5774, + 5746, + 5751, + 5742, + 5774, + 5772, + 5740, + 5781, + 5763, + 5759, + 5762, + 5772, + 5797, + 5756, + 5739, + 5789, + 5767, + 5745, + 5738, + 5750, + 5753, + 5748, + 5763, + 5794, + 5730, + 5771, + 5747, + 5812, + 5767, + 5765, + 5772, + 5771, + 5811, + 5795, + 5764, + 5769, + 5780, + 5783, + 5743, + 5781, + 5761, + 5740, + 5749, + 5778, + 5779, + 5749, + 5771, + 5766, + 5756, + 5774, + 5769, + 5745, + 5759, + 5748, + 5765, + 5738, + 5752, + 5752, + 5774, + 5736, + 5764, + 5860, + 5772, + 5734, + 5755, + 5771, + 5826, + 5753, + 5736, + 5749, + 5739, + 5755, + 5809, + 5765, + 5744, + 5783, + 5784, + 5753, + 5760, + 5738, + 5738, + 5787, + 5762, + 5786, + 5801, + 5752, + 5784, + 5772, + 5862, + 5772, + 5794, + 5760, + 5762, + 5789, + 5742, + 5741, + 5741, + 5746, + 5774, + 5824, + 5764, + 5752, + 5787, + 5773, + 5741, + 5746, + 5780, + 5763, + 5799, + 5752, + 5764, + 5765, + 5730, + 5796, + 5754, + 5768, + 5786, + 5751, + 5765, + 5737, + 5727, + 5743, + 5740, + 5829, + 5798, + 5743, + 5823, + 5745, + 5796, + 5771, + 5773, + 5759, + 5791, + 5776, + 5765, + 5750, + 5776, + 5739, + 5732, + 5779, + 5790, + 5752, + 5787, + 5762, + 5773, + 5779, + 5753, + 5857, + 5777, + 5773, + 5759, + 5795, + 5764, + 5802, + 5769, + 5794, + 5760, + 5834, + 5791, + 5758, + 5788, + 5761, + 5724, + 5745, + 5762, + 5768, + 5765, + 5789, + 5777, + 5755, + 5739, + 5728, + 5751, + 5749, + 5758, + 5746, + 5757, + 5766, + 5760, + 5747, + 5744, + 5767, + 5763, + 5794, + 5777, + 5755, + 5765, + 5723, + 5831, + 5770, + 5811, + 5754, + 5801, + 5741, + 5770, + 5731, + 5763, + 5748, + 5761, + 5806, + 5748, + 5780, + 5768, + 5785, + 5763, + 5769, + 5767, + 5779, + 5782, + 5775, + 5746, + 5767, + 5800, + 5761, + 5773, + 5775, + 5754, + 5734, + 5763, + 5759, + 5770, + 5777, + 5747, + 5831, + 5753, + 5761, + 5767, + 5756, + 5771, + 5767, + 5763, + 5766, + 5723, + 5745, + 5760, + 5769, + 5793, + 5731, + 5773, + 5753, + 5753, + 5771, + 5782, + 5746, + 5771, + 5738, + 5748, + 5753, + 5730, + 5749, + 5758, + 5758, + 5767, + 5779, + 5762, + 5764, + 5788, + 5776, + 5781, + 5752, + 5781, + 5744, + 5787, + 5745, + 5779, + 5756, + 5785, + 5741, + 5760, + 5813, + 5734, + 5765, + 5758, + 5790, + 5743, + 5814, + 5752, + 5767, + 5777, + 5740, + 5728, + 5740, + 5776, + 5759, + 5781, + 5770, + 5762, + 5754, + 5816, + 5788, + 5770, + 5760, + 5762, + 5748, + 5853, + 5763, + 5750, + 5751, + 5757, + 5767, + 5768, + 5776, + 5768, + 5780, + 5784, + 5750, + 5752, + 5799, + 5777, + 5745, + 5738, + 5795, + 5737, + 5814, + 5743, + 5763, + 5752, + 5755, + 5784, + 5746, + 5780, + 5754, + 5801, + 5756, + 5814, + 5742, + 5739, + 5839, + 5788, + 5747, + 5729, + 5752, + 5784, + 5744, + 5737, + 5802, + 5745, + 5765, + 5738, + 5740, + 5825, + 5737, + 5747, + 5778, + 5777, + 5770, + 5757, + 5736, + 5797, + 5801, + 5736, + 5764, + 5755, + 5787, + 5774, + 5733, + 5775, + 5742, + 5738, + 5755, + 5791, + 5766, + 5732, + 5765, + 5757, + 5764, + 5742, + 5765, + 5771, + 5783, + 5761, + 5777, + 5779, + 5763, + 5734, + 5751, + 5760, + 5729, + 5792, + 5762, + 5757, + 5787, + 5774, + 5795, + 5775, + 5773, + 5780, + 5782, + 5745, + 5764, + 5777, + 5781, + 5769, + 5748, + 5732, + 5748, + 5790, + 5752, + 5780, + 5773, + 5723, + 5746, + 5780, + 5758, + 5757, + 5738, + 5737, + 5762, + 5773, + 5763, + 5768, + 5765, + 5742, + 5785, + 5783, + 5769, + 5765, + 5771, + 5792, + 5736, + 5791, + 5770, + 5771, + 5763, + 5798, + 5743, + 5789, + 5761, + 5752, + 5746, + 5790, + 5787, + 5771, + 5745, + 5749, + 5772, + 5740, + 5758, + 5801, + 5779, + 5761, + 5774, + 5760, + 5747, + 5748, + 5782, + 5785, + 5779, + 5724, + 5749, + 5792, + 5804, + 5788, + 5810, + 5735, + 5732, + 5756, + 5807, + 5749, + 5745, + 5779, + 5740, + 5770, + 5815, + 5769, + 5815, + 5751, + 5777, + 5797, + 5784, + 5759, + 5813, + 5760, + 5737, + 5758, + 5793, + 5759, + 5749, + 5742, + 5739, + 5771, + 5783, + 5779, + 5742, + 5807, + 5764, + 5753, + 5759, + 5840, + 5754, + 5763, + 5783, + 5771, + 5805, + 5739, + 5781, + 5742, + 5752, + 5784, + 5771, + 5763, + 5802, + 5818, + 5738, + 5829, + 5761, + 5770, + 5812, + 5792, + 5782, + 5778, + 5778, + 5744, + 5748, + 5757, + 5778, + 5744, + 5778, + 5756, + 5809, + 5765, + 5780, + 5763, + 5767, + 5787, + 5756, + 5794, + 5758, + 5816, + 5724, + 5758, + 5761, + 5763, + 5761, + 5813, + 5761, + 5739, + 5772, + 5795, + 5746, + 5786, + 5789, + 5771, + 5771, + 5785, + 5775, + 5745, + 5771, + 5736, + 5782, + 5759, + 5791, + 5742, + 5808, + 5779, + 5755, + 5781, + 5797, + 5774, + 5742, + 5764, + 5781, + 5752, + 5742, + 5759, + 5763, + 5734, + 5777, + 5758, + 5748, + 5768, + 5761, + 5771, + 5765, + 5780, + 5781, + 5767, + 5843, + 5781, + 5788, + 5750, + 5756, + 5773, + 5792, + 5757, + 5794, + 5745, + 5759, + 5748, + 5769, + 5773, + 5745, + 5781, + 5744, + 5738, + 5746, + 5747, + 5760, + 5780, + 5752, + 5757, + 5766, + 5752, + 5765, + 5781, + 5752, + 5751, + 5769, + 5826, + 5743, + 5801, + 5782, + 5774, + 5767, + 5783, + 5769, + 5745, + 5748, + 5769, + 5744, + 5761, + 5763, + 5733, + 5782, + 5759, + 5759, + 5761, + 5732, + 5769, + 5765, + 5747, + 5753, + 5751, + 5767, + 5758, + 5767, + 5774, + 5777, + 5730, + 5771, + 5737, + 5741, + 5738, + 5757, + 5787, + 5739, + 5768, + 5757, + 5754, + 5749, + 5746, + 5778, + 5778, + 5749, + 5772, + 5804, + 5753, + 5777, + 5738, + 5754, + 5755, + 5765, + 5800, + 5751, + 5764, + 5737, + 5774, + 5747, + 5762, + 5780, + 5760, + 5736, + 5739, + 5751, + 5772, + 5779, + 5750, + 5762, + 5769, + 5740, + 5720, + 5753, + 5750, + 5756, + 5775, + 5760, + 5748, + 5784, + 5751, + 5753, + 5776, + 5743, + 5775, + 5770, + 5783, + 5758, + 5755, + 5801, + 5733, + 5819, + 5764, + 5789, + 5780, + 5738, + 5804, + 5766, + 5804, + 5756, + 5733, + 5761, + 5816, + 5768, + 5781, + 5771, + 5763, + 5791, + 5752, + 5753, + 5740, + 5769, + 5794, + 5809, + 5812, + 5753, + 5757, + 5761, + 5745, + 5806, + 5784, + 5758, + 5763, + 5773, + 5783, + 5739, + 5758, + 5803, + 5760, + 5751, + 5774, + 5734, + 5774, + 5768, + 5779, + 5773, + 5755, + 5772, + 5753, + 5806, + 5803, + 5768, + 5779, + 5786, + 5733, + 5773, + 5780, + 5747, + 5751, + 5785, + 5765, + 5764, + 5810, + 5739, + 5760, + 5790, + 5777, + 5764, + 5753, + 5769, + 5787, + 5747, + 5745, + 5764, + 5778, + 5833, + 5764, + 5750, + 5755, + 5771, + 5749, + 5744, + 5741, + 5801, + 5779, + 5748, + 5765, + 5733, + 5761, + 5765, + 5745, + 5769, + 5761, + 5790, + 5772, + 5750, + 5755, + 5779, + 5764, + 5737, + 5753, + 5742, + 5778, + 5805, + 5761, + 5778, + 5775, + 5760, + 5771, + 5738, + 5748, + 5746, + 5782, + 5737, + 5738, + 5759, + 5750, + 5781, + 5799, + 5780, + 5742, + 5763, + 5763, + 5744, + 5777, + 5851, + 5781, + 5765, + 5751, + 5773, + 5739, + 5809, + 5780, + 5782, + 5772, + 5726, + 5745, + 5721, + 5750, + 5775, + 5754, + 5735, + 5725, + 5758, + 5761, + 5778, + 5775, + 5760, + 5780, + 5784, + 5776, + 5780, + 5775, + 5779, + 5764, + 5771, + 5758, + 5770, + 5790, + 5773, + 5773, + 5782, + 5741, + 5764, + 5766, + 5765, + 5760, + 5775, + 5764, + 5753, + 5814, + 5730, + 5786, + 5736, + 5819, + 5781, + 5785, + 5786, + 5753, + 5781, + 5814, + 5759, + 5762, + 5777, + 5804, + 5755, + 5788, + 5786, + 5750, + 5810, + 5776, + 5773, + 5732, + 5762, + 5738, + 5752, + 5778, + 5756, + 5730, + 5743, + 5749, + 5748, + 5784, + 5790, + 5764, + 5792, + 5751, + 5744, + 5743, + 5745, + 5753, + 5766, + 5806, + 5779, + 5770, + 5762, + 5753, + 5761, + 5732, + 5777, + 5782, + 5799, + 5728, + 5829, + 5769, + 5746, + 5751, + 5733, + 5740, + 5806, + 5752, + 5746, + 5765, + 5799, + 5762, + 5727, + 5797, + 5756, + 5785, + 5799, + 5769, + 5751, + 5790, + 5738, + 5780, + 5775, + 5776, + 5785, + 5788, + 5763, + 5769, + 5752, + 5783, + 5743, + 5752, + 5751, + 5795, + 5779, + 5738, + 5778, + 5757, + 5773, + 5767, + 5745, + 5774, + 5783, + 5827, + 5741, + 5751, + 5767, + 5770, + 5737, + 5810, + 5749, + 5817, + 5753, + 5737, + 5759, + 5735, + 5768, + 5740, + 5787, + 5756, + 5783, + 5794, + 5744, + 5833, + 5779, + 5769, + 5783, + 5738, + 5743, + 5789, + 5750, + 5774, + 5822, + 5723, + 5765, + 5774, + 5780, + 5740, + 5751, + 5806, + 5789, + 5806, + 5792, + 5772, + 5760, + 5754, + 5746, + 5767, + 5779, + 5748, + 5737, + 5790, + 5735, + 5747, + 5764, + 5748, + 5784, + 5808, + 5745, + 5747, + 5749, + 5754, + 5796, + 5761, + 5761, + 5802, + 5736, + 5745, + 5758, + 5781, + 5751, + 5772, + 5794, + 5825, + 5787, + 5732, + 5748, + 5778, + 5757, + 5784, + 5784, + 5747, + 5779, + 5755, + 5780, + 5794, + 5768, + 5746, + 5764, + 5769, + 5750, + 5767, + 5802, + 5781, + 5793, + 5786, + 5794, + 5744, + 5768, + 5752, + 5758, + 5753, + 6094, + 5779, + 5743, + 5801, + 5728, + 5748, + 5814, + 5723, + 5777, + 5754, + 5761, + 5777, + 5750, + 5758, + 5780, + 5757, + 5766, + 5749, + 5743, + 5765, + 5764, + 5755, + 5751, + 5788, + 5789, + 5834, + 5760, + 5739, + 5750, + 5776, + 5776, + 5759, + 5757, + 5746, + 5788, + 5744, + 5755, + 5760, + 5764, + 5765, + 5735, + 5809, + 5742, + 5744, + 5804, + 5757, + 5816, + 5801, + 5804, + 5760, + 5760, + 5734, + 5770, + 5728, + 5783, + 5789, + 5792, + 5746, + 5736, + 5791, + 5773, + 5766, + 5762, + 5756, + 5761, + 5806, + 5772, + 5774, + 5726, + 5753, + 5779, + 5765, + 5775, + 5789, + 5753, + 5759, + 5727, + 5759, + 5748, + 5755, + 5768, + 5780, + 5749, + 5749, + 5753, + 5780, + 5761, + 5776, + 5759, + 5750, + 5822, + 5752, + 5757, + 5743, + 5762, + 5793, + 5846, + 5769, + 5744, + 5757, + 5778, + 5783, + 5756, + 5751, + 5792, + 5746, + 5733, + 5805, + 5753, + 5765, + 5798, + 5756, + 5753, + 5757, + 5785, + 5762, + 5770, + 5776, + 5751, + 5752, + 5762, + 5748, + 5776, + 5768, + 5770, + 5756, + 5769, + 5745, + 5739, + 5842, + 5783, + 5766, + 5768, + 5757, + 5735, + 5747, + 5779, + 5764, + 5762, + 5747, + 5743, + 5762, + 5743, + 5745, + 5782, + 5766, + 5752, + 5767, + 5746, + 5761, + 5802, + 5766, + 5792, + 5761, + 5749, + 5739, + 5767, + 5740, + 5804, + 5750, + 5773, + 5749, + 5746, + 5773, + 5822, + 5739, + 5757, + 5754, + 5803, + 5786, + 5761, + 5836, + 5734, + 5741, + 5751, + 5768, + 5755, + 5755, + 5763, + 5772, + 5788, + 5740, + 5771, + 5746, + 5733, + 5737, + 5815, + 5773, + 5786, + 5781, + 5749, + 5736, + 5735, + 5780, + 5759, + 5747, + 5754, + 5755, + 5767, + 5772, + 5798, + 5756, + 5765, + 5769, + 5747, + 5756, + 5776, + 5742, + 5776, + 5745, + 5774, + 5784, + 5807, + 5756, + 5759, + 5780, + 5777, + 5774, + 5730, + 5759, + 5770, + 5759, + 5735, + 5867, + 5763, + 5748, + 5775, + 5809, + 5757, + 5740, + 5768, + 5746, + 5787, + 5762, + 5772, + 5737, + 5801, + 5737, + 5759, + 5776, + 5776, + 5744, + 5779, + 5758, + 5773, + 5756, + 5762, + 5746, + 5746, + 5791, + 5751, + 5753, + 5710, + 5736, + 5802, + 5764, + 5745, + 5764, + 5774, + 5753, + 5797, + 5785, + 5770, + 5762, + 5759, + 5778, + 5757, + 5755, + 5763, + 5786, + 5788, + 5755, + 5764, + 5771, + 5747, + 5735, + 5732, + 5808, + 5738, + 5771, + 5739, + 5751, + 5754, + 5749, + 5766, + 5771, + 5746, + 5792, + 5788, + 5791, + 5741, + 5757, + 5739, + 5749, + 5791, + 5787, + 5785, + 5800, + 5823, + 5754, + 5775, + 5769, + 5737, + 5738, + 5731, + 5793, + 5766, + 5740, + 5728, + 5781, + 5786, + 5765, + 5752, + 5733, + 5732, + 5776, + 5729, + 5733, + 5787, + 5792, + 5738, + 5771, + 5801, + 5797, + 5813, + 5766, + 5776, + 5758, + 5788, + 5756, + 5785, + 5760, + 5774, + 5782, + 5751, + 5742, + 5748, + 5754, + 5730, + 5745, + 5746, + 5747, + 5764, + 5748, + 5784, + 5737, + 5762, + 5777, + 5786, + 5747, + 5789, + 5765, + 5736, + 5789, + 5772, + 5739, + 5782, + 5752, + 5759, + 5762, + 5774, + 5760, + 5749, + 5752, + 5766, + 5758, + 5782, + 5754, + 5735, + 5755, + 5777, + 5764, + 5753, + 5777, + 5743, + 5768, + 5736, + 5749, + 5764, + 5776, + 5820, + 5766, + 5742, + 5770, + 5874, + 5747, + 5815, + 5754, + 5784, + 5773, + 5803, + 5760, + 5845, + 5797, + 5749, + 5769, + 5757, + 5789, + 5751, + 5745, + 5740, + 5762, + 5778, + 5757, + 5739, + 5758, + 5783, + 5776, + 5763, + 5800, + 5735, + 5737, + 5755, + 5757, + 5773, + 5796, + 5765, + 5744, + 5731, + 5731, + 5774, + 5766, + 5821, + 5757, + 5771, + 5776, + 5743, + 5765, + 5729, + 5759, + 5769, + 5749, + 5743, + 5739, + 5783, + 5750, + 5731, + 5756, + 5742, + 5738, + 5791, + 5760, + 5771, + 5766, + 5774, + 5766, + 5797, + 5781, + 5753, + 5761, + 5747, + 5757, + 5759, + 5761, + 5752, + 5750, + 5750, + 5760, + 5771, + 5777, + 5769, + 5771, + 5774, + 5751, + 5771, + 5798, + 5805, + 5801, + 5736, + 5772, + 5759, + 5759, + 5785, + 5784, + 5762, + 5772, + 5759, + 5797, + 5761, + 5756, + 5747, + 5733, + 5781, + 5751, + 5753, + 5749, + 5771, + 5795, + 5745, + 5754, + 5797, + 5755, + 5738, + 5754, + 5774, + 5794, + 5762, + 5801, + 5778, + 5789, + 5740, + 5772, + 5761, + 5769, + 5741, + 5779, + 5756, + 5766, + 5745, + 5755, + 5752, + 5754, + 5736, + 5777, + 5753, + 5750, + 5736, + 5765, + 5794, + 5778, + 5767, + 5792, + 5791, + 5748, + 5802, + 5756, + 5737, + 5761, + 5788, + 5750, + 5761, + 5769, + 5756, + 5766, + 5729, + 5753, + 5732, + 5748, + 5754, + 5759, + 5747, + 5746, + 5770, + 5734, + 5796, + 5753, + 5744, + 5728, + 5796, + 5787, + 5767, + 5759, + 5737, + 5797, + 5806, + 5765, + 5756, + 5762, + 5775, + 5771, + 5791, + 5790, + 5741, + 5776, + 5757, + 5778, + 5759, + 5766, + 5731, + 5764, + 5827, + 5755, + 5843, + 5752, + 5741, + 5772, + 5778, + 5743, + 5772, + 5863, + 5754, + 5745, + 5784, + 5739, + 5777, + 5749, + 5739, + 5746, + 5782, + 5797, + 5776, + 5736, + 5760, + 5784, + 5773, + 5767, + 5740, + 5769, + 5768, + 5800, + 5751, + 5771, + 5779, + 5793, + 5727, + 5772, + 5802, + 5759, + 5780, + 5756, + 5749, + 5771, + 5792, + 5779, + 5784, + 5780, + 5778, + 5756, + 5759, + 5754, + 5744, + 5729, + 5806, + 5738, + 5816, + 5734, + 5773, + 5787, + 5746, + 5790, + 5763, + 5756, + 5762, + 5734, + 5762, + 5761, + 5782, + 5756, + 5777, + 5745, + 5739, + 5770, + 5753, + 5755, + 5783, + 5737, + 5741, + 5775, + 5748, + 5754, + 5776, + 5762, + 5761, + 5749, + 5774, + 5769, + 5784, + 5762, + 5751, + 5764, + 5729, + 5743, + 5788, + 5750, + 5764, + 5791, + 5767, + 5797, + 5790, + 5747, + 5737, + 5757, + 5761, + 5758, + 5749, + 5741, + 5755, + 5741, + 5783, + 5743, + 5746, + 5791, + 5764, + 5792, + 5742, + 5741, + 5787, + 5783, + 5746, + 5782, + 5768, + 5782, + 5739, + 5763, + 5771, + 5770, + 5820, + 5779, + 5788, + 5765, + 5757, + 5742, + 5775, + 5776, + 5761, + 5773, + 5767, + 5750, + 5769, + 5781, + 5754, + 5767, + 5756, + 5757, + 5760, + 5727, + 5795, + 5768, + 5752, + 5774, + 5774, + 5747, + 5767, + 5779, + 5832, + 5764, + 5755, + 5733, + 5739, + 5789, + 5745, + 5783, + 5760, + 5795, + 5792, + 5762, + 5736, + 5771, + 5739, + 5757, + 5783, + 5744, + 5738, + 5804, + 5778, + 5785, + 5763, + 5771, + 5731, + 5767, + 5764, + 5771, + 5760, + 5787, + 5729, + 5800, + 5755, + 5770, + 5786, + 5762, + 5755, + 5777, + 5790, + 5737, + 5797, + 5740, + 5744, + 5787, + 5744, + 5840, + 5772, + 5737, + 5761, + 5771, + 5800, + 5790, + 5772, + 5732, + 5772, + 5776, + 5732, + 5748, + 5750, + 5762, + 5736, + 5738, + 5737, + 5792, + 5756, + 5767, + 5813, + 5749, + 5787, + 5747, + 5780, + 5785, + 5729, + 5772, + 5749, + 5778, + 5776, + 5779, + 5734, + 5734, + 5745, + 5767, + 5769, + 5729, + 5750, + 5801, + 5758, + 5768, + 5764, + 5736, + 5753, + 5764, + 5772, + 5767, + 5742, + 5737, + 5778, + 5763, + 5741, + 5793, + 5748, + 5800, + 5765, + 5788, + 5769, + 5805, + 5812, + 5802, + 5733, + 5759, + 5742, + 5729, + 5739, + 5824, + 5749, + 5780, + 5770, + 5738, + 5749, + 5751, + 5746, + 5785, + 5769, + 5754, + 5743, + 5747, + 5762, + 5789, + 5754, + 5760, + 5760, + 5738, + 5760, + 5762, + 5777, + 5761, + 5796, + 5760, + 5744, + 5768, + 5767, + 5745, + 5822, + 5776, + 5769, + 5756, + 5775, + 5775, + 5773, + 5742, + 5755, + 5746, + 5749, + 5817, + 5785, + 5772, + 5760, + 5771, + 5748, + 5765, + 5784, + 5733, + 5733, + 5758, + 5761, + 5741, + 5807, + 5762, + 5778, + 5784, + 5757, + 5779, + 5788, + 5775, + 5772, + 5794, + 5765, + 5756, + 5771, + 5744, + 5739, + 5773, + 5769, + 5759, + 5746, + 5751, + 5733, + 5788, + 5775, + 5787, + 5796, + 5752, + 5768, + 5750, + 5767, + 5763, + 5760, + 5763, + 5769, + 5733, + 5759, + 5743, + 5780, + 5786, + 5757, + 5743, + 5748, + 5789, + 5779, + 5751, + 5757, + 5753, + 5734, + 5783, + 5769, + 5747, + 5737, + 5766, + 5738, + 5757, + 5739, + 5743, + 5761, + 5790, + 5809, + 5730, + 5769, + 5831, + 5767, + 5779, + 5787, + 5763, + 5772, + 5738, + 5755, + 5768, + 5809, + 5810, + 5796, + 5755, + 5798, + 5777, + 5760, + 5760, + 5774, + 5736, + 5746, + 5740, + 5752, + 5767, + 5764, + 5788, + 5792, + 5749, + 5768, + 5739, + 5764, + 5740, + 5778, + 5762, + 5758, + 5742, + 5785, + 5775, + 5746, + 5772, + 5767, + 5794, + 5782, + 5754, + 5745, + 5769, + 5766, + 5764, + 5840, + 5794, + 5753, + 5762, + 5777, + 5759, + 5767, + 5736, + 5760, + 5759, + 5771, + 5773, + 5796, + 5789, + 5769, + 5799, + 5759, + 5776, + 5743, + 5783, + 5769, + 5741, + 5736, + 5750, + 5782, + 5792, + 5790, + 5759, + 5776, + 5774, + 5774, + 5743, + 5742, + 5789, + 5730, + 5758, + 5729, + 5777, + 5726, + 5753, + 5784, + 5775, + 5749, + 5785, + 5758, + 5766, + 5736, + 5741, + 5800, + 5747, + 5759, + 5740, + 5740, + 5790, + 5769, + 5733, + 5791, + 5770, + 5770, + 5758, + 5787, + 5740, + 5740, + 5730, + 5752, + 5768, + 5773, + 5732, + 5780, + 5739, + 5737, + 5760, + 5761, + 5778, + 5747, + 5810, + 5761, + 5769, + 5785, + 5778, + 5764, + 5771, + 5790, + 5781, + 5787, + 5748, + 5755, + 5780, + 5746, + 5822, + 5769, + 5788, + 5774, + 5803, + 5769, + 5754, + 5747, + 5771, + 5771, + 5784, + 5763, + 5791, + 5789, + 5730, + 5741, + 5782, + 5749, + 5745, + 5754, + 5777, + 5870, + 5740, + 5768, + 5759, + 5766, + 5773, + 5752, + 5765, + 5807, + 5776, + 5776, + 5756, + 5755, + 5742, + 5756, + 5736, + 5873, + 5769, + 5775, + 5775, + 5774, + 5776, + 5793, + 5734, + 5745, + 5781, + 5758, + 5765, + 5750, + 5781, + 5773, + 5772, + 5753, + 5750, + 5782, + 5744, + 5745, + 5768, + 5806, + 5744, + 5780, + 5757, + 5752, + 5835, + 5756, + 5784, + 5788, + 5753, + 5791, + 5754, + 5792, + 5745, + 5754, + 5781, + 5730, + 5763, + 5743, + 5798, + 5749, + 5756, + 5730, + 5768, + 5774, + 5738, + 5789, + 5745, + 5758, + 5782, + 5765, + 5792, + 5731, + 5762, + 5790, + 5771, + 5766, + 5767, + 5758, + 5734, + 5799, + 5768, + 5833, + 5734, + 5764, + 5775, + 5761, + 5748, + 5782, + 5754, + 5745, + 5744, + 5726, + 5813, + 5736, + 5761, + 5805, + 5768, + 5748, + 5753, + 5781, + 5810, + 5801, + 5753, + 5736, + 5742, + 5783, + 5748, + 5742, + 5759, + 5749, + 5742, + 5747, + 5755, + 5740, + 5777, + 5732, + 5748, + 5743, + 5753, + 5766, + 5800, + 5775, + 5765, + 5733, + 5771, + 5790, + 5760, + 5766, + 5749, + 5784, + 5784, + 5764, + 5761, + 5745, + 5834, + 5817, + 5754, + 5766, + 5767, + 5780, + 5842, + 5750, + 5773, + 5759, + 5753, + 5766, + 5773, + 5750, + 5785, + 5783, + 5754, + 5753, + 5759, + 5764, + 5746, + 5786, + 5745, + 5749, + 5773, + 5761, + 5743, + 5762, + 5781, + 5742, + 5759, + 5785, + 5759, + 5754, + 5774, + 5749, + 5745, + 5868, + 5764, + 5751, + 5735, + 5739, + 5783, + 5755, + 5770, + 5754, + 5748, + 5746, + 5746, + 5774, + 5758, + 5770, + 5772, + 5762, + 5744, + 5754, + 5771, + 5785, + 5756, + 5765, + 5777, + 5765, + 5780, + 5753, + 5744, + 5764, + 5780, + 5755, + 5739, + 5774, + 5803, + 5747, + 5792, + 5770, + 5748, + 5748, + 5733, + 5774, + 5752, + 5761, + 5774, + 5774, + 5755, + 5776, + 5790, + 5756, + 5754, + 5772, + 5807, + 5751, + 5756, + 5773, + 5733, + 5783, + 5750, + 5771, + 5759, + 5751, + 5752, + 5737, + 5765, + 5764, + 5737, + 5746, + 5787, + 5800, + 5768, + 5749, + 5756, + 5761, + 5780, + 5792, + 5811, + 5766, + 5753, + 5783, + 5744, + 5774, + 5755, + 5759, + 5785, + 5783, + 5787, + 5780, + 5777, + 5730, + 5770, + 5760, + 5794, + 5784, + 5821, + 5776, + 5745, + 5754, + 5788, + 5819, + 5758, + 5755, + 5796, + 5752, + 5737, + 5790, + 5756, + 5774, + 5766, + 5772, + 5773, + 5787, + 5784, + 5757, + 5785, + 5747, + 5746, + 5760, + 5737, + 5754, + 5741, + 5773, + 5765, + 5787, + 5749, + 5773, + 5761, + 5747, + 5780, + 5793, + 5758, + 5758, + 5738, + 5750, + 5763, + 5755, + 5754, + 5746, + 5742, + 5779, + 5748, + 5764, + 5817, + 5819, + 5785, + 5759, + 5738, + 5769, + 5746, + 5736, + 5768, + 5754, + 5736, + 5759, + 5741, + 5764, + 5749, + 5750, + 5787, + 5746, + 5778, + 5736, + 5759, + 5776, + 5753, + 5796, + 5765, + 5791, + 5794, + 5756, + 5775, + 5786, + 5753, + 5762, + 5741, + 5766, + 5768, + 5745, + 5753, + 5731, + 5757, + 5789, + 5769, + 5771, + 5784, + 5733, + 5763, + 5775, + 5759, + 5742, + 5750, + 5770, + 5734, + 5786, + 5779, + 5752, + 5762, + 5735, + 5774, + 5811, + 5794, + 5753, + 5758, + 5733, + 5767, + 5761, + 5789, + 5734, + 5751, + 5733, + 5763, + 5819, + 5770, + 5778, + 5746, + 5753, + 5781, + 5771, + 5736, + 5767, + 5732, + 5789, + 5750, + 5824, + 5771, + 5756, + 5756, + 5744, + 5814, + 5776, + 5771, + 5778, + 5799, + 5770, + 5789, + 5787, + 5818, + 5794, + 5747, + 5789, + 5753, + 5792, + 5759, + 5769, + 5744, + 5736, + 5768, + 5755, + 5769, + 5731, + 5740, + 5755, + 5774, + 5734, + 5773, + 5740, + 5803, + 5761, + 5762, + 5762, + 5803, + 5794, + 5747, + 5754, + 5784, + 5783, + 5754, + 5754, + 5762, + 5762, + 5758, + 5769, + 5752, + 5766, + 5883, + 5734, + 5750, + 5783, + 5746, + 5768, + 5734, + 5730, + 5743, + 5772, + 5749, + 5754, + 5761, + 5740, + 5753, + 5766, + 5744, + 5786, + 5780, + 5748, + 5764, + 5763, + 5758, + 5774, + 5747, + 5740, + 5796, + 5749, + 5776, + 5762, + 5761, + 5786, + 5767, + 5813, + 5752, + 5755, + 5768, + 5789, + 5808, + 5734, + 5764, + 5739, + 5753, + 5755, + 5745, + 5768, + 5748, + 5786, + 5738, + 5789, + 5770, + 5836, + 5758, + 5822, + 5803, + 5761, + 5761, + 5772, + 5790, + 5742, + 5731, + 5777, + 5767, + 5780, + 5774, + 5749, + 5763, + 5728, + 5747, + 5798, + 5743, + 5751, + 5761, + 5763, + 5757, + 5789, + 5761, + 5759, + 5785, + 5768, + 5784, + 5764, + 5749, + 5788, + 5758, + 5764, + 5740, + 5756, + 5773, + 5745, + 5787, + 5729, + 5756, + 5782, + 5767, + 5779, + 5787, + 5732, + 5748, + 5732, + 5760, + 5737, + 5782, + 5752, + 5771, + 5730, + 5768, + 5780, + 5762, + 5758, + 5751, + 5805, + 5736, + 5744, + 5776, + 5772, + 5736, + 5751, + 5825, + 5790, + 5785, + 5756, + 5754, + 5772, + 5777, + 5758, + 5768, + 5783, + 5761, + 5790, + 5755, + 5769, + 5829, + 5769, + 5751, + 5810, + 5766, + 5760, + 5762, + 5742, + 5794, + 5754, + 5787, + 5769, + 5765, + 5778, + 5808, + 5814, + 5776, + 5745, + 5810, + 5758, + 5795, + 5757, + 5788, + 5760, + 5730, + 5754, + 5818, + 5754, + 5782, + 5765, + 5770, + 5756, + 5744, + 5751, + 5743, + 5771, + 5781, + 5748, + 5770, + 5798, + 5764, + 5747, + 5759, + 5781, + 5770, + 5773, + 5768, + 5787, + 5767, + 5786, + 5790, + 5804, + 5780, + 5739, + 5761, + 5743, + 5757, + 5762, + 5746, + 5779, + 5762, + 5744, + 5784, + 5750, + 5774, + 5854, + 5802, + 5735, + 5781, + 5779, + 5770, + 5744, + 5775, + 5737, + 5757, + 5759, + 5733, + 5736, + 5752, + 5744, + 5745, + 5756, + 5737, + 5783, + 5744, + 5757, + 5752, + 5767, + 5786, + 5796, + 5761, + 5751, + 5765, + 5739, + 5775, + 5745, + 5784, + 5735, + 5782, + 5800, + 5756, + 5748, + 5803, + 5788, + 5733, + 5724, + 5746, + 5775, + 5716, + 5761, + 5811, + 5756, + 5830, + 5770, + 5774, + 5744, + 5765, + 5736, + 5756, + 5772, + 5780, + 5787, + 5741, + 5774, + 5790, + 5800, + 5748, + 5761, + 5765, + 5746, + 5773, + 5758, + 5781, + 5758, + 5755, + 5773, + 5829, + 5763, + 5773, + 5807, + 5759, + 5762, + 5739, + 5748, + 5777, + 5749, + 5768, + 5759, + 5747, + 5753, + 5728, + 5797, + 5766, + 5767, + 5763, + 5795, + 5772, + 5773, + 5777, + 5778, + 5758, + 5775, + 5760, + 5761, + 5795, + 5779, + 5775, + 5795, + 5768, + 5718, + 5759, + 5808, + 5812, + 5814, + 5744, + 5754, + 5773, + 5766, + 5752, + 5782, + 5747, + 5783, + 5796, + 5774, + 5862, + 5777, + 5761, + 5734, + 5761, + 5746, + 5757, + 5762, + 5769, + 5775, + 5762, + 5778, + 5744, + 5793, + 5783, + 5770, + 5761, + 5762, + 5744, + 5762, + 5768, + 5761, + 5784, + 5782, + 5767, + 5857, + 5775, + 5763, + 5760, + 5797, + 5764, + 5819, + 5781, + 5766, + 5781, + 5762, + 5776, + 5767, + 5742, + 5770, + 5828, + 5786, + 5766, + 5759, + 5743, + 5748, + 5771, + 5768, + 5761, + 5805, + 5759, + 5760, + 5801, + 5784, + 5774, + 5755, + 5765, + 5738, + 5767, + 5790, + 5753, + 5813, + 5760, + 5753, + 5762, + 5782, + 5764, + 5775, + 5774, + 5769, + 5728, + 5767, + 5756, + 5772, + 5797, + 5752, + 5764, + 5754, + 5783, + 5772, + 5755, + 5761, + 5775, + 5789, + 5737, + 5783, + 5749, + 5742, + 5768, + 5756, + 5776, + 5795, + 5771, + 5746, + 5780, + 5752, + 5773, + 5779, + 5779, + 5771, + 5764, + 5791, + 5762, + 5769, + 5739, + 5741, + 5761, + 5801, + 5753, + 5764, + 5774, + 5740, + 5743, + 5761, + 5754, + 5799, + 5749, + 5762, + 5786, + 5801, + 5741, + 5810, + 5811, + 5786, + 5745, + 5787, + 5772, + 5785, + 5760, + 5754, + 5824, + 5756, + 5770, + 5742, + 5799, + 5773, + 5764, + 5791, + 5787, + 5827, + 5833, + 5758, + 5774, + 5781, + 5766, + 5782, + 5762, + 5749, + 5772, + 5789, + 5799, + 5786, + 5817, + 5767, + 5803, + 5787, + 5741, + 5766, + 5767, + 5775, + 5732, + 5778, + 5768, + 5793, + 5747, + 5731, + 5775, + 5765, + 5763, + 5794, + 5782, + 5773, + 5766, + 5777, + 5741, + 5751, + 5768, + 5791, + 5787, + 5787, + 5776, + 5765, + 5745, + 5748, + 5771, + 5758, + 5757, + 5779, + 5731, + 5777, + 5740, + 5764, + 5753, + 5750, + 5754, + 5759, + 5741, + 5791, + 5754, + 5814, + 5753, + 5768, + 5756, + 5772, + 5750, + 5771, + 5742, + 5762, + 5772, + 5736, + 5775, + 5756, + 5739, + 5757, + 5771, + 5775, + 5770, + 5730, + 5751, + 5743, + 5772, + 5783, + 5736, + 5780, + 5758, + 5766, + 5747, + 5765, + 5785, + 5757, + 5751, + 5739, + 5822, + 5767, + 5767, + 5765, + 5774, + 5755, + 5765, + 5730, + 5780, + 5738, + 5724, + 5726, + 5748, + 5799, + 6258, + 5747, + 5794, + 5731, + 5773, + 5784, + 5745, + 5748, + 5818, + 5750, + 5763, + 5817, + 5789, + 5746, + 5718, + 5740, + 5745, + 5763, + 5749, + 5757, + 5722, + 5735, + 5737, + 5783, + 5767, + 5741, + 5764, + 5758, + 5764, + 5772, + 5797, + 5744, + 5753, + 5771, + 5781, + 5762, + 5760, + 5737, + 5732, + 5772, + 5720, + 5782, + 5738, + 5760, + 5770, + 5742, + 5769, + 5797, + 5749, + 5749, + 5798, + 5743, + 5782, + 5780, + 5777, + 5783, + 5775, + 5780, + 5753, + 5763, + 5761, + 5738, + 5760, + 5783, + 5764, + 5777, + 5770, + 5785, + 5770, + 5760, + 5801, + 5758, + 5778, + 5775, + 5773, + 5760, + 5767, + 5734, + 5789, + 5736, + 5782, + 5789, + 5781, + 5746, + 5776, + 5779, + 5733, + 5758, + 5767, + 5763, + 5746, + 5771, + 5758, + 5760, + 5757, + 5763, + 5748, + 5800, + 5800, + 5739, + 5751, + 5850, + 5768, + 5833, + 5739, + 5714, + 5798, + 5739, + 5798, + 5752, + 5777, + 5783, + 5763, + 5764, + 5758, + 5790, + 5764, + 5754, + 5743, + 5790, + 5757, + 5795, + 5740, + 5740, + 5758, + 5808, + 5782, + 5785, + 5784, + 5732, + 5742, + 5747, + 5817, + 5770, + 5832, + 5777, + 5745, + 5762, + 5738, + 5734, + 5771, + 5769, + 5773, + 5795, + 5765, + 5773, + 5759, + 5733, + 5774, + 5781, + 5770, + 5782, + 5730, + 5746, + 5751, + 5740, + 5793, + 5816, + 5748, + 5841, + 5762, + 5771, + 5763, + 5757, + 5806, + 5784, + 5759, + 5753, + 5779, + 5770, + 5852, + 5783, + 5786, + 5737, + 5773, + 5788, + 5734, + 5768, + 5769, + 5726, + 5748, + 5806, + 5763, + 5760, + 5769, + 5781, + 5756, + 5791, + 5802, + 5784, + 5775, + 5741, + 5769, + 5795, + 5780, + 5758, + 5773, + 5775, + 5782, + 5743, + 5771, + 5770, + 5751, + 5762, + 5785, + 5785, + 5732, + 5738, + 5765, + 5765, + 5760, + 5781, + 5820, + 5763, + 5778, + 5780, + 5763, + 5736, + 5776, + 5774, + 5811, + 5741, + 5760, + 5733, + 5766, + 5753, + 5782, + 5737, + 5795, + 5778, + 5787, + 5738, + 5770, + 5752, + 5740, + 5753, + 5776, + 5738, + 5737, + 5745, + 5749, + 5748, + 5782, + 5811, + 5736, + 5775, + 5746, + 5768, + 5731, + 5753, + 5778, + 5758, + 5770, + 5754, + 5744, + 5781, + 5770, + 5784, + 5758, + 5800, + 5744, + 5777, + 5737, + 5749, + 5756, + 5751, + 5760, + 5730, + 5752, + 5791, + 5769, + 5768, + 5769, + 5782, + 5787, + 5758, + 5761, + 5785, + 5770, + 5743, + 5752, + 5773, + 5764, + 5754, + 5748, + 5736, + 5775, + 5752, + 5773, + 5760, + 5746, + 5774, + 5743, + 5803, + 5798, + 5783, + 5770, + 5787, + 5794, + 5761, + 5764, + 5773, + 5793, + 5777, + 5762, + 5773, + 5758, + 5813, + 5789, + 5731, + 5784, + 5757, + 5750, + 5756, + 5745, + 5763, + 5759, + 5767, + 5797, + 5789, + 5776, + 5741, + 5749, + 5774, + 5785, + 5756, + 5752, + 5776, + 5753, + 5782, + 5776, + 5799, + 5772, + 5749, + 5744, + 5761, + 5757, + 5762, + 5783, + 5737, + 5746, + 5749, + 5765, + 5763, + 5773, + 5747, + 5764, + 5773, + 5769, + 5793, + 5762, + 5748, + 5773, + 5766, + 5787, + 5754, + 5750, + 5768, + 5796, + 5769, + 5780, + 5753, + 5759, + 5787, + 5741, + 5790, + 5731, + 5761, + 5789, + 5760, + 5758, + 5802, + 5742, + 5779, + 5765, + 5748, + 5749, + 5729, + 5762, + 5779, + 5757, + 5777, + 5782, + 5736, + 5751, + 5762, + 5807, + 5737, + 5748, + 5771, + 5828, + 5768, + 5760, + 5737, + 5788, + 5821, + 5795, + 5798, + 5768, + 6015, + 5757, + 5736, + 5760, + 5779, + 5727, + 5751, + 5759, + 5753, + 5725, + 5793, + 5755, + 5752, + 5728, + 5787, + 5738, + 5746, + 5784, + 5742, + 5777, + 5772, + 5792, + 5750, + 5753, + 5779, + 5738, + 5787, + 5742, + 5765, + 5769, + 5743, + 5743, + 5737, + 5760, + 5772, + 5747, + 5758, + 5776, + 5784, + 5768, + 5747, + 5776, + 5770, + 5929, + 5791, + 5745, + 5765, + 5788, + 5735, + 5772, + 5766, + 5763, + 5800, + 5789, + 5754, + 5763, + 5743, + 5778, + 5805, + 5755, + 5776, + 5819, + 5799, + 5737, + 5795, + 5754, + 5735, + 5747, + 5764, + 5785, + 5762, + 5748, + 5762, + 5807, + 5777, + 5777, + 5794, + 5737, + 5762, + 5749, + 5754, + 5742, + 5739, + 5779, + 5769, + 5763, + 5796, + 5740, + 5774, + 5775, + 5792, + 5781, + 5757, + 5788, + 5759, + 5789, + 5742, + 5767, + 5784, + 5782, + 5772, + 5739, + 5749, + 5756, + 5737, + 5732, + 5745, + 5750, + 5770, + 5797, + 5763, + 5761, + 5798, + 5733, + 5745, + 5795, + 5807, + 5770, + 5728, + 5736, + 5779, + 5742, + 5743, + 5758, + 5745, + 5761, + 5734, + 5759, + 5747, + 5742, + 5740, + 5724, + 5724, + 5739, + 5748, + 5764, + 5761, + 5778, + 5800, + 5807, + 5763, + 5744, + 5742, + 5760, + 5737, + 5750, + 5771, + 5763, + 5765, + 5765, + 5748, + 5759, + 5743, + 5763, + 5789, + 5728, + 5737, + 5793, + 5776, + 5770, + 5749, + 5777, + 5800, + 5781, + 5787, + 5742, + 5823, + 5758, + 5767, + 5756, + 5763, + 5774, + 5796, + 5754, + 5790, + 5776, + 5791, + 5800, + 5854, + 5755, + 5779, + 5796, + 5794, + 5761, + 5746, + 5786, + 5749, + 5754, + 5749, + 5776, + 5768, + 5811, + 5789, + 5784, + 5749, + 5779, + 5793, + 5781, + 5745, + 5770, + 5761, + 5746, + 5753, + 5791, + 5767, + 5766, + 5758, + 5756, + 5779, + 5750, + 5750, + 5804, + 5751, + 5764, + 5757, + 5767, + 5790, + 5772, + 5786, + 5768, + 5761, + 5751, + 5742, + 5782, + 5764, + 5794, + 5754, + 5731, + 5731, + 5767, + 5746, + 5735, + 5745, + 5737, + 5735, + 5803, + 5746, + 5764, + 5802, + 5778, + 5754, + 5750, + 5795, + 5761, + 5759, + 5740, + 5764, + 5776, + 5757, + 5773, + 5756, + 5730, + 5756, + 5735, + 5723, + 5771, + 5772, + 5740, + 5764, + 5764, + 5756, + 5766, + 5764, + 5733, + 5760, + 5762, + 5810, + 5768, + 5802, + 5795, + 5746, + 5745, + 5749, + 5736, + 5743, + 5741, + 5756, + 5792, + 5789, + 5764, + 5763, + 5777, + 5741, + 5776, + 5760, + 5773, + 5795, + 5767, + 5757, + 5755, + 5741, + 5734, + 5736, + 5728, + 5742, + 5766, + 5731, + 5757, + 5734, + 5771, + 5732, + 5765, + 5745, + 5739, + 5766, + 5728, + 5763, + 5755, + 5786, + 5781, + 5782, + 5782, + 5764, + 5734, + 5783, + 5761, + 5828, + 5756, + 5799, + 5744, + 5743, + 5764, + 5764, + 5783, + 5750, + 5769, + 5760, + 5757, + 5760, + 5754, + 5781, + 5744, + 5776, + 5770, + 5743, + 5835, + 5753, + 5735, + 5743, + 5788, + 5757, + 5744, + 5746, + 5758, + 5752, + 5811, + 5789, + 5730, + 5751, + 5771, + 5760, + 5758, + 5778, + 5761, + 5736, + 5759, + 5739, + 5770, + 5746, + 5754, + 5753, + 5746, + 5761, + 5776, + 5799, + 5752, + 5766, + 5752, + 5752, + 5773, + 5759, + 5748, + 5764, + 5773, + 5745, + 5732, + 5754, + 5753, + 5754, + 5739, + 5780, + 5742, + 5761, + 5760, + 5780, + 5785, + 5801, + 5747, + 5789, + 5790, + 5766, + 5736, + 5869, + 5788, + 5734, + 5745, + 5736, + 5773, + 5773, + 5778, + 5732, + 5752, + 5748, + 5763, + 5774, + 5737, + 5783, + 5749, + 5759, + 5783, + 5755, + 5754, + 5769, + 5750, + 5769, + 5773, + 5751, + 5743, + 5789, + 5759, + 5763, + 5752, + 5777, + 5804, + 5761, + 5742, + 5743, + 5778, + 5731, + 5763, + 5797, + 5766, + 5730, + 5741, + 5885, + 5761, + 5742, + 5780, + 5771, + 5775, + 5809, + 5748, + 5741, + 5732, + 5759, + 5737, + 5813, + 5780, + 5747, + 5753, + 5742, + 5784, + 5775, + 5754, + 5765, + 5737, + 5758, + 5793, + 5810, + 5787, + 5808, + 5745, + 5760, + 5742, + 5763, + 5727, + 5760, + 5754, + 5749, + 5748, + 5748, + 5752, + 5809, + 5759, + 5747, + 5770, + 5771, + 5764, + 5746, + 5754, + 5755, + 5747, + 5756, + 6788, + 5763, + 5787, + 5738, + 5754, + 5759, + 5817, + 5823, + 5762, + 5761, + 5787, + 5776, + 5776, + 5801, + 5778, + 5783, + 5762, + 5755, + 5789, + 5800, + 5757, + 5749, + 5773, + 5745, + 5774, + 5784, + 5830, + 5736, + 5753, + 5763, + 5738, + 5758, + 5741, + 5780, + 5745, + 5734, + 5781, + 5797, + 5744, + 5774, + 5795, + 5746, + 5765, + 5765, + 5765, + 5762, + 5746, + 5753, + 5762, + 5799, + 5742, + 5779, + 5760, + 5750, + 5796, + 5795, + 5734, + 5755, + 5805, + 5765, + 5789, + 5770, + 5752, + 5775, + 5751, + 5779, + 5791, + 5767, + 5871, + 5773, + 5757, + 5811, + 5734, + 5743, + 5739, + 5766, + 5801, + 5762, + 5763, + 5763, + 5745, + 5758, + 5785, + 5770, + 5763, + 5747, + 5752, + 5764, + 5764, + 5762, + 5786, + 5784, + 5808, + 5766, + 5809, + 5833, + 5794, + 5805, + 5771, + 5749, + 5781, + 5747, + 5815, + 5794, + 5771, + 5738, + 5753, + 5773, + 5740, + 5787, + 5754, + 5772, + 5736, + 5789, + 5766, + 5796, + 5726, + 5744, + 5760, + 5767, + 5757, + 5787, + 5742, + 5762, + 5771, + 5784, + 5743, + 5754, + 5734, + 5730, + 5763, + 5771, + 5737, + 5756, + 5734, + 5750, + 5742, + 5761, + 5775, + 5734, + 5760, + 5748, + 5747, + 5738, + 5785, + 5745, + 5763, + 5776, + 5774, + 5785, + 5730, + 5748, + 5731, + 5774, + 5761, + 5760, + 5743, + 5770, + 5762, + 5788, + 5742, + 5743, + 5767, + 5770, + 5792, + 5809, + 5807, + 5784, + 5771, + 5810, + 5757, + 5750, + 5796, + 5771, + 5771, + 5749, + 5760, + 5748, + 5745, + 5761, + 5743, + 5766, + 5769, + 5729, + 5806, + 5749, + 5766, + 5787, + 5788, + 5737, + 5757, + 5744, + 5755, + 5780, + 5729, + 5777, + 5788, + 5787, + 5785, + 5758, + 5780, + 5764, + 5776, + 5761, + 5736, + 5758, + 5750, + 5735, + 5754, + 5753, + 5741, + 5826, + 5732, + 5766, + 5764, + 5791, + 5770, + 5786, + 5769, + 5761, + 5779, + 5740, + 5747, + 5760, + 5807, + 5732, + 5791, + 5747, + 5758, + 5745, + 5753, + 5761, + 5789, + 5774, + 5769, + 5786, + 5768, + 5768, + 5749, + 5796, + 5775, + 5770, + 5749, + 5775, + 5795, + 5746, + 5760, + 5785, + 5786, + 5754, + 5738, + 5766, + 5774, + 5742, + 5772, + 5740, + 5803, + 5739, + 5736, + 5739, + 5726, + 5716, + 5761, + 5836, + 5796, + 5754, + 5740, + 5752, + 5737, + 5817, + 5779, + 5758, + 5738, + 5766, + 5769, + 5766, + 5744, + 5766, + 5748, + 5778, + 5738, + 5778, + 5840, + 5802, + 5737, + 5774, + 5735, + 5770, + 5739, + 5772, + 6070, + 5757, + 5767, + 5740, + 5755, + 5921, + 5764, + 5731, + 5736, + 5774, + 5743, + 5727, + 5799, + 5735, + 5854, + 5755, + 5765, + 5790, + 5751, + 5805, + 5747, + 5773, + 5753, + 5804, + 5742, + 5767, + 5783, + 5771, + 5765, + 5782, + 5767, + 5770, + 5759, + 5783, + 5741, + 5748, + 5754, + 5734, + 5754, + 5767, + 5785, + 5769, + 5735, + 5756, + 5780, + 5770, + 5787, + 5757, + 5724, + 5777, + 5768, + 5758, + 5777, + 5789, + 5739, + 5755, + 5759, + 5773, + 5793, + 5766, + 5740, + 5722, + 5753, + 5745, + 5756, + 5800, + 5758, + 5765, + 5785, + 5753, + 5758, + 5773, + 5798, + 5760, + 5787, + 5776, + 5770, + 5790, + 5753, + 5763, + 5799, + 5786, + 5760, + 5789, + 5776, + 5766, + 5781, + 5753, + 5740, + 5762, + 5782, + 5735, + 5739, + 5753, + 5784, + 5755, + 5738, + 5734, + 5756, + 5776, + 5745, + 5772, + 5765, + 5760, + 5783, + 5799, + 5739, + 5747, + 5762, + 5763, + 5806, + 5759, + 5797, + 5770, + 5739, + 5765, + 5730, + 5764, + 5761, + 5782, + 5773, + 5761, + 5758, + 5767, + 5780, + 5768, + 5763, + 5761, + 5760, + 5750, + 5777, + 5767, + 5746, + 5793, + 5746, + 5778, + 5774, + 5744, + 5767, + 5780, + 5789, + 5776, + 5782, + 5761, + 5729, + 5746, + 5744, + 5770, + 5778, + 5744, + 5778, + 5786, + 5761, + 5786, + 5778, + 5768, + 5809, + 5743, + 5734, + 5762, + 5768, + 5744, + 5785, + 5749, + 5765, + 5755, + 5759, + 5764, + 5735, + 5795, + 5781, + 5781, + 5772, + 5774, + 5794, + 5755, + 5741, + 5816, + 5787, + 5830, + 5754, + 5763, + 5796, + 5786, + 5756, + 5760, + 5731, + 5779, + 5765, + 5744, + 5806, + 5783, + 5764, + 5765, + 5753, + 5773, + 5784, + 5813, + 5725, + 5756, + 5748, + 5776, + 5775, + 5769, + 5794, + 5724, + 5805, + 5755, + 5792, + 5790, + 5738, + 5771, + 5744, + 5784, + 5767, + 5776, + 5739, + 5744, + 5775, + 5766, + 5768, + 5818, + 5739, + 5746, + 5769, + 5764, + 5771, + 5779, + 5767, + 5751, + 5785, + 5788, + 5789, + 5786, + 5762, + 5795, + 5758, + 5793, + 5753, + 5875, + 5732, + 5737, + 5778, + 5771, + 5742, + 5743, + 5776, + 5754, + 5754, + 5754, + 5787, + 5827, + 5779, + 5728, + 5804, + 5770, + 5780, + 5764, + 5749, + 5770, + 5738, + 5810, + 5751, + 5737, + 5742, + 5772, + 5738, + 5764, + 5776, + 5763, + 5772, + 5773, + 5746, + 5739, + 5758, + 5802, + 5753, + 5754, + 5747, + 5740, + 5766, + 5764, + 5772, + 5741, + 5749, + 5735, + 5745, + 5755, + 5743, + 5765, + 5794, + 5736, + 5758, + 5777, + 5785, + 5756, + 5744, + 5759, + 5739, + 5747, + 5770, + 5784, + 5736, + 5761, + 5767, + 5795, + 5754, + 5736, + 5762, + 5754, + 5751, + 5764, + 5754, + 5754, + 5756, + 5753, + 5803, + 5811, + 5739, + 5736, + 5747, + 5743, + 5805, + 5773, + 5821, + 5769, + 5757, + 5766, + 5797, + 5771, + 5730, + 5765, + 5772, + 5757, + 5744, + 5785, + 5828, + 5751, + 5781, + 5742, + 5773, + 5754, + 5754, + 5772, + 5779, + 5780, + 5740, + 5759, + 5772, + 5750, + 5737, + 5799, + 5789, + 5774, + 5741, + 5740, + 5780, + 5739, + 5764, + 5792, + 5779, + 5750, + 5764, + 5755, + 5764, + 5800, + 5778, + 5769, + 5738, + 5732, + 5758, + 5741, + 5768, + 5745, + 5754, + 5773, + 5809, + 5742, + 5762, + 5784, + 5766, + 5777, + 5750, + 5780, + 5723, + 5750, + 5781, + 5780, + 5734, + 5741, + 5784, + 5766, + 5745, + 5792, + 5766, + 5755, + 5761, + 5754, + 5757, + 5758, + 5771, + 5737, + 5756, + 5772, + 5754, + 5748, + 5762, + 5797, + 5741, + 5754, + 5782, + 5798, + 5753, + 5774, + 5739, + 5738, + 5749, + 5797, + 5735, + 5793, + 5770, + 5764, + 5792, + 5735, + 5726, + 5772, + 5736, + 5780, + 5767, + 5763, + 5784, + 5760, + 5754, + 5801, + 5736, + 5732, + 5762, + 5800, + 5760, + 5780, + 5782, + 5806, + 5780, + 5769, + 5776, + 5776, + 5777, + 5788, + 5765, + 5750, + 5738, + 5748, + 5817, + 5761, + 5740, + 5777, + 5747, + 5743, + 5778, + 5765, + 5739, + 5769, + 5756, + 5785, + 5794, + 5776, + 5771, + 5771, + 5766, + 5771, + 5764, + 5785, + 5760, + 5812, + 5781, + 5778, + 5795, + 5751, + 5735, + 5875, + 5769, + 5754, + 5774, + 5757, + 5721, + 5745, + 5766, + 5746, + 5789, + 5776, + 5746, + 5775, + 5765, + 5771, + 5746, + 5726, + 5750, + 5774, + 5744, + 5757, + 5747, + 5756, + 5747, + 5744, + 5778, + 5752, + 5754, + 5761, + 5754, + 5739, + 5790, + 5773, + 5729, + 5765, + 5776, + 5766, + 5747, + 5771, + 5781, + 5755, + 5747, + 5753, + 5734, + 5753, + 5808, + 5767, + 5764, + 5737, + 5764, + 5785, + 5746, + 5739, + 5741, + 5753, + 5748, + 5731, + 5764, + 5742, + 5750, + 5756, + 5783, + 5738, + 5791, + 5758, + 5757, + 5764, + 5747, + 5746, + 5787, + 5742, + 5791, + 5748, + 5770, + 5758, + 5776, + 5746, + 5747, + 5816, + 5759, + 5737, + 5759, + 5751, + 5778, + 5732, + 5754, + 5729, + 5767, + 5769, + 5742, + 5804, + 5762, + 5752, + 5776, + 5771, + 5737, + 5765, + 5772, + 5754, + 5764, + 5755, + 5814, + 5766, + 5795, + 5753, + 5773, + 5803, + 5748, + 5795, + 5789, + 5761, + 5757, + 5760, + 5731, + 5759, + 5823, + 5771, + 5742, + 5746, + 5743, + 5788, + 5844, + 5762, + 5754, + 5745, + 5761, + 5774, + 5781, + 5797, + 5778, + 5769, + 5785, + 5895, + 5755, + 5752, + 5777, + 5731, + 5761, + 5785, + 5766, + 5758, + 5777, + 5770, + 5741, + 5772, + 5729, + 5752, + 5772, + 5774, + 5776, + 5835, + 5737, + 5745, + 5766, + 5793, + 5771, + 5795, + 5798, + 5760, + 5753, + 5793, + 5774, + 5783, + 5803, + 5771, + 5805, + 5757, + 5792, + 5751, + 5774, + 5782, + 5760, + 5766, + 5772, + 5761, + 5771, + 5744, + 5767, + 5733, + 5764, + 5800, + 5776, + 5775, + 5800, + 5791, + 5778, + 5746, + 5740, + 5771, + 5775, + 5815, + 5749, + 5756, + 5734, + 5755, + 5743, + 5793, + 5763, + 5777, + 5747, + 5734, + 5821, + 5754, + 5762, + 5746, + 5765, + 5769, + 5775, + 5751, + 5773, + 5754, + 5762, + 5765, + 5806, + 5773, + 5746, + 5776, + 5759, + 5784, + 5782, + 5772, + 5765, + 5805, + 5761, + 5741, + 5768, + 5740, + 5741, + 5771, + 5750, + 5753, + 5748, + 5752, + 5770, + 5761, + 5760, + 5758, + 5802, + 5746, + 5733, + 5766, + 5739, + 5761, + 5775, + 5751, + 5763, + 5784, + 5770, + 5744, + 5780, + 5766, + 5803, + 5783, + 5804, + 5743, + 5771, + 5770, + 5748, + 5755, + 5744, + 5760, + 5773, + 5787, + 5845, + 5758, + 5774, + 5732, + 5775, + 5763, + 5733, + 5778, + 5742, + 5728, + 5732, + 5759, + 5763, + 5769, + 5763, + 5753, + 5762, + 5735, + 5758, + 5762, + 5805, + 5758, + 5784, + 5778, + 5755, + 5769, + 5771, + 5773, + 5770, + 5778, + 5761, + 5818, + 5772, + 5742, + 5767, + 5792, + 5776, + 5795, + 5788, + 5763, + 5755, + 5761, + 5760, + 5783, + 5806, + 5754, + 5744, + 5761, + 5764, + 5838, + 5782, + 5761, + 5778, + 5738, + 5793, + 5757, + 5745, + 5745, + 5765, + 5716, + 5738, + 5749, + 5792, + 5778, + 5778, + 5796, + 5761, + 5793, + 5753, + 5760, + 5783, + 5769, + 5759, + 5761, + 5773, + 5725, + 5737, + 5761, + 5731, + 5748, + 5725, + 5772, + 5758, + 5757, + 5790, + 5794, + 5747, + 5758, + 5818, + 5761, + 5775, + 5828, + 5770, + 5778, + 5791, + 5772, + 5767, + 5738, + 5766, + 5785, + 5778, + 5759, + 5764, + 5780, + 5748, + 5766, + 5769, + 5738, + 5789, + 5760, + 5756, + 5772, + 5781, + 5766, + 5782, + 5787, + 5781, + 5737, + 5783, + 5756, + 5776, + 5762, + 5810, + 5785, + 5773, + 5786, + 5780, + 5773, + 5761, + 5794, + 5736, + 5739, + 5783, + 5758, + 5748, + 5783, + 5773, + 5752, + 5750, + 5752, + 5750, + 5736, + 5752, + 5790, + 5763, + 5770, + 5753, + 5767, + 5791, + 5795, + 5762, + 5809, + 5786, + 5761, + 5742, + 5839, + 5779, + 5782, + 5804, + 5757, + 5761, + 5804, + 5738, + 5776, + 5762, + 5762, + 5771, + 5806, + 5763, + 5764, + 5786, + 5796, + 5832, + 5763, + 5746, + 5766, + 5755, + 5772, + 5758, + 5807, + 5750, + 5772, + 5762, + 5765, + 5754, + 5786, + 5771, + 5790, + 5777, + 5757, + 5776, + 5766, + 5794, + 5756, + 5781, + 5832, + 5736, + 5752, + 5732, + 5770, + 5772, + 5791, + 5778, + 5766, + 5780, + 5787, + 5721, + 5750, + 5742, + 5765, + 5759, + 5796, + 5751, + 5765, + 5764, + 5775, + 5770, + 5763, + 5746, + 5872, + 5741, + 5783, + 5768, + 5741, + 5779, + 5767, + 5783, + 5761, + 5765, + 5777, + 5742, + 5784, + 5762, + 5764, + 5808, + 5792, + 5780, + 5764, + 5744, + 5757, + 5736, + 5736, + 5796, + 5758, + 5808, + 5742, + 5750, + 5785, + 5760, + 5774, + 5747, + 5759, + 5774, + 5774, + 5767, + 5762, + 5758, + 5752, + 5753, + 5760, + 5733, + 5792, + 5760, + 5775, + 5743, + 5773, + 5789, + 5749, + 5782, + 5737, + 5766, + 5773, + 5778, + 5810, + 5795, + 5774, + 5779, + 5786, + 5755, + 5751, + 5799, + 5760, + 5804, + 5767, + 5737, + 5801, + 5753, + 5774, + 5761, + 5753, + 5746, + 5757, + 5754, + 5742, + 5744, + 5758, + 5722, + 5809, + 5758, + 5772, + 5801, + 5787, + 5794, + 5773, + 5760, + 5766, + 5758, + 5794, + 5743, + 5788, + 5768, + 5749, + 5861, + 5765, + 5751, + 5788, + 5795, + 5762, + 5800, + 5829, + 5817, + 5783, + 5781, + 5752, + 5763, + 5827, + 5727, + 5747, + 5788, + 5757, + 5737, + 5775, + 5798, + 5740, + 5776, + 5765, + 5757, + 5776, + 5817, + 5763, + 5764, + 5765, + 5753, + 5798, + 5804, + 5757, + 5773, + 5772, + 5781, + 5770, + 5791, + 5768, + 5778, + 5796, + 5778, + 5819, + 5751, + 5772, + 5780, + 5793, + 5745, + 5798, + 5752, + 5768, + 5771, + 5746, + 5756, + 5827, + 5737, + 5753, + 5760, + 5778, + 5799, + 5802, + 5797, + 5742, + 5776, + 5768, + 5748, + 5821, + 5781, + 5773, + 5778, + 5756, + 5765, + 5755, + 5775, + 5754, + 5799, + 5790, + 5807, + 5773, + 5743, + 5789, + 5756, + 5758, + 5771, + 5789, + 5760, + 5785, + 5784, + 5743, + 5755, + 5776, + 5766, + 5734, + 5767, + 5776, + 5756, + 5751, + 5786, + 5748, + 5794, + 5756, + 5754, + 5747, + 5750, + 5753, + 5781, + 5752, + 5733, + 5727, + 5742, + 5777, + 5789, + 5780, + 5755, + 5772, + 5761, + 5774, + 5828, + 5794, + 5765, + 5779, + 5739, + 5749, + 5788, + 5763, + 5809, + 5805, + 5777, + 5793, + 5742, + 5736, + 5738, + 5761, + 5760, + 5812, + 5761, + 5797, + 5752, + 5752, + 5748, + 5757, + 5804, + 5770, + 5763, + 5809, + 5774, + 5753, + 5743, + 5756, + 5742, + 5727, + 5752, + 5853, + 5757, + 5763, + 5734, + 5761, + 5763, + 5740, + 5748, + 5740, + 5758, + 5804, + 5779, + 5768, + 5730, + 5774, + 5767, + 5761, + 5735, + 5745, + 5780, + 5769, + 5767, + 5763, + 5762, + 5729, + 5773, + 5765, + 5771, + 5742, + 5756, + 5779, + 5770, + 5755, + 5741, + 5756, + 5773, + 5753, + 5740, + 5796, + 5759, + 5758, + 5751, + 5822, + 5778, + 5783, + 5769, + 5755, + 5769, + 5740, + 5749, + 5777, + 5776, + 5765, + 5762, + 5763, + 5761, + 5757, + 5774, + 5774, + 5761, + 5742, + 5767, + 5760, + 5743, + 5770, + 5740, + 5763, + 5768, + 5774, + 5769, + 5786, + 5729, + 5737, + 5813, + 5737, + 5807, + 5769, + 5777, + 5766, + 5792, + 5773, + 5743, + 5797, + 5761, + 5766, + 5753, + 5776, + 5746, + 5920, + 5809, + 5792, + 5756, + 5783, + 5770, + 5772, + 5776, + 5739, + 5938, + 5750, + 5764, + 5877, + 5750, + 5779, + 5799, + 5735, + 5798, + 5783, + 5734, + 5814, + 5778, + 5767, + 5737, + 5754, + 5743, + 5759, + 5808, + 5769, + 5748, + 5799, + 5777, + 5758, + 5806, + 5782, + 5788, + 5763, + 5737, + 5760, + 5801, + 5844, + 5745, + 5810, + 5778, + 5756, + 5752, + 5766, + 5811, + 5788, + 5795, + 5790, + 5818, + 5762, + 5765, + 5747, + 5789, + 5748, + 5788, + 5739, + 5782, + 5768, + 5741, + 5784, + 5819, + 5781, + 5811, + 5756, + 5738, + 5813, + 5768, + 5737, + 5798, + 5783, + 5745, + 5763, + 5822, + 5800, + 5764, + 5752, + 5804, + 5777, + 5763, + 5773, + 5782, + 5770, + 5790, + 5777, + 5764, + 5858, + 5768, + 5773, + 5775, + 5762, + 5772, + 5753, + 5766, + 5749, + 5751, + 5763, + 5753, + 5770, + 5767, + 5794, + 5741, + 5770, + 5833, + 5740, + 5768, + 5737, + 5808, + 5749, + 5729, + 5770, + 5810, + 5744, + 5773, + 5767, + 5773, + 5755, + 5774, + 5756, + 5743, + 5746, + 5778, + 5737, + 5742, + 5790, + 5768, + 5767, + 5763, + 5764, + 5793, + 5771, + 5740, + 5786, + 5778, + 5750, + 5790, + 5751, + 5745, + 5754, + 5780, + 5735, + 5744, + 5788, + 5773, + 5753, + 5740, + 5797, + 5767, + 5728, + 5790, + 5781, + 5757, + 5782, + 5782, + 5777, + 5728, + 5765, + 5765, + 5806, + 5764, + 5782, + 5735, + 5785, + 5764, + 5771, + 5782, + 5772, + 5761, + 5768, + 5774, + 5759, + 5758, + 5761, + 5745, + 5764, + 5734, + 5795, + 5788, + 5769, + 5749, + 5742, + 5740, + 5792, + 5749, + 5744, + 5762, + 5773, + 5774, + 5770, + 5765, + 5760, + 5767, + 5768, + 5747, + 5810, + 5762, + 5749, + 5748, + 5740, + 5758, + 5808, + 5768, + 5760, + 5781, + 5757, + 5767, + 5760, + 5742, + 5751, + 5754, + 5751, + 5745, + 5757, + 5795, + 5758, + 5728, + 5792, + 5754, + 5749, + 5793, + 5745, + 5796, + 5775, + 5763, + 5798, + 5740, + 5785, + 5766, + 5771, + 5759, + 5789, + 5760, + 5773, + 5770, + 5758, + 5743, + 5759, + 5733, + 5778, + 5757, + 5770, + 5773, + 5753, + 5744, + 5784, + 5741, + 5788, + 5763, + 5753, + 5761, + 5765, + 5800, + 5755, + 5759, + 5782, + 5790, + 5844, + 5785, + 5737, + 5775, + 5743, + 5745, + 5771, + 5759, + 5791, + 5780, + 5751, + 5771, + 5767, + 5762, + 5755, + 5746, + 5779, + 5732, + 5747, + 5776, + 5779, + 5752, + 5768, + 5777, + 5813, + 5745, + 5789, + 5754, + 5792, + 5796, + 5732, + 5785, + 5766, + 5773, + 5780, + 5778, + 5752, + 5761, + 5776, + 5739, + 5758, + 5765, + 5781, + 5762, + 5787, + 5812, + 5819, + 5774, + 5761, + 5776, + 5761, + 5748, + 5760, + 5773, + 5750, + 5782, + 5757, + 5773, + 5750, + 5782, + 5793, + 5752, + 5761, + 5739, + 5781, + 5754, + 5766, + 5771, + 5755, + 5751, + 5770, + 5750, + 5791, + 5773, + 5747, + 5746, + 5773, + 5728, + 5803, + 5760, + 5791, + 5725, + 5754, + 5749, + 5792, + 5727, + 5783, + 5778, + 5755, + 5745, + 5765, + 5765, + 5734, + 5743, + 5744, + 5741, + 5810, + 5831, + 5767, + 5760, + 5758, + 5761, + 5759, + 5745, + 5798, + 5782, + 5752, + 5757, + 5782, + 5790, + 5740, + 5767, + 5769, + 5788, + 5767, + 5773, + 5777, + 5752, + 5739, + 5765, + 5764, + 5745, + 5760, + 5765, + 5774, + 5751, + 5765, + 5743, + 5746, + 5780, + 5724, + 5782, + 5793, + 5777, + 5772, + 5765, + 5765, + 5765, + 5809, + 5778, + 5766, + 5771, + 5754, + 5783, + 5806, + 5758, + 5746, + 5764, + 5775, + 5795, + 5790, + 5764, + 5754, + 5747, + 5743, + 5769, + 5772, + 5776, + 5761, + 5778, + 5752, + 5804, + 5735, + 5753, + 5767, + 5756, + 5751, + 5733, + 5784, + 5756, + 5834, + 5783, + 5750, + 5756, + 5783, + 5804, + 5739, + 5733, + 5779, + 5761, + 5760, + 5774, + 5772, + 5787, + 5749, + 5793, + 5787, + 5749, + 5758, + 5783, + 5767, + 5800, + 5791, + 5787, + 5735, + 5742, + 5786, + 5750, + 5787, + 5793, + 5761, + 5807, + 5758, + 5764, + 5773, + 5758, + 5813, + 5763, + 5760, + 5762, + 5789, + 5729, + 5756, + 5745, + 5781, + 5766, + 5776, + 5749, + 5760, + 5787, + 5797, + 5743, + 5736, + 5814, + 5738, + 5750, + 5767, + 5793, + 5769, + 5771, + 5769, + 5788, + 5781, + 5767, + 5775, + 5751, + 5746, + 5761, + 5749, + 5782, + 5780, + 5778, + 5759, + 5765, + 5791, + 5760, + 5796, + 5732, + 5768, + 5769, + 5784, + 5781, + 5764, + 5766, + 5747, + 5753, + 5781, + 5779, + 5764, + 5790, + 5793, + 5774, + 5811, + 5822, + 5774, + 5767, + 5755, + 5767, + 5774, + 5745, + 5788, + 5775, + 5818, + 5758, + 5740, + 5764, + 5790, + 5796, + 5765, + 5772, + 5783, + 5758, + 5784, + 5758, + 5793, + 5754, + 5743, + 5774, + 5751, + 5745, + 5767, + 5742, + 5764, + 5753, + 5741, + 5733, + 5751, + 5778, + 5761, + 5749, + 5745, + 5741, + 5754, + 5759, + 5754, + 5749, + 5779, + 5744, + 5770, + 5797, + 5742, + 5791, + 5767, + 5737, + 5764, + 5749, + 5756, + 5788, + 5766, + 5734, + 5758, + 5747, + 5775, + 5751, + 5773, + 5740, + 5773, + 5743, + 5770, + 5733, + 5752, + 5765, + 5764, + 5784, + 5767, + 5762, + 5730, + 5742, + 5769, + 5781, + 5756, + 5775, + 5743, + 5754, + 5784, + 5743, + 5761, + 5761, + 5748, + 5740, + 5742, + 5795, + 5759, + 5800, + 5738, + 5737, + 5774, + 5777, + 5802, + 5743, + 5778, + 5779, + 5729, + 5761, + 5728, + 5747, + 5786, + 5758, + 5747, + 5738, + 5766, + 5783, + 5801, + 5746, + 5754, + 5773, + 5801, + 5790, + 5765, + 5744, + 5761, + 5769, + 5782, + 5782, + 5757, + 5738, + 5768, + 5748, + 5741, + 5845, + 5791, + 5781, + 5749, + 5777, + 5782, + 5813, + 5766, + 5784, + 5778, + 5821, + 5805, + 5767, + 5750, + 5741, + 5736, + 5777, + 5748, + 5753, + 5762, + 5789, + 5770, + 5740, + 5767, + 5767, + 5788, + 5751, + 5763, + 5737, + 5733, + 5747, + 5856, + 5752, + 5768, + 5750, + 5764, + 5771, + 5808, + 5787, + 5756, + 5742, + 5769, + 5744, + 5768, + 5769, + 5752, + 5767, + 5754, + 5774, + 5734, + 5768, + 5756, + 5778, + 5756, + 5754, + 5749, + 5731, + 5777, + 5787, + 5764, + 5750, + 5792, + 5799, + 5758, + 5765, + 5786, + 5778, + 5746, + 5730, + 5770, + 5768, + 5761, + 5767, + 5767, + 5740, + 5784, + 5767, + 5759, + 5787, + 5800, + 5737, + 5768, + 5772, + 5773, + 5767, + 5788, + 5745, + 5766, + 5753, + 5776, + 5795, + 5778, + 5771, + 5746, + 5758, + 5743, + 5755, + 5777, + 5785, + 5752, + 5772, + 5735, + 5771, + 5756, + 5760, + 5802, + 5762, + 5757, + 5769, + 5781, + 5740, + 5812, + 5781, + 5755, + 5757, + 5735, + 5753, + 5757, + 5755, + 5738, + 5742, + 5780, + 5763, + 5750, + 5770, + 5762, + 5758, + 5737, + 5737, + 5745, + 5757, + 5787, + 5805, + 5792, + 5730, + 5795, + 5769, + 5776, + 5772, + 5777, + 5808, + 5761, + 5772, + 5759, + 5736, + 5747, + 5763, + 5771, + 5739, + 5739, + 5758, + 5783, + 5775, + 5749, + 5740, + 5741, + 5759, + 5772, + 5741, + 5769, + 5797, + 5833, + 5766, + 5756, + 5773, + 5750, + 5762, + 5772, + 5733, + 5741, + 5750, + 5750, + 5787, + 5733, + 5735, + 5802, + 5816, + 5764, + 5739, + 5760, + 5773, + 5789, + 5756, + 5754, + 5790, + 5784, + 5764, + 5798, + 5747, + 5760, + 5754, + 5760, + 5770, + 5782, + 5763, + 5759, + 5765, + 5776, + 5742, + 5756, + 5734, + 5775, + 5793, + 5743, + 5738, + 5752, + 5753, + 5818, + 5790, + 5773, + 5746, + 5768, + 5784, + 5738, + 5775, + 5776, + 5755, + 5746, + 5775, + 5735, + 5785, + 5743, + 5767, + 5782, + 5756, + 5844, + 5749, + 5735, + 5782, + 5780, + 5767, + 5782, + 5750, + 5748, + 5742, + 5739, + 5748, + 5795, + 5759, + 5798, + 5745, + 5792, + 5808, + 5791, + 5789, + 5768, + 5746, + 5750, + 5749, + 5750, + 5809, + 5813, + 5778, + 5785, + 5735, + 5785, + 5754, + 5801, + 5777, + 5783, + 5773, + 5735, + 5748, + 5815, + 5745, + 5755, + 5779, + 5760, + 5737, + 5773, + 5780, + 5819, + 5730, + 5763, + 5859, + 5740, + 5814, + 5779, + 5737, + 5745, + 5799, + 5796, + 5771, + 5759, + 5782, + 5775, + 5784, + 5765, + 5734, + 5767, + 5740, + 5750, + 5738, + 5772, + 5756, + 5769, + 5779, + 5732, + 5734, + 5768, + 5766, + 5775, + 5750, + 5767, + 5771, + 5764, + 5738, + 5765, + 5758, + 5782, + 5747, + 5748, + 5770, + 5766, + 5769, + 5763, + 5772, + 5770, + 5768, + 5760, + 5741, + 5779, + 5736, + 5774, + 5760, + 5767, + 5742, + 5747, + 5780, + 5779, + 5776, + 5779, + 5765, + 5767, + 5777, + 5739, + 5774, + 5780, + 5764, + 5752, + 5779, + 5756, + 5761, + 5752, + 5736, + 5771, + 5765, + 5771, + 5858, + 5740, + 5787, + 5756, + 5769, + 5753, + 5779, + 5743, + 5731, + 5783, + 5758, + 5758, + 5811, + 5752, + 5736, + 5741, + 5837, + 5807, + 5782, + 5765, + 5755, + 5745, + 5779, + 5743, + 5774, + 5775, + 5769, + 5768, + 5773, + 5784, + 5782, + 5807, + 5746, + 5780, + 5758, + 5771, + 5747, + 5779, + 5785, + 5793, + 5757, + 5790, + 5778, + 5788, + 5752, + 5785, + 5751, + 5826, + 5796, + 5760, + 5777, + 5788, + 5791, + 5751, + 5756, + 5766, + 5769, + 5762, + 5740, + 5766, + 5759, + 5749, + 5785, + 5767, + 5763, + 5765, + 5744, + 5771, + 5766, + 5770, + 5732, + 5778, + 5736, + 5788, + 5741, + 5730, + 5757, + 5749, + 5769, + 5735, + 5760, + 5770, + 5757, + 5769, + 5785, + 5761, + 5772, + 5733, + 5782, + 5763, + 5771, + 5779, + 5756, + 5797, + 5767, + 5774, + 5742, + 5755, + 5743, + 5757, + 5743, + 5751, + 5765, + 5743, + 5742, + 5738, + 5771, + 5775, + 5788, + 5763, + 5807, + 5777, + 5798, + 5759, + 5749, + 5788, + 5789, + 5775, + 5753, + 5753, + 5783, + 5763, + 5749, + 5772, + 5770, + 5763, + 5790, + 5760, + 5756, + 5773, + 5786, + 5732, + 5745, + 5768, + 5762, + 5767, + 5788, + 5765, + 5749, + 5788, + 5807, + 5766, + 5785, + 5761, + 5752, + 5753, + 5766, + 5729, + 5733, + 5758, + 5780, + 5753, + 5756, + 5830, + 5765, + 5748, + 5790, + 5769, + 5747, + 5755, + 5737, + 5764, + 5742, + 5780, + 5734, + 5751, + 5750, + 5775, + 5803, + 5773, + 5767, + 5759, + 5783, + 5774, + 5734, + 5777, + 5749, + 5764, + 5757, + 5748, + 5774, + 5760, + 5790, + 5754, + 5808, + 5749, + 5765, + 5752, + 5766, + 5791, + 5771, + 5765, + 5742, + 5797, + 5744, + 5776, + 5817, + 5781, + 5729, + 5771, + 5742, + 5769, + 5742, + 5781, + 5743, + 5741, + 5780, + 5738, + 5771, + 5772, + 5774, + 5752, + 5773, + 5764, + 5732, + 5761, + 5774, + 5743, + 5767, + 5751, + 5769, + 5750, + 5753, + 5747, + 5734, + 5758, + 5768, + 5740, + 5732, + 5768, + 5755, + 5743, + 5748, + 5798, + 5768, + 5760, + 5765, + 5736, + 5764, + 5804, + 5765, + 5760, + 5761, + 5778, + 5754, + 5742, + 5773, + 5776, + 5738, + 5779, + 5782, + 5768, + 5753, + 5754, + 5800, + 5741, + 5764, + 5792, + 5751, + 5743, + 5772, + 5751, + 5764, + 5776, + 5798, + 5754, + 5758, + 5752, + 5785, + 5771, + 5840, + 5806, + 5774, + 5748, + 5784, + 5760, + 5748, + 5764, + 5795, + 5781, + 5749, + 5743, + 5732, + 5742, + 5787, + 5798, + 5785, + 5754, + 5736, + 5750, + 5785, + 5762, + 5766, + 5784, + 5746, + 5779, + 5761, + 5775, + 5764, + 5748, + 5745, + 5769, + 5775, + 5774, + 5751, + 5760, + 5749, + 5756, + 5767, + 5743, + 5738, + 5776, + 5742, + 5768, + 5753, + 5762, + 5769, + 5758, + 5768, + 5790, + 5773, + 5784, + 5788, + 5760, + 5779, + 5777, + 5779, + 5768, + 5747, + 5766, + 5783, + 5754, + 5763, + 5747, + 5775, + 5819, + 5739, + 5751, + 5750, + 5736, + 5763, + 5778, + 5735, + 5814, + 5768, + 5748, + 5769, + 5839, + 5771, + 5785, + 5740, + 5757, + 5775, + 5777, + 5763, + 5778, + 5730, + 5736, + 5780, + 5778, + 5780, + 5767, + 5768, + 5747, + 5742, + 5794, + 5788, + 5775, + 5789, + 5752, + 5773, + 5777, + 5751, + 5805, + 5764, + 5768, + 5790, + 5761, + 5751, + 5792, + 5790, + 5761, + 5805, + 5753, + 5762, + 5739, + 5748, + 5759, + 5743, + 5804, + 5845, + 5785, + 5802, + 5813, + 5765, + 5816, + 5783, + 5784, + 5828, + 5759, + 5756, + 5750, + 5797, + 5756, + 5803, + 5750, + 5732, + 5736, + 5757, + 5735, + 5772, + 5754, + 5785, + 5748, + 5767, + 5788, + 5793, + 5756, + 5733, + 5833, + 5743, + 5792, + 5789, + 5814, + 5762, + 5737, + 5766, + 5811, + 5753, + 5797, + 5744, + 5764, + 5749, + 5794, + 5792, + 5744, + 5801, + 5759, + 5752, + 5768, + 5752, + 5783, + 5769, + 5755, + 5756, + 5805, + 5735, + 5779, + 5760, + 5761, + 5740, + 5774, + 5767, + 5788, + 5768, + 5759, + 5771, + 5741, + 5759, + 5742, + 5776, + 5794, + 5730, + 5782, + 5773, + 5778, + 5833, + 5758, + 5759, + 5753, + 5750, + 5737, + 5757, + 5780, + 5776, + 5752, + 5787, + 5763, + 5736, + 5750, + 5756, + 5763, + 5813, + 5756, + 5816, + 5747, + 5810, + 5794, + 5740, + 5754, + 5771, + 5752, + 5740, + 5739, + 5776, + 5742, + 5782, + 5743, + 5771, + 5777, + 5767, + 5776, + 5747, + 5731, + 5774, + 5769, + 5729, + 5776, + 5755, + 5745, + 5799, + 5764, + 5818, + 5726, + 5776, + 5766, + 5784, + 5742, + 5795, + 5758, + 5745, + 5791, + 5733, + 5756, + 5780, + 5777, + 5742, + 5736, + 5763, + 5773, + 5762, + 5775, + 5771, + 5736, + 5765, + 5772, + 5728, + 5769, + 5770, + 5826, + 5751, + 5752, + 5820, + 5756, + 5765, + 5743, + 5738, + 5768, + 5732, + 5765, + 5768, + 5755, + 5767, + 5739, + 5790, + 5760, + 5775, + 5746, + 5771, + 5775, + 5760, + 5751, + 5750, + 5774, + 5765, + 5764, + 5742, + 5763, + 5781, + 5781, + 5781, + 5802, + 5763, + 5774, + 5772, + 5818, + 5751, + 5741, + 5769, + 5735, + 5757, + 5749, + 5754, + 5783, + 5769, + 5788, + 5772, + 5751, + 5757, + 5824, + 5760, + 5749, + 5752, + 5781, + 5770, + 5786, + 5766, + 5763, + 5919, + 5738, + 5780, + 5805, + 5771, + 5780, + 5805, + 5778, + 5739, + 5765, + 5775, + 5758, + 5803, + 5757, + 5776, + 5755, + 5782, + 5781, + 5805, + 5817, + 5729, + 5768, + 5732, + 5758, + 5773, + 5776, + 5799, + 5768, + 5740, + 5760, + 5804, + 5796, + 5777, + 5747, + 5739, + 5779, + 5761, + 5757, + 5784, + 5761, + 5748, + 5756, + 5781, + 5790, + 5742, + 5805, + 5733, + 5769, + 5797, + 5763, + 5761, + 5727, + 5752, + 5767, + 5736, + 5782, + 5749, + 5754, + 5757, + 5779, + 5741, + 5766, + 5761, + 5785, + 5764, + 5770, + 5761, + 5754, + 5752, + 5764, + 5749, + 5794, + 5756, + 5803, + 5762, + 5755, + 5774, + 5772, + 5732, + 5786, + 5769, + 5787, + 5786, + 5737, + 5779, + 5761, + 5730, + 5784, + 5746, + 5792, + 5775, + 5765, + 5746, + 5800, + 5767, + 5771, + 5742, + 5806, + 5771, + 5739, + 5749, + 5765, + 5760, + 5732, + 5768, + 5733, + 5766, + 5815, + 5777, + 5732, + 5783, + 5778, + 5760, + 5801, + 5772, + 5766, + 5794, + 5782, + 5796, + 5768, + 5767, + 5772, + 5772, + 5782, + 5767, + 5733, + 5762, + 5751, + 5769, + 5763, + 5761, + 5750, + 5743, + 5788, + 5817, + 5783, + 5771, + 5774, + 5781, + 5800, + 5742, + 5816, + 5749, + 5772, + 5779, + 5769, + 5745, + 5761, + 5751, + 5805, + 5844, + 5786, + 6761, + 5790, + 5769, + 5753, + 5771, + 5786, + 5780, + 5746, + 5801, + 5753, + 5792, + 5765, + 5782, + 5780, + 5766, + 5782, + 5771, + 5762, + 5774, + 5753, + 5722, + 5766, + 5777, + 5768, + 5776, + 5746, + 5761, + 5755, + 5795, + 5800, + 5751, + 5747, + 5725, + 5750, + 5745, + 5778, + 5737, + 5758, + 5756, + 5783, + 5767, + 5788, + 5760, + 5738, + 5767, + 5768, + 5788, + 5771, + 5767, + 5750, + 5774, + 5806, + 5783, + 5733, + 5747, + 5755, + 5765, + 5783, + 5768, + 5742, + 5779, + 5779, + 5778, + 5811, + 5795, + 5818, + 5740, + 5740, + 5768, + 5788, + 5755, + 5755, + 5750, + 5738, + 5739, + 5771, + 5784, + 5752, + 5761, + 5793, + 5746, + 5806, + 5760, + 5745, + 5784, + 5770, + 5721, + 5740, + 5771, + 5743, + 5752, + 5777, + 5752, + 5765, + 5773, + 5822, + 5744, + 5753, + 5773, + 5810, + 5758, + 5780, + 5766, + 5753, + 5748, + 5746, + 5734, + 5768, + 5771, + 5827, + 5739, + 5745, + 5770, + 5781, + 5747, + 5748, + 5796, + 5772, + 5779, + 5755, + 5768, + 5747, + 5774, + 5764, + 5759, + 5768, + 5745, + 5760, + 5753, + 5725, + 5747, + 5779, + 5754, + 5760, + 5743, + 5774, + 5785, + 5761, + 5833, + 5747, + 5751, + 5764, + 5760, + 5747, + 5751, + 5786, + 5760, + 5753, + 5773, + 5767, + 5760, + 5780, + 5743, + 5773, + 5773, + 5750, + 5752, + 5789, + 5811, + 5768, + 5749, + 5728, + 5774, + 5730, + 5761, + 5730, + 5756, + 5770, + 5790, + 5743, + 5735, + 5771, + 5765, + 5786, + 5765, + 5776, + 5725, + 5777, + 5765, + 5771, + 5782, + 5808, + 5751, + 5779, + 5777, + 5760, + 5746, + 5816, + 5817, + 5785, + 5761, + 5735, + 5770, + 5743, + 5779, + 5733, + 5776, + 5786, + 5732, + 5729, + 5744, + 5726, + 5772, + 5753, + 5752, + 5755, + 5749, + 5813, + 5784, + 5749, + 5815, + 5747, + 5741, + 5760, + 5781, + 5764, + 5791, + 5796, + 5777, + 5764, + 5758, + 5783, + 5771, + 5743, + 5761, + 5792, + 5772, + 5738, + 5772, + 5739, + 5754, + 5837, + 5773, + 5758, + 5753, + 5732, + 5749, + 5798, + 5779, + 5722, + 5736, + 5803, + 5779, + 5754, + 5762, + 5738, + 5730, + 5767, + 5746, + 5764, + 5794, + 5766, + 5746, + 5759, + 5733, + 5832, + 5796, + 5780, + 5731, + 5760, + 5791, + 5739, + 5805, + 5816, + 5736, + 5756, + 5758, + 5778, + 5743, + 5754, + 5757, + 5778, + 5801, + 5751, + 5761, + 5769, + 5789, + 5767, + 5729, + 5762, + 5763, + 5763, + 5779, + 5773, + 5758, + 5734, + 5793, + 5739, + 5763, + 5754, + 5799, + 5749, + 5739, + 5750, + 5759, + 5808, + 5748, + 5759, + 5743, + 5765, + 5794, + 5757, + 5773, + 5760, + 5803, + 5769, + 5759, + 5821, + 5778, + 5736, + 5767, + 5737, + 5755, + 5818, + 5785, + 5760, + 5755, + 5790, + 5765, + 5823, + 5782, + 5751, + 5817, + 5790, + 5766, + 5832, + 5752, + 5774, + 5758, + 5771, + 5758, + 5762, + 5785, + 5762, + 5816, + 5799, + 5778, + 5810, + 5745, + 5770, + 5777, + 5766, + 5734, + 5750, + 5732, + 5724, + 5766, + 5802, + 5746, + 5767, + 5740, + 5777, + 5774, + 5835, + 5769, + 5752, + 5756, + 5752, + 5748, + 5762, + 5746, + 5782, + 5753, + 5758, + 5776, + 5774, + 5770, + 5798, + 5750, + 5804, + 5790, + 5807, + 5761, + 5770, + 5775, + 5793, + 5825, + 5767, + 5782, + 5801, + 5782, + 5791, + 5795, + 5781, + 5768, + 5745, + 5766, + 5782, + 5811, + 5810, + 5771, + 5804, + 5800, + 5753, + 5785, + 5745, + 5756, + 5731, + 5757, + 5757, + 5766, + 5779, + 5754, + 5782, + 5780, + 5750, + 5746, + 5794, + 5792, + 5823, + 5736, + 5745, + 5738, + 5769, + 5769, + 5785, + 5754, + 5802, + 5753, + 5758, + 5763, + 5762, + 5765, + 5775, + 5769, + 5780, + 5769, + 5756, + 5758, + 5760, + 5759, + 5753, + 5784, + 5754, + 5837, + 5733, + 5764, + 5785, + 5749, + 5773, + 5806, + 5739, + 5753, + 5744, + 5797, + 5750, + 5765, + 5742, + 5780, + 5764, + 5794, + 5777, + 5762, + 5758, + 5785, + 5745, + 5780, + 5799, + 5778, + 5776, + 5760, + 5745, + 5740, + 5763, + 5784, + 5768, + 5740, + 5767, + 5780, + 5781, + 5759, + 5783, + 5789, + 5742, + 5765, + 5758, + 5737, + 5753, + 5737, + 5753, + 5771, + 5773, + 5771, + 5801, + 5757, + 5770, + 5736, + 5788, + 5757, + 5760, + 5752, + 5745, + 5757, + 5763, + 5753, + 5752, + 5741, + 5732, + 5739, + 5828, + 5776, + 5757, + 5748, + 5743, + 5748, + 5742, + 5772, + 5780, + 5785, + 5752, + 5748, + 5796, + 5782, + 5762, + 5795, + 5762, + 5767, + 5742, + 5747, + 5746, + 5768, + 5770, + 5739, + 5766, + 5745, + 5768, + 5780, + 5747, + 5748, + 5770, + 5758, + 5753, + 5799, + 5768, + 5752, + 5747, + 5770, + 5747, + 5757, + 5754, + 5738, + 5763, + 5792, + 5803, + 5775, + 5792, + 5731, + 5748, + 5743, + 5766, + 5781, + 5764, + 5792, + 5751, + 5763, + 5741, + 5761, + 5752, + 5739, + 5767, + 5765, + 5764, + 5736, + 5777, + 5767, + 5830, + 5764, + 5757, + 5752, + 5737, + 5764, + 5748, + 5825, + 5770, + 5751, + 5771, + 5777, + 5755, + 5758, + 5779, + 5756, + 5778, + 5772, + 5762, + 5793, + 5772, + 5761, + 5768, + 5782, + 5760, + 5761, + 5813, + 5753, + 5743, + 5828, + 5761, + 5726, + 5764, + 5757, + 5779, + 5769, + 5826, + 5775, + 5731, + 5760, + 5805, + 5770, + 5785, + 5796, + 5755, + 5790, + 5777, + 5738, + 5758, + 5753, + 5758, + 5756, + 5778, + 5756, + 5762, + 5734, + 5783, + 5746, + 5747, + 5745, + 5770, + 5816, + 5735, + 5749, + 5743, + 5744, + 5757, + 5768, + 5742, + 5762, + 5731, + 5749, + 5752, + 5739, + 5729, + 5753, + 5744, + 5755, + 5795, + 5777, + 5771, + 5731, + 5764, + 5790, + 5739, + 5760, + 5790, + 5768, + 5781, + 5793, + 5755, + 5733, + 5763, + 5769, + 5785, + 5772, + 5780, + 5766, + 5734, + 5787, + 5770, + 5761, + 5803, + 5795, + 5775, + 5762, + 5763, + 5765, + 5756, + 5835, + 5776, + 5764, + 5800, + 5743, + 5867, + 5743, + 5760, + 5793, + 5747, + 5777, + 5738, + 5787, + 5742, + 5781, + 5765, + 5756, + 5744, + 5780, + 5825, + 5750, + 5732, + 5765, + 5773, + 5765, + 5752, + 5785, + 5749, + 5748, + 5764, + 5773, + 5769, + 5781, + 5770, + 5773, + 5754, + 5748, + 5779, + 5745, + 5759, + 5746, + 5746, + 5766, + 5779, + 5805, + 5777, + 5775, + 5770, + 5786, + 5767, + 5774, + 5738, + 5763, + 5730, + 5783, + 5748, + 5740, + 5770, + 5761, + 5733, + 5772, + 5758, + 5765, + 5786, + 5751, + 5762, + 5762, + 5770, + 5763, + 5732, + 5729, + 5732, + 5771, + 5733, + 5753, + 5793, + 5752, + 5771, + 5799, + 5767, + 5753, + 5745, + 5744, + 5757, + 5757, + 5741, + 5778, + 5741, + 5813, + 5789, + 5811, + 5752, + 5747, + 5736, + 5788, + 5759, + 5767, + 5756, + 5777, + 5805, + 5771, + 5745, + 5776, + 5760, + 5778, + 5738, + 5788, + 5782, + 5763, + 5786, + 5785, + 5773, + 5795, + 5810, + 5751, + 5767, + 5761, + 5776, + 5775, + 5755, + 5776, + 5752, + 5769, + 5744, + 5790, + 5796, + 5738, + 5774, + 5752, + 5759, + 5740, + 5757, + 5812, + 5747, + 5759, + 5734, + 5796, + 5744, + 5783, + 5747, + 5783, + 5765, + 5772, + 5787, + 5776, + 5731, + 5741, + 5797, + 5747, + 5770, + 5787, + 5744, + 5761, + 5759, + 5737, + 5750, + 5778, + 5777, + 5731, + 5753, + 5748, + 5758, + 5782, + 5780, + 5769, + 5805, + 5767, + 5754, + 5758, + 5765, + 5777, + 5736, + 5765, + 5753, + 5750, + 5747, + 5798, + 5754, + 5745, + 5789, + 5750, + 5747, + 5798, + 5754, + 5745, + 5789, + 5756, + 5737, + 5776, + 5758, + 5757, + 5753, + 5762, + 5754, + 5756, + 5771, + 5767, + 5756, + 5748, + 5803, + 5783, + 5799, + 5750, + 5739, + 5727, + 5801, + 5766, + 5778, + 5774, + 5734, + 5773, + 5739, + 5759, + 5787, + 5736, + 5821, + 5746, + 5768, + 5758, + 5737, + 5768, + 5789, + 5756, + 5770, + 5752, + 5781, + 5772, + 5761, + 5729, + 5731, + 5736, + 5770, + 5752, + 5760, + 5748, + 5763, + 5754, + 5765, + 5764, + 5788, + 5759, + 5766, + 5774, + 5768, + 5747, + 5762, + 5779, + 5788, + 5728, + 5747, + 5748, + 5778, + 5752, + 5753, + 5749, + 5742, + 5779, + 5790, + 5765, + 5748, + 5765, + 5813, + 5773, + 5761, + 5815, + 5805, + 5776, + 5779, + 5788, + 5788, + 5724, + 5754, + 5764, + 5763, + 5734, + 5753, + 5767, + 5739, + 5764, + 5777, + 5730, + 5763, + 5737, + 5789 + ], + "sample_count": 15283 + }, + { + "pubkey": "C25SwYuMAhWbor9M4H635FuppYUqDbCyJBiip4iztwdo", + "epoch": 89, + "origin_device_pk": "29ghthsKeH2ZCUmN2sUvhJtpEXn2ZxqAuq4sZFBFZmEs", + "target_device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "link_pk": "AWHkNcwF7PSNCJq4vgypxuAYfyeyHTWMySGefSN7VpFn", + "origin_device_location_pk": "HiJWeiLKcw6tcBmdX65x1Hd1XtjkQXLgEpPBhfkW2qxw", + "target_device_location_pk": "7vt8Tnbk15S6JA1uhRQVtbuL7w39zY8jeQ5iqgjsqLfP", + "origin_device_agent_pk": "FawcUyUPosa6MkTsJhds4Wdy4qQvk1z4vcuMryJhrmBi", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242131943640, + "samples": [ + 11097, + 11068, + 11050, + 11039, + 11060, + 11073, + 11045, + 11099, + 11036, + 11051, + 11062, + 11074, + 11047, + 11047, + 11047, + 11019, + 11029, + 11040, + 11054, + 11061, + 11052, + 11062, + 11101, + 11079, + 11089, + 11085, + 11043, + 11111, + 11049, + 11081, + 11088, + 11043, + 11074, + 11058, + 11025, + 12317, + 11080, + 11033, + 11073, + 11060, + 11054, + 11023, + 11067, + 11049, + 11051, + 11074, + 11037, + 11030, + 11048, + 11043, + 11071, + 11043, + 11036, + 11067, + 11046, + 11063, + 11029, + 11066, + 11068, + 11067, + 11052, + 11052, + 11031, + 11042, + 11037, + 11035, + 11040, + 11087, + 11074, + 11046, + 11045, + 11077, + 11071, + 11034, + 11073, + 11029, + 11037, + 11037, + 11041, + 11074, + 11024, + 11022, + 11039, + 11080, + 11094, + 11086, + 11053, + 11050, + 11071, + 11055, + 11042, + 11054, + 11037, + 11046, + 11074, + 11050, + 11009, + 11067, + 11028, + 11028, + 11055, + 11049, + 11026, + 11087, + 11082, + 11021, + 11097, + 11037, + 11069, + 11044, + 11038, + 11064, + 11040, + 11053, + 11096, + 11038, + 11052, + 11087, + 11021, + 11050, + 11054, + 11059, + 11030, + 11021, + 11062, + 11061, + 11087, + 11090, + 11062, + 11045, + 11030, + 11031, + 11023, + 11034, + 11032, + 11033, + 11042, + 11053, + 11018, + 11046, + 11063, + 11050, + 11046, + 11017, + 11039, + 11038, + 11053, + 11074, + 11041, + 11067, + 11033, + 11038, + 11063, + 11070, + 11056, + 11015, + 11064, + 11027, + 11030, + 11065, + 11028, + 11045, + 11042, + 11052, + 11052, + 11070, + 11040, + 11082, + 11064, + 11056, + 11062, + 11035, + 11045, + 11042, + 11055, + 11141, + 11051, + 11057, + 11041, + 11033, + 11057, + 11129, + 11073, + 11056, + 11044, + 11065, + 11024, + 11043, + 11045, + 11109, + 11047, + 11012, + 11031, + 11058, + 11062, + 11065, + 11074, + 11064, + 11029, + 11077, + 11042, + 11020, + 11045, + 11071, + 11043, + 11074, + 11040, + 11060, + 11103, + 11036, + 11040, + 11035, + 11042, + 11049, + 11037, + 11068, + 11048, + 11043, + 11007, + 11042, + 11031, + 11040, + 11036, + 11077, + 11032, + 11047, + 11053, + 11035, + 11027, + 11031, + 11027, + 11066, + 11059, + 11016, + 11082, + 11038, + 11063, + 11091, + 11047, + 11042, + 11036, + 11069, + 11040, + 11069, + 11050, + 11054, + 11046, + 11042, + 11062, + 11058, + 11141, + 11079, + 11022, + 11065, + 11049, + 11040, + 11078, + 11052, + 11045, + 11032, + 11063, + 11076, + 11097, + 11053, + 11038, + 11063, + 11056, + 11091, + 11054, + 11065, + 11050, + 11032, + 11076, + 11032, + 11037, + 11045, + 11042, + 11059, + 11017, + 11013, + 11083, + 11032, + 11061, + 11042, + 11019, + 11070, + 11024, + 11041, + 11075, + 11028, + 11023, + 11055, + 11042, + 11066, + 11020, + 11069, + 11033, + 11037, + 11026, + 11044, + 11051, + 11249, + 11049, + 11060, + 11066, + 11039, + 11064, + 11051, + 11062, + 11046, + 11054, + 11063, + 11094, + 11043, + 11072, + 11068, + 11054, + 11052, + 11024, + 11059, + 11050, + 11055, + 11041, + 11065, + 11046, + 11082, + 11046, + 11105, + 11072, + 11049, + 11056, + 11035, + 11092, + 11032, + 11081, + 11030, + 11058, + 11037, + 11061, + 11045, + 11045, + 11011, + 11079, + 11028, + 11019, + 11076, + 11093, + 11029, + 11071, + 11021, + 11044, + 11030, + 11033, + 11071, + 11068, + 11043, + 11036, + 11053, + 11115, + 11102, + 11064, + 11051, + 11030, + 11039, + 11131, + 11058, + 11030, + 11068, + 11064, + 11065, + 11057, + 11046, + 11091, + 11040, + 11035, + 11035, + 11031, + 11061, + 11040, + 11105, + 11071, + 11037, + 11079, + 11039, + 11043, + 11033, + 11043, + 11032, + 11064, + 11035, + 11047, + 11058, + 11064, + 11067, + 11080, + 11019, + 11053, + 11032, + 11070, + 11075, + 11044, + 11050, + 11027, + 11051, + 11025, + 11058, + 11070, + 11058, + 11022, + 11019, + 11016, + 11047, + 11055, + 11024, + 11039, + 11082, + 11079, + 11071, + 11045, + 11046, + 11030, + 11041, + 11452, + 11083, + 11067, + 11095, + 11038, + 11073, + 11047, + 11073, + 11034, + 11015, + 11042, + 11084, + 11016, + 11045, + 11056, + 11057, + 11049, + 11071, + 11066, + 11065, + 11108, + 11017, + 11102, + 11016, + 11067, + 11060, + 11063, + 11012, + 11091, + 11051, + 11081, + 11011, + 11047, + 11036, + 11031, + 11055, + 11081, + 11062, + 11058, + 11043, + 11084, + 11045, + 11058, + 11059, + 11051, + 11034, + 11033, + 11044, + 11025, + 11046, + 11061, + 11049, + 11057, + 11047, + 11050, + 11060, + 11056, + 11057, + 11060, + 11128, + 11028, + 11051, + 11066, + 11057, + 11067, + 11059, + 11043, + 11059, + 11054, + 11046, + 11058, + 11053, + 11086, + 11143, + 11083, + 11068, + 11052, + 11060, + 11016, + 11034, + 11037, + 11057, + 11026, + 11055, + 11016, + 11072, + 11131, + 11054, + 11022, + 11037, + 11068, + 11074, + 11092, + 11052, + 11060, + 11017, + 11025, + 11061, + 11096, + 11053, + 11072, + 11030, + 11056, + 11100, + 11075, + 11036, + 11059, + 11052, + 11085, + 11070, + 11044, + 11026, + 11033, + 11067, + 11064, + 11052, + 11055, + 11031, + 11037, + 11090, + 11090, + 11597, + 11072, + 11039, + 11058, + 11056, + 11050, + 11056, + 11039, + 11045, + 11044, + 11101, + 11048, + 11045, + 11067, + 11052, + 11046, + 11055, + 11064, + 11073, + 11066, + 11025, + 11070, + 11078, + 11048, + 11160, + 11039, + 11043, + 11041, + 11102, + 11081, + 11084, + 11025, + 11055, + 11033, + 11022, + 11033, + 11033, + 11074, + 11016, + 11056, + 11042, + 11065, + 11043, + 11084, + 11004, + 11030, + 11035, + 11049, + 11070, + 11064, + 11046, + 11041, + 11086, + 11045, + 11046, + 11045, + 11061, + 11037, + 11054, + 11031, + 11074, + 11075, + 11072, + 11052, + 11060, + 11032, + 11274, + 11029, + 11076, + 11071, + 11068, + 11032, + 11052, + 11080, + 11047, + 11054, + 11108, + 11084, + 11042, + 11056, + 11064, + 11062, + 11061, + 11034, + 11034, + 11068, + 11080, + 11062, + 11062, + 11071, + 11056, + 11045, + 11053, + 11026, + 11053, + 11059, + 11075, + 11033, + 11039, + 11017, + 11049, + 11038, + 11064, + 11032, + 11039, + 11055, + 11060, + 11035, + 11120, + 11022, + 11069, + 11072, + 11037, + 11066, + 11060, + 11033, + 11091, + 11044, + 11076, + 11021, + 11049, + 11096, + 11015, + 11036, + 11076, + 11065, + 11099, + 11075, + 11068, + 11068, + 11081, + 11017, + 11038, + 11081, + 11083, + 11059, + 11050, + 11071, + 11060, + 11067, + 11038, + 11041, + 11063, + 11036, + 11062, + 11049, + 11102, + 11077, + 11089, + 11056, + 11089, + 11046, + 11036, + 11054, + 11054, + 11056, + 11036, + 11023, + 11052, + 11063, + 11032, + 11050, + 11026, + 11065, + 11069, + 11066, + 11056, + 11023, + 12398, + 11030, + 11085, + 11071, + 11102, + 11014, + 11045, + 11053, + 11008, + 11046, + 11044, + 11014, + 11081, + 11069, + 11095, + 11101, + 11058, + 11055, + 11056, + 11053, + 11048, + 11059, + 11048, + 11024, + 11035, + 11036, + 11094, + 11016, + 11056, + 11050, + 11061, + 11048, + 11056, + 11023, + 11058, + 11036, + 11041, + 11049, + 11003, + 11034, + 11073, + 11074, + 11060, + 11032, + 11024, + 11012, + 11066, + 11064, + 11069, + 11049, + 11049, + 11047, + 11054, + 11033, + 11042, + 11101, + 11020, + 11067, + 11064, + 11049, + 11070, + 11032, + 11111, + 11052, + 11056, + 11041, + 11049, + 11079, + 11021, + 11051, + 11060, + 11044, + 11070, + 11041, + 11031, + 11031, + 11042, + 11027, + 11045, + 11105, + 11039, + 11030, + 11064, + 11080, + 11062, + 11058, + 11160, + 11028, + 11032, + 11062, + 11046, + 11072, + 11083, + 11057, + 11041, + 11057, + 11069, + 11016, + 11041, + 11053, + 11059, + 11023, + 11068, + 11057, + 11040, + 11031, + 11040, + 11066, + 11074, + 11055, + 11050, + 11040, + 11031, + 11039, + 11019, + 11034, + 11044, + 11075, + 11066, + 11040, + 11029, + 11043, + 11069, + 11045, + 11035, + 11047, + 11056, + 11062, + 11042, + 11039, + 11104, + 11093, + 11047, + 11082, + 11016, + 11042, + 11036, + 11064, + 11053, + 11103, + 11096, + 11027, + 11033, + 11024, + 11036, + 11033, + 11435, + 11046, + 11059, + 11093, + 11057, + 11042, + 11093, + 11046, + 11061, + 11077, + 11072, + 11050, + 11024, + 11044, + 11107, + 11053, + 11035, + 11047, + 11066, + 11044, + 11035, + 11083, + 11027, + 11075, + 11046, + 11032, + 11041, + 11049, + 11048, + 11046, + 11050, + 11099, + 11045, + 11079, + 11032, + 11059, + 11038, + 11064, + 11079, + 11012, + 11021, + 11068, + 11035, + 11077, + 11077, + 11026, + 11051, + 11050, + 11063, + 11022, + 11074, + 11059, + 11052, + 11036, + 11036, + 11077, + 11042, + 11074, + 11077, + 11046, + 11035, + 14145, + 11053, + 11058, + 11050, + 11085, + 11048, + 11041, + 11033, + 11051, + 11052, + 11084, + 11035, + 11063, + 11072, + 11125, + 11084, + 11049, + 11050, + 11088, + 11052, + 11048, + 11536, + 11011, + 11075, + 11020, + 11075, + 11047, + 11023, + 11057, + 11030, + 11077, + 11057, + 11069, + 11043, + 11037, + 11063, + 11039, + 11034, + 11108, + 11049, + 11055, + 11030, + 11070, + 11039, + 11040, + 11034, + 11059, + 11085, + 11048, + 11080, + 11041, + 11079, + 11048, + 11036, + 11020, + 11031, + 11072, + 11166, + 11034, + 11024, + 11070, + 11062, + 11050, + 11051, + 11035, + 11027, + 11025, + 11068, + 11075, + 11040, + 11069, + 11057, + 11036, + 11062, + 11058, + 11029, + 11019, + 11032, + 11023, + 11058, + 11049, + 11073, + 11063, + 11068, + 11080, + 11086, + 11060, + 11073, + 11086, + 11031, + 11043, + 11033, + 11032, + 11059, + 11055, + 11060, + 11024, + 11051, + 11033, + 11090, + 11080, + 11052, + 11081, + 11127, + 11035, + 11061, + 11068, + 11068, + 11101, + 11068, + 11067, + 11052, + 11045, + 11079, + 11083, + 11088, + 11068, + 11039, + 11074, + 11020, + 11039, + 11067, + 11060, + 11061, + 11048, + 11030, + 11042, + 11076, + 11083, + 11035, + 11043, + 11057, + 11050, + 11030, + 11031, + 11060, + 11066, + 11064, + 11030, + 11033, + 11064, + 11059, + 11047, + 11063, + 11027, + 11026, + 11061, + 11053, + 11050, + 11059, + 11065, + 11058, + 11048, + 11032, + 11036, + 11134, + 11060, + 11085, + 11043, + 11051, + 11045, + 11089, + 11101, + 11035, + 11032, + 11056, + 11051, + 11031, + 11034, + 11054, + 11039, + 11064, + 11027, + 11038, + 11035, + 11055, + 11049, + 11076, + 11054, + 11025, + 11051, + 11085, + 11033, + 11044, + 11025, + 11043, + 11072, + 11032, + 11030, + 11190, + 11057, + 11065, + 11087, + 11067, + 11016, + 11061, + 11052, + 11019, + 11029, + 11084, + 11027, + 11076, + 11030, + 11109, + 11103, + 11052, + 11081, + 11048, + 11122, + 11066, + 11029, + 11063, + 11022, + 11019, + 11033, + 11092, + 11070, + 11071, + 11099, + 11059, + 11035, + 11044, + 11049, + 11054, + 11049, + 11096, + 11050, + 11032, + 11046, + 11116, + 11853, + 11039, + 11032, + 11064, + 11065, + 11068, + 11072, + 11047, + 11073, + 11014, + 11020, + 11093, + 11048, + 11015, + 11079, + 11064, + 11059, + 11049, + 11031, + 11037, + 11044, + 11079, + 11038, + 11068, + 11050, + 11032, + 11061, + 11401, + 11049, + 11056, + 11073, + 11081, + 11065, + 11069, + 11080, + 11056, + 11041, + 11029, + 11085, + 11039, + 11059, + 11058, + 11043, + 11047, + 11032, + 11022, + 11087, + 11028, + 11063, + 11046, + 11068, + 11066, + 11048, + 11054, + 11040, + 11049, + 11048, + 11022, + 11080, + 11061, + 11067, + 11090, + 11051, + 11026, + 11042, + 11037, + 11064, + 11016, + 11053, + 11067, + 11027, + 11073, + 11019, + 11038, + 11046, + 11031, + 11118, + 11069, + 11078, + 11022, + 11080, + 11045, + 11041, + 11040, + 11034, + 11043, + 11022, + 11035, + 11056, + 11062, + 11058, + 11034, + 11036, + 11065, + 11023, + 11049, + 11058, + 11044, + 11053, + 11038, + 11046, + 11027, + 11027, + 11042, + 11031, + 11026, + 11051, + 11068, + 11054, + 11048, + 11039, + 11054, + 11060, + 11020, + 11055, + 11080, + 11056, + 11058, + 11045, + 11090, + 11022, + 11024, + 11034, + 11062, + 11037, + 11079, + 11057, + 11027, + 11033, + 11045, + 11040, + 11030, + 11028, + 11033, + 11032, + 11088, + 11053, + 11048, + 11062, + 11060, + 11045, + 11066, + 11025, + 11044, + 11058, + 11059, + 11040, + 11070, + 11058, + 11072, + 11084, + 11060, + 11022, + 11069, + 11038, + 11020, + 11045, + 11025, + 11084, + 11047, + 11050, + 11124, + 11031, + 11061, + 11048, + 11042, + 11048, + 11041, + 11046, + 11060, + 11077, + 11045, + 11070, + 11094, + 11048, + 11074, + 11075, + 11071, + 11083, + 11068, + 11054, + 11080, + 11076, + 11044, + 11042, + 11058, + 11086, + 11097, + 11044, + 11047, + 11066, + 11079, + 11040, + 11017, + 11070, + 11066, + 11078, + 11051, + 11038, + 11032, + 11044, + 11033, + 11052, + 11030, + 11036, + 11024, + 11087, + 11066, + 11063, + 11110, + 11065, + 11103, + 11033, + 11092, + 11027, + 11079, + 11100, + 11053, + 11075, + 11040, + 11080, + 11040, + 11054, + 11035, + 11030, + 11006, + 11085, + 11048, + 11042, + 11052, + 11068, + 11021, + 11067, + 11086, + 11051, + 11026, + 11107, + 11023, + 11049, + 11039, + 11050, + 11072, + 11050, + 11071, + 11193, + 11029, + 11443, + 11035, + 11054, + 11067, + 11030, + 11030, + 11015, + 11081, + 11060, + 11047, + 14197, + 11078, + 11053, + 11041, + 11055, + 11002, + 11074, + 11021, + 11038, + 11042, + 11265, + 11024, + 11052, + 11076, + 11152, + 11059, + 11080, + 11067, + 11050, + 11063, + 11041, + 11050, + 11021, + 11021, + 11053, + 11021, + 11050, + 11056, + 11074, + 11077, + 11046, + 11036, + 11096, + 11076, + 11035, + 11027, + 11045, + 11058, + 11029, + 11037, + 11052, + 11054, + 11028, + 11072, + 11545, + 11063, + 11040, + 11027, + 11044, + 11031, + 11034, + 11015, + 11035, + 11076, + 11105, + 11046, + 11073, + 11040, + 11040, + 11062, + 11030, + 11026, + 11045, + 11069, + 11043, + 11025, + 11054, + 11080, + 11080, + 11111, + 11063, + 11058, + 11114, + 11082, + 11051, + 11083, + 11048, + 11174, + 11045, + 11033, + 11051, + 11036, + 11102, + 11077, + 11039, + 11022, + 11036, + 11047, + 11078, + 11037, + 11065, + 11060, + 11033, + 11018, + 11056, + 11028, + 11056, + 11056, + 11057, + 11062, + 11045, + 11029, + 11055, + 11049, + 11012, + 11044, + 11041, + 11019, + 11035, + 11052, + 11072, + 11051, + 11052, + 11023, + 11093, + 11067, + 11042, + 11067, + 11042, + 11053, + 11070, + 11036, + 11052, + 11057, + 11045, + 11047, + 11050, + 11089, + 11036, + 11053, + 11043, + 11013, + 11054, + 11039, + 11144, + 11048, + 11053, + 11073, + 11064, + 11044, + 11045, + 11075, + 11079, + 11072, + 11044, + 11079, + 11045, + 11055, + 11038, + 11017, + 11058, + 11047, + 11044, + 11064, + 11107, + 11073, + 11076, + 11073, + 11015, + 11023, + 11063, + 11067, + 11124, + 11067, + 11067, + 11020, + 11060, + 11036, + 11045, + 11287, + 11044, + 11020, + 11024, + 11038, + 11007, + 11039, + 11010, + 11048, + 11005, + 11087, + 11050, + 11072, + 11045, + 11065, + 11053, + 11059, + 11086, + 11048, + 11054, + 11052, + 11040, + 11078, + 11070, + 11083, + 11055, + 11054, + 11066, + 11060, + 11058, + 11056, + 11051, + 11061, + 11044, + 11083, + 11026, + 11065, + 11052, + 11068, + 11034, + 11066, + 11074, + 11077, + 11046, + 11043, + 11058, + 11052, + 11066, + 11086, + 11025, + 11056, + 11082, + 11077, + 11070, + 11086, + 11029, + 11036, + 11043, + 11035, + 11059, + 11038, + 11100, + 11077, + 12440, + 11072, + 11044, + 11116, + 11105, + 11040, + 11023, + 11050, + 11072, + 11038, + 11085, + 11043, + 11029, + 11034, + 11033, + 11086, + 11044, + 11023, + 11038, + 11021, + 11064, + 11044, + 11051, + 11086, + 11035, + 11044, + 11105, + 11085, + 11022, + 11057, + 11057, + 11007, + 11020, + 11099, + 11032, + 11026, + 11038, + 11070, + 11087, + 11064, + 11040, + 11056, + 11051, + 11055, + 11048, + 11056, + 11030, + 11078, + 11034, + 11062, + 11067, + 11081, + 11051, + 11083, + 11108, + 11041, + 11036, + 11009, + 11045, + 11044, + 11037, + 11041, + 11071, + 11045, + 11042, + 11065, + 11054, + 11031, + 11046, + 11053, + 11055, + 11060, + 11067, + 11007, + 11028, + 11061, + 11025, + 11095, + 11022, + 11056, + 11059, + 11034, + 11049, + 11039, + 11048, + 11048, + 11061, + 11064, + 11087, + 11064, + 11045, + 11056, + 11036, + 11186, + 11042, + 11048, + 11069, + 11032, + 11046, + 11069, + 11018, + 11106, + 11027, + 11037, + 11051, + 11036, + 11054, + 11097, + 11055, + 11002, + 11050, + 11078, + 11056, + 11057, + 11069, + 11044, + 11050, + 11083, + 11036, + 11053, + 11101, + 11055, + 11051, + 11048, + 11112, + 11048, + 11072, + 11054, + 11050, + 11044, + 11127, + 11042, + 11025, + 11053, + 11040, + 11086, + 11030, + 11039, + 11106, + 11052, + 11059, + 11062, + 11031, + 11115, + 11072, + 11112, + 11059, + 11036, + 11055, + 11073, + 11061, + 11030, + 11064, + 11047, + 11063, + 11080, + 11028, + 11047, + 11025, + 11059, + 11056, + 11056, + 11054, + 11080, + 11074, + 11029, + 11051, + 11040, + 11058, + 11080, + 11065, + 11076, + 11063, + 11033, + 11049, + 11044, + 11076, + 11080, + 11038, + 11037, + 11058, + 11061, + 11083, + 11068, + 11049, + 11044, + 11046, + 11114, + 11346, + 11031, + 11040, + 11040, + 11065, + 11037, + 11053, + 11023, + 11034, + 11058, + 11045, + 11032, + 11073, + 11062, + 11022, + 11125, + 11043, + 11062, + 11071, + 11076, + 11050, + 11036, + 11037, + 11036, + 11070, + 11041, + 11078, + 11035, + 11051, + 11036, + 11078, + 11064, + 11048, + 11061, + 11045, + 11022, + 11046, + 11055, + 11050, + 11036, + 11043, + 11013, + 11045, + 11044, + 11065, + 11037, + 11080, + 11046, + 11030, + 11070, + 11044, + 11054, + 11055, + 11041, + 11036, + 11033, + 11080, + 11058, + 11042, + 11039, + 11046, + 14266, + 11056, + 11019, + 11033, + 11029, + 11029, + 11087, + 11025, + 11078, + 11026, + 11077, + 11059, + 11059, + 11050, + 11033, + 11051, + 11025, + 11038, + 11061, + 11085, + 11070, + 11061, + 11023, + 11062, + 11068, + 11052, + 11043, + 11057, + 11018, + 11061, + 11062, + 12146, + 11057, + 11064, + 11039, + 11038, + 11050, + 11064, + 11080, + 11062, + 11029, + 11053, + 11034, + 11038, + 11051, + 11054, + 11120, + 11064, + 11029, + 11061, + 11067, + 11039, + 11022, + 11042, + 11079, + 11041, + 11072, + 11044, + 11020, + 11083, + 11050, + 11112, + 11086, + 11028, + 11060, + 11049, + 11093, + 11057, + 11048, + 11035, + 11045, + 11050, + 11044, + 11072, + 11069, + 11049, + 11063, + 11025, + 11105, + 11028, + 11054, + 11047, + 11052, + 11073, + 11083, + 11010, + 11036, + 11053, + 11032, + 11077, + 11066, + 11081, + 11054, + 11027, + 11033, + 11034, + 11075, + 11089, + 11069, + 11073, + 11041, + 11103, + 11081, + 11076, + 11084, + 11061, + 11043, + 11023, + 11063, + 11081, + 11061, + 11102, + 11129, + 11072, + 11028, + 11024, + 11051, + 11023, + 11107, + 11091, + 11081, + 11025, + 11036, + 11264, + 11114, + 11037, + 11053, + 11060, + 11025, + 11055, + 11052, + 11024, + 11021, + 11036, + 11048, + 11043, + 11058, + 11053, + 11528, + 11034, + 11100, + 11029, + 11080, + 11030, + 11055, + 11045, + 11034, + 11040, + 11064, + 11048, + 11035, + 11055, + 11049, + 11026, + 11083, + 11018, + 11059, + 11066, + 11080, + 11058, + 11065, + 11055, + 11049, + 11034, + 11048, + 11041, + 11100, + 11039, + 11021, + 11028, + 11014, + 11051, + 11067, + 11015, + 11047, + 11064, + 11050, + 11088, + 11071, + 11039, + 11038, + 11056, + 11062, + 11043, + 11046, + 11091, + 11041, + 11065, + 11049, + 11047, + 11011, + 11034, + 11066, + 11034, + 11037, + 11063, + 11022, + 11082, + 11033, + 11037, + 11326, + 11047, + 11044, + 11070, + 11068, + 11056, + 11046, + 11045, + 11038, + 11070, + 11080, + 11033, + 11039, + 11058, + 11120, + 11046, + 11082, + 11040, + 11067, + 11064, + 11043, + 11056, + 11072, + 11064, + 11101, + 11052, + 11067, + 11040, + 11067, + 11058, + 11033, + 11027, + 11023, + 11090, + 11063, + 11064, + 11028, + 11048, + 11045, + 11016, + 11149, + 11038, + 11058, + 11069, + 11044, + 11078, + 11068, + 11058, + 11025, + 11044, + 11069, + 11065, + 11021, + 11028, + 11070, + 11053, + 11043, + 11077, + 11062, + 12245, + 11049, + 11068, + 11098, + 11046, + 11060, + 11013, + 11054, + 11040, + 11040, + 11055, + 11042, + 11057, + 11021, + 11036, + 11056, + 11046, + 11097, + 11029, + 11027, + 11032, + 11042, + 11063, + 11079, + 11054, + 11016, + 11043, + 11056, + 11064, + 11068, + 11051, + 11071, + 11096, + 11018, + 11025, + 11055, + 11026, + 11033, + 11060, + 11062, + 11032, + 11046, + 11035, + 11044, + 11035, + 11033, + 11015, + 11033, + 11040, + 11066, + 11028, + 11025, + 11080, + 11051, + 11034, + 11032, + 11029, + 11048, + 11036, + 11032, + 11033, + 11074, + 11012, + 11032, + 11029, + 11032, + 11139, + 11019, + 11060, + 11042, + 11067, + 11056, + 11023, + 11065, + 11031, + 11029, + 11030, + 11051, + 11016, + 11078, + 11035, + 11055, + 11032, + 11032, + 11068, + 11076, + 11042, + 11062, + 11026, + 11064, + 11069, + 11021, + 11068, + 11077, + 11021, + 11199, + 11045, + 11041, + 11034, + 11043, + 11052, + 11038, + 11048, + 11054, + 11061, + 11075, + 11057, + 11068, + 11067, + 11018, + 11078, + 11011, + 11056, + 11090, + 11066, + 11074, + 11056, + 11034, + 11056, + 11073, + 11082, + 11024, + 11036, + 11017, + 11066, + 11064, + 11059, + 11071, + 11046, + 11024, + 11039, + 11076, + 11040, + 11034, + 11037, + 11035, + 11010, + 11107, + 11086, + 11058, + 11017, + 11030, + 11054, + 11034, + 11048, + 11049, + 11040, + 11013, + 11039, + 11052, + 11061, + 11076, + 11034, + 11083, + 11078, + 11042, + 11068, + 11046, + 11048, + 11007, + 11061, + 11046, + 11062, + 11055, + 11071, + 11055, + 11054, + 11060, + 11174, + 11023, + 11068, + 11093, + 11058, + 11058, + 11050, + 11042, + 11041, + 11031, + 11067, + 11042, + 11062, + 11036, + 11057, + 11057, + 11077, + 11067, + 11071, + 11043, + 11141, + 11025, + 11061, + 11047, + 11074, + 11042, + 11035, + 11052, + 11039, + 11074, + 11043, + 11076, + 11066, + 11042, + 11052, + 11104, + 11071, + 11065, + 11064, + 11057, + 11098, + 11101, + 11047, + 11093, + 11046, + 11022, + 11048, + 11054, + 11086, + 11017, + 11054, + 11014, + 11027, + 11033, + 11066, + 11052, + 11085, + 11057, + 11066, + 11055, + 11068, + 11093, + 11070, + 11072, + 11078, + 11616, + 11035, + 11013, + 11033, + 11024, + 11052, + 11110, + 11046, + 11046, + 11046, + 11060, + 11050, + 11067, + 11036, + 11061, + 11029, + 11053, + 11031, + 11075, + 11050, + 11068, + 11077, + 11051, + 11047, + 11052, + 11044, + 11035, + 11062, + 11083, + 11052, + 11074, + 11087, + 19041, + 11046, + 11069, + 11048, + 11051, + 11024, + 11085, + 11079, + 11086, + 11059, + 11036, + 11066, + 11047, + 11101, + 11074, + 11065, + 11061, + 11050, + 11022, + 11055, + 11041, + 11063, + 11101, + 11042, + 11062, + 11063, + 11033, + 11051, + 11034, + 11054, + 11031, + 11059, + 11022, + 11035, + 11044, + 11064, + 11023, + 11031, + 11054, + 11065, + 11050, + 11043, + 11060, + 11033, + 11096, + 11066, + 11105, + 11077, + 11070, + 11052, + 11088, + 11055, + 11092, + 11025, + 11046, + 11044, + 11043, + 11054, + 11060, + 11041, + 11087, + 11082, + 11049, + 11059, + 11086, + 11063, + 11100, + 11035, + 11037, + 11063, + 11058, + 11070, + 11034, + 11078, + 11056, + 11017, + 11033, + 11048, + 11061, + 11011, + 11036, + 11022, + 11048, + 11062, + 11059, + 11049, + 11043, + 11063, + 11047, + 11060, + 11037, + 11031, + 11041, + 11069, + 11088, + 11030, + 11046, + 11053, + 11024, + 11016, + 11058, + 11021, + 11086, + 11103, + 11051, + 11042, + 11080, + 11033, + 11061, + 11040, + 11077, + 11051, + 11030, + 11032, + 11056, + 11035, + 11074, + 11035, + 11065, + 11043, + 11077, + 11094, + 11012, + 11321, + 11054, + 11041, + 11104, + 11068, + 11093, + 11051, + 11095, + 11040, + 11114, + 11052, + 11055, + 11061, + 11067, + 11063, + 11024, + 11048, + 11028, + 11054, + 11054, + 11011, + 11076, + 11059, + 11031, + 11048, + 11038, + 11046, + 11033, + 11066, + 11207, + 11038, + 11060, + 11051, + 11045, + 11031, + 11016, + 11049, + 11075, + 11085, + 11046, + 11034, + 11052, + 11103, + 11086, + 11018, + 11047, + 11046, + 11059, + 11048, + 11069, + 11073, + 11048, + 11081, + 11015, + 11062, + 11051, + 11023, + 11054, + 11047, + 11063, + 11275, + 11040, + 11055, + 11081, + 11054, + 11002, + 11053, + 11062, + 11044, + 11062, + 11144, + 11030, + 11049, + 11042, + 11029, + 11057, + 11068, + 11049, + 11073, + 11044, + 11030, + 11028, + 11057, + 11029, + 11020, + 11025, + 11072, + 11066, + 11048, + 11014, + 11067, + 11039, + 11034, + 11075, + 11022, + 11060, + 11068, + 11061, + 11037, + 11050, + 11057, + 11070, + 11068, + 11027, + 11041, + 11048, + 11030, + 11047, + 11053, + 11009, + 11069, + 11067, + 11097, + 11064, + 11042, + 11051, + 11035, + 11015, + 11063, + 11038, + 11051, + 11054, + 11045, + 11275, + 11049, + 11061, + 11083, + 11078, + 11065, + 11021, + 11038, + 11074, + 11054, + 11086, + 11060, + 11056, + 11056, + 11054, + 11091, + 11059, + 11041, + 11048, + 11061, + 11030, + 11081, + 11022, + 11062, + 11078, + 11057, + 11083, + 11034, + 11042, + 11049, + 11031, + 11063, + 11035, + 11044, + 12791, + 11037, + 11071, + 11055, + 11025, + 11058, + 11033, + 11037, + 11031, + 11085, + 11044, + 11056, + 11043, + 11067, + 11136, + 11035, + 11080, + 11062, + 11059, + 11024, + 11055, + 11038, + 11061, + 11042, + 11102, + 11025, + 11046, + 11040, + 11064, + 11034, + 11049, + 11023, + 11019, + 11083, + 11098, + 11050, + 11095, + 11070, + 11058, + 11033, + 11059, + 11359, + 11092, + 11039, + 11056, + 11082, + 11079, + 11026, + 11065, + 11062, + 11043, + 11050, + 11050, + 11035, + 11043, + 11037, + 11065, + 11039, + 11068, + 11058, + 11042, + 11071, + 11025, + 11052, + 11068, + 11029, + 11038, + 11050, + 11039, + 11042, + 11041, + 11055, + 11112, + 11051, + 11023, + 11091, + 11033, + 11052, + 11067, + 11033, + 11087, + 11053, + 11094, + 11059, + 11044, + 11039, + 11034, + 11026, + 11063, + 11067, + 11057, + 11056, + 11071, + 11056, + 11019, + 11073, + 11031, + 11042, + 11053, + 11065, + 11024, + 11040, + 11039, + 11049, + 11062, + 11025, + 11048, + 11052, + 11062, + 11077, + 11072, + 11040, + 11021, + 11052, + 11033, + 11059, + 11028, + 11072, + 11066, + 11340, + 11085, + 11075, + 11042, + 11056, + 11078, + 11063, + 11200, + 11038, + 11034, + 11038, + 11011, + 11054, + 11046, + 11043, + 11034, + 11076, + 11084, + 11061, + 11051, + 11079, + 11013, + 11023, + 11058, + 11055, + 11030, + 11033, + 11066, + 11052, + 11046, + 11048, + 11104, + 11076, + 11061, + 11013, + 11041, + 11057, + 11081, + 11030, + 11020, + 11028, + 11067, + 11027, + 11114, + 11118, + 11098, + 11030, + 11093, + 11036, + 11072, + 11054, + 11056, + 11057, + 11060, + 11075, + 11047, + 11051, + 11073, + 11062, + 11079, + 11029, + 11038, + 11035, + 11076, + 11072, + 11022, + 11056, + 11067, + 11050, + 11061, + 11026, + 11011, + 11041, + 11056, + 11039, + 11065, + 11069, + 11039, + 11042, + 11045, + 11061, + 11068, + 11038, + 11022, + 11058, + 11069, + 11046, + 11074, + 11041, + 11044, + 11048, + 11096, + 11018, + 11020, + 11084, + 11027, + 11050, + 11080, + 11091, + 11045, + 11041, + 11090, + 11067, + 11087, + 11006, + 11090, + 11009, + 11117, + 11049, + 11046, + 11046, + 13871, + 11046, + 11047, + 11043, + 11074, + 11046, + 11059, + 11056, + 11045, + 11035, + 11075, + 11036, + 11040, + 11023, + 11039, + 11030, + 11100, + 11028, + 11077, + 11015, + 11058, + 11061, + 11055, + 11044, + 11046, + 11067, + 11089, + 11442, + 11026, + 11048, + 11053, + 11058, + 11168, + 11014, + 11067, + 11060, + 11083, + 11043, + 11023, + 11009, + 11076, + 11049, + 11037, + 11047, + 11033, + 11024, + 11059, + 11134, + 11055, + 11042, + 11072, + 11098, + 11084, + 11050, + 11026, + 11044, + 11064, + 11081, + 11056, + 11066, + 11035, + 11050, + 11036, + 11072, + 11074, + 11064, + 11040, + 11058, + 11049, + 11062, + 11048, + 11053, + 11059, + 11055, + 11080, + 11054, + 11019, + 11026, + 11054, + 11046, + 11041, + 11026, + 11053, + 11135, + 11026, + 11033, + 11035, + 11060, + 11044, + 11062, + 11035, + 11059, + 11066, + 11090, + 11039, + 11057, + 11042, + 11078, + 11029, + 11038, + 11091, + 11046, + 11038, + 11046, + 11057, + 11043, + 11056, + 11074, + 11033, + 11047, + 11046, + 11059, + 11065, + 11028, + 11052, + 11055, + 11073, + 11035, + 11103, + 11071, + 11056, + 11090, + 11025, + 11031, + 11057, + 11094, + 11051, + 11036, + 11022, + 11069, + 11063, + 11024, + 11025, + 11118, + 11061, + 11051, + 11065, + 11070, + 11049, + 11048, + 11057, + 11057, + 11043, + 14993, + 11057, + 11048, + 11072, + 11084, + 11050, + 11072, + 11089, + 11072, + 11080, + 11037, + 11048, + 11051, + 11051, + 11103, + 11030, + 11027, + 11078, + 11025, + 11094, + 11052, + 11038, + 11033, + 11033, + 11058, + 11123, + 11031, + 11024, + 11054, + 11053, + 11046, + 11044, + 11037, + 11047, + 11068, + 11048, + 11104, + 11027, + 11045, + 11066, + 11040, + 11057, + 11030, + 11034, + 11040, + 11020, + 11053, + 11040, + 11057, + 11044, + 11058, + 11303, + 11040, + 11046, + 11070, + 11069, + 11052, + 11075, + 11068, + 11044, + 11042, + 11024, + 11054, + 11045, + 11060, + 11075, + 11051, + 11067, + 11031, + 11035, + 11021, + 11027, + 11041, + 11088, + 11040, + 11039, + 11058, + 11067, + 11040, + 11058, + 11058, + 11061, + 11051, + 11021, + 11030, + 11050, + 11031, + 11012, + 11048, + 11041, + 11041, + 11076, + 11063, + 11059, + 11016, + 11057, + 11027, + 11074, + 11052, + 11037, + 11086, + 11009, + 11062, + 11053, + 11226, + 11043, + 11097, + 11051, + 11065, + 11062, + 11027, + 11055, + 11056, + 11049, + 11058, + 11036, + 11055, + 11057, + 11050, + 11066, + 11055, + 11076, + 11045, + 11025, + 11026, + 11094, + 11053, + 11042, + 11051, + 11060, + 11059, + 11044, + 11043, + 11050, + 11055, + 11072, + 11232, + 11035, + 11038, + 11054, + 11037, + 11044, + 11052, + 11068, + 11059, + 11038, + 11083, + 11096, + 11033, + 11069, + 11080, + 11076, + 11032, + 11067, + 11045, + 11084, + 11060, + 11056, + 11035, + 11077, + 11052, + 11019, + 11057, + 11043, + 11057, + 11045, + 11031, + 11018, + 11038, + 11073, + 11033, + 11058, + 11032, + 11036, + 11046, + 11055, + 11033, + 11075, + 11039, + 11035, + 11054, + 11060, + 11074, + 11040, + 11059, + 11088, + 11060, + 11052, + 11064, + 11019, + 11078, + 11104, + 11054, + 11065, + 11119, + 11059, + 11033, + 11077, + 11048, + 11060, + 11049, + 11068, + 11072, + 11458, + 11058, + 11042, + 11058, + 11083, + 11055, + 11046, + 11040, + 11069, + 11069, + 11044, + 11064, + 11057, + 11050, + 11033, + 11046, + 11056, + 11048, + 11058, + 11037, + 11083, + 11027, + 11061, + 11080, + 11097, + 11075, + 11062, + 11060, + 11094, + 11053, + 11043, + 11064, + 11016, + 11023, + 11064, + 11061, + 11058, + 11040, + 11067, + 11052, + 11057, + 11033, + 11055, + 11022, + 11024, + 11791, + 11043, + 11087, + 11047, + 11062, + 11074, + 11017, + 11100, + 11055, + 11032, + 11056, + 11050, + 11036, + 11062, + 11056, + 11030, + 11051, + 11028, + 11088, + 11074, + 11075, + 11056, + 11063, + 11025, + 11039, + 11088, + 11079, + 11059, + 11086, + 11064, + 11115, + 11033, + 11060, + 11059, + 11047, + 11118, + 11008, + 11060, + 11071, + 11086, + 11050, + 11078, + 11104, + 11031, + 11053, + 11099, + 11064, + 11020, + 11071, + 11067, + 12166, + 11064, + 11062, + 11026, + 11057, + 11047, + 11407, + 11063, + 11055, + 11085, + 11056, + 11075, + 11027, + 11044, + 11041, + 11069, + 11042, + 11034, + 11034, + 11093, + 11059, + 11063, + 11053, + 11026, + 11097, + 11055, + 11077, + 11039, + 11021, + 11054, + 11049, + 11059, + 11026, + 11106, + 11076, + 11066, + 11052, + 11075, + 11085, + 11034, + 11067, + 21394, + 11060, + 11031, + 11064, + 11042, + 11044, + 11044, + 11043, + 11047, + 11063, + 11043, + 11036, + 11071, + 11039, + 11019, + 11045, + 11060, + 11033, + 11064, + 11065, + 11104, + 11087, + 11076, + 11078, + 11076, + 11045, + 11050, + 11085, + 11077, + 11046, + 11064, + 11043, + 11147, + 11038, + 11064, + 11099, + 11027, + 11048, + 11058, + 11050, + 11068, + 11052, + 11027, + 11041, + 11061, + 11029, + 11059, + 11072, + 11158, + 11109, + 11068, + 11041, + 11047, + 11062, + 11026, + 11047, + 11147, + 11066, + 11037, + 11099, + 11048, + 11031, + 11081, + 11054, + 11052, + 11052, + 11011, + 11093, + 11051, + 11052, + 11041, + 11072, + 11085, + 11067, + 11069, + 11030, + 11026, + 11038, + 11043, + 11035, + 11017, + 11044, + 11067, + 11083, + 11039, + 11036, + 11071, + 11026, + 11039, + 11044, + 11099, + 11074, + 11031, + 11064, + 11063, + 11050, + 11031, + 11036, + 11054, + 11043, + 11064, + 11051, + 11048, + 11056, + 11090, + 11020, + 11057, + 11073, + 11032, + 11061, + 11106, + 11032, + 11095, + 11062, + 11073, + 11065, + 11075, + 11055, + 11052, + 11062, + 11048, + 11026, + 11137, + 11056, + 11070, + 11089, + 11050, + 11048, + 11061, + 11060, + 11060, + 11055, + 11067, + 11057, + 11041, + 11041, + 11014, + 11046, + 11028, + 11057, + 11040, + 11044, + 11043, + 11035, + 11093, + 11051, + 11061, + 11040, + 11047, + 11030, + 11031, + 11056, + 11033, + 11090, + 11047, + 11074, + 11058, + 11057, + 11044, + 11018, + 11067, + 11102, + 11024, + 11055, + 11044, + 11078, + 11075, + 11034, + 11056, + 11053, + 11068, + 11035, + 11083, + 11029, + 11048, + 11028, + 11078, + 11081, + 11028, + 11057, + 11078, + 11027, + 11079, + 11051, + 11048, + 11077, + 11051, + 11036, + 11025, + 11023, + 11045, + 11084, + 11057, + 11058, + 11085, + 11060, + 11041, + 11074, + 11028, + 11075, + 11061, + 11042, + 11023, + 11061, + 11026, + 11060, + 11050, + 11054, + 11038, + 11067, + 11087, + 11050, + 11044, + 11078, + 11084, + 11052, + 11047, + 11086, + 11086, + 11063, + 11030, + 11084, + 11058, + 11026, + 11024, + 11081, + 11047, + 11067, + 11061, + 11068, + 11096, + 11040, + 11068, + 11023, + 11021, + 11069, + 11098, + 11061, + 11032, + 11078, + 11045, + 11032, + 11050, + 11053, + 11034, + 11029, + 11029, + 11059, + 11087, + 11073, + 11038, + 11065, + 11062, + 11038, + 11079, + 11031, + 11048, + 11027, + 11080, + 11033, + 11050, + 11062, + 11022, + 11036, + 11028, + 11053, + 11022, + 11032, + 11030, + 11057, + 11062, + 11052, + 11054, + 11065, + 11049, + 11073, + 11021, + 11060, + 11039, + 11056, + 11065, + 11045, + 11040, + 11030, + 16510, + 11039, + 11065, + 11067, + 11048, + 11074, + 11064, + 11043, + 11034, + 11062, + 11102, + 11062, + 11089, + 11055, + 11059, + 11036, + 11001, + 11046, + 11064, + 11030, + 11046, + 11033, + 11038, + 11049, + 11074, + 11057, + 11073, + 11062, + 11045, + 11023, + 11026, + 11036, + 11048, + 11101, + 11068, + 11053, + 11039, + 11047, + 11080, + 11057, + 11038, + 11076, + 11055, + 11052, + 11077, + 11061, + 11081, + 11059, + 11024, + 11064, + 11093, + 11057, + 11049, + 11080, + 11052, + 11061, + 11072, + 11034, + 11073, + 11029, + 11032, + 11029, + 11022, + 11071, + 11061, + 11046, + 11046, + 11046, + 11123, + 11070, + 11081, + 11051, + 11080, + 11048, + 11062, + 11051, + 11064, + 11054, + 11050, + 11015, + 11068, + 11050, + 11067, + 11024, + 11048, + 11065, + 11035, + 11072, + 11032, + 11045, + 11014, + 11028, + 11059, + 11038, + 11033, + 11051, + 11059, + 11024, + 11090, + 11081, + 11096, + 11064, + 11072, + 11295, + 11020, + 11054, + 11008, + 11060, + 11072, + 11023, + 11047, + 11049, + 11057, + 11039, + 11028, + 11045, + 11063, + 11042, + 11075, + 11054, + 11047, + 11036, + 11060, + 11088, + 11098, + 11071, + 11042, + 11060, + 11062, + 11063, + 11044, + 11069, + 11102, + 11019, + 11067, + 11047, + 11025, + 11047, + 11044, + 11069, + 11032, + 11044, + 11039, + 11015, + 11055, + 11086, + 11051, + 11046, + 11055, + 11058, + 11063, + 11029, + 11055, + 11077, + 11186, + 11076, + 11069, + 11067, + 11025, + 11037, + 10988, + 11083, + 11062, + 11059, + 11075, + 11031, + 11108, + 11036, + 11051, + 11019, + 11036, + 11060, + 11016, + 11056, + 11067, + 11020, + 11042, + 11075, + 11038, + 11046, + 11065, + 11063, + 11065, + 11066, + 11060, + 11034, + 11027, + 11040, + 11073, + 11118, + 11035, + 11069, + 11032, + 11023, + 11043, + 11054, + 11013, + 11042, + 11038, + 11034, + 11103, + 11037, + 11029, + 11023, + 11064, + 11032, + 11047, + 11049, + 11024, + 11062, + 11077, + 11044, + 11044, + 11027, + 11018, + 11018, + 11010, + 11072, + 11072, + 11052, + 11062, + 11084, + 11060, + 11063, + 11037, + 11035, + 11024, + 11051, + 11075, + 11032, + 11063, + 11056, + 11024, + 11054, + 11021, + 11071, + 11035, + 11039, + 11026, + 11038, + 11062, + 11022, + 11038, + 11078, + 11071, + 11037, + 11049, + 11043, + 11095, + 11119, + 11015, + 11016, + 11055, + 11032, + 11037, + 11084, + 11061, + 11033, + 11072, + 11146, + 11054, + 11037, + 11068, + 11069, + 11107, + 11031, + 11119, + 11092, + 11075, + 11048, + 11057, + 11096, + 11022, + 11054, + 11041, + 11027, + 11058, + 11052, + 11089, + 11022, + 11055, + 11049, + 11053, + 11034, + 11123, + 11028, + 11086, + 11070, + 11044, + 11028, + 11055, + 11062, + 11086, + 11075, + 11023, + 11039, + 11026, + 11102, + 11027, + 11057, + 11031, + 11023, + 11051, + 11011, + 11045, + 11053, + 11076, + 11046, + 11074, + 11056, + 11126, + 11080, + 11366, + 11037, + 11047, + 11055, + 11051, + 11451, + 11041, + 11051, + 11060, + 11060, + 11018, + 11051, + 11025, + 11037, + 11026, + 11022, + 11030, + 11040, + 11035, + 11096, + 11041, + 11043, + 11021, + 11026, + 11079, + 11089, + 11077, + 11063, + 11024, + 11090, + 11048, + 11021, + 11031, + 11055, + 11084, + 11031, + 11107, + 11036, + 11052, + 11099, + 11060, + 11048, + 11077, + 11025, + 11058, + 11084, + 11032, + 11071, + 11057, + 11070, + 11057, + 11036, + 11016, + 11060, + 11079, + 11028, + 11059, + 11035, + 11029, + 11051, + 11065, + 11084, + 11061, + 11069, + 11095, + 11034, + 11071, + 11050, + 11079, + 11036, + 11013, + 11042, + 11038, + 11058, + 11065, + 11031, + 11052, + 11054, + 11051, + 11077, + 11077, + 11058, + 11099, + 11109, + 11064, + 11031, + 11075, + 11063, + 11052, + 11054, + 11069, + 11042, + 11051, + 11080, + 11016, + 11012, + 11040, + 11037, + 11042, + 11071, + 11055, + 11049, + 11022, + 11028, + 11052, + 11058, + 11049, + 11045, + 11055, + 11090, + 11048, + 11025, + 11036, + 11014, + 11077, + 11054, + 11054, + 11047, + 11073, + 11038, + 11085, + 11058, + 11038, + 11041, + 11147, + 11064, + 11040, + 11073, + 11026, + 11066, + 11066, + 11066, + 11063, + 11056, + 11039, + 11040, + 11039, + 11050, + 11032, + 11027, + 11053, + 11024, + 11085, + 11044, + 11045, + 11019, + 11088, + 11057, + 11030, + 11077, + 11047, + 11032, + 11038, + 11043, + 11036, + 11036, + 11069, + 11081, + 11085, + 11045, + 11066, + 11075, + 11099, + 11092, + 11016, + 11061, + 11054, + 11057, + 11028, + 11061, + 11118, + 11021, + 11056, + 11049, + 11057, + 11070, + 11034, + 11045, + 11040, + 11030, + 11079, + 11047, + 11079, + 11073, + 11035, + 11055, + 11037, + 11028, + 11027, + 11031, + 11075, + 11006, + 11067, + 11036, + 11058, + 11041, + 11044, + 11045, + 11072, + 11079, + 11086, + 11078, + 11067, + 11029, + 11093, + 11050, + 11041, + 11038, + 11056, + 11045, + 11054, + 11035, + 11055, + 11073, + 11012, + 11043, + 11061, + 11020, + 11020, + 11058, + 11021, + 11068, + 11035, + 11071, + 11045, + 11023, + 11102, + 11037, + 11035, + 11048, + 11059, + 11016, + 11011, + 11105, + 11037, + 11090, + 11036, + 11069, + 11024, + 11074, + 11070, + 11050, + 11055, + 11072, + 11033, + 11044, + 11026, + 11048, + 11043, + 11017, + 11043, + 11051, + 11041, + 11050, + 11055, + 11060, + 11019, + 11041, + 11111, + 11054, + 11071, + 11060, + 11035, + 11067, + 11040, + 11012, + 11022, + 11046, + 11174, + 11052, + 11036, + 11049, + 11033, + 11070, + 11059, + 11066, + 11048, + 11046, + 11060, + 11030, + 11048, + 11028, + 11047, + 11058, + 11055, + 11053, + 11061, + 11090, + 11088, + 11054, + 11045, + 11087, + 11054, + 11065, + 11047, + 11046, + 11054, + 11078, + 11047, + 11048, + 11064, + 11033, + 11044, + 11057, + 11037, + 11085, + 11058, + 11034, + 11054, + 11051, + 11033, + 11072, + 11049, + 11034, + 11060, + 11038, + 11061, + 11017, + 11120, + 11019, + 11026, + 11063, + 11048, + 11037, + 11092, + 11063, + 11044, + 13224, + 11023, + 11032, + 11044, + 11065, + 11076, + 11043, + 11049, + 11066, + 11039, + 11026, + 11057, + 11045, + 11027, + 11048, + 11018, + 11029, + 11049, + 11068, + 11088, + 11032, + 11050, + 11070, + 11050, + 11098, + 11070, + 11059, + 11025, + 11069, + 11033, + 11072, + 11051, + 11072, + 11024, + 11099, + 11040, + 11056, + 11084, + 11042, + 11066, + 11135, + 11062, + 11066, + 11063, + 11025, + 11052, + 11044, + 11042, + 11069, + 11101, + 11055, + 11041, + 11044, + 11042, + 11068, + 11034, + 11026, + 11104, + 11039, + 11034, + 11056, + 11043, + 11033, + 11052, + 11063, + 11073, + 11042, + 11058, + 11044, + 11042, + 11086, + 11111, + 11045, + 11031, + 11053, + 11049, + 11056, + 11084, + 11039, + 11030, + 11039, + 11034, + 11018, + 11077, + 11082, + 11056, + 11038, + 11031, + 11086, + 11056, + 11050, + 11028, + 11029, + 11021, + 11038, + 11016, + 11087, + 11058, + 11033, + 11073, + 11042, + 11053, + 11067, + 11046, + 11023, + 11041, + 11040, + 11068, + 11066, + 11011, + 31674, + 11182, + 11081, + 11047, + 11028, + 11047, + 11050, + 11024, + 11032, + 11071, + 12014, + 11050, + 11079, + 11092, + 11041, + 11043, + 11015, + 11064, + 11047, + 11070, + 11045, + 11074, + 11045, + 11049, + 11051, + 11077, + 11016, + 11061, + 11024, + 11020, + 11061, + 11066, + 11041, + 11108, + 11048, + 11052, + 11026, + 11059, + 11035, + 11037, + 11071, + 11049, + 11036, + 11156, + 11040, + 11137, + 11042, + 11026, + 11790, + 11035, + 11066, + 11167, + 11067, + 11064, + 11043, + 11073, + 11072, + 11118, + 11036, + 11062, + 11047, + 11087, + 11576, + 11053, + 11068, + 11057, + 11045, + 11057, + 11083, + 11021, + 11033, + 11034, + 11045, + 11071, + 11080, + 11154, + 11023, + 11074, + 11037, + 11102, + 11059, + 11043, + 11045, + 11022, + 11059, + 11059, + 11035, + 11051, + 11051, + 11005, + 11048, + 11043, + 11036, + 11074, + 11061, + 11051, + 11066, + 11031, + 11063, + 11054, + 11045, + 11025, + 11082, + 11044, + 11027, + 11030, + 11083, + 11060, + 11051, + 11065, + 11063, + 11077, + 11066, + 11055, + 11029, + 11023, + 11043, + 11063, + 11056, + 11048, + 11036, + 11089, + 11068, + 11044, + 11052, + 11038, + 11054, + 11030, + 11046, + 11079, + 11046, + 11047, + 11054, + 11022, + 11040, + 11051, + 11078, + 11007, + 11048, + 11022, + 11046, + 11096, + 11077, + 11018, + 11048, + 11056, + 11059, + 11037, + 11053, + 11075, + 11042, + 11025, + 11067, + 11019, + 11040, + 11095, + 11058, + 11095, + 11047, + 11028, + 11044, + 11057, + 11051, + 11063, + 11035, + 11020, + 11046, + 11070, + 11029, + 11043, + 11055, + 11034, + 11027, + 11035, + 11031, + 11078, + 11050, + 11093, + 11072, + 11043, + 11088, + 11083, + 11041, + 11080, + 11028, + 11092, + 11078, + 11027, + 11028, + 11030, + 11024, + 11049, + 11043, + 11085, + 11068, + 11040, + 11029, + 11051, + 11188, + 11045, + 11076, + 11104, + 11050, + 11078, + 11050, + 11048, + 11069, + 11044, + 11048, + 11041, + 11082, + 11069, + 11066, + 11083, + 11023, + 11009, + 11037, + 11058, + 11038, + 11016, + 11046, + 11075, + 11087, + 11057, + 11020, + 11046, + 11018, + 11076, + 11049, + 11035, + 11042, + 11066, + 11001, + 11077, + 11036, + 11017, + 11054, + 11045, + 11093, + 11050, + 11049, + 11078, + 11025, + 11028, + 11062, + 11790, + 11057, + 11058, + 11055, + 11032, + 11068, + 11026, + 11066, + 11086, + 11077, + 11072, + 11078, + 11034, + 11065, + 11050, + 11021, + 11077, + 11040, + 11035, + 11035, + 11021, + 11037, + 11081, + 11043, + 11034, + 11058, + 11059, + 11033, + 11066, + 11036, + 11024, + 11058, + 11040, + 11034, + 11060, + 11071, + 11058, + 11051, + 11066, + 11072, + 11030, + 11084, + 11043, + 11049, + 11046, + 11064, + 11033, + 11045, + 11025, + 11094, + 11070, + 11024, + 11055, + 11050, + 11023, + 11030, + 11058, + 11070, + 11089, + 11024, + 11040, + 11101, + 11051, + 11041, + 11039, + 11059, + 11096, + 11065, + 11140, + 11080, + 11049, + 11049, + 11053, + 11106, + 11058, + 11032, + 11072, + 11063, + 11061, + 11050, + 11108, + 11055, + 11060, + 11062, + 11032, + 11037, + 11057, + 11040, + 11052, + 11044, + 11054, + 11075, + 11046, + 11068, + 11063, + 11014, + 11064, + 11077, + 11037, + 11068, + 11067, + 11073, + 11039, + 11053, + 11043, + 11064, + 11039, + 11043, + 11093, + 11008, + 11083, + 11020, + 11046, + 11051, + 11042, + 11044, + 11041, + 11050, + 11048, + 11115, + 11035, + 11042, + 11085, + 11044, + 11075, + 11022, + 11083, + 11037, + 11088, + 11082, + 11029, + 11075, + 11036, + 11093, + 11069, + 11043, + 11046, + 11039, + 11053, + 11054, + 11066, + 11026, + 11103, + 11078, + 11062, + 11098, + 11082, + 11071, + 11044, + 11031, + 11045, + 11049, + 11055, + 11099, + 11043, + 11061, + 11081, + 11039, + 11046, + 11049, + 11046, + 11048, + 11050, + 11060, + 11028, + 11095, + 11048, + 11052, + 11040, + 11055, + 11056, + 11062, + 11050, + 11012, + 11032, + 11304, + 11131, + 11030, + 11065, + 11060, + 11029, + 11111, + 11053, + 11030, + 11047, + 11042, + 11047, + 11087, + 11024, + 11024, + 11057, + 11082, + 11052, + 11024, + 11054, + 11070, + 11067, + 11018, + 11062, + 11041, + 11049, + 11036, + 11074, + 11092, + 11073, + 11062, + 11049, + 11057, + 11061, + 11033, + 11040, + 11081, + 11060, + 11043, + 11062, + 11044, + 11021, + 11046, + 11079, + 11055, + 11145, + 11050, + 11046, + 11060, + 11033, + 11070, + 11060, + 11047, + 11032, + 11056, + 11037, + 11070, + 11067, + 11089, + 11031, + 11094, + 11057, + 11016, + 11039, + 11072, + 11050, + 11040, + 11082, + 11023, + 11083, + 11082, + 11018, + 11109, + 11110, + 11062, + 11037, + 11076, + 11065, + 11010, + 11049, + 11674, + 11051, + 11042, + 11105, + 11054, + 11051, + 11073, + 11062, + 11033, + 11055, + 11068, + 11048, + 11034, + 11020, + 11053, + 11069, + 11042, + 11083, + 11016, + 11027, + 12513, + 11080, + 11063, + 11031, + 11054, + 11061, + 11082, + 11047, + 11036, + 11070, + 11040, + 11081, + 11047, + 11060, + 11072, + 11040, + 11037, + 11049, + 11025, + 11043, + 11019, + 11072, + 11045, + 11037, + 11050, + 11036, + 11038, + 11079, + 11044, + 11072, + 11051, + 11078, + 11068, + 11074, + 11056, + 11030, + 11050, + 11041, + 11039, + 11052, + 11060, + 11121, + 11030, + 11007, + 11023, + 11051, + 11057, + 11060, + 11040, + 11064, + 11076, + 11027, + 11025, + 11085, + 11051, + 11022, + 11041, + 11018, + 11041, + 11045, + 11056, + 11027, + 11069, + 11056, + 11030, + 11042, + 11021, + 11024, + 11086, + 11051, + 11085, + 11032, + 11068, + 11040, + 11069, + 11104, + 11038, + 11022, + 11022, + 11024, + 11335, + 11038, + 11068, + 11058, + 11087, + 11049, + 11126, + 11111, + 11055, + 11045, + 11043, + 11080, + 11071, + 11073, + 11019, + 11026, + 11064, + 11045, + 11006, + 11035, + 11055, + 11062, + 11091, + 11050, + 11068, + 11042, + 11060, + 11032, + 11085, + 11097, + 11057, + 11112, + 11032, + 11082, + 11067, + 11055, + 11046, + 11098, + 11030, + 11037, + 11085, + 11078, + 11061, + 11044, + 11067, + 11086, + 11074, + 11021, + 11071, + 11047, + 11029, + 11035, + 11046, + 11034, + 11052, + 11041, + 11048, + 11067, + 11048, + 11093, + 11048, + 11092, + 11043, + 11050, + 11044, + 11032, + 11053, + 11038, + 11055, + 11049, + 11065, + 11075, + 11024, + 11091, + 11093, + 11054, + 11044, + 11067, + 11066, + 11110, + 11082, + 11062, + 11081, + 11108, + 11028, + 11073, + 11080, + 11027, + 11038, + 11090, + 11057, + 11095, + 11106, + 11084, + 11138, + 11030, + 11019, + 11073, + 11051, + 11060, + 11090, + 11028, + 11023, + 11051, + 11066, + 11111, + 11050, + 11015, + 11027, + 11065, + 11057, + 11036, + 11064, + 11073, + 11062, + 11048, + 11064, + 11037, + 11048, + 11053, + 11068, + 11058, + 11033, + 11499, + 11060, + 11061, + 11027, + 11088, + 11048, + 11070, + 11037, + 11087, + 11059, + 11048, + 11056, + 11024, + 11067, + 11012, + 11030, + 11049, + 11069, + 11041, + 11061, + 11073, + 11034, + 11060, + 11031, + 11053, + 11058, + 11045, + 11053, + 11037, + 11059, + 11061, + 11073, + 11410, + 11053, + 11039, + 11064, + 11035, + 11064, + 11012, + 11025, + 11026, + 11043, + 11105, + 11043, + 11048, + 11051, + 11090, + 11093, + 11089, + 11043, + 11010, + 11071, + 11078, + 11036, + 11053, + 11052, + 11036, + 11063, + 11052, + 11054, + 11024, + 11029, + 11057, + 11047, + 11054, + 11036, + 11024, + 11086, + 11010, + 11034, + 11038, + 11043, + 11054, + 11053, + 11061, + 11057, + 11398, + 11213, + 11065, + 11050, + 11096, + 11047, + 11058, + 11090, + 11060, + 11021, + 11037, + 11031, + 11075, + 11018, + 11036, + 11065, + 11017, + 11032, + 11061, + 11037, + 11087, + 11084, + 11086, + 11050, + 11049, + 11029, + 11059, + 11061, + 11036, + 11089, + 11073, + 11051, + 11046, + 11051, + 11017, + 11068, + 11048, + 11047, + 11033, + 11060, + 11022, + 11057, + 11055, + 11076, + 11033, + 11020, + 11079, + 11062, + 11064, + 11022, + 11085, + 11151, + 11060, + 11025, + 11077, + 11047, + 11051, + 11074, + 11046, + 11052, + 11126, + 11038, + 11055, + 11047, + 11065, + 11018, + 11072, + 11044, + 11027, + 11053, + 11033, + 11067, + 11060, + 11015, + 11044, + 11068, + 11057, + 11106, + 11200, + 11019, + 11057, + 11062, + 11037, + 11033, + 11075, + 11031, + 11053, + 11059, + 11036, + 11049, + 11036, + 11050, + 11028, + 11101, + 11022, + 11056, + 11066, + 11056, + 11043, + 11016, + 11045, + 11023, + 11072, + 11034, + 11027, + 11077, + 11059, + 11050, + 11059, + 11075, + 11021, + 11059, + 11046, + 11070, + 11033, + 11085, + 11061, + 11023, + 11082, + 11052, + 11066, + 11073, + 11059, + 11061, + 11019, + 11084, + 11081, + 11056, + 11054, + 11032, + 11049, + 11066, + 11068, + 11037, + 11047, + 11053, + 11032, + 11056, + 11064, + 11076, + 11041, + 11067, + 11062, + 11041, + 11061, + 11027, + 11063, + 11057, + 11024, + 11047, + 11038, + 11078, + 11052, + 11061, + 11039, + 11068, + 11078, + 11057, + 11032, + 11030, + 11023, + 11068, + 11083, + 11033, + 11056, + 11047, + 11054, + 11059, + 11045, + 11038, + 11073, + 11024, + 11070, + 11053, + 11068, + 11023, + 11048, + 11091, + 11039, + 11063, + 11045, + 11056, + 11453, + 11051, + 11066, + 11085, + 11043, + 11099, + 11033, + 11065, + 11026, + 11052, + 11031, + 11039, + 11047, + 11040, + 11072, + 11057, + 11073, + 11041, + 11044, + 11032, + 11061, + 11057, + 11091, + 11070, + 11031, + 11023, + 11065, + 11049, + 11131, + 11045, + 11360, + 11075, + 11375, + 11054, + 11078, + 11042, + 11093, + 11067, + 11025, + 11026, + 11055, + 11052, + 11033, + 11074, + 11019, + 11029, + 11055, + 11022, + 11068, + 11032, + 11031, + 11039, + 11051, + 11065, + 11035, + 11028, + 11020, + 11018, + 11064, + 11031, + 11044, + 11051, + 11040, + 11043, + 11058, + 11035, + 11015, + 11099, + 11050, + 11058, + 11054, + 11024, + 11051, + 11084, + 11069, + 11087, + 11099, + 11033, + 11059, + 11049, + 11038, + 11066, + 11040, + 11035, + 11093, + 11005, + 11028, + 11044, + 11064, + 11043, + 11027, + 11096, + 11080, + 11095, + 11060, + 11072, + 11054, + 11034, + 11060, + 11101, + 11102, + 11115, + 11071, + 11034, + 11052, + 11028, + 11029, + 11057, + 11043, + 11018, + 11027, + 11074, + 11065, + 11087, + 11030, + 11065, + 11041, + 11011, + 11084, + 11047, + 11033, + 11032, + 11046, + 11083, + 11052, + 11058, + 11041, + 11046, + 11018, + 11066, + 11106, + 11053, + 11080, + 11049, + 11058, + 11037, + 11022, + 11018, + 11049, + 11018, + 11015, + 11059, + 11078, + 11022, + 11055, + 11060, + 11656, + 11029, + 11038, + 11089, + 11040, + 11035, + 11087, + 11036, + 11037, + 11033, + 11049, + 11027, + 11023, + 11033, + 11105, + 11048, + 11060, + 11070, + 11043, + 11022, + 11063, + 11034, + 11092, + 11062, + 11055, + 11041, + 11072, + 11039, + 11043, + 11046, + 11054, + 11053, + 11038, + 11071, + 11022, + 11061, + 11073, + 11072, + 11044, + 11087, + 11105, + 11060, + 11015, + 11076, + 11042, + 11050, + 11047, + 11064, + 11056, + 11038, + 11037, + 11048, + 11040, + 11070, + 11049, + 11058, + 11042, + 11090, + 11056, + 11054, + 11073, + 11049, + 11052, + 11025, + 11069, + 11048, + 11036, + 11047, + 11072, + 11034, + 11084, + 11053, + 11051, + 11082, + 11065, + 11086, + 11063, + 11087, + 11075, + 11044, + 11092, + 11032, + 11039, + 11058, + 11066, + 11076, + 11066, + 11063, + 11094, + 11115, + 11027, + 11051, + 11641, + 11065, + 11047, + 11081, + 11055, + 11036, + 11053, + 11038, + 11076, + 11082, + 11035, + 11035, + 11057, + 11022, + 11094, + 11054, + 11026, + 11066, + 11045, + 11025, + 11059, + 11019, + 11025, + 11051, + 11031, + 11091, + 11046, + 11069, + 11064, + 11069, + 11090, + 11027, + 11056, + 11047, + 11040, + 11031, + 11053, + 11039, + 11033, + 11076, + 11039, + 11098, + 11076, + 11055, + 11065, + 11230, + 11044, + 11094, + 11058, + 11070, + 11003, + 11072, + 11044, + 11043, + 11068, + 11035, + 11026, + 11051, + 11082, + 11026, + 11059, + 11034, + 11048, + 11050, + 11044, + 11063, + 11074, + 11089, + 11066, + 11101, + 11018, + 11042, + 11047, + 11039, + 11056, + 11070, + 11037, + 11075, + 11031, + 11065, + 11043, + 11045, + 11045, + 11028, + 11048, + 11086, + 11029, + 11028, + 11033, + 11042, + 11013, + 11052, + 11027, + 11019, + 11031, + 11030, + 11046, + 11049, + 11060, + 11033, + 11016, + 11055, + 11039, + 11044, + 11066, + 11050, + 11028, + 11089, + 11083, + 11063, + 11044, + 11051, + 11058, + 11076, + 11074, + 11014, + 11053, + 11118, + 11041, + 11058, + 11073, + 11019, + 11039, + 11079, + 11073, + 11031, + 11067, + 11052, + 11091, + 11077, + 11023, + 11045, + 11026, + 11104, + 11022, + 11087, + 11050, + 11042, + 11038, + 11089, + 11035, + 11017, + 11039, + 11054, + 11034, + 11069, + 11048, + 11064, + 11057, + 11054, + 11063, + 11066, + 11037, + 11090, + 11069, + 11043, + 11059, + 11110, + 11063, + 11068, + 11039, + 11051, + 11077, + 11081, + 11057, + 11089, + 11050, + 11040, + 11081, + 11028, + 11070, + 11060, + 11036, + 11027, + 11049, + 11049, + 11041, + 11034, + 11041, + 11057, + 11044, + 11052, + 11050, + 11047, + 11061, + 11046, + 11045, + 11132, + 11057, + 11056, + 11045, + 11060, + 11050, + 11024, + 11011, + 12976, + 11032, + 11044, + 11085, + 11052, + 11046, + 11048, + 11074, + 11081, + 11091, + 11056, + 11046, + 11050, + 11068, + 11081, + 11055, + 11072, + 11076, + 11089, + 11027, + 11033, + 11055, + 11040, + 11088, + 11083, + 11053, + 11054, + 11071, + 11023, + 11081, + 11052, + 11053, + 11041, + 11087, + 11074, + 11025, + 11052, + 11035, + 11024, + 11058, + 11039, + 11065, + 11052, + 11530, + 11040, + 11078, + 11028, + 11068, + 11059, + 11033, + 11049, + 11061, + 11022, + 11030, + 11059, + 11030, + 11032, + 11051, + 11060, + 11076, + 11049, + 11051, + 11057, + 11053, + 11044, + 11040, + 11045, + 11044, + 11054, + 11033, + 11021, + 11064, + 11061, + 11054, + 11057, + 11035, + 11038, + 11063, + 11122, + 11008, + 11038, + 11090, + 11049, + 11057, + 11057, + 11029, + 11051, + 11038, + 11055, + 11025, + 11072, + 11044, + 11078, + 11108, + 11095, + 11071, + 11037, + 11023, + 11054, + 11066, + 11705, + 11041, + 11041, + 11030, + 11605, + 11047, + 11086, + 11049, + 11066, + 11035, + 11060, + 11066, + 11043, + 11051, + 11108, + 11036, + 11060, + 11078, + 11012, + 11035, + 11040, + 11047, + 11029, + 11040, + 11067, + 11066, + 11046, + 11037, + 11028, + 11045, + 11048, + 11079, + 11056, + 11076, + 11078, + 11058, + 11045, + 11049, + 11061, + 11048, + 11016, + 11050, + 11058, + 11050, + 11033, + 11014, + 11051, + 11043, + 11069, + 11051, + 11072, + 11051, + 11062, + 11041, + 11041, + 11061, + 11052, + 11022, + 11055, + 11107, + 11033, + 11091, + 11056, + 11079, + 11060, + 11050, + 11110, + 11041, + 11042, + 11044, + 11033, + 11063, + 11050, + 11084, + 11049, + 11031, + 11067, + 11091, + 11058, + 11071, + 11059, + 11024, + 11058, + 11074, + 11072, + 11166, + 11036, + 11048, + 11055, + 11090, + 11065, + 11030, + 11025, + 11044, + 11071, + 11035, + 11049, + 11043, + 11032, + 11066, + 11049, + 11087, + 11042, + 11028, + 11078, + 11035, + 11044, + 11043, + 11070, + 11048, + 11058, + 11049, + 11051, + 11055, + 11032, + 11050, + 11055, + 11016, + 11047, + 11061, + 11039, + 11053, + 11067, + 11029, + 11057, + 11067, + 11020, + 11067, + 11005, + 11069, + 11043, + 11049, + 11027, + 11011, + 11026, + 11018, + 11073, + 11062, + 11071, + 11031, + 11054, + 11058, + 11047, + 11085, + 11072, + 11042, + 11097, + 11075, + 11059, + 11049, + 11062, + 11086, + 11016, + 11030, + 11042, + 11071, + 11027, + 11079, + 11042, + 11075, + 11026, + 11051, + 11056, + 11044, + 11080, + 11087, + 11044, + 11063, + 11034, + 11021, + 11033, + 11025, + 11049, + 11030, + 11031, + 11037, + 11048, + 11036, + 11080, + 11104, + 11039, + 11079, + 11055, + 11072, + 11021, + 11026, + 11028, + 11052, + 11039, + 11100, + 11050, + 11331, + 11049, + 11110, + 11033, + 11053, + 11026, + 11051, + 11019, + 11012, + 11030, + 11038, + 11030, + 11094, + 11066, + 11059, + 11107, + 11092, + 11043, + 11069, + 11060, + 11046, + 11055, + 11085, + 11052, + 11047, + 11063, + 11088, + 11055, + 11046, + 11091, + 11066, + 11022, + 11057, + 11057, + 11023, + 11019, + 11014, + 11837, + 11075, + 11109, + 11049, + 11040, + 11314, + 11042, + 11062, + 11024, + 11115, + 11036, + 11062, + 11021, + 11051, + 11068, + 11048, + 11099, + 11750, + 11064, + 11058, + 11059, + 11054, + 11037, + 11033, + 11071, + 11035, + 11043, + 11040, + 11033, + 11036, + 11044, + 11055, + 11065, + 11056, + 11055, + 11070, + 11034, + 11034, + 11044, + 11041, + 11030, + 11093, + 11050, + 11072, + 11053, + 11066, + 11085, + 11077, + 11039, + 11034, + 11047, + 11034, + 11020, + 11040, + 11053, + 11032, + 11029, + 11067, + 11040, + 11059, + 11023, + 11044, + 11045, + 11035, + 11041, + 11062, + 11036, + 11023, + 12688, + 11114, + 11055, + 11059, + 11049, + 11082, + 11075, + 11029, + 11176, + 11105, + 11028, + 11059, + 11027, + 11082, + 11049, + 11067, + 11068, + 11077, + 11070, + 11064, + 11033, + 11029, + 11043, + 11102, + 11045, + 11024, + 11033, + 11085, + 11070, + 11076, + 11076, + 11042, + 11074, + 11063, + 11086, + 11043, + 11016, + 11019, + 11100, + 11070, + 11037, + 11030, + 11024, + 11034, + 11066, + 11040, + 11037, + 11095, + 11043, + 11042, + 11082, + 11070, + 11040, + 11050, + 11058, + 11046, + 11042, + 11042, + 11025, + 11048, + 11067, + 11055, + 11045, + 11070, + 11030, + 11058, + 11125, + 11046, + 11068, + 11077, + 11070, + 11047, + 11091, + 11029, + 11034, + 11032, + 11044, + 11076, + 11048, + 11018, + 11086, + 11080, + 11045, + 11027, + 11061, + 11046, + 11295, + 11037, + 11026, + 11097, + 11032, + 11013, + 11037, + 11036, + 11030, + 11057, + 11071, + 11099, + 11047, + 11064, + 11032, + 11042, + 11045, + 11090, + 11076, + 11070, + 11048, + 11058, + 11028, + 11050, + 11035, + 11058, + 11042, + 11056, + 11058, + 11058, + 11017, + 11039, + 11017, + 11049, + 11064, + 11030, + 11049, + 11069, + 11049, + 11083, + 11030, + 11048, + 11043, + 11062, + 11067, + 11062, + 11046, + 11063, + 11031, + 11062, + 11047, + 11027, + 11103, + 11019, + 11065, + 11093, + 11067, + 11047, + 11110, + 11054, + 11051, + 11061, + 11059, + 11044, + 11044, + 11031, + 11080, + 11079, + 11073, + 11096, + 11065, + 11041, + 11062, + 11029, + 11035, + 11036, + 11057, + 11025, + 11062, + 11013, + 11112, + 11032, + 11061, + 11023, + 11054, + 11056, + 11046, + 11053, + 11059, + 11066, + 11060, + 11038, + 11031, + 11048, + 11049, + 11027, + 11046, + 11099, + 11063, + 11039, + 11054, + 11064, + 11054, + 11079, + 11064, + 11069, + 11037, + 11042, + 11056, + 11059, + 11072, + 11062, + 11068, + 11067, + 11052, + 11047, + 11088, + 11029, + 11039, + 11057, + 11080, + 11023, + 11101, + 11028, + 11041, + 11031, + 11048, + 11075, + 11044, + 11079, + 11101, + 11049, + 11056, + 11063, + 11030, + 11057, + 11041, + 11082, + 11058, + 11053, + 11054, + 11046, + 11027, + 11015, + 11065, + 11046, + 11053, + 11055, + 11044, + 11043, + 11086, + 11057, + 11051, + 11043, + 11047, + 11059, + 11074, + 11089, + 11037, + 11040, + 11091, + 11093, + 11100, + 11070, + 11028, + 11053, + 11038, + 11040, + 11046, + 11076, + 11048, + 11067, + 11066, + 11012, + 11021, + 11049, + 11106, + 11055, + 11040, + 11068, + 11026, + 11046, + 11036, + 11042, + 11056, + 11077, + 11035, + 11029, + 11046, + 11074, + 11021, + 11018, + 11118, + 11046, + 11059, + 11052, + 11046, + 11049, + 11042, + 11083, + 11069, + 11045, + 11064, + 11059, + 11062, + 11045, + 11109, + 11051, + 15832, + 11089, + 11048, + 11078, + 11057, + 11063, + 11056, + 11058, + 11051, + 11072, + 11066, + 11061, + 11059, + 11065, + 11062, + 11080, + 11062, + 11039, + 11068, + 11024, + 11018, + 11060, + 11056, + 11037, + 11043, + 11001, + 11048, + 11042, + 11052, + 11049, + 11053, + 11114, + 11040, + 11085, + 11047, + 11043, + 11058, + 11031, + 11066, + 11046, + 11058, + 11041, + 11030, + 11060, + 11008, + 11065, + 11019, + 11055, + 11047, + 11031, + 11066, + 11023, + 11068, + 11027, + 11049, + 11072, + 11057, + 11047, + 11052, + 11037, + 11045, + 11030, + 11052, + 11031, + 11023, + 11049, + 11048, + 11112, + 11043, + 11065, + 11049, + 11054, + 11046, + 11058, + 11088, + 11057, + 11031, + 11040, + 11056, + 11075, + 11046, + 11074, + 11058, + 11084, + 11034, + 11074, + 11096, + 11087, + 11052, + 11020, + 11070, + 11017, + 11045, + 11027, + 11049, + 11029, + 11063, + 11045, + 11073, + 11070, + 11064, + 11054, + 11050, + 11054, + 11046, + 11080, + 11055, + 11054, + 11036, + 11054, + 11059, + 11077, + 11076, + 11020, + 11031, + 11062, + 11064, + 11085, + 11048, + 11084, + 11087, + 11016, + 11064, + 11097, + 11071, + 11046, + 11053, + 11049, + 11010, + 11037, + 11024, + 11054, + 11066, + 11020, + 11061, + 11059, + 11032, + 11031, + 11044, + 11016, + 11056, + 11032, + 11092, + 11046, + 11050, + 11088, + 11070, + 11037, + 11043, + 11050, + 11051, + 11042, + 11050, + 11074, + 11050, + 11061, + 11092, + 11061, + 11839, + 11036, + 11066, + 11029, + 11060, + 11035, + 11021, + 11068, + 11029, + 11035, + 11066, + 11072, + 11027, + 11032, + 11113, + 11068, + 11048, + 11035, + 11035, + 11110, + 11044, + 11060, + 11065, + 11062, + 11059, + 11044, + 11063, + 11066, + 11058, + 11040, + 11062, + 11057, + 11025, + 11030, + 11013, + 11068, + 11060, + 11033, + 11038, + 11028, + 11085, + 11065, + 11059, + 11057, + 11053, + 11067, + 11067, + 11071, + 11092, + 11107, + 11022, + 11028, + 11103, + 11034, + 11065, + 11079, + 11074, + 11045, + 11046, + 11059, + 11027, + 11096, + 11068, + 11038, + 11028, + 11046, + 11030, + 11109, + 11029, + 11068, + 11066, + 11028, + 11053, + 11057, + 11089, + 11045, + 11075, + 11041, + 11048, + 11046, + 11063, + 11065, + 11030, + 11033, + 11047, + 11087, + 11085, + 11021, + 11035, + 11028, + 11072, + 11091, + 11063, + 11058, + 11070, + 11040, + 11046, + 11040, + 11058, + 11057, + 11043, + 11069, + 11023, + 11064, + 11024, + 11047, + 11060, + 11042, + 11040, + 11022, + 11039, + 11056, + 11083, + 11082, + 11064, + 11032, + 11037, + 11013, + 11070, + 11060, + 11045, + 11039, + 11112, + 11046, + 11033, + 11034, + 11034, + 11032, + 11026, + 11058, + 11100, + 11109, + 11041, + 11079, + 11036, + 11060, + 11059, + 11025, + 11070, + 11065, + 11026, + 11080, + 11050, + 11039, + 11054, + 11042, + 11067, + 11038, + 11051, + 11027, + 11043, + 11053, + 11074, + 11062, + 11026, + 11059, + 11088, + 11036, + 11077, + 11069, + 11023, + 11030, + 11051, + 11030, + 11066, + 11085, + 11056, + 11030, + 11065, + 11015, + 11018, + 11065, + 11075, + 11078, + 11053, + 11067, + 11028, + 11041, + 11049, + 11028, + 11033, + 11067, + 11065, + 11022, + 11054, + 12099, + 11055, + 11048, + 11043, + 11030, + 11021, + 11025, + 11048, + 11035, + 11062, + 11028, + 11041, + 11010, + 11070, + 11068, + 11035, + 11047, + 11013, + 11122, + 11071, + 11061, + 11036, + 11027, + 11082, + 11043, + 11043, + 11038, + 11052, + 11274, + 11040, + 11026, + 11053, + 11031, + 11042, + 11044, + 11037, + 11067, + 11023, + 11050, + 11025, + 11081, + 11060, + 11054, + 11120, + 11088, + 11032, + 11041, + 11056, + 11070, + 11054, + 11068, + 11020, + 11075, + 11070, + 11026, + 11050, + 11069, + 11060, + 11037, + 11043, + 11068, + 11089, + 11040, + 11038, + 11038, + 11021, + 11053, + 11056, + 11029, + 11061, + 11036, + 11029, + 11017, + 11059, + 11077, + 11071, + 11034, + 11067, + 11064, + 11022, + 11043, + 11025, + 11098, + 11056, + 11047, + 11067, + 11090, + 11080, + 11103, + 11082, + 11062, + 11063, + 11049, + 11047, + 11060, + 11043, + 11025, + 11089, + 11050, + 11043, + 11057, + 11093, + 11058, + 11059, + 11045, + 11084, + 11062, + 11046, + 11038, + 11061, + 11087, + 11072, + 11049, + 11053, + 11071, + 11064, + 11055, + 11052, + 11089, + 11089, + 11047, + 11064, + 11061, + 11030, + 11091, + 11067, + 11058, + 11021, + 11031, + 11024, + 11051, + 11019, + 11039, + 11037, + 11049, + 11053, + 11056, + 11052, + 11036, + 11001, + 11065, + 11060, + 11041, + 11122, + 11058, + 11041, + 11057, + 11057, + 11058, + 11059, + 11042, + 11021, + 11038, + 11028, + 11068, + 11060, + 11033, + 11029, + 11067, + 11121, + 11028, + 11060, + 11085, + 11076, + 11030, + 11018, + 11076, + 11034, + 11038, + 11023, + 11033, + 11053, + 11059, + 11201, + 11041, + 11048, + 11094, + 11046, + 11068, + 11014, + 11047, + 11120, + 11076, + 11096, + 11057, + 11055, + 11048, + 11044, + 11100, + 11038, + 11063, + 11036, + 11028, + 11031, + 11097, + 11045, + 11072, + 11035, + 11068, + 11053, + 11090, + 11050, + 11040, + 11065, + 11020, + 11101, + 11092, + 11020, + 11044, + 11041, + 11058, + 11022, + 11103, + 11059, + 11027, + 11036, + 11048, + 11035, + 11035, + 11050, + 11066, + 11060, + 11041, + 11023, + 11025, + 11049, + 11022, + 11054, + 11041, + 11039, + 11053, + 11084, + 11043, + 11033, + 11042, + 11052, + 11056, + 11040, + 11048, + 11060, + 11100, + 11067, + 11048, + 11098, + 11036, + 11055, + 11084, + 11022, + 11007, + 11079, + 11027, + 11068, + 11043, + 11077, + 11069, + 11051, + 11044, + 11064, + 11056, + 11046, + 11127, + 11073, + 11059, + 11035, + 11036, + 11016, + 11059, + 11056, + 11113, + 11076, + 11011, + 11054, + 11103, + 11048, + 11083, + 11058, + 11075, + 11023, + 11063, + 11073, + 11056, + 11107, + 11052, + 11023, + 11070, + 11066, + 11047, + 11080, + 11086, + 11042, + 11056, + 11023, + 11047, + 11021, + 11062, + 11048, + 11046, + 11018, + 11051, + 11071, + 11026, + 11023, + 11061, + 11044, + 11046, + 11068, + 11055, + 11036, + 11065, + 11058, + 11047, + 11036, + 11041, + 11024, + 11082, + 11041, + 11048, + 11085, + 11069, + 11046, + 11090, + 11055, + 11052, + 11077, + 11052, + 11025, + 11056, + 11050, + 11027, + 11067, + 11047, + 11040, + 11058, + 11030, + 11050, + 11064, + 11053, + 11051, + 11026, + 11048, + 11027, + 11054, + 11045, + 11048, + 11072, + 11106, + 11051, + 11044, + 11053, + 11036, + 11053, + 11062, + 11044, + 11058, + 11070, + 11039, + 11100, + 11042, + 11041, + 11086, + 11060, + 11041, + 11068, + 11096, + 11019, + 11110, + 11085, + 11051, + 11030, + 11047, + 11050, + 11030, + 11055, + 11029, + 11048, + 11054, + 11043, + 11048, + 11087, + 11064, + 11043, + 11065, + 11042, + 11058, + 11053, + 11296, + 11064, + 11078, + 11226, + 11085, + 11055, + 11075, + 11043, + 11081, + 11048, + 11028, + 11067, + 11100, + 11046, + 11024, + 11045, + 11080, + 11103, + 11112, + 11050, + 11056, + 11057, + 11089, + 11007, + 11027, + 11035, + 11062, + 11032, + 11050, + 11034, + 11023, + 11036, + 11043, + 11087, + 11049, + 11060, + 11077, + 11025, + 11089, + 11086, + 11091, + 11005, + 11048, + 11036, + 11056, + 11060, + 11073, + 11748, + 11068, + 11058, + 11050, + 11085, + 11039, + 11033, + 11019, + 11108, + 11075, + 11099, + 11042, + 11038, + 11036, + 11092, + 11043, + 11038, + 11073, + 11032, + 11055, + 11036, + 11082, + 11069, + 11054, + 11068, + 11087, + 11059, + 11099, + 11071, + 11073, + 11019, + 11058, + 11052, + 11031, + 11084, + 11056, + 11026, + 11078, + 11050, + 11024, + 11050, + 11063, + 11024, + 11063, + 11080, + 11036, + 11065, + 11044, + 11036, + 11080, + 11049, + 11052, + 11045, + 11052, + 11094, + 11065, + 11092, + 11047, + 11052, + 11063, + 11059, + 11057, + 11071, + 11075, + 11088, + 11056, + 11069, + 11101, + 11030, + 11062, + 11011, + 11044, + 11059, + 11052, + 11034, + 11035, + 11047, + 11079, + 11053, + 11024, + 11030, + 11039, + 11052, + 11063, + 11068, + 11058, + 11055, + 11021, + 11062, + 11023, + 11064, + 11033, + 11027, + 11034, + 11057, + 11027, + 11033, + 11011, + 11035, + 11075, + 11084, + 11030, + 11037, + 11077, + 11064, + 11028, + 11062, + 11052, + 11035, + 11064, + 11040, + 11054, + 11028, + 11040, + 11046, + 11041, + 11056, + 11075, + 11034, + 11063, + 11056, + 11034, + 11065, + 11040, + 11048, + 11057, + 11054, + 11105, + 11047, + 11050, + 11049, + 11106, + 11028, + 11025, + 11059, + 11086, + 11034, + 11034, + 11068, + 11044, + 11037, + 11032, + 11066, + 11039, + 11059, + 11035, + 11128, + 11059, + 11065, + 11021, + 11026, + 11015, + 11042, + 11054, + 11086, + 11025, + 11046, + 11095, + 11072, + 11085, + 11022, + 11053, + 11041, + 11037, + 11034, + 11036, + 11064, + 11059, + 11087, + 11043, + 11066, + 11051, + 11053, + 11048, + 11063, + 11043, + 11024, + 11024, + 11069, + 11040, + 11079, + 11054, + 11081, + 11033, + 11050, + 11072, + 11039, + 11053, + 11047, + 11044, + 11054, + 11028, + 11028, + 11105, + 11064, + 11057, + 11056, + 11102, + 11057, + 11092, + 11024, + 11160, + 11063, + 11032, + 11020, + 11077, + 11082, + 11065, + 11040, + 11027, + 11017, + 11043, + 11059, + 11050, + 22295, + 11093, + 11080, + 11057, + 11064, + 11165, + 11022, + 11092, + 11031, + 11024, + 11073, + 11053, + 11042, + 11040, + 11080, + 11028, + 11020, + 11020, + 11041, + 11023, + 11034, + 11057, + 11038, + 11037, + 11120, + 11045, + 11055, + 11084, + 11039, + 11034, + 11061, + 11049, + 11058, + 11040, + 11039, + 11030, + 11058, + 11054, + 11061, + 11029, + 11043, + 11068, + 11047, + 11043, + 11066, + 11050, + 11063, + 11032, + 11062, + 11084, + 11044, + 11054, + 11073, + 11053, + 11122, + 11051, + 11058, + 11040, + 11065, + 11130, + 11051, + 11102, + 11043, + 11026, + 11047, + 11041, + 11092, + 11082, + 11075, + 11049, + 11083, + 11057, + 11057, + 11046, + 11042, + 11046, + 11068, + 11057, + 11046, + 11043, + 11051, + 11015, + 11083, + 11048, + 11114, + 11013, + 11049, + 11069, + 11066, + 11103, + 11044, + 11061, + 11033, + 11056, + 11053, + 11051, + 11045, + 11047, + 11038, + 11063, + 11073, + 11035, + 11081, + 11087, + 11026, + 11072, + 11072, + 11041, + 11082, + 12832, + 11032, + 11053, + 11078, + 11082, + 11086, + 11041, + 11087, + 11049, + 11081, + 11050, + 11072, + 11016, + 11054, + 11088, + 11045, + 11009, + 11074, + 11059, + 11040, + 11053, + 12856, + 11051, + 11056, + 11051, + 11072, + 11107, + 11042, + 11100, + 11037, + 11031, + 11067, + 11039, + 11055, + 11072, + 11052, + 11056, + 11067, + 11075, + 11050, + 11053, + 11075, + 11063, + 11048, + 11071, + 11054, + 11031, + 11076, + 11037, + 11035, + 11017, + 11057, + 11046, + 11058, + 11035, + 11022, + 11023, + 11063, + 11059, + 11022, + 11058, + 11089, + 11058, + 11114, + 11058, + 11040, + 11031, + 11009, + 11063, + 11079, + 11047, + 11027, + 11038, + 11052, + 11064, + 11068, + 11087, + 11044, + 11078, + 11084, + 11047, + 11101, + 11039, + 11055, + 11041, + 11058, + 11030, + 11032, + 11102, + 11055, + 11092, + 11047, + 11064, + 11037, + 11046, + 11051, + 11040, + 11009, + 11089, + 11067, + 11030, + 11082, + 11060, + 11017, + 11044, + 11066, + 11056, + 11093, + 11073, + 11066, + 11083, + 11064, + 11044, + 11071, + 11051, + 11023, + 11079, + 11055, + 11068, + 11037, + 11062, + 11023, + 11022, + 11069, + 11049, + 11064, + 11093, + 11014, + 11082, + 11045, + 11096, + 11071, + 11023, + 11042, + 11061, + 11051, + 11054, + 11043, + 11074, + 11043, + 11052, + 11026, + 11059, + 11056, + 11093, + 11055, + 11046, + 11049, + 11049, + 11054, + 11064, + 11061, + 11023, + 11028, + 11072, + 11066, + 11045, + 11093, + 11013, + 11049, + 11066, + 11072, + 11044, + 11049, + 11029, + 11051, + 11007, + 11047, + 11037, + 11035, + 11073, + 11072, + 11032, + 11048, + 11051, + 11134, + 11069, + 11041, + 11030, + 11045, + 11032, + 11022, + 11046, + 11059, + 11030, + 11029, + 11036, + 11053, + 11059, + 11036, + 11088, + 11033, + 11054, + 11052, + 11056, + 11073, + 11046, + 11030, + 11052, + 11060, + 11039, + 11030, + 11062, + 11075, + 11066, + 11105, + 11076, + 11069, + 11063, + 11067, + 11018, + 11040, + 11044, + 11143, + 11075, + 11048, + 11069, + 11236, + 11095, + 11056, + 11040, + 11031, + 11076, + 11071, + 11056, + 11075, + 11041, + 11030, + 11045, + 11026, + 11046, + 11075, + 11032, + 11046, + 11056, + 11054, + 11091, + 11030, + 11095, + 11083, + 11050, + 11038, + 11057, + 11067, + 11034, + 11031, + 11023, + 11041, + 11029, + 11054, + 11036, + 11057, + 11034, + 11021, + 11009, + 11104, + 11086, + 11112, + 11066, + 11088, + 11044, + 11092, + 11018, + 11054, + 11032, + 11018, + 11062, + 11040, + 11068, + 11042, + 11068, + 11062, + 11046, + 11015, + 11037, + 11066, + 11028, + 11028, + 11058, + 11060, + 11038, + 11065, + 11057, + 11044, + 11052, + 11068, + 11054, + 11049, + 11056, + 11052, + 11074, + 11095, + 11022, + 11026, + 11016, + 11052, + 11092, + 11055, + 11031, + 11032, + 11096, + 11024, + 11101, + 11104, + 11075, + 11077, + 11078, + 11047, + 11053, + 11063, + 11071, + 11075, + 11018, + 11036, + 11110, + 11037, + 11038, + 11063, + 11062, + 11079, + 11077, + 11044, + 11016, + 11051, + 11089, + 11055, + 11084, + 11025, + 11032, + 11051, + 11010, + 11018, + 11040, + 11037, + 11060, + 11068, + 11072, + 11067, + 11049, + 11094, + 11111, + 11058, + 11057, + 11072, + 11052, + 11043, + 11075, + 11050, + 11049, + 11052, + 11023, + 11075, + 11053, + 11207, + 11058, + 11068, + 11042, + 11068, + 11087, + 11054, + 11055, + 11048, + 11054, + 11065, + 11072, + 11115, + 11067, + 11022, + 11026, + 11029, + 11051, + 11051, + 11051, + 11062, + 11027, + 11051, + 11063, + 11051, + 11035, + 11079, + 11067, + 11051, + 11087, + 11072, + 11080, + 11062, + 11038, + 11070, + 11073, + 11074, + 11074, + 11074, + 11071, + 11051, + 11074, + 11046, + 11064, + 11090, + 11030, + 11110, + 11033, + 11079, + 11056, + 11022, + 11025, + 11044, + 11043, + 11098, + 11084, + 11071, + 11076, + 11087, + 11040, + 11044, + 11050, + 11080, + 11055, + 11020, + 11058, + 11032, + 11042, + 11032, + 11057, + 11077, + 11055, + 11037, + 11010, + 11054, + 11020, + 11047, + 11081, + 11056, + 11014, + 11040, + 11055, + 11050, + 11063, + 11070, + 11026, + 11096, + 11050, + 11060, + 11035, + 11075, + 11064, + 11023, + 11061, + 11047, + 11071, + 11055, + 11016, + 11054, + 11053, + 11020, + 11020, + 11088, + 11057, + 11067, + 11027, + 11073, + 11033, + 11067, + 11077, + 11086, + 11031, + 11045, + 11012, + 11072, + 11061, + 11120, + 11069, + 11029, + 11032, + 11036, + 11044, + 11018, + 11061, + 11139, + 11082, + 11082, + 11040, + 11053, + 11022, + 11034, + 11048, + 11047, + 11063, + 11064, + 11061, + 11016, + 11052, + 11033, + 11066, + 11083, + 11024, + 11047, + 11026, + 11055, + 11116, + 11065, + 11061, + 11029, + 11037, + 11045, + 11020, + 11089, + 11097, + 11065, + 11061, + 11022, + 11068, + 11037, + 11040, + 11022, + 11015, + 11043, + 11035, + 11010, + 11070, + 11031, + 11080, + 11046, + 11050, + 11038, + 11038, + 11042, + 11040, + 11066, + 11061, + 11033, + 11093, + 11089, + 11025, + 11073, + 11079, + 11028, + 11035, + 11060, + 11072, + 11053, + 11064, + 11050, + 11058, + 11016, + 11028, + 11048, + 11076, + 11045, + 11030, + 11062, + 11019, + 11047, + 11084, + 11081, + 12429, + 11069, + 11060, + 11048, + 11073, + 11011, + 11057, + 11063, + 11033, + 11069, + 11063, + 11039, + 11067, + 11050, + 11047, + 11045, + 11065, + 11053, + 11054, + 11061, + 11010, + 11026, + 11042, + 11056, + 11052, + 11040, + 11055, + 11048, + 11091, + 11054, + 11072, + 11075, + 11041, + 11070, + 11051, + 11063, + 11044, + 11109, + 11053, + 11057, + 11022, + 11031, + 11071, + 11062, + 11038, + 11025, + 11050, + 11026, + 11028, + 11060, + 11036, + 11052, + 11028, + 11045, + 11012, + 11056, + 11051, + 11044, + 11080, + 11052, + 11029, + 11037, + 11046, + 11085, + 11056, + 11020, + 11027, + 11085, + 11055, + 11080, + 11046, + 11048, + 11032, + 11084, + 11020, + 11054, + 11062, + 11013, + 11047, + 11040, + 11020, + 11056, + 11048, + 11074, + 11043, + 11060, + 11042, + 11053, + 11068, + 11039, + 11060, + 11026, + 11047, + 11071, + 11036, + 11049, + 11062, + 11077, + 11069, + 11044, + 11037, + 11026, + 11069, + 11072, + 11057, + 11040, + 11053, + 11026, + 11061, + 11100, + 11028, + 11040, + 11058, + 11055, + 11057, + 11033, + 11047, + 11104, + 11031, + 11024, + 11041, + 11065, + 11054, + 11055, + 11055, + 11093, + 11046, + 11060, + 11039, + 11057, + 11044, + 11013, + 11100, + 11117, + 11067, + 11052, + 11041, + 11067, + 11049, + 11068, + 11075, + 11060, + 11046, + 11054, + 11038, + 11039, + 11052, + 11024, + 11061, + 11019, + 11053, + 11062, + 11098, + 11055, + 11056, + 11043, + 11054, + 11089, + 11060, + 11069, + 11036, + 11069, + 11038, + 11036, + 11045, + 11034, + 11065, + 11048, + 11044, + 11065, + 11045, + 11027, + 11034, + 11028, + 11074, + 11069, + 11057, + 11081, + 11058, + 11064, + 11043, + 11047, + 11085, + 11030, + 11027, + 11012, + 11050, + 11060, + 11054, + 11048, + 11050, + 11037, + 11028, + 11057, + 11051, + 11093, + 11119, + 11045, + 11057, + 11047, + 11074, + 11050, + 11072, + 11050, + 11054, + 11108, + 11039, + 11059, + 11067, + 11166, + 11048, + 11070, + 11046, + 11123, + 11027, + 11043, + 11069, + 11052, + 11095, + 11064, + 11103, + 11038, + 11082, + 11035, + 11051, + 11039, + 11027, + 11040, + 11054, + 11059, + 11173, + 11048, + 11035, + 11055, + 11034, + 11030, + 11095, + 11060, + 11088, + 11018, + 11089, + 11054, + 11028, + 11060, + 11036, + 11052, + 11063, + 11099, + 11031, + 11064, + 11046, + 11002, + 11044, + 11039, + 11040, + 11087, + 11038, + 11064, + 11064, + 11010, + 11071, + 11051, + 11047, + 11087, + 11073, + 11110, + 11030, + 11040, + 11044, + 11036, + 11078, + 11049, + 11067, + 11024, + 11058, + 11077, + 11041, + 11094, + 11079, + 11048, + 11082, + 11064, + 11054, + 11080, + 11059, + 11053, + 11040, + 11057, + 11048, + 11029, + 11067, + 11070, + 11090, + 11057, + 11057, + 11032, + 11061, + 11045, + 11044, + 11056, + 11040, + 11079, + 11017, + 11049, + 11075, + 11078, + 11036, + 11065, + 11020, + 11022, + 11043, + 11027, + 11034, + 11083, + 11087, + 11043, + 11023, + 11057, + 11069, + 11133, + 11056, + 11072, + 11082, + 11065, + 11069, + 11054, + 11069, + 11024, + 11026, + 11035, + 11113, + 11062, + 11020, + 11047, + 11085, + 11059, + 11063, + 11051, + 11060, + 11079, + 11063, + 11029, + 11071, + 11157, + 11025, + 11099, + 11061, + 11020, + 11052, + 11138, + 11109, + 11077, + 11046, + 11065, + 11029, + 11040, + 11065, + 11049, + 11042, + 11050, + 11025, + 11043, + 11102, + 11033, + 11041, + 11362, + 11040, + 11053, + 11057, + 11029, + 11035, + 11036, + 11051, + 11036, + 11040, + 11050, + 11212, + 11081, + 11060, + 11069, + 11027, + 11023, + 11058, + 11065, + 11039, + 11042, + 11059, + 11101, + 11040, + 11033, + 11064, + 11108, + 11048, + 11062, + 11024, + 11085, + 11037, + 11014, + 11024, + 11025, + 11013, + 11064, + 11099, + 11030, + 11045, + 11043, + 11041, + 11069, + 11033, + 11022, + 11073, + 11089, + 11042, + 11059, + 11066, + 11157, + 11041, + 11036, + 11027, + 11071, + 11026, + 11053, + 11042, + 25626, + 11052, + 11062, + 11014, + 11005, + 11060, + 11180, + 11052, + 11014, + 11035, + 11056, + 11055, + 11045, + 11068, + 11098, + 11069, + 11070, + 11043, + 11060, + 11031, + 11023, + 11045, + 11052, + 11052, + 11075, + 11039, + 11054, + 11081, + 11046, + 11012, + 11034, + 11056, + 11054, + 11021, + 11062, + 11047, + 11057, + 11078, + 11065, + 11054, + 11055, + 11088, + 11074, + 11069, + 11035, + 11059, + 11044, + 11044, + 11054, + 11029, + 11091, + 11061, + 11058, + 11031, + 11028, + 11129, + 11047, + 11020, + 11071, + 11045, + 11051, + 11055, + 11072, + 11030, + 11023, + 11053, + 11124, + 11085, + 11063, + 11068, + 11057, + 11047, + 11058, + 11007, + 11074, + 11062, + 11004, + 11080, + 11059, + 11022, + 11037, + 11085, + 11083, + 11024, + 11054, + 11046, + 11058, + 11064, + 11035, + 11066, + 11038, + 11058, + 11077, + 11013, + 11077, + 11033, + 11024, + 11065, + 11050, + 11049, + 11029, + 11037, + 11047, + 11025, + 11025, + 11009, + 11045, + 11043, + 11024, + 11067, + 11058, + 11078, + 11068, + 11058, + 11049, + 11025, + 11038, + 11043, + 11050, + 11066, + 11037, + 11059, + 11052, + 11064, + 11033, + 11052, + 11052, + 11034, + 11063, + 11098, + 11202, + 11013, + 11047, + 11053, + 11053, + 11011, + 11060, + 11015, + 11050, + 11057, + 11041, + 11082, + 11054, + 11060, + 11069, + 11065, + 11019, + 11057, + 11066, + 11064, + 11030, + 11044, + 11193, + 11027, + 11078, + 11080, + 11027, + 11056, + 11036, + 11082, + 11086, + 11054, + 11081, + 11028, + 11068, + 11068, + 11078, + 11087, + 11040, + 11048, + 11027, + 11064, + 11046, + 11034, + 11036, + 11083, + 11112, + 11064, + 11040, + 11022, + 11015, + 11067, + 11092, + 11026, + 11102, + 11047, + 11022, + 11033, + 11076, + 11066, + 11035, + 11054, + 11072, + 11045, + 11056, + 11052, + 11023, + 11046, + 11090, + 11046, + 11046, + 11053, + 11039, + 11035, + 11025, + 11070, + 11054, + 11039, + 11114, + 11071, + 11074, + 11056, + 11025, + 11021, + 11046, + 11055, + 11070, + 11029, + 11022, + 11054, + 11074, + 11054, + 11071, + 11062, + 11038, + 11091, + 11042, + 11082, + 11022, + 11042, + 11059, + 11036, + 11023, + 11075, + 11035, + 11019, + 11021, + 11015, + 11054, + 11052, + 11073, + 11058, + 11059, + 11087, + 11055, + 11053, + 11011, + 11028, + 11053, + 11038, + 11064, + 11051, + 11055, + 11043, + 11053, + 11029, + 11020, + 11051, + 11064, + 11043, + 11062, + 11060, + 11053, + 11089, + 11035, + 11035, + 11053, + 11031, + 11028, + 11040, + 11033, + 11084, + 11050, + 11109, + 11068, + 11039, + 11061, + 11010, + 11043, + 11098, + 11078, + 11042, + 11055, + 11099, + 11024, + 11050, + 11030, + 11034, + 11057, + 11049, + 11018, + 11066, + 11049, + 11072, + 11108, + 11084, + 11030, + 11052, + 11086, + 11030, + 11037, + 11048, + 11061, + 11030, + 11075, + 11047, + 11055, + 11048, + 11050, + 11045, + 11102, + 11078, + 11065, + 11037, + 11078, + 11057, + 11058, + 11019, + 11052, + 11047, + 11110, + 11039, + 11055, + 11052, + 11059, + 11050, + 11031, + 11101, + 11026, + 11005, + 11043, + 11062, + 11055, + 11046, + 11022, + 11254, + 11048, + 11067, + 11062, + 11041, + 11034, + 11065, + 11061, + 11065, + 11269, + 11035, + 11055, + 11051, + 11043, + 11060, + 11025, + 11057, + 11074, + 11042, + 11056, + 11059, + 11045, + 11041, + 11067, + 11029, + 11044, + 11015, + 11062, + 11037, + 11057, + 11011, + 11049, + 11099, + 11093, + 11079, + 11075, + 11095, + 11064, + 11059, + 11056, + 11034, + 11029, + 11021, + 11037, + 11061, + 11047, + 11063, + 11052, + 11055, + 11047, + 11024, + 11069, + 11025, + 11074, + 11051, + 11038, + 11042, + 11079, + 11057, + 11066, + 11077, + 11050, + 11054, + 11066, + 11044, + 11034, + 11048, + 11048, + 11050, + 11082, + 11058, + 11046, + 11048, + 11036, + 11046, + 11069, + 11075, + 11067, + 11044, + 11036, + 11046, + 11059, + 11065, + 11045, + 11040, + 11049, + 11087, + 11107, + 11072, + 11061, + 11063, + 11038, + 11071, + 11071, + 11067, + 11047, + 11080, + 11076, + 11057, + 11059, + 11018, + 11046, + 11035, + 11031, + 11057, + 11075, + 11064, + 11032, + 11025, + 11027, + 11066, + 11058, + 11028, + 11051, + 11060, + 11055, + 11064, + 11032, + 11053, + 11101, + 11045, + 11005, + 11074, + 11091, + 11043, + 11082, + 11038, + 11052, + 11057, + 11070, + 11040, + 11078, + 11079, + 11063, + 14996, + 11044, + 11074, + 11073, + 11060, + 11059, + 11055, + 11030, + 11072, + 11053, + 11059, + 11061, + 11019, + 11072, + 11034, + 11042, + 11067, + 11039, + 11047, + 11080, + 11065, + 11060, + 11040, + 11029, + 11080, + 11085, + 11060, + 11052, + 11049, + 11054, + 11054, + 11061, + 11021, + 11053, + 11047, + 11048, + 11056, + 11109, + 11010, + 11065, + 11049, + 11059, + 11042, + 11014, + 11046, + 11078, + 11039, + 11058, + 11042, + 11039, + 11077, + 11049, + 11049, + 11032, + 11108, + 11047, + 11048, + 11078, + 11012, + 11021, + 11043, + 11062, + 11051, + 11042, + 11015, + 11064, + 11020, + 11050, + 11031, + 11039, + 11042, + 11045, + 11015, + 11020, + 11077, + 11092, + 11071, + 11092, + 11064, + 11060, + 11064, + 11068, + 11062, + 11055, + 11046, + 11057, + 11034, + 11050, + 11047, + 11054, + 11090, + 11064, + 11033, + 11081, + 11065, + 11051, + 11044, + 11060, + 11088, + 11058, + 11070, + 11025, + 11039, + 11014, + 11070, + 11085, + 11081, + 11049, + 11026, + 11040, + 11055, + 11028, + 11021, + 11063, + 11024, + 11050, + 11031, + 11024, + 11069, + 11019, + 11037, + 11037, + 11060, + 11062, + 11071, + 11051, + 11045, + 11044, + 11099, + 11075, + 11046, + 11048, + 11022, + 11047, + 11044, + 11098, + 11048, + 11040, + 11054, + 11015, + 11089, + 11079, + 11049, + 11055, + 11047, + 11025, + 11027, + 11065, + 11080, + 11054, + 11090, + 11014, + 11039, + 11041, + 11069, + 11080, + 11049, + 11049, + 11022, + 11063, + 11076, + 11121, + 11053, + 11050, + 11027, + 11039, + 11054, + 11067, + 11043, + 11134, + 11059, + 11108, + 11043, + 11057, + 11059, + 11068, + 11075, + 11086, + 11045, + 11032, + 11060, + 11053, + 11055, + 11040, + 11033, + 11063, + 11030, + 11055, + 11054, + 11096, + 11025, + 11064, + 11096, + 11087, + 11041, + 11072, + 11084, + 11059, + 11024, + 11058, + 11031, + 11053, + 11032, + 11006, + 11018, + 11025, + 11062, + 11040, + 11057, + 11063, + 11092, + 11054, + 11056, + 11104, + 11077, + 11042, + 11057, + 11017, + 11074, + 11051, + 11051, + 11066, + 11047, + 11061, + 11078, + 11054, + 11048, + 11077, + 11056, + 11027, + 11056, + 11082, + 11033, + 11066, + 11085, + 11041, + 11056, + 11024, + 11033, + 11041, + 11020, + 11066, + 11063, + 11044, + 11065, + 11063, + 11027, + 11048, + 11036, + 11043, + 11087, + 11046, + 11069, + 11069, + 11074, + 11064, + 11038, + 11033, + 11050, + 11022, + 11032, + 11020, + 11023, + 11078, + 11121, + 11037, + 11066, + 11076, + 11060, + 11044, + 11044, + 11054, + 11071, + 11062, + 11059, + 11043, + 11055, + 11080, + 11067, + 11041, + 11062, + 11050, + 11031, + 11068, + 11025, + 11051, + 11043, + 11032, + 11067, + 11036, + 11053, + 11042, + 11080, + 16477, + 11049, + 11052, + 11148, + 11034, + 11075, + 11081, + 11038, + 11040, + 11016, + 11074, + 11064, + 11044, + 11017, + 11066, + 11043, + 11067, + 11027, + 11078, + 11034, + 11132, + 11081, + 11016, + 11119, + 11071, + 11067, + 11035, + 11078, + 11060, + 11064, + 11058, + 11055, + 11094, + 11052, + 11084, + 11102, + 11099, + 11064, + 11056, + 11316, + 11067, + 11047, + 11084, + 11055, + 11068, + 11084, + 11079, + 11041, + 11051, + 11054, + 11021, + 11070, + 11066, + 11033, + 11067, + 11059, + 11047, + 11077, + 11045, + 11056, + 11048, + 11035, + 11057, + 11058, + 11071, + 11080, + 11069, + 11051, + 11059, + 11044, + 11043, + 11023, + 11069, + 11024, + 11039, + 11046, + 11087, + 11041, + 11046, + 11048, + 11067, + 11034, + 11043, + 11023, + 11045, + 11044, + 11071, + 11035, + 11043, + 11105, + 11045, + 11013, + 11045, + 11045, + 11060, + 11041, + 11055, + 11020, + 11060, + 11060, + 11051, + 11036, + 11012, + 11023, + 11043, + 11026, + 11106, + 11075, + 11080, + 11082, + 11060, + 11028, + 11067, + 11033, + 11050, + 11050, + 11101, + 11047, + 11046, + 11055, + 11055, + 11057, + 11055, + 11054, + 11032, + 11052, + 11044, + 11055, + 11053, + 11035, + 11082, + 11043, + 11023, + 11047, + 11027, + 11028, + 11089, + 11023, + 11107, + 11035, + 11028, + 11064, + 11040, + 11041, + 11057, + 11024, + 11055, + 11041, + 11094, + 11070, + 11049, + 11032, + 11098, + 11059, + 11024, + 11101, + 11028, + 11065, + 11038, + 11061, + 11060, + 11040, + 11053, + 11038, + 11050, + 11014, + 11097, + 11033, + 11026, + 11069, + 11048, + 11041, + 11060, + 11097, + 11053, + 11099, + 11023, + 11050, + 11059, + 11055, + 11062, + 11052, + 11054, + 11037, + 11058, + 11046, + 11053, + 11033, + 11053, + 11068, + 11063, + 11634, + 11082, + 11061, + 11042, + 11095, + 11068, + 11026, + 11056, + 11044, + 11039, + 11056, + 11051, + 11113, + 11042, + 11026, + 11074, + 11071, + 11057, + 11051, + 11022, + 11165, + 11069, + 11035, + 11062, + 11054, + 11053, + 11053, + 11062, + 11074, + 11078, + 11038, + 11047, + 11057, + 11088, + 11026, + 11070, + 11069, + 11098, + 11059, + 11024, + 11062, + 11035, + 11075, + 11038, + 11020, + 11017, + 11062, + 11020, + 11029, + 11065, + 11064, + 11040, + 11091, + 11064, + 11048, + 17021, + 11058, + 11060, + 11036, + 11052, + 11050, + 11062, + 11039, + 11073, + 11056, + 11080, + 11091, + 11047, + 11111, + 11038, + 11060, + 11035, + 11043, + 11033, + 11022, + 11069, + 11077, + 11111, + 11097, + 11060, + 11050, + 11047, + 11033, + 11046, + 11070, + 11041, + 11032, + 11027, + 11029, + 11062, + 11044, + 11031, + 11045, + 11035, + 11022, + 11039, + 11028, + 11039, + 11019, + 11067, + 11017, + 11059, + 11132, + 11077, + 11083, + 11029, + 11068, + 11026, + 11026, + 11033, + 11029, + 11132, + 11039, + 11031, + 11023, + 11066, + 11041, + 11066, + 11073, + 11066, + 11037, + 11057, + 11048, + 11053, + 11033, + 11072, + 11057, + 11045, + 11050, + 11039, + 11063, + 11052, + 11031, + 11040, + 11051, + 11052, + 11060, + 11070, + 11067, + 11058, + 11054, + 11063, + 11104, + 11047, + 11032, + 11020, + 11073, + 11048, + 11037, + 11064, + 11055, + 11051, + 11112, + 11101, + 11061, + 11027, + 11046, + 11216, + 11047, + 11063, + 11036, + 11047, + 11092, + 11018, + 11070, + 11011, + 11060, + 11020, + 11035, + 11037, + 11044, + 11056, + 11049, + 11040, + 11064, + 11034, + 11026, + 11045, + 11062, + 11023, + 11080, + 11063, + 11081, + 11032, + 11027, + 11054, + 11036, + 11039, + 11036, + 11042, + 11047, + 11071, + 11156, + 11020, + 11068, + 11064, + 11102, + 11061, + 11061, + 11057, + 11049, + 11244, + 11021, + 11046, + 14661, + 11023, + 11054, + 11063, + 11060, + 11043, + 11046, + 11056, + 11070, + 11074, + 11032, + 11053, + 11027, + 11044, + 11017, + 11045, + 11080, + 11048, + 11052, + 11016, + 11029, + 11057, + 11058, + 11029, + 11041, + 11060, + 11017, + 11069, + 11043, + 11040, + 11042, + 11072, + 11054, + 11064, + 11055, + 11068, + 11066, + 11029, + 11071, + 11049, + 11062, + 11055, + 11026, + 11014, + 11123, + 11037, + 11028, + 11056, + 11008, + 11023, + 11033, + 11024, + 11048, + 11025, + 11114, + 11061, + 11045, + 11055, + 11031, + 11041, + 11028, + 11062, + 11046, + 11035, + 11034, + 11032, + 11032, + 11060, + 11050, + 11050, + 11051, + 11048, + 11047, + 11037, + 11097, + 11075, + 11057, + 11073, + 11016, + 11061, + 11049, + 11081, + 11038, + 11025, + 11019, + 11071, + 11050, + 11062, + 11033, + 11047, + 11046, + 11045, + 11100, + 11032, + 11054, + 11023, + 11039, + 11057, + 11028, + 11016, + 11051, + 11066, + 11072, + 11048, + 11043, + 11025, + 11068, + 11077, + 11059, + 11089, + 11056, + 11050, + 11059, + 11024, + 11031, + 11013, + 11103, + 11048, + 11056, + 11059, + 11029, + 11077, + 11052, + 11063, + 11025, + 11072, + 11043, + 11057, + 11043, + 11038, + 11049, + 11065, + 11038, + 11064, + 11064, + 11031, + 11025, + 11051, + 11059, + 11046, + 11051, + 11071, + 11065, + 11088, + 11059, + 11061, + 11043, + 11021, + 11075, + 11025, + 11036, + 11034, + 11090, + 11009, + 11038, + 11047, + 11057, + 11048, + 11050, + 11043, + 11089, + 11072, + 11043, + 11031, + 11079, + 11076, + 11030, + 11093, + 11072, + 11076, + 11058, + 11079, + 11050, + 11043, + 11053, + 11057, + 11047, + 11048, + 11326, + 11028, + 11043, + 11069, + 11041, + 11059, + 11076, + 11067, + 11056, + 11039, + 11044, + 11070, + 11068, + 11096, + 11119, + 11077, + 11059, + 11071, + 11058, + 11093, + 11065, + 11088, + 11070, + 11100, + 11072, + 11117, + 11048, + 11061, + 11082, + 11092, + 11057, + 11075, + 11032, + 11041, + 11024, + 11077, + 11002, + 11079, + 11053, + 11061, + 11027, + 11046, + 11072, + 11052, + 11036, + 11072, + 11050, + 11025, + 11030, + 11072, + 11035, + 11087, + 11025, + 11023, + 11028, + 11029, + 11083, + 11045, + 11037, + 11044, + 11050, + 11071, + 11048, + 11087, + 11140, + 11064, + 11041, + 11084, + 11090, + 11039, + 11094, + 11025, + 11051, + 11082, + 11080, + 11053, + 11080, + 11050, + 11052, + 11088, + 11060, + 11077, + 11074, + 11035, + 11030, + 11029, + 11060, + 11053, + 11018, + 11025, + 11034, + 11087, + 11021, + 11071, + 11040, + 11041, + 11085, + 11053, + 11018, + 11027, + 11047, + 11040, + 11045, + 11034, + 11061, + 11021, + 10995, + 11054, + 11058, + 11017, + 11083, + 11055, + 11061, + 11009, + 11070, + 11050, + 11059, + 11042, + 11034, + 11015, + 11036, + 11072, + 11066, + 11035, + 11067, + 11059, + 11058, + 11209, + 11056, + 11052, + 11032, + 11062, + 11103, + 11062, + 11072, + 11046, + 11058, + 11036, + 11076, + 11049, + 11035, + 11046, + 11026, + 11058, + 11024, + 11084, + 11017, + 11060, + 11030, + 11059, + 11028, + 11053, + 11055, + 11032, + 11082, + 11057, + 11074, + 11071, + 11041, + 11063, + 11097, + 11047, + 11038, + 11060, + 11091, + 11084, + 11068, + 11040, + 11103, + 11094, + 11085, + 11060, + 11060, + 11041, + 11030, + 11032, + 11026, + 11032, + 11047, + 11026, + 11098, + 11054, + 11084, + 11038, + 11056, + 11111, + 11030, + 11079, + 11049, + 11104, + 11058, + 11067, + 11055, + 11032, + 11048, + 11055, + 11066, + 11053, + 11038, + 11060, + 11076, + 11058, + 11049, + 11049, + 11050, + 11070, + 11044, + 11057, + 11072, + 11046, + 11044, + 11025, + 11065, + 11046, + 11029, + 11025, + 11041, + 11084, + 11023, + 11038, + 11044, + 11043, + 11031, + 11057, + 11050, + 11037, + 11040, + 11035, + 11053, + 11034, + 11026, + 11058, + 11051, + 11038, + 11017, + 11021, + 11067, + 11062, + 11079, + 11049, + 11055, + 11092, + 11043, + 11052, + 11070, + 11066, + 11067, + 11036, + 11015, + 11044, + 11101, + 11066, + 11079, + 11086, + 11010, + 11059, + 11047, + 11039, + 11056, + 11056, + 11029, + 11033, + 11098, + 11055, + 11072, + 11082, + 11098, + 11023, + 11090, + 11077, + 11083, + 11074, + 11089, + 11089, + 11056, + 11082, + 11084, + 11035, + 11043, + 11077, + 11050, + 11064, + 11065, + 11082, + 11050, + 11089, + 11055, + 11084, + 11025, + 11101, + 11057, + 11178, + 11093, + 11024, + 11032, + 11049, + 11114, + 11087, + 11068, + 11076, + 11053, + 11079, + 11036, + 11068, + 11112, + 11123, + 11033, + 11070, + 11056, + 11075, + 11049, + 11012, + 11056, + 11064, + 11045, + 11025, + 11110, + 11058, + 11019, + 11050, + 11061, + 11047, + 11046, + 11055, + 11089, + 11064, + 11033, + 11085, + 11053, + 11043, + 11049, + 11046, + 11033, + 11071, + 11077, + 11097, + 11044, + 11015, + 11035, + 11067, + 11035, + 11025, + 11064, + 11018, + 11035, + 11057, + 11037, + 11087, + 11033, + 11046, + 11052, + 11070, + 11054, + 11094, + 11074, + 11092, + 11025, + 11027, + 11035, + 11283, + 11042, + 11042, + 11087, + 11037, + 11024, + 11048, + 11030, + 11070, + 11037, + 11039, + 11038, + 11074, + 11035, + 11088, + 11084, + 11070, + 11037, + 11059, + 11054, + 11027, + 11037, + 11041, + 11065, + 11112, + 11062, + 11109, + 11075, + 11058, + 11043, + 11016, + 11038, + 11035, + 11021, + 11027, + 11039, + 11028, + 11070, + 11160, + 11034, + 11079, + 11044, + 11083, + 11092, + 11069, + 11070, + 11060, + 11023, + 11070, + 11034, + 11048, + 11017, + 11040, + 11063, + 11067, + 11027, + 11221, + 11052, + 11051, + 11031, + 11093, + 11047, + 11079, + 11056, + 11089, + 11074, + 11070, + 11087, + 11047, + 11067, + 11039, + 11026, + 11102, + 11079, + 11043, + 11021, + 11052, + 11129, + 11100, + 11061, + 11108, + 11073, + 11048, + 11029, + 11073, + 11020, + 11041, + 11073, + 11054, + 11066, + 11075, + 11063, + 11049, + 11068, + 11034, + 11054, + 11027, + 11026, + 11046, + 11066, + 11029, + 11038, + 11040, + 11055, + 11059, + 11017, + 11045, + 11062, + 11030, + 11019, + 11119, + 11021, + 11034, + 11020, + 11029, + 11069, + 11084, + 11064, + 11073, + 11046, + 11049, + 11071, + 11071, + 11063, + 11041, + 11030, + 11086, + 11050, + 11076, + 11075, + 11075, + 11060, + 11076, + 11063, + 11070, + 11038, + 11055, + 11064, + 11044, + 11055, + 11059, + 11040, + 11066, + 11037, + 11044, + 11049, + 11034, + 11086, + 11024, + 11049, + 11046, + 11042, + 11051, + 11062, + 11026, + 11053, + 11050, + 11077, + 11063, + 11028, + 11045, + 11026, + 11027, + 11065, + 11046, + 11036, + 11046, + 11027, + 11046, + 11061, + 11040, + 11031, + 11012, + 11077, + 11056, + 11063, + 11079, + 11076, + 11097, + 11041, + 11038, + 11047, + 11090, + 11030, + 11019, + 11072, + 11080, + 11086, + 11065, + 11073, + 11053, + 11074, + 11028, + 11057, + 11071, + 11078, + 11047, + 11054, + 11067, + 11060, + 11081, + 11065, + 11021, + 11038, + 11073, + 11121, + 11028, + 11012, + 11063, + 11065, + 11062, + 11062, + 11052, + 11036, + 11031, + 11048, + 11057, + 11033, + 11044, + 11059, + 11037, + 11050, + 11043, + 11059, + 11057, + 11059, + 11051, + 11038, + 11054, + 11047, + 11037, + 11137, + 11071, + 11073, + 11093, + 11054, + 11056, + 11042, + 11060, + 11061, + 11079, + 11068, + 11058, + 11076, + 11062, + 11058, + 11036, + 11064, + 11101, + 11062, + 11051, + 11051, + 11035, + 11055, + 11064, + 11050, + 11079, + 11089, + 11038, + 11053, + 11032, + 11057, + 11082, + 11074, + 11063, + 11079, + 11058, + 11012, + 11086, + 11050, + 11014, + 11024, + 11054, + 11051, + 11051, + 11074, + 11032, + 11056, + 11058, + 11070, + 11054, + 11021, + 11067, + 11092, + 11058, + 11045, + 11025, + 11046, + 11032, + 11040, + 11088, + 11071, + 11057, + 11050, + 11089, + 11067, + 11074, + 11033, + 11030, + 11066, + 11031, + 11044, + 11024, + 11083, + 11046, + 11690, + 11054, + 11065, + 11040, + 11016, + 11073, + 11043, + 11039, + 11076, + 11054, + 11035, + 11061, + 11053, + 11020, + 11043, + 11067, + 11017, + 11057, + 11060, + 11028, + 11051, + 11060, + 11017, + 11045, + 11063, + 11066, + 11058, + 11050, + 11050, + 11014, + 11031, + 11023, + 11064, + 11069, + 11068, + 11047, + 11085, + 11056, + 11066, + 11061, + 11043, + 11042, + 11061, + 11012, + 11030, + 11038, + 11074, + 11058, + 11036, + 11082, + 11036, + 11095, + 11029, + 11050, + 11020, + 11023, + 11031, + 11078, + 11036, + 11060, + 11052, + 11064, + 11065, + 11082, + 11087, + 11044, + 11062, + 11032, + 11052, + 11052, + 11029, + 11092, + 11022, + 11049, + 11034, + 11033, + 11024, + 11049, + 11063, + 11064, + 11055, + 11087, + 11040, + 11061, + 11067, + 11025, + 11066, + 11049, + 11020, + 11093, + 11035, + 11044, + 11042, + 11057, + 11041, + 11077, + 11033, + 11062, + 11032, + 11120, + 11039, + 11053, + 11039, + 11018, + 11086, + 11079, + 11031, + 11048, + 11051, + 11050, + 11028, + 11062, + 11047, + 11076, + 11042, + 11065, + 11057, + 11096, + 11047, + 11039, + 11068, + 11022, + 11036, + 11106, + 11029, + 11017, + 11070, + 11080, + 11041, + 11099, + 11069, + 11069, + 11044, + 11026, + 11098, + 11051, + 11050, + 11054, + 11094, + 11070, + 11044, + 11067, + 11057, + 11071, + 11066, + 11027, + 11027, + 11076, + 11390, + 11038, + 11042, + 11064, + 11071, + 11051, + 11080, + 11069, + 11071, + 11048, + 11014, + 11063, + 11063, + 11013, + 11022, + 11046, + 11070, + 11086, + 11023, + 11075, + 11050, + 11062, + 11062, + 11061, + 11055, + 11024, + 11009, + 11044, + 11046, + 11107, + 11059, + 11075, + 11051, + 11078, + 11062, + 11051, + 11042, + 11105, + 11017, + 11043, + 11068, + 11101, + 11045, + 11044, + 11333, + 11060, + 11035, + 11053, + 11051, + 11060, + 11042, + 11038, + 11044, + 11086, + 11025, + 11040, + 11046, + 11060, + 11035, + 11067, + 11055, + 11092, + 11070, + 11100, + 11073, + 11047, + 11053, + 11053, + 11066, + 11063, + 11040, + 11075, + 11023, + 11078, + 11059, + 11061, + 11074, + 11046, + 11103, + 11053, + 11062, + 11030, + 11035, + 11070, + 11043, + 11022, + 11062, + 11038, + 11062, + 11053, + 11052, + 11041, + 11037, + 11050, + 11089, + 11080, + 11058, + 11030, + 11030, + 11053, + 11019, + 11131, + 11050, + 11045, + 11062, + 11056, + 11044, + 11070, + 11053, + 11091, + 11038, + 11051, + 11013, + 11074, + 11042, + 11058, + 11055, + 11039, + 11035, + 11025, + 11035, + 11022, + 11030, + 11054, + 11086, + 11053, + 11043, + 11040, + 11043, + 11026, + 11075, + 11073, + 11054, + 11039, + 11040, + 11048, + 11050, + 11063, + 11094, + 11052, + 11061, + 11032, + 11028, + 11089, + 11019, + 11060, + 11088, + 11059, + 11076, + 11102, + 11006, + 11060, + 11048, + 11057, + 11077, + 11035, + 11059, + 27531, + 11046, + 11018, + 11052, + 11059, + 11027, + 11069, + 11045, + 11033, + 11032, + 11113, + 11036, + 11024, + 11057, + 11051, + 11028, + 11120, + 11049, + 11075, + 11069, + 11075, + 11061, + 11096, + 11076, + 11022, + 11102, + 11038, + 11106, + 11072, + 11051, + 11020, + 11026, + 11043, + 11067, + 11046, + 11028, + 11066, + 11066, + 11044, + 11039, + 11052, + 11044, + 11034, + 11060, + 11048, + 11072, + 11088, + 11069, + 11064, + 11053, + 11042, + 11065, + 11045, + 11045, + 11060, + 11037, + 11011, + 11031, + 11072, + 11036, + 11059, + 11033, + 11099, + 11051, + 11073, + 11058, + 11041, + 11039, + 11046, + 11122, + 11053, + 11090, + 11028, + 11013, + 11071, + 11046, + 11051, + 11101, + 11046, + 11038, + 11042, + 11029, + 11100, + 11094, + 11085, + 11019, + 11062, + 11060, + 11069, + 11029, + 11050, + 11026, + 11022, + 11023, + 11030, + 11025, + 11061, + 11028, + 11011, + 11038, + 11045, + 11071, + 11034, + 11041, + 11022, + 11082, + 11078, + 11059, + 11054, + 11024, + 11063, + 11051, + 11051, + 11048, + 11073, + 11046, + 11074, + 11030, + 11098, + 11053, + 11011, + 11046, + 11060, + 11063, + 11081, + 11071, + 11052, + 11043, + 11074, + 11018, + 11067, + 11067, + 11021, + 11035, + 11067, + 11087, + 11039, + 11033, + 11080, + 11051, + 11014, + 11041, + 11040, + 11047, + 11070, + 11158, + 11073, + 11049, + 11038, + 11119, + 11020, + 11067, + 11051, + 11052, + 11050, + 11058, + 11104, + 11054, + 11041, + 11074, + 11075, + 11050, + 11062, + 11052, + 11052, + 11055, + 11043, + 11076, + 11052, + 11052, + 11047, + 11049, + 11043, + 11039, + 11024, + 11043, + 11055, + 11051, + 11043, + 11081, + 11055, + 11055, + 11058, + 11093, + 11063, + 11069, + 11057, + 11080, + 11044, + 11035, + 11057, + 11057, + 11046, + 11076, + 11107, + 11048, + 11088, + 11139, + 11026, + 11022, + 11010, + 11054, + 11033, + 11032, + 11071, + 11032, + 11016, + 11063, + 11027, + 11033, + 11053, + 11028, + 11040, + 11072, + 11045, + 11052, + 11031, + 11058, + 11084, + 11020, + 11077, + 11051, + 11038, + 11059, + 11036, + 11022, + 11082, + 11051, + 11043, + 11037, + 11033, + 11021, + 11032, + 11063, + 11062, + 11076, + 11054, + 11051, + 11064, + 11042, + 11506, + 11021, + 11062, + 11065, + 11064, + 11085, + 11085, + 11091, + 11051, + 11082, + 11067, + 11043, + 11057, + 11056, + 11046, + 11063, + 11083, + 11047, + 11075, + 11062, + 11065, + 11066, + 11077, + 11058, + 11057, + 11084, + 11045, + 11062, + 11012, + 11064, + 11070, + 11064, + 11029, + 11092, + 11047, + 11044, + 11041, + 11045, + 11044, + 11061, + 11039, + 11061, + 11015, + 11082, + 11043, + 11054, + 11036, + 11038, + 11072, + 11025, + 11030, + 11041, + 11071, + 11072, + 11095, + 11108, + 11071, + 11042, + 11059, + 11049, + 11057, + 11037, + 11090, + 11082, + 11097, + 11035, + 11055, + 11050, + 11055, + 11042, + 11130, + 11053, + 11045, + 11041, + 11027, + 11057, + 11045, + 11095, + 11081, + 11072, + 11054, + 11049, + 11042, + 11038, + 11049, + 11056, + 11060, + 11059, + 11050, + 11048, + 11029, + 11024, + 11052, + 11065, + 11033, + 11027, + 11026, + 11052, + 11062, + 11049, + 11033, + 11044, + 11037, + 11045, + 11044, + 11015, + 11048, + 11059, + 11087, + 11027, + 11075, + 11084, + 11062, + 11092, + 11019, + 11031, + 11056, + 11035, + 11010, + 11042, + 11055, + 11111, + 11034, + 11034, + 11035, + 11023, + 11042, + 11105, + 11096, + 11153, + 11070, + 11034, + 11038, + 11106, + 11026, + 11043, + 11046, + 11033, + 11030, + 11052, + 11064, + 11050, + 11085, + 11078, + 11031, + 11082, + 11035, + 11063, + 11070, + 11058, + 11034, + 11059, + 11046, + 11051, + 11070, + 11034, + 11144, + 11059, + 11033, + 11034, + 11032, + 11103, + 11025, + 11041, + 11048, + 11065, + 11076, + 11034, + 11056, + 11013, + 11069, + 11075, + 11064, + 11041, + 11044, + 11026, + 11033, + 11111, + 11055, + 11024, + 11047, + 11033, + 11051, + 11061, + 11060, + 11069, + 11056, + 11035, + 11017, + 11018, + 11080, + 11116, + 11031, + 11050, + 11027, + 11046, + 11074, + 11077, + 11055, + 11046, + 11066, + 11067, + 11053, + 11035, + 11016, + 11088, + 11050, + 11034, + 11055, + 11101, + 11047, + 11020, + 11067, + 11070, + 11056, + 11117, + 11039, + 11032, + 11027, + 11048, + 11042, + 11043, + 11082, + 11032, + 11032, + 11050, + 11044, + 11044, + 11036, + 11037, + 11053, + 11055, + 11129, + 11040, + 11059, + 11077, + 11044, + 11020, + 11047, + 11165, + 11052, + 11037, + 11055, + 11044, + 11062, + 11052, + 11045, + 11072, + 11042, + 11087, + 11075, + 11051, + 11030, + 11097, + 11121, + 11064, + 11056, + 11068, + 11090, + 11066, + 11065, + 11063, + 11088, + 11102, + 11023, + 11056, + 11100, + 11098, + 11028, + 11026, + 11063, + 11077, + 11024, + 11036, + 11058, + 11053, + 11070, + 11044, + 11053, + 11035, + 11057, + 11052, + 11056, + 11072, + 11059, + 11061, + 11037, + 11047, + 11061, + 11037, + 11035, + 11072, + 11024, + 11033, + 11099, + 11092, + 11111, + 11080, + 11046, + 11022, + 11035, + 11064, + 11056, + 11045, + 11027, + 11058, + 11031, + 11041, + 11030, + 11028, + 11026, + 11048, + 11055, + 11048, + 11057, + 11087, + 11064, + 11103, + 11020, + 11067, + 11052, + 11037, + 11046, + 11052, + 11052, + 11043, + 11070, + 11048, + 11085, + 11058, + 11040, + 11073, + 11040, + 11056, + 11034, + 11020, + 11046, + 11048, + 11092, + 11034, + 11060, + 11056, + 11036, + 11044, + 11058, + 11070, + 11025, + 11026, + 11077, + 11042, + 11022, + 11063, + 11049, + 11048, + 11023, + 11040, + 11036, + 11038, + 11045, + 11096, + 11059, + 11072, + 11069, + 11068, + 11070, + 11035, + 11047, + 11044, + 11078, + 11046, + 11036, + 11053, + 11078, + 11069, + 11040, + 11038, + 11075, + 11057, + 11044, + 11040, + 11037, + 11061, + 11025, + 11049, + 11081, + 11050, + 11032, + 11060, + 11068, + 11030, + 11082, + 11043, + 11036, + 11059, + 11053, + 11043, + 11067, + 11041, + 11041, + 11051, + 11049, + 11036, + 11014, + 11055, + 11059, + 11050, + 11069, + 11019, + 11056, + 11112, + 11065, + 11074, + 11047, + 11025, + 11051, + 11026, + 11027, + 11039, + 11102, + 11054, + 11078, + 11040, + 11109, + 11063, + 11071, + 11041, + 11059, + 11086, + 11053, + 11029, + 11031, + 11041, + 11050, + 11055, + 11056, + 11061, + 11055, + 11021, + 11044, + 11051, + 11026, + 11085, + 11047, + 11091, + 11091, + 11022, + 11069, + 11032, + 11029, + 11078, + 11028, + 11056, + 11063, + 11051, + 11041, + 11052, + 11049, + 11070, + 11050, + 11034, + 11053, + 11035, + 11032, + 11057, + 11057, + 11065, + 11049, + 11006, + 11042, + 11050, + 11033, + 11041, + 11083, + 11036, + 11039, + 11069, + 11052, + 11071, + 11044, + 11061, + 11028, + 11091, + 11023, + 11070, + 11094, + 11064, + 11056, + 11093, + 11039, + 11089, + 11093, + 11063, + 11021, + 11057, + 11057, + 11071, + 11052, + 11054, + 11073, + 11067, + 11029, + 11072, + 11131, + 11019, + 11043, + 11056, + 11010, + 11046, + 11035, + 11088, + 11061, + 11067, + 11039, + 11040, + 11055, + 11029, + 11048, + 11058, + 11033, + 11045, + 11031, + 11045, + 11058, + 11048, + 11056, + 11049, + 11045, + 11033, + 11046, + 11091, + 11061, + 11045, + 11077, + 11073, + 11120, + 11034, + 11076, + 11042, + 11106, + 11069, + 11066, + 11033, + 11017, + 11054, + 11045, + 11037, + 11018, + 11117, + 11030, + 11060, + 11042, + 11038, + 11028, + 11048, + 11051, + 11040, + 11074, + 11030, + 11020, + 11065, + 11030, + 11050, + 11071, + 11039, + 11046, + 11043, + 11065, + 11039, + 11047, + 11041, + 11061, + 11077, + 11020, + 11055, + 11072, + 11021, + 11058, + 11067, + 11064, + 11079, + 11040, + 11077, + 11052, + 11093, + 11094, + 11023, + 11082, + 11033, + 11054, + 11097, + 11020, + 11044, + 11049, + 11042, + 11033, + 11061, + 11058, + 11071, + 11062, + 11021, + 11075, + 11079, + 11070, + 11100, + 11043, + 11028, + 11058, + 11110, + 11041, + 11042, + 11074, + 11047, + 11053, + 11020, + 11079, + 11047, + 11057, + 11050, + 11026, + 11055, + 11074, + 11077, + 11018, + 11051, + 11049, + 11033, + 11014, + 11034, + 11058, + 11083, + 11028, + 11032, + 11068, + 11055, + 11027, + 11035, + 11020, + 11037, + 11078, + 11069, + 11089, + 11036, + 11045, + 11041, + 11074, + 11060, + 11076, + 11066, + 11033, + 11028, + 11049, + 11068, + 11038, + 11045, + 11064, + 11058, + 11048, + 11056, + 11134, + 11046, + 11042, + 11049, + 11029, + 11046, + 11056, + 11050, + 11044, + 11049, + 11050, + 11074, + 11044, + 11079, + 11056, + 11057, + 11040, + 11064, + 11046, + 11055, + 11062, + 11107, + 11040, + 11035, + 11077, + 11071, + 11058, + 11033, + 11033, + 11055, + 11056, + 11054, + 11073, + 11033, + 11022, + 11087, + 11023, + 11064, + 11032, + 11038, + 11039, + 11051, + 11067, + 11062, + 11072, + 11059, + 11035, + 11072, + 11068, + 11628, + 11040, + 11062, + 11027, + 11075, + 11052, + 11092, + 11040, + 11061, + 11055, + 11053, + 11093, + 11061, + 11076, + 11081, + 11070, + 11069, + 11035, + 11027, + 11038, + 11048, + 11060, + 11035, + 11089, + 11039, + 11052, + 11025, + 11049, + 11049, + 11059, + 11034, + 11068, + 11030, + 11039, + 11043, + 11024, + 11068, + 11042, + 11058, + 11053, + 11136, + 11078, + 11072, + 11030, + 11044, + 11028, + 11038, + 11076, + 11052, + 11066, + 11063, + 11067, + 11060, + 11058, + 11050, + 11038, + 11070, + 11075, + 11045, + 11059, + 11065, + 11063, + 11044, + 11051, + 11059, + 11069, + 11036, + 11041, + 11053, + 11067, + 11037, + 11107, + 11063, + 11056, + 11090, + 11033, + 11028, + 11069, + 11115, + 11042, + 11048, + 11044, + 11039, + 11059, + 11040, + 11072, + 11027, + 11054, + 11036, + 11075, + 11038, + 11040, + 11070, + 11033, + 11065, + 11048, + 11064, + 11050, + 11043, + 11056, + 11019, + 11011, + 11059, + 11028, + 11062, + 11014, + 11044, + 11025, + 11049, + 11066, + 11033, + 11050, + 11049, + 11021, + 11032, + 11040, + 11061, + 11062, + 11092, + 11046, + 11065, + 11062, + 11065, + 11081, + 11054, + 11054, + 11079, + 11018, + 11071, + 11044, + 11056, + 11057, + 11077, + 11067, + 11035, + 11048, + 11052, + 11026, + 11080, + 11068, + 11108, + 11061, + 11065, + 11013, + 11022, + 11127, + 11064, + 11072, + 11037, + 11063, + 11080, + 11070, + 11047, + 11013, + 11081, + 11068, + 11033, + 11053, + 11053, + 11041, + 11045, + 11011, + 11118, + 11082, + 11065, + 11024, + 11034, + 11103, + 11035, + 11062, + 11032, + 11101, + 11027, + 11043, + 11062, + 11039, + 11040, + 11025, + 11105, + 11035, + 11070, + 11049, + 11052, + 11042, + 11049, + 11060, + 11072, + 11055, + 11049, + 11056, + 11078, + 11074, + 11044, + 11052, + 11075, + 11052, + 11063, + 11038, + 11061, + 11018, + 11041, + 11067, + 11051, + 11057, + 11015, + 11041, + 11060, + 11048, + 11047, + 11096, + 11037, + 11059, + 11109, + 11065, + 11053, + 11056, + 11058, + 11042, + 11030, + 11056, + 11058, + 11021, + 11050, + 11071, + 11074, + 11071, + 11068, + 11059, + 11060, + 11033, + 11038, + 11030, + 11058, + 11068, + 11043, + 11056, + 11081, + 11119, + 11053, + 11069, + 11082, + 11031, + 11047, + 11032, + 11093, + 11067, + 11076, + 11073, + 11032, + 11053, + 11064, + 11048, + 11029, + 11060, + 11058, + 11026, + 11062, + 11043, + 11034, + 11052, + 11074, + 11007, + 11025, + 11050, + 11043, + 11061, + 11046, + 11074, + 11028, + 11078, + 11020, + 11059, + 11035, + 11057, + 11070, + 11072, + 11058, + 11058, + 11031, + 11083, + 11087, + 11055, + 11020, + 11054, + 11035, + 11054, + 11083, + 11080, + 11049, + 11028, + 11059, + 11040, + 11031, + 11067, + 11034, + 11010, + 11031, + 11109, + 11068, + 11064, + 11051, + 11071, + 11061, + 11037, + 11016, + 11022, + 11052, + 11035, + 11029, + 11046, + 11061, + 11058, + 11042, + 11010, + 11016, + 11019, + 11073, + 11083, + 11060, + 11093, + 11036, + 11083, + 11062, + 11072, + 11026, + 11059, + 11052, + 11049, + 11022, + 11057, + 11020, + 11061, + 11010, + 11043, + 11073, + 11060, + 11044, + 11054, + 11093, + 11059, + 11053, + 11023, + 11028, + 11062, + 11098, + 11060, + 11042, + 11053, + 11039, + 11052, + 11073, + 11053, + 11052, + 11044, + 11026, + 11055, + 11086, + 11047, + 11057, + 11095, + 11045, + 11104, + 11087, + 11076, + 11055, + 11044, + 11069, + 11058, + 11089, + 11061, + 11069, + 11054, + 11116, + 11055, + 11056, + 11059, + 11071, + 11087, + 11075, + 11051, + 11037, + 11068, + 11063, + 11044, + 11203, + 11048, + 11068, + 11039, + 11043, + 11069, + 11070, + 11068, + 11037, + 11104, + 11066, + 11082, + 11027, + 11042, + 11055, + 11024, + 11052, + 11065, + 11089, + 11043, + 11035, + 11077, + 11054, + 11044, + 11062, + 11042, + 11056, + 11047, + 11077, + 11043, + 11081, + 11080, + 11088, + 11031, + 11040, + 11097, + 11041, + 11079, + 11052, + 11024, + 11040, + 11055, + 11065, + 11082, + 11016, + 11058, + 11067, + 11099, + 11038, + 11035, + 11075, + 11030, + 11100, + 11073, + 11050, + 11058, + 11071, + 11057, + 11057, + 11102, + 11001, + 11046, + 11059, + 11049, + 11032, + 11029, + 11079, + 11020, + 11092, + 11037, + 11038, + 11021, + 11030, + 11078, + 11045, + 11057, + 11037, + 11057, + 11073, + 11055, + 11075, + 11069, + 11032, + 11036, + 11049, + 11059, + 11047, + 11040, + 11043, + 11067, + 11051, + 11060, + 11050, + 11011, + 11049, + 11055, + 11068, + 11060, + 11022, + 11085, + 11107, + 11050, + 11052, + 11080, + 11057, + 11020, + 11030, + 11059, + 11057, + 11083, + 11091, + 11058, + 11027, + 11046, + 11053, + 11067, + 11050, + 11050, + 11054, + 11051, + 11060, + 11068, + 11015, + 11027, + 11049, + 11030, + 11047, + 11059, + 11053, + 11037, + 11053, + 11094, + 11053, + 11046, + 11270, + 11041, + 11018, + 11044, + 11028, + 11025, + 11052, + 11026, + 11068, + 11067, + 11053, + 11045, + 11051, + 11059, + 11058, + 11037, + 11064, + 11093, + 11050, + 11052, + 35571, + 11018, + 11049, + 11063, + 11046, + 11051, + 11044, + 11059, + 11064, + 11077, + 11073, + 11049, + 11024, + 11091, + 11067, + 11084, + 11049, + 11067, + 11045, + 11050, + 11025, + 11087, + 11128, + 11057, + 11089, + 11062, + 11067, + 11060, + 11019, + 11016, + 11063, + 11057, + 11043, + 11041, + 11051, + 11056, + 11032, + 11035, + 11062, + 11043, + 11054, + 11059, + 11094, + 11046, + 11068, + 11043, + 11043, + 11036, + 11038, + 11043, + 11060, + 11025, + 11071, + 11061, + 11076, + 11051, + 11059, + 11012, + 11047, + 11028, + 11032, + 11040, + 11061, + 11142, + 11063, + 11077, + 11053, + 11061, + 11057, + 11051, + 11044, + 11062, + 11022, + 11057, + 11093, + 11063, + 11054, + 11070, + 11043, + 11060, + 11054, + 11065, + 11092, + 11066, + 11048, + 11034, + 11085, + 11027, + 11018, + 11043, + 11050, + 11071, + 11022, + 11021, + 11042, + 11017, + 11041, + 11030, + 11027, + 11021, + 11078, + 11075, + 11083, + 11048, + 11045, + 11029, + 11055, + 11066, + 11059, + 11051, + 11106, + 11050, + 11052, + 11051, + 11056, + 11057, + 11020, + 11015, + 11084, + 11025, + 11033, + 11044, + 11098, + 11038, + 11042, + 11040, + 11058, + 11073, + 11015, + 11052, + 11030, + 11055, + 11040, + 11043, + 11058, + 11039, + 11039, + 11038, + 11052, + 11027, + 11077, + 11040, + 11036, + 11042, + 11046, + 11078, + 11107, + 11055, + 11077, + 11065, + 11064, + 11056, + 11092, + 11050, + 11061, + 11072, + 11020, + 11075, + 11063, + 11089, + 11037, + 11069, + 11064, + 11067, + 11101, + 11068, + 11060, + 11020, + 11050, + 11033, + 11031, + 11049, + 11078, + 11065, + 11078, + 11059, + 11058, + 11041, + 11051, + 11051, + 11077, + 11079, + 11063, + 11046, + 11068, + 11049, + 11064, + 11076, + 11018, + 11031, + 11093, + 11031, + 11032, + 11071, + 11052, + 11065, + 11038, + 11038, + 11055, + 11043, + 11060, + 11031, + 11124, + 11068, + 11074, + 11037, + 11031, + 11086, + 11031, + 11020, + 11048, + 11051, + 11074, + 11057, + 11058, + 11021, + 11053, + 11047, + 11022, + 11025, + 11029, + 11035, + 11054, + 11087, + 11094, + 11055, + 11055, + 11022, + 11115, + 11057, + 11039, + 11050, + 11048, + 11016, + 11101, + 11076, + 11041, + 11058, + 11037, + 11038, + 11032, + 11021, + 11056, + 11043, + 11038, + 11089, + 11043, + 11035, + 11025, + 11027, + 11055, + 11093, + 11051, + 11045, + 11041, + 11036, + 11028, + 11054, + 11066, + 11032, + 11031, + 11078, + 11011, + 11036, + 11056, + 11071, + 11054, + 11084, + 11070, + 11045, + 11057, + 11063, + 11044, + 11027, + 11059, + 11059, + 11036, + 11045, + 11072, + 11057, + 11083, + 11116, + 11065, + 11033, + 11082, + 11033, + 11072, + 11014, + 11063, + 11070, + 11012, + 11054, + 11068, + 11086, + 11034, + 11026, + 11038, + 11026, + 11052, + 11035, + 11042, + 11037, + 11039, + 11067, + 11072, + 11056, + 11058, + 11050, + 11048, + 11043, + 11009, + 11033, + 11086, + 11041, + 11053, + 11061, + 11051, + 11209, + 11051, + 11091, + 11060, + 11066, + 11051, + 11070, + 11079, + 11070, + 11044, + 11054, + 11124, + 11079, + 11058, + 11072, + 11061, + 11040, + 11074, + 11058, + 11046, + 11021, + 11063, + 11046, + 11053, + 11031, + 11064, + 11058, + 11039, + 11069, + 11061, + 11096, + 11044, + 11033, + 11044, + 11058, + 11069, + 11024, + 11098, + 11075, + 11055, + 11055, + 11067, + 11095, + 11459, + 11030, + 11116, + 11040, + 11055, + 11072, + 11070, + 11042, + 11040, + 11034, + 11085, + 11063, + 11032, + 11034, + 11041, + 11069, + 11088, + 11062, + 11051, + 11071, + 11037, + 11085, + 11065, + 11046, + 11072, + 11076, + 11052, + 11080, + 11053, + 11082, + 11056, + 11080, + 11057, + 11051, + 11052, + 11056, + 11062, + 11050, + 11073, + 11050, + 11090, + 11056, + 11102, + 11095, + 11089, + 11055, + 11063, + 11041, + 11062, + 11052, + 11053, + 11015, + 11040, + 11060, + 11077, + 11090, + 11053, + 11079, + 11072, + 11056, + 11037, + 11040, + 11027, + 11024, + 11036, + 11060, + 11082, + 11044, + 11025, + 11046, + 11083, + 11033, + 11035, + 11091, + 11076, + 11041, + 11078, + 11052, + 11063, + 11049, + 11075, + 11031, + 11052, + 11061, + 11074, + 11026, + 11050, + 11035, + 11033, + 11062, + 11045, + 11072, + 11048, + 11056, + 11059, + 11067, + 11046, + 11048, + 11077, + 11054, + 11131, + 11073, + 11041, + 11048, + 11052, + 11031, + 11063, + 11083, + 11036, + 11118, + 11021, + 11062, + 11049, + 11044, + 11249, + 11064, + 11031, + 11037, + 11053, + 11046, + 11051, + 11037, + 11050, + 11069, + 11091, + 11059, + 11081, + 11054, + 11069, + 11090, + 11032, + 11061, + 11022, + 11068, + 11037, + 11047, + 11051, + 11019, + 11052, + 11046, + 11035, + 11081, + 11121, + 11094, + 11057, + 11079, + 11072, + 11037, + 11016, + 11047, + 11025, + 11059, + 11049, + 11044, + 11038, + 11045, + 11070, + 11047, + 11077, + 11098, + 11056, + 11050, + 11094, + 11047, + 11047, + 11034, + 11045, + 11018, + 11035, + 11030, + 11021, + 11075, + 11131, + 11100, + 11072, + 11062, + 11090, + 11042, + 11063, + 11041, + 11069, + 11059, + 11085, + 11051, + 11057, + 11047, + 11043, + 11023, + 11028, + 11023, + 11062, + 11017, + 11054, + 11059, + 11035, + 11061, + 11023, + 11075, + 11064, + 11024, + 11060, + 11061, + 11043, + 11050, + 11076, + 11063, + 11044, + 11048, + 11045, + 11059, + 11057, + 11062, + 11041, + 11046, + 11075, + 11025, + 11069, + 11058, + 11062, + 11036, + 11028, + 11114, + 11060, + 11075, + 11036, + 11021, + 11107, + 11044, + 11061, + 11077, + 11055, + 11034, + 11065, + 11024, + 11047, + 11058, + 11020, + 11048, + 11074, + 11032, + 11053, + 11071, + 11045, + 11033, + 11059, + 11054, + 11070, + 11036, + 11052, + 11051, + 11045, + 11068, + 11059, + 11084, + 11699, + 11044, + 11054, + 11049, + 11065, + 11064, + 11024, + 11051, + 11047, + 11025, + 11097, + 11033, + 11045, + 11075, + 11036, + 11031, + 11072, + 11035, + 11050, + 11048, + 11059, + 11037, + 11068, + 11059, + 11032, + 11059, + 11041, + 11087, + 11025, + 11069, + 11034, + 11061, + 11056, + 11049, + 11085, + 11048, + 11026, + 11066, + 11040, + 11042, + 11033, + 11042, + 11016, + 11046, + 11029, + 11035, + 11042, + 11074, + 11089, + 11041, + 11070, + 11063, + 11030, + 11024, + 11060, + 11021, + 11091, + 11035, + 11061, + 11084, + 11056, + 11046, + 11049, + 11044, + 11127, + 11047, + 11013, + 11041, + 11052, + 11092, + 11049, + 11046, + 11045, + 11027, + 11063, + 11069, + 11048, + 11039, + 11090, + 11048, + 11090, + 11026, + 11064, + 11057, + 11076, + 11034, + 11077, + 11086, + 11059, + 11036, + 11046, + 11091, + 11077, + 11044, + 11057, + 11085, + 11060, + 11046, + 11044, + 11005, + 11091, + 11027, + 11093, + 11030, + 11022, + 11060, + 11071, + 11071, + 11024, + 11020, + 11046, + 11054, + 11079, + 11030, + 11067, + 11015, + 11071, + 11055, + 11053, + 11017, + 11041, + 11031, + 11025, + 11084, + 11022, + 11057, + 11033, + 11048, + 11048, + 11023, + 11077, + 11036, + 11021, + 11056, + 11038, + 11114, + 11044, + 11103, + 11061, + 11077, + 11051, + 11075, + 11079, + 11048, + 11045, + 11056, + 11051, + 11025, + 11062, + 11056, + 11047, + 11052, + 11036, + 11035, + 11050, + 11056, + 11063, + 11039, + 11097, + 11066, + 11058, + 11064, + 11052, + 11034, + 11313, + 11036, + 11046, + 11058, + 11060, + 11044, + 11062, + 11011, + 11020, + 11063, + 11041, + 11037, + 11067, + 11065, + 11022, + 11036, + 11109, + 11036, + 11027, + 11080, + 11100, + 11070, + 11057, + 11045, + 11012, + 11016, + 11057, + 11063, + 11023, + 11058, + 11057, + 11114, + 11040, + 11051, + 11099, + 11082, + 11069, + 11081, + 11019, + 11056, + 11068, + 11055, + 11065, + 11038, + 11067, + 11056, + 11060, + 11046, + 11033, + 11023, + 11042, + 11074, + 11063, + 11029, + 11087, + 11056, + 11049, + 11032, + 11057, + 11076, + 11024, + 11055, + 11028, + 11055, + 11031, + 11014, + 11057, + 11063, + 11050, + 11056, + 11139, + 11029, + 11036, + 11038, + 11025, + 11067, + 11077, + 11041, + 11024, + 11040, + 11021, + 11057, + 11025, + 11052, + 11046, + 11045, + 11070, + 11043, + 11043, + 11064, + 11031, + 11037, + 11048, + 11062, + 11066, + 11058, + 11040, + 11067, + 11055, + 11065, + 11058, + 11068, + 11042, + 11049, + 11028, + 11075, + 11047, + 11025, + 11047, + 11047, + 11043, + 11041, + 11079, + 11044, + 11073, + 11048, + 11071, + 11044, + 11080, + 11011, + 11052, + 11066, + 11108, + 11058, + 11100, + 11056, + 11045, + 11069, + 11045, + 11084, + 11061, + 11055, + 11056, + 11049, + 11055, + 11041, + 11050, + 11054, + 11074, + 11039, + 11039, + 11047, + 11058, + 11031, + 11107, + 11054, + 11045, + 11045, + 11052, + 11021, + 11037, + 11046, + 11036, + 11060, + 11072, + 11064, + 11078, + 11110, + 11023, + 11066, + 11085, + 11070, + 11052, + 11052, + 11069, + 11101, + 11027, + 11079, + 11041, + 11029, + 11031, + 11091, + 11060, + 11030, + 11054, + 11020, + 11052, + 11059, + 11050, + 11016, + 11053, + 11054, + 11443, + 11016, + 11054, + 11045, + 11054, + 11054, + 11078, + 11084, + 11046, + 11081, + 11050, + 11023, + 11034, + 11061, + 11116, + 11068, + 11019, + 11058, + 11057, + 11032, + 11070, + 11041, + 11029, + 11051, + 11059, + 11021, + 11074, + 11055, + 11059, + 11030, + 11026, + 11020, + 11041, + 11042, + 11022, + 11081, + 11034, + 11020, + 11032, + 11059, + 11050, + 11072, + 11080, + 11057, + 11010, + 11062, + 11019, + 11024, + 11051, + 11024, + 11033, + 11063, + 11050, + 11046, + 11042, + 11071, + 11029, + 11024, + 11078, + 11041, + 11056, + 11037, + 11073, + 11016, + 11023, + 11053, + 11073, + 11074, + 11030, + 11025, + 11024, + 11045, + 11064, + 11065, + 11022, + 11043, + 11070, + 11006, + 11031, + 11027, + 11041, + 11047, + 11024, + 11048, + 11043, + 11043, + 11050, + 11055, + 11059, + 11036, + 11055, + 11068, + 11030, + 11030, + 11051, + 11054, + 11071, + 11047, + 11024, + 11040, + 11063, + 11056, + 11038, + 11065, + 11076, + 11030, + 11025, + 11055, + 11039, + 11022, + 11070, + 11052, + 11024, + 11037, + 11067, + 11062, + 11039, + 11078, + 11056, + 11062, + 11060, + 11050, + 11019, + 11057, + 11026, + 11032, + 11071, + 11073, + 11098, + 11060, + 11046, + 11038, + 11056, + 11037, + 11045, + 11071, + 11026, + 11066, + 11066, + 11097, + 11053, + 11060, + 11080, + 11039, + 11023, + 11081, + 11047, + 11032, + 11058, + 11019, + 11028, + 11067, + 11087, + 11026, + 11021, + 11089, + 11028, + 11034, + 11062, + 11060, + 11087, + 11062, + 11181, + 11047, + 11078, + 11061, + 11016, + 11044, + 11078, + 11047, + 11007, + 11129, + 11054, + 11102, + 11024, + 11085, + 11047, + 11055, + 11007, + 11073, + 11039, + 11030, + 11063, + 11042, + 11059, + 11048, + 11041, + 11041, + 11101, + 11024, + 11021, + 11042, + 11048, + 11029, + 11034, + 11109, + 11084, + 11039, + 11094, + 11045, + 11095, + 11037, + 11021, + 11078, + 11049, + 11111, + 11053, + 11063, + 11038, + 11090, + 11059, + 11064, + 11031, + 11040, + 11037, + 11032, + 11069, + 11080, + 11079, + 11050, + 11022, + 11069, + 11100, + 11040, + 11017, + 11054, + 11088, + 11052, + 11287, + 11101, + 11025, + 11032, + 11053, + 11060, + 11072, + 11088, + 11020, + 11066, + 11063, + 11037, + 11056, + 11044, + 11086, + 11078, + 11028, + 11065, + 11026, + 11047, + 11067, + 11071, + 11059, + 11054, + 11050, + 11057, + 11047, + 11046, + 11034, + 11040, + 11024, + 11035, + 11064, + 11045, + 11048, + 11032, + 11042, + 11079, + 11070, + 11103, + 11054, + 11019, + 11056, + 11059, + 11089, + 11066, + 11075, + 11054, + 11073, + 11036, + 11054, + 11042, + 11070, + 11063, + 15295, + 11126, + 11052, + 11025, + 11058, + 11038, + 11057, + 11067, + 11036, + 11070, + 11083, + 11024, + 11020, + 11049, + 11042, + 11067, + 11054, + 11057, + 11020, + 11078, + 11030, + 11049, + 11074, + 11094, + 11101, + 11057, + 11020, + 11047, + 11052, + 11084, + 11035, + 11049, + 11034, + 11020, + 11068, + 11058, + 11058, + 11051, + 11028, + 11044, + 11051, + 11032, + 11050, + 11061, + 11024, + 11055, + 11101, + 11037, + 11056, + 11049, + 11063, + 11032, + 11068, + 11044, + 11042, + 11057, + 11030, + 11056, + 11045, + 11068, + 11091, + 11088, + 11058, + 11069, + 11084, + 11054, + 11050, + 11085, + 11070, + 11034, + 11021, + 11013, + 11058, + 11036, + 11062, + 11070, + 11047, + 11088, + 11020, + 11033, + 11053, + 11073, + 11073, + 11100, + 11077, + 11076, + 11057, + 11048, + 11031, + 11073, + 11065, + 11038, + 11036, + 11066, + 11097, + 11057, + 11030, + 11059, + 11077, + 11042, + 11025, + 11037, + 11097, + 11061, + 11031, + 11069, + 11059, + 11025, + 11053, + 11071, + 11021, + 11027, + 11054, + 11059, + 11068, + 11046, + 11038, + 11057, + 11064, + 11045, + 11036, + 11052, + 11072, + 11045, + 11029, + 11021, + 11065, + 11072, + 11054, + 11031, + 11057, + 11019, + 11061, + 11080, + 11029, + 11044, + 11038, + 11071, + 11062, + 11060, + 11044, + 12238, + 11066, + 11040, + 11063, + 11084, + 11080, + 11043, + 11038, + 11025, + 11050, + 11104, + 11059, + 11033, + 11045, + 11011, + 11142, + 11063, + 11078, + 11032, + 11074, + 11036, + 11080, + 11091, + 11047, + 11047, + 11049, + 11046, + 11043, + 11056, + 11074, + 11030, + 11058, + 11055, + 11051, + 11097, + 11061, + 11061, + 11021, + 11023, + 11074, + 11063, + 11027, + 11115, + 11040, + 11089, + 11017, + 11047, + 11065, + 11059, + 11054, + 11578, + 11053, + 11047, + 11062, + 11035, + 11050, + 11095, + 11050, + 11062, + 11051, + 11081, + 11061, + 11041, + 11071, + 11044, + 11053, + 11070, + 11076, + 11050, + 11067, + 11073, + 11061, + 11039, + 11054, + 11066, + 11056, + 11084, + 11035, + 11033, + 11076, + 11061, + 11025, + 11058, + 11029, + 12091, + 11030, + 11051, + 11044, + 11068, + 11068, + 11038, + 11045, + 11061, + 11040, + 11033, + 11043, + 11035, + 11076, + 11007, + 11042, + 11063, + 11044, + 11033, + 11027, + 11040, + 11057, + 11053, + 11038, + 11028, + 11051, + 11072, + 11078, + 11047, + 11064, + 11060, + 11037, + 11068, + 11017, + 11080, + 11051, + 11025, + 11075, + 11036, + 11026, + 11044, + 11065, + 11052, + 11043, + 11051, + 11062, + 11045, + 11050, + 11046, + 11025, + 11058, + 11038, + 11072, + 11026, + 11125, + 11058, + 11073, + 11235, + 11086, + 11064, + 11079, + 11075, + 11053, + 11123, + 11060, + 11073, + 11069, + 11077, + 11057, + 11064, + 11056, + 11019, + 11051, + 11083, + 11049, + 11059, + 11047, + 11035, + 11056, + 11109, + 11030, + 11089, + 11094, + 11024, + 11041, + 11049, + 11067, + 11063, + 11032, + 11063, + 11053, + 11050, + 11027, + 11048, + 11050, + 11126, + 11071, + 11043, + 11037, + 11053, + 11054, + 11031, + 11035, + 11095, + 11045, + 11045, + 11045, + 11015, + 11061, + 11069, + 11046, + 11089, + 11062, + 11033, + 11069, + 11052, + 11030, + 11039, + 11111, + 11071, + 11042, + 11028, + 11027, + 11033, + 11075, + 11038, + 11059, + 11068, + 11045, + 11061, + 11080, + 11064, + 11077, + 11081, + 11087, + 11088, + 11085, + 11091, + 11063, + 11071, + 11023, + 11047, + 11089, + 11064, + 11050, + 11072, + 11029, + 11043, + 11049, + 11060, + 11073, + 11039, + 11011, + 11016, + 11057, + 11023, + 11056, + 11051, + 11025, + 11045, + 11076, + 11039, + 11537, + 11075, + 11075, + 11035, + 11031, + 11061, + 11076, + 11063, + 11039, + 11030, + 11019, + 11029, + 11023, + 11053, + 11049, + 11051, + 11069, + 11063, + 11026, + 11048, + 11055, + 11060, + 11052, + 11042, + 11071, + 11032, + 11026, + 11056, + 11026, + 11063, + 11028, + 11040, + 12536, + 11060, + 11039, + 11049, + 11029, + 11057, + 11045, + 11056, + 11066, + 11042, + 11047, + 11081, + 11020, + 11059, + 11024, + 11052, + 11048, + 11071, + 11029, + 11045, + 11037, + 11032, + 11071, + 11059, + 11050, + 11050, + 11042, + 11071, + 11036, + 11103, + 11066, + 11028, + 11053, + 11134, + 11044, + 11100, + 11044, + 11052, + 11114, + 11037, + 11044, + 11037, + 11064, + 11042, + 11037, + 11030, + 11060, + 11047, + 11049, + 11049, + 11061, + 11068, + 11037, + 11091, + 11037, + 11114, + 11057, + 11075, + 11058, + 11050, + 11015, + 11016, + 11100, + 11050, + 11038, + 11081, + 11050, + 11230, + 11073, + 11038, + 11033, + 11047, + 11026, + 11029, + 11046, + 11030, + 11033, + 11059, + 11048, + 11059, + 11051, + 11019, + 11049, + 11016, + 11099, + 11046, + 11064, + 11094, + 11064, + 11025, + 11025, + 11105, + 11033, + 11036, + 11019, + 11056, + 11054, + 11039, + 11053, + 11043, + 11050, + 11031, + 11045, + 11049, + 11070, + 11060, + 11047, + 11040, + 11066, + 11072, + 11019, + 11109, + 11053, + 11099, + 11075, + 11022, + 11072, + 11018, + 11049, + 11058, + 11053, + 11036, + 11067, + 11030, + 11059, + 11043, + 11048, + 11074, + 11035, + 11035, + 11018, + 11055, + 11062, + 11046, + 11052, + 11026, + 11070, + 11058, + 11029, + 11067, + 11054, + 11048, + 11020, + 11012, + 11043, + 11059, + 11035, + 11059, + 11016, + 11044, + 11051, + 11019, + 11053, + 11050, + 11065, + 11057, + 11074, + 11047, + 11059, + 11026, + 11037, + 11063, + 11056, + 11038, + 11063, + 11042, + 11018, + 11064, + 11040, + 11046, + 11078, + 11060, + 11077, + 11050, + 11073, + 11045, + 11067, + 11023, + 11033, + 11065, + 11083, + 11044, + 11022, + 11050, + 11037, + 11068, + 11041, + 11054, + 11045, + 11052, + 11017, + 11057, + 11025, + 11048, + 11062, + 11032, + 11036, + 11066, + 11063, + 11187, + 11080, + 11035, + 11037, + 11057, + 11041, + 11078, + 11007, + 11057, + 11054, + 11035, + 11052, + 11047, + 11320, + 11052, + 11051, + 11026, + 11037, + 11054, + 11074, + 11055, + 11079, + 11091, + 11073, + 11079, + 11027, + 11048, + 11066, + 11034, + 11037, + 11064, + 11028, + 11051, + 11097, + 11058, + 11089, + 11037, + 11031, + 11021, + 11087, + 11026, + 11091, + 11031, + 11061, + 11033, + 11055, + 11047, + 11028, + 11069, + 11028, + 11029, + 11040, + 11038, + 11064, + 11039, + 11042, + 11062, + 11047, + 11029, + 11034, + 11040, + 11096, + 11035, + 11064, + 11041, + 11022, + 11052, + 11074, + 11062, + 11041, + 11069, + 11031, + 11059, + 11039, + 11031, + 11032, + 11046, + 11069, + 11041, + 11024, + 11051, + 11071, + 11060, + 11078, + 11021, + 11064, + 11056, + 11041, + 11053, + 11056, + 11051, + 11078, + 11047, + 11057, + 11027, + 11046, + 11098, + 11047, + 11032, + 11055, + 11034, + 11038, + 11034, + 11029, + 11036, + 11043, + 11024, + 11023, + 11090, + 11087, + 11052, + 11066, + 11049, + 11075, + 11033, + 11056, + 11050, + 11073, + 11084, + 11020, + 11070, + 11054, + 11056, + 11088, + 11053, + 11073, + 11046, + 11025, + 11034, + 11044, + 11024, + 11041, + 11063, + 11051, + 11114, + 11040, + 11058, + 11048, + 11074, + 11037, + 11031, + 11055, + 11021, + 11072, + 11063, + 11055, + 11108, + 11049, + 11020, + 11138, + 11063, + 11070, + 11049, + 11049, + 11035, + 11052, + 11056, + 11065, + 11028, + 11025, + 11066, + 11026, + 11055, + 11042, + 11039, + 11066, + 11033, + 11043, + 11061, + 11077, + 11043, + 11036, + 11025, + 11086, + 11043, + 11074, + 11064, + 11944, + 11049, + 11065, + 11057, + 11050, + 11035, + 11051, + 11026, + 11067, + 11054, + 11085, + 11073, + 11076, + 11070, + 11059, + 11040, + 11037, + 11041, + 11063, + 11072, + 11059, + 11051, + 11094, + 11032, + 11077, + 11050, + 11050, + 11063, + 11055, + 11087, + 11045, + 11069, + 11080, + 11037, + 11017, + 11053, + 11050, + 11046, + 11025, + 11053, + 11059, + 11032, + 11060, + 11054, + 11157, + 11046, + 11037, + 11038, + 11062, + 11067, + 11030, + 11041, + 11026, + 11073, + 11044, + 11044, + 11025, + 11038, + 11035, + 11028, + 11040, + 11067, + 11060, + 11062, + 11087, + 11031, + 11037, + 11052, + 11172, + 11059, + 11030, + 11029, + 11043, + 11045, + 11069, + 11049, + 11041, + 11055, + 11060, + 11073, + 11061, + 11051, + 11010, + 11036, + 11047, + 11043, + 11053, + 11041, + 11047, + 11036, + 11056, + 11070, + 11022, + 11056, + 11053, + 11028, + 11030, + 11039, + 11035, + 11072, + 11039, + 11012, + 11020, + 11032, + 11057, + 11041, + 11088, + 11090, + 11022, + 11079, + 11074, + 11063, + 11072, + 11013, + 11018, + 11023, + 11030, + 11069, + 11029, + 11027, + 11062, + 11035, + 11058, + 11048, + 11048, + 11041, + 11093, + 11072, + 11078, + 11047, + 11063, + 11035, + 11062, + 11178, + 11017, + 11034, + 11051, + 11028, + 11069, + 11090, + 11034, + 11050, + 11077, + 11028, + 11061, + 11202, + 11046, + 11112, + 11060, + 11026, + 11042, + 11039, + 11030, + 11031, + 11047, + 11041, + 11024, + 11026, + 11063, + 11025, + 11036, + 11018, + 11026, + 11049, + 11041, + 11030, + 11044, + 11017, + 11086, + 11067, + 11013, + 11032, + 11084, + 11029, + 11065, + 11043, + 11049, + 11029, + 11043, + 11074, + 11030, + 11040, + 11061, + 11047, + 11059, + 11059, + 11041, + 11050, + 11042, + 11043, + 11065, + 11087, + 11088, + 11062, + 11054, + 11059, + 11036, + 11044, + 11057, + 11035, + 11048, + 11041, + 11077, + 11053, + 11104, + 11053, + 11064, + 11069, + 11078, + 11063, + 11059, + 11066, + 11054, + 11028, + 11058, + 11029, + 11065, + 11061, + 11059, + 11089, + 11068, + 11055, + 11019, + 11047, + 11018, + 11053, + 11033, + 11078, + 11041, + 11045, + 11343, + 11065, + 11089, + 11033, + 11043, + 11057, + 11070, + 11057, + 11052, + 11050, + 11060, + 11043, + 11052, + 11062, + 11050, + 11058, + 11051, + 11097, + 11029, + 11091, + 11066, + 11043, + 11059, + 11780, + 11063, + 11032, + 11034, + 11030, + 11019, + 11039, + 11080, + 11073, + 11050, + 11061, + 11035, + 11060, + 11048, + 11061, + 11084, + 11069, + 11024, + 11047, + 11030, + 11033, + 11056, + 11048, + 11096, + 11057, + 11070, + 11031, + 11077, + 11049, + 11054, + 11017, + 11059, + 11077, + 11078, + 11042, + 11026, + 11084, + 11039, + 11070, + 11060, + 11047, + 11064, + 11069, + 11015, + 11015, + 11066, + 11055, + 11035, + 11066, + 11058, + 11026, + 11048, + 11026, + 11072, + 11049, + 11038, + 11067, + 11078, + 11109, + 11040, + 11052, + 11029, + 11020, + 11067, + 11038, + 11028, + 11074, + 11041, + 11036, + 11032, + 11011, + 11036, + 11123, + 11042, + 11067, + 11039, + 11036, + 11045, + 11038, + 11038, + 11050, + 11041, + 11050, + 11035, + 11028, + 11057, + 11065, + 11072, + 11067, + 11032, + 11092, + 11049, + 11064, + 11071, + 11025, + 11064, + 11040, + 11009, + 11022, + 11028, + 11033, + 11045, + 11024, + 11065, + 11036, + 11018, + 11051, + 11051, + 11056, + 11044, + 11068, + 11058, + 11042, + 11056, + 11022, + 11053, + 11040, + 11029, + 11045, + 11032, + 11056, + 11061, + 11072, + 11063, + 11057, + 11059, + 11039, + 11018, + 11049, + 11022, + 11046, + 11058, + 11086, + 11051, + 11052, + 11061, + 11044, + 11044, + 11021, + 11055, + 11058, + 11081, + 11039, + 11072, + 11023, + 11031, + 11019, + 11021, + 11024, + 11063, + 11048, + 11047, + 11025, + 11025, + 11032, + 11053, + 11090, + 11083, + 11087, + 11031, + 11077, + 11050, + 11059, + 11032, + 11056, + 11048, + 11044, + 11053, + 11064, + 11000, + 11025, + 11058, + 11031, + 11051, + 11037, + 11085, + 11070, + 11019, + 11041, + 11033, + 11055, + 11064, + 11048, + 11068, + 11039, + 11048, + 11033, + 11039, + 11040, + 11055, + 11061, + 11031, + 11069, + 11029, + 11038, + 11054, + 11075, + 11043, + 11052, + 11075, + 11032, + 11054, + 11034, + 11076, + 11056, + 11072, + 11085, + 11025, + 11046, + 11036, + 11059, + 11031, + 11028, + 11061, + 11040, + 11052, + 11044, + 11068, + 11047, + 11058, + 11102, + 11068, + 11057, + 11019, + 11055, + 11026, + 11059, + 11090, + 11027, + 11047, + 11055, + 11028, + 11061, + 11081, + 11069, + 11034, + 11082, + 11028, + 11017, + 11067, + 11043, + 11053, + 11016, + 11060, + 11048, + 11055, + 11024, + 11055, + 11057, + 11069, + 11070, + 11061, + 11058, + 11063, + 11036, + 11034, + 11023, + 11053, + 11027, + 11026, + 11018, + 11029, + 11046, + 11024, + 11071, + 11027, + 11055, + 11068, + 11023, + 11071, + 11035, + 11069, + 11063, + 11024, + 11025, + 11054, + 11067, + 11053, + 11039, + 11073, + 11040, + 11074, + 11068, + 11028, + 11054, + 11053, + 11060, + 11060, + 11049, + 11061, + 11066, + 11079, + 11029, + 11027, + 11064, + 11055, + 11050, + 11018, + 11070, + 11037, + 11063, + 11039, + 11092, + 11062, + 11045, + 11048, + 11024, + 11063, + 11029, + 11042, + 11011, + 11037, + 11119, + 11030, + 11039, + 11072, + 11053, + 11038, + 11044, + 11052, + 11064, + 11050, + 11050, + 11058, + 11066, + 11044, + 11036, + 11087, + 11053, + 11011, + 11034, + 11030, + 11073, + 11045, + 11031, + 11036, + 11030, + 11025, + 11059, + 11094, + 11050, + 11044, + 11032, + 11041, + 11044, + 11055, + 11077, + 11060, + 11079, + 11079, + 11049, + 11037, + 11047, + 11058, + 11057, + 11058, + 11021, + 11046, + 11062, + 11037, + 11052, + 11059, + 11040, + 11053, + 11070, + 11034, + 11076, + 11033, + 11058, + 11038, + 11057, + 11037, + 11076, + 11007, + 11049, + 11050, + 11042, + 11081, + 11065, + 11058, + 11043, + 11100, + 11044, + 11048, + 11052, + 11066, + 11057, + 11078, + 11032, + 11082, + 11014, + 11070, + 11056, + 11065, + 11057, + 11055, + 11074, + 11072, + 11064, + 11076, + 11279, + 11068, + 11049, + 11054, + 11084, + 11067, + 11110, + 11059, + 11056, + 11059, + 11191, + 11080, + 11072, + 11067, + 11050, + 11049, + 11049, + 11055, + 11049, + 11042, + 11084, + 11028, + 11025, + 11042, + 11064, + 11086, + 11054, + 11069, + 11026, + 11050, + 11045, + 11053, + 11028, + 11064, + 11060, + 11031, + 11018, + 11061, + 11051, + 11089, + 11024, + 11026, + 11040, + 11450, + 11054, + 11032, + 11047, + 11011, + 11146, + 11033, + 11075, + 11028, + 11680, + 11039, + 11050, + 11026, + 11074, + 11079, + 11052, + 11039, + 11101, + 11056, + 11144, + 11109, + 11037, + 11082, + 11118, + 11055, + 11041, + 11030, + 11057, + 11088, + 11078, + 11028, + 11020, + 11041, + 11032, + 11068, + 11023, + 11059, + 11015, + 11027, + 11072, + 12951, + 11068, + 11074, + 11083, + 11054, + 11023, + 11047, + 11056, + 11067, + 11069, + 11070, + 11031, + 11084, + 11048, + 11048, + 11050, + 11039, + 11046, + 11039, + 11026, + 11034, + 11042, + 11064, + 11070, + 11071, + 11111, + 11029, + 11091, + 11053, + 11054, + 11061, + 11033, + 11035, + 11049, + 11064, + 11044, + 11044, + 11166, + 11056, + 11037, + 11021, + 11031, + 11020, + 11066, + 11061, + 11092, + 11043, + 11046, + 11039, + 11060, + 11087, + 11055, + 11014, + 11058, + 11029, + 11032, + 11056, + 11041, + 11043, + 11032, + 11068, + 11084, + 11047, + 11075, + 11033, + 11025, + 11042, + 11049, + 11056, + 11082, + 11037, + 11049, + 11060, + 11042, + 11050, + 11038, + 11067, + 11029, + 11041, + 11045, + 11062, + 11038, + 11098, + 11076, + 11084, + 11066, + 11032, + 11049, + 11083, + 11052, + 11059, + 11034, + 11050, + 11055, + 11058, + 11041, + 11047, + 11042, + 11008, + 11017, + 11063 + ], + "sample_count": 15276 + }, + { + "pubkey": "GtJiXeUXM4SVc5Vm29amRVC5xasEzUDKApk9g9bRimKD", + "epoch": 89, + "origin_device_pk": "6E1fuqbDBG5ejhYEGKHNkWG5mSTczjy4R77XCKEdUtpb", + "target_device_pk": "Cpt3doj17dCF6bEhvc7VeAuZbXLD88a1EboTyE8uj6ZL", + "link_pk": "As7SQm9RggEi1Bp6hpfHMC5TETushYgR7uWbykMZkt4w", + "origin_device_location_pk": "9nJjrDoWWbzhqLka3oHYdj2W3vr2UzUCcjoeCEQ7mAai", + "target_device_location_pk": "7vt8Tnbk15S6JA1uhRQVtbuL7w39zY8jeQ5iqgjsqLfP", + "origin_device_agent_pk": "A7yxgJvkU5kaLmvKtL5Yz5tQB9td6DLxtbezhqZVfgsd", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242130060635, + "samples": [ + 67319, + 67328, + 67308, + 67329, + 67262, + 67302, + 67362, + 67292, + 67290, + 67276, + 67279, + 67277, + 67283, + 67288, + 67272, + 67264, + 67335, + 67271, + 67297, + 67282, + 67277, + 67267, + 67277, + 67290, + 67273, + 67281, + 67270, + 67321, + 67308, + 67291, + 67306, + 67267, + 67344, + 67284, + 67288, + 67258, + 67316, + 67299, + 67310, + 67354, + 67285, + 67279, + 67334, + 67292, + 67294, + 67323, + 67291, + 67277, + 67298, + 67330, + 67321, + 67309, + 67279, + 67292, + 67275, + 67311, + 67273, + 67283, + 67324, + 67254, + 67319, + 67310, + 67289, + 67317, + 67266, + 67318, + 67267, + 67276, + 67274, + 67308, + 67315, + 67277, + 67320, + 67270, + 67282, + 67311, + 67284, + 67286, + 67281, + 67305, + 67286, + 67327, + 67282, + 67359, + 67327, + 67281, + 67294, + 67309, + 67265, + 67293, + 67268, + 67285, + 67266, + 67273, + 67273, + 67281, + 67266, + 67248, + 67287, + 67311, + 67272, + 67292, + 67308, + 67336, + 67320, + 67274, + 67286, + 67286, + 67282, + 67293, + 67297, + 67298, + 67312, + 67289, + 67284, + 67297, + 67287, + 67286, + 67268, + 67289, + 67270, + 67278, + 67275, + 67257, + 67343, + 67307, + 67280, + 67301, + 67329, + 67268, + 67274, + 67282, + 67305, + 67282, + 67281, + 67308, + 67297, + 67300, + 67331, + 67321, + 67308, + 67323, + 67301, + 67280, + 67294, + 67253, + 67282, + 67328, + 67274, + 67274, + 67331, + 67282, + 67264, + 67298, + 67282, + 67261, + 67285, + 67298, + 67271, + 67306, + 67309, + 67295, + 67284, + 67259, + 67304, + 67308, + 67274, + 67293, + 67297, + 67286, + 67254, + 67273, + 67282, + 67263, + 67292, + 67267, + 67294, + 67355, + 67289, + 67279, + 67257, + 67281, + 67291, + 67335, + 67261, + 67265, + 67269, + 67303, + 67263, + 67273, + 67284, + 67307, + 67302, + 67275, + 67314, + 67300, + 67263, + 67323, + 67271, + 67293, + 67292, + 67295, + 67313, + 67305, + 67298, + 67262, + 67304, + 67277, + 67302, + 67302, + 67292, + 67268, + 67517, + 67336, + 67280, + 67268, + 67325, + 67284, + 67291, + 67284, + 67269, + 67288, + 67318, + 67249, + 67284, + 67282, + 67293, + 67269, + 67261, + 67273, + 67283, + 67291, + 67306, + 67297, + 67257, + 67281, + 67315, + 67282, + 67278, + 67307, + 67276, + 67294, + 67321, + 67270, + 67312, + 67271, + 67311, + 67278, + 67267, + 67308, + 67266, + 67281, + 67246, + 67282, + 67264, + 67267, + 67289, + 67314, + 67328, + 67287, + 67257, + 67296, + 67265, + 67289, + 67260, + 67275, + 67338, + 67307, + 67268, + 67268, + 67295, + 67287, + 67275, + 67342, + 67311, + 67317, + 67275, + 67282, + 67286, + 67353, + 67277, + 67280, + 67296, + 67283, + 67272, + 67278, + 67312, + 67287, + 67268, + 67274, + 67290, + 67294, + 67268, + 67301, + 67305, + 67296, + 67297, + 67271, + 67261, + 67266, + 67304, + 67283, + 67285, + 67346, + 67298, + 67303, + 67288, + 67294, + 67288, + 67288, + 67282, + 67298, + 67269, + 67298, + 67272, + 67272, + 67309, + 67290, + 67288, + 67275, + 67269, + 67303, + 67290, + 67288, + 67264, + 67324, + 67291, + 67342, + 67333, + 67304, + 67318, + 67278, + 67326, + 67256, + 67279, + 67265, + 67292, + 67277, + 67297, + 67312, + 67303, + 67308, + 67320, + 67267, + 67278, + 67275, + 67305, + 67290, + 67337, + 67289, + 67316, + 67263, + 67315, + 67283, + 67276, + 67291, + 67263, + 67319, + 67262, + 67287, + 67297, + 67301, + 67303, + 67282, + 67263, + 67289, + 67317, + 67291, + 67305, + 67298, + 67311, + 67294, + 67257, + 67285, + 67283, + 67292, + 67312, + 67254, + 67281, + 67298, + 67338, + 67307, + 67285, + 67285, + 67304, + 67263, + 67298, + 67336, + 67274, + 67311, + 67265, + 67285, + 67301, + 67268, + 67273, + 67287, + 67300, + 67295, + 67287, + 67312, + 67335, + 67274, + 67295, + 67308, + 67274, + 67337, + 67303, + 67301, + 67296, + 67269, + 67317, + 67301, + 67295, + 67266, + 67305, + 67320, + 67332, + 67279, + 67290, + 67309, + 67312, + 67303, + 67315, + 67336, + 67322, + 67284, + 67315, + 67307, + 67310, + 67268, + 67280, + 67319, + 67268, + 67285, + 67283, + 67352, + 67331, + 67316, + 67260, + 67270, + 67274, + 67296, + 67294, + 67293, + 67327, + 67293, + 67298, + 67261, + 67298, + 67309, + 67263, + 67267, + 67288, + 67267, + 67268, + 67317, + 67294, + 67346, + 67305, + 67307, + 67284, + 67284, + 67302, + 67265, + 67302, + 67350, + 67340, + 67302, + 67311, + 67276, + 67279, + 67309, + 67256, + 67267, + 67285, + 67276, + 67268, + 67259, + 67270, + 67301, + 67298, + 67282, + 67303, + 67265, + 67295, + 67304, + 67267, + 67276, + 67304, + 67289, + 67303, + 67315, + 67282, + 67303, + 67278, + 67304, + 67295, + 67266, + 67307, + 67266, + 67271, + 67270, + 67328, + 67309, + 67289, + 67278, + 67297, + 67317, + 67284, + 67298, + 67307, + 67283, + 67284, + 67287, + 67305, + 67253, + 67294, + 67301, + 67318, + 67302, + 67275, + 67289, + 67302, + 67277, + 67307, + 67269, + 67293, + 67285, + 67275, + 67272, + 67294, + 67302, + 67328, + 67277, + 67292, + 67300, + 67269, + 67287, + 67302, + 67300, + 67289, + 67298, + 67287, + 67314, + 67294, + 67323, + 67271, + 67263, + 67283, + 67344, + 67314, + 67314, + 67289, + 67356, + 67301, + 67328, + 67268, + 67288, + 67297, + 67274, + 67306, + 67309, + 67323, + 67302, + 67283, + 67268, + 67304, + 67290, + 67297, + 67318, + 67274, + 67343, + 67306, + 67292, + 67272, + 67271, + 67312, + 67256, + 67267, + 67302, + 67259, + 67276, + 67275, + 67286, + 67290, + 67292, + 67295, + 67308, + 67300, + 67293, + 67296, + 67328, + 67311, + 67287, + 67273, + 67296, + 67288, + 67290, + 67261, + 67279, + 67273, + 67329, + 67299, + 67285, + 67305, + 67277, + 67284, + 67288, + 67320, + 67274, + 67269, + 67294, + 67346, + 67271, + 67266, + 67361, + 67273, + 67297, + 67335, + 67268, + 67311, + 67351, + 67278, + 67286, + 67311, + 67299, + 67317, + 67314, + 67269, + 67298, + 67290, + 67293, + 67295, + 67311, + 67285, + 67289, + 67330, + 67280, + 67283, + 67305, + 67272, + 67291, + 67286, + 67302, + 67278, + 67283, + 67277, + 67269, + 67256, + 67303, + 67324, + 67344, + 67303, + 67314, + 67295, + 67291, + 67256, + 67305, + 67280, + 67279, + 67362, + 67321, + 67266, + 67329, + 67312, + 67285, + 67326, + 67283, + 67282, + 67302, + 67309, + 67299, + 67270, + 67288, + 67281, + 67283, + 67301, + 67280, + 67271, + 67264, + 67312, + 67308, + 67282, + 67277, + 67303, + 67248, + 67290, + 67288, + 67261, + 67307, + 67285, + 67284, + 67286, + 67302, + 67280, + 67276, + 67292, + 67310, + 67292, + 67271, + 67286, + 67331, + 67283, + 67249, + 67272, + 67327, + 67267, + 67314, + 67286, + 67298, + 67330, + 67317, + 67307, + 67271, + 67265, + 67294, + 67295, + 67292, + 67255, + 67302, + 67277, + 67291, + 67306, + 67272, + 67297, + 67288, + 67272, + 67310, + 67272, + 67281, + 67310, + 67264, + 67306, + 67291, + 67324, + 67271, + 67305, + 67333, + 67275, + 67293, + 67272, + 67306, + 67292, + 67283, + 67294, + 67317, + 67322, + 67266, + 67267, + 67291, + 67317, + 67303, + 67333, + 67294, + 67341, + 67298, + 67317, + 67304, + 67269, + 67305, + 67285, + 67346, + 67270, + 67247, + 67273, + 67290, + 67281, + 67281, + 67271, + 67298, + 67288, + 67298, + 67274, + 67275, + 67281, + 67323, + 67264, + 67270, + 67264, + 67285, + 67314, + 67269, + 67284, + 67327, + 67269, + 67337, + 67306, + 67303, + 67267, + 67322, + 67290, + 67265, + 67301, + 67317, + 67275, + 67276, + 67282, + 67279, + 67288, + 67293, + 67356, + 67291, + 67275, + 67278, + 67254, + 67295, + 67291, + 67302, + 67269, + 67273, + 67306, + 67292, + 67290, + 67277, + 67274, + 67291, + 67288, + 67260, + 67323, + 67271, + 67291, + 67284, + 67315, + 67276, + 67322, + 67264, + 67280, + 67273, + 67257, + 67281, + 67299, + 67299, + 67300, + 67287, + 67278, + 67297, + 67260, + 67299, + 67311, + 67283, + 67298, + 67302, + 67252, + 67299, + 67285, + 67276, + 67272, + 67281, + 67285, + 67276, + 67315, + 67309, + 67303, + 67290, + 67287, + 67316, + 67264, + 67275, + 67282, + 67314, + 67277, + 67278, + 67305, + 67322, + 67272, + 67266, + 67301, + 67296, + 67279, + 67261, + 67296, + 67267, + 67279, + 67305, + 67299, + 67295, + 67344, + 67277, + 67298, + 67322, + 67301, + 67315, + 67303, + 67257, + 67270, + 67275, + 67271, + 67291, + 67290, + 67281, + 67264, + 67347, + 67287, + 67289, + 67289, + 67286, + 67315, + 67326, + 67284, + 67314, + 67264, + 67303, + 67289, + 67272, + 67327, + 67343, + 67288, + 67297, + 67314, + 67283, + 67332, + 67245, + 67286, + 67250, + 67282, + 67304, + 67289, + 67320, + 67275, + 67275, + 67328, + 67286, + 67289, + 67281, + 67314, + 67267, + 67306, + 67298, + 67270, + 67299, + 67301, + 67259, + 67309, + 67282, + 67285, + 67280, + 67304, + 67283, + 67272, + 67321, + 67267, + 67335, + 67333, + 67267, + 67305, + 67276, + 67313, + 67310, + 67284, + 67262, + 67279, + 67298, + 67291, + 67285, + 67310, + 67282, + 67279, + 67313, + 67291, + 67258, + 67282, + 67300, + 67324, + 67302, + 67296, + 67290, + 67289, + 67323, + 67259, + 67284, + 67314, + 67288, + 67312, + 67274, + 67280, + 67282, + 67259, + 67277, + 67302, + 67280, + 67291, + 67291, + 67294, + 67269, + 67312, + 67284, + 67278, + 67286, + 67297, + 67277, + 67289, + 67270, + 67305, + 67268, + 67286, + 67289, + 67281, + 67294, + 67267, + 67274, + 67311, + 67327, + 67279, + 67281, + 67324, + 67341, + 67279, + 67265, + 67277, + 67282, + 67301, + 67294, + 67280, + 67287, + 67290, + 67308, + 67274, + 67314, + 67307, + 67317, + 67318, + 67296, + 67284, + 67287, + 67298, + 67279, + 67301, + 67269, + 67288, + 67347, + 67279, + 67266, + 67292, + 67277, + 67284, + 67324, + 67253, + 67255, + 67292, + 67235, + 67255, + 67326, + 67295, + 67308, + 67290, + 67277, + 67269, + 67308, + 67269, + 67283, + 67296, + 67274, + 67284, + 67386, + 67264, + 67321, + 67302, + 67263, + 67311, + 67249, + 67270, + 67294, + 67278, + 67260, + 67310, + 67264, + 67273, + 67335, + 67273, + 67285, + 67318, + 67330, + 67272, + 67284, + 67315, + 67300, + 67296, + 67315, + 67306, + 67267, + 67335, + 67284, + 67284, + 67291, + 67316, + 67284, + 67260, + 67263, + 67274, + 67297, + 67279, + 67301, + 67302, + 67279, + 67282, + 67298, + 67307, + 67321, + 67281, + 67260, + 67269, + 67295, + 67301, + 67262, + 67316, + 67313, + 67271, + 67282, + 67279, + 67292, + 67341, + 67298, + 67289, + 67344, + 67331, + 67293, + 67262, + 67294, + 67275, + 67263, + 67287, + 67334, + 67311, + 67306, + 67288, + 67281, + 67306, + 67294, + 67314, + 67312, + 67310, + 67271, + 67276, + 67292, + 67307, + 67312, + 67298, + 67313, + 67300, + 67303, + 67262, + 67288, + 67292, + 67309, + 67277, + 67289, + 67308, + 67269, + 67281, + 67292, + 67272, + 67310, + 67287, + 67306, + 67299, + 67312, + 67292, + 67288, + 67284, + 67292, + 67299, + 67287, + 67314, + 67292, + 67283, + 67289, + 67333, + 67280, + 67296, + 67316, + 67316, + 67293, + 67329, + 67313, + 67291, + 67252, + 67287, + 67263, + 67286, + 67292, + 67335, + 67303, + 67270, + 67293, + 67273, + 67317, + 67311, + 67374, + 67275, + 67292, + 67289, + 67274, + 67309, + 67332, + 67275, + 67266, + 67318, + 67318, + 67296, + 67341, + 67322, + 67336, + 67339, + 67288, + 67307, + 67282, + 67308, + 67291, + 67308, + 67291, + 67292, + 67260, + 67323, + 67280, + 67301, + 67296, + 67290, + 67284, + 67285, + 67275, + 67266, + 67287, + 67280, + 67296, + 67268, + 67263, + 67302, + 67322, + 67323, + 67299, + 67303, + 67260, + 67303, + 67297, + 67291, + 67265, + 67303, + 67312, + 67279, + 67268, + 67282, + 67352, + 67308, + 67332, + 67295, + 67289, + 67294, + 67345, + 67275, + 67283, + 67277, + 67301, + 67265, + 67323, + 67262, + 67288, + 67348, + 67294, + 67275, + 67289, + 67304, + 67279, + 67316, + 67291, + 67277, + 67284, + 67265, + 67300, + 67324, + 67275, + 67284, + 67295, + 67258, + 67286, + 67295, + 67320, + 67286, + 67261, + 67277, + 67287, + 67275, + 67343, + 67275, + 67296, + 67302, + 67293, + 67272, + 67320, + 67320, + 67292, + 67335, + 67282, + 67263, + 67297, + 67281, + 67322, + 67274, + 67282, + 67303, + 67310, + 67299, + 67328, + 67274, + 67296, + 67300, + 67275, + 67290, + 67304, + 67261, + 67282, + 67297, + 67311, + 67292, + 67279, + 67336, + 67321, + 67324, + 67304, + 67281, + 67299, + 67283, + 67330, + 67333, + 67301, + 67332, + 67277, + 67295, + 67341, + 67306, + 67282, + 67286, + 67290, + 67278, + 67273, + 67266, + 67353, + 67306, + 67323, + 67306, + 67306, + 67292, + 67321, + 67274, + 67272, + 67292, + 67262, + 67284, + 67274, + 67281, + 67297, + 67300, + 67283, + 67288, + 67312, + 67283, + 67293, + 67292, + 67270, + 67289, + 67292, + 67256, + 67284, + 67287, + 67265, + 67289, + 67299, + 67276, + 67293, + 67269, + 67276, + 67318, + 67269, + 67246, + 67311, + 67282, + 67284, + 67291, + 67280, + 67321, + 67266, + 67325, + 67321, + 67306, + 67313, + 67289, + 67266, + 67309, + 67275, + 67281, + 67281, + 67315, + 67287, + 67343, + 67310, + 67290, + 67307, + 67298, + 67302, + 67295, + 67304, + 67290, + 67336, + 67278, + 67325, + 67292, + 67257, + 67285, + 67279, + 67260, + 67294, + 67271, + 67298, + 67292, + 67273, + 67299, + 67314, + 67324, + 67313, + 67270, + 67286, + 67321, + 67313, + 67279, + 67303, + 67280, + 67311, + 67290, + 67342, + 67324, + 67275, + 67309, + 67272, + 67303, + 67288, + 67281, + 67295, + 67284, + 67287, + 67313, + 67310, + 67273, + 67294, + 67258, + 67272, + 67291, + 67274, + 67293, + 67296, + 67357, + 67286, + 67298, + 67298, + 67268, + 67350, + 67301, + 67336, + 67293, + 67307, + 67280, + 67303, + 67289, + 67274, + 67291, + 67298, + 67253, + 67268, + 67267, + 67291, + 67309, + 67294, + 67275, + 67279, + 67268, + 67294, + 67318, + 67272, + 67269, + 67295, + 67303, + 67272, + 67309, + 67273, + 67282, + 67289, + 67301, + 67303, + 67329, + 67281, + 67286, + 67348, + 67280, + 67299, + 67319, + 67298, + 67272, + 67298, + 67286, + 67270, + 67273, + 67286, + 67258, + 67308, + 67298, + 67309, + 67274, + 67258, + 67256, + 67272, + 67308, + 67292, + 67282, + 67300, + 67308, + 67284, + 67281, + 67266, + 67279, + 67303, + 67284, + 67322, + 67296, + 67267, + 67272, + 67281, + 67308, + 67345, + 67288, + 67337, + 67266, + 67291, + 67258, + 67277, + 67288, + 67287, + 67313, + 67288, + 67288, + 67296, + 67351, + 67284, + 67314, + 67278, + 67270, + 67276, + 67280, + 67290, + 67282, + 67308, + 67315, + 67267, + 67296, + 67267, + 67290, + 67254, + 67267, + 67279, + 67280, + 67256, + 67267, + 67289, + 67303, + 67315, + 67300, + 67278, + 67292, + 67280, + 67275, + 67286, + 67280, + 67304, + 67423, + 67297, + 67295, + 67308, + 67284, + 67300, + 67302, + 67280, + 67263, + 67308, + 67306, + 67290, + 67323, + 67262, + 67286, + 67280, + 67335, + 67330, + 67288, + 67254, + 67283, + 67294, + 67273, + 67252, + 67297, + 67326, + 67293, + 67275, + 67299, + 67338, + 67289, + 67282, + 67294, + 67280, + 67269, + 67310, + 67268, + 67300, + 67281, + 67308, + 67277, + 67282, + 67282, + 67269, + 67324, + 67307, + 67291, + 67295, + 67302, + 67270, + 67279, + 67287, + 67316, + 67297, + 67278, + 67277, + 67284, + 67281, + 67296, + 67311, + 67310, + 67262, + 67327, + 67302, + 67315, + 67274, + 67267, + 67286, + 67278, + 67311, + 67286, + 67331, + 67287, + 67296, + 67283, + 67328, + 67282, + 67293, + 67306, + 67282, + 67316, + 67315, + 67272, + 67293, + 67253, + 67333, + 67319, + 67322, + 67263, + 67280, + 67269, + 67283, + 67288, + 67313, + 67291, + 67282, + 67255, + 67292, + 67277, + 67254, + 67264, + 67290, + 67292, + 67291, + 67288, + 67304, + 67282, + 67333, + 67281, + 67281, + 67290, + 67274, + 67268, + 67279, + 67772, + 67325, + 67287, + 67323, + 67274, + 67263, + 67258, + 67280, + 67307, + 67292, + 67309, + 67295, + 67272, + 67266, + 67268, + 67307, + 67258, + 67302, + 67318, + 67252, + 67263, + 67265, + 67304, + 67298, + 67265, + 67289, + 67282, + 67284, + 67308, + 67296, + 67297, + 67294, + 67277, + 67279, + 67288, + 67296, + 67307, + 67278, + 67331, + 67305, + 67318, + 67309, + 67281, + 67294, + 67301, + 67303, + 67290, + 67313, + 67297, + 67275, + 67287, + 67321, + 67279, + 67317, + 67286, + 67297, + 67302, + 67284, + 67285, + 67299, + 67275, + 67292, + 67256, + 67308, + 67309, + 67324, + 67302, + 67274, + 67284, + 67287, + 67285, + 67301, + 67269, + 67273, + 67298, + 67267, + 67278, + 67254, + 67281, + 67316, + 67284, + 67260, + 67285, + 67304, + 67265, + 67314, + 67318, + 67302, + 67299, + 67288, + 67308, + 67304, + 67288, + 67289, + 67272, + 67261, + 67302, + 67298, + 67318, + 67268, + 67285, + 67345, + 67271, + 67280, + 67295, + 67280, + 67313, + 67288, + 67288, + 67309, + 67312, + 67268, + 67282, + 67268, + 67287, + 67295, + 67333, + 67303, + 67278, + 67281, + 67301, + 67278, + 67314, + 67283, + 67302, + 67287, + 67273, + 67274, + 67285, + 67269, + 67305, + 67298, + 67323, + 67264, + 67301, + 67304, + 67318, + 67304, + 67310, + 67285, + 67275, + 67310, + 67271, + 67283, + 67319, + 67270, + 67258, + 67289, + 67354, + 67284, + 67295, + 67253, + 67297, + 67287, + 67311, + 67291, + 67294, + 67281, + 67334, + 67268, + 67273, + 67269, + 67269, + 67292, + 67298, + 67278, + 67281, + 67275, + 67320, + 67293, + 67256, + 67285, + 67263, + 67312, + 67312, + 67274, + 67307, + 67269, + 67281, + 67308, + 67304, + 67277, + 67290, + 67258, + 67263, + 67287, + 67282, + 67276, + 67265, + 67300, + 67273, + 67257, + 67287, + 67320, + 67311, + 67291, + 67266, + 67256, + 67301, + 67295, + 67310, + 67302, + 67270, + 67264, + 67302, + 67291, + 67278, + 67280, + 67281, + 67304, + 67306, + 67292, + 67300, + 67282, + 67302, + 67297, + 67326, + 67288, + 67292, + 67271, + 67283, + 67286, + 67287, + 67284, + 67332, + 67306, + 67282, + 67279, + 67282, + 67279, + 67336, + 67265, + 67322, + 67315, + 67291, + 67357, + 67288, + 67296, + 67308, + 67289, + 67317, + 67302, + 67246, + 67313, + 67268, + 67300, + 67298, + 67309, + 67284, + 67258, + 67267, + 67341, + 67269, + 67274, + 67281, + 67304, + 67289, + 67288, + 67269, + 67267, + 67321, + 67331, + 67317, + 67271, + 67297, + 67304, + 67300, + 67329, + 67310, + 67268, + 67313, + 67256, + 67267, + 67314, + 67300, + 67274, + 67280, + 67267, + 67265, + 67292, + 67295, + 67299, + 67266, + 67302, + 67316, + 67281, + 67269, + 67311, + 67294, + 67299, + 67280, + 67252, + 67304, + 67289, + 67301, + 67280, + 67269, + 67285, + 67275, + 67312, + 67271, + 67309, + 67306, + 67305, + 67297, + 67334, + 67272, + 67271, + 67312, + 67277, + 67323, + 67295, + 67282, + 67301, + 67308, + 67302, + 67339, + 67319, + 67290, + 67339, + 67280, + 67260, + 67349, + 67279, + 67344, + 67279, + 67283, + 67306, + 67286, + 67310, + 67252, + 67316, + 67289, + 67296, + 67278, + 67269, + 67266, + 67248, + 67310, + 67320, + 67303, + 67299, + 67371, + 67296, + 67299, + 67310, + 67300, + 67284, + 67286, + 67294, + 67294, + 67306, + 67280, + 67271, + 67280, + 67313, + 67256, + 67283, + 67302, + 67349, + 67330, + 67269, + 67303, + 67270, + 67298, + 67270, + 67273, + 67329, + 67298, + 67290, + 67312, + 67314, + 67292, + 67273, + 67277, + 67283, + 67296, + 67273, + 67291, + 67332, + 67265, + 67254, + 67277, + 67289, + 67299, + 67335, + 67355, + 67273, + 67297, + 67310, + 67338, + 67266, + 67286, + 67297, + 67304, + 67286, + 67292, + 67303, + 67335, + 67284, + 67292, + 67292, + 67289, + 67350, + 67278, + 67263, + 67263, + 67266, + 67308, + 67302, + 67276, + 67292, + 67319, + 67314, + 67253, + 67288, + 67265, + 67278, + 67309, + 67298, + 67266, + 67273, + 67285, + 67276, + 67287, + 67295, + 67322, + 67335, + 67293, + 67280, + 67284, + 67251, + 67295, + 67286, + 67292, + 67336, + 67283, + 67315, + 67326, + 67293, + 67274, + 67257, + 67269, + 67303, + 67254, + 67282, + 67297, + 67294, + 67283, + 67293, + 67293, + 67313, + 67326, + 67286, + 67300, + 67320, + 67315, + 67291, + 67260, + 67301, + 67295, + 67259, + 67347, + 67322, + 67265, + 67265, + 67301, + 67284, + 67327, + 67294, + 67286, + 67287, + 67306, + 67256, + 67270, + 67300, + 67293, + 67302, + 67279, + 67251, + 67295, + 67298, + 67322, + 67325, + 67282, + 67275, + 67310, + 67273, + 67328, + 67276, + 67289, + 67286, + 67277, + 67289, + 67298, + 67290, + 67271, + 67287, + 67321, + 67307, + 67283, + 67262, + 67292, + 67305, + 67313, + 67282, + 67271, + 67286, + 67271, + 67291, + 67320, + 67295, + 67294, + 67271, + 67323, + 67304, + 67301, + 67297, + 67264, + 67277, + 67312, + 67271, + 67258, + 67283, + 67289, + 67313, + 67320, + 67346, + 67327, + 67267, + 67332, + 67280, + 67317, + 67295, + 67291, + 67262, + 67315, + 67266, + 67299, + 67278, + 67307, + 67294, + 67288, + 67313, + 67271, + 67281, + 67292, + 67292, + 67269, + 67307, + 67289, + 67260, + 67297, + 67319, + 67296, + 67327, + 67287, + 67318, + 67285, + 67271, + 67277, + 67306, + 67286, + 67305, + 67268, + 67282, + 67350, + 67314, + 67294, + 67314, + 67299, + 67327, + 67291, + 67324, + 67309, + 67276, + 67291, + 67326, + 67323, + 67263, + 67303, + 67293, + 67288, + 67287, + 67262, + 67278, + 67318, + 67297, + 67309, + 67268, + 67326, + 67290, + 67281, + 67281, + 67312, + 67289, + 67273, + 67297, + 67250, + 67305, + 67292, + 67314, + 67302, + 67283, + 67338, + 67296, + 67309, + 67319, + 67299, + 67298, + 67312, + 67281, + 67284, + 67291, + 67277, + 67298, + 67299, + 67297, + 67316, + 67345, + 67282, + 67304, + 67308, + 67356, + 67315, + 67278, + 67285, + 67279, + 67282, + 67261, + 67329, + 67296, + 67286, + 67293, + 67321, + 67264, + 67355, + 67290, + 67274, + 67300, + 67282, + 67317, + 67276, + 67325, + 67268, + 67303, + 67315, + 67293, + 67345, + 67340, + 67291, + 67282, + 67279, + 67306, + 67271, + 67294, + 67300, + 67286, + 67329, + 67301, + 67279, + 67285, + 67270, + 67297, + 67274, + 67307, + 67296, + 67282, + 67265, + 67290, + 67305, + 67310, + 67295, + 67273, + 67302, + 67312, + 67305, + 67303, + 67277, + 67280, + 67256, + 67292, + 67292, + 67280, + 67313, + 67266, + 67274, + 67309, + 67338, + 67255, + 67285, + 67318, + 67270, + 67288, + 67294, + 67277, + 67272, + 67342, + 67283, + 67300, + 67256, + 67312, + 67304, + 67292, + 67265, + 67297, + 67320, + 67298, + 67269, + 67271, + 67331, + 67306, + 67285, + 67317, + 67293, + 67319, + 67287, + 67282, + 67256, + 67311, + 67303, + 67309, + 67280, + 67274, + 67279, + 67310, + 67295, + 67313, + 67335, + 67272, + 67299, + 67270, + 67269, + 67294, + 67289, + 67281, + 67298, + 67297, + 67309, + 67305, + 67300, + 67281, + 67319, + 67282, + 67292, + 67324, + 67317, + 67294, + 67284, + 67265, + 67287, + 67298, + 67286, + 67300, + 67283, + 67288, + 67283, + 67307, + 67297, + 67299, + 67295, + 67296, + 67275, + 67279, + 67292, + 67283, + 67298, + 67302, + 67265, + 67283, + 67251, + 67278, + 67319, + 67272, + 67325, + 67315, + 67304, + 67334, + 67302, + 67278, + 67275, + 67285, + 67295, + 67303, + 67284, + 67291, + 67262, + 67287, + 67279, + 67288, + 67303, + 67315, + 67304, + 67270, + 67269, + 67273, + 67310, + 67284, + 67288, + 67269, + 67300, + 67322, + 67271, + 67274, + 67279, + 67312, + 67279, + 67311, + 67337, + 67292, + 67264, + 67312, + 67302, + 67305, + 67299, + 67306, + 67294, + 67299, + 67289, + 67292, + 67294, + 67305, + 67283, + 67352, + 67285, + 67280, + 67286, + 67286, + 67299, + 67310, + 67305, + 67298, + 67318, + 67300, + 67272, + 67276, + 67308, + 67330, + 67285, + 67282, + 67312, + 67320, + 67276, + 67345, + 67306, + 67286, + 67280, + 67300, + 67290, + 67294, + 67286, + 67338, + 67338, + 67335, + 67312, + 67279, + 67271, + 67298, + 67314, + 67293, + 67278, + 67277, + 67291, + 67306, + 67333, + 67277, + 67281, + 67281, + 67311, + 67289, + 67274, + 67272, + 67305, + 67324, + 67269, + 67284, + 67309, + 67291, + 67274, + 67320, + 67277, + 67324, + 67282, + 67296, + 67274, + 67253, + 67273, + 67310, + 67268, + 67269, + 67276, + 67275, + 67309, + 67279, + 67297, + 67288, + 67303, + 67279, + 67284, + 67279, + 67272, + 67261, + 67284, + 67361, + 67307, + 67266, + 67256, + 67277, + 67306, + 67279, + 67317, + 67305, + 67284, + 67304, + 67291, + 67317, + 67299, + 67307, + 67289, + 67290, + 67282, + 67277, + 67313, + 67315, + 67273, + 67338, + 67288, + 67276, + 67268, + 67267, + 67284, + 67279, + 67299, + 67288, + 67319, + 67294, + 67281, + 67254, + 67300, + 67316, + 67333, + 67288, + 67301, + 67311, + 67268, + 67283, + 67302, + 67317, + 67298, + 67274, + 67302, + 67272, + 67287, + 67264, + 67295, + 67327, + 67305, + 67265, + 67331, + 67279, + 67325, + 67289, + 67298, + 67288, + 67291, + 67392, + 67309, + 67273, + 67261, + 67259, + 67287, + 67292, + 67272, + 67308, + 67311, + 67308, + 67281, + 67324, + 67292, + 67278, + 67273, + 67284, + 67282, + 67281, + 67275, + 67276, + 67294, + 67266, + 67296, + 67323, + 67295, + 67275, + 67275, + 67308, + 67294, + 67294, + 67273, + 67295, + 67316, + 67294, + 67323, + 67301, + 67287, + 67297, + 67261, + 67294, + 67282, + 67298, + 67320, + 67253, + 67259, + 67301, + 67267, + 67272, + 67330, + 67260, + 67280, + 67285, + 67297, + 67280, + 67266, + 67326, + 67280, + 67285, + 67290, + 67295, + 67325, + 67291, + 67277, + 67274, + 67287, + 67263, + 67266, + 67296, + 67353, + 67258, + 67266, + 67277, + 67309, + 67295, + 67322, + 67293, + 67287, + 67284, + 67284, + 67273, + 67295, + 67300, + 67283, + 67288, + 67299, + 67270, + 67301, + 67276, + 67299, + 67291, + 67263, + 67532, + 67278, + 67260, + 67324, + 67346, + 67300, + 67271, + 67289, + 67261, + 67271, + 67296, + 67308, + 67283, + 67265, + 67311, + 67289, + 67324, + 67269, + 67330, + 67282, + 67314, + 67300, + 67286, + 67267, + 67278, + 67342, + 67283, + 67278, + 67268, + 67271, + 67288, + 67305, + 67291, + 67285, + 67287, + 67263, + 67301, + 67271, + 67254, + 67301, + 67296, + 67263, + 67274, + 67331, + 67262, + 67280, + 67298, + 67269, + 67306, + 67287, + 67272, + 67270, + 67287, + 67265, + 67306, + 67283, + 67285, + 67294, + 67265, + 67299, + 67310, + 67354, + 67269, + 67411, + 67319, + 67270, + 67281, + 67277, + 67298, + 67295, + 67274, + 67297, + 67267, + 67296, + 67309, + 67315, + 67276, + 67279, + 67299, + 67273, + 67271, + 67295, + 67277, + 67309, + 67340, + 67276, + 67309, + 67353, + 67314, + 67559, + 67318, + 67296, + 67261, + 67294, + 67300, + 67311, + 67289, + 67287, + 67282, + 67335, + 67281, + 67333, + 67294, + 67314, + 67316, + 67296, + 67314, + 67282, + 67272, + 67322, + 67291, + 67277, + 67283, + 67280, + 67280, + 67297, + 67275, + 67303, + 67260, + 67290, + 67306, + 67294, + 67278, + 67318, + 67309, + 67328, + 67328, + 67261, + 67304, + 67303, + 67282, + 67311, + 67310, + 67352, + 67319, + 67308, + 67269, + 67286, + 67263, + 67270, + 67286, + 67298, + 67319, + 67251, + 67281, + 67351, + 67304, + 67339, + 67317, + 67294, + 67301, + 67311, + 67294, + 67303, + 67286, + 67328, + 67312, + 67291, + 67272, + 67254, + 67271, + 67301, + 67311, + 67289, + 67284, + 67282, + 67288, + 67316, + 67293, + 67327, + 67259, + 67251, + 67267, + 67283, + 67269, + 67243, + 67324, + 67287, + 67276, + 67297, + 67264, + 67318, + 67266, + 67308, + 67348, + 67272, + 67269, + 67276, + 67293, + 67331, + 67291, + 67285, + 67316, + 67266, + 67307, + 67258, + 67328, + 67285, + 67267, + 67273, + 67294, + 67285, + 67317, + 67274, + 67282, + 67282, + 67294, + 67303, + 67291, + 67272, + 67251, + 67274, + 67279, + 67345, + 67310, + 67318, + 67296, + 67289, + 67279, + 67305, + 67287, + 67291, + 67263, + 67286, + 67278, + 67287, + 67300, + 67318, + 67291, + 67264, + 67291, + 67325, + 67291, + 67275, + 67319, + 67324, + 67301, + 67289, + 67281, + 67300, + 67303, + 67306, + 67303, + 67248, + 67287, + 67300, + 67302, + 67285, + 67334, + 67315, + 67303, + 67291, + 67314, + 67270, + 67305, + 67306, + 67326, + 67303, + 67308, + 67292, + 67288, + 67252, + 67301, + 67292, + 67261, + 67357, + 67289, + 67275, + 67299, + 67278, + 67270, + 67274, + 67266, + 67282, + 67287, + 67330, + 67277, + 67327, + 67272, + 67282, + 67307, + 67305, + 67351, + 67274, + 67266, + 67297, + 67289, + 67283, + 67295, + 67301, + 67305, + 67328, + 67274, + 67333, + 67282, + 67299, + 67306, + 67300, + 67319, + 67351, + 67308, + 67275, + 67262, + 67290, + 67297, + 67262, + 67270, + 67305, + 67281, + 67276, + 67301, + 67273, + 67298, + 67251, + 67301, + 67276, + 67303, + 67327, + 67315, + 67283, + 67339, + 67294, + 67272, + 67272, + 67272, + 67301, + 67334, + 67315, + 67293, + 67287, + 67255, + 67280, + 67300, + 67340, + 67305, + 67345, + 67307, + 67274, + 67333, + 67276, + 67307, + 67306, + 67301, + 67326, + 67280, + 67279, + 67284, + 67300, + 67300, + 67272, + 67250, + 67336, + 67277, + 67285, + 67280, + 67308, + 67295, + 67322, + 67274, + 67297, + 67285, + 67287, + 67272, + 67315, + 67308, + 67297, + 67309, + 67264, + 67299, + 67272, + 67287, + 67313, + 67324, + 67298, + 67278, + 67297, + 67310, + 67290, + 67304, + 67290, + 67303, + 67304, + 67282, + 67288, + 67319, + 67272, + 67263, + 67318, + 67344, + 67355, + 67333, + 67295, + 67312, + 67303, + 67307, + 67331, + 67285, + 67265, + 67328, + 67258, + 67272, + 67278, + 67290, + 67274, + 67279, + 67295, + 67299, + 67294, + 67285, + 67321, + 67290, + 67261, + 67309, + 67277, + 67316, + 67260, + 67299, + 67315, + 67320, + 67341, + 67286, + 67265, + 67289, + 67274, + 67266, + 67304, + 67257, + 67290, + 67334, + 67290, + 67269, + 67293, + 67263, + 67301, + 67283, + 67279, + 67292, + 67257, + 67290, + 67285, + 67310, + 67296, + 67323, + 67290, + 67284, + 67290, + 67334, + 67268, + 67293, + 67253, + 67280, + 67308, + 67322, + 67286, + 67297, + 67334, + 67301, + 67303, + 67277, + 67282, + 67275, + 67302, + 67327, + 67258, + 67301, + 67277, + 67307, + 67301, + 67298, + 67302, + 67273, + 67282, + 67301, + 67269, + 67295, + 67272, + 67267, + 67251, + 67282, + 67275, + 67332, + 67317, + 67283, + 67298, + 67296, + 67283, + 67265, + 67279, + 67271, + 67314, + 67304, + 67325, + 67292, + 67294, + 67270, + 67288, + 67301, + 67291, + 67263, + 67326, + 67302, + 67258, + 67269, + 67330, + 67307, + 67304, + 67281, + 67303, + 67332, + 67263, + 67323, + 67276, + 67309, + 67314, + 67307, + 67303, + 67264, + 67308, + 67304, + 67318, + 67311, + 67263, + 67287, + 67276, + 67295, + 67262, + 67266, + 67289, + 67308, + 67285, + 67273, + 67283, + 67325, + 67307, + 67277, + 67317, + 67266, + 67333, + 67292, + 67288, + 67285, + 67285, + 67318, + 67296, + 67331, + 67268, + 67298, + 67283, + 67266, + 67286, + 67251, + 67310, + 67301, + 67285, + 67306, + 67305, + 67301, + 67295, + 67316, + 67290, + 67287, + 67293, + 67330, + 67299, + 67289, + 67258, + 67279, + 67266, + 67276, + 67281, + 67324, + 67255, + 67321, + 67300, + 67291, + 67265, + 67306, + 67287, + 67288, + 67323, + 67296, + 67258, + 67288, + 67286, + 67283, + 67280, + 67295, + 67305, + 67320, + 67317, + 67272, + 67302, + 67314, + 67286, + 67351, + 67343, + 67278, + 67281, + 67279, + 67330, + 67304, + 67291, + 67296, + 67330, + 67329, + 67269, + 67267, + 67302, + 67322, + 67286, + 67276, + 67295, + 67327, + 67329, + 67297, + 67278, + 67291, + 67285, + 67310, + 67333, + 67308, + 67291, + 67300, + 67272, + 67276, + 67265, + 67309, + 67336, + 67265, + 67292, + 67293, + 67276, + 67287, + 67304, + 67284, + 67258, + 67294, + 67283, + 67339, + 67302, + 67297, + 67280, + 67320, + 67370, + 67348, + 67303, + 67270, + 67280, + 67263, + 67318, + 67268, + 67303, + 67288, + 67278, + 67319, + 67265, + 67316, + 67295, + 67277, + 67290, + 67295, + 67294, + 67288, + 67324, + 67276, + 67274, + 67346, + 67271, + 67291, + 67330, + 67262, + 67287, + 67332, + 67312, + 67259, + 67268, + 67327, + 67295, + 67314, + 67329, + 67294, + 67343, + 67326, + 67309, + 67321, + 67263, + 67308, + 67256, + 67272, + 67281, + 67276, + 67274, + 67363, + 67286, + 67298, + 67266, + 67282, + 67328, + 67288, + 67309, + 67306, + 67294, + 67293, + 67278, + 67289, + 67299, + 67282, + 67290, + 67278, + 67285, + 67282, + 67366, + 67263, + 67268, + 67277, + 67295, + 67267, + 67320, + 67295, + 67301, + 67315, + 67277, + 67350, + 67302, + 67327, + 67249, + 67309, + 67282, + 67297, + 67304, + 67278, + 67300, + 67301, + 67274, + 67311, + 67298, + 67276, + 67315, + 67282, + 67290, + 67347, + 67309, + 67305, + 67297, + 67323, + 67263, + 67272, + 67261, + 67321, + 67303, + 67276, + 67301, + 67305, + 67287, + 67272, + 67306, + 67342, + 67311, + 67298, + 67299, + 67283, + 67306, + 67322, + 67291, + 67267, + 67305, + 67284, + 67310, + 67245, + 67299, + 67282, + 67305, + 67257, + 67301, + 67292, + 67292, + 67312, + 67316, + 67283, + 67285, + 67286, + 67335, + 67311, + 67289, + 67289, + 67267, + 67315, + 67307, + 67277, + 67307, + 67269, + 67291, + 67295, + 67357, + 67279, + 67288, + 67292, + 67293, + 67292, + 67273, + 67307, + 67278, + 67314, + 67305, + 67328, + 67309, + 67314, + 67295, + 67307, + 67326, + 67265, + 67254, + 67299, + 67314, + 67280, + 67335, + 67285, + 67287, + 67311, + 67323, + 67307, + 67287, + 67299, + 67273, + 67334, + 67331, + 67322, + 67294, + 67286, + 67284, + 67307, + 67287, + 67295, + 67330, + 67273, + 67302, + 67278, + 67316, + 67269, + 67277, + 67296, + 67301, + 67313, + 67289, + 67274, + 67309, + 67299, + 67271, + 67266, + 67271, + 67297, + 67270, + 67277, + 67302, + 67304, + 67294, + 67318, + 67299, + 67317, + 67289, + 67298, + 67332, + 67276, + 67297, + 67280, + 67260, + 67306, + 67302, + 67283, + 67285, + 67255, + 67315, + 67296, + 67285, + 67283, + 67286, + 67287, + 67288, + 67291, + 67339, + 67289, + 67295, + 67294, + 67294, + 67324, + 67280, + 67324, + 67326, + 67262, + 67266, + 67305, + 67267, + 67285, + 67319, + 67304, + 67269, + 67277, + 67273, + 67285, + 67302, + 67290, + 67270, + 67283, + 67258, + 67281, + 67274, + 67295, + 67315, + 67287, + 67304, + 67316, + 67306, + 67271, + 67264, + 67299, + 67282, + 67283, + 67294, + 67299, + 67324, + 67271, + 67330, + 67374, + 67267, + 67282, + 67316, + 67272, + 67287, + 67324, + 67313, + 67289, + 67342, + 67273, + 67310, + 67266, + 67291, + 67323, + 67278, + 67301, + 67284, + 67277, + 67256, + 67304, + 67277, + 67361, + 67257, + 67308, + 67294, + 67304, + 67307, + 67288, + 67256, + 67332, + 67314, + 67341, + 67332, + 67321, + 67317, + 67326, + 67268, + 67305, + 67315, + 67287, + 67287, + 67360, + 67325, + 67321, + 67293, + 67319, + 67284, + 67289, + 67284, + 67333, + 67311, + 67315, + 67275, + 67287, + 67323, + 67288, + 67273, + 67326, + 67289, + 67336, + 67270, + 67321, + 67345, + 67277, + 67299, + 67275, + 67292, + 67291, + 67314, + 67325, + 67336, + 67311, + 67304, + 67314, + 67300, + 67353, + 67293, + 67277, + 67282, + 67303, + 67270, + 67315, + 67281, + 67295, + 67279, + 67265, + 67286, + 67276, + 67272, + 67284, + 67253, + 67252, + 67283, + 67340, + 67311, + 67303, + 67289, + 67269, + 67282, + 67287, + 67306, + 67291, + 67273, + 67288, + 67295, + 67263, + 67314, + 67321, + 67279, + 67286, + 67288, + 67307, + 67301, + 67336, + 67297, + 67416, + 67283, + 67307, + 67306, + 67313, + 67310, + 67292, + 67310, + 67270, + 67317, + 67275, + 67289, + 67338, + 67297, + 67290, + 67285, + 67337, + 67296, + 67308, + 67361, + 67300, + 67275, + 67296, + 67287, + 67296, + 67271, + 67250, + 67348, + 67344, + 67301, + 67286, + 67315, + 67282, + 67267, + 67326, + 67258, + 67296, + 67308, + 67346, + 67284, + 67290, + 67318, + 67291, + 67298, + 67303, + 67284, + 67271, + 67268, + 67285, + 67267, + 67307, + 67295, + 67288, + 67281, + 67287, + 67284, + 67289, + 67304, + 67274, + 67266, + 67284, + 67310, + 67324, + 67284, + 67283, + 67279, + 67262, + 67291, + 67304, + 67313, + 67314, + 67271, + 67294, + 67282, + 67291, + 67280, + 67308, + 67301, + 67277, + 67266, + 67301, + 67306, + 67263, + 67265, + 67256, + 67309, + 67304, + 67335, + 67292, + 67297, + 67274, + 67346, + 67316, + 67289, + 67316, + 67332, + 67264, + 67252, + 67285, + 67310, + 67277, + 67319, + 67302, + 67283, + 67289, + 67301, + 67321, + 67265, + 67295, + 67289, + 67275, + 67289, + 67511, + 67294, + 67299, + 67297, + 67333, + 67345, + 67298, + 67319, + 67270, + 67298, + 67323, + 67265, + 67304, + 67318, + 67283, + 67285, + 67312, + 67297, + 67275, + 67298, + 67267, + 67273, + 67284, + 67287, + 67278, + 67279, + 67260, + 67294, + 67293, + 67281, + 67265, + 67253, + 67291, + 67288, + 67290, + 67260, + 67301, + 67317, + 67261, + 67336, + 67275, + 67302, + 67294, + 67305, + 67251, + 67278, + 67295, + 67293, + 67290, + 67291, + 67329, + 67319, + 67331, + 67282, + 67284, + 67293, + 67301, + 67300, + 67282, + 67288, + 67320, + 67269, + 67265, + 67284, + 67281, + 67291, + 67297, + 67300, + 67307, + 67282, + 67325, + 67269, + 67296, + 67333, + 67263, + 67279, + 67347, + 67269, + 67290, + 67280, + 67287, + 67281, + 67269, + 67267, + 67278, + 67269, + 67284, + 67275, + 67307, + 67284, + 67304, + 67304, + 67274, + 67278, + 67318, + 67256, + 67283, + 67294, + 67287, + 67299, + 67254, + 67305, + 67298, + 67284, + 67275, + 67294, + 67276, + 67319, + 67317, + 67320, + 67371, + 67257, + 67293, + 67314, + 67300, + 67245, + 67274, + 67328, + 67263, + 67269, + 67316, + 67293, + 67312, + 67304, + 67299, + 67293, + 67295, + 67280, + 67278, + 67263, + 67264, + 67256, + 67330, + 67259, + 67311, + 67317, + 67267, + 67257, + 67307, + 67326, + 67309, + 67293, + 67288, + 67285, + 67322, + 67284, + 67294, + 67281, + 67318, + 67309, + 67302, + 67266, + 67292, + 67286, + 67341, + 67264, + 67304, + 67330, + 67298, + 67291, + 67294, + 67288, + 67293, + 67294, + 67282, + 67298, + 67290, + 67253, + 67274, + 67319, + 67335, + 67299, + 67304, + 67261, + 67313, + 67277, + 67295, + 67282, + 67285, + 67273, + 67277, + 67286, + 67280, + 67281, + 67307, + 67324, + 67309, + 67287, + 67315, + 67253, + 67284, + 67319, + 67327, + 67299, + 67289, + 67297, + 67315, + 67263, + 67374, + 67327, + 67322, + 67295, + 67276, + 67303, + 67287, + 67326, + 67279, + 67307, + 67338, + 67279, + 67268, + 67277, + 67308, + 67311, + 67289, + 67285, + 67280, + 67253, + 67289, + 67296, + 67318, + 67289, + 67285, + 67305, + 67298, + 67297, + 67306, + 67302, + 67282, + 67291, + 67288, + 67315, + 67293, + 67308, + 67294, + 67289, + 67316, + 67297, + 67313, + 67295, + 67291, + 67330, + 67316, + 67332, + 67303, + 67373, + 67285, + 67260, + 67319, + 67322, + 67296, + 67265, + 67316, + 67300, + 67283, + 67313, + 67307, + 67308, + 67293, + 67316, + 67285, + 67263, + 67293, + 67316, + 67302, + 67285, + 67298, + 67275, + 67271, + 67303, + 67296, + 67294, + 67297, + 67276, + 67308, + 67304, + 67276, + 67307, + 67277, + 67280, + 67302, + 67294, + 67284, + 67273, + 67265, + 67295, + 67287, + 67290, + 67312, + 67291, + 67287, + 67294, + 67271, + 67301, + 67302, + 67254, + 67325, + 67294, + 67274, + 67300, + 67290, + 67334, + 67315, + 67290, + 67293, + 67279, + 67313, + 67261, + 67343, + 67304, + 67321, + 67299, + 67273, + 67261, + 67313, + 67264, + 67290, + 67274, + 67279, + 67313, + 67313, + 67268, + 67353, + 67285, + 67287, + 67269, + 67268, + 67281, + 67288, + 67293, + 67282, + 67279, + 67278, + 67258, + 67276, + 67294, + 67305, + 67294, + 67254, + 67283, + 67285, + 67295, + 67281, + 67281, + 67287, + 67298, + 67322, + 67294, + 67315, + 67298, + 67284, + 67250, + 67307, + 67281, + 67283, + 67298, + 67329, + 67302, + 67266, + 67279, + 67286, + 67298, + 67268, + 67282, + 67312, + 67295, + 67316, + 67320, + 67253, + 67288, + 67302, + 67285, + 67296, + 67271, + 67299, + 67311, + 67379, + 67277, + 67292, + 67268, + 67311, + 67266, + 67259, + 67291, + 67288, + 67310, + 67260, + 67286, + 67307, + 67270, + 67317, + 67269, + 67310, + 67264, + 67291, + 67326, + 67289, + 67273, + 67328, + 67290, + 67303, + 67293, + 67292, + 67278, + 67282, + 67278, + 67339, + 67272, + 67276, + 67280, + 67340, + 67273, + 67342, + 67284, + 67280, + 67299, + 67321, + 67291, + 67328, + 67314, + 67284, + 67315, + 67297, + 67296, + 67290, + 67297, + 67297, + 67268, + 67280, + 67270, + 67303, + 67260, + 67330, + 67239, + 67281, + 67272, + 67267, + 67284, + 67286, + 67284, + 67269, + 67319, + 67274, + 67309, + 67292, + 67274, + 67279, + 67301, + 67336, + 67270, + 67310, + 67284, + 67359, + 67297, + 67285, + 67304, + 67272, + 67331, + 67277, + 67292, + 67301, + 67267, + 67285, + 67322, + 67261, + 67269, + 67281, + 67277, + 67280, + 67308, + 67309, + 67306, + 67277, + 67290, + 67266, + 67316, + 67308, + 67278, + 67308, + 67264, + 67258, + 67301, + 67296, + 67267, + 67324, + 67324, + 67283, + 67288, + 67279, + 67316, + 67297, + 67292, + 67283, + 67247, + 67285, + 67292, + 67288, + 67274, + 67272, + 67316, + 67293, + 67295, + 67269, + 67265, + 67261, + 67283, + 67279, + 67277, + 67309, + 67260, + 67322, + 67267, + 67268, + 67293, + 67283, + 67289, + 67306, + 67340, + 67286, + 67270, + 67275, + 67273, + 67336, + 67281, + 67294, + 67292, + 67295, + 67287, + 67318, + 67258, + 67267, + 67271, + 67339, + 67274, + 67307, + 67278, + 67306, + 67318, + 67292, + 67303, + 67272, + 67298, + 67292, + 67308, + 67312, + 67272, + 67309, + 67315, + 67320, + 67270, + 67268, + 67269, + 67290, + 67331, + 67273, + 67302, + 67261, + 67267, + 67313, + 67271, + 67258, + 67284, + 67293, + 67280, + 67279, + 67327, + 67282, + 67284, + 67260, + 67303, + 67281, + 67276, + 67281, + 67285, + 67287, + 67293, + 67314, + 67316, + 67315, + 67272, + 67270, + 67288, + 67314, + 67296, + 67266, + 67376, + 67275, + 67311, + 67309, + 67292, + 67269, + 67309, + 67282, + 67317, + 67309, + 67319, + 67373, + 67297, + 67266, + 67275, + 67304, + 67292, + 67272, + 67280, + 67285, + 67296, + 67310, + 67289, + 67267, + 67270, + 67328, + 67298, + 67279, + 67241, + 67283, + 67307, + 67289, + 67312, + 67257, + 67290, + 67280, + 67275, + 67271, + 67276, + 67261, + 67294, + 67308, + 67318, + 67263, + 67272, + 67288, + 67300, + 67273, + 67315, + 67295, + 67268, + 67330, + 67329, + 67307, + 67277, + 67286, + 67281, + 67307, + 67306, + 67306, + 67280, + 67303, + 67320, + 67289, + 67301, + 67355, + 67264, + 67287, + 67285, + 67292, + 67285, + 67261, + 67255, + 67286, + 67306, + 67305, + 67289, + 67303, + 67281, + 67261, + 67298, + 67288, + 67275, + 67286, + 67301, + 67292, + 67291, + 67325, + 67312, + 67306, + 67305, + 67316, + 67349, + 67308, + 67279, + 67312, + 67329, + 67271, + 67289, + 67263, + 67473, + 67271, + 67300, + 67286, + 67279, + 67307, + 67295, + 67305, + 67303, + 67288, + 67333, + 67318, + 67276, + 67277, + 67305, + 67287, + 67305, + 67314, + 67303, + 67298, + 67257, + 67254, + 67277, + 67320, + 67288, + 67275, + 67295, + 67272, + 67269, + 67328, + 67259, + 67283, + 67315, + 67263, + 67280, + 67274, + 67291, + 67296, + 67274, + 67307, + 67312, + 67292, + 67290, + 67323, + 67298, + 67276, + 67306, + 67284, + 67277, + 67284, + 67296, + 67264, + 67316, + 67303, + 67268, + 67313, + 67324, + 67268, + 67294, + 67302, + 67273, + 67325, + 67313, + 67282, + 67293, + 67288, + 67292, + 67274, + 67279, + 67302, + 67285, + 67295, + 67331, + 67289, + 67300, + 67261, + 67290, + 67360, + 67298, + 67276, + 67288, + 67269, + 67296, + 67299, + 67321, + 67339, + 67312, + 67314, + 67308, + 67290, + 67288, + 67276, + 67298, + 67303, + 67298, + 67276, + 67291, + 67285, + 67287, + 67280, + 67299, + 67278, + 67288, + 67279, + 67322, + 67299, + 67322, + 67308, + 67270, + 67287, + 67262, + 67284, + 67306, + 67300, + 67272, + 67283, + 67262, + 67269, + 67266, + 67281, + 67336, + 67336, + 67276, + 67308, + 67275, + 67271, + 67272, + 67314, + 67268, + 67297, + 67303, + 67310, + 67275, + 67334, + 67250, + 67301, + 67290, + 67310, + 67266, + 67267, + 67304, + 67287, + 67316, + 67257, + 67294, + 67290, + 67305, + 67294, + 67293, + 67314, + 67284, + 67298, + 67294, + 67273, + 67293, + 67344, + 67286, + 67264, + 67281, + 67251, + 67319, + 67297, + 67280, + 67282, + 67282, + 67285, + 67276, + 67266, + 67262, + 67273, + 67294, + 67277, + 67294, + 67299, + 67290, + 67283, + 67264, + 67282, + 67252, + 67281, + 67268, + 67274, + 67325, + 67301, + 67280, + 67336, + 67265, + 67271, + 67323, + 67272, + 67310, + 67297, + 67278, + 67292, + 67312, + 67289, + 67304, + 67298, + 67290, + 67295, + 67299, + 67280, + 67285, + 67293, + 67315, + 67284, + 67286, + 67287, + 67296, + 67272, + 67273, + 67284, + 67297, + 67273, + 67306, + 67307, + 67284, + 67314, + 67313, + 67273, + 67327, + 67283, + 67281, + 67270, + 67288, + 67298, + 67307, + 67329, + 67324, + 67307, + 67306, + 67315, + 67291, + 67320, + 67270, + 67314, + 67290, + 67286, + 67356, + 67286, + 67278, + 67254, + 67306, + 67314, + 67304, + 67429, + 67323, + 67305, + 67308, + 67311, + 67267, + 67293, + 67260, + 67279, + 67289, + 67309, + 67284, + 67262, + 67355, + 67302, + 67280, + 67275, + 67306, + 67267, + 67319, + 67279, + 67276, + 67296, + 67305, + 67280, + 67279, + 67275, + 67311, + 67274, + 67344, + 67280, + 67304, + 67276, + 67257, + 67270, + 67305, + 67282, + 67313, + 67318, + 67258, + 67297, + 67304, + 67311, + 67311, + 67278, + 67292, + 67307, + 67316, + 67293, + 67307, + 67302, + 67294, + 67298, + 67301, + 67314, + 67264, + 67282, + 67302, + 67309, + 67300, + 67300, + 67270, + 67274, + 67322, + 67365, + 67284, + 67294, + 67298, + 67307, + 67284, + 67290, + 67298, + 67321, + 67280, + 67320, + 67272, + 67310, + 67314, + 67348, + 67286, + 67314, + 67264, + 67305, + 67291, + 67295, + 67320, + 67263, + 67310, + 67299, + 67281, + 67296, + 67322, + 67303, + 67286, + 67295, + 67272, + 67275, + 67287, + 67308, + 67269, + 67283, + 67286, + 67301, + 67303, + 67319, + 67279, + 67275, + 67284, + 67265, + 67295, + 67314, + 67294, + 67303, + 67307, + 67322, + 67332, + 67280, + 67275, + 67272, + 67257, + 67261, + 67288, + 67275, + 67267, + 67295, + 67296, + 67307, + 67298, + 67276, + 67286, + 67261, + 67318, + 67289, + 67320, + 67293, + 67288, + 67263, + 67291, + 67252, + 67298, + 67259, + 67278, + 67297, + 67288, + 67261, + 67262, + 67293, + 67298, + 67286, + 67269, + 67273, + 67324, + 67309, + 67285, + 67252, + 67277, + 67289, + 67263, + 67318, + 67283, + 67308, + 67284, + 67327, + 67311, + 67293, + 67264, + 67277, + 67305, + 67286, + 67318, + 67316, + 67268, + 67252, + 67309, + 67267, + 67260, + 67287, + 67275, + 67324, + 67283, + 67311, + 67297, + 67298, + 67319, + 67267, + 67299, + 67288, + 67280, + 67279, + 67285, + 67273, + 67304, + 67264, + 67315, + 67294, + 67291, + 67331, + 67269, + 67303, + 67285, + 67324, + 67330, + 67318, + 67312, + 67274, + 67271, + 67331, + 67275, + 67265, + 67267, + 67323, + 67271, + 67289, + 67324, + 67308, + 67323, + 67387, + 67286, + 67314, + 67281, + 67286, + 67293, + 67317, + 67299, + 67265, + 67281, + 67287, + 67296, + 67307, + 67290, + 67271, + 67286, + 67332, + 67299, + 67296, + 67283, + 67293, + 67334, + 67271, + 67283, + 67294, + 67275, + 67272, + 67316, + 67276, + 67300, + 67273, + 67264, + 67298, + 67257, + 67314, + 67316, + 67302, + 67274, + 67298, + 67304, + 67278, + 67311, + 67290, + 67315, + 67286, + 67329, + 67284, + 67318, + 67289, + 67312, + 67318, + 67308, + 67276, + 67295, + 67310, + 67315, + 67343, + 67284, + 67257, + 67312, + 67262, + 67271, + 67270, + 67294, + 67310, + 67318, + 67286, + 67296, + 67284, + 67283, + 67285, + 67280, + 67311, + 67285, + 67282, + 67293, + 67315, + 67314, + 67313, + 67306, + 67322, + 67285, + 67332, + 67316, + 67277, + 67314, + 67302, + 67306, + 67269, + 67297, + 67286, + 67288, + 67308, + 67302, + 67284, + 67284, + 67275, + 67272, + 67304, + 67274, + 67275, + 67295, + 67303, + 67280, + 67303, + 67279, + 67275, + 67347, + 67314, + 67261, + 67310, + 67315, + 67286, + 67291, + 67264, + 67303, + 67297, + 67280, + 67307, + 67368, + 67272, + 67306, + 67291, + 67332, + 67321, + 67292, + 67299, + 67305, + 67274, + 67301, + 67308, + 67330, + 67305, + 67263, + 67302, + 67299, + 67260, + 67328, + 67276, + 67285, + 67312, + 67302, + 67343, + 67264, + 67262, + 67294, + 67272, + 67291, + 67283, + 67294, + 67333, + 67285, + 67293, + 67307, + 67313, + 67284, + 67291, + 67251, + 67322, + 67318, + 67311, + 67261, + 67267, + 67423, + 67311, + 67360, + 67288, + 67298, + 67286, + 67309, + 67273, + 67328, + 67302, + 67267, + 67316, + 67287, + 67304, + 67253, + 67298, + 67363, + 67296, + 67324, + 67277, + 67262, + 67296, + 67302, + 67254, + 67279, + 67279, + 67270, + 67283, + 67271, + 67309, + 67263, + 67292, + 67286, + 67309, + 67297, + 67296, + 67296, + 67287, + 67284, + 67311, + 67310, + 67262, + 67296, + 67283, + 67295, + 67292, + 67295, + 67269, + 67299, + 67279, + 67313, + 67320, + 67303, + 67305, + 67297, + 67275, + 67301, + 67286, + 67246, + 67303, + 67295, + 67285, + 67277, + 67290, + 67277, + 67296, + 67293, + 67268, + 67311, + 67309, + 67275, + 67278, + 67297, + 67329, + 67278, + 67269, + 67306, + 67292, + 67274, + 67321, + 67290, + 67301, + 67270, + 67346, + 67284, + 67252, + 67277, + 67267, + 67268, + 67291, + 67304, + 67266, + 67296, + 67296, + 67292, + 67267, + 67324, + 67297, + 67258, + 67303, + 67307, + 67271, + 67269, + 67282, + 67267, + 67276, + 67295, + 67284, + 67313, + 67271, + 67257, + 67267, + 67275, + 67314, + 67298, + 67263, + 67315, + 67296, + 67312, + 67328, + 67265, + 67264, + 67280, + 67296, + 67266, + 67315, + 67265, + 67286, + 67272, + 67324, + 67287, + 67319, + 67305, + 67286, + 67294, + 67303, + 67269, + 67292, + 67307, + 67285, + 67257, + 67272, + 67308, + 67270, + 67282, + 67303, + 67301, + 67292, + 67278, + 67306, + 67282, + 67340, + 67298, + 67274, + 67306, + 67267, + 67281, + 67271, + 67287, + 67290, + 67298, + 67286, + 67342, + 67299, + 67275, + 67298, + 67296, + 67268, + 67319, + 67302, + 67294, + 67295, + 67283, + 67317, + 67286, + 67262, + 67326, + 67268, + 67290, + 67288, + 67283, + 67265, + 67280, + 67295, + 67302, + 67290, + 67254, + 67293, + 67257, + 67316, + 67310, + 67284, + 67339, + 67275, + 67270, + 67305, + 67290, + 67293, + 67299, + 67296, + 67310, + 67317, + 67314, + 67343, + 67298, + 67343, + 67287, + 67268, + 67269, + 67272, + 67290, + 67303, + 67265, + 67263, + 67265, + 67302, + 67302, + 67336, + 67292, + 67282, + 67327, + 67272, + 67292, + 67325, + 67249, + 67328, + 67300, + 67250, + 67279, + 67302, + 67303, + 67285, + 67312, + 67316, + 67267, + 67282, + 67300, + 67260, + 67267, + 67301, + 67314, + 67307, + 67318, + 67298, + 67303, + 67292, + 67284, + 67306, + 67300, + 67290, + 67275, + 67322, + 67276, + 67290, + 67261, + 67275, + 67329, + 67310, + 67328, + 67308, + 67277, + 67300, + 67295, + 67277, + 67292, + 67276, + 67268, + 67292, + 67287, + 67275, + 67261, + 67281, + 67270, + 67284, + 67314, + 67305, + 67304, + 67311, + 67300, + 67274, + 67279, + 67302, + 67305, + 67321, + 67270, + 67292, + 67294, + 67289, + 67348, + 67275, + 67277, + 67284, + 67331, + 67248, + 67248, + 67268, + 67286, + 67271, + 67345, + 67272, + 67288, + 67251, + 67270, + 67249, + 67308, + 67320, + 67256, + 67308, + 67307, + 67311, + 67317, + 67326, + 67270, + 67341, + 67324, + 67328, + 67290, + 67335, + 67313, + 67327, + 67311, + 67259, + 67326, + 67309, + 67354, + 67277, + 67332, + 67287, + 67261, + 67306, + 67285, + 67261, + 67284, + 67278, + 67289, + 67294, + 67308, + 67266, + 67282, + 67283, + 67275, + 67314, + 67319, + 67296, + 67272, + 67259, + 67259, + 67288, + 67298, + 67274, + 67282, + 67292, + 67306, + 67305, + 67322, + 67295, + 67265, + 67273, + 67284, + 67250, + 67264, + 67329, + 67254, + 67269, + 67287, + 67282, + 67280, + 67334, + 67266, + 67284, + 67314, + 67282, + 67260, + 67288, + 67314, + 67294, + 67297, + 67305, + 67274, + 67286, + 67369, + 67280, + 67318, + 67250, + 67258, + 67265, + 67308, + 67299, + 67301, + 67293, + 67314, + 67307, + 67265, + 67298, + 67296, + 67307, + 67306, + 67266, + 67288, + 67274, + 67317, + 67287, + 67295, + 67287, + 67338, + 67290, + 67315, + 67299, + 67273, + 67306, + 67310, + 67277, + 67276, + 67292, + 67312, + 67285, + 67271, + 67281, + 67334, + 67306, + 67289, + 67358, + 67268, + 67290, + 67296, + 67278, + 67277, + 67320, + 67315, + 67281, + 67293, + 67295, + 67281, + 67325, + 67285, + 67303, + 67323, + 67272, + 67285, + 67295, + 67301, + 67281, + 67286, + 67321, + 67289, + 67296, + 67352, + 67291, + 67292, + 67320, + 67289, + 67287, + 67263, + 67273, + 67318, + 67255, + 67319, + 67291, + 67311, + 67269, + 67314, + 67312, + 67264, + 67292, + 67277, + 67311, + 67301, + 67269, + 67283, + 67284, + 67317, + 67296, + 67288, + 67300, + 67282, + 67277, + 67315, + 67254, + 67301, + 67268, + 67325, + 67315, + 67268, + 67318, + 67315, + 67268, + 67281, + 67274, + 67287, + 67299, + 67290, + 67304, + 67278, + 67323, + 67275, + 67267, + 67285, + 67300, + 67264, + 67263, + 67333, + 67301, + 67332, + 67265, + 67304, + 67303, + 67287, + 67303, + 67301, + 67277, + 67288, + 67258, + 67318, + 67277, + 67312, + 67309, + 67330, + 67274, + 67284, + 67268, + 67270, + 67303, + 67314, + 67320, + 67326, + 67300, + 67265, + 67276, + 67280, + 67281, + 67274, + 67328, + 67318, + 67356, + 67299, + 67305, + 67310, + 67289, + 67302, + 67278, + 67296, + 67278, + 67279, + 67268, + 67305, + 67329, + 67256, + 67279, + 67260, + 67286, + 67296, + 67295, + 67313, + 67251, + 67291, + 67288, + 67287, + 67252, + 67297, + 67331, + 67310, + 67281, + 67269, + 67283, + 67266, + 67282, + 67293, + 67286, + 67326, + 67281, + 67270, + 67276, + 67275, + 67297, + 67274, + 67280, + 67295, + 67307, + 67316, + 67316, + 67311, + 67278, + 67293, + 67320, + 67269, + 67268, + 67266, + 67291, + 67278, + 67323, + 67280, + 67300, + 67303, + 67353, + 67313, + 67297, + 67355, + 67276, + 67303, + 67327, + 67300, + 67311, + 67287, + 67263, + 67292, + 67308, + 67269, + 67322, + 67332, + 67304, + 67294, + 67335, + 67258, + 67305, + 67266, + 67292, + 67302, + 67304, + 67306, + 67291, + 67319, + 67264, + 67294, + 67314, + 67288, + 67297, + 67296, + 67319, + 67291, + 67262, + 67349, + 67296, + 67307, + 67281, + 67286, + 67347, + 67297, + 67297, + 67295, + 67270, + 67426, + 67308, + 67266, + 67268, + 67286, + 67308, + 67316, + 67289, + 67308, + 67265, + 67281, + 67290, + 67304, + 67263, + 67308, + 67309, + 67287, + 67281, + 67254, + 67341, + 67301, + 67336, + 67334, + 67310, + 67291, + 67289, + 67276, + 67297, + 67289, + 67301, + 67305, + 67305, + 67302, + 67323, + 67291, + 67275, + 67303, + 67276, + 67278, + 67281, + 67301, + 67278, + 67284, + 67309, + 67291, + 67280, + 67316, + 67288, + 67295, + 67268, + 67275, + 67282, + 67252, + 67269, + 67308, + 67307, + 67322, + 67269, + 67277, + 67319, + 67295, + 67298, + 67285, + 67306, + 67294, + 67291, + 67322, + 67370, + 67298, + 67268, + 67290, + 67333, + 67299, + 67293, + 67278, + 67276, + 67309, + 67327, + 67277, + 67306, + 67258, + 67270, + 67272, + 67283, + 67291, + 67290, + 67299, + 67281, + 67275, + 67306, + 67313, + 67272, + 67271, + 67269, + 67295, + 67268, + 67316, + 67304, + 67277, + 67300, + 67252, + 67295, + 67271, + 67304, + 67308, + 67295, + 67285, + 67305, + 67282, + 67239, + 67290, + 67263, + 67247, + 67305, + 67283, + 67293, + 67296, + 67323, + 67296, + 67296, + 67281, + 67291, + 67300, + 67287, + 67304, + 67326, + 67325, + 67293, + 67286, + 67306, + 67246, + 67291, + 67276, + 67297, + 67273, + 67314, + 67280, + 67341, + 67316, + 67321, + 67290, + 67279, + 67288, + 67277, + 67333, + 67314, + 67275, + 67285, + 67292, + 67322, + 67321, + 67302, + 67279, + 67294, + 67299, + 67301, + 67289, + 67254, + 67286, + 67273, + 67361, + 67298, + 67285, + 67353, + 67274, + 67261, + 67305, + 67279, + 67296, + 67319, + 67308, + 67293, + 67263, + 67330, + 67323, + 67263, + 67247, + 67291, + 67264, + 67281, + 67260, + 67311, + 67297, + 67272, + 67280, + 67311, + 67320, + 67283, + 67344, + 67291, + 67266, + 67318, + 67293, + 67263, + 67340, + 67290, + 67266, + 67294, + 67280, + 67301, + 67292, + 67339, + 67298, + 67306, + 67346, + 67274, + 67292, + 67271, + 67257, + 67284, + 67317, + 67304, + 67303, + 67272, + 67255, + 67312, + 67286, + 67304, + 67265, + 67286, + 67298, + 67301, + 67301, + 67295, + 67255, + 67268, + 67299, + 67311, + 67293, + 67274, + 67318, + 67284, + 67329, + 67281, + 67328, + 67293, + 67299, + 67309, + 67291, + 67307, + 67313, + 67286, + 67269, + 67308, + 67267, + 67275, + 67326, + 67269, + 67292, + 67283, + 67302, + 67316, + 67315, + 67271, + 67281, + 67284, + 67291, + 67273, + 67263, + 67297, + 67346, + 67297, + 67283, + 67289, + 67265, + 67294, + 67293, + 67290, + 67284, + 67335, + 67319, + 67268, + 67319, + 67268, + 67311, + 67323, + 67294, + 67299, + 67288, + 67268, + 67276, + 67291, + 67292, + 67297, + 67314, + 67305, + 67289, + 67307, + 67276, + 67279, + 67287, + 67328, + 67279, + 67271, + 67257, + 67324, + 67244, + 67303, + 67272, + 67277, + 67288, + 67288, + 67264, + 67296, + 67299, + 67289, + 67281, + 67310, + 67300, + 67338, + 67269, + 67258, + 67263, + 67278, + 67306, + 67337, + 67255, + 67294, + 67271, + 67297, + 67274, + 67334, + 67284, + 67270, + 67285, + 67323, + 67286, + 67265, + 67324, + 67289, + 67276, + 67274, + 67290, + 67294, + 67293, + 67278, + 67280, + 67285, + 67305, + 67274, + 67265, + 67261, + 67317, + 67294, + 67312, + 67262, + 67281, + 67260, + 67281, + 67294, + 67337, + 67284, + 67303, + 67308, + 67311, + 67309, + 67257, + 67297, + 67276, + 67264, + 67337, + 67300, + 67279, + 67281, + 67318, + 67246, + 67297, + 67340, + 67239, + 67298, + 67264, + 67288, + 67279, + 67289, + 67285, + 67298, + 67306, + 67288, + 67297, + 67258, + 67313, + 67253, + 67293, + 67280, + 67295, + 67281, + 67260, + 67274, + 67259, + 67260, + 67319, + 67279, + 67295, + 67340, + 67296, + 67310, + 67295, + 67265, + 67308, + 67279, + 67277, + 67278, + 67265, + 67328, + 67300, + 67289, + 67310, + 67282, + 67287, + 67309, + 67298, + 67311, + 67278, + 67301, + 67295, + 67307, + 67289, + 67348, + 67286, + 67274, + 67283, + 67270, + 67281, + 67311, + 67350, + 67266, + 67310, + 67301, + 67315, + 67319, + 67325, + 67253, + 67282, + 67285, + 67317, + 67266, + 67276, + 67270, + 67274, + 67298, + 67270, + 67285, + 67268, + 67330, + 67290, + 67321, + 67295, + 67286, + 67303, + 67310, + 67293, + 67323, + 67307, + 67252, + 67326, + 67288, + 67290, + 67283, + 67295, + 67314, + 67324, + 67286, + 67273, + 67305, + 67329, + 67332, + 67301, + 67282, + 67330, + 67307, + 67308, + 67328, + 67278, + 67281, + 67269, + 67273, + 67304, + 67275, + 67264, + 67267, + 67294, + 67271, + 67327, + 67268, + 67287, + 67259, + 67281, + 67287, + 67273, + 67292, + 67281, + 67245, + 67277, + 67276, + 67293, + 67295, + 67290, + 67290, + 67322, + 67330, + 67279, + 67276, + 67322, + 67307, + 67372, + 67266, + 67296, + 67266, + 67300, + 67310, + 67283, + 67318, + 67313, + 67304, + 67279, + 67287, + 67294, + 67299, + 67309, + 67290, + 67305, + 67303, + 67280, + 67287, + 67320, + 67281, + 67306, + 67292, + 67295, + 67258, + 67332, + 67240, + 67297, + 67265, + 67298, + 67337, + 67292, + 67281, + 67302, + 67284, + 67274, + 67266, + 67291, + 67309, + 67297, + 67294, + 67266, + 67267, + 67349, + 67296, + 67274, + 67294, + 67299, + 67277, + 67305, + 67274, + 67263, + 67309, + 67303, + 67287, + 67306, + 67273, + 67251, + 67285, + 67323, + 67286, + 67278, + 67282, + 67285, + 67268, + 67320, + 67337, + 67309, + 67301, + 67320, + 67301, + 67315, + 67321, + 67295, + 67310, + 67275, + 67284, + 67250, + 67308, + 67259, + 67295, + 67280, + 67294, + 67281, + 67267, + 67296, + 67334, + 67289, + 67271, + 67317, + 67283, + 67307, + 67263, + 67285, + 67301, + 67305, + 67296, + 67274, + 67318, + 67310, + 67281, + 67281, + 67279, + 67278, + 67301, + 67302, + 67275, + 67346, + 67304, + 67296, + 67301, + 67268, + 67294, + 67291, + 67325, + 67280, + 67323, + 67300, + 67298, + 67295, + 67284, + 67313, + 67311, + 67292, + 67325, + 67316, + 67309, + 67310, + 67304, + 67307, + 67284, + 67283, + 67282, + 67293, + 67304, + 67273, + 67284, + 67278, + 67275, + 67271, + 67287, + 67319, + 67294, + 67282, + 67293, + 67320, + 67309, + 67265, + 67301, + 67256, + 67292, + 67279, + 67270, + 67269, + 67272, + 67289, + 67268, + 67273, + 67276, + 67254, + 67298, + 67288, + 67264, + 67265, + 67279, + 67265, + 67285, + 67281, + 67260, + 67284, + 67293, + 67310, + 67309, + 67290, + 67320, + 67307, + 67276, + 67287, + 67328, + 67292, + 67276, + 67284, + 67288, + 67294, + 67293, + 67281, + 67284, + 67270, + 67250, + 67301, + 67273, + 67261, + 67330, + 67282, + 67261, + 67255, + 67294, + 67302, + 67273, + 67268, + 67291, + 67271, + 67306, + 67275, + 67338, + 67280, + 67320, + 67268, + 67281, + 67317, + 67290, + 67295, + 67269, + 67289, + 67288, + 67316, + 67281, + 67276, + 67310, + 67269, + 67282, + 67333, + 67310, + 67289, + 67328, + 67304, + 67265, + 67288, + 67277, + 67266, + 67284, + 67280, + 67289, + 67304, + 67306, + 67277, + 67283, + 67288, + 67289, + 67274, + 67284, + 67256, + 67286, + 67298, + 67276, + 67292, + 67312, + 67317, + 67274, + 67261, + 67293, + 67297, + 67268, + 67292, + 67281, + 67279, + 67295, + 67300, + 67297, + 67331, + 67275, + 67269, + 67322, + 67284, + 67307, + 67278, + 67300, + 67309, + 67319, + 67271, + 67279, + 67311, + 67319, + 67268, + 67329, + 67297, + 67260, + 67300, + 67279, + 67292, + 67269, + 67297, + 67286, + 67272, + 67269, + 67281, + 67273, + 67295, + 67296, + 67280, + 67298, + 67298, + 67306, + 67283, + 67313, + 67372, + 67287, + 67310, + 67344, + 67297, + 67336, + 67284, + 67322, + 67276, + 67273, + 67315, + 67313, + 67311, + 67315, + 67305, + 67280, + 67294, + 67304, + 67301, + 67284, + 67306, + 67303, + 67255, + 67290, + 67306, + 67301, + 67272, + 67303, + 67315, + 67315, + 67351, + 67299, + 67259, + 67300, + 67282, + 67322, + 67301, + 67320, + 67275, + 67269, + 67340, + 67323, + 67323, + 67285, + 67286, + 67299, + 67293, + 67302, + 67297, + 67293, + 67251, + 67302, + 67308, + 67286, + 67317, + 67356, + 67277, + 67280, + 67290, + 67284, + 67263, + 67284, + 67282, + 67323, + 67262, + 67293, + 67346, + 67295, + 67277, + 67324, + 67271, + 67278, + 67291, + 67300, + 67320, + 67285, + 67303, + 67293, + 67353, + 67297, + 67299, + 67319, + 67264, + 67276, + 67350, + 67278, + 67271, + 67269, + 67266, + 67293, + 67280, + 67270, + 67317, + 67328, + 67270, + 67326, + 67347, + 67296, + 67271, + 67260, + 67295, + 67312, + 67304, + 67374, + 67290, + 67303, + 67292, + 67311, + 67261, + 67288, + 67297, + 67296, + 67307, + 67300, + 67256, + 67298, + 67295, + 67309, + 67283, + 67287, + 67255, + 67263, + 67287, + 67287, + 67276, + 67282, + 67283, + 67291, + 67294, + 67282, + 67283, + 67349, + 67305, + 67309, + 67286, + 67259, + 67245, + 67308, + 67340, + 67309, + 67321, + 67261, + 67301, + 67305, + 67321, + 67265, + 67281, + 67229, + 67294, + 67306, + 67318, + 67303, + 67278, + 67270, + 67286, + 67322, + 67331, + 67284, + 67303, + 67280, + 67311, + 67311, + 67347, + 67331, + 67273, + 67255, + 67281, + 67305, + 67293, + 67303, + 67314, + 67288, + 67301, + 67268, + 67270, + 67309, + 67267, + 67254, + 67264, + 67295, + 67266, + 67266, + 67274, + 67277, + 67338, + 67327, + 67294, + 67306, + 67274, + 67322, + 67325, + 67305, + 67275, + 67268, + 67280, + 67270, + 67268, + 67272, + 67286, + 67273, + 67292, + 67277, + 67312, + 67288, + 67293, + 67281, + 67290, + 67288, + 67324, + 67264, + 67314, + 67310, + 67304, + 67326, + 67268, + 67327, + 67291, + 67276, + 67280, + 67258, + 67320, + 67287, + 67267, + 67278, + 67300, + 67310, + 67268, + 67323, + 67286, + 67275, + 67267, + 67281, + 67282, + 67282, + 67287, + 67269, + 67286, + 67289, + 67258, + 67282, + 67294, + 67290, + 67256, + 67383, + 67319, + 67290, + 67295, + 67324, + 67275, + 67266, + 67315, + 67295, + 67301, + 67275, + 67296, + 67316, + 67247, + 67279, + 67292, + 67309, + 67270, + 67265, + 67273, + 67305, + 67318, + 67334, + 67299, + 67268, + 67297, + 67322, + 67254, + 67282, + 67286, + 67296, + 67274, + 67266, + 67289, + 67300, + 67315, + 67275, + 67283, + 67271, + 67268, + 67262, + 67285, + 67296, + 67290, + 67291, + 67285, + 67273, + 67328, + 67292, + 67286, + 67275, + 67254, + 67276, + 67328, + 67353, + 67316, + 67283, + 67262, + 67293, + 67274, + 67265, + 67304, + 67282, + 67277, + 67292, + 67304, + 67290, + 67289, + 67285, + 67301, + 67263, + 67281, + 67287, + 67270, + 67295, + 67276, + 67285, + 67249, + 67293, + 67297, + 67301, + 67309, + 67316, + 67328, + 67280, + 67289, + 67283, + 67275, + 67295, + 67269, + 67295, + 67310, + 67299, + 67314, + 67274, + 67304, + 67281, + 67288, + 67278, + 67322, + 67270, + 67284, + 67288, + 67255, + 67254, + 67295, + 67322, + 67321, + 67275, + 67283, + 67281, + 67310, + 67289, + 67267, + 67280, + 67311, + 67272, + 67291, + 67274, + 67265, + 67280, + 67326, + 67280, + 67266, + 67273, + 67311, + 67248, + 67344, + 67308, + 67291, + 67278, + 67273, + 67290, + 67273, + 67308, + 67277, + 67250, + 67289, + 67291, + 67288, + 67293, + 67276, + 67325, + 67279, + 67260, + 67325, + 67285, + 67298, + 67323, + 67251, + 67288, + 67261, + 67330, + 67348, + 67286, + 67320, + 67285, + 67278, + 67286, + 67281, + 67348, + 67344, + 67292, + 67274, + 67272, + 67273, + 67275, + 67300, + 67289, + 67305, + 67273, + 67322, + 67301, + 67304, + 67263, + 67276, + 67312, + 67268, + 67306, + 67310, + 67318, + 67301, + 67296, + 67292, + 67283, + 67278, + 67264, + 67296, + 67288, + 67266, + 67309, + 67314, + 67280, + 67284, + 67312, + 67298, + 67290, + 67291, + 67307, + 67311, + 67340, + 67297, + 67288, + 67276, + 67280, + 67330, + 67281, + 67268, + 67298, + 67290, + 67266, + 67284, + 67313, + 67273, + 67258, + 67295, + 67276, + 67330, + 67295, + 67335, + 67387, + 67314, + 67273, + 67251, + 67277, + 67262, + 67285, + 67271, + 67273, + 67317, + 67253, + 67300, + 67293, + 67252, + 67270, + 67286, + 67318, + 67291, + 67305, + 67303, + 67276, + 67292, + 67300, + 67307, + 67358, + 67282, + 67339, + 67307, + 67294, + 67295, + 67287, + 67285, + 67268, + 67387, + 67308, + 67276, + 67285, + 67292, + 67287, + 67301, + 67297, + 67311, + 67317, + 67318, + 67283, + 67314, + 67265, + 67294, + 67341, + 67284, + 67298, + 67312, + 67288, + 67325, + 67267, + 67276, + 67293, + 67318, + 67302, + 67276, + 67307, + 67299, + 67303, + 67311, + 67300, + 67266, + 67286, + 67310, + 67308, + 67312, + 67315, + 67319, + 67302, + 67275, + 67307, + 67323, + 67334, + 67295, + 67295, + 67257, + 67316, + 67297, + 67301, + 67274, + 67262, + 67285, + 67310, + 67305, + 67287, + 67298, + 67302, + 67297, + 67301, + 67301, + 67312, + 67305, + 67335, + 67320, + 67276, + 67341, + 67303, + 67288, + 67283, + 67300, + 67290, + 67296, + 67333, + 67277, + 67308, + 67269, + 67270, + 67280, + 67308, + 67305, + 67256, + 67291, + 67280, + 67275, + 67294, + 67275, + 67274, + 67271, + 67285, + 67275, + 67313, + 67289, + 67277, + 67298, + 67289, + 67309, + 67296, + 67274, + 67327, + 67250, + 67280, + 67307, + 67321, + 67339, + 67335, + 67299, + 67300, + 67303, + 67286, + 67285, + 67288, + 67282, + 67287, + 67290, + 67360, + 67291, + 67277, + 67304, + 67268, + 67282, + 67311, + 67294, + 67304, + 67247, + 67269, + 67316, + 67303, + 67292, + 67255, + 67283, + 67275, + 67290, + 67308, + 67311, + 67296, + 67290, + 67304, + 67298, + 67301, + 67302, + 67286, + 67391, + 67299, + 67292, + 67273, + 67316, + 67328, + 67294, + 67295, + 67341, + 67305, + 67293, + 67260, + 67300, + 67299, + 67268, + 67284, + 67298, + 67263, + 67286, + 67283, + 67324, + 67274, + 67290, + 67295, + 67337, + 67315, + 67287, + 67281, + 67309, + 67295, + 67266, + 67312, + 67295, + 67278, + 67302, + 67283, + 67314, + 67301, + 67267, + 67286, + 67275, + 67266, + 67297, + 67267, + 67305, + 67295, + 67267, + 67260, + 67299, + 67274, + 67288, + 67306, + 67296, + 67272, + 67316, + 67266, + 67254, + 67301, + 67259, + 67283, + 67275, + 67303, + 67318, + 67256, + 67291, + 67297, + 67295, + 67292, + 67266, + 67295, + 67287, + 67271, + 67336, + 67342, + 67314, + 67287, + 67299, + 67284, + 67304, + 67311, + 67277, + 67359, + 67280, + 67271, + 67295, + 67271, + 67296, + 67280, + 67249, + 67294, + 67257, + 67290, + 67289, + 67332, + 67263, + 67317, + 67256, + 67298, + 67290, + 67341, + 67288, + 67291, + 67309, + 67286, + 67272, + 67306, + 67250, + 67296, + 67330, + 67271, + 67307, + 67308, + 67328, + 67286, + 67290, + 67293, + 67297, + 67283, + 67312, + 67335, + 67281, + 67293, + 67275, + 67269, + 67281, + 67321, + 67297, + 67289, + 67320, + 67265, + 67284, + 67293, + 67258, + 67276, + 67290, + 67268, + 67310, + 67275, + 67307, + 67319, + 67253, + 67298, + 67259, + 67280, + 67311, + 67297, + 67282, + 67287, + 67285, + 67315, + 67308, + 67283, + 67277, + 67293, + 67273, + 67280, + 67310, + 67284, + 67335, + 67335, + 67298, + 67284, + 67323, + 67277, + 67302, + 67276, + 67292, + 67312, + 67293, + 67251, + 67276, + 67306, + 67270, + 67285, + 67261, + 67256, + 67282, + 67289, + 67333, + 67300, + 67286, + 67317, + 67341, + 67265, + 67279, + 67294, + 67305, + 67247, + 67276, + 67267, + 67267, + 67293, + 67351, + 67286, + 67302, + 67277, + 67280, + 67308, + 67281, + 67302, + 67269, + 67297, + 67318, + 67310, + 67246, + 67303, + 67296, + 67286, + 67303, + 67300, + 67319, + 67297, + 67270, + 67275, + 67278, + 67283, + 67262, + 67305, + 67304, + 67327, + 67323, + 67297, + 67275, + 67288, + 67302, + 67288, + 67283, + 67280, + 67330, + 67294, + 67303, + 67276, + 67293, + 67305, + 67254, + 67280, + 67342, + 67314, + 67284, + 67289, + 67315, + 67297, + 67261, + 67291, + 67300, + 67315, + 67262, + 67260, + 67284, + 67273, + 67250, + 67296, + 67319, + 67268, + 67285, + 67272, + 67273, + 67279, + 67287, + 67291, + 67271, + 67265, + 67271, + 67278, + 67338, + 67302, + 67302, + 67315, + 67310, + 67288, + 67320, + 67303, + 67282, + 67260, + 67265, + 67289, + 67275, + 67260, + 67260, + 67313, + 67294, + 67281, + 67279, + 67290, + 67330, + 67267, + 67327, + 67299, + 67286, + 67287, + 67282, + 67286, + 67297, + 67286, + 67275, + 67298, + 67260, + 67298, + 67281, + 67287, + 67286, + 67355, + 67304, + 67257, + 67287, + 67302, + 67322, + 67294, + 67370, + 67297, + 67255, + 67309, + 67345, + 67318, + 67302, + 67318, + 67310, + 67260, + 67263, + 67306, + 67306, + 67277, + 67283, + 67296, + 67300, + 67273, + 67258, + 67282, + 67326, + 67246, + 67285, + 67293, + 67295, + 67319, + 67283, + 67252, + 67297, + 67291, + 67312, + 67272, + 67304, + 67290, + 67275, + 67264, + 67323, + 67280, + 67292, + 67307, + 67269, + 67290, + 67275, + 67280, + 67254, + 67262, + 67298, + 67295, + 67310, + 67305, + 67266, + 67271, + 67256, + 67288, + 67319, + 67280, + 67313, + 67292, + 67312, + 67324, + 67315, + 67284, + 67253, + 67314, + 67280, + 67305, + 67335, + 67295, + 67304, + 67268, + 67278, + 67278, + 67273, + 67315, + 67307, + 67298, + 67263, + 67289, + 67303, + 67307, + 67254, + 67271, + 67319, + 67296, + 67292, + 67282, + 67323, + 67274, + 67326, + 67293, + 67269, + 67289, + 67288, + 67297, + 67282, + 67267, + 67268, + 67316, + 67304, + 67340, + 67282, + 67286, + 67319, + 67275, + 67258, + 67267, + 67247, + 67299, + 67272, + 67258, + 67311, + 67270, + 67293, + 67318, + 67262, + 67256, + 67548, + 67292, + 67288, + 67281, + 67295, + 67286, + 67276, + 67280, + 67303, + 67275, + 67316, + 67274, + 67305, + 67278, + 67242, + 67277, + 67289, + 67298, + 67304, + 67287, + 67296, + 67289, + 67301, + 67312, + 67321, + 67309, + 67275, + 67301, + 67275, + 67320, + 67268, + 67275, + 67327, + 67313, + 67273, + 67276, + 67252, + 67261, + 67320, + 67328, + 67278, + 67275, + 67286, + 67304, + 67322, + 67307, + 67288, + 67316, + 67258, + 67252, + 67277, + 67265, + 67311, + 67265, + 67310, + 67284, + 67303, + 67273, + 67273, + 67308, + 67301, + 67292, + 67271, + 67282, + 67340, + 67310, + 67280, + 67275, + 67265, + 67259, + 67271, + 67269, + 67291, + 67248, + 67326, + 67282, + 67274, + 67351, + 67332, + 67306, + 67299, + 67294, + 67258, + 67300, + 67355, + 67309, + 67262, + 67304, + 67276, + 67273, + 67304, + 67290, + 67262, + 67284, + 67280, + 67292, + 67286, + 67284, + 67319, + 67258, + 67284, + 67332, + 67266, + 67288, + 67297, + 67302, + 67317, + 67308, + 67350, + 67330, + 67274, + 67251, + 67278, + 67299, + 67314, + 67285, + 67290, + 67275, + 67276, + 67291, + 67303, + 67335, + 67303, + 67269, + 67276, + 67314, + 67301, + 67321, + 67295, + 67288, + 67310, + 67288, + 67250, + 67292, + 67334, + 67275, + 67321, + 67291, + 67286, + 67280, + 67291, + 67272, + 67255, + 67301, + 67306, + 67279, + 67257, + 67362, + 67288, + 67260, + 67259, + 67294, + 67278, + 67301, + 67284, + 67292, + 67301, + 67300, + 67294, + 67252, + 67320, + 67303, + 67316, + 67276, + 67288, + 67296, + 67298, + 67298, + 67330, + 67279, + 67291, + 67297, + 67303, + 67277, + 67320, + 67276, + 67282, + 67269, + 67278, + 67302, + 67297, + 67309, + 67244, + 67292, + 67278, + 67254, + 67260, + 67312, + 67274, + 67327, + 67344, + 67305, + 67245, + 67301, + 67264, + 67267, + 67320, + 67266, + 67260, + 67279, + 67259, + 67278, + 67281, + 67260, + 67266, + 67270, + 67252, + 67260, + 67269, + 67347, + 67305, + 67291, + 67277, + 67291, + 67287, + 67307, + 67286, + 67287, + 67295, + 67267, + 67295, + 67285, + 67266, + 67257, + 67333, + 67287, + 67324, + 67283, + 67266, + 67295, + 67329, + 67279, + 67271, + 67282, + 67277, + 67327, + 67302, + 67286, + 67309, + 67311, + 67269, + 67301, + 67306, + 67278, + 67293, + 67286, + 67300, + 67252, + 67286, + 67259, + 67275, + 67280, + 67289, + 67314, + 67312, + 67280, + 67270, + 67294, + 67303, + 67272, + 67277, + 67282, + 67287, + 67307, + 67282, + 67261, + 67279, + 67253, + 67283, + 67255, + 67260, + 67278, + 67286, + 67259, + 67287, + 67297, + 67306, + 67271, + 67258, + 67295, + 67350, + 67279, + 67272, + 67326, + 67310, + 67269, + 67314, + 67255, + 67268, + 67282, + 67297, + 67278, + 67288, + 67298, + 67322, + 67298, + 67299, + 67295, + 67268, + 67269, + 67264, + 67440, + 67308, + 67317, + 67289, + 67297, + 67327, + 67311, + 67285, + 67285, + 67286, + 67341, + 67297, + 67300, + 67280, + 67269, + 67274, + 67304, + 67276, + 67292, + 67279, + 67281, + 67291, + 67272, + 67281, + 67283, + 67266, + 67293, + 67337, + 67315, + 67279, + 67265, + 67296, + 67286, + 67294, + 67287, + 67313, + 67267, + 67305, + 67295, + 67318, + 67288, + 67275, + 67298, + 67329, + 67285, + 67287, + 67300, + 67270, + 67316, + 67271, + 67279, + 67322, + 67255, + 67272, + 67313, + 67328, + 67283, + 67300, + 67290, + 67299, + 67267, + 67290, + 67323, + 67281, + 67285, + 67285, + 67274, + 67306, + 67270, + 67309, + 67331, + 67272, + 67309, + 67312, + 67317, + 67318, + 67279, + 67299, + 67275, + 67290, + 67273, + 67311, + 67344, + 67267, + 67237, + 67338, + 67306, + 67313, + 67265, + 67287, + 67286, + 67276, + 67248, + 67294, + 67311, + 67262, + 67276, + 67325, + 67297, + 67306, + 67255, + 67279, + 67260, + 67313, + 67294, + 67307, + 67261, + 67303, + 67284, + 67299, + 67304, + 67316, + 67270, + 67269, + 67285, + 67252, + 67299, + 67308, + 67337, + 67251, + 67315, + 67269, + 67304, + 67263, + 67290, + 67295, + 67332, + 67298, + 67266, + 67270, + 67286, + 67290, + 67268, + 67269, + 67273, + 67282, + 67288, + 67274, + 67294, + 67254, + 67285, + 67310, + 67313, + 67297, + 67282, + 67315, + 67265, + 67261, + 67286, + 67277, + 67282, + 67291, + 67301, + 67294, + 67323, + 67273, + 67291, + 67297, + 67291, + 67271, + 67389, + 67283, + 67311, + 67327, + 67293, + 67290, + 67290, + 67293, + 67254, + 67277, + 67319, + 67275, + 67311, + 67322, + 67340, + 67280, + 67272, + 67281, + 67313, + 67280, + 67288, + 67294, + 67263, + 67303, + 67312, + 67295, + 67273, + 67348, + 67298, + 67324, + 67296, + 67280, + 67298, + 67312, + 67330, + 67302, + 67283, + 67270, + 67367, + 67330, + 67339, + 67302, + 67323, + 67276, + 67306, + 67345, + 67276, + 67586, + 67339, + 67275, + 67297, + 67296, + 67281, + 67304, + 67278, + 67285, + 67300, + 67322, + 67284, + 67301, + 67295, + 67298, + 67324, + 67300, + 67267, + 67274, + 67297, + 67340, + 67265, + 67327, + 67258, + 67334, + 67340, + 67271, + 67301, + 67299, + 67292, + 67308, + 67318, + 67323, + 67305, + 67293, + 67299, + 67277, + 67295, + 67282, + 67353, + 67280, + 67337, + 67285, + 67296, + 67316, + 67313, + 67279, + 67298, + 67303, + 67284, + 67274, + 67273, + 67266, + 67313, + 67282, + 67289, + 67287, + 67287, + 67322, + 67266, + 67290, + 67304, + 67298, + 67294, + 67295, + 67309, + 67291, + 67308, + 67287, + 67265, + 67279, + 67264, + 67263, + 67280, + 67266, + 67281, + 67304, + 67274, + 67318, + 67328, + 67277, + 67274, + 67255, + 67277, + 67298, + 67317, + 67317, + 67261, + 67279, + 67291, + 67290, + 67335, + 67258, + 67294, + 67318, + 67273, + 67263, + 67285, + 67320, + 67253, + 67271, + 67261, + 67308, + 67263, + 67262, + 67261, + 67324, + 67287, + 67264, + 67270, + 67306, + 67289, + 67284, + 67317, + 67305, + 67297, + 67258, + 67285, + 67275, + 67280, + 67317, + 67295, + 67253, + 67281, + 67273, + 67261, + 67283, + 67268, + 67246, + 67296, + 67289, + 67280, + 67280, + 67319, + 67269, + 67271, + 67283, + 67270, + 67303, + 67302, + 67331, + 67284, + 67313, + 67290, + 67322, + 67313, + 67330, + 67280, + 67314, + 67269, + 67289, + 67319, + 67251, + 67299, + 67298, + 67261, + 67272, + 67279, + 67302, + 67317, + 67287, + 67314, + 67261, + 67284, + 67297, + 67268, + 67286, + 67284, + 67286, + 67359, + 67280, + 67300, + 67337, + 67291, + 67339, + 67267, + 67291, + 67265, + 67279, + 67271, + 67336, + 67333, + 67277, + 67283, + 67271, + 67299, + 67280, + 67314, + 67303, + 67325, + 67302, + 67275, + 67311, + 67289, + 67289, + 67278, + 67272, + 67255, + 67291, + 67370, + 67293, + 67294, + 67284, + 67298, + 67346, + 67310, + 67305, + 67270, + 67279, + 67295, + 67301, + 67288, + 67305, + 67258, + 67310, + 67237, + 67296, + 67279, + 67276, + 67295, + 67315, + 67294, + 67302, + 67278, + 67283, + 67264, + 67289, + 67277, + 67318, + 67282, + 67287, + 67318, + 67284, + 67259, + 67299, + 67288, + 67266, + 67292, + 67305, + 67294, + 67302, + 67254, + 67291, + 67292, + 67286, + 67267, + 67286, + 67309, + 67275, + 67277, + 67316, + 67305, + 67265, + 67311, + 67282, + 67253, + 67294, + 67313, + 67277, + 67292, + 67263, + 67312, + 67286, + 67263, + 67268, + 67312, + 67280, + 67308, + 67339, + 67465, + 67307, + 67296, + 67287, + 67292, + 67295, + 67291, + 67279, + 67319, + 67298, + 67289, + 67283, + 67301, + 67294, + 67303, + 67281, + 67315, + 67276, + 67291, + 67258, + 67280, + 67272, + 67297, + 67307, + 67284, + 67323, + 67265, + 67302, + 67281, + 67285, + 67281, + 67278, + 67290, + 67311, + 67303, + 67308, + 67250, + 67306, + 67292, + 67237, + 67260, + 67345, + 67297, + 67319, + 67388, + 67283, + 67266, + 67308, + 67273, + 67283, + 67296, + 67295, + 67267, + 67264, + 67264, + 67336, + 67296, + 67266, + 67280, + 67296, + 67298, + 67275, + 67312, + 67291, + 67295, + 67271, + 67277, + 67302, + 67268, + 67296, + 67295, + 67274, + 67273, + 67315, + 67276, + 67338, + 67341, + 67273, + 67296, + 67287, + 67296, + 67288, + 67274, + 67292, + 67294, + 67263, + 67295, + 67326, + 67268, + 67309, + 67265, + 67284, + 67261, + 67303, + 67279, + 67298, + 67295, + 67311, + 67294, + 67270, + 67263, + 67272, + 67285, + 67315, + 67258, + 67273, + 67317, + 67309, + 67282, + 67264, + 67321, + 67293, + 67300, + 67306, + 67290, + 67315, + 67288, + 67301, + 67290, + 67281, + 67287, + 67276, + 67310, + 67289, + 67276, + 67292, + 67277, + 67296, + 67300, + 67275, + 67282, + 67333, + 67308, + 67282, + 67302, + 67321, + 67271, + 67305, + 67303, + 67321, + 67287, + 67290, + 67262, + 67287, + 67290, + 67279, + 67242, + 67260, + 67294, + 67336, + 67277, + 67320, + 67262, + 67308, + 67317, + 67280, + 67296, + 67243, + 67312, + 67302, + 67269, + 67277, + 67281, + 67281, + 67296, + 67271, + 67275, + 67346, + 67262, + 67293, + 67316, + 67307, + 67259, + 67270, + 67288, + 67360, + 67295, + 67286, + 67272, + 67288, + 67291, + 67288, + 67287, + 67299, + 67295, + 67314, + 67262, + 67279, + 67335, + 67301, + 67246, + 67270, + 67264, + 67273, + 67294, + 67270, + 67243, + 67306, + 67313, + 67290, + 67313, + 67271, + 67341, + 67290, + 67314, + 67314, + 67281, + 67292, + 67261, + 67360, + 67293, + 67318, + 67311, + 67285, + 67278, + 67325, + 67297, + 67269, + 67288, + 67312, + 67287, + 67293, + 67283, + 67268, + 67330, + 67298, + 67295, + 67265, + 67278, + 67286, + 67275, + 67275, + 67302, + 67286, + 67269, + 67253, + 67300, + 67295, + 67295, + 67284, + 67284, + 67274, + 67276, + 67303, + 67292, + 67333, + 67292, + 67329, + 67260, + 67332, + 67298, + 67273, + 67346, + 67356, + 67293, + 67287, + 67266, + 67310, + 67287, + 67254, + 67287, + 67269, + 67323, + 67270, + 67280, + 67302, + 67263, + 67281, + 67325, + 67280, + 67285, + 67289, + 67265, + 67280, + 67291, + 67296, + 67331, + 67282, + 67338, + 67295, + 67276, + 67287, + 67265, + 67259, + 67329, + 67294, + 67679, + 67341, + 67279, + 67285, + 67326, + 67336, + 67303, + 67309, + 67317, + 67295, + 67314, + 67292, + 67340, + 67308, + 67270, + 67280, + 67315, + 67312, + 67266, + 67289, + 67306, + 67278, + 67322, + 67285, + 67286, + 67272, + 67305, + 67295, + 67261, + 67297, + 67298, + 67316, + 67309, + 67279, + 67278, + 67275, + 67273, + 67303, + 67308, + 67324, + 67309, + 67319, + 67269, + 67300, + 67287, + 67280, + 67291, + 67266, + 67271, + 67279, + 67285, + 67286, + 67275, + 67270, + 67278, + 67275, + 67297, + 67283, + 67272, + 67278, + 67302, + 67253, + 67276, + 67278, + 67273, + 67284, + 67278, + 67271, + 67326, + 67293, + 67300, + 67330, + 67311, + 67299, + 67294, + 67307, + 67334, + 67289, + 67306, + 67315, + 67281, + 67285, + 67289, + 67251, + 67265, + 67285, + 67304, + 67304, + 67284, + 67293, + 67287, + 67293, + 67272, + 67293, + 67282, + 67305, + 67295, + 67335, + 67282, + 67280, + 67263, + 67280, + 67287, + 67312, + 67282, + 67289, + 67320, + 67320, + 67295, + 67308, + 67291, + 67291, + 67314, + 67281, + 67305, + 67313, + 67289, + 67271, + 67367, + 67275, + 67294, + 67281, + 67318, + 67298, + 67289, + 67289, + 67291, + 67311, + 67298, + 67287, + 67281, + 67321, + 67291, + 67267, + 67285, + 67284, + 67313, + 67312, + 67288, + 67310, + 67284, + 67304, + 67302, + 67326, + 67273, + 67283, + 67276, + 67321, + 67294, + 67320, + 67313, + 67273, + 67284, + 67307, + 67296, + 67319, + 67283, + 67300, + 67300, + 67288, + 67309, + 67283, + 67324, + 67265, + 67281, + 67336, + 67305, + 67279, + 67305, + 67300, + 67263, + 67286, + 67293, + 67308, + 67292, + 67278, + 67275, + 67265, + 67293, + 67312, + 67598, + 67261, + 67312, + 67293, + 67295, + 67253, + 67257, + 67306, + 67284, + 67302, + 67289, + 67286, + 67306, + 67319, + 67300, + 67287, + 67335, + 67314, + 67256, + 67293, + 67285, + 67281, + 67395, + 67267, + 67264, + 67276, + 67281, + 67266, + 67325, + 67266, + 67278, + 67305, + 67273, + 67335, + 67273, + 67278, + 67309, + 67293, + 67293, + 67275, + 67277, + 67264, + 67322, + 67309, + 67590, + 67270, + 67325, + 67300, + 67311, + 67280, + 67264, + 67314, + 67255, + 67284, + 67270, + 67275, + 67296, + 67290, + 67292, + 67288, + 67285, + 67324, + 67296, + 67297, + 67287, + 67297, + 67287, + 67293, + 67278, + 67265, + 67272, + 67311, + 67279, + 67317, + 67277, + 67338, + 67321, + 67257, + 67305, + 67267, + 67252, + 67270, + 67260, + 67288, + 67303, + 67310, + 67278, + 67310, + 67302, + 67279, + 67264, + 67341, + 67304, + 67276, + 67251, + 67281, + 67339, + 67322, + 67264, + 67263, + 67267, + 67291, + 67315, + 67312, + 67316, + 67285, + 67257, + 67308, + 67284, + 67311, + 67284, + 67275, + 67313, + 67277, + 67280, + 67273, + 67282, + 67308, + 67270, + 67264, + 67328, + 67277, + 67268, + 67274, + 67266, + 67280, + 67311, + 67256, + 67304, + 67303, + 67321, + 67284, + 67293, + 67261, + 67270, + 67339, + 67300, + 67276, + 67304, + 67287, + 67299, + 67313, + 67288, + 67268, + 67259, + 67246, + 67256, + 67291, + 67305, + 67272, + 67287, + 67333, + 67291, + 67283, + 67275, + 67276, + 67303, + 67291, + 67254, + 67335, + 67319, + 67320, + 67346, + 67268, + 67267, + 67261, + 67312, + 67279, + 67338, + 67281, + 67270, + 67329, + 67255, + 67293, + 67291, + 67283, + 67282, + 67265, + 67260, + 67265, + 67275, + 67310, + 67266, + 67286, + 67260, + 67291, + 67300, + 67275, + 67254, + 67294, + 67303, + 67266, + 67268, + 67278, + 67293, + 67268, + 67319, + 67325, + 67289, + 67277, + 67310, + 67263, + 67276, + 67302, + 67268, + 67302, + 67295, + 67295, + 67284, + 67270, + 67291, + 67309, + 67272, + 67293, + 67269, + 67295, + 67325, + 67302, + 67248, + 67305, + 67297, + 67289, + 67304, + 67300, + 67318, + 67256, + 67303, + 67280, + 67310, + 67295, + 67357, + 67266, + 67311, + 67302, + 67302, + 67307, + 67255, + 67260, + 67302, + 67283, + 67347, + 67268, + 67283, + 67310, + 67299, + 67293, + 67258, + 67268, + 67252, + 67276, + 67292, + 67309, + 67268, + 67319, + 67278, + 67273, + 67313, + 67309, + 67269, + 67299, + 67276, + 67301, + 67272, + 67327, + 67312, + 67308, + 67269, + 67351, + 67284, + 67311, + 67293, + 67276, + 67300, + 67283, + 67297, + 67255, + 67252, + 67306, + 67289, + 67298, + 67305, + 67276, + 67248, + 67336, + 67261, + 67299, + 67259, + 67298, + 67290, + 67286, + 67300, + 67297, + 67322, + 67317, + 67294, + 67292, + 67283, + 67304, + 67281, + 67341, + 67281, + 67283, + 67274, + 67314, + 67295, + 67305, + 67276, + 67289, + 67294, + 67267, + 67284, + 67292, + 67290, + 67304, + 67306, + 67324, + 67309, + 67304, + 67314, + 67338, + 67276, + 67285, + 67361, + 67280, + 67299, + 67267, + 67273, + 67322, + 67285, + 67272, + 67322, + 67305, + 67280, + 67304, + 67306, + 67300, + 67261, + 67298, + 67297, + 67267, + 67300, + 67316, + 67282, + 67294, + 67301, + 67270, + 67325, + 67308, + 67306, + 67279, + 67271, + 67266, + 67290, + 67289, + 67278, + 67311, + 67296, + 67276, + 67267, + 67289, + 67272, + 67292, + 67302, + 67287, + 67327, + 67295, + 67268, + 67302, + 67307, + 67327, + 67288, + 67302, + 67261, + 67285, + 67297, + 67314, + 67291, + 67265, + 67287, + 67296, + 67313, + 67365, + 67285, + 67315, + 67331, + 67263, + 67284, + 67295, + 67296, + 67318, + 67269, + 67285, + 67263, + 67293, + 67288, + 67312, + 67275, + 67280, + 67278, + 67287, + 67288, + 67318, + 67270, + 67321, + 67282, + 67287, + 67322, + 67317, + 67285, + 67275, + 67302, + 67273, + 67300, + 67298, + 67295, + 67262, + 67271, + 67281, + 67281, + 67337, + 67315, + 67307, + 67279, + 67298, + 67290, + 67262, + 67306, + 67282, + 67273, + 67292, + 67314, + 67298, + 67348, + 67284, + 67296, + 67301, + 67331, + 67306, + 67305, + 67306, + 67274, + 67289, + 67259, + 67287, + 67316, + 67290, + 67295, + 67318, + 67289, + 67284, + 67298, + 67318, + 67300, + 67277, + 67319, + 67347, + 67316, + 67305, + 67280, + 67287, + 67317, + 67260, + 67266, + 67295, + 67314, + 67295, + 67299, + 67303, + 67291, + 67280, + 67322, + 67301, + 67277, + 67308, + 67321, + 67310, + 67279, + 67298, + 67275, + 67267, + 67314, + 67289, + 67260, + 67304, + 67301, + 67287, + 67274, + 67281, + 67273, + 67321, + 67316, + 67264, + 67316, + 67318, + 67307, + 67281, + 67275, + 67292, + 67299, + 67290, + 67281, + 67293, + 67288, + 67333, + 67305, + 67286, + 67297, + 67316, + 67297, + 67308, + 67267, + 67321, + 67269, + 67285, + 67271, + 67295, + 67269, + 67285, + 67268, + 67285, + 67264, + 67262, + 67274, + 67287, + 67273, + 67299, + 67294, + 67293, + 67298, + 67322, + 67280, + 67294, + 67287, + 67314, + 67291, + 67334, + 67323, + 67273, + 67308, + 67312, + 67297, + 67298, + 67290, + 67296, + 67293, + 67274, + 67281, + 67288, + 67256, + 67332, + 67282, + 67305, + 67280, + 67273, + 67291, + 67309, + 67304, + 67292, + 67294, + 67269, + 67275, + 67271, + 67323, + 67303, + 67291, + 67300, + 67251, + 67317, + 67281, + 67279, + 67272, + 67275, + 67304, + 67307, + 67271, + 67261, + 67303, + 67365, + 67327, + 67298, + 67287, + 67254, + 67270, + 67252, + 67302, + 67302, + 67295, + 67269, + 67286, + 67388, + 67284, + 67332, + 67265, + 67282, + 67310, + 67299, + 67296, + 67257, + 67321, + 67273, + 67270, + 67318, + 67286, + 67330, + 67294, + 67289, + 67303, + 67316, + 67256, + 67273, + 67352, + 67263, + 67279, + 67276, + 67298, + 67298, + 67326, + 67308, + 67297, + 67282, + 67242, + 67293, + 67355, + 67307, + 67276, + 67273, + 67268, + 67277, + 67328, + 67284, + 67303, + 67294, + 67277, + 67257, + 67302, + 67299, + 67272, + 67304, + 67304, + 67300, + 67261, + 67314, + 67277, + 67297, + 67275, + 67293, + 67256, + 67254, + 67320, + 67296, + 67281, + 67330, + 67268, + 67296, + 67311, + 67305, + 67301, + 67313, + 67341, + 67319, + 67261, + 67259, + 67284, + 67302, + 67295, + 67278, + 67261, + 67287, + 67302, + 67260, + 67303, + 67269, + 67313, + 67297, + 67330, + 67296, + 67261, + 67271, + 67280, + 67257, + 67279, + 67252, + 67301, + 67280, + 67278, + 67284, + 67283, + 67315, + 67336, + 67312, + 67310, + 67303, + 67279, + 67274, + 67358, + 67312, + 67275, + 67336, + 67279, + 67340, + 67279, + 67287, + 67273, + 67309, + 67288, + 67295, + 67276, + 67283, + 67277, + 67264, + 67265, + 67305, + 67302, + 67288, + 67266, + 67264, + 67303, + 67295, + 67310, + 67259, + 67299, + 67261, + 67290, + 67287, + 67346, + 67292, + 67306, + 67250, + 67309, + 67286, + 67290, + 67347, + 67298, + 67300, + 67290, + 67313, + 67343, + 67252, + 67281, + 67289, + 67292, + 67294, + 67276, + 67259, + 67299, + 67330, + 67271, + 67321, + 67307, + 67298, + 67295, + 67289, + 67281, + 67310, + 67280, + 67281, + 67319, + 67300, + 67281, + 67290, + 67291, + 67259, + 67288, + 67324, + 67289, + 67327, + 67294, + 67283, + 67299, + 67313, + 67299, + 67305, + 67310, + 67271, + 67310, + 67270, + 67277, + 67290, + 67328, + 67286, + 67280, + 67299, + 67307, + 67277, + 67299, + 67273, + 67308, + 67285, + 67270, + 67270, + 67346, + 67319, + 67303, + 67294, + 67289, + 67297, + 67278, + 67273, + 67286, + 67299, + 67276, + 67302, + 67230, + 67331, + 67284, + 67320, + 67286, + 67292, + 67302, + 67292, + 67239, + 67296, + 67270, + 67296, + 67317, + 67313, + 67256, + 67287, + 67270, + 67292, + 67301, + 67295, + 67281, + 67288, + 67280, + 67296, + 67257, + 67308, + 67286, + 67285, + 67259, + 67259, + 67315, + 67336, + 67267, + 67279, + 67265, + 67279, + 67263, + 67273, + 67304, + 67280, + 67291, + 67328, + 67342, + 67308, + 67310, + 67295, + 67291, + 67314, + 67285, + 67304, + 67308, + 67292, + 67280, + 67299, + 67314, + 67308, + 67278, + 67301, + 67263, + 67313, + 67302, + 67293, + 67327, + 67254, + 67296, + 67290, + 67299, + 67321, + 67287, + 67300, + 67289, + 67282, + 67270, + 67260, + 67291, + 67303, + 67320, + 67281, + 67300, + 67270, + 67271, + 67298, + 67269, + 67291, + 67284, + 67314, + 67285, + 67292, + 67266, + 67300, + 67280, + 67288, + 67282, + 67262, + 67296, + 67307, + 67284, + 67305, + 67309, + 67319, + 67303, + 67293, + 67278, + 67288, + 67272, + 67260, + 67326, + 67295, + 67287, + 67271, + 67301, + 67294, + 67278, + 67313, + 67307, + 67265, + 67318, + 67292, + 67310, + 67272, + 67278, + 67279, + 67280, + 67268, + 67307, + 67294, + 67302, + 67329, + 67286, + 67332, + 67280, + 67258, + 67297, + 67328, + 67283, + 67279, + 67261, + 67317, + 67316, + 67302, + 67289, + 67301, + 67298, + 67244, + 67283, + 67281, + 67303, + 67249, + 67263, + 67310, + 67317, + 67260, + 67258, + 67317, + 67284, + 67304, + 67294, + 67296, + 67282, + 67319, + 67284, + 67357, + 67312, + 67356, + 67299, + 67295, + 67273, + 67261, + 67269, + 67302, + 67292, + 67302, + 67252, + 67300, + 67299, + 67293, + 67279, + 67284, + 67311, + 67318, + 67273, + 67275, + 67325, + 67296, + 67295, + 67327, + 67284, + 67290, + 67292, + 67270, + 67297, + 67334, + 67311, + 67294, + 67276, + 67299, + 67274, + 67256, + 67307, + 67311, + 67271, + 67259, + 67316, + 67304, + 67301, + 67299, + 67307, + 67277, + 67257, + 67273, + 67326, + 67283, + 67296, + 67312, + 67256, + 67286, + 67272, + 67310, + 67277, + 67335, + 67248, + 67304, + 67284, + 67276, + 67309, + 67308, + 67299, + 67269, + 67301, + 67332, + 67346, + 67290, + 67328, + 67315, + 67263, + 67278, + 67288, + 67275, + 67320, + 67310, + 67306, + 67289, + 67283, + 67321, + 67267, + 67264, + 67281, + 67294, + 67301, + 67282, + 67293, + 67264, + 67302, + 67282, + 67315, + 67272, + 67276, + 67287, + 67285, + 67325, + 67302, + 67299, + 67297, + 67290, + 67276, + 67287, + 67286, + 67279, + 67311, + 67307, + 67321, + 67286, + 67338, + 67275, + 67312, + 67309, + 67358, + 67290, + 67280, + 67324, + 67304, + 67289, + 67282, + 67336, + 67276, + 67250, + 67287, + 67317, + 67334, + 67303, + 67317, + 67281, + 67330, + 67270, + 67351, + 67300, + 67297, + 67287, + 67280, + 67281, + 67305, + 67338, + 67302, + 67303, + 67272, + 67274, + 67311, + 67288, + 67290, + 67313, + 67281, + 67281, + 67266, + 67282, + 67264, + 67268, + 67291, + 67315, + 67297, + 67280, + 67269, + 67304, + 67256, + 67262, + 67294, + 67309, + 67344, + 67283, + 67323, + 67291, + 67342, + 67278, + 67289, + 67256, + 67264, + 67314, + 67291, + 67314, + 67264, + 67321, + 67318, + 67267, + 67311, + 67301, + 67291, + 67296, + 67279, + 67268, + 67303, + 67284, + 67329, + 67266, + 67262, + 67314, + 67272, + 67285, + 67322, + 67276, + 67270, + 67277, + 67300, + 67300, + 67288, + 67296, + 67255, + 67365, + 67325, + 67257, + 67300, + 67279, + 67292, + 67299, + 67287, + 67310, + 67300, + 67268, + 67271, + 67309, + 67272, + 67295, + 67290, + 67293, + 67297, + 67312, + 67289, + 67265, + 67333, + 67292, + 67263, + 67268, + 67349, + 67292, + 67280, + 67274, + 67290, + 67325, + 67301, + 67300, + 67318, + 67279, + 67265, + 67285, + 67335, + 67260, + 67305, + 67255, + 67284, + 67263, + 67311, + 67282, + 67275, + 67272, + 67304, + 67271, + 67317, + 67301, + 67281, + 67317, + 67272, + 67270, + 67281, + 67280, + 67296, + 67296, + 67281, + 67268, + 67340, + 67296, + 67279, + 67273, + 67297, + 67291, + 67290, + 67298, + 67296, + 67288, + 67279, + 67300, + 67332, + 67269, + 67277, + 67281, + 67309, + 67293, + 67262, + 67286, + 67268, + 67314, + 67307, + 67296, + 67297, + 67338, + 67276, + 67266, + 67281, + 67352, + 67287, + 67301, + 67296, + 67279, + 67322, + 67249, + 67304, + 67335, + 67314, + 67301, + 67296, + 67303, + 67315, + 67328, + 67319, + 67303, + 67300, + 67300, + 67303, + 67310, + 67306, + 67290, + 67301, + 67345, + 67310, + 67320, + 67291, + 67265, + 67277, + 67264, + 67283, + 67397, + 67278, + 67259, + 67277, + 67315, + 67281, + 67288, + 67319, + 67276, + 67306, + 67288, + 67303, + 67272, + 67267, + 67254, + 67311, + 67259, + 67282, + 67299, + 67301, + 67273, + 67309, + 67306, + 67313, + 67323, + 67292, + 67301, + 67316, + 67323, + 67316, + 67277, + 67288, + 67291, + 67289, + 67272, + 67351, + 67295, + 67296, + 67292, + 67297, + 67275, + 67287, + 67329, + 67265, + 67338, + 67280, + 67278, + 67330, + 67252, + 67297, + 67307, + 67281, + 67289, + 67261, + 67285, + 67282, + 67324, + 67282, + 67307, + 67306, + 67305, + 67279, + 67282, + 67267, + 67266, + 67310, + 67297, + 67338, + 67310, + 67298, + 67276, + 67270, + 67309, + 67325, + 67301, + 67277, + 67306, + 67288, + 67284, + 67288, + 67316, + 67272, + 67284, + 67282, + 67286, + 67301, + 67271, + 67301, + 67298, + 67280, + 67287, + 67292, + 67344, + 67277, + 67254, + 67280, + 67287, + 67289, + 67264, + 67290, + 67311, + 67321, + 67278, + 67275, + 67306, + 67271, + 67274, + 67262, + 67282, + 67301, + 67272, + 67281, + 67300, + 67248, + 67301, + 67306, + 67285, + 67275, + 67295, + 67259, + 67284, + 67259, + 67297, + 67300, + 67298, + 67339, + 67283, + 67290, + 67313, + 67307, + 67296, + 67313, + 67333, + 67249, + 67297, + 67289, + 67303, + 67296, + 67286, + 67270, + 67304, + 67265, + 67316, + 67292, + 67291, + 67269, + 67317, + 67294, + 67330, + 67281, + 67271, + 67277, + 67331, + 67284, + 67275, + 67288, + 67282, + 67285, + 67271, + 67285, + 67324, + 67285, + 67300, + 67336, + 67276, + 67272, + 67292, + 67269, + 67275, + 67266, + 67311, + 67287, + 67316, + 67264, + 67250, + 67294, + 67292, + 67280, + 67282, + 67275, + 67262, + 67297, + 67258, + 67257, + 67279, + 67291, + 67262, + 67276, + 67281, + 67272, + 67349, + 67280, + 67294, + 67310, + 67311, + 67297, + 67291, + 67300, + 67276, + 67295, + 67321, + 67281, + 67310, + 67325, + 67326, + 67295, + 67257, + 67299, + 67285, + 67319, + 67300, + 67268, + 67270, + 67272, + 67292, + 67277, + 67315, + 67268, + 67341, + 67288, + 67281, + 67272, + 67303, + 67256, + 67300, + 67293, + 67316, + 67307, + 67302, + 67280, + 67330, + 67287, + 67265, + 67281, + 67290, + 67314, + 67334, + 67313, + 67303, + 67300, + 67288, + 67316, + 67307, + 67286, + 67342, + 67272, + 67293, + 67303, + 67287, + 67291, + 67265, + 67309, + 67284, + 67268, + 67343, + 67304, + 67261, + 67298, + 67277, + 67268, + 67322, + 67285, + 67299, + 67345, + 67301, + 67260, + 67351, + 67288, + 67275, + 67288, + 67287, + 67322, + 67321, + 67328, + 67266, + 67310, + 67291, + 67299, + 67300, + 67267, + 67272, + 67317, + 67306, + 67259, + 67281, + 67315, + 67343, + 67280, + 67293, + 67302, + 67319, + 67308, + 67287, + 67592, + 67321, + 67290, + 67290, + 67278, + 67281, + 67283, + 67286, + 67302, + 67303, + 67287, + 67308, + 67322, + 67307, + 67312, + 67291, + 67275, + 67299, + 67310, + 67271, + 67304, + 67340, + 67297, + 67297, + 67272, + 67297, + 67273, + 67327, + 67293, + 67310, + 67337, + 67320, + 67276, + 67310, + 67298, + 67243, + 67323, + 67306, + 67313, + 67332, + 67310, + 67353, + 67313, + 67290, + 67319, + 67325, + 67310, + 67301, + 67323, + 67331, + 67280, + 67282, + 67268, + 67344, + 67274, + 67281, + 67292, + 67277, + 67266, + 67277, + 67307, + 67334, + 67306, + 67292, + 67287, + 67291, + 67313, + 67304, + 67316, + 67254, + 67305, + 67258, + 67327, + 67316, + 67287, + 67268, + 67334, + 67263, + 67317, + 67252, + 67343, + 67301, + 67265, + 67281, + 67265, + 67265, + 67270, + 67276, + 67289, + 67296, + 67281, + 67276, + 67272, + 67289, + 67308, + 67270, + 67292, + 67284, + 67318, + 67279, + 67271, + 67268, + 67281, + 67280, + 67272, + 67264, + 67294, + 67302, + 67316, + 67287, + 67298, + 67290, + 67292, + 67281, + 67312, + 67300, + 67261, + 67295, + 67251, + 67283, + 67295, + 67296, + 67276, + 67278, + 67256, + 67288, + 67300, + 67287, + 67246, + 67288, + 67287, + 67273, + 67284, + 67269, + 67277, + 67261, + 67301, + 67304, + 67302, + 67248, + 67312, + 67284, + 67301, + 67282, + 67302, + 67280, + 67313, + 67332, + 67289, + 67251, + 67255, + 67293, + 67278, + 67317, + 67279, + 67311, + 67278, + 67299, + 67312, + 67308, + 67267, + 67300, + 67295, + 67312, + 67276, + 67305, + 67290, + 67272, + 67307, + 67317, + 67290, + 67339, + 67304, + 67293, + 67279, + 67275, + 67287, + 67303, + 67311, + 67300, + 67253, + 67308, + 67263, + 67281, + 67296, + 67282, + 67350, + 67304, + 67326, + 67279, + 67275, + 67305, + 67276, + 67324, + 67287, + 67298, + 67278, + 67319, + 67294, + 67291, + 67291, + 67266, + 67330, + 67284, + 67278, + 67288, + 67279, + 67283, + 67322, + 67265, + 67286, + 67288, + 67317, + 67291, + 67324, + 67297, + 67254, + 67331, + 67292, + 67274, + 67257, + 67315, + 67262, + 67454, + 67267, + 67292, + 67339, + 67281, + 67287, + 67292, + 67301, + 67281, + 67284, + 67290, + 67285, + 67286, + 67311, + 67318, + 67265, + 67342, + 67277, + 67315, + 67291, + 67281, + 67283, + 67442, + 67268, + 67300, + 67279, + 67316, + 67295, + 67304, + 67285, + 67310, + 67280, + 67275, + 67291, + 67296, + 67262, + 67346, + 67281, + 67311, + 67296, + 67311, + 67268, + 67271, + 67292, + 67316, + 67262, + 67283, + 67336, + 67288, + 67283, + 67310, + 67284, + 67299, + 67335, + 67272, + 67292, + 67304, + 67286, + 67324, + 67328, + 67334, + 67273, + 67289, + 67279, + 67267, + 67326, + 67257, + 67282, + 67280, + 67287, + 67281, + 67291, + 67314, + 67324, + 67326, + 67281, + 67260, + 67323, + 67314, + 67282, + 67270, + 67281, + 67292, + 67288, + 67279, + 67284, + 67306, + 67341, + 67302, + 67294, + 67286, + 67360, + 67301, + 67290, + 67271, + 67285, + 67296, + 67297, + 67281, + 67295, + 67273, + 67272, + 67279, + 67278, + 67323, + 67312, + 67264, + 67292, + 67279, + 67287, + 67291, + 67291, + 67257, + 67263, + 67267, + 67256, + 67308, + 67266, + 67282, + 67303, + 67290, + 67275, + 67329, + 67315, + 67308, + 67338, + 67297, + 67296, + 67280, + 67287, + 67324, + 67277, + 67289, + 67294, + 67278, + 67306, + 67306, + 67285, + 67245, + 67264, + 67289, + 67305, + 67302, + 67267, + 67286, + 67280, + 67269, + 67304, + 67267, + 67249, + 67329, + 67276, + 67295, + 67303, + 67327, + 67300, + 67373, + 67251, + 67288, + 67313, + 67286, + 67265, + 67315, + 67309, + 67280, + 67284, + 67298, + 67279, + 67316, + 67284, + 67269, + 67254, + 67278, + 67311, + 67297, + 67314, + 67305, + 67274, + 67299, + 67324, + 67294, + 67309, + 67270, + 67302, + 67288, + 67319, + 67272, + 67318, + 67306, + 67284, + 67278, + 67258, + 67329, + 67301, + 67306, + 67302, + 67267, + 67306, + 67266, + 67297, + 67266, + 67302, + 67281, + 67315, + 67271, + 67353, + 67328, + 67305, + 67280, + 67310, + 67289, + 67348, + 67261, + 67295, + 67259, + 67297, + 67259, + 67278, + 67301, + 67301, + 67339, + 67285, + 67283, + 67318, + 67335, + 67282, + 67300, + 67304, + 67291, + 67268, + 67299, + 67275, + 67290, + 67295, + 67285, + 67263, + 67323, + 67289, + 67304, + 67261, + 67281, + 67336, + 67284, + 67267, + 67362, + 67275, + 67289, + 67278, + 67310, + 67275, + 67356, + 67329, + 67289, + 67294, + 67308, + 67290, + 67305, + 67280, + 67272, + 67286, + 67324, + 67254, + 67295, + 67290, + 67286, + 67295, + 67324, + 67294, + 67283, + 67309, + 67273, + 67265, + 67303, + 67315, + 67347, + 67300, + 67284, + 67289, + 67301, + 67274, + 67286, + 67295, + 67300, + 67307, + 67260, + 67273, + 67297, + 67265, + 67285, + 67261, + 67312, + 67259, + 67290, + 67306, + 67291, + 67339, + 67304, + 67295, + 67326, + 67331, + 67308, + 67357, + 67271, + 67262, + 67260, + 67275, + 67277, + 67273, + 67289, + 67258, + 67269, + 67287, + 67298, + 67272, + 67287, + 67302, + 67328, + 67293, + 67249, + 67256, + 67299, + 67256, + 67309, + 67326, + 67252, + 67262, + 67279, + 67311, + 67264, + 67284, + 67283, + 67280, + 67306, + 67300, + 67247, + 67283, + 67298, + 67276, + 67282, + 67286, + 67249, + 67304, + 67292, + 67303, + 67267, + 67264, + 67262, + 67333, + 67314, + 67271, + 67291, + 67290, + 67279, + 67315, + 67286, + 67258, + 67323, + 67271, + 67272, + 67285, + 67273, + 67280, + 67292, + 67285, + 67282, + 67338, + 67275, + 67289, + 67254, + 67301, + 67300, + 67286, + 67247, + 67339, + 67282, + 67280, + 67266, + 67266, + 67291, + 67351, + 67257, + 67258, + 67327, + 67301, + 67313, + 67296, + 67271, + 67293, + 67283, + 67270, + 67273, + 67285, + 67252, + 67290, + 67245, + 67299, + 67325, + 67322, + 67296, + 67261, + 67265, + 67310, + 67269, + 67278, + 67256, + 67273, + 67287, + 67304, + 67286, + 67349, + 67282, + 67269, + 67302, + 67316, + 67290, + 67261, + 67319, + 67301, + 67282, + 67264, + 67301, + 67325, + 67245, + 67269, + 67252, + 67276, + 67292, + 67279, + 67266, + 67253, + 67290, + 67285, + 67274, + 67283, + 67315, + 67286, + 67334, + 67315, + 67308, + 67286, + 67302, + 67304, + 67270, + 67264, + 67265, + 67332, + 67261, + 67293, + 67263, + 67275, + 67288, + 67283, + 67311, + 67288, + 67272, + 67289, + 67266, + 67278, + 67316, + 67307, + 67284, + 67325, + 67276, + 67322, + 67301, + 67289, + 67288, + 67281, + 67264, + 67286, + 67341, + 67293, + 67289, + 67323, + 67299, + 67277, + 67291, + 67296, + 67263, + 67256, + 67249, + 67321, + 67290, + 67276, + 67265, + 67264, + 67265, + 67267, + 67280, + 67315, + 67271, + 67259, + 67271, + 67283, + 67284, + 67265, + 67287, + 67290, + 67278, + 67289, + 67309, + 67278, + 67307, + 67301, + 67276, + 67267, + 67289, + 67305, + 67274, + 67309, + 67303, + 67311, + 67304, + 67295, + 67293, + 67371, + 67297, + 67330, + 67272, + 67276, + 67292, + 67266, + 67316, + 67285, + 67262, + 67256, + 67277, + 67254, + 67266, + 67272, + 67329, + 67293, + 67309, + 67274, + 67306, + 67261, + 67292, + 67296, + 67292, + 67291, + 67280, + 67292, + 67308, + 67295, + 67313, + 67312, + 67334, + 67298, + 67276, + 67287, + 67332, + 67296, + 67298, + 67316, + 67316, + 67279, + 67319, + 67291, + 67288, + 67286, + 67309, + 67297, + 67269, + 67302, + 67301, + 67304, + 67302, + 67332, + 67265, + 67264, + 67289, + 67285, + 67265, + 67282, + 67288, + 67311, + 67282, + 67323, + 67296, + 67298, + 67282, + 67342, + 67328, + 67299, + 67306, + 67300, + 67267, + 67317, + 67319, + 67287, + 67285, + 67280, + 67293, + 67334, + 67286, + 67305, + 67285, + 67333, + 67292, + 67325, + 67280, + 67322, + 67294, + 67295, + 67287, + 67286, + 67347, + 67338, + 67279, + 67318, + 67293, + 67352, + 67276, + 67291, + 67262, + 67287, + 67291, + 67268, + 67275, + 67287, + 67279, + 67294, + 67279, + 67312, + 67293, + 67288, + 67321, + 67315, + 67263, + 67342, + 67267, + 67304, + 67286, + 67273, + 67276, + 67307, + 67313, + 67312, + 67321, + 67271, + 67307, + 67335, + 67304, + 67274, + 67264, + 67268, + 67254, + 67271, + 67258, + 67273, + 67277, + 67279, + 67305, + 67292, + 67266, + 67258, + 67270, + 67277, + 67309, + 67299, + 67266, + 67257, + 67282, + 67275, + 67310, + 67282, + 67312, + 67352, + 67293, + 67292, + 67305, + 67275, + 67271, + 67309, + 67293, + 67254, + 67274, + 67330, + 67263, + 67288, + 67318, + 67296, + 67315, + 67276, + 67286, + 67296, + 67301, + 67293, + 67280, + 67311, + 67290, + 67293, + 67316, + 67301, + 67275, + 67293, + 67304, + 67251, + 67276, + 67310, + 67291, + 67293, + 67301, + 67327, + 67305, + 67279, + 67301, + 67274, + 67317, + 67297, + 67291, + 67273, + 67305, + 67292, + 67294, + 67307, + 67324, + 67263, + 67267, + 67283, + 67266, + 67309, + 67336, + 67292, + 67289, + 67323, + 67332, + 67279, + 67320, + 67287, + 67332, + 67291, + 67322, + 67310, + 67300, + 67300, + 67293, + 67264, + 67306, + 67266, + 67282, + 67261, + 67295, + 67308, + 67292, + 67265, + 67257, + 67283, + 67274, + 67292, + 67296, + 67266, + 67447, + 67278, + 67296, + 67280, + 67329, + 67289, + 67265, + 67307, + 67326, + 67300, + 67307, + 67326, + 67310, + 67301, + 67275, + 67320, + 67313, + 67289, + 67286, + 67309, + 67302, + 67285, + 67282, + 67296, + 67269, + 67310, + 67274, + 67281, + 67260, + 67281, + 67270, + 67274, + 67303, + 67276, + 67293, + 67275, + 67258, + 67282, + 67270, + 67318, + 67284, + 67324, + 67275, + 67289, + 67268, + 67277, + 67275, + 67301, + 67293, + 67278, + 67281, + 67313, + 67277, + 67274, + 67277, + 67291, + 67314, + 67296, + 67276, + 67311, + 67288, + 67267, + 67288, + 67342, + 67337, + 67320, + 67280, + 67301, + 67288, + 67329, + 67296, + 67286, + 67287, + 67270, + 67308, + 67278, + 67298, + 67316, + 67321, + 67293, + 67286, + 67264, + 67315, + 67295, + 67294, + 67274, + 67295, + 67310, + 67307, + 67251, + 67296, + 67271, + 67280, + 67295, + 67254, + 67279, + 67256, + 67288, + 67316, + 67278, + 67302, + 67304, + 67307, + 67367, + 67295, + 67308, + 67283, + 67286, + 67333, + 67288, + 67309, + 67345, + 67301, + 67278, + 67265, + 67277, + 67292, + 67275, + 67288, + 67299, + 67304, + 67281, + 67298, + 67308, + 67276, + 67317, + 67260, + 67314, + 67264, + 67295, + 67273, + 67321, + 67331, + 67281, + 67295, + 67293, + 67304, + 67301, + 67325, + 67309, + 67258, + 67309, + 67300, + 67329, + 67305, + 67299, + 67292, + 67293, + 67293, + 67272, + 67303, + 67295, + 67284, + 67298, + 67314, + 67279, + 67276, + 67289, + 67298, + 67332, + 67272, + 67277, + 67333, + 67269, + 67269, + 67302, + 67279, + 67288, + 67289, + 67290, + 67301, + 67294, + 67258, + 67299, + 67284, + 67303, + 67302, + 67363, + 67279, + 67268, + 67287, + 67291, + 67273, + 67267, + 67289, + 67277, + 67275, + 67301, + 67294, + 67276, + 67254, + 67275, + 67245, + 67294, + 67298, + 67302, + 67260, + 67296, + 67285, + 67300, + 67298, + 67300, + 67309, + 67273, + 67313, + 67288, + 67306, + 67259, + 67325, + 67275, + 67293, + 67289, + 67311, + 67287, + 67276, + 67322, + 67298, + 67267, + 67285, + 67262, + 67265, + 67277, + 67322, + 67284, + 67295, + 67283, + 67297, + 67281, + 67284, + 67308, + 67264, + 67280, + 67325, + 67298, + 67366, + 67273, + 67302, + 67326, + 67318, + 67297, + 67278, + 67301, + 67286, + 67308, + 67285, + 67345, + 67286, + 67281, + 67269, + 67320, + 67324, + 67259, + 67285, + 67316, + 67306, + 67312, + 67333, + 67299, + 67279, + 67318, + 67300, + 67265, + 67278, + 67295, + 67300, + 67279, + 67318, + 67319, + 67352, + 67304, + 67309, + 67280, + 67290, + 67315, + 67281, + 67272, + 67285, + 67263, + 67283, + 67273, + 67295, + 67287, + 67320, + 67303, + 67282, + 67269, + 67308, + 67298, + 67292, + 67296, + 67285, + 67297, + 67304, + 67274, + 67312, + 67308, + 67271, + 67303, + 67326, + 67283, + 67330, + 67292, + 67292, + 67332, + 67282, + 67288, + 67277, + 67301, + 67301, + 67281, + 67291, + 67250, + 67274, + 67289, + 67301, + 67324, + 67270, + 67277, + 67304, + 67251, + 67277, + 67320, + 67277, + 67287, + 67290, + 67283, + 67276, + 67296, + 67281, + 67293, + 67303, + 67295, + 67296, + 67274, + 67303, + 67294, + 67310, + 67257, + 67314, + 67299, + 67269, + 67272, + 67333, + 67274, + 67314, + 67329, + 67278, + 67252, + 67339, + 67311, + 67296, + 67308, + 67276, + 67327, + 67294, + 67275, + 67360, + 67336, + 67277, + 67278, + 67301, + 67269, + 67290, + 67285, + 67339, + 67272, + 67338, + 67288, + 67307, + 67292, + 67274, + 67334, + 67278, + 67289, + 67300, + 67302, + 67279, + 67309, + 67289, + 67290, + 67285, + 67286, + 67277, + 67312, + 67293, + 67264, + 67281, + 67277, + 67289, + 67305, + 67394, + 67296, + 67268, + 67296, + 67310, + 67296, + 67282, + 67275, + 67299, + 67339, + 67273, + 67302, + 67294, + 67271, + 67262, + 67289, + 67325, + 67291, + 67348, + 67280, + 67355, + 67289, + 67306, + 67301, + 67264, + 67296, + 67322, + 67310, + 67270, + 67287, + 67293, + 67304, + 67301, + 67353, + 67277, + 67280, + 67319, + 67311, + 67399, + 67292, + 67295, + 67314, + 67335, + 67283, + 67296, + 67337, + 67280, + 67273, + 67290, + 67298, + 67279, + 67297, + 67278, + 67298, + 67332, + 67330, + 67316, + 67319, + 67289, + 67306, + 67275, + 67293, + 67319, + 67304, + 67324, + 67296, + 67288, + 67292, + 67311, + 67287, + 67313, + 67257, + 67265, + 67268, + 67299, + 67312, + 67276, + 67300, + 67286, + 67276, + 67270, + 67294, + 67279, + 67255, + 67299, + 67288, + 67276, + 67312, + 67315, + 67314, + 67301, + 67282, + 67258, + 67295, + 67291, + 67284, + 67296, + 67281, + 67283, + 67298, + 67315, + 67311, + 67285, + 67291, + 67314, + 67295, + 67268, + 67340, + 67322, + 67270, + 67291, + 67295, + 67286, + 67304, + 67295, + 67325, + 67300, + 67297, + 67261, + 67311, + 67335, + 67307, + 67328, + 67302, + 67304, + 67275, + 67309, + 67297, + 67268, + 67271, + 67266, + 67295, + 67311, + 67267, + 67275, + 67277, + 67264, + 67303, + 67271, + 67304, + 67283, + 67253, + 67273, + 67296, + 67273, + 67256, + 67298, + 67319, + 67294, + 67294, + 67295, + 67261, + 67321, + 67293, + 67306, + 67323, + 67303, + 67273, + 67286, + 67292, + 67301, + 67288, + 67331, + 67291, + 67305, + 67291, + 67298, + 67286, + 67310, + 67266, + 67305, + 67319, + 67324, + 67281, + 67266, + 67285, + 67308, + 67277, + 67298, + 67267, + 67304, + 67296, + 67274, + 67295, + 67327, + 67273, + 67282, + 67279, + 67297, + 67301, + 67296, + 67304, + 67315, + 67281, + 67315, + 67286, + 67296, + 67292, + 67310, + 67279, + 67289, + 67288, + 67274, + 67331, + 67310, + 67310, + 67326, + 67348, + 67326, + 67265, + 67300, + 67307, + 67355, + 67294, + 67235, + 67294, + 67299, + 67310, + 67264, + 67301, + 67298, + 67289, + 67308, + 67291, + 67265, + 67294, + 67265, + 67288, + 67303, + 67329, + 67292, + 67310, + 67287, + 67275, + 67282, + 67276, + 67308, + 67268, + 67288, + 67286, + 67286, + 67301, + 67282, + 67303, + 67297, + 67309, + 67296, + 67343, + 67341, + 67273, + 67309, + 67311, + 67349, + 67330, + 67286, + 67327, + 67296, + 67269, + 67307, + 67290, + 67300, + 67256, + 67301, + 67280, + 67301, + 67291, + 67294, + 67316, + 67256, + 67332, + 67316, + 67287, + 67313, + 67305, + 67299, + 67267, + 67305, + 67315, + 67282, + 67253, + 67289, + 67279, + 67322, + 67296, + 67283, + 67322, + 67261, + 67241, + 67277, + 67291, + 67293, + 67362, + 67292, + 67301, + 67290, + 67327, + 67336, + 67281, + 67320, + 67341, + 67271, + 67292, + 67286, + 67321, + 67294, + 67260, + 67280, + 67272, + 67286, + 67316, + 67282, + 67299, + 67297, + 67282, + 67290, + 67300, + 67267, + 67276, + 67314, + 67297, + 67274, + 67280, + 67303, + 67281, + 67304, + 67294, + 67271, + 67282, + 67298, + 67289, + 67261, + 67265, + 67277, + 67291, + 67295, + 67302, + 67288, + 67285, + 67282, + 67342, + 67284, + 67264, + 67282, + 67306, + 67302, + 67329, + 67271, + 67313, + 67299, + 67279, + 67260, + 67289, + 67284, + 67271, + 67322, + 67280, + 67261, + 67290, + 67306, + 67266, + 67290, + 67316, + 67268, + 67304, + 67349, + 67305, + 67272, + 67288, + 67303, + 67294, + 67298, + 67312, + 67275, + 67244, + 67311, + 67298, + 67255, + 67292, + 67266, + 67275, + 67265, + 67272, + 67276, + 67297, + 67299, + 67304, + 67269, + 67266, + 67291, + 67266, + 67283, + 67266, + 67295, + 67293, + 67300, + 67252, + 67282, + 67278, + 67294, + 67266, + 67294, + 67284, + 67265, + 67301, + 67268, + 67281, + 67303, + 67265, + 67281, + 67282, + 67299, + 67288, + 67296, + 67318, + 67330, + 67299, + 67288, + 67304, + 67264, + 67306, + 67280, + 67279, + 67295, + 67317, + 67279, + 67276, + 67269, + 67301, + 67260, + 67357, + 67296, + 67285, + 67294, + 67334, + 67274, + 67305, + 67296, + 67344, + 67318, + 67284, + 67292, + 67325, + 67269, + 67258, + 67292, + 67284, + 67311, + 67347, + 67287, + 67295, + 67272, + 67301, + 67313, + 67294, + 67287, + 67262, + 67271, + 67293, + 67276, + 67278, + 67341, + 67282, + 67285, + 67288, + 67310, + 67268, + 67286, + 67308, + 67289, + 67299, + 67338, + 67324, + 67284, + 67269, + 67382, + 67261, + 67271, + 67301, + 67313, + 67307, + 67280, + 67288, + 67298, + 67263, + 67270, + 67259, + 67285, + 67708, + 67259, + 67287, + 67302, + 67262, + 67272, + 67278, + 67304, + 67297, + 67291, + 67310, + 67293, + 67296, + 67291, + 67325, + 67263, + 67296, + 67312, + 67268, + 67278, + 67270, + 67300, + 67294, + 67294, + 67283, + 67295, + 67264, + 67284, + 67300, + 67299, + 67300, + 67312, + 67286, + 67268, + 67321, + 67276, + 67314, + 67311, + 67314, + 67285, + 67291, + 67304, + 67318, + 67294, + 67297, + 67306, + 67274, + 67307, + 67303, + 67278, + 67280, + 67330, + 67302, + 67260, + 67283, + 67324, + 67290, + 67258, + 67267, + 67292, + 67318, + 67266, + 67284, + 67323, + 67284, + 67296, + 67287, + 67265, + 67258, + 67282, + 67267, + 67252, + 67316, + 67257, + 67281, + 67301, + 67283, + 67284, + 67273, + 67279, + 67289, + 67254, + 67319, + 67255, + 67285, + 67308, + 67285, + 67301, + 67274, + 67316, + 67272, + 67291, + 67326, + 67310, + 67304, + 67305, + 67258, + 67307, + 67289, + 67296, + 67279, + 67270, + 67293, + 67288, + 67322, + 67279, + 67269, + 67253, + 67284, + 67357, + 67286, + 67305, + 67280, + 67282, + 67300, + 67267, + 67269, + 67272, + 67265, + 67289, + 67327, + 67317, + 67323, + 67335, + 67298, + 67344, + 67250, + 67288, + 67283, + 67316, + 67296, + 67255, + 67278, + 67299, + 67325, + 67286, + 67278, + 67317, + 67296, + 67302, + 67309, + 67322, + 67296, + 67297, + 67283, + 67269, + 67276, + 67270, + 67272, + 67289, + 67272, + 67276, + 67291, + 67279, + 67323, + 67361, + 67286, + 67265, + 67323, + 67277, + 67310, + 67269, + 67261, + 67323, + 67319, + 67282, + 67327, + 67279, + 67291, + 67324, + 67289, + 67310, + 67268, + 67273, + 67279, + 67291, + 67280, + 67289, + 67289, + 67288, + 67344, + 67284, + 67319, + 67275, + 67295, + 67282, + 67278, + 67294, + 67318, + 67299, + 67309, + 67316, + 67284, + 67286, + 67286, + 67325, + 67292, + 67303, + 67288, + 67266, + 67303, + 67294, + 67292, + 67304, + 67271, + 67281, + 67323, + 67289, + 67274, + 67269, + 67269, + 67294, + 67298, + 67272, + 67293, + 67291, + 67291, + 67292, + 67305, + 67297, + 67279, + 67284, + 67308, + 67365, + 67264, + 67284, + 67283, + 67299, + 67381, + 67284, + 67315, + 67303, + 67279, + 67315, + 67262, + 67328, + 67328, + 67293, + 67263, + 67306, + 67258, + 67312, + 67284, + 67279, + 67282, + 67253, + 67259, + 67317, + 67309, + 67246, + 67276, + 67304, + 67284, + 67279, + 67303, + 67315, + 67279, + 67282, + 67291, + 67268, + 67295, + 67304, + 67311, + 67285, + 67283, + 67313, + 67320, + 67284, + 67275, + 67309, + 67284, + 67316, + 67281, + 67300, + 67300, + 67290, + 67266, + 67276, + 67284, + 67263, + 67307, + 67289, + 67308, + 67294, + 67351, + 67276, + 67293, + 67269, + 67277, + 67253, + 67293, + 67279, + 67305, + 67289, + 67310, + 67289, + 67261, + 67297, + 67256, + 67316, + 67279, + 67268, + 67323, + 67285, + 67278, + 67318, + 67276, + 67273, + 67297, + 67295, + 67308, + 67297, + 67289, + 67254, + 67277, + 67309, + 67292, + 67312, + 67284, + 67277, + 67279, + 67292, + 67299, + 67307, + 67277, + 67298, + 67317, + 67292, + 67289, + 67289, + 67277, + 67265, + 67317, + 67309, + 67291, + 67306, + 67295, + 67542, + 67269, + 67308, + 67291, + 67267, + 67295, + 67338, + 67313, + 67258, + 67307, + 67287, + 67267, + 67268, + 67297, + 67288, + 67328, + 67330, + 67292, + 67294, + 67304, + 67284, + 67304, + 67283, + 67268, + 67313, + 67264, + 67281, + 67302, + 67309, + 67267, + 67302, + 67313, + 67288, + 67284, + 67278, + 67284, + 67335, + 67274, + 67297, + 67312, + 67342, + 67278, + 67312, + 67288, + 67321, + 67297, + 67298, + 67313, + 67305, + 67283, + 67324, + 67295, + 67281, + 67287, + 67313, + 67282, + 67296, + 67310, + 67301, + 67312, + 67336, + 67288, + 67276, + 67340, + 67256, + 67266, + 67336, + 67272, + 67314, + 67306, + 67269, + 67298, + 67300, + 67262, + 67268, + 67258, + 67280, + 67291, + 67285, + 67306, + 67281, + 67321, + 67301, + 67269, + 67283, + 67295, + 67289, + 67263, + 67302, + 67293, + 67297, + 67309, + 67324, + 67301, + 67261, + 67281, + 67272, + 67311, + 67268, + 67271, + 67287, + 67287, + 67289, + 67333, + 67320, + 67309, + 67309, + 67293, + 67276, + 67289, + 67302, + 67307, + 67321, + 67363, + 67281, + 67291, + 67325, + 67314, + 67288, + 67266, + 67325, + 67368, + 67321, + 67294, + 67343, + 67306, + 67285, + 67291, + 67306, + 67289, + 67319, + 67300, + 67311, + 67278, + 67274, + 67272, + 67326, + 67292, + 67329, + 67273, + 67281, + 67322, + 67296, + 67299, + 67294, + 67283, + 67359, + 67294, + 67281, + 67285, + 67317, + 67293, + 67293, + 67332, + 67283, + 67262, + 67288, + 67272, + 67270, + 67294, + 67287, + 67274, + 67297, + 67324, + 67306, + 67317, + 67266, + 67306, + 67260, + 67335, + 67313, + 67316, + 67300, + 67284, + 67256, + 67274, + 67303, + 67292, + 67319, + 67312, + 67332, + 67310, + 67267, + 67277, + 67287, + 67284, + 67285, + 67283, + 67331, + 67298, + 67305, + 67275, + 67271, + 67364, + 67316, + 67330, + 67320, + 67274, + 67284, + 67347, + 67318, + 67308, + 67303, + 67305, + 67316, + 67302, + 67318, + 67262, + 67297, + 67311, + 67309, + 67336, + 67300, + 67267, + 67278, + 67246, + 67279, + 67309, + 67328, + 67302, + 67281, + 67293, + 67304, + 67302, + 67275, + 67294, + 67283, + 67264, + 67283, + 67307, + 67304, + 67306, + 67263, + 67288, + 67310, + 67292, + 67307, + 67294, + 67286, + 67266, + 67298, + 67296, + 67303, + 67276, + 67284, + 67287, + 67289, + 67347, + 67317, + 67324, + 67303, + 67292, + 67264, + 67271, + 67275, + 67333, + 67299, + 67290, + 67298, + 67335, + 67268, + 67274, + 67283, + 67283, + 67260, + 67304, + 67327, + 67295, + 67296, + 67291, + 67292, + 67267, + 67275, + 67289, + 67293, + 67272, + 67259, + 67290, + 67265, + 67282, + 67311, + 67269, + 67330, + 67311, + 67290, + 67296, + 67312, + 67302, + 67275, + 67279, + 67306, + 67300, + 67298, + 67276, + 67282, + 67320, + 67257, + 67294, + 67278, + 67275, + 67308, + 67272, + 67264, + 67345, + 67292, + 67320, + 67278, + 67307, + 67255, + 67290, + 67293, + 67281, + 67317, + 67282, + 67310, + 67283, + 67592, + 67292, + 67276, + 67270, + 67276, + 67277, + 67310, + 67291, + 67279, + 67270, + 67301, + 67335, + 67301, + 67296, + 67252, + 67272, + 67299, + 67314, + 67280, + 67280, + 67299, + 67275, + 67326, + 67281, + 67273, + 67287, + 67492, + 67295, + 67339, + 67286, + 67285, + 67316, + 67304, + 67288, + 67308, + 67274, + 67272, + 67291, + 67314, + 67296, + 67304, + 67274, + 67328, + 67330, + 67332, + 67330, + 67278, + 67274, + 67285, + 67337, + 67265, + 67293, + 67304, + 67262, + 67285, + 67271, + 67316, + 67299, + 67300, + 67305, + 67314, + 67289, + 67281, + 67296, + 67290, + 67261, + 67294, + 67276, + 67289, + 67290, + 67284, + 67309, + 67286, + 67303, + 67284, + 67360, + 67262, + 67313, + 67301, + 67308, + 67291, + 67291, + 67299, + 67298, + 67298, + 67296, + 67292, + 67314, + 67298, + 67299, + 67287, + 67306, + 67309, + 67306, + 67294, + 67291, + 67312, + 67318, + 67263, + 67326, + 67292, + 67275, + 67284, + 67272, + 67268, + 67374, + 67299, + 67318, + 67324, + 67306, + 67266, + 67270, + 67520, + 67303, + 67272, + 67271, + 67293, + 67276, + 67275, + 67296, + 67276, + 67299, + 67292, + 67283, + 67308, + 67310, + 67276, + 67289, + 67265, + 67261, + 67293, + 67267, + 67318, + 67268, + 67314, + 67324, + 67271, + 67344, + 67354, + 67294, + 67323, + 67309, + 67289, + 67314, + 67297, + 67306, + 67308, + 67255, + 67284, + 67264, + 67255, + 67270, + 67291, + 67276, + 67272, + 67265, + 67269, + 67270, + 67274, + 67294, + 67278, + 67310, + 67289, + 67280, + 67290, + 67285, + 67303, + 67274, + 67299, + 67303, + 67266, + 67259, + 67321, + 67299, + 67290, + 67255, + 67297, + 67290, + 67289, + 67300, + 67301, + 67259, + 67325, + 67313, + 67363, + 67312, + 67302, + 67317, + 67269, + 67286, + 67308, + 67289, + 67384, + 67272, + 67300, + 67277, + 67283, + 67335, + 67309, + 67256, + 67286, + 67300, + 67265, + 67292, + 67278, + 67292, + 67287, + 67298, + 67315, + 67334, + 67267, + 67278, + 67297, + 67290, + 67290, + 67296, + 67317, + 67275, + 67305, + 67329, + 67301, + 67289, + 67271, + 67309, + 67284, + 67314, + 67261, + 67292, + 67287, + 67279, + 67283, + 67301, + 67297, + 67284, + 67309, + 67317, + 67283, + 67328, + 67286, + 67265, + 67298, + 67295, + 67307, + 67340, + 67277, + 67284, + 67269, + 67289, + 67291, + 67280, + 67315, + 67306, + 67293, + 67306, + 67344, + 67312, + 67316, + 67286, + 67271, + 67295, + 67294, + 67270, + 67283, + 67283, + 67293, + 67285, + 67298, + 67260, + 67321, + 67294, + 67328, + 67313, + 67280, + 67295, + 67316, + 67308, + 67259, + 67303, + 67286, + 67280, + 67293, + 67276, + 67268, + 67293, + 67322, + 67280, + 67309, + 67340, + 67301, + 67315, + 67299, + 67308, + 67288, + 67301, + 67314, + 67262, + 67271, + 67290, + 67270, + 67328, + 67275, + 67307, + 67288, + 67327, + 67294, + 67301, + 67283, + 67294, + 67279, + 67279, + 67296, + 67340, + 67323, + 67267, + 67260, + 67272, + 67306, + 67277, + 67287, + 67302, + 67323, + 67261, + 67298, + 67284, + 67313, + 67289, + 67261, + 67316, + 67255, + 67305, + 67297, + 67248, + 67300, + 67311, + 67295, + 67330, + 67288, + 67313, + 67292, + 67313, + 67264, + 67278, + 67299, + 67262, + 67267, + 67280, + 67300, + 67286, + 67286, + 67282, + 67308, + 67303, + 67271, + 67278, + 67286, + 67275, + 67283, + 67330, + 67271, + 67304, + 67314, + 67283, + 67314, + 67263, + 67312, + 67257, + 67309, + 67269, + 67273, + 67290, + 67302, + 67270, + 67275, + 67290, + 67282, + 67325, + 67309, + 67284, + 67275, + 67348, + 67296, + 67277, + 67268, + 67279, + 67309, + 67290, + 67289, + 67291, + 67292, + 67279, + 67308, + 67294, + 67287, + 67281, + 67253, + 67293, + 67304, + 67265, + 67283, + 67275, + 67270, + 67318, + 67302, + 67315, + 67270, + 67350, + 67313, + 67296, + 67296, + 67309, + 67291, + 67282, + 67269, + 67288, + 67267, + 67296, + 67311, + 67269, + 67292, + 67282, + 67308, + 67276, + 67292, + 67297, + 67249, + 67304, + 67272, + 67283, + 67314, + 67312, + 67268, + 67277, + 67286, + 67289, + 67294, + 67282, + 67316, + 67286, + 67289, + 67311, + 67265, + 67291, + 67293, + 67330, + 67327, + 67291, + 67279, + 67329, + 67300, + 67304, + 67278, + 67272, + 67316, + 67264, + 67281, + 67282, + 67283, + 67259, + 67333, + 67300, + 67288, + 67307, + 67266, + 67289, + 67302, + 67254, + 67299, + 67305, + 67292, + 67291, + 67291, + 67270, + 67279, + 67305, + 67315, + 67280, + 67300, + 67282, + 67274, + 67317, + 67278, + 67295, + 67317, + 67273, + 67279, + 67279, + 67326, + 67287, + 67295, + 67332, + 67280, + 67299, + 67297, + 67275, + 67266, + 67291, + 67267, + 67307, + 67294, + 67299, + 67285, + 67272, + 67261, + 67319, + 67316, + 67286, + 67263, + 67290, + 67321, + 67284, + 67294, + 67314, + 67316, + 67322, + 67278, + 67282, + 67294, + 67266, + 67324, + 67297, + 67283, + 67293, + 67327, + 67432, + 67265, + 67296, + 67286, + 67295, + 67281, + 67325, + 67259, + 67300, + 67314, + 67305, + 67283, + 67284, + 67317, + 67286, + 67299, + 67274, + 67277, + 67289, + 67299, + 67284, + 67280, + 67335, + 67296, + 67273, + 67322, + 67286, + 67273, + 67324, + 67306, + 67324, + 67293, + 67313, + 67286, + 67293, + 67329, + 67268, + 67257, + 67288, + 67282, + 67293, + 67291, + 67267, + 67280, + 67329, + 67300, + 67290, + 67274, + 67286, + 67262, + 67312, + 67290, + 67317, + 67258, + 67279, + 67259, + 67305, + 67347, + 67287, + 67279, + 67277, + 67317, + 67295, + 67293, + 67307, + 67311, + 67287, + 67275, + 67269, + 67298, + 67284, + 67254, + 67265, + 67283, + 67286, + 67283, + 67305, + 67296, + 67293, + 67318, + 67280, + 67289, + 67340, + 67309, + 67301, + 67289, + 67309, + 67299, + 67281, + 67273, + 67283, + 67298, + 67331, + 67326, + 67287, + 67256, + 67295, + 67327, + 67311, + 67284, + 67314, + 67278, + 67285, + 67296, + 67431, + 67305, + 67300, + 67257, + 67324, + 67309, + 67320, + 67292, + 67336, + 67287, + 67269, + 67251, + 67288, + 67279, + 67290, + 67337, + 67266, + 67301, + 67270, + 67260, + 67312, + 67269, + 67283, + 67276, + 67275, + 73895, + 67290, + 67268, + 67289, + 67279, + 67302, + 67307, + 67268, + 67260, + 67270, + 67292, + 67336, + 67321, + 67314, + 67276, + 67304, + 67349, + 67281, + 67312, + 67266, + 67316, + 67305, + 67306, + 67323, + 67332, + 67278, + 67315, + 67267, + 67270, + 67307, + 67283, + 67304, + 67284, + 67296, + 67301, + 67344, + 67317, + 67264, + 67290, + 67279, + 67304, + 67325, + 67288, + 67334, + 67259, + 67328, + 67303, + 67339, + 67265, + 67279, + 67285, + 67277, + 67271, + 67292, + 67274, + 67293, + 67292, + 67311, + 67309, + 67303, + 67286, + 67260, + 67328, + 67275, + 67330, + 67302, + 67268, + 67292, + 67264, + 67279, + 67267, + 67297, + 67269, + 67279, + 67301, + 67320, + 67326, + 67303, + 67300, + 67280, + 67312, + 67259, + 67290, + 67311, + 67269, + 67272, + 67295, + 68028, + 67281, + 67265, + 67297, + 67235, + 67282, + 67276, + 67313, + 67286, + 67318, + 67286, + 67302, + 67294, + 67254, + 67289, + 67294, + 67323, + 67286, + 67291, + 67286, + 67271, + 67337, + 67286, + 67265, + 67300, + 67284, + 67278, + 67285, + 67312, + 67267, + 67267, + 67288, + 67348, + 67303, + 67301, + 67315, + 67290, + 67316, + 67269, + 67305, + 67268, + 67287, + 67297, + 67276, + 67283, + 67298, + 67279, + 67295, + 67259, + 67350, + 67314, + 67302, + 67270, + 67279, + 67281, + 67315, + 67318, + 67280, + 67310, + 67343, + 67334, + 67293, + 67284, + 67327, + 67323, + 67274, + 67305, + 67333, + 67296, + 67283, + 67277, + 67327, + 67318, + 67271, + 67299, + 67296, + 67276, + 67276, + 67269, + 67306, + 67271, + 67297, + 67267, + 67306, + 67252, + 67298, + 67298, + 67312, + 67272, + 67282, + 67315, + 67296, + 67358, + 67280, + 67280, + 67271, + 67280, + 67295, + 67328, + 67303, + 67245, + 67294, + 67306, + 67315, + 67290, + 67273, + 67285, + 67305, + 67268, + 67302, + 67267, + 67300, + 67278, + 67275, + 67299, + 67329, + 67313, + 67288, + 67257, + 67281, + 67291, + 67265, + 67333, + 67300, + 67293, + 67298, + 67266, + 67289, + 67282, + 67329, + 67274, + 67256, + 67271, + 67292, + 67274, + 67336, + 67301, + 67299, + 67302, + 67345, + 67296, + 67283, + 67292, + 67268, + 67287, + 67291, + 67277, + 67314, + 67283, + 67275, + 67323, + 67273, + 67313, + 67302, + 67297, + 67328, + 67310, + 67316, + 67287, + 67311, + 67305, + 67259, + 67290, + 67293, + 67361, + 67316, + 67296, + 67349, + 67303, + 67324, + 67291, + 67347, + 67288, + 67313, + 67302, + 67288, + 67276, + 67301, + 77457, + 67276, + 67289, + 67274, + 67320, + 67278, + 67304, + 67332, + 67264, + 67285, + 67268, + 67283, + 67297, + 67331, + 67281, + 67331, + 67272, + 67292, + 67309, + 67316, + 67297, + 67289, + 67312, + 67337, + 67289, + 67287, + 67260, + 67308, + 67307, + 67267, + 67290, + 67300, + 67284, + 67281, + 67328, + 67296, + 67278, + 67330, + 67325, + 67268, + 67284, + 67298, + 67290, + 67298, + 67298, + 67318, + 67279, + 67302, + 67293, + 67291, + 67288, + 67314, + 67304, + 67291, + 67295, + 67338, + 67295, + 67288, + 67297, + 67296, + 67301, + 67263, + 67313, + 67287, + 67296, + 67254, + 67320, + 67322, + 67285, + 67294, + 67275, + 67255, + 67283, + 67272, + 67313, + 67257, + 67303, + 67270, + 67346, + 67288, + 67294, + 67274, + 67304, + 67283, + 67298, + 67295, + 67263, + 67305, + 67328, + 67289, + 67334, + 67292, + 67248, + 67309, + 67297, + 67327, + 67302, + 67307, + 67265, + 67271, + 67284, + 67297, + 67278, + 67265, + 67290, + 67264, + 67276, + 67269, + 67314, + 67307, + 67299, + 67260, + 67317, + 67277, + 67290, + 67339, + 67287, + 67283, + 67283, + 67271, + 67293, + 67294, + 67288, + 67272, + 67301, + 67304, + 67302, + 67294, + 67262, + 67275, + 67308, + 67285, + 67317, + 67307, + 67288, + 67251, + 67265, + 67296, + 67290, + 67306, + 67606, + 67311, + 67312, + 67286, + 67297, + 67267, + 67300, + 67280, + 67293, + 67261, + 67293, + 67324, + 67292, + 67292, + 67315, + 67259, + 67291, + 67275, + 67267, + 67269, + 67274, + 67296, + 67274, + 67298, + 67300, + 67285, + 67343, + 67319, + 67299, + 67348, + 67300, + 67293, + 67262, + 67291, + 67308, + 67262, + 67294, + 67351, + 67267, + 67276, + 67302, + 67251, + 67270, + 67278, + 67278, + 67277, + 67263, + 67301, + 67293, + 67338, + 67291, + 67260, + 67300, + 67261, + 67310, + 67276, + 67305, + 67270, + 67299, + 67324, + 67317, + 67261, + 67293, + 67273, + 67287, + 67304, + 67281, + 67256, + 67310, + 67306, + 67297, + 67323, + 67331, + 67295, + 67290, + 67290, + 67283, + 67312, + 67301, + 67288, + 67283, + 67280, + 67298, + 67304, + 67303, + 67313, + 67289, + 67299, + 67325, + 67253, + 67305, + 67330, + 67293, + 67267, + 67273, + 67245, + 67277, + 67293, + 67267, + 67308, + 67273, + 67298, + 67292, + 67320, + 67258, + 67293, + 67268, + 67315, + 67270, + 67300, + 67348, + 67273, + 67281, + 67310, + 67297, + 67306, + 67255, + 67319, + 67280, + 67314, + 67274, + 67252, + 67297, + 67285, + 67340, + 67315, + 67342, + 67280, + 67285, + 67270, + 67298, + 67292, + 67279, + 67297, + 67349, + 67288, + 67262, + 67281, + 67340, + 67332, + 67314, + 67303, + 67281, + 67285, + 67307, + 67321, + 67269, + 67288, + 67253, + 67292, + 67311, + 67283, + 67285, + 67303, + 67260, + 67306, + 67282, + 67288, + 67319, + 67281, + 67308, + 67294, + 67283, + 67306, + 67297, + 67304, + 67322, + 67295, + 67282, + 67268, + 67269, + 67324, + 67295, + 67313, + 67326, + 67307, + 67312, + 67311, + 67293, + 67310, + 67307, + 67295, + 67280, + 67307, + 67305, + 67273, + 67273, + 67321, + 67358, + 67297, + 67301, + 67321, + 67314, + 67261, + 67300, + 67262, + 67348, + 67299, + 67266, + 67274, + 67294, + 67292, + 67261, + 67272, + 67278, + 67302, + 67290, + 67286, + 67296, + 67341, + 67264, + 67269, + 67257, + 67295, + 67299, + 67288, + 67272, + 67313, + 67286, + 67261, + 67253, + 67306, + 67332, + 67329, + 67335, + 67276, + 67296, + 67267, + 67305, + 67275, + 67321, + 67311, + 67305, + 67285, + 67318, + 67295, + 67318, + 67298, + 67285, + 67281, + 67302, + 67294, + 67270, + 67272, + 67301, + 67304, + 67294, + 67293, + 67288, + 67292, + 67338, + 67319, + 67296, + 67317, + 67320, + 67285, + 67290, + 67270, + 67272, + 67350, + 67308, + 67298, + 67292, + 67304, + 67261, + 67273, + 67304, + 67308, + 67282, + 67319, + 67297, + 67300, + 67270, + 67282, + 67323, + 67290, + 67305, + 67265, + 67312, + 67283, + 67290, + 67298, + 67269, + 67314, + 67305, + 67300, + 67331, + 67296, + 67292, + 67288, + 67282, + 67339, + 67270, + 67290, + 67340, + 67298, + 67274, + 67264, + 67314, + 67301, + 67291, + 67276, + 67275, + 67290, + 67358, + 67290, + 67287, + 67279, + 67289, + 67329, + 67300, + 67303, + 67313, + 67287, + 67269, + 67270, + 67259, + 67283, + 67293, + 67318, + 67270, + 67276, + 67259, + 67270, + 67339, + 67329, + 67266, + 67311, + 67320, + 67321, + 67328, + 67327, + 67308, + 67322, + 67260, + 67285, + 67276, + 67289, + 67302, + 67259, + 67300, + 67296, + 67249, + 67304, + 67283, + 67259, + 67289, + 67326, + 67323, + 67269, + 67268, + 67285, + 67267, + 67285, + 67302, + 67263, + 67284, + 67273, + 67278, + 67260, + 67293, + 67329, + 67256, + 67260, + 67275, + 67281, + 67340, + 67294, + 67330, + 67318, + 67316, + 67303, + 67281, + 67286, + 67277, + 67266, + 67294, + 67321, + 67246, + 67308, + 67264, + 67289, + 67262, + 67341, + 67273, + 67278, + 67309, + 67338, + 67300, + 67284, + 67324, + 67269, + 67278, + 67284, + 67314, + 67303, + 67342, + 67288, + 67285, + 67299, + 67291, + 67300, + 67270, + 67325, + 67266, + 67296, + 67274, + 67294, + 67315, + 67315, + 67289, + 67300, + 67308, + 67270, + 67339, + 67265, + 67260, + 67314, + 67339, + 67281, + 67271, + 67342, + 67311, + 67314, + 67338, + 67286, + 67266, + 67328, + 67307, + 67356, + 67266, + 67329, + 67277, + 67288, + 67318, + 67294, + 67302, + 67316, + 67294, + 67309, + 67319, + 67289, + 67288, + 67262, + 67304, + 67294, + 67277, + 67304, + 67293, + 67265, + 67287, + 67272, + 67342, + 67332, + 67308, + 67263, + 67319, + 67246, + 67332, + 67256, + 67302, + 67298, + 67275, + 67261, + 67296, + 67309, + 67258, + 67316, + 67269, + 67277, + 67280, + 67294, + 67299, + 67272, + 67293, + 67272, + 67290, + 67298, + 67273, + 67264, + 67289, + 67302, + 67263, + 67277, + 67293, + 67300, + 67333, + 67293, + 67315, + 67337, + 67279, + 67297, + 67275, + 67296, + 67315, + 67303, + 67329, + 67307, + 67287, + 67349, + 67307, + 67327, + 67282, + 67284, + 67318, + 67276, + 67306, + 67327, + 67279, + 67290, + 67293, + 67287, + 67255, + 67331, + 67329, + 67291, + 67315, + 67303, + 67299, + 67282, + 67308, + 67287, + 67328, + 67335, + 67325, + 67313, + 67281, + 67272, + 67267, + 67278, + 67325, + 67306, + 67293, + 67283, + 67317, + 67275, + 67275, + 67272, + 67348, + 67308, + 67348, + 67325, + 67289, + 67287, + 67276, + 67314, + 67292, + 67296, + 67291, + 67336, + 67309, + 67305, + 67310, + 67292, + 67315, + 67290, + 67319, + 67336, + 67298, + 67339, + 67359, + 67315, + 67298, + 67287, + 67327, + 67270, + 67301, + 67304, + 67315, + 67322, + 67306, + 67303, + 67298, + 67319, + 67288, + 67298, + 67297, + 67323, + 67312, + 67327, + 67300, + 67305, + 67297, + 67272, + 67294, + 67308, + 67305, + 67286, + 67308, + 67291, + 67339, + 67287, + 67312, + 67274, + 67268, + 67301, + 67293, + 67312, + 67268, + 67291, + 67287, + 67283, + 67299, + 67287, + 67293, + 67304, + 67296, + 67297, + 67256, + 67340, + 67298, + 67334, + 67301, + 67305, + 67254, + 67321, + 67298, + 67263, + 67294, + 67305, + 67285, + 67313, + 67299, + 67297, + 67311, + 67308, + 67265, + 67281, + 67281, + 67295, + 67279, + 67254, + 67323, + 67284, + 67316, + 67302, + 67308, + 67308, + 67321, + 67264, + 67286, + 67316, + 67295, + 67279, + 67266, + 67265, + 67289, + 67294, + 67332, + 67286, + 67288, + 67287, + 67265, + 67282, + 67293, + 67264, + 67284, + 67323, + 67268, + 67259, + 67256, + 67261, + 67284, + 67273, + 67287, + 67251, + 67275, + 67297, + 67307, + 67300, + 67276, + 67280, + 67270, + 67277, + 67321, + 67282, + 67350, + 67291, + 67285, + 67339, + 67344, + 67294, + 67285, + 67341, + 67299, + 67254, + 67289, + 67280, + 67263, + 67287, + 67276, + 67257, + 67275, + 67302, + 67319, + 67279, + 67414, + 67279, + 67344, + 67301, + 67284, + 67252, + 67300, + 67281, + 67355, + 67305, + 67267, + 67272, + 67268, + 67278, + 67291, + 67267, + 67298, + 67316, + 67304, + 67283, + 67320, + 67297, + 67274, + 67267, + 67244, + 67288, + 67308, + 67334, + 67317, + 67308, + 67338, + 67310, + 67300, + 67306, + 67289, + 67280, + 67268, + 67270, + 67341, + 67324, + 67295, + 67258, + 67315, + 67321, + 67243, + 67284, + 67253, + 67273, + 67304, + 67335, + 67285, + 67319, + 67308, + 67270, + 67254, + 67277, + 67301, + 67277, + 67339, + 67282, + 67296, + 67276, + 67291, + 67803, + 67314, + 67308, + 67323, + 67303, + 67298, + 67307, + 67302, + 67281, + 67293, + 67269, + 67305, + 67324, + 67309, + 67266, + 67291, + 67341, + 67267, + 67294, + 67273, + 67272, + 67312, + 67299, + 67271, + 67284, + 67296, + 67302, + 67304, + 67291, + 67305, + 67336, + 67300, + 67268, + 67307, + 67309, + 67261, + 67285, + 67288, + 67302, + 67259, + 67312, + 67290, + 67277, + 67259, + 67314, + 67306, + 67292, + 67300, + 67306, + 67264, + 67326, + 67323, + 67253, + 67338, + 67322, + 67267, + 67300, + 67280, + 67275, + 67271, + 67283, + 67253, + 67311, + 67282, + 67254, + 67324, + 67290, + 67286, + 67255, + 67259, + 67259, + 67337, + 67298, + 67268, + 67285, + 67286, + 67279, + 67305, + 67290, + 67308, + 67311, + 67347, + 67302, + 67291, + 67288, + 67324, + 67294, + 67322, + 67304, + 67267, + 67307, + 67322, + 67286, + 67319, + 67290, + 67352, + 67313, + 67274, + 67314, + 67314, + 67325, + 67283, + 67288, + 67295, + 67322, + 67299, + 67260, + 67308, + 67287, + 67270, + 67272, + 67288, + 67270, + 67351, + 67294, + 67310, + 67294, + 67314, + 67285, + 67307, + 67301, + 67286, + 67269, + 67276, + 67298, + 67316, + 67258, + 67292, + 67313, + 67316, + 67278, + 67308, + 67262, + 67314, + 67293, + 67299, + 67284, + 67295, + 67300, + 67284, + 67286, + 67297, + 67240, + 67293, + 67288, + 67277, + 67309, + 67311, + 67294, + 67317, + 67310, + 67262, + 67287, + 67276, + 67299, + 67285, + 67326, + 67292, + 67277, + 67263, + 67335, + 67298, + 67304, + 67302, + 67321, + 67290, + 67286, + 67284, + 67270, + 67277, + 67251, + 67292, + 67274, + 67296, + 67324, + 67291, + 67323, + 67294, + 67262, + 67292, + 67270, + 67291, + 67250, + 67268, + 67291, + 67335, + 67326, + 67302, + 67319, + 67334, + 67288, + 67282, + 67316, + 67263, + 67280, + 67333, + 67312, + 67277, + 67306, + 67319, + 67317, + 67305, + 67344, + 67302, + 67278, + 67334, + 67319, + 67272, + 67297, + 67331, + 67331, + 67280, + 67287, + 67278, + 67305, + 67309, + 67296, + 67263, + 67264, + 67330, + 67307, + 67299, + 67277, + 67329, + 67325, + 67274, + 67306, + 67300, + 67285, + 67268, + 67293, + 67288, + 67329, + 67291, + 67302, + 67333, + 67288, + 67325, + 67303, + 67296, + 67293, + 67326, + 67284, + 67264, + 67337, + 67267, + 67339, + 67309, + 67302, + 67254, + 67265, + 67327, + 67277, + 67305, + 67290, + 67303, + 67285, + 67279, + 67257, + 67311, + 67329, + 67270, + 67285, + 67285, + 67254, + 67300, + 67279, + 67286, + 67299, + 67315, + 67278, + 67268, + 67260, + 67304, + 67255, + 67282, + 67264, + 67279, + 67301, + 67287, + 67288, + 67323, + 67298, + 67331, + 67267, + 67292, + 67286, + 67288, + 67301, + 67258, + 67304, + 67255, + 67341, + 67285, + 67312, + 67314, + 67333, + 67310, + 67319, + 67297, + 67335, + 67314, + 67295, + 67304, + 67295, + 67284, + 67298, + 67294, + 67301, + 67270, + 67291, + 67302, + 67325, + 67296, + 67275, + 67290, + 67285, + 67297, + 67300, + 67265, + 67280, + 67275, + 67302, + 67305, + 67274, + 67316, + 67277, + 67258, + 67299, + 67296, + 67323, + 67280, + 67299, + 67317, + 67299, + 67288, + 67280, + 67265, + 67302, + 67275, + 67298, + 67316, + 67341, + 67310, + 67299, + 67297, + 67333, + 67266, + 67307, + 67351, + 67272, + 67322, + 67298, + 67301, + 67356, + 67298, + 67281, + 67307, + 67311, + 67299, + 67328, + 67282, + 67302, + 67277, + 67305, + 67260, + 67294, + 67316, + 67350, + 67314, + 67301, + 67287, + 67275, + 67251, + 67299, + 67304, + 67307, + 67344, + 67301, + 67292, + 67284, + 67293, + 67281, + 67298, + 67356, + 67296, + 67292, + 67335, + 67307, + 67325, + 67403, + 67339, + 67272, + 67320, + 67269, + 67292, + 67293, + 67300, + 67300, + 67300, + 67311, + 67310, + 67273, + 67301, + 67283, + 67299, + 67291, + 67303, + 67339, + 67297, + 67349, + 67300, + 67352, + 67290, + 67281, + 67341, + 67293, + 67304, + 67284, + 67298, + 67291, + 67267, + 67317, + 67283, + 67296, + 67271, + 67273, + 67296, + 67289 + ], + "sample_count": 15277 + }, + { + "pubkey": "BiqVGbGZsiRjjHcqWpiotJGydk1ckSLbwzkQBtmDAGx5", + "epoch": 89, + "origin_device_pk": "5tqXoiQtZmuL6CjhgAC6vA49JRUsgB9Gsqh4fNjEhftU", + "target_device_pk": "CT8mP6RUoRcAB67HjKV9am7SBTCpxaJEwfQrSjVLdZfD", + "link_pk": "4f6tmVrFNFCgaBixqC3BiyZYYmvBzqd8vv5j1aBGTPia", + "origin_device_location_pk": "CJsM8xrShT5YCR8VbaLKR3dDZMA24X9XkMeBKh6eH9z9", + "target_device_location_pk": "8ivCSPhAs6WwbWY5WR7GCQiChEVcK2kpoj97MugLPwcg", + "origin_device_agent_pk": "qEkxzwaSExKenpUZJFhzGz98j4upY64u8n96KJjFiSp", + "sampling_interval_us": 10000000, + "start_timestamp_us": 1757242126942783, + "samples": [ + 98775, + 98766, + 98778, + 98737, + 98736, + 98742, + 98753, + 98727, + 98777, + 98736, + 98765, + 98760, + 98738, + 98730, + 98765, + 98760, + 98744, + 98746, + 98755, + 98741, + 98760, + 98733, + 98747, + 98752, + 98776, + 98776, + 98755, + 98772, + 98726, + 98759, + 98728, + 98768, + 98757, + 98741, + 98738, + 98747, + 98740, + 98742, + 98768, + 98782, + 98739, + 98753, + 98751, + 98770, + 98729, + 98784, + 98731, + 98743, + 98737, + 98750, + 98756, + 98759, + 99222, + 98761, + 98766, + 98744, + 98750, + 98771, + 98730, + 98754, + 98745, + 98815, + 98722, + 98734, + 98744, + 98733, + 98755, + 98759, + 98746, + 98751, + 98765, + 98744, + 98743, + 98742, + 98728, + 98736, + 98750, + 98805, + 98747, + 98756, + 98759, + 98745, + 98745, + 98737, + 98740, + 98757, + 98760, + 98746, + 98741, + 98774, + 98756, + 98743, + 98742, + 98767, + 98736, + 98756, + 98745, + 98778, + 98742, + 98756, + 98754, + 99098, + 98733, + 98801, + 98737, + 98721, + 98769, + 98763, + 98755, + 98760, + 98723, + 98772, + 98762, + 98897, + 98897, + 98767, + 98774, + 98759, + 98762, + 98755, + 98750, + 98750, + 98755, + 98776, + 98743, + 98749, + 98744, + 98736, + 98758, + 98771, + 98735, + 98774, + 98732, + 98767, + 98728, + 98758, + 98725, + 98738, + 98739, + 98776, + 98731, + 98745, + 98728, + 98759, + 98758, + 98768, + 98760, + 98760, + 98759, + 98734, + 98779, + 98778, + 98743, + 98748, + 98729, + 98769, + 98775, + 98787, + 98730, + 98740, + 98754, + 98749, + 98771, + 98747, + 98761, + 98769, + 98762, + 98726, + 98765, + 98769, + 98740, + 98773, + 98772, + 98749, + 98742, + 98737, + 98719, + 98743, + 98745, + 98787, + 98755, + 98734, + 98737, + 98749, + 98798, + 98763, + 98746, + 98740, + 98729, + 98781, + 98753, + 98753, + 98756, + 98766, + 98744, + 98736, + 98771, + 98768, + 98762, + 98756, + 98755, + 98767, + 98761, + 98760, + 98733, + 98742, + 98765, + 98741, + 98742, + 98742, + 98750, + 98736, + 98729, + 98774, + 98719, + 98764, + 98778, + 98766, + 98728, + 98737, + 98735, + 98768, + 98810, + 98753, + 98766, + 98796, + 98721, + 98743, + 98777, + 98740, + 98726, + 98756, + 98721, + 98735, + 98757, + 98745, + 98734, + 98732, + 98752, + 98733, + 98773, + 98762, + 98735, + 98739, + 98761, + 98739, + 98781, + 98752, + 98741, + 98769, + 98734, + 98760, + 98741, + 98765, + 98759, + 98789, + 98785, + 98788, + 98753, + 98765, + 98732, + 98766, + 98754, + 98739, + 98741, + 98773, + 98745, + 98764, + 98759, + 98756, + 98787, + 98779, + 98781, + 98764, + 98760, + 98776, + 98761, + 98740, + 98735, + 98735, + 98775, + 98772, + 98737, + 98769, + 98767, + 98756, + 98740, + 98740, + 98768, + 98755, + 98734, + 98765, + 98719, + 98762, + 98737, + 98771, + 98747, + 98761, + 98772, + 98756, + 98744, + 98769, + 98750, + 98742, + 98733, + 98755, + 98764, + 98767, + 98750, + 98720, + 98730, + 98739, + 98741, + 98740, + 98729, + 98803, + 98770, + 98760, + 98736, + 98735, + 98728, + 98772, + 98757, + 98732, + 98757, + 98766, + 98772, + 98783, + 98738, + 98779, + 98765, + 98748, + 98727, + 98735, + 98751, + 98744, + 98733, + 98765, + 98759, + 98744, + 98751, + 98755, + 98765, + 98739, + 98738, + 98769, + 98739, + 98736, + 98771, + 98731, + 98763, + 98783, + 98745, + 98757, + 98762, + 98774, + 98751, + 98765, + 98726, + 98753, + 98777, + 98752, + 98758, + 98759, + 98733, + 98788, + 98726, + 98770, + 98751, + 98752, + 98733, + 98740, + 98728, + 98740, + 98742, + 98749, + 98739, + 98755, + 98763, + 98744, + 98754, + 98746, + 98750, + 98739, + 98770, + 98783, + 98713, + 98721, + 98734, + 98746, + 98752, + 98774, + 98743, + 98784, + 98780, + 98759, + 98744, + 98743, + 98750, + 98750, + 98762, + 98787, + 98750, + 98745, + 98753, + 98785, + 98752, + 98736, + 98777, + 98760, + 98738, + 98772, + 98742, + 98753, + 98732, + 98745, + 98738, + 98777, + 98765, + 98746, + 98733, + 98744, + 98769, + 98735, + 98765, + 98769, + 98768, + 98756, + 98742, + 98741, + 98762, + 98750, + 98744, + 98763, + 98722, + 98742, + 98752, + 98743, + 98734, + 98742, + 98753, + 98758, + 98786, + 98740, + 98746, + 98743, + 98731, + 98740, + 98769, + 98773, + 98826, + 98767, + 98729, + 98771, + 98743, + 98740, + 98825, + 98770, + 98752, + 98736, + 98738, + 98766, + 98755, + 98742, + 98771, + 98747, + 98739, + 98742, + 98772, + 98751, + 98733, + 98733, + 98747, + 98780, + 98753, + 98766, + 98754, + 98741, + 98732, + 98730, + 98746, + 98748, + 98769, + 98734, + 98775, + 98761, + 98750, + 98779, + 98758, + 98729, + 98732, + 98763, + 98764, + 98746, + 98743, + 98769, + 98775, + 98727, + 98734, + 98751, + 98750, + 98727, + 98732, + 98740, + 98746, + 98748, + 98751, + 98743, + 98758, + 98797, + 98761, + 98747, + 98742, + 98741, + 98735, + 98750, + 98741, + 98737, + 98782, + 98750, + 98731, + 98735, + 98778, + 98723, + 98718, + 98769, + 98743, + 98798, + 98809, + 98772, + 98793, + 98753, + 98757, + 98795, + 98787, + 98777, + 98768, + 98751, + 98753, + 98755, + 98759, + 98780, + 98730, + 98761, + 98738, + 98740, + 98735, + 98764, + 98765, + 98764, + 98764, + 98766, + 98795, + 98758, + 98742, + 98756, + 98769, + 98751, + 98743, + 98742, + 98780, + 98750, + 98714, + 98761, + 98771, + 98770, + 98726, + 98778, + 98748, + 98784, + 98743, + 98753, + 98733, + 98723, + 98736, + 98780, + 98770, + 98733, + 98741, + 98748, + 98760, + 98755, + 98758, + 98771, + 98788, + 98743, + 98760, + 98756, + 98737, + 98776, + 98735, + 98753, + 98727, + 98756, + 98753, + 98779, + 98777, + 98762, + 98736, + 98759, + 98775, + 98768, + 98756, + 98746, + 98751, + 98788, + 98794, + 98754, + 98769, + 98725, + 98729, + 98758, + 98746, + 98740, + 98774, + 98766, + 98742, + 98749, + 98750, + 98744, + 98738, + 98764, + 98739, + 98741, + 98725, + 98743, + 98763, + 98774, + 98760, + 98734, + 98753, + 98737, + 98736, + 98777, + 98766, + 98744, + 98729, + 98761, + 98761, + 98737, + 98752, + 98758, + 98737, + 98772, + 98733, + 98737, + 98757, + 98775, + 98780, + 98787, + 98769, + 98734, + 98770, + 98769, + 98754, + 98755, + 98771, + 98748, + 98736, + 98746, + 98745, + 98751, + 98754, + 98763, + 98759, + 98745, + 98756, + 98757, + 98763, + 98786, + 98748, + 98760, + 98739, + 98741, + 98779, + 98737, + 98788, + 98785, + 98740, + 98739, + 98734, + 98751, + 98736, + 98737, + 98736, + 98768, + 98732, + 98753, + 98728, + 98746, + 98751, + 98762, + 98751, + 98764, + 98729, + 98733, + 98738, + 98784, + 98750, + 98759, + 98748, + 98738, + 98755, + 98784, + 98769, + 98750, + 98779, + 98741, + 98725, + 98760, + 98769, + 98729, + 98759, + 98763, + 98764, + 98756, + 98773, + 98756, + 98762, + 98745, + 98766, + 98769, + 98740, + 98770, + 98762, + 98742, + 98760, + 98768, + 98737, + 98755, + 98739, + 98737, + 98773, + 98767, + 98734, + 98760, + 98773, + 98781, + 98741, + 98752, + 98751, + 98759, + 98739, + 98757, + 98751, + 98730, + 98774, + 98772, + 98742, + 98742, + 98764, + 98767, + 98766, + 98741, + 98769, + 98751, + 98739, + 98796, + 98752, + 98764, + 98779, + 98746, + 98794, + 98764, + 98764, + 98730, + 98740, + 98739, + 98773, + 98759, + 98737, + 98738, + 98736, + 98721, + 98747, + 98751, + 98734, + 98730, + 98772, + 98782, + 98765, + 98744, + 98728, + 98746, + 98759, + 98763, + 98741, + 98751, + 98744, + 98764, + 98734, + 98741, + 98766, + 98743, + 98739, + 98776, + 98731, + 98782, + 98745, + 98848, + 98737, + 98749, + 98746, + 98756, + 98777, + 98735, + 98718, + 98770, + 98736, + 98760, + 98745, + 98747, + 98755, + 98775, + 98756, + 98754, + 98757, + 98744, + 98769, + 98737, + 98783, + 98745, + 98737, + 98750, + 98768, + 98777, + 98730, + 98781, + 98755, + 98748, + 98747, + 98773, + 98754, + 98731, + 98742, + 98744, + 98729, + 98750, + 98770, + 98758, + 98731, + 98783, + 98740, + 98732, + 98743, + 98759, + 98738, + 98754, + 98759, + 98727, + 98746, + 98748, + 98760, + 98759, + 98731, + 98759, + 98770, + 98744, + 98741, + 98761, + 98751, + 98752, + 98752, + 98736, + 98775, + 98758, + 98743, + 98730, + 98726, + 98731, + 98759, + 98739, + 98729, + 98764, + 98763, + 98791, + 98788, + 98785, + 98762, + 98758, + 98781, + 98775, + 98725, + 98737, + 98724, + 98763, + 98726, + 98750, + 98776, + 98744, + 98723, + 98756, + 98769, + 98733, + 98764, + 98800, + 98736, + 98760, + 98770, + 98746, + 98735, + 98726, + 98752, + 98750, + 98757, + 98771, + 98738, + 98734, + 98785, + 98745, + 98764, + 98751, + 98732, + 98747, + 98728, + 98765, + 98753, + 98723, + 98741, + 98763, + 98751, + 98738, + 98728, + 98737, + 98720, + 98808, + 98745, + 98786, + 98750, + 98728, + 98761, + 98752, + 98743, + 98728, + 98738, + 98757, + 98775, + 98744, + 98761, + 98732, + 98735, + 98750, + 98762, + 98742, + 98739, + 98780, + 98730, + 98749, + 98755, + 98731, + 98745, + 98744, + 98763, + 98746, + 98788, + 98765, + 98727, + 98766, + 98748, + 98730, + 98735, + 98734, + 98736, + 98790, + 98765, + 98748, + 98788, + 98774, + 98761, + 98777, + 98764, + 98816, + 98799, + 98827, + 98742, + 98746, + 98747, + 98767, + 98764, + 98784, + 98731, + 98753, + 98728, + 98741, + 98761, + 98784, + 98744, + 98750, + 98756, + 98767, + 98730, + 98776, + 98723, + 98763, + 98735, + 98737, + 98739, + 98747, + 98748, + 98751, + 98776, + 98761, + 98750, + 98755, + 98750, + 98728, + 98738, + 98734, + 98770, + 98739, + 98731, + 98783, + 98732, + 98746, + 98734, + 98744, + 98746, + 98739, + 98768, + 98764, + 98758, + 98751, + 98758, + 98759, + 98738, + 98759, + 98758, + 98770, + 98758, + 98753, + 98733, + 98755, + 98766, + 98736, + 98741, + 98741, + 98748, + 98738, + 98743, + 98765, + 98732, + 98754, + 98765, + 98772, + 98789, + 98747, + 98724, + 98767, + 98748, + 98742, + 98755, + 98777, + 98724, + 98748, + 98751, + 98761, + 98736, + 98768, + 98763, + 98764, + 98738, + 98736, + 98755, + 98743, + 98756, + 98751, + 98793, + 98736, + 98736, + 98743, + 98755, + 98738, + 98771, + 98766, + 98770, + 98753, + 98756, + 98741, + 98735, + 98761, + 98768, + 98734, + 98733, + 98736, + 98754, + 98785, + 98779, + 98756, + 98742, + 98743, + 98724, + 98785, + 98766, + 98764, + 98731, + 98760, + 98756, + 98734, + 98722, + 98764, + 98759, + 98764, + 98743, + 98756, + 98768, + 98770, + 98776, + 98769, + 98757, + 98760, + 98761, + 98772, + 98730, + 98743, + 98725, + 98762, + 98759, + 98732, + 98786, + 98738, + 98761, + 98746, + 98761, + 98758, + 98793, + 98739, + 98740, + 98751, + 98761, + 98735, + 98763, + 98740, + 98738, + 98782, + 98770, + 98747, + 98726, + 98722, + 98754, + 98768, + 98758, + 98760, + 98748, + 98781, + 98765, + 98734, + 98738, + 98729, + 98722, + 98771, + 98764, + 98757, + 98754, + 98774, + 98737, + 98756, + 98733, + 98757, + 98738, + 98755, + 98734, + 98734, + 98761, + 98767, + 98723, + 98738, + 98750, + 98733, + 98727, + 98780, + 98769, + 98753, + 98763, + 98770, + 98727, + 98794, + 98781, + 98763, + 98752, + 98752, + 98761, + 98917, + 98788, + 98761, + 98788, + 98754, + 98771, + 98760, + 98742, + 98760, + 98730, + 98750, + 98744, + 98742, + 98751, + 98756, + 98726, + 98758, + 98752, + 98741, + 98762, + 98775, + 98752, + 98733, + 98747, + 98743, + 98760, + 98736, + 98781, + 98755, + 98774, + 98763, + 98755, + 98736, + 98745, + 98766, + 98763, + 98739, + 98729, + 98751, + 98771, + 98757, + 98747, + 98732, + 98790, + 98757, + 98749, + 98741, + 98771, + 98737, + 98801, + 98747, + 98726, + 98731, + 98762, + 98762, + 98752, + 98760, + 98769, + 98744, + 98738, + 98761, + 98767, + 98754, + 98778, + 98799, + 98778, + 98774, + 98782, + 98770, + 98758, + 98764, + 98728, + 98741, + 98739, + 98766, + 98745, + 98761, + 98740, + 98737, + 98745, + 98763, + 98832, + 98733, + 98761, + 98729, + 98764, + 98745, + 98725, + 98758, + 98735, + 98753, + 98750, + 98772, + 99084, + 98742, + 98747, + 98773, + 98769, + 98751, + 98761, + 98758, + 98741, + 98732, + 98773, + 98786, + 98730, + 98739, + 98744, + 98749, + 98734, + 98757, + 98726, + 98740, + 98732, + 98782, + 98754, + 98740, + 98738, + 98750, + 98746, + 98774, + 98765, + 98764, + 98754, + 98767, + 98773, + 98771, + 98757, + 98746, + 98767, + 98730, + 98720, + 98732, + 98739, + 98747, + 98725, + 98755, + 98742, + 98766, + 98784, + 98787, + 98749, + 98747, + 98732, + 98804, + 98771, + 98751, + 98782, + 98743, + 98753, + 98748, + 98746, + 98741, + 98764, + 98768, + 98757, + 98789, + 98742, + 98728, + 98752, + 98760, + 98758, + 98762, + 98748, + 98747, + 98729, + 98745, + 98748, + 98781, + 98785, + 98762, + 98733, + 98778, + 98753, + 98759, + 98786, + 98746, + 98720, + 98750, + 98786, + 98778, + 98762, + 98756, + 98756, + 98764, + 98755, + 98756, + 98784, + 98759, + 98730, + 98753, + 98738, + 98755, + 98765, + 98747, + 98742, + 98751, + 98764, + 98743, + 98773, + 98756, + 98746, + 98806, + 98760, + 98760, + 98741, + 98792, + 98770, + 98761, + 98756, + 98743, + 98763, + 98770, + 98760, + 98782, + 98745, + 98776, + 98750, + 98781, + 98761, + 98800, + 98774, + 98760, + 98772, + 98753, + 98749, + 98746, + 98765, + 98760, + 98744, + 98757, + 98780, + 98786, + 98732, + 98738, + 98770, + 98775, + 98736, + 98783, + 98776, + 98726, + 98733, + 98754, + 98767, + 98807, + 98727, + 98764, + 98772, + 98768, + 98761, + 98771, + 98766, + 98773, + 98788, + 98743, + 98725, + 98750, + 98726, + 98755, + 98749, + 98732, + 98785, + 98752, + 98742, + 98760, + 98779, + 98724, + 98741, + 98772, + 98734, + 98740, + 98751, + 98760, + 98736, + 98757, + 98744, + 98734, + 98733, + 98779, + 98767, + 98746, + 98725, + 98752, + 98852, + 98750, + 98735, + 98755, + 98765, + 98746, + 98790, + 98798, + 98728, + 98733, + 98766, + 98752, + 98787, + 98734, + 98954, + 98753, + 98766, + 98741, + 98756, + 98780, + 98752, + 98760, + 98735, + 98783, + 98764, + 98750, + 98761, + 98762, + 98754, + 98752, + 98725, + 98768, + 98752, + 98761, + 98853, + 98797, + 98749, + 98786, + 98734, + 98779, + 98754, + 98735, + 98769, + 98767, + 98749, + 98750, + 98746, + 98730, + 98733, + 98764, + 98770, + 98781, + 98749, + 98768, + 98752, + 98763, + 98757, + 98761, + 98733, + 98779, + 98735, + 98768, + 98722, + 98745, + 98753, + 98758, + 98747, + 98740, + 98773, + 98736, + 98759, + 98769, + 98776, + 98763, + 98758, + 98761, + 98767, + 98743, + 98748, + 98742, + 98718, + 98746, + 98770, + 98792, + 98806, + 98737, + 98731, + 98789, + 98761, + 98791, + 98785, + 98786, + 98720, + 98734, + 98787, + 98746, + 98736, + 98728, + 98737, + 98741, + 98761, + 98761, + 98740, + 98749, + 98758, + 98766, + 98809, + 98756, + 98753, + 98773, + 98817, + 98799, + 98757, + 98738, + 98756, + 98771, + 98767, + 98758, + 98727, + 98736, + 98753, + 98724, + 98746, + 98765, + 98760, + 98765, + 98730, + 98769, + 98774, + 98760, + 98751, + 98756, + 98763, + 98781, + 98740, + 98803, + 98747, + 98808, + 98783, + 98759, + 98749, + 98782, + 98729, + 98777, + 98750, + 98741, + 98782, + 98762, + 98737, + 98755, + 98742, + 98728, + 98721, + 98768, + 98742, + 98749, + 98776, + 98772, + 98727, + 98728, + 98778, + 98758, + 98733, + 98755, + 98729, + 98737, + 98782, + 98756, + 98760, + 98738, + 98780, + 98757, + 98717, + 98773, + 98764, + 98758, + 98754, + 98761, + 98764, + 98749, + 98734, + 98769, + 98726, + 98745, + 98754, + 98797, + 98750, + 98769, + 98737, + 98753, + 98736, + 98764, + 98766, + 98800, + 98744, + 98773, + 98769, + 98756, + 98805, + 98759, + 98722, + 98756, + 98730, + 98780, + 98759, + 98763, + 98741, + 98762, + 98733, + 98760, + 98759, + 98739, + 98728, + 98770, + 98793, + 98740, + 98745, + 98735, + 98733, + 98742, + 98736, + 98772, + 98785, + 98808, + 98745, + 98772, + 98740, + 98777, + 98736, + 98750, + 98759, + 98780, + 98760, + 98746, + 98739, + 98791, + 98756, + 98733, + 98755, + 98739, + 98749, + 98745, + 98789, + 98767, + 98753, + 98753, + 98756, + 98746, + 98737, + 98750, + 98748, + 98748, + 98771, + 98737, + 98752, + 98770, + 98751, + 98761, + 98755, + 98790, + 98749, + 98786, + 98783, + 98729, + 98753, + 98738, + 98765, + 98770, + 98770, + 98753, + 98786, + 98750, + 98761, + 98778, + 98742, + 98749, + 98774, + 98764, + 98746, + 98753, + 98757, + 98744, + 98765, + 98781, + 98779, + 98792, + 98762, + 98742, + 98759, + 98733, + 98739, + 98760, + 98771, + 98741, + 98764, + 98744, + 98754, + 98767, + 98759, + 98764, + 98779, + 98766, + 98748, + 98740, + 98742, + 98758, + 98754, + 98778, + 98728, + 98756, + 98826, + 98765, + 98738, + 98776, + 98741, + 98778, + 98766, + 98748, + 98751, + 98747, + 98728, + 98737, + 98754, + 98754, + 98732, + 98786, + 98757, + 98767, + 98792, + 98725, + 98746, + 98761, + 98758, + 98740, + 98758, + 98796, + 98734, + 98745, + 98717, + 98774, + 98740, + 98764, + 98772, + 98761, + 98732, + 98756, + 98753, + 98757, + 98745, + 98765, + 98758, + 98760, + 98747, + 98754, + 98740, + 98748, + 98725, + 98750, + 98761, + 98763, + 98737, + 98760, + 98751, + 98734, + 98749, + 98744, + 98738, + 98759, + 98755, + 98730, + 98732, + 98767, + 98768, + 98763, + 98732, + 98733, + 98722, + 98739, + 98739, + 98764, + 98765, + 98726, + 98744, + 98725, + 98742, + 98743, + 98756, + 98764, + 98772, + 98740, + 98782, + 98741, + 98774, + 98747, + 98721, + 98772, + 98736, + 98772, + 98742, + 98751, + 98757, + 98773, + 98772, + 98761, + 98747, + 98776, + 98762, + 98741, + 98767, + 98744, + 98792, + 98785, + 98775, + 98767, + 98752, + 98796, + 98749, + 98767, + 98748, + 98737, + 98726, + 98763, + 98727, + 98760, + 98729, + 98794, + 98761, + 98759, + 98752, + 98767, + 98740, + 98743, + 98768, + 98764, + 98739, + 98758, + 98731, + 98773, + 98729, + 98759, + 98764, + 98748, + 98748, + 98735, + 98736, + 98770, + 98728, + 98745, + 98732, + 98732, + 98750, + 98745, + 98760, + 98776, + 98738, + 98745, + 98765, + 98766, + 98770, + 98751, + 99125, + 98748, + 98770, + 98790, + 98725, + 98758, + 98742, + 98760, + 98753, + 98808, + 98770, + 98757, + 98774, + 98758, + 98738, + 98757, + 98739, + 98741, + 98734, + 98732, + 98761, + 98771, + 98732, + 98754, + 98780, + 98751, + 98765, + 98760, + 98730, + 98797, + 98756, + 98775, + 98745, + 98761, + 98745, + 98770, + 98742, + 98756, + 98770, + 98777, + 98728, + 98732, + 98744, + 98732, + 98729, + 98756, + 98717, + 98757, + 98745, + 98741, + 98815, + 98786, + 98761, + 98729, + 98722, + 98773, + 98773, + 98738, + 98714, + 98761, + 98741, + 98787, + 98757, + 98760, + 98766, + 98736, + 98762, + 98762, + 98762, + 98760, + 98725, + 98729, + 98759, + 98735, + 98750, + 98739, + 98770, + 98740, + 98732, + 98743, + 98796, + 98748, + 98747, + 98720, + 98719, + 98745, + 98746, + 98728, + 98773, + 98757, + 98772, + 98749, + 98748, + 98765, + 98724, + 98782, + 98766, + 98787, + 98715, + 98769, + 98764, + 98753, + 98728, + 98759, + 98768, + 98787, + 98731, + 98754, + 98742, + 98728, + 98751, + 98762, + 98754, + 98763, + 98741, + 98769, + 98799, + 98754, + 98740, + 98773, + 98806, + 98780, + 98795, + 98746, + 98733, + 98776, + 98742, + 98776, + 98743, + 98763, + 98718, + 98759, + 98760, + 98730, + 98736, + 98775, + 98731, + 98758, + 98751, + 98735, + 98745, + 98747, + 98737, + 98774, + 98766, + 98745, + 98738, + 98788, + 98757, + 98749, + 98745, + 98741, + 98866, + 98779, + 98791, + 98747, + 98741, + 98778, + 98746, + 98730, + 98754, + 98720, + 98757, + 98731, + 98752, + 98742, + 98769, + 98770, + 98753, + 98768, + 98740, + 98757, + 98721, + 98767, + 98776, + 98732, + 98742, + 98755, + 98738, + 98744, + 98751, + 98728, + 98750, + 98777, + 98731, + 98778, + 98781, + 98777, + 98789, + 98779, + 98790, + 98746, + 98730, + 98773, + 98770, + 98776, + 98761, + 98749, + 98727, + 98779, + 98784, + 98738, + 98767, + 98762, + 98737, + 98780, + 98743, + 98766, + 98725, + 98765, + 98754, + 98745, + 98778, + 98765, + 98749, + 98769, + 98746, + 98731, + 98768, + 98789, + 98766, + 98728, + 98754, + 98775, + 98770, + 98753, + 98796, + 98736, + 98744, + 98719, + 98756, + 98735, + 98756, + 98744, + 98768, + 98754, + 98753, + 98744, + 98747, + 98729, + 98744, + 98736, + 98771, + 98740, + 98769, + 98745, + 98763, + 98778, + 98736, + 98769, + 98788, + 98735, + 98739, + 98733, + 98740, + 98751, + 98737, + 98773, + 98743, + 98733, + 98733, + 98731, + 98733, + 98767, + 98751, + 98720, + 98739, + 98746, + 98765, + 98773, + 98770, + 98758, + 98738, + 98738, + 98739, + 98865, + 98740, + 98738, + 98777, + 98737, + 98738, + 98760, + 98738, + 98738, + 98761, + 98734, + 98757, + 98736, + 98714, + 98741, + 98737, + 98749, + 98761, + 98733, + 98770, + 98733, + 98734, + 98760, + 98739, + 98767, + 98817, + 98734, + 98733, + 98729, + 98793, + 98757, + 98726, + 98740, + 98727, + 98762, + 98757, + 98741, + 98731, + 98728, + 98745, + 98747, + 98738, + 98771, + 98753, + 98771, + 98767, + 98776, + 98759, + 98758, + 98740, + 98775, + 98757, + 98749, + 98752, + 98754, + 98758, + 98772, + 98767, + 98791, + 98783, + 98748, + 98755, + 98752, + 98794, + 98743, + 98778, + 98787, + 98758, + 98757, + 98798, + 98745, + 98740, + 98751, + 98758, + 98736, + 98732, + 98738, + 98768, + 98748, + 98770, + 98745, + 98892, + 98759, + 98760, + 98764, + 98720, + 98770, + 98750, + 98748, + 98783, + 98736, + 98760, + 98760, + 98742, + 98791, + 98764, + 98753, + 98764, + 98741, + 98758, + 98732, + 98753, + 98778, + 98746, + 98725, + 98735, + 98743, + 98746, + 98760, + 98743, + 98771, + 98737, + 98759, + 98749, + 98775, + 98750, + 98748, + 98742, + 98770, + 98739, + 98792, + 98743, + 98732, + 98732, + 98759, + 98726, + 98757, + 98759, + 98733, + 98749, + 98769, + 98749, + 98747, + 98732, + 98743, + 98764, + 98758, + 98779, + 98747, + 98749, + 98741, + 98769, + 98742, + 98731, + 98756, + 98781, + 98733, + 98782, + 98759, + 98754, + 98769, + 98755, + 98727, + 98723, + 98753, + 98763, + 98752, + 98731, + 98760, + 98755, + 98727, + 98739, + 98736, + 98738, + 98729, + 98752, + 98764, + 98770, + 98753, + 98731, + 98763, + 98765, + 98772, + 98760, + 98718, + 98734, + 98743, + 98737, + 98734, + 98745, + 98771, + 98730, + 98749, + 98736, + 98763, + 98744, + 98734, + 98764, + 98750, + 98763, + 98751, + 98730, + 98747, + 98746, + 98734, + 98759, + 98773, + 98762, + 98748, + 98722, + 98787, + 98775, + 98762, + 98740, + 98732, + 98772, + 98735, + 98803, + 98755, + 98762, + 98734, + 98749, + 98745, + 98772, + 98772, + 98786, + 98747, + 98756, + 98779, + 98759, + 98746, + 98782, + 98750, + 98751, + 98724, + 98739, + 98844, + 98772, + 98772, + 98771, + 98758, + 98791, + 98735, + 98775, + 98770, + 98732, + 98739, + 98743, + 98739, + 98758, + 98776, + 98749, + 98733, + 98734, + 98748, + 98728, + 98750, + 98772, + 98738, + 99034, + 98737, + 98753, + 98764, + 98742, + 98748, + 98730, + 98736, + 98731, + 98735, + 98735, + 98737, + 98723, + 98760, + 98732, + 98739, + 98787, + 98748, + 98741, + 98745, + 98746, + 98771, + 98759, + 98754, + 98760, + 98737, + 98794, + 98738, + 98736, + 98727, + 98736, + 98740, + 98753, + 98769, + 98750, + 98733, + 98756, + 98779, + 98738, + 98732, + 98728, + 98758, + 98733, + 98763, + 98735, + 98740, + 98736, + 98777, + 98731, + 98796, + 98736, + 98776, + 98735, + 98768, + 98749, + 98741, + 98772, + 98762, + 98747, + 98754, + 98744, + 98793, + 98741, + 98762, + 98781, + 98749, + 98769, + 98773, + 98762, + 98741, + 98749, + 98747, + 98746, + 98780, + 98728, + 98744, + 98734, + 98729, + 98742, + 98782, + 98771, + 98762, + 98764, + 98755, + 98771, + 98780, + 98784, + 98762, + 98746, + 98762, + 98760, + 98759, + 98723, + 98750, + 98733, + 98730, + 98788, + 98751, + 98755, + 98766, + 98746, + 98768, + 98767, + 98741, + 98743, + 98746, + 98724, + 98747, + 98742, + 98768, + 98749, + 98754, + 98735, + 98723, + 98764, + 98776, + 98762, + 98744, + 98753, + 98747, + 98736, + 98773, + 98745, + 98738, + 98740, + 98750, + 98782, + 98770, + 98749, + 98739, + 98741, + 98744, + 98748, + 98798, + 98733, + 98753, + 98732, + 98768, + 98788, + 98772, + 98746, + 98742, + 98766, + 98760, + 98737, + 98798, + 98725, + 98753, + 98738, + 98743, + 98813, + 98743, + 98726, + 98727, + 98771, + 98822, + 98770, + 98769, + 98729, + 98757, + 98762, + 98728, + 98768, + 98734, + 98746, + 98758, + 98780, + 98757, + 98795, + 98786, + 98798, + 98764, + 98729, + 98745, + 98729, + 98732, + 98740, + 98791, + 98770, + 98775, + 98768, + 98745, + 98758, + 98767, + 98740, + 98740, + 98751, + 98738, + 98743, + 98774, + 98724, + 98738, + 98755, + 98733, + 98722, + 98734, + 98756, + 98763, + 98741, + 98739, + 98741, + 98763, + 98720, + 98749, + 98732, + 98777, + 98739, + 98742, + 98765, + 98754, + 98753, + 98745, + 98732, + 98778, + 98782, + 98743, + 98737, + 98751, + 98742, + 99016, + 98746, + 98742, + 98719, + 98766, + 98747, + 98754, + 98762, + 98771, + 98744, + 98740, + 98732, + 98802, + 98734, + 98748, + 98744, + 98756, + 98722, + 98795, + 98725, + 98755, + 98761, + 98764, + 98764, + 98766, + 98737, + 98731, + 98768, + 98784, + 98786, + 98915, + 98776, + 98755, + 98818, + 98786, + 98776, + 98737, + 98762, + 98759, + 98782, + 98819, + 98748, + 98753, + 98744, + 98731, + 98765, + 98767, + 98730, + 98787, + 98719, + 98732, + 98779, + 98761, + 98726, + 98767, + 98723, + 98758, + 98749, + 98771, + 98786, + 98727, + 98764, + 98746, + 98729, + 98777, + 98743, + 98735, + 98763, + 98761, + 98767, + 98746, + 98728, + 98740, + 98760, + 98761, + 98759, + 98742, + 98740, + 98760, + 98744, + 98745, + 98778, + 98771, + 98723, + 98785, + 98722, + 98777, + 98720, + 98736, + 99053, + 98766, + 98735, + 98773, + 98729, + 98751, + 98749, + 98746, + 98775, + 98755, + 98802, + 98774, + 98754, + 98754, + 98760, + 98764, + 98736, + 98775, + 98752, + 98740, + 98760, + 98776, + 98741, + 98759, + 98776, + 98790, + 98775, + 98773, + 98796, + 98763, + 98751, + 98784, + 98762, + 98754, + 98754, + 98761, + 98778, + 98730, + 98736, + 98747, + 98736, + 98777, + 98802, + 98786, + 98720, + 98737, + 98732, + 98774, + 98728, + 98786, + 98765, + 98734, + 98729, + 98763, + 98760, + 98759, + 98732, + 98753, + 98731, + 98756, + 98740, + 98740, + 98730, + 98735, + 98750, + 98750, + 98733, + 98756, + 98718, + 98752, + 98780, + 98743, + 98721, + 98772, + 98751, + 98736, + 98773, + 98762, + 98751, + 98787, + 98749, + 98771, + 98754, + 98776, + 98729, + 98726, + 98758, + 98724, + 98766, + 98750, + 98732, + 98774, + 98736, + 98771, + 98763, + 98739, + 98735, + 98787, + 98761, + 98761, + 98747, + 98789, + 98720, + 98744, + 98731, + 98730, + 98733, + 98744, + 98736, + 98751, + 98730, + 98792, + 98775, + 98794, + 98773, + 98876, + 98742, + 98773, + 98789, + 98792, + 98778, + 98782, + 98737, + 98753, + 98748, + 98743, + 98755, + 98795, + 98741, + 98765, + 98787, + 98720, + 98739, + 98750, + 98752, + 98742, + 98759, + 98814, + 98730, + 98774, + 98737, + 98738, + 98759, + 98770, + 98733, + 98756, + 98740, + 98752, + 98740, + 98754, + 98751, + 98753, + 98752, + 98767, + 98731, + 98764, + 98752, + 98756, + 98745, + 98741, + 98738, + 98779, + 98740, + 98764, + 98749, + 98759, + 98766, + 98757, + 98735, + 98774, + 98764, + 98745, + 98742, + 98737, + 98752, + 98769, + 98757, + 98760, + 98741, + 98755, + 98748, + 98742, + 98719, + 98767, + 98745, + 98768, + 98769, + 98776, + 98744, + 98751, + 98856, + 98746, + 98789, + 98810, + 98731, + 98738, + 98735, + 98783, + 98758, + 98747, + 98770, + 98730, + 98729, + 98740, + 98767, + 98794, + 98728, + 98739, + 98742, + 98768, + 98768, + 98790, + 98808, + 98762, + 98750, + 98765, + 98780, + 98753, + 98763, + 98756, + 98754, + 98775, + 106512, + 98758, + 98756, + 98717, + 98749, + 98770, + 98734, + 98740, + 98766, + 98747, + 98820, + 98798, + 98757, + 98760, + 98757, + 98732, + 98770, + 98736, + 98739, + 98790, + 98760, + 98768, + 98752, + 98759, + 98753, + 98772, + 98738, + 98745, + 98774, + 98767, + 98736, + 98777, + 98742, + 98739, + 98749, + 98774, + 98764, + 98737, + 98767, + 98780, + 98766, + 98779, + 98774, + 98761, + 98764, + 98754, + 98731, + 98731, + 98743, + 98768, + 98758, + 98755, + 98772, + 98774, + 98757, + 98730, + 98782, + 98741, + 98724, + 98766, + 98732, + 98729, + 98746, + 98731, + 98728, + 98766, + 98759, + 98749, + 98755, + 98791, + 98740, + 98761, + 98722, + 98728, + 98725, + 98739, + 98738, + 98762, + 98754, + 98740, + 98736, + 98740, + 98747, + 98768, + 98738, + 98765, + 98754, + 98743, + 98737, + 98780, + 98741, + 98758, + 98730, + 98770, + 98759, + 98774, + 98751, + 98754, + 98740, + 98758, + 98752, + 98735, + 98730, + 98772, + 98728, + 98725, + 98766, + 98735, + 98793, + 98749, + 98761, + 98738, + 98741, + 98765, + 98766, + 98763, + 98746, + 98762, + 98752, + 98749, + 98750, + 98766, + 98761, + 98797, + 98764, + 98798, + 98764, + 98752, + 98763, + 98783, + 98743, + 98754, + 98751, + 98763, + 98742, + 98779, + 98739, + 98777, + 98737, + 98763, + 98754, + 98753, + 98748, + 98761, + 98754, + 98756, + 98737, + 98760, + 98744, + 98748, + 98730, + 98778, + 98771, + 98758, + 98770, + 98745, + 98770, + 98789, + 98783, + 98744, + 98784, + 98763, + 98766, + 98884, + 98789, + 98796, + 98780, + 98897, + 98758, + 98731, + 98745, + 98729, + 98753, + 98785, + 98727, + 98743, + 98738, + 98762, + 98775, + 98742, + 98745, + 98775, + 98783, + 98758, + 98727, + 98755, + 98769, + 98771, + 98744, + 98741, + 98760, + 98781, + 98734, + 98766, + 99106, + 98770, + 98752, + 98771, + 98762, + 98743, + 98728, + 98752, + 98727, + 98792, + 98728, + 98748, + 98744, + 98741, + 98751, + 98786, + 98769, + 98742, + 98737, + 98749, + 98748, + 98759, + 98733, + 98768, + 98757, + 98735, + 98776, + 98742, + 98770, + 98773, + 98779, + 98755, + 98757, + 98779, + 98782, + 98753, + 98753, + 98765, + 98778, + 98749, + 98776, + 98732, + 98735, + 98753, + 98729, + 98760, + 98769, + 98741, + 98720, + 98772, + 98739, + 98830, + 98793, + 98754, + 98731, + 98728, + 98730, + 98766, + 98763, + 98758, + 98774, + 98738, + 98788, + 98749, + 98762, + 98778, + 98789, + 98781, + 98759, + 98785, + 98766, + 98763, + 98783, + 98737, + 98773, + 98785, + 98751, + 98741, + 98752, + 98760, + 98753, + 98786, + 98787, + 98785, + 98766, + 98752, + 98744, + 98771, + 98737, + 98755, + 98753, + 98758, + 98761, + 98787, + 98767, + 98759, + 98736, + 98751, + 98746, + 98766, + 98727, + 98751, + 98745, + 98737, + 98765, + 98765, + 98770, + 98760, + 98762, + 98732, + 98771, + 98775, + 98733, + 98763, + 98738, + 98744, + 98763, + 98760, + 98746, + 98783, + 98770, + 98755, + 98764, + 98763, + 98748, + 98750, + 98761, + 98760, + 98785, + 98763, + 98771, + 98745, + 98768, + 98749, + 98750, + 98766, + 98742, + 98767, + 98732, + 98748, + 98739, + 98750, + 98762, + 98772, + 98768, + 98725, + 98738, + 98765, + 98899, + 98748, + 98788, + 98755, + 98765, + 98771, + 98745, + 98798, + 98728, + 98745, + 98733, + 98745, + 98742, + 98766, + 98736, + 98741, + 98719, + 98766, + 98705, + 98727, + 98742, + 98727, + 98741, + 98739, + 98723, + 98725, + 98758, + 98723, + 98784, + 98750, + 98730, + 98747, + 98722, + 98741, + 98723, + 98759, + 98785, + 98733, + 98733, + 98724, + 98754, + 98754, + 98738, + 98741, + 98729, + 98732, + 98739, + 98771, + 98758, + 98765, + 98736, + 98745, + 98731, + 98724, + 98753, + 98761, + 98775, + 98745, + 98744, + 98738, + 98742, + 98748, + 98732, + 98799, + 98793, + 98754, + 98756, + 98763, + 98761, + 98799, + 98746, + 98780, + 98751, + 98774, + 98779, + 98754, + 98791, + 98743, + 98761, + 98787, + 98753, + 98756, + 98737, + 98748, + 98792, + 98734, + 98758, + 98734, + 98749, + 98748, + 98788, + 98744, + 98772, + 98756, + 98739, + 98767, + 98798, + 98768, + 98732, + 98732, + 98750, + 98757, + 99130, + 98764, + 98766, + 98729, + 98736, + 98780, + 98775, + 98762, + 98772, + 98783, + 98767, + 98752, + 98749, + 98757, + 98723, + 98734, + 98743, + 98777, + 98758, + 98737, + 98732, + 98747, + 98763, + 98738, + 98749, + 98742, + 98738, + 98787, + 98758, + 98730, + 98727, + 98751, + 98730, + 98770, + 98732, + 98757, + 98725, + 98760, + 98755, + 98764, + 98731, + 98768, + 98761, + 98767, + 98722, + 98729, + 98770, + 98781, + 98750, + 98729, + 98749, + 98738, + 98765, + 98743, + 98727, + 98743, + 98752, + 98757, + 98739, + 98738, + 98781, + 98767, + 98738, + 98742, + 98766, + 98759, + 98783, + 98755, + 98720, + 98749, + 98753, + 98778, + 98748, + 98759, + 98796, + 98792, + 98726, + 98735, + 98765, + 98764, + 98783, + 98754, + 98775, + 98747, + 98726, + 98777, + 98737, + 98741, + 98750, + 98744, + 98745, + 98765, + 98762, + 98741, + 98747, + 98740, + 98754, + 98762, + 98735, + 98756, + 98723, + 98737, + 98740, + 98756, + 98775, + 98747, + 98734, + 98783, + 98765, + 98740, + 98737, + 98779, + 98740, + 98767, + 98743, + 98759, + 98766, + 98773, + 98724, + 98763, + 98731, + 98735, + 98729, + 98753, + 98749, + 98744, + 98726, + 98745, + 98747, + 98756, + 98734, + 98744, + 98768, + 98783, + 98776, + 98735, + 98734, + 98743, + 98734, + 98765, + 98717, + 98726, + 98741, + 98756, + 98753, + 98737, + 98770, + 98743, + 98759, + 98742, + 98725, + 98744, + 98735, + 98740, + 98748, + 98758, + 98742, + 98733, + 98772, + 98755, + 98749, + 98734, + 98733, + 98756, + 98735, + 98955, + 98758, + 98741, + 98769, + 98753, + 98767, + 98748, + 98739, + 98738, + 98757, + 98761, + 98738, + 98771, + 98743, + 98735, + 98757, + 98736, + 98774, + 98732, + 98736, + 98774, + 98733, + 98726, + 98750, + 98746, + 98759, + 98734, + 98754, + 98766, + 98746, + 98799, + 98729, + 98750, + 98787, + 98767, + 98776, + 98838, + 98726, + 98756, + 98730, + 98781, + 98758, + 98746, + 98753, + 98769, + 98717, + 98743, + 98760, + 98748, + 98779, + 98744, + 98720, + 98741, + 98734, + 98739, + 98736, + 98761, + 98730, + 98725, + 98748, + 98730, + 98760, + 98772, + 98732, + 98759, + 98746, + 98733, + 98722, + 98757, + 98746, + 98735, + 98713, + 98747, + 98772, + 98765, + 98723, + 98752, + 98733, + 98729, + 98772, + 98765, + 98747, + 98754, + 98730, + 98735, + 98735, + 98744, + 98715, + 98771, + 98756, + 98746, + 98726, + 98748, + 98764, + 98757, + 98776, + 98744, + 98728, + 98756, + 98730, + 98759, + 98749, + 98728, + 98753, + 98734, + 98757, + 98758, + 98736, + 98774, + 98776, + 98769, + 98753, + 98757, + 98730, + 98749, + 98736, + 98771, + 98721, + 98782, + 98744, + 98751, + 98736, + 98751, + 98763, + 98770, + 98725, + 98739, + 98757, + 98763, + 98736, + 98745, + 98766, + 98742, + 98740, + 98734, + 98735, + 98741, + 98733, + 98736, + 98747, + 98754, + 98750, + 98772, + 98749, + 98741, + 98732, + 98740, + 98761, + 98762, + 98744, + 98789, + 98755, + 98764, + 98761, + 98757, + 98753, + 98755, + 98727, + 98747, + 98729, + 98755, + 98719, + 98721, + 98758, + 98737, + 98757, + 98781, + 98746, + 98771, + 98767, + 98743, + 98717, + 98739, + 98730, + 98777, + 98747, + 98744, + 98774, + 98737, + 98754, + 98742, + 98736, + 98744, + 98758, + 98728, + 98754, + 98742, + 98741, + 98767, + 98747, + 98756, + 98749, + 98780, + 98760, + 98798, + 98751, + 98730, + 98717, + 98743, + 98788, + 98736, + 98726, + 98784, + 98752, + 98740, + 98749, + 98765, + 98752, + 98747, + 98798, + 98785, + 98749, + 98740, + 98772, + 98736, + 98743, + 98759, + 98756, + 98775, + 98750, + 98775, + 98752, + 98766, + 98772, + 98751, + 98738, + 98743, + 98740, + 98757, + 98743, + 98733, + 98769, + 98767, + 98765, + 98765, + 98744, + 98741, + 98761, + 98761, + 98778, + 98746, + 98725, + 98738, + 98759, + 98758, + 98775, + 98766, + 98741, + 98765, + 98722, + 98751, + 98731, + 98750, + 98752, + 98745, + 98757, + 98808, + 98750, + 98801, + 98772, + 98773, + 98758, + 98794, + 98753, + 98768, + 98741, + 98756, + 98766, + 98763, + 98751, + 98787, + 98753, + 98749, + 98736, + 98729, + 98746, + 98755, + 98765, + 98790, + 98768, + 98773, + 98743, + 98751, + 98763, + 98732, + 98757, + 98758, + 98735, + 98738, + 98740, + 98754, + 98748, + 98765, + 98745, + 98756, + 98746, + 98739, + 98728, + 98758, + 98734, + 98765, + 98761, + 98739, + 98778, + 98759, + 98750, + 98780, + 98767, + 98752, + 98776, + 98741, + 98760, + 98737, + 98760, + 98775, + 98782, + 98735, + 98749, + 98763, + 98734, + 98729, + 98732, + 98767, + 98756, + 98766, + 98744, + 98734, + 98739, + 98774, + 98726, + 98731, + 98741, + 98773, + 98739, + 98760, + 98760, + 98742, + 98764, + 98740, + 98783, + 98758, + 98764, + 98767, + 98765, + 98756, + 98773, + 98774, + 98745, + 98780, + 98778, + 98746, + 98759, + 98737, + 98781, + 98776, + 98765, + 98755, + 98735, + 98753, + 98756, + 98770, + 98730, + 98774, + 98739, + 98757, + 98748, + 98761, + 98730, + 98731, + 98760, + 98754, + 98753, + 98744, + 98750, + 98764, + 98719, + 98766, + 98722, + 98774, + 98744, + 98754, + 98736, + 98749, + 98743, + 98739, + 98734, + 98726, + 98714, + 98758, + 98747, + 98764, + 98729, + 98770, + 98715, + 98777, + 98742, + 98734, + 98750, + 98761, + 98729, + 98736, + 98738, + 98756, + 98733, + 98734, + 98735, + 98766, + 98733, + 98733, + 98723, + 98747, + 98741, + 98726, + 98735, + 98742, + 98753, + 98742, + 98791, + 98766, + 98741, + 98757, + 98744, + 98747, + 98783, + 98774, + 98740, + 98728, + 98733, + 98742, + 98741, + 98728, + 98743, + 98741, + 98737, + 98743, + 98752, + 98765, + 98773, + 98773, + 98786, + 98783, + 98775, + 98747, + 98822, + 98758, + 98758, + 98770, + 98772, + 98775, + 98772, + 98766, + 98747, + 98778, + 98717, + 98773, + 98746, + 98767, + 98747, + 98792, + 98760, + 98732, + 98741, + 98752, + 98758, + 98738, + 98782, + 98742, + 98714, + 98753, + 98754, + 98755, + 98730, + 98768, + 98749, + 98753, + 98735, + 98778, + 98748, + 98792, + 98758, + 98738, + 98758, + 98762, + 98721, + 98738, + 98747, + 98779, + 98745, + 98759, + 98735, + 98748, + 98758, + 98753, + 98752, + 98754, + 98758, + 98756, + 98758, + 98755, + 98765, + 98796, + 98772, + 98800, + 98764, + 98735, + 98741, + 98930, + 98736, + 98787, + 98731, + 98739, + 98774, + 98767, + 98753, + 98742, + 98745, + 98723, + 98756, + 98759, + 98755, + 98741, + 98739, + 98736, + 98763, + 98758, + 98744, + 98760, + 98786, + 98727, + 98771, + 98764, + 98724, + 98736, + 99088, + 98719, + 98769, + 98765, + 98722, + 98757, + 98760, + 98760, + 98733, + 98753, + 98723, + 98741, + 98730, + 98727, + 98777, + 98760, + 98803, + 98786, + 98761, + 98757, + 98748, + 98758, + 98741, + 98751, + 98740, + 98725, + 98735, + 98737, + 98772, + 98772, + 98749, + 98734, + 98781, + 98747, + 98761, + 98786, + 98744, + 98753, + 98763, + 98736, + 98763, + 98759, + 98755, + 98760, + 98732, + 98744, + 98727, + 98731, + 98754, + 98744, + 98813, + 98749, + 98775, + 98808, + 98762, + 98749, + 98735, + 98726, + 98752, + 98770, + 98763, + 98728, + 98755, + 98761, + 98722, + 98751, + 98750, + 98757, + 98725, + 98776, + 98747, + 98733, + 98728, + 98758, + 98731, + 98740, + 98744, + 98739, + 98734, + 98771, + 98759, + 98809, + 98712, + 98779, + 98750, + 98747, + 98747, + 98751, + 98756, + 98761, + 98744, + 98747, + 98747, + 98737, + 98714, + 98767, + 98714, + 98727, + 98726, + 98743, + 98792, + 98767, + 98740, + 98751, + 98732, + 98746, + 98745, + 98759, + 98746, + 98757, + 98733, + 98762, + 98750, + 98757, + 98755, + 98765, + 98754, + 98752, + 98770, + 98756, + 98755, + 98742, + 98760, + 98787, + 98753, + 98735, + 98742, + 98721, + 98752, + 98759, + 98746, + 98756, + 98744, + 98760, + 98726, + 98739, + 98746, + 98728, + 98733, + 98724, + 98745, + 98742, + 98747, + 98776, + 98743, + 98778, + 98780, + 98771, + 98774, + 98794, + 98752, + 98756, + 98741, + 98785, + 98795, + 98777, + 98745, + 98728, + 98732, + 98739, + 98730, + 98748, + 98754, + 98740, + 98739, + 98731, + 98735, + 98752, + 98748, + 98764, + 98727, + 98761, + 98746, + 98728, + 98754, + 98744, + 98758, + 98737, + 98737, + 98760, + 98730, + 98740, + 98763, + 98762, + 98759, + 98733, + 98724, + 98728, + 98748, + 98766, + 98736, + 98773, + 98783, + 98738, + 98734, + 98736, + 98777, + 98769, + 98750, + 98756, + 98888, + 98805, + 98739, + 98771, + 98763, + 98753, + 98758, + 98773, + 98750, + 98778, + 98732, + 98734, + 98736, + 98768, + 98783, + 98754, + 98762, + 98761, + 98737, + 98758, + 98728, + 98777, + 98745, + 98748, + 98749, + 98754, + 98749, + 98772, + 98760, + 98737, + 98730, + 98733, + 98766, + 98758, + 98758, + 98739, + 98739, + 98752, + 98766, + 98756, + 98874, + 98741, + 98758, + 98756, + 98712, + 98751, + 98744, + 98728, + 98733, + 98745, + 98762, + 98779, + 98775, + 98730, + 98744, + 98766, + 98753, + 98753, + 98750, + 98731, + 98741, + 98780, + 98735, + 98728, + 98764, + 98743, + 98752, + 98758, + 98763, + 98725, + 98775, + 98762, + 98743, + 98733, + 98761, + 98775, + 98733, + 98726, + 98733, + 98773, + 98857, + 98783, + 98733, + 98748, + 98731, + 98748, + 98725, + 98786, + 98756, + 98726, + 98755, + 98731, + 98777, + 98755, + 98728, + 98776, + 98747, + 98749, + 98758, + 98755, + 98746, + 98781, + 98768, + 98777, + 98757, + 98786, + 98736, + 98761, + 98785, + 98785, + 98748, + 98737, + 98765, + 98732, + 98736, + 98775, + 98778, + 98766, + 98789, + 98748, + 98768, + 98770, + 98732, + 98762, + 98733, + 98730, + 98742, + 98742, + 98732, + 98774, + 98753, + 98780, + 98763, + 98767, + 98749, + 98769, + 98762, + 98790, + 98766, + 98787, + 98740, + 98729, + 98736, + 98755, + 98739, + 98743, + 98754, + 98751, + 98748, + 98745, + 98765, + 98733, + 98724, + 98778, + 98759, + 98758, + 98772, + 98743, + 98732, + 98773, + 98765, + 98759, + 98761, + 98729, + 98746, + 98764, + 98739, + 98733, + 98759, + 98774, + 98740, + 98772, + 98745, + 98774, + 98771, + 98780, + 98723, + 98733, + 98761, + 98734, + 98765, + 98741, + 98725, + 98733, + 98753, + 98729, + 98732, + 98735, + 98761, + 98733, + 98760, + 98737, + 98737, + 98741, + 98745, + 98751, + 98772, + 98764, + 98791, + 98793, + 98753, + 98824, + 98737, + 98728, + 98748, + 98766, + 98745, + 98818, + 98769, + 98730, + 98753, + 98753, + 98729, + 98756, + 98750, + 98747, + 98756, + 98769, + 98723, + 98755, + 98748, + 98742, + 98737, + 98768, + 98739, + 98758, + 98762, + 98745, + 98733, + 98787, + 98747, + 98750, + 98760, + 98736, + 98726, + 98741, + 98784, + 98737, + 98782, + 98741, + 98739, + 98745, + 98734, + 98730, + 98753, + 98742, + 98744, + 98772, + 98725, + 98790, + 98786, + 98743, + 98738, + 98733, + 98734, + 98752, + 98756, + 98778, + 98738, + 98759, + 98731, + 98737, + 98746, + 98740, + 98746, + 98737, + 98742, + 98744, + 98767, + 98738, + 98752, + 98761, + 98734, + 98759, + 98755, + 98728, + 98740, + 98773, + 98753, + 98765, + 98775, + 98777, + 98756, + 98763, + 98749, + 98775, + 98765, + 98735, + 98773, + 98747, + 98755, + 98777, + 98764, + 98748, + 98752, + 98778, + 98781, + 98761, + 98795, + 98765, + 98746, + 98737, + 98742, + 98749, + 98734, + 98725, + 98766, + 98731, + 98725, + 98761, + 98728, + 98737, + 98752, + 98766, + 98771, + 98770, + 98765, + 98747, + 98769, + 98746, + 98734, + 98767, + 98781, + 98752, + 98750, + 98739, + 98785, + 98743, + 98721, + 98732, + 98728, + 98755, + 98734, + 98763, + 98737, + 98734, + 98734, + 98769, + 98795, + 98774, + 98732, + 98750, + 98735, + 98741, + 98749, + 98741, + 98727, + 98766, + 98739, + 98742, + 98765, + 98824, + 98747, + 98748, + 98755, + 98736, + 98762, + 98764, + 98748, + 98753, + 98762, + 98737, + 98725, + 98758, + 98755, + 98735, + 98750, + 98768, + 98718, + 98777, + 98731, + 98746, + 98752, + 98744, + 98782, + 98764, + 98754, + 98760, + 98728, + 98778, + 98733, + 98737, + 98763, + 98725, + 98771, + 98748, + 98762, + 98761, + 98720, + 98762, + 98734, + 98788, + 98750, + 98758, + 98770, + 98771, + 98774, + 98964, + 98788, + 98739, + 98728, + 98775, + 98732, + 98768, + 98731, + 98774, + 98758, + 98784, + 98761, + 98788, + 98751, + 98747, + 98747, + 98737, + 98728, + 98743, + 98764, + 98746, + 98770, + 98756, + 98757, + 98733, + 98748, + 98749, + 98775, + 98763, + 98775, + 98754, + 98770, + 98763, + 98755, + 98782, + 98757, + 98745, + 98752, + 98758, + 98768, + 98760, + 98736, + 98744, + 98723, + 98744, + 98732, + 98756, + 98736, + 98757, + 98746, + 98752, + 98760, + 98741, + 98757, + 98734, + 98788, + 98737, + 98767, + 98739, + 98742, + 98741, + 98742, + 98762, + 98732, + 98761, + 98765, + 98789, + 98757, + 98730, + 98779, + 98780, + 98745, + 98748, + 98746, + 98762, + 98762, + 98788, + 98764, + 98753, + 98879, + 98782, + 98755, + 98796, + 98755, + 98754, + 98761, + 98769, + 98723, + 98747, + 98768, + 98751, + 98771, + 98765, + 98758, + 98787, + 98756, + 98756, + 98727, + 98757, + 98736, + 98771, + 98783, + 98780, + 98737, + 98744, + 98759, + 98759, + 98745, + 98788, + 98730, + 98766, + 98748, + 98737, + 98744, + 98791, + 98725, + 98768, + 98800, + 98741, + 98763, + 98757, + 98738, + 98763, + 98748, + 98726, + 98750, + 98787, + 98755, + 98806, + 98763, + 98754, + 98737, + 98746, + 98749, + 98750, + 98733, + 98759, + 98741, + 98761, + 98747, + 98779, + 98767, + 98780, + 98751, + 98761, + 98728, + 98731, + 98721, + 98750, + 98761, + 98792, + 98729, + 98769, + 98737, + 98736, + 98745, + 98744, + 98776, + 98748, + 98780, + 98750, + 98783, + 98736, + 98736, + 98762, + 98739, + 98742, + 98776, + 98740, + 98727, + 98748, + 98733, + 98734, + 98738, + 98761, + 98773, + 98758, + 98770, + 98737, + 98796, + 98777, + 98779, + 98784, + 98759, + 98745, + 98766, + 98729, + 98752, + 98761, + 98740, + 98742, + 98735, + 98772, + 98730, + 98793, + 98756, + 98741, + 98744, + 98747, + 98738, + 98734, + 98738, + 98764, + 98752, + 98751, + 98779, + 98781, + 98747, + 98740, + 98737, + 98818, + 98749, + 98806, + 98737, + 98765, + 98737, + 98734, + 98748, + 98753, + 98736, + 98732, + 98751, + 98766, + 98730, + 98731, + 98725, + 98744, + 98756, + 98766, + 98777, + 98744, + 98772, + 98756, + 98752, + 98775, + 98766, + 98745, + 98770, + 98779, + 98771, + 98792, + 98730, + 98778, + 98763, + 98814, + 98802, + 98766, + 98731, + 98763, + 98769, + 98776, + 98787, + 98746, + 98739, + 98767, + 98761, + 98735, + 98755, + 98755, + 98740, + 98738, + 98768, + 98791, + 98755, + 98738, + 98709, + 98753, + 98752, + 98737, + 98780, + 98768, + 98745, + 98747, + 98764, + 98736, + 98773, + 98753, + 98717, + 98765, + 98764, + 98731, + 98750, + 98725, + 98753, + 98746, + 98754, + 98751, + 98755, + 98746, + 98758, + 98757, + 98771, + 98732, + 98741, + 98735, + 98757, + 98738, + 98759, + 98794, + 98762, + 98746, + 98756, + 98758, + 98794, + 98755, + 98748, + 98752, + 98744, + 98728, + 98725, + 98750, + 98747, + 98739, + 98736, + 98748, + 98778, + 98769, + 98762, + 98788, + 98719, + 98748, + 98765, + 98753, + 98749, + 98734, + 98743, + 98759, + 98767, + 98788, + 98737, + 98736, + 98733, + 98750, + 98765, + 98742, + 98767, + 98760, + 98743, + 98766, + 98771, + 98738, + 98761, + 98743, + 98748, + 98735, + 98729, + 98768, + 98736, + 98744, + 98751, + 98792, + 98767, + 98742, + 98762, + 98780, + 98752, + 98749, + 98742, + 98770, + 98798, + 98752, + 98757, + 98750, + 98722, + 98744, + 98731, + 98729, + 98757, + 98753, + 98758, + 98774, + 98733, + 98767, + 98737, + 98730, + 98762, + 98766, + 98732, + 98742, + 98738, + 98729, + 98730, + 98737, + 98752, + 98731, + 98760, + 98763, + 98717, + 98762, + 98756, + 98745, + 98730, + 98736, + 98748, + 98769, + 98745, + 98764, + 98724, + 98739, + 98735, + 98778, + 98770, + 98745, + 98721, + 98736, + 98740, + 98757, + 98729, + 98763, + 98736, + 98773, + 98733, + 98759, + 98759, + 98794, + 98774, + 98724, + 98788, + 98776, + 98747, + 98741, + 98736, + 98750, + 98768, + 98758, + 98737, + 98742, + 98757, + 98759, + 98744, + 98746, + 98748, + 98770, + 98742, + 98776, + 98737, + 98724, + 98746, + 98742, + 98715, + 98735, + 98773, + 98748, + 98768, + 98749, + 98758, + 98761, + 98736, + 98778, + 98745, + 98741, + 98772, + 98761, + 98754, + 98746, + 98763, + 98769, + 98732, + 98764, + 98733, + 98742, + 98741, + 98764, + 98766, + 98737, + 98746, + 98724, + 98728, + 98752, + 98728, + 98753, + 98750, + 98741, + 98756, + 98752, + 98768, + 98771, + 98729, + 98759, + 98741, + 98781, + 98743, + 98735, + 98790, + 98744, + 98735, + 98759, + 98720, + 98733, + 98742, + 98729, + 98743, + 98733, + 98735, + 98747, + 98730, + 98735, + 98733, + 98755, + 98796, + 98728, + 98747, + 98740, + 98755, + 98782, + 98760, + 98730, + 98947, + 98727, + 98762, + 98759, + 98752, + 98731, + 98745, + 98729, + 98769, + 98761, + 98726, + 98759, + 98740, + 98738, + 98732, + 98736, + 98733, + 98784, + 98758, + 98730, + 98776, + 98747, + 98742, + 98746, + 98751, + 98745, + 98754, + 98743, + 98806, + 98750, + 98755, + 98786, + 98752, + 98746, + 98745, + 98746, + 98753, + 98753, + 98730, + 98751, + 98721, + 98781, + 98729, + 98764, + 98774, + 98732, + 98767, + 98773, + 98774, + 98735, + 98757, + 98761, + 98754, + 98772, + 98731, + 98733, + 98730, + 98742, + 98735, + 98773, + 98780, + 98784, + 98798, + 98736, + 98730, + 98759, + 98730, + 98747, + 98724, + 98759, + 98742, + 98853, + 98760, + 98739, + 98759, + 98751, + 98730, + 98749, + 98736, + 98745, + 98739, + 98744, + 98732, + 98781, + 98731, + 98751, + 98733, + 98743, + 98784, + 98747, + 98776, + 98745, + 98788, + 98739, + 98731, + 98765, + 98773, + 98776, + 98803, + 98744, + 98736, + 98745, + 98755, + 98746, + 98744, + 98754, + 98725, + 98767, + 98765, + 98740, + 98740, + 98741, + 98735, + 98748, + 98730, + 98747, + 98737, + 98726, + 98755, + 98769, + 98735, + 98743, + 98758, + 98786, + 98746, + 98771, + 98760, + 98751, + 98767, + 98774, + 98741, + 98771, + 98734, + 98760, + 98735, + 98745, + 98753, + 98730, + 98726, + 98749, + 98762, + 98761, + 98727, + 98759, + 98724, + 98767, + 98719, + 98748, + 98748, + 98746, + 98759, + 98752, + 98788, + 98759, + 98732, + 98769, + 98749, + 98775, + 98740, + 98769, + 98733, + 98767, + 98791, + 98761, + 98754, + 98770, + 98765, + 98803, + 98768, + 98756, + 98748, + 98764, + 98769, + 98838, + 98777, + 98741, + 98756, + 98744, + 98991, + 98746, + 98745, + 98754, + 98768, + 98743, + 98728, + 98727, + 98752, + 98737, + 98735, + 98739, + 98738, + 98790, + 98728, + 98733, + 98741, + 98744, + 98737, + 98745, + 98762, + 98727, + 98756, + 98777, + 98732, + 98739, + 98748, + 98764, + 98747, + 98759, + 98728, + 98767, + 98737, + 98745, + 98750, + 98734, + 98746, + 98753, + 98765, + 98755, + 98772, + 98758, + 98735, + 98772, + 98783, + 98742, + 98727, + 98759, + 98737, + 98731, + 98761, + 98762, + 98762, + 98744, + 98756, + 98752, + 98743, + 98734, + 98735, + 98745, + 98762, + 98781, + 98724, + 98768, + 98742, + 98745, + 98753, + 98753, + 98766, + 98738, + 98764, + 98765, + 98741, + 98736, + 98738, + 98734, + 98778, + 98732, + 98729, + 98745, + 98766, + 98739, + 98767, + 98778, + 98742, + 98754, + 98768, + 98733, + 98738, + 98758, + 98766, + 98762, + 98736, + 99111, + 98743, + 98736, + 98738, + 98732, + 98732, + 98738, + 98732, + 98752, + 98809, + 98756, + 98733, + 98754, + 98743, + 98737, + 98734, + 98765, + 98725, + 98742, + 98737, + 98758, + 98740, + 98764, + 98735, + 98739, + 98757, + 98782, + 98738, + 98767, + 98729, + 98739, + 98747, + 98764, + 98744, + 98748, + 98736, + 98746, + 98779, + 98782, + 98737, + 98773, + 98738, + 98768, + 98781, + 98759, + 98733, + 98781, + 98729, + 98726, + 98760, + 98766, + 98758, + 98735, + 98744, + 98766, + 98753, + 98750, + 98740, + 98771, + 98721, + 98741, + 98790, + 98735, + 98746, + 98744, + 98731, + 98736, + 98763, + 98747, + 98735, + 98751, + 98744, + 98750, + 98762, + 98772, + 98757, + 98739, + 98752, + 98738, + 98761, + 98773, + 98743, + 98757, + 98731, + 98737, + 98760, + 98772, + 98770, + 98738, + 98780, + 98727, + 98748, + 98752, + 98769, + 98736, + 98738, + 98764, + 98732, + 98771, + 98727, + 98772, + 98721, + 98749, + 98730, + 98780, + 98733, + 98776, + 98766, + 98742, + 98776, + 98768, + 98730, + 98774, + 98739, + 98741, + 98742, + 98734, + 98750, + 98753, + 98764, + 98742, + 98739, + 98779, + 98780, + 98781, + 98752, + 98763, + 98760, + 98756, + 98745, + 98741, + 98784, + 98753, + 98740, + 98751, + 98745, + 98750, + 98729, + 98736, + 98748, + 98733, + 98747, + 98746, + 98739, + 98753, + 98761, + 98744, + 98791, + 98759, + 98763, + 98770, + 98800, + 98763, + 98729, + 98761, + 98771, + 98734, + 98761, + 98764, + 98722, + 98738, + 98735, + 98770, + 98752, + 98726, + 98729, + 98772, + 98759, + 98742, + 98750, + 98763, + 98741, + 98749, + 98767, + 98774, + 98882, + 98805, + 98778, + 98731, + 98755, + 98735, + 98779, + 98768, + 98724, + 98753, + 98735, + 98769, + 98747, + 98754, + 98725, + 98761, + 98767, + 98746, + 98748, + 98799, + 98747, + 98801, + 98758, + 98729, + 98787, + 98765, + 98750, + 98768, + 98751, + 98748, + 98736, + 98776, + 98742, + 98760, + 98770, + 98736, + 98737, + 98733, + 98756, + 98785, + 98755, + 98740, + 98779, + 98759, + 98757, + 98753, + 98760, + 98759, + 98759, + 98770, + 98743, + 98742, + 98737, + 98766, + 98757, + 98735, + 98758, + 98765, + 98768, + 98758, + 98746, + 98735, + 98740, + 98746, + 98758, + 98735, + 98723, + 98762, + 98726, + 98762, + 98741, + 98722, + 98740, + 98755, + 98731, + 98761, + 98796, + 98774, + 98736, + 98750, + 98753, + 98799, + 98760, + 98730, + 98749, + 98754, + 98788, + 98761, + 98721, + 98732, + 98735, + 98741, + 98734, + 98763, + 98726, + 98732, + 98738, + 98730, + 98762, + 98769, + 98747, + 98773, + 98800, + 98780, + 98765, + 98761, + 98750, + 98758, + 98724, + 98763, + 98738, + 98773, + 98784, + 98733, + 98785, + 98729, + 98744, + 98730, + 98726, + 98753, + 98755, + 98739, + 98729, + 98768, + 98736, + 98744, + 98783, + 98765, + 98735, + 98734, + 98781, + 98740, + 98757, + 98777, + 98770, + 98739, + 98753, + 98736, + 98777, + 98782, + 98768, + 98784, + 98735, + 98748, + 98725, + 98744, + 98726, + 98727, + 98751, + 98777, + 99010, + 98756, + 98767, + 98727, + 98757, + 98750, + 98745, + 98729, + 98717, + 98770, + 98764, + 98790, + 98763, + 98772, + 98746, + 98749, + 98751, + 98731, + 98750, + 98743, + 98746, + 98747, + 98727, + 98769, + 98740, + 98736, + 98758, + 98772, + 98764, + 98750, + 98771, + 98791, + 98752, + 98764, + 98768, + 98757, + 98745, + 98742, + 98741, + 98744, + 98724, + 98740, + 98753, + 98747, + 98769, + 98751, + 98726, + 98736, + 98762, + 98738, + 98986, + 98785, + 98736, + 98739, + 98738, + 98763, + 98748, + 98752, + 98782, + 98752, + 98749, + 98741, + 98788, + 98729, + 98736, + 98749, + 98763, + 98731, + 98757, + 98761, + 98731, + 98729, + 98743, + 98917, + 98760, + 98764, + 98773, + 98762, + 98742, + 98743, + 98762, + 98806, + 98717, + 98762, + 98739, + 98774, + 98760, + 98765, + 98764, + 98746, + 98736, + 98766, + 98764, + 98734, + 98766, + 98761, + 98735, + 98730, + 98721, + 98784, + 98763, + 98762, + 98741, + 98763, + 98731, + 98750, + 98778, + 98761, + 98736, + 98883, + 98754, + 98755, + 98780, + 98760, + 98732, + 98734, + 98728, + 98755, + 98762, + 98746, + 98740, + 98733, + 98749, + 98775, + 98723, + 98761, + 98762, + 98742, + 98740, + 98752, + 98745, + 98747, + 98757, + 98793, + 98737, + 98739, + 98778, + 98760, + 98750, + 98746, + 98760, + 98747, + 98762, + 98773, + 98763, + 98754, + 98752, + 98761, + 98753, + 98760, + 98717, + 98762, + 98730, + 98737, + 98748, + 98764, + 98735, + 98736, + 98729, + 98753, + 98727, + 98751, + 98758, + 98755, + 98741, + 98734, + 98760, + 98753, + 98723, + 98795, + 98731, + 98740, + 98737, + 98738, + 98753, + 98748, + 98727, + 98760, + 98757, + 98800, + 98744, + 98736, + 98740, + 98805, + 98756, + 98759, + 98750, + 98750, + 98743, + 98754, + 98800, + 98742, + 98760, + 98763, + 98736, + 98758, + 98790, + 98730, + 98745, + 98743, + 98733, + 98762, + 98727, + 98774, + 98785, + 98775, + 98738, + 98748, + 98742, + 98738, + 98759, + 98769, + 98767, + 98741, + 98746, + 98770, + 98756, + 98801, + 98722, + 98761, + 98714, + 98736, + 98778, + 98742, + 98828, + 98737, + 98744, + 98769, + 98775, + 98736, + 98731, + 98756, + 98723, + 98744, + 98765, + 98757, + 98743, + 98986, + 98768, + 98765, + 98745, + 98777, + 98746, + 98743, + 98778, + 98748, + 98739, + 98739, + 98716, + 98751, + 98777, + 98729, + 98749, + 98768, + 98744, + 98745, + 98741, + 98759, + 98737, + 98737, + 98753, + 98797, + 98733, + 98773, + 98731, + 98761, + 98787, + 98758, + 98773, + 98737, + 98753, + 98749, + 98767, + 98761, + 98766, + 98746, + 98767, + 98738, + 98767, + 98723, + 98753, + 98727, + 98746, + 98753, + 98726, + 98736, + 98774, + 98754, + 98733, + 98753, + 98754, + 98778, + 98735, + 98741, + 98753, + 98753, + 98738, + 98759, + 98755, + 98763, + 98729, + 98770, + 98731, + 98754, + 98767, + 98752, + 98753, + 98742, + 98739, + 98770, + 98741, + 98770, + 98758, + 98747, + 98742, + 98796, + 98753, + 98751, + 98740, + 98736, + 98829, + 98736, + 98752, + 98763, + 98752, + 98760, + 99447, + 98780, + 98736, + 98744, + 98744, + 98735, + 98771, + 98768, + 98761, + 98750, + 98735, + 98749, + 98740, + 98776, + 98762, + 98763, + 98779, + 98753, + 98787, + 98752, + 98784, + 98765, + 98753, + 98779, + 98786, + 98723, + 98769, + 98763, + 98794, + 98742, + 98757, + 98741, + 98758, + 98731, + 98740, + 98788, + 98759, + 98763, + 98739, + 98791, + 98740, + 98769, + 98721, + 98758, + 98732, + 98728, + 98748, + 98759, + 98724, + 98786, + 98737, + 98758, + 98739, + 98781, + 98756, + 98771, + 98723, + 98768, + 98733, + 98744, + 99284, + 98762, + 98739, + 98786, + 98756, + 98748, + 98762, + 98761, + 98738, + 98777, + 98758, + 98762, + 98766, + 98733, + 98716, + 98730, + 98755, + 98771, + 98742, + 98729, + 98734, + 98746, + 98756, + 98777, + 98744, + 98757, + 98725, + 98756, + 98755, + 98769, + 98902, + 98934, + 98749, + 98762, + 98735, + 98788, + 98722, + 98751, + 98721, + 98731, + 98768, + 98746, + 98743, + 98754, + 98740, + 98731, + 98764, + 98739, + 98749, + 98758, + 98737, + 98726, + 98760, + 98744, + 98740, + 98749, + 98737, + 98740, + 98772, + 98732, + 98734, + 98760, + 98769, + 98752, + 98799, + 98787, + 98754, + 98745, + 98758, + 98739, + 98738, + 98745, + 98725, + 98747, + 98727, + 98737, + 98779, + 98738, + 98750, + 98794, + 98764, + 98763, + 98753, + 98740, + 98740, + 98758, + 98763, + 98733, + 98741, + 98767, + 98720, + 98741, + 98736, + 98776, + 98760, + 98760, + 98724, + 98760, + 98737, + 98751, + 98758, + 98756, + 98747, + 98740, + 98746, + 98752, + 98757, + 98733, + 98740, + 98723, + 98768, + 98742, + 98743, + 98754, + 98737, + 98743, + 98737, + 98753, + 98749, + 98732, + 98769, + 98733, + 98755, + 98755, + 98747, + 98781, + 98726, + 98764, + 98760, + 98761, + 98735, + 98760, + 98750, + 98745, + 98730, + 98732, + 98752, + 98786, + 98758, + 98784, + 98811, + 98766, + 98754, + 98741, + 98735, + 98759, + 98755, + 98740, + 98742, + 99232, + 98795, + 98746, + 98799, + 98756, + 98737, + 98781, + 98729, + 98778, + 98780, + 98769, + 98777, + 98769, + 98751, + 98749, + 98771, + 98754, + 98742, + 98729, + 98737, + 98738, + 98741, + 98775, + 98767, + 98752, + 98739, + 98733, + 98732, + 98734, + 98729, + 98765, + 98805, + 98739, + 98763, + 98764, + 98764, + 98748, + 98742, + 98785, + 98767, + 98796, + 98748, + 98769, + 98723, + 98733, + 98764, + 98735, + 98733, + 98764, + 98742, + 98737, + 98750, + 98725, + 98737, + 98807, + 98727, + 98752, + 98751, + 98752, + 98759, + 98738, + 98739, + 98770, + 98738, + 98744, + 98759, + 98769, + 98743, + 98738, + 98726, + 98735, + 98769, + 98746, + 98727, + 98742, + 98761, + 98767, + 98789, + 98784, + 98788, + 98784, + 98745, + 98745, + 98736, + 98739, + 98826, + 98757, + 98740, + 98758, + 98895, + 98755, + 98780, + 98743, + 98728, + 98726, + 98740, + 98745, + 98730, + 98784, + 98728, + 98740, + 98739, + 98727, + 98771, + 98744, + 98753, + 98732, + 98795, + 98763, + 98802, + 98753, + 98722, + 98750, + 98739, + 98762, + 98762, + 98773, + 98743, + 98756, + 98765, + 98747, + 98752, + 98735, + 98731, + 98754, + 98729, + 98769, + 98730, + 98756, + 98762, + 98761, + 98757, + 98745, + 98740, + 98742, + 98735, + 98755, + 98752, + 98780, + 98748, + 98735, + 98721, + 98732, + 98769, + 98746, + 98761, + 98758, + 98766, + 98780, + 98785, + 98739, + 98756, + 98762, + 98743, + 98754, + 98739, + 98741, + 98753, + 98733, + 98742, + 98772, + 98749, + 98740, + 98792, + 98760, + 98778, + 98754, + 98760, + 98768, + 98776, + 98750, + 98740, + 98737, + 98733, + 98755, + 98737, + 98725, + 98741, + 98758, + 98772, + 98751, + 98727, + 98730, + 98752, + 98745, + 98732, + 98783, + 98738, + 98735, + 98782, + 99110, + 98807, + 98747, + 98773, + 98778, + 98790, + 98742, + 98760, + 98776, + 98789, + 98723, + 98788, + 98762, + 98783, + 98757, + 98771, + 98735, + 98749, + 98733, + 113004, + 98784, + 98732, + 98748, + 98746, + 98771, + 99038, + 98736, + 98771, + 98746, + 98733, + 98773, + 98759, + 98765, + 98772, + 98739, + 98777, + 98737, + 98739, + 98764, + 98742, + 98737, + 98751, + 98766, + 98730, + 98745, + 98806, + 98772, + 98727, + 98782, + 98774, + 98749, + 98764, + 98755, + 98754, + 98734, + 98737, + 98736, + 98738, + 98745, + 98756, + 98751, + 98727, + 98726, + 98761, + 98782, + 98734, + 98775, + 98763, + 98748, + 98764, + 98737, + 98744, + 98745, + 98748, + 98752, + 98743, + 98745, + 98741, + 98794, + 98747, + 98754, + 98724, + 98734, + 98741, + 98730, + 98737, + 98756, + 98741, + 98734, + 98723, + 98773, + 98781, + 98799, + 98747, + 98738, + 98737, + 98742, + 98772, + 98748, + 98736, + 98757, + 98761, + 98730, + 98743, + 98749, + 98729, + 98738, + 98758, + 98742, + 98784, + 98751, + 98754, + 98763, + 98771, + 98759, + 98754, + 98762, + 98737, + 98771, + 98770, + 98750, + 98744, + 98765, + 98753, + 98739, + 98734, + 98746, + 98753, + 98738, + 98772, + 98790, + 98745, + 98760, + 98765, + 98764, + 98746, + 98772, + 98718, + 98798, + 98741, + 98781, + 98740, + 98737, + 98795, + 98728, + 98764, + 98728, + 98752, + 98736, + 98768, + 98768, + 98784, + 98774, + 98741, + 98730, + 98745, + 98764, + 98726, + 98760, + 98748, + 98749, + 98753, + 98737, + 98750, + 98765, + 98740, + 98744, + 98751, + 98753, + 98759, + 98732, + 98729, + 98758, + 98759, + 98728, + 98743, + 98755, + 98761, + 98802, + 98771, + 98760, + 98759, + 98812, + 98806, + 98758, + 98762, + 98737, + 98751, + 98770, + 98790, + 98764, + 98761, + 98727, + 98724, + 98740, + 98775, + 98769, + 98756, + 98753, + 98752, + 98770, + 98779, + 98735, + 98729, + 98762, + 98731, + 98767, + 98731, + 98730, + 98761, + 98731, + 98764, + 98755, + 98756, + 98747, + 98768, + 98775, + 98731, + 98771, + 98754, + 98746, + 98756, + 98751, + 98755, + 98745, + 98763, + 98752, + 98785, + 98741, + 98789, + 98746, + 98745, + 98786, + 98774, + 98775, + 98765, + 98753, + 98808, + 98778, + 98745, + 98728, + 98744, + 98781, + 98776, + 98745, + 98755, + 98726, + 98764, + 98750, + 98732, + 98738, + 98774, + 98754, + 98765, + 98765, + 98735, + 98735, + 98743, + 98768, + 98736, + 98777, + 98754, + 98774, + 98756, + 98747, + 98743, + 98731, + 98756, + 98764, + 98731, + 98734, + 98764, + 98777, + 98755, + 98750, + 98739, + 98760, + 98779, + 98726, + 98761, + 98761, + 98738, + 98750, + 98734, + 98733, + 98724, + 98773, + 98768, + 98749, + 98735, + 98750, + 98781, + 98764, + 98780, + 98772, + 98755, + 98733, + 98737, + 98751, + 98769, + 98762, + 98740, + 98735, + 98758, + 98717, + 98719, + 98755, + 98748, + 98801, + 98725, + 98736, + 98740, + 98743, + 98740, + 98770, + 98755, + 98754, + 98739, + 98744, + 98720, + 98736, + 98789, + 98756, + 98750, + 98749, + 98758, + 98727, + 98749, + 98755, + 98735, + 98744, + 98748, + 98775, + 98730, + 98727, + 98728, + 98724, + 98785, + 98767, + 98733, + 98751, + 98801, + 98737, + 98759, + 98759, + 98757, + 98764, + 98784, + 98751, + 98767, + 98745, + 98731, + 98761, + 98766, + 98755, + 98739, + 98737, + 98784, + 98784, + 98734, + 98737, + 98771, + 98728, + 98726, + 98743, + 98753, + 98767, + 98743, + 98771, + 98740, + 98755, + 98764, + 98736, + 98744, + 98760, + 98720, + 98755, + 98732, + 98756, + 98732, + 98732, + 98764, + 98768, + 98737, + 98730, + 98734, + 98779, + 98732, + 98758, + 98753, + 98733, + 98769, + 98762, + 98776, + 98739, + 98758, + 98750, + 98727, + 98770, + 98742, + 98777, + 98798, + 98774, + 98748, + 98724, + 98728, + 98742, + 98745, + 98754, + 98760, + 98740, + 98768, + 98766, + 98763, + 98771, + 98745, + 98777, + 98732, + 98758, + 98739, + 98751, + 98731, + 98760, + 98727, + 98746, + 98741, + 98761, + 98774, + 98752, + 98728, + 98743, + 98771, + 98764, + 98767, + 98768, + 98742, + 98754, + 98742, + 98739, + 98767, + 98770, + 98721, + 98746, + 98718, + 98761, + 98748, + 98767, + 98743, + 98774, + 98792, + 98762, + 98797, + 98769, + 98753, + 98785, + 98756, + 98781, + 98777, + 98737, + 98777, + 98747, + 98734, + 98767, + 98732, + 98769, + 98726, + 98727, + 98746, + 98730, + 98778, + 98761, + 98730, + 98754, + 98726, + 98732, + 98752, + 98744, + 98723, + 98761, + 98750, + 98739, + 98737, + 98739, + 98732, + 98849, + 98727, + 98761, + 98739, + 98738, + 98766, + 98756, + 98749, + 98728, + 98797, + 98771, + 98757, + 99657, + 98761, + 98749, + 98762, + 98748, + 98760, + 98742, + 98739, + 98779, + 98743, + 98786, + 98744, + 98768, + 98722, + 98724, + 98763, + 98744, + 98778, + 98791, + 98734, + 98777, + 98764, + 98772, + 98729, + 98761, + 98761, + 98740, + 98798, + 98753, + 98751, + 98836, + 98770, + 98732, + 98731, + 98759, + 98748, + 98755, + 98746, + 98769, + 98752, + 98737, + 98729, + 98785, + 98754, + 98749, + 98738, + 98757, + 98728, + 98793, + 98772, + 98766, + 98726, + 98741, + 98724, + 98740, + 98722, + 98814, + 98761, + 98775, + 98737, + 98758, + 98724, + 98785, + 98773, + 98777, + 98746, + 98729, + 98735, + 98749, + 98791, + 98748, + 98772, + 98745, + 98772, + 98745, + 98744, + 98765, + 98729, + 98760, + 98736, + 98733, + 98751, + 98745, + 98737, + 98762, + 98724, + 98729, + 98751, + 98743, + 98733, + 98746, + 98762, + 98745, + 98759, + 98747, + 98741, + 98737, + 98770, + 98751, + 98772, + 98778, + 98726, + 98741, + 98764, + 98739, + 98747, + 98824, + 98754, + 98738, + 98746, + 98729, + 98735, + 98759, + 98740, + 98742, + 98733, + 98733, + 98759, + 98744, + 98747, + 98755, + 98756, + 98727, + 98741, + 98738, + 98785, + 98755, + 98737, + 98763, + 98814, + 98730, + 98718, + 98763, + 98763, + 98758, + 98737, + 98751, + 98730, + 98756, + 98784, + 98728, + 98782, + 98758, + 98762, + 98778, + 98757, + 98735, + 98757, + 98890, + 98741, + 98764, + 98743, + 98755, + 98768, + 98759, + 98726, + 98770, + 98731, + 98724, + 98786, + 98782, + 98746, + 98772, + 98729, + 98774, + 98738, + 98742, + 98733, + 98770, + 98767, + 98747, + 98765, + 98750, + 98765, + 98778, + 98767, + 98732, + 98759, + 98768, + 98743, + 98733, + 98766, + 98771, + 98760, + 98741, + 98759, + 98725, + 98716, + 98742, + 98792, + 98760, + 98731, + 98761, + 98733, + 98771, + 98732, + 98770, + 98732, + 98764, + 98734, + 98757, + 98736, + 98736, + 98777, + 98754, + 98735, + 98733, + 98762, + 98747, + 98764, + 98737, + 98771, + 98737, + 98751, + 98737, + 98739, + 98754, + 98765, + 98758, + 98750, + 98768, + 98775, + 98765, + 98730, + 98758, + 98759, + 98765, + 98735, + 98738, + 98973, + 98776, + 98742, + 98788, + 98740, + 98764, + 98753, + 98732, + 98781, + 98742, + 98751, + 98769, + 98741, + 98767, + 98739, + 98742, + 98722, + 98791, + 98756, + 98768, + 98764, + 98731, + 98736, + 98757, + 98734, + 98738, + 98734, + 98773, + 98775, + 98744, + 98742, + 98758, + 98762, + 98739, + 98782, + 98762, + 98744, + 98725, + 98746, + 98761, + 98730, + 98736, + 98776, + 98758, + 98771, + 98746, + 98768, + 98733, + 98740, + 98764, + 98735, + 98757, + 98769, + 98751, + 98755, + 98751, + 98762, + 98751, + 98754, + 98743, + 98771, + 98746, + 98742, + 98737, + 98724, + 98725, + 98773, + 98738, + 98731, + 98770, + 98765, + 98739, + 98764, + 98753, + 98744, + 98767, + 98765, + 98720, + 98772, + 98765, + 98750, + 98765, + 98762, + 98754, + 98745, + 98729, + 98773, + 98733, + 98778, + 98769, + 98741, + 98741, + 98764, + 98794, + 98767, + 98736, + 98745, + 98781, + 98732, + 98753, + 98749, + 98741, + 98726, + 98764, + 98989, + 98742, + 98797, + 98754, + 98773, + 98775, + 98752, + 98761, + 98751, + 98764, + 98754, + 98756, + 98741, + 98785, + 98762, + 98779, + 98772, + 98772, + 98728, + 98767, + 98744, + 98739, + 98729, + 98735, + 98724, + 98768, + 98714, + 98761, + 98765, + 98737, + 98780, + 98765, + 98724, + 98733, + 98733, + 98762, + 98760, + 98744, + 98757, + 98751, + 98734, + 98749, + 98740, + 98778, + 98720, + 98777, + 98724, + 98750, + 98748, + 98783, + 98739, + 98769, + 98742, + 98763, + 98742, + 98763, + 98736, + 98728, + 98797, + 98783, + 98739, + 98741, + 98746, + 98779, + 98734, + 98774, + 98794, + 98803, + 98775, + 98795, + 98771, + 98731, + 98749, + 98756, + 98742, + 98743, + 98749, + 98796, + 98746, + 98746, + 98785, + 98731, + 98758, + 98791, + 98766, + 98741, + 98731, + 98764, + 98726, + 98765, + 98731, + 98768, + 98755, + 98797, + 98742, + 98738, + 98744, + 98773, + 98735, + 98800, + 98743, + 98805, + 98741, + 98736, + 98736, + 98774, + 98789, + 98776, + 98770, + 98762, + 98742, + 98767, + 98753, + 98741, + 98750, + 98770, + 98755, + 98752, + 98735, + 98727, + 98786, + 98755, + 98740, + 98769, + 98741, + 98735, + 98773, + 98769, + 98725, + 98729, + 98755, + 98746, + 98779, + 98764, + 98746, + 98767, + 98759, + 98753, + 98730, + 98774, + 98752, + 98727, + 98745, + 98762, + 98770, + 98741, + 98738, + 98746, + 98737, + 98772, + 98728, + 98765, + 99185, + 98769, + 98732, + 98759, + 98756, + 98752, + 98744, + 98757, + 98789, + 98753, + 98773, + 98791, + 98777, + 98775, + 98738, + 98784, + 98773, + 98742, + 98786, + 98765, + 98752, + 98798, + 98743, + 98746, + 98735, + 98790, + 98744, + 98778, + 98759, + 98777, + 98759, + 98752, + 98730, + 98749, + 98767, + 98737, + 98753, + 98768, + 98761, + 98757, + 98750, + 98730, + 98741, + 98730, + 98722, + 98733, + 98744, + 98752, + 98745, + 98736, + 98729, + 98778, + 98751, + 98741, + 98751, + 98760, + 98738, + 98751, + 98733, + 98742, + 98747, + 98781, + 98756, + 98738, + 98730, + 98741, + 98775, + 98775, + 98740, + 98742, + 98771, + 98735, + 98755, + 98785, + 98733, + 98811, + 98765, + 98734, + 98725, + 98785, + 98771, + 98743, + 98743, + 98794, + 98750, + 98749, + 98743, + 98740, + 98737, + 98748, + 98743, + 98743, + 98791, + 98774, + 98761, + 98756, + 98743, + 98737, + 98763, + 98745, + 98768, + 98743, + 98738, + 98756, + 98753, + 98720, + 98729, + 98794, + 98750, + 98801, + 98744, + 98964, + 98768, + 98734, + 98733, + 98754, + 98738, + 98757, + 98732, + 98737, + 98736, + 98776, + 98740, + 98761, + 98784, + 98774, + 98734, + 98768, + 98741, + 98761, + 98750, + 98752, + 98724, + 98746, + 98742, + 98755, + 98748, + 98802, + 98753, + 98780, + 98747, + 98759, + 98754, + 98749, + 98730, + 98761, + 98746, + 98781, + 98735, + 98782, + 98782, + 98762, + 98745, + 98735, + 98766, + 98739, + 98752, + 98764, + 98724, + 98765, + 98751, + 98751, + 98728, + 98736, + 98723, + 98757, + 98761, + 98784, + 98766, + 98768, + 98748, + 98770, + 98733, + 98739, + 98740, + 98745, + 98738, + 98752, + 98721, + 98757, + 98745, + 98756, + 98774, + 98766, + 98768, + 98743, + 98728, + 98762, + 98774, + 98745, + 98753, + 98771, + 98739, + 98742, + 98754, + 98766, + 98747, + 98768, + 98720, + 98755, + 98772, + 98836, + 98741, + 98728, + 98738, + 98735, + 98763, + 98724, + 98753, + 98740, + 98756, + 98767, + 98719, + 98737, + 98739, + 98789, + 98723, + 98766, + 98730, + 98730, + 98757, + 98751, + 98730, + 98779, + 98779, + 98782, + 98765, + 98774, + 98721, + 98738, + 98778, + 98729, + 98773, + 98731, + 98750, + 98734, + 98761, + 98750, + 98774, + 98749, + 98717, + 98781, + 98766, + 98760, + 98746, + 98786, + 98723, + 98754, + 98734, + 98739, + 98742, + 98908, + 98748, + 98758, + 98762, + 98766, + 98769, + 98766, + 98726, + 98737, + 98747, + 98734, + 98715, + 98759, + 98726, + 98753, + 98763, + 98740, + 98753, + 98739, + 98741, + 98756, + 98749, + 98758, + 98792, + 99099, + 98756, + 98771, + 98771, + 98745, + 98774, + 98779, + 98745, + 98741, + 98710, + 98759, + 98761, + 98776, + 98735, + 99024, + 98732, + 98753, + 98743, + 98771, + 98759, + 98756, + 98767, + 98756, + 98761, + 98773, + 98733, + 98772, + 98767, + 98745, + 98742, + 98732, + 98732, + 98776, + 98725, + 98750, + 98728, + 98768, + 98790, + 98750, + 98746, + 98762, + 98743, + 98769, + 98739, + 98799, + 98798, + 98760, + 98773, + 98791, + 98744, + 98779, + 98768, + 98760, + 98770, + 98755, + 98776, + 98794, + 98773, + 98771, + 98732, + 98752, + 98726, + 98793, + 98751, + 98780, + 98759, + 98770, + 98725, + 98754, + 98775, + 98727, + 98752, + 98748, + 98745, + 98782, + 98750, + 98795, + 98768, + 98748, + 98732, + 98726, + 98776, + 98757, + 98754, + 98749, + 98738, + 98767, + 98752, + 98739, + 98732, + 98763, + 98768, + 98751, + 98752, + 98734, + 98757, + 98766, + 98733, + 98771, + 98757, + 98771, + 98762, + 98744, + 98770, + 98791, + 98750, + 98758, + 98751, + 98723, + 98763, + 98735, + 98759, + 98735, + 98768, + 98760, + 98739, + 98767, + 98786, + 98742, + 98788, + 98733, + 98727, + 98761, + 98743, + 98749, + 98740, + 98774, + 98766, + 98763, + 98763, + 98766, + 98737, + 98771, + 98740, + 98738, + 98747, + 98765, + 98734, + 98748, + 98766, + 98732, + 98821, + 98769, + 98746, + 98746, + 98737, + 98762, + 98772, + 98767, + 98747, + 98771, + 98732, + 98759, + 98741, + 98746, + 98743, + 98767, + 98722, + 98760, + 98720, + 98750, + 98758, + 98787, + 98739, + 99227, + 98746, + 98767, + 98740, + 98774, + 98731, + 98760, + 98745, + 98745, + 98732, + 98782, + 98731, + 98745, + 98726, + 98752, + 98735, + 98777, + 98737, + 98753, + 98762, + 98750, + 98757, + 98763, + 98760, + 98759, + 98730, + 98736, + 98735, + 98764, + 98741, + 98746, + 98742, + 98784, + 98741, + 98737, + 98769, + 98786, + 98719, + 98737, + 98730, + 98763, + 98731, + 98769, + 98762, + 98745, + 98736, + 98740, + 98720, + 98738, + 98765, + 98740, + 98778, + 98781, + 98732, + 98756, + 98762, + 98724, + 98736, + 98759, + 98711, + 98785, + 98781, + 98767, + 98744, + 98742, + 98717, + 98755, + 98750, + 98743, + 98791, + 98732, + 98728, + 98757, + 98734, + 98734, + 98788, + 98768, + 98727, + 98750, + 98728, + 98760, + 98777, + 98756, + 98736, + 98783, + 98725, + 98761, + 98727, + 98729, + 98777, + 98761, + 98780, + 98761, + 98740, + 98781, + 98737, + 98760, + 98735, + 98721, + 98748, + 98740, + 98739, + 98727, + 98737, + 98748, + 98738, + 98769, + 98755, + 98774, + 98858, + 98725, + 98766, + 98776, + 98750, + 98793, + 98781, + 98766, + 98742, + 98775, + 98724, + 98761, + 98732, + 98753, + 98791, + 98752, + 98725, + 98751, + 98743, + 98741, + 98739, + 98761, + 98729, + 98777, + 98775, + 98781, + 98730, + 98800, + 98754, + 98780, + 98769, + 98742, + 98780, + 98766, + 98733, + 98743, + 98806, + 98746, + 98776, + 98742, + 98734, + 98772, + 98759, + 98731, + 98739, + 98765, + 98767, + 98746, + 98741, + 98735, + 98744, + 98758, + 98753, + 98738, + 98721, + 98723, + 98759, + 98766, + 98731, + 98756, + 98752, + 98761, + 98756, + 98769, + 98734, + 98770, + 98734, + 98765, + 98744, + 98760, + 98758, + 98761, + 98756, + 98764, + 98792, + 98778, + 98752, + 98769, + 98833, + 98738, + 98768, + 98759, + 98732, + 98762, + 98759, + 98778, + 98744, + 98734, + 98747, + 98791, + 98740, + 98755, + 98792, + 98745, + 98721, + 98787, + 98752, + 98743, + 98774, + 98781, + 98725, + 98745, + 98765, + 98753, + 98743, + 98762, + 98741, + 98790, + 98750, + 98761, + 98774, + 98798, + 98764, + 98744, + 98731, + 98753, + 98776, + 98766, + 98768, + 98739, + 98777, + 98779, + 98742, + 98746, + 98745, + 98741, + 98754, + 98758, + 98762, + 98769, + 98748, + 98741, + 98737, + 98756, + 98733, + 98772, + 98733, + 98770, + 98748, + 98731, + 98753, + 98730, + 98744, + 98762, + 98776, + 98740, + 98750, + 98766, + 98771, + 98761, + 98775, + 98726, + 98788, + 98795, + 98724, + 98746, + 98756, + 98726, + 98737, + 98763, + 98783, + 98751, + 98758, + 98736, + 98736, + 98755, + 98794, + 98732, + 98724, + 98744, + 98728, + 98770, + 98727, + 98736, + 98771, + 98748, + 98736, + 98779, + 98754, + 98756, + 98764, + 98735, + 98767, + 98750, + 98744, + 98765, + 98735, + 98769, + 98745, + 98742, + 98723, + 98752, + 98737, + 98734, + 98745, + 98777, + 98743, + 98765, + 98739, + 98743, + 98748, + 98758, + 98737, + 98756, + 98769, + 98738, + 98733, + 98758, + 98762, + 98791, + 98771, + 98738, + 98745, + 98738, + 98752, + 98746, + 98755, + 98736, + 98736, + 107505, + 98760, + 98732, + 98759, + 98773, + 98743, + 98753, + 98772, + 98750, + 98728, + 98759, + 98732, + 98743, + 98737, + 98770, + 98747, + 98733, + 98740, + 98757, + 98757, + 98760, + 98742, + 98768, + 98767, + 98770, + 98734, + 98769, + 98763, + 98757, + 98737, + 98761, + 98750, + 98758, + 98754, + 98756, + 98740, + 98745, + 98766, + 98744, + 98760, + 98732, + 98754, + 98762, + 98726, + 98758, + 98745, + 98767, + 98739, + 98771, + 98748, + 98746, + 98741, + 98778, + 98760, + 98736, + 98740, + 98737, + 98766, + 98741, + 98774, + 98745, + 98772, + 98777, + 98747, + 98736, + 98771, + 98746, + 98761, + 98738, + 98733, + 98748, + 98749, + 98758, + 98726, + 98741, + 98737, + 98756, + 98754, + 98767, + 98751, + 98738, + 98787, + 98781, + 98732, + 98759, + 98755, + 98759, + 98731, + 98774, + 98760, + 98771, + 98769, + 98765, + 98746, + 98749, + 98730, + 98747, + 98770, + 98759, + 98726, + 98739, + 98768, + 98752, + 98731, + 98741, + 98716, + 98721, + 98727, + 98772, + 98793, + 98779, + 98742, + 98728, + 98747, + 98739, + 98755, + 98749, + 98722, + 98738, + 98757, + 98768, + 98745, + 98769, + 98747, + 98768, + 98752, + 98741, + 98730, + 98748, + 98780, + 98741, + 98760, + 98747, + 98736, + 98756, + 98729, + 98747, + 98768, + 98773, + 98732, + 98756, + 98768, + 98757, + 98764, + 98779, + 98746, + 98740, + 98731, + 98753, + 98750, + 98763, + 98750, + 98766, + 98759, + 98781, + 98739, + 98734, + 98763, + 98769, + 98770, + 98757, + 98743, + 98740, + 98728, + 98756, + 98760, + 98754, + 98739, + 98743, + 98751, + 98747, + 98732, + 98748, + 98750, + 98736, + 98737, + 98741, + 98771, + 98738, + 98733, + 99012, + 98720, + 98801, + 98751, + 98763, + 98769, + 98747, + 98761, + 98748, + 98725, + 98752, + 98760, + 98754, + 98738, + 98782, + 98743, + 98772, + 98768, + 98737, + 98783, + 98778, + 98761, + 98721, + 98761, + 98747, + 98740, + 98743, + 98761, + 98783, + 98770, + 98785, + 98776, + 98781, + 98773, + 98781, + 98743, + 98760, + 98726, + 98735, + 98741, + 98741, + 98747, + 98752, + 98750, + 98740, + 98749, + 98738, + 98757, + 98802, + 98776, + 98846, + 98747, + 98735, + 98765, + 98782, + 98793, + 98741, + 98742, + 98765, + 98748, + 98781, + 98732, + 98764, + 98757, + 98762, + 98734, + 98764, + 98729, + 98751, + 98765, + 98765, + 98783, + 98758, + 98769, + 98789, + 98770, + 98770, + 98753, + 98783, + 98766, + 98774, + 98753, + 98729, + 98748, + 98744, + 98747, + 98742, + 98756, + 98769, + 98779, + 98791, + 98731, + 98742, + 98760, + 98762, + 98736, + 98744, + 98734, + 98764, + 98756, + 98744, + 98752, + 98733, + 98734, + 98746, + 98750, + 98743, + 98798, + 98749, + 98784, + 98776, + 98754, + 98749, + 98759, + 98747, + 98758, + 98756, + 98766, + 98758, + 98797, + 98736, + 98774, + 98747, + 98742, + 98764, + 98739, + 98744, + 98767, + 98757, + 98770, + 98759, + 98767, + 98778, + 98741, + 98757, + 98751, + 98754, + 98758, + 98764, + 98741, + 98749, + 98784, + 98738, + 98759, + 98774, + 98765, + 98782, + 98765, + 98767, + 98744, + 98752, + 98793, + 98765, + 98768, + 98770, + 98735, + 98758, + 98733, + 98763, + 98772, + 98755, + 98766, + 98762, + 98723, + 98744, + 98764, + 98771, + 98756, + 98763, + 98758, + 98762, + 98747, + 98733, + 98783, + 98756, + 98767, + 98745, + 98770, + 98767, + 98767, + 98739, + 98776, + 98729, + 98781, + 98735, + 98747, + 98756, + 98766, + 98754, + 98745, + 98747, + 98772, + 98741, + 98761, + 98743, + 98743, + 98769, + 98740, + 98770, + 98752, + 98795, + 98775, + 98750, + 98739, + 98732, + 98750, + 98778, + 98742, + 98786, + 98762, + 98740, + 98738, + 98772, + 98775, + 98778, + 98758, + 98771, + 98749, + 98758, + 98780, + 98741, + 98745, + 98766, + 98732, + 98760, + 98767, + 98760, + 98736, + 98751, + 98739, + 98761, + 98738, + 98761, + 98743, + 98757, + 98727, + 98751, + 98749, + 98742, + 98731, + 98764, + 98717, + 98773, + 98762, + 98725, + 98751, + 98738, + 98737, + 98760, + 98766, + 98748, + 98746, + 98765, + 98722, + 98750, + 98749, + 98756, + 98744, + 98803, + 98754, + 98781, + 98744, + 98730, + 98756, + 98758, + 98781, + 98764, + 98726, + 98743, + 98762, + 98799, + 98752, + 98739, + 98727, + 98733, + 98742, + 98748, + 98752, + 98795, + 98763, + 98745, + 98738, + 98733, + 98768, + 98759, + 98741, + 98750, + 98749, + 98761, + 98780, + 98755, + 98772, + 98732, + 98738, + 98790, + 98756, + 98769, + 98752, + 98741, + 98741, + 98744, + 98742, + 98739, + 98779, + 98751, + 98730, + 98788, + 98754, + 98779, + 98768, + 98753, + 98758, + 98771, + 98767, + 98767, + 98737, + 98742, + 98728, + 98738, + 98782, + 98718, + 98770, + 98770, + 98757, + 98741, + 98771, + 98776, + 98742, + 98771, + 98758, + 98771, + 98745, + 98743, + 98794, + 98741, + 98758, + 98780, + 98755, + 98759, + 98771, + 98755, + 98744, + 98745, + 98736, + 98762, + 98792, + 98762, + 98727, + 98769, + 98744, + 98774, + 98757, + 98765, + 98727, + 98760, + 98733, + 98766, + 98733, + 98741, + 98785, + 98745, + 98769, + 98797, + 98743, + 98742, + 98749, + 98740, + 98761, + 106606, + 98734, + 98733, + 98749, + 98760, + 98733, + 98743, + 98755, + 98733, + 98763, + 98760, + 98743, + 98762, + 98774, + 98740, + 98786, + 98759, + 98754, + 98752, + 98772, + 98779, + 98722, + 98770, + 98760, + 98782, + 98775, + 98776, + 98778, + 98770, + 98738, + 98757, + 98757, + 98739, + 98734, + 98731, + 98757, + 98773, + 98759, + 98734, + 98762, + 98744, + 98752, + 98749, + 98748, + 98749, + 98745, + 98741, + 98730, + 98749, + 98798, + 98764, + 98757, + 98789, + 98756, + 98782, + 98764, + 98777, + 98759, + 98744, + 98777, + 98742, + 98781, + 98765, + 98748, + 98752, + 98763, + 98756, + 98739, + 98736, + 98742, + 98732, + 98737, + 98756, + 98756, + 98743, + 98769, + 98745, + 98747, + 98767, + 98769, + 98762, + 98743, + 98769, + 98773, + 98737, + 98740, + 98739, + 98747, + 98766, + 98767, + 98742, + 98752, + 98764, + 98761, + 98753, + 98729, + 98760, + 98745, + 98731, + 98751, + 98773, + 98771, + 98747, + 98773, + 98730, + 98778, + 98745, + 98759, + 98768, + 98754, + 98746, + 98755, + 98780, + 98725, + 98770, + 98755, + 98732, + 98747, + 98802, + 98751, + 98738, + 98738, + 98761, + 98776, + 98767, + 98742, + 98758, + 98773, + 98745, + 98733, + 98739, + 98775, + 98775, + 98787, + 98752, + 98749, + 98736, + 98763, + 98737, + 98752, + 98751, + 98733, + 98731, + 98769, + 98770, + 98770, + 98742, + 98745, + 98762, + 98724, + 98745, + 98769, + 98738, + 98732, + 98731, + 98742, + 98741, + 98741, + 98735, + 98763, + 98782, + 98773, + 98764, + 98768, + 98750, + 98780, + 98764, + 98744, + 98736, + 98756, + 98739, + 98772, + 98743, + 98745, + 98762, + 98761, + 98751, + 98758, + 98774, + 98757, + 98777, + 98740, + 98762, + 98771, + 98763, + 98747, + 98755, + 98761, + 98779, + 98746, + 98760, + 98735, + 98733, + 98735, + 98762, + 98746, + 98768, + 98744, + 98734, + 98783, + 98755, + 98746, + 98750, + 98731, + 98756, + 98741, + 98743, + 98761, + 98747, + 98786, + 98779, + 98770, + 98784, + 98812, + 98739, + 98763, + 98771, + 98765, + 98736, + 98733, + 98734, + 98772, + 98774, + 98762, + 98763, + 98740, + 98769, + 98747, + 98732, + 98787, + 98741, + 98735, + 98772, + 98753, + 98770, + 98793, + 98754, + 98730, + 98776, + 98759, + 98768, + 98741, + 98738, + 98758, + 98733, + 98748, + 98740, + 98757, + 98736, + 98752, + 98759, + 98748, + 98748, + 98776, + 98748, + 98762, + 98788, + 98753, + 98769, + 98769, + 98742, + 98726, + 98757, + 98757, + 98748, + 98743, + 98761, + 98729, + 98771, + 98773, + 98734, + 98740, + 98742, + 98786, + 98792, + 98749, + 98737, + 98763, + 98741, + 98774, + 98765, + 98772, + 98757, + 98758, + 98770, + 98737, + 98767, + 98727, + 98795, + 98784, + 98763, + 98749, + 98750, + 98750, + 98731, + 98765, + 98734, + 98731, + 98746, + 98780, + 98752, + 98768, + 98729, + 98739, + 98768, + 98759, + 98740, + 98732, + 98775, + 98736, + 98746, + 98781, + 98757, + 98763, + 98763, + 98758, + 98792, + 98755, + 98763, + 98770, + 98741, + 98770, + 98768, + 98776, + 98752, + 98772, + 98730, + 98731, + 98744, + 98805, + 98798, + 98746, + 98731, + 98753, + 98739, + 98750, + 98773, + 98751, + 98759, + 98759, + 98775, + 98786, + 98766, + 98757, + 98770, + 98760, + 98764, + 98795, + 98761, + 98796, + 98753, + 98773, + 98747, + 98751, + 98768, + 98788, + 98744, + 98744, + 98747, + 98769, + 98776, + 98763, + 98758, + 98785, + 98750, + 98782, + 98778, + 98758, + 98739, + 98795, + 98758, + 98758, + 98737, + 98781, + 98733, + 98788, + 98779, + 98778, + 98763, + 98744, + 98754, + 98773, + 98761, + 98745, + 98758, + 98773, + 98769, + 98761, + 98766, + 98740, + 98768, + 98769, + 98754, + 98756, + 98765, + 98742, + 98736, + 98763, + 98740, + 98844, + 98752, + 98742, + 98800, + 98734, + 98779, + 98746, + 98765, + 98728, + 98772, + 98732, + 98762, + 98842, + 98758, + 98730, + 98729, + 98770, + 98726, + 98752, + 98787, + 98764, + 98733, + 98757, + 98751, + 98766, + 98762, + 98769, + 98746, + 98790, + 98740, + 98761, + 98771, + 98773, + 98750, + 98762, + 98745, + 98766, + 98740, + 98760, + 98760, + 98735, + 98729, + 98736, + 98726, + 98729, + 98724, + 98752, + 98739, + 98766, + 98736, + 98759, + 98737, + 98767, + 98757, + 98746, + 98776, + 98749, + 98755, + 98739, + 98750, + 98748, + 98746, + 98736, + 98900, + 98726, + 98757, + 98758, + 98753, + 98782, + 98792, + 98784, + 98779, + 98770, + 98760, + 98752, + 98799, + 98768, + 98735, + 98768, + 98745, + 98760, + 98791, + 98754, + 98737, + 98746, + 98769, + 98746, + 98758, + 98782, + 98738, + 98773, + 98748, + 98775, + 98769, + 98760, + 98756, + 98757, + 98734, + 98769, + 98789, + 98762, + 98747, + 98775, + 98745, + 98770, + 98757, + 98738, + 98732, + 98757, + 98754, + 98725, + 98764, + 98763, + 98747, + 98771, + 98785, + 98737, + 98741, + 98742, + 98733, + 98758, + 98734, + 98740, + 98733, + 98742, + 98729, + 98741, + 98760, + 98728, + 98799, + 98753, + 98738, + 98748, + 98729, + 98771, + 98758, + 98734, + 98763, + 98748, + 98752, + 98757, + 98765, + 98753, + 98728, + 98736, + 98765, + 98739, + 98740, + 98763, + 98743, + 98758, + 98770, + 98763, + 98741, + 98739, + 98734, + 98749, + 98762, + 98747, + 98731, + 98762, + 98733, + 98769, + 98763, + 98777, + 98761, + 98751, + 98756, + 98748, + 98737, + 98731, + 98736, + 98762, + 98733, + 98748, + 98748, + 98743, + 98745, + 98747, + 98747, + 98748, + 98745, + 98736, + 98761, + 98749, + 98731, + 98761, + 98755, + 98770, + 98798, + 98796, + 98768, + 98775, + 98766, + 98769, + 98745, + 98762, + 98736, + 98739, + 98743, + 98739, + 98777, + 98750, + 98758, + 98798, + 98757, + 98748, + 98784, + 98761, + 98731, + 98756, + 98745, + 98778, + 98780, + 98779, + 98752, + 98781, + 98763, + 98771, + 98759, + 98742, + 98771, + 98756, + 98743, + 98754, + 98752, + 98766, + 98759, + 98787, + 98774, + 98766, + 98783, + 98757, + 98713, + 98771, + 98772, + 98747, + 98746, + 98764, + 98735, + 98805, + 98771, + 98739, + 98752, + 98766, + 98753, + 98755, + 98735, + 98874, + 98766, + 98746, + 98768, + 98761, + 98741, + 98785, + 98756, + 98745, + 98755, + 98780, + 98778, + 98770, + 98769, + 98764, + 98795, + 98756, + 98774, + 98756, + 98754, + 98733, + 98722, + 98764, + 98760, + 98734, + 98742, + 98745, + 98775, + 98752, + 98760, + 98755, + 98784, + 98756, + 98756, + 98758, + 98739, + 98731, + 98753, + 98763, + 98740, + 98760, + 99012, + 98791, + 98730, + 98749, + 98760, + 98735, + 98760, + 98764, + 98745, + 98750, + 98758, + 98736, + 98764, + 98748, + 98753, + 98737, + 98746, + 98765, + 98763, + 98750, + 98747, + 98746, + 98732, + 98777, + 98751, + 98734, + 98752, + 98749, + 98757, + 98768, + 98766, + 98751, + 98777, + 98766, + 98751, + 98744, + 98749, + 98745, + 98798, + 98774, + 98731, + 98754, + 98744, + 98762, + 98803, + 98758, + 98722, + 98792, + 98739, + 98761, + 98772, + 98763, + 98734, + 98759, + 98760, + 98772, + 98741, + 98796, + 98767, + 98777, + 98795, + 98723, + 98747, + 98739, + 98737, + 98739, + 98767, + 98736, + 98772, + 98747, + 98771, + 98769, + 98783, + 98739, + 98757, + 99024, + 98744, + 98774, + 98761, + 98755, + 98748, + 98765, + 98746, + 98748, + 98739, + 98753, + 98742, + 98738, + 98759, + 98777, + 98752, + 98747, + 98758, + 98761, + 98728, + 98787, + 98772, + 98730, + 98798, + 98767, + 98735, + 98809, + 98766, + 98719, + 98781, + 98753, + 98759, + 98767, + 98800, + 98737, + 98786, + 98766, + 98770, + 98762, + 98776, + 98746, + 98776, + 98745, + 98721, + 98746, + 98763, + 98764, + 98744, + 98740, + 98752, + 98781, + 98796, + 98800, + 98761, + 98771, + 98767, + 98742, + 98736, + 98750, + 98769, + 98788, + 98771, + 98783, + 98824, + 98783, + 98768, + 98770, + 98758, + 98728, + 98753, + 98743, + 98749, + 98749, + 98754, + 98732, + 98790, + 98734, + 98734, + 98753, + 98744, + 98739, + 98753, + 98737, + 98777, + 98730, + 98732, + 98753, + 98726, + 98760, + 98756, + 98759, + 98731, + 98754, + 98745, + 98729, + 98765, + 98751, + 98778, + 98768, + 98784, + 98759, + 98760, + 98749, + 98773, + 98762, + 98786, + 98756, + 98782, + 98756, + 98751, + 98739, + 98766, + 98759, + 98753, + 98763, + 98758, + 98753, + 98772, + 98744, + 98751, + 98773, + 98758, + 98766, + 98761, + 98784, + 98763, + 98783, + 98736, + 98772, + 98738, + 98736, + 98743, + 98763, + 98733, + 98739, + 98766, + 98741, + 98756, + 98757, + 98743, + 98773, + 98761, + 98764, + 98746, + 98742, + 98788, + 98747, + 98740, + 98746, + 98749, + 98750, + 98729, + 98745, + 98761, + 98744, + 98752, + 98768, + 98729, + 98771, + 98755, + 98762, + 98740, + 98754, + 98745, + 98778, + 98788, + 98782, + 98774, + 98747, + 98757, + 98788, + 98806, + 98747, + 98749, + 98762, + 98729, + 98731, + 98738, + 98732, + 98761, + 98752, + 98737, + 98747, + 98751, + 98774, + 98777, + 98736, + 98755, + 98740, + 98735, + 98744, + 98754, + 98777, + 98732, + 98742, + 98754, + 98794, + 98759, + 98770, + 98751, + 98770, + 98729, + 98786, + 98753, + 98750, + 98742, + 98757, + 98755, + 98739, + 98741, + 98764, + 98725, + 98732, + 98778, + 98736, + 98782, + 98761, + 98769, + 98800, + 98765, + 98783, + 98737, + 98732, + 98753, + 98752, + 98766, + 98725, + 98769, + 98742, + 98766, + 98745, + 98741, + 98719, + 98757, + 98776, + 98735, + 98790, + 98773, + 98738, + 98752, + 98763, + 98753, + 98759, + 98745, + 98805, + 98779, + 98783, + 98736, + 98755, + 98734, + 98771, + 98754, + 98738, + 98745, + 98758, + 98769, + 98772, + 98739, + 98740, + 98756, + 98757, + 98739, + 98746, + 98756, + 98767, + 98756, + 98753, + 98739, + 98754, + 98754, + 98775, + 98761, + 98739, + 98752, + 98741, + 98733, + 98772, + 98749, + 98744, + 98791, + 98742, + 98775, + 98777, + 98748, + 98736, + 98764, + 98769, + 98778, + 98798, + 98741, + 98723, + 98755, + 98751, + 98739, + 98739, + 98737, + 98730, + 98741, + 98802, + 98733, + 98725, + 98749, + 98745, + 98769, + 98768, + 98754, + 98756, + 98772, + 98761, + 98763, + 98724, + 98735, + 98769, + 98745, + 98720, + 98744, + 98738, + 98750, + 98767, + 98755, + 98750, + 98756, + 98726, + 98762, + 98773, + 98772, + 98762, + 98740, + 98755, + 98761, + 98755, + 98727, + 98772, + 98735, + 98770, + 98769, + 98791, + 98761, + 98745, + 98756, + 98774, + 98727, + 98773, + 98739, + 98737, + 98748, + 98743, + 98770, + 98753, + 98737, + 98746, + 98733, + 98733, + 98760, + 98787, + 98743, + 98770, + 98772, + 98732, + 98752, + 98743, + 98755, + 98765, + 98732, + 98778, + 98769, + 98780, + 98742, + 98770, + 98792, + 98799, + 98812, + 98797, + 98749, + 98789, + 98755, + 98736, + 98733, + 98739, + 98799, + 98751, + 98816, + 98738, + 98789, + 98745, + 98811, + 98767, + 98761, + 98749, + 98744, + 98761, + 98734, + 98742, + 98777, + 98739, + 98757, + 98754, + 98739, + 98760, + 98780, + 98739, + 98752, + 98755, + 98742, + 98727, + 98745, + 98805, + 98808, + 98771, + 98725, + 98743, + 98736, + 98752, + 98733, + 98756, + 98733, + 98753, + 98757, + 98726, + 98759, + 98744, + 98765, + 98746, + 98745, + 98753, + 98767, + 98781, + 98725, + 98749, + 98737, + 98741, + 98754, + 98769, + 98735, + 98748, + 98739, + 98778, + 98730, + 98764, + 98787, + 98766, + 98741, + 98738, + 98789, + 98757, + 98731, + 98739, + 98746, + 98757, + 98775, + 98786, + 98736, + 98745, + 98756, + 98729, + 98765, + 98733, + 98738, + 98730, + 98737, + 98736, + 98750, + 98766, + 98756, + 98740, + 98744, + 98778, + 98732, + 98768, + 98773, + 98759, + 98743, + 98734, + 98775, + 98746, + 98752, + 98738, + 98748, + 98747, + 98740, + 98728, + 98735, + 98760, + 98774, + 98753, + 98755, + 98761, + 98726, + 98739, + 98765, + 98767, + 98753, + 98729, + 98745, + 98748, + 98761, + 98769, + 98744, + 98737, + 98738, + 98733, + 98773, + 98786, + 98783, + 98736, + 98728, + 98770, + 98731, + 98767, + 98759, + 98764, + 98743, + 98730, + 98735, + 98765, + 98747, + 98763, + 98732, + 98743, + 98765, + 98773, + 98755, + 98767, + 98764, + 98732, + 98772, + 98791, + 98785, + 98759, + 98778, + 98731, + 98760, + 98761, + 98733, + 98752, + 98761, + 98733, + 98749, + 98731, + 98764, + 98735, + 98756, + 98761, + 98798, + 98770, + 98740, + 98743, + 98725, + 98737, + 98725, + 98751, + 98741, + 98767, + 98736, + 98779, + 98751, + 98757, + 98771, + 98750, + 98773, + 98730, + 98754, + 98762, + 98745, + 98757, + 98737, + 98751, + 98734, + 98737, + 98750, + 98773, + 98763, + 98747, + 98758, + 98784, + 98784, + 98737, + 98738, + 98742, + 98746, + 98753, + 98769, + 98770, + 98779, + 98739, + 98765, + 98760, + 98759, + 98750, + 98759, + 98729, + 98755, + 98730, + 98736, + 98751, + 98751, + 98728, + 98810, + 98731, + 98821, + 98768, + 98733, + 98739, + 98763, + 98736, + 98752, + 98750, + 98766, + 98744, + 98724, + 98735, + 98772, + 98731, + 98758, + 98752, + 98746, + 98754, + 98746, + 98784, + 98786, + 98747, + 98746, + 98738, + 98733, + 98780, + 98742, + 98754, + 98769, + 98744, + 98740, + 98760, + 98742, + 98768, + 98779, + 98736, + 98746, + 98765, + 98762, + 98733, + 98771, + 98765, + 98778, + 98755, + 98750, + 98745, + 98770, + 98723, + 98740, + 98763, + 98726, + 98763, + 98777, + 98769, + 98775, + 98757, + 98735, + 98735, + 98744, + 98736, + 98750, + 98730, + 98739, + 98748, + 98753, + 98738, + 98743, + 98752, + 98742, + 98755, + 98770, + 98748, + 98741, + 98784, + 98724, + 98758, + 98746, + 98748, + 98751, + 98728, + 98771, + 98742, + 98796, + 98761, + 98740, + 98737, + 98755, + 98745, + 98772, + 98787, + 98725, + 98756, + 98750, + 98760, + 98777, + 98751, + 98745, + 98756, + 98744, + 98736, + 98757, + 98740, + 98784, + 98753, + 98762, + 98742, + 98747, + 98752, + 98733, + 98777, + 98762, + 98742, + 98734, + 98745, + 98771, + 98757, + 98761, + 98742, + 98756, + 98734, + 98738, + 98731, + 98781, + 98787, + 98787, + 98738, + 98797, + 98763, + 98768, + 98731, + 98771, + 98774, + 98752, + 98764, + 98768, + 98743, + 98777, + 98769, + 98754, + 98733, + 98732, + 98724, + 98782, + 98733, + 98755, + 98762, + 98770, + 98742, + 98736, + 98749, + 98754, + 98776, + 98787, + 98756, + 98775, + 98785, + 98785, + 98765, + 98757, + 98755, + 98736, + 98740, + 98738, + 98755, + 98743, + 98763, + 98735, + 98776, + 98756, + 98765, + 98764, + 98773, + 98767, + 98767, + 98750, + 98770, + 98741, + 98743, + 98756, + 98762, + 98776, + 98778, + 98756, + 98782, + 98794, + 98755, + 98755, + 98759, + 98754, + 98764, + 98735, + 98760, + 98780, + 98743, + 98728, + 98728, + 98735, + 98739, + 98755, + 98788, + 98763, + 98761, + 98760, + 98740, + 98748, + 98762, + 98777, + 98757, + 98767, + 98722, + 98759, + 98773, + 98765, + 98792, + 98802, + 98729, + 98781, + 98774, + 98755, + 98742, + 98765, + 98754, + 98780, + 98757, + 98738, + 98743, + 98762, + 98736, + 98737, + 98749, + 98757, + 98744, + 98738, + 98779, + 98771, + 98737, + 98779, + 98738, + 98733, + 98724, + 98758, + 98736, + 98783, + 98770, + 98754, + 98776, + 98756, + 98759, + 98761, + 98749, + 98743, + 98735, + 98727, + 98748, + 98728, + 98733, + 98734, + 98743, + 98744, + 98739, + 98746, + 98767, + 98755, + 98766, + 98767, + 98787, + 98769, + 98755, + 98737, + 98740, + 98762, + 98752, + 98743, + 98798, + 98768, + 98745, + 98756, + 98756, + 98740, + 98760, + 98791, + 98773, + 98764, + 98757, + 98763, + 98785, + 98756, + 98780, + 98737, + 98769, + 98778, + 98781, + 98742, + 98763, + 98759, + 98760, + 98767, + 98736, + 98736, + 98774, + 98752, + 98748, + 98756, + 98765, + 98746, + 98753, + 98763, + 98760, + 98731, + 98764, + 98770, + 98730, + 98746, + 98760, + 98738, + 98733, + 98762, + 98739, + 98776, + 98738, + 98732, + 98730, + 98777, + 98724, + 98757, + 98730, + 98763, + 98739, + 98738, + 98727, + 98757, + 98764, + 98779, + 98742, + 98733, + 98739, + 98762, + 98763, + 98727, + 98764, + 98766, + 98755, + 98762, + 98789, + 98750, + 98745, + 98761, + 98768, + 98736, + 98768, + 98769, + 98750, + 98766, + 98729, + 98764, + 98753, + 98768, + 98758, + 98765, + 98741, + 98774, + 98754, + 98950, + 98758, + 98802, + 98729, + 98739, + 98756, + 98732, + 98736, + 98804, + 98730, + 98751, + 98751, + 98754, + 98748, + 98758, + 98728, + 98757, + 98756, + 98774, + 98750, + 98777, + 98748, + 98760, + 98764, + 98755, + 98755, + 98770, + 98788, + 98756, + 98734, + 98750, + 98766, + 98732, + 98757, + 98724, + 98776, + 98759, + 98720, + 98756, + 98730, + 98729, + 98760, + 98766, + 98756, + 98764, + 98733, + 98730, + 98746, + 98738, + 98763, + 98750, + 98762, + 98756, + 98774, + 98763, + 98739, + 98773, + 98770, + 98741, + 98763, + 98770, + 98809, + 98736, + 98748, + 98749, + 98735, + 98740, + 98762, + 98765, + 98733, + 98805, + 98754, + 98778, + 98747, + 98772, + 98809, + 98794, + 98744, + 98734, + 98756, + 98739, + 98740, + 98739, + 98749, + 98762, + 98776, + 98737, + 98759, + 98776, + 98779, + 98742, + 98761, + 98772, + 98759, + 98762, + 98775, + 98756, + 98744, + 98763, + 98775, + 98757, + 98774, + 98773, + 98767, + 98764, + 98722, + 98783, + 98742, + 98742, + 98751, + 98757, + 98736, + 98750, + 98737, + 98729, + 98771, + 98753, + 98738, + 98759, + 98805, + 98762, + 98730, + 98801, + 98763, + 98751, + 98771, + 98781, + 98743, + 98748, + 98732, + 98758, + 98739, + 98735, + 98741, + 98772, + 98755, + 98756, + 98743, + 98742, + 98772, + 98740, + 98771, + 98757, + 98762, + 98763, + 98800, + 98747, + 98725, + 98740, + 98771, + 98730, + 98765, + 98768, + 98743, + 98732, + 98741, + 98739, + 98746, + 98741, + 98786, + 98769, + 98766, + 98737, + 98767, + 98741, + 98734, + 98765, + 98744, + 98746, + 98774, + 98776, + 98737, + 98768, + 98766, + 98782, + 98813, + 98767, + 98736, + 98768, + 98758, + 98753, + 98739, + 98751, + 98732, + 98739, + 98774, + 98748, + 98738, + 98808, + 98749, + 98754, + 98783, + 98743, + 98731, + 98762, + 98742, + 98785, + 98744, + 98749, + 98778, + 98776, + 98764, + 98739, + 98739, + 98733, + 98771, + 98761, + 98770, + 98774, + 98769, + 98915, + 98743, + 98756, + 98730, + 98776, + 98763, + 98731, + 98746, + 98746, + 98724, + 98730, + 98742, + 98755, + 98754, + 98763, + 98730, + 98783, + 98773, + 98760, + 98805, + 98748, + 98716, + 98761, + 98769, + 98740, + 98731, + 98780, + 98758, + 98779, + 98767, + 98768, + 98776, + 98800, + 98728, + 98764, + 98730, + 98735, + 98742, + 99018, + 98738, + 98774, + 98742, + 98758, + 98745, + 98761, + 98747, + 98777, + 98747, + 98734, + 98762, + 98729, + 98744, + 98778, + 98758, + 98733, + 98723, + 98764, + 98723, + 98770, + 98752, + 98768, + 98736, + 98764, + 98761, + 98770, + 98768, + 98731, + 98727, + 98771, + 98748, + 98773, + 98777, + 98757, + 98739, + 98770, + 98769, + 98786, + 98743, + 98754, + 98760, + 98739, + 98756, + 98749, + 98766, + 98745, + 98759, + 98773, + 98763, + 98777, + 98769, + 98733, + 98749, + 98738, + 98733, + 98771, + 98752, + 98759, + 98758, + 98745, + 98739, + 98735, + 98761, + 98764, + 98764, + 98761, + 98744, + 98796, + 98764, + 98769, + 98745, + 98754, + 98724, + 98782, + 98762, + 98769, + 98769, + 98764, + 98730, + 98775, + 98769, + 98739, + 98767, + 98744, + 98716, + 98741, + 98758, + 98738, + 98745, + 98748, + 98770, + 98759, + 98757, + 98752, + 98753, + 98772, + 98727, + 98743, + 98768, + 98736, + 98735, + 98784, + 98722, + 98786, + 98735, + 98756, + 98771, + 98755, + 98740, + 98751, + 98753, + 98788, + 98734, + 98773, + 98732, + 98762, + 98744, + 98735, + 98751, + 98797, + 98750, + 98811, + 98727, + 98749, + 98737, + 98743, + 98758, + 98770, + 98748, + 98734, + 98760, + 98772, + 98777, + 98741, + 98779, + 98755, + 98780, + 98759, + 98771, + 98748, + 98787, + 98745, + 98741, + 98783, + 98732, + 98765, + 98763, + 98739, + 98764, + 98758, + 98746, + 98749, + 98743, + 98726, + 98766, + 98778, + 98779, + 98770, + 98795, + 98759, + 98723, + 98753, + 98745, + 98742, + 98774, + 98740, + 98743, + 98731, + 98732, + 98752, + 98778, + 98739, + 98769, + 98734, + 98749, + 98786, + 98767, + 98746, + 98748, + 98766, + 98742, + 98766, + 98763, + 98756, + 98745, + 98739, + 98738, + 98742, + 98762, + 98733, + 98747, + 98773, + 98749, + 98732, + 98819, + 98735, + 98740, + 98775, + 98746, + 98763, + 98777, + 98767, + 98739, + 98725, + 98753, + 98785, + 98783, + 98731, + 98763, + 98762, + 98740, + 98739, + 98748, + 98755, + 98784, + 98762, + 98782, + 98753, + 98748, + 98735, + 98767, + 98735, + 98769, + 98775, + 98851, + 98777, + 98750, + 98757, + 98741, + 98755, + 98768, + 98726, + 98745, + 98765, + 98731, + 98760, + 98750, + 98740, + 98762, + 98738, + 98748, + 98750, + 98743, + 98755, + 98755, + 98757, + 98750, + 98775, + 98746, + 98770, + 98740, + 98741, + 98743, + 98759, + 98737, + 98739, + 98758, + 98746, + 98772, + 98756, + 98759, + 98776, + 98766, + 98739, + 98739, + 98741, + 98790, + 98739, + 98732, + 98739, + 98718, + 98769, + 98749, + 98743, + 98787, + 98776, + 98773, + 98776, + 98725, + 98764, + 98760, + 98738, + 98732, + 98764, + 98731, + 98739, + 98768, + 98735, + 98739, + 98759, + 98779, + 98746, + 98800, + 98779, + 98762, + 98745, + 98751, + 98752, + 98747, + 98777, + 98746, + 98752, + 98731, + 98740, + 98786, + 98763, + 98775, + 98749, + 98750, + 98767, + 98742, + 98753, + 98759, + 98724, + 98745, + 98772, + 98737, + 98735, + 98754, + 98753, + 98762, + 98731, + 98749, + 98788, + 98779, + 98755, + 98745, + 98775, + 98737, + 98748, + 98741, + 98743, + 98750, + 98764, + 98739, + 98767, + 98723, + 98807, + 98760, + 98740, + 98767, + 98756, + 98725, + 98768, + 98738, + 98744, + 98740, + 98767, + 98734, + 98767, + 98784, + 98768, + 98766, + 98755, + 98738, + 98742, + 98728, + 98760, + 98779, + 98746, + 98762, + 98746, + 98732, + 98764, + 98753, + 98730, + 98766, + 98734, + 98744, + 98758, + 98757, + 98801, + 98742, + 98759, + 98758, + 98788, + 98754, + 98755, + 98753, + 98808, + 98758, + 98753, + 98760, + 98737, + 98729, + 98752, + 98727, + 98750, + 98732, + 98767, + 98784, + 98766, + 98756, + 98776, + 98792, + 98736, + 98745, + 98758, + 98773, + 98764, + 98749, + 98771, + 98728, + 98761, + 98730, + 98751, + 98741, + 98774, + 98733, + 98921, + 98785, + 98740, + 98738, + 98735, + 98800, + 98754, + 98761, + 98743, + 98747, + 98748, + 98725, + 98771, + 98760, + 98765, + 98754, + 98756, + 98743, + 98770, + 98775, + 98735, + 98777, + 98773, + 98759, + 98770, + 98746, + 98755, + 98754, + 98780, + 98739, + 98767, + 98733, + 98771, + 98757, + 98749, + 98741, + 98767, + 98758, + 98760, + 98762, + 98765, + 98751, + 98780, + 98763, + 98733, + 98743, + 98742, + 98727, + 98767, + 98762, + 98744, + 98756, + 98765, + 98761, + 98781, + 98740, + 98759, + 98738, + 98743, + 98752, + 98759, + 98788, + 98774, + 98743, + 98751, + 98781, + 98762, + 98781, + 98754, + 98768, + 98740, + 98747, + 98741, + 98748, + 98763, + 98756, + 98772, + 98768, + 98751, + 98728, + 98743, + 98731, + 98737, + 98733, + 98758, + 98737, + 98742, + 98743, + 98782, + 98757, + 98798, + 98742, + 98741, + 98785, + 98760, + 98728, + 98766, + 98779, + 98759, + 98764, + 98756, + 98742, + 98794, + 98763, + 98749, + 98761, + 98770, + 98745, + 98746, + 98748, + 98745, + 98775, + 98760, + 98758, + 98789, + 98766, + 98756, + 98755, + 98774, + 98734, + 98791, + 98757, + 98740, + 98787, + 98774, + 98742, + 98762, + 98771, + 98722, + 98743, + 98747, + 98729, + 98771, + 98759, + 98735, + 98786, + 98737, + 98751, + 98769, + 98738, + 98747, + 98752, + 98741, + 98735, + 98763, + 98764, + 98764, + 98784, + 98744, + 98760, + 98770, + 98729, + 98737, + 98769, + 98762, + 98754, + 98776, + 98783, + 98738, + 98752, + 98748, + 98745, + 98763, + 98749, + 98753, + 98740, + 98754, + 98718, + 98731, + 98754, + 98793, + 98772, + 98743, + 98797, + 98761, + 98758, + 98752, + 98730, + 98728, + 98756, + 98762, + 98800, + 98739, + 98760, + 98757, + 98761, + 98772, + 98730, + 98784, + 98753, + 98750, + 98773, + 98785, + 98760, + 98765, + 98761, + 98758, + 98771, + 98772, + 98755, + 98737, + 98754, + 98754, + 98739, + 98768, + 98733, + 98749, + 98733, + 98729, + 98748, + 98763, + 98774, + 98765, + 98749, + 98763, + 98744, + 98732, + 98751, + 98773, + 98760, + 98752, + 98757, + 98781, + 98739, + 98757, + 98746, + 98756, + 98742, + 98746, + 98743, + 98788, + 98730, + 98736, + 98784, + 98765, + 98778, + 98771, + 98744, + 98758, + 98731, + 98771, + 98791, + 98805, + 98769, + 98754, + 98745, + 98773, + 98756, + 98744, + 98738, + 98770, + 98754, + 98757, + 98743, + 98770, + 98764, + 98737, + 98735, + 98759, + 98743, + 98741, + 98746, + 98733, + 98734, + 98751, + 98751, + 98767, + 98800, + 98800, + 98759, + 98748, + 98761, + 98748, + 98757, + 98780, + 98752, + 98739, + 98743, + 98781, + 98778, + 98803, + 98735, + 98766, + 98776, + 98777, + 98734, + 98761, + 98735, + 98747, + 98734, + 98772, + 98745, + 98741, + 98758, + 98761, + 98752, + 98739, + 98767, + 98747, + 98761, + 98762, + 98778, + 98769, + 98768, + 98732, + 98754, + 98754, + 98764, + 98924, + 98830, + 98739, + 98747, + 98756, + 98728, + 98727, + 98748, + 98742, + 98732, + 98792, + 98757, + 98744, + 98761, + 98764, + 98760, + 98753, + 98773, + 98746, + 98734, + 98750, + 98708, + 98782, + 98744, + 98752, + 98804, + 98766, + 98730, + 98756, + 98769, + 98742, + 98788, + 98782, + 98779, + 98771, + 98758, + 98768, + 98795, + 98772, + 98789, + 98782, + 98773, + 98768, + 98790, + 98742, + 98776, + 98761, + 98744, + 98740, + 98778, + 98739, + 98967, + 98733, + 98761, + 98766, + 98768, + 98739, + 98760, + 98754, + 98749, + 98748, + 98759, + 98746, + 98757, + 98737, + 98753, + 98750, + 98749, + 98764, + 98763, + 98749, + 98796, + 98772, + 98786, + 98761, + 98756, + 98792, + 98769, + 98756, + 98736, + 98745, + 98800, + 98780, + 98774, + 98736, + 98762, + 98753, + 98768, + 98767, + 98776, + 98727, + 98755, + 98771, + 98757, + 98768, + 98771, + 98781, + 98780, + 98731, + 98766, + 98763, + 98754, + 98762, + 98747, + 98767, + 98750, + 98766, + 98759, + 98752, + 98758, + 98774, + 98769, + 98771, + 98762, + 98732, + 98737, + 98731, + 98752, + 98739, + 98773, + 98726, + 98737, + 98741, + 98745, + 98766, + 98788, + 98758, + 98738, + 98784, + 98727, + 98749, + 98730, + 98736, + 98741, + 98745, + 98724, + 98764, + 98753, + 98741, + 98736, + 98763, + 98740, + 98772, + 98761, + 98797, + 98755, + 98737, + 98762, + 98736, + 98739, + 98724, + 98797, + 98722, + 98746, + 98726, + 98739, + 98741, + 98759, + 98745, + 98728, + 98769, + 98749, + 98743, + 98743, + 98768, + 98743, + 98736, + 98778, + 98765, + 98744, + 98733, + 98750, + 98760, + 98773, + 98762, + 99131, + 98790, + 98724, + 98731, + 98750, + 98759, + 98729, + 98751, + 98736, + 98755, + 98746, + 98747, + 98747, + 98743, + 98782, + 98745, + 98752, + 98769, + 98758, + 98739, + 98773, + 98750, + 98765, + 98762, + 98790, + 98763, + 98770, + 98741, + 98741, + 98733, + 98752, + 98777, + 98765, + 98758, + 98764, + 98749, + 98793, + 98776, + 98788, + 98754, + 98764, + 98758, + 98767, + 98772, + 98746, + 98751, + 98733, + 98743, + 98742, + 98770, + 98729, + 98817, + 98775, + 98742, + 98755, + 98763, + 98738, + 98763, + 98787, + 98764, + 98728, + 98750, + 98779, + 98739, + 98755, + 98754, + 98734, + 98757, + 98742, + 98788, + 98770, + 98763, + 98752, + 98744, + 98740, + 98790, + 98749, + 98757, + 98732, + 98772, + 98781, + 98739, + 98748, + 98768, + 98725, + 98750, + 98723, + 98760, + 98747, + 98748, + 98771, + 98731, + 98772, + 98752, + 98775, + 98739, + 98762, + 98745, + 98763, + 99150, + 98780, + 98729, + 98760, + 98740, + 98768, + 98764, + 98757, + 98739, + 98784, + 98731, + 98757, + 98762, + 98760, + 98750, + 98739, + 98744, + 98727, + 98748, + 98743, + 98764, + 98797, + 98767, + 98785, + 98766, + 98802, + 98782, + 98791, + 98774, + 98773, + 98769, + 98755, + 98742, + 98777, + 98793, + 98776, + 98752, + 98754, + 98770, + 98752, + 98742, + 98757, + 98747, + 98760, + 98750, + 98765, + 98791, + 98743, + 98773, + 98781, + 98738, + 98796, + 98743, + 98744, + 98748, + 98747, + 98728, + 98745, + 98758, + 98722, + 98753, + 98743, + 98746, + 98768, + 98776, + 98763, + 98753, + 98753, + 98780, + 98780, + 98796, + 98791, + 98789, + 98774, + 98742, + 98774, + 98754, + 98779, + 98740, + 98740, + 98762, + 98766, + 98764, + 98743, + 98766, + 98752, + 98774, + 98750, + 98750, + 98737, + 98780, + 98766, + 98751, + 98744, + 98764, + 98728, + 98759, + 98755, + 98734, + 98742, + 98765, + 98753, + 98764, + 98763, + 98748, + 98728, + 98765, + 98770, + 98758, + 98738, + 98765, + 98762, + 98767, + 98728, + 98736, + 98769, + 98743, + 98753, + 98754, + 98746, + 98789, + 98805, + 98770, + 98734, + 98741, + 99036, + 98731, + 98780, + 98729, + 98738, + 98774, + 98743, + 98768, + 98764, + 98752, + 98775, + 98756, + 98731, + 98769, + 98756, + 98781, + 98792, + 98762, + 98727, + 98727, + 98762, + 98764, + 98772, + 98755, + 98748, + 98760, + 98721, + 98736, + 98766, + 98746, + 98779, + 98819, + 98764, + 98758, + 98735, + 98740, + 98746, + 98783, + 98755, + 98753, + 98752, + 98761, + 98735, + 98752, + 98769, + 98772, + 98758, + 98759, + 98732, + 98757, + 98766, + 98770, + 98737, + 98793, + 98766, + 98776, + 98759, + 98760, + 98736, + 98756, + 98769, + 98804, + 98763, + 98744, + 98743, + 98770, + 98732, + 98772, + 98752, + 98767, + 98713, + 98750, + 98743, + 98753, + 98969, + 98723, + 100293, + 98739, + 98763, + 98774, + 98767, + 98750, + 98747, + 98751, + 98728, + 98777, + 98729, + 98767, + 98796, + 98754, + 98736, + 98743, + 98728, + 98732, + 98736, + 98738, + 98773, + 98736, + 98770, + 98771, + 98785, + 98797, + 98757, + 98765, + 98750, + 98744, + 98735, + 98742, + 98756, + 98763, + 98796, + 98745, + 98775, + 98753, + 98743, + 98747, + 98762, + 98737, + 98758, + 98732, + 98774, + 98797, + 98755, + 98739, + 98737, + 98746, + 98964, + 98780, + 98778, + 98726, + 98753, + 98758, + 98772, + 98768, + 98775, + 98736, + 98743, + 98754, + 98767, + 98722, + 98777, + 98737, + 98749, + 98745, + 98763, + 98804, + 98747, + 98731, + 98729, + 98773, + 98774, + 98741, + 98760, + 98724, + 98726, + 98743, + 98729, + 98761, + 98764, + 98762, + 98747, + 98728, + 98738, + 98773, + 98744, + 98755, + 98758, + 98779, + 98779, + 98760, + 98733, + 98759, + 98764, + 98742, + 98755, + 98772, + 98787, + 98748, + 98747, + 98754, + 98742, + 98773, + 98794, + 98731, + 98761, + 98729, + 98719, + 98745, + 98750, + 98727, + 98768, + 98776, + 98724, + 98774, + 98764, + 98792, + 98770, + 98773, + 98737, + 98739, + 98775, + 98765, + 98731, + 98756, + 98745, + 98734, + 98768, + 98742, + 98743, + 98750, + 98743, + 98783, + 98741, + 98734, + 98739, + 98766, + 98773, + 98742, + 98733, + 98735, + 98735, + 98775, + 98738, + 98766, + 98732, + 98736, + 98737, + 98748, + 98793, + 98770, + 98735, + 98766, + 98740, + 98746, + 98758, + 98770, + 98757, + 98746, + 98739, + 98744, + 98752, + 98742, + 98766, + 98754, + 98772, + 98756, + 98754, + 98754, + 98749, + 98780, + 98797, + 98765, + 98766, + 98782, + 98783, + 98759, + 98805, + 98745, + 98785, + 98779, + 98766, + 98732, + 98737, + 98733, + 98769, + 98780, + 98769, + 98756, + 98782, + 98756, + 98805, + 98789, + 98764, + 98736, + 98751, + 98769, + 98743, + 98752, + 98751, + 98743, + 98726, + 98739, + 98734, + 98757, + 98792, + 98734, + 98768, + 98758, + 98745, + 98755, + 98759, + 98732, + 98783, + 98774, + 98730, + 98728, + 98752, + 98741, + 98757, + 98745, + 98757, + 98757, + 98765, + 98745, + 98743, + 98755, + 98725, + 98774, + 98754, + 98758, + 98777, + 98761, + 98766, + 98740, + 98742, + 98749, + 98732, + 98756, + 98752, + 98751, + 98741, + 98742, + 98731, + 98750, + 98762, + 98755, + 98746, + 98737, + 98749, + 98732, + 98743, + 98742, + 98759, + 98753, + 98746, + 98743, + 98767, + 98762, + 98774, + 98754, + 98769, + 98772, + 98750, + 98765, + 98737, + 98732, + 98742, + 98737, + 98731, + 98757, + 98764, + 98751, + 98738, + 98730, + 98727, + 98754, + 98769, + 98732, + 98762, + 98752, + 98727, + 98726, + 98765, + 98739, + 98806, + 98732, + 98757, + 98792, + 98830, + 98768, + 98738, + 98751, + 98759, + 98754, + 98731, + 98768, + 98734, + 98757, + 98722, + 98762, + 98771, + 98734, + 98734, + 98764, + 98742, + 98742, + 98767, + 98776, + 98755, + 98745, + 98746, + 98754, + 98763, + 98722, + 98734, + 98753, + 98752, + 98766, + 98745, + 98712, + 98746, + 98769, + 98734, + 98749, + 98757, + 98735, + 98765, + 98737, + 98755, + 98739, + 98743, + 98752, + 98729, + 98745, + 98730, + 98763, + 98755, + 98735, + 98775, + 98777, + 98738, + 98800, + 98768, + 98738, + 98775, + 98742, + 98773, + 98761, + 98738, + 98758, + 98736, + 98749, + 98776, + 98777, + 98754, + 98757, + 98749, + 98735, + 98739, + 98758, + 98774, + 98736, + 98760, + 98729, + 98734, + 98767, + 98749, + 98752, + 98768, + 98746, + 98789, + 98770, + 98764, + 98751, + 98713, + 98770, + 98718, + 98780, + 98737, + 98731, + 98753, + 98740, + 98720, + 98759, + 98738, + 98762, + 98738, + 98761, + 98743, + 98728, + 98771, + 98760, + 98797, + 98784, + 98738, + 98743, + 98772, + 98737, + 98782, + 98732, + 98765, + 98739, + 98733, + 98744, + 98736, + 98738, + 98768, + 98804, + 98772, + 98754, + 98786, + 98778, + 98749, + 98744, + 98735, + 98751, + 98755, + 98773, + 98754, + 98763, + 98728, + 98758, + 98770, + 98767, + 98767, + 98749, + 98753, + 98725, + 98756, + 98740, + 98747, + 98755, + 98780, + 98758, + 98764, + 98734, + 98755, + 98735, + 98759, + 98751, + 98804, + 98729, + 98766, + 98744, + 98766, + 98735, + 99076, + 98772, + 98764, + 98809, + 98767, + 98729, + 98783, + 98736, + 98730, + 98774, + 98761, + 98741, + 98726, + 98739, + 98729, + 98753, + 98767, + 98760, + 98740, + 98736, + 98746, + 98770, + 98787, + 98746, + 98751, + 98776, + 98779, + 98796, + 98783, + 98753, + 98787, + 98737, + 98782, + 98776, + 98753, + 98753, + 98767, + 98743, + 98778, + 98749, + 98738, + 98734, + 98758, + 98744, + 98763, + 98787, + 98740, + 98745, + 98752, + 98731, + 98773, + 98786, + 98743, + 98786, + 98734, + 98745, + 98781, + 98771, + 98757, + 98750, + 98740, + 98781, + 98768, + 98742, + 98768, + 98839, + 98761, + 98743, + 98746, + 98758, + 98744, + 98753, + 98738, + 98768, + 98724, + 98742, + 98727, + 98740, + 98734, + 98761, + 98756, + 98755, + 98775, + 98752, + 98750, + 98766, + 98744, + 98765, + 98773, + 98770, + 98738, + 98739, + 98741, + 98776, + 98755, + 98752, + 98746, + 98750, + 98742, + 98759, + 98772, + 98772, + 98738, + 98723, + 98727, + 98759, + 98758, + 98741, + 98753, + 98728, + 98756, + 98804, + 98745, + 98775, + 98760, + 98758, + 98716, + 98754, + 98742, + 98814, + 98743, + 98765, + 98756, + 98758, + 98787, + 98757, + 98773, + 98731, + 98751, + 98780, + 98764, + 98746, + 98730, + 98737, + 98752, + 98758, + 98732, + 98726, + 98766, + 98770, + 98750, + 98751, + 98761, + 98754, + 98784, + 98745, + 98736, + 98746, + 98754, + 98732, + 98750, + 98746, + 98739, + 98769, + 98730, + 98763, + 98767, + 98747, + 98785, + 98739, + 98780, + 98754, + 98766, + 98772, + 98755, + 98756, + 98766, + 98740, + 98744, + 98766, + 98730, + 98767, + 98739, + 98788, + 98760, + 98741, + 98752, + 98756, + 98772, + 98752, + 98763, + 98758, + 98744, + 98776, + 98750, + 98753, + 98725, + 98737, + 98766, + 98739, + 98733, + 98729, + 98724, + 98759, + 98746, + 98773, + 98736, + 98766, + 98766, + 98726, + 98728, + 98766, + 98833, + 98756, + 98796, + 98730, + 98768, + 98732, + 98781, + 98752, + 98774, + 98751, + 98764, + 98751, + 98741, + 98758, + 98752, + 98752, + 98745, + 98784, + 98779, + 98728, + 98760, + 98734, + 98750, + 98755, + 98808, + 98746, + 98784, + 98726, + 98747, + 98742, + 98729, + 98736, + 98746, + 98753, + 98721, + 98740, + 98758, + 98734, + 98727, + 98774, + 98729, + 98751, + 98759, + 98755, + 98735, + 98751, + 98739, + 98770, + 98732, + 98786, + 98749, + 98734, + 98795, + 98799, + 98759, + 98727, + 98718, + 98726, + 98740, + 98747, + 98723, + 98732, + 98744, + 98728, + 98768, + 98737, + 98761, + 98727, + 98777, + 98739, + 98776, + 98731, + 98767, + 98729, + 98723, + 98759, + 98743, + 98752, + 98762, + 98728, + 98751, + 98738, + 98749, + 98725, + 98758, + 98736, + 98722, + 98738, + 98890, + 98763, + 98755, + 98773, + 98756, + 98760, + 98752, + 98737, + 98762, + 98732, + 98757, + 98752, + 98745, + 98777, + 98749, + 98737, + 98740, + 98779, + 98749, + 98794, + 98735, + 98746, + 98741, + 98748, + 98781, + 98750, + 98745, + 98759, + 98739, + 98787, + 98781, + 98728, + 98731, + 98750, + 98724, + 98717, + 98722, + 98754, + 98753, + 98732, + 98757, + 98736, + 98729, + 98758, + 98746, + 98769, + 98777, + 98728, + 98733, + 98734, + 98753, + 98752, + 98756, + 98746, + 98737, + 98774, + 98758, + 98733, + 98767, + 98724, + 98735, + 98770, + 98768, + 98730, + 98745, + 98743, + 98756, + 98757, + 98735, + 98714, + 98744, + 98764, + 98762, + 98776, + 98753, + 98720, + 98778, + 98729, + 98750, + 98753, + 98771, + 98757, + 98742, + 98745, + 98725, + 98771, + 98757, + 98770, + 98722, + 98743, + 98724, + 98752, + 98820, + 98820, + 98763, + 98765, + 98800, + 98750, + 98739, + 98768, + 98761, + 98768, + 98810, + 98725, + 98742, + 98739, + 98749, + 98750, + 98776, + 98765, + 98730, + 98734, + 98746, + 98724, + 98777, + 98785, + 98764, + 98733, + 98752, + 98752, + 98725, + 98731, + 98831, + 98729, + 98743, + 98731, + 98740, + 98737, + 98748, + 98735, + 98760, + 98738, + 98743, + 98750, + 98728, + 98779, + 98737, + 98762, + 98774, + 98749, + 98754, + 98739, + 98764, + 98768, + 98779, + 98738, + 98751, + 98741, + 98762, + 98714, + 98770, + 98746, + 98787, + 98743, + 98744, + 98742, + 98730, + 98743, + 98772, + 98734, + 98750, + 98742, + 98745, + 98766, + 98762, + 98745, + 98751, + 98731, + 98751, + 98764, + 98732, + 98742, + 98735, + 98730, + 98747, + 98724, + 98747, + 98745, + 98769, + 98767, + 98770, + 98765, + 98888, + 98722, + 98771, + 98720, + 98769, + 98791, + 98742, + 98746, + 98748, + 98746, + 98749, + 98736, + 98760, + 98750, + 98739, + 98727, + 98768, + 98777, + 98733, + 98755, + 98763, + 98736, + 98750, + 98774, + 98734, + 98731, + 98726, + 98731, + 98772, + 98759, + 98734, + 98767, + 98754, + 98736, + 98771, + 98755, + 98736, + 98760, + 98748, + 98756, + 98750, + 98748, + 98724, + 98747, + 98796, + 98740, + 98755, + 98733, + 98744, + 98732, + 98776, + 98745, + 98715, + 98767, + 98727, + 98769, + 98746, + 98759, + 98760, + 98786, + 98773, + 98738, + 98757, + 98769, + 98775, + 98775, + 98754, + 98728, + 98757, + 98744, + 98782, + 98777, + 98746, + 98747, + 98791, + 98725, + 98732, + 98756, + 98732, + 98752, + 98783, + 98749, + 98748, + 98733, + 98748, + 98742, + 98745, + 98742, + 98731, + 98743, + 98769, + 98743, + 98734, + 98742, + 98752, + 98742, + 98722, + 98751, + 98742, + 98758, + 98762, + 98737, + 98760, + 98736, + 98777, + 98755, + 98737, + 98738, + 98755, + 98753, + 98721, + 98729, + 98774, + 98767, + 98747, + 98733, + 98744, + 98764, + 98739, + 98744, + 98985, + 98789, + 98754, + 98748, + 98737, + 98754, + 98773, + 98734, + 98757, + 98757, + 98765, + 98740, + 98762, + 98739, + 98744, + 98741, + 98733, + 98752, + 98781, + 98786, + 98751, + 98728, + 98724, + 98731, + 98753, + 98780, + 98756, + 98729, + 98768, + 98735, + 98781, + 98758, + 98750, + 98752, + 98742, + 98760, + 98752, + 98732, + 98768, + 98730, + 98756, + 98732, + 98771, + 98728, + 98736, + 98764, + 98745, + 98788, + 98757, + 98725, + 98766, + 98743, + 98790, + 98789, + 98737, + 98732, + 98738, + 98762, + 98763, + 98763, + 98754, + 98732, + 98749, + 98768, + 98779, + 98731, + 98759, + 98763, + 98741, + 98740, + 98763, + 98736, + 98720, + 98731, + 98744, + 98727, + 98760, + 98748, + 98757, + 98728, + 98747, + 98740, + 98727, + 98743, + 98747, + 98968, + 98765, + 98745, + 98734, + 98735, + 98753, + 98751, + 98791, + 98726, + 98783, + 98755, + 98760, + 98731, + 98736, + 98759, + 98753, + 98739, + 98766, + 98733, + 98746, + 98738, + 98769, + 98734, + 98751, + 98772, + 98765, + 98741, + 98760, + 98761, + 98742, + 98738, + 98739, + 98754, + 98751, + 98738, + 98765, + 98748, + 98733, + 98743, + 98770, + 98761, + 98744, + 98756, + 98741, + 98764, + 98728, + 98792, + 98747, + 98721, + 98731, + 98755, + 98757, + 98744, + 98732, + 98757, + 98773, + 98763, + 98744, + 98750, + 98749, + 98766, + 98729, + 98765, + 98733, + 98759, + 98733, + 98773, + 98754, + 98741, + 98739, + 98763, + 98760, + 98721, + 98754, + 98735, + 98783, + 98758, + 98861, + 98725, + 98748, + 98761, + 98767, + 98761, + 98736, + 98757, + 98738, + 98772, + 98774, + 98770, + 98760, + 98764, + 98813, + 98729, + 98725, + 98779, + 98779, + 98732, + 98735, + 98761, + 98731, + 98749, + 98743, + 98742, + 98755, + 98768, + 98749, + 98768, + 98757, + 98748, + 98760, + 98777, + 98774, + 98746, + 98733, + 98741, + 98753, + 98736, + 98761, + 98734, + 98763, + 98766, + 98740, + 98734, + 98744, + 98798, + 99002, + 98761, + 98749, + 98735, + 98753, + 98761, + 98729, + 98767, + 98725, + 98757, + 98728, + 98737, + 98765, + 98758, + 98754, + 98754, + 98724, + 98728, + 98767, + 98735, + 98734, + 98741, + 98743, + 98746, + 98733, + 98792, + 98742, + 98766, + 98762, + 98737, + 98743, + 98743, + 98737, + 98774, + 98733, + 98831, + 98740, + 98730, + 98747, + 98728, + 98756, + 98753, + 98748, + 98731, + 98757, + 98768, + 98764, + 98737, + 98760, + 98765, + 99153, + 98746, + 98771, + 98775, + 98766, + 98752, + 98717, + 98744, + 98778, + 98747, + 98747, + 98734, + 98738, + 98737, + 98722, + 98741, + 98758, + 98742, + 98747, + 98766, + 98737, + 98765, + 98741, + 98738, + 98768, + 98732, + 98782, + 98757, + 98774, + 98755, + 98765, + 98753, + 98746, + 98783, + 98778, + 98768, + 98755, + 98748, + 98734, + 98746, + 98739, + 98739, + 98763, + 98750, + 98722, + 98746, + 98751, + 98731, + 98759, + 98742, + 98743, + 98780, + 98768, + 98747, + 98730, + 98773, + 98763, + 98768, + 98722, + 98731, + 98753, + 98733, + 98766, + 98759, + 98756, + 98731, + 98790, + 98737, + 98757, + 98733, + 98768, + 98733, + 98758, + 98731, + 98729, + 98763, + 98725, + 98749, + 98769, + 98765, + 98765, + 98742, + 98732, + 98736, + 98738, + 98735, + 98727, + 98751, + 98771, + 98733, + 98784, + 98736, + 98723, + 98759, + 98744, + 98722, + 98746, + 98747, + 98735, + 98741, + 98735, + 98756, + 98755, + 98731, + 98762, + 98772, + 98757, + 98787, + 98753, + 98766, + 98760, + 98766, + 98757, + 98756, + 98763, + 98741, + 98754, + 98775, + 98761, + 98769, + 98795, + 98790, + 98726, + 98769, + 98751, + 98762, + 98840, + 98766, + 98731, + 98796, + 98756, + 98735, + 98761, + 98752, + 98731, + 98794, + 98755, + 98770, + 98733, + 98757, + 98807, + 98737, + 98730, + 98723, + 98746, + 98764, + 98722, + 98785, + 98766, + 98731, + 98784, + 98728, + 98783, + 98774, + 98780, + 98730, + 98736, + 98737, + 98737, + 98748, + 98776, + 98778, + 98744, + 98762, + 98731, + 98734, + 98732, + 98761, + 98753, + 98760, + 98741, + 98726, + 98766, + 98734, + 98737, + 98779, + 98780, + 98757, + 98763, + 98733, + 98731, + 98758, + 98733, + 98743, + 98733, + 98752, + 98760, + 98742, + 98773, + 98756, + 98735, + 98779, + 98733, + 98743, + 98751, + 98753, + 98757, + 98760, + 98727, + 98763, + 98730, + 98756, + 98770, + 98771, + 98757, + 98763, + 98735, + 98760, + 98768, + 98729, + 98736, + 98744, + 98734, + 98733, + 98752, + 98766, + 98743, + 98734, + 98728, + 98751, + 98748, + 98741, + 98730, + 98737, + 98761, + 98767, + 98745, + 98770, + 98760, + 98762, + 98737, + 98760, + 98997, + 98757, + 98772, + 98752, + 98732, + 98732, + 98743, + 98785, + 98753, + 98770, + 98777, + 98770, + 98747, + 98752, + 98718, + 98742, + 98789, + 98771, + 98784, + 98777, + 98782, + 98781, + 98785, + 98759, + 98763, + 98778, + 98743, + 98779, + 98771, + 98768, + 98737, + 98748, + 98785, + 98731, + 98781, + 98804, + 98775, + 98758, + 98767, + 98755, + 98743, + 98730, + 98744, + 98770, + 98753, + 98754, + 98720, + 98789, + 98752, + 98735, + 98773, + 98732, + 98783, + 98766, + 98727, + 98736, + 98772, + 98750, + 98768, + 98746, + 98758, + 98780, + 98768, + 98737, + 98771, + 98776, + 98731, + 98733, + 98727, + 98749, + 98734, + 98769, + 98735, + 98731, + 98771, + 98734, + 98724, + 98746, + 98781, + 98776, + 98817, + 98755, + 98744, + 98754, + 98733, + 98769, + 98764, + 98755, + 98747, + 98767, + 98726, + 98772, + 98739, + 98737, + 98729, + 98760, + 98776, + 98751, + 98775, + 98760, + 98739, + 98735, + 98756, + 98743, + 98799, + 98728, + 98757, + 98783, + 98759, + 98721, + 98755, + 98746, + 98730, + 98769, + 98727, + 98754, + 98801, + 98743, + 98734, + 98757, + 98740, + 98731, + 98775, + 98775, + 98750, + 98758, + 98747, + 98749, + 98753, + 98736, + 98750, + 98780, + 98772, + 98735, + 98757, + 98746, + 98750, + 98770, + 98761, + 98755, + 98725, + 98760, + 98763, + 98773, + 98727, + 98851, + 98743, + 98762, + 98759, + 98737, + 98774, + 98741, + 98742, + 98750, + 98764, + 98746, + 98764, + 98738, + 98729, + 98754, + 98750, + 98741, + 98764, + 98776, + 98762, + 98766, + 98727, + 98768, + 98758, + 98738, + 98735, + 98750, + 98794, + 98734, + 98768, + 98732, + 98772, + 98774, + 98742, + 98763, + 98741, + 98756, + 98737, + 98746, + 98772, + 98761, + 98755, + 98737, + 98742, + 98746, + 98716, + 98734, + 98782, + 98757, + 98749, + 98754, + 98723, + 98752, + 98772, + 98760, + 98769, + 98758, + 98728, + 98733, + 98735, + 98752, + 98780, + 98743, + 98755, + 98760, + 98776, + 98756, + 98737, + 98723, + 98753, + 98745, + 98731, + 98770, + 98745, + 98747, + 98745, + 98758, + 98756, + 98760, + 98734, + 98770, + 98748, + 98745, + 98760, + 98741, + 98767, + 98738, + 98746, + 98783, + 98764, + 98769, + 98763, + 98773, + 98754, + 98767, + 98779, + 98742, + 98764, + 98742, + 98743, + 98770, + 98776, + 98726, + 98740, + 98767, + 98759, + 98731, + 98741, + 98758, + 98758, + 98730, + 98777, + 98767, + 98766, + 98751, + 98756, + 98753, + 98752, + 98735, + 98756, + 98727, + 98737, + 98745, + 98769, + 98766, + 98752, + 98731, + 98761, + 98744, + 98733, + 98775, + 98719, + 98762, + 98781, + 98768, + 98759, + 98760, + 98768, + 98738, + 98755, + 98775, + 98739, + 98770, + 98785, + 98732, + 98761, + 98768, + 98754, + 98762, + 98753, + 98757, + 98736, + 98734, + 98722, + 98767, + 98775, + 98739, + 98751, + 98745, + 98764, + 98756, + 98766, + 98758, + 98773, + 98779, + 98800, + 98748, + 98760, + 98767, + 98759, + 98761, + 98754, + 98774, + 98764, + 98754, + 98716, + 98743, + 98757, + 98752, + 98737, + 98751, + 98761, + 98729, + 98750, + 98749, + 98719, + 98767, + 98768, + 98761, + 98736, + 98769, + 98754, + 98736, + 98732, + 98737, + 98758, + 98787, + 98761, + 98745, + 98740, + 98746, + 98744, + 98797, + 98731, + 98762, + 98733, + 98745, + 98779, + 98738, + 98730, + 98743, + 98768, + 98748, + 98790, + 98764, + 98732, + 98776, + 98734, + 98766, + 98724, + 98754, + 98753, + 98732, + 98735, + 98721, + 98762, + 98776, + 98751, + 98744, + 98752, + 98775, + 98773, + 99000, + 98788, + 98748, + 98749, + 98776, + 98752, + 98802, + 98766, + 98776, + 98738, + 98736, + 98806, + 98751, + 98735, + 98743, + 98740, + 98775, + 98767, + 98733, + 98763, + 98731, + 98759, + 98743, + 98725, + 98764, + 98754, + 98740, + 98750, + 98784, + 98772, + 98741, + 98741, + 98727, + 98761, + 98783, + 98766, + 98743, + 98748, + 98729, + 98763, + 98739, + 98754, + 98743, + 98773, + 98769, + 98776, + 98749, + 98734, + 98748, + 98757, + 98760, + 98727, + 98768, + 98758, + 98747, + 98761, + 98760, + 98739, + 98735, + 98740, + 98731, + 98736, + 98728, + 98748, + 98758, + 98776, + 98756, + 98771, + 98793, + 98763, + 98748, + 98764, + 98747, + 98776, + 98749, + 98784, + 98773, + 98755, + 98764, + 98746, + 98754, + 98795, + 98804, + 98751, + 98752, + 98735, + 98765, + 98768, + 98791, + 98765, + 98764, + 98741, + 98725, + 98790, + 98753, + 98743, + 98777, + 98791, + 98745, + 98758, + 98777, + 98811, + 98737, + 98751, + 98730, + 98781, + 98779, + 98758, + 98766, + 98771, + 98756, + 98771, + 98772, + 98733, + 98756, + 98798, + 98744, + 98799, + 98748, + 98751, + 98736, + 98750, + 98761, + 98753, + 98751, + 98755, + 98780, + 98781, + 98784, + 98764, + 98738, + 98749, + 98768, + 98763, + 98750, + 98787, + 98780, + 98761, + 98725, + 98757, + 98778, + 98726, + 98746, + 98741, + 98790, + 98735, + 98736, + 98774, + 98767, + 98732, + 98766, + 98759, + 98730, + 98768, + 98741, + 98792, + 98759, + 98743, + 98742, + 98742, + 98743, + 98755, + 98768, + 98759, + 98757, + 98751, + 98742, + 98763, + 98751, + 98736, + 98720, + 98783, + 98732, + 98744, + 98759, + 98754, + 98766, + 98741, + 98737, + 98783, + 98767, + 98743, + 98723, + 98778, + 98739, + 98771, + 98758, + 98764, + 98790, + 98770, + 98784, + 98736, + 98741, + 98762, + 98777, + 98745, + 98766, + 98737, + 98769, + 98756, + 98735, + 98751, + 98732, + 98734, + 98733, + 98739, + 98740, + 98759, + 98752, + 98750, + 98749, + 98730, + 98723, + 98730, + 98738, + 98747, + 98733, + 98771, + 98726, + 98747, + 98754, + 98751, + 98758, + 98784, + 98777, + 98758, + 98726, + 98790, + 98756, + 98736, + 98733, + 98744, + 98737, + 98726, + 98778, + 98737, + 98758, + 98750, + 98780, + 99019, + 98744, + 98774, + 98736, + 98728, + 98761, + 98766, + 98769, + 98725, + 98738, + 98739, + 98748, + 98779, + 98770, + 98779, + 98749, + 98730, + 98734, + 98747, + 98788, + 98750, + 98726, + 98738, + 98780, + 98725, + 98760, + 98767, + 98743, + 98738, + 98742, + 98802, + 98763, + 98740, + 98748, + 98767, + 98739, + 98765, + 98797, + 98764, + 98778, + 98768, + 98735, + 98754, + 98745, + 98742, + 98743, + 98760, + 98794, + 98758, + 98760, + 98730, + 98758, + 98802, + 98753, + 98763, + 98757, + 98756, + 98762, + 98765, + 98767, + 98778, + 98771, + 98760, + 98770, + 98759, + 98753, + 98787, + 98796, + 98770, + 98792, + 98762, + 98765, + 98732, + 98743, + 98771, + 98746, + 98777, + 98761, + 98748, + 98741, + 98812, + 98777, + 98729, + 98780, + 98713, + 98745, + 98746, + 98767, + 98814, + 98771, + 98750, + 98770, + 98751, + 98757, + 98732, + 98729, + 98766, + 98765, + 98777, + 98777, + 98762, + 98766, + 98756, + 98779, + 98767, + 98754, + 98770, + 98780, + 98752, + 98770, + 98746, + 98744, + 98755, + 98727, + 98760, + 98791, + 98766, + 98728, + 98758, + 98733, + 98771, + 98750, + 98770, + 98739, + 98749, + 98730, + 98767, + 98799, + 98755, + 98729, + 98770, + 98775, + 98773, + 98733, + 98768, + 98749, + 98766, + 98754, + 98720, + 98727, + 98770, + 98768, + 98741, + 98769, + 98758, + 98735, + 98752, + 98726, + 98745, + 98736, + 98748, + 98788, + 98783, + 98757, + 98786, + 98799, + 98756, + 98795, + 98768, + 98753, + 98761, + 98760, + 98746, + 98759, + 98729, + 98755, + 98730, + 98750, + 98735, + 98743, + 98767, + 98756, + 98753, + 98733, + 98736, + 98774, + 98784, + 98741, + 98765, + 98773, + 98777, + 98752, + 98758, + 98782, + 98737, + 98743, + 98742, + 98745, + 98768, + 98747, + 98753, + 98757, + 98741, + 98739, + 98789, + 98762, + 98757, + 98769, + 98736, + 98756, + 98738, + 98787, + 98767, + 98781, + 98764, + 98782, + 98768, + 98742, + 98742, + 98880, + 98729, + 98749, + 98740, + 98766, + 98739, + 98751, + 98733, + 98765, + 98766, + 98778, + 98771, + 98767, + 98759, + 98770, + 98759, + 98729, + 98731, + 98733, + 98799, + 98803, + 98730, + 98737, + 98773, + 98756, + 98743, + 98766, + 98735, + 98757, + 98733, + 98756, + 98767, + 98744, + 98775, + 98739, + 98745, + 98724, + 98760, + 98754, + 98742, + 98800, + 98782, + 98742, + 98769, + 98734, + 98727, + 98750, + 98780, + 98791, + 98732, + 98747, + 98735, + 98735, + 98745, + 98740, + 98775, + 98756, + 98739, + 98796, + 98756, + 99099, + 98726, + 98745, + 98766, + 98764, + 98760, + 98733, + 98768, + 98762, + 98740, + 98728, + 98832, + 98734, + 98733, + 98776, + 98740, + 98730, + 98774, + 98735, + 98735, + 98745, + 98745, + 98747, + 98731, + 98738, + 98755, + 98769, + 98772, + 98728, + 98760, + 98961, + 98758, + 98765, + 98766, + 98745, + 98740, + 98743, + 98735, + 98761, + 98771, + 98743, + 98763, + 98749, + 98745, + 98749, + 98727, + 98736, + 98759, + 98752, + 98732, + 98766, + 98764, + 98756, + 98741, + 98787, + 98777, + 98745, + 98799, + 98762, + 98740, + 98751, + 98734, + 98777, + 98789, + 98758, + 98752, + 98740, + 98730, + 98775, + 98787, + 98790, + 98736, + 98739, + 98744, + 98746, + 98770, + 98736, + 98734, + 98736, + 98732, + 98776, + 98763, + 98743, + 98770, + 98753, + 98765, + 98753, + 98799, + 98758, + 98740, + 98747, + 98719, + 98730, + 98772, + 98765, + 98754, + 98740, + 98726, + 98755, + 98721, + 98747, + 98765, + 98730, + 98734, + 98745, + 98766, + 98767, + 98739, + 98735, + 98776, + 98733, + 98758, + 99769, + 98765, + 98760, + 98770, + 98766, + 98764, + 98720, + 98727, + 98744, + 98749, + 98727, + 98743, + 98739, + 98740, + 98735, + 98738, + 98758, + 98738, + 98752, + 98728, + 98720, + 98765, + 98764, + 98735, + 98750, + 98800, + 98732, + 98746, + 98770, + 98736, + 98749, + 98784, + 98768, + 98744, + 98753, + 98775, + 98748, + 98724, + 98762, + 98738, + 98733, + 98756, + 98783, + 98761, + 105253, + 98766, + 98754, + 98749, + 98746, + 98730, + 98772, + 98745, + 98743, + 98742, + 98729, + 98761, + 98733, + 98768, + 98761, + 98777, + 98729, + 98802, + 98764, + 98757, + 98772, + 98728, + 98740, + 98741, + 98737, + 98721, + 98756, + 98740, + 98733, + 98749, + 98768, + 98759, + 98771, + 98743, + 98772, + 98736, + 98769, + 98766, + 98761, + 98737, + 98731, + 98740, + 98760, + 98755, + 98773, + 98732, + 98744, + 98742, + 98738, + 98774, + 98751, + 98748, + 98756, + 98737, + 98754, + 98768, + 98757, + 98766, + 98744, + 98743, + 98735, + 98737, + 98730, + 98736, + 98719, + 98746, + 98774, + 98735, + 98787, + 98756, + 98766, + 98749, + 98734, + 98719, + 98760, + 98760, + 98730, + 98749, + 98761, + 98751, + 98763, + 98759, + 98744, + 98793, + 98790, + 98735, + 98738, + 98758, + 98726, + 98763, + 98732, + 98735, + 98765, + 98753, + 98757, + 98793, + 98759, + 98751, + 98734, + 98763, + 98757, + 98762, + 98767, + 98741, + 98740, + 98784, + 98755, + 98763, + 98762, + 98734, + 98753, + 98767, + 98749, + 98756, + 98735, + 98728, + 98768, + 98753, + 98754, + 98779, + 98748, + 98743, + 98741, + 98762, + 98759, + 98737, + 98756, + 98790, + 98752, + 98770, + 98779, + 98797, + 98748, + 98739, + 98730, + 98776, + 98753, + 98741, + 98761, + 98741, + 98742, + 98731, + 98742, + 98739, + 98736, + 98740, + 98738, + 98757, + 98748, + 98727, + 98761, + 98745, + 98765, + 98778, + 98771, + 98754, + 98757, + 98742, + 98762, + 98756, + 98767, + 98741, + 98726, + 98780, + 98759, + 98780, + 98748, + 98745, + 98769, + 98756, + 98762, + 98772, + 98784, + 98759, + 98750, + 98748, + 98737, + 98759, + 98745, + 98753, + 98771, + 98740, + 98793, + 98757, + 98741, + 98740, + 98746, + 98763, + 98753, + 98764, + 98727, + 98774, + 98761, + 98767, + 98740, + 98770, + 98755, + 98737, + 98761, + 98770, + 98793, + 98744, + 98731, + 98771, + 98746, + 98741, + 98791, + 98737, + 98754, + 98757, + 98737, + 98727, + 98767, + 98745, + 98737, + 98776, + 98749, + 98741, + 98781, + 98760, + 98750, + 98807, + 98760, + 98781, + 98763, + 98729, + 98758, + 98755, + 98729, + 98757, + 98727, + 98762, + 98811, + 98777, + 98772, + 98769, + 98761, + 98749, + 98760, + 98752, + 98773, + 98756, + 98798, + 98778, + 98760, + 98732, + 98749, + 98742, + 98745, + 98763, + 98743, + 98726, + 98738, + 98763, + 98757, + 98764, + 98762, + 98787, + 98777, + 98723, + 98749, + 98741, + 98760, + 98739, + 98734, + 98762, + 98780, + 98734, + 98754, + 98737, + 98750, + 98786, + 98788, + 98762, + 98751, + 98765, + 98732, + 98762, + 98746, + 98738, + 98776, + 98746, + 98761, + 98737, + 98758, + 98772, + 98743, + 98762, + 98727, + 98749, + 98758, + 98769, + 98752, + 98781, + 98734, + 98743, + 98741, + 98738, + 98731, + 98751, + 98763, + 98724, + 98769, + 98757, + 98772, + 98732, + 98775, + 98774, + 98750, + 98792, + 98742, + 98770, + 98756, + 98737, + 98749, + 98709, + 98765, + 98735, + 98749, + 98769, + 98781, + 98775, + 98753, + 98761, + 98820, + 98745, + 98733, + 98763, + 98763, + 98751, + 98752, + 98746, + 98783, + 98767, + 98751, + 98780, + 98755, + 98756, + 98762, + 98758, + 98730, + 98784, + 98758, + 98723, + 98756, + 98754, + 98756, + 98763, + 98750, + 98753, + 98756, + 98735, + 98750, + 98756, + 98750, + 98774, + 98743, + 98768, + 98738, + 98790, + 98776, + 98785, + 98781, + 98739, + 98771, + 98762, + 98753, + 98759, + 98757, + 98747, + 98743, + 98735, + 98729, + 98763, + 98768, + 98773, + 98732, + 98792, + 98750, + 98775, + 98738, + 98758, + 98745, + 98768, + 98784, + 98759, + 98742, + 98769, + 98726, + 98764, + 98756, + 98735, + 98762, + 98804, + 98738, + 98789, + 98748, + 98735, + 98742, + 98771, + 98732, + 98767, + 98737, + 98750, + 98762, + 98780, + 98740, + 98779, + 98779, + 98758, + 98751, + 98747, + 98743, + 98737, + 98763, + 98747, + 98748, + 98768, + 98758, + 98741, + 98735, + 98728, + 98772, + 98776, + 98736, + 98740, + 98745, + 98728, + 98755, + 98781, + 98734, + 98753, + 98734, + 98729, + 98731, + 98762, + 98737, + 98770, + 98753, + 98747, + 98742, + 98744, + 98767, + 98739, + 98748, + 98727, + 98771, + 98758, + 98720, + 98778, + 98731, + 98726, + 98793, + 98776, + 98757, + 98742, + 98775, + 98730, + 98738, + 98741, + 98736, + 98755, + 98764, + 98747, + 98744, + 98758, + 98747, + 98740, + 98725, + 98748, + 98736, + 98735, + 98743, + 98760, + 98758, + 98725, + 98774, + 98766, + 98740, + 98743, + 98779, + 98751, + 98749, + 98772, + 98739, + 98751, + 98746, + 98731, + 98754, + 98758, + 98749, + 98746, + 98736, + 98764, + 98812, + 98756, + 98788, + 98723, + 98741, + 98750, + 98769, + 98748, + 98752, + 98770, + 98751, + 98763, + 98779, + 98734, + 98744, + 98743, + 98754, + 98748, + 98783, + 98741, + 98759, + 98730, + 98779, + 98760, + 98769, + 98757, + 98761, + 98766, + 98752, + 98734, + 98733, + 98730, + 98774, + 98728, + 98768, + 98749, + 98761, + 98755, + 98744, + 98749, + 98763, + 98736, + 98784, + 98744, + 98741, + 98776, + 98767, + 98751, + 98781, + 98733, + 98746, + 98761, + 98774, + 98729, + 98732, + 98737, + 98774, + 98734, + 98757, + 98764, + 98761, + 98731, + 98736, + 98730, + 98746, + 98738, + 98779, + 98735, + 98740, + 98726, + 98743, + 98724, + 98784, + 98766, + 98751, + 98749, + 98759, + 98760, + 98754, + 98737, + 98720, + 98750, + 98758, + 98743, + 98780, + 98766, + 98764, + 98789, + 98738, + 98760, + 98733, + 98749, + 98767, + 98732, + 98743, + 98716, + 98731, + 98740, + 98760, + 98979, + 98732, + 98777, + 98757, + 98782, + 98761, + 98755, + 98726, + 98772, + 98730, + 98760, + 98741, + 98742, + 98758, + 98742, + 98757, + 98744, + 98757, + 98766, + 98755, + 98751, + 98735, + 98764, + 98727, + 98809, + 98752, + 98759, + 98751, + 98751, + 98752, + 98758, + 98746, + 98750, + 98748, + 98751, + 98736, + 98739, + 98738, + 98745, + 98767, + 98819, + 98744, + 98746, + 98741, + 98735, + 98757, + 98755, + 98747, + 98731, + 98736, + 98725, + 98768, + 98734, + 98751, + 98749, + 98745, + 98767, + 98758, + 98737, + 98721, + 98742, + 98760, + 98762, + 98769, + 98737, + 98739, + 98787, + 98752, + 98747, + 98774, + 98752, + 98764, + 98754, + 98757, + 98767, + 98735, + 98761, + 98794, + 98763, + 98741, + 98791, + 98788, + 98736, + 98763, + 98755, + 98758, + 98714, + 98765, + 98750, + 98751, + 99086, + 98738, + 98761, + 98769, + 98775, + 98744, + 98757, + 98738, + 98740, + 98752, + 98769, + 98773, + 98773 + ], + "sample_count": 15277 + } + ] + }, + "dz_internet": { + "internet_latency_samples": [ + { + "pubkey": "BBznThYpHEt57wAaSa92s5Vq7S2aRwqprk2rveYcdqAF", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "target_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242301000000, + "samples": [ + 148610, + 148659, + 148538, + 148538, + 148542, + 148542, + 148568, + 148606, + 148494, + 148519, + 148464, + 148464, + 148559, + 148336, + 148518, + 148518, + 148499, + 148669, + 148569, + 148618, + 148624, + 148471, + 148656, + 148656, + 148598, + 148609, + 148609, + 148441, + 148518, + 148686, + 148451, + 148690, + 148567, + 148725, + 148520, + 148454, + 148486, + 148462, + 148449, + 148589, + 148656, + 148509, + 148653, + 148463, + 148731, + 148375, + 148685, + 148431, + 148581, + 148588, + 148404, + 148621, + 148672, + 148800, + 148945, + 148373, + 148716, + 148465, + 148524, + 148524, + 148549, + 148590, + 148546, + 148554, + 148439, + 148453, + 148691, + 148606, + 148606, + 148387, + 148369, + 148708, + 148708, + 148526, + 148696, + 148557, + 148557, + 148599, + 148340, + 148515, + 148551, + 148619, + 148590, + 148501, + 148647, + 148655, + 148662, + 148412, + 148412, + 148653, + 148599, + 148585, + 148419, + 148562, + 148406, + 148673, + 148483, + 148803, + 148552, + 148468, + 148454, + 148403, + 148625, + 148448, + 148778, + 148742, + 148538, + 148617, + 148420, + 148522, + 148353, + 148516, + 148516, + 148515, + 148430, + 148543, + 148489, + 148694, + 148473, + 148531, + 148546, + 148499, + 148451, + 148566, + 148428, + 148642, + 148754, + 148540, + 148570, + 148878, + 148521, + 148465, + 148485, + 148526, + 148526, + 148510, + 148393, + 148367, + 148601, + 148621, + 148506, + 148745, + 148671, + 148512, + 148724, + 148806, + 148806, + 148610, + 148391, + 148733, + 148454, + 148551, + 148576, + 148520, + 148799, + 148428, + 148468, + 148496, + 148496, + 148506, + 148608, + 148993, + 148571, + 148543, + 148845, + 148660, + 148660, + 148565, + 148448, + 148578, + 148578, + 148688, + 148729, + 148691, + 148581, + 148682, + 148682, + 148542, + 148513, + 148513, + 148471, + 148543, + 148382, + 148643, + 148557, + 148487, + 148607, + 148726, + 148559, + 148739, + 148393, + 148489, + 148534, + 148325, + 148793, + 148582, + 148678, + 148805, + 148442, + 148482, + 148482, + 148475, + 148475, + 148498, + 148508, + 148508, + 154526, + 148564, + 148380, + 148651, + 148708, + 148560, + 148523, + 148323, + 148740, + 148501, + 148485, + 148485, + 148788, + 148704, + 148609, + 148421, + 148675, + 148515, + 148719, + 148566, + 148479, + 148351, + 148476, + 148698, + 148684, + 148598, + 148598, + 148496, + 148695, + 148419, + 148482, + 148624, + 148493, + 148688, + 148651, + 148748, + 148748, + 148618, + 148497, + 148458, + 148622, + 148620, + 148546, + 148561, + 148615, + 148466, + 148492, + 148533, + 148533, + 148588, + 148611, + 148641, + 148735, + 148826, + 148543, + 148566, + 148640, + 148527, + 148810, + 148443, + 148543, + 148518, + 148699, + 148683, + 148663, + 148479, + 148667, + 148566, + 148701, + 148461, + 148590, + 148624, + 148468, + 148816, + 148468, + 148697, + 148406, + 148342, + 148342, + 148528, + 148530, + 148371, + 148760, + 148671, + 148671, + 148520, + 148755, + 148606, + 148606, + 148390, + 148469, + 148747, + 148747, + 148764, + 148461, + 148703, + 148604, + 148519, + 148694, + 148645, + 148848, + 148663, + 148615, + 148469, + 148551, + 148707, + 148566, + 148580, + 148580, + 148500, + 148476, + 148580, + 148580, + 148622, + 148509, + 148509, + 149062, + 148446, + 148546, + 148390, + 148642, + 148505, + 148436, + 148605, + 148847, + 148648, + 148648, + 148694, + 148694, + 148445, + 148646, + 148612, + 148645, + 148470, + 148774, + 148511, + 148601, + 148585, + 148585, + 148563, + 148453, + 148453, + 148701, + 148491, + 148623, + 148519, + 148560, + 148560, + 148828, + 148440, + 148729, + 148686, + 148604, + 148669, + 148717, + 148533, + 148431, + 148383, + 148597, + 148625, + 148580, + 148894, + 148594, + 148485, + 148523, + 148561, + 148561, + 148653, + 148655, + 148616, + 148359, + 148486, + 148606, + 148430, + 148430, + 148461, + 148772, + 148515, + 148421, + 148506, + 148743, + 148700, + 148382, + 148719, + 148660, + 148425, + 148440, + 148605, + 148428, + 148397, + 148444, + 148533, + 148558, + 148523, + 148600, + 148540, + 148551, + 148551, + 148480, + 148592, + 148435, + 148623, + 148510, + 148351, + 148474, + 148596, + 148588, + 148383, + 148486, + 148585, + 148671, + 148671, + 148743, + 148759, + 148679, + 148608, + 148614, + 148506, + 148506, + 148591, + 148850, + 148439, + 148439, + 148694, + 148679, + 148453, + 148405, + 148565, + 148623, + 148705, + 148705, + 148591, + 148524, + 148398, + 148642, + 148642, + 148623, + 148464, + 148905, + 148628, + 148499, + 148596, + 148466, + 149532, + 149532, + 148564, + 148364, + 149104, + 148752, + 148438, + 148438, + 148563, + 148436, + 148626, + 148413, + 148565, + 148465, + 148465, + 148605, + 148705, + 148463, + 148740, + 148424, + 148637, + 148637, + 148519, + 148876, + 148570, + 148920, + 148920, + 148624, + 148612, + 148512, + 148885, + 148537, + 148540, + 148540, + 148716, + 148716, + 148442, + 148534, + 148672, + 148501, + 148594, + 148428, + 148490, + 148667, + 148562, + 148562, + 148628, + 149064, + 148411, + 148765, + 148674, + 148563, + 148565, + 148524, + 148500, + 148406, + 148469, + 148446, + 148673, + 148329, + 148713, + 148559, + 148738, + 148524, + 148542, + 148638, + 148525, + 148658, + 148658, + 148422, + 148468, + 148593, + 148358, + 148358, + 148616, + 148810, + 148455, + 148455, + 148518, + 148614, + 148424, + 148530, + 148470, + 148567, + 148567, + 148391, + 148446, + 148650, + 148638, + 148552, + 148495, + 148556, + 148477, + 148381, + 148437, + 148508, + 148590, + 148738, + 148629, + 148481, + 148485, + 148614, + 148661, + 148700, + 148364, + 148701, + 148495, + 148588, + 148451, + 149353, + 148606, + 148760, + 148625, + 148846, + 148686, + 148558, + 148558, + 148496, + 148541, + 148541, + 148582, + 148531, + 148582, + 148622, + 148589, + 148786, + 148423, + 148414, + 148500, + 148630, + 148552, + 148362, + 148601, + 148579, + 148498, + 148576, + 148400, + 148400, + 148527, + 148374, + 148458, + 148458, + 148473, + 148778, + 148502, + 148502, + 148497, + 148522, + 148516, + 148367, + 148687, + 148603, + 148453, + 148438, + 148643, + 148373, + 148718, + 148750, + 148740, + 148705, + 148581, + 149038, + 148685, + 148501, + 148474, + 148474, + 148488, + 148549, + 148445, + 148540, + 148608, + 148645, + 148501, + 148452, + 148685, + 148567, + 148480, + 148703, + 148756, + 148677, + 148660, + 148617, + 148435, + 148652, + 148618, + 148663, + 148638, + 148638, + 148633, + 148526, + 148499, + 148450, + 148322, + 148739, + 148488, + 148768, + 148768, + 148468, + 148416, + 148580, + 148580, + 148564, + 148565, + 148818, + 148339, + 148607, + 148607, + 148403, + 148439, + 148460, + 148650, + 148553, + 148634, + 148477, + 148655, + 148463, + 148456, + 148666, + 148769, + 148581, + 148614, + 148876, + 148690, + 148764, + 148527, + 148957, + 148567, + 148576, + 148327, + 148327, + 148391, + 148626, + 148769, + 148582, + 148446, + 148637, + 148543, + 148761, + 148584, + 148584, + 148731, + 148515, + 148804, + 148668, + 148645, + 148849, + 148849, + 148591, + 148665, + 148542, + 148580, + 148564, + 148512, + 148913, + 148371, + 148670, + 148458, + 148458, + 149090, + 148400, + 148366, + 148438, + 148515, + 148632, + 148683, + 148454, + 148655, + 148553, + 148490, + 148605, + 148907, + 148582, + 148658, + 148462, + 148655, + 148563, + 148707, + 148693, + 149204, + 148640, + 148454, + 148721, + 148340, + 148340, + 148472, + 148669, + 148557, + 148476, + 148476, + 148529, + 148597, + 148546, + 148487, + 148609, + 148738, + 148577, + 148577, + 148689, + 148687, + 148541, + 148544, + 148630, + 148529, + 148488, + 148470, + 148652, + 148479, + 148510, + 148566, + 148518, + 148816, + 148496, + 148514, + 148547, + 148600, + 148892, + 148666, + 148492, + 148584, + 148654, + 148527, + 148670, + 148670, + 149060, + 148414, + 148685, + 148485, + 148448, + 148745, + 148534, + 148606, + 148606, + 148552, + 148616, + 148318, + 148481, + 148426, + 148395, + 148673, + 148682, + 148682, + 148444, + 148904, + 148537, + 148537, + 148946, + 148518, + 148526, + 148503, + 148584, + 148584, + 148639, + 148675, + 148701, + 148600, + 148600, + 148524, + 148520, + 148943, + 148410, + 148633, + 148776, + 148869, + 148500, + 148570, + 148366, + 148478, + 148779, + 148504, + 148741, + 148582, + 148582, + 148414, + 148414, + 148576, + 148604, + 148659, + 148932, + 148932, + 148479, + 153206, + 148474, + 148455, + 148526, + 148484, + 148414, + 148754, + 148523, + 148669, + 148433, + 148853, + 148417, + 148403, + 148750, + 148603, + 148495, + 148447, + 148553, + 148602, + 148625, + 148401, + 148530, + 148646, + 148646, + 148685, + 148500, + 148454, + 148472, + 148444, + 148654, + 148581, + 148581, + 148609, + 149049, + 148576, + 148455, + 148460, + 148556, + 148430, + 148646, + 148646, + 148877, + 148814, + 148357, + 148429, + 148509, + 148610, + 148434, + 148499, + 148545, + 148520, + 148652, + 148585, + 148585, + 148438, + 148645, + 148599, + 148412, + 148567, + 148460, + 148490, + 148490, + 148574, + 148678, + 148427, + 148395, + 148611, + 148491, + 148583, + 148603, + 148419, + 148505, + 148489, + 148396, + 148550, + 148504, + 148546, + 148695, + 148437, + 148467, + 148522, + 148439, + 148637, + 148542, + 148588, + 148456, + 148755, + 148469, + 148718, + 148538, + 148699, + 148367, + 148458, + 148397, + 148496, + 219053, + 214283, + 149044, + 148477, + 148574, + 148476, + 148423, + 148768, + 148551, + 148521, + 148542, + 148602, + 148578, + 148421, + 148387, + 148698, + 148669, + 148747, + 148626, + 148401, + 148458, + 148447, + 148567, + 148618, + 149138, + 148709, + 148484, + 148707, + 148541, + 148392, + 148541, + 148356, + 148490, + 148555, + 148340, + 148638, + 148547, + 148610, + 148533, + 148612, + 148636, + 148719, + 148528, + 148621, + 148496, + 148648, + 148393, + 148651, + 148495, + 148600, + 148528, + 148534, + 148507, + 148483, + 148493, + 148539, + 148557, + 148611, + 148548, + 148486, + 148559, + 148618, + 148704, + 148559, + 148450, + 148415, + 148513, + 148370, + 148436, + 148619, + 148573, + 148359, + 148755, + 148636, + 148487, + 148524, + 148628, + 148903, + 148903, + 148449, + 148572, + 148676, + 148388, + 148625, + 148478, + 148625, + 148357, + 148714, + 148788, + 148587, + 148488, + 148540, + 148714, + 148572, + 148534, + 148414, + 148486, + 148400, + 148445, + 148444, + 148488, + 148517, + 148484, + 148531, + 148815, + 148730, + 148576, + 148568, + 148472, + 148452, + 148624, + 148443, + 148704, + 148417, + 148591, + 148663, + 148507, + 148497, + 148468, + 148856, + 148894, + 148526, + 148733, + 148463, + 148432, + 148700, + 148441, + 148526, + 148327, + 148477, + 148595, + 148459, + 149117, + 148543, + 148621, + 148768, + 148653, + 148714, + 148458, + 148571, + 148796, + 148511, + 148536, + 148474, + 148452, + 148610, + 148753, + 148525, + 148566, + 148527, + 148427, + 148382, + 148878, + 148528, + 148717, + 148562, + 148496, + 148570, + 148612, + 148617, + 148537, + 148626, + 148702, + 148540, + 148474, + 148647, + 148581, + 148646, + 148605, + 148569, + 148427, + 148432, + 148549, + 148593, + 148384, + 148384, + 148425, + 148475, + 148485, + 148491, + 148784, + 148447, + 148601, + 148379, + 148693, + 148740, + 148654, + 148812, + 148391, + 148581, + 148462, + 148511, + 148339, + 148509, + 148594, + 148467, + 148549, + 148662, + 148633, + 148547, + 148526, + 148482, + 148657, + 148590, + 148448, + 148497, + 148474, + 148527, + 148663, + 148515, + 148412, + 148461, + 148796, + 148386, + 148598, + 148476, + 148490, + 148393, + 148713, + 148614, + 148528, + 148413, + 148560, + 148408, + 148494, + 148592, + 148374, + 148850, + 148634, + 148584, + 148599, + 148447, + 148897, + 148557, + 148508, + 148798, + 148764, + 148719, + 148609, + 148543, + 148395, + 148375, + 148912, + 148371, + 148495, + 148437, + 148611, + 148494, + 148503, + 148686, + 148665, + 148363, + 148514, + 148661, + 148543, + 148469, + 148452, + 148850, + 148637, + 148787, + 148400, + 148480, + 148474, + 148690, + 148751, + 148699, + 148664, + 148456, + 148537, + 148517, + 148646, + 148524, + 148577, + 148664, + 148495, + 148721, + 148527, + 148573, + 148473, + 148749, + 148862, + 148559, + 148585, + 148497, + 148585, + 148529, + 148402, + 148606, + 148470, + 148492, + 148581, + 148548, + 148387, + 148369, + 148774, + 148705, + 148790, + 148681, + 148559, + 148449, + 148746, + 148751, + 148670, + 148601, + 148474, + 148638, + 148365, + 148604, + 148377, + 148430, + 148559, + 148563, + 148713, + 148619, + 148457, + 148775, + 148377, + 148705, + 148597, + 148607, + 148536, + 148527, + 148530, + 148578, + 148575, + 148597, + 148714, + 148466, + 148642, + 148564, + 148442, + 148524, + 148981, + 148653, + 148597, + 148409, + 148606, + 148469, + 148472, + 148506, + 148533, + 148511, + 148633, + 149056, + 148708 + ], + "sample_count": 1269 + }, + { + "pubkey": "HAwMCcQ5tB4VCAx5qmL9sxgik1YV7FtNQ6p5ZAE8GHR8", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242239000000, + "samples": [ + 148461, + 148701, + 148795, + 148502, + 148623, + 148500, + 148791, + 148557, + 148607, + 148554, + 148542, + 148588, + 148681, + 148694, + 148556, + 148821, + 148704, + 148728, + 148568, + 148655, + 148433, + 148508, + 148540, + 148553, + 148539, + 148537, + 148768, + 148668, + 148652, + 148682, + 148570, + 148542, + 148728, + 148773, + 148730, + 148561, + 148729, + 148569, + 148647, + 148745, + 148486, + 148635, + 148675, + 148486, + 148692, + 148518, + 148734, + 148631, + 148602, + 148636, + 148609, + 148725, + 148794, + 148650, + 148493, + 148727, + 148512, + 148676, + 148726, + 148737, + 148633, + 148725, + 148804, + 148496, + 148777, + 148718, + 148782, + 148727, + 148518, + 148712, + 148439, + 148591, + 148487, + 148516, + 148514, + 148662, + 148590, + 148621, + 148675, + 148789, + 148506, + 148787, + 148774, + 148637, + 148726, + 148762, + 148825, + 148432, + 148556, + 148644, + 148407, + 148768, + 148581, + 148545, + 148739, + 148401, + 148641, + 148736, + 148667, + 148667, + 148499, + 148611, + 148618, + 148494, + 148683, + 148749, + 148692, + 148583, + 148530, + 148701, + 148778, + 148782, + 148630, + 148640, + 148709, + 148524, + 148503, + 148627, + 148513, + 148715, + 148541, + 148682, + 148652, + 148568, + 148704, + 148508, + 148586, + 148655, + 148737, + 148735, + 148552, + 148462, + 148680, + 148767, + 148483, + 148344, + 148672, + 148466, + 148683, + 148516, + 148805, + 148710, + 148490, + 148496, + 148752, + 148514, + 148711, + 148757, + 148496, + 148744, + 148573, + 148643, + 148470, + 148556, + 148568, + 148446, + 148484, + 148790, + 148395, + 148572, + 148633, + 148509, + 148578, + 148556, + 148553, + 148404, + 148460, + 148791, + 148529, + 148649, + 148502, + 148729, + 148641, + 148530, + 148857, + 148714, + 148757, + 148736, + 148439, + 148783, + 148742, + 148634, + 148713, + 148549, + 148641, + 148560, + 148730, + 148652, + 148746, + 148524, + 148747, + 148638, + 148471, + 148407, + 148544, + 148579, + 148732, + 148713, + 148485, + 148699, + 148469, + 148721, + 148514, + 148627, + 148608, + 148515, + 148692, + 148558, + 148432, + 148636, + 148588, + 148708, + 148677, + 148768, + 148578, + 148525, + 148699, + 148533, + 148707, + 148481, + 148702, + 148548, + 148510, + 148703, + 148515, + 148741, + 148750, + 148676, + 148724, + 148481, + 148764, + 148704, + 148642, + 148720, + 148655, + 148482, + 148790, + 148700, + 148504, + 148741, + 148780, + 148748, + 148752, + 148449, + 148630, + 148648, + 148527, + 148678, + 148718, + 148747, + 148758, + 148609, + 148682, + 148743, + 148722, + 148526, + 148662, + 148670, + 148553, + 148605, + 148684, + 148498, + 148457, + 148407, + 148640, + 148640, + 148511, + 148660, + 148560, + 148649, + 148501, + 148599, + 148740, + 148580, + 148466, + 148589, + 148572, + 148574, + 148438, + 148561, + 148751, + 148551, + 148595, + 148618, + 148606, + 148480, + 148745, + 148765, + 148611, + 148762, + 148774, + 148572, + 148595, + 148712, + 148762, + 148441, + 148786, + 148678, + 148513, + 148670, + 148468, + 148497, + 148699, + 148645, + 148714, + 148554, + 148750, + 148598, + 148788, + 148630, + 148533, + 148571, + 148676, + 148462, + 148637, + 148550, + 148754, + 148536, + 148552, + 148713, + 148622, + 148594, + 148673, + 148549, + 148798, + 148653, + 148857, + 148787, + 148530, + 148607, + 148660, + 148712, + 148750, + 148593, + 148728, + 148551, + 148632, + 148709, + 148673, + 148507, + 148748, + 148829, + 148662, + 148540, + 148446, + 148608, + 148596, + 148635, + 148451, + 148719, + 148431, + 148656, + 148615, + 148688, + 148565, + 148706, + 148755, + 148509, + 148535, + 148608, + 148684, + 148718, + 148791, + 148702, + 148664, + 148728, + 148586, + 148527, + 148719, + 148710, + 148505, + 148578, + 148634, + 148511, + 148700, + 148415, + 148647, + 148633, + 148663, + 148807, + 148499, + 148486, + 148651, + 148584, + 148605, + 148590, + 148632, + 148622, + 148413, + 148696, + 148511, + 148603, + 148679, + 148677, + 148755, + 148741, + 148633, + 148633, + 148690, + 148560, + 148442, + 148553, + 148602, + 148629, + 148578, + 148488, + 148635, + 148743, + 148535, + 148581, + 148555, + 148508, + 148552, + 148464, + 148717, + 148419, + 148712, + 148569, + 148670, + 148566, + 148587, + 148700, + 148811, + 148454, + 148720, + 148557, + 148737, + 148594, + 148695, + 148734, + 148691, + 148600, + 148718, + 148708, + 148543, + 148541, + 148563, + 148680, + 148664, + 148714, + 148563, + 148783, + 148702, + 148682, + 148690, + 148620, + 148400, + 148664, + 148539, + 148672, + 148619, + 148812, + 148626, + 148713, + 148767, + 148635, + 148785, + 148559, + 148590, + 148691, + 148558, + 148754, + 148838, + 148393, + 148684, + 148537, + 148738, + 148579, + 150401, + 148391, + 148534, + 148655, + 148673, + 148716, + 148757, + 148564, + 148765, + 148430, + 148583, + 148675, + 148470, + 148769, + 148514, + 148567, + 148753, + 148441, + 148526, + 148559, + 148606, + 148542, + 148690, + 148534, + 148559, + 148690, + 148631, + 148576, + 148631, + 148746, + 148384, + 148753, + 148660, + 148768, + 148628, + 148687, + 148663, + 148513, + 148773, + 148661, + 148693, + 148758, + 148677, + 148626, + 148520, + 148672, + 148798, + 148450, + 148565, + 148487, + 148567, + 148464, + 148632, + 148666, + 148624, + 148731, + 148629, + 148651, + 148626, + 148793, + 148522, + 148602, + 148463, + 148717, + 148508, + 148661, + 148548, + 148747, + 148491, + 148641, + 148585, + 148698, + 148586, + 148619, + 148652, + 148757, + 148596, + 148528, + 148700, + 148618, + 148734, + 148571, + 148617, + 148583, + 148751, + 148693, + 148773, + 148488, + 148796, + 148813, + 148644, + 148543, + 148355, + 148727, + 148760, + 148471, + 148634, + 148781, + 148759, + 148589, + 148588, + 148719, + 148746, + 148829, + 148598, + 148516, + 148659, + 148442, + 148620, + 148707, + 148703, + 148593, + 148483, + 148823, + 148634, + 148585, + 148447, + 148497, + 148765, + 148702, + 148478, + 148684, + 148765, + 148507, + 148806, + 148734, + 148829, + 148778, + 148746, + 148592, + 148810, + 148709, + 148651, + 148576, + 148561, + 148562, + 148691, + 148554, + 148603, + 148676, + 148536, + 148669, + 148585, + 148748, + 148707, + 148722, + 148640, + 148676, + 148648, + 148647, + 148601, + 148583, + 148471, + 148786, + 148747, + 148809, + 148560, + 148576, + 148616, + 148513, + 148604, + 148790, + 148525, + 148796, + 148678, + 148673, + 148737, + 148802, + 148759, + 148500, + 148648, + 148679, + 148574, + 148816, + 148653, + 148635, + 148423, + 148535, + 148747, + 148516, + 148751, + 148679, + 148588, + 148574, + 148640, + 148468, + 148469, + 148639, + 148843, + 148633, + 148766, + 148662, + 148773, + 148664, + 148644, + 148490, + 148757, + 148599, + 148831, + 148585, + 148634, + 148598, + 148633, + 148684, + 148681, + 148525, + 148675, + 148477, + 148793, + 148655, + 148768, + 148669, + 148601, + 148520, + 148510, + 148691, + 148746, + 148510, + 148437, + 148540, + 148491, + 148753, + 148672, + 148616, + 148682, + 148797, + 148568, + 148696, + 148745, + 148705, + 148793, + 148525, + 148492, + 148751, + 148549, + 148708, + 148510, + 148539, + 148643, + 148656, + 148637, + 148676, + 148669, + 148512, + 148799, + 148448, + 148760, + 148618, + 148772, + 148550, + 148606, + 148734, + 148450, + 148536, + 148766, + 148729, + 148765, + 148815, + 148759, + 148758, + 148606, + 148707, + 148609, + 148611, + 148658, + 148641, + 148641, + 148437, + 148678, + 148605, + 148697, + 148524, + 148597, + 148666, + 148530, + 148571, + 148721, + 148467, + 148731, + 148761, + 148466, + 148532, + 148795, + 148499, + 148714, + 148662, + 148551, + 148731, + 148707, + 148504, + 148776, + 148665, + 148598, + 148745, + 148628, + 148466, + 148492, + 148501, + 148594, + 148722, + 148562, + 148800, + 148681, + 148711, + 148600, + 148727, + 148677, + 148509, + 148525, + 148637, + 148616, + 148581, + 148448, + 148604, + 148688, + 148536, + 148562, + 148549, + 148760, + 148614, + 148560, + 148670, + 148742, + 148769, + 148593, + 148732, + 148531, + 148753, + 148755, + 148798, + 148640, + 148778, + 148575, + 148736, + 148528, + 148410, + 148559, + 148493, + 148821, + 148681, + 148733, + 148750, + 148415, + 148508, + 148492, + 148676, + 148670, + 148562, + 148714, + 148613, + 148588, + 148557, + 148503, + 148466, + 148446, + 148445, + 148657, + 148627, + 148806, + 148756, + 148560, + 148650, + 148804, + 148581, + 148554, + 148764, + 148713, + 148704, + 148533, + 148480, + 148543, + 148728, + 148496, + 148638, + 148600, + 148526, + 148624, + 148616, + 148654, + 148519, + 148578, + 148579, + 148613, + 148478, + 148561, + 148691, + 148736, + 148491, + 148628, + 148477, + 148585, + 148713, + 148619, + 148592, + 148722, + 148548, + 148692, + 148515, + 148738, + 148700, + 148604, + 148726, + 148474, + 148774, + 148691, + 148525, + 148784, + 148575, + 148569, + 148572, + 148733, + 148723, + 148769, + 148728, + 148815, + 148584, + 148764, + 148558, + 148583, + 148748, + 148662, + 148792, + 148675, + 148534, + 148676, + 148541, + 148739, + 148755, + 148767, + 148658, + 148678, + 148756, + 148615, + 148634, + 148532, + 148559, + 148596, + 148745, + 148683, + 148805, + 148527, + 148610, + 148696, + 148573, + 148548, + 148619, + 148586, + 148512, + 148481, + 148561, + 213877, + 148635, + 148652, + 148518, + 148717, + 148808, + 148518, + 148630, + 148622, + 148616, + 148588, + 148605, + 148716, + 148540, + 148716, + 148721, + 148710, + 148487, + 148605, + 148764, + 148679, + 148761, + 148534, + 148594, + 148589, + 148577, + 148563, + 148644, + 148501, + 148714, + 148547, + 148636, + 148650, + 148568, + 148712, + 148629, + 148677, + 148591, + 148705, + 148738, + 148761, + 148662, + 148525, + 148531, + 148693, + 148530, + 148834, + 148620, + 148776, + 148619, + 148608, + 148729, + 148660, + 148568, + 148574, + 148499, + 148704, + 148722, + 148535, + 148823, + 148607, + 148529, + 148642, + 148635, + 148874, + 148779, + 148686, + 148830, + 148659, + 148793, + 148687, + 148748, + 148819, + 148691, + 148716, + 148609, + 148806, + 148763, + 148689, + 148827, + 148551, + 148831, + 148644, + 148552, + 148640, + 148626, + 148702, + 148682, + 148615, + 148760, + 148605, + 148588, + 148765, + 148677, + 148568, + 148520, + 148855, + 148713, + 148770, + 148582, + 148590, + 148536, + 148866, + 148686, + 148535, + 148609, + 148491, + 148533, + 148473, + 148569, + 148741, + 148608, + 148735, + 148536, + 148476, + 148670, + 148700, + 148740, + 148530, + 148647, + 148671, + 148791, + 148766, + 148511, + 148745, + 148678, + 148710, + 148528, + 148618, + 148657, + 148588, + 148686, + 148706, + 148660, + 148540, + 148570, + 148761, + 148753, + 148664, + 148640, + 148743, + 148584, + 148629, + 148440, + 148694, + 148613, + 148514, + 148554, + 148575, + 148722, + 148461, + 148615, + 148562, + 148393, + 148566, + 148585, + 148558, + 148607, + 148755, + 148736, + 148687, + 148793, + 148630, + 148576, + 148767, + 148618, + 148468, + 148731, + 148677, + 148668, + 148712, + 148728, + 148690, + 148462, + 148709, + 148722, + 148575, + 148519, + 148382, + 148717, + 148668, + 148750, + 148525, + 148547, + 148561, + 148615, + 148533, + 148496, + 148571, + 148774, + 148693, + 148734, + 148751, + 148717, + 148439, + 148722, + 148696, + 148591, + 148582, + 148727, + 148494, + 148796, + 148571, + 148699, + 148695, + 148702, + 148598, + 148646, + 148626, + 148751, + 148625, + 148834, + 148716, + 148641, + 148528, + 148665, + 148654, + 148732, + 148692, + 148772, + 148620, + 148804, + 148747, + 148724, + 148491, + 148651, + 148598, + 148515, + 148623, + 148585, + 148727, + 148662, + 148760, + 148512, + 148721, + 148821, + 148746, + 148616, + 148568, + 148506, + 148492, + 148785, + 148535, + 148462, + 148812, + 148532, + 148569, + 148658, + 148693, + 148717, + 148641, + 148739, + 148735, + 148704, + 148765, + 148745, + 148706, + 148696, + 148462, + 148577, + 148552, + 148740, + 148787, + 148685, + 148622, + 148682, + 148806, + 148534, + 148679, + 148762, + 148766, + 148684, + 148784, + 148543, + 148622, + 148615, + 148789, + 148644, + 148752, + 148675, + 148730, + 148678, + 148664, + 148655, + 148475, + 148790, + 148612, + 148609, + 148787, + 148689, + 148622, + 148747, + 148479, + 148427, + 148745, + 148696, + 148774, + 148476, + 148625, + 148589, + 148748, + 148524, + 148484, + 148574, + 148739, + 148652, + 148688, + 148576, + 148484, + 148668, + 148609, + 148678, + 148797, + 148750, + 148751, + 148505, + 148709, + 148772, + 148713, + 148621, + 148733, + 148749, + 148770, + 148673, + 148613, + 148801, + 148599, + 148619, + 148610, + 148644, + 148700, + 148608, + 148398, + 148502, + 148676, + 148652, + 148868, + 148600, + 148778, + 148792, + 148817, + 148740, + 148801, + 148784 + ], + "sample_count": 1262 + }, + { + "pubkey": "3qeM4chqtZULLhHdzdczPDB24RCW7n7jhH7Gca2UgYoK", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242233000000, + "samples": [ + 80615, + 78740, + 81320, + 79722, + 79522, + 79594, + 78410, + 80084, + 79680, + 81310, + 79491, + 79706, + 81246, + 79489, + 79677, + 78785, + 80327, + 78596, + 78580, + 79559, + 81295, + 81472, + 79937, + 81373, + 80209, + 78647, + 79865, + 81368, + 78643, + 79621, + 78700, + 79594, + 78593, + 80059, + 79629, + 80338, + 77729, + 79467, + 79711, + 78576, + 78589, + 79991, + 81267, + 74533, + 75769, + 75640, + 74499, + 77181, + 75286, + 78685, + 79680, + 79942, + 79824, + 80048, + 79520, + 80324, + 81246, + 78522, + 81464, + 81174, + 79540, + 78639, + 81568, + 78153, + 76314, + 76366, + 75510, + 77287, + 77284, + 75311, + 75493, + 75829, + 77200, + 77185, + 77136, + 77182, + 77384, + 79249, + 77782, + 79143, + 76259, + 77349, + 77234, + 76214, + 77132, + 77127, + 77160, + 77276, + 79577, + 81214, + 78899, + 80093, + 79582, + 78758, + 78676, + 78640, + 81397, + 81247, + 81079, + 78649, + 81304, + 81426, + 81241, + 78677, + 79701, + 79822, + 78773, + 80199, + 79161, + 79609, + 79825, + 79810, + 80297, + 80172, + 80507, + 79721, + 78869, + 78530, + 79666, + 81285, + 81522, + 78585, + 80131, + 79931, + 79684, + 79787, + 79591, + 78663, + 79653, + 81479, + 81257, + 81586, + 81472, + 81231, + 78592, + 79858, + 78563, + 79991, + 79823, + 81514, + 79954, + 81386, + 79409, + 79724, + 81470, + 78696, + 80055, + 81463, + 79700, + 79762, + 78772, + 80006, + 81514, + 81407, + 80028, + 81915, + 79584, + 81670, + 79763, + 79798, + 81365, + 81169, + 82719, + 78678, + 81486, + 78700, + 79507, + 81420, + 79665, + 78733, + 78866, + 80250, + 80212, + 81499, + 78607, + 79959, + 78863, + 80192, + 82557, + 79411, + 79740, + 81214, + 81410, + 79709, + 81427, + 79811, + 79730, + 78738, + 81373, + 81525, + 79627, + 80291, + 79544, + 82593, + 80123, + 79672, + 79634, + 80161, + 80393, + 78714, + 81383, + 78555, + 78858, + 81231, + 81467, + 81350, + 79996, + 79484, + 81340, + 81360, + 78763, + 81235, + 80262, + 79974, + 81306, + 78586, + 81494, + 79787, + 78702, + 78592, + 81252, + 82405, + 82588, + 79679, + 79487, + 78611, + 81421, + 79711, + 79521, + 79662, + 78679, + 80106, + 81343, + 79661, + 84401, + 81428, + 79998, + 81426, + 78581, + 78510, + 79706, + 81122, + 81105, + 78972, + 77806, + 77801, + 77676, + 79054, + 78805, + 81354, + 78667, + 75739, + 77037, + 78943, + 78879, + 81458, + 79977, + 78484, + 77220, + 75333, + 75601, + 75601, + 74369, + 75996, + 75493, + 77233, + 75363, + 75501, + 85034, + 79580, + 80011, + 78532, + 80110, + 78677, + 78580, + 79589, + 81241, + 81429, + 80111, + 81500, + 80013, + 78740, + 78630, + 81529, + 78805, + 79531, + 78654, + 79649, + 78785, + 79997, + 79612, + 80162, + 79977, + 81543, + 80912, + 78460, + 78601, + 80073, + 81387, + 78595, + 80264, + 79889, + 78512, + 81342, + 79699, + 78442, + 79644, + 80296, + 79584, + 79872, + 79590, + 79857, + 81247, + 78762, + 81247, + 81524, + 79759, + 78562, + 81455, + 80031, + 78626, + 78547, + 79706, + 82519, + 82542, + 80662, + 79936, + 79975, + 81946, + 81365, + 81730, + 81360, + 79768, + 84825, + 80051, + 81450, + 74612, + 77089, + 77208, + 75839, + 77143, + 81433, + 82143, + 81214, + 79558, + 81539, + 78611, + 80053, + 79563, + 78524, + 78477, + 78562, + 80024, + 79933, + 79637, + 78535, + 81447, + 81466, + 81318, + 78467, + 79436, + 79872, + 78567, + 80268, + 78741, + 79489, + 79752, + 79385, + 80087, + 79949, + 79884, + 79745, + 78434, + 78774, + 79700, + 81394, + 81429, + 78683, + 80189, + 80122, + 79658, + 79404, + 79581, + 78623, + 79458, + 79878, + 78681, + 79963, + 79710, + 79654, + 78625, + 79731, + 78913, + 80096, + 79520, + 81584, + 79572, + 81483, + 79651, + 79546, + 81392, + 78690, + 80116, + 81378, + 79612, + 79866, + 78687, + 79568, + 81394, + 81303, + 80196, + 81288, + 79715, + 84183, + 79828, + 79796, + 81267, + 79601, + 81507, + 78645, + 81544, + 78611, + 79649, + 81147, + 79554, + 78467, + 78640, + 80396, + 81433, + 81386, + 78569, + 80321, + 78816, + 80305, + 81511, + 79875, + 79566, + 81319, + 81742, + 79570, + 81444, + 79694, + 79589, + 78594, + 81447, + 81367, + 79743, + 80192, + 79520, + 81501, + 79873, + 79579, + 79570, + 79990, + 79984, + 78821, + 81361, + 78609, + 78846, + 81255, + 81351, + 81373, + 79952, + 79623, + 81499, + 81891, + 78576, + 79649, + 79931, + 78448, + 81506, + 78717, + 81644, + 79579, + 78590, + 78689, + 81280, + 81349, + 81450, + 79505, + 79616, + 78718, + 81343, + 79645, + 81348, + 79744, + 78760, + 80267, + 81418, + 79667, + 81450, + 81362, + 80047, + 81277, + 78664, + 78486, + 79485, + 81347, + 79985, + 81405, + 80134, + 79614, + 81545, + 81492, + 78972, + 81441, + 78661, + 79922, + 82652, + 78728, + 78669, + 81277, + 79978, + 78577, + 81361, + 79769, + 78530, + 79627, + 78559, + 80239, + 79492, + 81460, + 79637, + 79678, + 81484, + 79650, + 79725, + 78655, + 79948, + 78502, + 78651, + 79524, + 81304, + 81397, + 79918, + 81749, + 79923, + 78438, + 78715, + 78601, + 78698, + 79464, + 78636, + 79629, + 78828, + 81505, + 79619, + 80407, + 79851, + 81406, + 79533, + 79595, + 78391, + 75861, + 77492, + 74262, + 79963, + 79906, + 81466, + 81463, + 79717, + 78413, + 79581, + 79849, + 79707, + 78689, + 79657, + 79984, + 81365, + 78527, + 81474, + 81448, + 79678, + 81404, + 81373, + 80263, + 78929, + 78543, + 79494, + 82483, + 82354, + 79957, + 79811, + 80322, + 82856, + 78654, + 80230, + 82692, + 79690, + 81257, + 81489, + 79709, + 81516, + 81481, + 81465, + 80153, + 81338, + 81371, + 80008, + 81281, + 81519, + 81190, + 79580, + 78634, + 79755, + 81532, + 78584, + 79979, + 80086, + 80270, + 79913, + 79046, + 81437, + 81572, + 82696, + 79687, + 79856, + 78692, + 78580, + 79999, + 78873, + 79680, + 79855, + 79737, + 78743, + 80090, + 80139, + 79627, + 78535, + 79714, + 80079, + 81376, + 81251, + 78607, + 80043, + 79695, + 79665, + 81304, + 79654, + 81559, + 79549, + 79564, + 78430, + 80179, + 79481, + 79740, + 78566, + 79585, + 80507, + 80014, + 81621, + 81306, + 79846, + 81215, + 79546, + 81381, + 81428, + 78663, + 79750, + 81455, + 79839, + 79799, + 78583, + 80080, + 81649, + 81535, + 81244, + 81214, + 79664, + 81397, + 78460, + 79877, + 81907, + 79756, + 78473, + 78688, + 81529, + 78420, + 79594, + 78483, + 81289, + 78516, + 78736, + 80021, + 80020, + 81318, + 78430, + 79960, + 74412, + 75880, + 77347, + 79695, + 79632, + 81178, + 78569, + 78564, + 80241, + 81516, + 79660, + 78464, + 81380, + 81374, + 79958, + 80134, + 79501, + 81503, + 80156, + 81451, + 79698, + 80184, + 80231, + 78661, + 78874, + 78667, + 78614, + 81293, + 81448, + 81187, + 80383, + 78545, + 81530, + 81372, + 78584, + 79551, + 80082, + 78594, + 81376, + 78644, + 80279, + 79542, + 78620, + 78470, + 81448, + 81511, + 81238, + 79942, + 80732, + 78826, + 82650, + 80806, + 82660, + 79594, + 78662, + 80050, + 81474, + 79702, + 78608, + 81294, + 79997, + 81324, + 78559, + 78501, + 79548, + 80297, + 82845, + 81503, + 80035, + 79655, + 81402, + 81471, + 78673, + 82504, + 79960, + 75982, + 77425, + 77779, + 79951, + 82612, + 80016, + 78568, + 81382, + 79619, + 78557, + 75529, + 74472, + 76037, + 75405, + 77324, + 75602, + 75511, + 77172, + 79612, + 79683, + 78553, + 80279, + 79355, + 74437, + 75371, + 77253, + 75541, + 75907, + 74639, + 75918, + 76091, + 75813, + 75861, + 79836, + 80758, + 79830, + 80822, + 81534, + 81374, + 79695, + 80123, + 80008, + 81399, + 79525, + 80412, + 78554, + 80106, + 81467, + 78639, + 79996, + 75802, + 77206, + 77175, + 79489, + 78574, + 79671, + 80054, + 79654, + 78746, + 79549, + 80077, + 81406, + 78799, + 78715, + 81812, + 79743, + 81375, + 81455, + 75891, + 74492, + 78469, + 79487, + 81570, + 81623, + 80445, + 79607, + 79992, + 81527, + 78521, + 78521, + 81519, + 79529, + 81435, + 81946, + 80234, + 81416, + 81477, + 81434, + 80003, + 81432, + 81364, + 80253, + 81472, + 81368, + 81447, + 79706, + 78600, + 79749, + 78637, + 78919, + 78640, + 80010, + 79983, + 79562, + 78727, + 81399, + 81365, + 81344, + 79727, + 79550, + 78442, + 78758, + 80071, + 78724, + 80070, + 79645, + 79553, + 78714, + 80017, + 80066, + 79629, + 78501, + 79670, + 79504, + 81439, + 81423, + 78715, + 80173, + 79531, + 80811, + 81522, + 79727, + 75811, + 79641, + 78629, + 75484, + 76062, + 76062, + 77269, + 77269, + 77348, + 75531, + 81407, + 81255, + 81255, + 79064, + 81595, + 79491, + 79746, + 79746, + 80151, + 81659, + 81659, + 81440, + 81583, + 79513, + 81402, + 81402, + 78549, + 79554, + 81381, + 79662, + 78701, + 81393, + 81393, + 79587, + 79587, + 81292, + 78692, + 78692, + 75870, + 76045, + 81387, + 78491, + 78491, + 80142, + 80251, + 81726, + 81726, + 79743, + 79485, + 81651, + 78712, + 78572, + 80015, + 79647, + 78660, + 81495, + 81495, + 79594, + 79983, + 79983, + 79751, + 79952, + 79952, + 79530, + 79530, + 80074, + 78491, + 78491, + 78481, + 78481, + 78606, + 81414, + 81414, + 80118, + 78905, + 81422, + 81422, + 81460, + 78655, + 80233, + 80233, + 78421, + 81415, + 75918, + 75466, + 79821, + 79821, + 81356, + 81282, + 81282, + 81618, + 79797, + 78592, + 81361, + 81361, + 79636, + 80159, + 78966, + 78966, + 80326, + 75384, + 75384, + 74463, + 81448, + 80150, + 78803, + 78803, + 78528, + 79611, + 81613, + 81613, + 81566, + 80178, + 81295, + 81295, + 78575, + 81400, + 81400, + 78900, + 81477, + 81477, + 81406, + 81423, + 80064, + 78841, + 78841, + 79583, + 78809, + 78809, + 79906, + 80125, + 80125, + 81544, + 81544, + 79702, + 79702, + 81291, + 79616, + 79616, + 78599, + 80295, + 79005, + 79005, + 81419, + 81555, + 80068, + 81240, + 81240, + 78408, + 78753, + 78753, + 78644, + 78644, + 78586, + 78586, + 79623, + 78666, + 75600, + 75817, + 75817, + 81918, + 77501, + 79557, + 79557, + 78491, + 79953, + 78641, + 80085, + 80085, + 81431, + 81431, + 79758, + 78623, + 79556, + 80158, + 79828, + 78636, + 78636, + 79521, + 81539, + 81539, + 78499, + 81421, + 79658, + 81470, + 81560, + 81560, + 80015, + 78560, + 79809, + 81515, + 81433, + 81433, + 80091, + 79555, + 80207, + 78600, + 78562, + 81353, + 79570, + 81300, + 81239, + 81239, + 79734, + 81257, + 81257, + 79863, + 79863, + 81250, + 81111, + 81111, + 81357, + 81632, + 81356, + 79642, + 78471, + 78657, + 78863, + 78863, + 80010, + 80010, + 79515, + 78639, + 81466, + 81725, + 81725, + 79838, + 79524, + 79328, + 80691, + 79948, + 79948, + 78755, + 79700, + 79714, + 79776, + 75850, + 81272, + 80544, + 80544, + 79766, + 77490, + 77133, + 81508, + 80072, + 79626, + 80010, + 80041, + 81382, + 81382, + 79594, + 75380, + 75380, + 79752, + 81042, + 75414, + 75457, + 74343, + 74343, + 75296, + 77304, + 76156, + 77125, + 77274, + 75373, + 78299, + 75520, + 77147, + 77147, + 74588, + 77170, + 75478, + 75478, + 75288, + 74313, + 75739, + 77209, + 77399, + 81301, + 81351, + 81435, + 78450, + 79501, + 79501, + 81577, + 78649, + 78649, + 78644, + 78825, + 79684, + 79684, + 81677, + 76388, + 76388, + 75324, + 75216, + 75216, + 79489, + 79489, + 81344, + 79857, + 81366, + 79669, + 81774, + 81466, + 79574, + 79574, + 79691, + 79970, + 79660, + 79660, + 78731, + 81137, + 81137, + 79948, + 79720, + 81171, + 80031, + 80031, + 79462, + 79997, + 80155, + 80155, + 78699, + 78612, + 78593, + 78593, + 81339, + 81339, + 80126, + 79607, + 79607, + 81127, + 81127, + 78678, + 79875, + 78793, + 80043, + 80043, + 79957, + 79586, + 78578, + 78578, + 81671, + 81671, + 81570, + 81464, + 79618, + 78536, + 78536, + 81490, + 81513, + 81513, + 79573, + 79953, + 79953, + 81806, + 78653, + 78653, + 81295, + 80258, + 78547, + 78607, + 79450, + 80042, + 81970, + 81970, + 77702, + 77281, + 79016, + 79566, + 79566, + 76330 + ], + "sample_count": 1268 + }, + { + "pubkey": "G9wMahpiQ2FmtPM37bfCUxPhLdR2tmSrX8EiDiGyzCCe", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "target_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242244000000, + "samples": [ + 96145, + 96126, + 95868, + 95975, + 95992, + 95983, + 95941, + 96769, + 95939, + 95970, + 96077, + 96034, + 95943, + 96026, + 96385, + 96171, + 96126, + 96058, + 95970, + 96364, + 96045, + 95948, + 96190, + 96126, + 95943, + 95998, + 95994, + 95969, + 96264, + 96110, + 95961, + 95974, + 96060, + 96153, + 95988, + 96031, + 96142, + 96130, + 96209, + 96007, + 95932, + 96012, + 95897, + 95999, + 96250, + 96220, + 95936, + 95930, + 96013, + 96009, + 95977, + 96226, + 96291, + 96092, + 96002, + 96075, + 96000, + 96241, + 95893, + 96187, + 96100, + 95909, + 96293, + 95916, + 95867, + 96169, + 95926, + 96209, + 95971, + 96210, + 95936, + 96120, + 96013, + 96219, + 96044, + 96168, + 96156, + 96008, + 96025, + 96017, + 96042, + 96037, + 96781, + 96013, + 95990, + 95997, + 96004, + 96117, + 96136, + 96086, + 96121, + 96219, + 95968, + 96106, + 95875, + 96260, + 96127, + 96794, + 96006, + 95922, + 96083, + 96010, + 96084, + 96260, + 96235, + 103373, + 95997, + 96019, + 96032, + 96059, + 96334, + 96053, + 96318, + 96324, + 95929, + 95925, + 95896, + 96086, + 96020, + 96371, + 96124, + 96010, + 95960, + 95966, + 96035, + 96227, + 96032, + 96155, + 96136, + 96258, + 95945, + 96012, + 96095, + 96173, + 96131, + 96153, + 96099, + 96042, + 95988, + 95975, + 95960, + 96026, + 96411, + 96000, + 96089, + 96009, + 95986, + 95986, + 95991, + 96191, + 96277, + 96170, + 96074, + 95950, + 96003, + 95971, + 95945, + 96139, + 96121, + 96347, + 95977, + 96015, + 96341, + 96194, + 96054, + 96068, + 96699, + 95982, + 96099, + 96131, + 96167, + 96252, + 96391, + 96083, + 96135, + 96161, + 96127, + 96240, + 96464, + 96073, + 96154, + 96072, + 96255, + 96027, + 96019, + 96304, + 96022, + 96275, + 95994, + 95966, + 96042, + 96032, + 95973, + 95968, + 96473, + 96092, + 95959, + 95946, + 95989, + 96198, + 96073, + 95943, + 96068, + 96050, + 96155, + 96153, + 96131, + 96269, + 96192, + 96089, + 96228, + 96007, + 95955, + 96070, + 96135, + 96175, + 96125, + 96073, + 95890, + 96193, + 96092, + 96135, + 95994, + 96576, + 96150, + 96215, + 96264, + 95989, + 96300, + 96128, + 95954, + 96067, + 96116, + 96109, + 96068, + 96106, + 95996, + 96279, + 96025, + 96148, + 96082, + 95942, + 96260, + 96064, + 96095, + 96147, + 96022, + 96288, + 96185, + 96545, + 95948, + 96062, + 96032, + 96064, + 96330, + 96045, + 96224, + 95926, + 96199, + 97516, + 95992, + 95929, + 96177, + 96038, + 96204, + 96269, + 96116, + 95970, + 96100, + 96117, + 96059, + 96234, + 95995, + 95960, + 96117, + 96002, + 96015, + 96258, + 96479, + 96193, + 95970, + 96139, + 96005, + 95961, + 96298, + 96007, + 96083, + 95950, + 96015, + 96023, + 96313, + 96102, + 96252, + 96012, + 96053, + 96060, + 95984, + 96242, + 95994, + 96134, + 96180, + 95895, + 95925, + 95900, + 95923, + 96067, + 96064, + 96182, + 96083, + 96098, + 96017, + 96009, + 95996, + 95982, + 96109, + 96120, + 95976, + 96247, + 96097, + 95937, + 96010, + 96033, + 96128, + 95927, + 95839, + 95972, + 96085, + 96044, + 96064, + 96293, + 96044, + 96012, + 95878, + 95956, + 96115, + 95935, + 95918, + 96102, + 96052, + 95948, + 95910, + 95953, + 95954, + 96042, + 96167, + 96147, + 95997, + 95958, + 95888, + 95970, + 95990, + 95917, + 96531, + 95992, + 96214, + 95884, + 95903, + 95975, + 95915, + 96125, + 96034, + 95945, + 96215, + 95937, + 95982, + 96256, + 95899, + 96223, + 96007, + 95887, + 96171, + 96169, + 95963, + 95991, + 96010, + 96066, + 95947, + 95842, + 95924, + 96012, + 96116, + 96251, + 96153, + 95938, + 95900, + 95896, + 96201, + 95840, + 95865, + 95972, + 96033, + 95890, + 95905, + 95951, + 95927, + 95960, + 95937, + 96102, + 96009, + 96038, + 95983, + 96025, + 95988, + 95934, + 95967, + 96074, + 95908, + 95953, + 96226, + 96234, + 95923, + 95980, + 96218, + 95936, + 95883, + 95950, + 96025, + 96029, + 96170, + 96013, + 95974, + 95865, + 96140, + 95931, + 96234, + 95968, + 96042, + 96228, + 95973, + 95954, + 96035, + 95887, + 95984, + 95970, + 96513, + 96133, + 95906, + 96009, + 95853, + 95939, + 95931, + 95874, + 96058, + 95992, + 95882, + 96001, + 95952, + 96108, + 95874, + 96061, + 96237, + 95888, + 95865, + 95921, + 99997, + 95965, + 95979, + 96070, + 95925, + 95981, + 95992, + 95891, + 96038, + 95940, + 96025, + 96240, + 96028, + 95958, + 95997, + 95872, + 95977, + 96001, + 96238, + 96060, + 95811, + 96014, + 95902, + 96084, + 96013, + 96313, + 96015, + 94528, + 94465, + 94363, + 94369, + 94427, + 94422, + 94635, + 94518, + 94472, + 94564, + 94486, + 94478, + 94438, + 94411, + 94462, + 94493, + 94381, + 94447, + 94367, + 94540, + 94441, + 94501, + 94441, + 94402, + 94412, + 94382, + 94386, + 94458, + 94412, + 94509, + 94439, + 94380, + 94357, + 94518, + 94453, + 94366, + 94990, + 94582, + 94519, + 94395, + 94504, + 94436, + 94345, + 94523, + 94445, + 94415, + 94469, + 94344, + 94426, + 94489, + 94465, + 95154, + 94324, + 94415, + 94499, + 94370, + 94742, + 94516, + 94495, + 94546, + 94628, + 94426, + 94487, + 94334, + 94417, + 94576, + 94641, + 94610, + 94552, + 94386, + 94346, + 94561, + 94707, + 94927, + 96115, + 96184, + 95939, + 95932, + 96119, + 95997, + 95991, + 96203, + 96658, + 95926, + 96118, + 96116, + 96054, + 96124, + 95988, + 96136, + 96153, + 95935, + 95952, + 95995, + 96004, + 96069, + 96334, + 96013, + 96292, + 96164, + 95920, + 95980, + 95983, + 96193, + 96067, + 95981, + 96161, + 95896, + 95936, + 96143, + 95902, + 96209, + 96010, + 96007, + 96095, + 96042, + 96195, + 96161, + 96079, + 98704, + 94429, + 94397, + 94427, + 94438, + 94578, + 94570, + 94568, + 94401, + 94483, + 94446, + 95222, + 94517, + 94586, + 94566, + 94620, + 94617, + 94426, + 94493, + 94650, + 94459, + 94620, + 94598, + 94438, + 94494, + 94458, + 94456, + 94830, + 94446, + 94531, + 94589, + 94363, + 94445, + 94478, + 94405, + 94606, + 94567, + 94674, + 94759, + 94578, + 94679, + 94420, + 94730, + 94769, + 94525, + 94545, + 94503, + 94360, + 94469, + 94778, + 94596, + 94638, + 94617, + 94617, + 94538, + 94484, + 94427, + 94595, + 94542, + 94858, + 94603, + 94461, + 94524, + 94734, + 94525, + 94578, + 94459, + 94614, + 94456, + 94515, + 94421, + 94596, + 94435, + 94515, + 94667, + 94828, + 94516, + 94738, + 94538, + 94383, + 94495, + 94548, + 94700, + 94448, + 94352, + 94738, + 94498, + 94791, + 94548, + 94603, + 94634, + 94562, + 94510, + 94491, + 94423, + 94437, + 94479, + 94560, + 94609, + 94475, + 94440, + 94455, + 94505, + 94479, + 94477, + 94739, + 94359, + 94625, + 94478, + 94455, + 95645, + 94470, + 94629, + 94560, + 94538, + 94461, + 94434, + 94521, + 94552, + 94541, + 94807, + 94511, + 94464, + 94713, + 94796, + 94627, + 94707, + 94899, + 94854, + 94463, + 94675, + 94358, + 94410, + 94398, + 94452, + 94384, + 94478, + 94471, + 94776, + 94720, + 94728, + 94585, + 94790, + 94809, + 94655, + 94528, + 94461, + 94652, + 94444, + 94561, + 94568, + 94468, + 94520, + 94599, + 94631, + 94609, + 94553, + 94748, + 94527, + 94406, + 94525, + 94448, + 94501, + 94419, + 94950, + 94543, + 94502, + 94548, + 94848, + 94731, + 94591, + 94462, + 94648, + 94589, + 94482, + 94415, + 94524, + 94589, + 94557, + 94553, + 94635, + 94436, + 94613, + 94399, + 94458, + 94364, + 94602, + 94753, + 94409, + 94498, + 94471, + 94532, + 94599, + 94458, + 94621, + 94526, + 94442, + 94424, + 94504, + 94458, + 94475, + 94494, + 95044, + 94513, + 95939, + 94597, + 94579, + 94415, + 94735, + 94459, + 95359, + 94409, + 94329, + 94908, + 94452, + 94645, + 94456, + 95041, + 94577, + 94767, + 94562, + 94486, + 94528, + 96053, + 96397, + 96157, + 96470, + 113823, + 96304, + 96007, + 96310, + 96151, + 96263, + 95972, + 96125, + 96113, + 96143, + 96023, + 96361, + 96239, + 96215, + 96225, + 96074, + 95972, + 96049, + 96220, + 96118, + 96152, + 96003, + 95920, + 96068, + 95932, + 96028, + 96176, + 96104, + 96141, + 96028, + 96007, + 95956, + 96025, + 96387, + 96102, + 96188, + 96012, + 96003, + 96116, + 96047, + 96043, + 96068, + 96152, + 96081, + 96151, + 99949, + 96237, + 96049, + 96088, + 94533, + 94768, + 94651, + 94503, + 94569, + 94373, + 94476, + 94476, + 94689, + 96041, + 96324, + 96096, + 95991, + 95968, + 96029, + 95972, + 96421, + 96007, + 96002, + 96152, + 96013, + 96076, + 96076, + 96420, + 96151, + 96151, + 96195, + 96195, + 96228, + 96192, + 96192, + 96087, + 96202, + 96093, + 96093, + 96105, + 96077, + 96163, + 96163, + 96074, + 96174, + 96595, + 96090, + 96090, + 96030, + 96162, + 96168, + 96073, + 96073, + 96212, + 96151, + 96151, + 96310, + 96140, + 96140, + 95965, + 96521, + 96105, + 96231, + 96232, + 96060, + 96119, + 96021, + 96050, + 96105, + 96094, + 96347, + 96001, + 96001, + 96053, + 95976, + 96530, + 96512, + 96351, + 96037, + 95996, + 96143, + 96098, + 96098, + 96064, + 96315, + 96108, + 96001, + 96019, + 96019, + 96054, + 96054, + 96162, + 96632, + 96076, + 94432, + 94435, + 94548, + 94548, + 94584, + 94584, + 94434, + 94484, + 94484, + 94485, + 94530, + 94521, + 94563, + 94741, + 94792, + 94999, + 94523, + 94523, + 94629, + 94720, + 94720, + 94460, + 95225, + 95225, + 94408, + 94498, + 94623, + 94623, + 94650, + 94524, + 94524, + 94448, + 94603, + 94438, + 94945, + 94945, + 94617, + 94461, + 94516, + 94678, + 94678, + 94466, + 94466, + 94686, + 94461, + 94548, + 94426, + 94426, + 94528, + 94485, + 94515, + 94637, + 94396, + 94449, + 94449, + 94565, + 94738, + 94738, + 95269, + 94869, + 94459, + 94624, + 94469, + 94469, + 94494, + 94688, + 94386, + 94386, + 94531, + 94531, + 94444, + 94447, + 94782, + 94782, + 94531, + 94440, + 94440, + 94449, + 94740, + 94699, + 94539, + 94506, + 95921, + 96011, + 96103, + 96000, + 95937, + 95937, + 96354, + 96029, + 95993, + 95990, + 95990, + 96045, + 96236, + 96145, + 96145, + 95946, + 96208, + 96257, + 95962, + 96097, + 95911, + 96408, + 96408, + 95906, + 96013, + 96402, + 96029, + 95964, + 96448, + 96058, + 96084, + 96051, + 95984, + 96070, + 96052, + 95898, + 96229, + 95963, + 95944, + 95944, + 96074, + 96257, + 96257, + 96088, + 96768, + 96348, + 96348, + 96040, + 96008, + 96041, + 96041, + 95972, + 95972, + 96477, + 96477, + 95878, + 96035, + 95990, + 96170, + 96127, + 96127, + 95987, + 96117, + 95897, + 96013, + 96013, + 96016, + 95898, + 95898, + 95999, + 96046, + 95993, + 95949, + 95947, + 95947, + 96019, + 95935, + 95944, + 95944, + 95886, + 95886, + 96047, + 95874, + 95874, + 96095, + 95941, + 95881, + 96033, + 96105, + 96043, + 95944, + 95944, + 96084, + 95978, + 96183, + 95872, + 95955, + 96086, + 95867, + 95852, + 96100, + 95964, + 96002, + 96052, + 96047, + 95940, + 95940, + 96228, + 96311, + 96039, + 95830, + 96211, + 95923, + 95994, + 96091, + 96091, + 95963, + 96077, + 96114, + 95892, + 95892, + 95970, + 95911, + 95911, + 96293, + 96178, + 96056, + 95919, + 95894, + 95894, + 95936, + 96081, + 96203, + 96510, + 96064, + 95822, + 95879, + 96040, + 95932, + 96325, + 95953, + 95454, + 95162, + 94656, + 94434, + 94402, + 94380, + 94380, + 94698, + 94503, + 94520, + 94504, + 94473, + 94545, + 94463, + 94463, + 96206, + 96206, + 96008, + 95901, + 95809, + 96273, + 95961, + 96035, + 95982, + 95919, + 95919, + 95952, + 95952, + 96096, + 95902, + 96013, + 96013, + 96007, + 96163, + 95919, + 95965, + 96010, + 96098, + 95991, + 95941, + 95942, + 96285, + 95927, + 95948, + 95985, + 96686, + 96130, + 96130, + 96031, + 96031, + 96065, + 96118, + 96045, + 95886, + 95942, + 95917, + 96039, + 96039, + 96016, + 95934, + 95984, + 95984, + 96168, + 96014, + 96143, + 96131, + 96380, + 96174, + 96174, + 95979, + 95946, + 95946, + 95971, + 95971, + 96013, + 96059, + 96059, + 95915, + 96032, + 96032 + ], + "sample_count": 1269 + }, + { + "pubkey": "B4x5p9UWtMxV6HqhpzKofvhfYUAELqAjMxm3S1RJMkYR", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242246000000, + "samples": [ + 181141, + 180918, + 176188, + 176101, + 176324, + 176424, + 176756, + 181142, + 181052, + 181001, + 181158, + 180951, + 181182, + 181131, + 181042, + 176592, + 176541, + 176478, + 176677, + 176415, + 178119, + 178709, + 179125, + 178207, + 178078, + 178037, + 178172, + 178080, + 178206, + 178087, + 178429, + 178226, + 178161, + 178048, + 178102, + 176537, + 176545, + 176858, + 176766, + 176491, + 176630, + 176400, + 176388, + 176251, + 176394, + 176435, + 176253, + 176202, + 176231, + 176188, + 176339, + 176323, + 176586, + 176195, + 176422, + 176314, + 176441, + 176473, + 176633, + 176664, + 181057, + 181234, + 181152, + 181045, + 181343, + 181266, + 181594, + 178562, + 185145, + 178270, + 181200, + 181001, + 178156, + 178264, + 178223, + 178241, + 178258, + 178105, + 178175, + 178039, + 178222, + 178027, + 178371, + 178210, + 178144, + 178155, + 178266, + 178038, + 178050, + 178340, + 178183, + 178135, + 176298, + 176213, + 176234, + 176910, + 176711, + 178453, + 178382, + 178313, + 176273, + 176332, + 176688, + 176707, + 176542, + 178298, + 178338, + 181279, + 198774, + 193039, + 178345, + 178398, + 176506, + 176489, + 176295, + 176108, + 176231, + 176323, + 176290, + 176257, + 176440, + 176258, + 181132, + 181123, + 181123, + 188102, + 176775, + 176651, + 176474, + 176446, + 178292, + 178111, + 170042, + 179277, + 186317, + 200795, + 170035, + 179843, + 195524, + 181417, + 170545, + 172560, + 169790, + 174628, + 187152, + 181675, + 172948, + 170162, + 170288, + 176369, + 175791, + 191037, + 242827, + 242726, + 242763, + 242946, + 242906, + 176419, + 176394, + 176256, + 178085, + 178163, + 170858, + 170022, + 181133, + 178270, + 178088, + 176428, + 176487, + 176449, + 176575, + 176674, + 178720, + 178119, + 178415, + 178499, + 178391, + 178540, + 178443, + 178534, + 176615, + 176328, + 176459, + 176333, + 176380, + 176724, + 177174, + 176491, + 177308, + 176370, + 181227, + 181187, + 181180, + 180991, + 176920, + 176571, + 176613, + 176583, + 176597, + 176621, + 176672, + 176661, + 176738, + 176586, + 176575, + 176258, + 176132, + 176185, + 176098, + 176338, + 178581, + 178316, + 170829, + 170743, + 170597, + 170870, + 170749, + 174171, + 244705, + 244909, + 244447, + 244528, + 181169, + 181006, + 181443, + 176520, + 176409, + 176648, + 176735, + 176651, + 170433, + 170610, + 170091, + 169865, + 169877, + 181200, + 181181, + 176258, + 176319, + 176444, + 176232, + 176142, + 170694, + 170740, + 170742, + 170055, + 176264, + 176868, + 176790, + 176666, + 176248, + 176167, + 176320, + 176278, + 176401, + 178488, + 178322, + 181028, + 181128, + 181045, + 176615, + 176596, + 176947, + 176689, + 176645, + 178441, + 178283, + 178129, + 178236, + 178183, + 181244, + 181272, + 178302, + 178204, + 178202, + 176249, + 176365, + 176823, + 176564, + 176318, + 176421, + 176303, + 178139, + 178119, + 178144, + 181160, + 181069, + 176157, + 176159, + 176225, + 176300, + 176171, + 178373, + 178386, + 178168, + 178074, + 178260, + 178032, + 178094, + 178211, + 178330, + 178218, + 178244, + 178336, + 178278, + 178223, + 178280, + 176625, + 176556, + 176551, + 176531, + 176663, + 176473, + 176474, + 176471, + 178278, + 178243, + 176188, + 176543, + 176222, + 178126, + 178014, + 181060, + 180972, + 181075, + 178190, + 178193, + 180915, + 181007, + 181042, + 181227, + 181190, + 181138, + 181080, + 181044, + 176291, + 176309, + 178719, + 178177, + 178113, + 176360, + 176247, + 178261, + 178220, + 178057, + 176232, + 176272, + 176301, + 176397, + 176449, + 181046, + 181054, + 178395, + 178090, + 178186, + 178038, + 178222, + 178104, + 178167, + 178082, + 178201, + 178182, + 178075, + 178076, + 178118, + 178353, + 178081, + 176410, + 176378, + 176513, + 178423, + 178420, + 181059, + 180973, + 181201, + 181086, + 181216, + 181555, + 181151, + 181336, + 181256, + 181231, + 181173, + 181266, + 181206, + 176586, + 176573, + 176366, + 176519, + 176202, + 178546, + 178233, + 181193, + 181033, + 181179, + 176245, + 176315, + 176310, + 176608, + 176336, + 176536, + 176404, + 176711, + 176674, + 176584, + 181274, + 181226, + 176421, + 176335, + 176275, + 178503, + 178431, + 176891, + 176646, + 176773, + 176768, + 176756, + 176737, + 176537, + 176728, + 181346, + 181137, + 176334, + 176250, + 176479, + 181761, + 181062, + 178777, + 178235, + 178073, + 176429, + 176370, + 176315, + 176254, + 176139, + 176362, + 176298, + 176259, + 176250, + 176542, + 176767, + 176552, + 176599, + 176636, + 176715, + 181217, + 181192, + 181183, + 181331, + 176620, + 176726, + 176589, + 176552, + 176466, + 176730, + 178404, + 178491, + 176685, + 176602, + 176397, + 176724, + 176648, + 176682, + 176566, + 176824, + 178306, + 178222, + 181109, + 181295, + 181243, + 181167, + 181265, + 181265, + 181265, + 181125, + 201785, + 201973, + 178238, + 178237, + 178337, + 176963, + 176640, + 178230, + 178074, + 178259, + 176737, + 176631, + 176481, + 176386, + 176445, + 178256, + 178295, + 178356, + 178328, + 178287, + 178378, + 178361, + 181073, + 181283, + 181044, + 176385, + 176362, + 176215, + 176249, + 176263, + 176467, + 176640, + 176534, + 176661, + 176846, + 176492, + 176286, + 176417, + 176431, + 176355, + 176340, + 176330, + 176636, + 176434, + 176461, + 181224, + 181291, + 176530, + 176468, + 176639, + 176445, + 176453, + 176727, + 176776, + 176665, + 176450, + 176351, + 171259, + 170762, + 170797, + 169690, + 169879, + 170452, + 170469, + 181239, + 176653, + 176556, + 182729, + 181172, + 181240, + 178308, + 178234, + 176706, + 176634, + 176801, + 176245, + 176187, + 178182, + 178212, + 178343, + 181296, + 181125, + 181008, + 181056, + 180890, + 181074, + 181028, + 181246, + 181148, + 181263, + 181011, + 181085, + 181141, + 180982, + 181019, + 181306, + 181076, + 178337, + 178251, + 178249, + 178367, + 178660, + 179176, + 178371, + 178211, + 178652, + 178070, + 176814, + 176325, + 176341, + 176425, + 177010, + 176710, + 176922, + 176639, + 179366, + 178101, + 178380, + 178270, + 178154, + 180993, + 180993, + 181072, + 181241, + 181186, + 181444, + 181122, + 176625, + 176684, + 176669, + 176526, + 176448, + 176826, + 176796, + 176758, + 178685, + 178191, + 176269, + 176235, + 176166, + 178329, + 178225, + 181018, + 181087, + 180942, + 178200, + 178274, + 176551, + 176607, + 176828, + 180822, + 181034, + 176147, + 176227, + 176149, + 177134, + 176570, + 176576, + 176614, + 176750, + 176820, + 176630, + 178529, + 178199, + 178199, + 176699, + 190598, + 205048, + 183107, + 183100, + 178964, + 179088, + 183194, + 182978, + 182871, + 177271, + 177090, + 178902, + 178861, + 183105, + 183029, + 183073, + 183218, + 183092, + 183200, + 183209, + 182946, + 179110, + 179078, + 179123, + 179173, + 179101, + 179084, + 179156, + 179018, + 179080, + 179036, + 183249, + 183059, + 183171, + 177454, + 177439, + 177331, + 178193, + 177114, + 183513, + 183084, + 183315, + 182931, + 183216, + 176917, + 177023, + 183178, + 183214, + 183174, + 183172, + 183119, + 183292, + 183126, + 183060, + 183117, + 183079, + 183026, + 183022, + 183049, + 183056, + 182821, + 183154, + 183011, + 183171, + 183516, + 183151, + 179008, + 179033, + 179028, + 178962, + 179032, + 179180, + 178978, + 177436, + 177460, + 177561, + 179181, + 179073, + 179254, + 179236, + 179062, + 177442, + 177436, + 177314, + 177261, + 177248, + 178918, + 179329, + 179176, + 179152, + 179045, + 178946, + 179104, + 179154, + 179337, + 179214, + 183045, + 183132, + 183016, + 177208, + 177145, + 177363, + 177270, + 177321, + 177076, + 177347, + 179145, + 179009, + 179225, + 177441, + 177310, + 183117, + 183080, + 183159, + 182926, + 183150, + 183051, + 183171, + 183060, + 177051, + 176954, + 178941, + 179000, + 179286, + 183301, + 183291, + 183286, + 183080, + 183076, + 183151, + 183206, + 179135, + 178913, + 183072, + 183037, + 183045, + 179100, + 179369, + 179095, + 177458, + 177542, + 177322, + 177089, + 177248, + 179201, + 179618, + 177570, + 177437, + 177295, + 179167, + 178838, + 177325, + 177272, + 177262, + 203617, + 205088, + 199921, + 200019, + 199868, + 199966, + 199906, + 199878, + 199852, + 199906, + 202588, + 202532, + 199950, + 200127, + 199873, + 177757, + 177302, + 177433, + 177365, + 177465, + 177338, + 177493, + 179600, + 177678, + 178899, + 179106, + 178935, + 179013, + 178953, + 178832, + 179009, + 178916, + 178851, + 178909, + 183258, + 183306, + 185787, + 183332, + 183075, + 183069, + 177182, + 177324, + 177630, + 177546, + 177348, + 177578, + 177202, + 172536, + 172632, + 171674, + 171331, + 171483, + 171424, + 171397, + 200395, + 177557, + 177431, + 182905, + 183012, + 183184, + 177931, + 177201, + 176915, + 177089, + 177309, + 177445, + 177230, + 183110, + 183272, + 179064, + 179094, + 179091, + 178920, + 179062, + 179076, + 177507, + 177464, + 250402, + 250173, + 250242, + 179638, + 179142, + 177548, + 177177, + 177033, + 177347, + 177316, + 183283, + 183160, + 183155, + 183234, + 183101, + 183242, + 183077, + 183103, + 183248, + 183276, + 183350, + 183155, + 182914, + 183143, + 177061, + 177557, + 177557, + 177584, + 177431, + 177352, + 177315, + 177171, + 177053, + 182987, + 183078, + 183078, + 179055, + 179021, + 179115, + 179196, + 179160, + 179109, + 179818, + 177336, + 177314, + 183180, + 183047, + 183167, + 177146, + 177075, + 177075, + 177149, + 176943, + 176943, + 183072, + 179076, + 179045, + 176914, + 176914, + 177072, + 177568, + 177568, + 179157, + 179125, + 178952, + 178970, + 178970, + 179041, + 177264, + 177135, + 177135, + 177234, + 177137, + 178926, + 178940, + 179246, + 178829, + 178940, + 177248, + 177059, + 177185, + 177245, + 177138, + 177138, + 178835, + 178835, + 170640, + 177382, + 177382, + 177308, + 183270, + 183135, + 182951, + 183057, + 183057, + 177308, + 177308, + 177520, + 183037, + 183085, + 183161, + 183161, + 183046, + 177212, + 177141, + 177141, + 179058, + 179003, + 178891, + 179159, + 179147, + 179158, + 179220, + 179253, + 179032, + 179098, + 178983, + 179059, + 179059, + 183340, + 177402, + 177257, + 177160, + 177204, + 177059, + 179015, + 178869, + 179140, + 183189, + 183106, + 183106, + 182985, + 182999, + 183353, + 183108, + 178988, + 179041, + 177268, + 177394, + 177329, + 183046, + 183029, + 183029, + 179182, + 179182, + 178838, + 178960, + 179048, + 174165, + 174165, + 183229, + 183260, + 183260, + 174245, + 174313, + 176948, + 177089, + 177148, + 174197, + 174214, + 182879, + 182981, + 182981, + 179294, + 179294, + 177441, + 177192, + 177066, + 178853, + 178990, + 174045, + 174045, + 174222, + 174505, + 174354, + 179052, + 179007, + 179012, + 174184, + 174184, + 174185, + 183056, + 182963, + 182963, + 183121, + 177122, + 177015, + 177144, + 179115, + 178976, + 178994, + 179314, + 179314, + 177059, + 177476, + 179286, + 179013, + 179035, + 178922, + 179127, + 177184, + 177184, + 177307, + 179310, + 179546, + 183193, + 183057, + 183313, + 179223, + 178973, + 178973, + 174302, + 174315, + 183137, + 183001, + 174259, + 174471, + 174250, + 174250, + 174151, + 178931, + 178985, + 178834, + 176976, + 176913, + 174398, + 174210, + 174210, + 182920, + 183010, + 183293, + 183272, + 177044, + 177231, + 176985, + 177264, + 177264, + 177292, + 183215, + 183215, + 183126, + 183353, + 182990, + 183231, + 183155, + 178967, + 178790, + 178971, + 183155, + 183094, + 183087, + 183315, + 178879, + 179064, + 178870, + 178870, + 179120, + 178971, + 178953, + 178953, + 179153, + 179177, + 179096, + 179096, + 179061, + 179115, + 178977, + 178999, + 178999, + 183040, + 179030, + 178980, + 178886, + 179119, + 178982, + 185549, + 183125, + 183250, + 183222, + 183156, + 182921, + 183100, + 183100, + 179075, + 178672, + 178672, + 177038, + 177106, + 176936, + 176946, + 183164, + 183102, + 183102, + 183292, + 177161, + 174277, + 174277, + 174209, + 174209, + 177230, + 177305, + 177305, + 177031, + 177098, + 177040, + 177116, + 177152, + 177169, + 176053, + 176074, + 176074, + 178092, + 178887, + 178164, + 178164, + 178184, + 177967, + 177933, + 173085, + 173152, + 177948, + 177927, + 177891, + 177971, + 178058, + 178008, + 177875, + 177836, + 177932, + 177853, + 173828, + 173828, + 173271, + 181256, + 181256, + 176890, + 176076, + 176076, + 181018, + 181162, + 173215, + 173249, + 173249, + 180956, + 180987, + 176377, + 176377, + 173084, + 173084, + 173196, + 177853, + 178046, + 178046, + 178128, + 177854, + 177934, + 178043, + 178043, + 178097, + 178054, + 177985, + 178047, + 177930, + 176273, + 176185, + 178054, + 178054, + 177943, + 173508, + 173367, + 173367, + 178133, + 178100, + 178052, + 178052, + 178320, + 178320, + 178228, + 181433, + 181363, + 181363, + 177923, + 178099, + 176195, + 176195, + 175981, + 181075, + 181230, + 180950, + 180940, + 180940, + 181331, + 181018, + 181149, + 181025, + 181195 + ], + "sample_count": 1268 + }, + { + "pubkey": "6mdzuBkfPXuefpEyJPo2rXHW33HZQRHWv7ivFHbqAnVD", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "target_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242244000000, + "samples": [ + 160703, + 160651, + 160585, + 160595, + 160605, + 160629, + 160563, + 160607, + 160709, + 160631, + 160444, + 160897, + 160663, + 160623, + 160754, + 160531, + 160564, + 160558, + 160588, + 160664, + 160541, + 160561, + 160491, + 160667, + 160497, + 160578, + 160749, + 160556, + 160563, + 160520, + 160614, + 160576, + 160477, + 160681, + 160683, + 160601, + 160541, + 160745, + 160707, + 160754, + 160722, + 160692, + 160465, + 160586, + 160560, + 160609, + 160646, + 160560, + 160605, + 160791, + 160601, + 160591, + 160503, + 160626, + 160763, + 160691, + 160714, + 160676, + 160808, + 160862, + 160718, + 160656, + 160533, + 160587, + 160763, + 160562, + 160595, + 160688, + 160573, + 160702, + 160586, + 160749, + 160653, + 160525, + 160587, + 160809, + 160793, + 160581, + 160993, + 160760, + 160752, + 160727, + 160548, + 160516, + 160656, + 160705, + 160730, + 160664, + 160693, + 160546, + 160656, + 160721, + 160554, + 160721, + 160744, + 160722, + 160674, + 160566, + 160743, + 160603, + 160633, + 160682, + 160650, + 160715, + 160556, + 160799, + 160809, + 160488, + 160513, + 160695, + 160614, + 160643, + 160793, + 160581, + 160690, + 160823, + 160606, + 160655, + 160772, + 160754, + 160558, + 160730, + 160755, + 160512, + 160720, + 160775, + 160589, + 160730, + 181872, + 160803, + 160595, + 160567, + 160564, + 160737, + 160619, + 160725, + 160710, + 160630, + 160557, + 160772, + 160576, + 160734, + 160734, + 160570, + 160798, + 160801, + 160613, + 160739, + 160774, + 160568, + 160693, + 160578, + 160752, + 160492, + 160722, + 160679, + 160544, + 160602, + 160796, + 160724, + 160837, + 160699, + 160632, + 160698, + 160626, + 160747, + 160782, + 160670, + 160654, + 160781, + 160629, + 160647, + 160581, + 160655, + 160759, + 160781, + 160776, + 160765, + 160650, + 160732, + 160545, + 160485, + 160628, + 160626, + 160620, + 160626, + 160667, + 160608, + 161193, + 160792, + 160695, + 160628, + 160611, + 160652, + 160583, + 160803, + 160583, + 160651, + 160609, + 160775, + 160550, + 160557, + 160536, + 160670, + 160657, + 160641, + 160766, + 160658, + 160526, + 160731, + 160621, + 160614, + 160822, + 160556, + 160534, + 160578, + 160595, + 160788, + 160633, + 160647, + 160667, + 160807, + 160806, + 160651, + 160688, + 160715, + 160595, + 160746, + 160700, + 160670, + 160633, + 160583, + 160759, + 160676, + 160754, + 160674, + 160527, + 160570, + 160586, + 160757, + 160631, + 160684, + 160532, + 160571, + 160689, + 160675, + 160489, + 160769, + 160601, + 160636, + 160710, + 160665, + 160632, + 160666, + 160642, + 160629, + 160593, + 160581, + 160657, + 160553, + 160734, + 160692, + 160501, + 160627, + 160665, + 160647, + 160593, + 160455, + 160769, + 160497, + 160620, + 160516, + 160719, + 160846, + 160662, + 160808, + 160596, + 160667, + 160613, + 160609, + 160597, + 160661, + 160743, + 160674, + 160706, + 160458, + 160538, + 160778, + 160746, + 160707, + 160602, + 160700, + 160553, + 160556, + 160751, + 160569, + 160807, + 160720, + 160639, + 160724, + 160732, + 160711, + 160624, + 160717, + 160651, + 160561, + 160692, + 160567, + 160575, + 160590, + 160601, + 160673, + 160520, + 160785, + 160550, + 160566, + 160724, + 160547, + 160658, + 160557, + 160798, + 160569, + 160581, + 160642, + 160775, + 160776, + 160562, + 160654, + 160580, + 160714, + 160446, + 160688, + 160589, + 160666, + 160719, + 160626, + 160615, + 160735, + 160518, + 160700, + 160583, + 160572, + 160612, + 160564, + 160559, + 160591, + 160521, + 160692, + 160523, + 160826, + 160609, + 160716, + 160643, + 160679, + 160530, + 160648, + 160547, + 160660, + 160525, + 160553, + 160560, + 160743, + 160539, + 160503, + 160611, + 160768, + 160531, + 160801, + 160615, + 160628, + 160767, + 160520, + 160846, + 160633, + 160733, + 160570, + 160604, + 160639, + 160624, + 160673, + 160583, + 160563, + 160772, + 160796, + 160542, + 160720, + 160625, + 160636, + 160701, + 160815, + 160593, + 160646, + 160545, + 160612, + 160635, + 160701, + 160520, + 160562, + 160577, + 160506, + 160695, + 160534, + 160574, + 160546, + 160631, + 160664, + 160595, + 160586, + 160577, + 160737, + 160656, + 160609, + 160694, + 160756, + 160819, + 160639, + 160775, + 160596, + 160616, + 160585, + 160640, + 160491, + 160721, + 160711, + 160545, + 160781, + 160578, + 160545, + 160508, + 160718, + 160554, + 160546, + 160590, + 160600, + 160784, + 160504, + 160689, + 160611, + 160551, + 160688, + 160602, + 160699, + 160767, + 160604, + 160571, + 160541, + 160523, + 160597, + 160759, + 160544, + 160722, + 160565, + 160691, + 160723, + 160568, + 160596, + 160517, + 160576, + 160596, + 160777, + 160568, + 160758, + 160609, + 160570, + 160571, + 160553, + 160697, + 160767, + 160732, + 160782, + 160658, + 160619, + 160583, + 160530, + 160584, + 160624, + 160594, + 160519, + 160573, + 160668, + 160703, + 160631, + 160767, + 160591, + 160560, + 160541, + 160567, + 160565, + 160660, + 160669, + 160567, + 160713, + 160714, + 160585, + 160658, + 160741, + 160551, + 160617, + 160626, + 160639, + 160570, + 160790, + 160694, + 160764, + 160699, + 160786, + 160761, + 160528, + 160747, + 160639, + 160619, + 160708, + 160684, + 160561, + 160765, + 160615, + 160660, + 160726, + 160712, + 160794, + 160584, + 160735, + 160618, + 160578, + 160802, + 160607, + 160650, + 160513, + 160711, + 160727, + 160528, + 160709, + 160673, + 160768, + 160824, + 160611, + 160616, + 160695, + 160661, + 160762, + 160708, + 160599, + 160705, + 160725, + 160850, + 160686, + 160594, + 160746, + 160719, + 160814, + 160606, + 160582, + 160577, + 160532, + 160559, + 160786, + 160689, + 160658, + 160623, + 160582, + 160640, + 160689, + 160481, + 160628, + 160829, + 160704, + 160643, + 160592, + 160567, + 160880, + 160616, + 160597, + 160722, + 160797, + 160562, + 160497, + 160562, + 160570, + 160773, + 160547, + 160810, + 160580, + 160546, + 160680, + 160819, + 160669, + 160743, + 160710, + 160770, + 160586, + 160451, + 160757, + 160627, + 160787, + 160674, + 160568, + 160645, + 160644, + 160591, + 160580, + 160553, + 160703, + 160551, + 160568, + 160787, + 160639, + 160615, + 160531, + 160620, + 160699, + 160584, + 160737, + 160679, + 160561, + 160545, + 160747, + 160621, + 160731, + 160738, + 160785, + 160555, + 160689, + 160784, + 160610, + 160647, + 160611, + 160469, + 160710, + 160558, + 160693, + 160544, + 160554, + 160610, + 160628, + 160888, + 160661, + 160626, + 160752, + 160606, + 160760, + 160599, + 160485, + 160562, + 160569, + 160791, + 160518, + 160546, + 160656, + 160867, + 160633, + 160619, + 160519, + 160759, + 160763, + 160597, + 160553, + 160627, + 160637, + 160717, + 160768, + 160669, + 160512, + 160603, + 160701, + 160837, + 160567, + 160786, + 160652, + 160590, + 160580, + 160519, + 160561, + 160644, + 160749, + 160745, + 160564, + 160767, + 160633, + 160726, + 160759, + 160565, + 160678, + 160802, + 160614, + 160690, + 160570, + 160750, + 160539, + 160724, + 160754, + 160576, + 160743, + 160665, + 160642, + 160766, + 160749, + 160686, + 160530, + 160500, + 160440, + 160579, + 160587, + 160718, + 160745, + 160566, + 160534, + 160710, + 160671, + 160599, + 160578, + 160526, + 160733, + 160583, + 160688, + 160721, + 160772, + 160499, + 160582, + 160675, + 160672, + 160558, + 160502, + 160535, + 160593, + 160699, + 160703, + 160517, + 160610, + 160573, + 160855, + 160752, + 160680, + 160548, + 160531, + 160682, + 160571, + 160760, + 160616, + 160738, + 160826, + 160588, + 160530, + 160818, + 160768, + 160701, + 160529, + 160768, + 160615, + 160748, + 160769, + 160659, + 160765, + 160408, + 160659, + 160629, + 160587, + 160661, + 160431, + 160643, + 160820, + 160596, + 160556, + 160610, + 160531, + 160709, + 160632, + 160612, + 160616, + 160658, + 160654, + 160778, + 160717, + 160709, + 160561, + 160712, + 160658, + 160581, + 160590, + 160724, + 160811, + 160675, + 160758, + 160547, + 160764, + 160660, + 160593, + 160719, + 160677, + 160838, + 160735, + 160746, + 160554, + 160687, + 160617, + 160714, + 160517, + 160656, + 160592, + 160739, + 160775, + 160631, + 160555, + 160611, + 160532, + 160739, + 160574, + 160648, + 160656, + 160715, + 160635, + 160787, + 160553, + 160543, + 160646, + 160810, + 160749, + 160598, + 160675, + 160655, + 160810, + 160645, + 160625, + 160501, + 160834, + 160633, + 160609, + 160558, + 160594, + 160604, + 160787, + 160515, + 160782, + 160681, + 160542, + 160744, + 160727, + 160572, + 160577, + 160546, + 160824, + 160684, + 160576, + 160774, + 160755, + 160516, + 160593, + 160644, + 160712, + 160790, + 160797, + 160610, + 160742, + 160718, + 160622, + 160704, + 160558, + 160671, + 160735, + 160618, + 160664, + 160710, + 160697, + 160764, + 160783, + 160781, + 160516, + 160568, + 160567, + 160692, + 160631, + 160453, + 160699, + 160575, + 160640, + 160847, + 160450, + 160565, + 160583, + 160569, + 160577, + 160623, + 160523, + 160649, + 160665, + 160552, + 160702, + 160677, + 160731, + 160807, + 160607, + 160583, + 160721, + 160811, + 160640, + 160625, + 160600, + 160703, + 160614, + 160750, + 160554, + 160598, + 160720, + 160730, + 160609, + 160543, + 160701, + 160562, + 160555, + 160645, + 160785, + 160634, + 160628, + 160588, + 160522, + 160440, + 160765, + 160604, + 160622, + 160822, + 160645, + 160640, + 160611, + 160743, + 160551, + 160843, + 188596, + 160746, + 160627, + 160805, + 160653, + 160764, + 160798, + 160719, + 160682, + 160682, + 160793, + 160566, + 160622, + 160753, + 160512, + 160556, + 160600, + 160514, + 160560, + 160649, + 160640, + 160649, + 160573, + 160645, + 160579, + 160656, + 160734, + 160535, + 160548, + 160584, + 160484, + 160717, + 160454, + 160626, + 160615, + 160752, + 160577, + 160592, + 160596, + 160626, + 160618, + 160606, + 160842, + 160584, + 160601, + 160544, + 160641, + 160750, + 160785, + 160534, + 160829, + 160578, + 160717, + 160763, + 160662, + 160645, + 160732, + 160617, + 160556, + 160750, + 160506, + 160535, + 160693, + 160559, + 160565, + 160773, + 160763, + 160593, + 160506, + 160647, + 160776, + 160809, + 160665, + 160643, + 160684, + 160744, + 160820, + 160686, + 160649, + 160718, + 160586, + 160713, + 160739, + 160754, + 160548, + 160623, + 160741, + 160599, + 160646, + 160542, + 160686, + 160798, + 160566, + 160537, + 160606, + 160709, + 160739, + 160572, + 160572, + 160700, + 160555, + 160590, + 160476, + 160515, + 160731, + 160723, + 160448, + 160596, + 160518, + 160723, + 160782, + 160530, + 160547, + 160564, + 160699, + 160510, + 160642, + 160622, + 160776, + 160604, + 160649, + 160671, + 160752, + 160657, + 160597, + 160509, + 160577, + 160598, + 160505, + 160601, + 160688, + 160575, + 160591, + 160545, + 160839, + 160650, + 160521, + 160631, + 160599, + 160716, + 160764, + 160731, + 160570, + 160578, + 160676, + 160784, + 160739, + 160677, + 160574, + 160605, + 160524, + 160630, + 160563, + 160640, + 160694, + 160660, + 160628, + 160590, + 160730, + 160639, + 160609, + 160598, + 160661, + 160582, + 160653, + 160584, + 160555, + 160709, + 160421, + 160636, + 160632, + 160842, + 160603, + 160576, + 160666, + 160727, + 160547, + 160580, + 160809, + 160745, + 160569, + 160818, + 160619, + 160578, + 160573, + 160572, + 160680, + 160518, + 160622, + 160652, + 160534, + 160589, + 160565, + 160571, + 160621, + 160644, + 160715, + 160727, + 160626, + 160637, + 160570, + 160714, + 160670, + 160615, + 160583, + 160771, + 160735, + 160776, + 160559, + 160593, + 160650, + 160628, + 160607, + 160674, + 160548, + 160699, + 160593, + 160577, + 160571, + 160618, + 160658, + 160590, + 160516, + 160740, + 160755, + 160580, + 160641, + 160797, + 160556, + 160536, + 160586, + 160724, + 160746, + 160580, + 160822, + 160474, + 160762, + 160663, + 160513, + 160781, + 160684, + 160587, + 160664, + 160728, + 160747, + 160773, + 160740, + 160645, + 160720, + 160834, + 160626, + 160777, + 160692, + 160575, + 160653, + 160591, + 160596, + 160736, + 160488, + 160770, + 160645, + 160733, + 160786, + 160660, + 160713, + 160589, + 160723, + 160643, + 160561, + 160534, + 160632, + 160624, + 160551, + 160646, + 160630, + 160569, + 160597, + 160523, + 160580, + 160665, + 160554, + 160777, + 160675, + 160741, + 160555, + 160783, + 160533, + 160709, + 160617, + 160764, + 160763, + 160800, + 160670, + 160478, + 160779, + 160547, + 160533, + 160574, + 160613, + 160803, + 160691, + 160599, + 160509, + 160623, + 160798, + 160606, + 160588, + 160515, + 160561, + 160516, + 160599, + 160654, + 160780, + 160797, + 160735, + 160596, + 160824, + 160650, + 160655, + 160745, + 160501, + 160765, + 160580, + 160825, + 160752, + 160639, + 160478, + 160507, + 160706, + 160778, + 160568, + 160749, + 160624, + 160311, + 160370, + 160378, + 160506, + 160457, + 160247, + 160505, + 160494, + 160511, + 160424, + 160604 + ], + "sample_count": 1269 + }, + { + "pubkey": "GNkUhJDhxeBpQAvq2eyzBCeHQHYNHiPcZUSHfkr89371", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242238000000, + "samples": [ + 7212, + 7095, + 7144, + 6706, + 6846, + 6951, + 6993, + 6961, + 6797, + 7037, + 6743, + 7188, + 6740, + 6793, + 6839, + 6844, + 7008, + 7213, + 6763, + 6765, + 7043, + 7116, + 6893, + 7294, + 7060, + 6806, + 7110, + 6803, + 6748, + 6834, + 7016, + 6921, + 7161, + 7093, + 7121, + 6844, + 6986, + 7241, + 7314, + 7301, + 7185, + 6759, + 7072, + 6765, + 6963, + 6729, + 7169, + 7038, + 6708, + 7051, + 7133, + 6730, + 6671, + 7048, + 6833, + 7008, + 7041, + 6942, + 6722, + 7052, + 6756, + 6752, + 6809, + 6910, + 6909, + 7096, + 7085, + 6904, + 6905, + 6822, + 7012, + 6790, + 7021, + 6860, + 7204, + 6778, + 6850, + 7123, + 6786, + 6833, + 6829, + 7192, + 6763, + 6799, + 6736, + 6707, + 6871, + 6819, + 6773, + 7077, + 7215, + 6789, + 6702, + 7141, + 6896, + 7023, + 6778, + 6965, + 7138, + 6841, + 7134, + 6817, + 6770, + 6781, + 7078, + 6788, + 7022, + 7040, + 6865, + 6703, + 6751, + 7086, + 7099, + 7117, + 6823, + 7202, + 7073, + 7065, + 7005, + 7035, + 7073, + 7091, + 6772, + 6782, + 7132, + 6876, + 6838, + 6874, + 7084, + 6960, + 6838, + 6798, + 6807, + 6780, + 7123, + 6752, + 6935, + 6886, + 6992, + 6658, + 6970, + 6825, + 7113, + 6892, + 6943, + 6894, + 6882, + 6745, + 7026, + 6769, + 6802, + 6653, + 6754, + 6782, + 6874, + 6846, + 6925, + 7145, + 7230, + 7019, + 7001, + 6719, + 6771, + 6863, + 6866, + 6809, + 6856, + 7166, + 6770, + 7161, + 7036, + 7035, + 6732, + 6981, + 7160, + 7144, + 6881, + 6851, + 6721, + 6754, + 6704, + 6915, + 7168, + 6886, + 6915, + 6791, + 7144, + 7135, + 7123, + 6828, + 7149, + 6914, + 6857, + 7238, + 6899, + 7279, + 7199, + 7230, + 7075, + 7146, + 7063, + 6837, + 6976, + 7069, + 7104, + 6908, + 7264, + 7183, + 7179, + 7134, + 7159, + 6761, + 6805, + 7332, + 7193, + 7210, + 6837, + 7293, + 6792, + 6720, + 7253, + 7184, + 7167, + 6732, + 6892, + 7130, + 6913, + 7206, + 6854, + 6933, + 7224, + 7137, + 7166, + 7153, + 6855, + 7107, + 7159, + 6875, + 6926, + 6910, + 6970, + 7197, + 7220, + 6945, + 7263, + 6939, + 6864, + 6871, + 6979, + 6864, + 7290, + 7171, + 6970, + 6914, + 7146, + 6941, + 7189, + 6900, + 7184, + 6990, + 7220, + 7184, + 7002, + 7236, + 7231, + 6933, + 6811, + 7235, + 7154, + 7044, + 7215, + 6807, + 7135, + 7201, + 7108, + 6945, + 6894, + 7147, + 7187, + 7106, + 6886, + 7154, + 6834, + 6770, + 7030, + 7230, + 6864, + 6980, + 6763, + 7281, + 6783, + 7188, + 7229, + 7229, + 7384, + 6954, + 6988, + 7173, + 7003, + 6952, + 6822, + 7096, + 7184, + 6971, + 7180, + 6928, + 7159, + 7223, + 7007, + 6830, + 7152, + 7221, + 7147, + 6919, + 7004, + 7250, + 6913, + 7149, + 6854, + 6922, + 7120, + 6945, + 7138, + 7149, + 7223, + 6824, + 7176, + 6904, + 7173, + 6896, + 7367, + 6916, + 7132, + 7169, + 7025, + 6855, + 6785, + 7274, + 7194, + 6935, + 7231, + 7061, + 7259, + 6873, + 7161, + 7119, + 6921, + 7221, + 7147, + 6893, + 7017, + 7199, + 6910, + 7182, + 6910, + 7155, + 6904, + 6997, + 6858, + 6998, + 7064, + 7013, + 6915, + 7180, + 7194, + 6949, + 6965, + 7191, + 6825, + 7299, + 6840, + 7209, + 7278, + 7213, + 7278, + 7197, + 7022, + 7269, + 6904, + 7220, + 7027, + 7025, + 7231, + 7261, + 7271, + 6826, + 7103, + 6975, + 7272, + 6915, + 7144, + 6965, + 6887, + 7181, + 6879, + 7033, + 7207, + 6978, + 7193, + 7104, + 6927, + 7202, + 6941, + 7158, + 7156, + 7026, + 7004, + 6882, + 7220, + 6866, + 7142, + 7329, + 6861, + 7020, + 6830, + 6835, + 7139, + 7165, + 7068, + 6958, + 6793, + 7226, + 6910, + 6889, + 6928, + 7147, + 6880, + 7282, + 6965, + 6895, + 7205, + 7186, + 7152, + 6973, + 7022, + 6907, + 7298, + 7074, + 6893, + 7167, + 7036, + 6855, + 7010, + 7246, + 6989, + 7432, + 7321, + 7078, + 6831, + 7260, + 7019, + 6966, + 7186, + 6948, + 6901, + 6944, + 7310, + 6958, + 7292, + 7024, + 7219, + 6916, + 6831, + 6893, + 7211, + 6867, + 6823, + 7034, + 6982, + 6943, + 7180, + 7194, + 6973, + 6812, + 7097, + 7240, + 6876, + 7130, + 6918, + 7204, + 7334, + 6842, + 7340, + 7140, + 6901, + 6949, + 7001, + 6929, + 6833, + 7253, + 6993, + 6957, + 7283, + 7023, + 6852, + 7245, + 7235, + 6951, + 6883, + 6901, + 6992, + 6997, + 6876, + 6886, + 6909, + 6990, + 7231, + 7127, + 7241, + 7001, + 6994, + 7259, + 7221, + 7007, + 7195, + 7138, + 6790, + 7275, + 7246, + 6969, + 7191, + 6847, + 6893, + 7013, + 6896, + 7131, + 6910, + 6858, + 6849, + 7290, + 6872, + 6925, + 7074, + 6945, + 7190, + 7190, + 6777, + 7263, + 7126, + 7007, + 7211, + 7121, + 7259, + 7145, + 6944, + 7240, + 6792, + 7052, + 7360, + 7280, + 7349, + 7182, + 7276, + 7291, + 7158, + 7026, + 7213, + 6879, + 7198, + 6929, + 7270, + 7199, + 7146, + 7055, + 6937, + 7183, + 6967, + 7254, + 6921, + 7243, + 7310, + 7184, + 6835, + 6942, + 6985, + 7251, + 6914, + 7110, + 7018, + 7001, + 7169, + 6930, + 7218, + 7003, + 6879, + 6863, + 6882, + 6890, + 7160, + 7119, + 6935, + 7191, + 7224, + 7215, + 7103, + 7209, + 6888, + 6878, + 7172, + 7253, + 6827, + 6905, + 6925, + 7289, + 6862, + 7134, + 6808, + 7200, + 7209, + 6977, + 7043, + 7139, + 6933, + 6957, + 6843, + 6929, + 6950, + 6816, + 7163, + 7241, + 6893, + 7187, + 7284, + 7125, + 7139, + 7273, + 7197, + 7150, + 6896, + 7028, + 6879, + 7091, + 6923, + 6961, + 7157, + 7034, + 7056, + 6902, + 7306, + 7242, + 6930, + 6916, + 7181, + 6932, + 7020, + 7028, + 6905, + 7350, + 6984, + 6929, + 7204, + 6927, + 7155, + 7286, + 7363, + 6982, + 7286, + 7146, + 7050, + 6919, + 6944, + 7252, + 7218, + 7215, + 7183, + 7175, + 7331, + 6890, + 6901, + 6859, + 7270, + 7173, + 6974, + 7021, + 7000, + 6980, + 6877, + 7197, + 6929, + 7112, + 7153, + 6877, + 6901, + 6946, + 7136, + 7192, + 6943, + 7005, + 7119, + 7260, + 7257, + 7242, + 6913, + 7247, + 6860, + 7215, + 6888, + 6907, + 7111, + 6923, + 6868, + 6840, + 7192, + 7138, + 7024, + 7200, + 6980, + 7217, + 7231, + 6982, + 6962, + 6898, + 6891, + 7158, + 7120, + 7169, + 7257, + 6885, + 6997, + 7216, + 7010, + 7195, + 6992, + 7047, + 7037, + 7198, + 6983, + 6982, + 7082, + 6857, + 7300, + 7153, + 6957, + 7099, + 7175, + 7161, + 6988, + 7175, + 6960, + 7250, + 6822, + 7210, + 6974, + 6844, + 7085, + 7128, + 7006, + 6891, + 7122, + 7026, + 6954, + 7120, + 6857, + 6804, + 6992, + 6846, + 7116, + 6885, + 7261, + 7139, + 6740, + 7190, + 6947, + 7089, + 6961, + 6965, + 7122, + 6919, + 7203, + 7058, + 6961, + 6802, + 6784, + 6975, + 7123, + 6888, + 7179, + 7097, + 7204, + 6999, + 7212, + 7162, + 7200, + 7243, + 7232, + 6883, + 6862, + 6859, + 6953, + 7348, + 7126, + 6957, + 7127, + 6905, + 6995, + 7275, + 7015, + 7219, + 6904, + 7345, + 6961, + 6851, + 6931, + 6858, + 6984, + 7288, + 6899, + 7130, + 7140, + 7167, + 6918, + 7256, + 7148, + 6996, + 7167, + 7178, + 7280, + 7245, + 6963, + 6925, + 7198, + 6805, + 7251, + 7207, + 6930, + 6860, + 7189, + 7118, + 6788, + 7200, + 7226, + 7262, + 6863, + 6871, + 7183, + 7262, + 6902, + 7298, + 7205, + 7002, + 7204, + 7187, + 6888, + 6892, + 7142, + 7201, + 6935, + 7163, + 7021, + 7322, + 7255, + 6900, + 6915, + 6854, + 6932, + 7184, + 7183, + 7006, + 6893, + 7028, + 7239, + 7179, + 7164, + 7112, + 7121, + 6848, + 6952, + 7162, + 6950, + 7088, + 6824, + 7133, + 7207, + 6994, + 7237, + 7209, + 7241, + 6805, + 7291, + 7117, + 7045, + 6894, + 7134, + 7193, + 6883, + 7195, + 6902, + 7211, + 6957, + 7066, + 7103, + 7098, + 6876, + 7202, + 7191, + 7323, + 6869, + 7276, + 7107, + 7225, + 6956, + 7249, + 6905, + 7249, + 7173, + 6847, + 7294, + 6987, + 7271, + 7113, + 6860, + 6814, + 6848, + 7232, + 6838, + 7145, + 6934, + 7012, + 6949, + 7298, + 6902, + 6926, + 7214, + 7163, + 6822, + 7135, + 6805, + 7095, + 7252, + 6927, + 7215, + 7239, + 6991, + 6840, + 6920, + 7003, + 7174, + 7270, + 7299, + 7282, + 7142, + 7340, + 7091, + 7089, + 7182, + 7011, + 6927, + 7188, + 7181, + 7288, + 7198, + 7299, + 7144, + 7236, + 7197, + 6971, + 7318, + 6911, + 7190, + 6943, + 7195, + 7264, + 7225, + 7188, + 7198, + 6931, + 7224, + 6952, + 6851, + 7189, + 6908, + 6992, + 7052, + 7226, + 6959, + 7183, + 6972, + 7257, + 7285, + 6981, + 7301, + 6956, + 6831, + 7277, + 7256, + 7123, + 7160, + 6961, + 6868, + 6990, + 7397, + 6912, + 7159, + 6875, + 6872, + 6911, + 6855, + 7242, + 7091, + 7164, + 7016, + 7247, + 7095, + 6902, + 6994, + 7155, + 6933, + 6926, + 7224, + 7270, + 7277, + 7159, + 7277, + 7104, + 7173, + 7292, + 6794, + 7231, + 7195, + 7277, + 7194, + 6874, + 6961, + 6923, + 6877, + 7231, + 6922, + 6884, + 7299, + 7149, + 6947, + 7204, + 6998, + 7154, + 7128, + 6908, + 7223, + 7026, + 7167, + 7240, + 6904, + 6946, + 7060, + 7165, + 6863, + 6918, + 6862, + 7026, + 7167, + 7115, + 7142, + 7240, + 7141, + 7086, + 6929, + 6979, + 7260, + 6965, + 7292, + 6850, + 7233, + 6938, + 7259, + 6917, + 7180, + 6884, + 6841, + 7157, + 6895, + 7150, + 6921, + 7348, + 6936, + 6811, + 7256, + 7335, + 7062, + 7216, + 7212, + 7005, + 6948, + 6954, + 7227, + 7245, + 7167, + 7332, + 6991, + 7111, + 7210, + 7265, + 6963, + 6976, + 6992, + 7141, + 6877, + 6969, + 6994, + 6957, + 7273, + 6906, + 6978, + 7358, + 6961, + 7209, + 7318, + 6947, + 6938, + 6951, + 7138, + 7168, + 6888, + 7102, + 7280, + 6956, + 6868, + 6947, + 7282, + 6995, + 7171, + 7176, + 7213, + 6891, + 7215, + 7297, + 7272, + 6856, + 6978, + 6956, + 7162, + 6746, + 7335, + 7185, + 7186, + 7237, + 6976, + 6997, + 7271, + 7207, + 6967, + 7236, + 7171, + 6771, + 7250, + 6879, + 7246, + 6936, + 7150, + 6990, + 7199, + 7264, + 6995, + 6838, + 6905, + 7270, + 7228, + 7268, + 7019, + 6992, + 7364, + 6957, + 7269, + 6915, + 6982, + 7090, + 6976, + 7444, + 7201, + 6975, + 7323, + 6995, + 6964, + 6946, + 6751, + 7212, + 7171, + 7237, + 6904, + 7323, + 6956, + 6985, + 7296, + 7212, + 7007, + 7224, + 7289, + 7116, + 7226, + 7186, + 7292, + 7329, + 7319, + 6850, + 7022, + 6884, + 7240, + 7174, + 6887, + 7121, + 7210, + 7208, + 6817, + 7195, + 7038, + 7033, + 7350, + 7143, + 7000, + 7151, + 6867, + 7175, + 6936, + 7007, + 6989, + 6773, + 7047, + 7266, + 6997, + 7328, + 7204, + 6940, + 7032, + 7056, + 6959, + 7226, + 7252, + 6956, + 7304, + 7186, + 6872, + 6891, + 6865, + 7199, + 7134, + 7237, + 7310, + 6873, + 6901, + 7186, + 6990, + 7214, + 7328, + 6981, + 6884, + 7323, + 6955, + 6986, + 6836, + 7058, + 7143, + 7181, + 7323, + 7055, + 7205, + 6941, + 6916, + 7170, + 7202, + 7181, + 6964, + 6948, + 7294, + 7161, + 6995, + 6966, + 7243, + 7041, + 6990, + 7000, + 7352, + 7063 + ], + "sample_count": 1270 + }, + { + "pubkey": "9hFp2fJ4xzpL9Av7akKCJJWnCkSYJ3gtoTTgk2yrEh6D", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242242000000, + "samples": [ + 258445, + 258288, + 258320, + 258208, + 258276, + 258371, + 258487, + 258343, + 258451, + 258396, + 258348, + 257852, + 257895, + 258012, + 258072, + 258145, + 258043, + 258037, + 258109, + 258016, + 258134, + 258019, + 258168, + 258062, + 257975, + 257991, + 257929, + 257957, + 258004, + 258080, + 258092, + 258043, + 258043, + 257914, + 258014, + 258167, + 257964, + 258171, + 257985, + 257970, + 258116, + 257934, + 257939, + 257956, + 258159, + 258475, + 258008, + 257992, + 258286, + 258393, + 258484, + 258056, + 258404, + 258051, + 258014, + 258271, + 258001, + 257997, + 258352, + 258296, + 258443, + 258062, + 258018, + 258021, + 257987, + 258069, + 258031, + 258218, + 258404, + 258427, + 258285, + 258254, + 258259, + 258270, + 258478, + 258341, + 258260, + 258294, + 258270, + 258065, + 258135, + 257992, + 258139, + 258365, + 258325, + 258022, + 258072, + 257924, + 258403, + 258174, + 258253, + 258075, + 258026, + 258350, + 258331, + 258094, + 258289, + 258539, + 258281, + 258028, + 257981, + 257956, + 258081, + 258020, + 258202, + 258271, + 258131, + 257999, + 258350, + 258308, + 258407, + 258116, + 258221, + 258443, + 258350, + 258343, + 258338, + 258309, + 257954, + 258365, + 258437, + 258260, + 258084, + 258221, + 258314, + 258427, + 258275, + 258443, + 258258, + 258260, + 257891, + 259096, + 257925, + 258002, + 258195, + 258519, + 258242, + 258246, + 258330, + 258388, + 258565, + 258360, + 258446, + 258348, + 258138, + 258004, + 258063, + 258015, + 258014, + 258370, + 258187, + 258120, + 257938, + 257951, + 258045, + 258161, + 258389, + 258416, + 258440, + 258245, + 258226, + 258015, + 258153, + 258037, + 258131, + 258280, + 258094, + 257999, + 257956, + 258412, + 258356, + 258372, + 258261, + 258007, + 257996, + 257939, + 258015, + 258044, + 258279, + 258351, + 259835, + 258337, + 258276, + 258345, + 258092, + 258432, + 258290, + 258568, + 258334, + 258089, + 258012, + 258396, + 257935, + 259304, + 258421, + 258500, + 258289, + 258246, + 258302, + 258240, + 258374, + 258252, + 258568, + 257956, + 257974, + 257966, + 258007, + 257940, + 258451, + 258292, + 258627, + 258114, + 258076, + 257974, + 257964, + 258129, + 258007, + 258305, + 258197, + 258059, + 258006, + 258306, + 244564, + 244236, + 244335, + 244358, + 244306, + 244275, + 244171, + 244284, + 244333, + 244307, + 244352, + 244464, + 244217, + 244539, + 244495, + 244204, + 244262, + 244655, + 244373, + 244644, + 244534, + 244195, + 244227, + 244331, + 244495, + 244686, + 244462, + 244124, + 244246, + 244498, + 244539, + 244507, + 244367, + 244529, + 244189, + 244211, + 244199, + 244261, + 246404, + 244433, + 244640, + 244281, + 244323, + 244452, + 244245, + 244129, + 244511, + 244503, + 244719, + 244584, + 244575, + 244459, + 244487, + 244918, + 244449, + 244674, + 244523, + 244427, + 244557, + 244472, + 244637, + 244587, + 244609, + 245024, + 244505, + 244488, + 244532, + 244559, + 244603, + 244581, + 244732, + 244592, + 245660, + 244548, + 244189, + 244144, + 244512, + 244559, + 244552, + 244530, + 244536, + 244530, + 244558, + 244558, + 244526, + 244708, + 244858, + 246191, + 244523, + 244490, + 244445, + 244482, + 244632, + 244765, + 244549, + 244550, + 244579, + 244482, + 244499, + 244632, + 244729, + 244546, + 244523, + 245775, + 244269, + 244247, + 244332, + 244443, + 244268, + 244189, + 244298, + 244236, + 244286, + 244531, + 244338, + 244599, + 244391, + 244197, + 244167, + 244300, + 244169, + 244398, + 244357, + 244673, + 244249, + 244188, + 244241, + 244172, + 244572, + 244624, + 244939, + 244666, + 244633, + 244575, + 244545, + 244402, + 244568, + 244428, + 244421, + 244292, + 244180, + 244571, + 244555, + 244891, + 244573, + 245002, + 244694, + 244529, + 244593, + 244305, + 244170, + 244276, + 244289, + 244452, + 244648, + 244616, + 244510, + 244555, + 244303, + 244532, + 244707, + 244646, + 244492, + 244259, + 244328, + 244262, + 244605, + 244748, + 244912, + 244181, + 244261, + 244561, + 244616, + 244604, + 246536, + 244844, + 244614, + 244580, + 244538, + 244777, + 244630, + 244531, + 244627, + 244884, + 244669, + 244723, + 244379, + 244180, + 244631, + 244603, + 244895, + 244595, + 244545, + 244656, + 244617, + 244680, + 244726, + 244694, + 244651, + 244476, + 244737, + 244241, + 244333, + 244475, + 244673, + 245452, + 244626, + 244638, + 244559, + 244236, + 244316, + 244661, + 245087, + 244544, + 247454, + 247832, + 247652, + 248381, + 248637, + 257971, + 258281, + 258258, + 257987, + 258017, + 258099, + 258146, + 258076, + 258229, + 258133, + 258164, + 258107, + 258034, + 257971, + 258154, + 258155, + 258250, + 258072, + 258096, + 257979, + 258016, + 257999, + 258127, + 258235, + 258222, + 257991, + 258122, + 258067, + 258019, + 258188, + 258018, + 258161, + 257996, + 258192, + 257922, + 258131, + 258252, + 258332, + 258387, + 258622, + 258320, + 258362, + 258472, + 258365, + 258460, + 258435, + 258269, + 258371, + 258249, + 258193, + 258198, + 258346, + 258411, + 258400, + 258606, + 258296, + 258367, + 258327, + 258298, + 258504, + 258261, + 258482, + 258119, + 258080, + 258050, + 258021, + 258084, + 258339, + 258383, + 258776, + 258298, + 258269, + 258474, + 258365, + 258438, + 258297, + 258495, + 258355, + 258546, + 258383, + 258460, + 258213, + 258359, + 258451, + 258289, + 258259, + 258355, + 257980, + 257908, + 258090, + 257939, + 258230, + 258126, + 257939, + 257924, + 258027, + 257930, + 257973, + 258161, + 258031, + 258142, + 257982, + 258240, + 257984, + 258237, + 257957, + 258144, + 258359, + 257967, + 258302, + 258210, + 258261, + 258353, + 258347, + 258434, + 258014, + 258192, + 257942, + 258088, + 258127, + 258020, + 258135, + 258345, + 258303, + 258293, + 258272, + 258309, + 258384, + 258330, + 258924, + 258262, + 258336, + 258038, + 258120, + 258462, + 258253, + 258452, + 258293, + 258445, + 258361, + 259699, + 258378, + 258920, + 258394, + 258636, + 258314, + 258438, + 258306, + 258445, + 258507, + 258374, + 259681, + 258018, + 258095, + 258118, + 258365, + 258097, + 258111, + 258076, + 258373, + 258052, + 258064, + 258126, + 258254, + 258229, + 258473, + 258564, + 258343, + 258035, + 258092, + 258174, + 258066, + 258110, + 259499, + 258405, + 258443, + 259275, + 258488, + 258218, + 258601, + 258300, + 258744, + 258507, + 258320, + 258418, + 258417, + 258327, + 258030, + 258169, + 258265, + 257905, + 258083, + 258314, + 258347, + 258563, + 258295, + 259317, + 258246, + 258370, + 258339, + 258241, + 258334, + 258218, + 258398, + 258291, + 257993, + 257957, + 258038, + 258006, + 258134, + 258027, + 258408, + 258061, + 257970, + 258039, + 257944, + 257947, + 258371, + 258451, + 258513, + 258229, + 258329, + 258322, + 258366, + 258419, + 258232, + 258472, + 258354, + 258313, + 258308, + 258182, + 258239, + 258167, + 258369, + 258605, + 258255, + 258235, + 258203, + 258318, + 258369, + 258257, + 258680, + 258416, + 258283, + 258373, + 258300, + 258464, + 258312, + 258568, + 258637, + 258347, + 258391, + 258277, + 258346, + 258553, + 258040, + 258325, + 258046, + 257915, + 257987, + 257964, + 258576, + 258297, + 258231, + 258526, + 258249, + 258291, + 258392, + 258315, + 258121, + 257933, + 258274, + 258080, + 258242, + 257914, + 257962, + 257999, + 257914, + 258181, + 258326, + 257945, + 258108, + 257996, + 257997, + 258013, + 258050, + 258131, + 258101, + 257924, + 258059, + 257982, + 257995, + 257985, + 258154, + 258222, + 257977, + 258004, + 258119, + 258095, + 258085, + 257842, + 258219, + 258167, + 257893, + 258049, + 258012, + 258048, + 258011, + 258254, + 258138, + 258365, + 258390, + 258246, + 258344, + 258566, + 258268, + 258592, + 258389, + 258399, + 258552, + 258286, + 258353, + 257934, + 258406, + 258401, + 258351, + 258362, + 258287, + 258344, + 258316, + 258398, + 258587, + 258256, + 258275, + 258412, + 258407, + 258254, + 258042, + 258373, + 258383, + 258201, + 258017, + 258655, + 258246, + 258302, + 258330, + 258395, + 258386, + 258322, + 258339, + 258378, + 258107, + 257978, + 258064, + 258172, + 258118, + 258080, + 258087, + 258017, + 258604, + 258052, + 258289, + 258148, + 257966, + 257972, + 257993, + 257956, + 258057, + 258183, + 258314, + 258018, + 257986, + 258241, + 258053, + 258112, + 258007, + 258239, + 258050, + 257910, + 258009, + 258146, + 258085, + 257989, + 258147, + 258018, + 258002, + 257983, + 257979, + 258047, + 258142, + 257999, + 258456, + 258090, + 257958, + 257909, + 258125, + 258008, + 258046, + 258143, + 258181, + 258119, + 257935, + 258019, + 257915, + 258271, + 258079, + 258040, + 258022, + 258055, + 257883, + 257920, + 257923, + 258101, + 258191, + 258089, + 257960, + 258044, + 258050, + 258106, + 258174, + 258065, + 258277, + 258056, + 257981, + 257958, + 258012, + 257978, + 258110, + 258075, + 258325, + 258017, + 258033, + 257979, + 258014, + 258142, + 258051, + 258185, + 258088, + 258104, + 258074, + 258076, + 257994, + 258072, + 258018, + 258295, + 258046, + 258071, + 258096, + 257936, + 258454, + 258298, + 258777, + 258316, + 258321, + 258354, + 258294, + 258378, + 258391, + 258766, + 258299, + 258347, + 258408, + 258162, + 258162, + 258121, + 258412, + 258262, + 258326, + 258252, + 258412, + 258412, + 258373, + 258530, + 258278, + 258505, + 258505, + 258269, + 258458, + 258458, + 257902, + 257963, + 258322, + 258268, + 258268, + 258328, + 258277, + 258388, + 258421, + 258499, + 258286, + 258286, + 258330, + 258330, + 258064, + 258245, + 258245, + 258190, + 258008, + 257958, + 258601, + 258601, + 258113, + 258403, + 258421, + 258421, + 258383, + 258376, + 258405, + 258360, + 258232, + 258379, + 258282, + 258243, + 258309, + 258309, + 257985, + 258144, + 258144, + 258272, + 258033, + 258033, + 257988, + 257988, + 258199, + 258126, + 258126, + 258084, + 258084, + 257999, + 257895, + 257895, + 258292, + 258157, + 258065, + 258065, + 257914, + 258058, + 258409, + 258409, + 258302, + 258523, + 258285, + 258326, + 258341, + 258341, + 258335, + 258178, + 258178, + 258031, + 258031, + 257919, + 258179, + 258179, + 258075, + 258281, + 258135, + 258135, + 258046, + 257923, + 257923, + 258007, + 258044, + 258231, + 257948, + 257948, + 258060, + 258099, + 258123, + 258123, + 257911, + 258070, + 258331, + 258331, + 258283, + 258296, + 258296, + 258339, + 258435, + 258435, + 258245, + 258337, + 258310, + 258454, + 258454, + 258552, + 258423, + 258423, + 258358, + 257991, + 257991, + 258228, + 258228, + 258320, + 258320, + 258145, + 258148, + 258148, + 257989, + 258183, + 258489, + 258347, + 258376, + 258398, + 258362, + 258246, + 258246, + 258359, + 258142, + 258142, + 257996, + 257996, + 258081, + 258188, + 258188, + 257989, + 258042, + 258070, + 258070, + 258278, + 257995, + 257994, + 257994, + 258217, + 258217, + 258056, + 258301, + 258301, + 258092, + 258092, + 258238, + 258252, + 258047, + 257978, + 258052, + 258055, + 258055, + 257987, + 257933, + 257933, + 258051, + 257973, + 257992, + 258338, + 258195, + 258195, + 258474, + 258015, + 257896, + 257963, + 258008, + 258008, + 258046, + 258046, + 258263, + 257997, + 257889, + 257948, + 258304, + 258115, + 258245, + 258245, + 257920, + 258020, + 258020, + 258326, + 258326, + 258100, + 258162, + 258017, + 258017, + 258114, + 258393, + 258295, + 258372, + 258585, + 258259, + 258259, + 258323, + 258323, + 258340, + 258052, + 258364, + 258631, + 258308, + 258225, + 258339, + 258004, + 258233, + 258206, + 258206, + 258238, + 258288, + 258258, + 258183, + 258072, + 257962, + 258080, + 258080, + 258105, + 258011, + 258034, + 258096, + 258096, + 258144, + 257837, + 258143, + 257945, + 257945, + 258010, + 258098, + 258098, + 258091, + 258261, + 258112, + 257963, + 258309, + 258309, + 258241, + 258195, + 258289, + 258699, + 258443, + 258363, + 258304, + 258329, + 258397, + 258397, + 258342, + 258016, + 257955, + 257955, + 257875, + 257996, + 258085, + 258058, + 258404, + 258356, + 258079, + 258012, + 258306, + 258357, + 258357, + 258138, + 258265, + 258265, + 258274, + 258053, + 258011, + 258011, + 258130, + 258025, + 258025, + 257987, + 258047, + 258047, + 258290, + 258290, + 258478, + 258380, + 258337, + 258334, + 258049, + 258456, + 257981, + 258437, + 258437, + 258265, + 258009, + 258009, + 257993, + 257974, + 257974, + 258262, + 257971, + 258068, + 257927, + 257927, + 258033, + 257910, + 258141, + 258141, + 258125, + 258002, + 257989, + 257989, + 257947, + 257947, + 258066, + 258023, + 258023, + 257968, + 257968, + 258019, + 258062, + 257983, + 258099, + 258099, + 258053, + 258086, + 258114, + 258114, + 258242, + 258242, + 258111, + 258055, + 257955, + 258035, + 258035, + 258163, + 258499, + 258499, + 258117, + 257856, + 257856, + 257969, + 258027, + 258027, + 258213, + 258136, + 258276, + 258316, + 258275, + 258319, + 258259, + 258259, + 258201, + 260158, + 257956, + 257926, + 258077, + 258077 + ], + "sample_count": 1272 + }, + { + "pubkey": "8SLz74iniPsatsDVcSdCfFGj2pkZurCY9rHABSAWD1Re", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "target_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242245000000, + "samples": [ + 62294, + 62084, + 62112, + 62040, + 62315, + 62082, + 62149, + 62063, + 62225, + 62266, + 62133, + 62039, + 62169, + 62014, + 62197, + 62216, + 62219, + 62149, + 62246, + 62239, + 62212, + 62152, + 62023, + 62249, + 62157, + 62158, + 62094, + 62119, + 62218, + 62088, + 62082, + 62035, + 62206, + 62109, + 62114, + 62255, + 62060, + 62033, + 62307, + 62282, + 62015, + 62123, + 62086, + 62203, + 62117, + 62133, + 62045, + 62065, + 62076, + 62190, + 62101, + 62210, + 62263, + 62260, + 62029, + 62051, + 62203, + 62268, + 62120, + 62292, + 62104, + 62095, + 62184, + 62129, + 62084, + 62273, + 62256, + 62314, + 62103, + 62270, + 62195, + 62114, + 62080, + 62139, + 62113, + 62091, + 62065, + 62121, + 62222, + 62256, + 62254, + 62258, + 62042, + 62109, + 62243, + 62089, + 62105, + 62219, + 62066, + 62217, + 62050, + 62050, + 62051, + 62105, + 62221, + 62110, + 62210, + 62116, + 62063, + 62085, + 62103, + 62057, + 62031, + 62108, + 62146, + 62046, + 62057, + 62096, + 62207, + 62230, + 62078, + 62038, + 62262, + 62129, + 62198, + 62074, + 62002, + 62075, + 62073, + 62335, + 62092, + 62226, + 62062, + 62216, + 62215, + 62137, + 62066, + 62051, + 62156, + 62135, + 62045, + 62052, + 62175, + 62093, + 62150, + 62234, + 62277, + 62068, + 62211, + 62107, + 62112, + 62193, + 62240, + 62196, + 62128, + 62276, + 62256, + 62235, + 62237, + 62035, + 61990, + 62115, + 62096, + 62263, + 62140, + 62123, + 62100, + 62062, + 62020, + 62260, + 62143, + 62287, + 62153, + 62100, + 62276, + 62217, + 62036, + 62081, + 62218, + 62158, + 62161, + 62204, + 62139, + 62067, + 62265, + 62203, + 62031, + 62109, + 62027, + 62119, + 62191, + 62112, + 62206, + 62083, + 62156, + 62126, + 62007, + 62028, + 62121, + 62165, + 62266, + 62104, + 62296, + 62216, + 62300, + 62244, + 62040, + 62055, + 62186, + 62093, + 62062, + 62206, + 62157, + 62235, + 62068, + 62273, + 62097, + 61947, + 62146, + 62199, + 62170, + 62155, + 62092, + 62305, + 62202, + 62032, + 62258, + 62268, + 62090, + 62137, + 62157, + 62207, + 62211, + 62108, + 62222, + 62106, + 62172, + 62203, + 62104, + 62260, + 62140, + 62128, + 62127, + 62129, + 62112, + 62092, + 62084, + 62295, + 62199, + 62242, + 62271, + 62157, + 62012, + 62282, + 62210, + 62116, + 62067, + 62029, + 62013, + 62078, + 62095, + 62307, + 62295, + 62244, + 62044, + 62287, + 62100, + 62254, + 62103, + 62354, + 62169, + 62116, + 62170, + 62052, + 62023, + 62109, + 62210, + 62139, + 62100, + 62254, + 62090, + 62060, + 62227, + 62109, + 62026, + 62315, + 62085, + 62181, + 62297, + 62303, + 62276, + 62080, + 62169, + 62039, + 62143, + 62297, + 62057, + 62296, + 62078, + 62252, + 62094, + 62247, + 62255, + 62119, + 62151, + 62150, + 62082, + 62192, + 62241, + 62253, + 62153, + 62093, + 62031, + 62085, + 62200, + 62094, + 62143, + 62037, + 62100, + 62185, + 62004, + 62313, + 62084, + 62038, + 62270, + 62109, + 62087, + 62056, + 62052, + 62152, + 62172, + 62061, + 62013, + 62201, + 62321, + 62199, + 62205, + 62230, + 61997, + 62113, + 62081, + 62013, + 62170, + 62047, + 62238, + 62250, + 62128, + 62131, + 62124, + 62159, + 62061, + 62173, + 62230, + 62088, + 62176, + 62145, + 62033, + 62068, + 62218, + 62283, + 62074, + 62114, + 61984, + 62131, + 62040, + 62291, + 62107, + 62051, + 62324, + 62243, + 62021, + 62235, + 62025, + 62106, + 62302, + 62192, + 62068, + 62195, + 62282, + 62158, + 62130, + 62238, + 62084, + 62243, + 62130, + 62209, + 62093, + 62092, + 62076, + 62282, + 62168, + 62094, + 62292, + 62197, + 62139, + 62263, + 62064, + 62087, + 62113, + 62252, + 62109, + 62298, + 62100, + 62215, + 62111, + 62239, + 62120, + 62313, + 62142, + 62044, + 61998, + 62051, + 62103, + 62274, + 62251, + 62258, + 62225, + 61984, + 62085, + 62125, + 62288, + 62113, + 62224, + 62030, + 62240, + 62206, + 62082, + 62107, + 62093, + 62166, + 62223, + 62238, + 62046, + 62184, + 62328, + 62286, + 62077, + 62239, + 62196, + 62309, + 62196, + 62111, + 62103, + 62252, + 62016, + 62218, + 62124, + 62076, + 62084, + 62192, + 62214, + 62034, + 62201, + 62185, + 62145, + 62150, + 62129, + 62097, + 62249, + 62081, + 62088, + 62283, + 62101, + 62279, + 62233, + 62065, + 62276, + 62086, + 62077, + 62068, + 62172, + 62298, + 62242, + 62099, + 62048, + 62085, + 62091, + 62153, + 64028, + 62247, + 62183, + 62072, + 62218, + 62097, + 62276, + 62269, + 62096, + 62175, + 62088, + 62346, + 62151, + 62094, + 62080, + 62110, + 62069, + 62306, + 62018, + 62235, + 62083, + 62143, + 62070, + 62051, + 62238, + 62064, + 61976, + 62229, + 62090, + 62098, + 62053, + 62117, + 62275, + 62060, + 62053, + 62172, + 62198, + 62209, + 62063, + 62245, + 62087, + 62090, + 62113, + 62150, + 62280, + 62203, + 62126, + 62084, + 62068, + 62145, + 62048, + 62186, + 62144, + 62158, + 62033, + 62207, + 62131, + 62300, + 62042, + 62277, + 62042, + 62278, + 62158, + 62181, + 62286, + 62035, + 62231, + 62082, + 62080, + 62073, + 62237, + 62145, + 62120, + 62055, + 62267, + 62043, + 62036, + 61979, + 62048, + 62098, + 62109, + 62035, + 62070, + 62145, + 62207, + 62254, + 62121, + 61985, + 62021, + 62181, + 62039, + 62309, + 62066, + 62264, + 62277, + 62048, + 62267, + 62074, + 62129, + 62060, + 62282, + 62060, + 62230, + 62087, + 62022, + 62099, + 62089, + 62172, + 62058, + 62077, + 62050, + 62127, + 62018, + 62199, + 62123, + 62207, + 62131, + 62094, + 62075, + 62102, + 62205, + 62102, + 62029, + 62216, + 62056, + 62274, + 62174, + 62139, + 62198, + 62043, + 62258, + 62285, + 62078, + 62307, + 62139, + 62138, + 62218, + 62042, + 62008, + 62018, + 62177, + 62239, + 62253, + 62118, + 62242, + 62254, + 62117, + 62172, + 61959, + 62086, + 62232, + 62295, + 62137, + 62096, + 62125, + 62131, + 62115, + 62095, + 62154, + 62172, + 62074, + 62169, + 62108, + 62133, + 62164, + 62210, + 62096, + 62012, + 62143, + 62216, + 62087, + 62075, + 62276, + 62126, + 62082, + 62316, + 62308, + 62070, + 62213, + 62077, + 62286, + 62284, + 62098, + 62114, + 62009, + 62094, + 62053, + 62157, + 62107, + 62079, + 62052, + 62292, + 62033, + 62167, + 62089, + 62294, + 62315, + 62044, + 62022, + 62044, + 62037, + 62084, + 62057, + 62107, + 62054, + 62261, + 62318, + 62148, + 62008, + 62227, + 62252, + 62074, + 62051, + 62080, + 62328, + 62043, + 62238, + 62098, + 62104, + 62162, + 62068, + 62178, + 62206, + 62108, + 62065, + 62225, + 62145, + 62261, + 62059, + 62066, + 62220, + 62132, + 62087, + 62078, + 62232, + 62188, + 62191, + 62251, + 62164, + 62099, + 62023, + 62114, + 62089, + 62053, + 62091, + 62090, + 62101, + 62173, + 62122, + 62211, + 62102, + 62282, + 62145, + 62112, + 62094, + 62044, + 62337, + 62069, + 62075, + 62176, + 62277, + 62301, + 62225, + 62048, + 62091, + 62141, + 62172, + 62123, + 62081, + 62194, + 62306, + 62082, + 62239, + 62052, + 62242, + 62203, + 62280, + 62216, + 62083, + 62037, + 62236, + 62043, + 62113, + 62138, + 62153, + 62232, + 62236, + 62291, + 62072, + 62010, + 62203, + 62081, + 62049, + 62165, + 62164, + 62109, + 62288, + 62198, + 62165, + 62061, + 62255, + 62087, + 62300, + 62084, + 62141, + 62162, + 62090, + 62093, + 62078, + 62195, + 62258, + 62150, + 62047, + 62156, + 62110, + 62215, + 61983, + 62197, + 62153, + 62002, + 62025, + 62242, + 62098, + 62047, + 62163, + 62251, + 62154, + 62218, + 62255, + 62180, + 62230, + 62252, + 62201, + 62117, + 62155, + 62014, + 62046, + 62091, + 62079, + 62269, + 62108, + 62315, + 62132, + 62117, + 62083, + 62244, + 62227, + 62173, + 62015, + 62105, + 62070, + 62140, + 62027, + 62049, + 61976, + 62096, + 62109, + 62063, + 62067, + 62059, + 62208, + 62145, + 62017, + 62077, + 62168, + 62140, + 62091, + 62144, + 62081, + 62221, + 62091, + 62245, + 62015, + 62266, + 62280, + 62093, + 62382, + 62034, + 62084, + 62126, + 62337, + 62073, + 62090, + 62096, + 62309, + 62014, + 62012, + 62095, + 62155, + 62032, + 62065, + 62216, + 62047, + 62233, + 62130, + 62066, + 62104, + 62114, + 62101, + 62119, + 62301, + 62100, + 62272, + 62321, + 62170, + 62122, + 62201, + 62284, + 62166, + 62035, + 62260, + 62181, + 62300, + 62085, + 62197, + 62113, + 62243, + 62044, + 62059, + 61973, + 62028, + 62049, + 62059, + 62223, + 62054, + 62196, + 62100, + 62346, + 62159, + 62303, + 62147, + 62135, + 62032, + 62226, + 62221, + 62145, + 62210, + 62076, + 62117, + 62068, + 62259, + 62276, + 62049, + 62103, + 62184, + 62147, + 62071, + 62065, + 62057, + 62230, + 62601, + 62173, + 62113, + 62248, + 62156, + 62219, + 62182, + 62086, + 62099, + 62062, + 62083, + 62105, + 62169, + 62122, + 62264, + 62256, + 62055, + 62243, + 62261, + 62019, + 62225, + 62162, + 62186, + 62288, + 62037, + 62274, + 62072, + 62011, + 61998, + 62293, + 62137, + 62264, + 62086, + 62239, + 62197, + 62023, + 62195, + 62117, + 62113, + 62163, + 62203, + 62127, + 62135, + 62216, + 62073, + 62136, + 62268, + 62069, + 62271, + 62035, + 62254, + 62174, + 62061, + 62193, + 62172, + 62098, + 62044, + 62052, + 62239, + 62089, + 62286, + 62143, + 62095, + 62216, + 62290, + 62067, + 62302, + 62032, + 62069, + 62222, + 62028, + 62283, + 62159, + 62075, + 62321, + 62012, + 62142, + 62225, + 62218, + 62183, + 62022, + 62262, + 62028, + 62081, + 62186, + 62128, + 62262, + 62167, + 62059, + 62180, + 62082, + 62234, + 62121, + 62099, + 62123, + 62281, + 62239, + 62069, + 62084, + 62194, + 62267, + 62199, + 62140, + 62206, + 62100, + 62280, + 62097, + 62047, + 62239, + 62054, + 62103, + 62177, + 62096, + 62089, + 62294, + 62113, + 62110, + 62285, + 62095, + 62145, + 62186, + 62257, + 62137, + 62183, + 62136, + 62040, + 62034, + 62168, + 61955, + 62079, + 62274, + 62102, + 62355, + 62196, + 62089, + 62103, + 62214, + 62044, + 62249, + 62260, + 62124, + 62216, + 62068, + 62239, + 62288, + 62344, + 62036, + 62105, + 62036, + 62110, + 62048, + 62168, + 62289, + 62092, + 62247, + 62210, + 62093, + 62284, + 62102, + 62167, + 62038, + 62039, + 62130, + 62321, + 62180, + 62199, + 62052, + 62095, + 62135, + 62095, + 61993, + 62053, + 62042, + 62023, + 62279, + 62294, + 62206, + 62288, + 62251, + 62152, + 62342, + 62061, + 62096, + 62090, + 62204, + 62274, + 62076, + 62107, + 62063, + 62195, + 62276, + 62140, + 62130, + 62162, + 62169, + 62071, + 62099, + 62226, + 62081, + 62077, + 62213, + 62228, + 62052, + 62123, + 62109, + 62116, + 62293, + 62229, + 62286, + 62068, + 62038, + 62213, + 62125, + 62186, + 62022, + 62242, + 62111, + 62119, + 62280, + 62092, + 62084, + 62042, + 62080, + 62280, + 62283, + 62058, + 62192, + 62086, + 62136, + 62311, + 62202, + 62218, + 62221, + 62290, + 62026, + 62291, + 62357, + 62284, + 62138, + 62127, + 62127, + 62126, + 62167, + 62283, + 62058, + 62290, + 62085, + 62152, + 62070, + 62130, + 62255, + 62258, + 62119, + 62084, + 62063, + 62192, + 62075, + 62115, + 62260, + 62124, + 62025, + 62150, + 62067, + 62195, + 62214, + 62258, + 62088, + 62084, + 62245, + 62029, + 61989, + 62213, + 62147, + 61994, + 62090, + 62229, + 62054, + 62206, + 62092, + 62075, + 62078, + 61997, + 62120, + 62085, + 62151, + 62094, + 62016, + 61989, + 61996, + 62251, + 62069, + 62240, + 62102, + 62004, + 62061, + 62156, + 62037, + 62115, + 62289, + 62158, + 62146, + 62109, + 62058, + 62012, + 62274, + 62138, + 62218, + 62112, + 62034, + 62098, + 62113, + 62115, + 62067, + 62085, + 62079, + 62053, + 62298, + 62320, + 62241, + 62165, + 62231, + 62046, + 62131, + 62209, + 62100, + 62306, + 62165, + 62144, + 62225, + 62073, + 62263, + 62230, + 62144, + 62207, + 62078, + 61956, + 62036, + 62235, + 62205, + 62087, + 62180, + 62094, + 62302, + 62257 + ], + "sample_count": 1262 + }, + { + "pubkey": "2YGD6EzuMvqQbNNHGA9ZnhGRr84LyvuTsSdK5kKzigDS", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242245000000, + "samples": [ + 181922, + 181772, + 178299, + 178442, + 178508, + 178291, + 178348, + 178499, + 181675, + 178446, + 178300, + 178343, + 181824, + 178287, + 176527, + 176526, + 179718, + 176443, + 179932, + 176378, + 179744, + 179782, + 179734, + 176420, + 179761, + 176317, + 179730, + 176422, + 179793, + 179744, + 176513, + 176419, + 179890, + 176554, + 179936, + 176348, + 176405, + 176370, + 176349, + 179844, + 179722, + 179780, + 179717, + 179770, + 181746, + 181864, + 178438, + 178309, + 181718, + 181728, + 178465, + 181724, + 178410, + 178285, + 179823, + 176580, + 179899, + 179743, + 176426, + 176607, + 176449, + 176402, + 179740, + 179866, + 179920, + 179790, + 179743, + 176539, + 176369, + 176469, + 176416, + 176367, + 176393, + 176389, + 176432, + 179917, + 176653, + 176600, + 176448, + 176665, + 176614, + 176476, + 176551, + 176424, + 179999, + 176449, + 179802, + 176367, + 176591, + 179953, + 179725, + 176483, + 176378, + 180014, + 180030, + 176402, + 179759, + 179845, + 179810, + 179750, + 176598, + 179749, + 179747, + 179810, + 176602, + 176383, + 176411, + 179803, + 179974, + 181912, + 181711, + 178513, + 178347, + 178332, + 179793, + 179956, + 176555, + 176571, + 179901, + 179843, + 176370, + 179790, + 179677, + 179743, + 176403, + 176562, + 179753, + 176383, + 179765, + 176604, + 176509, + 176351, + 176368, + 179812, + 176549, + 179907, + 181704, + 178518, + 178292, + 178509, + 178516, + 179783, + 179746, + 176568, + 176574, + 179766, + 176395, + 176366, + 176402, + 176313, + 179818, + 179741, + 179752, + 176349, + 176361, + 179740, + 176429, + 179745, + 179972, + 179794, + 179849, + 181662, + 178359, + 178504, + 181791, + 178557, + 178370, + 181676, + 178332, + 181848, + 178423, + 181706, + 178332, + 181704, + 181799, + 178452, + 178482, + 178538, + 181852, + 178514, + 181642, + 178321, + 181832, + 178358, + 181920, + 178281, + 178333, + 178264, + 181857, + 178360, + 181834, + 179766, + 179921, + 179715, + 179766, + 179930, + 176379, + 179851, + 176357, + 179766, + 179754, + 179776, + 179782, + 179836, + 179927, + 179861, + 181727, + 178308, + 181741, + 178544, + 178363, + 178311, + 181820, + 178257, + 179812, + 176403, + 179728, + 179892, + 176340, + 176560, + 179777, + 179775, + 179892, + 179738, + 179736, + 176300, + 176430, + 179693, + 176436, + 176458, + 176328, + 176427, + 176493, + 176324, + 179731, + 179794, + 179915, + 179916, + 179775, + 176540, + 179940, + 176430, + 179940, + 179684, + 176540, + 179717, + 179893, + 179735, + 176382, + 181891, + 181772, + 178346, + 181646, + 181673, + 178537, + 181657, + 178291, + 181665, + 181648, + 179952, + 176385, + 176519, + 176405, + 176412, + 179756, + 179773, + 179858, + 176395, + 176587, + 179713, + 176380, + 176354, + 176397, + 176563, + 176554, + 179853, + 176331, + 179770, + 179759, + 179739, + 176429, + 179750, + 179716, + 176545, + 179826, + 176415, + 179746, + 179792, + 176503, + 179758, + 176385, + 176556, + 176520, + 179761, + 179809, + 176510, + 179776, + 176375, + 176409, + 179838, + 176585, + 176378, + 179766, + 179806, + 176350, + 179858, + 176345, + 179931, + 179923, + 176621, + 176410, + 179906, + 176400, + 176353, + 176538, + 176576, + 176468, + 176356, + 179948, + 179747, + 179761, + 179765, + 179726, + 179904, + 176568, + 179762, + 178400, + 178298, + 181682, + 178308, + 181739, + 181716, + 178354, + 178308, + 181689, + 181850, + 179771, + 176351, + 179685, + 176572, + 179710, + 176518, + 179738, + 179849, + 179944, + 176367, + 176401, + 179930, + 176427, + 178500, + 181690, + 178319, + 181728, + 181687, + 181907, + 178304, + 181700, + 181731, + 181867, + 178248, + 181687, + 178278, + 178306, + 178456, + 181869, + 178350, + 178298, + 178406, + 181682, + 178476, + 178345, + 181686, + 178317, + 181677, + 178281, + 178287, + 176362, + 176350, + 179745, + 176526, + 179697, + 181688, + 181811, + 181872, + 181890, + 181886, + 178343, + 178369, + 178304, + 179936, + 179747, + 176563, + 176585, + 179733, + 176516, + 176324, + 178263, + 181912, + 181693, + 176412, + 179716, + 179880, + 176376, + 176366, + 176329, + 176351, + 179740, + 176309, + 179956, + 179712, + 179912, + 179776, + 176358, + 176535, + 176530, + 179758, + 179948, + 176402, + 176355, + 179753, + 176313, + 176534, + 179897, + 176572, + 176305, + 179729, + 179779, + 176357, + 176420, + 179942, + 176320, + 181675, + 178319, + 178313, + 181735, + 181691, + 181611, + 181838, + 178484, + 179745, + 176370, + 176349, + 179732, + 176520, + 179865, + 179731, + 176314, + 179900, + 179736, + 179918, + 176372, + 179834, + 179883, + 179695, + 179936, + 176341, + 178390, + 178307, + 178316, + 178271, + 178526, + 178292, + 181704, + 178334, + 181771, + 181854, + 176355, + 176527, + 179839, + 179789, + 179744, + 178267, + 178286, + 178312, + 181716, + 181872, + 181657, + 181901, + 181909, + 178510, + 181688, + 178317, + 181864, + 181704, + 178555, + 178298, + 181813, + 178292, + 178291, + 181680, + 178329, + 178321, + 178364, + 178328, + 181703, + 181778, + 181674, + 181661, + 181717, + 178309, + 181720, + 179741, + 176386, + 179720, + 181714, + 181650, + 179769, + 179817, + 179803, + 176516, + 179720, + 176348, + 179832, + 176452, + 176384, + 179772, + 176573, + 176341, + 179919, + 176452, + 176399, + 179788, + 179987, + 179900, + 176644, + 179715, + 179767, + 179781, + 179787, + 176363, + 179756, + 176422, + 176499, + 179774, + 179940, + 179978, + 181752, + 178403, + 181620, + 178550, + 178418, + 176357, + 176536, + 176592, + 176535, + 176468, + 179735, + 179719, + 176405, + 179721, + 176472, + 179736, + 176362, + 179882, + 179750, + 179745, + 179752, + 179925, + 176400, + 176323, + 176400, + 176380, + 176519, + 179808, + 181861, + 178382, + 176350, + 176324, + 176417, + 178536, + 181667, + 178393, + 178512, + 178343, + 176568, + 179803, + 181873, + 178256, + 181669, + 176548, + 176409, + 179752, + 176345, + 179744, + 179889, + 179754, + 176384, + 179758, + 176580, + 179924, + 176386, + 181695, + 178430, + 181735, + 179757, + 179778, + 179781, + 176569, + 179771, + 179960, + 179760, + 179877, + 179706, + 182037, + 179938, + 179689, + 179709, + 176488, + 176332, + 176549, + 176354, + 176439, + 179768, + 179706, + 179924, + 179753, + 179815, + 179943, + 176372, + 176480, + 176399, + 179814, + 179963, + 176415, + 181772, + 181820, + 176390, + 179772, + 179766, + 176405, + 179910, + 176353, + 176590, + 179880, + 179957, + 176343, + 179736, + 179743, + 179855, + 176627, + 176329, + 181657, + 178311, + 178453, + 181666, + 178542, + 178510, + 181922, + 181893, + 179940, + 176428, + 178370, + 178311, + 178499, + 176397, + 176412, + 176366, + 176387, + 179798, + 176466, + 179964, + 176337, + 179700, + 179865, + 176578, + 176570, + 176515, + 179924, + 176411, + 179925, + 179932, + 176385, + 176386, + 179701, + 176537, + 179925, + 176346, + 176531, + 176472, + 178364, + 181678, + 179786, + 179904, + 179935, + 176639, + 179935, + 179765, + 179706, + 176419, + 176403, + 176567, + 179712, + 176408, + 176446, + 176375, + 176358, + 179795, + 179912, + 179971, + 176585, + 179729, + 176391, + 179718, + 179928, + 176589, + 179955, + 176416, + 176327, + 179755, + 181710, + 178385, + 178342, + 181749, + 178336, + 178546, + 178256, + 181694, + 181760, + 181691, + 181886, + 181718, + 181742, + 181744, + 181690, + 178314, + 178355, + 176416, + 176442, + 179773, + 179923, + 179760, + 176360, + 179774, + 176358, + 176567, + 176341, + 179966, + 179801, + 179762, + 176524, + 176517, + 176416, + 179873, + 176571, + 176576, + 179851, + 176325, + 176414, + 176420, + 176610, + 176485, + 176367, + 179732, + 176377, + 179787, + 179749, + 176436, + 176300, + 179755, + 179929, + 179764, + 179777, + 179732, + 179679, + 179945, + 179673, + 179760, + 179746, + 179715, + 179804, + 179673, + 176395, + 179760, + 179758, + 176396, + 176500, + 179657, + 179772, + 176351, + 176358, + 176429, + 176338, + 179760, + 179743, + 176430, + 176408, + 175687, + 175665, + 175605, + 178360, + 178909, + 178922, + 178903, + 178859, + 174103, + 174133, + 177313, + 177328, + 177494, + 178949, + 178694, + 178634, + 178690, + 178604, + 178752, + 178638, + 177718, + 177735, + 177591, + 177592, + 177544, + 177683, + 177636, + 177717, + 177585, + 177547, + 178862, + 178877, + 178912, + 175308, + 175116, + 175308, + 175106, + 175118, + 178134, + 178258, + 175522, + 175646, + 175581, + 175473, + 175463, + 175455, + 175441, + 175428, + 178891, + 178781, + 178720, + 178790, + 178912, + 175259, + 175109, + 175131, + 175168, + 175220, + 175340, + 175151, + 175175, + 175287, + 175145, + 176350, + 179906, + 179782, + 179725, + 179831, + 176533, + 179745, + 179788, + 179876, + 179897, + 176401, + 176465, + 179712, + 179927, + 176430, + 176560, + 176506, + 176441, + 179772, + 179709, + 179953, + 176417, + 179787, + 176421, + 176479, + 176618, + 176301, + 176497, + 176338, + 176558, + 181755, + 181700, + 176449, + 179750, + 176399, + 176378, + 179797, + 176390, + 179755, + 179935, + 179780, + 176411, + 179834, + 179761, + 179963, + 179912, + 179728, + 179771, + 179773, + 179729, + 179961, + 176385, + 179931, + 176360, + 180011, + 179743, + 176477, + 179909, + 179750, + 178314, + 181643, + 181825, + 181694, + 178510, + 178342, + 181859, + 178378, + 178331, + 181704, + 178495, + 181819, + 181852, + 181807, + 181645, + 178399, + 181730, + 178290, + 178482, + 181678, + 179772, + 176337, + 176371, + 179715, + 176563, + 176429, + 179782, + 179968, + 179918, + 176425, + 176376, + 176479, + 176391, + 176393, + 176377, + 179671, + 179947, + 176580, + 176559, + 179948, + 179733, + 176531, + 179737, + 176576, + 176481, + 176633, + 179735, + 179903, + 179984, + 176447, + 176462, + 179777, + 176409, + 176632, + 179745, + 176382, + 176336, + 179696, + 176502, + 179847, + 179781, + 179745, + 176547, + 176529, + 176325, + 179975, + 176511, + 179783, + 179795, + 179753, + 179910, + 176363, + 179754, + 179811, + 176396, + 178514, + 178532, + 181686, + 181792, + 181674, + 178440, + 178309, + 178443, + 181888, + 178359, + 178486, + 178406, + 178302, + 178377, + 181691, + 176392, + 176452, + 178476, + 181857, + 178495, + 178461, + 181839, + 178310, + 181652, + 181656, + 181796, + 181623, + 178529, + 181854, + 181774, + 176325, + 179754, + 176503, + 179956, + 176463, + 176594, + 179905, + 179842, + 176380, + 179840, + 179885, + 176419, + 181679, + 178309, + 178480, + 178548, + 181687, + 178499, + 181851, + 178296, + 179782, + 176427, + 181896, + 178357, + 181662, + 178333, + 178275, + 181693, + 181694, + 181860, + 181691, + 178464, + 178308, + 181914, + 181705, + 181843, + 178350, + 181700, + 178466, + 181710, + 178497, + 178515, + 178367, + 181661, + 178276, + 181842, + 178540, + 178258, + 181867, + 178273, + 181782, + 181699, + 181685, + 181757, + 181691, + 178437, + 181659, + 181727, + 178361, + 181742, + 181857, + 181768, + 181674, + 178326, + 181674, + 181666, + 181897, + 179950, + 179783, + 176303, + 179923, + 176365, + 176552, + 176477, + 176389, + 178318, + 178337, + 176574, + 176355, + 176420, + 179750, + 176554, + 179792, + 179704, + 176383, + 176418, + 176549, + 179788, + 176418, + 179716, + 176415, + 176484, + 176473, + 176383, + 179721, + 179744, + 176473, + 176543, + 176572, + 176443, + 179702, + 179903, + 181854, + 181670, + 178379, + 178350, + 181831, + 178414, + 178296, + 181740, + 178364, + 181681, + 178522, + 178285, + 178344, + 181674, + 181696, + 181668, + 181707, + 178375, + 178360, + 178438, + 178566, + 181875, + 181865, + 179739, + 176593, + 179906, + 176565, + 176410, + 176570, + 176603, + 179755, + 176597, + 176370, + 179945, + 179767, + 179763, + 179767, + 179771, + 178530, + 181836, + 181694, + 178282, + 178328, + 178289, + 181668, + 181867, + 181874, + 178320, + 176429, + 176564, + 179742, + 179928, + 176446, + 176384, + 176486, + 179967, + 179733, + 179713, + 176416, + 179786, + 179923, + 179798, + 179949, + 179921, + 179956, + 178305, + 181882, + 176405, + 176604, + 179967, + 176389, + 176297, + 179738, + 179771, + 179850, + 179731, + 176342, + 179969, + 176365, + 176543, + 176582, + 179893, + 176537, + 180019, + 176372, + 179955, + 176469, + 179796, + 176567, + 179906, + 176549, + 176548, + 179922, + 179740, + 179961, + 181769, + 178505, + 178302, + 181669, + 181903, + 181690, + 178290, + 181905, + 178406, + 181739, + 179959, + 179916, + 179707, + 179885, + 176434, + 179798, + 176437, + 176562, + 176530, + 176549, + 179741, + 176397, + 179753, + 179944, + 179692, + 179904, + 176528, + 179840, + 176333, + 176369, + 179762, + 179781, + 179766, + 179947, + 179858, + 179733, + 176392, + 179929, + 179825, + 179954, + 176434, + 176360, + 179869, + 179974, + 176584, + 176377, + 179811, + 176418, + 176575, + 180011, + 176505, + 179891, + 176555, + 176590 + ], + "sample_count": 1264 + }, + { + "pubkey": "fjtxCvtWZZHeLuBjZJZ3YXQXi25baphYjdZRmk9t9kr", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242243000000, + "samples": [ + 256987, + 257116, + 256860, + 256799, + 256877, + 256956, + 256916, + 257256, + 256968, + 256968, + 256812, + 256812, + 256945, + 256945, + 256919, + 256877, + 256877, + 256894, + 256900, + 256813, + 256986, + 256830, + 257262, + 257262, + 256890, + 256822, + 256837, + 256774, + 256858, + 256955, + 256955, + 256827, + 256815, + 256815, + 256878, + 256845, + 256845, + 257588, + 256936, + 256795, + 256974, + 256933, + 257159, + 256819, + 257045, + 256958, + 256893, + 256893, + 256826, + 256853, + 256897, + 256903, + 257364, + 261722, + 256877, + 256862, + 256856, + 256867, + 256860, + 257351, + 258537, + 256832, + 256819, + 256850, + 257051, + 257139, + 256956, + 257789, + 256906, + 256804, + 256826, + 256863, + 256927, + 256927, + 257205, + 257962, + 256832, + 256793, + 256781, + 256803, + 256934, + 256934, + 257107, + 256881, + 257052, + 257052, + 256797, + 256873, + 256873, + 257090, + 257168, + 257168, + 256841, + 258246, + 256835, + 257105, + 256979, + 258087, + 257133, + 256928, + 256857, + 256830, + 256888, + 256878, + 257276, + 257479, + 256870, + 256858, + 256820, + 256820, + 256969, + 256938, + 257056, + 257056, + 256895, + 256808, + 256886, + 256916, + 256892, + 257567, + 256924, + 256808, + 256854, + 256897, + 256960, + 256921, + 256862, + 257012, + 256825, + 257064, + 256841, + 256939, + 257004, + 261655, + 256982, + 256936, + 256802, + 256802, + 257097, + 256899, + 257033, + 256902, + 257338, + 257338, + 256857, + 257202, + 256764, + 257218, + 257218, + 256931, + 256913, + 256916, + 256792, + 256870, + 256894, + 256884, + 256913, + 257392, + 256892, + 257006, + 256853, + 257043, + 256832, + 256919, + 256966, + 256964, + 256854, + 256960, + 256933, + 256957, + 256934, + 256912, + 257096, + 257096, + 256804, + 256833, + 256845, + 256836, + 257132, + 256952, + 256925, + 256925, + 256821, + 256821, + 256904, + 257017, + 256958, + 257018, + 256917, + 256848, + 256848, + 256918, + 257036, + 259690, + 257073, + 257117, + 256768, + 256868, + 256840, + 256851, + 257703, + 257564, + 260156, + 260156, + 256887, + 256798, + 256857, + 256903, + 257166, + 257129, + 258027, + 256823, + 256890, + 256805, + 256840, + 262282, + 256872, + 259295, + 259295, + 256856, + 256826, + 256826, + 257023, + 256852, + 257024, + 257999, + 257159, + 256863, + 256867, + 256842, + 256842, + 256821, + 257899, + 259086, + 256950, + 256909, + 256804, + 256834, + 256783, + 256901, + 256972, + 256849, + 259374, + 256817, + 256818, + 256934, + 257358, + 258945, + 258945, + 256852, + 262168, + 256814, + 256814, + 256916, + 257143, + 258767, + 256855, + 256855, + 257231, + 257231, + 257374, + 256963, + 256947, + 256957, + 256957, + 256849, + 256830, + 256804, + 256857, + 257093, + 256829, + 256809, + 256819, + 256819, + 257090, + 256810, + 257386, + 257029, + 256855, + 256850, + 256981, + 260229, + 256899, + 256933, + 256998, + 256998, + 256727, + 256915, + 256829, + 256823, + 257136, + 256993, + 256993, + 256975, + 256975, + 256875, + 256779, + 256829, + 256860, + 257028, + 256946, + 256932, + 256964, + 256977, + 256844, + 256862, + 257183, + 258202, + 256899, + 256840, + 256922, + 256778, + 259375, + 259375, + 256890, + 257134, + 256943, + 256753, + 256803, + 256879, + 256975, + 256792, + 258879, + 256970, + 256893, + 256838, + 256783, + 258880, + 256839, + 256938, + 261747, + 256880, + 256880, + 256764, + 256819, + 256973, + 256973, + 258385, + 257167, + 256776, + 256820, + 256866, + 256985, + 256910, + 256895, + 256935, + 256831, + 257010, + 256834, + 256831, + 256831, + 256907, + 257081, + 257621, + 256934, + 256773, + 256949, + 257057, + 256857, + 257081, + 256949, + 256801, + 256801, + 256824, + 256834, + 256933, + 256858, + 257082, + 256836, + 256836, + 256814, + 256796, + 256868, + 258367, + 256960, + 256960, + 256805, + 256805, + 256996, + 256826, + 256924, + 256890, + 257199, + 256892, + 256892, + 256837, + 256946, + 256928, + 256828, + 256930, + 256970, + 256868, + 256816, + 256902, + 256910, + 256964, + 256964, + 257386, + 256884, + 256824, + 256818, + 256772, + 257041, + 256823, + 256996, + 257074, + 256813, + 256819, + 256851, + 256851, + 256926, + 256851, + 256980, + 256858, + 256894, + 256843, + 256896, + 256844, + 256970, + 257039, + 257017, + 256995, + 256828, + 256896, + 256843, + 256996, + 256917, + 258773, + 256881, + 257021, + 256955, + 256905, + 257369, + 256961, + 257740, + 260565, + 260411, + 260412, + 260588, + 260509, + 260720, + 260787, + 261173, + 260942, + 260769, + 260736, + 260736, + 260804, + 260790, + 261975, + 260872, + 260746, + 260765, + 260617, + 260736, + 260831, + 260848, + 261065, + 260769, + 260719, + 260754, + 260754, + 260758, + 260912, + 260901, + 260787, + 260787, + 260681, + 260740, + 260740, + 260761, + 260586, + 260586, + 261842, + 260590, + 260798, + 260415, + 260546, + 260518, + 261489, + 260557, + 260569, + 260677, + 260377, + 260453, + 260576, + 260488, + 260573, + 260437, + 260182, + 260218, + 260476, + 260529, + 260529, + 260486, + 260341, + 260194, + 260194, + 260424, + 260429, + 260429, + 260104, + 262402, + 258812, + 260195, + 260302, + 260110, + 259809, + 259859, + 260412, + 257039, + 260347, + 260379, + 257656, + 257093, + 256963, + 257115, + 259595, + 257337, + 257337, + 256938, + 260278, + 256862, + 256861, + 260414, + 258704, + 257731, + 259814, + 260240, + 256808, + 259386, + 256922, + 256922, + 256998, + 259896, + 256894, + 260067, + 259112, + 256836, + 257186, + 257186, + 256887, + 256797, + 256902, + 256933, + 256981, + 256981, + 257048, + 257000, + 256882, + 256945, + 256893, + 257012, + 256926, + 257036, + 257558, + 256971, + 256905, + 256958, + 256940, + 256937, + 256884, + 257306, + 256999, + 256999, + 256867, + 256861, + 256983, + 256933, + 256938, + 257001, + 256842, + 256828, + 256865, + 256906, + 256906, + 256877, + 257919, + 256933, + 256846, + 256872, + 256941, + 257031, + 256886, + 256927, + 256914, + 256914, + 256890, + 256832, + 256840, + 256893, + 256936, + 258817, + 256856, + 256927, + 257214, + 257214, + 256804, + 256835, + 257071, + 257215, + 256873, + 256779, + 257988, + 256811, + 256923, + 256967, + 257018, + 256885, + 256767, + 256767, + 257321, + 256808, + 257006, + 257120, + 256986, + 256837, + 256798, + 256783, + 256866, + 256878, + 263309, + 257008, + 256849, + 259548, + 256950, + 256825, + 256825, + 256839, + 257129, + 256959, + 256959, + 256817, + 256905, + 256804, + 256931, + 256851, + 257542, + 256871, + 258502, + 256786, + 257839, + 257943, + 258182, + 258144, + 258002, + 257795, + 257919, + 257865, + 259736, + 258272, + 257988, + 257988, + 258063, + 257804, + 257863, + 257762, + 257959, + 257890, + 257803, + 257941, + 259483, + 257838, + 257874, + 257744, + 257971, + 257788, + 257934, + 261686, + 257930, + 257923, + 257858, + 257818, + 257954, + 258113, + 258057, + 257772, + 257772, + 257816, + 257774, + 257979, + 257804, + 258162, + 257804, + 257799, + 258698, + 257822, + 257941, + 257824, + 258110, + 258040, + 257793, + 257921, + 257802, + 257950, + 257900, + 257814, + 258983, + 257939, + 257799, + 257774, + 257774, + 258111, + 257840, + 258399, + 257811, + 257899, + 257952, + 257804, + 257831, + 257915, + 257860, + 258507, + 257826, + 257789, + 257789, + 257897, + 257797, + 258710, + 257853, + 258123, + 257865, + 257785, + 257775, + 257915, + 257833, + 258165, + 263919, + 258076, + 257868, + 257855, + 257829, + 257831, + 257806, + 261184, + 257932, + 257852, + 257831, + 257879, + 257854, + 257920, + 257856, + 258001, + 257839, + 257931, + 257792, + 262992, + 262992, + 257823, + 264070, + 264070, + 257807, + 257807, + 257808, + 257814, + 257990, + 257776, + 258205, + 257856, + 257832, + 258261, + 257775, + 257820, + 257889, + 258088, + 258088, + 257900, + 257771, + 257771, + 257927, + 257878, + 257839, + 259380, + 257795, + 257851, + 257988, + 257934, + 257835, + 257835, + 257898, + 262394, + 257832, + 257795, + 257818, + 257799, + 257978, + 257893, + 259117, + 257914, + 257878, + 257858, + 262989, + 262989, + 257900, + 258183, + 258128, + 257820, + 257742, + 257857, + 257906, + 258106, + 257951, + 258293, + 258293, + 257775, + 257853, + 268536, + 257819, + 258141, + 258498, + 258196, + 257889, + 257859, + 257805, + 257766, + 257918, + 257943, + 260041, + 260041, + 257814, + 257848, + 257801, + 258123, + 257934, + 258637, + 257882, + 257926, + 257793, + 257839, + 257804, + 257804, + 257905, + 257932, + 257989, + 257798, + 257858, + 257797, + 257950, + 257874, + 258020, + 258020, + 257873, + 257760, + 257778, + 257769, + 257858, + 257903, + 258033, + 257866, + 257924, + 257814, + 259812, + 257904, + 257863, + 257896, + 257896, + 257799, + 261567, + 257896, + 257828, + 258161, + 257881, + 258311, + 257849, + 257782, + 257865, + 257818, + 257818, + 257892, + 258086, + 258031, + 258031, + 257878, + 257864, + 257777, + 257996, + 262452, + 259547, + 257814, + 257768, + 257801, + 257840, + 257863, + 257852, + 258818, + 257889, + 257779, + 257848, + 257848, + 257759, + 257891, + 257804, + 258041, + 257875, + 257822, + 257800, + 257794, + 257876, + 258890, + 257801, + 257931, + 257931, + 257854, + 257854, + 257830, + 258022, + 258022, + 257803, + 257803, + 258811, + 258811, + 257995, + 257995, + 257853, + 257853, + 257791, + 257847, + 257847, + 257841, + 257841, + 257815, + 257865, + 257757, + 257757, + 257830, + 257825, + 262474, + 257898, + 262121, + 257843, + 257730, + 257829, + 258058, + 257798, + 257798, + 257771, + 257771, + 257858, + 257791, + 257791, + 257762, + 258012, + 258012, + 257787, + 257898, + 257973, + 257973, + 257812, + 257910, + 257910, + 257937, + 257806, + 257806, + 257831, + 258057, + 257756, + 257756, + 258515, + 257812, + 257812, + 257824, + 257859, + 257813, + 257882, + 257882, + 257892, + 257892, + 257850, + 258039, + 257768, + 257765, + 257765, + 257889, + 257840, + 257771, + 257771, + 257776, + 257976, + 257976, + 257762, + 257895, + 257777, + 257777, + 257801, + 257801, + 257743, + 257743, + 258097, + 258149, + 257839, + 257764, + 257764, + 257930, + 257811, + 258549, + 257779, + 257842, + 257842, + 257809, + 257803, + 258103, + 258733, + 258733, + 258815, + 257915, + 257915, + 257842, + 257875, + 257875, + 257901, + 257864, + 257862, + 257779, + 257775, + 257842, + 257842, + 258216, + 258055, + 257779, + 257779, + 257786, + 257827, + 257842, + 257842, + 257836, + 257848, + 257774, + 257826, + 257826, + 258354, + 257897, + 257994, + 257994, + 257956, + 257851, + 257752, + 257794, + 257894, + 257805, + 257805, + 257822, + 257758, + 257787, + 257823, + 257823, + 257858, + 257910, + 258794, + 258794, + 257824, + 257826, + 257826, + 257898, + 257898, + 258018, + 261659, + 257754, + 257754, + 257906, + 257932, + 257864, + 257864, + 257918, + 257796, + 257918, + 257918, + 257795, + 257907, + 257907, + 257906, + 258235, + 257825, + 257896, + 257920, + 257920, + 257795, + 257822, + 258127, + 258127, + 257798, + 258351, + 257860, + 257860, + 257925, + 257824, + 257993, + 257914, + 257860, + 257763, + 257798, + 257894, + 257912, + 257912, + 257777, + 257860, + 257860, + 257744, + 257747, + 257747, + 257806, + 258676, + 257814, + 257796, + 257828, + 257828, + 257828, + 258022, + 258148, + 258148, + 258233, + 257771, + 257848, + 257900, + 257720, + 258169, + 257801, + 257736, + 257819, + 257811, + 257811, + 257783, + 257783, + 258050, + 258050, + 258050, + 258095, + 257796, + 257821, + 257849, + 257984, + 257886, + 257833, + 257833, + 257766, + 257920, + 257920, + 257790, + 258833, + 257793, + 257793, + 257987, + 257764, + 257764, + 257825, + 260759, + 260759, + 258028, + 257865, + 257817, + 257862, + 257862, + 257841, + 257939, + 257731, + 257731, + 257847, + 258062, + 258062, + 257809, + 257809, + 257797, + 257799, + 257838, + 257778, + 257778, + 257818, + 257818, + 257931, + 257751, + 257751, + 257768, + 257755, + 258351, + 258351, + 257875, + 257867, + 257867, + 257837, + 257932, + 257932, + 257844, + 257781, + 258863, + 256825, + 256826, + 256826, + 256773, + 256773, + 256955, + 256955, + 257007, + 256814, + 256887, + 256887, + 256881, + 256809, + 256809, + 256893, + 256893, + 256774, + 256774, + 256859, + 256859, + 256809, + 257221, + 257221, + 257273, + 256887, + 256757, + 256844, + 256844, + 257089, + 257089, + 257183, + 256817, + 256793, + 256851, + 256886, + 256825, + 258576, + 256891, + 257164, + 257164, + 256789, + 256763, + 256884, + 256834, + 256901, + 257874, + 256874, + 256851, + 256783, + 256876, + 256808, + 257731, + 257731, + 256949, + 257056, + 256784, + 256784, + 256900, + 257063, + 258314, + 256888, + 256888, + 256803, + 256803, + 256797, + 256929, + 257053, + 256918, + 256795, + 256826, + 257010, + 256832, + 256854, + 256854, + 256982, + 256806, + 256806, + 256841, + 256761, + 256934, + 256934, + 256887, + 257022, + 256809, + 256809, + 256894, + 256870, + 256870 + ], + "sample_count": 1271 + }, + { + "pubkey": "FxtzhEXfdLWQrXzM5k3xtKkNn6FJaeteQy1i4Yssv6Tb", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242240000000, + "samples": [ + 245842, + 245867, + 245943, + 242561, + 242439, + 242647, + 245621, + 245613, + 245569, + 245615, + 245593, + 245442, + 245562, + 248087, + 248097, + 248157, + 245896, + 245874, + 245700, + 245695, + 245805, + 245618, + 245661, + 245657, + 245689, + 245694, + 248712, + 248562, + 248722, + 248728, + 248742, + 246010, + 245884, + 248927, + 249007, + 249061, + 248959, + 249012, + 248751, + 248764, + 248832, + 245514, + 245448, + 245460, + 245525, + 245470, + 245573, + 245460, + 245485, + 245516, + 245520, + 245395, + 245388, + 245915, + 245881, + 245799, + 245642, + 245605, + 245054, + 244998, + 245020, + 245005, + 244974, + 248673, + 248652, + 248806, + 242445, + 247685, + 248944, + 248156, + 255245, + 249579, + 248137, + 245146, + 245049, + 245122, + 245533, + 245215, + 245859, + 245176, + 254701, + 256642, + 245687, + 244843, + 248726, + 252643, + 253763, + 249960, + 251665, + 250300, + 257276, + 250353, + 259207, + 248657, + 244237, + 243281, + 242430, + 247988, + 248954, + 252500, + 252030, + 264003, + 255004, + 239939, + 239812, + 239899, + 240923, + 243729, + 253654, + 249709, + 240003, + 248823, + 254550, + 248884, + 253871, + 248319, + 254176, + 245273, + 243544, + 248178, + 240781, + 259017, + 253296, + 257687, + 254135, + 255109, + 253911, + 260009, + 261321, + 252547, + 249236, + 254400, + 259890, + 254975, + 249850, + 245964, + 242190, + 263652, + 262246, + 254288, + 260438, + 256926, + 265414, + 254670, + 256272, + 250141, + 247321, + 250569, + 246306, + 245868, + 248649, + 239362, + 247038, + 252622, + 242463, + 236237, + 252998, + 238340, + 243648, + 248942, + 236507, + 246349, + 247220, + 250531, + 245267, + 251216, + 244557, + 244793, + 244659, + 244518, + 244697, + 239076, + 238773, + 238827, + 238980, + 238920, + 239025, + 238904, + 235514, + 235299, + 235383, + 235538, + 235515, + 235519, + 235459, + 235648, + 235534, + 235461, + 235422, + 235361, + 235415, + 235460, + 235410, + 235545, + 235521, + 235439, + 245557, + 245710, + 245548, + 245516, + 245705, + 245444, + 245631, + 245539, + 245511, + 245575, + 248553, + 248582, + 248467, + 248434, + 248645, + 245873, + 245902, + 245865, + 245984, + 246115, + 245667, + 245520, + 245523, + 245419, + 245608, + 245903, + 246073, + 246004, + 245932, + 245929, + 245498, + 245490, + 245537, + 245553, + 245657, + 245467, + 245643, + 245523, + 245656, + 245610, + 248597, + 248595, + 248591, + 248533, + 248516, + 245513, + 245640, + 245561, + 245603, + 245640, + 248776, + 248795, + 245963, + 245965, + 246001, + 245554, + 245502, + 245629, + 245590, + 245534, + 245647, + 245600, + 245513, + 245663, + 245697, + 245667, + 245641, + 245326, + 245168, + 245123, + 245512, + 245583, + 245541, + 245491, + 245650, + 245688, + 245596, + 248728, + 248825, + 248955, + 248759, + 248752, + 245141, + 245235, + 245178, + 248273, + 248170, + 248157, + 248199, + 248251, + 246108, + 246077, + 245552, + 245570, + 245717, + 245564, + 245652, + 248191, + 248236, + 248185, + 248219, + 248238, + 242688, + 242501, + 242572, + 246059, + 245906, + 245953, + 246033, + 246159, + 245873, + 246113, + 245930, + 245891, + 246051, + 245927, + 245959, + 242568, + 242516, + 242622, + 242520, + 242567, + 249139, + 248907, + 249113, + 248937, + 249004, + 245722, + 245655, + 245711, + 245732, + 245777, + 245703, + 245714, + 245793, + 248245, + 248138, + 242584, + 242494, + 242725, + 242566, + 242730, + 245792, + 245827, + 245851, + 245904, + 245700, + 248394, + 248146, + 248278, + 245904, + 245876, + 245983, + 245873, + 246158, + 245589, + 245666, + 248636, + 248666, + 248555, + 248697, + 248503, + 246008, + 245951, + 245957, + 246082, + 245952, + 246117, + 246077, + 246095, + 245593, + 245491, + 245474, + 245563, + 245610, + 245538, + 245572, + 245626, + 245665, + 245586, + 245968, + 246006, + 245873, + 245968, + 246084, + 246087, + 246006, + 246091, + 245977, + 245987, + 246043, + 245909, + 245623, + 245474, + 245579, + 245580, + 245513, + 245575, + 245589, + 245830, + 248838, + 248924, + 248834, + 248823, + 248863, + 245881, + 245909, + 248163, + 248256, + 248148, + 248272, + 248250, + 245814, + 245824, + 245926, + 245753, + 245761, + 245588, + 245876, + 245868, + 245296, + 245215, + 245690, + 245712, + 245761, + 245774, + 245802, + 248960, + 249029, + 249086, + 249058, + 249078, + 248972, + 249067, + 249104, + 248961, + 248995, + 248914, + 249036, + 250434, + 253714, + 254599, + 251202, + 255142, + 250112, + 259558, + 249137, + 250995, + 249326, + 248362, + 249318, + 253335, + 248751, + 253134, + 247791, + 247743, + 251133, + 254540, + 252311, + 254746, + 248572, + 251894, + 252135, + 249484, + 248513, + 248798, + 249230, + 245837, + 247962, + 251767, + 254622, + 261019, + 253608, + 265910, + 255176, + 252179, + 250926, + 252063, + 252863, + 254547, + 251081, + 263462, + 253771, + 256309, + 255898, + 253309, + 258077, + 253879, + 258334, + 262880, + 255927, + 259740, + 257473, + 259605, + 257462, + 267148, + 256310, + 256529, + 264950, + 262950, + 261378, + 263009, + 261164, + 247130, + 250168, + 253118, + 252209, + 261087, + 259209, + 258829, + 260750, + 260636, + 260228, + 257981, + 257173, + 256976, + 260858, + 248055, + 254704, + 257226, + 257817, + 258382, + 256197, + 257755, + 258524, + 261281, + 258349, + 251256, + 251241, + 248714, + 253755, + 253740, + 253456, + 263815, + 259312, + 257564, + 258690, + 255061, + 257558, + 255485, + 256204, + 257958, + 250311, + 255792, + 250329, + 254975, + 253381, + 253921, + 263170, + 252331, + 256202, + 261894, + 254275, + 256894, + 261504, + 264992, + 257341, + 257159, + 255998, + 248811, + 255217, + 259800, + 262456, + 252038, + 256223, + 251736, + 261836, + 258173, + 260611, + 257320, + 257752, + 247458, + 256366, + 264736, + 262083, + 257096, + 254959, + 256152, + 255512, + 252792, + 261932, + 261195, + 255933, + 260957, + 256490, + 246595, + 244368, + 247018, + 244005, + 243939, + 243805, + 243964, + 243898, + 243963, + 243976, + 243895, + 243959, + 243975, + 243885, + 243901, + 243827, + 243854, + 243895, + 243826, + 243969, + 243334, + 243413, + 243339, + 243255, + 243629, + 243422, + 243495, + 240649, + 240754, + 240914, + 240276, + 240333, + 240270, + 240244, + 240297, + 240321, + 240277, + 240388, + 240264, + 240375, + 237595, + 237641, + 240244, + 240199, + 240251, + 243279, + 243401, + 240652, + 240697, + 240680, + 244063, + 244113, + 244164, + 244093, + 244207, + 244077, + 244173, + 244226, + 244170, + 244056, + 241983, + 241925, + 242041, + 242012, + 242098, + 244288, + 244309, + 245037, + 245091, + 245123, + 245195, + 245022, + 245141, + 244988, + 245061, + 245166, + 245072, + 245165, + 245115, + 245047, + 245178, + 245204, + 241623, + 241579, + 241811, + 241913, + 242000, + 241803, + 241768, + 241886, + 244777, + 244584, + 238769, + 238621, + 238492, + 238592, + 238538, + 238682, + 238600, + 238673, + 241186, + 241234, + 242051, + 242178, + 242100, + 245108, + 245052, + 242139, + 242212, + 242129, + 241106, + 241332, + 244871, + 244606, + 244832, + 238528, + 238757, + 244868, + 244841, + 244786, + 244959, + 245168, + 245094, + 245041, + 245065, + 241273, + 241375, + 241229, + 241215, + 241298, + 245169, + 245068, + 244978, + 245042, + 245121, + 245154, + 245107, + 245166, + 244939, + 244943, + 238551, + 238681, + 241949, + 241950, + 241939, + 245094, + 245099, + 241611, + 241574, + 246560, + 246547, + 246655, + 246724, + 246783, + 246723, + 246171, + 246227, + 246262, + 246363, + 246390, + 246651, + 246741, + 247065, + 246942, + 247078, + 249990, + 250158, + 249998, + 249915, + 250010, + 249980, + 250075, + 250135, + 249939, + 250190, + 246831, + 246881, + 246727, + 246903, + 247260, + 250310, + 250186, + 249838, + 251856, + 249774, + 247173, + 247157, + 252489, + 249899, + 250382, + 251089, + 260390, + 251501, + 249538, + 247836, + 246805, + 246699, + 233438, + 235420, + 233437, + 246019, + 245780, + 239396, + 238347, + 238536, + 251500, + 249850, + 251079, + 245055, + 245487, + 249496, + 241929, + 252628, + 253247, + 251638, + 249358, + 256322, + 256562, + 245203, + 245605, + 251729, + 260639, + 250341, + 249271, + 247459, + 260076, + 256187, + 255441, + 254675, + 253065, + 255099, + 248919, + 258209, + 254035, + 255217, + 253713, + 253434, + 245117, + 245454, + 245344, + 231536, + 231479, + 242383, + 242228, + 242226, + 242206, + 241617, + 236781, + 236855, + 237080, + 242102, + 242205, + 242382, + 242285, + 242305, + 242013, + 242358, + 245694, + 245041, + 245026, + 252836, + 243032, + 242239, + 242126, + 243118, + 238828, + 238892, + 238681, + 238624, + 239770, + 236931, + 236813, + 245402, + 244805, + 245224, + 244992, + 244957, + 244502, + 244820, + 252780, + 248360, + 247974, + 251420, + 244462, + 244506, + 245413, + 245314, + 245052, + 254710, + 242226, + 245223, + 245079, + 245218, + 245183, + 245270, + 238635, + 238826, + 238641, + 238613, + 238598, + 241626, + 241630, + 241712, + 241691, + 241763, + 241680, + 241756, + 241894, + 241807, + 241992, + 241808, + 241822, + 242125, + 242146, + 244204, + 244461, + 241803, + 241775, + 245125, + 244930, + 245030, + 245046, + 244742, + 244864, + 244991, + 245059, + 245068, + 245073, + 245172, + 245075, + 245154, + 245083, + 245094, + 241241, + 241371, + 241426, + 244977, + 244853, + 244998, + 244872, + 245043, + 241723, + 241563, + 241702, + 241741, + 241520, + 241777, + 241628, + 241639, + 241711, + 241569, + 241760, + 241708, + 245055, + 244895, + 244975, + 244722, + 244678, + 242089, + 241962, + 242106, + 242183, + 242171, + 242100, + 242248, + 242089, + 244927, + 245059, + 245008, + 244905, + 245095, + 244437, + 244366, + 244306, + 244339, + 244380, + 244242, + 244218, + 241890, + 241878, + 241943, + 241989, + 241820, + 241831, + 241661, + 241850, + 238556, + 238649, + 238605, + 238542, + 238537, + 238734, + 238579, + 238709, + 238685, + 238649, + 245124, + 245041, + 238923, + 238967, + 239117, + 242055, + 241957, + 241899, + 241907, + 241955, + 241886, + 241841, + 245316, + 245288, + 245271, + 238920, + 238970, + 238980, + 239021, + 239030, + 245550, + 245396, + 245486, + 245471, + 245303, + 245466, + 245501, + 245489, + 245527, + 245380, + 245460, + 245410, + 245463, + 245470, + 245596, + 242222, + 242359, + 242064, + 242116, + 242118, + 242288, + 242262, + 245054, + 244869, + 245057, + 245206, + 245140, + 245153, + 245121, + 245246, + 244674, + 244590, + 242056, + 242080, + 242225, + 242348, + 238987, + 238976, + 238858, + 238872, + 245153, + 245286, + 242469, + 242413, + 242526, + 241844, + 241907, + 241782, + 242027, + 242001, + 244433, + 244558, + 244653, + 244532, + 244536, + 238841, + 238841, + 238959, + 238945, + 239106, + 239044, + 238888, + 242058, + 242076, + 242146, + 242167, + 242103, + 239023, + 239012, + 238861, + 238881, + 239097, + 242067, + 241976, + 242061, + 238967, + 239008, + 238994, + 238897, + 239046, + 241965, + 242032, + 242095, + 242065, + 241919, + 241996, + 241995, + 245098, + 245096, + 245002, + 245001, + 244950, + 241570, + 241482, + 241455, + 242030, + 242265, + 238983, + 238980, + 236589, + 229806, + 242176, + 241951, + 242154, + 242179, + 241599, + 241370, + 244888, + 244927, + 245056, + 245082, + 245066, + 239153, + 238895, + 239172, + 239054, + 238882, + 238934, + 238981, + 239120, + 238950, + 238991, + 241935, + 242057, + 241987, + 242013, + 242084, + 241631, + 241531, + 241680, + 245013, + 245075, + 245025, + 244964, + 245039, + 242029, + 242065, + 239031, + 239040, + 239019, + 242179, + 242282, + 242271, + 242245, + 242070, + 245182, + 245159, + 244936, + 245059, + 245157, + 244574, + 244678, + 245181, + 245251, + 245261, + 245160, + 245105, + 245391, + 245201, + 245132, + 245197, + 245302, + 245345, + 245259, + 245290, + 245146, + 245340, + 241568, + 241534, + 241523, + 245088, + 245238, + 245207, + 245163, + 245241, + 245109, + 245216, + 245126, + 245143, + 245237, + 245280, + 245223, + 244180, + 244196, + 244196, + 244223, + 244161, + 244156, + 244215, + 244207, + 244253, + 244235, + 244156, + 244160, + 244285, + 244184, + 244120, + 244132, + 244177, + 244228, + 244173, + 244288, + 244140, + 243984, + 244002, + 240458, + 240559, + 241046, + 240976, + 241161, + 241033, + 240987, + 241336, + 241311, + 241265, + 241400, + 241330, + 241147, + 240973, + 241054, + 244192, + 244258, + 241029, + 240978, + 241124, + 240984, + 240930, + 241086, + 241071, + 240954, + 241044, + 240933, + 241036, + 240997, + 240931, + 241044, + 241089, + 241101, + 241143, + 241230, + 241123, + 241189, + 241076, + 241294, + 241024, + 241079, + 241270, + 241197, + 241002, + 241035, + 240966, + 240919, + 241116, + 241207, + 241200, + 241421, + 241268, + 241213, + 241104, + 241227, + 241065, + 241031, + 241469, + 241270, + 241254, + 241161, + 241235, + 241257, + 241117 + ], + "sample_count": 1266 + }, + { + "pubkey": "7FCZ3SwNKdqb1yafXg24FHbcv2A2tjNNmuHLD9F4GHe8", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242241000000, + "samples": [ + 149747, + 149510, + 149460, + 149465, + 149724, + 149734, + 149397, + 149630, + 149648, + 149721, + 149676, + 149462, + 149437, + 149462, + 149582, + 149454, + 149529, + 149462, + 149464, + 149620, + 149515, + 149534, + 149557, + 149399, + 149481, + 149450, + 149609, + 149673, + 149449, + 149581, + 149605, + 149569, + 149774, + 149652, + 149607, + 149765, + 149741, + 149630, + 149605, + 149633, + 149634, + 149489, + 149555, + 149429, + 149647, + 149607, + 149679, + 149515, + 149555, + 149511, + 149496, + 149552, + 149444, + 149568, + 149406, + 149382, + 149651, + 149467, + 149440, + 149440, + 149414, + 149642, + 149666, + 149329, + 149652, + 149455, + 149638, + 149543, + 149590, + 149547, + 149606, + 149410, + 149602, + 149666, + 149596, + 149405, + 149570, + 149441, + 149547, + 149426, + 149692, + 149686, + 149683, + 149427, + 149562, + 149380, + 149688, + 149747, + 149409, + 149536, + 149517, + 149636, + 149597, + 149563, + 149523, + 149588, + 149501, + 149603, + 149689, + 149497, + 149471, + 149775, + 149521, + 149444, + 149651, + 149521, + 149415, + 149648, + 149438, + 149667, + 149472, + 149620, + 149432, + 149480, + 149472, + 149421, + 149485, + 149663, + 149524, + 149465, + 149374, + 149407, + 149523, + 149446, + 149749, + 149646, + 149500, + 149559, + 149427, + 149427, + 149384, + 149633, + 149628, + 149630, + 149397, + 149389, + 149640, + 149731, + 149628, + 149511, + 149524, + 149624, + 149572, + 149524, + 149745, + 149591, + 149522, + 149595, + 149481, + 149438, + 149445, + 149406, + 149492, + 149613, + 149663, + 149561, + 149644, + 149611, + 149641, + 149436, + 149466, + 149651, + 149526, + 149505, + 149570, + 149762, + 149520, + 149451, + 149462, + 149589, + 149703, + 149643, + 149415, + 149375, + 149560, + 149470, + 149758, + 149528, + 149611, + 149583, + 149579, + 149752, + 149713, + 149650, + 149681, + 149511, + 149615, + 149490, + 149514, + 149591, + 149373, + 149630, + 149635, + 149675, + 149602, + 149523, + 149548, + 149546, + 149498, + 149586, + 149627, + 149590, + 149591, + 149509, + 149715, + 149583, + 149576, + 149642, + 149432, + 149386, + 149506, + 149681, + 149578, + 149681, + 149680, + 149581, + 149524, + 149692, + 149649, + 149637, + 149570, + 149559, + 149462, + 149658, + 149488, + 149524, + 149672, + 149587, + 149667, + 149659, + 149739, + 149523, + 149733, + 149489, + 149524, + 149450, + 149740, + 149517, + 149550, + 149543, + 149684, + 149709, + 149724, + 149546, + 149520, + 149632, + 149568, + 149520, + 149687, + 149476, + 149613, + 149507, + 149591, + 149490, + 149672, + 149508, + 149546, + 149535, + 149518, + 149757, + 149738, + 149547, + 149520, + 149697, + 149517, + 149754, + 149710, + 149555, + 149613, + 149567, + 149468, + 149740, + 149770, + 149800, + 149537, + 149569, + 149737, + 149558, + 149623, + 149518, + 149685, + 149546, + 149499, + 149644, + 149656, + 149519, + 149564, + 149469, + 149496, + 149615, + 149547, + 149660, + 149491, + 149556, + 149573, + 149483, + 149505, + 149612, + 149641, + 149738, + 149709, + 149615, + 149708, + 149506, + 149532, + 149615, + 149716, + 149602, + 149707, + 149521, + 149523, + 149566, + 149538, + 149802, + 149472, + 149750, + 149678, + 149668, + 149704, + 149421, + 149743, + 149585, + 149720, + 149732, + 149714, + 149549, + 149775, + 149718, + 149747, + 149704, + 149706, + 149676, + 149555, + 149743, + 149529, + 149661, + 149668, + 149576, + 149569, + 149628, + 149758, + 149538, + 149453, + 149609, + 149805, + 149713, + 149581, + 149551, + 149624, + 149762, + 149647, + 149544, + 149714, + 149688, + 149561, + 149515, + 149635, + 149710, + 149567, + 149790, + 149631, + 149600, + 149543, + 149536, + 149542, + 149576, + 149575, + 149693, + 149686, + 149504, + 149637, + 149664, + 149712, + 149795, + 149477, + 149536, + 149459, + 149739, + 149614, + 149759, + 149665, + 149727, + 149783, + 149488, + 149617, + 149474, + 149693, + 149742, + 149605, + 149748, + 149466, + 149692, + 149737, + 149523, + 149696, + 149544, + 149545, + 149593, + 149784, + 149496, + 149555, + 149564, + 149715, + 149569, + 149741, + 149540, + 149570, + 149758, + 149538, + 149498, + 149702, + 149524, + 149689, + 149511, + 149746, + 149538, + 149480, + 149698, + 149587, + 149710, + 149477, + 149408, + 149764, + 149581, + 149553, + 149645, + 149773, + 149670, + 149766, + 149585, + 149522, + 149575, + 149524, + 149764, + 149766, + 149622, + 149622, + 149502, + 149486, + 149515, + 149864, + 149668, + 149490, + 149743, + 149510, + 149695, + 149488, + 149747, + 149778, + 149551, + 149666, + 149738, + 149482, + 149637, + 149759, + 149577, + 149585, + 149541, + 149785, + 149570, + 149560, + 149672, + 149609, + 149614, + 149748, + 149674, + 149476, + 149575, + 153079, + 149719, + 149599, + 149599, + 149608, + 149501, + 149509, + 149504, + 149544, + 149520, + 149546, + 149780, + 149454, + 149579, + 149632, + 149551, + 149586, + 149832, + 149528, + 149607, + 149537, + 149732, + 149676, + 149649, + 149566, + 149707, + 149557, + 149543, + 149743, + 149577, + 149753, + 149548, + 149517, + 149708, + 149584, + 149737, + 149700, + 149758, + 149727, + 149769, + 149524, + 149529, + 149521, + 149503, + 149704, + 149734, + 149597, + 149730, + 149786, + 149579, + 149562, + 149759, + 149515, + 149542, + 149510, + 149729, + 149575, + 149460, + 149693, + 149620, + 149697, + 149694, + 149644, + 149623, + 149795, + 149614, + 149517, + 149514, + 149665, + 149682, + 149535, + 149785, + 149490, + 149543, + 149563, + 149764, + 149710, + 149736, + 149666, + 149839, + 149570, + 149696, + 149568, + 149540, + 149517, + 149525, + 149747, + 149569, + 149818, + 149770, + 149545, + 149710, + 149837, + 149728, + 149595, + 149452, + 149509, + 149589, + 149535, + 149644, + 149836, + 149535, + 149549, + 149690, + 149712, + 149731, + 149533, + 149816, + 149560, + 149531, + 149554, + 149555, + 149785, + 149743, + 149683, + 149701, + 149705, + 149691, + 149729, + 149722, + 149740, + 149675, + 149568, + 149773, + 149621, + 149564, + 149787, + 149605, + 149652, + 149725, + 149623, + 149767, + 149656, + 149766, + 149759, + 149518, + 149625, + 149643, + 149711, + 149628, + 149616, + 149630, + 149524, + 149573, + 149577, + 149669, + 149617, + 149783, + 149767, + 149772, + 149565, + 149728, + 149892, + 149555, + 149671, + 149605, + 149541, + 149754, + 149804, + 149564, + 149611, + 149558, + 149536, + 149639, + 149780, + 149652, + 149602, + 149707, + 149743, + 149563, + 149577, + 149536, + 149617, + 149717, + 149589, + 149712, + 149565, + 149579, + 149625, + 149811, + 149798, + 149788, + 149579, + 149538, + 149828, + 149643, + 149792, + 149743, + 149413, + 149536, + 149578, + 149709, + 149533, + 149610, + 149663, + 149771, + 149594, + 149856, + 149599, + 149622, + 149575, + 149406, + 149512, + 149535, + 149533, + 149685, + 149722, + 149500, + 149669, + 149465, + 149667, + 149468, + 149562, + 149652, + 149530, + 149760, + 149567, + 149717, + 149755, + 149550, + 149592, + 149759, + 149677, + 149692, + 149582, + 149730, + 149650, + 149582, + 149786, + 149620, + 149572, + 149563, + 149516, + 149653, + 149625, + 149529, + 149728, + 149643, + 149709, + 149767, + 149779, + 149773, + 149817, + 149507, + 149591, + 149505, + 149701, + 149595, + 149704, + 149796, + 149773, + 149704, + 149616, + 149773, + 149678, + 149702, + 149769, + 149620, + 149761, + 149581, + 149653, + 149523, + 149726, + 149606, + 149832, + 149555, + 149820, + 149493, + 149623, + 149481, + 149672, + 149666, + 149573, + 149850, + 149812, + 149566, + 149797, + 149782, + 149746, + 149787, + 149713, + 149841, + 149749, + 149525, + 149507, + 149741, + 149661, + 149700, + 149541, + 149533, + 149589, + 149662, + 149505, + 149563, + 149734, + 149519, + 149553, + 149566, + 149507, + 149505, + 149515, + 149768, + 149779, + 149519, + 149644, + 149745, + 149613, + 149766, + 149710, + 149479, + 149472, + 149605, + 149770, + 149523, + 149720, + 149605, + 149550, + 149622, + 149720, + 149667, + 149712, + 149771, + 149695, + 149683, + 149509, + 149706, + 149813, + 149573, + 149490, + 149752, + 149514, + 149553, + 149661, + 149614, + 149569, + 149510, + 149540, + 149581, + 149552, + 149637, + 149587, + 149548, + 149602, + 149499, + 149555, + 149524, + 149589, + 149640, + 149762, + 149567, + 149627, + 149681, + 149464, + 149720, + 149490, + 149574, + 149530, + 149540, + 149740, + 149792, + 149681, + 149806, + 149643, + 149740, + 149545, + 149572, + 149583, + 149603, + 149537, + 149777, + 149614, + 149542, + 149514, + 149747, + 149648, + 149517, + 149587, + 149668, + 149705, + 149767, + 149575, + 149730, + 149547, + 149734, + 149541, + 149709, + 149511, + 149478, + 149642, + 149557, + 149626, + 149726, + 149642, + 149729, + 149534, + 149561, + 149462, + 149533, + 149511, + 149749, + 149502, + 149729, + 149539, + 149759, + 149760, + 149512, + 149546, + 149563, + 149705, + 149552, + 149670, + 149726, + 149622, + 149793, + 149720, + 149538, + 149797, + 149624, + 149727, + 149678, + 149815, + 149649, + 149821, + 149575, + 149786, + 149590, + 149482, + 149465, + 149439, + 149685, + 149580, + 149754, + 149521, + 149544, + 149668, + 149579, + 149612, + 149581, + 149562, + 149503, + 149790, + 149630, + 149558, + 149618, + 149705, + 149525, + 149478, + 149608, + 149494, + 149787, + 149663, + 149545, + 149640, + 149642, + 149646, + 149582, + 149670, + 219842, + 149786, + 149658, + 149516, + 149714, + 149526, + 149642, + 149610, + 149667, + 149592, + 149591, + 149834, + 149696, + 149734, + 149655, + 149518, + 149525, + 149584, + 149547, + 149540, + 149600, + 149636, + 149656, + 149684, + 149745, + 149581, + 149643, + 149636, + 149535, + 149832, + 149461, + 149458, + 149699, + 149538, + 149738, + 149801, + 149760, + 149647, + 149674, + 149739, + 149651, + 149671, + 149706, + 149573, + 149642, + 149762, + 149622, + 149710, + 149623, + 149569, + 149775, + 149664, + 149755, + 149611, + 149763, + 149799, + 149516, + 149527, + 149729, + 149748, + 149479, + 149789, + 149761, + 149888, + 149808, + 149725, + 149678, + 149615, + 149726, + 149524, + 149574, + 149747, + 149589, + 149576, + 149818, + 149711, + 149822, + 149725, + 149621, + 149546, + 149494, + 149742, + 149562, + 149540, + 149527, + 149700, + 149616, + 149782, + 149745, + 149648, + 149524, + 149673, + 149709, + 149495, + 149727, + 149569, + 149625, + 149685, + 149717, + 149528, + 149397, + 149704, + 149554, + 149569, + 149510, + 149589, + 149498, + 149552, + 149671, + 149739, + 149563, + 149697, + 149550, + 149689, + 149645, + 149562, + 149549, + 149752, + 149702, + 149628, + 149626, + 149760, + 149681, + 149710, + 149806, + 149634, + 149775, + 149542, + 149666, + 149501, + 149659, + 149681, + 149779, + 149729, + 149842, + 149753, + 149528, + 149707, + 149543, + 149760, + 149582, + 149578, + 149609, + 149696, + 149568, + 149559, + 149529, + 149537, + 149535, + 149568, + 149656, + 149524, + 149497, + 149751, + 149669, + 149594, + 149543, + 149642, + 149759, + 149581, + 149540, + 149555, + 149543, + 149778, + 149831, + 149565, + 149705, + 149728, + 149760, + 149526, + 149525, + 149720, + 149669, + 149528, + 149606, + 149560, + 149590, + 149667, + 149482, + 149659, + 149555, + 149660, + 149670, + 149543, + 149580, + 149694, + 149478, + 149687, + 149700, + 149559, + 149662, + 149570, + 149729, + 149595, + 149598, + 149751, + 149767, + 149807, + 149605, + 149433, + 149570, + 149525, + 149859, + 149562, + 149827, + 149520, + 149573, + 149550, + 149600, + 149793, + 149728, + 149541, + 149478, + 149651, + 149583, + 149658, + 149801, + 149793, + 149774, + 149756, + 149626, + 149746, + 149630, + 149565, + 149866, + 149754, + 149755, + 149574, + 149588, + 149603, + 149522, + 149728, + 149908, + 149556, + 149683, + 149576, + 149666, + 149540, + 149524, + 149800, + 149552, + 149819, + 149649, + 149580, + 149655, + 149552, + 149716, + 149494, + 149639, + 149656, + 149554, + 149556, + 149520, + 149550, + 149842, + 149599, + 149727, + 149714, + 149729, + 149578, + 149501, + 149622, + 149558, + 149516, + 149792, + 149684, + 149632, + 149573, + 149504, + 149599, + 149621, + 149643, + 149743, + 149724, + 149549, + 149742, + 149502, + 149779, + 149744, + 149712, + 149728, + 149518, + 149839, + 149645, + 149817, + 149749, + 149707, + 149777, + 149619, + 149804, + 149696, + 149506, + 149811, + 149628, + 149509, + 149691, + 149510, + 149738, + 149706, + 149818, + 149637, + 149787, + 149567, + 149688, + 149790, + 149633, + 149548, + 149653, + 149725, + 149794, + 149594, + 149849, + 149549, + 149549, + 149892, + 149596, + 149539, + 149743, + 149748, + 149542, + 149759, + 149755, + 149738, + 149767, + 149539, + 149526, + 149529, + 149803, + 149621, + 149837, + 149549, + 149759, + 149792, + 149739, + 149732, + 149693, + 149855, + 149878, + 149763, + 149938, + 149801, + 149535, + 149847, + 149532 + ], + "sample_count": 1269 + }, + { + "pubkey": "DWdhWAKSBPuEN4LUi82WgCHqdUPc9uqayBJmAHgDAf9C", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "target_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242307000000, + "samples": [ + 63272, + 63664, + 63306, + 63306, + 65628, + 65628, + 67273, + 66670, + 66684, + 65491, + 66934, + 66934, + 65480, + 66623, + 63426, + 63426, + 63778, + 66663, + 63385, + 63325, + 66681, + 65331, + 66577, + 66577, + 63483, + 63667, + 63667, + 67558, + 63578, + 63239, + 66880, + 63224, + 67610, + 64084, + 63571, + 63992, + 66899, + 67578, + 63305, + 63486, + 63856, + 65662, + 67360, + 65676, + 63377, + 66999, + 66465, + 63300, + 66495, + 66402, + 65705, + 66696, + 63449, + 63673, + 63660, + 63570, + 63513, + 63767, + 63755, + 63755, + 67442, + 65467, + 66619, + 63833, + 67522, + 64130, + 63269, + 63610, + 63610, + 63965, + 63502, + 66647, + 66647, + 67681, + 63229, + 63492, + 63492, + 63958, + 63327, + 63339, + 63337, + 65388, + 63556, + 63688, + 63333, + 66526, + 63552, + 63525, + 63525, + 65552, + 63975, + 67454, + 63846, + 63916, + 67473, + 66770, + 63604, + 63465, + 65534, + 66766, + 63385, + 65527, + 65750, + 65933, + 67482, + 64529, + 66839, + 63458, + 65580, + 63851, + 63270, + 63743, + 63743, + 63818, + 63485, + 63874, + 66831, + 66769, + 65698, + 63359, + 66596, + 67413, + 63297, + 66510, + 66839, + 66664, + 63179, + 66517, + 63735, + 65521, + 66781, + 63568, + 67224, + 63126, + 63126, + 66508, + 65765, + 66702, + 64251, + 65963, + 63732, + 65617, + 63516, + 66750, + 63492, + 63698, + 63698, + 63636, + 63617, + 63674, + 63960, + 63214, + 67500, + 63381, + 66481, + 65613, + 63183, + 66800, + 66800, + 63701, + 63447, + 65466, + 63782, + 66793, + 67539, + 67317, + 67317, + 65463, + 66558, + 63451, + 63451, + 63621, + 63816, + 65787, + 67704, + 65124, + 65124, + 67452, + 66656, + 66656, + 63383, + 66651, + 65438, + 67460, + 66550, + 65573, + 63997, + 63694, + 63266, + 66635, + 63478, + 63215, + 63444, + 63567, + 63608, + 65478, + 63437, + 63784, + 63658, + 63269, + 63269, + 65446, + 65446, + 63311, + 63587, + 63587, + 63624, + 63552, + 63336, + 64039, + 66824, + 63628, + 65562, + 67582, + 63624, + 66856, + 63643, + 63643, + 63737, + 67182, + 66951, + 66863, + 63810, + 65910, + 65806, + 64089, + 63495, + 66929, + 66805, + 63632, + 66770, + 63918, + 63918, + 65930, + 65895, + 66825, + 67029, + 67722, + 65605, + 66820, + 66910, + 66612, + 66612, + 66948, + 65789, + 65592, + 65472, + 64094, + 66658, + 63113, + 63580, + 63305, + 67527, + 63384, + 63384, + 66881, + 63434, + 63695, + 63437, + 66588, + 66047, + 66773, + 66778, + 66524, + 67038, + 65635, + 63506, + 67697, + 67982, + 66942, + 63584, + 66759, + 66089, + 66686, + 63606, + 63347, + 66652, + 65637, + 66810, + 63605, + 67675, + 63576, + 66700, + 67426, + 67426, + 63170, + 66593, + 63225, + 67506, + 63781, + 63781, + 63967, + 66624, + 67467, + 67467, + 63404, + 63894, + 65504, + 65504, + 65767, + 63265, + 66471, + 66620, + 63290, + 66885, + 66734, + 65526, + 66935, + 63643, + 63664, + 63572, + 63291, + 63485, + 63781, + 63781, + 63553, + 67544, + 65463, + 65463, + 63939, + 67669, + 67669, + 63760, + 63544, + 66864, + 63929, + 63742, + 63540, + 63589, + 67609, + 63445, + 63548, + 63548, + 64619, + 64619, + 63546, + 63664, + 65398, + 63548, + 63593, + 63355, + 67510, + 63549, + 64198, + 64198, + 65511, + 63674, + 63674, + 63551, + 63658, + 67274, + 66641, + 63639, + 63639, + 65592, + 66584, + 63279, + 65461, + 65667, + 65708, + 67420, + 63647, + 66635, + 63235, + 65517, + 63786, + 63452, + 63781, + 63703, + 63869, + 63575, + 64254, + 64254, + 66971, + 65798, + 63524, + 66910, + 67446, + 63633, + 66777, + 66777, + 66814, + 63613, + 66913, + 63351, + 65737, + 66736, + 63963, + 67516, + 63346, + 63619, + 67076, + 65589, + 67104, + 63936, + 65524, + 63676, + 65721, + 63443, + 66771, + 63263, + 63626, + 65804, + 65804, + 63306, + 63749, + 63912, + 63907, + 67752, + 63617, + 66445, + 65450, + 63375, + 66625, + 66676, + 64174, + 63347, + 63347, + 63665, + 66877, + 67613, + 66853, + 67470, + 65731, + 65731, + 63685, + 63988, + 67570, + 67570, + 63990, + 67886, + 63411, + 66499, + 67649, + 66925, + 64057, + 64057, + 63590, + 66819, + 67650, + 67272, + 67272, + 64104, + 63525, + 63644, + 66782, + 63380, + 63385, + 64163, + 63794, + 63794, + 65637, + 63408, + 63735, + 64184, + 63857, + 63857, + 65694, + 63893, + 63405, + 63260, + 65666, + 63244, + 63226, + 63414, + 63788, + 66530, + 63363, + 65509, + 67384, + 67384, + 66658, + 63559, + 70248, + 63846, + 63846, + 67054, + 66667, + 63550, + 65897, + 65735, + 64098, + 64098, + 66958, + 66958, + 63636, + 67046, + 64002, + 64084, + 65536, + 65744, + 66591, + 66812, + 67331, + 67331, + 66682, + 66949, + 66682, + 67266, + 66819, + 65663, + 65538, + 65587, + 63734, + 66607, + 63357, + 63437, + 63560, + 67292, + 63338, + 66026, + 67024, + 63984, + 65630, + 63740, + 66963, + 65917, + 65917, + 66925, + 66798, + 66633, + 65570, + 65570, + 67400, + 65385, + 66690, + 63378, + 66830, + 66027, + 66722, + 63261, + 63284, + 66685, + 66685, + 66972, + 63794, + 67657, + 63788, + 67047, + 67529, + 63643, + 63222, + 66941, + 63353, + 67408, + 63574, + 63330, + 63654, + 66805, + 67449, + 63396, + 63463, + 63622, + 65421, + 67568, + 65677, + 63214, + 66510, + 66846, + 63356, + 66746, + 66766, + 65638, + 66704, + 63426, + 63426, + 64144, + 63587, + 63587, + 63814, + 63768, + 63483, + 67432, + 66115, + 66602, + 63894, + 67763, + 63974, + 63622, + 63549, + 66922, + 63995, + 63989, + 63399, + 63602, + 69234, + 69234, + 63652, + 65928, + 63990, + 63990, + 63483, + 63631, + 65790, + 65790, + 63640, + 63392, + 67627, + 63661, + 63497, + 65449, + 65383, + 64051, + 67425, + 63706, + 63847, + 67546, + 66501, + 63662, + 63304, + 65727, + 66580, + 63289, + 65417, + 65417, + 65743, + 67362, + 63753, + 65716, + 63282, + 65689, + 63638, + 63316, + 63936, + 63663, + 63836, + 63555, + 63912, + 66839, + 66812, + 66173, + 63324, + 66839, + 67525, + 63202, + 66775, + 66775, + 66721, + 63329, + 66531, + 63314, + 67517, + 66499, + 63528, + 67581, + 67581, + 63275, + 66498, + 65437, + 65437, + 63738, + 63251, + 63576, + 65529, + 63500, + 63500, + 63216, + 63520, + 65545, + 63530, + 63657, + 63678, + 63763, + 63568, + 67597, + 63544, + 66940, + 63553, + 63402, + 64177, + 67207, + 63253, + 66664, + 63938, + 63843, + 66729, + 66640, + 66652, + 66652, + 63322, + 67646, + 63740, + 63718, + 66834, + 63472, + 63413, + 63895, + 67390, + 67390, + 67243, + 64080, + 66870, + 66677, + 65444, + 63566, + 63566, + 63858, + 66738, + 63615, + 67221, + 63251, + 66532, + 66716, + 63636, + 63571, + 65331, + 65331, + 63191, + 63515, + 67447, + 63780, + 63211, + 63749, + 63323, + 63713, + 65530, + 63259, + 63754, + 63272, + 68809, + 63752, + 63245, + 66475, + 63304, + 63475, + 63471, + 67468, + 63900, + 67732, + 66888, + 63512, + 66697, + 66697, + 66652, + 63835, + 65775, + 65758, + 65758, + 63469, + 66687, + 66595, + 63307, + 66832, + 63853, + 63735, + 63735, + 65482, + 66650, + 66585, + 63408, + 65589, + 66667, + 66738, + 66684, + 67321, + 67029, + 65720, + 65757, + 65763, + 63844, + 66589, + 63355, + 63508, + 63333, + 67754, + 63193, + 63202, + 66843, + 63563, + 63773, + 63371, + 63371, + 65763, + 63354, + 67053, + 66664, + 66523, + 65590, + 63274, + 67853, + 67853, + 66797, + 63604, + 66742, + 65922, + 66872, + 63095, + 63166, + 67037, + 67037, + 66997, + 63837, + 67863, + 67863, + 67143, + 67687, + 63720, + 64033, + 67065, + 67065, + 68074, + 63797, + 65679, + 63588, + 63588, + 67762, + 63365, + 63466, + 67070, + 65464, + 65727, + 65958, + 63260, + 66651, + 66631, + 63258, + 66701, + 63476, + 65854, + 66811, + 66811, + 63576, + 63576, + 63449, + 63794, + 65745, + 63915, + 63915, + 67575, + 65644, + 66471, + 63568, + 67438, + 64042, + 63478, + 63409, + 67619, + 63695, + 64016, + 63466, + 63506, + 67611, + 63657, + 63523, + 65987, + 63994, + 63248, + 63350, + 63670, + 65524, + 63667, + 64091, + 64091, + 66714, + 63655, + 63408, + 65683, + 63421, + 63802, + 67472, + 67472, + 63516, + 67380, + 66616, + 63376, + 63250, + 65828, + 66452, + 63246, + 63246, + 67015, + 65582, + 67460, + 63363, + 66594, + 63198, + 65987, + 63902, + 63324, + 63713, + 63905, + 63765, + 63765, + 65801, + 66760, + 66765, + 65672, + 63403, + 63801, + 67542, + 67542, + 63246, + 66986, + 66565, + 63229, + 66821, + 63821, + 67437, + 66723, + 67455, + 63322, + 63267, + 66660, + 65395, + 70690, + 63824, + 63515, + 63714, + 65768, + 67774, + 66793, + 63492, + 63355, + 67503, + 63277, + 67405, + 63681, + 63761, + 63300, + 67432, + 63249, + 66638, + 63773, + 63293, + 66983, + 66830, + 63961, + 64003, + 65771, + 63723, + 66769, + 67612, + 66829, + 67517, + 65597, + 66624, + 63490, + 67441, + 67607, + 63680, + 63604, + 67788, + 65386, + 66943, + 65688, + 66755, + 63878, + 63434, + 66432, + 65950, + 67492, + 67517, + 65365, + 64000, + 63488, + 63492, + 66706, + 63883, + 63501, + 63765, + 64120, + 63462, + 65545, + 63459, + 65819, + 64062, + 63073, + 63387, + 64200, + 63866, + 63458, + 63785, + 65508, + 63378, + 63410, + 63575, + 63933, + 66567, + 63345, + 65675, + 67358, + 63230, + 66493, + 63419, + 65531, + 63354, + 66590, + 63295, + 66808, + 63513, + 65286, + 65508, + 63750, + 63356, + 68027, + 66611, + 63386, + 66689, + 63707, + 63648, + 67672, + 65405, + 66582, + 66858, + 66858, + 65357, + 66624, + 66683, + 66759, + 66524, + 63820, + 65457, + 65497, + 65732, + 67445, + 66858, + 63313, + 63447, + 63657, + 67522, + 63385, + 63253, + 66421, + 63237, + 63908, + 63590, + 66573, + 65544, + 63717, + 66717, + 66518, + 66803, + 66334, + 63526, + 67358, + 65603, + 66615, + 63494, + 66681, + 65520, + 66795, + 63299, + 63273, + 66561, + 65493, + 66634, + 63623, + 67405, + 63850, + 66806, + 67604, + 63728, + 63608, + 66583, + 63150, + 67595, + 63147, + 66201, + 63953, + 66474, + 67335, + 63524, + 63539, + 66499, + 65514, + 65784, + 65001, + 63172, + 66727, + 66868, + 63394, + 66905, + 63378, + 66695, + 66926, + 63570, + 63672, + 63779, + 63883, + 63356, + 63972, + 63869, + 63570, + 67515, + 65737, + 66718, + 63600, + 67495, + 63789, + 63368, + 63413, + 67408, + 63542, + 63162, + 63631, + 63470, + 67367, + 67376, + 63304, + 65546, + 63881, + 63881, + 63277, + 63829, + 65287, + 63543, + 63507, + 63307, + 66998, + 63701, + 63466, + 65731, + 63473, + 63723, + 67569, + 63839, + 63947, + 67649, + 66421, + 63735, + 63250, + 65774, + 66531, + 63307, + 65565, + 66854, + 65285, + 67697, + 63601, + 66762, + 63651, + 65642, + 63699, + 63332, + 63519, + 64047, + 63787, + 63391, + 65659, + 66713, + 66757, + 65380, + 63255, + 63724, + 67490, + 63229, + 66683, + 66571, + 66671, + 63142, + 66685, + 63374, + 67758, + 67003, + 63943, + 67432, + 63457, + 63588, + 68411, + 65768, + 66894, + 63674, + 63618, + 63750, + 65461, + 67943, + 67057, + 63497, + 63681, + 67645, + 63419, + 68596, + 63822, + 63938, + 63656, + 67536, + 63363, + 66616, + 63614, + 63218, + 66713, + 66907, + 63783, + 63642, + 65810, + 63744, + 67346, + 67620, + 66552, + 67611, + 67611, + 63989, + 63568, + 63576, + 63600, + 68029, + 67553, + 67707, + 63669, + 63877, + 63909, + 63793, + 67683, + 63650, + 63138, + 63694, + 63445, + 66854, + 65556, + 63927, + 63317, + 63245, + 66826, + 63536, + 63433, + 63432, + 63913, + 63581, + 65635, + 63403, + 65616, + 63640, + 63234, + 63396, + 63661, + 63437, + 63311, + 63229, + 65656, + 63312, + 63346, + 63590, + 63622, + 66633, + 63437, + 65425, + 67484, + 63193, + 63800, + 63585, + 63702, + 63763, + 63675, + 63399, + 63384, + 63528, + 63621, + 64066, + 68108, + 63290, + 70377, + 63282, + 63744, + 64136, + 67343, + 64413, + 67377, + 70449, + 63898, + 63725, + 63432, + 68246, + 91753, + 70483, + 70330, + 70283, + 64129, + 63827, + 68041, + 68597, + 67500 + ], + "sample_count": 1271 + }, + { + "pubkey": "FDVH96mCFLqbnfqedZ73uAz1yncsG2SxrGh5isd3Xoqe", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242253000000, + "samples": [ + 253046, + 253520, + 253055, + 253108, + 253079, + 253106, + 253001, + 253763, + 253123, + 253123, + 253145, + 253145, + 252981, + 252981, + 253793, + 253434, + 253434, + 253203, + 253134, + 253134, + 253070, + 253280, + 255415, + 255415, + 253187, + 253105, + 253099, + 253023, + 253164, + 253076, + 253076, + 253204, + 253090, + 253090, + 253002, + 253242, + 253242, + 255987, + 253102, + 253133, + 253141, + 253035, + 253266, + 253089, + 255229, + 253264, + 353998, + 353998, + 252947, + 253136, + 253189, + 253295, + 253489, + 253062, + 253135, + 253082, + 253018, + 253052, + 253311, + 253666, + 253508, + 253005, + 253310, + 253102, + 281907, + 253388, + 253388, + 253268, + 253190, + 253094, + 253036, + 253012, + 253289, + 253289, + 254343, + 253014, + 253014, + 553012, + 253100, + 274430, + 269132, + 269132, + 285409, + 418186, + 253097, + 253097, + 253153, + 253208, + 253208, + 253519, + 253332, + 253332, + 253221, + 253121, + 253031, + 253139, + 253085, + 255835, + 253078, + 253103, + 253101, + 253083, + 253243, + 253142, + 253386, + 253152, + 253226, + 253167, + 253109, + 253109, + 253153, + 253208, + 253356, + 253356, + 253020, + 253192, + 253022, + 253198, + 253142, + 253142, + 253298, + 252964, + 253102, + 253264, + 253023, + 253076, + 253111, + 255351, + 253058, + 253211, + 253090, + 253030, + 253188, + 253148, + 253392, + 253155, + 252926, + 252926, + 252991, + 253068, + 253330, + 253134, + 254765, + 254765, + 253100, + 253100, + 253127, + 253312, + 253312, + 253140, + 253188, + 253081, + 253154, + 253153, + 253130, + 254337, + 253131, + 254228, + 253046, + 252979, + 253162, + 253162, + 253094, + 253239, + 253462, + 253220, + 253139, + 253143, + 253201, + 253346, + 253346, + 253115, + 253729, + 253729, + 253113, + 253143, + 253021, + 253529, + 253314, + 253160, + 254096, + 254096, + 253154, + 253154, + 253056, + 253143, + 253191, + 254076, + 252999, + 253253, + 253253, + 253127, + 253150, + 253127, + 254360, + 253152, + 253152, + 253095, + 253190, + 253017, + 253263, + 253132, + 253337, + 253337, + 253065, + 253131, + 253218, + 253149, + 253101, + 253124, + 253764, + 253166, + 253086, + 253123, + 253228, + 253212, + 253195, + 253458, + 253458, + 253152, + 253019, + 253149, + 253297, + 253199, + 253395, + 253395, + 253338, + 253137, + 253198, + 253199, + 253199, + 253087, + 254256, + 253413, + 253097, + 253141, + 253115, + 253154, + 253218, + 253188, + 253202, + 253258, + 253754, + 253112, + 253126, + 253242, + 253096, + 253503, + 253503, + 253077, + 253057, + 253102, + 253102, + 253081, + 254109, + 254139, + 253018, + 253018, + 253189, + 253189, + 253234, + 253200, + 253972, + 253107, + 253107, + 253083, + 253001, + 253094, + 253213, + 253447, + 253905, + 253120, + 253120, + 253224, + 253418, + 253082, + 253289, + 254177, + 253088, + 253052, + 253059, + 253021, + 253135, + 253055, + 253239, + 253239, + 253133, + 253080, + 253016, + 253145, + 253305, + 253078, + 253078, + 253077, + 253077, + 253264, + 253017, + 253136, + 253113, + 253466, + 253454, + 253020, + 252978, + 253094, + 253214, + 253096, + 253181, + 254012, + 253112, + 253082, + 253209, + 253135, + 253225, + 253225, + 253241, + 253496, + 253152, + 252974, + 253057, + 253174, + 253152, + 253166, + 253744, + 253226, + 253014, + 253082, + 253092, + 253153, + 252977, + 253256, + 253176, + 253170, + 253170, + 253106, + 253028, + 253159, + 253159, + 257868, + 253627, + 253261, + 253022, + 253092, + 253352, + 253110, + 253160, + 253164, + 253077, + 253139, + 253061, + 253177, + 253177, + 253145, + 253969, + 253157, + 253313, + 253041, + 253076, + 253193, + 253333, + 253071, + 253650, + 253309, + 253309, + 253187, + 253103, + 253264, + 253216, + 253293, + 253298, + 253298, + 253180, + 253140, + 253205, + 253056, + 253122, + 253122, + 253012, + 253209, + 253078, + 253120, + 253106, + 253053, + 253340, + 253120, + 253120, + 253180, + 253291, + 253447, + 253177, + 253198, + 253559, + 253341, + 253055, + 253155, + 253078, + 253148, + 253148, + 254361, + 253178, + 253084, + 253046, + 253111, + 253173, + 253133, + 253270, + 253853, + 253112, + 253137, + 253137, + 253064, + 253115, + 253043, + 254742, + 253216, + 253150, + 253150, + 253190, + 253218, + 253477, + 253230, + 253170, + 253170, + 253055, + 253110, + 253078, + 253492, + 253110, + 254064, + 253400, + 253218, + 253116, + 253106, + 253114, + 253165, + 254294, + 253451, + 253112, + 253100, + 253159, + 253156, + 253239, + 253118, + 253118, + 253051, + 253119, + 253118, + 253132, + 253048, + 253048, + 254330, + 253328, + 253148, + 253028, + 253269, + 253269, + 253128, + 253135, + 253606, + 253080, + 253115, + 253117, + 253190, + 253267, + 253204, + 253134, + 253231, + 253318, + 253318, + 253128, + 253114, + 253203, + 253284, + 253284, + 253284, + 253195, + 253092, + 253126, + 253199, + 253090, + 253354, + 253016, + 253288, + 253283, + 253124, + 253201, + 253278, + 253165, + 253215, + 253187, + 253140, + 253034, + 253117, + 253347, + 253347, + 253099, + 253645, + 253238, + 253064, + 253064, + 253119, + 253119, + 253046, + 255048, + 253112, + 252986, + 253012, + 253068, + 253532, + 253066, + 253884, + 253303, + 253039, + 253019, + 253062, + 253062, + 253068, + 253030, + 253757, + 253098, + 253087, + 253066, + 253106, + 253195, + 253180, + 253203, + 253114, + 253138, + 253112, + 253157, + 253081, + 253166, + 253166, + 253192, + 253185, + 253047, + 253022, + 253057, + 253520, + 253115, + 253403, + 253403, + 253199, + 253039, + 253142, + 253143, + 253374, + 253374, + 253771, + 253771, + 253275, + 253150, + 253129, + 253193, + 253158, + 253158, + 253166, + 253131, + 253086, + 253291, + 253122, + 253014, + 253043, + 255040, + 255040, + 253011, + 253116, + 253088, + 253299, + 253288, + 254525, + 253209, + 252990, + 253040, + 252984, + 253093, + 253093, + 253190, + 253457, + 253515, + 253109, + 253119, + 252991, + 253125, + 253360, + 253080, + 253203, + 253203, + 253060, + 253137, + 253035, + 253132, + 253102, + 253144, + 253111, + 253406, + 253061, + 253061, + 253056, + 253092, + 254003, + 253337, + 253049, + 253219, + 253093, + 253157, + 253156, + 253138, + 254024, + 253230, + 253233, + 253233, + 253771, + 253044, + 253182, + 253304, + 253347, + 252959, + 253187, + 253201, + 253114, + 253004, + 253183, + 253520, + 253102, + 253183, + 253184, + 253123, + 253123, + 253092, + 253133, + 253163, + 253163, + 253108, + 253213, + 253048, + 253274, + 253129, + 253496, + 253094, + 253087, + 253130, + 253011, + 252894, + 253515, + 253009, + 252912, + 252833, + 252931, + 252879, + 252990, + 252980, + 253198, + 253198, + 253051, + 252962, + 252963, + 252904, + 252957, + 252945, + 252949, + 253900, + 253013, + 252875, + 252910, + 252884, + 252995, + 252904, + 255548, + 252950, + 252940, + 252868, + 252862, + 252936, + 252908, + 252985, + 253481, + 252873, + 252873, + 252707, + 253027, + 253024, + 253063, + 253164, + 252951, + 252905, + 252818, + 252900, + 252888, + 252845, + 252848, + 253222, + 252949, + 252721, + 252823, + 252796, + 252885, + 252855, + 254053, + 252900, + 252852, + 252926, + 252926, + 252803, + 252920, + 253055, + 253116, + 252916, + 253150, + 252903, + 252900, + 252909, + 252851, + 253082, + 252897, + 252845, + 252845, + 252912, + 253118, + 252858, + 252906, + 253169, + 252812, + 252812, + 253233, + 252926, + 253164, + 253140, + 254189, + 252824, + 253075, + 252836, + 253025, + 253010, + 252984, + 252911, + 252947, + 252869, + 252793, + 252829, + 252834, + 252902, + 252898, + 252978, + 252819, + 253401, + 252768, + 252861, + 252861, + 252967, + 253071, + 253071, + 252881, + 252881, + 252940, + 252917, + 253016, + 252947, + 253200, + 252849, + 252783, + 253263, + 253263, + 252872, + 252944, + 253140, + 253140, + 252850, + 253034, + 253034, + 252926, + 252827, + 252838, + 254070, + 252979, + 253107, + 252836, + 371279, + 252840, + 252840, + 252874, + 253173, + 252935, + 252765, + 252802, + 252886, + 252887, + 252912, + 253305, + 252892, + 252941, + 252779, + 252861, + 252861, + 253023, + 253004, + 252838, + 252843, + 252929, + 253204, + 420379, + 252958, + 253045, + 254238, + 254238, + 252870, + 252865, + 252899, + 252865, + 253121, + 252830, + 253691, + 252964, + 252906, + 252811, + 252803, + 252941, + 252873, + 253295, + 253295, + 252868, + 252868, + 252752, + 252989, + 421200, + 253375, + 253064, + 252979, + 252824, + 252823, + 252876, + 252876, + 253040, + 255597, + 253145, + 252886, + 252989, + 252914, + 252808, + 252862, + 253051, + 253051, + 252914, + 252832, + 252896, + 252848, + 252888, + 253066, + 253335, + 253051, + 252859, + 252902, + 252818, + 253186, + 252854, + 253029, + 253038, + 252813, + 252879, + 252854, + 252806, + 253158, + 252875, + 253001, + 252902, + 252916, + 252852, + 252883, + 252883, + 252884, + 252784, + 253363, + 253363, + 252801, + 252820, + 252846, + 253036, + 252851, + 252987, + 252846, + 253059, + 252857, + 252781, + 252920, + 252853, + 254149, + 252886, + 253009, + 253038, + 252982, + 252935, + 252894, + 252926, + 253194, + 252751, + 252794, + 252841, + 252844, + 252996, + 252923, + 252938, + 252955, + 253056, + 253056, + 253036, + 253036, + 252889, + 253146, + 253146, + 252965, + 252965, + 253014, + 253014, + 253674, + 253674, + 252846, + 252846, + 252822, + 252910, + 252910, + 253072, + 252885, + 252837, + 254635, + 254406, + 254406, + 253037, + 252879, + 253215, + 252956, + 252956, + 252971, + 253091, + 279007, + 253132, + 253116, + 253116, + 252968, + 252968, + 253022, + 252843, + 252843, + 253005, + 253084, + 253084, + 252795, + 252860, + 252863, + 252863, + 252873, + 253005, + 253005, + 252973, + 252957, + 253014, + 253089, + 252942, + 252913, + 252913, + 252962, + 252876, + 252876, + 252935, + 252884, + 252893, + 252949, + 252923, + 252982, + 252982, + 252923, + 252889, + 253226, + 253226, + 252959, + 252952, + 252803, + 252891, + 252891, + 252849, + 252893, + 252893, + 253155, + 253363, + 253220, + 252875, + 252913, + 252913, + 252875, + 252875, + 253433, + 252932, + 252972, + 252751, + 252751, + 252910, + 252843, + 252927, + 252890, + 252890, + 252890, + 253005, + 252941, + 253059, + 253195, + 253195, + 253343, + 252810, + 252810, + 252992, + 252786, + 252786, + 252786, + 252953, + 252953, + 253058, + 253058, + 253191, + 253191, + 253659, + 253659, + 252922, + 252922, + 252924, + 253003, + 252917, + 252917, + 252898, + 253027, + 252981, + 253000, + 253000, + 253102, + 252978, + 253176, + 253176, + 252932, + 252819, + 252802, + 253041, + 252945, + 253128, + 253128, + 253106, + 252923, + 252887, + 252795, + 252795, + 252804, + 253144, + 252954, + 252954, + 252990, + 252868, + 252855, + 252917, + 252917, + 253035, + 252901, + 252856, + 252856, + 252974, + 252874, + 252910, + 252910, + 252894, + 252969, + 252971, + 252971, + 252806, + 252907, + 252907, + 252938, + 252864, + 252813, + 252862, + 252838, + 252838, + 252853, + 252918, + 253003, + 253003, + 252970, + 252896, + 252886, + 252886, + 252947, + 253011, + 252996, + 252847, + 252796, + 252915, + 253111, + 252877, + 252877, + 253292, + 253021, + 252932, + 252932, + 252918, + 252938, + 252938, + 252941, + 253192, + 252856, + 252904, + 252882, + 252882, + 252982, + 253853, + 252895, + 252895, + 252991, + 252900, + 252900, + 252851, + 252909, + 254577, + 253048, + 252875, + 252875, + 252931, + 252931, + 252887, + 252887, + 252917, + 252917, + 252917, + 252969, + 252966, + 252964, + 252814, + 252943, + 252981, + 252979, + 252979, + 252921, + 252999, + 252999, + 252965, + 253116, + 253042, + 253042, + 253129, + 252796, + 252796, + 252974, + 253059, + 253059, + 252855, + 252928, + 252829, + 253015, + 253015, + 253030, + 253021, + 253021, + 252855, + 252890, + 253283, + 253283, + 252893, + 252893, + 252823, + 252823, + 253003, + 252790, + 252790, + 252910, + 252852, + 253047, + 252843, + 252843, + 252889, + 252820, + 252820, + 252941, + 252898, + 252780, + 252780, + 252902, + 252843, + 252816, + 252819, + 253023, + 253316, + 252933, + 252933, + 252681, + 252817, + 252817, + 253012, + 253012, + 253054, + 252872, + 252919, + 252919, + 252827, + 252867, + 252867, + 252976, + 252976, + 253031, + 253031, + 252966, + 252966, + 252870, + 253856, + 253856, + 253181, + 252868, + 252863, + 252805, + 252805, + 252802, + 253808, + 252796, + 252958, + 252875, + 252850, + 252915, + 252824, + 253200, + 252869, + 253198, + 253198, + 252796, + 252787, + 252941, + 253007, + 252957, + 252948, + 252805, + 252838, + 252838, + 253125, + 252917, + 253311, + 253311, + 253311, + 281048, + 281037, + 281037, + 282293, + 280696, + 283958, + 283187, + 283187, + 283506, + 283506, + 281152, + 282304, + 282416, + 280375, + 280375, + 252982, + 252982, + 283722, + 283722, + 283722, + 280043, + 252903, + 252903, + 252835, + 281846, + 280401, + 280401, + 280248, + 282289, + 252973, + 252973, + 252863, + 253517, + 253517 + ], + "sample_count": 1272 + }, + { + "pubkey": "HsqZonGCWhtkJa82zujQApH7gH3YdWvtaTZXuCW9YedL", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242245000000, + "samples": [ + 168043, + 167815, + 167716, + 167728, + 167798, + 167923, + 167641, + 167990, + 167599, + 167749, + 168346, + 168346, + 167894, + 167549, + 167585, + 167585, + 167882, + 167781, + 167993, + 167675, + 168001, + 167754, + 167891, + 167553, + 167707, + 167825, + 167683, + 167667, + 167765, + 167745, + 168107, + 167683, + 168669, + 167877, + 167701, + 167959, + 167568, + 167974, + 167842, + 167851, + 167916, + 167868, + 167681, + 167504, + 167821, + 167683, + 167854, + 167657, + 167744, + 167798, + 167686, + 167865, + 167941, + 167669, + 167849, + 167780, + 167672, + 167798, + 167647, + 167848, + 168100, + 167727, + 167709, + 170914, + 168546, + 167764, + 167937, + 171078, + 171078, + 167708, + 180668, + 175268, + 200071, + 198939, + 178918, + 184739, + 195951, + 194003, + 179344, + 193717, + 192019, + 199866, + 170980, + 199677, + 205297, + 174536, + 191176, + 196297, + 201874, + 205784, + 207103, + 213560, + 207743, + 212452, + 239012, + 206324, + 197983, + 210075, + 220372, + 211018, + 207809, + 215760, + 193831, + 167843, + 175783, + 178056, + 167800, + 170857, + 196841, + 171626, + 177933, + 171346, + 170357, + 189828, + 167581, + 168208, + 179163, + 183161, + 181884, + 188226, + 168135, + 169620, + 167807, + 167669, + 168667, + 167686, + 168133, + 172947, + 167808, + 167648, + 179862, + 167863, + 167793, + 175542, + 168030, + 219737, + 167882, + 182215, + 167769, + 167843, + 167763, + 167747, + 167893, + 167930, + 167851, + 167726, + 167577, + 167752, + 167932, + 167750, + 167938, + 168632, + 167690, + 167678, + 167854, + 187745, + 168360, + 173349, + 172205, + 168097, + 178815, + 167821, + 168204, + 168281, + 167995, + 168035, + 167793, + 167637, + 167693, + 174279, + 167967, + 167834, + 167843, + 167827, + 167857, + 168088, + 171633, + 167799, + 167707, + 167793, + 194947, + 188488, + 197106, + 185118, + 178339, + 179027, + 184729, + 174343, + 193633, + 173909, + 181152, + 173317, + 167832, + 167682, + 167601, + 167702, + 167745, + 169321, + 167742, + 167869, + 167550, + 167723, + 167705, + 167798, + 167827, + 167806, + 168002, + 167881, + 167585, + 167838, + 167760, + 167752, + 167893, + 168678, + 167937, + 167744, + 167730, + 168647, + 167701, + 167638, + 167522, + 167741, + 168033, + 167823, + 167788, + 167763, + 167735, + 167783, + 168101, + 167732, + 167753, + 167717, + 167708, + 167663, + 167895, + 167471, + 167808, + 167808, + 167760, + 168072, + 167996, + 167944, + 167899, + 167950, + 168121, + 167592, + 167609, + 168024, + 167658, + 167838, + 167638, + 167878, + 167733, + 167646, + 167889, + 167941, + 167796, + 167825, + 167787, + 167728, + 167682, + 167531, + 167949, + 167791, + 167716, + 167795, + 167796, + 167787, + 167763, + 167739, + 167942, + 167848, + 167918, + 167718, + 167558, + 167731, + 167445, + 167834, + 167631, + 167922, + 167769, + 167830, + 167805, + 167781, + 167717, + 167646, + 167766, + 167796, + 167548, + 167868, + 167973, + 167630, + 167947, + 167659, + 167679, + 167845, + 167736, + 167740, + 167643, + 167815, + 167900, + 167978, + 167646, + 167619, + 167786, + 167745, + 167535, + 167819, + 167850, + 167987, + 167562, + 167775, + 167732, + 167545, + 167674, + 167650, + 167748, + 167729, + 167668, + 167809, + 167686, + 167836, + 167886, + 167734, + 167680, + 167919, + 167888, + 167837, + 167690, + 167739, + 167721, + 167769, + 167805, + 167720, + 167716, + 167586, + 167747, + 167915, + 167548, + 167713, + 167694, + 167958, + 167620, + 167743, + 167743, + 167775, + 167759, + 167518, + 167677, + 167721, + 167686, + 167547, + 167692, + 167748, + 167627, + 167842, + 167996, + 168112, + 167829, + 167775, + 167920, + 167747, + 167861, + 167759, + 167712, + 167719, + 167608, + 167866, + 167786, + 167770, + 167722, + 167779, + 167814, + 167525, + 167694, + 167931, + 167731, + 167654, + 168098, + 167667, + 167829, + 167808, + 167733, + 167779, + 167687, + 167746, + 167814, + 167786, + 167748, + 167662, + 167770, + 167899, + 167704, + 167613, + 167731, + 167739, + 167651, + 167741, + 167647, + 167610, + 167870, + 167541, + 167635, + 167746, + 167746, + 167907, + 167592, + 173479, + 167822, + 167547, + 172864, + 167691, + 167825, + 167572, + 167825, + 167745, + 167713, + 167668, + 167693, + 167795, + 167785, + 167822, + 167881, + 167906, + 167611, + 167710, + 167575, + 168062, + 167662, + 167766, + 167618, + 167657, + 167708, + 167678, + 167750, + 167919, + 167808, + 167714, + 167714, + 167786, + 167813, + 167608, + 167945, + 167680, + 167763, + 167896, + 167727, + 167773, + 167760, + 167670, + 167779, + 167655, + 167629, + 167749, + 167706, + 167709, + 167633, + 167780, + 167667, + 167749, + 167795, + 167926, + 167761, + 167701, + 167826, + 167939, + 167828, + 167691, + 167689, + 167797, + 167902, + 167713, + 168039, + 168039, + 167589, + 167732, + 167902, + 167824, + 167750, + 167699, + 167852, + 167941, + 167646, + 167549, + 167708, + 167733, + 167622, + 167594, + 167607, + 167764, + 167522, + 167939, + 167617, + 167865, + 167865, + 167636, + 167910, + 167878, + 167625, + 167788, + 167763, + 167576, + 167945, + 167730, + 167785, + 170515, + 167691, + 167861, + 167687, + 173142, + 173365, + 167696, + 167807, + 167545, + 167600, + 170877, + 167889, + 167945, + 167875, + 167809, + 167747, + 167725, + 167725, + 168073, + 167572, + 167851, + 167886, + 167785, + 167883, + 167621, + 167669, + 167476, + 168128, + 167775, + 167683, + 172976, + 167768, + 167793, + 167910, + 167849, + 167878, + 167770, + 167920, + 167829, + 167904, + 167842, + 167833, + 167764, + 167716, + 167547, + 167728, + 167762, + 167843, + 167747, + 168125, + 167949, + 167928, + 167729, + 167665, + 167552, + 167568, + 168193, + 168104, + 167887, + 167791, + 167924, + 167858, + 167733, + 167840, + 167877, + 168063, + 167847, + 167734, + 167772, + 167851, + 167726, + 167631, + 167850, + 167757, + 167725, + 167670, + 167771, + 167901, + 167748, + 167770, + 167874, + 167790, + 167505, + 167757, + 167767, + 167605, + 167754, + 167938, + 167776, + 167776, + 167584, + 167733, + 167843, + 167602, + 167720, + 167827, + 167602, + 167753, + 167839, + 167796, + 167772, + 167622, + 168058, + 167743, + 168129, + 167771, + 167701, + 167907, + 167693, + 167959, + 168147, + 167747, + 167793, + 167672, + 167813, + 167887, + 167865, + 167974, + 167758, + 167662, + 167647, + 167712, + 167897, + 167912, + 167727, + 167846, + 167606, + 167731, + 167965, + 167772, + 167802, + 167691, + 167950, + 167723, + 167693, + 167738, + 167970, + 167562, + 167627, + 167650, + 167903, + 167785, + 167545, + 167676, + 167798, + 167686, + 167651, + 167681, + 167641, + 167700, + 167815, + 167775, + 167790, + 167530, + 167654, + 167677, + 167899, + 167844, + 167558, + 168092, + 167955, + 167928, + 167734, + 167661, + 167759, + 167779, + 167842, + 167732, + 167653, + 167584, + 168059, + 167816, + 167896, + 167785, + 167617, + 167662, + 167596, + 167958, + 167673, + 167938, + 167869, + 167709, + 167722, + 167895, + 167674, + 167922, + 167988, + 167949, + 167604, + 167861, + 167715, + 167613, + 167859, + 167809, + 167973, + 167624, + 167843, + 167700, + 167863, + 167902, + 167971, + 167817, + 167612, + 168052, + 167669, + 167636, + 167552, + 167827, + 167589, + 167739, + 167675, + 167731, + 167805, + 167774, + 167628, + 167806, + 167795, + 167723, + 167816, + 167612, + 167671, + 167745, + 167633, + 167652, + 167600, + 167753, + 167664, + 167806, + 167713, + 167812, + 167757, + 167802, + 167898, + 167636, + 167881, + 167767, + 167705, + 167941, + 167979, + 167757, + 167835, + 167787, + 167628, + 167661, + 167443, + 167890, + 167837, + 167872, + 167805, + 167758, + 167702, + 167709, + 167763, + 167488, + 167725, + 167651, + 167526, + 167769, + 167705, + 167921, + 167824, + 167869, + 167881, + 167690, + 167806, + 167668, + 167668, + 167869, + 168740, + 172687, + 167876, + 167891, + 172661, + 168962, + 168132, + 168132, + 169451, + 169997, + 180354, + 167652, + 167772, + 167663, + 167676, + 167883, + 167761, + 168419, + 167938, + 169570, + 178932, + 184712, + 169011, + 187199, + 175558, + 182045, + 176176, + 179414, + 188750, + 170673, + 182924, + 187522, + 196256, + 189996, + 203428, + 182916, + 200176, + 177407, + 180610, + 175764, + 248082, + 181102, + 201852, + 206066, + 174254, + 180843, + 193646, + 183449, + 185006, + 198730, + 189045, + 196904, + 191721, + 167680, + 173572, + 170794, + 169383, + 181868, + 195249, + 192601, + 180858, + 185548, + 195568, + 186937, + 186245, + 191594, + 189058, + 183745, + 194804, + 185717, + 193411, + 189446, + 184376, + 193505, + 169259, + 182929, + 175913, + 167711, + 167969, + 168187, + 170394, + 169089, + 167904, + 167741, + 167781, + 176628, + 168943, + 168020, + 170428, + 169903, + 170168, + 176260, + 177135, + 173198, + 167906, + 167759, + 167759, + 177114, + 186476, + 179908, + 181014, + 203808, + 168386, + 187318, + 179589, + 177784, + 197864, + 186007, + 186990, + 178944, + 168252, + 173279, + 173270, + 184227, + 187892, + 168080, + 171356, + 184634, + 200778, + 186028, + 171770, + 176119, + 169189, + 175503, + 168330, + 173298, + 167943, + 179116, + 170078, + 167608, + 181638, + 171882, + 167656, + 168001, + 167564, + 167906, + 169450, + 169450, + 167679, + 167693, + 168503, + 167692, + 167940, + 167798, + 167843, + 167509, + 168743, + 167664, + 167896, + 168879, + 167683, + 167470, + 167776, + 167776, + 167992, + 167992, + 167665, + 167815, + 167594, + 167684, + 167669, + 167669, + 167811, + 167693, + 167888, + 167887, + 167782, + 167680, + 167736, + 167904, + 167807, + 167647, + 167808, + 167623, + 167623, + 167812, + 167893, + 167812, + 167604, + 167658, + 167567, + 167875, + 167699, + 167520, + 167692, + 167985, + 167647, + 167839, + 167672, + 167682, + 167576, + 167764, + 167772, + 167697, + 167760, + 167798, + 167836, + 167542, + 167665, + 167665, + 167788, + 167665, + 167805, + 167889, + 167632, + 167651, + 167696, + 167610, + 167624, + 167728, + 167673, + 167813, + 167679, + 167783, + 167838, + 167939, + 167614, + 167692, + 167789, + 167632, + 167679, + 167881, + 167767, + 167767, + 167613, + 167661, + 167755, + 167746, + 167746, + 167733, + 167733, + 167797, + 167797, + 167755, + 167863, + 167603, + 168039, + 167628, + 167643, + 167805, + 167599, + 167755, + 167755, + 167652, + 167754, + 167827, + 167782, + 167628, + 167896, + 167896, + 167724, + 167899, + 167723, + 167592, + 167592, + 167692, + 167696, + 167696, + 167809, + 167696, + 167619, + 167607, + 167741, + 167755, + 167568, + 167718, + 167675, + 167709, + 167611, + 167611, + 167636, + 167743, + 167728, + 167745, + 167838, + 167777, + 167685, + 167674, + 167650, + 167651, + 167550, + 167645, + 167655, + 167866, + 167866, + 167689, + 167617, + 167777, + 167697, + 167915, + 167566, + 167771, + 167830, + 167769, + 167769, + 167723, + 167918, + 167622, + 167657, + 167655, + 167884, + 167687, + 167749, + 167749, + 167601, + 167601, + 167800, + 167601, + 167601, + 167737, + 167737, + 168085, + 167752, + 167752, + 167575, + 167705, + 167793, + 167738, + 167583, + 167887, + 168027, + 167652, + 167802, + 167596, + 167596, + 167711, + 167712, + 167712, + 167814, + 167792, + 167726, + 167560, + 167560, + 167721, + 167771, + 167618, + 167618, + 167757, + 167644, + 167711, + 167717, + 167848, + 167656, + 167690, + 167690, + 167566, + 167712, + 167585, + 167673, + 167657, + 167561, + 167561, + 167595, + 167693, + 167915, + 167495, + 167648, + 167713, + 167672, + 167685, + 167671, + 167633, + 167692, + 167659, + 167900, + 167735, + 167769, + 167769, + 167560, + 167775, + 167730, + 167836, + 167620, + 167639, + 167706, + 167723, + 167816, + 167816, + 167772, + 167867, + 167891, + 167823, + 167571, + 167736, + 167579, + 167738, + 167717, + 167564, + 167728, + 167868, + 167846, + 167745, + 167638, + 167693, + 167693, + 167799, + 167661, + 167661, + 167746, + 167610, + 167628, + 168081, + 168081, + 167578, + 167931, + 167671, + 167537, + 167776, + 167622, + 167816, + 167760, + 167806, + 167806, + 167910, + 167842, + 167842, + 167774, + 167774, + 167580, + 167580, + 167715, + 167928, + 167844, + 167920, + 167920, + 167571, + 167672, + 167690, + 167736, + 167827, + 167649, + 168076, + 167661, + 167711, + 167746, + 167886, + 167659, + 167659, + 167843, + 167921, + 167921, + 167730, + 167747, + 167877, + 167691, + 167742, + 168104, + 167861, + 167861, + 167680, + 167680, + 167707, + 167675, + 167899, + 167704, + 167665, + 167545, + 167798, + 167798, + 167813, + 167699, + 167841, + 167732, + 167706, + 167729, + 167651, + 167784, + 167783, + 167736, + 167779, + 167686, + 167881, + 167767, + 167767, + 167627, + 167730, + 167877, + 167801, + 167699, + 167463, + 167649, + 167720, + 167488, + 167974, + 167974, + 167890, + 167768, + 167568, + 167728, + 167896, + 167714, + 167588, + 167588, + 167702, + 167710, + 167710, + 167733 + ], + "sample_count": 1270 + }, + { + "pubkey": "9rAyDZGB6w7dMVKDqWcB7fNZycFaVsWmcWSWHLaZTz4c", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242243000000, + "samples": [ + 171262, + 171262, + 171336, + 166402, + 166486, + 166586, + 171263, + 166548, + 166444, + 166559, + 171253, + 166536, + 166517, + 166461, + 171414, + 166373, + 171230, + 171267, + 171254, + 166394, + 166450, + 171251, + 166522, + 171294, + 171282, + 166474, + 171251, + 171320, + 171342, + 166497, + 171227, + 166554, + 166495, + 171293, + 171309, + 166462, + 166474, + 171172, + 171280, + 166588, + 171261, + 171320, + 171411, + 166592, + 166479, + 171228, + 171396, + 166563, + 171330, + 166586, + 171311, + 166471, + 171326, + 171345, + 171265, + 166456, + 171314, + 171392, + 166579, + 171322, + 171412, + 171330, + 166505, + 171363, + 171381, + 171278, + 171375, + 171266, + 171372, + 166585, + 171404, + 166498, + 166470, + 166540, + 171303, + 171323, + 171386, + 171317, + 171191, + 171239, + 166530, + 171361, + 166561, + 171379, + 166567, + 166520, + 171335, + 166446, + 166510, + 166584, + 171278, + 166636, + 166463, + 166529, + 171290, + 171406, + 171372, + 171355, + 166504, + 166548, + 171345, + 166592, + 166701, + 166643, + 171499, + 171379, + 168195, + 166572, + 166633, + 166574, + 171458, + 166577, + 166580, + 171300, + 171283, + 171363, + 171416, + 166672, + 166587, + 171335, + 171767, + 171398, + 171393, + 166579, + 171362, + 171823, + 167137, + 171348, + 166461, + 171189, + 166482, + 171343, + 171187, + 166655, + 166554, + 166498, + 171332, + 166502, + 171314, + 171345, + 166610, + 166539, + 166508, + 166586, + 171286, + 166532, + 171370, + 166532, + 166602, + 171272, + 171391, + 166536, + 171299, + 166616, + 171341, + 166509, + 171331, + 171291, + 171299, + 171261, + 166534, + 171283, + 166469, + 171265, + 171359, + 171296, + 166465, + 171350, + 171466, + 171316, + 166551, + 166599, + 171303, + 166540, + 171458, + 171251, + 166625, + 166426, + 171395, + 171352, + 171330, + 171406, + 171316, + 166504, + 171297, + 171229, + 171297, + 171334, + 166470, + 171190, + 166507, + 171264, + 166585, + 171298, + 166482, + 171285, + 166437, + 166493, + 171387, + 171277, + 166403, + 171378, + 166437, + 166454, + 166534, + 171304, + 171342, + 171394, + 166548, + 171210, + 166488, + 171312, + 166545, + 171379, + 166487, + 171308, + 166451, + 171226, + 171354, + 166457, + 166389, + 166483, + 171244, + 171284, + 171296, + 166515, + 166507, + 171249, + 166494, + 171235, + 171375, + 171285, + 171305, + 166388, + 171275, + 171297, + 171260, + 166409, + 171200, + 171313, + 171285, + 171293, + 171241, + 166434, + 171285, + 166563, + 171271, + 166488, + 166482, + 171243, + 171243, + 171197, + 171149, + 166442, + 171224, + 166451, + 171277, + 171296, + 166384, + 166460, + 166374, + 171241, + 171293, + 166473, + 166507, + 171176, + 166441, + 171216, + 171326, + 171230, + 171180, + 166446, + 171270, + 166378, + 171205, + 171252, + 171250, + 166429, + 166473, + 171165, + 166465, + 171317, + 171254, + 171210, + 171267, + 166410, + 171315, + 166469, + 171221, + 171215, + 166382, + 171251, + 166420, + 166431, + 166353, + 166342, + 166452, + 166434, + 166403, + 171257, + 171162, + 171236, + 171294, + 166398, + 171198, + 166415, + 171248, + 171285, + 166405, + 166468, + 166438, + 166472, + 171240, + 166443, + 166449, + 166468, + 171258, + 171318, + 171213, + 171230, + 171248, + 166432, + 171299, + 166375, + 166439, + 171269, + 166521, + 166537, + 166416, + 171179, + 171189, + 166412, + 171285, + 166441, + 171284, + 166495, + 166503, + 171129, + 171208, + 171292, + 171296, + 171216, + 166482, + 171271, + 166444, + 171293, + 166425, + 166431, + 171206, + 171313, + 166363, + 166504, + 171253, + 166494, + 166399, + 171226, + 166488, + 171318, + 166464, + 166473, + 166470, + 166444, + 171280, + 166465, + 171240, + 166518, + 166482, + 171313, + 171203, + 166467, + 166508, + 166548, + 171279, + 166381, + 166434, + 171248, + 166423, + 171335, + 171361, + 166524, + 171310, + 166406, + 171170, + 166497, + 171320, + 171192, + 171210, + 166505, + 166360, + 171213, + 171294, + 166484, + 166566, + 166529, + 166470, + 166537, + 171153, + 166496, + 166450, + 171281, + 166363, + 171296, + 166523, + 166488, + 166508, + 166461, + 166526, + 171289, + 171255, + 166487, + 171257, + 166480, + 171342, + 166601, + 166389, + 166513, + 166467, + 171332, + 166385, + 171232, + 171229, + 171225, + 166461, + 171269, + 171203, + 166466, + 171217, + 166568, + 166436, + 171305, + 166468, + 171321, + 171285, + 171266, + 171261, + 171282, + 166494, + 171319, + 166496, + 171303, + 166466, + 171149, + 171259, + 171308, + 171283, + 166420, + 171206, + 166538, + 171296, + 166433, + 171199, + 171293, + 171231, + 171232, + 166471, + 166418, + 171192, + 166512, + 171328, + 171302, + 171287, + 171267, + 171224, + 166375, + 166472, + 171201, + 166594, + 166446, + 166550, + 171278, + 166430, + 166499, + 171325, + 171340, + 166509, + 166388, + 166480, + 166472, + 166458, + 171304, + 166383, + 171257, + 166459, + 166511, + 171349, + 166486, + 171306, + 166508, + 166485, + 171255, + 171297, + 171338, + 166523, + 166487, + 166464, + 166494, + 171281, + 166548, + 166538, + 171313, + 171237, + 171204, + 166518, + 166573, + 166487, + 166372, + 166512, + 171398, + 171284, + 171344, + 166471, + 171289, + 171388, + 171327, + 171342, + 171198, + 166495, + 166546, + 166560, + 171312, + 166434, + 171343, + 171321, + 166455, + 166517, + 171279, + 171376, + 171315, + 166537, + 171305, + 171286, + 171173, + 166515, + 166526, + 166504, + 166560, + 166565, + 166442, + 166552, + 171312, + 166488, + 166423, + 166555, + 171114, + 166455, + 171294, + 171195, + 171259, + 171330, + 166533, + 171259, + 171243, + 166537, + 166498, + 166479, + 171268, + 166568, + 166611, + 166508, + 166499, + 171205, + 171264, + 166506, + 166384, + 171325, + 171321, + 166503, + 171368, + 166437, + 171380, + 166507, + 171347, + 171261, + 166455, + 171282, + 171275, + 171347, + 171205, + 166551, + 171352, + 171328, + 166420, + 166423, + 166469, + 166525, + 166427, + 171272, + 166448, + 166542, + 171289, + 171269, + 166492, + 166587, + 171344, + 166496, + 171361, + 166419, + 166431, + 171322, + 166457, + 166465, + 166496, + 166505, + 166498, + 171339, + 171252, + 166371, + 166410, + 171301, + 166537, + 166453, + 166477, + 166567, + 171217, + 166489, + 166483, + 171202, + 166520, + 166565, + 166479, + 171235, + 171300, + 171212, + 166433, + 171303, + 171195, + 166535, + 166479, + 171292, + 166581, + 166478, + 166512, + 171315, + 166474, + 171267, + 166351, + 171270, + 171235, + 166492, + 166437, + 171299, + 169734, + 166108, + 172073, + 166047, + 172019, + 172076, + 166109, + 171907, + 166138, + 166050, + 172052, + 172085, + 171966, + 172021, + 172108, + 172001, + 172084, + 165970, + 166049, + 165996, + 172110, + 172028, + 172161, + 172037, + 165944, + 172103, + 172104, + 172018, + 166155, + 171973, + 172136, + 166002, + 166056, + 172084, + 171993, + 172115, + 166130, + 166116, + 166028, + 166046, + 171990, + 165147, + 171082, + 171079, + 171073, + 165261, + 165160, + 171217, + 165208, + 166061, + 171109, + 171132, + 165190, + 171221, + 165188, + 165188, + 171125, + 172146, + 165231, + 165117, + 165175, + 171193, + 171096, + 171232, + 171117, + 171146, + 165128, + 165240, + 166088, + 165221, + 165158, + 171135, + 171089, + 171194, + 165103, + 166075, + 166127, + 165166, + 171096, + 165244, + 171075, + 171213, + 172075, + 165125, + 171107, + 165066, + 171219, + 165202, + 171147, + 165138, + 171147, + 165155, + 165199, + 171159, + 171102, + 165205, + 171108, + 165179, + 166063, + 172069, + 165138, + 165195, + 171155, + 171184, + 171090, + 165093, + 171194, + 171103, + 171141, + 171185, + 165201, + 171142, + 166121, + 165157, + 171198, + 172034, + 165263, + 171089, + 165205, + 171218, + 171130, + 171026, + 165122, + 171169, + 171087, + 165146, + 165305, + 165135, + 165181, + 172027, + 171114, + 165172, + 165156, + 165274, + 165125, + 171235, + 165067, + 171149, + 165296, + 165143, + 171069, + 171183, + 165093, + 171054, + 165118, + 171143, + 165073, + 165112, + 171086, + 165082, + 165074, + 171076, + 171181, + 165085, + 171144, + 165113, + 171142, + 171224, + 166133, + 165136, + 168302, + 166062, + 165193, + 165180, + 165148, + 171234, + 165130, + 171124, + 171235, + 165227, + 171116, + 171076, + 171137, + 171160, + 165121, + 165067, + 165200, + 171240, + 171224, + 165166, + 165132, + 165187, + 171164, + 165171, + 165175, + 171123, + 172274, + 165107, + 165242, + 171146, + 166696, + 171156, + 166085, + 171143, + 171092, + 171139, + 171188, + 165130, + 171128, + 165235, + 171199, + 165247, + 165099, + 172085, + 172093, + 172100, + 165165, + 165146, + 172177, + 172071, + 171040, + 165124, + 165158, + 171103, + 171142, + 171219, + 171227, + 165195, + 165177, + 171159, + 171219, + 165207, + 165206, + 165129, + 171096, + 171144, + 171132, + 165123, + 171160, + 171207, + 165090, + 171065, + 165117, + 165325, + 171093, + 165105, + 165166, + 171090, + 165042, + 171098, + 171231, + 171175, + 171185, + 171146, + 165130, + 171249, + 165060, + 171127, + 171230, + 165133, + 171226, + 165200, + 171284, + 165180, + 171113, + 165142, + 171115, + 171256, + 165177, + 171219, + 171157, + 165163, + 171098, + 165057, + 171106, + 171152, + 171131, + 165181, + 171012, + 165164, + 171206, + 172133, + 171097, + 171134, + 171128, + 172086, + 171193, + 171196, + 165162, + 171240, + 166100, + 165141, + 171206, + 171166, + 165100, + 171056, + 171102, + 165143, + 171105, + 165074, + 165116, + 165147, + 165249, + 171104, + 165168, + 165121, + 172071, + 166002, + 171051, + 171190, + 165024, + 165158, + 165033, + 165196, + 165178, + 165218, + 165087, + 166012, + 165986, + 166033, + 165158, + 171969, + 165168, + 165120, + 164996, + 165159, + 165084, + 172040, + 165152, + 166025, + 171048, + 171147, + 166052, + 171066, + 171081, + 165115, + 171151, + 171982, + 166036, + 171175, + 171114, + 165126, + 171166, + 171168, + 171085, + 165242, + 165081, + 171147, + 171090, + 165152, + 165196, + 171154, + 165104, + 165104, + 171086, + 165097, + 171097, + 171138, + 171027, + 171034, + 171130, + 171079, + 165144, + 165288, + 171146, + 166081, + 171168, + 171101, + 171143, + 165091, + 165122, + 165116, + 171078, + 165230, + 171106, + 171199, + 165124, + 165092, + 165149, + 171121, + 171162, + 165178, + 165112, + 165173, + 171135, + 171181, + 171213, + 171131, + 171145, + 171177, + 165152, + 165058, + 165157, + 165144, + 165155, + 171134, + 165138, + 165154, + 171159, + 165135, + 165155, + 171060, + 171086, + 165931, + 165090, + 171079, + 165187, + 171113, + 165135, + 171107, + 165206, + 171115, + 165142, + 171156, + 171162, + 165121, + 171195, + 171177, + 165211, + 165095, + 165028, + 165219, + 165181, + 165091, + 171115, + 171154, + 171238, + 170998, + 171143, + 165138, + 171118, + 165107, + 165105, + 165130, + 165077, + 171122, + 165226, + 171149, + 165077, + 165105, + 165086, + 171195, + 172017, + 165204, + 172070, + 166025, + 166001, + 171074, + 171034, + 171206, + 165037, + 165226, + 165190, + 171146, + 171168, + 165160, + 165093, + 165142, + 171144, + 171216, + 165115, + 165137, + 171191, + 171220, + 171143, + 171086, + 171153, + 171082, + 165146, + 165065, + 171060, + 165165, + 171178, + 165167, + 171158, + 171082, + 165058, + 166077, + 165976, + 171156, + 171219, + 171114, + 165116, + 171115, + 171086, + 171238, + 171179, + 171109, + 165254, + 171209, + 171142, + 165194, + 166101, + 165153, + 165077, + 166068, + 165229, + 171142, + 171076, + 171235, + 165214, + 166017, + 172151, + 171176, + 165186, + 165121, + 165144, + 171105, + 171188, + 165157, + 165133, + 165017, + 172000, + 165183, + 171180, + 165161, + 171185, + 165199, + 165087, + 171144, + 165146, + 165109, + 171107, + 171148, + 171137, + 171146, + 165139, + 171179, + 165177, + 165189, + 171221, + 171146, + 165168, + 171198, + 171198, + 165245, + 165139, + 171171, + 165159, + 165229, + 166049, + 165193, + 165153, + 171160, + 165164, + 171195, + 170111, + 170167, + 165151, + 165169, + 165197, + 170278, + 170162, + 165158, + 170149, + 165215, + 170130, + 170208, + 165170, + 165165, + 165218, + 165175, + 165160, + 165169, + 165132, + 170253, + 165116, + 165149, + 170176, + 165175, + 166032, + 165211, + 165222, + 170169, + 170171, + 170248, + 170160, + 170286, + 165212, + 170227, + 165114, + 165124, + 170182, + 170436, + 165182, + 166076, + 170973, + 165175, + 170220, + 170163, + 165102, + 165143, + 165142, + 165197, + 170215, + 165107, + 170144, + 170147, + 165272, + 165210, + 165243, + 171011, + 170205, + 165189, + 170178, + 170222, + 170239, + 165202, + 170210, + 165229, + 170172, + 170108, + 170281, + 170199, + 170220, + 170304, + 165180, + 170140, + 165199, + 171099, + 171068, + 165971, + 165178, + 170230, + 165226, + 170136, + 170102, + 170226, + 165213, + 170213, + 165140, + 165130, + 170137 + ], + "sample_count": 1264 + }, + { + "pubkey": "4WHFLCdbSdN6yvmKHfj6wWDjJjMXzuXRfhLNzBnKjgXr", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242241000000, + "samples": [ + 156272, + 156267, + 156257, + 156265, + 156304, + 156332, + 156242, + 156270, + 156301, + 156235, + 156428, + 156297, + 156245, + 156247, + 156246, + 156227, + 156229, + 156267, + 156277, + 156238, + 156364, + 156288, + 156281, + 156277, + 156287, + 156280, + 156237, + 156283, + 156319, + 156281, + 156296, + 156387, + 156407, + 156351, + 156379, + 156436, + 156362, + 156424, + 156357, + 156356, + 156379, + 156252, + 156279, + 156277, + 156311, + 156270, + 158147, + 156248, + 156277, + 156240, + 156370, + 156306, + 156273, + 156250, + 156271, + 156258, + 156268, + 156301, + 156242, + 156240, + 156285, + 156249, + 156286, + 156249, + 156337, + 156333, + 156276, + 156371, + 156303, + 156318, + 156283, + 156305, + 156307, + 156283, + 156294, + 156264, + 156483, + 156296, + 156264, + 156240, + 156492, + 156564, + 157116, + 156259, + 156360, + 156343, + 156358, + 156346, + 156249, + 156313, + 156428, + 156295, + 156227, + 156294, + 156250, + 156363, + 156273, + 156318, + 156365, + 156262, + 157862, + 156626, + 156972, + 157946, + 158038, + 158268, + 158545, + 158121, + 157756, + 156401, + 156343, + 156293, + 156280, + 156518, + 156484, + 156435, + 156351, + 156393, + 157080, + 156325, + 157817, + 157991, + 156333, + 156302, + 156380, + 157492, + 158086, + 156421, + 156259, + 156276, + 156308, + 156240, + 156298, + 156248, + 156268, + 156322, + 156297, + 156283, + 156254, + 156257, + 156329, + 157598, + 156347, + 156373, + 156313, + 156341, + 156335, + 156361, + 156316, + 156276, + 156235, + 156682, + 156263, + 156236, + 156374, + 156456, + 156412, + 156379, + 156290, + 156286, + 156286, + 156283, + 156241, + 156356, + 156399, + 156347, + 157291, + 158385, + 158372, + 157301, + 156552, + 156742, + 156332, + 156315, + 156307, + 156394, + 156314, + 156352, + 156285, + 156272, + 156303, + 156361, + 156361, + 156355, + 156403, + 156423, + 156294, + 156342, + 156279, + 156262, + 156262, + 156226, + 156243, + 156328, + 156383, + 156350, + 156333, + 156320, + 156420, + 156314, + 156357, + 156207, + 156358, + 156354, + 156356, + 156322, + 156343, + 156307, + 156676, + 156268, + 156367, + 156294, + 156294, + 156372, + 156371, + 156450, + 156403, + 156351, + 156260, + 156292, + 156392, + 156325, + 156316, + 156377, + 156289, + 156358, + 156357, + 156370, + 156290, + 156302, + 156403, + 156343, + 156356, + 156296, + 156314, + 156335, + 156304, + 156287, + 156308, + 156325, + 156309, + 156307, + 156352, + 156307, + 156333, + 156420, + 156306, + 156290, + 156318, + 156326, + 156317, + 156356, + 156324, + 156300, + 156332, + 156372, + 156312, + 156326, + 156313, + 156354, + 156444, + 156344, + 156313, + 156326, + 156354, + 156355, + 156338, + 156287, + 156271, + 156315, + 156333, + 156385, + 156273, + 156310, + 156327, + 156372, + 156335, + 156319, + 156304, + 156321, + 156342, + 156343, + 156285, + 156323, + 156308, + 156347, + 156359, + 156319, + 156335, + 156340, + 156406, + 156321, + 156298, + 156351, + 156328, + 156277, + 156337, + 156323, + 156336, + 156280, + 156316, + 156307, + 156340, + 156338, + 156299, + 156449, + 156309, + 156314, + 156349, + 156325, + 156328, + 156281, + 156327, + 156303, + 156281, + 156342, + 156320, + 156361, + 156320, + 156334, + 156430, + 156336, + 156290, + 156354, + 156353, + 156348, + 156339, + 156313, + 156320, + 156362, + 156339, + 156277, + 156272, + 156312, + 156306, + 156434, + 156368, + 156383, + 156302, + 156321, + 156301, + 156322, + 156289, + 156281, + 156322, + 156323, + 156319, + 156293, + 156365, + 156304, + 156442, + 156330, + 156315, + 156328, + 156273, + 156348, + 156378, + 156314, + 156324, + 156302, + 156299, + 156353, + 156314, + 156361, + 156320, + 156415, + 156295, + 156331, + 156295, + 156264, + 156329, + 156338, + 156325, + 156350, + 156315, + 156294, + 156352, + 156339, + 156313, + 156313, + 156391, + 156318, + 156360, + 156307, + 156326, + 156354, + 156283, + 156316, + 156353, + 156347, + 156320, + 156282, + 156351, + 156337, + 156294, + 156434, + 156320, + 156371, + 156371, + 156315, + 156313, + 156307, + 156324, + 156288, + 156350, + 156316, + 156336, + 156331, + 156269, + 156293, + 156434, + 156299, + 156310, + 156282, + 156265, + 156342, + 156350, + 156323, + 156341, + 156344, + 156351, + 156291, + 156348, + 156313, + 156321, + 156385, + 156294, + 156355, + 156320, + 156313, + 156328, + 156344, + 156267, + 156302, + 156307, + 156353, + 156334, + 156322, + 156279, + 156325, + 156430, + 156321, + 156356, + 156369, + 156374, + 156296, + 156327, + 156305, + 156344, + 156294, + 156330, + 156298, + 156272, + 156353, + 156347, + 156454, + 156325, + 156314, + 156334, + 156308, + 156300, + 156361, + 156356, + 156338, + 156354, + 156309, + 156341, + 156352, + 156324, + 156356, + 156472, + 156271, + 156283, + 156334, + 156317, + 156378, + 156314, + 156301, + 156311, + 156300, + 156319, + 156368, + 156275, + 156282, + 156300, + 156385, + 156356, + 156396, + 156273, + 156351, + 156362, + 156395, + 156307, + 156361, + 156322, + 156329, + 156333, + 156328, + 156332, + 156319, + 156437, + 156341, + 156328, + 156324, + 156346, + 156317, + 156291, + 156378, + 156364, + 156363, + 156363, + 156354, + 156313, + 156322, + 156307, + 156388, + 156313, + 156361, + 156304, + 156308, + 156354, + 156330, + 156287, + 156380, + 156290, + 156332, + 156351, + 156330, + 156328, + 156313, + 156387, + 156325, + 156350, + 156405, + 156311, + 156374, + 156321, + 156301, + 156346, + 156265, + 156331, + 156345, + 156328, + 156357, + 156323, + 156426, + 156312, + 156323, + 156349, + 156313, + 156295, + 156354, + 156284, + 156355, + 156270, + 156376, + 156301, + 156264, + 156330, + 156330, + 156422, + 156370, + 156339, + 156337, + 156342, + 156277, + 156308, + 156307, + 156333, + 156348, + 156364, + 156327, + 156341, + 156355, + 156322, + 156438, + 156348, + 156311, + 156278, + 156320, + 156335, + 156322, + 156334, + 156316, + 156309, + 156392, + 156290, + 156344, + 156337, + 156322, + 156435, + 156320, + 156349, + 156376, + 156304, + 156380, + 156358, + 156335, + 156320, + 156360, + 156309, + 156369, + 156352, + 156378, + 156346, + 156385, + 156298, + 156395, + 156336, + 156363, + 156333, + 156370, + 156304, + 156314, + 156374, + 156397, + 156417, + 156313, + 156334, + 156339, + 156452, + 156291, + 156318, + 156314, + 156366, + 156367, + 156366, + 156370, + 156241, + 156351, + 156357, + 156365, + 156383, + 156323, + 156324, + 156451, + 156331, + 156390, + 156332, + 156365, + 156367, + 159541, + 155907, + 155936, + 155858, + 155903, + 155829, + 155910, + 155903, + 155928, + 155993, + 155924, + 155883, + 155944, + 155963, + 155918, + 155898, + 155939, + 155939, + 155974, + 155889, + 155876, + 155957, + 155828, + 155910, + 155973, + 155989, + 155898, + 155875, + 155892, + 155938, + 155951, + 155963, + 155951, + 155974, + 155865, + 155914, + 155907, + 155943, + 155960, + 155966, + 155935, + 156080, + 156084, + 156078, + 156070, + 156080, + 156060, + 156029, + 156111, + 155951, + 156069, + 156107, + 156083, + 156017, + 156171, + 156078, + 156079, + 155923, + 155991, + 156089, + 156040, + 156092, + 156016, + 156065, + 156094, + 156071, + 156063, + 156106, + 155971, + 156180, + 156117, + 156083, + 156039, + 156057, + 156065, + 155900, + 155916, + 156074, + 156057, + 156092, + 156109, + 156026, + 155934, + 156130, + 156106, + 156107, + 155937, + 156073, + 156036, + 156102, + 156082, + 156048, + 156092, + 156131, + 156084, + 156105, + 156069, + 156103, + 155974, + 156018, + 156172, + 156094, + 156067, + 156099, + 156050, + 156099, + 156007, + 156020, + 156071, + 156129, + 156091, + 156057, + 155979, + 156075, + 156013, + 155951, + 156088, + 156062, + 156095, + 156115, + 156081, + 156055, + 156028, + 156100, + 156068, + 156106, + 157307, + 156082, + 156110, + 156161, + 156110, + 156133, + 156045, + 156059, + 156134, + 156081, + 156060, + 156100, + 157590, + 156023, + 156072, + 157861, + 156091, + 156114, + 156123, + 156121, + 156115, + 156035, + 156110, + 156028, + 156073, + 156093, + 156059, + 156090, + 156057, + 156035, + 156093, + 156042, + 157237, + 156154, + 158340, + 157716, + 156084, + 156062, + 156099, + 156029, + 156013, + 156124, + 156065, + 156116, + 156107, + 156062, + 156082, + 156095, + 156160, + 156067, + 156084, + 156104, + 156081, + 156102, + 156060, + 156085, + 156098, + 156056, + 156099, + 156072, + 158222, + 156106, + 156098, + 156192, + 158243, + 156101, + 158072, + 156090, + 156094, + 156085, + 156074, + 156062, + 156102, + 156123, + 156062, + 156089, + 156030, + 155933, + 157092, + 156039, + 156109, + 156115, + 155967, + 156903, + 156078, + 156100, + 156085, + 156055, + 156119, + 156117, + 156081, + 156080, + 156121, + 156211, + 156086, + 156051, + 156084, + 156081, + 156078, + 156101, + 156038, + 156065, + 156025, + 156119, + 156072, + 156070, + 156020, + 156093, + 156161, + 156122, + 156080, + 155956, + 156053, + 156064, + 156052, + 156073, + 156082, + 156056, + 156076, + 156077, + 156087, + 156049, + 156043, + 156204, + 156073, + 156104, + 156066, + 158250, + 156049, + 156073, + 156026, + 156077, + 156063, + 156041, + 156079, + 156139, + 156056, + 156021, + 156107, + 156082, + 156036, + 156100, + 156148, + 156044, + 156025, + 156113, + 155995, + 156074, + 156078, + 156070, + 155972, + 156078, + 156107, + 156061, + 155928, + 156076, + 156067, + 156171, + 156011, + 155892, + 156122, + 156033, + 156110, + 156042, + 156097, + 156095, + 156123, + 156055, + 156058, + 156096, + 156076, + 156049, + 156078, + 156086, + 156091, + 155985, + 155939, + 156067, + 156026, + 156010, + 156101, + 156093, + 156068, + 156075, + 156079, + 156069, + 155912, + 155995, + 155945, + 156046, + 155885, + 156072, + 156089, + 156032, + 156099, + 156142, + 155929, + 156023, + 155942, + 156092, + 156062, + 155986, + 156117, + 156107, + 156053, + 156089, + 155823, + 155965, + 156069, + 156099, + 156120, + 156080, + 156098, + 156073, + 156090, + 156009, + 156068, + 156131, + 156049, + 156076, + 156036, + 156067, + 156056, + 156058, + 156077, + 156072, + 156092, + 156098, + 156072, + 156149, + 156074, + 156099, + 156163, + 156058, + 155891, + 155940, + 156105, + 156069, + 156035, + 156100, + 156079, + 156057, + 156069, + 156021, + 156062, + 156024, + 156085, + 156136, + 156072, + 156071, + 156066, + 156087, + 156106, + 156076, + 156113, + 155823, + 156073, + 156062, + 156098, + 156060, + 156059, + 156095, + 156119, + 156052, + 155850, + 156102, + 156081, + 156039, + 156048, + 156088, + 156092, + 156033, + 155889, + 155931, + 156098, + 156056, + 156038, + 156105, + 156114, + 155878, + 156041, + 156098, + 156037, + 156094, + 156040, + 156133, + 156079, + 156051, + 156034, + 156024, + 156076, + 156017, + 156096, + 156023, + 156038, + 156114, + 155878, + 156060, + 156091, + 156057, + 156133, + 156116, + 156096, + 156042, + 156077, + 156086, + 156062, + 156181, + 156058, + 156089, + 156082, + 155859, + 156039, + 155843, + 155929, + 155916, + 156038, + 156078, + 156030, + 156076, + 156082, + 156070, + 156200, + 156095, + 156034, + 156049, + 156096, + 156085, + 156060, + 156042, + 156143, + 156020, + 156094, + 156050, + 156005, + 156059, + 156089, + 156182, + 156010, + 156048, + 156058, + 156038, + 156044, + 156080, + 156082, + 156161, + 155885, + 155921, + 156050, + 156026, + 156117, + 156062, + 156157, + 156059, + 156059, + 156075, + 156090, + 156061, + 156082, + 156096, + 156168, + 155935, + 156076, + 156066, + 155929, + 156058, + 156042, + 156129, + 156071, + 155948, + 155860, + 155906, + 156111, + 156075, + 156034, + 156166, + 156085, + 156096, + 156006, + 156081, + 156090, + 155841, + 156138, + 156068, + 156095, + 156048, + 155947, + 156073, + 156061, + 156088, + 156178, + 156096, + 156067, + 156094, + 156036, + 156079, + 156099, + 156196, + 156082, + 156108, + 156061, + 156056, + 156021, + 156086, + 156060, + 156011, + 156024, + 156062, + 156098, + 155887, + 155890, + 156046, + 156172, + 156042, + 156093, + 156127, + 156078, + 156066, + 156115, + 156112, + 156080, + 156062, + 156110, + 155967, + 156104, + 156085, + 156109, + 156147, + 156080, + 156075, + 156029, + 156065, + 156054, + 156093, + 156027, + 156069, + 156117, + 156101, + 156099, + 155908, + 156029, + 156098, + 156135, + 156097, + 156084, + 156088, + 156069, + 156103, + 156075, + 156061, + 156145, + 156037, + 155879, + 156048, + 155894, + 155875, + 156042, + 156198, + 156073, + 156080, + 156119, + 156100, + 156064, + 156056, + 156092, + 156160, + 156046, + 156014, + 156021, + 156062, + 155924, + 156136, + 156152, + 156097, + 156071, + 156056, + 156100, + 156048, + 156117, + 156035, + 156048, + 156116, + 156129, + 156068, + 156089, + 156082, + 155995, + 156172, + 155901, + 155878, + 155874, + 156077, + 156076, + 156054, + 156030, + 156053, + 156060, + 156103, + 155957, + 156050, + 156093, + 156068 + ], + "sample_count": 1269 + }, + { + "pubkey": "HdyDqSbtbYwEKyXwenvF5zqV8VGMDayj19GyQJMkdgCd", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242237000000, + "samples": [ + 160963, + 160898, + 160942, + 160924, + 160926, + 160832, + 160966, + 160960, + 160966, + 160962, + 160911, + 160913, + 160937, + 160934, + 160968, + 160934, + 160956, + 160970, + 160919, + 160943, + 160836, + 160943, + 160952, + 160997, + 160968, + 160882, + 160934, + 160909, + 160954, + 160918, + 160911, + 160924, + 160992, + 160917, + 160943, + 160918, + 160940, + 160959, + 160979, + 160891, + 160924, + 160951, + 160882, + 160955, + 160961, + 160948, + 160903, + 160876, + 160923, + 160931, + 160841, + 160965, + 160921, + 160969, + 160848, + 160966, + 160930, + 160991, + 160919, + 160916, + 160943, + 160902, + 160940, + 160918, + 160942, + 160865, + 160973, + 161072, + 160926, + 160935, + 160925, + 160965, + 160911, + 160952, + 160931, + 161015, + 160898, + 160966, + 160951, + 160952, + 160878, + 160896, + 160926, + 160915, + 160917, + 160972, + 160938, + 160993, + 160929, + 160919, + 160993, + 160970, + 161010, + 160919, + 160972, + 160954, + 160941, + 160985, + 160990, + 160994, + 160911, + 160995, + 160958, + 160928, + 160978, + 160904, + 160921, + 160966, + 161076, + 160997, + 160880, + 160988, + 160954, + 160897, + 160960, + 160919, + 160892, + 160988, + 160985, + 160873, + 160976, + 160993, + 160933, + 160953, + 160947, + 160972, + 160925, + 160924, + 160888, + 160933, + 160942, + 160945, + 160929, + 160902, + 160927, + 160947, + 160938, + 160975, + 160983, + 160933, + 160980, + 160921, + 160900, + 160978, + 160986, + 160957, + 160920, + 160977, + 160932, + 160957, + 160932, + 160992, + 160853, + 160935, + 160917, + 160843, + 160952, + 160949, + 160851, + 160901, + 160927, + 160967, + 160976, + 160957, + 160976, + 161030, + 160984, + 160915, + 160918, + 160982, + 160904, + 161014, + 160874, + 160982, + 160966, + 160951, + 160924, + 160935, + 160978, + 160976, + 160893, + 160949, + 160944, + 160947, + 160962, + 160934, + 160978, + 160991, + 162777, + 160915, + 160946, + 160906, + 160958, + 160924, + 160929, + 160934, + 160948, + 160995, + 160963, + 160935, + 160849, + 160956, + 160981, + 160925, + 160905, + 160966, + 160902, + 160977, + 160985, + 160915, + 160979, + 160905, + 160960, + 160900, + 160939, + 160760, + 160981, + 160936, + 160952, + 160919, + 160949, + 160913, + 160888, + 160969, + 160948, + 160902, + 160898, + 160865, + 160972, + 160912, + 160750, + 160896, + 160983, + 160947, + 160904, + 160886, + 160910, + 160926, + 160960, + 160953, + 160948, + 160936, + 160929, + 160937, + 160925, + 160822, + 160889, + 160922, + 160916, + 160927, + 160928, + 160932, + 160866, + 160968, + 160932, + 160882, + 160910, + 160929, + 160926, + 160939, + 160861, + 160923, + 160920, + 160918, + 160944, + 160912, + 160906, + 160911, + 160921, + 160897, + 160929, + 160937, + 160957, + 160945, + 160915, + 160952, + 160876, + 160903, + 160858, + 160888, + 160932, + 160945, + 160925, + 160920, + 160924, + 160935, + 160922, + 160979, + 160907, + 160937, + 160935, + 160927, + 160918, + 160907, + 160912, + 160922, + 160912, + 160862, + 160966, + 160925, + 160920, + 160924, + 160923, + 160938, + 160936, + 160842, + 160944, + 160989, + 160949, + 160975, + 160802, + 160955, + 160898, + 160940, + 160947, + 160939, + 160948, + 160936, + 160916, + 160950, + 160919, + 160952, + 160900, + 160896, + 160935, + 160914, + 160965, + 160954, + 160935, + 160897, + 160911, + 160892, + 160909, + 160926, + 160901, + 160939, + 160976, + 160981, + 160914, + 160901, + 160914, + 160918, + 160961, + 160857, + 160947, + 160930, + 160946, + 160954, + 160957, + 160920, + 160895, + 160894, + 160937, + 160931, + 160935, + 160910, + 160890, + 160970, + 160968, + 160967, + 160941, + 160987, + 160893, + 160927, + 160952, + 160885, + 160964, + 160930, + 160947, + 160921, + 160940, + 160891, + 160833, + 160948, + 160889, + 160961, + 160893, + 160919, + 160961, + 160928, + 160841, + 160970, + 160912, + 160952, + 160896, + 160939, + 160934, + 160967, + 160974, + 160922, + 160920, + 160987, + 160932, + 160930, + 160966, + 160879, + 160903, + 160887, + 160938, + 160963, + 160950, + 160952, + 160950, + 160893, + 160964, + 160906, + 160999, + 160956, + 160929, + 160932, + 160859, + 160945, + 160926, + 160972, + 160929, + 160946, + 160968, + 160963, + 161001, + 160928, + 160949, + 160896, + 160961, + 160914, + 160998, + 160941, + 160914, + 160896, + 160923, + 160964, + 160912, + 160922, + 160957, + 160932, + 160868, + 160938, + 160931, + 160933, + 160912, + 160872, + 160893, + 160899, + 160944, + 160923, + 160951, + 160972, + 160941, + 160956, + 160915, + 160917, + 160973, + 160921, + 160931, + 160897, + 160890, + 160889, + 160935, + 160936, + 160957, + 160973, + 160930, + 161001, + 160920, + 160912, + 160956, + 160930, + 161006, + 160944, + 160948, + 160970, + 160969, + 160919, + 160915, + 160932, + 160979, + 160929, + 160909, + 160928, + 160933, + 160980, + 160930, + 160935, + 160915, + 160876, + 160926, + 160874, + 160978, + 160953, + 160916, + 160911, + 160951, + 160935, + 160943, + 160970, + 160985, + 160974, + 160918, + 160890, + 160965, + 160926, + 160952, + 160901, + 160912, + 160864, + 160892, + 160964, + 160919, + 161002, + 160922, + 160937, + 160927, + 160907, + 160979, + 160939, + 160971, + 160811, + 160976, + 160922, + 160976, + 160950, + 160977, + 160898, + 160959, + 160876, + 160947, + 160913, + 160951, + 160927, + 160988, + 160925, + 160821, + 160973, + 160949, + 160900, + 160934, + 160957, + 160946, + 160927, + 160936, + 160962, + 160972, + 160907, + 160892, + 160947, + 161004, + 160864, + 160893, + 160956, + 160937, + 160936, + 160820, + 160945, + 160893, + 160932, + 160937, + 160934, + 160960, + 160867, + 160903, + 160926, + 160816, + 160955, + 160985, + 160903, + 160898, + 160868, + 160904, + 160878, + 160984, + 160985, + 160943, + 161045, + 160944, + 160993, + 160927, + 160897, + 160921, + 160949, + 160983, + 160912, + 160959, + 160906, + 160982, + 160988, + 160977, + 160962, + 160973, + 160892, + 160934, + 160970, + 160817, + 160929, + 160947, + 160954, + 160952, + 160955, + 160916, + 160916, + 160908, + 160899, + 160901, + 160964, + 160984, + 160879, + 160981, + 160833, + 160947, + 160954, + 160946, + 160962, + 160905, + 160932, + 160946, + 160917, + 160994, + 160911, + 160929, + 160928, + 160972, + 160925, + 160828, + 160922, + 160962, + 160892, + 160930, + 160856, + 160901, + 160990, + 160870, + 160969, + 160980, + 160960, + 160943, + 160916, + 160913, + 160903, + 160946, + 160918, + 160908, + 160949, + 160954, + 162934, + 162888, + 162922, + 162927, + 162939, + 162932, + 162948, + 162920, + 162935, + 162859, + 162938, + 162936, + 162920, + 162944, + 162917, + 162901, + 162898, + 162916, + 162923, + 162893, + 162932, + 162960, + 162952, + 162999, + 162831, + 162914, + 162914, + 162931, + 162934, + 162932, + 162943, + 162934, + 162908, + 162897, + 162961, + 162934, + 162976, + 162943, + 162939, + 162942, + 162925, + 162983, + 162955, + 162954, + 162923, + 162904, + 162955, + 162994, + 163008, + 162938, + 162945, + 162915, + 162999, + 162898, + 162857, + 162918, + 162915, + 162965, + 162953, + 162904, + 162959, + 162922, + 162926, + 162911, + 162929, + 162981, + 162926, + 162942, + 162921, + 162886, + 162925, + 162929, + 162956, + 162940, + 162930, + 162936, + 163021, + 162949, + 162931, + 162982, + 162910, + 162960, + 162949, + 162911, + 162833, + 162944, + 162945, + 162925, + 162959, + 162949, + 162912, + 162874, + 162933, + 162943, + 162896, + 162924, + 162960, + 162949, + 162920, + 162785, + 162935, + 162911, + 162938, + 162907, + 162947, + 162980, + 162841, + 162946, + 162910, + 162959, + 162950, + 162937, + 162936, + 162972, + 162801, + 162927, + 162930, + 162952, + 162901, + 162872, + 162881, + 162928, + 162945, + 162958, + 162958, + 162944, + 162930, + 162962, + 162971, + 162867, + 162956, + 162979, + 162924, + 162984, + 162972, + 162946, + 162972, + 162923, + 162952, + 162964, + 162951, + 162927, + 162919, + 162923, + 162816, + 162931, + 162987, + 162958, + 162940, + 162947, + 162987, + 162964, + 162915, + 162997, + 162959, + 162957, + 162943, + 162922, + 162932, + 162989, + 162963, + 162921, + 162958, + 162906, + 162984, + 162898, + 162980, + 162936, + 162918, + 162925, + 162958, + 163034, + 162935, + 162821, + 162872, + 162892, + 162975, + 162948, + 163007, + 162983, + 162928, + 163003, + 162973, + 162970, + 163010, + 162974, + 162931, + 162965, + 162911, + 163003, + 162931, + 162936, + 162925, + 162964, + 162965, + 162855, + 162992, + 162925, + 162945, + 162926, + 162982, + 162986, + 162949, + 162955, + 162881, + 162922, + 162920, + 162971, + 162919, + 163003, + 162917, + 163003, + 162951, + 162944, + 162888, + 162933, + 162951, + 162926, + 162991, + 162983, + 162992, + 162950, + 162942, + 162975, + 162986, + 163032, + 162953, + 163004, + 162969, + 163021, + 162971, + 162928, + 162913, + 163045, + 162918, + 162991, + 162932, + 162967, + 162949, + 162975, + 162902, + 162989, + 162963, + 162939, + 162896, + 162893, + 162973, + 162973, + 162948, + 162997, + 163003, + 162931, + 162912, + 162930, + 162918, + 162950, + 162907, + 162904, + 162949, + 162901, + 162853, + 162835, + 162905, + 162946, + 162920, + 162919, + 162929, + 162929, + 162960, + 162965, + 162950, + 162901, + 162960, + 162906, + 162972, + 162972, + 162908, + 162926, + 162898, + 162955, + 162910, + 162952, + 162878, + 162932, + 162917, + 162930, + 162920, + 162898, + 162922, + 162867, + 162941, + 162830, + 162909, + 162932, + 162952, + 162976, + 162949, + 162979, + 162951, + 162896, + 162846, + 162928, + 162911, + 162884, + 162938, + 162937, + 162849, + 162957, + 162941, + 162938, + 162939, + 162919, + 162931, + 162959, + 162926, + 162907, + 162897, + 162949, + 162957, + 162935, + 162964, + 162898, + 162895, + 162947, + 162791, + 162937, + 162919, + 162897, + 162982, + 162964, + 162944, + 162944, + 162876, + 162857, + 162951, + 162896, + 162855, + 162940, + 162948, + 162886, + 162912, + 162915, + 162908, + 162948, + 162949, + 162889, + 162920, + 162913, + 162979, + 162921, + 162860, + 162836, + 162932, + 162849, + 162949, + 162922, + 162927, + 162925, + 162947, + 162908, + 162942, + 162999, + 162951, + 162805, + 162949, + 162934, + 162827, + 162933, + 162915, + 162913, + 162934, + 162948, + 162960, + 162971, + 162918, + 162954, + 162933, + 162946, + 162981, + 162922, + 162970, + 162784, + 162931, + 162921, + 162955, + 162942, + 162936, + 162953, + 162852, + 162938, + 162972, + 162903, + 162888, + 162776, + 163007, + 162902, + 162835, + 162993, + 162960, + 162880, + 162936, + 162955, + 162972, + 162924, + 162951, + 162940, + 162917, + 162968, + 162928, + 162914, + 162954, + 162848, + 162960, + 162901, + 162902, + 162891, + 162995, + 162853, + 162962, + 162982, + 162957, + 162907, + 162949, + 162925, + 162916, + 162925, + 162827, + 162965, + 162875, + 162998, + 162913, + 162965, + 162928, + 162973, + 162897, + 162964, + 162956, + 162949, + 162957, + 162850, + 162996, + 162803, + 162933, + 162920, + 162913, + 162947, + 162932, + 162944, + 162869, + 162937, + 162978, + 162932, + 162960, + 162882, + 162999, + 162993, + 162747, + 162894, + 162968, + 162905, + 162995, + 162957, + 162860, + 162925, + 162916, + 162922, + 162963, + 162882, + 162873, + 162923, + 162906, + 162836, + 162916, + 162884, + 162948, + 162922, + 162943, + 162925, + 162902, + 162929, + 162899, + 162984, + 162940, + 162838, + 162887, + 162940, + 162873, + 162863, + 162877, + 162951, + 162919, + 162953, + 162897, + 162921, + 162925, + 162966, + 162917, + 162915, + 162901, + 162947, + 162895, + 162878, + 162910, + 162934, + 162931, + 162957, + 162928, + 162891, + 162981, + 162890, + 162886, + 162895, + 162857, + 162858, + 162923, + 162906, + 162830, + 162893, + 162910, + 162870, + 162873, + 162942, + 162912, + 162882, + 162966, + 162942, + 162918, + 162935, + 162922, + 162834, + 162916, + 162934, + 162908, + 162879, + 160905, + 160975, + 160965, + 160963, + 160999, + 160974, + 161013, + 160930, + 160982, + 160990, + 160957, + 160964, + 160996, + 160933, + 160933, + 160931, + 161003, + 160993, + 160905, + 161002, + 161007, + 160968, + 161019, + 160942, + 160996, + 160956, + 160961, + 160926, + 161006, + 160921, + 160967, + 161030, + 160957, + 160975, + 160948, + 160958, + 160967, + 160932, + 160947, + 160902, + 160888, + 160963, + 160918, + 160957, + 161006, + 160951, + 160998, + 160988, + 160902, + 160969, + 160908, + 160992, + 160915, + 160986, + 160987, + 160985, + 160976, + 160910, + 160960, + 160949, + 160974, + 160999, + 160923, + 160933, + 160981, + 160928, + 160962, + 161001, + 161012, + 160969, + 160945, + 161012, + 160865, + 160935, + 160988, + 160971, + 161014, + 160969, + 160997, + 160931, + 160933, + 160982, + 161007, + 160967, + 160874, + 160948, + 160982 + ], + "sample_count": 1262 + }, + { + "pubkey": "53BwV6QcgG5CkbmSCNAgmGSF1cdYHJ16azouEynUiwpb", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "target_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242244000000, + "samples": [ + 132453, + 132269, + 132461, + 132446, + 132382, + 132214, + 132396, + 132359, + 132560, + 132477, + 132329, + 132546, + 132311, + 132289, + 132319, + 132302, + 132407, + 132371, + 132463, + 132435, + 132225, + 132502, + 132477, + 132450, + 132299, + 132367, + 132230, + 132479, + 132239, + 132539, + 132268, + 132394, + 132367, + 132280, + 132382, + 132186, + 132282, + 132264, + 132255, + 132346, + 132370, + 132241, + 132323, + 132242, + 132334, + 132310, + 132417, + 132328, + 132411, + 132359, + 132360, + 132343, + 132393, + 132443, + 132360, + 132379, + 132353, + 132221, + 132470, + 132162, + 132463, + 132436, + 132495, + 132480, + 132267, + 132302, + 132497, + 132527, + 132495, + 132473, + 132438, + 132351, + 132272, + 132502, + 132460, + 132273, + 132569, + 132581, + 132382, + 132245, + 132329, + 132430, + 132551, + 132245, + 132421, + 132365, + 132564, + 132338, + 132523, + 132451, + 132470, + 132296, + 132344, + 132314, + 132443, + 132454, + 132511, + 132525, + 132524, + 132282, + 132477, + 132433, + 132467, + 132518, + 132458, + 132498, + 132238, + 132413, + 132400, + 132436, + 132400, + 132310, + 132501, + 132212, + 132278, + 132323, + 132426, + 132332, + 132333, + 132324, + 132335, + 132500, + 132352, + 132410, + 132501, + 132385, + 132329, + 132496, + 132162, + 132237, + 132332, + 132475, + 132326, + 132246, + 132503, + 132291, + 132379, + 132408, + 132235, + 132385, + 132242, + 132389, + 132293, + 132447, + 132252, + 132289, + 132234, + 132409, + 132556, + 132289, + 132293, + 132328, + 132341, + 132188, + 132308, + 132371, + 132473, + 132454, + 132326, + 132430, + 132334, + 132409, + 132477, + 132397, + 132197, + 132390, + 132448, + 132495, + 132364, + 132475, + 132332, + 132493, + 132241, + 132478, + 132309, + 132417, + 132420, + 132401, + 132454, + 132372, + 132437, + 132504, + 132290, + 132463, + 132230, + 132308, + 132374, + 132318, + 132271, + 132372, + 132322, + 132202, + 132401, + 132343, + 132409, + 132330, + 132219, + 132354, + 132320, + 132303, + 132420, + 132411, + 132296, + 132276, + 132355, + 132449, + 132295, + 132462, + 132473, + 132316, + 132173, + 132239, + 132271, + 132421, + 132528, + 132432, + 132343, + 132505, + 132205, + 132311, + 132306, + 132393, + 132318, + 132290, + 132343, + 132437, + 132243, + 132457, + 132401, + 132497, + 132181, + 132217, + 132473, + 132259, + 132413, + 132374, + 132185, + 132451, + 132372, + 132519, + 132411, + 132451, + 132312, + 132249, + 132310, + 132372, + 132422, + 132511, + 132484, + 132561, + 132480, + 132422, + 132134, + 132333, + 132420, + 132322, + 132392, + 132433, + 132459, + 132413, + 132407, + 132421, + 132386, + 132312, + 132327, + 132383, + 132445, + 132252, + 132328, + 132492, + 132530, + 132434, + 132361, + 132286, + 132424, + 132243, + 132449, + 132304, + 132400, + 132461, + 132313, + 132299, + 132457, + 132394, + 132453, + 132227, + 132451, + 132424, + 132379, + 132473, + 132459, + 132347, + 132483, + 132503, + 132372, + 132106, + 132299, + 132348, + 132442, + 132479, + 132310, + 132389, + 132324, + 132465, + 132400, + 132430, + 132432, + 132351, + 132303, + 132283, + 132536, + 132437, + 132273, + 132411, + 132309, + 132277, + 132138, + 132494, + 132316, + 132400, + 132254, + 132379, + 132473, + 132365, + 132440, + 132482, + 132400, + 132305, + 132495, + 132316, + 132442, + 132247, + 132235, + 132234, + 132324, + 132449, + 132161, + 132380, + 132337, + 132336, + 132461, + 132504, + 132331, + 132570, + 132454, + 132374, + 132160, + 132293, + 132523, + 132454, + 132370, + 132467, + 132508, + 132281, + 132406, + 132384, + 132304, + 132372, + 132282, + 132160, + 132280, + 132471, + 132400, + 132419, + 132418, + 132231, + 132201, + 132427, + 132479, + 132458, + 132351, + 132306, + 132349, + 132333, + 132224, + 132445, + 132454, + 132533, + 132306, + 132403, + 132304, + 132259, + 132475, + 132286, + 132497, + 132451, + 132422, + 132380, + 132219, + 132190, + 132460, + 132451, + 132533, + 132473, + 132432, + 132489, + 132320, + 132262, + 132350, + 132221, + 132422, + 132472, + 132378, + 132567, + 132329, + 132487, + 132406, + 132338, + 132473, + 132469, + 132456, + 132530, + 132523, + 132482, + 132437, + 132422, + 132400, + 132253, + 132267, + 132398, + 132268, + 132282, + 132485, + 132351, + 132383, + 132246, + 132294, + 132461, + 132502, + 132538, + 132216, + 132312, + 132330, + 132225, + 132508, + 132358, + 132509, + 132404, + 132252, + 132486, + 132285, + 132455, + 132426, + 132276, + 132374, + 132341, + 132326, + 132431, + 132477, + 132607, + 132286, + 132282, + 132506, + 132353, + 132506, + 132366, + 132526, + 132238, + 132307, + 132387, + 132450, + 132169, + 132539, + 132307, + 132465, + 132386, + 132461, + 132451, + 134335, + 132532, + 132450, + 132275, + 132345, + 132408, + 132521, + 132366, + 132378, + 132325, + 132505, + 132448, + 132291, + 132293, + 132469, + 132317, + 132350, + 132259, + 132457, + 132284, + 132489, + 132438, + 132324, + 132468, + 132441, + 132516, + 132508, + 132093, + 132321, + 132401, + 132320, + 132466, + 132273, + 132297, + 132424, + 132358, + 132190, + 132235, + 132386, + 132421, + 132270, + 132217, + 132336, + 132253, + 132432, + 132348, + 132582, + 132295, + 132307, + 132497, + 132319, + 132417, + 132239, + 132437, + 132490, + 132541, + 132548, + 132348, + 132403, + 132483, + 132212, + 132366, + 132359, + 132241, + 132337, + 132441, + 132502, + 132474, + 132395, + 132440, + 132482, + 132421, + 132286, + 132432, + 132348, + 132424, + 132271, + 132490, + 132261, + 132484, + 132292, + 132264, + 132323, + 132405, + 132480, + 132461, + 132379, + 132388, + 132460, + 132488, + 132426, + 132365, + 132395, + 132523, + 132375, + 132357, + 132531, + 132421, + 132520, + 132433, + 132504, + 132427, + 132439, + 132407, + 132443, + 132434, + 132516, + 132308, + 132466, + 132317, + 132378, + 132577, + 132401, + 132378, + 132421, + 132270, + 132380, + 132330, + 132401, + 132461, + 132388, + 132325, + 132311, + 132220, + 132237, + 132539, + 132383, + 132540, + 132321, + 132515, + 132281, + 132304, + 132328, + 132318, + 132373, + 132450, + 132552, + 132335, + 132192, + 132476, + 132598, + 132533, + 132282, + 132305, + 132516, + 132396, + 132492, + 132390, + 132460, + 132369, + 132374, + 132274, + 132369, + 132335, + 132335, + 132465, + 132446, + 132365, + 132356, + 132291, + 132212, + 132433, + 132485, + 132296, + 132193, + 132497, + 132458, + 132203, + 132365, + 132516, + 132214, + 132502, + 132405, + 132595, + 132338, + 132363, + 132433, + 132544, + 132203, + 132296, + 132385, + 132516, + 132323, + 132244, + 132302, + 132450, + 132368, + 132516, + 132347, + 132445, + 132423, + 132289, + 132312, + 132214, + 132313, + 132470, + 132437, + 132361, + 132309, + 132263, + 132290, + 132336, + 132176, + 132336, + 132409, + 132307, + 132315, + 132554, + 132351, + 132536, + 132518, + 132411, + 132292, + 132241, + 132512, + 132543, + 132386, + 132208, + 132292, + 132509, + 132282, + 132296, + 132185, + 132370, + 132304, + 132392, + 132442, + 132435, + 132270, + 132459, + 132401, + 132171, + 132400, + 132450, + 132494, + 132305, + 132360, + 132497, + 132434, + 132405, + 132387, + 132363, + 132242, + 132426, + 132247, + 132278, + 132467, + 132423, + 132472, + 132377, + 132461, + 132179, + 132363, + 132365, + 132284, + 132296, + 132407, + 132229, + 132229, + 132476, + 132456, + 132415, + 132270, + 132385, + 132457, + 132494, + 132235, + 132401, + 132374, + 132435, + 132309, + 132361, + 132333, + 132415, + 132292, + 132245, + 132308, + 132160, + 132127, + 132275, + 132250, + 132255, + 132356, + 132437, + 132358, + 132340, + 132347, + 132401, + 132137, + 132430, + 132458, + 132433, + 132467, + 132156, + 132564, + 132405, + 132468, + 132372, + 132251, + 132424, + 132192, + 132459, + 132222, + 132340, + 132280, + 132255, + 132479, + 132453, + 132364, + 132367, + 132287, + 132424, + 132284, + 132289, + 132277, + 132305, + 132421, + 132361, + 132455, + 132449, + 132446, + 132330, + 132335, + 132268, + 132333, + 132247, + 132350, + 132204, + 132302, + 132360, + 132442, + 132432, + 132435, + 132427, + 132400, + 132101, + 132209, + 132233, + 132294, + 132498, + 132416, + 132326, + 132489, + 132258, + 132204, + 132312, + 132525, + 132152, + 132262, + 132464, + 132382, + 132391, + 132458, + 132408, + 132221, + 132467, + 132219, + 132311, + 132287, + 132328, + 132374, + 132236, + 132243, + 132262, + 132299, + 132503, + 132326, + 132163, + 132469, + 132418, + 132345, + 132302, + 132300, + 132298, + 132429, + 132372, + 132467, + 132338, + 132466, + 132386, + 132229, + 132434, + 132466, + 132328, + 132426, + 132362, + 132217, + 132239, + 132332, + 132295, + 132237, + 132439, + 132349, + 132411, + 132373, + 132228, + 132332, + 132466, + 132251, + 132346, + 132306, + 132165, + 132445, + 132308, + 132189, + 132273, + 132348, + 132219, + 132466, + 132459, + 132391, + 132218, + 132340, + 132232, + 132488, + 132365, + 132203, + 132367, + 132424, + 132456, + 132450, + 132426, + 132213, + 132245, + 132208, + 132456, + 132384, + 132361, + 132514, + 132370, + 132271, + 132544, + 132421, + 132249, + 132367, + 132448, + 132332, + 132418, + 132362, + 132232, + 132229, + 132420, + 132298, + 132483, + 132364, + 132399, + 132306, + 132479, + 132353, + 132342, + 132414, + 132105, + 132176, + 132555, + 132374, + 132229, + 132435, + 132613, + 132280, + 132461, + 132339, + 132511, + 132425, + 132179, + 132396, + 132311, + 132274, + 132498, + 132466, + 132338, + 132464, + 132536, + 132452, + 132507, + 132413, + 132249, + 132344, + 132473, + 132347, + 132362, + 132273, + 132217, + 132213, + 132364, + 132199, + 132349, + 132304, + 132272, + 132118, + 132229, + 132413, + 132252, + 132299, + 132369, + 132216, + 132452, + 132432, + 132257, + 132207, + 132270, + 132506, + 132321, + 132227, + 132357, + 132451, + 132488, + 132380, + 132353, + 132400, + 132227, + 132475, + 132392, + 132498, + 132412, + 132210, + 132457, + 132426, + 132490, + 132543, + 132281, + 132470, + 132516, + 132174, + 132353, + 132434, + 132388, + 132386, + 132410, + 132304, + 132244, + 132393, + 132391, + 132388, + 132499, + 132344, + 132207, + 132302, + 132270, + 132369, + 132261, + 132493, + 132240, + 132138, + 132368, + 132288, + 132374, + 132259, + 132453, + 132518, + 132413, + 132453, + 132313, + 132410, + 132348, + 132280, + 132352, + 132319, + 132362, + 132270, + 132245, + 132232, + 132292, + 132412, + 132370, + 132341, + 132215, + 132384, + 132190, + 132333, + 132421, + 132444, + 132377, + 132552, + 132381, + 132332, + 132436, + 132486, + 132214, + 132203, + 132401, + 132425, + 132517, + 132404, + 132439, + 132249, + 132342, + 132532, + 132338, + 132256, + 132372, + 132466, + 132391, + 132431, + 132490, + 132461, + 132299, + 132515, + 132516, + 132480, + 132336, + 132202, + 132523, + 132255, + 132445, + 132431, + 132469, + 132465, + 132346, + 132351, + 132262, + 132236, + 132349, + 132296, + 132494, + 132362, + 132377, + 132392, + 132513, + 132484, + 132302, + 132320, + 132501, + 132401, + 132454, + 132342, + 132420, + 132208, + 132440, + 132448, + 132354, + 132438, + 132399, + 132483, + 132267, + 132282, + 132223, + 132553, + 132374, + 132190, + 132210, + 132438, + 132501, + 132463, + 132366, + 132310, + 132350, + 132313, + 132210, + 132287, + 132448, + 132312, + 132252, + 132480, + 132355, + 132330, + 132304, + 132348, + 132437, + 132340, + 132400, + 132244, + 132272, + 132276, + 132557, + 132455, + 132401, + 132201, + 132392, + 132454, + 132428, + 132199, + 132265, + 132215, + 132281, + 132383, + 132361, + 132424, + 132427, + 132412, + 132477, + 132405, + 132423, + 132438, + 132314, + 132290, + 132226, + 132356, + 132412, + 132484, + 132299, + 132318, + 132275, + 132224, + 132444, + 132425, + 132542, + 132359, + 132428, + 132547, + 132289, + 132492, + 132217, + 132295, + 132474, + 132359, + 132369, + 132589, + 132422, + 132203, + 132245, + 132572, + 132528, + 132486, + 132494, + 132316, + 132392, + 132382, + 132206, + 132436, + 132308, + 132491, + 132445, + 132349, + 132502, + 132302, + 132534, + 132375, + 132383, + 132258, + 132338, + 132212, + 132398, + 132463, + 132338, + 132454, + 132445, + 132273, + 132234, + 132308, + 132399, + 132301, + 132472, + 132517, + 132439, + 132282, + 132355, + 132270, + 132364, + 132377, + 132242, + 132283, + 132450, + 132344, + 132496, + 132252, + 132431, + 132534, + 132455, + 132260, + 132283, + 132288, + 132397, + 132446, + 132423, + 132212, + 132310, + 132517, + 132184, + 132440, + 132345, + 132345, + 132403, + 132232, + 132569, + 132328, + 132604, + 132320, + 132458, + 132575, + 132349, + 132475, + 132548, + 132486, + 132501, + 132372, + 132398, + 132378, + 132452, + 132470, + 132262, + 132429, + 132320, + 132233, + 132287, + 132239, + 132485, + 132487, + 132201, + 132457, + 132389, + 132448 + ], + "sample_count": 1269 + }, + { + "pubkey": "5faSMXQ5BrHVUMNnYwzC942eAynno4nDbkPjz3o8ZsMp", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242247000000, + "samples": [ + 298856, + 298586, + 298647, + 298638, + 298753, + 298705, + 298647, + 298856, + 298629, + 298630, + 298622, + 298654, + 298654, + 299279, + 298731, + 298761, + 298692, + 298600, + 298863, + 298596, + 298778, + 298663, + 298862, + 298583, + 298645, + 298669, + 298569, + 298713, + 298600, + 299000, + 298787, + 298602, + 298664, + 298639, + 298636, + 298778, + 298720, + 298923, + 298671, + 298689, + 298624, + 298642, + 298721, + 298672, + 298760, + 298769, + 298485, + 298795, + 298624, + 298610, + 298562, + 298621, + 298950, + 298715, + 298641, + 298682, + 298711, + 298680, + 298665, + 298614, + 298694, + 298641, + 298645, + 298599, + 298595, + 298863, + 298574, + 299225, + 298683, + 298714, + 298568, + 298489, + 298558, + 298699, + 298751, + 298711, + 298621, + 298956, + 298619, + 298688, + 298697, + 298688, + 298943, + 298696, + 298732, + 298609, + 298612, + 298721, + 298681, + 300976, + 298751, + 298770, + 298756, + 298605, + 298605, + 298813, + 298631, + 298863, + 298604, + 298689, + 298521, + 298646, + 298696, + 298677, + 299137, + 298841, + 298712, + 298636, + 298731, + 298630, + 298990, + 298669, + 298751, + 298700, + 298586, + 298682, + 298697, + 298694, + 298633, + 298623, + 298804, + 298545, + 298620, + 298616, + 298696, + 298695, + 298706, + 298786, + 298693, + 298817, + 298630, + 298612, + 298659, + 298634, + 298697, + 298731, + 298674, + 298643, + 298617, + 298696, + 298652, + 298633, + 298827, + 298584, + 298617, + 298634, + 298694, + 298604, + 298541, + 299126, + 298784, + 298765, + 298616, + 298980, + 298641, + 298649, + 298815, + 298659, + 298618, + 298721, + 298531, + 298525, + 298825, + 298679, + 298905, + 298738, + 298596, + 298568, + 298709, + 298588, + 298744, + 298625, + 298846, + 298695, + 298659, + 298558, + 298664, + 298702, + 298571, + 298670, + 298814, + 298660, + 298606, + 298625, + 298664, + 298813, + 298686, + 298974, + 298586, + 298526, + 298669, + 298618, + 298691, + 298657, + 298748, + 298917, + 298606, + 298727, + 298598, + 298741, + 298809, + 298509, + 298924, + 298757, + 298595, + 298605, + 298646, + 298572, + 298545, + 298692, + 298901, + 298686, + 298532, + 298579, + 298531, + 298734, + 298565, + 298752, + 298659, + 298603, + 298636, + 298695, + 298938, + 298585, + 298798, + 298767, + 298693, + 298675, + 298650, + 298635, + 298680, + 298602, + 298981, + 298676, + 298635, + 298756, + 298681, + 298673, + 299080, + 298885, + 298783, + 298565, + 298537, + 298779, + 298541, + 298567, + 298573, + 298874, + 298742, + 298705, + 298586, + 298597, + 298515, + 298531, + 298608, + 298791, + 298671, + 298634, + 298779, + 298580, + 298843, + 298501, + 298972, + 298674, + 298573, + 298640, + 298606, + 298657, + 298766, + 298810, + 298611, + 298615, + 298630, + 298698, + 298715, + 298655, + 298543, + 298837, + 298707, + 298599, + 298572, + 298541, + 298661, + 298625, + 298748, + 298714, + 298837, + 298692, + 298822, + 298642, + 298763, + 298692, + 298748, + 298674, + 298654, + 298591, + 298636, + 298658, + 298580, + 298732, + 298667, + 298502, + 298502, + 298721, + 298639, + 298520, + 298632, + 298866, + 298688, + 298802, + 298598, + 298625, + 298706, + 298642, + 299035, + 298667, + 298714, + 298605, + 298558, + 298542, + 298754, + 298701, + 298740, + 298651, + 298671, + 298628, + 298579, + 298639, + 298699, + 298805, + 298817, + 298629, + 298616, + 298760, + 298639, + 298650, + 298646, + 298854, + 298743, + 298678, + 298597, + 298579, + 298746, + 298772, + 298702, + 298630, + 298584, + 298669, + 298582, + 298559, + 298702, + 298741, + 298798, + 298895, + 769151, + 298528, + 298639, + 298685, + 298620, + 298665, + 298699, + 298627, + 298548, + 298610, + 298633, + 298634, + 298634, + 299172, + 298732, + 298600, + 298847, + 298587, + 298978, + 298681, + 298644, + 298752, + 298538, + 298724, + 298589, + 298784, + 298767, + 298653, + 299354, + 298563, + 298633, + 298627, + 298722, + 298891, + 298829, + 298600, + 298647, + 298575, + 298600, + 298605, + 298636, + 298609, + 298507, + 298736, + 298622, + 299049, + 298664, + 298615, + 298858, + 298715, + 300999, + 298883, + 298602, + 300657, + 298588, + 299404, + 300924, + 298647, + 299485, + 298739, + 298653, + 316917, + 298670, + 298542, + 298698, + 298662, + 298775, + 298540, + 298801, + 298666, + 298654, + 298778, + 298589, + 298858, + 298740, + 298701, + 298590, + 298580, + 298647, + 298584, + 298603, + 298868, + 298625, + 298651, + 298543, + 298692, + 298756, + 298665, + 298827, + 298682, + 298628, + 298559, + 298611, + 298562, + 298708, + 298708, + 298742, + 298614, + 298701, + 298593, + 298574, + 298780, + 298620, + 298765, + 298601, + 298629, + 298607, + 298643, + 298559, + 298688, + 298746, + 298841, + 298613, + 298573, + 298592, + 298591, + 298658, + 298666, + 678088, + 298713, + 298712, + 298671, + 298569, + 298801, + 298552, + 298687, + 298863, + 298752, + 298598, + 298544, + 298641, + 298736, + 298621, + 298784, + 298633, + 298589, + 298534, + 298571, + 298691, + 298602, + 298762, + 298689, + 298507, + 298672, + 298584, + 298616, + 298552, + 298627, + 298861, + 298663, + 300675, + 300937, + 298654, + 300770, + 298568, + 298568, + 302399, + 298612, + 298585, + 300836, + 298675, + 298675, + 300764, + 298865, + 298670, + 298575, + 298583, + 298599, + 298460, + 298565, + 298504, + 298702, + 298629, + 298774, + 298707, + 298746, + 298587, + 298612, + 301058, + 298713, + 298667, + 298719, + 298544, + 298870, + 298592, + 298771, + 298763, + 298617, + 298533, + 298552, + 298671, + 298793, + 298654, + 298983, + 298728, + 298621, + 298560, + 298741, + 298753, + 298759, + 298825, + 298942, + 298602, + 298690, + 298560, + 298625, + 298689, + 298667, + 298873, + 298626, + 298643, + 298731, + 298731, + 298611, + 298706, + 298706, + 298974, + 298588, + 298554, + 298537, + 298699, + 298682, + 298496, + 298788, + 298540, + 298637, + 298561, + 298576, + 298668, + 298600, + 298604, + 298696, + 298548, + 298529, + 298869, + 298657, + 298932, + 298614, + 298711, + 298743, + 298630, + 298763, + 298626, + 298692, + 298632, + 298776, + 298768, + 298668, + 298642, + 298624, + 298626, + 298688, + 298626, + 299039, + 298779, + 298643, + 298621, + 298699, + 298789, + 298624, + 298722, + 298677, + 298671, + 298512, + 298732, + 298616, + 298722, + 298713, + 299237, + 298571, + 298712, + 298571, + 298566, + 640307, + 298629, + 298614, + 298742, + 298802, + 298627, + 298601, + 298842, + 298806, + 298672, + 299029, + 298544, + 298742, + 298603, + 298405, + 298319, + 298513, + 298695, + 298324, + 298548, + 298328, + 298345, + 298493, + 298504, + 298308, + 298723, + 298502, + 298349, + 298548, + 298560, + 298478, + 298340, + 298482, + 298439, + 298376, + 298365, + 298310, + 298508, + 298367, + 298513, + 298448, + 298486, + 298552, + 298442, + 298342, + 298283, + 298382, + 298532, + 298437, + 298415, + 298346, + 298635, + 298401, + 298428, + 298448, + 298636, + 236591, + 236529, + 236467, + 236600, + 236526, + 236684, + 236723, + 236654, + 236529, + 236488, + 236507, + 236460, + 237617, + 236607, + 236764, + 236559, + 236561, + 238017, + 236651, + 236513, + 236454, + 236521, + 236333, + 236444, + 236496, + 236514, + 236517, + 236490, + 236440, + 236702, + 236365, + 236555, + 236424, + 236468, + 236361, + 236585, + 236404, + 236700, + 236481, + 236576, + 236416, + 236551, + 236437, + 236527, + 239562, + 236552, + 236488, + 237314, + 236469, + 236532, + 236686, + 236574, + 236509, + 236522, + 236461, + 236439, + 236390, + 236445, + 236346, + 236651, + 236516, + 236405, + 236540, + 236538, + 236432, + 236508, + 236595, + 237072, + 236394, + 236402, + 236563, + 236521, + 236526, + 236454, + 236610, + 236538, + 236479, + 236429, + 236605, + 236380, + 236528, + 237136, + 240744, + 236471, + 236551, + 236477, + 236405, + 236507, + 236459, + 237257, + 236403, + 236366, + 236462, + 236450, + 236541, + 236421, + 236604, + 236582, + 247580, + 236510, + 236624, + 236557, + 236487, + 236352, + 241948, + 236496, + 236462, + 236548, + 236508, + 236524, + 236455, + 236567, + 236459, + 236505, + 236558, + 236522, + 236506, + 236588, + 236520, + 236650, + 236449, + 236486, + 236512, + 236489, + 236469, + 236484, + 236679, + 236633, + 298326, + 298499, + 298633, + 298351, + 298565, + 298370, + 298471, + 298444, + 298370, + 298476, + 298375, + 298406, + 298454, + 298526, + 298578, + 298381, + 298418, + 298399, + 298322, + 298545, + 298313, + 298627, + 298324, + 298357, + 298340, + 298336, + 298372, + 298490, + 298803, + 298542, + 298571, + 298327, + 298303, + 298325, + 298399, + 298400, + 298588, + 298490, + 298338, + 298307, + 298435, + 298520, + 298444, + 298545, + 298510, + 298441, + 298440, + 298370, + 298303, + 298325, + 298686, + 298573, + 298480, + 298443, + 298472, + 298424, + 298603, + 298388, + 298793, + 298490, + 298402, + 298499, + 299066, + 298383, + 298389, + 298530, + 298571, + 298474, + 298771, + 298334, + 298300, + 298492, + 298296, + 298383, + 298528, + 298450, + 298433, + 298375, + 298434, + 298495, + 298264, + 298555, + 298401, + 298360, + 298423, + 298523, + 298351, + 298407, + 298520, + 298457, + 298500, + 298356, + 298476, + 298515, + 298337, + 298401, + 298401, + 298446, + 298336, + 298988, + 298554, + 298539, + 298610, + 298369, + 298457, + 298496, + 298360, + 298531, + 298404, + 298307, + 298307, + 298618, + 298401, + 298364, + 298409, + 298846, + 298466, + 298538, + 298433, + 298394, + 298721, + 298276, + 298849, + 298416, + 298509, + 298509, + 298405, + 298235, + 298480, + 298609, + 298550, + 298440, + 298373, + 298410, + 298492, + 298744, + 298322, + 298322, + 298422, + 298612, + 298392, + 298433, + 298564, + 298434, + 298541, + 298503, + 298495, + 298370, + 298384, + 298439, + 298413, + 298549, + 299259, + 298320, + 298412, + 298419, + 298338, + 298370, + 298415, + 298645, + 298657, + 298423, + 298448, + 298462, + 298413, + 298443, + 298361, + 298617, + 298370, + 298381, + 298466, + 298413, + 298389, + 298442, + 298610, + 298711, + 298763, + 298327, + 298391, + 298375, + 298413, + 298373, + 298722, + 298280, + 298379, + 298335, + 298358, + 298307, + 298370, + 298649, + 298798, + 298463, + 298545, + 298334, + 298339, + 298373, + 298344, + 298491, + 298432, + 298343, + 298331, + 298416, + 298413, + 298803, + 298734, + 298475, + 298509, + 298407, + 298470, + 298366, + 298476, + 298513, + 298838, + 298524, + 298360, + 298309, + 298309, + 298472, + 298437, + 298922, + 298435, + 298382, + 298540, + 298439, + 298458, + 298554, + 298510, + 298659, + 298340, + 298417, + 298472, + 298297, + 298442, + 298315, + 298496, + 298580, + 298511, + 298353, + 298314, + 298381, + 298876, + 298422, + 298502, + 298699, + 298496, + 298374, + 298461, + 298391, + 327620, + 298417, + 298438, + 298504, + 298291, + 298487, + 298379, + 298378, + 298434, + 298544, + 298494, + 298373, + 298584, + 298372, + 298372, + 298366, + 298532, + 298436, + 298398, + 298591, + 298379, + 298425, + 298455, + 298363, + 298386, + 298436, + 298378, + 298257, + 298368, + 298522, + 298389, + 298544, + 298450, + 298439, + 298364, + 298440, + 298354, + 298359, + 298379, + 298527, + 298640, + 298449, + 298347, + 298489, + 298418, + 298417, + 298569, + 298525, + 298351, + 298409, + 298370, + 298524, + 298599, + 298376, + 299034, + 298545, + 298399, + 298330, + 298375, + 298432, + 298473, + 298431, + 298471, + 298443, + 298401, + 298387, + 298324, + 298581, + 298689, + 298567, + 298472, + 298378, + 298390, + 298498, + 298347, + 298501, + 298369, + 298514, + 298366, + 298392, + 298504, + 298383, + 298408, + 298543, + 298677, + 298508, + 298406, + 298375, + 298707, + 298374, + 298607, + 298482, + 298935, + 298401, + 298558, + 298440, + 298365, + 298421, + 298703, + 298706, + 298340, + 298358, + 298291, + 298348, + 298299, + 298514, + 298514, + 298663, + 298342, + 298382, + 298453, + 298306, + 298456, + 298502, + 298502, + 298484, + 298350, + 298371, + 299273, + 298314, + 298349, + 298575, + 298491, + 298432, + 298421, + 298406, + 298384, + 298582, + 298574, + 298611, + 298560, + 298380, + 298410, + 298476, + 298445, + 298340, + 298528, + 298642, + 298763, + 298823, + 298494, + 298628, + 299217, + 298344, + 298559, + 298401, + 298625, + 298332, + 298224, + 298543, + 298291, + 298555, + 298480, + 298460, + 298527, + 298597, + 298347, + 298464, + 298424, + 298757, + 298449, + 298405, + 298314, + 298276, + 298419, + 298382, + 298492, + 298387, + 298360, + 298387, + 298467, + 298298, + 298501, + 298335, + 298370, + 298413, + 298315, + 298401, + 298485, + 298453, + 298443, + 298498, + 298556, + 298481, + 298488, + 298521, + 298777, + 298561, + 298379, + 298759, + 298453, + 298470, + 298385, + 298385, + 298446, + 298403, + 298688, + 298503, + 298417, + 298467, + 298574, + 298458, + 298481, + 298385, + 298556, + 298491, + 298425, + 298287, + 298409, + 298592 + ], + "sample_count": 1269 + }, + { + "pubkey": "9NMhsPodRe1EivozbGBJW1aQWNZAMxq1ToJSkBgu6W6K", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "target_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242242000000, + "samples": [ + 25685, + 25645, + 25799, + 25835, + 25702, + 25731, + 25605, + 25796, + 25758, + 25730, + 25682, + 25919, + 25865, + 25713, + 25718, + 25676, + 25733, + 25801, + 25796, + 25736, + 25641, + 25764, + 25681, + 25593, + 25738, + 25756, + 25636, + 25834, + 25768, + 25857, + 25655, + 25794, + 25680, + 25675, + 25716, + 25722, + 25715, + 25799, + 25818, + 25742, + 25795, + 25849, + 25758, + 25643, + 25698, + 25762, + 25771, + 25794, + 25718, + 25783, + 25648, + 25777, + 25797, + 25691, + 25687, + 25850, + 25769, + 25690, + 25803, + 25666, + 25666, + 25731, + 25794, + 25756, + 25791, + 25809, + 25813, + 25856, + 25786, + 25759, + 25809, + 25813, + 25705, + 25839, + 25744, + 25808, + 25805, + 25807, + 25728, + 25666, + 25695, + 25724, + 25735, + 25750, + 25860, + 25859, + 25796, + 25784, + 25757, + 25746, + 25745, + 25752, + 25781, + 25720, + 25837, + 25846, + 25811, + 25849, + 25645, + 25860, + 25814, + 25824, + 25862, + 25689, + 25814, + 25670, + 25778, + 25771, + 25747, + 25797, + 25793, + 25648, + 25867, + 25822, + 25731, + 25770, + 25841, + 25834, + 25816, + 25832, + 25682, + 25852, + 25728, + 25732, + 25846, + 25765, + 25755, + 25766, + 25710, + 25754, + 25759, + 25805, + 25770, + 25719, + 25785, + 25745, + 25746, + 25649, + 25727, + 25782, + 25680, + 25761, + 25722, + 25803, + 25720, + 25662, + 25755, + 25801, + 25787, + 25787, + 25741, + 25786, + 25816, + 25785, + 25766, + 25642, + 25839, + 25907, + 25680, + 25797, + 25785, + 25679, + 25755, + 25850, + 25797, + 25865, + 25782, + 25812, + 25761, + 25797, + 25751, + 25829, + 25731, + 25834, + 25739, + 25717, + 25837, + 25792, + 25785, + 25840, + 25675, + 25701, + 25845, + 25794, + 25776, + 25768, + 25792, + 25805, + 26875, + 25716, + 25774, + 25730, + 25784, + 25804, + 25682, + 25706, + 25849, + 25707, + 25682, + 25798, + 25719, + 25729, + 25846, + 25737, + 25673, + 25718, + 25738, + 25823, + 25883, + 25695, + 25712, + 25756, + 25783, + 25807, + 25795, + 25764, + 25674, + 25803, + 25696, + 25787, + 25690, + 25743, + 25770, + 25728, + 25717, + 25735, + 25752, + 25687, + 25669, + 25784, + 25776, + 25687, + 25753, + 25627, + 25731, + 25666, + 25644, + 25779, + 25815, + 25863, + 25746, + 25667, + 25747, + 25679, + 25730, + 25860, + 25830, + 25781, + 25787, + 25741, + 25761, + 25746, + 25639, + 25718, + 25657, + 25866, + 25839, + 25768, + 25758, + 25686, + 25719, + 25738, + 25732, + 25696, + 25794, + 25678, + 25747, + 25705, + 25770, + 25626, + 25620, + 25770, + 25678, + 25713, + 25767, + 25766, + 25747, + 25658, + 25765, + 25699, + 25692, + 25702, + 25757, + 25647, + 25760, + 25818, + 25797, + 25788, + 25751, + 25785, + 25879, + 25766, + 25629, + 25688, + 25659, + 25699, + 25776, + 25670, + 25769, + 25785, + 25752, + 25761, + 25793, + 25810, + 25593, + 25761, + 25746, + 25546, + 25650, + 25783, + 25763, + 25772, + 25828, + 25726, + 25840, + 25703, + 25679, + 25711, + 25728, + 25710, + 25706, + 25671, + 25777, + 25635, + 25788, + 25629, + 25790, + 25715, + 25698, + 25785, + 25794, + 25759, + 25687, + 25692, + 25677, + 25833, + 25618, + 25625, + 25774, + 25752, + 25782, + 25719, + 25658, + 25737, + 25711, + 25711, + 25805, + 25826, + 25744, + 25794, + 25729, + 25798, + 25784, + 25659, + 25676, + 25639, + 25676, + 25748, + 25698, + 25745, + 25783, + 25746, + 25782, + 25767, + 25681, + 25685, + 25669, + 25753, + 25693, + 25770, + 25753, + 25728, + 25715, + 25682, + 25731, + 25701, + 25732, + 25751, + 25835, + 25724, + 25804, + 25690, + 25639, + 25757, + 25739, + 25766, + 25752, + 25786, + 25703, + 25775, + 25764, + 25804, + 25735, + 25783, + 25764, + 25710, + 25743, + 25765, + 25779, + 25870, + 25830, + 25786, + 25742, + 25689, + 25794, + 25825, + 25751, + 25746, + 25805, + 25846, + 25719, + 25690, + 25810, + 25863, + 25784, + 25713, + 25780, + 25893, + 25768, + 25727, + 25675, + 25777, + 25831, + 25611, + 25767, + 25685, + 25654, + 25797, + 25775, + 25829, + 25703, + 25814, + 25784, + 25841, + 25730, + 25784, + 25850, + 25793, + 25719, + 25740, + 25733, + 25692, + 25780, + 25804, + 25792, + 25704, + 25625, + 25842, + 25842, + 25722, + 25729, + 25732, + 25786, + 25766, + 25777, + 25701, + 25865, + 25704, + 25736, + 25798, + 25782, + 25765, + 25753, + 25760, + 25866, + 25833, + 25796, + 25690, + 25779, + 25767, + 25616, + 25799, + 25829, + 25862, + 25806, + 25714, + 25812, + 25664, + 25787, + 25842, + 25802, + 25789, + 25661, + 25781, + 25729, + 25713, + 25826, + 25814, + 25767, + 25728, + 25798, + 25823, + 25857, + 25842, + 25753, + 25774, + 25789, + 25734, + 25711, + 25838, + 25806, + 25579, + 25897, + 25723, + 25782, + 25740, + 25784, + 25834, + 25827, + 25810, + 25730, + 25860, + 25785, + 25880, + 25780, + 25661, + 25804, + 25894, + 25823, + 25798, + 25806, + 25741, + 25856, + 25807, + 25681, + 25786, + 25835, + 25660, + 25804, + 25758, + 25730, + 25803, + 25760, + 25764, + 25873, + 25665, + 25806, + 25799, + 25787, + 25831, + 25711, + 25692, + 25834, + 25723, + 25765, + 25759, + 25754, + 25863, + 25725, + 25749, + 25861, + 25666, + 25749, + 25803, + 25697, + 25726, + 25841, + 25837, + 25769, + 25744, + 25691, + 25739, + 25808, + 25750, + 25735, + 25743, + 25782, + 25819, + 25823, + 25868, + 25712, + 25792, + 25745, + 25799, + 25669, + 25796, + 25780, + 25664, + 25850, + 25813, + 25760, + 25791, + 25812, + 25812, + 25666, + 25703, + 25793, + 25733, + 25637, + 25605, + 25825, + 25645, + 25809, + 25742, + 25790, + 25711, + 25881, + 25774, + 25779, + 25792, + 25751, + 25769, + 25717, + 25740, + 25732, + 25708, + 25672, + 25807, + 25782, + 25638, + 25776, + 25697, + 25841, + 25751, + 25809, + 25755, + 25761, + 25827, + 25776, + 25699, + 25729, + 25777, + 25816, + 25751, + 25689, + 25657, + 25694, + 25724, + 25774, + 25806, + 25798, + 25759, + 25797, + 25685, + 25805, + 25662, + 25763, + 25764, + 25686, + 25721, + 25768, + 25813, + 25832, + 25784, + 25808, + 25828, + 25776, + 25833, + 25752, + 25696, + 25743, + 25758, + 25738, + 25776, + 25806, + 25623, + 25719, + 25688, + 25743, + 25717, + 25635, + 25768, + 25795, + 25822, + 25753, + 25692, + 25807, + 25728, + 25708, + 25786, + 25656, + 25748, + 25749, + 25753, + 25825, + 25734, + 25676, + 25896, + 25762, + 25858, + 25693, + 25801, + 25816, + 25735, + 25775, + 25745, + 25721, + 25793, + 25824, + 25699, + 25744, + 25851, + 25804, + 25789, + 25796, + 25761, + 25805, + 25813, + 25814, + 25685, + 25753, + 25597, + 25875, + 25696, + 25668, + 25717, + 25778, + 25657, + 25788, + 25782, + 25850, + 25759, + 25713, + 25734, + 25760, + 25765, + 25784, + 25809, + 25705, + 25696, + 25839, + 25698, + 25706, + 25760, + 25709, + 25662, + 25630, + 25711, + 25765, + 25779, + 25731, + 25834, + 25745, + 25777, + 25744, + 25692, + 25652, + 25686, + 25698, + 25808, + 25771, + 25752, + 25742, + 25781, + 25695, + 25647, + 25801, + 25718, + 25689, + 25774, + 25693, + 25785, + 25710, + 25743, + 25762, + 25679, + 25654, + 25710, + 25700, + 25669, + 25627, + 25751, + 25740, + 25762, + 25799, + 25794, + 25740, + 25818, + 25665, + 25736, + 25824, + 25737, + 25704, + 25793, + 25895, + 25750, + 25825, + 25851, + 25755, + 25796, + 25590, + 25694, + 25793, + 25730, + 25737, + 25741, + 25799, + 25785, + 25837, + 25749, + 25743, + 25745, + 25848, + 25782, + 25709, + 25782, + 25794, + 25806, + 25754, + 25745, + 25705, + 25818, + 25715, + 25713, + 25803, + 25754, + 25706, + 25707, + 25820, + 25773, + 25794, + 25701, + 25791, + 25815, + 25733, + 25737, + 25635, + 25828, + 25740, + 25765, + 25828, + 25817, + 25825, + 25780, + 25790, + 25785, + 25719, + 25799, + 25671, + 25798, + 25768, + 25849, + 25727, + 25738, + 25711, + 25747, + 25780, + 25568, + 25871, + 25859, + 25814, + 25795, + 25782, + 25687, + 25795, + 25608, + 25710, + 25778, + 25709, + 25778, + 25762, + 25867, + 25726, + 25722, + 25739, + 25781, + 25777, + 25694, + 25754, + 25818, + 25759, + 25687, + 25785, + 25721, + 25762, + 25668, + 25686, + 25822, + 25723, + 25819, + 25780, + 25800, + 25738, + 25742, + 25879, + 25742, + 25763, + 25649, + 25697, + 25723, + 25806, + 25701, + 25784, + 25821, + 25782, + 25731, + 25770, + 25714, + 25788, + 25842, + 25775, + 25794, + 25772, + 25748, + 25757, + 25634, + 25710, + 25721, + 25696, + 25756, + 25859, + 25782, + 25761, + 25830, + 25656, + 25847, + 25828, + 25792, + 25746, + 25739, + 25690, + 25801, + 25760, + 25742, + 25717, + 25820, + 25680, + 25805, + 25801, + 25728, + 25724, + 25863, + 25722, + 25810, + 25686, + 25869, + 25826, + 25809, + 25761, + 25727, + 25701, + 25832, + 25844, + 25737, + 25658, + 25703, + 25772, + 25792, + 25834, + 25780, + 25714, + 25762, + 25809, + 25698, + 25656, + 25753, + 25776, + 25729, + 25677, + 25813, + 25711, + 25636, + 25781, + 25718, + 25689, + 25859, + 25754, + 25832, + 25839, + 25717, + 25737, + 25592, + 25722, + 25835, + 25675, + 25771, + 25708, + 25713, + 25714, + 25717, + 25743, + 25725, + 25632, + 25778, + 25736, + 25676, + 25716, + 25662, + 25747, + 25691, + 25815, + 25719, + 25719, + 25845, + 25669, + 25803, + 25739, + 25672, + 25786, + 25734, + 25750, + 25724, + 25674, + 25626, + 25749, + 25801, + 25706, + 25756, + 25798, + 25766, + 25723, + 25665, + 25820, + 25770, + 25693, + 25755, + 25788, + 25664, + 25720, + 25745, + 25826, + 25749, + 25718, + 25621, + 25832, + 25610, + 25754, + 25683, + 25829, + 25766, + 25771, + 25755, + 25675, + 25775, + 25726, + 25689, + 25784, + 25715, + 25812, + 25730, + 25780, + 25703, + 25820, + 25704, + 25723, + 25729, + 25735, + 25700, + 25775, + 25680, + 25711, + 25736, + 25786, + 25705, + 25749, + 25706, + 25713, + 25657, + 25751, + 25743, + 25721, + 25594, + 25858, + 25759, + 25846, + 25725, + 25769, + 25844, + 25688, + 25882, + 25741, + 25771, + 25688, + 25746, + 25704, + 25749, + 25794, + 25730, + 25755, + 25687, + 25790, + 25800, + 25713, + 25735, + 25790, + 25750, + 25811, + 25764, + 25764, + 25765, + 25648, + 25717, + 25759, + 25736, + 25719, + 25817, + 25649, + 25817, + 25630, + 25788, + 25752, + 25710, + 25744, + 25719, + 25852, + 25643, + 25780, + 25730, + 25804, + 25651, + 25769, + 25667, + 25636, + 25724, + 25781, + 25746, + 25736, + 25612, + 25722, + 25562, + 25690, + 25796, + 25753, + 25831, + 25642, + 25827, + 25695, + 25731, + 25727, + 25810, + 25639, + 25734, + 25841, + 25739, + 25809, + 25806, + 25755, + 25760, + 25670, + 25792, + 25721, + 25680, + 25731, + 25728, + 25673, + 25791, + 25730, + 25749, + 25792, + 25808, + 25798, + 25782, + 25699, + 25718, + 25726, + 25782, + 25741, + 25733, + 25776, + 25676, + 25757, + 25765, + 25700, + 25839, + 25690, + 25830, + 25703, + 25648, + 25736, + 25679, + 25715, + 25812, + 25764, + 25640, + 25798, + 25758, + 25779, + 25776, + 25658, + 25702, + 25825, + 25806, + 25682, + 25808, + 25833, + 25809, + 25850, + 25677, + 25678, + 25819, + 25791, + 25779, + 25779, + 25811, + 25787, + 25829, + 25823, + 25826, + 25679, + 25790, + 25707, + 25828, + 25826, + 25768, + 25722, + 25815, + 25813, + 25775, + 25701, + 25765, + 25676, + 25671, + 25766, + 25742, + 25782, + 25821, + 25698, + 25749, + 25736, + 25831, + 25741, + 25774, + 25712, + 25818, + 25760, + 25750, + 25744, + 25778, + 25755, + 25871, + 25860, + 25736, + 25780, + 25686, + 25732, + 25818, + 25770, + 25695, + 25819, + 25802, + 25774, + 25753, + 25744, + 25661, + 25687, + 25833, + 25636, + 25678, + 25768, + 25683, + 25765, + 25749, + 25744, + 25774, + 25690, + 25824, + 25701, + 25770, + 25821, + 25722, + 25807, + 25767, + 25819, + 25765, + 25727, + 25820, + 25808, + 25762, + 25796, + 25622, + 25756, + 25694, + 25770, + 25730, + 25643, + 25756, + 25731, + 25815, + 25743, + 25708, + 25637 + ], + "sample_count": 1271 + }, + { + "pubkey": "CQdQA67hLJQH1rR19NfAaeLRf7iUbiYURGdL4JKongNb", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242237000000, + "samples": [ + 20007, + 20037, + 20128, + 19937, + 20010, + 19925, + 19988, + 19977, + 19979, + 19985, + 20001, + 19960, + 20017, + 20000, + 20009, + 20008, + 20024, + 19975, + 20015, + 19960, + 19954, + 19914, + 19999, + 20066, + 19992, + 19975, + 20019, + 19994, + 19990, + 20010, + 20072, + 20019, + 19956, + 20046, + 20011, + 20025, + 20028, + 19994, + 20058, + 20007, + 19967, + 19975, + 20032, + 19976, + 20031, + 19982, + 19940, + 19987, + 19857, + 19971, + 20012, + 19927, + 20008, + 19984, + 19973, + 20004, + 20049, + 19979, + 19986, + 20024, + 19991, + 20057, + 19979, + 19992, + 19955, + 19961, + 20009, + 20233, + 19992, + 19909, + 19942, + 19959, + 19991, + 19960, + 19975, + 20034, + 19991, + 20043, + 20043, + 19992, + 19998, + 20000, + 19890, + 19943, + 20030, + 20004, + 19947, + 19918, + 20025, + 19974, + 19980, + 19918, + 20005, + 19943, + 20018, + 19998, + 19974, + 19943, + 20032, + 19967, + 20016, + 20096, + 19925, + 19933, + 19885, + 20004, + 19956, + 20042, + 19914, + 19875, + 19946, + 20034, + 19985, + 20024, + 19978, + 19971, + 19909, + 19906, + 20045, + 19979, + 20021, + 20016, + 19895, + 20079, + 20030, + 19949, + 19931, + 19991, + 19975, + 20002, + 20037, + 20028, + 19963, + 20015, + 20032, + 20016, + 19965, + 19978, + 19980, + 19945, + 19989, + 20022, + 19970, + 19881, + 19920, + 20009, + 19969, + 20015, + 20017, + 20046, + 20031, + 20006, + 19983, + 20008, + 20044, + 19961, + 20030, + 20002, + 19953, + 19963, + 19957, + 19925, + 19886, + 19999, + 19971, + 19971, + 19971, + 19919, + 19965, + 19999, + 19987, + 19961, + 19922, + 19949, + 19969, + 19991, + 20019, + 19966, + 19986, + 19984, + 19921, + 19983, + 20052, + 20018, + 20022, + 20043, + 20038, + 19947, + 23462, + 19987, + 20020, + 19999, + 20069, + 19947, + 19961, + 20017, + 19959, + 19993, + 19952, + 20043, + 20065, + 20000, + 19946, + 20081, + 19985, + 20075, + 19972, + 20050, + 19993, + 19972, + 20005, + 20020, + 19936, + 19907, + 20067, + 19965, + 19973, + 19998, + 20039, + 19897, + 20015, + 20075, + 20022, + 19957, + 20045, + 20111, + 20014, + 20013, + 20091, + 19924, + 19938, + 19998, + 19807, + 20038, + 20036, + 20020, + 20007, + 19972, + 20018, + 19978, + 20022, + 20129, + 19963, + 19976, + 19985, + 20045, + 19966, + 19952, + 19882, + 20062, + 20078, + 19979, + 19982, + 19948, + 20043, + 20110, + 19972, + 19996, + 20016, + 20028, + 19917, + 20005, + 19993, + 19981, + 19946, + 19904, + 20004, + 19997, + 20055, + 20018, + 19937, + 19975, + 20031, + 19995, + 20023, + 20005, + 20026, + 19968, + 19993, + 19994, + 19996, + 20043, + 20040, + 20058, + 20038, + 19930, + 20020, + 19910, + 19974, + 20026, + 20085, + 20012, + 20058, + 19984, + 20033, + 20031, + 19962, + 20059, + 19976, + 19980, + 20085, + 19996, + 20064, + 19964, + 20022, + 20050, + 19943, + 19961, + 19960, + 19938, + 19975, + 19910, + 20062, + 19953, + 19980, + 19915, + 20039, + 20069, + 19981, + 20025, + 19932, + 20051, + 20016, + 20026, + 20045, + 19908, + 19997, + 19976, + 19953, + 20071, + 20079, + 20010, + 20080, + 19983, + 19956, + 20109, + 20013, + 19978, + 19989, + 20013, + 19974, + 20066, + 20038, + 20068, + 19983, + 20009, + 20011, + 20006, + 19994, + 20022, + 19987, + 20040, + 20075, + 20050, + 20023, + 19950, + 19905, + 19922, + 19968, + 19999, + 19985, + 20080, + 20041, + 20006, + 20106, + 20043, + 20047, + 20025, + 20032, + 19997, + 19969, + 20046, + 19858, + 20061, + 19999, + 19928, + 19970, + 19980, + 19962, + 20022, + 20067, + 20006, + 20027, + 20002, + 19958, + 19979, + 20007, + 20055, + 20091, + 20059, + 19995, + 20034, + 20070, + 20013, + 20021, + 19995, + 20068, + 20037, + 20049, + 20044, + 20048, + 20054, + 19901, + 20031, + 20052, + 20134, + 20026, + 19988, + 20019, + 20006, + 19958, + 20041, + 20020, + 19970, + 20054, + 20038, + 20081, + 20053, + 20003, + 19982, + 20051, + 20048, + 19986, + 20073, + 20007, + 20017, + 19976, + 19989, + 20054, + 20025, + 19997, + 19992, + 20041, + 20003, + 19974, + 19997, + 20025, + 20080, + 20003, + 19985, + 19998, + 20066, + 20028, + 20030, + 20003, + 20080, + 19908, + 20113, + 19997, + 20061, + 20080, + 19928, + 20043, + 20022, + 20033, + 20027, + 20098, + 20001, + 19969, + 19937, + 19992, + 20003, + 19994, + 19985, + 20019, + 20059, + 20090, + 20080, + 19909, + 20008, + 20058, + 19983, + 20067, + 20092, + 20016, + 20010, + 20042, + 19888, + 19931, + 20011, + 19971, + 20077, + 19990, + 20087, + 19971, + 20019, + 20008, + 20045, + 20000, + 19923, + 20064, + 20080, + 20072, + 19950, + 19991, + 20039, + 19978, + 20036, + 20025, + 20118, + 20124, + 20006, + 19923, + 19940, + 20046, + 20008, + 20011, + 20007, + 20061, + 20071, + 20058, + 20104, + 20045, + 20004, + 20062, + 19992, + 19971, + 19959, + 20020, + 20032, + 20074, + 19994, + 20029, + 19990, + 20043, + 19980, + 20065, + 20085, + 19964, + 19989, + 20078, + 19969, + 19912, + 19992, + 20009, + 20090, + 20036, + 20032, + 19955, + 20077, + 19990, + 19978, + 20021, + 19927, + 20043, + 20086, + 19937, + 19964, + 19946, + 20059, + 20032, + 20039, + 19960, + 20070, + 19936, + 19970, + 20088, + 19969, + 20096, + 20024, + 20065, + 19997, + 19972, + 20007, + 20095, + 19992, + 20086, + 20006, + 19959, + 20048, + 19992, + 20048, + 19987, + 20061, + 19948, + 20024, + 20045, + 20007, + 19956, + 20008, + 20034, + 19919, + 20019, + 20055, + 20118, + 19961, + 19985, + 20021, + 19990, + 20026, + 20088, + 19999, + 19891, + 19947, + 19991, + 19966, + 19936, + 20031, + 19990, + 20072, + 19978, + 20035, + 20036, + 19987, + 20051, + 19975, + 19962, + 19978, + 19969, + 19994, + 20027, + 20004, + 19950, + 19991, + 19981, + 20048, + 19962, + 20048, + 19995, + 20000, + 19978, + 20013, + 20016, + 19956, + 19937, + 20024, + 20012, + 19906, + 20049, + 19946, + 19985, + 19968, + 19943, + 19994, + 19892, + 20014, + 19969, + 20057, + 19948, + 19959, + 19962, + 20024, + 20056, + 19949, + 19905, + 19937, + 20005, + 20051, + 20040, + 19983, + 19986, + 19965, + 19993, + 19856, + 20019, + 19988, + 19987, + 19973, + 19984, + 19921, + 19982, + 19962, + 19961, + 19965, + 20109, + 20008, + 20040, + 20029, + 20001, + 19981, + 19928, + 19996, + 20014, + 20002, + 20100, + 20036, + 19988, + 20063, + 19978, + 19976, + 20002, + 19981, + 19994, + 20018, + 20001, + 20049, + 19920, + 20021, + 19985, + 19995, + 20016, + 19967, + 20042, + 19951, + 20039, + 20015, + 20045, + 20077, + 20071, + 19994, + 19943, + 20068, + 19931, + 20037, + 20023, + 19963, + 19987, + 19954, + 19890, + 20026, + 19911, + 20009, + 20036, + 19945, + 19884, + 20038, + 20036, + 19998, + 20032, + 20022, + 20000, + 20095, + 19956, + 19966, + 19962, + 19992, + 19925, + 19966, + 19896, + 19933, + 19985, + 19992, + 19914, + 19944, + 20118, + 19997, + 19995, + 20020, + 19983, + 20108, + 20082, + 20001, + 19959, + 19962, + 20071, + 20008, + 20050, + 20048, + 20030, + 19998, + 20046, + 19960, + 20039, + 20035, + 20011, + 19908, + 19998, + 20028, + 19990, + 20085, + 19963, + 20022, + 20079, + 20009, + 20089, + 19948, + 19876, + 19968, + 19993, + 20106, + 20068, + 19941, + 20004, + 20006, + 20140, + 20070, + 19967, + 20063, + 20025, + 19979, + 19957, + 20020, + 19969, + 20046, + 20031, + 20069, + 20015, + 20062, + 19999, + 19962, + 19905, + 19940, + 19904, + 19988, + 19997, + 20013, + 20064, + 20016, + 20032, + 19978, + 20118, + 20016, + 19960, + 20045, + 20006, + 20017, + 20090, + 20005, + 19985, + 20032, + 19981, + 19998, + 20035, + 19995, + 19974, + 20024, + 20062, + 20016, + 20005, + 19968, + 20004, + 19991, + 19944, + 19919, + 20035, + 19934, + 20001, + 20033, + 20055, + 19976, + 19947, + 19925, + 19968, + 19975, + 19957, + 19967, + 20014, + 20019, + 20069, + 19978, + 20061, + 20076, + 20072, + 20020, + 19979, + 20041, + 20033, + 19859, + 20087, + 19929, + 20021, + 20016, + 20054, + 19978, + 20019, + 20039, + 19954, + 20060, + 20067, + 20059, + 19922, + 20066, + 20043, + 20022, + 19990, + 19944, + 20063, + 20041, + 19905, + 20025, + 19872, + 19990, + 19946, + 19983, + 20006, + 19943, + 19953, + 19956, + 20015, + 19998, + 19993, + 20001, + 20061, + 20042, + 20119, + 19983, + 20017, + 20105, + 19978, + 20018, + 20055, + 19969, + 20038, + 20058, + 20068, + 19995, + 20046, + 19954, + 19923, + 20003, + 20025, + 19990, + 20032, + 20092, + 19952, + 20014, + 19981, + 20081, + 19944, + 19937, + 20025, + 19963, + 20003, + 20028, + 20037, + 19973, + 20056, + 20067, + 20015, + 20078, + 19951, + 20033, + 20028, + 20010, + 20049, + 20032, + 19921, + 20060, + 19965, + 19880, + 20088, + 20001, + 20026, + 20057, + 20017, + 20045, + 20066, + 19931, + 19992, + 20123, + 19949, + 19964, + 20114, + 20012, + 19990, + 19850, + 20059, + 19965, + 19959, + 19985, + 20028, + 20024, + 20023, + 20000, + 20038, + 20021, + 20023, + 20033, + 19985, + 20005, + 19989, + 20045, + 19994, + 19991, + 19969, + 20015, + 19909, + 20024, + 20009, + 19968, + 19981, + 20157, + 19971, + 19997, + 19961, + 19911, + 19944, + 20044, + 20021, + 20004, + 20012, + 19942, + 20025, + 19948, + 20029, + 20051, + 20090, + 20060, + 19911, + 20025, + 20046, + 20055, + 20020, + 20078, + 19946, + 20001, + 19977, + 19972, + 19994, + 20013, + 20028, + 20080, + 19984, + 20005, + 20036, + 19987, + 20029, + 19971, + 20038, + 20000, + 20015, + 19966, + 20027, + 20052, + 20011, + 20076, + 20116, + 19995, + 19903, + 19984, + 20058, + 20023, + 20029, + 20069, + 20025, + 20084, + 20029, + 19944, + 19951, + 19954, + 19988, + 19996, + 19951, + 20025, + 20033, + 19952, + 19980, + 19957, + 19987, + 19963, + 19958, + 20024, + 20000, + 20077, + 20098, + 19925, + 19945, + 19926, + 20036, + 19962, + 19984, + 19970, + 20040, + 19934, + 20010, + 19953, + 19930, + 19994, + 20107, + 20021, + 19890, + 19985, + 20008, + 20004, + 20011, + 19965, + 19987, + 20030, + 19839, + 20059, + 20070, + 20103, + 19997, + 20004, + 20033, + 20004, + 19999, + 20091, + 20006, + 20014, + 19972, + 19995, + 20018, + 20064, + 20027, + 20019, + 19960, + 19980, + 20048, + 19987, + 19916, + 19983, + 20080, + 20056, + 19960, + 20088, + 19986, + 20022, + 19979, + 19996, + 19997, + 19933, + 19953, + 19967, + 20055, + 19929, + 19971, + 19996, + 19970, + 19998, + 19971, + 20091, + 19947, + 20095, + 20084, + 20021, + 20072, + 20044, + 20095, + 20007, + 19880, + 19998, + 20063, + 19943, + 20048, + 20054, + 20066, + 20049, + 20073, + 20006, + 20058, + 20063, + 19934, + 20023, + 20054, + 20002, + 20013, + 20054, + 19993, + 19930, + 19966, + 20018, + 19989, + 20017, + 19968, + 20013, + 20070, + 20012, + 19998, + 20065, + 19988, + 20046, + 19992, + 19952, + 20082, + 19935, + 20021, + 20062, + 20071, + 19922, + 20009, + 19995, + 20013, + 20036, + 19951, + 20013, + 20000, + 20095, + 20031, + 19968, + 20006, + 20085, + 20039, + 20011, + 19975, + 20010, + 19964, + 19967, + 20008, + 20033, + 20052, + 20004, + 20040, + 20050, + 19996, + 19926, + 20017, + 19951, + 20042, + 19996, + 19984, + 19992, + 20010, + 20050, + 20018, + 20103, + 19970, + 20019, + 19992, + 20003, + 20057, + 19943, + 20093, + 20000, + 20025, + 20072, + 19951, + 19897, + 20048, + 20058, + 20013, + 19955, + 19843, + 20033, + 19939, + 20044, + 19969, + 19949, + 20008, + 20048, + 20062, + 19958, + 20052, + 19998, + 20022, + 19941, + 20017, + 20109, + 20034, + 19949, + 20057, + 20022, + 20012, + 19965, + 19897, + 19954, + 20054, + 20085, + 20065, + 19994, + 19940, + 19910, + 19983, + 20060, + 20038, + 19922, + 19937, + 20067, + 20011, + 20027, + 19988, + 19974, + 19892, + 19903, + 20030, + 20038, + 20073, + 20071, + 20067, + 20005, + 19961, + 19997, + 20072 + ], + "sample_count": 1263 + }, + { + "pubkey": "CsSPV78KHbD52YMh5WVdm699t5zVQdF2p92CpfcqdvDN", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242246000000, + "samples": [ + 233261, + 233281, + 233316, + 233303, + 233300, + 233259, + 233285, + 233265, + 233297, + 233270, + 233290, + 233272, + 233316, + 233328, + 233332, + 233267, + 233281, + 233290, + 233302, + 233303, + 233314, + 233264, + 233282, + 233288, + 233329, + 233280, + 233336, + 233255, + 233337, + 233305, + 233340, + 233304, + 233319, + 233353, + 233258, + 233312, + 233294, + 233317, + 233269, + 233320, + 233302, + 233302, + 233332, + 233328, + 233284, + 233336, + 233242, + 233262, + 233249, + 233303, + 233292, + 233295, + 233287, + 233276, + 233291, + 233287, + 233234, + 233289, + 233253, + 233329, + 233353, + 233255, + 233286, + 233283, + 233306, + 233288, + 233322, + 233326, + 233287, + 233313, + 233318, + 233310, + 233366, + 233278, + 233319, + 233312, + 233284, + 233333, + 233274, + 233323, + 233311, + 233329, + 233316, + 233294, + 233342, + 233316, + 233332, + 233307, + 233332, + 233327, + 233298, + 233284, + 233344, + 233327, + 233315, + 233306, + 233321, + 233316, + 233279, + 233315, + 233345, + 233267, + 233311, + 233338, + 233278, + 233340, + 233330, + 233312, + 233298, + 233387, + 233304, + 233322, + 233295, + 233333, + 233275, + 233273, + 233296, + 233300, + 233305, + 233310, + 233268, + 233306, + 233268, + 233312, + 233273, + 233318, + 233353, + 233340, + 233295, + 233281, + 233309, + 233318, + 233288, + 233278, + 233330, + 233323, + 233269, + 233269, + 233293, + 233348, + 233315, + 233323, + 233336, + 233349, + 233261, + 233316, + 233294, + 233282, + 233276, + 233307, + 233317, + 233269, + 233300, + 233300, + 233332, + 233313, + 233318, + 233329, + 233289, + 233332, + 233321, + 233276, + 233308, + 233287, + 233274, + 233331, + 233291, + 233313, + 233295, + 233267, + 233347, + 233292, + 233248, + 233296, + 233329, + 233338, + 233277, + 233287, + 233301, + 233318, + 233313, + 233319, + 233308, + 233311, + 233336, + 233311, + 233309, + 233288, + 233305, + 233301, + 233304, + 233288, + 233310, + 233279, + 233292, + 233282, + 233304, + 233295, + 233301, + 233287, + 233303, + 233336, + 233310, + 233243, + 233279, + 233244, + 233321, + 233291, + 233276, + 233264, + 233330, + 233269, + 233314, + 233279, + 233298, + 233313, + 233276, + 233275, + 233298, + 233293, + 233281, + 233329, + 233288, + 233273, + 233262, + 233276, + 233277, + 233302, + 233319, + 233299, + 233282, + 233251, + 233297, + 233251, + 233274, + 233305, + 233261, + 233277, + 233252, + 233277, + 233261, + 233231, + 233295, + 233313, + 233335, + 233308, + 233255, + 233280, + 233271, + 233329, + 233304, + 233334, + 233291, + 233280, + 233266, + 233299, + 233277, + 233294, + 233289, + 233246, + 233245, + 233280, + 233301, + 233287, + 233287, + 233283, + 233236, + 233260, + 233267, + 233288, + 233250, + 233286, + 233313, + 233319, + 233320, + 233286, + 233312, + 233284, + 233283, + 233336, + 233328, + 233324, + 233307, + 233291, + 233288, + 233310, + 233237, + 233318, + 233302, + 233293, + 233257, + 233324, + 233296, + 233320, + 233306, + 233286, + 233304, + 233277, + 233238, + 233278, + 233293, + 233316, + 233219, + 233284, + 233260, + 233331, + 233307, + 233299, + 233277, + 233306, + 233261, + 233304, + 233272, + 233305, + 233334, + 233341, + 233277, + 233295, + 233293, + 233328, + 233305, + 233253, + 233306, + 233237, + 233292, + 233303, + 233319, + 233287, + 233257, + 233302, + 233318, + 233335, + 233249, + 233234, + 233319, + 233330, + 233261, + 233267, + 233247, + 233289, + 233337, + 233290, + 233327, + 233287, + 233276, + 233276, + 233322, + 233297, + 233334, + 233299, + 233306, + 233286, + 233284, + 233270, + 233238, + 233306, + 233272, + 233327, + 233316, + 233302, + 233309, + 233314, + 233333, + 233318, + 233276, + 233243, + 233321, + 233317, + 233293, + 233283, + 233317, + 233282, + 233289, + 233290, + 233271, + 233317, + 233295, + 233285, + 233303, + 233295, + 233310, + 233286, + 233281, + 233278, + 233285, + 233332, + 233286, + 233293, + 233293, + 233262, + 233258, + 233255, + 233302, + 233288, + 233340, + 233304, + 233269, + 233319, + 233337, + 233302, + 233248, + 233300, + 233281, + 233231, + 233281, + 233287, + 233283, + 233278, + 233339, + 233320, + 233216, + 233287, + 233228, + 233246, + 233284, + 233282, + 233345, + 233322, + 233246, + 233235, + 233300, + 233283, + 233288, + 233294, + 233287, + 233323, + 233301, + 233274, + 233320, + 233281, + 233310, + 233298, + 233321, + 233253, + 233356, + 233348, + 233300, + 233317, + 233285, + 233338, + 233259, + 233332, + 233322, + 233301, + 233292, + 233273, + 233260, + 233283, + 233258, + 233275, + 233286, + 233337, + 233334, + 233290, + 233297, + 233294, + 233267, + 233313, + 233307, + 233276, + 233309, + 233305, + 233298, + 233282, + 233289, + 233266, + 233261, + 233302, + 233332, + 233314, + 233231, + 233236, + 233319, + 233306, + 233274, + 233278, + 233299, + 233266, + 233307, + 233324, + 233318, + 233330, + 233252, + 233325, + 233283, + 233308, + 233298, + 233264, + 233281, + 233323, + 233294, + 233283, + 233279, + 233302, + 233273, + 233308, + 233238, + 233307, + 233338, + 233327, + 233254, + 233295, + 233295, + 233308, + 233266, + 233281, + 233298, + 233312, + 233299, + 233316, + 233335, + 233307, + 233307, + 233312, + 233321, + 233301, + 233352, + 233280, + 233244, + 233297, + 233280, + 233278, + 233306, + 233288, + 233285, + 233257, + 233256, + 233312, + 233246, + 233301, + 233324, + 233317, + 233310, + 233307, + 233257, + 233282, + 233297, + 233268, + 233289, + 233344, + 233321, + 233214, + 233270, + 233321, + 233315, + 233282, + 233280, + 233299, + 233263, + 233299, + 233282, + 233273, + 233291, + 233268, + 233246, + 233224, + 233334, + 233304, + 233271, + 233327, + 233280, + 233257, + 233280, + 233315, + 233335, + 233308, + 233336, + 233334, + 233254, + 233268, + 233323, + 233305, + 233310, + 233266, + 233314, + 233278, + 233183, + 233279, + 233267, + 233280, + 233330, + 233292, + 233301, + 233266, + 233296, + 233319, + 233297, + 233323, + 233327, + 233315, + 233253, + 233308, + 233284, + 233276, + 233323, + 233293, + 233263, + 233226, + 233275, + 233303, + 233288, + 233327, + 233255, + 233304, + 233302, + 233278, + 233268, + 233302, + 233297, + 233274, + 233297, + 233285, + 233255, + 233244, + 233261, + 233232, + 233295, + 233247, + 233314, + 233324, + 233251, + 233260, + 233268, + 233264, + 233315, + 233261, + 233276, + 233293, + 233306, + 233289, + 233276, + 233288, + 233244, + 233249, + 233331, + 233290, + 233349, + 233308, + 233271, + 233320, + 233319, + 233297, + 233301, + 233314, + 233319, + 233277, + 233303, + 233319, + 233252, + 233298, + 233273, + 233287, + 233264, + 233239, + 233348, + 233314, + 233341, + 233315, + 233289, + 233344, + 233276, + 233326, + 233277, + 233296, + 233323, + 233319, + 233315, + 233250, + 233267, + 233307, + 233340, + 233265, + 233265, + 233298, + 233290, + 233338, + 233318, + 233286, + 233270, + 233279, + 233316, + 233258, + 233291, + 233310, + 233337, + 233300, + 233318, + 233286, + 233290, + 233319, + 233337, + 233314, + 233327, + 233324, + 233334, + 233279, + 233315, + 233290, + 233270, + 233292, + 233268, + 233294, + 233281, + 233304, + 233337, + 233290, + 233275, + 233297, + 233291, + 233355, + 233296, + 233302, + 233286, + 233286, + 233334, + 233301, + 233306, + 233285, + 233297, + 233294, + 233316, + 233248, + 233314, + 233291, + 233232, + 233357, + 233335, + 233297, + 233288, + 233292, + 233262, + 233277, + 233309, + 233332, + 233249, + 233258, + 233325, + 233319, + 233299, + 233315, + 233180, + 233203, + 233318, + 233252, + 233298, + 233302, + 233333, + 233327, + 233338, + 233340, + 233336, + 233318, + 233306, + 233316, + 233325, + 233327, + 233312, + 233255, + 233294, + 233327, + 233299, + 233318, + 233315, + 233357, + 233315, + 233296, + 233294, + 233276, + 233321, + 233363, + 233280, + 233321, + 233348, + 233256, + 233302, + 233325, + 233336, + 233313, + 233321, + 233336, + 233333, + 233310, + 233263, + 233282, + 233287, + 233354, + 233326, + 233303, + 233323, + 233314, + 233314, + 233306, + 233332, + 233311, + 233296, + 233302, + 233335, + 233285, + 233282, + 233303, + 233238, + 233286, + 233261, + 233293, + 233291, + 233310, + 233325, + 233298, + 233309, + 233309, + 233350, + 233263, + 233341, + 233261, + 233310, + 233326, + 233272, + 233333, + 233336, + 233345, + 233324, + 233315, + 233297, + 233299, + 233306, + 233324, + 233291, + 233336, + 233298, + 233284, + 233313, + 233315, + 233293, + 233279, + 233328, + 233276, + 233310, + 233284, + 233279, + 233327, + 233318, + 233282, + 233298, + 233249, + 233326, + 233312, + 233320, + 233309, + 233370, + 233304, + 233249, + 233336, + 233351, + 233337, + 233361, + 233313, + 233311, + 233292, + 233221, + 233293, + 233303, + 233297, + 233303, + 233275, + 233302, + 233270, + 233339, + 233330, + 233330, + 233306, + 233305, + 233288, + 233316, + 233377, + 233310, + 233271, + 233364, + 233342, + 233223, + 233347, + 233329, + 233284, + 233319, + 233301, + 233314, + 233362, + 233299, + 233297, + 233251, + 233287, + 233333, + 233266, + 233319, + 233211, + 233272, + 233268, + 233291, + 233253, + 233268, + 233305, + 233273, + 233285, + 233296, + 233277, + 233299, + 233256, + 233261, + 233303, + 233297, + 233298, + 233280, + 233280, + 233264, + 233299, + 233288, + 233289, + 233338, + 233313, + 233292, + 233232, + 233290, + 233327, + 233302, + 233268, + 233351, + 233279, + 233278, + 233328, + 233303, + 233293, + 233281, + 233307, + 233294, + 233321, + 233285, + 233341, + 233220, + 233283, + 233284, + 233296, + 233284, + 233300, + 233313, + 233264, + 233339, + 233289, + 233327, + 233195, + 233278, + 233316, + 233285, + 233328, + 233318, + 233326, + 233221, + 233306, + 233286, + 233296, + 233326, + 233308, + 233296, + 233312, + 233284, + 233273, + 233224, + 233320, + 233298, + 233284, + 233325, + 233306, + 233300, + 233277, + 233328, + 233312, + 233346, + 233303, + 233312, + 233313, + 233293, + 233304, + 233274, + 233277, + 233283, + 233307, + 233247, + 233292, + 233293, + 233298, + 233288, + 233283, + 233279, + 233286, + 233328, + 233284, + 233285, + 233292, + 233339, + 233335, + 233309, + 233307, + 233315, + 233332, + 233264, + 233301, + 233297, + 233283, + 233271, + 233233, + 233275, + 233261, + 233279, + 233275, + 233289, + 233271, + 233267, + 233223, + 233270, + 233317, + 233280, + 233275, + 233309, + 233312, + 233347, + 233340, + 233316, + 233272, + 233314, + 233328, + 233329, + 233314, + 233305, + 233266, + 233241, + 233264, + 233322, + 233289, + 233313, + 233284, + 233298, + 233312, + 233249, + 233310, + 233337, + 233326, + 233326, + 233249, + 233217, + 233304, + 233300, + 233336, + 233280, + 233322, + 233324, + 233326, + 233303, + 233314, + 233353, + 233292, + 233265, + 233298, + 233276, + 233265, + 233246, + 233304, + 233296, + 233257, + 233294, + 233271, + 233340, + 233274, + 233313, + 233285, + 233248, + 233306, + 233301, + 233242, + 233343, + 233280, + 233329, + 233265, + 232996, + 233312, + 233295, + 232978, + 233260, + 233305, + 232976, + 233288, + 233320, + 233325, + 233301, + 233280, + 233321, + 233326, + 233258, + 233212, + 233264, + 233361, + 233280, + 233300, + 233306, + 233251, + 233322, + 233268, + 233300, + 233256, + 233298, + 233293, + 233270, + 233299, + 233309, + 233281, + 233304, + 233309, + 233312, + 233296, + 233298, + 233273, + 233296, + 233308, + 233239, + 233120, + 233317, + 233294, + 233278, + 233233, + 233297, + 233304, + 233300, + 233284, + 233262, + 233302, + 233300, + 233275, + 233321, + 233320, + 233209, + 233293, + 233294, + 233270, + 233236, + 233347, + 233308, + 233276, + 233315, + 233262, + 233282, + 233277, + 233320, + 233249, + 233276, + 233272, + 233281, + 233286, + 233297, + 233262, + 233326, + 233315, + 233317, + 233236, + 233285, + 233239, + 233263, + 233286, + 233340, + 233263, + 233235, + 233284, + 233275, + 233238, + 233271, + 233390, + 233327, + 233333, + 233320, + 233245, + 233325, + 233328, + 233352, + 233259, + 233333, + 233306, + 233258, + 233297, + 233297, + 233288, + 233253, + 233335, + 233290, + 233306, + 233285, + 233312, + 233275, + 233276, + 233275, + 233304, + 233281, + 233264, + 233249, + 233273, + 233271, + 233251, + 233299, + 233275, + 233294, + 233324, + 233292, + 233305, + 233282, + 233317, + 233267, + 233346, + 233324, + 233334, + 233332, + 233278, + 233244, + 233293, + 233288, + 233327, + 233323, + 233324, + 233294, + 233266, + 233284, + 233321, + 233301, + 233346, + 233314, + 233313, + 233274, + 233281, + 233348, + 233331, + 233331, + 233269, + 233308, + 233286, + 233258, + 233320, + 233240, + 233282, + 233331, + 233310, + 233324, + 233319, + 233311, + 233291, + 233273, + 233315, + 233266, + 233267, + 233355, + 233310, + 233295, + 233272, + 233301, + 233350, + 233280, + 233319, + 233299, + 233304, + 233248, + 233269, + 233287, + 233255, + 233349, + 233282, + 233288, + 233275, + 233335 + ], + "sample_count": 1271 + }, + { + "pubkey": "FyPuLTLNzgiyyE6epzZc3WBniSfRxZbdjBJ4AKzDGT53", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242260000000, + "samples": [ + 236074, + 236493, + 236035, + 236422, + 239743, + 236184, + 236235, + 236247, + 236339, + 243189, + 236030, + 236215, + 236121, + 236003, + 236336, + 240474, + 240416, + 240274, + 240490, + 240455, + 240537, + 240274, + 240346, + 238591, + 238415, + 243497, + 243590, + 244520, + 243615, + 243927, + 243803, + 243723, + 243688, + 273291, + 273338, + 268410, + 226794, + 228358, + 238519, + 238662, + 238598, + 236415, + 236262, + 241435, + 241695, + 241764, + 241540, + 241596, + 243101, + 242267, + 242551, + 242073, + 263950, + 242454, + 304367, + 245782, + 427529, + 246862, + 246775, + 247022, + 252974, + 249511, + 375246, + 455607, + 444556, + 410647, + 422284, + 380186, + 412741, + 384459, + 384459, + 425178, + 409687, + 433331, + 447586, + 447586, + 447367, + 509067, + 426462, + 475013, + 479222, + 420124, + 419217, + 451167, + 474976, + 474976, + 478383, + 502526, + 447967, + 541338, + 565266, + 583879, + 583879, + 552334, + 504710, + 515790, + 525925, + 539137, + 507947, + 600324, + 482818, + 493581, + 582641, + 566071, + 560487, + 500840, + 546464, + 522474, + 522474, + 508877, + 627514, + 555791, + 555791, + 555791, + 508889, + 503409, + 486606, + 537097, + 537097, + 548136, + 578697, + 486152, + 516088, + 501763, + 545228, + 574145, + 540412, + 540412, + 580109, + 597396, + 597396, + 564700, + 566993, + 549120, + 538195, + 568826, + 604550, + 604550, + 558937, + 559914, + 536882, + 500198, + 482479, + 443991, + 469242, + 469242, + 469242, + 438109, + 224805, + 228639, + 443024, + 418899, + 418899, + 250202, + 250678, + 477208, + 260733, + 260562, + 260480, + 260691, + 260691, + 491084, + 461496, + 501237, + 487096, + 525580, + 525580, + 394940, + 479538, + 524268, + 493383, + 239385, + 238417, + 238053, + 237919, + 237794, + 234994, + 234702, + 506990, + 387817, + 339608, + 370235, + 398206, + 390718, + 346911, + 383253, + 428558, + 435536, + 417915, + 408385, + 408385, + 436312, + 391105, + 398856, + 416100, + 235110, + 362181, + 378051, + 389323, + 350996, + 239092, + 239151, + 239264, + 239292, + 239163, + 243617, + 243518, + 243453, + 243594, + 243936, + 244091, + 243408, + 243822, + 243634, + 243631, + 243577, + 243668, + 243580, + 243765, + 243483, + 243459, + 243506, + 243583, + 240586, + 240626, + 240666, + 240965, + 240500, + 236224, + 236064, + 237818, + 237797, + 237983, + 238000, + 237824, + 237893, + 238288, + 237912, + 238043, + 238107, + 237977, + 237686, + 237663, + 241671, + 241709, + 241759, + 241572, + 234427, + 234191, + 234529, + 234155, + 234352, + 237104, + 237210, + 237265, + 237002, + 236899, + 236938, + 236848, + 237674, + 243376, + 243471, + 239168, + 238863, + 238818, + 235998, + 235689, + 235417, + 234414, + 234429, + 232605, + 232533, + 232615, + 232537, + 232590, + 232726, + 232563, + 232626, + 237459, + 237583, + 237735, + 237537, + 237488, + 241363, + 241142, + 241276, + 241087, + 241151, + 236013, + 236002, + 235896, + 236058, + 236095, + 236121, + 236015, + 241464, + 241725, + 241552, + 243084, + 243052, + 241747, + 241772, + 241581, + 241927, + 241706, + 241689, + 241661, + 241801, + 242862, + 242708, + 242704, + 242735, + 242825, + 237982, + 237842, + 237903, + 237816, + 234528, + 234470, + 234754, + 236001, + 235721, + 236413, + 241786, + 241664, + 241710, + 241775, + 241649, + 241816, + 242028, + 241729, + 241675, + 241717, + 241791, + 241643, + 234426, + 234667, + 241822, + 241786, + 241534, + 241785, + 241690, + 241785, + 241824, + 241587, + 242023, + 241977, + 241908, + 243251, + 243194, + 243177, + 243190, + 243318, + 243332, + 243167, + 233618, + 233569, + 236104, + 236088, + 236182, + 236345, + 236034, + 236055, + 236049, + 236414, + 241760, + 241689, + 235883, + 235663, + 235800, + 237662, + 237719, + 238203, + 237683, + 237907, + 237859, + 237614, + 238113, + 237743, + 237713, + 237785, + 237786, + 237777, + 238608, + 238772, + 234338, + 234637, + 234492, + 234341, + 234523, + 238009, + 237825, + 237671, + 236016, + 235946, + 236041, + 235911, + 236283, + 236012, + 235978, + 233909, + 234030, + 234105, + 234205, + 234220, + 237401, + 237267, + 237608, + 237479, + 237405, + 240083, + 240146, + 240129, + 240136, + 239994, + 240184, + 240317, + 240072, + 240219, + 240055, + 240139, + 240095, + 239968, + 240039, + 240025, + 241754, + 241801, + 241893, + 241671, + 241813, + 241813, + 249057, + 249070, + 249056, + 249071, + 250013, + 250594, + 238850, + 238984, + 239158, + 240106, + 240034, + 240265, + 240061, + 240234, + 232953, + 233067, + 233169, + 233143, + 233043, + 232990, + 234164, + 233029, + 233194, + 233283, + 233093, + 233528, + 241811, + 243856, + 242245, + 241746, + 241651, + 242181, + 241673, + 241841, + 241914, + 241719, + 239393, + 239237, + 239463, + 241877, + 241809, + 293441, + 293441, + 241631, + 242451, + 238978, + 247706, + 247662, + 247607, + 233312, + 232829, + 232926, + 233135, + 233080, + 232878, + 233316, + 233292, + 232855, + 232968, + 236414, + 236326, + 238003, + 237979, + 237932, + 239267, + 259080, + 238309, + 237952, + 237998, + 238859, + 255777, + 239964, + 277077, + 394586, + 252177, + 268226, + 341016, + 508302, + 336101, + 329375, + 387995, + 284827, + 370213, + 354794, + 354794, + 322917, + 275272, + 289956, + 403281, + 367749, + 349525, + 367267, + 258642, + 299240, + 383916, + 388185, + 379346, + 246797, + 242757, + 294518, + 317177, + 317177, + 242100, + 302599, + 246267, + 240307, + 240289, + 240301, + 248396, + 240250, + 240576, + 240770, + 270206, + 270049, + 542712, + 478443, + 478443, + 507977, + 536826, + 451959, + 507201, + 495737, + 466755, + 499600, + 544103, + 511362, + 505673, + 493306, + 449591, + 615589, + 544348, + 565906, + 574211, + 549564, + 550383, + 574111, + 650981, + 630353, + 583437, + 596477, + 556056, + 589203, + 589203, + 620137, + 620137, + 629618, + 516785, + 623927, + 595881, + 595881, + 595881, + 554051, + 508264, + 519230, + 551535, + 552132, + 243417, + 240754, + 241190, + 240918, + 240964, + 486452, + 526425, + 536468, + 514203, + 540474, + 553671, + 539226, + 522931, + 523115, + 578857, + 491741, + 580767, + 521325, + 622289, + 371474, + 396866, + 485562, + 402257, + 389555, + 293022, + 277417, + 237774, + 237685, + 240470, + 240308, + 240451, + 240412, + 240399, + 240840, + 240429, + 240430, + 240505, + 240411, + 235582, + 235561, + 235578, + 235515, + 236725, + 235665, + 235441, + 235410, + 235769, + 235820, + 243475, + 243404, + 244030, + 243530, + 243562, + 243443, + 248464, + 242069, + 241976, + 243841, + 241775, + 241709, + 247746, + 247558, + 247717, + 249527, + 249374, + 234810, + 234442, + 234555, + 236502, + 236271, + 236742, + 236108, + 236094, + 236478, + 236432, + 234626, + 234678, + 234534, + 235696, + 236070, + 235609, + 235636, + 235622, + 235459, + 237133, + 245781, + 246121, + 245900, + 246151, + 245726, + 245902, + 245680, + 245787, + 245878, + 245790, + 245912, + 245706, + 241665, + 241802, + 241629, + 241661, + 241629, + 241700, + 247860, + 247512, + 247587, + 241741, + 247821, + 240124, + 240340, + 239929, + 239884, + 239706, + 243209, + 243450, + 243365, + 243565, + 243369, + 243440, + 243279, + 243991, + 243300, + 243286, + 240560, + 234627, + 234633, + 235049, + 241678, + 240167, + 261646, + 240041, + 239965, + 233358, + 233445, + 233387, + 233399, + 240256, + 240361, + 232755, + 232494, + 240081, + 239935, + 239727, + 246670, + 246614, + 246730, + 246751, + 247201, + 246754, + 246578, + 246694, + 246836, + 246876, + 246778, + 276785, + 266399, + 236193, + 236146, + 281808, + 251505, + 245143, + 245543, + 245196, + 241857, + 251792, + 241058, + 241254, + 247780, + 247807, + 242008, + 241924, + 241815, + 243363, + 242073, + 256050, + 243378, + 242759, + 241129, + 240019, + 240034, + 241889, + 241809, + 241912, + 241867, + 241826, + 242184, + 242184, + 241985, + 244528, + 244528, + 243601, + 244686, + 243828, + 243000, + 265858, + 238979, + 238873, + 248717, + 238972, + 239586, + 239027, + 239027, + 236188, + 309311, + 355017, + 234693, + 235148, + 250546, + 268817, + 268817, + 250320, + 428257, + 443438, + 411004, + 475756, + 381482, + 240888, + 241231, + 478219, + 444313, + 417793, + 450852, + 455201, + 455201, + 429875, + 466199, + 464081, + 466459, + 482029, + 487907, + 487907, + 466232, + 488403, + 478167, + 476016, + 464771, + 511105, + 525318, + 505772, + 505772, + 504663, + 504663, + 484084, + 530845, + 530845, + 474617, + 474617, + 492956, + 459999, + 471100, + 468558, + 468558, + 454685, + 457840, + 458842, + 469154, + 508614, + 482674, + 485495, + 522168, + 522168, + 575130, + 530745, + 523345, + 530885, + 490536, + 482319, + 539786, + 237956, + 237872, + 268549, + 591315, + 504649, + 258284, + 253191, + 253463, + 253276, + 425961, + 501981, + 465046, + 486038, + 465612, + 424897, + 446185, + 503136, + 513566, + 440794, + 520582, + 562055, + 477869, + 491117, + 525298, + 524803, + 460589, + 456799, + 472147, + 508295, + 472687, + 494473, + 468012, + 496732, + 449901, + 425314, + 419131, + 446443, + 492199, + 476004, + 435851, + 452299, + 397068, + 431821, + 365322, + 455986, + 455986, + 396368, + 381310, + 238008, + 237502, + 237502, + 240230, + 240009, + 240009, + 242016, + 242016, + 241878, + 241878, + 240206, + 240206, + 240037, + 240037, + 240232, + 239994, + 239994, + 240248, + 240248, + 240256, + 240135, + 240050, + 240048, + 240047, + 240184, + 237945, + 237945, + 237622, + 237871, + 237871, + 237596, + 237750, + 237750, + 237880, + 237748, + 237719, + 237741, + 237652, + 241732, + 241792, + 241934, + 238713, + 240071, + 240071, + 240172, + 240062, + 240062, + 240054, + 242026, + 241777, + 241777, + 236110, + 236194, + 236194, + 236099, + 241314, + 241314, + 248937, + 249234, + 249234, + 240096, + 240096, + 239994, + 241917, + 241632, + 241622, + 241582, + 241866, + 241636, + 241781, + 241781, + 241851, + 237570, + 237570, + 237492, + 237548, + 237519, + 237512, + 237696, + 237665, + 237336, + 237588, + 237588, + 237526, + 237539, + 237539, + 237638, + 241598, + 241598, + 241555, + 241542, + 241557, + 241475, + 240035, + 240097, + 240097, + 240045, + 240196, + 240204, + 240231, + 240231, + 238488, + 238444, + 238444, + 238553, + 238553, + 249073, + 242047, + 242047, + 241803, + 244074, + 242996, + 242996, + 234409, + 234755, + 234755, + 234723, + 234334, + 234448, + 234354, + 234828, + 234532, + 234498, + 234498, + 234704, + 234428, + 241885, + 237688, + 237725, + 237725, + 237764, + 233196, + 233196, + 233102, + 233102, + 233060, + 233147, + 241719, + 241389, + 241571, + 241600, + 244041, + 244041, + 241567, + 241513, + 241477, + 241499, + 241351, + 238886, + 238820, + 238913, + 238902, + 238902, + 238968, + 238968, + 238924, + 238936, + 239207, + 239207, + 239025, + 241932, + 241932, + 242153, + 241334, + 241440, + 241440, + 241597, + 241597, + 236201, + 236062, + 236062, + 237740, + 237733, + 237666, + 237666, + 237895, + 237895, + 237792, + 242953, + 243217, + 243217, + 237559, + 237722, + 237439, + 237491, + 241850, + 241850, + 241968, + 241942, + 241942, + 242065, + 241782, + 238536, + 238169, + 238169, + 238462, + 238369, + 238369, + 240122, + 240122, + 240037, + 240041, + 240041, + 240055, + 240055, + 244669, + 244484, + 244484, + 241804, + 242287, + 241845, + 241788, + 241788, + 234167, + 234154, + 234328, + 234328, + 240043, + 239935, + 240348, + 246180, + 246180, + 246141, + 246190, + 246255, + 246255, + 246337, + 246337, + 242741, + 242736, + 242736, + 242677, + 242766, + 242687, + 242763, + 242863, + 242754, + 240181, + 240181, + 239988, + 239988, + 240032, + 240399, + 240399, + 240187, + 239526, + 239633, + 239633, + 242982, + 243418, + 236404, + 236338, + 237511, + 237305, + 237305, + 237310, + 235813, + 235813, + 235837, + 236280, + 236280, + 235696, + 235701, + 236101, + 236101, + 235868, + 241061, + 241023, + 240964, + 241057, + 241057, + 241132, + 237981, + 237821, + 237821, + 237897, + 237897, + 240476, + 240476, + 240417, + 241226, + 241226, + 239041, + 239041, + 238885, + 238984, + 239195, + 239195, + 226325, + 226489, + 226489, + 227032, + 226992, + 227231, + 227231, + 227171, + 226016, + 226016, + 226078, + 226078, + 224230, + 224151, + 235453, + 235453, + 247272, + 247452, + 247266, + 247157, + 247157, + 247890, + 238074, + 237856, + 238149, + 237911, + 237772, + 237772, + 237859, + 237690, + 237740, + 237740, + 237805, + 240069, + 240055, + 240055, + 240013, + 240104, + 240104, + 240090, + 239983, + 239983, + 240022, + 240187, + 240432, + 239991, + 240044, + 240044, + 240071, + 244559, + 244709, + 244709, + 234489, + 234437, + 241585, + 241543, + 241666, + 241666, + 237649, + 237735, + 237714, + 238016, + 237808, + 237808, + 237659, + 237995, + 237995, + 237841, + 237841, + 237733, + 237620, + 237620, + 238292, + 238292, + 238628, + 244666, + 244666, + 244719, + 244574, + 244574 + ], + "sample_count": 1271 + }, + { + "pubkey": "CPBndAvykDtCEUeqSvZGAHufTLvYQwVw7CbMiAbryQ3s", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "target_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242310000000, + "samples": [ + 162652, + 162679, + 162564, + 162564, + 162450, + 162450, + 162761, + 162717, + 162568, + 162380, + 162455, + 162455, + 162523, + 162319, + 162530, + 162530, + 162459, + 162440, + 162608, + 162666, + 162416, + 162406, + 162513, + 162513, + 162631, + 162323, + 162323, + 162423, + 162427, + 162587, + 162618, + 162563, + 162498, + 162746, + 162460, + 162554, + 162665, + 162355, + 162591, + 162530, + 162673, + 162575, + 162704, + 162277, + 162490, + 162525, + 162551, + 162482, + 162378, + 162468, + 162479, + 162593, + 162603, + 162482, + 162684, + 162378, + 162772, + 162583, + 162543, + 162543, + 162630, + 162875, + 162631, + 162495, + 162489, + 162643, + 162739, + 162529, + 162529, + 162484, + 162621, + 162510, + 162510, + 162270, + 162500, + 162761, + 162761, + 168354, + 171677, + 162724, + 166682, + 162480, + 162548, + 162587, + 162492, + 162681, + 162582, + 162617, + 162617, + 162503, + 162442, + 162488, + 162453, + 162656, + 162629, + 162524, + 162661, + 162529, + 162419, + 162676, + 162627, + 162418, + 162472, + 162433, + 162406, + 162519, + 162402, + 162465, + 162478, + 162588, + 162783, + 162486, + 162486, + 162443, + 162706, + 162367, + 162544, + 162657, + 162389, + 162584, + 162607, + 162601, + 162592, + 162685, + 162698, + 162499, + 162508, + 163894, + 162523, + 162617, + 185426, + 162515, + 162551, + 162364, + 162364, + 162730, + 162631, + 162629, + 162738, + 181994, + 162541, + 162471, + 162718, + 162523, + 162651, + 162631, + 162631, + 162658, + 162286, + 162574, + 162500, + 162607, + 162305, + 162410, + 162554, + 162409, + 162541, + 162593, + 162593, + 162507, + 162553, + 162456, + 162423, + 162513, + 162591, + 162492, + 162492, + 162565, + 162452, + 162706, + 162706, + 162592, + 162537, + 162440, + 162784, + 162441, + 162441, + 162589, + 162501, + 162501, + 162470, + 162582, + 162454, + 162475, + 162317, + 162502, + 162528, + 162693, + 162537, + 162674, + 162371, + 162527, + 162589, + 162355, + 162736, + 162520, + 162728, + 162437, + 162393, + 162540, + 162540, + 162571, + 162571, + 162472, + 162392, + 162392, + 162636, + 162461, + 162391, + 162950, + 162664, + 162506, + 162474, + 162356, + 162453, + 162504, + 162450, + 162450, + 162417, + 162582, + 162570, + 162703, + 162644, + 162256, + 162574, + 162720, + 162502, + 162379, + 162585, + 162540, + 162397, + 162574, + 162574, + 162437, + 162508, + 162424, + 162661, + 162607, + 162400, + 162591, + 162337, + 162416, + 162416, + 162591, + 162334, + 162458, + 162342, + 162704, + 162797, + 162466, + 162807, + 162613, + 162635, + 162541, + 162541, + 162553, + 163181, + 162696, + 162716, + 162507, + 162600, + 162598, + 162453, + 162567, + 162686, + 162800, + 162405, + 162433, + 162596, + 162526, + 162666, + 162603, + 162621, + 162564, + 162458, + 162508, + 162407, + 162524, + 162501, + 162560, + 162381, + 162613, + 162466, + 162404, + 162404, + 162366, + 162598, + 162526, + 162497, + 162504, + 162504, + 162448, + 162573, + 162466, + 162466, + 165991, + 162517, + 162438, + 162438, + 162511, + 162393, + 162485, + 162455, + 162535, + 163222, + 162604, + 166873, + 162820, + 171585, + 162602, + 162616, + 162377, + 162634, + 162467, + 162467, + 162550, + 162556, + 162391, + 162391, + 162459, + 162423, + 162423, + 162461, + 162520, + 162564, + 162492, + 162506, + 162307, + 162342, + 162499, + 162389, + 162473, + 162473, + 162465, + 162465, + 162506, + 162657, + 162563, + 162361, + 162543, + 162670, + 162445, + 163201, + 162684, + 162684, + 162607, + 162484, + 162484, + 162565, + 162415, + 162303, + 162512, + 162549, + 162549, + 162526, + 162628, + 162501, + 162594, + 162452, + 162345, + 162518, + 162527, + 162684, + 162529, + 162526, + 162454, + 162524, + 162518, + 162607, + 162347, + 162580, + 162563, + 162563, + 162266, + 162538, + 162307, + 162427, + 162365, + 162489, + 162575, + 162575, + 162574, + 162805, + 162593, + 162721, + 162496, + 162578, + 162533, + 162434, + 162301, + 162641, + 162472, + 162820, + 162557, + 162606, + 162515, + 162427, + 162499, + 162413, + 162445, + 162458, + 162669, + 162588, + 162588, + 162572, + 162526, + 162509, + 162576, + 162614, + 162406, + 162529, + 162565, + 162609, + 162608, + 162369, + 162399, + 162497, + 162497, + 162436, + 162863, + 162700, + 162306, + 162618, + 162712, + 162712, + 162548, + 162555, + 162473, + 162473, + 162628, + 162574, + 162526, + 162425, + 162615, + 162618, + 162597, + 162597, + 162753, + 162433, + 162441, + 162708, + 162708, + 162684, + 162537, + 162459, + 162516, + 162653, + 162388, + 162487, + 162602, + 162602, + 162451, + 162458, + 162479, + 162571, + 162446, + 162446, + 162521, + 162293, + 162690, + 162452, + 162641, + 162314, + 162341, + 162512, + 162621, + 162576, + 162450, + 162377, + 162362, + 162362, + 162591, + 162664, + 162532, + 162668, + 162668, + 162538, + 162629, + 162477, + 162506, + 162747, + 162428, + 162428, + 162593, + 162593, + 162500, + 162543, + 162474, + 162738, + 162594, + 162447, + 162616, + 162534, + 162323, + 162323, + 162467, + 162787, + 162532, + 162746, + 162611, + 162447, + 162580, + 162535, + 455151, + 162427, + 162644, + 162591, + 162388, + 162504, + 162589, + 162694, + 162737, + 162584, + 162511, + 162524, + 162403, + 162403, + 162403, + 162399, + 162515, + 162465, + 162361, + 162361, + 162597, + 162483, + 162442, + 162658, + 162591, + 162591, + 162437, + 162637, + 162491, + 162399, + 162399, + 162650, + 166209, + 162489, + 162511, + 162475, + 162479, + 162609, + 162441, + 162388, + 162614, + 162502, + 162287, + 162404, + 162560, + 162531, + 162751, + 162715, + 162889, + 162507, + 162349, + 162442, + 162425, + 162521, + 162703, + 162606, + 162461, + 162314, + 162612, + 162646, + 162537, + 162687, + 162687, + 162357, + 162637, + 162637, + 162792, + 162448, + 162479, + 162441, + 162409, + 162326, + 162488, + 162590, + 162557, + 162603, + 162340, + 162445, + 162517, + 162466, + 162522, + 162483, + 162491, + 162491, + 162453, + 162456, + 162414, + 162414, + 162396, + 162646, + 162625, + 162625, + 162443, + 162409, + 162313, + 162803, + 162479, + 162415, + 162286, + 162524, + 162523, + 162383, + 162735, + 163250, + 162553, + 162634, + 162366, + 162490, + 162424, + 162476, + 162457, + 162457, + 162579, + 162521, + 162521, + 162534, + 162494, + 162476, + 162296, + 162391, + 162411, + 162521, + 162551, + 162549, + 162547, + 162500, + 163016, + 162637, + 162636, + 162419, + 162657, + 162540, + 162676, + 162676, + 162509, + 162751, + 162445, + 162614, + 162471, + 162635, + 162571, + 162320, + 162320, + 162769, + 162475, + 162557, + 162557, + 162491, + 162675, + 162438, + 162478, + 162638, + 162638, + 162602, + 162427, + 162972, + 162446, + 162687, + 162330, + 162432, + 162678, + 162533, + 162568, + 162523, + 162565, + 162689, + 162521, + 162657, + 162578, + 162434, + 162662, + 162514, + 162541, + 162475, + 162360, + 162360, + 162614, + 162605, + 162566, + 162511, + 162432, + 162421, + 162621, + 162683, + 162903, + 162903, + 162652, + 162741, + 162560, + 162380, + 162413, + 162608, + 162608, + 162616, + 162763, + 162796, + 162527, + 162467, + 162406, + 162533, + 162410, + 162429, + 162451, + 162451, + 162652, + 162721, + 162548, + 162410, + 162499, + 162733, + 162441, + 162546, + 162646, + 162552, + 162481, + 162468, + 162470, + 162516, + 162601, + 162618, + 163002, + 162423, + 162506, + 162672, + 162705, + 162546, + 162676, + 162411, + 162502, + 162502, + 162535, + 162396, + 162435, + 162717, + 162717, + 162575, + 162554, + 162387, + 162343, + 162634, + 162469, + 162642, + 162642, + 162605, + 162736, + 162789, + 162542, + 162603, + 162527, + 162893, + 162603, + 162593, + 162619, + 162643, + 162564, + 162609, + 162569, + 162606, + 162652, + 162535, + 162554, + 162662, + 162568, + 162572, + 174137, + 162523, + 162599, + 162507, + 162507, + 162658, + 162325, + 162516, + 162341, + 162587, + 162767, + 162593, + 162595, + 162595, + 162583, + 162703, + 162619, + 162466, + 162547, + 162521, + 162574, + 162539, + 162539, + 162718, + 162537, + 162439, + 162439, + 162549, + 162521, + 162464, + 162528, + 162603, + 162603, + 162404, + 162440, + 162484, + 162291, + 162291, + 162575, + 162524, + 162593, + 162638, + 162541, + 162541, + 162479, + 162581, + 162404, + 162642, + 162390, + 162448, + 162416, + 162689, + 162306, + 162306, + 162544, + 162544, + 162335, + 162490, + 162520, + 162681, + 162681, + 162339, + 162699, + 162415, + 162538, + 162588, + 162694, + 162435, + 162393, + 162498, + 162762, + 162483, + 162476, + 162622, + 162479, + 162483, + 162518, + 162575, + 162537, + 162475, + 175244, + 162485, + 162654, + 162395, + 162607, + 162607, + 162742, + 162600, + 162670, + 162533, + 162509, + 162545, + 162342, + 162342, + 162320, + 162434, + 162500, + 162497, + 162400, + 162493, + 162390, + 162405, + 162405, + 162449, + 162462, + 162489, + 162405, + 162327, + 162596, + 162340, + 162589, + 162548, + 162393, + 162436, + 162479, + 162479, + 162607, + 162553, + 162594, + 162436, + 162459, + 162483, + 162430, + 162430, + 162509, + 162411, + 162438, + 162434, + 162382, + 162598, + 162491, + 162637, + 162254, + 162476, + 162254, + 162316, + 162387, + 162735, + 162408, + 162499, + 162571, + 162412, + 162455, + 162612, + 162602, + 162550, + 162436, + 162530, + 162480, + 162699, + 162454, + 162433, + 162386, + 162470, + 162404, + 210703, + 162651, + 162682, + 162425, + 162706, + 162487, + 162468, + 162516, + 162281, + 162384, + 162330, + 162504, + 162569, + 162567, + 162406, + 162329, + 162550, + 162542, + 162667, + 162524, + 162486, + 162336, + 162548, + 162547, + 162636, + 162537, + 162468, + 162318, + 162499, + 162641, + 162641, + 162665, + 162475, + 162384, + 162347, + 162451, + 162274, + 162466, + 162270, + 162415, + 162429, + 162641, + 162373, + 162586, + 162497, + 162311, + 162481, + 162548, + 162559, + 162367, + 162537, + 162334, + 162750, + 162529, + 162704, + 162534, + 162519, + 729804, + 162723, + 162348, + 162678, + 162622, + 162303, + 162473, + 162422, + 162334, + 162450, + 162413, + 162561, + 162493, + 162788, + 162391, + 162419, + 162346, + 162582, + 173624, + 162625, + 162625, + 162564, + 162466, + 162483, + 162851, + 162435, + 162672, + 162504, + 168943, + 162480, + 162506, + 162589, + 162626, + 162416, + 162522, + 162479, + 162452, + 172888, + 162420, + 162797, + 162573, + 162646, + 162585, + 162615, + 162389, + 162395, + 162545, + 162608, + 162277, + 162539, + 162642, + 162528, + 162465, + 162694, + 162499, + 162727, + 162462, + 162590, + 162380, + 162364, + 162458, + 162497, + 162510, + 162469, + 162513, + 162338, + 162358, + 162525, + 162522, + 162389, + 162425, + 162308, + 162406, + 162803, + 162466, + 162544, + 162319, + 162368, + 162747, + 162461, + 162549, + 162692, + 162523, + 162539, + 162330, + 162665, + 162346, + 162342, + 162588, + 162816, + 162395, + 162399, + 162437, + 162453, + 162525, + 162566, + 162467, + 162284, + 162439, + 162467, + 162504, + 162623, + 162471, + 162518, + 162992, + 162473, + 162334, + 162614, + 162404, + 162394, + 162554, + 162645, + 162310, + 162538, + 162403, + 162566, + 162575, + 162575, + 162390, + 162583, + 162420, + 162555, + 162472, + 162453, + 162647, + 162675, + 162443, + 162638, + 162513, + 162490, + 162498, + 162551, + 162546, + 162540, + 162379, + 162408, + 162623, + 162394, + 162347, + 162668, + 162535, + 162678, + 162589, + 162510, + 162624, + 162487, + 162428, + 162535, + 162787, + 162665, + 162389, + 162578, + 162573, + 162695, + 162386, + 162535, + 162436, + 162386, + 162598, + 162320, + 162486, + 162596, + 162511, + 162458, + 162421, + 162425, + 162627, + 162480, + 162473, + 162535, + 163712, + 162547, + 162565, + 162658, + 162574, + 162693, + 162448, + 162493, + 162427, + 162435, + 162391, + 162504, + 162581, + 162608, + 162605, + 162406, + 162511, + 162574, + 162706, + 162617, + 162466, + 162460, + 162715, + 162451, + 162495, + 162622, + 162395, + 162507, + 162391, + 162412, + 162698, + 162538, + 162364, + 162594, + 162710, + 162545, + 162527, + 162808, + 162542, + 162452, + 162430, + 162726, + 162540, + 162518, + 162645, + 162606, + 162563, + 162483, + 162423, + 162825, + 162565, + 162572, + 162628, + 162872, + 162569, + 162484, + 162647, + 162561, + 162353, + 162651, + 162559, + 162573, + 162500, + 162763, + 162459, + 162639, + 162688, + 162415, + 162553, + 162528, + 162298, + 162532, + 162512, + 162520, + 162652, + 162507, + 162478, + 162536, + 162300, + 162718, + 162518, + 162656, + 162524, + 162463, + 162632, + 162510, + 162557, + 162691, + 162486, + 162568, + 162550, + 162620, + 162451, + 162527, + 162488, + 162392, + 162459, + 162958, + 162651, + 162614, + 162496, + 162333, + 162600, + 162574, + 162646, + 162510, + 162569, + 162447, + 162532, + 162219, + 162402, + 162504, + 162836, + 162391, + 162236, + 162563, + 162493 + ], + "sample_count": 1266 + }, + { + "pubkey": "3em5h1iFo8VAg63JV7FDGPt7kY2x8uoyRLnXXhEpw4zj", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242245000000, + "samples": [ + 163258, + 163273, + 163161, + 163119, + 163265, + 163332, + 163231, + 163485, + 163248, + 163230, + 168664, + 168891, + 163589, + 163243, + 163256, + 163441, + 163155, + 163152, + 163290, + 163371, + 163178, + 163164, + 163714, + 163348, + 163414, + 163317, + 163223, + 163220, + 163187, + 163541, + 163905, + 163405, + 163325, + 163421, + 163868, + 163480, + 163464, + 163657, + 163184, + 163143, + 163158, + 163313, + 163369, + 163218, + 163330, + 163498, + 163386, + 163301, + 163205, + 163211, + 163221, + 163307, + 163414, + 163449, + 163429, + 163431, + 163173, + 163457, + 163324, + 163061, + 163324, + 163315, + 163256, + 163313, + 163252, + 163246, + 163225, + 163508, + 163232, + 163319, + 163270, + 163211, + 163204, + 163477, + 163356, + 163306, + 163667, + 163372, + 163128, + 163264, + 163312, + 163277, + 163413, + 163190, + 163392, + 163397, + 163225, + 163154, + 163207, + 163438, + 163287, + 163217, + 163157, + 163172, + 163352, + 163484, + 163414, + 163744, + 163367, + 163212, + 163291, + 163239, + 163358, + 163310, + 163335, + 163553, + 165048, + 165579, + 163770, + 163492, + 163545, + 163407, + 163578, + 163585, + 163670, + 163371, + 163174, + 163217, + 163369, + 163509, + 163629, + 163275, + 163220, + 163286, + 163380, + 163280, + 163202, + 163507, + 163165, + 163359, + 163225, + 163200, + 163138, + 163214, + 163296, + 163364, + 163332, + 163327, + 163432, + 163439, + 163654, + 165527, + 163571, + 163671, + 163503, + 163484, + 163522, + 163394, + 163600, + 163647, + 163417, + 163231, + 163214, + 163700, + 163356, + 163275, + 163188, + 163350, + 163157, + 163171, + 163274, + 163238, + 163072, + 163116, + 163640, + 163397, + 163232, + 163483, + 163205, + 163186, + 163442, + 163205, + 163689, + 163339, + 163354, + 163223, + 163244, + 163238, + 163625, + 163377, + 163271, + 163488, + 163270, + 163470, + 163396, + 163547, + 163218, + 163374, + 163370, + 163337, + 163500, + 163087, + 163264, + 163178, + 163311, + 163420, + 163201, + 163200, + 163167, + 163154, + 163332, + 163186, + 163359, + 163282, + 163234, + 163284, + 163117, + 163460, + 163251, + 163615, + 163508, + 163393, + 163331, + 163459, + 163245, + 163355, + 163195, + 163289, + 163384, + 163378, + 163395, + 163476, + 163329, + 163350, + 163457, + 163817, + 163486, + 163411, + 163331, + 163393, + 163353, + 163314, + 163720, + 163364, + 163289, + 163483, + 163504, + 163349, + 163353, + 163334, + 163260, + 163412, + 163097, + 163256, + 163694, + 163491, + 163418, + 163413, + 163169, + 163303, + 163299, + 163109, + 163259, + 163144, + 163297, + 163389, + 163172, + 163104, + 163151, + 163286, + 163141, + 163116, + 163264, + 163335, + 163212, + 163346, + 163197, + 163140, + 163127, + 163168, + 163262, + 163149, + 163162, + 163303, + 163146, + 163162, + 163474, + 163372, + 163147, + 163132, + 163166, + 163334, + 163422, + 163390, + 163716, + 163375, + 163556, + 163408, + 163097, + 163187, + 163145, + 163238, + 163336, + 163227, + 163085, + 163275, + 163176, + 163695, + 163346, + 163469, + 163795, + 163272, + 163250, + 163265, + 163288, + 163203, + 163078, + 163331, + 163137, + 163154, + 163087, + 163126, + 163177, + 163248, + 163271, + 163505, + 163321, + 163083, + 163134, + 163122, + 163325, + 163269, + 163337, + 163292, + 163321, + 163577, + 163392, + 163429, + 163374, + 163515, + 163436, + 163473, + 163340, + 163121, + 163152, + 163127, + 163242, + 163312, + 163183, + 163189, + 163293, + 163310, + 163596, + 163189, + 163245, + 163390, + 163164, + 163112, + 163198, + 163089, + 163335, + 163164, + 163339, + 163234, + 163276, + 163143, + 163137, + 163151, + 163146, + 163259, + 163248, + 163160, + 163397, + 163082, + 163128, + 163229, + 163259, + 163921, + 163525, + 163320, + 163132, + 163302, + 163634, + 163355, + 163412, + 163484, + 163399, + 163376, + 163327, + 163478, + 163415, + 163323, + 163753, + 163513, + 163367, + 163334, + 163332, + 163517, + 163317, + 163450, + 163542, + 163283, + 163421, + 163410, + 163327, + 163532, + 163452, + 163513, + 163536, + 163419, + 163473, + 163487, + 163446, + 163205, + 163426, + 163420, + 163126, + 163186, + 163138, + 163087, + 163419, + 163145, + 163318, + 163506, + 163103, + 163164, + 163209, + 163155, + 163163, + 163302, + 164087, + 163316, + 163162, + 163228, + 163114, + 163260, + 163479, + 163529, + 163373, + 163168, + 163156, + 163350, + 163503, + 163101, + 163254, + 163302, + 163340, + 163442, + 163331, + 163650, + 163396, + 163486, + 163612, + 163562, + 163394, + 163398, + 163089, + 163347, + 163219, + 163364, + 163404, + 163426, + 163195, + 163390, + 163245, + 163057, + 163396, + 163668, + 163407, + 163486, + 163403, + 163128, + 163230, + 163586, + 163540, + 163270, + 163051, + 163455, + 163443, + 163231, + 163442, + 163070, + 163760, + 163306, + 163160, + 163295, + 163170, + 163191, + 163495, + 163568, + 163698, + 163453, + 163163, + 163144, + 163192, + 163203, + 163116, + 163510, + 163306, + 163276, + 163378, + 163527, + 163178, + 163351, + 163651, + 163337, + 163115, + 163242, + 163217, + 163294, + 163217, + 163172, + 163331, + 163155, + 163408, + 163238, + 163154, + 163361, + 163357, + 163359, + 163287, + 163276, + 163344, + 163432, + 163573, + 163516, + 163765, + 163985, + 163237, + 163406, + 163214, + 163108, + 163100, + 163172, + 163156, + 163342, + 163463, + 163260, + 163093, + 163473, + 163369, + 163253, + 163377, + 163217, + 163266, + 163324, + 163166, + 163275, + 163483, + 163351, + 163259, + 163204, + 163071, + 163162, + 163262, + 163326, + 163186, + 163327, + 163184, + 163113, + 163322, + 163140, + 163240, + 163291, + 163224, + 163468, + 163171, + 163105, + 163358, + 163324, + 163454, + 163228, + 163475, + 163146, + 163251, + 163156, + 163255, + 163274, + 163177, + 163328, + 163831, + 163471, + 163311, + 163089, + 163329, + 163230, + 163083, + 163367, + 163644, + 163383, + 163399, + 163279, + 163603, + 163476, + 163462, + 163526, + 163387, + 163311, + 163228, + 163264, + 163359, + 163195, + 163334, + 163172, + 163273, + 163088, + 163522, + 163238, + 163221, + 167867, + 163246, + 163301, + 163384, + 163287, + 163598, + 163151, + 163142, + 163379, + 163205, + 163530, + 164253, + 163076, + 163352, + 163301, + 163227, + 163393, + 163124, + 163444, + 163150, + 163168, + 163274, + 163203, + 163497, + 163076, + 163092, + 163211, + 163465, + 163503, + 163372, + 163584, + 163581, + 163162, + 163238, + 163129, + 163215, + 163610, + 163237, + 163354, + 163143, + 163356, + 163184, + 163321, + 163135, + 163431, + 163321, + 163453, + 163142, + 163172, + 163349, + 163368, + 163299, + 163439, + 163554, + 163352, + 163116, + 163099, + 163334, + 163304, + 163284, + 163400, + 163374, + 163419, + 163340, + 163346, + 163290, + 163353, + 163260, + 163425, + 163516, + 163104, + 163253, + 163210, + 163225, + 163492, + 163706, + 164005, + 163128, + 163318, + 168318, + 168404, + 163320, + 163177, + 163357, + 163420, + 163414, + 163430, + 163403, + 163355, + 163273, + 163434, + 163234, + 163168, + 163162, + 163326, + 163228, + 163350, + 163185, + 163718, + 163184, + 163257, + 163194, + 163227, + 163237, + 163162, + 163552, + 163538, + 163147, + 163187, + 163146, + 163231, + 163214, + 163234, + 163555, + 163142, + 163139, + 163203, + 163210, + 163179, + 163276, + 163221, + 163257, + 163288, + 163127, + 163409, + 163460, + 163580, + 163425, + 163748, + 163391, + 163379, + 163401, + 163637, + 163702, + 163190, + 163456, + 163349, + 163481, + 163472, + 163225, + 163549, + 163220, + 163162, + 163626, + 163271, + 163131, + 163120, + 163169, + 163163, + 163215, + 163309, + 163214, + 163225, + 163272, + 163340, + 163115, + 163275, + 163687, + 163411, + 163334, + 163296, + 163205, + 163185, + 163175, + 163182, + 163308, + 163330, + 163208, + 163141, + 163152, + 163128, + 163213, + 163429, + 163447, + 163499, + 163389, + 163968, + 163157, + 163194, + 163477, + 163852, + 163399, + 163298, + 163274, + 163196, + 163274, + 163242, + 163142, + 163412, + 163369, + 163372, + 163349, + 163386, + 163484, + 163343, + 163495, + 163574, + 163374, + 163426, + 163396, + 163357, + 163528, + 163449, + 163545, + 163148, + 163241, + 163181, + 163262, + 163362, + 163439, + 163429, + 163226, + 163353, + 163100, + 163154, + 163154, + 163269, + 163264, + 163434, + 163244, + 163372, + 163243, + 163149, + 163258, + 163173, + 163303, + 163284, + 163474, + 167263, + 163251, + 163265, + 163242, + 163279, + 163562, + 163296, + 163128, + 163269, + 163470, + 163214, + 163386, + 163462, + 163502, + 163335, + 163169, + 163181, + 163613, + 163297, + 163334, + 163425, + 163232, + 163439, + 163170, + 163140, + 163276, + 163404, + 163230, + 163321, + 163168, + 163178, + 163267, + 163243, + 163342, + 163192, + 163442, + 163176, + 163208, + 163109, + 163166, + 163445, + 163143, + 163400, + 163383, + 166633, + 163210, + 163219, + 163171, + 163340, + 163322, + 163624, + 163331, + 163383, + 163409, + 163394, + 163372, + 163472, + 163715, + 163589, + 163510, + 163386, + 163468, + 163489, + 163247, + 163105, + 168668, + 168278, + 168363, + 163135, + 163125, + 163271, + 163121, + 163086, + 163086, + 163157, + 163054, + 163054, + 163344, + 163344, + 163510, + 163427, + 163427, + 163151, + 163061, + 163108, + 163108, + 163691, + 163154, + 163128, + 163128, + 163092, + 163299, + 163187, + 163291, + 163291, + 163229, + 163206, + 163237, + 163475, + 163475, + 163373, + 163281, + 163281, + 163413, + 163442, + 163442, + 163319, + 163398, + 163231, + 163373, + 163276, + 163073, + 163052, + 163159, + 163132, + 163055, + 163261, + 163239, + 163342, + 163342, + 163289, + 163376, + 163304, + 163469, + 163480, + 163031, + 163169, + 163073, + 163345, + 163345, + 163402, + 163413, + 163504, + 163325, + 163376, + 163376, + 163347, + 163347, + 163383, + 163744, + 163176, + 163126, + 163333, + 163806, + 163806, + 163318, + 163318, + 163103, + 163213, + 163213, + 163294, + 163139, + 163183, + 163049, + 163311, + 163304, + 163310, + 163211, + 163211, + 163956, + 163164, + 163164, + 163302, + 163078, + 163078, + 163166, + 163066, + 163248, + 163248, + 163511, + 163089, + 163089, + 163127, + 163163, + 163111, + 163184, + 163184, + 163418, + 163204, + 163926, + 163393, + 163393, + 163120, + 163120, + 163280, + 163301, + 163251, + 163162, + 163162, + 163161, + 163157, + 163523, + 163221, + 163062, + 163174, + 163174, + 163221, + 163228, + 163228, + 163606, + 163312, + 163137, + 163209, + 163203, + 163203, + 163106, + 163462, + 163053, + 163053, + 163122, + 163122, + 163320, + 163440, + 163367, + 163367, + 163165, + 163102, + 163102, + 163227, + 163172, + 163140, + 163542, + 163155, + 163134, + 163076, + 163360, + 163112, + 163128, + 163128, + 163363, + 163493, + 163370, + 163352, + 163352, + 163184, + 163146, + 163300, + 163300, + 163100, + 163343, + 163343, + 163378, + 163366, + 163245, + 163123, + 163123, + 163157, + 163453, + 163453, + 163322, + 163183, + 163240, + 163255, + 163387, + 163342, + 163178, + 163116, + 163185, + 163144, + 163267, + 163086, + 163145, + 163145, + 163205, + 163189, + 163189, + 163080, + 163195, + 163131, + 163131, + 163395, + 163206, + 163295, + 163295, + 163238, + 163238, + 163253, + 163253, + 163145, + 163247, + 163846, + 163314, + 163188, + 163188, + 163129, + 163277, + 163316, + 163178, + 163178, + 163330, + 163099, + 163099, + 163320, + 163109, + 163122, + 163328, + 163534, + 163534, + 163108, + 163346, + 163335, + 163335, + 163345, + 163345, + 163632, + 163047, + 163047, + 163144, + 163165, + 163306, + 163834, + 163454, + 163404, + 163176, + 163176, + 163204, + 163188, + 163217, + 163203, + 163259, + 163303, + 163169, + 163205, + 163157, + 163311, + 163176, + 163414, + 163414, + 163063, + 163063, + 163203, + 163267, + 163235, + 163245, + 163494, + 163291, + 163147, + 163590, + 163590, + 163408, + 162859, + 162849, + 162815, + 162815, + 162647, + 162633, + 162633, + 162723, + 163237, + 163095, + 162806, + 162856, + 162856, + 162815, + 162701, + 162646, + 162840, + 162897, + 162591, + 162681, + 162609, + 162865, + 162865, + 162930, + 163149, + 162719, + 162935, + 162696, + 162681, + 162614, + 162614, + 162802, + 162693, + 162684, + 162612, + 162729, + 162659, + 163772, + 163772, + 162767, + 162767, + 162618, + 162634, + 162662, + 162552, + 162665, + 162704, + 162780, + 162609, + 162609, + 162771, + 162771, + 163061, + 162767, + 162557, + 162557, + 162624, + 162664, + 162698, + 162739, + 162664, + 162738, + 162707, + 162580, + 162685, + 162800, + 162640, + 162827, + 162767, + 162552, + 162718, + 162718, + 162823, + 162823, + 155804, + 155846, + 155998, + 155819, + 155868, + 155855, + 155906, + 155906, + 155917, + 155958, + 155982, + 155982, + 156048, + 155859, + 156043, + 156300, + 156100, + 156326, + 156326, + 155938, + 155870, + 155870, + 157189, + 157189, + 156187, + 156085, + 156085, + 155963, + 156087, + 156087 + ], + "sample_count": 1271 + }, + { + "pubkey": "9YrEksxjuLshkG5wjKjQGRUhqHzPAG7QucKhc4UQAHtT", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242254000000, + "samples": [ + 244804, + 244729, + 244570, + 247833, + 248259, + 248152, + 247915, + 249354, + 247870, + 248034, + 248036, + 242849, + 243015, + 242743, + 243373, + 242956, + 247996, + 242704, + 242910, + 242872, + 242923, + 244873, + 244717, + 244554, + 244758, + 244751, + 244819, + 244768, + 244836, + 244805, + 244732, + 244529, + 244816, + 244653, + 244612, + 244557, + 244729, + 244957, + 242541, + 242683, + 243066, + 242787, + 242884, + 242743, + 242867, + 243131, + 340857, + 242777, + 242759, + 242727, + 242680, + 244748, + 244871, + 244781, + 244646, + 244739, + 244696, + 244696, + 244736, + 245125, + 244739, + 244640, + 244637, + 244654, + 244579, + 245054, + 244808, + 244778, + 244569, + 244618, + 244655, + 244621, + 244668, + 245011, + 244695, + 244810, + 244757, + 244622, + 244902, + 244630, + 244722, + 244531, + 244686, + 245661, + 244924, + 244775, + 244583, + 244652, + 244605, + 245950, + 244766, + 244659, + 244956, + 244694, + 244615, + 244557, + 244927, + 246488, + 245486, + 245548, + 244718, + 245061, + 245172, + 247921, + 248046, + 248274, + 248043, + 248149, + 247848, + 249115, + 257504, + 247979, + 248038, + 247939, + 247827, + 247983, + 247979, + 248018, + 247976, + 248060, + 247937, + 248200, + 248242, + 242754, + 242697, + 242840, + 242867, + 243038, + 242747, + 243183, + 243059, + 413161, + 244735, + 244809, + 243790, + 243673, + 243787, + 270944, + 243699, + 263467, + 243721, + 303498, + 296776, + 263134, + 250726, + 244510, + 244631, + 243599, + 243617, + 243797, + 244427, + 243622, + 267476, + 301940, + 253175, + 310412, + 267582, + 281681, + 297333, + 243672, + 332760, + 250119, + 293199, + 243859, + 306589, + 243773, + 246039, + 288462, + 243690, + 243747, + 243488, + 313729, + 244069, + 243873, + 243600, + 243671, + 243596, + 302265, + 243674, + 243674, + 325135, + 243730, + 332409, + 243795, + 259541, + 309083, + 306542, + 297153, + 277793, + 280962, + 331992, + 282564, + 335229, + 300071, + 310747, + 275457, + 293880, + 277235, + 315820, + 298221, + 263017, + 322782, + 332905, + 278830, + 260136, + 355170, + 323275, + 341986, + 361887, + 299886, + 321035, + 338174, + 303497, + 316106, + 308181, + 277321, + 284996, + 244714, + 272649, + 257231, + 296395, + 265420, + 258224, + 250958, + 288899, + 247130, + 242955, + 245608, + 255291, + 242698, + 242823, + 242762, + 244008, + 242720, + 242676, + 242778, + 242839, + 242760, + 243278, + 243106, + 243043, + 242941, + 242775, + 242793, + 242739, + 242791, + 242848, + 243211, + 243551, + 243729, + 243673, + 243648, + 243604, + 248661, + 247880, + 248239, + 248091, + 247901, + 247835, + 248030, + 248220, + 247918, + 248208, + 242757, + 242925, + 242866, + 242754, + 242790, + 244817, + 244993, + 244694, + 244787, + 244807, + 244602, + 244851, + 244681, + 244529, + 244709, + 250162, + 244680, + 244896, + 244622, + 244832, + 244598, + 244709, + 244956, + 244651, + 244809, + 243527, + 244030, + 243705, + 247857, + 248107, + 248052, + 248020, + 248207, + 247989, + 248203, + 247952, + 247894, + 248304, + 247942, + 247889, + 254876, + 248043, + 248002, + 242856, + 242956, + 244555, + 244737, + 244652, + 244659, + 244498, + 244719, + 244909, + 245026, + 244648, + 244615, + 242744, + 242755, + 242736, + 242817, + 242969, + 242788, + 242747, + 242809, + 248006, + 247915, + 243752, + 243709, + 243809, + 248062, + 248064, + 247820, + 248091, + 247983, + 242840, + 242808, + 242810, + 242803, + 242787, + 242818, + 242966, + 242774, + 242868, + 242827, + 242776, + 242745, + 243639, + 243542, + 243631, + 243703, + 243767, + 243640, + 243648, + 243793, + 243569, + 243663, + 243664, + 243689, + 243779, + 243720, + 243562, + 243648, + 243640, + 243777, + 243575, + 244086, + 243723, + 243732, + 243789, + 243775, + 243700, + 243528, + 243819, + 243804, + 243478, + 243729, + 244060, + 243648, + 243654, + 243017, + 242788, + 243576, + 243605, + 243636, + 243598, + 243625, + 243755, + 243618, + 243657, + 243606, + 243577, + 243761, + 243789, + 254772, + 243610, + 243652, + 242797, + 242780, + 242619, + 242850, + 242945, + 242745, + 242717, + 242952, + 242951, + 242775, + 242969, + 242902, + 242875, + 242794, + 242969, + 243019, + 242781, + 242672, + 242833, + 242845, + 243544, + 244192, + 243813, + 244671, + 244531, + 244690, + 244651, + 244520, + 244696, + 244969, + 248236, + 248292, + 247905, + 244680, + 244778, + 244728, + 244603, + 244739, + 244744, + 244710, + 244503, + 244727, + 244658, + 242721, + 242882, + 242883, + 242720, + 242752, + 242771, + 242742, + 242889, + 242870, + 242843, + 242717, + 242690, + 242745, + 244049, + 242873, + 242798, + 242971, + 242828, + 242762, + 242677, + 242866, + 242805, + 244644, + 244652, + 244714, + 247884, + 247863, + 248051, + 247948, + 247922, + 247959, + 247959, + 247959, + 247852, + 247985, + 247904, + 247863, + 244511, + 244821, + 244724, + 242703, + 242789, + 242892, + 242782, + 242924, + 242767, + 242803, + 242741, + 242949, + 242843, + 248001, + 247967, + 247965, + 247962, + 248110, + 248042, + 248029, + 247882, + 247795, + 247851, + 247776, + 248032, + 243684, + 245666, + 243756, + 248069, + 247958, + 247986, + 248259, + 248170, + 248002, + 247910, + 247884, + 247869, + 248048, + 248041, + 248044, + 247850, + 247869, + 248015, + 244785, + 244656, + 247894, + 248426, + 248059, + 247990, + 247915, + 247931, + 248009, + 247972, + 247883, + 248553, + 247964, + 247881, + 247858, + 248069, + 247901, + 247853, + 248015, + 247924, + 247935, + 248003, + 248073, + 248011, + 247877, + 247817, + 248011, + 247966, + 247965, + 248112, + 247884, + 247972, + 248160, + 248248, + 248226, + 248005, + 247937, + 248153, + 247918, + 247868, + 247886, + 248286, + 243817, + 243597, + 243601, + 243626, + 243776, + 244735, + 244538, + 245169, + 244598, + 244717, + 244573, + 244606, + 244718, + 244706, + 244742, + 244585, + 244691, + 244813, + 244986, + 244900, + 247954, + 248124, + 248130, + 247955, + 247933, + 248002, + 247924, + 247950, + 247884, + 248286, + 247932, + 248034, + 247997, + 247977, + 248031, + 247878, + 248175, + 248082, + 248101, + 248157, + 247975, + 247866, + 248011, + 248000, + 248496, + 247827, + 247968, + 247969, + 247971, + 248019, + 247888, + 248220, + 248326, + 247841, + 248008, + 247993, + 247908, + 247941, + 247919, + 248199, + 248181, + 247948, + 247945, + 247965, + 247879, + 242721, + 242841, + 242862, + 247946, + 247764, + 247977, + 247960, + 247902, + 248066, + 248379, + 248018, + 248124, + 247905, + 248212, + 247880, + 248175, + 248066, + 247972, + 244664, + 244620, + 242714, + 242788, + 242910, + 242876, + 251299, + 244695, + 244661, + 244669, + 244713, + 245011, + 270424, + 245097, + 244676, + 245084, + 244651, + 244730, + 244543, + 244585, + 244595, + 245023, + 244758, + 244757, + 244672, + 244714, + 244927, + 244713, + 244870, + 244902, + 244629, + 246101, + 248224, + 247868, + 247963, + 247975, + 248210, + 248032, + 248046, + 247930, + 248138, + 248014, + 248058, + 248017, + 247950, + 243676, + 243920, + 243641, + 243756, + 243623, + 243765, + 243753, + 243828, + 243651, + 243662, + 243691, + 243826, + 243809, + 243879, + 243776, + 243585, + 243646, + 243765, + 243752, + 243651, + 243644, + 243741, + 243257, + 242852, + 242811, + 242783, + 242798, + 242777, + 242899, + 242854, + 242741, + 242764, + 247896, + 247873, + 247882, + 248162, + 247940, + 243046, + 242896, + 242796, + 244714, + 244765, + 244725, + 244803, + 244855, + 244765, + 244630, + 244624, + 244686, + 244874, + 244730, + 246485, + 244694, + 244745, + 244746, + 245137, + 244605, + 244591, + 244995, + 244714, + 244491, + 244581, + 247985, + 248071, + 248050, + 242795, + 243166, + 242702, + 242728, + 243007, + 242827, + 242743, + 242799, + 242947, + 242890, + 256046, + 250731, + 247960, + 247792, + 249033, + 248438, + 248267, + 260452, + 247959, + 247915, + 247915, + 259213, + 251817, + 271565, + 248173, + 248024, + 247832, + 243740, + 243847, + 244447, + 269350, + 243789, + 244158, + 244230, + 243568, + 245611, + 256155, + 247980, + 248010, + 247977, + 247856, + 249793, + 247978, + 403711, + 247995, + 247879, + 294758, + 249854, + 277544, + 312720, + 251612, + 248853, + 248072, + 248153, + 248989, + 247920, + 248056, + 248092, + 248330, + 248219, + 261800, + 254567, + 243326, + 253016, + 244993, + 244993, + 278832, + 248001, + 247935, + 309085, + 323359, + 279194, + 250243, + 265730, + 251571, + 322891, + 318735, + 354702, + 300344, + 282989, + 277220, + 248789, + 270448, + 250636, + 277207, + 307853, + 248097, + 247941, + 247969, + 252268, + 249857, + 282228, + 322870, + 269696, + 264308, + 323974, + 316420, + 266700, + 328053, + 248224, + 245778, + 279889, + 304475, + 244662, + 248007, + 244829, + 312115, + 244684, + 244614, + 245671, + 244927, + 244896, + 262246, + 245470, + 292364, + 244659, + 244876, + 268750, + 244640, + 244710, + 246715, + 245263, + 244739, + 246696, + 246898, + 310515, + 244731, + 282888, + 333520, + 322051, + 264689, + 319356, + 273428, + 244618, + 244855, + 295454, + 254876, + 326506, + 307186, + 244770, + 247273, + 305982, + 245022, + 418294, + 255469, + 245036, + 251104, + 311878, + 298607, + 266357, + 366334, + 308128, + 264864, + 350527, + 350527, + 284856, + 245709, + 250145, + 248915, + 244684, + 244539, + 244940, + 263383, + 337360, + 318797, + 266157, + 313846, + 295435, + 308338, + 332370, + 324573, + 256709, + 252026, + 252026, + 245003, + 242786, + 242857, + 242857, + 244836, + 248116, + 248873, + 247852, + 247966, + 248799, + 247850, + 248261, + 248255, + 248330, + 247946, + 247863, + 247899, + 248063, + 247979, + 247979, + 247887, + 247929, + 247898, + 247983, + 247995, + 247853, + 248313, + 248063, + 248003, + 247869, + 248238, + 247987, + 247911, + 244682, + 244851, + 244715, + 244854, + 244561, + 244737, + 244645, + 244843, + 244588, + 244923, + 248045, + 247837, + 243633, + 243750, + 243750, + 242781, + 242984, + 242796, + 242672, + 242708, + 247827, + 248010, + 247899, + 248064, + 247846, + 248045, + 247917, + 247991, + 247861, + 248025, + 247883, + 248137, + 248004, + 247874, + 247772, + 247772, + 247876, + 250043, + 247972, + 248045, + 247909, + 247909, + 242924, + 242721, + 242670, + 242855, + 242952, + 247728, + 248003, + 248003, + 247847, + 247877, + 247837, + 248126, + 248345, + 248228, + 248228, + 244783, + 244609, + 244661, + 244804, + 244779, + 244702, + 244801, + 244631, + 244631, + 244778, + 244748, + 244772, + 244562, + 244657, + 244514, + 244560, + 244729, + 244605, + 247835, + 248587, + 248056, + 247997, + 247926, + 247861, + 247806, + 248204, + 247988, + 253010, + 248003, + 247816, + 247816, + 247944, + 248166, + 248026, + 248108, + 248192, + 247922, + 247877, + 247776, + 248119, + 248025, + 247996, + 248109, + 247955, + 247921, + 247971, + 247887, + 248031, + 247943, + 248279, + 248005, + 247793, + 247793, + 243600, + 243696, + 243472, + 243962, + 243837, + 243710, + 243454, + 243722, + 243602, + 243775, + 243563, + 243686, + 243686, + 243676, + 243562, + 243562, + 243718, + 243688, + 243737, + 243517, + 243517, + 243510, + 242885, + 242685, + 242942, + 244550, + 245038, + 244753, + 244753, + 244635, + 244593, + 244767, + 244758, + 244756, + 244756, + 244810, + 244564, + 244659, + 244520, + 244678, + 245575, + 244700, + 244708, + 244634, + 244666, + 242979, + 242812, + 247808, + 247951, + 247924, + 247841, + 247904, + 244715, + 244654, + 244600, + 244627, + 244854, + 244641, + 244765, + 244669, + 242953, + 242639, + 242766, + 242896, + 243177, + 242748, + 242817, + 242924, + 242924, + 242667, + 242756, + 242987, + 247989, + 248013, + 248013, + 247944, + 247913, + 247903, + 248135, + 247979, + 247759, + 247811, + 242896, + 242702, + 242727, + 242727, + 242813, + 242730, + 242717, + 242804, + 242866, + 242914, + 242842, + 242891, + 243098, + 247854, + 247858, + 247793, + 248027, + 247884, + 247914, + 248291, + 247959, + 247889, + 247889, + 242821, + 242870, + 242870, + 242851, + 242874, + 242701, + 242701, + 242885, + 242920, + 242923, + 242765, + 242995, + 242777, + 242674, + 242807, + 242862, + 242862, + 244585, + 244677, + 244634, + 247965, + 247758, + 247825, + 247884, + 248081, + 247892, + 248333, + 244712, + 244707, + 244809, + 244809, + 244755, + 244782, + 244740, + 244904, + 244721, + 244640, + 244642, + 244693, + 244802, + 244580, + 244758, + 244868, + 244714, + 244764, + 244583, + 244558, + 244500, + 245056, + 244895, + 244556, + 244556, + 244728, + 244473, + 244473, + 244638, + 243818, + 243692, + 243780, + 243544, + 243657, + 243623, + 243623, + 243552, + 243666, + 244505, + 243669, + 243590, + 243441, + 243735, + 243639, + 243998, + 243611, + 243537, + 243537, + 243996, + 243996, + 243879, + 243899, + 243899, + 243705, + 243409, + 243363, + 243302, + 243339, + 243180, + 243535, + 243288, + 243363, + 243363, + 243227, + 243252, + 243252 + ], + "sample_count": 1271 + }, + { + "pubkey": "6gNnWLRS37BiQ6i2T3bmcr2gQyzWn3pzJrfWnfKHgY38", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242254000000, + "samples": [ + 72103, + 72124, + 72015, + 72088, + 71988, + 72114, + 72037, + 72150, + 72023, + 72021, + 72021, + 72369, + 72093, + 72087, + 72087, + 72336, + 72336, + 72016, + 72130, + 71995, + 72106, + 71930, + 71930, + 71995, + 72026, + 72039, + 71950, + 72052, + 72133, + 72478, + 72198, + 72001, + 72197, + 72063, + 72072, + 72148, + 72148, + 72684, + 72130, + 71975, + 72073, + 72177, + 72298, + 72164, + 72164, + 72280, + 72280, + 72153, + 72024, + 72182, + 72153, + 72097, + 72644, + 72060, + 72184, + 72095, + 72070, + 72138, + 72063, + 72176, + 72242, + 72032, + 72012, + 72098, + 72093, + 72247, + 72184, + 72821, + 72185, + 72005, + 72693, + 72058, + 72239, + 72031, + 72031, + 72176, + 71894, + 72094, + 72028, + 72048, + 72257, + 72147, + 72276, + 72276, + 72115, + 72173, + 72062, + 72161, + 72134, + 72299, + 72421, + 72043, + 71949, + 72762, + 72152, + 72455, + 72030, + 72356, + 72091, + 72114, + 72049, + 72098, + 72090, + 72459, + 72354, + 72711, + 72165, + 72083, + 72062, + 72872, + 72096, + 72201, + 72407, + 72154, + 72101, + 72026, + 72167, + 72103, + 72103, + 72083, + 72147, + 72089, + 72089, + 75430, + 75248, + 72220, + 72225, + 72328, + 72077, + 72146, + 72073, + 72137, + 72320, + 72267, + 72162, + 72161, + 72120, + 72054, + 71954, + 72056, + 72056, + 72167, + 72293, + 72159, + 72040, + 72134, + 72067, + 72052, + 72166, + 72336, + 72336, + 72079, + 72044, + 71990, + 72077, + 72077, + 72107, + 72126, + 72126, + 72050, + 72050, + 72001, + 72189, + 72164, + 72347, + 72347, + 72424, + 72108, + 72005, + 71988, + 72146, + 276531, + 72368, + 72162, + 72058, + 72167, + 72031, + 72271, + 72152, + 72179, + 72342, + 72041, + 72032, + 72089, + 72086, + 72221, + 72150, + 72374, + 72374, + 72139, + 72139, + 72031, + 72047, + 72047, + 72618, + 72552, + 72552, + 72107, + 71996, + 71996, + 72043, + 72043, + 72072, + 72165, + 71985, + 72130, + 71972, + 72172, + 71955, + 72264, + 72136, + 72022, + 71909, + 72006, + 72102, + 72102, + 71939, + 72790, + 72076, + 72076, + 71947, + 72044, + 71974, + 72166, + 72421, + 72017, + 71984, + 72061, + 71949, + 72093, + 72012, + 72137, + 72120, + 72061, + 72103, + 71948, + 71928, + 72047, + 72076, + 72101, + 72101, + 72013, + 72013, + 72138, + 72066, + 72268, + 72037, + 72141, + 72043, + 72009, + 72007, + 72075, + 72285, + 72134, + 72134, + 72096, + 72096, + 71956, + 72141, + 71994, + 71994, + 72048, + 72048, + 72072, + 72291, + 72099, + 72079, + 72153, + 72153, + 72160, + 72200, + 72023, + 72038, + 72026, + 72059, + 72074, + 72150, + 72359, + 72065, + 72003, + 72003, + 71999, + 72139, + 71952, + 72177, + 72088, + 72114, + 72174, + 72174, + 71990, + 72088, + 72088, + 72102, + 72068, + 72163, + 72057, + 72063, + 71988, + 72074, + 72074, + 72076, + 72012, + 71927, + 72033, + 72052, + 72032, + 72154, + 72203, + 72157, + 72056, + 72066, + 72066, + 72124, + 72141, + 72141, + 72493, + 72053, + 72053, + 71969, + 72075, + 71843, + 72217, + 72167, + 72131, + 72023, + 72093, + 72072, + 72072, + 72051, + 72152, + 72127, + 72183, + 72192, + 71992, + 72028, + 72100, + 72113, + 72226, + 72035, + 72018, + 72166, + 72227, + 72085, + 71951, + 72407, + 72248, + 72058, + 72015, + 72014, + 72014, + 72085, + 71942, + 72315, + 72017, + 71998, + 72176, + 72020, + 72128, + 72128, + 72184, + 72674, + 72039, + 72074, + 72000, + 71979, + 72207, + 72085, + 72207, + 72073, + 72073, + 71972, + 72087, + 72310, + 72116, + 72117, + 72184, + 71998, + 71996, + 71996, + 72045, + 72044, + 72192, + 72195, + 72082, + 72082, + 72020, + 72083, + 72090, + 72090, + 72325, + 72091, + 72001, + 72161, + 71994, + 72077, + 72183, + 72161, + 72161, + 72253, + 72131, + 72130, + 72371, + 72156, + 72224, + 72245, + 72529, + 71999, + 71999, + 72061, + 72017, + 73199, + 72040, + 72225, + 72121, + 72030, + 72213, + 72213, + 72107, + 71960, + 72227, + 72190, + 71946, + 72081, + 72166, + 72074, + 72260, + 72196, + 72223, + 72125, + 72666, + 72480, + 72067, + 80610, + 80610, + 77002, + 77002, + 73612, + 72071, + 76882, + 72482, + 74952, + 80303, + 78806, + 81963, + 81911, + 77809, + 73006, + 75837, + 72180, + 72180, + 72234, + 72234, + 72041, + 72114, + 72053, + 72154, + 72407, + 72677, + 73636, + 72086, + 74125, + 74125, + 72438, + 77356, + 78893, + 74781, + 74781, + 73536, + 81112, + 79567, + 82067, + 81326, + 75391, + 75391, + 73184, + 73184, + 81439, + 72206, + 72063, + 72063, + 72119, + 72098, + 72098, + 72110, + 72192, + 72156, + 72091, + 73014, + 73014, + 72111, + 72229, + 72385, + 72835, + 72029, + 72261, + 72390, + 72169, + 72042, + 72061, + 71986, + 72026, + 71962, + 72313, + 72092, + 72086, + 72063, + 72113, + 72138, + 72623, + 72401, + 72538, + 72084, + 72138, + 72427, + 72018, + 72057, + 72090, + 72085, + 72109, + 72142, + 72160, + 72033, + 72295, + 72116, + 72203, + 72238, + 72026, + 72026, + 72106, + 71990, + 72065, + 72088, + 72336, + 72224, + 72139, + 71973, + 72228, + 72195, + 72114, + 72264, + 72192, + 72036, + 72119, + 72098, + 72189, + 72245, + 72011, + 72326, + 72182, + 74275, + 80381, + 72022, + 76587, + 76587, + 74525, + 75919, + 75919, + 79741, + 79741, + 81264, + 79237, + 81972, + 82145, + 80840, + 81951, + 81831, + 81717, + 81484, + 81774, + 81774, + 74506, + 72207, + 72104, + 74303, + 76401, + 80173, + 76858, + 80630, + 80559, + 80559, + 80815, + 80815, + 81786, + 81786, + 81884, + 81884, + 81990, + 81979, + 81841, + 81848, + 82253, + 82253, + 81738, + 79528, + 81054, + 78210, + 73154, + 72382, + 73396, + 73697, + 73845, + 75873, + 77157, + 73903, + 72080, + 72049, + 72514, + 72514, + 79623, + 72075, + 72288, + 72288, + 77518, + 81203, + 81718, + 81718, + 81716, + 81716, + 81867, + 81279, + 81919, + 81891, + 81170, + 81733, + 81716, + 79604, + 81389, + 78663, + 80554, + 81633, + 72223, + 79850, + 73769, + 76024, + 72119, + 77884, + 76367, + 72645, + 72155, + 72155, + 76814, + 71984, + 72234, + 72234, + 72648, + 72084, + 72131, + 72017, + 72017, + 72059, + 72049, + 72127, + 72127, + 72101, + 72065, + 72190, + 72054, + 72170, + 72158, + 72872, + 72872, + 72097, + 72091, + 72201, + 72084, + 72202, + 72030, + 72137, + 72128, + 72166, + 72184, + 71956, + 72192, + 72157, + 72306, + 72306, + 72043, + 72043, + 72869, + 72159, + 72148, + 72108, + 72472, + 72121, + 72033, + 72125, + 71958, + 72163, + 72026, + 72245, + 72288, + 72000, + 72005, + 72797, + 72166, + 72093, + 72059, + 72272, + 72171, + 72259, + 71984, + 71984, + 72192, + 72085, + 72240, + 72009, + 72150, + 72118, + 72143, + 72057, + 72161, + 72121, + 72319, + 72069, + 71971, + 72135, + 72160, + 72136, + 72066, + 72190, + 72598, + 72598, + 72001, + 72265, + 72090, + 72336, + 71963, + 72348, + 72019, + 72182, + 71944, + 72074, + 72167, + 72096, + 72433, + 72230, + 72079, + 72121, + 72133, + 72050, + 71965, + 73754, + 72553, + 72188, + 72171, + 72024, + 72008, + 72168, + 72105, + 72308, + 72192, + 72082, + 72016, + 72016, + 72127, + 72214, + 72214, + 72456, + 72130, + 72130, + 71974, + 72140, + 72253, + 72253, + 72233, + 72194, + 72016, + 72001, + 72106, + 72162, + 72206, + 72206, + 72204, + 72016, + 72016, + 72042, + 72052, + 72250, + 72018, + 72509, + 72667, + 72667, + 72026, + 72095, + 72095, + 72158, + 72065, + 72236, + 72045, + 72157, + 72007, + 72146, + 72029, + 72193, + 72061, + 72253, + 72044, + 72102, + 72083, + 72067, + 72103, + 72172, + 72172, + 72025, + 72164, + 72083, + 72083, + 72234, + 72227, + 72208, + 72321, + 72034, + 72154, + 72157, + 72040, + 72188, + 72121, + 72371, + 72371, + 72129, + 71978, + 72053, + 72126, + 72025, + 72212, + 72286, + 72107, + 72075, + 72282, + 72038, + 72237, + 72300, + 72242, + 72088, + 72015, + 72078, + 72043, + 72182, + 72182, + 72706, + 72209, + 72168, + 72019, + 71996, + 72102, + 72226, + 72262, + 72252, + 72184, + 72181, + 71994, + 72077, + 72204, + 72104, + 72076, + 72267, + 72173, + 72959, + 72060, + 72053, + 72055, + 72243, + 73031, + 72166, + 72816, + 72775, + 72237, + 72162, + 72149, + 72316, + 72346, + 72816, + 72816, + 72200, + 72011, + 72081, + 71974, + 72248, + 72149, + 72032, + 72059, + 72051, + 72220, + 71931, + 71931, + 72329, + 72157, + 72063, + 72032, + 72065, + 72236, + 72244, + 72244, + 71998, + 72037, + 71976, + 71944, + 72210, + 72077, + 72139, + 72020, + 72243, + 72055, + 71996, + 72194, + 72405, + 72405, + 72116, + 72075, + 72029, + 72029, + 72165, + 72154, + 72157, + 72157, + 72105, + 72105, + 72105, + 72124, + 72123, + 72151, + 72041, + 72041, + 72102, + 72092, + 72092, + 72168, + 72168, + 72199, + 72071, + 71951, + 72037, + 72037, + 72165, + 72060, + 72187, + 72187, + 72106, + 72036, + 72075, + 72075, + 72074, + 72596, + 72161, + 72068, + 72068, + 72054, + 72070, + 72183, + 71959, + 71959, + 72048, + 72048, + 72035, + 72171, + 72171, + 72035, + 72160, + 72160, + 72287, + 71912, + 72121, + 72121, + 72026, + 72064, + 72064, + 71964, + 71964, + 72049, + 72059, + 72011, + 72143, + 72574, + 72574, + 72061, + 72029, + 72029, + 72140, + 72150, + 72020, + 72020, + 72163, + 72163, + 71996, + 72182, + 72182, + 72040, + 72028, + 72001, + 72046, + 72046, + 72116, + 72047, + 72131, + 72131, + 72234, + 72234, + 71967, + 72045, + 72004, + 72004, + 72068, + 72068, + 72261, + 71991, + 71991, + 72026, + 72160, + 72014, + 72110, + 72311, + 72311, + 72010, + 72064, + 72143, + 72143, + 71961, + 72166, + 72251, + 72251, + 71986, + 72124, + 72087, + 72103, + 72119, + 72119, + 72027, + 71986, + 71986, + 72043, + 72043, + 72008, + 72008, + 72389, + 71924, + 71924, + 72032, + 72139, + 72080, + 72080, + 72351, + 72351, + 71988, + 72086, + 72086, + 72126, + 72121, + 72121, + 72168, + 72105, + 72072, + 72126, + 72126, + 72011, + 72025, + 72456, + 72142, + 72137, + 72182, + 72182, + 72147, + 72072, + 72072, + 72169, + 72093, + 72119, + 72119, + 72058, + 72066, + 72066, + 72219, + 72057, + 72057, + 71969, + 72023, + 72136, + 72136, + 72095, + 72195, + 72100, + 72123, + 72083, + 71992, + 71992, + 71954, + 72737, + 72043, + 72043, + 71986, + 72081, + 71962, + 71987, + 72128, + 72075, + 72051, + 72093, + 72093, + 71994, + 71994, + 72386, + 72087, + 72276, + 72063, + 72063, + 72077, + 72020, + 72009, + 72009, + 72322, + 71973, + 71973, + 72131, + 72111, + 71965, + 71965, + 72179, + 72019, + 71958, + 71995, + 71995, + 72032, + 72032, + 72380, + 72360, + 72055, + 72094, + 72094, + 72060, + 72060, + 72199, + 72199, + 72159, + 72027, + 72080, + 72080, + 72217, + 72066, + 72066, + 72487, + 72505, + 72346, + 72346, + 72061, + 72067, + 74157, + 72600, + 72200, + 72200, + 81225, + 81225, + 75232, + 79528, + 79528, + 72287, + 77077, + 77077, + 81757, + 81757, + 81641, + 81641, + 78626, + 79658, + 74455, + 74684, + 74684, + 72247, + 77447, + 72267, + 72167, + 72167, + 72167, + 72216, + 72260, + 74279, + 72119, + 72813, + 81459, + 81459, + 72097, + 72016, + 72016, + 74085, + 81630, + 78157, + 78157, + 81807, + 81822, + 81835, + 81883, + 81883, + 81770, + 72099, + 72099, + 81796, + 73589, + 76021, + 74543, + 74543, + 72176, + 72037, + 71953, + 71953, + 72128, + 72572, + 72102, + 72102, + 72074, + 72074, + 72085, + 71998, + 72337, + 72337, + 72002, + 74480, + 73219, + 72202, + 72202, + 73992, + 72277, + 74019, + 72449, + 72449, + 72012, + 72329, + 72182, + 72193, + 72193, + 72005, + 72398, + 72611, + 72611, + 72103, + 72183, + 72119, + 72046, + 72129, + 72145, + 72145, + 72034, + 72249, + 72037, + 72139, + 72139, + 73124, + 72134, + 72260, + 72009, + 72065, + 72099, + 72073, + 72232, + 72188, + 72188, + 72093, + 72093, + 72034, + 71995, + 71995, + 72159, + 72049, + 72049, + 72012, + 72063, + 72063, + 72134, + 72038, + 72359, + 72072, + 72072, + 72067, + 72797, + 72797 + ], + "sample_count": 1272 + }, + { + "pubkey": "5avQJC56fn7fpv7LMBU9r2LyJkmcuUVVbDZhTAYhdS9P", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242370000000, + "samples": [ + 7925, + 7711, + 7865, + 7865, + 7811, + 7740, + 7740, + 8084, + 7832, + 7832, + 7785, + 7785, + 8062, + 7917, + 8059, + 7968, + 8036, + 7627, + 7878, + 7853, + 8091, + 8091, + 8025, + 8025, + 8113, + 7932, + 8038, + 8030, + 7782, + 8097, + 7991, + 7738, + 7770, + 7976, + 7963, + 7919, + 8183, + 7798, + 7912, + 7818, + 7753, + 7753, + 7781, + 7796, + 7901, + 7653, + 7762, + 7775, + 7757, + 7732, + 7913, + 7894, + 7656, + 8030, + 7823, + 7823, + 8038, + 8038, + 7845, + 7950, + 7761, + 7779, + 8017, + 7811, + 8120, + 7699, + 7699, + 7950, + 7743, + 8008, + 7909, + 7818, + 7960, + 7911, + 7914, + 7962, + 7909, + 7905, + 7905, + 7849, + 7938, + 7979, + 8225, + 7870, + 7838, + 8018, + 7792, + 7972, + 7902, + 8101, + 8101, + 7726, + 7808, + 7808, + 7983, + 7990, + 7804, + 7942, + 8040, + 7733, + 7719, + 7995, + 8102, + 8717, + 8717, + 8004, + 7821, + 7913, + 7969, + 7879, + 7879, + 7955, + 8001, + 8059, + 7863, + 7784, + 7768, + 7868, + 7878, + 7944, + 7944, + 8092, + 7802, + 7802, + 7649, + 7727, + 8072, + 7788, + 7877, + 8057, + 8057, + 7916, + 7916, + 7813, + 7951, + 7888, + 7908, + 8077, + 7995, + 7820, + 8109, + 8109, + 7848, + 7884, + 7907, + 7907, + 7794, + 7794, + 7818, + 7782, + 7960, + 7944, + 7972, + 7872, + 8046, + 7681, + 7808, + 8067, + 7784, + 7962, + 7855, + 7843, + 7678, + 8258, + 8258, + 7821, + 7919, + 8008, + 7693, + 8046, + 7793, + 8101, + 7880, + 7841, + 7841, + 7902, + 7968, + 7816, + 7894, + 7847, + 7968, + 8042, + 7972, + 7893, + 7845, + 8156, + 7822, + 7833, + 8052, + 7838, + 7950, + 7931, + 7931, + 8085, + 7975, + 7778, + 8039, + 7907, + 7883, + 7895, + 7849, + 7795, + 8068, + 7831, + 7831, + 8000, + 7659, + 7659, + 7907, + 7907, + 8002, + 7903, + 7851, + 7851, + 7890, + 8190, + 8466, + 7867, + 7843, + 7843, + 8096, + 8009, + 7824, + 7824, + 9063, + 9063, + 7962, + 7960, + 7835, + 7720, + 8046, + 8329, + 7796, + 7926, + 7895, + 7840, + 7818, + 7720, + 7693, + 7812, + 8041, + 7881, + 7881, + 7784, + 7863, + 7702, + 7755, + 7755, + 7827, + 7896, + 8060, + 8067, + 7997, + 7997, + 7957, + 7924, + 7651, + 8099, + 7935, + 8017, + 7989, + 8199, + 7817, + 8063, + 7950, + 7862, + 7958, + 8323, + 7840, + 8124, + 7887, + 7887, + 7988, + 8193, + 7878, + 7878, + 7792, + 7852, + 7875, + 7929, + 7884, + 7932, + 8014, + 7913, + 7715, + 7715, + 7792, + 8031, + 7931, + 7722, + 8105, + 8287, + 8287, + 7949, + 7880, + 9111, + 7797, + 8125, + 7913, + 8049, + 8018, + 7844, + 7803, + 7894, + 7973, + 7819, + 8030, + 7635, + 7848, + 7914, + 8431, + 7640, + 7799, + 7943, + 7819, + 7804, + 8135, + 8009, + 7885, + 7885, + 7807, + 7908, + 8023, + 8023, + 7936, + 7761, + 8311, + 7956, + 7792, + 7645, + 7811, + 7947, + 7910, + 7910, + 8106, + 7686, + 7975, + 7980, + 7831, + 7831, + 8083, + 8117, + 7986, + 8095, + 7772, + 7774, + 7768, + 7829, + 7864, + 7993, + 7993, + 7745, + 7996, + 7896, + 7961, + 7961, + 7802, + 7823, + 7637, + 7637, + 7923, + 8054, + 8025, + 7977, + 7773, + 7968, + 7786, + 7975, + 7866, + 7866, + 7943, + 7943, + 7886, + 7764, + 7950, + 7844, + 7934, + 8823, + 7719, + 7827, + 8142, + 7995, + 7992, + 7992, + 7974, + 7990, + 8026, + 8126, + 8101, + 8173, + 7890, + 7890, + 7861, + 7861, + 7677, + 7961, + 7862, + 7864, + 7817, + 7796, + 7783, + 8003, + 7795, + 7795, + 8015, + 8015, + 8152, + 7716, + 7992, + 7842, + 7973, + 7939, + 7844, + 8043, + 7801, + 7859, + 7750, + 8143, + 8143, + 8010, + 7873, + 7925, + 8096, + 8096, + 7928, + 7732, + 8123, + 8002, + 8004, + 7835, + 7835, + 7909, + 7928, + 8136, + 7944, + 8020, + 8020, + 8111, + 8068, + 9003, + 7942, + 7780, + 7899, + 7899, + 7911, + 7930, + 8412, + 7912, + 7823, + 7781, + 8059, + 8059, + 7934, + 7769, + 7769, + 7899, + 7712, + 7875, + 7864, + 7864, + 7889, + 7896, + 7938, + 7643, + 7875, + 7805, + 7774, + 7968, + 7968, + 8054, + 7878, + 7878, + 7727, + 7728, + 7970, + 8006, + 7882, + 7860, + 7834, + 7780, + 7780, + 7929, + 7929, + 7658, + 7914, + 8030, + 7810, + 7953, + 7953, + 7824, + 7892, + 7892, + 8143, + 7801, + 7984, + 7828, + 7828, + 7863, + 7847, + 12397, + 7872, + 7954, + 7977, + 7977, + 7974, + 8050, + 8120, + 8020, + 7815, + 7888, + 7670, + 7878, + 7797, + 7797, + 7806, + 7988, + 7886, + 7751, + 7959, + 7967, + 7931, + 7572, + 7930, + 7736, + 7885, + 7676, + 7734, + 8016, + 7910, + 7910, + 7819, + 8028, + 7897, + 8007, + 7626, + 7932, + 8065, + 7960, + 8208, + 8045, + 8033, + 7944, + 8003, + 8003, + 7826, + 7806, + 7845, + 8014, + 7834, + 7982, + 7865, + 7865, + 7684, + 7787, + 8103, + 7874, + 7918, + 7924, + 7928, + 7822, + 7713, + 8040, + 7924, + 7893, + 7686, + 7929, + 7929, + 8078, + 7605, + 7831, + 7895, + 7895, + 7933, + 7835, + 7835, + 7685, + 7685, + 7885, + 7891, + 7891, + 8055, + 7763, + 7977, + 7921, + 7819, + 7935, + 7727, + 7817, + 7805, + 7633, + 7633, + 7808, + 7808, + 7922, + 7755, + 8003, + 7956, + 7815, + 7683, + 7875, + 7846, + 7945, + 7945, + 7960, + 7960, + 7885, + 7685, + 8047, + 7785, + 7915, + 7612, + 7952, + 7849, + 7976, + 7824, + 7824, + 7852, + 7600, + 7792, + 7827, + 7827, + 7739, + 7739, + 8081, + 7994, + 7670, + 8041, + 7889, + 7709, + 7709, + 7890, + 8047, + 8047, + 7819, + 7903, + 7819, + 8011, + 7808, + 7900, + 7911, + 7783, + 7743, + 7995, + 7973, + 7939, + 8005, + 7875, + 7948, + 7948, + 7875, + 7804, + 7842, + 7855, + 7784, + 7784, + 7624, + 7624, + 7864, + 7635, + 7599, + 7672, + 7939, + 7866, + 7866, + 7703, + 7700, + 7728, + 7728, + 7752, + 7710, + 7699, + 8037, + 8111, + 7795, + 7923, + 7615, + 7615, + 7755, + 7666, + 7686, + 7686, + 7741, + 7907, + 7907, + 7844, + 7844, + 7825, + 7911, + 7673, + 7673, + 8241, + 8370, + 8370, + 7710, + 8004, + 7934, + 7674, + 7916, + 7843, + 7676, + 7676, + 7969, + 7797, + 7648, + 7822, + 7775, + 7904, + 7794, + 7658, + 7890, + 8124, + 7725, + 7647, + 7647, + 7819, + 7980, + 7783, + 7865, + 7798, + 7642, + 7642, + 7763, + 7763, + 7780, + 7772, + 7968, + 7910, + 7910, + 7800, + 7815, + 7811, + 7889, + 8002, + 7841, + 7886, + 7854, + 7835, + 7814, + 7684, + 7684, + 7953, + 7889, + 7893, + 7819, + 7819, + 7854, + 7775, + 7944, + 7817, + 7827, + 7762, + 7646, + 7646, + 7719, + 7839, + 7839, + 8285, + 8285, + 7685, + 7685, + 7867, + 7666, + 7666, + 7868, + 7747, + 7656, + 7776, + 7958, + 7759, + 7634, + 7634, + 7881, + 7698, + 7714, + 7989, + 7740, + 7805, + 7825, + 7825, + 7728, + 7597, + 7617, + 7746, + 7753, + 8079, + 7741, + 7901, + 7790, + 7817, + 7858, + 7732, + 7732, + 7844, + 7856, + 7830, + 7918, + 7918, + 7782, + 7845, + 7851, + 7816, + 7661, + 8069, + 8069, + 7748, + 7692, + 7813, + 7700, + 7679, + 7921, + 7731, + 7731, + 7786, + 7937, + 7775, + 7776, + 7752, + 7752, + 7823, + 7944, + 7840, + 7864, + 7766, + 7668, + 7668, + 7698, + 7698, + 7689, + 8132, + 7756, + 7886, + 8404, + 7789, + 7907, + 7747, + 7747, + 7872, + 7731, + 7857, + 7697, + 7847, + 7808, + 7691, + 7658, + 7765, + 7989, + 7795, + 7795, + 7835, + 7682, + 7819, + 7819, + 7650, + 7955, + 7976, + 7976, + 7708, + 7724, + 7849, + 7684, + 7850, + 8029, + 7866, + 7866, + 7754, + 7744, + 7699, + 7917, + 7728, + 18341, + 7738, + 7631, + 7876, + 7916, + 7756, + 7756, + 8013, + 7708, + 7963, + 7750, + 7755, + 8076, + 7751, + 7852, + 7734, + 7734, + 7610, + 7680, + 7680, + 7878, + 7701, + 7765, + 7708, + 7859, + 7772, + 7903, + 7780, + 7825, + 7849, + 7737, + 8043, + 7985, + 7731, + 7633, + 7853, + 7841, + 7831, + 7831, + 8470, + 7885, + 7806, + 7957, + 7957, + 7879, + 8067, + 8067, + 691582, + 7759, + 7748, + 7960, + 7961, + 7604, + 7837, + 8090, + 7884, + 7754, + 7816, + 7916, + 7819, + 7877, + 7713, + 8022, + 8022, + 8022, + 8078, + 7591, + 7925, + 7629, + 7629, + 8082, + 7885, + 7998, + 7814, + 7814, + 7814, + 7948, + 7746, + 7823, + 8048, + 67006, + 7946, + 7946, + 7897, + 7916, + 7736, + 7887, + 7887, + 7803, + 7784, + 7846, + 7922, + 7807, + 7848, + 7895, + 7763, + 7763, + 7763, + 7920, + 7899, + 7800, + 7800, + 7809, + 7913, + 7913, + 7707, + 7876, + 790371, + 790371, + 7935, + 7786, + 7940, + 7743, + 7691, + 7691, + 7869, + 7869, + 8120, + 7864, + 7944, + 7943, + 7943, + 7796, + 7941, + 7943, + 7868, + 7930, + 7910, + 7796, + 7796, + 8040, + 8040, + 7635, + 8019, + 7930, + 7930, + 7833, + 7666, + 8077, + 7851, + 7818, + 7952, + 7887, + 7872, + 7872, + 7864, + 7889, + 7829, + 8326, + 8020, + 8020, + 8044, + 7794, + 7794, + 8108, + 7746, + 7829, + 7927, + 7927, + 7626, + 8207, + 7774, + 7920, + 7728, + 7728, + 8107, + 7904, + 7906, + 7955, + 7887, + 7887, + 7988, + 7786, + 7903, + 7816, + 7757, + 7920, + 7920, + 7860, + 7860, + 7953, + 8068, + 7849, + 7931, + 7895, + 7895, + 8023, + 8023, + 7901, + 7723, + 7994, + 7875, + 7875, + 8087, + 8034, + 7886, + 7919, + 7855, + 8004, + 7939, + 7691, + 7916, + 8092, + 7929, + 7840, + 7840, + 7926, + 7671, + 7954, + 7883, + 7871, + 7928, + 7928, + 7857, + 7982, + 7859, + 7822, + 7749, + 7829, + 7887, + 7706, + 7706, + 7672, + 7743, + 7791, + 7804, + 7837, + 7776, + 7776, + 8060, + 7872, + 7996, + 8149, + 7976, + 7976, + 7933, + 7879, + 7879, + 7995, + 7812, + 7895, + 7895, + 8161, + 7856, + 7856, + 7893, + 8097, + 8097, + 7758, + 8002, + 7830, + 7830, + 7953, + 8133, + 7903, + 7853, + 7939, + 8006, + 8083, + 8003, + 8028, + 8028, + 7902, + 7902, + 8254, + 7973, + 7969, + 7885, + 7759, + 8059, + 8059, + 7781, + 7995, + 7896, + 7949, + 7949, + 8153, + 7958, + 7958, + 7888, + 7966, + 7966, + 7897, + 8052, + 7946, + 7887, + 7881, + 8028, + 8028, + 7894, + 7770, + 7770, + 7991, + 7839, + 7839, + 8015, + 8015, + 7935, + 7899, + 7899, + 8110, + 7679, + 7789, + 7817, + 7774, + 7948, + 7948, + 7987, + 8198, + 7961, + 8073, + 7978, + 7815, + 8024, + 7888, + 7998, + 7881, + 7930, + 7843, + 8214, + 8214, + 8022, + 7960, + 7931, + 7855, + 7949, + 8039, + 7844, + 8202, + 7773, + 7781, + 7837, + 7841, + 7790, + 7790, + 7710, + 7945, + 7924, + 7952, + 7883, + 7970, + 7966, + 7973, + 7973, + 8058, + 7936, + 7963, + 7776, + 7684, + 7753, + 7753, + 7987, + 7913, + 7865, + 8000, + 8000, + 8224, + 7839, + 7839, + 7909, + 8012, + 7865, + 7833, + 7836, + 7683, + 7771, + 8053, + 7725, + 7994, + 7896, + 8162, + 8036, + 7800, + 7978, + 7789, + 7924, + 8079, + 7761, + 8159, + 8044, + 8044, + 8011, + 7883, + 7838, + 8048, + 8048, + 7984, + 7921, + 7963, + 7987, + 7987, + 7838, + 7838, + 7970, + 7790, + 8071, + 8071, + 7772, + 8042, + 8042, + 7822 + ], + "sample_count": 1270 + }, + { + "pubkey": "HRuAx5W2gPp4mxoemcpQ7nZ4XVsg2VzTayrS4Lc9MQr7", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242377000000, + "samples": [ + 135524, + 135427, + 135641, + 135641, + 135526, + 135389, + 135389, + 135385, + 135488, + 135488, + 135382, + 135382, + 135338, + 135390, + 135397, + 135477, + 135692, + 135503, + 135524, + 135213, + 135491, + 135491, + 135451, + 135451, + 135428, + 135574, + 135386, + 135251, + 135245, + 135608, + 135648, + 135387, + 135500, + 135441, + 135472, + 135352, + 135141, + 135244, + 135592, + 135206, + 135419, + 135419, + 135388, + 135294, + 135401, + 135415, + 135446, + 135346, + 135231, + 135622, + 135463, + 135195, + 135416, + 135387, + 135562, + 135562, + 135428, + 135428, + 135454, + 135525, + 135221, + 135609, + 135543, + 135297, + 135245, + 135359, + 135359, + 135517, + 135309, + 135369, + 135425, + 135237, + 135531, + 135345, + 135598, + 135358, + 135186, + 135502, + 135502, + 135371, + 135478, + 135315, + 135568, + 135589, + 135531, + 135365, + 135118, + 135527, + 135145, + 135227, + 135227, + 135364, + 135373, + 135373, + 135421, + 135473, + 135311, + 135226, + 135303, + 135477, + 135403, + 135315, + 135359, + 135409, + 135409, + 135345, + 135480, + 135284, + 135714, + 135198, + 135198, + 135309, + 135165, + 135343, + 135558, + 135470, + 135464, + 135461, + 135809, + 135577, + 135577, + 135348, + 135548, + 135548, + 135531, + 135483, + 135304, + 135922, + 135452, + 135261, + 135261, + 135234, + 135385, + 135193, + 135500, + 135569, + 135309, + 135325, + 135368, + 135484, + 135400, + 135400, + 135542, + 135594, + 135222, + 135222, + 135671, + 135671, + 135436, + 135332, + 135342, + 135548, + 135306, + 135376, + 135233, + 135596, + 135478, + 135269, + 135400, + 135305, + 135485, + 135289, + 135549, + 135437, + 135437, + 135265, + 135414, + 135365, + 135482, + 135275, + 135586, + 135433, + 135336, + 135336, + 135532, + 135471, + 135427, + 135127, + 135719, + 135482, + 135593, + 135373, + 135459, + 135245, + 135410, + 135641, + 135181, + 135518, + 135345, + 135522, + 135315, + 135247, + 135247, + 135392, + 135442, + 135362, + 135682, + 135319, + 135381, + 135517, + 135487, + 135091, + 135214, + 135290, + 135290, + 135285, + 135364, + 135364, + 135128, + 135128, + 135484, + 135241, + 135512, + 135512, + 135492, + 135276, + 135689, + 135326, + 135381, + 135381, + 135208, + 135543, + 135501, + 135501, + 135481, + 135481, + 135502, + 135390, + 135369, + 135126, + 135451, + 135101, + 135622, + 135248, + 135290, + 135388, + 135673, + 135471, + 135255, + 135386, + 135211, + 135417, + 135417, + 135429, + 135432, + 135383, + 135361, + 135361, + 135408, + 135248, + 135215, + 135575, + 135393, + 135393, + 135508, + 135155, + 135389, + 135411, + 135478, + 135337, + 135416, + 135224, + 135409, + 135218, + 135449, + 135051, + 135496, + 135339, + 135178, + 135284, + 135408, + 135408, + 135416, + 135462, + 135482, + 135482, + 135085, + 135434, + 135219, + 135431, + 135355, + 135383, + 135465, + 135673, + 135285, + 135285, + 135577, + 135225, + 135225, + 135493, + 135289, + 135180, + 135180, + 135327, + 135496, + 135597, + 135645, + 135479, + 135303, + 135477, + 135506, + 135353, + 135524, + 135298, + 135588, + 135241, + 135531, + 135239, + 135552, + 135540, + 135514, + 135303, + 135538, + 135257, + 135567, + 135487, + 135410, + 135290, + 135570, + 135570, + 135207, + 135278, + 135436, + 135436, + 135453, + 135680, + 135519, + 135493, + 135493, + 135451, + 135514, + 135425, + 135451, + 135451, + 135073, + 135456, + 135481, + 135320, + 135361, + 135361, + 135523, + 135658, + 135344, + 135319, + 135374, + 135287, + 135239, + 135446, + 135510, + 135473, + 135473, + 135307, + 135471, + 135354, + 135524, + 135524, + 135162, + 135356, + 135201, + 135201, + 135418, + 135457, + 135356, + 135252, + 135728, + 135053, + 135606, + 135340, + 135400, + 135371, + 135457, + 135457, + 135436, + 135478, + 135512, + 135500, + 135498, + 135320, + 135430, + 135491, + 135373, + 135251, + 135251, + 135391, + 135476, + 135298, + 135618, + 135406, + 135426, + 135275, + 135275, + 135427, + 135461, + 135253, + 135253, + 135340, + 135476, + 135416, + 135397, + 135271, + 135338, + 135527, + 135442, + 135442, + 135175, + 135175, + 135414, + 135410, + 135640, + 135342, + 135278, + 135515, + 135397, + 135432, + 135623, + 135454, + 135631, + 135428, + 135428, + 135459, + 135362, + 135513, + 135492, + 135492, + 135468, + 135489, + 135494, + 135379, + 135622, + 135290, + 135290, + 135716, + 135716, + 135406, + 135732, + 135809, + 135809, + 135471, + 135489, + 135470, + 135298, + 135498, + 135525, + 135525, + 135214, + 135477, + 135388, + 135361, + 135446, + 135591, + 135608, + 135608, + 135708, + 135338, + 135338, + 135389, + 135336, + 135513, + 135566, + 135566, + 135453, + 135493, + 135200, + 135289, + 135338, + 135617, + 135462, + 135399, + 135794, + 135310, + 135095, + 135095, + 135537, + 135518, + 135396, + 135362, + 135400, + 135304, + 135212, + 135348, + 135348, + 135502, + 135502, + 135706, + 135407, + 135506, + 135438, + 135215, + 135215, + 135697, + 135492, + 135417, + 135417, + 135167, + 135507, + 135561, + 135671, + 135278, + 135278, + 135410, + 135505, + 135656, + 135577, + 135655, + 135422, + 135596, + 135427, + 135325, + 135391, + 135340, + 135586, + 135435, + 135580, + 135580, + 135472, + 135296, + 135304, + 135291, + 135482, + 135332, + 135366, + 135524, + 135506, + 135506, + 135321, + 135517, + 135691, + 135578, + 135623, + 135623, + 135188, + 135422, + 135317, + 135210, + 135573, + 135643, + 135443, + 135241, + 135198, + 135083, + 135432, + 135579, + 135256, + 135256, + 135524, + 135575, + 135399, + 135526, + 135426, + 135537, + 135540, + 135540, + 135420, + 135586, + 135421, + 135450, + 135516, + 135457, + 135331, + 135459, + 135360, + 135441, + 135580, + 135663, + 135473, + 135473, + 135473, + 135558, + 135213, + 135342, + 135461, + 135461, + 135517, + 135329, + 135374, + 135472, + 135472, + 135338, + 135316, + 135316, + 135392, + 135364, + 135563, + 135296, + 135408, + 135419, + 135627, + 135301, + 135391, + 135201, + 135201, + 135248, + 135248, + 135569, + 135290, + 135353, + 135456, + 135473, + 135446, + 135179, + 135190, + 135570, + 135570, + 135582, + 135582, + 135271, + 135017, + 135383, + 135538, + 135155, + 135322, + 135143, + 135499, + 135288, + 135669, + 135554, + 135348, + 135597, + 135520, + 135517, + 135517, + 135342, + 135342, + 135575, + 135235, + 135371, + 135212, + 135255, + 135187, + 135187, + 135277, + 135335, + 135335, + 135539, + 135389, + 135274, + 135196, + 135173, + 135489, + 135400, + 135583, + 135284, + 135243, + 135096, + 135279, + 135399, + 135396, + 135271, + 135271, + 135370, + 135280, + 135356, + 135622, + 135438, + 135438, + 135325, + 135325, + 135356, + 135379, + 135409, + 135409, + 135260, + 135394, + 135394, + 135168, + 135241, + 135067, + 135067, + 135477, + 135272, + 135270, + 135297, + 135384, + 135104, + 135088, + 135469, + 135568, + 135222, + 135376, + 135311, + 135311, + 135258, + 135180, + 135180, + 135208, + 135208, + 135514, + 135179, + 135612, + 135612, + 135102, + 135496, + 135496, + 135181, + 135324, + 135135, + 135153, + 135327, + 135603, + 135172, + 135172, + 135340, + 135213, + 135569, + 135743, + 135249, + 135255, + 135163, + 135401, + 135460, + 135145, + 135264, + 135145, + 135145, + 135276, + 135353, + 135249, + 135342, + 135284, + 135260, + 135260, + 135225, + 135225, + 135200, + 135369, + 135143, + 135125, + 135125, + 135463, + 135234, + 135379, + 135368, + 135290, + 135172, + 135172, + 135604, + 135184, + 135400, + 135284, + 135284, + 135471, + 135323, + 135333, + 135412, + 135412, + 135288, + 135465, + 135327, + 135181, + 135390, + 135470, + 135470, + 135220, + 135255, + 135111, + 135111, + 135399, + 135399, + 135165, + 135165, + 135220, + 135380, + 135380, + 135270, + 135185, + 135277, + 135411, + 135332, + 135282, + 135301, + 135301, + 135346, + 135346, + 135399, + 135174, + 135393, + 135312, + 135238, + 135238, + 135300, + 135143, + 135305, + 135422, + 135426, + 135523, + 135361, + 135191, + 135082, + 135285, + 135231, + 135495, + 135495, + 135397, + 135381, + 135302, + 135231, + 135231, + 135320, + 135249, + 135314, + 135334, + 135066, + 135336, + 135336, + 135380, + 135391, + 135661, + 135187, + 135266, + 135113, + 135373, + 135373, + 135342, + 135311, + 135291, + 135182, + 135506, + 135506, + 135184, + 135203, + 135343, + 135307, + 135362, + 135259, + 135259, + 135121, + 135121, + 135372, + 135469, + 135425, + 135276, + 135276, + 135248, + 135250, + 135194, + 135194, + 135308, + 135546, + 135176, + 135161, + 135319, + 135304, + 135169, + 135306, + 135122, + 135248, + 135137, + 135137, + 135256, + 135254, + 135211, + 135105, + 135177, + 135312, + 135804, + 135804, + 135199, + 135603, + 135299, + 135176, + 135048, + 135138, + 135399, + 135399, + 135348, + 135340, + 135309, + 135400, + 135361, + 135255, + 135463, + 135447, + 135461, + 135189, + 135250, + 135250, + 135367, + 135210, + 135115, + 135141, + 135182, + 135185, + 135172, + 135214, + 135515, + 135515, + 135143, + 135054, + 135054, + 135248, + 135300, + 135375, + 135338, + 135281, + 135357, + 135197, + 135416, + 135430, + 135637, + 135697, + 135152, + 135312, + 135400, + 135595, + 135471, + 135471, + 135384, + 135364, + 135311, + 135272, + 135272, + 135382, + 135176, + 135176, + 135356, + 135276, + 135149, + 135832, + 135167, + 135516, + 135415, + 135280, + 135439, + 135309, + 135236, + 135413, + 135413, + 135321, + 135394, + 135377, + 135360, + 135183, + 135478, + 135404, + 135253, + 135327, + 135327, + 135091, + 135372, + 135273, + 135359, + 135359, + 135311, + 135224, + 135230, + 135477, + 135493, + 135431, + 135399, + 135399, + 135566, + 135262, + 135383, + 135582, + 135582, + 135219, + 135212, + 135460, + 135390, + 135181, + 135438, + 135417, + 234106, + 234106, + 135223, + 135245, + 135421, + 135458, + 135458, + 135201, + 135387, + 135387, + 135397, + 135256, + 135243, + 135243, + 135183, + 135469, + 135332, + 135513, + 135510, + 135510, + 135373, + 135373, + 135408, + 135402, + 135506, + 135324, + 135324, + 135377, + 135914, + 135374, + 135415, + 135521, + 135484, + 135406, + 135406, + 135457, + 135457, + 135590, + 135314, + 135314, + 135314, + 135604, + 135526, + 135586, + 135841, + 135331, + 135387, + 135649, + 135229, + 135229, + 135639, + 135287, + 135440, + 135101, + 135564, + 135564, + 135422, + 135415, + 135415, + 135357, + 135518, + 135375, + 135428, + 135428, + 135528, + 135639, + 135452, + 135289, + 135331, + 135331, + 135480, + 135504, + 135507, + 135168, + 135383, + 135383, + 135375, + 135527, + 135186, + 135493, + 135123, + 135601, + 135601, + 135372, + 135372, + 135228, + 135586, + 135407, + 135215, + 135359, + 135359, + 135308, + 135335, + 135335, + 135505, + 135465, + 135500, + 135500, + 135321, + 135381, + 135303, + 135394, + 135339, + 135380, + 135334, + 135111, + 135516, + 135491, + 135464, + 135410, + 135410, + 135360, + 135444, + 135456, + 135223, + 135613, + 135638, + 135638, + 135267, + 135399, + 135354, + 135268, + 135460, + 135097, + 135450, + 135483, + 135483, + 135503, + 135570, + 135449, + 135349, + 135697, + 135303, + 135303, + 135384, + 135507, + 135460, + 135456, + 135292, + 135374, + 135491, + 135428, + 135428, + 135160, + 135578, + 135242, + 135242, + 135506, + 135341, + 135341, + 135226, + 135455, + 135455, + 135479, + 135566, + 135308, + 135449, + 135263, + 135439, + 135435, + 135364, + 135376, + 135314, + 135560, + 135528, + 135478, + 135478, + 135373, + 135373, + 135380, + 135457, + 135357, + 135396, + 135419, + 135402, + 135402, + 135507, + 135441, + 135330, + 135685, + 135685, + 135431, + 135297, + 135297, + 135490, + 135206, + 135206, + 135441, + 135572, + 135433, + 135486, + 135395, + 135476, + 135300, + 135358, + 135603, + 135603, + 135192, + 135416, + 135416, + 135331, + 135331, + 135498, + 135547, + 135547, + 135376, + 135118, + 135482, + 135721, + 135382, + 135401, + 135401, + 135470, + 135406, + 135600, + 135459, + 135489, + 135359, + 135387, + 135655, + 135569, + 135391, + 135396, + 135676, + 135395, + 135395, + 135392, + 135468, + 135492, + 135311, + 135194, + 135581, + 135642, + 135222, + 135669, + 135399, + 135192, + 135346, + 135075, + 135075, + 135757, + 135359, + 135328, + 135550, + 135413, + 135324, + 135743, + 135489, + 135489, + 135520, + 135489, + 135361, + 135649, + 135293, + 135491, + 135491, + 135456, + 135437, + 135325, + 135532, + 135532, + 135512, + 135368, + 135368, + 135417, + 135440, + 135520, + 135250, + 135536, + 135536, + 135396, + 135429, + 135475, + 135470, + 135459, + 135336, + 135416, + 135340, + 135419, + 135401, + 135476, + 135393, + 135562, + 135257, + 135666, + 135666, + 135278, + 135278, + 135158, + 135250, + 135250, + 135350, + 135280, + 135657, + 135437, + 135437, + 135373, + 135373, + 135213, + 135144, + 135589, + 135589, + 135536, + 135383, + 135383, + 135415 + ], + "sample_count": 1268 + }, + { + "pubkey": "CyE63MT724q69YQMuv7Em9R8C4qCEa6eG4iJxqJQ2z2G", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242238000000, + "samples": [ + 6310, + 6222, + 6144, + 6268, + 6288, + 6203, + 6224, + 6185, + 6213, + 6042, + 6176, + 6287, + 6243, + 6162, + 6064, + 6313, + 6253, + 6221, + 6285, + 6204, + 6230, + 6128, + 6157, + 6119, + 6307, + 6182, + 6208, + 6270, + 6198, + 6186, + 6200, + 6346, + 6074, + 6174, + 6217, + 6193, + 6186, + 6145, + 6157, + 6270, + 6263, + 6322, + 6314, + 6239, + 6246, + 6151, + 6319, + 6289, + 6236, + 6306, + 6215, + 6232, + 6340, + 6151, + 6198, + 6189, + 6420, + 6267, + 6183, + 6279, + 6378, + 6238, + 6209, + 6240, + 6294, + 6289, + 6181, + 6303, + 6209, + 6219, + 6156, + 6177, + 6251, + 6171, + 6338, + 6280, + 6322, + 6380, + 6118, + 6089, + 6261, + 6073, + 6336, + 6242, + 6317, + 6200, + 6274, + 6227, + 6338, + 6196, + 6106, + 6228, + 6140, + 6248, + 6128, + 6250, + 6167, + 6309, + 6226, + 6281, + 6153, + 6218, + 6350, + 6089, + 6177, + 6198, + 6247, + 6142, + 6246, + 6067, + 6286, + 6161, + 6200, + 6101, + 6238, + 6112, + 6192, + 6126, + 6129, + 6284, + 6191, + 6302, + 6166, + 6209, + 6238, + 6220, + 6167, + 6211, + 6226, + 6307, + 6226, + 6334, + 6068, + 6270, + 6260, + 6233, + 6211, + 6196, + 6202, + 6182, + 6185, + 6160, + 6229, + 6251, + 6258, + 6239, + 6178, + 6167, + 6201, + 6144, + 6181, + 6173, + 6327, + 6269, + 6297, + 6161, + 6234, + 6287, + 6136, + 6188, + 6141, + 6153, + 6217, + 6219, + 6211, + 6260, + 6265, + 6262, + 6078, + 6150, + 6175, + 6281, + 6212, + 6213, + 6239, + 6306, + 6333, + 6281, + 6162, + 6315, + 6169, + 6115, + 6168, + 6231, + 6164, + 6181, + 6266, + 6151, + 6184, + 6189, + 6349, + 6112, + 6264, + 6177, + 6199, + 6222, + 6186, + 6206, + 6263, + 6276, + 6234, + 6127, + 6322, + 6271, + 5988, + 6174, + 6147, + 6247, + 6200, + 6284, + 6162, + 6267, + 6296, + 6301, + 6117, + 6077, + 6195, + 6273, + 6151, + 6188, + 6205, + 6201, + 6166, + 6229, + 6239, + 6147, + 6287, + 6231, + 6163, + 6235, + 6277, + 6089, + 6216, + 6206, + 6223, + 6253, + 6294, + 6216, + 6189, + 6203, + 6320, + 6176, + 6271, + 6018, + 6275, + 6301, + 6155, + 6230, + 6262, + 6211, + 6353, + 6300, + 6120, + 6234, + 6260, + 6173, + 6197, + 6378, + 6267, + 6293, + 6261, + 6232, + 6164, + 6251, + 6320, + 6193, + 6171, + 6025, + 6102, + 6225, + 6274, + 6249, + 6101, + 6153, + 6185, + 6199, + 6135, + 6196, + 6184, + 6277, + 6120, + 6202, + 6272, + 6113, + 6268, + 6147, + 6264, + 6185, + 6159, + 6247, + 6227, + 6164, + 6119, + 6205, + 6250, + 6045, + 6166, + 6179, + 6161, + 6095, + 6201, + 6296, + 6271, + 6135, + 6277, + 6288, + 6139, + 6229, + 6318, + 6208, + 6198, + 6350, + 6288, + 6196, + 6209, + 6275, + 6245, + 6187, + 6203, + 6180, + 6237, + 6221, + 6140, + 6150, + 6227, + 6203, + 6354, + 6333, + 6223, + 6216, + 6295, + 6292, + 6258, + 6231, + 6255, + 6234, + 6257, + 6078, + 6221, + 6283, + 6274, + 6294, + 6171, + 6297, + 6133, + 6239, + 6149, + 6257, + 6290, + 6265, + 6186, + 6201, + 6194, + 6333, + 6147, + 6185, + 6317, + 6242, + 6111, + 6264, + 6140, + 6242, + 6197, + 6163, + 6240, + 6131, + 6097, + 6391, + 6118, + 6294, + 6324, + 6289, + 6157, + 6257, + 6319, + 6192, + 6210, + 6225, + 6230, + 6288, + 6278, + 6209, + 6281, + 6162, + 6284, + 6272, + 6369, + 6200, + 6192, + 6206, + 6171, + 6299, + 6229, + 6355, + 6279, + 6178, + 6285, + 6220, + 6213, + 6158, + 6220, + 6320, + 6343, + 6169, + 6285, + 6368, + 6323, + 6300, + 6219, + 6107, + 6236, + 6221, + 6338, + 6192, + 6125, + 6047, + 6244, + 6298, + 6132, + 6271, + 6171, + 6220, + 6115, + 6189, + 6386, + 6144, + 6232, + 6181, + 6136, + 6189, + 6162, + 6226, + 6273, + 6259, + 6282, + 6218, + 6318, + 6227, + 6297, + 6336, + 6290, + 6185, + 6283, + 6175, + 6348, + 6290, + 6206, + 6306, + 6200, + 6380, + 6179, + 6212, + 6171, + 6295, + 6328, + 6173, + 6273, + 6137, + 6303, + 6313, + 6321, + 6234, + 6277, + 6285, + 6144, + 6141, + 6270, + 6319, + 6229, + 6296, + 6233, + 6113, + 6311, + 6329, + 6287, + 6257, + 6228, + 6251, + 6341, + 6261, + 6250, + 6195, + 6344, + 6153, + 6371, + 6151, + 6278, + 6288, + 6330, + 6307, + 6265, + 6305, + 6208, + 6248, + 6247, + 6283, + 6210, + 6368, + 6194, + 6322, + 6289, + 6153, + 6259, + 6142, + 6209, + 6133, + 6277, + 6293, + 6318, + 6334, + 6157, + 6311, + 6193, + 6184, + 6405, + 6208, + 6014, + 6292, + 6124, + 6284, + 6249, + 6240, + 6217, + 6192, + 6201, + 6266, + 6363, + 6222, + 6247, + 6223, + 6138, + 6277, + 6269, + 6245, + 6228, + 6290, + 6321, + 6338, + 6242, + 6270, + 6148, + 6342, + 6260, + 6302, + 6252, + 6237, + 6111, + 6266, + 6246, + 6260, + 6195, + 6283, + 6209, + 6188, + 6198, + 6248, + 6362, + 6346, + 6015, + 6356, + 6187, + 6252, + 6241, + 6122, + 6325, + 6175, + 6206, + 6346, + 6184, + 6284, + 6191, + 6254, + 6322, + 6243, + 6274, + 6288, + 6224, + 6263, + 6211, + 6293, + 6270, + 6196, + 6206, + 6175, + 6155, + 6198, + 6317, + 6270, + 6239, + 6256, + 6138, + 6202, + 6235, + 6254, + 6244, + 6257, + 6291, + 6199, + 6220, + 6355, + 6263, + 6318, + 6282, + 6374, + 6355, + 6166, + 6197, + 6384, + 6266, + 6089, + 6229, + 6252, + 6207, + 6218, + 6164, + 6223, + 6398, + 6247, + 6341, + 6294, + 6197, + 6249, + 6309, + 6265, + 6273, + 6147, + 6212, + 6280, + 6156, + 6217, + 6203, + 6236, + 6171, + 6301, + 6193, + 6110, + 6193, + 6126, + 6088, + 6287, + 6360, + 6339, + 6230, + 6288, + 6199, + 6333, + 6277, + 6338, + 6138, + 6314, + 6298, + 6213, + 6329, + 6189, + 6260, + 6339, + 6144, + 6224, + 6146, + 6358, + 6225, + 6278, + 6178, + 6205, + 6147, + 6115, + 6220, + 6274, + 6131, + 6221, + 6147, + 6255, + 6289, + 6272, + 6225, + 6232, + 6256, + 6187, + 6270, + 6141, + 6142, + 6262, + 6200, + 6159, + 6309, + 6218, + 6255, + 6237, + 6227, + 6139, + 6210, + 6213, + 6299, + 6223, + 6298, + 6220, + 6131, + 6313, + 6235, + 6049, + 6203, + 6169, + 6197, + 6252, + 6230, + 6231, + 6205, + 6213, + 6247, + 6183, + 6190, + 6311, + 6319, + 6174, + 6207, + 6250, + 6281, + 6234, + 6193, + 6270, + 6297, + 6127, + 6286, + 6257, + 6257, + 6207, + 6219, + 6264, + 6274, + 6288, + 6143, + 6206, + 6244, + 6154, + 6227, + 6335, + 6249, + 6269, + 6209, + 6216, + 6255, + 6122, + 6216, + 6240, + 6380, + 6213, + 6206, + 6122, + 6180, + 6197, + 6201, + 6017, + 6270, + 6266, + 6370, + 6116, + 6105, + 6164, + 6113, + 6159, + 6240, + 6214, + 6332, + 6287, + 6106, + 6211, + 6327, + 6195, + 6191, + 6254, + 6123, + 6248, + 6226, + 6254, + 6222, + 6186, + 6217, + 6213, + 6224, + 6369, + 6216, + 6316, + 6372, + 6059, + 6220, + 6099, + 6340, + 6331, + 6231, + 6224, + 6210, + 6333, + 6157, + 6072, + 6310, + 6184, + 6255, + 6356, + 6234, + 6269, + 6191, + 6153, + 6207, + 6126, + 6257, + 6227, + 6152, + 6287, + 6245, + 6193, + 6334, + 6252, + 6242, + 6175, + 6298, + 6257, + 6197, + 6206, + 6232, + 6164, + 6276, + 6223, + 6182, + 6296, + 6170, + 6267, + 6319, + 6262, + 6149, + 6158, + 6134, + 6230, + 6187, + 6141, + 6165, + 6186, + 6235, + 6241, + 6229, + 6371, + 6230, + 6111, + 6242, + 6064, + 6213, + 6138, + 6181, + 6123, + 6242, + 6256, + 6105, + 6151, + 6261, + 6259, + 6215, + 6131, + 6293, + 6316, + 6177, + 6271, + 6172, + 6216, + 6238, + 6113, + 6162, + 6232, + 6000, + 6213, + 6137, + 6237, + 6162, + 6222, + 6231, + 6073, + 6231, + 6255, + 6112, + 6271, + 6191, + 6195, + 6282, + 6288, + 6187, + 6322, + 6262, + 6219, + 6146, + 6222, + 6071, + 6162, + 6219, + 6200, + 6229, + 6167, + 6193, + 6217, + 6331, + 6267, + 6242, + 6167, + 6342, + 6315, + 6255, + 6193, + 6299, + 6254, + 6212, + 6153, + 6179, + 6295, + 6303, + 6285, + 6161, + 6201, + 6307, + 6346, + 6263, + 6247, + 6228, + 6235, + 6195, + 6262, + 6400, + 6252, + 6271, + 6238, + 6206, + 6225, + 6306, + 6257, + 6286, + 6202, + 6272, + 6211, + 6179, + 6315, + 6232, + 6363, + 6099, + 6190, + 6278, + 6171, + 6178, + 6283, + 6302, + 6110, + 6171, + 6217, + 6203, + 6262, + 6208, + 6243, + 6266, + 6128, + 6217, + 6142, + 6194, + 6350, + 6196, + 6179, + 6224, + 6296, + 6121, + 6310, + 6248, + 6242, + 6187, + 6283, + 6254, + 6306, + 6160, + 6346, + 6192, + 6178, + 6046, + 6235, + 6244, + 6227, + 6240, + 6191, + 6216, + 6164, + 6215, + 6176, + 6146, + 6339, + 6070, + 6098, + 6277, + 6118, + 6280, + 6406, + 6211, + 6190, + 6286, + 6276, + 6217, + 6262, + 6311, + 6332, + 6323, + 6143, + 6306, + 6174, + 6277, + 6201, + 6343, + 6288, + 6356, + 6313, + 6166, + 6184, + 6300, + 6104, + 6278, + 6183, + 6130, + 6269, + 6179, + 6091, + 6191, + 6185, + 6163, + 6209, + 6197, + 6223, + 6128, + 6106, + 6059, + 6214, + 6224, + 6131, + 6276, + 6234, + 6267, + 6239, + 6151, + 6158, + 6161, + 6217, + 6268, + 6327, + 6215, + 6109, + 6277, + 6290, + 6258, + 6126, + 6262, + 6231, + 6305, + 6203, + 6236, + 6272, + 6321, + 6227, + 6286, + 6298, + 6280, + 6281, + 6137, + 6275, + 6204, + 6233, + 6174, + 6307, + 6274, + 6239, + 6237, + 6194, + 6124, + 6163, + 6184, + 6264, + 6413, + 6192, + 6227, + 6220, + 6068, + 6303, + 6213, + 6429, + 6193, + 6173, + 6219, + 6215, + 6128, + 6260, + 6273, + 6338, + 6293, + 6115, + 6272, + 6315, + 6360, + 6205, + 6311, + 6349, + 6264, + 6326, + 6085, + 6151, + 6164, + 6205, + 6340, + 6084, + 6077, + 6131, + 6226, + 6152, + 6196, + 6191, + 6150, + 6192, + 6318, + 6257, + 6296, + 6261, + 6351, + 6300, + 6182, + 6197, + 6151, + 6236, + 6197, + 6339, + 6255, + 6248, + 6250, + 6189, + 6347, + 6292, + 6353, + 6313, + 6337, + 6375, + 6361, + 6162, + 6099, + 6256, + 6344, + 6142, + 6315, + 6160, + 6320, + 6339, + 6151, + 6157, + 6340, + 6296, + 6108, + 6214, + 6200, + 6197, + 6224, + 6316, + 6158, + 6281, + 6073, + 6099, + 6296, + 6350, + 6203, + 6070, + 6243, + 6369, + 6222, + 6176, + 6228, + 6231, + 6403, + 6249, + 6169, + 6229, + 6297, + 6290, + 6214, + 6263, + 6224, + 6337, + 6298, + 6362, + 6211, + 6234, + 6172, + 6323, + 6187, + 6294, + 6277, + 6227, + 6302, + 6280, + 6300, + 6243, + 6304, + 6295, + 6201, + 6313, + 6175, + 6301, + 6322, + 6307, + 6063, + 6259, + 6281, + 6240, + 6270, + 6255, + 6284, + 6260, + 6281, + 6298, + 6285, + 6199, + 6239, + 6278, + 6284, + 6294, + 6193, + 6225, + 6246, + 6214, + 6254, + 6265, + 6365, + 6221, + 6277, + 6314, + 6343, + 6272, + 6299, + 6302, + 6409, + 6347, + 6377, + 6286, + 6211, + 6263, + 6314, + 6216, + 6259, + 6254, + 6276, + 6331, + 6306, + 6343, + 6357, + 6304, + 6337, + 6223, + 6408, + 6334, + 6371, + 6310, + 6268, + 6208, + 6254, + 6292, + 6204, + 6291, + 6360, + 6316, + 6240, + 6303, + 6234, + 6288, + 6253, + 6318 + ], + "sample_count": 1268 + }, + { + "pubkey": "9k54rsZQkjnJR9eVViDzCbfQVF5854XwEtUNdNbkzvD3", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242367000000, + "samples": [ + 8792, + 8502, + 8504, + 8504, + 8612, + 8570, + 8570, + 8776, + 8470, + 8470, + 8389, + 8389, + 8489, + 8535, + 8497, + 8505, + 8653, + 8562, + 8504, + 8560, + 8330, + 8330, + 8364, + 8364, + 8508, + 8485, + 8525, + 8480, + 8480, + 8535, + 8498, + 8427, + 8642, + 8430, + 8726, + 8549, + 8728, + 8418, + 8457, + 8541, + 8450, + 8450, + 8505, + 8532, + 8529, + 8523, + 8227, + 8476, + 8476, + 8360, + 8594, + 8856, + 8474, + 8553, + 8517, + 8517, + 8414, + 8414, + 8542, + 8522, + 8405, + 8418, + 8295, + 8456, + 8543, + 8515, + 8515, + 8530, + 8423, + 8344, + 8363, + 8676, + 8556, + 8419, + 8510, + 8639, + 8256, + 8436, + 8436, + 8513, + 8480, + 8606, + 8493, + 8529, + 8481, + 8343, + 8737, + 8486, + 8422, + 8444, + 8444, + 8477, + 8365, + 8365, + 8460, + 8294, + 9245, + 8560, + 8485, + 8342, + 8522, + 8332, + 8527, + 8497, + 8497, + 8543, + 8386, + 8439, + 8392, + 8473, + 8473, + 8407, + 8606, + 8485, + 8541, + 8509, + 8613, + 8527, + 8612, + 8758, + 8758, + 8408, + 8606, + 8606, + 8645, + 8439, + 8638, + 8628, + 8594, + 8342, + 8342, + 8604, + 8381, + 8549, + 8599, + 8421, + 8635, + 8544, + 8544, + 8353, + 8558, + 8558, + 8280, + 8503, + 8493, + 8493, + 8644, + 8644, + 8571, + 8528, + 8358, + 8358, + 8612, + 8312, + 8745, + 8327, + 8904, + 8460, + 8329, + 8477, + 8558, + 8692, + 8524, + 8601, + 8601, + 8281, + 8223, + 8459, + 8298, + 8604, + 8612, + 8651, + 8388, + 8477, + 8477, + 8428, + 8783, + 8546, + 8538, + 8410, + 8511, + 8477, + 8573, + 8502, + 8624, + 8398, + 8815, + 8423, + 8271, + 8432, + 8603, + 8583, + 8583, + 8450, + 8625, + 8540, + 8539, + 8415, + 8453, + 8412, + 8582, + 8813, + 8566, + 8371, + 8371, + 8454, + 8580, + 8580, + 8430, + 8430, + 8571, + 8470, + 8443, + 8443, + 8480, + 8528, + 9061, + 8400, + 8512, + 8512, + 8222, + 8434, + 8569, + 8569, + 8486, + 8486, + 8552, + 8712, + 8352, + 8464, + 8466, + 8677, + 8585, + 8452, + 8454, + 8432, + 8430, + 8399, + 8479, + 8690, + 8376, + 8518, + 8518, + 8562, + 8539, + 8383, + 8668, + 8668, + 8462, + 8443, + 8391, + 8492, + 8503, + 8503, + 8360, + 8360, + 8533, + 8360, + 8464, + 8567, + 8415, + 8631, + 8413, + 8480, + 8320, + 8378, + 8566, + 8433, + 8599, + 8441, + 8377, + 8377, + 8332, + 8486, + 8347, + 8347, + 8690, + 8485, + 8340, + 8398, + 8485, + 8559, + 8428, + 8533, + 8429, + 8429, + 8320, + 8591, + 8461, + 8688, + 8636, + 8668, + 8668, + 8521, + 8323, + 8362, + 8418, + 8282, + 8644, + 8354, + 8457, + 8280, + 8602, + 8328, + 8572, + 8484, + 8567, + 8443, + 8546, + 8437, + 8410, + 8563, + 8538, + 8630, + 8665, + 8410, + 8532, + 8412, + 8485, + 8485, + 8455, + 9295, + 8602, + 8602, + 8329, + 8444, + 8384, + 8407, + 8721, + 8567, + 8525, + 8539, + 8476, + 8476, + 8376, + 8386, + 8542, + 8707, + 8604, + 8604, + 8577, + 8488, + 8534, + 8485, + 8490, + 8477, + 8531, + 8567, + 8579, + 8385, + 8385, + 8470, + 8555, + 8664, + 8456, + 8456, + 8466, + 8576, + 8442, + 8442, + 8372, + 8549, + 8420, + 8329, + 8347, + 8395, + 8877, + 8262, + 8536, + 8437, + 8465, + 8465, + 8341, + 8687, + 8666, + 8377, + 8287, + 8342, + 8498, + 8487, + 8426, + 8649, + 8624, + 8624, + 8524, + 8428, + 8485, + 8286, + 8598, + 8678, + 8377, + 8377, + 8549, + 8184, + 8184, + 8280, + 8790, + 8417, + 8504, + 8462, + 8275, + 8483, + 8322, + 8322, + 8399, + 8399, + 8492, + 8387, + 8485, + 8485, + 8357, + 8545, + 8526, + 8490, + 8449, + 8428, + 8586, + 8610, + 8610, + 8701, + 8456, + 8398, + 8399, + 8399, + 8668, + 8449, + 8363, + 8218, + 8502, + 8883, + 8883, + 8488, + 8329, + 8567, + 8648, + 8521, + 8521, + 8497, + 8519, + 8447, + 8375, + 8435, + 8309, + 8309, + 8503, + 8481, + 8659, + 8536, + 8788, + 8485, + 8756, + 8756, + 8458, + 8467, + 8467, + 8360, + 8841, + 8306, + 8387, + 8387, + 8381, + 8341, + 8533, + 8760, + 8481, + 8684, + 8361, + 8476, + 8414, + 8471, + 8471, + 8471, + 8517, + 8424, + 8434, + 8415, + 8533, + 8494, + 8494, + 8444, + 8444, + 8594, + 8321, + 8354, + 8505, + 8619, + 8617, + 8418, + 8418, + 8327, + 8477, + 8477, + 8637, + 8357, + 8347, + 8520, + 8510, + 8748, + 8570, + 8389, + 8445, + 8445, + 8559, + 8559, + 8521, + 8467, + 8459, + 8378, + 8603, + 8600, + 8449, + 8420, + 8419, + 8419, + 8447, + 8360, + 8702, + 8460, + 8455, + 8265, + 8268, + 8719, + 8476, + 8515, + 8674, + 8265, + 8444, + 8311, + 8472, + 8472, + 8524, + 8926, + 8534, + 8422, + 8436, + 8505, + 8263, + 8470, + 8446, + 8419, + 8595, + 8565, + 8501, + 8501, + 8680, + 8585, + 8934, + 8331, + 8539, + 8507, + 8507, + 8587, + 8469, + 8923, + 8348, + 8375, + 8518, + 8314, + 8366, + 8681, + 8496, + 8713, + 8469, + 8347, + 8386, + 8283, + 8283, + 8485, + 8786, + 8565, + 8557, + 8557, + 8537, + 8308, + 8558, + 8387, + 8387, + 8456, + 8398, + 8398, + 8487, + 8546, + 8443, + 8681, + 8656, + 8217, + 8486, + 8420, + 8436, + 8338, + 8338, + 8600, + 8600, + 8631, + 8700, + 8232, + 8503, + 8271, + 8380, + 8716, + 8181, + 8400, + 8400, + 8522, + 8522, + 8723, + 8438, + 8477, + 8366, + 8766, + 8500, + 8646, + 8440, + 8425, + 8543, + 8584, + 8477, + 8307, + 8578, + 8351, + 8351, + 8538, + 8538, + 8290, + 8214, + 8294, + 8752, + 8465, + 8482, + 8482, + 8749, + 8384, + 8384, + 8361, + 8411, + 8411, + 8505, + 8244, + 8455, + 8324, + 8360, + 8295, + 8406, + 8547, + 8584, + 8432, + 8328, + 8225, + 8225, + 8444, + 8312, + 8312, + 8488, + 8305, + 8305, + 8505, + 8505, + 8463, + 8775, + 8775, + 8481, + 8487, + 8490, + 8490, + 8407, + 8235, + 8527, + 8527, + 8403, + 8496, + 8328, + 8373, + 8373, + 8379, + 8904, + 8223, + 8223, + 8288, + 8352, + 8452, + 8452, + 8517, + 8428, + 8428, + 8294, + 8294, + 8444, + 8257, + 8497, + 8497, + 8567, + 8391, + 8391, + 8506, + 8300, + 8300, + 8477, + 8427, + 8427, + 8340, + 8340, + 8376, + 8360, + 8404, + 8417, + 8412, + 8454, + 8203, + 8361, + 8362, + 8349, + 8540, + 8352, + 8352, + 8369, + 8298, + 8453, + 8313, + 8586, + 8328, + 8328, + 8331, + 8396, + 8376, + 8827, + 8673, + 8643, + 8643, + 8488, + 8351, + 8277, + 8440, + 8379, + 8722, + 8418, + 8566, + 8448, + 8339, + 8353, + 8353, + 8522, + 8544, + 8302, + 8551, + 8551, + 8411, + 8308, + 8347, + 8731, + 8462, + 8501, + 8358, + 8358, + 8258, + 8308, + 8308, + 8431, + 8431, + 8225, + 8225, + 8467, + 8541, + 8541, + 8463, + 8460, + 8352, + 8308, + 8251, + 8322, + 8360, + 8360, + 8462, + 8462, + 8290, + 8208, + 8342, + 8302, + 8257, + 8257, + 8370, + 8186, + 8226, + 8397, + 8387, + 8279, + 8261, + 8420, + 8583, + 8326, + 8206, + 8403, + 8403, + 8358, + 8328, + 8295, + 8319, + 8319, + 8383, + 8359, + 8262, + 8485, + 8377, + 8273, + 8273, + 8335, + 8349, + 8365, + 8609, + 8520, + 8524, + 8344, + 8344, + 8324, + 8243, + 8350, + 8385, + 8809, + 8279, + 8203, + 8213, + 8292, + 8329, + 8279, + 8562, + 8562, + 8261, + 8261, + 8387, + 8324, + 8338, + 8298, + 8442, + 8307, + 8279, + 8178, + 8178, + 8358, + 8326, + 8549, + 8676, + 8229, + 8393, + 8316, + 8195, + 8280, + 8325, + 8479, + 8479, + 8491, + 8291, + 8301, + 8305, + 8233, + 8479, + 8369, + 8369, + 8215, + 8365, + 8578, + 8399, + 8350, + 8611, + 8197, + 8197, + 8228, + 8181, + 8482, + 8369, + 8527, + 8341, + 8428, + 8281, + 8323, + 8255, + 8547, + 8547, + 8569, + 8572, + 8213, + 8429, + 8271, + 8277, + 8223, + 8726, + 8364, + 8364, + 8494, + 8502, + 8502, + 8330, + 8543, + 8357, + 8229, + 8370, + 8414, + 8496, + 8535, + 8298, + 8401, + 8650, + 8303, + 8338, + 8440, + 8381, + 8368, + 8406, + 8406, + 8345, + 8537, + 8339, + 8360, + 8360, + 8454, + 8512, + 8512, + 8668, + 8340, + 8319, + 8646, + 8379, + 8210, + 8381, + 8424, + 8504, + 8508, + 8628, + 8547, + 8379, + 8523, + 8442, + 8322, + 8471, + 8471, + 8522, + 8459, + 8296, + 8524, + 8524, + 8417, + 8538, + 8857, + 8316, + 8316, + 8320, + 8530, + 8273, + 8535, + 8386, + 8733, + 8501, + 8501, + 8589, + 8449, + 8383, + 8371, + 8371, + 8480, + 8430, + 8495, + 8345, + 8372, + 8362, + 8556, + 8453, + 8453, + 8551, + 8590, + 8481, + 8458, + 8458, + 8567, + 8561, + 8561, + 8268, + 8362, + 8374, + 8374, + 8308, + 8462, + 8720, + 8449, + 8425, + 8425, + 8543, + 8543, + 8369, + 8717, + 8382, + 8671, + 8671, + 8491, + 8380, + 8240, + 8825, + 8423, + 8413, + 8546, + 8546, + 8618, + 8832, + 8679, + 8441, + 8604, + 8604, + 8407, + 8369, + 8506, + 8564, + 8586, + 8491, + 8546, + 8397, + 8397, + 8503, + 8448, + 8665, + 8443, + 8468, + 8468, + 8466, + 8531, + 8531, + 8517, + 8456, + 8360, + 8279, + 8279, + 8618, + 8498, + 8519, + 8318, + 8304, + 8314, + 8427, + 8473, + 8341, + 8479, + 8657, + 8657, + 8528, + 8440, + 8514, + 8416, + 8680, + 8474, + 8474, + 8561, + 8372, + 8557, + 8478, + 8468, + 8378, + 8692, + 8414, + 8414, + 8406, + 8406, + 8282, + 8428, + 8464, + 8464, + 8729, + 8471, + 8425, + 8365, + 8438, + 8456, + 8265, + 8634, + 8543, + 8523, + 8240, + 8438, + 8438, + 8628, + 8667, + 8487, + 8445, + 8560, + 8415, + 8415, + 8523, + 8492, + 8372, + 8559, + 8325, + 8443, + 8453, + 8618, + 8618, + 8560, + 8494, + 8387, + 8312, + 8462, + 8340, + 8536, + 8466, + 8395, + 8582, + 8296, + 8577, + 8523, + 8447, + 8662, + 8662, + 8594, + 8533, + 8521, + 8521, + 8374, + 8386, + 8386, + 8430, + 8527, + 8527, + 8365, + 8330, + 8532, + 8532, + 8316, + 8645, + 8548, + 8656, + 8480, + 8492, + 8531, + 8472, + 8559, + 8559, + 8485, + 8485, + 8554, + 8567, + 8502, + 8567, + 8271, + 8436, + 8436, + 8749, + 8346, + 8380, + 8861, + 8861, + 8377, + 8343, + 8343, + 8565, + 8613, + 8613, + 8579, + 8334, + 8587, + 8402, + 8294, + 8540, + 8540, + 8476, + 8348, + 8348, + 8361, + 8438, + 8438, + 8436, + 8436, + 8495, + 8381, + 8475, + 8436, + 8295, + 8530, + 8603, + 8499, + 8478, + 8478, + 8425, + 8476, + 8481, + 8353, + 8407, + 8317, + 8397, + 8477, + 8383, + 8375, + 8198, + 8412, + 9041, + 9041, + 8226, + 8486, + 8622, + 8466, + 8561, + 8385, + 8380, + 8431, + 8266, + 8622, + 8486, + 8817, + 8307, + 8307, + 8826, + 8632, + 8474, + 8230, + 8401, + 8525, + 8546, + 8538, + 8538, + 8536, + 8582, + 8326, + 8616, + 8666, + 8599, + 8599, + 8571, + 8313, + 8390, + 8509, + 8509, + 8733, + 8544, + 8544, + 8401, + 8502, + 8542, + 8342, + 8319, + 8416, + 8558, + 8344, + 8364, + 8759, + 8448, + 8380, + 8407, + 8561, + 8750, + 8154, + 8770, + 8359, + 8332, + 8555, + 8718, + 8718, + 8489, + 8489, + 8546, + 8526, + 8526, + 8539, + 8828, + 8456, + 8530, + 8530, + 8361, + 8361, + 8387, + 8387, + 8487, + 8487, + 8337, + 8358, + 8358, + 8739 + ], + "sample_count": 1269 + }, + { + "pubkey": "9wV5FaWXYFwdCf4i6MMtMWDnM3p2w2hHU2RUWghWAx2e", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242242000000, + "samples": [ + 83600, + 83577, + 83599, + 83593, + 83608, + 83533, + 83585, + 83581, + 83527, + 83601, + 83559, + 83572, + 83590, + 83658, + 83620, + 83560, + 83558, + 83565, + 83544, + 83710, + 83643, + 83574, + 83585, + 83465, + 83539, + 83563, + 83552, + 83549, + 83672, + 83645, + 83741, + 83603, + 83711, + 83603, + 83694, + 83702, + 83761, + 83724, + 83699, + 83633, + 83752, + 83579, + 83625, + 83668, + 84860, + 83534, + 83549, + 84147, + 83553, + 83544, + 83708, + 83623, + 83542, + 83630, + 83494, + 89115, + 91515, + 83568, + 83572, + 83590, + 83599, + 83590, + 83596, + 83605, + 83591, + 83615, + 83558, + 83722, + 83558, + 83550, + 83584, + 83542, + 83555, + 83599, + 83551, + 83539, + 83546, + 83533, + 83615, + 83617, + 83543, + 83631, + 83628, + 83619, + 83629, + 83596, + 83649, + 83641, + 83565, + 83524, + 83702, + 83604, + 83530, + 83585, + 83558, + 83631, + 83608, + 83604, + 83552, + 83589, + 83621, + 83660, + 83595, + 83782, + 83590, + 83510, + 83562, + 83618, + 83568, + 83611, + 83686, + 83624, + 83559, + 83585, + 83526, + 83619, + 83630, + 83623, + 83577, + 83555, + 83640, + 83575, + 83599, + 83588, + 83709, + 83788, + 84075, + 83777, + 83615, + 83562, + 83634, + 83614, + 83591, + 83620, + 83553, + 83544, + 83663, + 83647, + 83570, + 83556, + 83596, + 83577, + 83761, + 83652, + 83619, + 83728, + 83654, + 83676, + 83576, + 83512, + 83553, + 83577, + 83571, + 83654, + 83661, + 83718, + 83682, + 83683, + 83534, + 83556, + 83640, + 83590, + 83622, + 86008, + 83720, + 83791, + 84014, + 83786, + 83541, + 83790, + 84059, + 84597, + 83615, + 83964, + 84422, + 83697, + 85565, + 91733, + 85374, + 89481, + 89414, + 87089, + 88864, + 89586, + 88826, + 90056, + 89737, + 87146, + 90584, + 88591, + 90791, + 89961, + 89895, + 89817, + 89748, + 88575, + 89440, + 87907, + 89047, + 89344, + 84356, + 84481, + 84540, + 85438, + 83749, + 83667, + 84746, + 83922, + 83596, + 84140, + 83712, + 84058, + 85182, + 83676, + 84213, + 83760, + 83680, + 86024, + 83820, + 83630, + 83966, + 85682, + 85100, + 84757, + 83975, + 83685, + 83843, + 83698, + 83807, + 84041, + 86399, + 83783, + 85254, + 84115, + 84829, + 85628, + 84141, + 84554, + 85157, + 85540, + 83975, + 85638, + 85577, + 85308, + 84223, + 86381, + 84591, + 85875, + 86330, + 83703, + 84863, + 83897, + 86319, + 86297, + 86325, + 86044, + 84475, + 83789, + 85606, + 84530, + 87753, + 83705, + 85897, + 87025, + 86756, + 86211, + 83957, + 83674, + 86722, + 84619, + 87086, + 85747, + 84891, + 86066, + 86101, + 87198, + 83758, + 84612, + 85765, + 85006, + 85272, + 83781, + 84639, + 84606, + 85104, + 87253, + 83857, + 84646, + 83770, + 83850, + 86239, + 85346, + 84259, + 84293, + 83643, + 83842, + 83875, + 83653, + 83797, + 83657, + 83709, + 83645, + 83780, + 83763, + 83607, + 84210, + 83673, + 83768, + 83656, + 83667, + 83715, + 83620, + 83628, + 83613, + 83598, + 83707, + 83598, + 83646, + 83669, + 83573, + 83666, + 83618, + 83624, + 83564, + 83661, + 83678, + 83727, + 83611, + 83618, + 83688, + 83627, + 83659, + 83700, + 83659, + 83636, + 83679, + 83663, + 83709, + 83702, + 83628, + 83652, + 83738, + 83603, + 83725, + 83654, + 83661, + 83656, + 83559, + 83709, + 83598, + 83721, + 83715, + 83810, + 83689, + 83595, + 83697, + 83682, + 83568, + 83688, + 83726, + 83679, + 83661, + 83649, + 83786, + 83770, + 83736, + 83620, + 83644, + 83797, + 83698, + 83640, + 83661, + 83605, + 83786, + 83542, + 83671, + 83631, + 83610, + 83603, + 83656, + 83789, + 83691, + 83620, + 83687, + 83633, + 83634, + 83652, + 83707, + 83693, + 83676, + 83648, + 83687, + 83643, + 83716, + 83667, + 83742, + 83649, + 83726, + 83699, + 83621, + 83699, + 83660, + 83706, + 83668, + 83667, + 83669, + 83633, + 83747, + 83693, + 83650, + 83740, + 83713, + 83676, + 83698, + 83651, + 83724, + 83726, + 83671, + 83727, + 83692, + 83693, + 83687, + 83738, + 83723, + 83675, + 83712, + 83652, + 83751, + 83652, + 83716, + 83678, + 83654, + 83631, + 83660, + 83662, + 83684, + 83673, + 83667, + 83723, + 83716, + 83751, + 83739, + 83570, + 83732, + 83736, + 83688, + 83643, + 83687, + 83709, + 83649, + 83654, + 83652, + 83682, + 83783, + 83699, + 83784, + 83643, + 83667, + 83655, + 83670, + 83707, + 83687, + 83642, + 83650, + 83677, + 83688, + 83763, + 83718, + 83642, + 83687, + 83673, + 83626, + 83642, + 83597, + 83719, + 83697, + 83692, + 83689, + 83651, + 83634, + 83771, + 83706, + 83601, + 83615, + 83645, + 83751, + 83627, + 83625, + 83688, + 83718, + 83735, + 83673, + 83668, + 83616, + 83791, + 83636, + 83627, + 83631, + 83630, + 83672, + 83709, + 83743, + 83699, + 83733, + 83631, + 83654, + 83687, + 83682, + 83699, + 83650, + 83718, + 83733, + 83671, + 83639, + 83701, + 83766, + 83624, + 83667, + 83575, + 83682, + 83661, + 83641, + 83605, + 83624, + 83606, + 83634, + 83665, + 83635, + 83686, + 83639, + 83707, + 83663, + 83607, + 83653, + 83585, + 83742, + 83714, + 83640, + 83657, + 83716, + 83639, + 83675, + 83686, + 83643, + 83654, + 83653, + 83638, + 83628, + 83658, + 83650, + 83654, + 83712, + 83698, + 83622, + 83635, + 83696, + 83672, + 83705, + 83604, + 83642, + 83758, + 83666, + 83618, + 83645, + 83719, + 83640, + 83731, + 83648, + 83705, + 83688, + 83707, + 83691, + 83680, + 83685, + 83684, + 83678, + 83717, + 83674, + 83637, + 83616, + 83691, + 83679, + 83600, + 83618, + 83685, + 83707, + 83602, + 83693, + 83638, + 83673, + 83687, + 83690, + 83710, + 83635, + 83651, + 83709, + 83797, + 83619, + 83733, + 83666, + 83675, + 83718, + 83723, + 83677, + 83652, + 83800, + 83649, + 83579, + 83776, + 83645, + 83716, + 83774, + 83693, + 83675, + 83690, + 83707, + 83741, + 83611, + 83651, + 83641, + 83732, + 83585, + 83715, + 83801, + 83659, + 86591, + 83739, + 83652, + 83594, + 83689, + 83695, + 83668, + 83644, + 83686, + 83678, + 83746, + 83639, + 83656, + 83719, + 83644, + 83686, + 83818, + 83604, + 83712, + 83717, + 83662, + 83693, + 83699, + 83750, + 83624, + 83746, + 83632, + 83583, + 83598, + 83720, + 83749, + 83687, + 83653, + 83683, + 83700, + 83697, + 83663, + 83639, + 83680, + 83685, + 83755, + 83671, + 83735, + 83603, + 83673, + 83643, + 83668, + 83686, + 83664, + 83700, + 83608, + 83648, + 83678, + 83625, + 83642, + 83737, + 83669, + 83709, + 83638, + 83658, + 83746, + 83672, + 83629, + 83665, + 83682, + 83615, + 84309, + 83658, + 83679, + 83694, + 83678, + 83672, + 83668, + 83673, + 83650, + 83716, + 83580, + 83680, + 83592, + 83696, + 83642, + 83663, + 83640, + 83715, + 83568, + 83659, + 83625, + 83580, + 83554, + 83648, + 83656, + 83595, + 83558, + 83662, + 83624, + 83605, + 83601, + 83617, + 83604, + 83633, + 83667, + 83607, + 83620, + 83601, + 83649, + 83612, + 83626, + 83576, + 83601, + 83641, + 83752, + 83606, + 83563, + 83616, + 83577, + 83721, + 83637, + 83598, + 83665, + 83659, + 83689, + 83560, + 83516, + 83670, + 83670, + 83658, + 83568, + 83567, + 83596, + 83585, + 83661, + 83611, + 83664, + 83624, + 83726, + 83744, + 83767, + 83788, + 83781, + 83739, + 84803, + 83689, + 83638, + 83714, + 83684, + 83692, + 84205, + 84523, + 83715, + 84311, + 83697, + 83696, + 83644, + 84079, + 83684, + 83804, + 83745, + 83675, + 83794, + 83709, + 83695, + 83886, + 83734, + 83733, + 83813, + 83650, + 84519, + 83861, + 83764, + 83683, + 83920, + 83771, + 83707, + 83714, + 83761, + 83701, + 83710, + 83960, + 84612, + 83865, + 84886, + 84072, + 83982, + 84617, + 84908, + 85263, + 84128, + 84183, + 84629, + 83708, + 86380, + 86270, + 83820, + 83727, + 84022, + 83894, + 84050, + 83906, + 84125, + 86388, + 86927, + 84338, + 83944, + 83902, + 83791, + 83957, + 83803, + 83880, + 84462, + 84517, + 85369, + 84410, + 85877, + 83775, + 83727, + 83811, + 84989, + 83706, + 84472, + 83972, + 85039, + 84515, + 84300, + 85090, + 85057, + 85241, + 85384, + 83690, + 85304, + 85063, + 85491, + 84738, + 84995, + 85133, + 85028, + 85079, + 88028, + 87214, + 85369, + 85905, + 84934, + 85762, + 85151, + 84334, + 87254, + 86570, + 86231, + 88252, + 84713, + 86493, + 85223, + 86231, + 86314, + 84047, + 84647, + 87504, + 84702, + 84456, + 83768, + 85891, + 85640, + 84666, + 83701, + 85616, + 84380, + 83777, + 85797, + 85175, + 85992, + 86775, + 86191, + 83986, + 85744, + 86756, + 84744, + 87528, + 86234, + 84408, + 84874, + 86034, + 87718, + 84911, + 83869, + 83771, + 84672, + 83976, + 84737, + 83951, + 84234, + 85552, + 85208, + 85538, + 83731, + 85294, + 85266, + 84860, + 85472, + 85353, + 83767, + 86281, + 85908, + 84872, + 84658, + 84226, + 86037, + 84493, + 83983, + 84534, + 84081, + 84421, + 86288, + 83808, + 83678, + 85426, + 85558, + 86292, + 83872, + 83691, + 83720, + 83757, + 83778, + 83704, + 83779, + 85327, + 84431, + 86642, + 84670, + 84317, + 84841, + 84191, + 85551, + 84493, + 83688, + 84598, + 83680, + 84649, + 85181, + 84721, + 85595, + 83757, + 84811, + 84697, + 84724, + 86438, + 85103, + 84841, + 84361, + 83808, + 84419, + 84405, + 84284, + 83924, + 84168, + 84427, + 85877, + 83999, + 88749, + 84550, + 84169, + 84177, + 83685, + 83612, + 85560, + 83735, + 85248, + 84958, + 84041, + 83697, + 85749, + 83744, + 84654, + 84207, + 85772, + 83732, + 84559, + 83755, + 83738, + 84577, + 83695, + 83589, + 83729, + 83700, + 83709, + 83729, + 83633, + 83646, + 83728, + 83665, + 83707, + 83653, + 83693, + 83704, + 83676, + 83756, + 83796, + 83690, + 83525, + 83592, + 83627, + 83656, + 83683, + 83683, + 83641, + 83742, + 83646, + 83699, + 83669, + 83665, + 83690, + 83717, + 83668, + 83691, + 83674, + 83651, + 83624, + 83672, + 83651, + 83678, + 83650, + 83677, + 83682, + 83694, + 83615, + 83732, + 83652, + 83629, + 83680, + 83616, + 83658, + 83710, + 83627, + 83653, + 83667, + 83680, + 83671, + 83650, + 83630, + 83575, + 83676, + 83634, + 83668, + 83662, + 83542, + 83646, + 83658, + 83613, + 83670, + 83617, + 83721, + 83648, + 83641, + 83679, + 83677, + 83629, + 83756, + 83687, + 83642, + 83698, + 83738, + 83662, + 83609, + 83639, + 83646, + 83719, + 83571, + 83633, + 83644, + 83573, + 83669, + 83660, + 83685, + 83631, + 83654, + 83630, + 83579, + 83606, + 83686, + 83709, + 83778, + 83674, + 83703, + 83714, + 83573, + 83612, + 83625, + 83625, + 83681, + 83545, + 83608, + 83617, + 83626, + 83726, + 83716, + 83676, + 83669, + 83575, + 83662, + 83660, + 83636, + 83637, + 83607, + 83715, + 83670, + 83598, + 83677, + 83736, + 83631, + 83807, + 83727, + 83649, + 83664, + 83638, + 83584, + 83553, + 83713, + 83604, + 83686, + 83631, + 83626, + 83691, + 83693, + 83736, + 83655, + 83653, + 83690, + 83693, + 83727, + 83623, + 83693, + 83629, + 83696, + 83732, + 83754, + 83694, + 83611, + 83642, + 83721, + 83619, + 83765, + 83596, + 83656, + 83608, + 83663, + 83547, + 83607, + 83763, + 83670, + 83598, + 83649, + 83698, + 83729, + 83754, + 83655, + 83645, + 83723, + 83628, + 83673, + 83599, + 83678, + 83570, + 83614, + 83619, + 83661, + 83556, + 83668, + 83605, + 83666, + 83683, + 83701, + 83692, + 83608, + 83656, + 83754, + 83680, + 83583, + 83570, + 83701, + 83629, + 83662, + 83716, + 83653, + 83674, + 83645, + 83744, + 83695, + 83599, + 83705, + 83578, + 83631, + 83633, + 83614, + 83690, + 83647, + 83652, + 83678, + 83640, + 83632, + 83608, + 83739, + 83836, + 83730, + 83684, + 83630, + 83689, + 83639, + 83687, + 83654, + 83720, + 83681, + 83645, + 83668, + 83679, + 83725, + 83681, + 83697, + 83668, + 83650, + 83691, + 83677, + 83681, + 83663, + 83641, + 83635, + 83700, + 83672, + 83705, + 83623, + 83751, + 83694, + 83711, + 83682, + 83703, + 83717, + 83706, + 83692, + 83606, + 83674, + 83668, + 83682, + 83660, + 83672, + 83736, + 83641 + ], + "sample_count": 1268 + }, + { + "pubkey": "883DgTDdVSdgvDC9G4Waqc4bdPpKVNAxwtFp7kxWfUk2", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242236000000, + "samples": [ + 263581, + 263642, + 263629, + 263679, + 263541, + 263498, + 263538, + 263529, + 263664, + 263703, + 263526, + 263730, + 263604, + 263649, + 263624, + 263665, + 263697, + 263606, + 263526, + 263581, + 263536, + 263577, + 263656, + 263662, + 263533, + 263669, + 263502, + 263553, + 263591, + 263516, + 263705, + 263498, + 263667, + 263542, + 263590, + 263552, + 263576, + 263665, + 263544, + 263616, + 263576, + 263702, + 263593, + 263528, + 263636, + 263534, + 263554, + 263650, + 263630, + 263634, + 263416, + 263705, + 263535, + 263563, + 263608, + 263549, + 263611, + 263459, + 263623, + 263621, + 263554, + 263535, + 263499, + 263526, + 263581, + 263405, + 263698, + 263641, + 263575, + 263578, + 263597, + 263519, + 263514, + 263664, + 263535, + 263557, + 263586, + 263551, + 263623, + 263525, + 263424, + 263639, + 263602, + 263631, + 263562, + 263566, + 263468, + 263626, + 263641, + 263605, + 263637, + 263630, + 263615, + 263616, + 263570, + 263575, + 263636, + 263634, + 263565, + 263643, + 263616, + 263537, + 263541, + 263674, + 263576, + 263590, + 263792, + 264936, + 263720, + 263739, + 263498, + 263614, + 263649, + 266126, + 263612, + 263480, + 263606, + 263809, + 263642, + 263631, + 263541, + 263608, + 263626, + 263528, + 263544, + 263480, + 263615, + 263575, + 263514, + 263618, + 263541, + 263473, + 263650, + 263783, + 263491, + 263557, + 263567, + 263667, + 263492, + 263566, + 263689, + 263640, + 263533, + 263510, + 263634, + 263683, + 263667, + 263661, + 263582, + 263580, + 263583, + 263625, + 263518, + 263604, + 263554, + 263420, + 263461, + 263559, + 263519, + 263565, + 263601, + 263573, + 263654, + 263609, + 263490, + 263561, + 263547, + 263697, + 263616, + 263600, + 263615, + 263674, + 263597, + 263526, + 263592, + 263582, + 263693, + 263615, + 263602, + 263580, + 263565, + 263570, + 263642, + 263544, + 263676, + 263559, + 263628, + 263486, + 264997, + 263485, + 263622, + 263621, + 263580, + 263610, + 263647, + 263632, + 263550, + 263638, + 263551, + 263672, + 273232, + 273315, + 273369, + 273352, + 273168, + 273342, + 273314, + 273355, + 273231, + 273236, + 273303, + 273203, + 273321, + 273258, + 273155, + 273218, + 273273, + 273276, + 273232, + 273218, + 273295, + 273313, + 273226, + 273245, + 273322, + 273266, + 273188, + 273158, + 273279, + 273332, + 273093, + 273264, + 273126, + 273320, + 273248, + 273329, + 273141, + 273178, + 273377, + 273293, + 273177, + 273155, + 273315, + 273276, + 273404, + 273186, + 263682, + 263607, + 263588, + 263562, + 263574, + 263706, + 263727, + 263563, + 263737, + 263609, + 263686, + 263564, + 263569, + 263679, + 263523, + 263656, + 263592, + 263754, + 263604, + 263661, + 263564, + 263699, + 263565, + 263576, + 263517, + 263657, + 263626, + 263643, + 263813, + 263698, + 263638, + 263528, + 263619, + 263708, + 263020, + 263584, + 263617, + 263680, + 263606, + 263671, + 263768, + 263682, + 263656, + 263602, + 263524, + 263672, + 263507, + 263694, + 263542, + 263684, + 263598, + 263776, + 263673, + 263598, + 263597, + 263689, + 263615, + 263570, + 263714, + 263592, + 263631, + 263761, + 263618, + 263626, + 263650, + 263692, + 263675, + 263600, + 263619, + 263773, + 263682, + 263689, + 263625, + 263605, + 263756, + 263635, + 263596, + 263626, + 263620, + 263651, + 263508, + 263731, + 263596, + 263630, + 263625, + 263655, + 263601, + 263607, + 263784, + 263662, + 263533, + 263764, + 263599, + 263594, + 263787, + 263597, + 263570, + 263587, + 263621, + 263705, + 263677, + 263679, + 263539, + 263612, + 263676, + 263703, + 263584, + 263677, + 263636, + 263571, + 263736, + 263687, + 263559, + 263613, + 263457, + 263565, + 263573, + 263589, + 263596, + 263587, + 263506, + 263599, + 263651, + 263567, + 263828, + 263685, + 263554, + 263723, + 263743, + 263532, + 263581, + 263705, + 263512, + 263580, + 263500, + 263680, + 263628, + 263668, + 263545, + 263735, + 263739, + 263613, + 263698, + 263673, + 263585, + 263690, + 263540, + 263606, + 263630, + 263468, + 263560, + 263623, + 263760, + 263556, + 263532, + 263607, + 263709, + 263613, + 263655, + 263612, + 263584, + 263610, + 263600, + 263663, + 263655, + 263660, + 263579, + 263592, + 263716, + 263591, + 263660, + 263682, + 263715, + 263679, + 263540, + 263693, + 263699, + 263838, + 263619, + 263749, + 263628, + 263548, + 263627, + 263620, + 263775, + 263573, + 263622, + 263537, + 263653, + 263579, + 263797, + 263624, + 263756, + 263551, + 263530, + 263651, + 263657, + 263730, + 263657, + 263738, + 263687, + 263629, + 263576, + 263623, + 263487, + 263699, + 263704, + 263633, + 263648, + 263832, + 263721, + 263718, + 263563, + 263633, + 263591, + 263576, + 263689, + 263628, + 263795, + 263765, + 263563, + 263592, + 263733, + 263598, + 263579, + 263779, + 263546, + 263750, + 263778, + 263738, + 263618, + 263731, + 263598, + 263608, + 263636, + 263570, + 263678, + 263596, + 263746, + 263664, + 263712, + 263591, + 263579, + 263574, + 263580, + 263638, + 263678, + 263673, + 263616, + 263612, + 263561, + 263500, + 263627, + 263532, + 263693, + 263663, + 263770, + 263581, + 263651, + 263723, + 263576, + 263800, + 263756, + 263580, + 263706, + 263757, + 263618, + 263773, + 263793, + 263661, + 263835, + 263808, + 263638, + 263773, + 263728, + 263603, + 263657, + 263715, + 263737, + 263737, + 263610, + 263583, + 263731, + 263587, + 263562, + 263724, + 263770, + 263750, + 263666, + 263769, + 263673, + 263621, + 263767, + 263632, + 263749, + 263719, + 263661, + 263846, + 263640, + 263739, + 263753, + 263758, + 263759, + 263602, + 263614, + 263546, + 263787, + 263677, + 263829, + 263691, + 263579, + 263603, + 263604, + 263645, + 263640, + 263700, + 263756, + 263742, + 263686, + 263803, + 263704, + 263801, + 263656, + 263734, + 263625, + 263817, + 263788, + 263748, + 263739, + 263667, + 263772, + 263649, + 263649, + 263596, + 263799, + 263578, + 263579, + 263698, + 263560, + 263696, + 263623, + 263704, + 263690, + 263723, + 263575, + 263755, + 263838, + 263718, + 263618, + 263588, + 263528, + 263662, + 263639, + 263628, + 263621, + 263633, + 263769, + 263598, + 263583, + 263652, + 263631, + 263769, + 263580, + 263743, + 263704, + 263677, + 263655, + 263653, + 263609, + 263648, + 263730, + 263593, + 263685, + 263830, + 263552, + 263689, + 263569, + 263555, + 263639, + 263673, + 263748, + 263726, + 263654, + 263592, + 263659, + 263677, + 263781, + 263737, + 263514, + 263698, + 263563, + 263694, + 263594, + 263599, + 263579, + 264544, + 264611, + 264536, + 264602, + 264606, + 264582, + 264686, + 264552, + 264687, + 264525, + 264558, + 264634, + 264746, + 264648, + 264582, + 264746, + 264664, + 264556, + 264650, + 264666, + 264648, + 264630, + 264687, + 264555, + 264573, + 264680, + 264785, + 264531, + 264530, + 264704, + 264673, + 264494, + 264678, + 264596, + 263662, + 264636, + 264654, + 264553, + 264583, + 264587, + 264635, + 264565, + 264674, + 264607, + 264698, + 264586, + 264649, + 264677, + 264736, + 264663, + 264620, + 264609, + 264679, + 264600, + 264428, + 264523, + 264734, + 264705, + 264679, + 264635, + 264678, + 264712, + 264577, + 264738, + 264559, + 264622, + 264592, + 264551, + 264731, + 264382, + 264574, + 264633, + 264774, + 264583, + 264523, + 264647, + 264658, + 264646, + 264510, + 264510, + 264684, + 264691, + 264813, + 264761, + 264177, + 264133, + 264137, + 264153, + 264213, + 264275, + 264106, + 264129, + 264076, + 264267, + 264260, + 264199, + 264110, + 264020, + 264199, + 264114, + 264237, + 264141, + 264088, + 264111, + 264223, + 264112, + 264262, + 264138, + 264150, + 264025, + 264247, + 264070, + 264274, + 264180, + 264044, + 264251, + 264205, + 264128, + 264269, + 264209, + 275735, + 275735, + 275723, + 275719, + 275724, + 264079, + 264224, + 264274, + 264345, + 264058, + 264250, + 264155, + 264143, + 264042, + 264181, + 264170, + 264256, + 264126, + 264252, + 264134, + 264183, + 264217, + 264184, + 264120, + 264109, + 264211, + 264082, + 264214, + 264176, + 264254, + 264124, + 264125, + 264148, + 264214, + 264177, + 264246, + 264220, + 264152, + 264226, + 264183, + 264278, + 264302, + 264200, + 264138, + 264269, + 264238, + 264010, + 264242, + 264300, + 264041, + 264055, + 264188, + 264302, + 264177, + 264163, + 264185, + 264068, + 264236, + 264192, + 264373, + 264053, + 264197, + 264193, + 264252, + 264152, + 264297, + 264188, + 264166, + 264273, + 264192, + 264389, + 264233, + 264193, + 264165, + 264072, + 264197, + 264280, + 264138, + 264284, + 264135, + 264126, + 264073, + 264081, + 264095, + 264193, + 264277, + 264201, + 264138, + 264322, + 264083, + 264106, + 264242, + 264182, + 264248, + 264351, + 264291, + 264290, + 264257, + 264229, + 264119, + 264250, + 264292, + 264282, + 264236, + 264154, + 264257, + 264260, + 264215, + 264184, + 264105, + 264286, + 264062, + 264199, + 264232, + 264157, + 264059, + 264273, + 264102, + 264100, + 264256, + 264211, + 264272, + 264171, + 264210, + 264170, + 264133, + 264249, + 264281, + 264210, + 264106, + 264124, + 264162, + 264217, + 264202, + 264244, + 264192, + 264155, + 264144, + 264076, + 264189, + 264243, + 264284, + 264088, + 264175, + 264044, + 264298, + 264053, + 264196, + 264235, + 264201, + 264218, + 264078, + 264175, + 264233, + 264251, + 264335, + 264223, + 264213, + 264222, + 264124, + 264277, + 263956, + 264212, + 264226, + 264062, + 264262, + 264223, + 264194, + 264172, + 264120, + 264216, + 264160, + 264286, + 264158, + 264133, + 264212, + 264070, + 264099, + 264257, + 264212, + 264145, + 264176, + 264275, + 264127, + 264161, + 264172, + 264188, + 264307, + 264312, + 264263, + 264147, + 264085, + 264187, + 264268, + 264163, + 264141, + 264248, + 264156, + 264186, + 264315, + 264243, + 264215, + 264271, + 264313, + 264204, + 264182, + 264078, + 264093, + 264150, + 264125, + 264188, + 264216, + 264123, + 264096, + 264272, + 264217, + 264139, + 264057, + 264192, + 264177, + 264268, + 264067, + 264227, + 264286, + 264056, + 264083, + 264168, + 264118, + 264055, + 264172, + 264103, + 264212, + 264161, + 264315, + 264220, + 264142, + 263970, + 264142, + 264104, + 264084, + 264167, + 264118, + 264303, + 264251, + 264098, + 264291, + 264142, + 264157, + 264101, + 264241, + 264143, + 264058, + 264235, + 264239, + 264183, + 264204, + 264196, + 264150, + 264173, + 264215, + 264105, + 264124, + 264121, + 264140, + 264168, + 264234, + 264067, + 264124, + 264159, + 264085, + 264270, + 264192, + 264072, + 264207, + 264031, + 264138, + 264168, + 264235, + 264186, + 264194, + 264228, + 264052, + 264025, + 264233, + 264151, + 264169, + 264272, + 264103, + 264227, + 264075, + 264136, + 264120, + 264122, + 264130, + 264227, + 264208, + 264025, + 264174, + 264080, + 264172, + 264128, + 264200, + 264172, + 264290, + 264103, + 264172, + 264063, + 264132, + 264181, + 264055, + 264079, + 263982, + 264059, + 264357, + 264295, + 264057, + 264227, + 264015, + 264226, + 264273, + 264180, + 264151, + 264068, + 264161, + 264125, + 264234, + 264085, + 263971, + 264246, + 264228, + 264107, + 264232, + 264096, + 264120, + 264232, + 264243, + 264190, + 264019, + 264039, + 264094, + 264256, + 263918, + 264204, + 264288, + 264070, + 264078, + 264239, + 264048, + 264137, + 264173, + 264082, + 264250, + 264252, + 264077, + 264104, + 264206, + 264025, + 264214, + 264095, + 264120, + 264283, + 264125, + 264141, + 264212, + 264229, + 264186, + 264254, + 264183, + 264149, + 264110, + 264056, + 264127, + 264156, + 264249, + 264119, + 264074, + 264066, + 264251, + 264126, + 264252, + 264003, + 264162, + 264083, + 264222, + 264158, + 264015, + 264053, + 264128, + 264148, + 264164, + 264070, + 264125, + 264157, + 264083, + 264269, + 264199, + 264113, + 264123, + 264128, + 264158, + 264110, + 264103, + 264234, + 264188, + 264226, + 264227, + 263999, + 264214, + 264262, + 264104, + 264136, + 264139, + 264215, + 264154, + 264014, + 264062, + 264007, + 264185, + 264260, + 263214, + 263141, + 263131, + 263114, + 263072, + 263137, + 263244, + 263236, + 263081, + 263098, + 263097, + 263143, + 263141, + 263196, + 263063, + 263027, + 263101, + 263126, + 263136, + 263291, + 263259, + 263210, + 263133, + 263180, + 263138, + 263206, + 263093, + 263040, + 263151, + 263257, + 263204, + 263167, + 263104, + 263148, + 263253, + 263232, + 263181, + 263367, + 263191, + 263185, + 263246, + 263162, + 263117, + 263240, + 263174, + 263118, + 263241, + 263117, + 263153, + 263107, + 263145, + 263139, + 263246, + 263261, + 263211, + 263077, + 263053, + 262984, + 263077, + 263116, + 263158, + 263278, + 263068, + 263112, + 263172, + 263217, + 263087, + 263210, + 263175, + 263084, + 263133, + 263187, + 262923, + 263274, + 262992, + 263184, + 263097, + 263150, + 263177, + 263229, + 263068, + 263078, + 263107, + 263128, + 263232, + 263202, + 263069 + ], + "sample_count": 1267 + }, + { + "pubkey": "2uS5A7sVnfqkmvoknEyoXghHmWw6ncwvBQaLNwVt8Fzu", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242235000000, + "samples": [ + 18719, + 18626, + 19014, + 18606, + 18543, + 18597, + 18613, + 18546, + 18460, + 18630, + 18657, + 18461, + 18551, + 18613, + 18744, + 18506, + 18522, + 18559, + 18499, + 18612, + 18606, + 18594, + 18633, + 18564, + 18542, + 18541, + 18611, + 18536, + 18573, + 18495, + 18520, + 18461, + 18554, + 18470, + 18512, + 18680, + 18623, + 18743, + 18501, + 18558, + 18516, + 18607, + 18704, + 18526, + 18424, + 18577, + 18487, + 18898, + 18689, + 18464, + 18609, + 18545, + 18575, + 18440, + 18601, + 18664, + 18508, + 18588, + 18506, + 18420, + 18591, + 19007, + 18612, + 18556, + 18725, + 18589, + 18702, + 18790, + 49713, + 18421, + 18561, + 18474, + 19079, + 18706, + 19379, + 18488, + 18566, + 18463, + 18544, + 18425, + 18594, + 18561, + 18624, + 18476, + 18594, + 18571, + 18620, + 18468, + 18762, + 18705, + 18604, + 18629, + 18471, + 18442, + 18607, + 18417, + 18706, + 18750, + 18672, + 18696, + 18858, + 18696, + 18615, + 18503, + 18544, + 18448, + 18546, + 18614, + 18484, + 18570, + 18591, + 18971, + 18914, + 18683, + 18680, + 18542, + 18469, + 18632, + 18451, + 18638, + 18770, + 18545, + 18639, + 18607, + 18441, + 18621, + 18723, + 18554, + 18706, + 18630, + 18643, + 18590, + 18585, + 18539, + 18764, + 18572, + 18629, + 18595, + 18575, + 18529, + 18634, + 18636, + 18668, + 18611, + 18656, + 18662, + 18657, + 185047, + 18614, + 18535, + 18706, + 18492, + 18758, + 18486, + 18562, + 18914, + 18615, + 18807, + 18621, + 18585, + 18665, + 18641, + 18669, + 18745, + 18424, + 18513, + 18545, + 18603, + 18543, + 18603, + 18610, + 18476, + 18714, + 18726, + 18778, + 18567, + 18628, + 18597, + 18606, + 18449, + 19770, + 18645, + 18597, + 18504, + 18622, + 18540, + 18503, + 18441, + 18789, + 18601, + 18501, + 18606, + 18525, + 18584, + 18501, + 18638, + 18443, + 18493, + 18627, + 18479, + 18564, + 28485, + 18796, + 18528, + 18583, + 18909, + 18459, + 18517, + 18671, + 18532, + 18534, + 18577, + 18642, + 18488, + 18419, + 18593, + 18440, + 18798, + 18666, + 18567, + 18639, + 18531, + 18502, + 18521, + 18558, + 18445, + 19859, + 18557, + 18503, + 18460, + 18609, + 18494, + 18785, + 18510, + 18649, + 18531, + 18505, + 18429, + 18634, + 18487, + 18668, + 18363, + 18611, + 688453, + 18595, + 19159, + 18730, + 18606, + 18537, + 18544, + 18421, + 18507, + 18533, + 18546, + 18520, + 18634, + 18499, + 18586, + 18485, + 18423, + 18587, + 18424, + 18723, + 18928, + 18538, + 18481, + 18558, + 18528, + 18421, + 18757, + 18545, + 18651, + 18606, + 18563, + 18468, + 18514, + 18663, + 18763, + 18521, + 18592, + 19347, + 18711, + 18569, + 18723, + 18509, + 18465, + 18481, + 18522, + 18669, + 18488, + 18598, + 30967, + 18519, + 18756, + 19864, + 18530, + 18569, + 18681, + 21823, + 18587, + 18543, + 18448, + 18664, + 18532, + 18474, + 18649, + 18418, + 18504, + 18545, + 18428, + 18468, + 35094, + 18391, + 18480, + 18541, + 18595, + 18448, + 18734, + 18613, + 18531, + 18600, + 18603, + 18634, + 19578, + 18748, + 18465, + 18540, + 18542, + 18541, + 18617, + 18908, + 18565, + 18668, + 18630, + 18590, + 18533, + 18450, + 18766, + 18512, + 18517, + 18450, + 18415, + 18553, + 18584, + 18593, + 18544, + 18609, + 18552, + 18504, + 18431, + 18555, + 18454, + 18548, + 18536, + 18557, + 18519, + 18532, + 18458, + 18731, + 18447, + 18764, + 18504, + 18682, + 18753, + 18491, + 18675, + 18577, + 18546, + 18702, + 18590, + 18655, + 18568, + 18432, + 18590, + 18633, + 18553, + 18814, + 18810, + 18624, + 18600, + 18880, + 18570, + 19208, + 18674, + 18554, + 18549, + 18649, + 18480, + 18562, + 18685, + 18600, + 18591, + 18555, + 18473, + 18587, + 18641, + 18451, + 18691, + 18590, + 18656, + 18654, + 19148, + 18699, + 18555, + 18481, + 18919, + 18527, + 18518, + 18564, + 18654, + 18664, + 18761, + 18521, + 18754, + 18594, + 18635, + 18711, + 18570, + 18712, + 18735, + 18697, + 18559, + 18590, + 18648, + 18488, + 18758, + 18382, + 18771, + 18666, + 18681, + 18612, + 18744, + 18409, + 18574, + 18455, + 18699, + 18564, + 18617, + 18579, + 18618, + 18662, + 18588, + 18493, + 18656, + 18645, + 18582, + 18470, + 18547, + 18361, + 18802, + 18732, + 18547, + 18612, + 18577, + 18543, + 18661, + 18636, + 18739, + 18711, + 18604, + 18464, + 18737, + 18661, + 18635, + 18473, + 18800, + 18660, + 18651, + 18487, + 18504, + 18632, + 18541, + 18626, + 18794, + 18801, + 18573, + 24755, + 18679, + 18556, + 18569, + 18637, + 18435, + 18480, + 18667, + 18611, + 18490, + 18522, + 18612, + 18500, + 18557, + 18424, + 18484, + 18832, + 18905, + 18586, + 18498, + 18577, + 18533, + 18544, + 18513, + 18743, + 18640, + 18792, + 18408, + 18809, + 18604, + 18534, + 18491, + 18638, + 18493, + 18791, + 18427, + 18583, + 18563, + 18605, + 18561, + 18596, + 18584, + 18588, + 18391, + 18710, + 18816, + 18550, + 18485, + 18948, + 18534, + 18483, + 18554, + 18480, + 18573, + 18516, + 18604, + 18753, + 18660, + 18739, + 18704, + 18693, + 18621, + 18443, + 18509, + 18512, + 18613, + 18594, + 19105, + 18494, + 18493, + 18547, + 18881, + 18528, + 18507, + 18548, + 18542, + 18683, + 18543, + 18465, + 18753, + 18484, + 18870, + 18465, + 18660, + 18643, + 18460, + 18655, + 18531, + 18621, + 18463, + 18696, + 18537, + 18572, + 18581, + 18545, + 18655, + 18541, + 18569, + 18610, + 18475, + 18560, + 20410, + 18662, + 18670, + 19096, + 18560, + 18729, + 18727, + 18574, + 18613, + 18581, + 19585, + 18684, + 18552, + 20224, + 18632, + 18495, + 18559, + 18619, + 18551, + 18528, + 18665, + 18604, + 18618, + 18554, + 18560, + 18593, + 18788, + 18728, + 18733, + 18746, + 18578, + 18666, + 18820, + 18704, + 18637, + 18800, + 18829, + 28116, + 18604, + 18716, + 18489, + 18504, + 18589, + 18618, + 18702, + 18614, + 18675, + 18642, + 18602, + 18602, + 19266, + 18691, + 18756, + 18671, + 18586, + 18556, + 18620, + 18472, + 19807, + 18533, + 18597, + 18642, + 18415, + 18386, + 18665, + 18705, + 18547, + 18475, + 18649, + 18527, + 18640, + 18558, + 18588, + 18589, + 18642, + 18486, + 18571, + 18524, + 18602, + 18587, + 18646, + 18523, + 18728, + 18512, + 18547, + 18573, + 18552, + 18573, + 18699, + 18485, + 18592, + 18573, + 18505, + 18503, + 18640, + 18523, + 18425, + 18546, + 18617, + 577942, + 18438, + 18551, + 20088, + 18718, + 18716, + 18757, + 20563, + 18574, + 18573, + 18524, + 18511, + 18648, + 18606, + 18586, + 18494, + 18597, + 18625, + 18588, + 18689, + 18588, + 18577, + 18541, + 18615, + 18515, + 18579, + 18830, + 18650, + 18462, + 18764, + 18510, + 18600, + 18693, + 18418, + 18593, + 18479, + 18606, + 18531, + 18462, + 18462, + 18749, + 18583, + 18591, + 18678, + 18791, + 18489, + 18560, + 18702, + 19162, + 18654, + 18511, + 18702, + 18860, + 18472, + 18534, + 18525, + 18424, + 18553, + 18593, + 18576, + 18490, + 18495, + 18656, + 18503, + 18518, + 18634, + 18458, + 19596, + 18556, + 18472, + 18568, + 18481, + 18608, + 18663, + 18653, + 18603, + 18576, + 18721, + 18619, + 18586, + 18645, + 18592, + 18747, + 18399, + 18613, + 18704, + 18651, + 18570, + 18674, + 18506, + 18620, + 18553, + 18743, + 18698, + 18559, + 18435, + 18660, + 18590, + 18598, + 18517, + 18792, + 18504, + 18524, + 18641, + 18684, + 18660, + 18644, + 18639, + 18579, + 18600, + 18451, + 18672, + 18681, + 18696, + 18460, + 18575, + 18554, + 18789, + 18502, + 18547, + 18791, + 18715, + 18527, + 18532, + 18626, + 18433, + 18602, + 18665, + 18581, + 18548, + 18649, + 18690, + 18532, + 18839, + 18631, + 18475, + 21152, + 18634, + 18510, + 18661, + 18452, + 18679, + 18647, + 18524, + 18522, + 18424, + 18539, + 18539, + 18473, + 18616, + 18644, + 18536, + 18503, + 18494, + 18660, + 18479, + 18881, + 18544, + 18565, + 18538, + 18405, + 18572, + 18443, + 18581, + 18560, + 18571, + 18517, + 18552, + 18461, + 18601, + 18528, + 18482, + 18551, + 18582, + 18498, + 18502, + 18610, + 18608, + 18549, + 18833, + 18646, + 18769, + 18599, + 18446, + 18770, + 18493, + 18629, + 18496, + 18479, + 18905, + 189162, + 18448, + 18611, + 18627, + 18690, + 18672, + 18614, + 18567, + 18534, + 18650, + 18529, + 18676, + 18685, + 18643, + 18651, + 18640, + 18630, + 18627, + 18601, + 18618, + 18557, + 18534, + 19184, + 18639, + 18692, + 18447, + 18532, + 18664, + 18583, + 18487, + 18532, + 18562, + 18645, + 18793, + 18649, + 18571, + 18536, + 18581, + 18581, + 18662, + 18662, + 18499, + 18640, + 18523, + 18436, + 18436, + 18622, + 18706, + 18403, + 18590, + 18590, + 18509, + 18625, + 18625, + 18498, + 18544, + 18643, + 18541, + 18541, + 18601, + 18518, + 18570, + 18521, + 18644, + 18819, + 18819, + 18602, + 18602, + 18467, + 18511, + 18511, + 18565, + 18472, + 18725, + 18472, + 18472, + 18582, + 18529, + 18512, + 18512, + 18393, + 18550, + 18561, + 18671, + 18611, + 18557, + 18618, + 18533, + 18531, + 18531, + 18613, + 18613, + 18540, + 19392, + 18720, + 18720, + 18476, + 18476, + 18549, + 18501, + 18501, + 18567, + 18567, + 18637, + 18537, + 18537, + 18787, + 18655, + 18662, + 18662, + 18576, + 18527, + 18639, + 18639, + 18754, + 18636, + 18676, + 18581, + 18414, + 18414, + 18568, + 18766, + 18766, + 19659, + 18539, + 18536, + 18566, + 18566, + 18525, + 18630, + 18617, + 18617, + 18524, + 18549, + 18549, + 18654, + 18527, + 18646, + 18814, + 18814, + 18577, + 18525, + 18455, + 18455, + 32053, + 18737, + 18707, + 18707, + 18453, + 19195, + 19195, + 18661, + 18929, + 18929, + 18405, + 18608, + 18624, + 18624, + 18624, + 18644, + 18553, + 18553, + 18604, + 18508, + 18508, + 18529, + 18529, + 18947, + 18947, + 18562, + 18648, + 18648, + 18598, + 18554, + 19093, + 19093, + 18632, + 18601, + 18970, + 18521, + 18521, + 18666, + 18638, + 18638, + 18547, + 18547, + 18627, + 18627, + 18586, + 18540, + 18488, + 18834, + 18834, + 18551, + 18626, + 18705, + 18705, + 18623, + 18668, + 18534, + 18411, + 18411, + 18847, + 18847, + 18791, + 18505, + 18655, + 18585, + 18607, + 18644, + 18644, + 18556, + 18555, + 18555, + 18538, + 18482, + 18685, + 18603, + 18543, + 18543, + 18552, + 18496, + 18522, + 18442, + 18443, + 18443, + 18629, + 44175, + 18641, + 18591, + 18591, + 18526, + 18562, + 18564, + 18748, + 18748, + 18710, + 18568, + 18568, + 18611, + 18611, + 18543, + 20133, + 20133, + 18506, + 18570, + 18567, + 18522, + 18631, + 18872, + 18627, + 18627, + 18816, + 18816, + 18525, + 18550, + 18796, + 18796, + 18643, + 18518, + 18644, + 18483, + 18741, + 18562, + 18562, + 18610, + 18489, + 18468, + 18542, + 18496, + 18589, + 18499, + 18499, + 18511, + 18508, + 18638, + 18507, + 19376, + 18632, + 18555, + 18535, + 18532, + 18532, + 18570, + 18511, + 18511, + 18492, + 18645, + 18597, + 18837, + 18584, + 18584, + 18645, + 18598, + 18442, + 18467, + 18613, + 18429, + 18595, + 18595, + 18710, + 18710, + 18595, + 18674, + 18725, + 18725, + 18501, + 18424, + 18617, + 18601, + 18563, + 18580, + 18713, + 18552, + 18460, + 18457, + 18457, + 18695, + 18570, + 18570, + 18607, + 18650, + 18558, + 18558, + 18549, + 18598, + 18598, + 18570, + 18664, + 18664, + 18682, + 18682, + 18775, + 18625, + 18622, + 18526, + 18569, + 18812, + 18532, + 18532, + 18678, + 18540, + 18606, + 18606, + 18584, + 18608, + 18608, + 18519, + 18484, + 18459, + 18545, + 18545, + 18847, + 18441, + 18518, + 18518, + 18683, + 18562, + 18604, + 18604, + 18831, + 18831, + 18598, + 18829, + 18829, + 18622, + 18622, + 18627, + 18543, + 18640, + 18614, + 18614, + 18653, + 18434, + 18555, + 18555, + 18470, + 18470, + 18637, + 18565, + 18510, + 18588, + 18588, + 18523, + 18529, + 18529, + 291662, + 18533, + 18533, + 18550, + 18550, + 18550, + 18411, + 18671, + 18890, + 18583, + 18444, + 18683, + 18714, + 18714, + 18563, + 18552, + 18598, + 18501, + 18501, + 18495 + ], + "sample_count": 1272 + }, + { + "pubkey": "BdLvY2QSbTgpMXEUafvjqJo2PDrcpPbahEm5bfWYGtqa", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242177000000, + "samples": [ + 147466, + 147200, + 147139, + 147013, + 147461, + 147759, + 147585, + 147446, + 147510, + 147210, + 147366, + 147433, + 147727, + 147471, + 147516, + 147371, + 147234, + 147345, + 147311, + 147662, + 147582, + 147597, + 147472, + 147350, + 147460, + 147523, + 147446, + 147455, + 147504, + 147401, + 147493, + 147423, + 147119, + 148006, + 147409, + 147445, + 147373, + 147527, + 147436, + 147588, + 147412, + 147545, + 147415, + 147584, + 147732, + 147602, + 147542, + 147172, + 147203, + 147352, + 147139, + 147268, + 147034, + 147299, + 147045, + 147804, + 147198, + 147325, + 147320, + 147478, + 147516, + 147648, + 147217, + 147573, + 147542, + 147673, + 147517, + 148752, + 147400, + 147282, + 147224, + 147147, + 147533, + 147432, + 147547, + 147375, + 147413, + 147493, + 147517, + 147481, + 147479, + 147182, + 147169, + 147587, + 147424, + 147516, + 147247, + 147237, + 147399, + 147088, + 147141, + 147350, + 147080, + 147239, + 147521, + 147059, + 147485, + 147651, + 147495, + 147243, + 147206, + 147105, + 147157, + 147405, + 147302, + 147123, + 147278, + 147174, + 147359, + 147188, + 148646, + 147379, + 147069, + 147703, + 147469, + 147505, + 147361, + 147705, + 147539, + 147469, + 147155, + 147209, + 147507, + 147738, + 147539, + 147738, + 147506, + 147368, + 147609, + 147529, + 147423, + 147655, + 147541, + 147436, + 147540, + 147080, + 147308, + 147342, + 147449, + 147439, + 147292, + 147305, + 147052, + 147423, + 147520, + 148818, + 147642, + 147629, + 147628, + 147548, + 147456, + 147515, + 147537, + 147527, + 147669, + 147512, + 147652, + 147089, + 147241, + 147263, + 147766, + 147223, + 147630, + 147600, + 147490, + 147398, + 147753, + 147458, + 147588, + 147072, + 147241, + 147388, + 147382, + 147281, + 147399, + 147486, + 147290, + 147398, + 147374, + 147149, + 147224, + 147225, + 147141, + 147096, + 147378, + 147223, + 147141, + 147330, + 147348, + 147368, + 147190, + 147149, + 147107, + 147415, + 147526, + 147106, + 147215, + 147312, + 147092, + 147200, + 147270, + 147342, + 147046, + 147475, + 147617, + 147653, + 147495, + 147604, + 147525, + 147032, + 147222, + 147102, + 147196, + 147225, + 147247, + 147182, + 147447, + 147281, + 147100, + 147094, + 147328, + 147599, + 147149, + 147220, + 146981, + 147423, + 147046, + 147353, + 147147, + 147444, + 147257, + 147167, + 147211, + 147312, + 147231, + 147307, + 147234, + 148987, + 147327, + 147520, + 147405, + 147266, + 147629, + 147470, + 147425, + 147362, + 147254, + 147063, + 147310, + 147506, + 147529, + 147314, + 147534, + 147484, + 147236, + 147106, + 147387, + 147203, + 147445, + 147527, + 147500, + 147726, + 147506, + 147534, + 147161, + 147212, + 147290, + 147206, + 147646, + 147426, + 147547, + 147600, + 147511, + 147157, + 147504, + 147586, + 147408, + 147567, + 147556, + 147476, + 147610, + 147623, + 147081, + 147298, + 147340, + 147467, + 147247, + 147383, + 147407, + 147573, + 147553, + 147666, + 147380, + 147545, + 147482, + 147472, + 147449, + 147615, + 147437, + 147115, + 147163, + 147287, + 147253, + 147273, + 147261, + 147156, + 147167, + 147226, + 147356, + 147035, + 147451, + 147541, + 147434, + 147395, + 147027, + 147314, + 147155, + 147525, + 147826, + 147235, + 147262, + 147240, + 147171, + 147322, + 147040, + 147399, + 147323, + 147411, + 147318, + 147466, + 147463, + 147609, + 147407, + 147500, + 147561, + 147322, + 147525, + 147427, + 147605, + 147426, + 147519, + 147501, + 147763, + 147460, + 147612, + 147688, + 147439, + 147502, + 147545, + 147563, + 147578, + 147514, + 147218, + 147096, + 147246, + 147370, + 147305, + 147774, + 147613, + 147043, + 147155, + 147491, + 147446, + 147458, + 147111, + 147240, + 147274, + 147467, + 147616, + 147580, + 147519, + 147440, + 147513, + 147635, + 147631, + 147602, + 147437, + 147681, + 147146, + 147812, + 147375, + 147193, + 147692, + 147534, + 147628, + 147298, + 147279, + 147173, + 147322, + 147023, + 148201, + 147291, + 147341, + 147426, + 147270, + 147150, + 147017, + 147156, + 147230, + 147184, + 147264, + 147215, + 147468, + 147633, + 147215, + 147301, + 147235, + 147257, + 147590, + 147579, + 147426, + 147565, + 147300, + 147106, + 147293, + 147246, + 147507, + 147708, + 147612, + 147497, + 147668, + 147518, + 147459, + 147613, + 147361, + 147975, + 147495, + 147225, + 147237, + 147217, + 147339, + 147345, + 147240, + 147157, + 147384, + 147123, + 147346, + 147293, + 147116, + 147226, + 147374, + 147683, + 147535, + 147660, + 147556, + 147577, + 147564, + 147581, + 147589, + 147333, + 147285, + 147172, + 147081, + 147206, + 147247, + 147228, + 147390, + 147227, + 147124, + 147251, + 147409, + 147219, + 147161, + 147255, + 147171, + 147438, + 147322, + 147524, + 147284, + 147141, + 147136, + 147338, + 147123, + 147341, + 147227, + 147316, + 147283, + 147377, + 147182, + 147186, + 147233, + 147326, + 147166, + 147301, + 147208, + 147059, + 147211, + 147185, + 147226, + 147135, + 147397, + 147380, + 147220, + 147342, + 147093, + 147296, + 147297, + 147498, + 147169, + 147132, + 147152, + 147370, + 147039, + 147281, + 147246, + 147251, + 147111, + 147145, + 147299, + 147264, + 147184, + 147397, + 147406, + 147113, + 147114, + 147286, + 147355, + 147375, + 147183, + 147288, + 147313, + 147520, + 147268, + 147446, + 147313, + 147199, + 147330, + 147348, + 147264, + 147240, + 147192, + 147445, + 147061, + 147305, + 147121, + 147080, + 147122, + 147378, + 147121, + 147067, + 146990, + 147327, + 147047, + 147423, + 147524, + 147563, + 147498, + 147393, + 147510, + 147227, + 147637, + 147532, + 147479, + 147534, + 147439, + 147553, + 147153, + 147505, + 147412, + 147484, + 147375, + 147439, + 147058, + 147534, + 147527, + 147574, + 147424, + 147596, + 147469, + 147099, + 147105, + 147565, + 147451, + 147491, + 147236, + 147278, + 147352, + 147638, + 147378, + 147292, + 147118, + 147497, + 148301, + 147387, + 147333, + 147056, + 148603, + 147786, + 147183, + 147258, + 147305, + 147276, + 147179, + 147398, + 147135, + 147197, + 147426, + 147426, + 147838, + 147718, + 147554, + 147474, + 147392, + 147479, + 147252, + 147493, + 147308, + 147309, + 147357, + 147743, + 148689, + 147674, + 147512, + 147610, + 147609, + 148316, + 147663, + 147690, + 147448, + 147740, + 149230, + 147541, + 147413, + 147509, + 147076, + 147542, + 147480, + 147703, + 147769, + 147203, + 147452, + 147243, + 147129, + 147209, + 147413, + 147330, + 147189, + 147256, + 147283, + 147333, + 147170, + 147284, + 147327, + 147272, + 147088, + 147028, + 147602, + 147488, + 147386, + 147711, + 147552, + 147605, + 147024, + 147654, + 147403, + 147583, + 147596, + 147509, + 147508, + 147502, + 147565, + 147281, + 147560, + 147355, + 147354, + 147438, + 147176, + 147350, + 147647, + 147178, + 147432, + 147639, + 147639, + 147255, + 147418, + 147323, + 147497, + 147631, + 147386, + 147555, + 147220, + 147623, + 147057, + 147293, + 147409, + 147193, + 147300, + 147531, + 147192, + 147565, + 147600, + 147303, + 147640, + 147380, + 147443, + 147540, + 147498, + 147458, + 147349, + 147561, + 147696, + 147532, + 147208, + 147472, + 147047, + 147276, + 147710, + 147653, + 147442, + 147309, + 147250, + 147249, + 147120, + 147483, + 147242, + 147181, + 147468, + 147869, + 147877, + 147664, + 147007, + 147766, + 147232, + 147605, + 147654, + 146995, + 147419, + 147327, + 147326, + 147259, + 147395, + 147277, + 147270, + 147150, + 147141, + 147220, + 147231, + 147287, + 147278, + 147266, + 147190, + 147430, + 147100, + 147289, + 147381, + 147301, + 147003, + 147419, + 147178, + 147369, + 147361, + 147207, + 147240, + 147063, + 147514, + 147253, + 147233, + 147042, + 147338, + 147437, + 147241, + 147138, + 147198, + 147317, + 147129, + 147108, + 147135, + 147120, + 147884, + 147701, + 147651, + 147453, + 147690, + 147686, + 147207, + 147615, + 148558, + 147432, + 147460, + 147269, + 147405, + 147429, + 147154, + 147458, + 147055, + 147147, + 147289, + 147477, + 147477, + 147702, + 147169, + 147286, + 147279, + 147208, + 147262, + 147384, + 147122, + 147193, + 147465, + 147141, + 147175, + 147172, + 147042, + 147502, + 147241, + 147302, + 147188, + 147195, + 147309, + 147140, + 147145, + 147216, + 147196, + 147140, + 147370, + 147121, + 147194, + 147281, + 147153, + 147212, + 147227, + 147257, + 147239, + 147213, + 147202, + 147348, + 147268, + 147319, + 147413, + 147561, + 147420, + 147607, + 147516, + 147656, + 147456, + 147454, + 147535, + 147464, + 147461, + 147343, + 147609, + 147533, + 147240, + 147401, + 147420, + 147684, + 147624, + 147358, + 147532, + 147511, + 147471, + 147219, + 147226, + 147195, + 147375, + 147074, + 147053, + 147249, + 147262, + 147272, + 147023, + 147173, + 147178, + 147388, + 147628, + 147541, + 147274, + 147563, + 147420, + 147423, + 147498, + 147564, + 147719, + 147209, + 147115, + 147325, + 147123, + 147283, + 147279, + 147235, + 147193, + 147352, + 147398, + 147120, + 147245, + 147366, + 147126, + 147509, + 147633, + 147620, + 147243, + 147474, + 147346, + 147469, + 147530, + 147555, + 147582, + 147550, + 147483, + 147783, + 147454, + 147417, + 147551, + 147202, + 147067, + 147423, + 147542, + 147382, + 147399, + 147155, + 147176, + 147295, + 147236, + 147081, + 147660, + 147580, + 147525, + 147370, + 147196, + 147391, + 147361, + 147068, + 147103, + 147244, + 147335, + 147166, + 147447, + 216728, + 220854, + 147473, + 147403, + 147592, + 147623, + 147112, + 147183, + 147112, + 147685, + 147614, + 147524, + 147612, + 147551, + 147435, + 147426, + 147404, + 147624, + 148976, + 147334, + 147249, + 147235, + 147271, + 147287, + 147059, + 147410, + 147427, + 147524, + 147589, + 147481, + 147121, + 147412, + 147455, + 147225, + 147537, + 147492, + 147523, + 147552, + 147496, + 147604, + 147452, + 147626, + 147475, + 147472, + 147501, + 147838, + 147439, + 147427, + 147624, + 147818, + 147525, + 147539, + 147527, + 147244, + 147174, + 147261, + 147091, + 147258, + 147171, + 147228, + 147215, + 147415, + 147504, + 147618, + 147199, + 147388, + 147542, + 147181, + 147289, + 147332, + 147221, + 147283, + 147206, + 147426, + 147474, + 147637, + 147539, + 147399, + 147232, + 147230, + 147082, + 147296, + 147239, + 147379, + 147420, + 147314, + 147143, + 147419, + 147366, + 147092, + 147166, + 147233, + 147080, + 147295, + 147114, + 147080, + 147382, + 147508, + 147425, + 147422, + 147436, + 147726, + 147525, + 147462, + 147526, + 147497, + 147523, + 147133, + 147330, + 147252, + 147273, + 147408, + 146994, + 147209, + 147398, + 147687, + 147483, + 147463, + 147158, + 147212, + 147344, + 147094, + 147170, + 147186, + 147253, + 147232, + 147353, + 147136, + 147464, + 147357, + 147448, + 147565, + 147335, + 140428, + 140411, + 147178, + 147448, + 147453, + 147439, + 147472, + 147448, + 147219, + 147202, + 147315, + 147325, + 147604, + 147468, + 147530, + 147654, + 147542, + 147694, + 147130, + 147019, + 147145, + 147246, + 147202, + 147234, + 147519, + 147593, + 147465, + 147005, + 147261, + 147605, + 147594, + 147453, + 147153, + 147271, + 147429, + 147153, + 147223, + 147458, + 147536, + 147351, + 147668, + 147389, + 147075, + 147243, + 147171, + 147260, + 147374, + 147303, + 147338, + 147531, + 147162, + 147373, + 147168, + 147212, + 147133, + 147506, + 147055, + 147316, + 147519, + 147325, + 147592, + 147408, + 147465, + 147574, + 147538, + 147768, + 147726, + 147232, + 147370, + 147399, + 147180, + 147124, + 147239, + 147545, + 147565, + 147467, + 147417, + 147344, + 147216, + 147208, + 147552, + 147539, + 147561, + 147585, + 147517, + 147439, + 147161, + 147361, + 147198, + 147490, + 147683, + 147582, + 147545, + 147532, + 147533, + 147467, + 147279, + 147198, + 147343, + 147095, + 147642, + 147205, + 147775, + 147317, + 147627, + 147556, + 147543, + 147528, + 147326, + 147064, + 147239, + 147332, + 147310, + 147098, + 147107, + 147300, + 147222, + 147346, + 147357, + 147047, + 147371, + 147093, + 147384, + 147198, + 146988, + 147109, + 147193, + 147144, + 147439, + 147199, + 147491, + 147138, + 147311, + 147286, + 147348, + 147230, + 147391, + 147667, + 147397, + 147297, + 147455, + 147542, + 147440, + 147243, + 147251, + 147079, + 147239, + 147496, + 147309, + 147334, + 147271, + 147243, + 147418, + 147219, + 147185, + 147246, + 147269, + 147292, + 147236, + 147108, + 147628, + 147512, + 147595, + 147409, + 147567, + 147008, + 147239, + 147137, + 147513, + 147491, + 147434, + 147528, + 147205, + 147150, + 147150, + 147145, + 147117, + 147225, + 147163, + 147215, + 147417, + 147550, + 147301, + 147308, + 147252, + 147143, + 147370, + 147709, + 147636, + 147352, + 147591, + 147262, + 147512, + 147673, + 147594, + 147554, + 147432, + 147330, + 147297, + 147096, + 147108, + 147091, + 147016, + 147131, + 147335, + 147204, + 147266, + 147285, + 147248, + 147237, + 147292, + 147246 + ], + "sample_count": 1272 + }, + { + "pubkey": "DiovjkfY9yTAmevNraD9SDnYnY5XriyPfhuaREDnkhxr", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242245000000, + "samples": [ + 168288, + 168238, + 168360, + 168225, + 168429, + 168261, + 168359, + 168437, + 168394, + 168224, + 168243, + 168315, + 168373, + 168252, + 168316, + 168274, + 168278, + 168388, + 168254, + 168377, + 168195, + 168376, + 168274, + 168283, + 168256, + 168286, + 168312, + 168350, + 168231, + 168178, + 168281, + 168187, + 168287, + 168289, + 168253, + 168275, + 168347, + 168256, + 168273, + 168264, + 168294, + 168298, + 168269, + 168304, + 168277, + 168212, + 168286, + 168360, + 168298, + 168343, + 168194, + 168271, + 168147, + 168234, + 168287, + 168196, + 168245, + 168335, + 168321, + 168280, + 168277, + 168224, + 168373, + 168217, + 168299, + 168284, + 168234, + 168330, + 168262, + 168207, + 168183, + 168230, + 168293, + 168275, + 168227, + 168255, + 168181, + 168198, + 168262, + 168267, + 168246, + 168226, + 168253, + 168252, + 168254, + 168290, + 168273, + 168195, + 168302, + 168252, + 168263, + 168222, + 168317, + 168321, + 168315, + 168233, + 168361, + 168210, + 168244, + 168281, + 168235, + 168284, + 168210, + 168234, + 168282, + 168203, + 168240, + 168287, + 168148, + 168316, + 168281, + 168236, + 168262, + 168239, + 168208, + 168256, + 168312, + 168327, + 168245, + 168254, + 168241, + 168232, + 168274, + 168366, + 168241, + 168333, + 168236, + 168328, + 168219, + 168286, + 168232, + 168244, + 168213, + 168305, + 168268, + 168187, + 168231, + 168305, + 168256, + 168267, + 168234, + 168207, + 168176, + 168179, + 168157, + 168304, + 168204, + 168201, + 168243, + 168173, + 168253, + 168272, + 168179, + 168204, + 168307, + 168281, + 168239, + 168207, + 168204, + 168241, + 168174, + 168278, + 168216, + 168260, + 168260, + 168192, + 168222, + 168269, + 168238, + 168174, + 168216, + 168287, + 168303, + 168183, + 168270, + 168223, + 168231, + 168322, + 168262, + 168369, + 168203, + 168323, + 168238, + 168276, + 168312, + 168323, + 168186, + 168133, + 168403, + 168211, + 168220, + 168357, + 168258, + 168280, + 168396, + 168237, + 168177, + 168382, + 168265, + 168332, + 168305, + 168313, + 168374, + 168169, + 168222, + 168362, + 168240, + 168342, + 168355, + 168175, + 168311, + 168277, + 168164, + 168346, + 168234, + 168394, + 168282, + 168350, + 168288, + 168244, + 168279, + 168296, + 169070, + 169018, + 169080, + 168981, + 168945, + 168952, + 169008, + 168896, + 168952, + 168873, + 168996, + 168932, + 168885, + 168897, + 168967, + 168899, + 169008, + 168993, + 169019, + 168932, + 168952, + 168955, + 168968, + 168980, + 168866, + 168903, + 168918, + 168930, + 169024, + 168902, + 169036, + 168996, + 168886, + 169044, + 169085, + 168967, + 169108, + 169140, + 168963, + 169015, + 168998, + 168907, + 168952, + 168921, + 169005, + 168987, + 169001, + 169027, + 168970, + 168954, + 169051, + 168957, + 169054, + 168876, + 168969, + 169044, + 168952, + 169083, + 168898, + 169009, + 168979, + 168902, + 168931, + 169038, + 168974, + 169163, + 169031, + 169095, + 168896, + 169043, + 169014, + 168922, + 168988, + 169083, + 168957, + 168979, + 168972, + 169042, + 169054, + 168950, + 168979, + 169062, + 168956, + 168911, + 168993, + 169007, + 168931, + 168983, + 169014, + 168882, + 168975, + 168889, + 169120, + 169104, + 168951, + 169072, + 169072, + 168947, + 168956, + 168967, + 168984, + 169072, + 168909, + 168946, + 168910, + 168898, + 168903, + 169012, + 169090, + 168856, + 169050, + 169125, + 169075, + 169066, + 169055, + 168965, + 168904, + 168999, + 169110, + 169029, + 169156, + 168887, + 168958, + 169057, + 168939, + 169077, + 169017, + 169036, + 168887, + 168937, + 168897, + 169019, + 168934, + 169012, + 168938, + 169045, + 168898, + 169057, + 168962, + 169004, + 168927, + 168860, + 169024, + 168996, + 169020, + 168927, + 168872, + 168959, + 169086, + 168986, + 168916, + 169094, + 169161, + 168957, + 169044, + 168958, + 168932, + 168968, + 169004, + 168952, + 168973, + 169021, + 168955, + 168938, + 168946, + 168986, + 169051, + 168942, + 169002, + 168925, + 168993, + 168974, + 168951, + 168938, + 168867, + 169077, + 169054, + 168916, + 168900, + 168991, + 168990, + 169005, + 169029, + 168981, + 168870, + 169112, + 169036, + 168905, + 168938, + 168939, + 168981, + 169014, + 169000, + 169077, + 169037, + 168901, + 168908, + 168980, + 169028, + 169034, + 169036, + 169031, + 168936, + 168973, + 169066, + 169024, + 169012, + 168959, + 169089, + 168986, + 168995, + 168999, + 168965, + 168864, + 169023, + 168939, + 168952, + 169070, + 168947, + 168942, + 169044, + 169080, + 169080, + 169029, + 168939, + 168923, + 168939, + 168982, + 168940, + 169021, + 168970, + 169106, + 169012, + 169027, + 168918, + 169063, + 168940, + 169066, + 168923, + 169059, + 168930, + 168901, + 169013, + 169125, + 168944, + 168950, + 169005, + 169050, + 168944, + 169077, + 168989, + 169022, + 169105, + 168971, + 168983, + 168927, + 168991, + 168985, + 168998, + 168998, + 168941, + 168965, + 169125, + 169012, + 168959, + 169063, + 169045, + 168954, + 169013, + 169024, + 169006, + 168912, + 168957, + 168981, + 168977, + 168938, + 169007, + 169006, + 169097, + 168941, + 169130, + 168999, + 169001, + 168974, + 168967, + 169026, + 169013, + 168971, + 168937, + 168936, + 168928, + 168995, + 169135, + 169038, + 168987, + 169082, + 168926, + 169078, + 168921, + 168892, + 169011, + 168974, + 169070, + 168939, + 169073, + 169013, + 168951, + 169060, + 168947, + 169025, + 169156, + 169060, + 169083, + 168908, + 168900, + 168880, + 169192, + 169015, + 169080, + 169061, + 168959, + 169117, + 169045, + 168959, + 169135, + 169088, + 169054, + 168981, + 168946, + 169015, + 168976, + 168944, + 168993, + 168965, + 168928, + 168877, + 169003, + 169034, + 168999, + 168991, + 169023, + 169076, + 168921, + 169085, + 169089, + 168961, + 169127, + 168985, + 168968, + 168976, + 168917, + 169043, + 168994, + 169009, + 168956, + 169082, + 168946, + 169072, + 169068, + 168921, + 168954, + 168903, + 169166, + 169108, + 168997, + 168988, + 168863, + 169008, + 168782, + 168971, + 168969, + 169048, + 168906, + 168917, + 168957, + 168870, + 169021, + 168995, + 169116, + 169071, + 169015, + 168983, + 168945, + 169034, + 169004, + 169057, + 169018, + 168992, + 169062, + 168905, + 168951, + 169122, + 168922, + 169004, + 169093, + 168942, + 169018, + 169061, + 169043, + 168948, + 168968, + 169052, + 168973, + 168966, + 168877, + 169102, + 168936, + 169082, + 169060, + 169011, + 168975, + 169061, + 169027, + 169040, + 168866, + 169119, + 169109, + 168891, + 168983, + 169025, + 168978, + 168918, + 168965, + 168992, + 169012, + 168912, + 168993, + 168914, + 169007, + 168930, + 168906, + 168944, + 169009, + 168912, + 168945, + 169065, + 168954, + 169103, + 168974, + 169056, + 169059, + 168967, + 169154, + 168852, + 168972, + 168905, + 168865, + 169100, + 169015, + 169076, + 168996, + 168889, + 168953, + 169016, + 168977, + 168874, + 169159, + 168972, + 168992, + 168908, + 168927, + 169033, + 169045, + 169146, + 169019, + 168938, + 169046, + 169004, + 169015, + 168893, + 169048, + 168944, + 168953, + 168977, + 169016, + 169130, + 169088, + 169030, + 168981, + 168890, + 168933, + 169001, + 168913, + 169052, + 168993, + 169035, + 168980, + 169120, + 168868, + 168965, + 168973, + 168849, + 168855, + 169008, + 168917, + 169053, + 168955, + 168935, + 168932, + 168987, + 168924, + 169111, + 169053, + 168960, + 169023, + 168947, + 169075, + 168989, + 169045, + 169010, + 169001, + 168963, + 169150, + 169042, + 168983, + 169028, + 168968, + 169033, + 168988, + 169051, + 169120, + 168910, + 169030, + 168936, + 168892, + 169050, + 169060, + 169020, + 168963, + 168917, + 169018, + 169040, + 169062, + 169058, + 169046, + 169024, + 168990, + 169066, + 169091, + 168982, + 168927, + 169052, + 168986, + 168938, + 168903, + 169087, + 169132, + 169079, + 169054, + 169045, + 169071, + 169165, + 169013, + 169048, + 169108, + 168949, + 168947, + 169008, + 169057, + 168899, + 168973, + 168932, + 169057, + 168872, + 168868, + 169030, + 169075, + 168945, + 168872, + 168960, + 169022, + 169012, + 168955, + 168976, + 169085, + 168853, + 168922, + 168962, + 168964, + 169141, + 169033, + 168984, + 168978, + 168959, + 168950, + 169017, + 168983, + 169017, + 168944, + 168928, + 169003, + 169094, + 168950, + 169139, + 169087, + 168951, + 169067, + 169021, + 169041, + 168989, + 169042, + 168940, + 169075, + 168920, + 169031, + 168985, + 168988, + 169029, + 169047, + 169008, + 168925, + 169052, + 169087, + 168976, + 168994, + 169129, + 168968, + 169049, + 169022, + 168992, + 169079, + 168989, + 168977, + 169051, + 168954, + 169015, + 168975, + 168922, + 169006, + 168941, + 168880, + 169093, + 168957, + 169125, + 169010, + 169076, + 168870, + 168973, + 169095, + 169076, + 169073, + 169121, + 169167, + 168978, + 169008, + 169104, + 169002, + 169031, + 168929, + 169110, + 169166, + 169086, + 168936, + 169002, + 169039, + 168919, + 169069, + 169051, + 168909, + 168942, + 168943, + 168978, + 168925, + 169016, + 169060, + 168959, + 169037, + 168934, + 168901, + 169031, + 168970, + 168948, + 169052, + 169075, + 169094, + 169036, + 169095, + 169109, + 169008, + 169014, + 169110, + 169227, + 169121, + 169093, + 169051, + 168893, + 169086, + 168963, + 168896, + 168971, + 169138, + 169084, + 169106, + 169059, + 169036, + 169026, + 169008, + 168872, + 169093, + 168929, + 169089, + 169111, + 169002, + 169036, + 169020, + 169074, + 169040, + 169017, + 168999, + 168972, + 169138, + 169004, + 169099, + 169089, + 169007, + 169022, + 169050, + 169125, + 168909, + 168917, + 169110, + 169075, + 169121, + 169020, + 169033, + 168950, + 169089, + 169103, + 168905, + 169088, + 169024, + 169156, + 169106, + 168966, + 169034, + 169141, + 169062, + 169049, + 169202, + 169134, + 169057, + 169063, + 169093, + 168945, + 169033, + 169030, + 168995, + 169071, + 169126, + 169063, + 169099, + 169013, + 169083, + 168988, + 169117, + 169153, + 169131, + 168913, + 168927, + 169073, + 169081, + 169153, + 168945, + 168958, + 169075, + 169076, + 169043, + 168902, + 168964, + 168384, + 168272, + 168464, + 168378, + 168324, + 168396, + 168414, + 168455, + 168470, + 168445, + 168388, + 168385, + 168439, + 168463, + 168272, + 168235, + 168332, + 168410, + 168282, + 168300, + 168386, + 168421, + 168328, + 168410, + 168501, + 168181, + 168379, + 168430, + 168395, + 168256, + 168514, + 168317, + 168258, + 168406, + 168248, + 168306, + 168281, + 168189, + 168368, + 168391, + 168451, + 168384, + 168390, + 168287, + 168179, + 168254, + 168323, + 168462, + 168430, + 168433, + 168369, + 168469, + 168375, + 168344, + 168477, + 168352, + 168332, + 168463, + 168387, + 168408, + 168199, + 168273, + 168423, + 168261, + 168293, + 168390, + 168451, + 168264, + 168431, + 168392, + 168316, + 168249, + 168390, + 168293, + 168281, + 168416, + 168304, + 168378, + 168410, + 168236, + 168279, + 168318, + 168483, + 168364, + 168281, + 168384, + 168295, + 168458, + 168418, + 168410, + 168303, + 168204, + 168406, + 168508, + 168310, + 168359, + 168294, + 168505, + 168329, + 168362, + 168433, + 168472, + 168367, + 168348, + 168254, + 168345, + 168388, + 168342, + 168309, + 168402, + 168382, + 168493, + 168288, + 168341, + 168269, + 168331, + 168464, + 168446, + 168239, + 168370, + 168545, + 168371, + 168451, + 168422, + 168414, + 168373, + 168435, + 168427, + 168425, + 168220, + 168416, + 168427, + 168279, + 168442, + 168470, + 168424, + 168355, + 168323, + 168404, + 168334, + 168235, + 168383, + 168390, + 168399, + 168345, + 168380, + 168422, + 168397, + 168417, + 168292, + 168266, + 168362, + 168306, + 168278, + 168191, + 168283, + 168307, + 168211, + 168394, + 168298, + 168355, + 168430, + 168348, + 168284, + 168391, + 168310, + 168334, + 168359, + 168375, + 168411, + 168228, + 168367, + 168288, + 168296, + 168379, + 168290, + 168423, + 168437, + 168414, + 168347, + 168406, + 168349, + 168319, + 168335, + 168322, + 168386, + 168412, + 168320, + 168303, + 168402, + 168295, + 168289, + 168249, + 168325, + 168432, + 168366, + 168391, + 168411, + 168283, + 168395, + 168222, + 168257, + 168263, + 168273, + 168242, + 168373, + 168463, + 168421, + 168461, + 168336, + 168293, + 168326, + 168381, + 168469, + 168202, + 168324, + 168268, + 168417, + 168379, + 168266, + 168339, + 168421, + 168337, + 168201, + 168366, + 168299, + 168375, + 168415, + 168444, + 168458, + 168392, + 168387, + 168383, + 168350, + 168333, + 168434, + 168426, + 168298, + 168250, + 168388, + 168464, + 168465, + 168322, + 168327, + 168285, + 168404, + 168322, + 168394, + 168279, + 168405, + 168315, + 168350, + 168326, + 168354, + 168298, + 168282, + 168409, + 168335, + 168397, + 168424, + 168318, + 168353, + 168241, + 168431, + 168299, + 168376, + 168461, + 168416, + 168237, + 168265, + 168367, + 168221, + 168342, + 168464, + 168170 + ], + "sample_count": 1266 + }, + { + "pubkey": "4Mv64KQ6E7Tbe9eohy1f2MVRJMqZzS2MDprYfYP6ac5c", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "target_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242243000000, + "samples": [ + 67904, + 67885, + 67921, + 67938, + 67979, + 67898, + 67841, + 67916, + 67924, + 67956, + 67813, + 67946, + 67954, + 67925, + 67752, + 67920, + 67860, + 67855, + 67972, + 67812, + 67843, + 67854, + 67889, + 67974, + 67990, + 67885, + 67877, + 67909, + 67913, + 67926, + 67758, + 67960, + 67858, + 67818, + 67876, + 67914, + 67893, + 67954, + 67926, + 67957, + 67972, + 67999, + 67978, + 67956, + 67981, + 67904, + 67960, + 67981, + 67885, + 67932, + 67846, + 67892, + 68011, + 67940, + 67911, + 67947, + 67917, + 67920, + 67928, + 67992, + 67988, + 67817, + 67912, + 67855, + 67971, + 68010, + 67980, + 67962, + 67831, + 67896, + 67939, + 68004, + 67810, + 67971, + 68000, + 67966, + 67995, + 67942, + 67783, + 67935, + 67869, + 67830, + 67841, + 67904, + 67896, + 67929, + 67973, + 67906, + 67881, + 67906, + 67962, + 67845, + 67897, + 67911, + 67849, + 68013, + 67882, + 68014, + 67823, + 67901, + 67980, + 67878, + 67974, + 67946, + 67887, + 67947, + 67934, + 68036, + 67856, + 67979, + 67947, + 67853, + 67920, + 67932, + 67887, + 67901, + 68002, + 68009, + 67902, + 67929, + 67901, + 67957, + 67977, + 67944, + 67952, + 67988, + 67919, + 67861, + 67861, + 67930, + 67895, + 68096, + 67838, + 67987, + 67949, + 67904, + 67985, + 67948, + 67952, + 67873, + 67859, + 68002, + 67912, + 67905, + 67950, + 67894, + 67877, + 67962, + 67961, + 67916, + 67916, + 67903, + 67893, + 67910, + 67956, + 67833, + 67881, + 67833, + 67903, + 67957, + 67934, + 67865, + 67928, + 68034, + 67799, + 67990, + 68004, + 67864, + 67863, + 67931, + 67880, + 67844, + 67922, + 67968, + 67870, + 67938, + 67959, + 67946, + 67984, + 67956, + 67920, + 67986, + 67996, + 67965, + 67909, + 67950, + 67977, + 67916, + 67927, + 67778, + 67957, + 67907, + 67887, + 67944, + 67863, + 67830, + 67845, + 67843, + 67900, + 67895, + 67943, + 67851, + 67913, + 67831, + 68018, + 67814, + 67929, + 67981, + 67928, + 67903, + 67947, + 67978, + 67929, + 67945, + 67907, + 67904, + 67925, + 67906, + 67839, + 67902, + 67892, + 67967, + 67884, + 67996, + 67870, + 67838, + 67902, + 67741, + 67912, + 67886, + 68011, + 67901, + 67908, + 67891, + 67844, + 67891, + 67949, + 67971, + 67853, + 67914, + 67903, + 67884, + 67891, + 67808, + 67795, + 67955, + 67825, + 67850, + 67858, + 67938, + 67912, + 67927, + 67808, + 67969, + 67919, + 67815, + 67840, + 67825, + 67927, + 67901, + 67920, + 67841, + 67970, + 67822, + 67941, + 67749, + 67834, + 67928, + 67984, + 67907, + 67810, + 67900, + 67998, + 67846, + 67896, + 67796, + 67893, + 67903, + 67878, + 67850, + 67906, + 67997, + 67950, + 67936, + 67949, + 67876, + 67971, + 67918, + 67856, + 67895, + 67791, + 67975, + 67941, + 67918, + 67857, + 67844, + 67898, + 67840, + 67965, + 67923, + 67883, + 67770, + 67904, + 67857, + 67885, + 67878, + 67978, + 67948, + 67936, + 67970, + 67938, + 67960, + 67957, + 67916, + 67887, + 67925, + 67946, + 67748, + 67953, + 67848, + 67962, + 67932, + 67930, + 67914, + 67934, + 67975, + 67948, + 67814, + 67848, + 67916, + 67840, + 67938, + 67999, + 67964, + 67940, + 67961, + 67936, + 67768, + 67922, + 67929, + 67923, + 67904, + 68012, + 67911, + 67976, + 67907, + 67876, + 67907, + 68073, + 67927, + 67887, + 67932, + 67952, + 67868, + 67951, + 67889, + 67881, + 67977, + 67871, + 67910, + 67887, + 67879, + 67983, + 67882, + 68026, + 67920, + 67968, + 67864, + 67856, + 67902, + 67887, + 67952, + 67786, + 67896, + 67926, + 67959, + 67838, + 67917, + 67937, + 67935, + 67908, + 67905, + 67999, + 67918, + 68016, + 67868, + 67788, + 67939, + 67824, + 67921, + 68008, + 67924, + 67961, + 67991, + 67926, + 67910, + 67834, + 67794, + 67902, + 67944, + 67937, + 68030, + 67889, + 67885, + 68005, + 68002, + 67988, + 67896, + 67837, + 68021, + 67919, + 67937, + 68001, + 67857, + 67861, + 67896, + 67937, + 67974, + 67787, + 67957, + 67946, + 67908, + 67969, + 67855, + 67869, + 67879, + 67946, + 67897, + 67940, + 67981, + 68012, + 67926, + 67931, + 67876, + 67952, + 67883, + 67900, + 67951, + 67973, + 67934, + 67916, + 67870, + 67986, + 67967, + 67898, + 67868, + 67802, + 67926, + 67873, + 67972, + 67897, + 67965, + 67936, + 67831, + 67932, + 67903, + 67981, + 67924, + 67898, + 67905, + 67876, + 67909, + 67804, + 67933, + 67897, + 67941, + 67962, + 67828, + 67926, + 68011, + 67890, + 67977, + 68022, + 68050, + 67955, + 67863, + 67912, + 67864, + 67984, + 67948, + 68043, + 68043, + 68014, + 67942, + 68033, + 67960, + 67909, + 67915, + 67885, + 67988, + 67864, + 67933, + 68037, + 67875, + 67903, + 67925, + 67961, + 67942, + 67990, + 67995, + 67917, + 67836, + 67942, + 67935, + 67874, + 67735, + 67996, + 67958, + 67832, + 67965, + 67915, + 67948, + 68001, + 67905, + 67956, + 67921, + 67832, + 68003, + 67907, + 67954, + 67967, + 67916, + 68006, + 67894, + 67986, + 67959, + 68020, + 67927, + 67791, + 67833, + 67915, + 67960, + 67908, + 67916, + 67984, + 67926, + 67964, + 67969, + 67970, + 67913, + 67934, + 68023, + 67954, + 67738, + 67934, + 67882, + 67928, + 68001, + 67945, + 67945, + 67888, + 67900, + 67964, + 67968, + 67992, + 67922, + 67947, + 67943, + 68003, + 68040, + 67896, + 68020, + 67962, + 67937, + 67900, + 67875, + 67861, + 67975, + 67983, + 67941, + 68042, + 67976, + 68016, + 67943, + 67962, + 67961, + 67989, + 67840, + 67953, + 67937, + 67947, + 67882, + 67992, + 67891, + 67996, + 67822, + 67984, + 67868, + 67943, + 67855, + 67984, + 67797, + 67987, + 67921, + 67886, + 67837, + 67931, + 67858, + 67965, + 68021, + 67930, + 68007, + 67901, + 67945, + 67893, + 67886, + 67795, + 67928, + 67884, + 67811, + 67931, + 67931, + 67897, + 67952, + 67948, + 67928, + 67890, + 67992, + 67970, + 67891, + 67892, + 67909, + 67927, + 67836, + 67910, + 67863, + 67835, + 67839, + 67883, + 67946, + 67952, + 67812, + 67890, + 67932, + 67821, + 67886, + 67925, + 67855, + 67773, + 67929, + 67808, + 67900, + 67939, + 67899, + 67863, + 67883, + 67822, + 67932, + 67840, + 67878, + 68058, + 67970, + 67989, + 67863, + 67927, + 67986, + 67823, + 67856, + 67844, + 67879, + 67912, + 67998, + 67846, + 68053, + 67831, + 67822, + 67966, + 67927, + 67944, + 67905, + 67765, + 67838, + 67857, + 67930, + 67904, + 67956, + 67999, + 67883, + 67981, + 67895, + 67980, + 67878, + 67850, + 67935, + 67889, + 67962, + 67949, + 67901, + 67984, + 67960, + 67907, + 67860, + 67844, + 68018, + 68010, + 67900, + 67914, + 67884, + 67877, + 67904, + 67978, + 67943, + 67923, + 67861, + 67950, + 67862, + 67883, + 67954, + 67921, + 67888, + 67876, + 67859, + 67982, + 67827, + 68009, + 67931, + 67931, + 67836, + 67980, + 67933, + 67873, + 67865, + 67952, + 67970, + 67916, + 67813, + 67825, + 67876, + 67869, + 67907, + 67850, + 67958, + 67903, + 67905, + 67917, + 67906, + 68043, + 67949, + 67954, + 67926, + 67866, + 67896, + 68002, + 67894, + 67933, + 67909, + 67787, + 67899, + 67848, + 68012, + 67970, + 67931, + 67956, + 67951, + 67897, + 67914, + 67784, + 67906, + 67918, + 68017, + 67907, + 67851, + 68002, + 67865, + 67870, + 67901, + 67945, + 67915, + 67937, + 67942, + 67789, + 67821, + 67925, + 67924, + 68012, + 67905, + 67881, + 68024, + 68001, + 67838, + 67914, + 67911, + 67909, + 67876, + 67896, + 67954, + 67891, + 67971, + 67947, + 67923, + 67920, + 67829, + 67959, + 67907, + 67845, + 67975, + 67801, + 67882, + 67938, + 67753, + 67951, + 67861, + 67913, + 67889, + 67913, + 67905, + 67984, + 67950, + 67876, + 67850, + 67947, + 67877, + 67941, + 67925, + 67941, + 67931, + 67908, + 67908, + 68020, + 68022, + 67909, + 67971, + 68015, + 67865, + 67954, + 67807, + 67883, + 67967, + 67806, + 68057, + 67817, + 67788, + 67965, + 67886, + 67894, + 67859, + 67916, + 67826, + 67743, + 67929, + 67985, + 67931, + 67875, + 67912, + 67944, + 67827, + 67926, + 67941, + 68029, + 67964, + 67937, + 67925, + 67835, + 67974, + 67934, + 67967, + 67883, + 67929, + 67899, + 67877, + 67847, + 67888, + 67968, + 68014, + 67910, + 67960, + 67827, + 67898, + 67847, + 67999, + 67923, + 67854, + 67913, + 68003, + 67941, + 67973, + 67987, + 67859, + 67894, + 67900, + 67896, + 67969, + 68000, + 67965, + 67784, + 67896, + 67937, + 67860, + 67906, + 67939, + 67835, + 67981, + 67947, + 67943, + 67983, + 67939, + 67931, + 67963, + 67830, + 67959, + 67980, + 67867, + 67909, + 67845, + 67920, + 67996, + 67987, + 67951, + 67901, + 67935, + 67968, + 67990, + 67906, + 67962, + 68008, + 67998, + 67910, + 68014, + 67910, + 67889, + 67942, + 67891, + 67971, + 67981, + 67892, + 67888, + 67921, + 67872, + 67897, + 67936, + 67984, + 67862, + 67852, + 67921, + 67910, + 67882, + 67884, + 67896, + 67867, + 67957, + 67750, + 67895, + 67842, + 67936, + 67856, + 67836, + 67892, + 67933, + 67913, + 67869, + 67934, + 67862, + 67859, + 67853, + 67922, + 67799, + 67849, + 67893, + 67843, + 67822, + 67879, + 67954, + 67874, + 67852, + 67871, + 68026, + 67942, + 67893, + 67917, + 67821, + 67899, + 67893, + 67883, + 67844, + 67896, + 67912, + 67882, + 67970, + 67963, + 67864, + 67914, + 67843, + 67904, + 67934, + 67842, + 67913, + 67860, + 67937, + 67758, + 67933, + 67948, + 67831, + 67967, + 67921, + 67889, + 67987, + 67915, + 67799, + 67915, + 67896, + 67882, + 67946, + 67891, + 67932, + 67750, + 67923, + 67935, + 67832, + 67871, + 67987, + 67983, + 67922, + 67900, + 67841, + 67900, + 67940, + 67880, + 67862, + 67821, + 67945, + 67869, + 67864, + 67934, + 67875, + 67887, + 67799, + 67944, + 67895, + 67891, + 67935, + 67874, + 67834, + 67900, + 67728, + 67963, + 67940, + 67896, + 67901, + 67891, + 67938, + 67981, + 67856, + 67910, + 67978, + 67868, + 67878, + 67968, + 67900, + 67904, + 67787, + 67765, + 67843, + 67853, + 68009, + 67813, + 68002, + 67850, + 67977, + 67855, + 67917, + 67971, + 67915, + 67926, + 67839, + 67809, + 67942, + 67918, + 67941, + 68000, + 67901, + 67832, + 67881, + 67157, + 67796, + 67924, + 67294, + 67901, + 67901, + 67176, + 67906, + 67931, + 67966, + 67881, + 67902, + 67921, + 67988, + 67727, + 67934, + 67909, + 67861, + 67879, + 67961, + 67917, + 67901, + 67940, + 67903, + 67903, + 67872, + 67907, + 67884, + 67815, + 67944, + 67946, + 67833, + 67937, + 67917, + 67873, + 67838, + 67914, + 67924, + 67859, + 67974, + 67893, + 67955, + 67907, + 68016, + 67906, + 67825, + 67838, + 67946, + 67991, + 67845, + 67772, + 67944, + 68007, + 67870, + 67917, + 67949, + 67756, + 67951, + 67969, + 67743, + 67934, + 67898, + 67959, + 68010, + 67941, + 68001, + 67829, + 67965, + 67874, + 67951, + 67945, + 67951, + 67890, + 68056, + 67892, + 67869, + 67881, + 67825, + 67926, + 67876, + 67799, + 67843, + 67908, + 67976, + 67805, + 68011, + 67940, + 67867, + 67939, + 67940, + 67963, + 67934, + 67954, + 67962, + 67941, + 68003, + 67919, + 67891, + 67906, + 67953, + 67919, + 67879, + 67925, + 67962, + 67935, + 67834, + 67781, + 67913, + 68009, + 67957, + 67884, + 67902, + 67943, + 68010, + 67998, + 67941, + 67894, + 67946, + 67954, + 67994, + 67816, + 67926, + 67925, + 67755, + 67865, + 67905, + 67886, + 67829, + 67994, + 68032, + 67922, + 67834, + 67896, + 67982, + 67872, + 67964, + 67929, + 67928, + 68020, + 67888, + 67877, + 67951, + 67989, + 67951, + 67899, + 67983, + 67841, + 67976, + 67895, + 67866, + 67879, + 67947, + 67865, + 67866, + 67823, + 67907, + 67841, + 67899, + 67959, + 67931, + 67881, + 67854, + 67919, + 67854, + 67953, + 67985, + 68039, + 67926, + 67867, + 67967, + 67912, + 67966, + 67983, + 67942, + 67968, + 67904, + 67925, + 67941, + 67993, + 67837, + 67903, + 67934, + 67829, + 67964, + 67903, + 67981, + 67918, + 67980, + 67886, + 67934, + 67817 + ], + "sample_count": 1263 + }, + { + "pubkey": "Ajoy711sMtikeVG2Q8EDy2qmHY6aUNLEDaRcJxQ3Geoj", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242240000000, + "samples": [ + 15733, + 15747, + 15713, + 15657, + 15765, + 15660, + 15777, + 15798, + 15785, + 15594, + 15740, + 15785, + 15673, + 15726, + 15631, + 15755, + 15765, + 15615, + 15751, + 15675, + 15694, + 15729, + 15761, + 15760, + 15680, + 15669, + 15678, + 15746, + 15801, + 15660, + 15861, + 15871, + 15710, + 15715, + 15773, + 15835, + 15806, + 15794, + 15831, + 15768, + 15864, + 15841, + 15739, + 15718, + 15873, + 15734, + 15862, + 15766, + 15731, + 15795, + 15825, + 15699, + 15742, + 15651, + 15786, + 15740, + 15747, + 15757, + 15783, + 15698, + 15804, + 15846, + 15769, + 15646, + 15765, + 15749, + 15788, + 15807, + 15685, + 15642, + 15687, + 15782, + 15621, + 15691, + 15663, + 15707, + 15792, + 15632, + 15604, + 15795, + 15784, + 15733, + 15815, + 15768, + 15719, + 15668, + 15833, + 15797, + 15709, + 15785, + 15805, + 15612, + 15790, + 15556, + 15697, + 15670, + 15647, + 15851, + 15681, + 15784, + 15706, + 15744, + 15682, + 15771, + 15776, + 15686, + 15768, + 15734, + 15843, + 15723, + 15686, + 15718, + 15869, + 15636, + 15748, + 15800, + 15758, + 15776, + 15723, + 15752, + 15693, + 15816, + 15831, + 15787, + 15871, + 15729, + 15797, + 15930, + 15733, + 15844, + 15613, + 15804, + 15616, + 15809, + 15742, + 15631, + 15716, + 15757, + 15577, + 15680, + 15649, + 15734, + 15758, + 15851, + 15849, + 15806, + 15688, + 15833, + 15678, + 15679, + 15717, + 15788, + 15704, + 15672, + 15865, + 15763, + 15915, + 15930, + 15757, + 15802, + 15660, + 15732, + 15669, + 15882, + 15870, + 15895, + 15869, + 15859, + 15774, + 15679, + 15588, + 15677, + 15694, + 15721, + 15817, + 15851, + 15838, + 15675, + 15647, + 15785, + 15746, + 15882, + 15828, + 15766, + 15835, + 15868, + 15784, + 15782, + 15646, + 15747, + 15830, + 15645, + 15746, + 15885, + 15873, + 15721, + 15879, + 15923, + 15756, + 15748, + 15768, + 15690, + 15811, + 15808, + 15858, + 15723, + 15825, + 15863, + 15757, + 15781, + 15821, + 15767, + 15648, + 15807, + 15863, + 15903, + 15668, + 15737, + 15751, + 15614, + 15752, + 15857, + 15748, + 15890, + 15717, + 15857, + 15808, + 15703, + 15690, + 15823, + 15858, + 15737, + 15799, + 15721, + 15879, + 15781, + 15797, + 15724, + 15785, + 15775, + 15897, + 15813, + 15837, + 15746, + 15823, + 15809, + 15823, + 15821, + 15756, + 15828, + 15938, + 15899, + 15719, + 15657, + 15814, + 15766, + 15849, + 15893, + 15833, + 15891, + 15854, + 15852, + 15857, + 15772, + 15874, + 15841, + 15668, + 15827, + 15874, + 15819, + 15790, + 15788, + 15877, + 15720, + 15793, + 15909, + 15732, + 15877, + 15788, + 15810, + 15883, + 15769, + 15789, + 15804, + 15787, + 15901, + 15798, + 15754, + 15753, + 15715, + 15745, + 15825, + 15916, + 15794, + 15867, + 15842, + 15762, + 15705, + 15780, + 15767, + 15851, + 15772, + 15919, + 15892, + 15872, + 15784, + 15819, + 15863, + 15763, + 15779, + 15781, + 15841, + 15709, + 15845, + 15817, + 15781, + 15737, + 15740, + 15751, + 15859, + 15868, + 15756, + 15750, + 15858, + 15782, + 15919, + 15823, + 15883, + 15792, + 15866, + 15793, + 15823, + 15773, + 15791, + 15845, + 15829, + 15842, + 15741, + 15823, + 15887, + 15837, + 15971, + 15772, + 15780, + 15853, + 15844, + 15777, + 15833, + 15842, + 15786, + 15803, + 15787, + 15743, + 15822, + 15801, + 15950, + 15834, + 15916, + 15805, + 15801, + 15857, + 15793, + 15894, + 15716, + 15847, + 15848, + 15801, + 15899, + 15720, + 15799, + 15833, + 15833, + 15749, + 15758, + 15761, + 15885, + 15825, + 15865, + 15834, + 15794, + 15784, + 15829, + 15757, + 15838, + 15793, + 15865, + 15652, + 15810, + 15745, + 15896, + 15790, + 15806, + 15945, + 15762, + 15749, + 15844, + 15699, + 15802, + 15877, + 15863, + 15809, + 15773, + 15874, + 15867, + 15840, + 15856, + 15826, + 15840, + 15791, + 15829, + 15887, + 15870, + 15897, + 15751, + 15756, + 15822, + 15834, + 15895, + 15716, + 15754, + 15793, + 15803, + 15782, + 15757, + 15805, + 15834, + 15756, + 15861, + 15875, + 15859, + 15830, + 15817, + 15809, + 15804, + 15860, + 15932, + 15795, + 15839, + 15729, + 15888, + 15814, + 15861, + 15822, + 15711, + 15907, + 15791, + 15709, + 15794, + 15867, + 15803, + 15845, + 15870, + 15790, + 15949, + 15827, + 15804, + 15818, + 15833, + 15873, + 15947, + 15778, + 15830, + 15833, + 15872, + 15903, + 15792, + 15850, + 15678, + 15884, + 15860, + 15873, + 15779, + 15785, + 15893, + 15869, + 15776, + 15805, + 15756, + 15774, + 15751, + 15903, + 15908, + 15833, + 15737, + 15836, + 15728, + 15879, + 15818, + 15776, + 15870, + 15839, + 15917, + 15850, + 15827, + 15871, + 15834, + 15735, + 15817, + 15770, + 15878, + 15901, + 15809, + 15736, + 15866, + 15826, + 15739, + 15836, + 15805, + 15812, + 15902, + 15904, + 15822, + 15827, + 15924, + 15829, + 15777, + 15823, + 15874, + 15825, + 15877, + 15844, + 15838, + 15835, + 15833, + 15827, + 15936, + 15907, + 15883, + 15844, + 15870, + 15849, + 15736, + 15957, + 15772, + 15903, + 15831, + 15804, + 15835, + 15823, + 15866, + 15832, + 15902, + 15857, + 15895, + 15760, + 15807, + 15851, + 15920, + 15851, + 15906, + 15844, + 15820, + 15689, + 15692, + 15770, + 15839, + 15938, + 15871, + 15729, + 15880, + 15828, + 15733, + 15821, + 15723, + 15929, + 15826, + 15864, + 15885, + 15854, + 15875, + 15959, + 15879, + 15767, + 15759, + 15830, + 15882, + 15879, + 15825, + 15791, + 15744, + 15897, + 15841, + 15831, + 15860, + 15792, + 15849, + 15852, + 15803, + 15844, + 15809, + 15950, + 15811, + 15866, + 15876, + 15870, + 15887, + 15835, + 15837, + 15899, + 15829, + 15717, + 15839, + 15880, + 15869, + 15844, + 15860, + 15768, + 15695, + 15768, + 15701, + 15749, + 15813, + 15641, + 15812, + 15765, + 15855, + 15824, + 15799, + 15854, + 15695, + 15818, + 15871, + 15846, + 15853, + 15805, + 15794, + 15796, + 15820, + 15693, + 15807, + 15875, + 15818, + 15827, + 15745, + 15808, + 15752, + 15861, + 15873, + 15732, + 15899, + 15795, + 15819, + 15829, + 15792, + 15764, + 15876, + 15831, + 15895, + 15791, + 15902, + 15853, + 15823, + 15855, + 15751, + 15880, + 15853, + 15818, + 15855, + 15662, + 15868, + 15845, + 15906, + 15864, + 15750, + 15885, + 15871, + 15816, + 15848, + 15864, + 15812, + 15745, + 15736, + 15900, + 15790, + 15836, + 15851, + 15813, + 15607, + 15875, + 15943, + 15803, + 15697, + 15873, + 15834, + 15800, + 15691, + 15780, + 15733, + 15782, + 15799, + 15810, + 15738, + 15746, + 15817, + 15935, + 15766, + 15840, + 15774, + 15832, + 15874, + 15781, + 15790, + 15825, + 15684, + 15869, + 15757, + 15849, + 15843, + 15798, + 15743, + 15705, + 15887, + 15808, + 15746, + 15810, + 15712, + 15850, + 15925, + 15760, + 15744, + 15920, + 15796, + 15701, + 15914, + 15773, + 15737, + 15661, + 15797, + 15769, + 15884, + 15686, + 15895, + 15783, + 15853, + 15726, + 15869, + 15917, + 15657, + 15812, + 15880, + 15893, + 15820, + 15808, + 15779, + 15847, + 15775, + 15814, + 15803, + 15824, + 15803, + 15802, + 15797, + 15786, + 15857, + 15842, + 15742, + 15685, + 15856, + 15828, + 15854, + 15831, + 15856, + 15937, + 15891, + 15847, + 15894, + 15751, + 15809, + 15718, + 15792, + 15781, + 15789, + 15833, + 15812, + 15865, + 15782, + 15886, + 15807, + 15855, + 15899, + 15921, + 15827, + 15748, + 15807, + 15797, + 15795, + 15867, + 15808, + 15729, + 15791, + 15749, + 15752, + 15777, + 15763, + 15798, + 15850, + 15803, + 15879, + 15692, + 15790, + 15850, + 15741, + 15836, + 15742, + 15893, + 15843, + 15850, + 15776, + 15747, + 15885, + 15787, + 15845, + 15694, + 15760, + 15878, + 15874, + 15742, + 15788, + 15779, + 15862, + 15862, + 15854, + 15787, + 15800, + 15867, + 15843, + 15710, + 15887, + 15879, + 16004, + 15836, + 15663, + 15770, + 15866, + 15857, + 15707, + 15977, + 15902, + 15773, + 15799, + 15888, + 15882, + 15848, + 15727, + 15786, + 15790, + 15806, + 15845, + 15851, + 15800, + 15848, + 15873, + 15805, + 15818, + 15917, + 15820, + 15868, + 15751, + 15838, + 15817, + 15776, + 15853, + 15828, + 15802, + 15842, + 15869, + 15842, + 15865, + 15755, + 15846, + 15935, + 15885, + 15878, + 15709, + 15878, + 15905, + 15805, + 15694, + 15688, + 15872, + 15807, + 15821, + 15852, + 15807, + 15843, + 15756, + 15884, + 15816, + 15769, + 15811, + 15782, + 15908, + 15782, + 15802, + 15804, + 15807, + 15923, + 15899, + 15880, + 15820, + 15723, + 15754, + 15850, + 15927, + 15862, + 15909, + 15810, + 15842, + 15866, + 15859, + 15809, + 15946, + 15772, + 15905, + 15842, + 15849, + 15798, + 15819, + 15895, + 15872, + 15808, + 15795, + 15890, + 15820, + 15857, + 15825, + 15870, + 15858, + 15799, + 15860, + 15799, + 15884, + 15854, + 15875, + 15880, + 15911, + 15876, + 15819, + 15890, + 15878, + 15774, + 15894, + 15892, + 15810, + 15747, + 15846, + 15706, + 15729, + 15818, + 15779, + 15839, + 15803, + 15835, + 15842, + 15846, + 15781, + 15889, + 15816, + 15766, + 15767, + 15783, + 15828, + 15802, + 15883, + 15856, + 15843, + 15777, + 15850, + 15846, + 15761, + 15828, + 16004, + 15860, + 15824, + 15812, + 15808, + 15886, + 15877, + 15798, + 15789, + 15910, + 15929, + 15785, + 15758, + 15856, + 15787, + 15841, + 15800, + 15726, + 15829, + 15740, + 15778, + 15821, + 15782, + 15673, + 15891, + 15817, + 15781, + 15781, + 15844, + 15870, + 15869, + 15776, + 15738, + 15825, + 15891, + 15766, + 15770, + 15674, + 15803, + 15868, + 15737, + 15801, + 15763, + 15754, + 15786, + 15823, + 15836, + 15807, + 15840, + 15800, + 15828, + 15778, + 15791, + 15747, + 15737, + 15887, + 15711, + 15941, + 15779, + 15817, + 15812, + 15822, + 15903, + 15806, + 15767, + 15839, + 15608, + 15734, + 15746, + 15865, + 15777, + 15850, + 15780, + 15838, + 15779, + 15746, + 15805, + 15843, + 15689, + 15837, + 15817, + 15817, + 15858, + 15793, + 15765, + 15637, + 15787, + 15753, + 15767, + 15864, + 15835, + 15769, + 15785, + 15742, + 15842, + 15833, + 15793, + 15805, + 15797, + 15784, + 15775, + 15796, + 15834, + 15835, + 15738, + 15845, + 15831, + 15833, + 15653, + 15676, + 15825, + 15939, + 15726, + 15769, + 15832, + 15802, + 15886, + 15878, + 15770, + 15822, + 15794, + 15870, + 15735, + 15749, + 15870, + 15831, + 15918, + 15830, + 15707, + 15799, + 15867, + 15845, + 15818, + 15820, + 15777, + 15728, + 15740, + 15859, + 15749, + 15827, + 15804, + 15767, + 15747, + 15795, + 15766, + 15750, + 15819, + 15813, + 15799, + 15857, + 15898, + 15784, + 15801, + 15812, + 15844, + 15892, + 15887, + 15822, + 15802, + 15768, + 15762, + 15869, + 15799, + 15862, + 15776, + 15911, + 15755, + 15866, + 15746, + 15775, + 15810, + 15726, + 15830, + 15786, + 15917, + 15864, + 15826, + 15929, + 15755, + 15808, + 15821, + 15900, + 15889, + 15667, + 15782, + 15841, + 15855, + 15663, + 15800, + 15860, + 15871, + 15876, + 15947, + 15917, + 15855, + 15920, + 15720, + 15872, + 15791, + 15843, + 15836, + 15807, + 15832, + 15749, + 15824, + 15615, + 15783, + 15808, + 15784, + 15855, + 15879, + 15931, + 15772, + 15920, + 15858, + 15872, + 15816, + 15756, + 15838, + 15829, + 15793, + 15815, + 15823, + 15957, + 15866, + 15886, + 15791, + 15818, + 15697, + 15929, + 15822, + 15741, + 15883, + 15876, + 15740, + 15778, + 15998, + 15871, + 15817, + 15846, + 15893, + 15815, + 15743, + 15869, + 15892, + 15817, + 15805, + 15870, + 15932, + 15972, + 15876, + 15721, + 15784, + 15794, + 15883, + 15911, + 15821, + 15810, + 15964, + 15890, + 15780, + 15878, + 15874, + 15820, + 15906, + 15847, + 15701, + 15794, + 15847, + 15946, + 15672, + 15866, + 15888, + 15875, + 15862, + 15850, + 15793, + 15760, + 15925, + 15806, + 15804, + 15895, + 15801, + 15877, + 15862, + 15891, + 15795, + 15964, + 15833, + 15869, + 15815, + 15810, + 15912, + 15827, + 15838, + 15918, + 15742, + 15865 + ], + "sample_count": 1269 + }, + { + "pubkey": "GtpYHFJ6PXrMjFFkei3Pa96hL8txGDAomGaiAoCxzKSg", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "target_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242245000000, + "samples": [ + 16184, + 16219, + 16127, + 16031, + 16022, + 16036, + 16161, + 16219, + 16120, + 16172, + 16122, + 16020, + 16371, + 16100, + 16084, + 16234, + 16039, + 16128, + 16092, + 16074, + 16083, + 16144, + 16411, + 16247, + 16157, + 16370, + 15961, + 16153, + 16200, + 16172, + 16296, + 16174, + 16112, + 16279, + 16133, + 16193, + 16139, + 16539, + 16144, + 16175, + 16163, + 16118, + 16345, + 16069, + 16124, + 16290, + 15982, + 16264, + 16111, + 16338, + 16124, + 16022, + 16356, + 16236, + 16144, + 16110, + 16149, + 16204, + 16088, + 16102, + 17539, + 16044, + 16104, + 16183, + 16028, + 16101, + 16052, + 16191, + 16113, + 16070, + 16025, + 16202, + 16080, + 16191, + 16160, + 16291, + 16191, + 16064, + 16186, + 16369, + 16399, + 16398, + 16524, + 16209, + 16070, + 16270, + 16106, + 16381, + 16104, + 16199, + 16188, + 16181, + 16334, + 16029, + 16099, + 16212, + 16093, + 16774, + 16157, + 15979, + 16150, + 16100, + 15976, + 16095, + 16211, + 16312, + 16022, + 16186, + 16062, + 16099, + 16198, + 16056, + 16367, + 16067, + 16120, + 16077, + 16139, + 16018, + 16153, + 16262, + 16199, + 18190, + 16055, + 16053, + 15988, + 16128, + 16089, + 16370, + 16071, + 16520, + 16399, + 16008, + 16291, + 16133, + 16103, + 16213, + 16044, + 16056, + 16096, + 16108, + 16125, + 16125, + 16480, + 16134, + 16006, + 16327, + 16284, + 16246, + 16160, + 16238, + 16299, + 16188, + 16114, + 16202, + 16109, + 16131, + 16261, + 16293, + 16070, + 16017, + 16122, + 16267, + 16277, + 16226, + 16277, + 16160, + 16024, + 16228, + 16047, + 16170, + 16151, + 16066, + 16373, + 16248, + 16404, + 16119, + 16044, + 16229, + 16538, + 16124, + 16260, + 16100, + 16337, + 16231, + 16157, + 16182, + 16246, + 16627, + 16125, + 16393, + 16164, + 16174, + 16117, + 16186, + 16545, + 16234, + 16196, + 16152, + 16048, + 16156, + 16178, + 16256, + 864453, + 16034, + 16182, + 16174, + 16027, + 16479, + 16089, + 16241, + 16239, + 16201, + 16221, + 16084, + 16305, + 16132, + 16050, + 16328, + 16361, + 16129, + 16108, + 16243, + 16177, + 16157, + 16262, + 16431, + 16165, + 16089, + 16183, + 15980, + 16133, + 16022, + 16450, + 16229, + 16244, + 16317, + 16116, + 16144, + 16189, + 16253, + 16212, + 16118, + 16409, + 16082, + 16131, + 16313, + 16255, + 16359, + 16133, + 16185, + 16040, + 15979, + 16120, + 16113, + 16129, + 16102, + 16038, + 16116, + 16152, + 16036, + 16378, + 16152, + 17097, + 16279, + 16132, + 16085, + 16203, + 15991, + 16179, + 16333, + 16282, + 16128, + 16092, + 16384, + 16387, + 16153, + 16604, + 16550, + 16301, + 16067, + 16134, + 16216, + 16483, + 16020, + 16203, + 16500, + 16199, + 16337, + 16278, + 16058, + 16610, + 16065, + 16272, + 16272, + 16170, + 16167, + 16152, + 16180, + 16204, + 16427, + 16370, + 16052, + 16164, + 16041, + 16453, + 16148, + 16206, + 16460, + 16176, + 16170, + 16161, + 16012, + 16334, + 16036, + 16113, + 16201, + 16368, + 16055, + 16224, + 27810, + 16166, + 17064, + 16985, + 16083, + 16032, + 16141, + 16116, + 16119, + 16203, + 16328, + 16189, + 16046, + 16134, + 16158, + 16048, + 16260, + 16243, + 16428, + 16602, + 16064, + 16078, + 16086, + 16146, + 16272, + 16326, + 16199, + 16207, + 16300, + 16011, + 16079, + 16107, + 16067, + 16305, + 16241, + 16382, + 16110, + 16286, + 16113, + 16131, + 16199, + 16283, + 16174, + 15999, + 16166, + 16254, + 16216, + 16208, + 16260, + 16123, + 16056, + 16353, + 16224, + 16265, + 16273, + 16214, + 16109, + 16127, + 16093, + 16282, + 16148, + 16381, + 16142, + 16632, + 16182, + 16150, + 16134, + 16192, + 16113, + 16193, + 16136, + 16131, + 16075, + 15987, + 16110, + 16108, + 16119, + 16108, + 16354, + 16076, + 16026, + 16097, + 16194, + 16259, + 16177, + 16166, + 16333, + 16024, + 16098, + 16084, + 16158, + 16086, + 16367, + 16275, + 16052, + 16104, + 16136, + 16050, + 16243, + 16141, + 16127, + 16515, + 16088, + 15997, + 16059, + 16080, + 16172, + 16027, + 16512, + 16307, + 16123, + 16018, + 16485, + 16036, + 16126, + 16779, + 16207, + 16112, + 16152, + 16677, + 16092, + 16150, + 16059, + 16306, + 16223, + 16023, + 16136, + 16044, + 16261, + 16233, + 16385, + 16326, + 16096, + 15980, + 16271, + 16185, + 16107, + 16179, + 16532, + 16252, + 16233, + 16273, + 16077, + 16045, + 16051, + 16110, + 16271, + 16059, + 16097, + 16048, + 16011, + 16239, + 16107, + 16135, + 16156, + 16072, + 16122, + 15986, + 16291, + 16200, + 920029, + 16333, + 16167, + 16149, + 16086, + 16142, + 16326, + 16093, + 17201, + 16216, + 16267, + 16109, + 15956, + 16165, + 16190, + 16232, + 16382, + 16094, + 16154, + 16265, + 16089, + 16246, + 16184, + 16457, + 16197, + 16041, + 16072, + 16053, + 16080, + 16215, + 16159, + 16165, + 16297, + 16385, + 16116, + 16089, + 16070, + 16048, + 16470, + 16241, + 16178, + 16335, + 16199, + 16166, + 16263, + 16268, + 16005, + 16063, + 16157, + 16055, + 16153, + 16297, + 16042, + 16308, + 16180, + 16130, + 16183, + 16054, + 16059, + 16163, + 16287, + 16310, + 16098, + 16231, + 16217, + 16064, + 16237, + 16054, + 16433, + 16151, + 16144, + 16240, + 16537, + 16143, + 16187, + 16111, + 16350, + 16143, + 16143, + 16150, + 16015, + 16120, + 16141, + 16721, + 16514, + 16127, + 16213, + 16004, + 15986, + 15986, + 16167, + 16316, + 16050, + 16125, + 16132, + 16253, + 16129, + 16063, + 16501, + 16098, + 16318, + 16038, + 16167, + 16168, + 16103, + 16182, + 16329, + 16073, + 16101, + 16190, + 16183, + 16474, + 16175, + 16472, + 16224, + 16218, + 16347, + 16041, + 16170, + 16140, + 16208, + 16208, + 16115, + 16345, + 137483, + 16175, + 16152, + 16166, + 16334, + 16233, + 16020, + 16300, + 16378, + 16190, + 16081, + 16273, + 16212, + 16103, + 16156, + 16175, + 16084, + 16345, + 16180, + 16249, + 16192, + 16236, + 16018, + 16140, + 16314, + 16132, + 16284, + 16193, + 16072, + 16154, + 16259, + 16086, + 16083, + 16129, + 16498, + 16329, + 16089, + 16190, + 16197, + 16192, + 16561, + 16338, + 16302, + 16102, + 16185, + 16232, + 16028, + 16175, + 16039, + 16537, + 16145, + 16096, + 16131, + 16046, + 16120, + 16272, + 16437, + 16314, + 16154, + 16018, + 16313, + 16077, + 16251, + 16189, + 16330, + 16140, + 16294, + 16153, + 16323, + 16756, + 16090, + 16270, + 16456, + 16119, + 16023, + 16419, + 16115, + 16224, + 16102, + 16346, + 16136, + 16087, + 16120, + 16260, + 16137, + 16149, + 16199, + 16114, + 16455, + 16103, + 16123, + 16114, + 16072, + 16161, + 16209, + 16247, + 16199, + 16077, + 16058, + 16245, + 16215, + 16268, + 16309, + 16084, + 16289, + 16124, + 16191, + 16128, + 16039, + 16415, + 16131, + 16078, + 16004, + 16103, + 16050, + 16063, + 16088, + 16169, + 16298, + 16099, + 16243, + 16349, + 16446, + 16348, + 16775, + 16559, + 16107, + 16156, + 16110, + 16135, + 16162, + 16234, + 16139, + 16206, + 16125, + 16319, + 15985, + 16078, + 16113, + 16313, + 16086, + 16532, + 16167, + 16001, + 16270, + 16078, + 16133, + 16224, + 16196, + 16181, + 16151, + 16139, + 16118, + 16162, + 16409, + 16131, + 16036, + 16384, + 16127, + 16008, + 16128, + 16153, + 16320, + 16066, + 16155, + 16118, + 16500, + 16409, + 16204, + 16469, + 16375, + 16018, + 16127, + 16283, + 16188, + 16162, + 16273, + 16252, + 16126, + 16066, + 16209, + 16012, + 16252, + 16204, + 16295, + 16091, + 16062, + 16139, + 16130, + 16472, + 16110, + 16180, + 16273, + 16174, + 16042, + 16539, + 16140, + 16094, + 16134, + 16175, + 16076, + 16213, + 16167, + 16207, + 16261, + 16559, + 16234, + 16104, + 16010, + 16069, + 16095, + 15984, + 16161, + 16158, + 16393, + 16175, + 16091, + 16158, + 16195, + 16098, + 16072, + 16282, + 16275, + 16159, + 16096, + 16109, + 15997, + 16228, + 16090, + 16358, + 16175, + 16098, + 16085, + 16000, + 16173, + 16164, + 16207, + 16587, + 16169, + 16381, + 16150, + 16318, + 16200, + 16149, + 16693, + 16160, + 16088, + 16209, + 16094, + 16134, + 16310, + 16416, + 16373, + 16080, + 16020, + 16000, + 16118, + 16296, + 16265, + 16671, + 16136, + 16106, + 16106, + 16136, + 16148, + 16274, + 16125, + 16241, + 16248, + 16099, + 16145, + 16120, + 16137, + 16221, + 16412, + 16086, + 16274, + 16015, + 16305, + 16105, + 16163, + 16332, + 16351, + 16093, + 16323, + 16153, + 16038, + 16243, + 16096, + 16451, + 16133, + 17371, + 16223, + 16154, + 16090, + 16042, + 16106, + 16088, + 16116, + 16047, + 16236, + 16106, + 16634, + 16208, + 16036, + 16071, + 16206, + 16055, + 16046, + 16180, + 16054, + 16048, + 16279, + 16016, + 16320, + 16126, + 16335, + 16313, + 16060, + 16125, + 16125, + 16134, + 16202, + 16215, + 16236, + 16221, + 16149, + 16108, + 16214, + 16076, + 16499, + 16003, + 16413, + 16130, + 16082, + 16082, + 16109, + 16189, + 16275, + 16210, + 16304, + 16290, + 16039, + 16014, + 16055, + 16396, + 16344, + 16344, + 16155, + 16070, + 16042, + 16142, + 16205, + 16037, + 16104, + 16296, + 16059, + 16255, + 16062, + 16145, + 16123, + 16103, + 16496, + 16132, + 16096, + 16096, + 16154, + 16151, + 16197, + 16271, + 16295, + 16056, + 16102, + 16159, + 16132, + 16326, + 16036, + 16241, + 16324, + 16135, + 16150, + 16105, + 16105, + 16151, + 16212, + 16208, + 16289, + 16293, + 16075, + 16148, + 16181, + 16052, + 16200, + 16280, + 16437, + 16267, + 16137, + 16124, + 16429, + 16251, + 16275, + 16109, + 16171, + 16283, + 16198, + 16344, + 15991, + 16419, + 16173, + 16308, + 16141, + 16090, + 16273, + 16085, + 16288, + 16207, + 16084, + 16182, + 16146, + 16044, + 16186, + 16119, + 16415, + 16149, + 16092, + 15999, + 16066, + 16199, + 16087, + 16085, + 16337, + 16074, + 16196, + 16231, + 16019, + 16360, + 16190, + 16952, + 16195, + 16179, + 16415, + 16038, + 16691, + 16331, + 16395, + 17833, + 16188, + 16038, + 16152, + 16119, + 16227, + 16098, + 16147, + 16088, + 16141, + 16134, + 16078, + 16615, + 16260, + 16260, + 16052, + 16054, + 16179, + 16110, + 16047, + 16217, + 16130, + 16440, + 16249, + 16093, + 16043, + 15968, + 15968, + 16140, + 16190, + 16230, + 16104, + 16278, + 16287, + 16359, + 16129, + 16090, + 16625, + 16347, + 16093, + 16111, + 16032, + 16227, + 16205, + 16157, + 16325, + 16338, + 16035, + 16339, + 16046, + 16122, + 16193, + 16922, + 16028, + 16161, + 16162, + 16152, + 16115, + 16028, + 16221, + 16599, + 16283, + 16054, + 16177, + 16106, + 16106, + 16076, + 16241, + 16105, + 16098, + 16125, + 16168, + 16092, + 16087, + 16110, + 16328, + 16046, + 16413, + 16494, + 16063, + 16262, + 16047, + 16205, + 16190, + 16207, + 16123, + 16168, + 16081, + 16149, + 16222, + 16218, + 16051, + 16013, + 16409, + 16163, + 16575, + 16233, + 16529, + 16068, + 16249, + 16132, + 16096, + 16186, + 16188, + 16341, + 16287, + 16033, + 16283, + 16283, + 16200, + 16201, + 16099, + 16321, + 16173, + 16042, + 16053, + 16086, + 16238, + 16282, + 16282, + 16106, + 16165, + 16205, + 16243, + 16152, + 16407, + 16003, + 16003, + 16379, + 16043, + 16208, + 16147, + 16160, + 16047, + 16238, + 16100, + 16172, + 16172, + 16136, + 16080, + 16078, + 16053, + 16630, + 16217, + 16119, + 16033, + 16079, + 16254, + 16020, + 16311, + 16304, + 16142, + 16296, + 16296, + 16038, + 16164, + 16148, + 16238, + 16196, + 16273, + 16029, + 16032, + 16169, + 16053, + 16156, + 16230, + 15971, + 16221, + 16175, + 16175, + 16180, + 16028, + 16117, + 16255, + 16280, + 16198, + 16088, + 16053, + 16053, + 16354, + 16390, + 16057, + 16201, + 16108, + 16177, + 16230, + 16137, + 16311, + 16209, + 16119, + 16412, + 16126, + 16295, + 16142, + 16173, + 16185, + 16013, + 16125, + 16107, + 16124, + 16046, + 16159, + 16322, + 16083, + 16252, + 16078, + 16078, + 16056, + 16082, + 16146, + 16164, + 16307, + 16129, + 16110, + 16070, + 716962, + 16102, + 16391, + 16046, + 16156, + 16074, + 16042, + 16529 + ], + "sample_count": 1271 + }, + { + "pubkey": "22eWGkmVsirf6ad2EaEKRV1WpJKuZaruEZnaQaA6pXH1", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242302000000, + "samples": [ + 103359, + 103079, + 103123, + 103123, + 103099, + 103099, + 103505, + 103360, + 103183, + 103190, + 103296, + 103296, + 103075, + 103218, + 103230, + 103230, + 103188, + 103187, + 103257, + 103337, + 103257, + 103175, + 103218, + 103218, + 103279, + 103065, + 103065, + 103263, + 103179, + 103210, + 103383, + 103277, + 103152, + 103189, + 103124, + 103257, + 103369, + 103239, + 103283, + 103027, + 103119, + 103205, + 103258, + 103073, + 103275, + 103184, + 103209, + 103131, + 103258, + 103147, + 103101, + 103303, + 103289, + 103145, + 103295, + 103291, + 103367, + 103319, + 103366, + 103366, + 103227, + 103236, + 103207, + 103128, + 103140, + 103104, + 103352, + 103401, + 103401, + 103304, + 103035, + 103305, + 103305, + 103157, + 103513, + 103190, + 103190, + 103184, + 103186, + 103260, + 103250, + 103182, + 103433, + 103362, + 103391, + 103060, + 103418, + 103109, + 103109, + 103409, + 103112, + 103073, + 103230, + 103293, + 103292, + 103033, + 103197, + 103396, + 103082, + 103212, + 103136, + 103173, + 103287, + 103128, + 103256, + 103235, + 103172, + 103269, + 103251, + 103129, + 103145, + 103312, + 103312, + 103165, + 103298, + 103098, + 103219, + 103321, + 103147, + 103282, + 103231, + 103224, + 103262, + 103297, + 103102, + 103072, + 103118, + 103168, + 103126, + 103196, + 103184, + 103242, + 103125, + 103327, + 103327, + 103167, + 103098, + 103017, + 103162, + 103212, + 103190, + 103185, + 103331, + 103214, + 103186, + 103326, + 103326, + 103196, + 103131, + 103186, + 103264, + 103007, + 103163, + 103264, + 103159, + 103188, + 103158, + 103367, + 103367, + 103104, + 103158, + 103135, + 103210, + 103061, + 103387, + 103142, + 103142, + 103200, + 103232, + 103051, + 103051, + 103288, + 103449, + 103066, + 103387, + 103291, + 103291, + 103211, + 103269, + 103269, + 103265, + 103059, + 103071, + 103163, + 103170, + 103088, + 103449, + 103201, + 103010, + 103215, + 103150, + 103218, + 103305, + 103107, + 103275, + 103111, + 103243, + 103226, + 103144, + 103275, + 103275, + 103245, + 103245, + 103329, + 103132, + 103132, + 103266, + 103163, + 103004, + 103336, + 103070, + 103146, + 103191, + 103056, + 103114, + 103112, + 103260, + 103260, + 103163, + 103172, + 103224, + 103290, + 103218, + 103059, + 103293, + 103106, + 103212, + 103156, + 103181, + 103232, + 103395, + 103286, + 103286, + 103090, + 103205, + 103117, + 103352, + 103329, + 103171, + 103276, + 103356, + 103247, + 103247, + 103162, + 103284, + 103276, + 103225, + 103239, + 103351, + 103324, + 103212, + 103184, + 103165, + 103232, + 103232, + 103285, + 103274, + 103199, + 103333, + 103185, + 103035, + 103272, + 103335, + 103290, + 103031, + 103010, + 103359, + 103488, + 103116, + 103515, + 103114, + 103368, + 103116, + 103279, + 103203, + 103097, + 103238, + 103302, + 103339, + 103054, + 103169, + 103218, + 103328, + 103172, + 103172, + 103096, + 103049, + 103099, + 103128, + 103237, + 103237, + 103273, + 103182, + 103073, + 103073, + 103033, + 103273, + 103277, + 103277, + 103284, + 103316, + 103156, + 103224, + 103466, + 103413, + 103107, + 103397, + 103464, + 103118, + 103142, + 103016, + 103014, + 103237, + 103037, + 103037, + 103279, + 103155, + 103065, + 103065, + 103340, + 103418, + 103418, + 103196, + 103166, + 103266, + 103064, + 103213, + 103226, + 103174, + 103483, + 103094, + 103153, + 103153, + 103256, + 103256, + 103236, + 103151, + 103331, + 103341, + 103159, + 103209, + 103096, + 103290, + 103316, + 103316, + 103209, + 103336, + 103336, + 103230, + 103200, + 103346, + 103075, + 103289, + 103289, + 103118, + 103048, + 103226, + 103151, + 103147, + 103318, + 103433, + 103150, + 103003, + 103015, + 103156, + 103185, + 103283, + 103599, + 103290, + 103306, + 103192, + 103126, + 103126, + 103175, + 103749, + 103479, + 103148, + 103240, + 103210, + 103008, + 103008, + 103378, + 103312, + 103290, + 103140, + 103265, + 103374, + 103443, + 103266, + 103304, + 103492, + 103278, + 103045, + 103238, + 103121, + 103114, + 103175, + 103207, + 103133, + 103145, + 103487, + 103122, + 103286, + 103286, + 103322, + 103115, + 103293, + 103203, + 103334, + 103228, + 103180, + 103218, + 103472, + 103172, + 103178, + 103267, + 103351, + 103351, + 103080, + 103306, + 103140, + 103193, + 103160, + 103191, + 103191, + 103098, + 103276, + 103399, + 103399, + 103113, + 103190, + 103140, + 103265, + 103067, + 103244, + 103320, + 103320, + 103340, + 103184, + 103200, + 103232, + 103232, + 103334, + 103198, + 103289, + 103389, + 103193, + 103409, + 103152, + 103391, + 103391, + 103234, + 103229, + 103155, + 103393, + 103061, + 103061, + 103280, + 103350, + 103360, + 103309, + 103330, + 103296, + 103189, + 103365, + 103454, + 103193, + 103213, + 103325, + 102983, + 102983, + 103161, + 103398, + 105421, + 103280, + 103280, + 103148, + 103188, + 103272, + 103729, + 103345, + 103364, + 103364, + 103357, + 103357, + 103275, + 103113, + 103200, + 103527, + 103212, + 103140, + 103015, + 103107, + 103157, + 103157, + 103199, + 103203, + 103219, + 103221, + 103268, + 103313, + 103197, + 103369, + 103307, + 103075, + 103187, + 103328, + 103381, + 102958, + 103272, + 103322, + 103364, + 103280, + 103210, + 103319, + 103285, + 103233, + 103233, + 103256, + 103213, + 103157, + 103105, + 103105, + 103122, + 103387, + 103246, + 103289, + 103300, + 103157, + 103306, + 103333, + 103101, + 103387, + 103387, + 103145, + 103367, + 103238, + 103343, + 103262, + 103538, + 103417, + 103212, + 103341, + 103228, + 103023, + 103101, + 103302, + 103418, + 103190, + 103271, + 103099, + 103232, + 103104, + 103064, + 103274, + 103131, + 103283, + 103168, + 103326, + 103285, + 103305, + 103212, + 103281, + 103409, + 103262, + 103262, + 103184, + 103333, + 103333, + 103255, + 103040, + 103165, + 103275, + 103239, + 103228, + 102976, + 103415, + 103295, + 103284, + 103331, + 103210, + 103254, + 103122, + 103240, + 103474, + 103118, + 103118, + 103088, + 103359, + 103134, + 103134, + 103111, + 103440, + 103179, + 103179, + 103294, + 103242, + 103322, + 103308, + 103470, + 103198, + 103058, + 103129, + 103125, + 103176, + 103086, + 103372, + 103129, + 103348, + 103316, + 103236, + 103160, + 103026, + 103205, + 103205, + 103497, + 103245, + 103178, + 103366, + 103169, + 103187, + 103055, + 103437, + 103268, + 103451, + 103346, + 103339, + 103291, + 103226, + 103488, + 103323, + 103145, + 103243, + 103163, + 103290, + 103100, + 103100, + 103418, + 103393, + 103164, + 103248, + 103211, + 103356, + 103056, + 103511, + 103511, + 103109, + 103007, + 103094, + 103094, + 103235, + 103209, + 103223, + 103153, + 103151, + 103151, + 103178, + 103192, + 103345, + 103462, + 103229, + 103392, + 103235, + 103302, + 103371, + 103263, + 103320, + 103372, + 103377, + 103293, + 103188, + 103156, + 103360, + 103145, + 103310, + 103269, + 103279, + 103144, + 103144, + 103080, + 103428, + 103284, + 103185, + 103163, + 103210, + 103178, + 103222, + 103473, + 103473, + 103588, + 103449, + 103424, + 103225, + 103129, + 103381, + 103381, + 103202, + 103339, + 103248, + 103162, + 103265, + 103071, + 103423, + 103019, + 103344, + 103206, + 103206, + 103318, + 103407, + 103042, + 103131, + 103257, + 103455, + 103298, + 103322, + 103033, + 103058, + 103253, + 103352, + 103683, + 103224, + 103012, + 103138, + 103312, + 103217, + 103216, + 103178, + 103252, + 103220, + 103198, + 103143, + 103171, + 103171, + 103347, + 103501, + 103243, + 103290, + 103290, + 103268, + 103098, + 103049, + 103290, + 103285, + 103289, + 103189, + 103189, + 103123, + 103193, + 103462, + 103286, + 103081, + 103326, + 103235, + 103232, + 103247, + 103229, + 102953, + 103333, + 103230, + 103145, + 103196, + 103279, + 103328, + 103096, + 103261, + 103151, + 103314, + 103182, + 103171, + 103274, + 103355, + 103355, + 103284, + 102995, + 103297, + 103192, + 103364, + 103311, + 103133, + 103126, + 103126, + 103310, + 103322, + 103115, + 103154, + 103304, + 103334, + 103228, + 103274, + 103274, + 103249, + 103264, + 103237, + 103237, + 103579, + 103290, + 103259, + 103278, + 103366, + 103366, + 103275, + 103186, + 103341, + 103197, + 103197, + 103227, + 103258, + 103374, + 103142, + 103436, + 103270, + 103041, + 103337, + 103215, + 103105, + 103255, + 103295, + 103110, + 103182, + 103403, + 103403, + 103304, + 103304, + 103341, + 103263, + 103223, + 103346, + 103346, + 103145, + 103409, + 103109, + 103259, + 103200, + 103194, + 103176, + 102994, + 103102, + 103178, + 103130, + 103409, + 103131, + 103103, + 103259, + 103180, + 103815, + 103148, + 103124, + 103379, + 103187, + 103258, + 103086, + 103238, + 103238, + 102998, + 103485, + 103190, + 103184, + 103062, + 103219, + 103064, + 103064, + 103192, + 103423, + 103208, + 103065, + 103146, + 103247, + 103193, + 103109, + 103109, + 103340, + 103223, + 103045, + 103203, + 103174, + 102976, + 103345, + 103253, + 103187, + 103079, + 103119, + 103195, + 103195, + 103139, + 103327, + 103101, + 103174, + 103206, + 103180, + 103085, + 103085, + 103129, + 103139, + 103127, + 103126, + 103342, + 103083, + 103164, + 103158, + 103265, + 103203, + 103058, + 103347, + 103189, + 102955, + 103310, + 103223, + 103190, + 103268, + 103240, + 103198, + 103175, + 103112, + 103306, + 103064, + 103234, + 103246, + 103175, + 103214, + 103372, + 103119, + 103413, + 103110, + 103142, + 103101, + 103249, + 103195, + 103073, + 103360, + 103063, + 103212, + 103200, + 103067, + 103171, + 103219, + 103079, + 103202, + 103164, + 103314, + 103368, + 103105, + 103208, + 103043, + 103276, + 103171, + 103057, + 103134, + 103077, + 103259, + 103077, + 103259, + 103310, + 103066, + 103103, + 103079, + 103186, + 103156, + 102981, + 103226, + 103337, + 103161, + 103031, + 103148, + 103140, + 103121, + 103076, + 103244, + 103175, + 103225, + 103198, + 103172, + 103245, + 102983, + 103251, + 103151, + 103253, + 103117, + 103266, + 103202, + 103161, + 103313, + 103312, + 103240, + 103144, + 103135, + 103108, + 103227, + 103168, + 103373, + 103263, + 103019, + 103301, + 102996, + 103244, + 103217, + 103329, + 103355, + 103387, + 103109, + 103200, + 103100, + 103304, + 103127, + 103312, + 103312, + 103248, + 103279, + 103074, + 103187, + 103298, + 103323, + 103222, + 103200, + 103076, + 103158, + 103057, + 103162, + 103123, + 103365, + 103222, + 103221, + 103180, + 103232, + 103208, + 103180, + 103139, + 103143, + 103257, + 103223, + 103286, + 103148, + 103294, + 103040, + 103182, + 103238, + 103213, + 103148, + 103163, + 103252, + 103025, + 103136, + 103402, + 103134, + 103286, + 103315, + 103085, + 103153, + 103121, + 103328, + 103122, + 103256, + 103282, + 103259, + 103204, + 103076, + 103159, + 103291, + 103370, + 103096, + 103086, + 103134, + 103303, + 103401, + 103407, + 103130, + 103284, + 103330, + 103087, + 103026, + 103126, + 103093, + 103276, + 103150, + 103213, + 103021, + 103194, + 103160, + 103053, + 103531, + 103206, + 103229, + 103255, + 103065, + 103192, + 103018, + 103253, + 103292, + 103132, + 103324, + 103219, + 103152, + 103251, + 103057, + 103492, + 103155, + 102979, + 103114, + 103346, + 103028, + 103281, + 103356, + 103356, + 103136, + 103132, + 103111, + 103181, + 103174, + 103202, + 103303, + 103167, + 103190, + 103263, + 103252, + 103172, + 103199, + 103206, + 103194, + 103244, + 103289, + 103138, + 103146, + 103230, + 103166, + 103203, + 103103, + 103312, + 103193, + 103159, + 103283, + 103090, + 103226, + 103277, + 103245, + 103114, + 103230, + 103212, + 103432, + 103246, + 103302, + 103184, + 103027, + 103091, + 103196, + 103092, + 103181, + 103393, + 103196, + 103109, + 103105, + 103232, + 103043, + 103335, + 103218, + 103466, + 103282, + 103267, + 103219, + 103108, + 103459, + 103305, + 103256, + 103430, + 103107, + 103141, + 103302, + 103332, + 103145, + 103206, + 103391, + 103154, + 103032, + 103338, + 103061, + 103054, + 103161, + 103355, + 103439, + 103226, + 103205, + 103021, + 103130, + 103434, + 103194, + 103551, + 103273, + 103252, + 103194, + 103152, + 103166, + 103400, + 103236, + 103392, + 103265, + 103138, + 103199, + 103327, + 103103, + 103212, + 103349, + 103122, + 103233, + 103211, + 103225, + 103165, + 103080, + 103110, + 103314, + 103312, + 103150, + 103324, + 103225, + 103033, + 103165, + 103841, + 103199, + 103094, + 103310, + 103174, + 103237, + 103165, + 103288, + 103256, + 103238, + 103405, + 103158, + 103075, + 103142, + 103116, + 103333, + 103134, + 103184, + 103067, + 103071, + 103195, + 103125, + 103242, + 103282, + 103324, + 103067, + 103159, + 103248, + 103365, + 103042, + 103406, + 103420, + 103130, + 103244, + 103166, + 103446, + 103191, + 103114, + 103412, + 103089, + 103201, + 103093, + 103094, + 103110, + 103205, + 103406, + 103300, + 103011, + 103080, + 103204, + 103231, + 103484, + 103182, + 103239, + 103199, + 103036, + 103250, + 103069 + ], + "sample_count": 1271 + }, + { + "pubkey": "FKsWDPKruxw8jxMNfP4ghPMyGzZ5axvn5ohSY6mqVTHF", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242248000000, + "samples": [ + 7250, + 7056, + 7068, + 7073, + 7029, + 7199, + 7121, + 7079, + 6916, + 7036, + 7222, + 6956, + 7166, + 6972, + 7071, + 7327, + 7083, + 7088, + 7119, + 7060, + 7242, + 7090, + 7164, + 7062, + 7144, + 6850, + 7212, + 7204, + 7022, + 7223, + 7099, + 7474, + 7079, + 7214, + 7195, + 7283, + 7215, + 7081, + 7312, + 6992, + 7241, + 7078, + 7071, + 7179, + 7392, + 7315, + 7039, + 6912, + 6941, + 7005, + 7258, + 7024, + 7239, + 7174, + 7041, + 7129, + 7199, + 7007, + 7230, + 7201, + 7198, + 7165, + 7533, + 7058, + 7051, + 8178, + 6963, + 7174, + 7207, + 7037, + 7019, + 7061, + 6977, + 7171, + 7022, + 7176, + 7252, + 7039, + 7185, + 7221, + 7119, + 7219, + 7186, + 7340, + 7089, + 7155, + 7127, + 7166, + 7017, + 7072, + 7444, + 7178, + 9731, + 7006, + 7295, + 7020, + 7218, + 7225, + 8610, + 7155, + 7243, + 7375, + 6848, + 7086, + 6985, + 7119, + 7101, + 7006, + 7411, + 7103, + 7076, + 7079, + 7028, + 6982, + 7313, + 7119, + 7020, + 7027, + 7210, + 7080, + 7256, + 7061, + 7181, + 7139, + 7069, + 7116, + 7063, + 7361, + 7275, + 7026, + 7033, + 7285, + 7370, + 6906, + 7112, + 7100, + 7190, + 6990, + 7333, + 7120, + 7052, + 7120, + 7143, + 7126, + 7099, + 7077, + 7148, + 7217, + 7122, + 7420, + 7159, + 6934, + 7128, + 6942, + 7067, + 7226, + 7080, + 7397, + 7191, + 7095, + 7162, + 7080, + 7195, + 7129, + 6988, + 6914, + 7106, + 7436, + 7134, + 7084, + 7130, + 7212, + 7166, + 7033, + 7233, + 6968, + 7114, + 7248, + 7139, + 7645, + 7283, + 7075, + 7070, + 7235, + 7217, + 7115, + 6908, + 7113, + 7213, + 7043, + 7013, + 7008, + 7188, + 8516, + 7102, + 7213, + 7141, + 6984, + 7167, + 7075, + 7171, + 6973, + 7130, + 7130, + 7066, + 6963, + 7083, + 7100, + 7183, + 7131, + 7041, + 7067, + 7178, + 7107, + 6908, + 6896, + 7002, + 6914, + 7202, + 7011, + 7236, + 7074, + 6897, + 6968, + 7244, + 7138, + 7082, + 7096, + 7140, + 7098, + 7127, + 6995, + 7175, + 6998, + 6956, + 6991, + 6924, + 7171, + 7170, + 7076, + 7076, + 7072, + 7257, + 7078, + 7133, + 7128, + 7248, + 7295, + 7005, + 6889, + 6932, + 6956, + 7164, + 7219, + 7142, + 7054, + 7170, + 7285, + 7216, + 7214, + 7162, + 7098, + 7066, + 6897, + 7317, + 7068, + 7076, + 7371, + 7073, + 7252, + 7138, + 7075, + 6983, + 6986, + 6993, + 6972, + 7086, + 7157, + 7163, + 7207, + 7176, + 7121, + 7035, + 6869, + 7140, + 7108, + 7175, + 7152, + 7095, + 7320, + 7074, + 6907, + 7087, + 7272, + 6980, + 7184, + 7108, + 6956, + 7133, + 7214, + 7282, + 7100, + 7183, + 7059, + 7065, + 7041, + 7164, + 7150, + 7527, + 7143, + 7097, + 7058, + 7048, + 7017, + 7248, + 7260, + 7161, + 7045, + 7063, + 7277, + 7138, + 6877, + 6935, + 6933, + 7084, + 7161, + 7237, + 7139, + 7190, + 7279, + 6920, + 7007, + 7275, + 7243, + 7117, + 7346, + 7161, + 7321, + 7109, + 7059, + 7192, + 7127, + 6976, + 7047, + 7103, + 7166, + 7256, + 7076, + 7168, + 6953, + 7298, + 7182, + 7164, + 6989, + 7107, + 6916, + 7195, + 7087, + 7130, + 7250, + 7145, + 7206, + 7203, + 7113, + 7182, + 7143, + 7197, + 7261, + 7258, + 7232, + 7279, + 7061, + 7123, + 7338, + 7100, + 7170, + 7090, + 7192, + 7130, + 7002, + 6996, + 7091, + 7121, + 7173, + 7104, + 7138, + 7184, + 7058, + 7229, + 7099, + 7313, + 7107, + 7135, + 7064, + 7339, + 6994, + 7231, + 7059, + 7147, + 6974, + 7046, + 7068, + 7117, + 7237, + 7211, + 7144, + 7246, + 7180, + 6989, + 7073, + 7255, + 7073, + 7454, + 7289, + 7257, + 7332, + 7235, + 7236, + 7232, + 7178, + 7198, + 7062, + 7256, + 7035, + 7049, + 7204, + 7302, + 7355, + 7205, + 7249, + 7136, + 7221, + 6977, + 7117, + 7082, + 7197, + 6894, + 6984, + 6978, + 6963, + 7317, + 7265, + 7317, + 7141, + 7292, + 7197, + 7243, + 7134, + 7249, + 7275, + 7358, + 7125, + 7304, + 7156, + 7127, + 7121, + 7285, + 7191, + 7184, + 7139, + 7016, + 7292, + 7172, + 7024, + 7194, + 7006, + 7074, + 7295, + 7046, + 7024, + 7198, + 6988, + 7181, + 7045, + 7221, + 6900, + 7256, + 7019, + 6981, + 7314, + 7000, + 7059, + 7169, + 7082, + 7358, + 7233, + 7186, + 6993, + 7200, + 6904, + 7139, + 6981, + 7233, + 7032, + 7320, + 7062, + 7102, + 7063, + 6887, + 6995, + 7009, + 6991, + 7076, + 6946, + 7125, + 7036, + 7086, + 7027, + 7242, + 6930, + 7334, + 7123, + 7219, + 7115, + 7153, + 7046, + 7142, + 7247, + 7147, + 7144, + 7120, + 7170, + 7224, + 7049, + 7302, + 7236, + 7113, + 7048, + 7149, + 7103, + 7232, + 7057, + 7187, + 7152, + 7071, + 7208, + 6987, + 7073, + 6981, + 7166, + 7016, + 6928, + 7085, + 7031, + 7192, + 7041, + 7170, + 7238, + 7176, + 6947, + 7062, + 7050, + 7057, + 7106, + 7158, + 7147, + 7074, + 6904, + 7091, + 7054, + 7133, + 6975, + 7364, + 6865, + 7039, + 7146, + 7370, + 7222, + 6952, + 7306, + 7052, + 7020, + 7038, + 7218, + 8170, + 7219, + 7753, + 7007, + 7339, + 7155, + 7631, + 7055, + 8167, + 7099, + 8762, + 7254, + 6940, + 7499, + 7176, + 7996, + 7146, + 7172, + 7275, + 7135, + 7212, + 7252, + 7061, + 7356, + 7270, + 7247, + 7324, + 6978, + 7168, + 7258, + 6976, + 7052, + 7183, + 7176, + 7066, + 7218, + 7331, + 7121, + 7260, + 7095, + 7970, + 7136, + 7324, + 7221, + 7260, + 7194, + 7363, + 7069, + 7083, + 7016, + 7248, + 7089, + 7344, + 7143, + 7125, + 7103, + 7217, + 7010, + 6998, + 6899, + 7038, + 7347, + 7176, + 7212, + 6939, + 7074, + 7062, + 6968, + 7104, + 8391, + 7053, + 7226, + 7053, + 7068, + 7043, + 7097, + 7107, + 7107, + 7375, + 7006, + 7066, + 6935, + 7047, + 7126, + 6868, + 6970, + 7261, + 6992, + 6990, + 6955, + 6934, + 7020, + 6886, + 6910, + 7195, + 6960, + 6938, + 6978, + 7040, + 7101, + 7057, + 7052, + 7051, + 7070, + 7005, + 7077, + 8652, + 6912, + 7050, + 7040, + 7051, + 7066, + 7050, + 6885, + 7263, + 6950, + 6936, + 6966, + 7009, + 7055, + 6986, + 7002, + 7200, + 7241, + 7077, + 7089, + 6930, + 7291, + 7225, + 7041, + 7182, + 6957, + 7100, + 6981, + 6887, + 7081, + 7033, + 7174, + 7155, + 7384, + 7102, + 7010, + 6986, + 6932, + 6961, + 7214, + 7065, + 7071, + 6932, + 6946, + 7018, + 7057, + 7044, + 7026, + 6976, + 7154, + 6951, + 7332, + 7005, + 6895, + 7150, + 7089, + 7016, + 7315, + 7032, + 7107, + 7078, + 6957, + 7147, + 7092, + 7079, + 7151, + 7264, + 7223, + 7152, + 7352, + 7095, + 7193, + 7140, + 6987, + 7127, + 7061, + 6978, + 7139, + 7089, + 7002, + 7153, + 6988, + 7312, + 6919, + 6882, + 7224, + 7322, + 7136, + 7027, + 7215, + 6965, + 7119, + 7344, + 7107, + 7123, + 7443, + 7245, + 7097, + 7077, + 7528, + 6985, + 6896, + 7084, + 7071, + 7510, + 7024, + 7140, + 7081, + 7298, + 6937, + 7133, + 6984, + 6991, + 6947, + 7103, + 7086, + 7218, + 6888, + 7147, + 7072, + 7020, + 7154, + 6971, + 6904, + 7113, + 7138, + 6968, + 6914, + 6996, + 7038, + 6940, + 7059, + 7009, + 6931, + 7001, + 7114, + 6956, + 7147, + 7115, + 7034, + 7274, + 6845, + 6905, + 7127, + 6994, + 7146, + 7000, + 6900, + 6989, + 6955, + 7002, + 7085, + 7078, + 7114, + 7034, + 6971, + 6987, + 7007, + 7081, + 7130, + 6979, + 6941, + 7067, + 6884, + 6912, + 6975, + 6915, + 7051, + 6989, + 6888, + 7071, + 6959, + 7283, + 7093, + 7048, + 16549, + 7008, + 6919, + 6928, + 7070, + 7211, + 6952, + 7041, + 7763, + 7155, + 7071, + 7154, + 7092, + 6946, + 7079, + 7015, + 6909, + 7002, + 7069, + 7029, + 7000, + 7175, + 7214, + 7030, + 7087, + 6954, + 6895, + 6996, + 7057, + 7039, + 7054, + 6858, + 6984, + 7031, + 6997, + 7141, + 7060, + 7174, + 6918, + 7201, + 7146, + 7279, + 7279, + 7258, + 7122, + 7292, + 7448, + 7022, + 7230, + 7299, + 6994, + 7142, + 7142, + 6969, + 7221, + 6995, + 7184, + 7242, + 7122, + 6992, + 7096, + 7129, + 7104, + 7208, + 7301, + 7089, + 7089, + 7133, + 7098, + 7098, + 7013, + 7013, + 7010, + 6982, + 6982, + 7145, + 7179, + 7179, + 7027, + 7059, + 7200, + 7103, + 7103, + 7861, + 7155, + 7001, + 7001, + 7165, + 7005, + 7101, + 7103, + 7171, + 7156, + 7192, + 7132, + 7274, + 7274, + 7006, + 6960, + 6960, + 7076, + 7222, + 7029, + 6984, + 6984, + 7194, + 7081, + 7241, + 7096, + 7394, + 7394, + 7121, + 7121, + 6992, + 7027, + 7325, + 7325, + 7061, + 6990, + 7038, + 6847, + 6847, + 7152, + 7158, + 6906, + 6965, + 6965, + 7148, + 7044, + 7199, + 7224, + 7144, + 7070, + 7093, + 7093, + 7434, + 6900, + 7348, + 7348, + 7181, + 7021, + 7021, + 7107, + 7282, + 7283, + 7283, + 7179, + 7193, + 7291, + 7162, + 7022, + 7180, + 7137, + 7107, + 7107, + 7155, + 7085, + 7164, + 6985, + 7205, + 7205, + 7142, + 7194, + 6946, + 7115, + 7115, + 7314, + 7268, + 7268, + 7120, + 8112, + 7087, + 7120, + 7120, + 7223, + 7158, + 7158, + 7107, + 7107, + 7130, + 7130, + 7203, + 7141, + 7263, + 7170, + 6999, + 7018, + 7018, + 7055, + 7425, + 7275, + 7016, + 7155, + 7224, + 7264, + 7264, + 7126, + 7117, + 6904, + 6904, + 7015, + 7122, + 6863, + 7490, + 7115, + 7027, + 7157, + 7176, + 7176, + 6967, + 7049, + 6948, + 6940, + 7075, + 6817, + 7560, + 7096, + 7096, + 7155, + 6964, + 6964, + 7061, + 7157, + 7137, + 7007, + 7063, + 7063, + 7102, + 6966, + 6968, + 7000, + 6946, + 6963, + 6956, + 6956, + 6992, + 6815, + 7019, + 7004, + 6997, + 6967, + 7039, + 6988, + 6988, + 7923, + 6967, + 6932, + 6993, + 6982, + 7007, + 7417, + 7141, + 7141, + 7204, + 7165, + 7186, + 7306, + 6999, + 7006, + 7050, + 7070, + 7245, + 7928, + 6934, + 7196, + 7234, + 7086, + 7150, + 7193, + 7078, + 6978, + 6978, + 7109, + 7105, + 7118, + 7118, + 7101, + 7189, + 7069, + 7069, + 7179, + 7120, + 7267, + 7031, + 7031, + 7034, + 7198, + 7173, + 7048, + 7097, + 7285, + 7216, + 7216, + 7085, + 7174, + 7216, + 7105, + 7050, + 7050, + 7067, + 7124, + 7124, + 7105, + 7358, + 7358, + 7372, + 7128, + 7248, + 7248, + 7243, + 7082, + 7175, + 7175, + 7199, + 7199, + 7377, + 7197, + 7197, + 7284, + 7014, + 6987, + 7205, + 7006, + 7096, + 6935, + 7191, + 7191, + 7218, + 6978, + 7089, + 7089, + 7251, + 7089, + 7140, + 7215, + 7068, + 7002, + 7144, + 7069, + 7219, + 7117, + 7026, + 7006, + 7161, + 7037, + 7125, + 7340, + 7340, + 7387, + 7193, + 7193, + 7187, + 6958, + 6958, + 7211, + 7073, + 7262, + 7126, + 7126, + 7398, + 6936, + 7089, + 7089, + 7185, + 7185, + 6982, + 7230, + 7164, + 7164, + 7163, + 7069, + 7131, + 7119, + 7119, + 7179, + 7155, + 7207, + 7255, + 8763, + 7108, + 7098, + 7236, + 7236, + 7327, + 7327, + 7067, + 7067, + 7136, + 7105, + 7293, + 7293, + 7062, + 7062, + 7039, + 6973, + 7049, + 7049, + 7094, + 6987, + 7094, + 7094, + 6903, + 7240, + 7147, + 6967, + 7145, + 7145, + 7190, + 7142, + 7212, + 7121, + 7304 + ], + "sample_count": 1267 + }, + { + "pubkey": "CAM2CKqTVBrAEtWZ2iodYQvj2xw4JLQW6YSSMmWNMip8", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242242000000, + "samples": [ + 258404, + 258873, + 258938, + 258911, + 258939, + 258939, + 258800, + 258932, + 258918, + 258904, + 258820, + 258815, + 258945, + 258968, + 258913, + 258891, + 258910, + 258875, + 258834, + 258802, + 258862, + 258906, + 259022, + 258878, + 258789, + 258891, + 258731, + 258980, + 258903, + 258906, + 258752, + 258934, + 258836, + 258685, + 258908, + 258928, + 258707, + 258916, + 258796, + 258897, + 258820, + 258796, + 258858, + 258750, + 258934, + 258821, + 258988, + 258853, + 258821, + 258971, + 258745, + 258737, + 258777, + 258781, + 258855, + 258885, + 258930, + 258834, + 258773, + 258786, + 258910, + 258844, + 258856, + 258821, + 258728, + 258824, + 258879, + 263247, + 259055, + 258923, + 260605, + 259000, + 258978, + 259077, + 258916, + 259333, + 258927, + 258844, + 258981, + 258877, + 266033, + 273072, + 261939, + 264472, + 261074, + 266696, + 267509, + 259070, + 266690, + 263798, + 261617, + 263726, + 268171, + 267592, + 262579, + 258937, + 258918, + 259012, + 272118, + 269347, + 268205, + 274074, + 264125, + 259185, + 259050, + 258824, + 259212, + 259255, + 276567, + 267101, + 266133, + 259050, + 263392, + 261095, + 269124, + 259226, + 276180, + 264908, + 276988, + 274220, + 259074, + 277212, + 272837, + 263132, + 269007, + 268161, + 268677, + 273584, + 267482, + 272799, + 268925, + 271780, + 270829, + 276510, + 266580, + 269565, + 272112, + 267753, + 276690, + 273245, + 276519, + 274623, + 273337, + 268625, + 259190, + 268359, + 259464, + 268650, + 266490, + 262034, + 261694, + 270931, + 271740, + 271536, + 273286, + 261515, + 276500, + 258995, + 259023, + 270292, + 272152, + 273440, + 265639, + 269768, + 266403, + 259733, + 258821, + 259077, + 259113, + 258947, + 258959, + 258899, + 258819, + 258934, + 258870, + 258866, + 258755, + 258902, + 258922, + 258855, + 258772, + 258925, + 258886, + 258841, + 258809, + 258797, + 258865, + 258810, + 258690, + 258774, + 258765, + 258845, + 258949, + 258918, + 258865, + 258740, + 258812, + 258817, + 258896, + 257333, + 257285, + 257325, + 257295, + 257293, + 257257, + 257247, + 257362, + 257434, + 257406, + 257252, + 257360, + 257300, + 257374, + 257297, + 257284, + 257396, + 257238, + 257346, + 257329, + 257197, + 257218, + 257224, + 257189, + 257367, + 257264, + 257257, + 257272, + 257245, + 257269, + 257361, + 257232, + 257257, + 257404, + 257233, + 257171, + 257277, + 257261, + 257327, + 257262, + 257362, + 257255, + 257296, + 257370, + 257168, + 257232, + 257329, + 257265, + 257274, + 257327, + 257269, + 257269, + 257207, + 257343, + 257325, + 257350, + 257334, + 257337, + 257139, + 257327, + 257362, + 257269, + 257305, + 256735, + 256755, + 256644, + 256673, + 256656, + 256709, + 256779, + 256637, + 256701, + 256786, + 256789, + 256579, + 256796, + 256721, + 256748, + 256709, + 256709, + 256790, + 256725, + 256797, + 256740, + 256749, + 256781, + 256617, + 256793, + 256817, + 256760, + 256658, + 256740, + 256612, + 256707, + 256607, + 256656, + 256769, + 256586, + 256774, + 256701, + 256721, + 256675, + 256682, + 256613, + 256837, + 256785, + 256740, + 256772, + 256767, + 256738, + 256725, + 256767, + 256709, + 256695, + 256668, + 256565, + 256550, + 256813, + 256644, + 256810, + 256625, + 256716, + 256619, + 256732, + 256733, + 256680, + 256749, + 256786, + 256692, + 256630, + 256678, + 256789, + 256733, + 256656, + 256757, + 256839, + 256848, + 256773, + 256762, + 256810, + 256793, + 256704, + 256692, + 256696, + 256839, + 256579, + 256716, + 256726, + 256778, + 256767, + 256797, + 256762, + 256839, + 256853, + 256701, + 256803, + 256692, + 256680, + 256778, + 256736, + 256708, + 256785, + 256796, + 256695, + 256622, + 256846, + 256846, + 256665, + 256736, + 256570, + 256688, + 256793, + 256704, + 256829, + 256753, + 256678, + 256661, + 256810, + 256873, + 256648, + 256690, + 256853, + 256628, + 256741, + 256801, + 256629, + 256641, + 256810, + 256648, + 256716, + 256619, + 256694, + 256810, + 256832, + 256826, + 256699, + 256793, + 256642, + 256861, + 256803, + 256736, + 256762, + 256694, + 256774, + 256726, + 256642, + 256683, + 256625, + 256781, + 256725, + 256738, + 256813, + 256766, + 256759, + 256740, + 256752, + 256764, + 256843, + 256716, + 256567, + 256762, + 256903, + 256724, + 256760, + 256714, + 256779, + 256690, + 256736, + 256884, + 256808, + 256819, + 256807, + 256901, + 256680, + 256606, + 256797, + 260634, + 265314, + 266924, + 260421, + 259026, + 261637, + 262327, + 262685, + 267175, + 263342, + 258862, + 258728, + 260877, + 266742, + 262722, + 261110, + 264552, + 267430, + 260442, + 262733, + 262921, + 260064, + 261779, + 260697, + 261310, + 264590, + 265569, + 261154, + 261860, + 261039, + 267786, + 261911, + 266213, + 266910, + 265004, + 266563, + 263946, + 262724, + 264350, + 262468, + 265479, + 259159, + 268118, + 271515, + 269193, + 270484, + 266480, + 265344, + 267422, + 268460, + 268895, + 274461, + 265920, + 269317, + 268587, + 268869, + 269700, + 271202, + 267621, + 266928, + 273770, + 270323, + 266672, + 268216, + 264910, + 264809, + 262235, + 263878, + 263517, + 262611, + 270481, + 269401, + 269430, + 272774, + 270469, + 267892, + 266966, + 265367, + 269233, + 271737, + 262935, + 257187, + 269501, + 267817, + 266579, + 266327, + 265634, + 261562, + 260116, + 263367, + 263591, + 258362, + 269289, + 260846, + 265045, + 264623, + 268784, + 268285, + 265097, + 265574, + 261036, + 261015, + 256947, + 261741, + 259589, + 259846, + 257533, + 264205, + 262418, + 266662, + 268614, + 261435, + 266032, + 268523, + 268587, + 268215, + 265686, + 263792, + 266372, + 264296, + 264603, + 264170, + 265431, + 272102, + 270429, + 269445, + 269589, + 270226, + 261241, + 271170, + 269339, + 266519, + 272728, + 262215, + 268908, + 264623, + 267820, + 265828, + 267362, + 259752, + 269196, + 258819, + 269828, + 265468, + 270811, + 267995, + 264919, + 264356, + 257196, + 256915, + 256664, + 256765, + 256779, + 256821, + 256808, + 256812, + 256827, + 256808, + 256793, + 256735, + 256619, + 256733, + 256636, + 256726, + 256721, + 256702, + 256863, + 256755, + 256755, + 256762, + 256608, + 256627, + 256769, + 256800, + 256709, + 256844, + 256720, + 256844, + 256793, + 256678, + 256707, + 256689, + 256880, + 256850, + 256822, + 256670, + 256910, + 256829, + 256670, + 256747, + 256690, + 256774, + 256825, + 256673, + 256664, + 256810, + 256750, + 256733, + 256692, + 256887, + 256680, + 256848, + 256817, + 256754, + 256841, + 256745, + 268522, + 268426, + 268419, + 268552, + 268593, + 268514, + 268556, + 268488, + 268535, + 268588, + 268552, + 268398, + 268533, + 268464, + 268471, + 268540, + 268451, + 268480, + 268510, + 268497, + 268655, + 268644, + 268487, + 268431, + 268336, + 268567, + 268501, + 268409, + 268478, + 268507, + 268409, + 268433, + 268599, + 268501, + 264138, + 257521, + 257531, + 257569, + 257523, + 257386, + 257605, + 257531, + 257358, + 257526, + 257533, + 257483, + 257447, + 257511, + 257579, + 257410, + 257418, + 257488, + 257492, + 257366, + 257434, + 257450, + 257628, + 257640, + 257430, + 257487, + 257469, + 257546, + 257452, + 257551, + 257527, + 257480, + 256476, + 256558, + 256630, + 256403, + 256341, + 256312, + 256547, + 256237, + 256458, + 256486, + 256545, + 256372, + 256361, + 256302, + 256524, + 256445, + 256451, + 256466, + 257420, + 257505, + 257413, + 257402, + 257622, + 257517, + 257336, + 257584, + 257490, + 257692, + 257505, + 257661, + 257567, + 257488, + 257593, + 257596, + 257475, + 257565, + 257553, + 257421, + 257398, + 257538, + 257562, + 257512, + 257628, + 257526, + 257653, + 257685, + 257644, + 257478, + 257423, + 257492, + 257661, + 257432, + 257598, + 257654, + 257164, + 257362, + 257237, + 257196, + 257235, + 257230, + 257781, + 258718, + 257630, + 257644, + 260528, + 260588, + 258778, + 259067, + 269948, + 257672, + 257632, + 257890, + 258035, + 257482, + 262931, + 257697, + 260317, + 257653, + 257773, + 257765, + 257901, + 257795, + 257731, + 264932, + 261285, + 260041, + 260630, + 262865, + 266950, + 261233, + 257939, + 266360, + 264274, + 261591, + 264798, + 275674, + 261398, + 269197, + 269629, + 264330, + 266025, + 268336, + 264107, + 264254, + 267418, + 262344, + 267752, + 264814, + 263336, + 262539, + 261741, + 263806, + 258632, + 257754, + 257801, + 257654, + 257625, + 257524, + 257702, + 257591, + 257646, + 257423, + 257535, + 257567, + 257777, + 257558, + 257820, + 257659, + 257498, + 257724, + 257575, + 257672, + 257536, + 257646, + 257757, + 257665, + 257637, + 257600, + 257952, + 257653, + 257783, + 257505, + 257660, + 257692, + 258173, + 268550, + 268005, + 267331, + 261456, + 263698, + 261375, + 257661, + 257815, + 257761, + 257658, + 257802, + 257689, + 257654, + 257620, + 257582, + 257701, + 258362, + 272967, + 257880, + 257741, + 257673, + 257646, + 257507, + 257488, + 257500, + 257567, + 257534, + 257536, + 257475, + 257672, + 257488, + 257613, + 257584, + 257640, + 257603, + 257464, + 257450, + 257494, + 257447, + 257576, + 257499, + 257346, + 257612, + 257483, + 257620, + 257521, + 257450, + 257615, + 257595, + 257659, + 257543, + 257675, + 257471, + 257618, + 257560, + 257617, + 257487, + 257567, + 257559, + 257485, + 257486, + 257547, + 257644, + 257647, + 257559, + 257664, + 257605, + 257562, + 257500, + 257632, + 257732, + 257607, + 257594, + 257642, + 257428, + 257536, + 257476, + 257586, + 257695, + 257462, + 257533, + 257488, + 257596, + 257519, + 257473, + 257574, + 257625, + 257507, + 257466, + 257616, + 257524, + 257571, + 257534, + 257560, + 257495, + 257663, + 257646, + 257562, + 257654, + 254218, + 254151, + 254133, + 254074, + 254068, + 254056, + 254045, + 254092, + 254061, + 254098, + 254162, + 254190, + 254198, + 254125, + 254123, + 254182, + 254174, + 254076, + 254112, + 253999, + 254216, + 254226, + 254104, + 254239, + 254049, + 254248, + 254077, + 254224, + 254209, + 254302, + 254061, + 254117, + 254132, + 254230, + 254155, + 254176, + 254007, + 254128, + 254066, + 254100, + 254079, + 253983, + 253953, + 254036, + 254208, + 254125, + 254114, + 254307, + 254077, + 254155, + 254148, + 254065, + 254130, + 254130, + 254068, + 254176, + 254029, + 254069, + 254106, + 254183, + 254218, + 254085, + 254065, + 254235, + 254157, + 254283, + 254127, + 254068, + 254122, + 254168, + 254079, + 254083, + 254083, + 254102, + 254154, + 254075, + 254140, + 253966, + 254231, + 254109, + 254232, + 254033, + 254156, + 254179, + 254102, + 254045, + 254006, + 253938, + 254105, + 254094, + 254021, + 254211, + 254070, + 254229, + 254195, + 254097, + 254070, + 254200, + 254124, + 254155, + 254150, + 254119, + 254177, + 254091, + 254114, + 254127, + 254049, + 254096, + 254116, + 254044, + 253960, + 254088, + 253939, + 254161, + 253996, + 254173, + 254069, + 254093, + 254123, + 254118, + 254231, + 254104, + 254113, + 253952, + 254186, + 254096, + 254053, + 254142, + 254042, + 254182, + 254214, + 254042, + 254176, + 253972, + 253894, + 254156, + 254109, + 253984, + 254070, + 254229, + 254110, + 254032, + 253998, + 254051, + 254047, + 254223, + 254240, + 254082, + 254055, + 254211, + 254161, + 254184, + 253954, + 254122, + 254062, + 254148, + 254124, + 254216, + 254219, + 254031, + 254137, + 254100, + 254155, + 254142, + 254216, + 254301, + 254232, + 254148, + 254091, + 254069, + 254109, + 254077, + 254129, + 253959, + 254138, + 254279, + 253895, + 254111, + 254217, + 254121, + 253979, + 254062, + 254015, + 254096, + 254077, + 254106, + 254089, + 254223, + 254220, + 254178, + 254131, + 254128, + 254170, + 254215, + 254151, + 254134, + 254001, + 253974, + 254041, + 254265, + 254124, + 254080, + 254063, + 254053, + 253988, + 254092, + 254234, + 253988, + 254094, + 254077, + 254130, + 254054, + 254137, + 254189, + 254083, + 254053, + 254081, + 254130, + 254170, + 254197, + 254176, + 254093, + 254069, + 254229, + 254174, + 254110, + 254051, + 254202, + 254155, + 254059, + 253226, + 253091, + 253022, + 253043, + 253027, + 253062, + 253150, + 253228, + 253178, + 253268, + 253076, + 253200, + 253242, + 253262, + 253087, + 253143, + 253025, + 253270, + 253298, + 253202, + 253101, + 253006, + 253130, + 253160, + 253014, + 253184, + 253047, + 253088, + 253295, + 253271, + 253059, + 253245, + 253140, + 253144, + 253079, + 253240, + 253194, + 253033, + 253095, + 253155, + 253161, + 253028, + 253193, + 252981, + 253098, + 253084, + 253285, + 253185, + 253143, + 253073, + 253029, + 253129, + 253128, + 253189, + 253153, + 253010, + 253190, + 253025, + 253093, + 253212, + 253109, + 253162, + 253009, + 252975, + 253096, + 253177, + 253210, + 253169, + 253255, + 253061, + 253140, + 253052, + 253132, + 253220, + 253084, + 253115, + 253153, + 253106, + 253225, + 253201, + 253018, + 253068, + 253125, + 252991, + 253290, + 253185, + 253036 + ], + "sample_count": 1268 + }, + { + "pubkey": "3y75tBvbnL6HmmoMt5QkjkT9vKRVZ45TLkZNzoU9Wd5f", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242239000000, + "samples": [ + 78421, + 78400, + 78473, + 78448, + 78382, + 78420, + 78336, + 78468, + 78415, + 78439, + 78391, + 78405, + 78415, + 78427, + 78350, + 78384, + 78394, + 78261, + 78356, + 78416, + 78467, + 78261, + 78358, + 78391, + 78394, + 78388, + 78422, + 78459, + 78372, + 78493, + 78467, + 78395, + 78356, + 78471, + 78330, + 78433, + 78443, + 78369, + 78426, + 78358, + 78336, + 78332, + 78413, + 78394, + 78397, + 78458, + 78505, + 78473, + 78336, + 78435, + 78290, + 78358, + 78427, + 78385, + 78408, + 78370, + 78380, + 78442, + 78361, + 78377, + 78472, + 78448, + 78373, + 78402, + 78436, + 78444, + 78441, + 78362, + 78441, + 78393, + 78430, + 78449, + 78408, + 78408, + 78415, + 78439, + 78413, + 78351, + 78298, + 78404, + 78436, + 78368, + 78385, + 78327, + 78398, + 78481, + 78411, + 78320, + 78381, + 78330, + 78442, + 78337, + 78324, + 78372, + 78371, + 78377, + 78454, + 78382, + 78391, + 78359, + 78397, + 78337, + 78397, + 78357, + 78490, + 78345, + 78362, + 78415, + 78410, + 78296, + 78380, + 78355, + 78516, + 78420, + 78313, + 78452, + 78431, + 78294, + 78279, + 78360, + 78453, + 78498, + 78389, + 78359, + 78341, + 78360, + 78302, + 78410, + 78461, + 78452, + 78417, + 78369, + 78389, + 78363, + 78399, + 78398, + 78460, + 78369, + 78317, + 78446, + 78441, + 78483, + 78424, + 78405, + 78372, + 78331, + 78419, + 78430, + 78393, + 78429, + 78388, + 78412, + 78533, + 78417, + 78473, + 78458, + 78367, + 78376, + 78402, + 78371, + 78461, + 78304, + 78346, + 78391, + 78380, + 78345, + 78358, + 78363, + 78328, + 78394, + 78339, + 78397, + 78309, + 78430, + 78373, + 78328, + 78292, + 78385, + 78485, + 78388, + 78357, + 78308, + 78333, + 78420, + 78450, + 78402, + 78379, + 78362, + 78501, + 78459, + 78449, + 78433, + 78381, + 78430, + 78486, + 78300, + 78365, + 78369, + 78344, + 78300, + 78397, + 78454, + 78305, + 78266, + 78326, + 78482, + 78335, + 78364, + 78395, + 78316, + 78413, + 78423, + 78354, + 78376, + 78370, + 78401, + 78373, + 78371, + 78427, + 78407, + 78361, + 78363, + 78413, + 78358, + 78378, + 78318, + 78430, + 78430, + 78265, + 78360, + 78407, + 78303, + 78458, + 78309, + 78292, + 78325, + 78411, + 78415, + 78466, + 78329, + 78364, + 78484, + 78400, + 78335, + 78302, + 78309, + 78400, + 78484, + 79097, + 78447, + 78417, + 78521, + 78486, + 78482, + 78414, + 78345, + 78378, + 78379, + 78386, + 78397, + 78386, + 78371, + 78342, + 78347, + 78415, + 78387, + 78462, + 78479, + 78227, + 78488, + 78446, + 78378, + 78359, + 78363, + 78318, + 78418, + 78426, + 78345, + 78328, + 78432, + 78486, + 78439, + 78417, + 78448, + 78382, + 78333, + 78427, + 78428, + 78450, + 78535, + 78362, + 78351, + 78390, + 78385, + 78325, + 78440, + 78448, + 78359, + 78427, + 78374, + 78336, + 78338, + 78475, + 78442, + 78411, + 78454, + 78442, + 78455, + 78395, + 78355, + 78458, + 78496, + 78418, + 78423, + 78459, + 78495, + 78355, + 78403, + 78506, + 78325, + 78415, + 78396, + 78461, + 78428, + 78399, + 78254, + 78334, + 78439, + 78435, + 78333, + 78450, + 78348, + 78440, + 78454, + 78415, + 78387, + 78354, + 78552, + 78399, + 78382, + 78430, + 78519, + 78378, + 78459, + 78445, + 78363, + 78417, + 78419, + 78389, + 78341, + 78376, + 78455, + 78434, + 78386, + 78373, + 78409, + 78443, + 78391, + 78351, + 78463, + 78407, + 78399, + 78396, + 78450, + 78451, + 78481, + 78435, + 78509, + 78400, + 78372, + 78415, + 78506, + 78403, + 78357, + 78472, + 78435, + 78376, + 78400, + 78346, + 78429, + 78385, + 78390, + 78454, + 78442, + 78484, + 78420, + 78432, + 78395, + 78454, + 78428, + 78422, + 78454, + 78473, + 78432, + 78394, + 78414, + 78266, + 78372, + 78427, + 78458, + 78328, + 78429, + 78370, + 78327, + 78360, + 78455, + 78515, + 78482, + 78340, + 78426, + 78447, + 78391, + 78482, + 78371, + 78417, + 78346, + 78523, + 78406, + 78475, + 78350, + 78423, + 78529, + 78413, + 78424, + 78476, + 78388, + 78398, + 78374, + 78437, + 78364, + 78436, + 78362, + 78308, + 78431, + 78575, + 78509, + 78402, + 78485, + 78346, + 78317, + 78468, + 78440, + 78447, + 78521, + 78527, + 78511, + 78336, + 78384, + 78368, + 78353, + 78313, + 78347, + 78379, + 78437, + 78367, + 78337, + 78393, + 78356, + 78368, + 78409, + 78416, + 78438, + 78407, + 78392, + 78598, + 78419, + 78400, + 78302, + 78385, + 78247, + 78369, + 78419, + 78428, + 78406, + 78359, + 78374, + 78348, + 78320, + 78415, + 78336, + 78464, + 78424, + 78455, + 78355, + 78390, + 78406, + 78456, + 78363, + 78399, + 78519, + 78485, + 78341, + 78437, + 78451, + 78303, + 78365, + 78428, + 78566, + 78496, + 78401, + 78464, + 78345, + 78467, + 78379, + 78424, + 78373, + 78355, + 78475, + 78477, + 78404, + 78453, + 78420, + 78439, + 78360, + 78425, + 78416, + 78386, + 78435, + 79172, + 78500, + 78402, + 78428, + 78490, + 78344, + 78394, + 78360, + 78443, + 78442, + 78456, + 78432, + 78446, + 78403, + 78454, + 78369, + 78460, + 78263, + 78434, + 78470, + 78400, + 78407, + 78432, + 78421, + 78396, + 78449, + 78368, + 78375, + 78399, + 78429, + 78417, + 78414, + 78364, + 78501, + 78403, + 78388, + 78377, + 78468, + 78492, + 78369, + 78377, + 78433, + 78309, + 78410, + 78429, + 78365, + 78424, + 78346, + 78418, + 78440, + 78274, + 78346, + 78357, + 78470, + 78357, + 78366, + 78673, + 78389, + 78386, + 78502, + 78504, + 78289, + 78500, + 78388, + 78310, + 78369, + 78293, + 78296, + 78394, + 78390, + 78413, + 78482, + 78412, + 78402, + 78465, + 78392, + 78398, + 78405, + 78455, + 78305, + 78385, + 78368, + 78541, + 78405, + 78308, + 78344, + 78340, + 78437, + 78478, + 78395, + 78339, + 78313, + 78469, + 78513, + 78366, + 78439, + 78385, + 78383, + 78354, + 78440, + 78516, + 78475, + 78452, + 78474, + 78550, + 78313, + 78412, + 78438, + 78362, + 78461, + 78301, + 78389, + 78326, + 78390, + 78399, + 78518, + 78408, + 78445, + 78511, + 78431, + 78366, + 79081, + 78307, + 78390, + 78454, + 78462, + 78365, + 78461, + 78409, + 78463, + 78412, + 78376, + 78430, + 78498, + 78525, + 78366, + 78472, + 78378, + 78473, + 78358, + 78398, + 78218, + 78364, + 78462, + 78403, + 78422, + 78337, + 78434, + 78456, + 78407, + 78547, + 78338, + 78431, + 78442, + 78350, + 78404, + 78380, + 78382, + 78373, + 78414, + 78322, + 78397, + 78343, + 78247, + 78431, + 78477, + 78406, + 78458, + 78416, + 78550, + 78438, + 78403, + 78386, + 78404, + 78438, + 78317, + 78443, + 78459, + 78374, + 78409, + 78463, + 78399, + 78357, + 78454, + 78382, + 78330, + 78385, + 78399, + 78438, + 78431, + 78296, + 78382, + 78449, + 78469, + 78506, + 78323, + 78497, + 78311, + 78360, + 78341, + 78385, + 78487, + 78386, + 78467, + 78402, + 78486, + 78534, + 78435, + 78481, + 78468, + 78392, + 78329, + 78554, + 78526, + 78338, + 78616, + 78350, + 78466, + 78423, + 78497, + 78392, + 78481, + 78365, + 78407, + 78384, + 78310, + 78338, + 78447, + 78531, + 78384, + 78406, + 78243, + 78406, + 78473, + 78440, + 78415, + 78438, + 78426, + 78367, + 78461, + 78413, + 78364, + 78400, + 78468, + 78343, + 78384, + 78460, + 78371, + 78424, + 78434, + 78533, + 78342, + 78400, + 78293, + 78369, + 78389, + 78338, + 78314, + 78448, + 78344, + 78397, + 78395, + 78470, + 78458, + 78401, + 78302, + 78405, + 78432, + 78453, + 78522, + 78451, + 78316, + 78417, + 78494, + 78349, + 78308, + 78449, + 78460, + 78548, + 78349, + 78444, + 78386, + 78360, + 78371, + 78415, + 78429, + 78342, + 78351, + 78448, + 78461, + 78361, + 78314, + 78396, + 78447, + 78445, + 78460, + 78437, + 78413, + 78432, + 78440, + 78470, + 78431, + 78427, + 78473, + 78403, + 78409, + 78366, + 78464, + 78379, + 78452, + 78455, + 78229, + 78420, + 78424, + 78414, + 78375, + 78381, + 78334, + 78404, + 78467, + 78372, + 78333, + 78377, + 78407, + 78499, + 78386, + 78417, + 78382, + 78429, + 78393, + 78405, + 78311, + 78398, + 78349, + 78382, + 78395, + 78300, + 78463, + 78408, + 78410, + 78312, + 78308, + 78378, + 78316, + 78361, + 78370, + 78437, + 78440, + 78461, + 78389, + 78416, + 78297, + 78338, + 78395, + 78420, + 78296, + 78433, + 78518, + 78412, + 78410, + 78394, + 78352, + 78428, + 78411, + 78430, + 78477, + 78293, + 78432, + 78396, + 78398, + 78416, + 78433, + 78444, + 78484, + 78522, + 78421, + 78354, + 78439, + 78404, + 78364, + 78427, + 78339, + 78348, + 78351, + 78477, + 78512, + 78458, + 78393, + 78459, + 78450, + 78335, + 78486, + 78296, + 78393, + 78432, + 78358, + 78482, + 78419, + 78443, + 78380, + 78402, + 78415, + 78446, + 78322, + 78424, + 78596, + 78363, + 78566, + 78295, + 78544, + 78339, + 78391, + 78282, + 78477, + 78386, + 78433, + 78300, + 78402, + 78440, + 78371, + 78392, + 78426, + 78288, + 78306, + 78390, + 78469, + 78390, + 78420, + 78532, + 78397, + 78487, + 78436, + 78339, + 78350, + 78357, + 78391, + 78392, + 78400, + 78259, + 78388, + 78477, + 78385, + 78347, + 78411, + 78454, + 78420, + 78297, + 78344, + 78352, + 78408, + 78291, + 78358, + 78407, + 78412, + 78386, + 78364, + 78462, + 78447, + 78460, + 78457, + 78325, + 78407, + 78420, + 78327, + 78399, + 78394, + 78395, + 78441, + 78409, + 78463, + 78337, + 78368, + 78378, + 78418, + 78430, + 78397, + 78482, + 78433, + 78452, + 78486, + 78464, + 78499, + 78421, + 78421, + 78445, + 78332, + 78501, + 78350, + 78479, + 78454, + 78410, + 78432, + 78370, + 78460, + 78391, + 78518, + 78363, + 78418, + 78433, + 78418, + 78376, + 78476, + 78339, + 78433, + 78494, + 78478, + 78340, + 78383, + 78418, + 78421, + 78364, + 78498, + 78451, + 78390, + 78424, + 78385, + 78451, + 78320, + 78358, + 78381, + 78401, + 78399, + 78452, + 78517, + 78459, + 78459, + 78419, + 78285, + 78413, + 78452, + 78422, + 78427, + 78352, + 78425, + 78519, + 78407, + 78477, + 78487, + 78357, + 78578, + 78524, + 78361, + 78363, + 78366, + 78485, + 78443, + 78460, + 78345, + 78442, + 78425, + 78374, + 78451, + 78325, + 78427, + 78391, + 78391, + 78366, + 78301, + 78486, + 78390, + 78448, + 78391, + 76080, + 78350, + 78373, + 76087, + 78721, + 78367, + 76085, + 78460, + 78343, + 78385, + 78515, + 78419, + 78444, + 78350, + 78447, + 78443, + 78410, + 78465, + 78350, + 78464, + 78450, + 78433, + 78400, + 78370, + 78377, + 78352, + 78434, + 78526, + 78369, + 78352, + 78351, + 78497, + 78474, + 78341, + 78495, + 78491, + 78477, + 78499, + 78414, + 78450, + 78283, + 78401, + 78470, + 78393, + 78312, + 78487, + 78410, + 78516, + 78431, + 78323, + 78449, + 78459, + 78392, + 78462, + 78488, + 78446, + 78534, + 78381, + 78441, + 78404, + 78270, + 78429, + 78519, + 78456, + 78444, + 78510, + 78421, + 78490, + 78476, + 78396, + 78403, + 78353, + 78461, + 78327, + 78457, + 78326, + 78490, + 78459, + 78489, + 78456, + 78416, + 78444, + 78412, + 78252, + 78501, + 78408, + 78457, + 78369, + 78395, + 78417, + 78233, + 78410, + 78457, + 78491, + 78529, + 78365, + 78399, + 78389, + 78489, + 78425, + 78434, + 78407, + 78395, + 78424, + 78332, + 78361, + 78402, + 78468, + 78348, + 78459, + 78323, + 78533, + 78429, + 78474, + 78385, + 78505, + 78396, + 78406, + 78426, + 78364, + 78310, + 78474, + 78540, + 78411, + 78420, + 78358, + 78400, + 78443, + 78422, + 78356, + 78325, + 78576, + 78405, + 78440, + 78519, + 78316, + 78411, + 78482, + 78302, + 78461, + 78396, + 78409, + 78513, + 78312, + 78329, + 78421, + 78377, + 78377, + 78476, + 78352, + 78376, + 79104, + 78460, + 78422, + 78413, + 78510, + 78326, + 78325, + 78359, + 78436, + 78334, + 78421, + 78338, + 78311, + 78405, + 78350, + 78286, + 78426, + 78331, + 78375, + 78505, + 78428, + 78414, + 78433, + 78545, + 78390, + 78476, + 78424, + 78463, + 78410, + 78380, + 78451, + 78387, + 78486, + 78365, + 78458, + 78537, + 78436, + 78489, + 78397, + 78427 + ], + "sample_count": 1271 + }, + { + "pubkey": "GBHceAVrYZLhxDe2k7KiAbsLGmLC55cCEYwDtz96MchZ", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242373000000, + "samples": [ + 228540, + 228536, + 228536, + 228394, + 228732, + 228321, + 228321, + 228710, + 228515, + 228515, + 228595, + 228595, + 228687, + 228742, + 228535, + 228489, + 228604, + 228587, + 228635, + 228547, + 228438, + 228438, + 228766, + 228766, + 228572, + 228476, + 228589, + 228633, + 228633, + 228470, + 228548, + 228640, + 228642, + 228627, + 225550, + 228339, + 228698, + 228642, + 228519, + 228412, + 228650, + 228650, + 228718, + 228632, + 228753, + 228534, + 228655, + 228522, + 228492, + 228604, + 228563, + 228620, + 228554, + 228670, + 228528, + 228528, + 228824, + 228824, + 228702, + 228380, + 228562, + 228619, + 228479, + 228520, + 228588, + 228349, + 228608, + 228627, + 228552, + 228587, + 228299, + 228552, + 228684, + 228637, + 228553, + 228468, + 228521, + 228563, + 228563, + 228432, + 228515, + 228723, + 228714, + 228446, + 228496, + 228740, + 228763, + 228652, + 228481, + 228798, + 228798, + 228542, + 228630, + 228630, + 228717, + 228492, + 228722, + 228640, + 228648, + 228275, + 228763, + 228584, + 228756, + 228770, + 228770, + 228570, + 228720, + 228720, + 228514, + 228732, + 228732, + 229161, + 228582, + 228463, + 228596, + 228458, + 228562, + 228469, + 228887, + 228648, + 228648, + 228488, + 228673, + 228673, + 228620, + 228705, + 228699, + 228661, + 228711, + 228311, + 228311, + 228463, + 228463, + 228768, + 228701, + 228553, + 228371, + 228540, + 228540, + 228753, + 228431, + 228431, + 228749, + 228699, + 228611, + 228611, + 228593, + 228593, + 228685, + 228630, + 228643, + 228643, + 228370, + 228637, + 228616, + 228594, + 228836, + 228573, + 228449, + 228410, + 228504, + 228811, + 228557, + 228753, + 228753, + 228669, + 228541, + 228619, + 228492, + 228726, + 228560, + 228752, + 228498, + 228498, + 228534, + 228678, + 228678, + 228359, + 228843, + 228794, + 228537, + 228689, + 228436, + 228688, + 228738, + 228558, + 228730, + 228730, + 228662, + 228626, + 228684, + 228787, + 228787, + 228346, + 228884, + 228884, + 228645, + 228514, + 228573, + 228687, + 228595, + 228771, + 228698, + 228580, + 228580, + 228371, + 228548, + 228548, + 228750, + 228750, + 228554, + 228438, + 228532, + 228532, + 228730, + 228521, + 228710, + 228376, + 228568, + 228568, + 228650, + 228572, + 228541, + 228541, + 228685, + 228685, + 228606, + 228668, + 228455, + 228539, + 228677, + 229139, + 228525, + 228483, + 228688, + 228553, + 228718, + 228524, + 228875, + 228689, + 228647, + 228553, + 228553, + 228473, + 228755, + 228722, + 228844, + 228844, + 228619, + 228435, + 228451, + 228784, + 228355, + 228355, + 228662, + 228451, + 228570, + 228403, + 228510, + 228802, + 228653, + 228517, + 228513, + 228664, + 228521, + 228587, + 228632, + 228487, + 228654, + 228759, + 228759, + 228574, + 228377, + 228459, + 228564, + 228564, + 228562, + 228420, + 228514, + 228529, + 228445, + 228621, + 228599, + 228537, + 228453, + 228453, + 228661, + 228606, + 228606, + 228722, + 228439, + 228827, + 228827, + 228658, + 228682, + 228651, + 228640, + 228605, + 228549, + 228493, + 228721, + 228359, + 228698, + 228586, + 228491, + 228516, + 228960, + 228605, + 228575, + 228533, + 228658, + 228318, + 228606, + 228766, + 229122, + 228712, + 228511, + 228597, + 228561, + 228561, + 228344, + 228723, + 228431, + 228431, + 228488, + 228543, + 228537, + 228498, + 228955, + 228504, + 228640, + 228578, + 228404, + 228404, + 228458, + 228651, + 228743, + 228670, + 228650, + 228650, + 228566, + 228768, + 228471, + 228443, + 228585, + 228599, + 228605, + 228571, + 228608, + 228444, + 228444, + 228458, + 228566, + 228511, + 228302, + 228302, + 228488, + 228486, + 228495, + 228495, + 228646, + 228672, + 228596, + 228667, + 228667, + 228400, + 228639, + 228483, + 228612, + 228700, + 228651, + 228651, + 228473, + 228590, + 228605, + 228682, + 228499, + 228658, + 228565, + 228565, + 228507, + 228614, + 228376, + 228376, + 228491, + 228673, + 228673, + 228510, + 228874, + 228589, + 228589, + 228533, + 228576, + 228576, + 228609, + 228631, + 229054, + 228564, + 228554, + 228651, + 228507, + 228595, + 229841, + 229841, + 228566, + 228566, + 228560, + 228341, + 228324, + 228656, + 228562, + 228991, + 228635, + 228487, + 228607, + 228472, + 228581, + 228538, + 228538, + 228697, + 228666, + 228560, + 228514, + 228514, + 228625, + 228377, + 228565, + 228593, + 228593, + 228621, + 228621, + 228683, + 228616, + 228726, + 228671, + 228616, + 228616, + 228580, + 228632, + 228579, + 228650, + 228631, + 228747, + 228747, + 228351, + 228538, + 228558, + 228606, + 228963, + 228576, + 228576, + 228330, + 228477, + 228549, + 228549, + 228495, + 228617, + 228443, + 228514, + 228514, + 228712, + 228714, + 228530, + 228627, + 228670, + 228497, + 228630, + 228493, + 228382, + 228617, + 228627, + 228627, + 228519, + 228496, + 228343, + 228629, + 228733, + 228372, + 228718, + 228718, + 228751, + 228532, + 228635, + 228702, + 228598, + 228480, + 228839, + 228681, + 228681, + 228666, + 228559, + 228559, + 228527, + 228743, + 228628, + 228636, + 228571, + 228593, + 228593, + 228538, + 228611, + 228929, + 228509, + 228513, + 228646, + 228355, + 228880, + 228624, + 228737, + 228755, + 228768, + 228545, + 228727, + 228727, + 228579, + 228620, + 228921, + 228507, + 228460, + 228724, + 228615, + 228470, + 228668, + 228674, + 228739, + 228739, + 228705, + 228643, + 228720, + 228720, + 228521, + 228917, + 228563, + 228568, + 228650, + 228610, + 228603, + 228603, + 228632, + 228662, + 228542, + 228602, + 228631, + 228631, + 228637, + 228672, + 228763, + 228712, + 228492, + 228568, + 228568, + 228528, + 228542, + 228398, + 228755, + 228472, + 228462, + 228392, + 228437, + 228523, + 228436, + 228782, + 228649, + 228577, + 228551, + 228551, + 228551, + 228642, + 228706, + 228711, + 228633, + 228633, + 228418, + 228656, + 228674, + 228788, + 228788, + 228596, + 228532, + 228532, + 228713, + 228619, + 228493, + 228789, + 228795, + 228581, + 228477, + 228629, + 228629, + 228477, + 228477, + 228553, + 228553, + 228570, + 228423, + 228615, + 228483, + 228546, + 228779, + 228733, + 228418, + 228418, + 228577, + 228583, + 228583, + 228578, + 228708, + 228495, + 228380, + 228584, + 228567, + 228451, + 228431, + 228751, + 228556, + 228515, + 228434, + 228472, + 228552, + 228694, + 228694, + 228815, + 228815, + 228394, + 228557, + 228455, + 228504, + 228326, + 228473, + 228473, + 228574, + 228443, + 228443, + 228393, + 228517, + 228542, + 228916, + 228364, + 228580, + 228449, + 228456, + 228812, + 228487, + 228583, + 228524, + 228534, + 228477, + 228345, + 228345, + 228482, + 228400, + 228588, + 228362, + 228362, + 228407, + 228425, + 228425, + 228491, + 228560, + 228659, + 228659, + 228493, + 228458, + 228458, + 228475, + 228378, + 228378, + 228506, + 228496, + 228427, + 228425, + 228472, + 228508, + 228668, + 228592, + 228425, + 228425, + 228573, + 228395, + 228364, + 228364, + 228497, + 228680, + 228680, + 228462, + 228462, + 228577, + 228419, + 228390, + 228390, + 228372, + 228481, + 228481, + 228552, + 228504, + 228504, + 228402, + 228516, + 228516, + 228487, + 228487, + 228650, + 228546, + 228546, + 228441, + 228461, + 228615, + 228466, + 228509, + 228535, + 228442, + 228834, + 228497, + 228497, + 228374, + 228448, + 228434, + 228583, + 228464, + 228841, + 228841, + 228435, + 228435, + 228448, + 228451, + 228383, + 228756, + 228756, + 228523, + 228465, + 228335, + 228472, + 228580, + 228519, + 228519, + 228378, + 228438, + 228515, + 228342, + 228342, + 228377, + 228706, + 228591, + 228378, + 228378, + 228500, + 228384, + 228465, + 228446, + 228480, + 228402, + 228402, + 228423, + 228532, + 228549, + 228549, + 228477, + 228477, + 228546, + 228546, + 228476, + 228467, + 228467, + 228720, + 228421, + 228541, + 228509, + 228479, + 228298, + 228542, + 228542, + 228642, + 228642, + 228418, + 228536, + 228372, + 228512, + 228264, + 228264, + 228493, + 228391, + 228396, + 228457, + 228457, + 228392, + 228551, + 228614, + 228411, + 228398, + 228515, + 228435, + 228435, + 228508, + 228550, + 228426, + 228434, + 228434, + 228669, + 228370, + 228506, + 228646, + 228871, + 228418, + 228418, + 228339, + 228364, + 228543, + 228441, + 228477, + 228436, + 228400, + 228400, + 228451, + 228370, + 228438, + 228396, + 228633, + 228586, + 228300, + 228506, + 228376, + 228519, + 228582, + 228627, + 228627, + 228321, + 228321, + 228403, + 230778, + 230975, + 228407, + 228492, + 228504, + 228481, + 228481, + 228409, + 228485, + 228434, + 228583, + 228580, + 228742, + 228358, + 228583, + 228448, + 228418, + 228442, + 228991, + 228991, + 228490, + 228400, + 228473, + 228473, + 228467, + 228626, + 228626, + 228542, + 228496, + 228387, + 228551, + 228345, + 228358, + 228713, + 228448, + 228448, + 228295, + 228467, + 228474, + 228551, + 228713, + 228425, + 228362, + 228315, + 228392, + 228600, + 228600, + 228350, + 228550, + 228461, + 228490, + 228388, + 228379, + 228725, + 228449, + 228694, + 228534, + 228534, + 228487, + 228525, + 228525, + 228512, + 228523, + 228613, + 228980, + 228629, + 228530, + 228514, + 228615, + 228456, + 228485, + 228532, + 228555, + 228575, + 228575, + 228686, + 228663, + 228408, + 228755, + 228755, + 228539, + 228381, + 228381, + 228626, + 228561, + 228569, + 228873, + 228409, + 228609, + 228573, + 228519, + 228585, + 228464, + 228809, + 228616, + 228516, + 228492, + 228627, + 228524, + 228709, + 228709, + 228796, + 228461, + 228735, + 228504, + 228504, + 228670, + 228584, + 228490, + 228623, + 228623, + 228721, + 228375, + 228516, + 228718, + 228511, + 228799, + 228713, + 228713, + 228499, + 228686, + 228639, + 228632, + 228632, + 228891, + 228334, + 228664, + 228481, + 228621, + 228630, + 228509, + 341245, + 341245, + 341245, + 228562, + 228583, + 228611, + 228611, + 228527, + 228382, + 228382, + 228509, + 228433, + 228704, + 228704, + 228519, + 228725, + 228708, + 228503, + 228673, + 228673, + 228516, + 228516, + 228648, + 228414, + 228581, + 228661, + 228661, + 228542, + 228740, + 228369, + 228712, + 228386, + 228607, + 228510, + 228510, + 228489, + 228489, + 228531, + 228561, + 228644, + 228644, + 228751, + 228517, + 228667, + 228408, + 228686, + 228652, + 228436, + 228605, + 228605, + 228671, + 228461, + 228731, + 228671, + 228656, + 228656, + 228706, + 228602, + 228569, + 228493, + 228575, + 228503, + 228610, + 228610, + 228587, + 228549, + 228810, + 228816, + 228474, + 228474, + 228468, + 228603, + 228571, + 228517, + 228637, + 228637, + 228594, + 228445, + 228679, + 228596, + 228469, + 228736, + 228736, + 228653, + 228653, + 228537, + 228444, + 228619, + 228612, + 228579, + 228577, + 228589, + 228449, + 228449, + 228664, + 228720, + 228667, + 228657, + 228371, + 228646, + 228608, + 228425, + 228723, + 228611, + 228548, + 228514, + 228628, + 228418, + 228403, + 228618, + 228618, + 228518, + 228766, + 228691, + 228503, + 228593, + 228559, + 228559, + 228646, + 228471, + 228517, + 228575, + 228645, + 228644, + 228449, + 228581, + 228581, + 228661, + 228692, + 228606, + 228537, + 228444, + 228596, + 228596, + 228477, + 228690, + 228744, + 228482, + 228595, + 228496, + 228602, + 228555, + 228555, + 228823, + 228717, + 228661, + 228661, + 228421, + 228376, + 228376, + 228739, + 228542, + 228542, + 228602, + 228589, + 228451, + 228451, + 229029, + 228699, + 228492, + 228659, + 228636, + 228608, + 228668, + 228439, + 228636, + 228636, + 228371, + 228371, + 228452, + 228617, + 228369, + 228835, + 228692, + 228641, + 228641, + 228549, + 228458, + 228555, + 228860, + 228860, + 228736, + 228467, + 228467, + 228500, + 228644, + 228644, + 228919, + 228932, + 228581, + 228555, + 228425, + 228619, + 228619, + 228593, + 228607, + 228607, + 228482, + 228602, + 228602, + 228409, + 228409, + 228467, + 228625, + 228625, + 228664, + 228694, + 228450, + 228669, + 228720, + 228503, + 228503, + 228537, + 228569, + 228471, + 228475, + 228507, + 228658, + 228742, + 228540, + 228582, + 228587, + 228530, + 228689, + 228817, + 228817, + 228673, + 228538, + 228610, + 228477, + 228456, + 228503, + 228632, + 228610, + 228382, + 228603, + 228634, + 228657, + 228618, + 228618, + 228929, + 228694, + 228621, + 228488, + 228549, + 228529, + 228567, + 228562, + 228562, + 228685, + 228806, + 228391, + 228575, + 228692, + 228659, + 228659, + 228652, + 228518, + 228612, + 228634, + 228634, + 228709, + 228718, + 228718, + 228390, + 228661, + 228680, + 228515, + 228428, + 228428, + 228811, + 228662, + 228561, + 228602, + 225486, + 225472, + 228574, + 228780, + 228736, + 228452, + 228718, + 228646, + 228345, + 228347, + 228545, + 228545, + 228520, + 228520, + 228571, + 228759, + 228759, + 228509, + 228546, + 228777, + 228645, + 228645, + 228410, + 228410, + 228746, + 228998, + 228529, + 228529, + 228504, + 228716, + 228716, + 228605 + ], + "sample_count": 1265 + }, + { + "pubkey": "9gGazNG25zVciFD6EPNecYuc9QGRRoZa8e2q21Urq1bv", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3SpDvEQ83VgeN67xygxSrgm2YyztNbR7NnHNH2qi7K4T", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242244000000, + "samples": [ + 99925, + 99862, + 99797, + 99793, + 99745, + 99785, + 99718, + 99697, + 99952, + 99978, + 99837, + 99853, + 100021, + 99692, + 99913, + 99942, + 99735, + 99839, + 99955, + 99810, + 99707, + 99752, + 99926, + 99944, + 99972, + 99747, + 99853, + 99954, + 99919, + 99898, + 99843, + 99761, + 99896, + 99848, + 99957, + 99854, + 99948, + 99830, + 99686, + 99756, + 99763, + 99728, + 99777, + 99980, + 99792, + 99880, + 99790, + 99909, + 99776, + 100025, + 99730, + 99906, + 99646, + 99862, + 99974, + 99756, + 99939, + 99682, + 99830, + 99649, + 99672, + 99882, + 99695, + 99800, + 99937, + 99839, + 99686, + 99709, + 99668, + 99704, + 99884, + 99667, + 99893, + 99633, + 99692, + 99718, + 99890, + 99797, + 99802, + 99763, + 99906, + 99832, + 99784, + 99796, + 99750, + 99653, + 99960, + 99956, + 99912, + 99874, + 99914, + 99778, + 99857, + 100014, + 99767, + 99650, + 99866, + 99837, + 99913, + 99747, + 99753, + 99820, + 99691, + 99751, + 99809, + 99668, + 99898, + 99743, + 99690, + 99819, + 99983, + 99661, + 99814, + 99940, + 99828, + 99746, + 99870, + 99778, + 99847, + 99956, + 99903, + 99667, + 99721, + 99628, + 99876, + 99647, + 99684, + 99746, + 99874, + 99779, + 99833, + 99703, + 99735, + 99764, + 99761, + 99711, + 99654, + 99705, + 99710, + 99779, + 99845, + 99855, + 99751, + 99676, + 99722, + 99728, + 99964, + 99842, + 99614, + 99825, + 99584, + 99805, + 99810, + 99697, + 99899, + 99848, + 99752, + 99684, + 99774, + 99864, + 99697, + 99600, + 99821, + 99800, + 99909, + 99714, + 99608, + 99911, + 99920, + 99646, + 99723, + 99857, + 99698, + 99779, + 99942, + 99679, + 99957, + 99924, + 99986, + 99872, + 99840, + 99716, + 99726, + 99638, + 99652, + 99811, + 99938, + 99631, + 100034, + 99659, + 99590, + 99702, + 99723, + 99791, + 99908, + 99867, + 99640, + 99800, + 99807, + 99945, + 99754, + 99777, + 99735, + 99928, + 99882, + 99726, + 99892, + 99921, + 100076, + 99761, + 99911, + 99839, + 99863, + 99713, + 99828, + 99776, + 99861, + 99946, + 99825, + 100065, + 99760, + 99803, + 100090, + 99956, + 99800, + 99706, + 99778, + 99859, + 99806, + 99641, + 99833, + 99606, + 99820, + 99816, + 99833, + 99879, + 99776, + 99786, + 99979, + 99778, + 99773, + 99952, + 99797, + 99799, + 99853, + 99898, + 99749, + 99802, + 99744, + 99769, + 99731, + 99726, + 99805, + 99764, + 99963, + 99823, + 99792, + 99775, + 99918, + 99994, + 99882, + 99827, + 99766, + 99942, + 99736, + 99883, + 99767, + 99768, + 100075, + 99785, + 99914, + 99961, + 99913, + 99696, + 99861, + 99918, + 99866, + 99832, + 99833, + 99810, + 99570, + 99800, + 99691, + 99867, + 99763, + 99695, + 99796, + 99736, + 99895, + 99876, + 99812, + 99811, + 99826, + 99814, + 99621, + 99942, + 99682, + 99840, + 99695, + 99906, + 99964, + 99772, + 99898, + 99926, + 99910, + 99885, + 99829, + 99721, + 99715, + 99991, + 99716, + 99660, + 99907, + 99728, + 99771, + 99984, + 99893, + 99646, + 99975, + 99876, + 99849, + 99694, + 99916, + 99862, + 99785, + 99822, + 99878, + 99742, + 99867, + 99890, + 99805, + 99927, + 100018, + 100018, + 99813, + 99880, + 99961, + 99914, + 99894, + 99854, + 99946, + 99947, + 99734, + 99754, + 99706, + 99842, + 99921, + 100069, + 99817, + 99961, + 99828, + 99732, + 99680, + 99716, + 99815, + 99812, + 99855, + 99862, + 99631, + 100003, + 99772, + 99953, + 99821, + 99916, + 99741, + 99778, + 99741, + 99791, + 99867, + 99765, + 99991, + 99881, + 99799, + 99889, + 100024, + 99847, + 99869, + 99838, + 99851, + 99893, + 99806, + 99869, + 99893, + 99853, + 99818, + 99779, + 99761, + 99869, + 99927, + 99884, + 99825, + 99693, + 99848, + 99963, + 99986, + 99891, + 99752, + 99895, + 99848, + 99808, + 99844, + 99786, + 99776, + 99876, + 99923, + 99884, + 99768, + 99889, + 99999, + 99920, + 99804, + 99936, + 99764, + 100000, + 99972, + 99906, + 99925, + 99731, + 99713, + 99910, + 99902, + 99867, + 99958, + 99960, + 99801, + 99888, + 99761, + 99925, + 99843, + 99988, + 99791, + 99827, + 99952, + 99786, + 100011, + 99924, + 99877, + 99955, + 99913, + 99728, + 99908, + 99889, + 99948, + 99850, + 99875, + 99778, + 99793, + 99744, + 100031, + 99844, + 99712, + 99950, + 99915, + 99900, + 99978, + 99696, + 99871, + 99770, + 99858, + 99726, + 99867, + 99845, + 99815, + 99941, + 99896, + 100179, + 99901, + 99816, + 99753, + 99702, + 99905, + 99941, + 99872, + 99907, + 99903, + 99918, + 99804, + 99923, + 99939, + 99887, + 99925, + 99694, + 99900, + 99916, + 99743, + 99770, + 99791, + 99811, + 100005, + 99898, + 99744, + 100068, + 99885, + 99893, + 99921, + 99768, + 99709, + 99983, + 99797, + 99918, + 99765, + 99873, + 99934, + 99933, + 99788, + 99794, + 99790, + 100006, + 100004, + 99904, + 99927, + 99740, + 99954, + 99964, + 100056, + 99898, + 99798, + 99975, + 99887, + 100048, + 99974, + 99830, + 100054, + 99996, + 99730, + 99955, + 99956, + 99874, + 99934, + 99991, + 99892, + 99716, + 99777, + 100005, + 99914, + 99757, + 99944, + 99780, + 99993, + 99896, + 99879, + 99918, + 99772, + 99954, + 99847, + 99906, + 99986, + 100001, + 100078, + 99756, + 99611, + 99722, + 99837, + 100061, + 100028, + 99956, + 99757, + 99835, + 99992, + 100022, + 99838, + 99772, + 100021, + 99828, + 99949, + 99953, + 100004, + 99780, + 100054, + 100055, + 99801, + 99787, + 99920, + 99995, + 100095, + 99832, + 99979, + 99886, + 99826, + 99809, + 100012, + 99936, + 99887, + 99934, + 99840, + 99903, + 99806, + 99908, + 99843, + 99934, + 99858, + 99969, + 99962, + 99847, + 99962, + 99799, + 99760, + 99664, + 99986, + 99783, + 99956, + 99934, + 99935, + 99985, + 99875, + 99807, + 99872, + 100080, + 99797, + 99994, + 99897, + 99928, + 99851, + 100019, + 99963, + 99820, + 99901, + 100141, + 100023, + 99923, + 99879, + 99953, + 99740, + 99775, + 99850, + 99832, + 99796, + 99931, + 99921, + 99946, + 99765, + 99869, + 100075, + 100051, + 99829, + 99824, + 99912, + 99762, + 100059, + 99817, + 99784, + 99841, + 99806, + 99882, + 99986, + 100037, + 99713, + 99850, + 99788, + 99935, + 99742, + 99697, + 99902, + 99894, + 99893, + 99816, + 99936, + 99877, + 99911, + 99912, + 99941, + 100004, + 99887, + 99652, + 99971, + 99863, + 99919, + 100042, + 99882, + 99910, + 99766, + 99887, + 99953, + 100061, + 99907, + 99769, + 100013, + 99838, + 100004, + 100003, + 99874, + 99871, + 99854, + 99845, + 100006, + 100033, + 99973, + 99922, + 99866, + 99954, + 99948, + 100006, + 99961, + 99826, + 99611, + 99683, + 99955, + 99997, + 99744, + 99988, + 99807, + 99715, + 99934, + 99872, + 99843, + 99972, + 99951, + 99857, + 99866, + 100030, + 99822, + 99812, + 99962, + 99756, + 99918, + 100034, + 99930, + 100010, + 99881, + 100102, + 99955, + 99922, + 99940, + 100072, + 99846, + 99940, + 99788, + 99861, + 99979, + 99820, + 99683, + 99789, + 99943, + 99757, + 99972, + 99797, + 99716, + 99935, + 99783, + 100071, + 100022, + 99914, + 100140, + 99905, + 99981, + 99945, + 99783, + 99901, + 99722, + 99871, + 99806, + 99911, + 99967, + 99912, + 99886, + 99841, + 99762, + 99912, + 99905, + 99907, + 99884, + 99741, + 99958, + 99891, + 99834, + 99749, + 99665, + 99989, + 100071, + 99856, + 99811, + 100081, + 99840, + 100033, + 99740, + 99907, + 99956, + 99868, + 99906, + 99689, + 99752, + 99975, + 99962, + 99997, + 99830, + 99794, + 99751, + 100033, + 99939, + 99768, + 99829, + 99846, + 99861, + 99979, + 99933, + 100087, + 99791, + 99966, + 100006, + 99938, + 100023, + 99846, + 99998, + 99760, + 100024, + 99621, + 99989, + 99925, + 99857, + 100047, + 99876, + 99682, + 99791, + 100040, + 99839, + 99885, + 99750, + 99718, + 99836, + 99974, + 99999, + 99727, + 99843, + 99908, + 99730, + 99704, + 99918, + 99907, + 99823, + 99942, + 99966, + 100020, + 99885, + 99834, + 99924, + 99795, + 99825, + 100043, + 99935, + 100001, + 99785, + 99782, + 99691, + 99789, + 99827, + 99813, + 99747, + 99942, + 99875, + 100101, + 99991, + 99881, + 99832, + 99883, + 99801, + 99939, + 99960, + 99897, + 99897, + 99948, + 99866, + 99939, + 100009, + 99955, + 99944, + 99903, + 99652, + 99778, + 99747, + 99986, + 99900, + 99879, + 99943, + 99875, + 99911, + 99653, + 99669, + 100009, + 99968, + 99962, + 99963, + 99949, + 99946, + 99850, + 99991, + 99916, + 99914, + 99733, + 99887, + 99971, + 99682, + 99920, + 99825, + 99786, + 100009, + 99957, + 99966, + 99844, + 99999, + 99875, + 100048, + 99815, + 99881, + 99922, + 99786, + 99846, + 99921, + 99932, + 99883, + 99879, + 99894, + 99740, + 99851, + 99821, + 99927, + 100082, + 99915, + 99851, + 100053, + 99926, + 99962, + 99875, + 99893, + 99912, + 100062, + 100074, + 99883, + 100002, + 99858, + 99931, + 99915, + 99795, + 99725, + 99812, + 99981, + 99917, + 100044, + 99830, + 100080, + 99845, + 99963, + 99966, + 99938, + 99839, + 99831, + 99963, + 99865, + 99883, + 99884, + 99776, + 99964, + 99921, + 99944, + 100080, + 99750, + 99866, + 99888, + 99906, + 100083, + 99979, + 99849, + 100076, + 100085, + 100070, + 99873, + 99776, + 100120, + 99915, + 100028, + 99896, + 99799, + 100097, + 99941, + 99906, + 100155, + 99900, + 99895, + 99909, + 100034, + 99988, + 99835, + 99752, + 99753, + 99763, + 99994, + 99821, + 99865, + 99893, + 99965, + 100019, + 99914, + 99879, + 99781, + 100103, + 99878, + 99940, + 99984, + 99880, + 99770, + 100099, + 100075, + 99651, + 99938, + 100021, + 100020, + 100078, + 99843, + 99976, + 99919, + 100039, + 100100, + 99778, + 99725, + 99876, + 100066, + 100026, + 99831, + 100095, + 99861, + 100018, + 100113, + 100053, + 99809, + 100010, + 99831, + 99961, + 100018, + 99869, + 99967, + 100110, + 99982, + 99921, + 100024, + 99908, + 99917, + 99882, + 99814, + 99874, + 99610, + 99886, + 100073, + 99936, + 99955, + 99869, + 99976, + 99938, + 99901, + 99857, + 99829, + 99906, + 99843, + 99908, + 99897, + 99874, + 99783, + 100078, + 99868, + 99847, + 99952, + 100044, + 99865, + 99683, + 99976, + 99858, + 99893, + 99882, + 99846, + 99693, + 99987, + 99684, + 99846, + 99922, + 99843, + 99638, + 99814, + 99973, + 99934, + 99842, + 99949, + 99798, + 99963, + 99844, + 99848, + 99950, + 99785, + 99893, + 99865, + 99915, + 99679, + 99778, + 99921, + 99667, + 99816, + 99860, + 99935, + 99731, + 99881, + 99773, + 99774, + 99935, + 100075, + 99867, + 99825, + 99974, + 99863, + 99945, + 99801, + 99895, + 99941, + 99841, + 100021, + 99821, + 99908, + 100050, + 99883, + 99980, + 99978, + 99937, + 99719, + 99976, + 99883, + 99859, + 99882, + 100023, + 99969, + 100091, + 99855, + 100059, + 99957, + 99995, + 99713, + 99969, + 99825, + 99761, + 99958, + 100044, + 99902, + 99956, + 100132, + 99892, + 99950, + 100105, + 99991, + 100030, + 99797, + 99741, + 99765, + 99840, + 99909, + 99937, + 99752, + 99830, + 99749, + 99907, + 99976, + 99892, + 99719, + 100056, + 99886, + 99857, + 99998, + 99693, + 99918, + 99742, + 99934, + 100015, + 100050, + 99808, + 99915, + 99920, + 99911, + 99793, + 99841, + 100012, + 99794, + 100001, + 99757, + 99809, + 99912, + 99827, + 99966, + 99966, + 99846, + 99915, + 99805, + 99919, + 100086, + 99939, + 100049, + 100109, + 99957, + 99883, + 99929, + 99858, + 99814, + 99660, + 99718, + 99832, + 99988, + 100034, + 99996, + 99984, + 99654, + 100034, + 99647, + 99722, + 99860, + 99628, + 100040, + 99946, + 100029, + 99866, + 99649, + 99914, + 99931, + 100014, + 99822, + 99815, + 99948, + 99850, + 99772, + 99857, + 99907, + 99852, + 99844, + 99714, + 99731, + 99949, + 99862, + 99923, + 99733, + 99793, + 99918, + 100132, + 99901, + 99970, + 99702, + 99906, + 99953, + 99958, + 99919, + 99779, + 100084, + 99713, + 99860, + 99852, + 99835, + 100023, + 99892, + 99965, + 99942, + 99817, + 99833, + 99669, + 99823, + 99646, + 99800, + 99733, + 99893, + 99876, + 99932, + 99712, + 100052, + 99940, + 99885, + 100077, + 100037, + 99894 + ], + "sample_count": 1268 + }, + { + "pubkey": "EWN53UdqJ6WvAWqC6yPWNrrCo6soHBkLhVPHKTgPVfKm", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242239000000, + "samples": [ + 240401, + 240439, + 240402, + 240381, + 240414, + 240462, + 240407, + 240474, + 240413, + 240486, + 240402, + 240448, + 240383, + 240376, + 240428, + 240400, + 240334, + 240529, + 240433, + 240439, + 240380, + 240377, + 240426, + 240469, + 240404, + 240378, + 240434, + 240298, + 240428, + 240510, + 240480, + 240416, + 240478, + 240418, + 240426, + 240594, + 240491, + 240447, + 240402, + 240339, + 240381, + 240571, + 240407, + 240408, + 240334, + 240326, + 240431, + 240391, + 240434, + 240482, + 240479, + 240452, + 240454, + 240414, + 240356, + 240466, + 240452, + 240410, + 240463, + 240411, + 240496, + 240464, + 240411, + 240503, + 240458, + 240430, + 240493, + 240337, + 240452, + 240404, + 240396, + 240393, + 240430, + 240419, + 240488, + 240414, + 240313, + 240516, + 240442, + 240490, + 240447, + 240489, + 240677, + 240528, + 240741, + 240469, + 240512, + 240371, + 240443, + 240545, + 240529, + 240400, + 240429, + 240517, + 240848, + 240574, + 241163, + 240366, + 240379, + 240508, + 240503, + 240457, + 240512, + 240534, + 240452, + 241129, + 242058, + 241500, + 240566, + 240461, + 240600, + 240478, + 240313, + 240568, + 240507, + 240512, + 240465, + 240405, + 240451, + 240441, + 240632, + 240589, + 240778, + 240384, + 240576, + 241162, + 241050, + 240572, + 240454, + 240526, + 240375, + 240463, + 240441, + 240419, + 240454, + 240386, + 240427, + 240465, + 240473, + 240393, + 240420, + 240567, + 240468, + 240474, + 240497, + 240537, + 240407, + 240414, + 240480, + 240429, + 240499, + 240433, + 240471, + 240472, + 240448, + 240428, + 240372, + 240402, + 240379, + 240402, + 240499, + 240424, + 240467, + 240406, + 240376, + 240430, + 240398, + 240502, + 240523, + 240430, + 240409, + 240511, + 240373, + 240411, + 240422, + 240402, + 240459, + 240425, + 240388, + 240403, + 240346, + 240424, + 240466, + 240451, + 240469, + 240406, + 240458, + 240293, + 240401, + 240321, + 240377, + 240418, + 240354, + 240418, + 240350, + 240446, + 240396, + 240376, + 240458, + 240420, + 240404, + 240471, + 240456, + 240489, + 240344, + 240423, + 240422, + 240394, + 240407, + 240413, + 240390, + 240458, + 240359, + 240441, + 240405, + 240435, + 240546, + 240457, + 240520, + 240351, + 240359, + 240342, + 240326, + 240392, + 240485, + 240446, + 240381, + 240406, + 240386, + 240402, + 240358, + 240398, + 240418, + 240386, + 240292, + 240356, + 240379, + 240365, + 240409, + 240361, + 240346, + 240406, + 240387, + 240369, + 240382, + 240341, + 240337, + 240426, + 240424, + 240347, + 240353, + 240401, + 240374, + 240379, + 240396, + 240435, + 240389, + 240372, + 240392, + 240383, + 240388, + 240383, + 240382, + 240325, + 240454, + 240438, + 240386, + 240314, + 240378, + 240345, + 240388, + 240393, + 240358, + 240381, + 240420, + 240285, + 240386, + 240401, + 240360, + 240321, + 240396, + 240375, + 240418, + 240387, + 240364, + 240421, + 240396, + 240401, + 240388, + 240391, + 240377, + 240387, + 240406, + 240406, + 240407, + 240389, + 240347, + 240409, + 240453, + 240381, + 240325, + 240358, + 240440, + 240357, + 240405, + 240407, + 240405, + 240351, + 240426, + 240330, + 240401, + 240336, + 240389, + 240370, + 240439, + 240318, + 240441, + 240470, + 240347, + 240389, + 240407, + 240410, + 240399, + 240440, + 240414, + 240367, + 240386, + 240366, + 240407, + 240415, + 240395, + 240345, + 240388, + 240418, + 240416, + 240328, + 240430, + 240367, + 240375, + 240410, + 240362, + 240353, + 240405, + 240389, + 240332, + 240357, + 240379, + 240386, + 240418, + 240450, + 240396, + 240397, + 240452, + 240459, + 240413, + 240416, + 240345, + 240445, + 240343, + 240428, + 240437, + 240383, + 240331, + 240368, + 240437, + 240324, + 240311, + 240398, + 240361, + 240357, + 240352, + 240380, + 240320, + 240319, + 240435, + 240400, + 240366, + 240437, + 240448, + 240437, + 240408, + 240454, + 240433, + 240370, + 240356, + 240390, + 240383, + 240408, + 240342, + 240423, + 240421, + 240343, + 240392, + 240355, + 240363, + 240410, + 240363, + 240383, + 240355, + 240365, + 240375, + 240370, + 240432, + 240348, + 240446, + 240431, + 240328, + 240434, + 240410, + 240423, + 240337, + 240427, + 240352, + 240355, + 240379, + 240394, + 240380, + 240491, + 240368, + 240438, + 240383, + 240354, + 240360, + 240348, + 240379, + 240359, + 240384, + 240378, + 240394, + 240402, + 240378, + 240406, + 240338, + 240368, + 240357, + 240447, + 240419, + 240396, + 240420, + 240378, + 240357, + 240459, + 240402, + 240319, + 240395, + 240439, + 240361, + 240317, + 240397, + 240289, + 240391, + 240419, + 240322, + 240440, + 240341, + 240286, + 240398, + 240338, + 240384, + 240426, + 240356, + 240430, + 240393, + 240318, + 240413, + 240314, + 240476, + 240352, + 240424, + 240383, + 240442, + 240391, + 240431, + 240356, + 240414, + 240370, + 240428, + 240359, + 240365, + 240383, + 240321, + 240435, + 240395, + 240426, + 240445, + 240331, + 240415, + 240392, + 240360, + 240362, + 240344, + 240446, + 240369, + 240478, + 240412, + 240404, + 240350, + 240316, + 240412, + 240348, + 240316, + 240409, + 240423, + 240429, + 240451, + 240468, + 240410, + 240398, + 240368, + 249276, + 240390, + 240444, + 240417, + 240355, + 240479, + 250358, + 240272, + 240436, + 240418, + 240414, + 240386, + 240399, + 240363, + 240408, + 240341, + 240375, + 240354, + 240451, + 240316, + 240436, + 240341, + 240347, + 240377, + 240443, + 240426, + 240384, + 240460, + 240389, + 240330, + 240428, + 240391, + 240459, + 240413, + 240371, + 240432, + 240380, + 240305, + 240408, + 240434, + 240394, + 240346, + 240451, + 240430, + 240385, + 240400, + 240287, + 240389, + 240320, + 240393, + 240413, + 240395, + 240377, + 240313, + 240399, + 240423, + 240476, + 240383, + 240348, + 240409, + 240356, + 240420, + 240402, + 240422, + 240412, + 240459, + 240443, + 240427, + 240357, + 240467, + 240372, + 240441, + 240410, + 240409, + 240323, + 240447, + 240373, + 240420, + 240433, + 240422, + 240439, + 240393, + 240360, + 240391, + 240409, + 240401, + 240345, + 240403, + 240352, + 240408, + 240404, + 240425, + 240349, + 240336, + 240365, + 240410, + 240382, + 240388, + 240462, + 240441, + 240412, + 240464, + 240471, + 240401, + 240401, + 240371, + 240436, + 240382, + 240407, + 240377, + 240406, + 240423, + 240303, + 240342, + 240428, + 240356, + 240348, + 240374, + 240347, + 240458, + 240358, + 240364, + 240465, + 240433, + 240445, + 240449, + 240438, + 240459, + 240330, + 240425, + 240416, + 240403, + 243736, + 240230, + 240161, + 240191, + 240169, + 240196, + 240227, + 240119, + 240195, + 240298, + 240203, + 240204, + 240273, + 240124, + 240247, + 250124, + 240216, + 240155, + 240185, + 240163, + 240218, + 240231, + 240144, + 240256, + 240207, + 240302, + 240150, + 240109, + 240167, + 240160, + 240191, + 240140, + 240258, + 240185, + 240154, + 240177, + 240192, + 240208, + 240145, + 240086, + 240171, + 239233, + 239331, + 239329, + 239276, + 239254, + 239212, + 239318, + 239287, + 240206, + 239304, + 239330, + 239295, + 239207, + 239311, + 239356, + 239290, + 239261, + 239321, + 239278, + 239282, + 239292, + 239288, + 239271, + 239343, + 239312, + 239295, + 239258, + 240156, + 239289, + 239287, + 239316, + 239294, + 239279, + 239333, + 240137, + 240178, + 239264, + 239287, + 239300, + 239289, + 239284, + 240168, + 239364, + 239326, + 239298, + 240231, + 239300, + 239204, + 239207, + 239234, + 239282, + 239387, + 239310, + 239374, + 239296, + 239308, + 239300, + 240168, + 240162, + 239333, + 239271, + 239362, + 239311, + 239249, + 239330, + 239303, + 239239, + 239316, + 239371, + 239379, + 239365, + 240201, + 239379, + 239299, + 240117, + 239313, + 239283, + 239252, + 239353, + 239345, + 239341, + 239202, + 239332, + 239291, + 239337, + 239356, + 239344, + 239210, + 239219, + 239284, + 239319, + 239281, + 239307, + 239268, + 239334, + 239247, + 239214, + 239339, + 239221, + 239338, + 239291, + 239311, + 239315, + 239309, + 239335, + 239366, + 239222, + 239275, + 239300, + 239270, + 239264, + 239294, + 239225, + 239320, + 239368, + 239365, + 239305, + 240221, + 239312, + 242517, + 240338, + 239303, + 239324, + 239225, + 239334, + 239353, + 239331, + 239264, + 239314, + 239313, + 239268, + 239310, + 239220, + 239267, + 239354, + 239332, + 239361, + 239296, + 239372, + 239214, + 239294, + 239298, + 239250, + 239370, + 239385, + 240950, + 239220, + 239332, + 239364, + 240400, + 239293, + 240236, + 239341, + 239244, + 239342, + 239364, + 239304, + 239312, + 239206, + 239308, + 239248, + 239304, + 240279, + 240232, + 240258, + 239291, + 239314, + 240237, + 240269, + 239286, + 239358, + 239272, + 239262, + 239336, + 239326, + 239296, + 239252, + 239275, + 239368, + 239266, + 239270, + 239326, + 239283, + 239340, + 239344, + 239312, + 239257, + 239294, + 239306, + 239314, + 239326, + 239208, + 239346, + 239242, + 239249, + 239311, + 239369, + 239247, + 239208, + 239235, + 239289, + 239274, + 239262, + 239234, + 239309, + 239300, + 239293, + 239291, + 239289, + 239294, + 239303, + 239359, + 240254, + 239313, + 239305, + 239267, + 239314, + 239305, + 239331, + 239327, + 239340, + 239315, + 239351, + 239285, + 239329, + 239253, + 239310, + 239233, + 239301, + 239235, + 239355, + 239349, + 239353, + 239348, + 239259, + 240202, + 239239, + 239339, + 239356, + 240248, + 239292, + 239309, + 239418, + 239300, + 240184, + 239321, + 239270, + 239301, + 239283, + 239385, + 239272, + 239272, + 239363, + 239280, + 239360, + 239269, + 239292, + 239168, + 239283, + 239214, + 240175, + 240104, + 239300, + 239343, + 239270, + 239349, + 239309, + 239317, + 239335, + 239203, + 239351, + 240122, + 240088, + 240169, + 239274, + 240152, + 239284, + 239300, + 239313, + 239307, + 239259, + 240190, + 239322, + 240260, + 239298, + 239274, + 240166, + 239292, + 239327, + 239375, + 239241, + 240228, + 240257, + 239324, + 239320, + 239334, + 239394, + 239297, + 239267, + 239244, + 239265, + 239351, + 239227, + 239271, + 239245, + 239273, + 239252, + 239268, + 239323, + 239298, + 239262, + 239346, + 239333, + 239342, + 239306, + 239279, + 239223, + 239225, + 239309, + 240177, + 239359, + 239249, + 239298, + 239362, + 239302, + 239359, + 239343, + 239308, + 239350, + 239311, + 239371, + 239338, + 239327, + 239298, + 239283, + 239216, + 239171, + 239330, + 239296, + 239177, + 240194, + 239322, + 239273, + 239294, + 239210, + 239360, + 239242, + 239248, + 239271, + 239306, + 239261, + 239315, + 239233, + 239294, + 239289, + 239334, + 239215, + 240183, + 239397, + 239288, + 239319, + 239315, + 239213, + 239374, + 239354, + 239252, + 239210, + 239320, + 239350, + 239403, + 239315, + 239283, + 239340, + 239331, + 239334, + 239316, + 239215, + 239308, + 239253, + 239297, + 239317, + 240152, + 239300, + 239282, + 239277, + 239391, + 239284, + 239279, + 239338, + 239241, + 239288, + 239300, + 239301, + 239295, + 239370, + 239300, + 240124, + 239268, + 240161, + 240179, + 240145, + 239249, + 239259, + 239328, + 239270, + 239312, + 239297, + 239252, + 239357, + 239335, + 239321, + 239227, + 239198, + 239342, + 239286, + 239282, + 239332, + 239242, + 239247, + 239274, + 239310, + 239246, + 239307, + 239356, + 239295, + 239278, + 239317, + 239331, + 239334, + 239326, + 239303, + 240134, + 240126, + 239339, + 239261, + 239322, + 239265, + 239215, + 239278, + 239241, + 239277, + 239280, + 239268, + 239226, + 239338, + 239346, + 240158, + 239337, + 239335, + 240192, + 239341, + 239322, + 239334, + 239278, + 240100, + 240206, + 240116, + 239295, + 239318, + 239351, + 239311, + 239280, + 239340, + 239307, + 239293, + 239278, + 240167, + 239323, + 239363, + 239328, + 239243, + 240094, + 239349, + 239262, + 239321, + 239292, + 239341, + 239264, + 239354, + 239264, + 239345, + 239355, + 239248, + 239292, + 239318, + 239337, + 239247, + 239286, + 239212, + 239330, + 239260, + 239361, + 239201, + 239355, + 239341, + 239347, + 239319, + 239348, + 239359, + 239321, + 239259, + 239251, + 239278, + 239250, + 239357, + 239320, + 239326, + 239300, + 239341, + 239300, + 239322, + 239330, + 239302, + 239302, + 239249, + 239336, + 239187, + 239360, + 239318, + 239230, + 239306, + 239296, + 239262, + 239365, + 240251, + 239345, + 239200, + 239359, + 239234, + 239353, + 239347, + 239292, + 239356, + 239304, + 239263, + 239286, + 239236, + 239461, + 239364, + 239331, + 240140, + 239329, + 239342, + 239272, + 239301, + 239302, + 239314, + 239363, + 239285, + 239333, + 239310, + 239310, + 239357, + 239308, + 239363, + 240183, + 239283, + 239337, + 239298, + 239308, + 239229, + 239267, + 239388, + 239298, + 239282, + 239333, + 239194, + 239342, + 239318, + 239303, + 239330, + 239290, + 239332, + 240196, + 240214, + 240168, + 239231, + 239264, + 239337, + 239255, + 239322, + 239320, + 239337, + 239309, + 239330, + 239300, + 239345 + ], + "sample_count": 1269 + }, + { + "pubkey": "GCH2oGSoFVawhRLmDNBWq9SSg5zSAnTsArFerB7u7Piz", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "target_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242246000000, + "samples": [ + 94056, + 93986, + 94008, + 93954, + 94052, + 94030, + 94026, + 94008, + 94042, + 93986, + 94016, + 94156, + 94058, + 93995, + 94023, + 94025, + 93985, + 94057, + 93986, + 94006, + 94034, + 93932, + 94025, + 94086, + 93960, + 94000, + 94035, + 94028, + 94001, + 94021, + 94025, + 94035, + 94009, + 94053, + 94038, + 94018, + 94098, + 94025, + 94015, + 94019, + 94144, + 94028, + 94025, + 94021, + 94030, + 93988, + 94048, + 94010, + 94058, + 93990, + 94009, + 94047, + 94043, + 94006, + 93979, + 94025, + 93976, + 93994, + 94030, + 94061, + 94005, + 94030, + 94115, + 94002, + 94039, + 94031, + 94003, + 94038, + 93989, + 94051, + 94043, + 94018, + 94056, + 94002, + 94102, + 94017, + 94032, + 93964, + 94074, + 93995, + 94002, + 94131, + 93967, + 93990, + 93934, + 94067, + 94020, + 94063, + 93997, + 93969, + 94099, + 93984, + 93974, + 94059, + 93963, + 94016, + 94037, + 93996, + 93932, + 94000, + 94060, + 93976, + 94055, + 94019, + 94022, + 93985, + 93944, + 93993, + 93938, + 93993, + 94079, + 94043, + 94039, + 94078, + 94055, + 94064, + 94028, + 93977, + 94022, + 94030, + 93989, + 94028, + 94020, + 93974, + 94040, + 94038, + 94026, + 94006, + 95817, + 94067, + 94040, + 94042, + 94066, + 94024, + 94008, + 93991, + 93989, + 94011, + 94023, + 93979, + 94032, + 94049, + 94052, + 94059, + 94031, + 94040, + 94071, + 93991, + 93978, + 94031, + 94054, + 94017, + 93978, + 94046, + 94022, + 94020, + 94024, + 93943, + 94018, + 94074, + 94056, + 94055, + 94005, + 94072, + 94050, + 93991, + 94038, + 93994, + 93995, + 94041, + 93977, + 93992, + 93969, + 94058, + 93999, + 94064, + 94090, + 94066, + 94103, + 94050, + 93999, + 93985, + 94105, + 94003, + 94056, + 94016, + 94068, + 94043, + 96928, + 94080, + 94038, + 94047, + 93989, + 93986, + 94037, + 94068, + 94024, + 94027, + 94039, + 94024, + 93992, + 93940, + 94034, + 94045, + 94070, + 94074, + 94051, + 94062, + 94028, + 94004, + 93995, + 94053, + 93992, + 94005, + 94047, + 94011, + 94036, + 94095, + 94031, + 94008, + 94057, + 94055, + 94054, + 94099, + 94089, + 94086, + 94034, + 93985, + 94040, + 94043, + 94007, + 93974, + 94037, + 94063, + 94047, + 94040, + 93965, + 94021, + 94117, + 94048, + 93953, + 93992, + 94074, + 94058, + 94050, + 94057, + 93932, + 93988, + 93967, + 94038, + 94057, + 94108, + 94007, + 94019, + 94077, + 94029, + 93973, + 93999, + 94001, + 94063, + 94078, + 94042, + 93956, + 94029, + 94045, + 94116, + 94016, + 94049, + 94006, + 94086, + 94022, + 94098, + 94031, + 94097, + 94062, + 94019, + 94030, + 93993, + 94030, + 94043, + 94036, + 94115, + 94051, + 93955, + 94074, + 94068, + 94009, + 94131, + 94041, + 93983, + 94053, + 94048, + 93983, + 94031, + 94069, + 94005, + 94078, + 94001, + 94038, + 94062, + 94044, + 94072, + 94032, + 94098, + 93983, + 94059, + 94047, + 94080, + 94021, + 94045, + 94008, + 94025, + 93953, + 94003, + 93997, + 94113, + 94003, + 94082, + 94005, + 94096, + 93991, + 94033, + 94008, + 93986, + 94058, + 94052, + 94014, + 93956, + 93971, + 94068, + 94077, + 94046, + 94028, + 94061, + 93997, + 93976, + 94086, + 94032, + 94085, + 94043, + 94075, + 94003, + 94033, + 94002, + 94072, + 94081, + 94007, + 94086, + 93988, + 94037, + 94033, + 94022, + 94071, + 94035, + 93967, + 94009, + 94030, + 94028, + 94061, + 93932, + 94022, + 93985, + 94039, + 93987, + 94073, + 94014, + 93966, + 94091, + 94073, + 94071, + 94118, + 93972, + 94086, + 94077, + 94036, + 94066, + 94073, + 94070, + 93961, + 94002, + 94042, + 94095, + 94026, + 93994, + 94021, + 93984, + 94026, + 94057, + 93996, + 94030, + 94056, + 94003, + 93970, + 94075, + 94068, + 94039, + 93953, + 94034, + 94038, + 94042, + 94046, + 93995, + 93988, + 94019, + 94046, + 93988, + 94020, + 93984, + 94073, + 94067, + 94067, + 94061, + 94027, + 94075, + 94028, + 94118, + 94018, + 93937, + 94040, + 94032, + 94065, + 93998, + 94027, + 94087, + 94119, + 94022, + 93985, + 94019, + 94004, + 94027, + 94023, + 94079, + 94040, + 94016, + 93998, + 94069, + 94089, + 94030, + 94015, + 94019, + 94060, + 94017, + 93981, + 94030, + 93995, + 94074, + 94096, + 93987, + 93992, + 94092, + 94100, + 93979, + 94089, + 94062, + 94071, + 93969, + 94066, + 94063, + 94053, + 94002, + 94004, + 94066, + 94039, + 93995, + 94059, + 94021, + 94088, + 94048, + 94035, + 94024, + 94055, + 93988, + 94006, + 94093, + 94039, + 94047, + 93984, + 94014, + 94071, + 94089, + 94026, + 94112, + 94006, + 94055, + 94023, + 94141, + 94036, + 94051, + 94017, + 93968, + 94070, + 94018, + 93986, + 94036, + 94006, + 94072, + 94030, + 94034, + 94049, + 93984, + 94022, + 94077, + 94044, + 94044, + 94018, + 94021, + 94089, + 94092, + 93987, + 94005, + 94073, + 94084, + 94015, + 94003, + 94035, + 93979, + 94063, + 93981, + 94020, + 94044, + 94019, + 93942, + 93918, + 93959, + 94031, + 94004, + 94020, + 94023, + 93905, + 94043, + 94047, + 94101, + 93994, + 94016, + 93957, + 94007, + 94013, + 94033, + 94056, + 94062, + 93990, + 93994, + 94043, + 94015, + 94048, + 93982, + 94021, + 94013, + 94008, + 94003, + 94010, + 93993, + 94028, + 93990, + 94048, + 94014, + 93957, + 94037, + 94022, + 94020, + 93914, + 94021, + 93947, + 94025, + 94036, + 93993, + 93981, + 94105, + 94026, + 93988, + 93995, + 94048, + 94007, + 94005, + 94050, + 94042, + 94048, + 93981, + 94020, + 94066, + 94011, + 94005, + 94036, + 93938, + 94032, + 93961, + 93994, + 94071, + 94018, + 94073, + 93995, + 93992, + 94080, + 94029, + 94062, + 94043, + 94136, + 94058, + 94033, + 94092, + 94057, + 94094, + 94012, + 94053, + 93970, + 94048, + 93961, + 94057, + 93997, + 94052, + 94072, + 93988, + 94002, + 94114, + 94028, + 94065, + 94053, + 93956, + 94008, + 94014, + 94024, + 94044, + 93952, + 93989, + 94101, + 94017, + 94060, + 94003, + 94070, + 94045, + 94030, + 94008, + 93910, + 94022, + 94070, + 94041, + 94035, + 94055, + 94017, + 94029, + 93937, + 94062, + 93899, + 94028, + 94054, + 94057, + 94033, + 93928, + 94037, + 94013, + 93895, + 93990, + 94047, + 94045, + 94027, + 94031, + 94034, + 94095, + 94050, + 94094, + 94012, + 93992, + 94099, + 94056, + 93978, + 94064, + 94029, + 94037, + 94060, + 94007, + 94007, + 94041, + 94134, + 94024, + 94008, + 94028, + 94072, + 94046, + 93992, + 94070, + 94042, + 93993, + 93908, + 94035, + 94026, + 93994, + 94069, + 94087, + 94029, + 93919, + 94066, + 94037, + 93986, + 94078, + 94043, + 94078, + 94038, + 94028, + 94059, + 93958, + 94003, + 94057, + 94091, + 94040, + 94014, + 94083, + 94011, + 94062, + 94030, + 94045, + 93994, + 94069, + 94002, + 94074, + 94083, + 94006, + 94064, + 94015, + 93968, + 94046, + 94057, + 94090, + 94074, + 94062, + 94009, + 94013, + 93993, + 94079, + 94035, + 94037, + 94034, + 93987, + 94059, + 93985, + 94012, + 94003, + 94022, + 93970, + 94030, + 94034, + 94007, + 94011, + 93944, + 94002, + 94019, + 94071, + 94088, + 94032, + 94039, + 94073, + 94081, + 94064, + 94041, + 94066, + 94070, + 94014, + 94023, + 94105, + 93978, + 93974, + 94038, + 94041, + 93971, + 93965, + 94029, + 94027, + 94079, + 93995, + 94041, + 94007, + 94055, + 94002, + 94090, + 94053, + 94026, + 94018, + 94025, + 94050, + 94045, + 93965, + 94016, + 94013, + 94001, + 94047, + 94038, + 94008, + 94063, + 94074, + 94121, + 94045, + 93971, + 94028, + 94050, + 93959, + 94007, + 94057, + 94019, + 94073, + 94071, + 94072, + 94023, + 94040, + 94033, + 94015, + 93992, + 94017, + 93983, + 94034, + 94097, + 94045, + 94070, + 94008, + 94038, + 94033, + 94057, + 94046, + 93998, + 93996, + 94021, + 94106, + 94023, + 93985, + 94005, + 93921, + 93944, + 94041, + 94083, + 94064, + 94093, + 93957, + 94011, + 94061, + 94047, + 94020, + 94016, + 94125, + 94005, + 94036, + 94046, + 94098, + 93985, + 94056, + 93986, + 94046, + 94105, + 94032, + 94122, + 94038, + 94043, + 93994, + 94008, + 94060, + 94038, + 94083, + 93982, + 94039, + 94058, + 94050, + 93999, + 94060, + 94011, + 94037, + 94055, + 94047, + 94011, + 94082, + 94032, + 94092, + 94084, + 94125, + 93997, + 94056, + 94096, + 94050, + 94081, + 94026, + 94084, + 94028, + 94029, + 94054, + 94052, + 94035, + 94084, + 94021, + 94071, + 94061, + 93993, + 93903, + 94050, + 94038, + 94053, + 93991, + 94015, + 94000, + 94002, + 94080, + 94050, + 94018, + 94100, + 93993, + 94028, + 94022, + 94012, + 94029, + 94019, + 94120, + 94056, + 93944, + 94108, + 94027, + 94086, + 94077, + 94050, + 94003, + 94066, + 94029, + 94011, + 94109, + 94030, + 94045, + 94048, + 94016, + 93980, + 94061, + 94034, + 94051, + 94081, + 94089, + 94030, + 94020, + 94091, + 94038, + 94076, + 94057, + 94017, + 94037, + 94071, + 94021, + 94018, + 93981, + 94142, + 94067, + 94028, + 93997, + 94032, + 94046, + 94041, + 94031, + 94079, + 94003, + 94059, + 93992, + 93997, + 93994, + 94034, + 94096, + 94097, + 94029, + 94042, + 94011, + 93995, + 94022, + 94015, + 94035, + 93978, + 93980, + 94018, + 93989, + 93933, + 94023, + 94016, + 94026, + 93956, + 94012, + 93995, + 94014, + 94129, + 94106, + 94022, + 94008, + 94023, + 94001, + 94013, + 94012, + 93967, + 94036, + 94034, + 94013, + 94019, + 94012, + 93981, + 94037, + 94058, + 94016, + 94011, + 94032, + 93994, + 94006, + 94030, + 94025, + 94093, + 93976, + 94045, + 94033, + 94009, + 93985, + 94026, + 94028, + 94019, + 93951, + 94051, + 94049, + 94096, + 94032, + 94020, + 94051, + 94114, + 93997, + 94039, + 93994, + 94054, + 94002, + 93999, + 94080, + 94069, + 94040, + 94030, + 94042, + 94017, + 93996, + 94139, + 94032, + 94036, + 94030, + 93966, + 94052, + 94060, + 94091, + 94027, + 94044, + 94027, + 94021, + 94024, + 93990, + 93989, + 93940, + 94015, + 94005, + 94000, + 94136, + 94062, + 94029, + 94044, + 93972, + 94061, + 93969, + 93969, + 94011, + 94028, + 94040, + 94011, + 94026, + 93961, + 93926, + 94022, + 94026, + 94011, + 93907, + 94023, + 94023, + 93999, + 94141, + 93982, + 94097, + 94009, + 93985, + 94040, + 94076, + 93975, + 93783, + 94046, + 94117, + 93727, + 94011, + 94026, + 93766, + 94007, + 93982, + 94038, + 94022, + 94039, + 94071, + 94023, + 93952, + 94033, + 94023, + 94150, + 94023, + 94101, + 94053, + 93999, + 94019, + 93989, + 94021, + 94075, + 94037, + 94010, + 94021, + 94050, + 93903, + 94089, + 94062, + 94029, + 94009, + 94042, + 94044, + 94055, + 94090, + 94059, + 93929, + 94004, + 94089, + 94020, + 94015, + 94063, + 94075, + 94024, + 94030, + 94030, + 93967, + 93997, + 94057, + 93981, + 93998, + 94011, + 93933, + 94044, + 94046, + 93995, + 93953, + 94062, + 94000, + 94035, + 94038, + 93980, + 94029, + 94009, + 94087, + 94050, + 93989, + 94032, + 94037, + 94054, + 94074, + 94034, + 94014, + 94029, + 94030, + 94046, + 93969, + 93996, + 94032, + 94005, + 94017, + 93950, + 93975, + 93973, + 94024, + 94008, + 94022, + 94128, + 94069, + 94017, + 94046, + 94007, + 94076, + 94005, + 94014, + 94043, + 93980, + 94020, + 94018, + 94074, + 94009, + 94036, + 93989, + 93971, + 94044, + 93929, + 94036, + 93986, + 94036, + 93930, + 94071, + 93994, + 94014, + 93887, + 94016, + 94061, + 94021, + 94051, + 93942, + 93950, + 94009, + 94041, + 94003, + 94070, + 94033, + 93972, + 94002, + 93945, + 94038, + 94011, + 94081, + 94022, + 93948, + 93977, + 94010, + 94053, + 93962, + 94012, + 94041, + 93967, + 94023, + 93901, + 93977, + 94092, + 94019, + 94086, + 94065, + 93963, + 94064, + 94015, + 94002, + 93997, + 93960, + 94026, + 93993, + 94029, + 93970, + 94050, + 93940, + 94039, + 94066, + 94059, + 94017, + 94024, + 93962, + 94011, + 93994, + 93961, + 94034, + 94002, + 94027, + 93989, + 94047, + 93977, + 94006, + 93967, + 94012, + 94013, + 94009, + 94080, + 94036, + 93969, + 94039, + 93968, + 94050, + 94040, + 93991 + ], + "sample_count": 1270 + }, + { + "pubkey": "5RMMZAU6MKmsVepskvpsHMmtZPDUM85VqAF3vuqMqVrZ", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "3AXerrjbk3uRwWmbnKcE7FDKHRQpXysQ5T2igyxEZvbB", + "target_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242237000000, + "samples": [ + 100829, + 91922, + 98683, + 98839, + 92013, + 98656, + 92086, + 101064, + 91975, + 98655, + 92176, + 98648, + 98173, + 92308, + 98814, + 98558, + 98558, + 92075, + 98174, + 98562, + 92312, + 100972, + 98184, + 91977, + 98218, + 101151, + 98194, + 99499, + 98582, + 98656, + 100987, + 92313, + 98675, + 92126, + 98689, + 91894, + 100155, + 98811, + 98509, + 98647, + 98597, + 91939, + 98281, + 91921, + 91873, + 91944, + 92084, + 98459, + 100102, + 98686, + 98383, + 98881, + 98474, + 100214, + 98779, + 98318, + 98616, + 98605, + 98680, + 98389, + 98204, + 100124, + 98520, + 98622, + 98915, + 101192, + 92319, + 98380, + 98566, + 92275, + 92258, + 92227, + 98237, + 98705, + 98817, + 91975, + 98709, + 98143, + 102858, + 100996, + 91953, + 92102, + 92023, + 98763, + 98355, + 100912, + 100111, + 100306, + 98518, + 100034, + 98827, + 100916, + 91946, + 92276, + 100977, + 98583, + 98629, + 92085, + 92135, + 92378, + 98326, + 100258, + 91785, + 92168, + 92051, + 92381, + 91962, + 98228, + 91929, + 101331, + 98886, + 91957, + 92311, + 98602, + 98729, + 101936, + 98782, + 100942, + 98623, + 100190, + 92467, + 101061, + 98648, + 101197, + 98632, + 98206, + 98594, + 98697, + 100376, + 98644, + 100141, + 92354, + 98648, + 91897, + 92272, + 92065, + 98262, + 100935, + 100943, + 92110, + 98636, + 92368, + 98993, + 98785, + 101200, + 100982, + 98657, + 98744, + 92001, + 98658, + 98977, + 98894, + 92190, + 100115, + 92022, + 91866, + 92277, + 92264, + 98566, + 94674, + 101193, + 98533, + 91905, + 92221, + 98726, + 98600, + 98706, + 98606, + 100913, + 92108, + 101399, + 98255, + 98458, + 101129, + 98273, + 100887, + 98309, + 92017, + 98257, + 92194, + 92173, + 100157, + 92039, + 98220, + 92045, + 98684, + 100901, + 91899, + 100967, + 98634, + 98586, + 92343, + 92106, + 91829, + 98448, + 98619, + 98560, + 92091, + 93049, + 91826, + 100240, + 92173, + 100880, + 98604, + 98407, + 92209, + 92440, + 91956, + 101159, + 92180, + 100169, + 91975, + 91903, + 100889, + 92434, + 92058, + 98684, + 98385, + 98393, + 92460, + 92065, + 98615, + 98259, + 98944, + 92119, + 100988, + 100152, + 98998, + 92024, + 98584, + 92056, + 98651, + 98665, + 100270, + 101063, + 91940, + 98222, + 92051, + 92000, + 102642, + 100166, + 116932, + 91916, + 98284, + 98255, + 98314, + 100326, + 98365, + 98597, + 98650, + 98987, + 98593, + 98612, + 98789, + 98657, + 92117, + 101141, + 92228, + 98671, + 98720, + 91937, + 99002, + 92299, + 100929, + 92057, + 98498, + 92313, + 98632, + 98269, + 92432, + 98983, + 98686, + 98707, + 92032, + 98299, + 98602, + 92609, + 101281, + 98431, + 91851, + 98227, + 100901, + 98203, + 98506, + 98924, + 98793, + 101092, + 92140, + 98660, + 91965, + 98619, + 92406, + 100338, + 98819, + 98181, + 98852, + 98520, + 91942, + 98309, + 91973, + 91860, + 92207, + 91966, + 98794, + 100301, + 99154, + 98161, + 110681, + 98222, + 100196, + 107492, + 98325, + 98746, + 98558, + 98478, + 98413, + 98121, + 100071, + 98827, + 98944, + 98618, + 101004, + 674445, + 98247, + 98576, + 92313, + 92171, + 91845, + 98286, + 98610, + 98611, + 91857, + 98618, + 98247, + 100111, + 100935, + 92126, + 92541, + 92162, + 98507, + 98311, + 100898, + 100022, + 100180, + 98785, + 100109, + 98698, + 101036, + 91952, + 92292, + 101110, + 98625, + 98770, + 92275, + 92256, + 92179, + 98158, + 100043, + 92090, + 92676, + 91912, + 92054, + 91988, + 98156, + 91946, + 100903, + 98571, + 91923, + 91916, + 98509, + 98605, + 100937, + 98580, + 100946, + 98961, + 100627, + 92100, + 101060, + 98712, + 101043, + 98717, + 98292, + 98734, + 98678, + 100153, + 98475, + 100132, + 91798, + 98566, + 92001, + 92119, + 91733, + 98329, + 100952, + 100949, + 91974, + 98578, + 92314, + 99637, + 98564, + 100847, + 100986, + 98768, + 98486, + 91982, + 98712, + 98601, + 98847, + 92142, + 100159, + 91870, + 91890, + 92334, + 91913, + 98423, + 92246, + 100863, + 98540, + 91927, + 92184, + 98575, + 99580, + 98525, + 98217, + 100918, + 92249, + 100904, + 99090, + 98293, + 101080, + 98199, + 100837, + 98148, + 91848, + 98156, + 92257, + 92180, + 100251, + 91928, + 98509, + 91959, + 99871, + 101138, + 91895, + 100785, + 98539, + 101766, + 92459, + 92233, + 92145, + 98746, + 98542, + 98759, + 91875, + 91990, + 92155, + 100035, + 91991, + 100873, + 98746, + 98360, + 92081, + 92017, + 91968, + 100882, + 92132, + 100163, + 92073, + 91804, + 100861, + 92267, + 91944, + 100056, + 98316, + 98216, + 92007, + 91835, + 98769, + 98246, + 98581, + 92380, + 100971, + 100032, + 98695, + 92276, + 98896, + 91932, + 98959, + 98267, + 100129, + 100925, + 91971, + 98113, + 91947, + 91896, + 98720, + 100172, + 98707, + 92112, + 98210, + 98276, + 98309, + 100146, + 98325, + 98640, + 98636, + 98459, + 98649, + 98479, + 98673, + 98588, + 92042, + 100914, + 92002, + 98729, + 98552, + 91989, + 99116, + 92290, + 102793, + 92058, + 98654, + 92221, + 98601, + 98543, + 92220, + 98530, + 98654, + 98626, + 100841, + 98317, + 98568, + 92061, + 100977, + 98286, + 92049, + 98379, + 101020, + 98299, + 98609, + 98770, + 98531, + 101073, + 92353, + 98770, + 92223, + 98615, + 91994, + 100067, + 98679, + 98306, + 98785, + 98646, + 91851, + 98250, + 92130, + 91873, + 92130, + 91872, + 98171, + 100293, + 98622, + 98340, + 98580, + 98283, + 100125, + 98546, + 98628, + 98584, + 98600, + 98679, + 98332, + 98375, + 100052, + 98538, + 98574, + 98553, + 101899, + 92305, + 98346, + 98769, + 92220, + 98480, + 91977, + 98262, + 98262, + 98517, + 91990, + 98660, + 98264, + 100253, + 100977, + 91740, + 92218, + 91982, + 100259, + 98709, + 100869, + 100202, + 100021, + 98773, + 100084, + 92165, + 100912, + 92002, + 92209, + 101107, + 98780, + 98486, + 91895, + 92086, + 98360, + 98318, + 100189, + 92010, + 92310, + 91944, + 92011, + 91966, + 98379, + 92125, + 100901, + 98699, + 92094, + 91908, + 98635, + 98393, + 100883, + 98462, + 101123, + 98750, + 100136, + 92147, + 100981, + 100879, + 101016, + 98539, + 99177, + 98502, + 98587, + 100251, + 98565, + 100007, + 91963, + 98638, + 91988, + 92288, + 92000, + 98350, + 100865, + 100967, + 92495, + 98589, + 92132, + 98685, + 98575, + 100841, + 100907, + 98604, + 98698, + 92032, + 98680, + 98583, + 98716, + 92306, + 100275, + 92014, + 91959, + 92314, + 91954, + 98551, + 92171, + 101134, + 98460, + 92127, + 92470, + 98606, + 98702, + 98691, + 98432, + 98733, + 92150, + 101347, + 98251, + 98156, + 100962, + 98363, + 100909, + 98238, + 92003, + 98444, + 92243, + 92258, + 100163, + 91919, + 98287, + 91932, + 98872, + 100891, + 92102, + 100910, + 99083, + 98532, + 92099, + 92586, + 91889, + 98301, + 98691, + 98593, + 91949, + 91915, + 98460, + 100857, + 91833, + 100911, + 98627, + 98232, + 92094, + 92340, + 91824, + 100894, + 92126, + 100281, + 92181, + 91910, + 101119, + 92113, + 92197, + 101313, + 98170, + 98320, + 92355, + 92072, + 98777, + 98371, + 98621, + 91964, + 100848, + 100207, + 98645, + 92084, + 98817, + 92185, + 98539, + 98462, + 98503, + 100906, + 92114, + 98399, + 91945, + 92147, + 98501, + 100197, + 98515, + 91846, + 98211, + 98389, + 98405, + 100206, + 98197, + 98807, + 100892, + 98670, + 98538, + 98577, + 98741, + 98621, + 91973, + 101016, + 92253, + 98614, + 98488, + 91994, + 98957, + 94798, + 100858, + 91892, + 98653, + 92608, + 98780, + 98325, + 92129, + 98725, + 98625, + 98496, + 100911, + 98144, + 98510, + 92299, + 643938, + 98194, + 92108, + 98168, + 101108, + 98371, + 98745, + 98527, + 98620, + 101457, + 92418, + 98721, + 91989, + 98658, + 91922, + 100068, + 98821, + 98235, + 98572, + 98640, + 92033, + 98190, + 92498, + 92062, + 92000, + 92063, + 98320, + 100292, + 98761, + 98271, + 98651, + 98213, + 100461, + 98637, + 98400, + 98524, + 98599, + 102468, + 98753, + 98518, + 100279, + 98633, + 98568, + 98720, + 100968, + 92087, + 98241, + 98556, + 92229, + 98726, + 92215, + 98276, + 98587, + 98636, + 91873, + 98611, + 98389, + 100155, + 101148, + 92004, + 92156, + 91996, + 98638, + 98816, + 100920, + 100056, + 100164, + 98684, + 100177, + 92140, + 100964, + 91941, + 92042, + 102313, + 98614, + 98679, + 91889, + 91880, + 99345, + 98317, + 100157, + 91947, + 92168, + 91891, + 91871, + 91930, + 98406, + 91826, + 101201, + 98667, + 91968, + 91875, + 98581, + 98158, + 100981, + 98576, + 100856, + 98925, + 100300, + 92234, + 101099, + 101222, + 100970, + 98571, + 98343, + 98563, + 98672, + 100213, + 98526, + 100124, + 92112, + 92377, + 91920, + 98327, + 101228, + 101058, + 92354, + 98696, + 92073, + 98587, + 98643, + 100906, + 100955, + 98747, + 98603, + 92002, + 98565, + 98595, + 98755, + 92397, + 100148, + 91893, + 91893, + 92363, + 92363, + 98648, + 92253, + 100968, + 98700, + 92032, + 92302, + 98656, + 98714, + 98467, + 98215, + 98561, + 92491, + 101260, + 99121, + 99121, + 101210, + 98347, + 101057, + 98251, + 92084, + 98449, + 92133, + 92401, + 100215, + 92081, + 98330, + 98330, + 98608, + 101077, + 91858, + 100905, + 98547, + 98627, + 92029, + 92377, + 91844, + 98354, + 98648, + 98577, + 91907, + 92022, + 98756, + 100140, + 92226, + 92226, + 98715, + 98765, + 92167, + 92335, + 92260, + 100903, + 92040, + 100107, + 92524, + 91939, + 101085, + 92443, + 91891, + 100806, + 98379, + 98197, + 98197, + 91938, + 98766, + 98250, + 98611, + 92074, + 100943, + 100481, + 99737, + 91911, + 98747, + 91947, + 98569, + 98183, + 98569, + 102632, + 92140, + 98258, + 92205, + 91892, + 98866, + 100169, + 98668, + 91929, + 98154, + 98429, + 98187, + 100079, + 98232, + 98660, + 98660, + 99191, + 98556, + 98691, + 101195, + 98702, + 92100, + 100926, + 93236, + 98504, + 98600, + 91885, + 98596, + 92284, + 101013, + 91920, + 98582, + 92286, + 98552, + 98309, + 92205, + 98569, + 98569, + 98615, + 100953, + 100581, + 98855, + 92166, + 100834, + 98466, + 92269, + 98499, + 100900, + 100868, + 98938, + 98591, + 98944, + 101052, + 92196, + 98616, + 91996, + 98725, + 91900, + 100178, + 98677, + 98261, + 98611, + 98611, + 92434, + 98365, + 92106, + 92237, + 91996, + 91861, + 98102, + 100451, + 98756, + 98226, + 98773, + 98197, + 98197, + 98630, + 98162, + 98950, + 98618, + 98741, + 98256, + 99774, + 100354, + 98712, + 98589, + 98582, + 101142, + 92661, + 98156, + 98541, + 92288, + 98648, + 91821, + 98223, + 98665, + 98765, + 92115, + 99363, + 98244, + 100178, + 100959, + 91828, + 92387, + 91938, + 98739, + 98737, + 100963, + 100235, + 100291, + 98749, + 100114, + 91957, + 91957, + 92133, + 92345, + 100977, + 98668, + 98606, + 92061, + 91838, + 98503, + 98287, + 100228, + 92039, + 92039, + 92022, + 91974, + 92013, + 98291, + 92277, + 100959, + 98562, + 98562, + 91822, + 98650, + 98198, + 101005, + 98581, + 98581, + 98652, + 100086, + 92259, + 101220, + 100929, + 100892, + 98623, + 98196, + 129135, + 98645, + 100116, + 98639, + 100228, + 100228, + 98540, + 91835, + 91835, + 91894, + 98594, + 100920, + 100934, + 91945, + 98994, + 92346, + 98674, + 98535, + 100954, + 100954, + 98640, + 99001, + 91920, + 99063, + 98737, + 98811, + 93419, + 93419, + 92019, + 91854, + 92268, + 91898, + 98736, + 92243, + 101074, + 99459, + 91930, + 91930, + 98577, + 98685, + 98906, + 98517, + 98904, + 98406, + 100879, + 98615, + 98557, + 101131, + 98594, + 101251, + 98679, + 100896, + 98645, + 98645, + 98433, + 101195, + 100828, + 98944, + 92187, + 98591, + 100965, + 92170, + 101079, + 98532, + 98992, + 92176, + 92219, + 91906, + 100254, + 100254, + 98525, + 91844, + 92111, + 98640, + 98669, + 98669, + 100864, + 98746, + 98746, + 92433, + 92223, + 91883, + 101038, + 92281, + 100289, + 92382, + 92382, + 101158, + 92599, + 92068, + 100926, + 98361, + 92122, + 92231, + 92007, + 98765, + 98502, + 98675, + 92012, + 100985, + 100564, + 98525, + 92182, + 98714, + 91892, + 98775, + 98775, + 98554, + 100966, + 92333, + 98256, + 91956, + 91826, + 98855, + 98687, + 98566, + 91881, + 98629, + 98094, + 98345, + 100024, + 98136, + 98741 + ], + "sample_count": 1271 + }, + { + "pubkey": "HBpa3qwn8CFjE7FGEDqFERcBdjvSVkdBFqULTq2KguJZ", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242237000000, + "samples": [ + 244800, + 244907, + 245121, + 244982, + 244987, + 244938, + 245101, + 245016, + 245386, + 245104, + 261017, + 245098, + 245230, + 247233, + 245079, + 245126, + 245129, + 245256, + 262415, + 245070, + 245330, + 245297, + 245018, + 245265, + 246725, + 283820, + 281335, + 252870, + 284666, + 245280, + 255919, + 245378, + 247430, + 249872, + 245180, + 257267, + 245148, + 245188, + 267921, + 245533, + 245281, + 293150, + 280915, + 245129, + 245211, + 276173, + 272612, + 245096, + 285299, + 254189, + 268454, + 294548, + 288807, + 286005, + 265153, + 309484, + 295389, + 251787, + 295578, + 302304, + 288395, + 295643, + 305462, + 325801, + 278849, + 301352, + 315020, + 320510, + 329760, + 307198, + 314466, + 308618, + 266187, + 275497, + 315059, + 336899, + 330074, + 311485, + 324769, + 316974, + 350818, + 368545, + 278572, + 338293, + 352765, + 348743, + 351072, + 340005, + 357708, + 344608, + 326361, + 364718, + 356030, + 360744, + 329497, + 364930, + 351969, + 355624, + 369191, + 376711, + 361632, + 345559, + 324439, + 347892, + 346204, + 340965, + 377113, + 368692, + 374450, + 340158, + 355331, + 355185, + 366544, + 320890, + 366486, + 352803, + 351870, + 357028, + 370809, + 359767, + 336508, + 375096, + 359904, + 375368, + 350065, + 330667, + 326778, + 297684, + 259343, + 282580, + 272833, + 316842, + 292353, + 364632, + 320748, + 334440, + 285011, + 301041, + 335629, + 308637, + 341368, + 315660, + 314481, + 315134, + 258771, + 283129, + 312508, + 305803, + 249104, + 264813, + 257901, + 251487, + 260043, + 254926, + 261202, + 257858, + 269015, + 264706, + 263001, + 265528, + 245052, + 276124, + 277869, + 297350, + 279632, + 312713, + 262971, + 251849, + 248187, + 248014, + 269931, + 247718, + 285072, + 303978, + 285028, + 250943, + 259321, + 245821, + 245082, + 247322, + 276732, + 265649, + 248733, + 246081, + 269000, + 245124, + 273461, + 293743, + 247959, + 254934, + 245168, + 245176, + 244910, + 245041, + 244954, + 245058, + 244968, + 245205, + 244992, + 244973, + 244893, + 245142, + 245027, + 244959, + 244951, + 245209, + 245047, + 245124, + 245084, + 244929, + 245108, + 245060, + 244969, + 244990, + 244953, + 245140, + 245122, + 244930, + 245093, + 244963, + 245021, + 244918, + 244999, + 244748, + 244982, + 245098, + 245074, + 244896, + 244951, + 244991, + 244932, + 245007, + 245027, + 244996, + 244947, + 245052, + 244990, + 244980, + 245060, + 244991, + 244886, + 244997, + 244993, + 244995, + 245131, + 245061, + 244815, + 244877, + 244714, + 244807, + 244855, + 244786, + 244833, + 244904, + 244833, + 244857, + 244876, + 244820, + 244921, + 244945, + 244856, + 244938, + 244816, + 244918, + 244816, + 244853, + 244804, + 245011, + 244750, + 244740, + 244793, + 245002, + 244879, + 244892, + 244960, + 244936, + 244864, + 244904, + 244832, + 244907, + 244058, + 244552, + 244633, + 244553, + 244738, + 244617, + 244676, + 244560, + 244723, + 244657, + 244647, + 244477, + 244611, + 244674, + 244545, + 244679, + 244545, + 244599, + 244613, + 244449, + 244518, + 244704, + 244622, + 244705, + 244737, + 244614, + 244692, + 244710, + 244619, + 244684, + 244648, + 244556, + 244637, + 244549, + 244480, + 244723, + 244585, + 244655, + 244595, + 244578, + 244767, + 244532, + 244631, + 244637, + 244589, + 244600, + 244489, + 244593, + 244604, + 244704, + 244584, + 244562, + 244524, + 244701, + 244695, + 244731, + 244617, + 244617, + 244754, + 244632, + 244703, + 244594, + 244512, + 244648, + 244571, + 244671, + 244686, + 244730, + 244547, + 244723, + 244650, + 244708, + 244447, + 244763, + 244609, + 244626, + 244608, + 244688, + 244533, + 244497, + 244646, + 244700, + 244489, + 244647, + 244713, + 244645, + 244601, + 244513, + 244498, + 244611, + 244674, + 244571, + 244657, + 244603, + 244701, + 244519, + 244595, + 244757, + 244540, + 244610, + 244665, + 244690, + 244597, + 244652, + 244528, + 244731, + 244784, + 244614, + 244653, + 244640, + 244552, + 244574, + 244626, + 244707, + 244675, + 244557, + 244523, + 244677, + 244733, + 244693, + 244710, + 244558, + 244660, + 244538, + 244680, + 244597, + 244685, + 244538, + 244636, + 244403, + 244718, + 244567, + 244616, + 244639, + 244690, + 244595, + 244738, + 244631, + 244545, + 244492, + 244638, + 244516, + 244696, + 244495, + 244602, + 244566, + 244676, + 244645, + 244551, + 244524, + 244700, + 244543, + 244613, + 244555, + 244668, + 245567, + 256673, + 258954, + 252433, + 256125, + 253079, + 250453, + 246793, + 254628, + 250083, + 248693, + 248281, + 251567, + 246740, + 251201, + 253652, + 247030, + 248899, + 249789, + 249877, + 256185, + 250219, + 259978, + 247321, + 248909, + 247664, + 259132, + 249765, + 249798, + 252240, + 255022, + 248241, + 249845, + 248854, + 257483, + 250874, + 256180, + 252081, + 249888, + 249138, + 247961, + 253618, + 258067, + 250927, + 254050, + 254713, + 254998, + 255616, + 261576, + 258019, + 259701, + 251186, + 255415, + 261024, + 255124, + 263466, + 259220, + 251278, + 253817, + 255033, + 253981, + 258175, + 257730, + 257243, + 251558, + 252668, + 254015, + 258738, + 260517, + 260524, + 253225, + 261190, + 258447, + 257757, + 257714, + 257998, + 259132, + 260748, + 251168, + 255536, + 255826, + 254845, + 254811, + 253159, + 250900, + 252962, + 253844, + 254467, + 254602, + 254449, + 250920, + 250939, + 249726, + 257384, + 259848, + 256596, + 247684, + 254980, + 255640, + 244919, + 255217, + 250258, + 250172, + 254251, + 247847, + 247486, + 255916, + 248195, + 248369, + 251769, + 248875, + 252744, + 254066, + 249641, + 254973, + 256024, + 249812, + 254415, + 256557, + 252270, + 255140, + 250721, + 258896, + 255193, + 250721, + 252078, + 251207, + 257738, + 254000, + 249286, + 254748, + 259927, + 248624, + 249030, + 257757, + 259288, + 253289, + 253684, + 253415, + 255850, + 247448, + 250323, + 253392, + 256230, + 258704, + 251033, + 244941, + 244876, + 249350, + 244789, + 244608, + 244641, + 244644, + 244611, + 244707, + 244846, + 244704, + 244545, + 244709, + 244474, + 244570, + 244690, + 244606, + 244735, + 244635, + 244574, + 244585, + 244719, + 244571, + 244704, + 244708, + 244622, + 244722, + 244586, + 244793, + 244697, + 244612, + 244590, + 244664, + 244438, + 244515, + 244704, + 244628, + 244769, + 244587, + 244660, + 244780, + 244737, + 244602, + 244588, + 244618, + 244732, + 244784, + 244552, + 244643, + 244528, + 244688, + 244626, + 244663, + 244672, + 244732, + 244704, + 244676, + 244692, + 244653, + 244743, + 245700, + 245760, + 245548, + 245591, + 245611, + 245553, + 245733, + 245556, + 245679, + 245693, + 245434, + 245546, + 245626, + 245550, + 245671, + 245711, + 245640, + 245594, + 245583, + 245712, + 245718, + 245753, + 245598, + 245623, + 245714, + 245725, + 245753, + 245586, + 245629, + 245679, + 245562, + 245637, + 245621, + 245622, + 253640, + 245642, + 245701, + 245867, + 245775, + 245747, + 245795, + 245728, + 245920, + 245789, + 245763, + 245754, + 245868, + 245872, + 245845, + 245833, + 245654, + 245865, + 245812, + 245737, + 245739, + 245649, + 245758, + 245794, + 245756, + 245722, + 245899, + 245855, + 245911, + 245846, + 245791, + 245795, + 246415, + 246336, + 246411, + 246322, + 246191, + 246279, + 246388, + 246374, + 246542, + 246495, + 246490, + 246345, + 246224, + 246301, + 246418, + 246474, + 246556, + 246529, + 255345, + 255271, + 255254, + 255380, + 255173, + 255255, + 255270, + 255291, + 255254, + 255399, + 255329, + 255277, + 255228, + 255283, + 255379, + 255446, + 255365, + 255317, + 255246, + 255259, + 255395, + 255223, + 255308, + 255238, + 255264, + 255284, + 255309, + 255326, + 255408, + 255246, + 255177, + 255423, + 255217, + 255175, + 255345, + 255448, + 245779, + 245875, + 271965, + 303592, + 267357, + 245876, + 255627, + 258439, + 255601, + 255749, + 256363, + 255722, + 256610, + 257524, + 255453, + 255523, + 255383, + 255772, + 255460, + 255189, + 256661, + 255330, + 256735, + 256379, + 255528, + 255747, + 256120, + 258284, + 258000, + 256041, + 266673, + 257130, + 261935, + 264158, + 259113, + 266334, + 261954, + 271205, + 263106, + 259892, + 264757, + 262309, + 257928, + 257720, + 265207, + 266364, + 263952, + 255615, + 265730, + 267379, + 267166, + 259077, + 267094, + 261815, + 260089, + 261630, + 260336, + 255630, + 255324, + 255409, + 255140, + 255350, + 255276, + 255221, + 255386, + 255404, + 255388, + 255350, + 255266, + 255284, + 255400, + 255360, + 255235, + 255379, + 255397, + 255394, + 255515, + 255320, + 255377, + 259724, + 255480, + 255372, + 255317, + 255328, + 259750, + 255259, + 255401, + 255385, + 255334, + 255303, + 255261, + 265660, + 259594, + 258408, + 255518, + 259634, + 256024, + 255510, + 255339, + 255255, + 255292, + 255424, + 255497, + 255396, + 255358, + 255395, + 255219, + 267983, + 257333, + 255820, + 255330, + 255380, + 255471, + 255303, + 255328, + 255177, + 255316, + 255174, + 255329, + 255290, + 255284, + 255261, + 255323, + 255299, + 255428, + 255268, + 255342, + 255200, + 255224, + 255186, + 255305, + 255300, + 255320, + 255361, + 255360, + 255456, + 255422, + 255438, + 255426, + 255317, + 255310, + 255410, + 255338, + 255343, + 255316, + 255160, + 255312, + 255209, + 255355, + 255358, + 255241, + 255282, + 255288, + 255385, + 255471, + 255422, + 255221, + 255230, + 255316, + 255358, + 255369, + 255317, + 255357, + 255293, + 255424, + 255259, + 255294, + 255476, + 255319, + 255400, + 255264, + 255312, + 255256, + 255365, + 255319, + 255174, + 255262, + 255465, + 255324, + 255304, + 255342, + 255263, + 255413, + 255317, + 255314, + 255249, + 255244, + 255507, + 255355, + 255265, + 255256, + 255275, + 255281, + 255389, + 255355, + 255415, + 255462, + 255134, + 255114, + 255166, + 255374, + 255298, + 255369, + 255427, + 255450, + 255406, + 255271, + 255265, + 255349, + 255435, + 255391, + 255230, + 255234, + 255360, + 255390, + 255183, + 255323, + 255360, + 255340, + 255304, + 255378, + 255431, + 255417, + 255082, + 255238, + 255141, + 255297, + 255296, + 255278, + 255362, + 255455, + 255240, + 255482, + 255258, + 255272, + 255295, + 255304, + 255401, + 255399, + 255433, + 255344, + 255342, + 255331, + 255356, + 255416, + 255338, + 255347, + 255344, + 255359, + 255361, + 255299, + 255429, + 255368, + 255407, + 255289, + 255319, + 255259, + 255235, + 255296, + 255386, + 255376, + 255174, + 255281, + 255339, + 255174, + 255277, + 255143, + 255322, + 255236, + 255376, + 255226, + 255227, + 255229, + 255198, + 255218, + 255274, + 255384, + 255192, + 255345, + 255301, + 255276, + 255360, + 255324, + 255299, + 255331, + 255428, + 255386, + 255362, + 255292, + 255206, + 255235, + 255206, + 255309, + 255243, + 255322, + 255269, + 255251, + 255369, + 255251, + 255187, + 255250, + 255425, + 255237, + 255365, + 255059, + 255343, + 255285, + 255408, + 255264, + 255219, + 255251, + 255356, + 255458, + 255219, + 255191, + 255350, + 255173, + 255379, + 255292, + 255238, + 255262, + 255214, + 255174, + 255357, + 255475, + 255317, + 255297, + 255361, + 255325, + 255274, + 255350, + 255403, + 255310, + 255247, + 255339, + 255231, + 255149, + 255395, + 255385, + 255356, + 255256, + 255332, + 255443, + 255197, + 255404, + 255393, + 255370, + 255437, + 255424, + 255180, + 255416, + 255313, + 255282, + 255403, + 255210, + 255224, + 255358, + 255428, + 255226, + 255451, + 255344, + 255099, + 255380, + 255383, + 255190, + 255359, + 255203, + 255368, + 255347, + 255208, + 255356, + 255345, + 255430, + 255300, + 255269, + 255373, + 255369, + 255286, + 255364, + 255327, + 255247, + 255421, + 255487, + 255348, + 255243, + 255455, + 255201, + 255256, + 255172, + 255213, + 255165, + 255336, + 255263, + 255352, + 255263, + 255208, + 255250, + 255370, + 255417, + 255324, + 255305, + 255259, + 255420, + 255263, + 255346, + 255214, + 255366, + 255425, + 255266, + 255187, + 255230, + 255365, + 255264, + 255335, + 255308, + 255201, + 255296, + 255440, + 254313, + 254188, + 254244, + 254309, + 265948, + 254349, + 254220, + 254325, + 254215, + 254143, + 254333, + 254416, + 254362, + 254356, + 254248, + 254148, + 254247, + 254458, + 254426, + 254441, + 254387, + 254386, + 254439, + 254209, + 254190, + 254344, + 254256, + 254483, + 254370, + 254404, + 254241, + 254362, + 254270, + 254260, + 254368, + 254354, + 254291, + 254257, + 254287, + 254395, + 254395, + 254277, + 254334, + 254269, + 254200, + 254161, + 254354, + 254193, + 254426, + 254177, + 254257, + 254409, + 254440, + 254312, + 254362, + 254186, + 254127, + 254243, + 254174, + 254258, + 254222, + 254399, + 254260, + 254109, + 254264, + 254302, + 254308, + 254228, + 254321, + 254333, + 254327, + 254260, + 254278, + 254213, + 254177, + 254303, + 254225, + 254303, + 254304, + 254410, + 254267, + 254271, + 254259, + 254273, + 254330, + 254335, + 254272 + ], + "sample_count": 1266 + }, + { + "pubkey": "7ViUgSq5CXJjrFoygBnqdinY4jqCeqK3okUJrg447v4G", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242240000000, + "samples": [ + 12993, + 12961, + 12927, + 12922, + 13009, + 12900, + 12901, + 12904, + 12923, + 12979, + 12906, + 12970, + 12917, + 12919, + 12917, + 12945, + 12967, + 12994, + 12982, + 12890, + 12916, + 12884, + 12945, + 12913, + 12933, + 12885, + 13016, + 12929, + 12999, + 13068, + 13025, + 13102, + 13068, + 13048, + 12995, + 13101, + 13073, + 13072, + 13061, + 13084, + 13049, + 12921, + 12961, + 12948, + 12963, + 12935, + 12981, + 12903, + 12981, + 12907, + 12887, + 12923, + 12881, + 12954, + 12931, + 12927, + 12941, + 12995, + 12870, + 12969, + 12954, + 12952, + 12955, + 12985, + 12994, + 12891, + 12910, + 13095, + 12972, + 12920, + 12926, + 12984, + 12972, + 13052, + 12955, + 12987, + 12891, + 12890, + 12933, + 12969, + 12975, + 12976, + 13004, + 12964, + 13021, + 12957, + 12944, + 12929, + 12912, + 12942, + 13026, + 12893, + 12979, + 12944, + 12927, + 12888, + 12927, + 12948, + 12966, + 12940, + 13015, + 12959, + 12936, + 12984, + 12917, + 12919, + 12994, + 12980, + 12922, + 12896, + 12929, + 12939, + 12864, + 12940, + 12951, + 12946, + 12951, + 12911, + 12905, + 12963, + 12826, + 12950, + 12996, + 12950, + 13006, + 13050, + 13073, + 13056, + 12873, + 12897, + 12910, + 12930, + 12909, + 12960, + 12976, + 12904, + 12997, + 12936, + 12883, + 12993, + 12907, + 12923, + 13071, + 13069, + 12995, + 12935, + 13057, + 13025, + 12937, + 12909, + 12905, + 12946, + 12952, + 12856, + 13050, + 12986, + 13055, + 13076, + 12952, + 12916, + 12980, + 12925, + 12983, + 12999, + 13071, + 12998, + 12994, + 13048, + 12956, + 13017, + 12986, + 12959, + 12906, + 12946, + 12965, + 13011, + 12984, + 12994, + 12962, + 12948, + 12937, + 13005, + 12992, + 12968, + 13038, + 13094, + 13038, + 13063, + 14186, + 12896, + 12909, + 12964, + 12929, + 13014, + 13017, + 13053, + 13048, + 13046, + 13057, + 12975, + 12974, + 12886, + 13003, + 13012, + 13003, + 13034, + 13028, + 13015, + 12997, + 12926, + 13043, + 13033, + 12914, + 12981, + 13046, + 13095, + 13026, + 13011, + 12946, + 12882, + 13073, + 13005, + 13018, + 13078, + 13005, + 13030, + 13007, + 13104, + 13034, + 13043, + 13132, + 13066, + 13119, + 12999, + 12977, + 13051, + 13027, + 12965, + 13096, + 13073, + 13061, + 13027, + 13047, + 13012, + 13076, + 13095, + 13121, + 13019, + 13070, + 12954, + 13048, + 13013, + 13043, + 12985, + 13077, + 13092, + 13066, + 12974, + 13080, + 13094, + 13090, + 13062, + 13045, + 13024, + 12986, + 13045, + 13033, + 13100, + 12970, + 13023, + 13081, + 13002, + 13085, + 13091, + 13158, + 13107, + 13065, + 13041, + 13007, + 12983, + 13062, + 13045, + 13024, + 12970, + 13090, + 13084, + 12969, + 13025, + 13075, + 13022, + 13022, + 13104, + 13101, + 13059, + 13009, + 13039, + 13034, + 12962, + 13050, + 13046, + 12984, + 13113, + 13015, + 13058, + 13042, + 13076, + 13106, + 13042, + 13099, + 13011, + 13041, + 13061, + 13027, + 13078, + 13035, + 13046, + 13054, + 13052, + 12983, + 13029, + 12980, + 12993, + 13023, + 13017, + 13071, + 13097, + 12993, + 13067, + 13019, + 13032, + 13042, + 13098, + 13054, + 13075, + 13092, + 13053, + 12996, + 13052, + 13055, + 13019, + 13007, + 13055, + 13003, + 13053, + 13047, + 13031, + 13046, + 12991, + 13053, + 13001, + 13026, + 13086, + 13030, + 13066, + 13085, + 12985, + 13036, + 13070, + 13043, + 12978, + 13070, + 12950, + 12947, + 13098, + 13079, + 13055, + 12997, + 13124, + 13034, + 13062, + 13101, + 13083, + 13018, + 13025, + 13028, + 13027, + 13002, + 13054, + 13036, + 13038, + 12970, + 13057, + 13061, + 13078, + 13032, + 13064, + 13043, + 13069, + 13027, + 13139, + 13045, + 13088, + 13123, + 13016, + 13046, + 12965, + 13007, + 13011, + 13054, + 13024, + 12990, + 13086, + 13046, + 13023, + 13114, + 13064, + 13076, + 13077, + 13014, + 13168, + 13074, + 13082, + 13049, + 13050, + 12975, + 12924, + 13055, + 13059, + 13010, + 13037, + 13062, + 13070, + 13086, + 13082, + 13058, + 13119, + 13105, + 13026, + 13067, + 13033, + 13086, + 12989, + 13022, + 13052, + 13026, + 13026, + 13127, + 13000, + 12965, + 13082, + 13073, + 13016, + 13068, + 12980, + 13018, + 13057, + 13008, + 13038, + 13052, + 13028, + 13081, + 13023, + 13014, + 12993, + 13078, + 13101, + 13000, + 13064, + 13066, + 13028, + 13071, + 13078, + 13011, + 13043, + 13000, + 13074, + 13090, + 13066, + 13065, + 13119, + 13059, + 13019, + 13033, + 13038, + 13097, + 13033, + 13052, + 13029, + 13050, + 13032, + 13052, + 13043, + 13065, + 13040, + 13026, + 13092, + 13042, + 13021, + 13064, + 13029, + 13122, + 13082, + 12907, + 13005, + 13100, + 13043, + 13058, + 13092, + 13110, + 13142, + 13118, + 13075, + 13016, + 13081, + 13096, + 12950, + 13121, + 13039, + 13018, + 13135, + 13055, + 13088, + 13024, + 13041, + 13014, + 13100, + 13055, + 13094, + 13078, + 12951, + 13090, + 13002, + 12991, + 13075, + 13031, + 13033, + 13066, + 13044, + 13067, + 13016, + 13043, + 13029, + 13034, + 13082, + 13030, + 13081, + 13106, + 13003, + 13116, + 13076, + 13038, + 13071, + 12977, + 13064, + 13024, + 13030, + 13152, + 13075, + 12999, + 13078, + 13112, + 12970, + 13045, + 13048, + 13077, + 13109, + 13080, + 13074, + 13105, + 12903, + 13028, + 13055, + 13072, + 13066, + 13079, + 12991, + 13083, + 13017, + 13078, + 13054, + 13030, + 13128, + 12983, + 13039, + 13027, + 13035, + 13105, + 13080, + 13082, + 12978, + 13057, + 13071, + 13060, + 13067, + 12997, + 13092, + 13049, + 12997, + 13048, + 13029, + 13003, + 13056, + 13115, + 12955, + 13039, + 13037, + 13068, + 13063, + 13024, + 13021, + 12975, + 13076, + 12955, + 13077, + 13047, + 13109, + 13027, + 12966, + 13046, + 12995, + 13041, + 13044, + 13068, + 13037, + 13029, + 13063, + 13040, + 13105, + 13125, + 13040, + 13072, + 13027, + 13098, + 13050, + 13051, + 13102, + 12992, + 13049, + 13032, + 13085, + 13078, + 13030, + 13053, + 13129, + 13088, + 13186, + 13031, + 13049, + 13123, + 13123, + 13034, + 12967, + 13037, + 13110, + 13097, + 13128, + 13109, + 13097, + 13065, + 13090, + 13114, + 13074, + 13029, + 13022, + 13069, + 13080, + 12946, + 13088, + 13055, + 13139, + 13091, + 13077, + 13027, + 13017, + 13058, + 13064, + 13062, + 13022, + 13037, + 12980, + 13044, + 13017, + 12995, + 12987, + 13077, + 13005, + 13069, + 13053, + 13066, + 13096, + 13049, + 13062, + 13080, + 13068, + 12959, + 13007, + 13043, + 12969, + 12950, + 13063, + 13095, + 13053, + 13056, + 13291, + 13071, + 13034, + 13062, + 13034, + 13017, + 12988, + 13103, + 12999, + 13006, + 13025, + 13051, + 13069, + 13048, + 13069, + 13026, + 13071, + 13004, + 13082, + 13071, + 13004, + 12998, + 13114, + 13033, + 13040, + 13082, + 13053, + 13077, + 13075, + 12995, + 13055, + 13038, + 13046, + 13075, + 13051, + 12994, + 13108, + 13086, + 13018, + 13031, + 13044, + 13068, + 13094, + 13121, + 12971, + 12994, + 13075, + 13129, + 13077, + 13016, + 13092, + 13090, + 13074, + 13034, + 13042, + 13057, + 13061, + 13018, + 12996, + 13026, + 13036, + 13039, + 13050, + 13082, + 13094, + 13066, + 13078, + 13076, + 13047, + 13023, + 13052, + 13095, + 13080, + 13069, + 13024, + 13141, + 13030, + 13042, + 13049, + 13094, + 13047, + 13076, + 13041, + 13049, + 13108, + 13102, + 13076, + 13022, + 13050, + 13038, + 13115, + 13044, + 13086, + 13029, + 13077, + 13054, + 13071, + 12942, + 12952, + 13081, + 13035, + 13062, + 13122, + 12971, + 13031, + 13051, + 13044, + 13116, + 13013, + 13020, + 13001, + 13056, + 13124, + 13068, + 13048, + 13026, + 13093, + 13125, + 13038, + 13008, + 13042, + 13091, + 13087, + 13009, + 13098, + 13083, + 13044, + 13105, + 13027, + 13051, + 13063, + 13055, + 13023, + 13083, + 13081, + 13070, + 13078, + 13176, + 13029, + 13039, + 13055, + 13036, + 13060, + 13103, + 13024, + 13068, + 13047, + 12985, + 13040, + 13085, + 12978, + 13087, + 13111, + 13056, + 13067, + 13077, + 12969, + 13082, + 12971, + 13109, + 13043, + 13004, + 13041, + 13048, + 13015, + 12997, + 13043, + 13075, + 13031, + 13060, + 13081, + 13026, + 13059, + 13016, + 12985, + 13021, + 12993, + 13006, + 13073, + 13127, + 13062, + 13139, + 13063, + 13095, + 13051, + 13083, + 13080, + 13066, + 12993, + 13056, + 13105, + 13095, + 13075, + 13047, + 13036, + 13111, + 13054, + 13104, + 12973, + 13064, + 13076, + 13036, + 13050, + 13032, + 13051, + 13029, + 13082, + 13102, + 12989, + 12996, + 13032, + 13043, + 13017, + 13060, + 13078, + 13067, + 13119, + 13103, + 13102, + 13088, + 13024, + 13081, + 13075, + 13062, + 13089, + 13015, + 13061, + 13034, + 13042, + 13064, + 13016, + 13046, + 13113, + 13038, + 13016, + 13085, + 13028, + 13088, + 13025, + 13031, + 13038, + 13045, + 13020, + 13041, + 13068, + 13042, + 13032, + 13033, + 13021, + 13047, + 13069, + 13088, + 12974, + 13027, + 13039, + 13062, + 13061, + 13090, + 12984, + 12974, + 13001, + 13060, + 13144, + 12994, + 13044, + 13097, + 13036, + 13079, + 13136, + 13095, + 13095, + 13051, + 13022, + 13074, + 13063, + 13049, + 13000, + 13019, + 13076, + 13029, + 13042, + 13004, + 12986, + 13027, + 13091, + 13074, + 12994, + 13091, + 13043, + 13026, + 13009, + 13010, + 13048, + 13096, + 13017, + 13027, + 13089, + 13067, + 13033, + 13013, + 13006, + 13097, + 13081, + 13078, + 13078, + 13070, + 13081, + 13091, + 13121, + 13148, + 13068, + 13106, + 13081, + 13028, + 13021, + 13000, + 13074, + 13125, + 13005, + 13026, + 13081, + 13057, + 13055, + 13066, + 13048, + 13026, + 13031, + 13057, + 13048, + 13027, + 13161, + 13024, + 13074, + 13022, + 13073, + 13067, + 13041, + 13004, + 13068, + 13042, + 13047, + 13018, + 13042, + 13102, + 13056, + 12991, + 13063, + 13062, + 13009, + 13005, + 12987, + 13043, + 13084, + 13000, + 13037, + 13078, + 13046, + 13086, + 13021, + 13048, + 13094, + 13057, + 13050, + 13062, + 13015, + 13048, + 13103, + 13037, + 13038, + 13116, + 13016, + 13044, + 13094, + 13082, + 13053, + 12981, + 12993, + 13094, + 13033, + 13027, + 13017, + 13058, + 13073, + 13083, + 13044, + 13055, + 13120, + 13079, + 13038, + 13012, + 13045, + 13099, + 13076, + 13015, + 12990, + 12931, + 13068, + 13030, + 13085, + 13078, + 13080, + 13079, + 13074, + 13030, + 13060, + 13018, + 13036, + 12997, + 13068, + 12968, + 13038, + 13120, + 13045, + 13056, + 13088, + 13005, + 13145, + 13084, + 13037, + 13060, + 13043, + 12994, + 13012, + 13067, + 12994, + 12988, + 13086, + 13037, + 13076, + 13032, + 13093, + 13043, + 13020, + 13078, + 13084, + 13102, + 13028, + 13072, + 13061, + 13024, + 13038, + 13120, + 13069, + 13063, + 13006, + 13010, + 13079, + 13054, + 12990, + 13049, + 13042, + 13145, + 13050, + 13050, + 13057, + 13044, + 13097, + 13065, + 13079, + 13056, + 13064, + 13057, + 13059, + 13080, + 12974, + 13076, + 13087, + 13050, + 13063, + 13011, + 13085, + 13069, + 13072, + 13075, + 13055, + 13029, + 13014, + 12957, + 13062, + 13039, + 13090, + 13107, + 13073, + 13061, + 13086, + 13040, + 13064, + 13081, + 13104, + 13038, + 12913, + 13053, + 13038, + 13048, + 13024, + 12951, + 13062, + 13061, + 13072, + 12964, + 13009, + 13035, + 13071, + 13019, + 13079, + 13042, + 13040, + 13071, + 12997, + 13066, + 13096, + 13100, + 13036, + 13025, + 12939, + 13051, + 12995, + 13010, + 13077, + 13098, + 13096, + 13015, + 13051, + 13117, + 13016, + 13044, + 13088, + 13068, + 13016, + 12977, + 12970, + 13064, + 13063, + 12981, + 12931, + 13016, + 13061, + 13044, + 13069, + 13027, + 13093, + 13031, + 13033, + 13050, + 13056, + 13071, + 13096, + 13034, + 13022, + 13045, + 13079, + 12998, + 13061, + 13047, + 13063, + 13056, + 13033, + 13025, + 13057, + 13028, + 13021, + 13108, + 13073, + 13041, + 13047, + 13079, + 13077, + 13060, + 13053, + 12979, + 13055, + 13085, + 13045, + 13024, + 13137, + 13079, + 13035 + ], + "sample_count": 1270 + }, + { + "pubkey": "7ptYCtmz17Bd924YWs9pVFwy84pMy5hT9ZvrNpJ3vA5W", + "epoch": 89, + "data_provider_name": "wheresitup", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "target_exchange_pk": "CAZw65X6unpmLGyuSs421VAWE7DSN8xF6L6KrPdHGUYC", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242243000000, + "samples": [ + 65367, + 65268, + 65319, + 65408, + 65295, + 65334, + 65303, + 65331, + 65318, + 65468, + 65379, + 65282, + 65274, + 65283, + 65269, + 65266, + 65282, + 65337, + 65364, + 65251, + 65284, + 65352, + 65346, + 65288, + 65294, + 65272, + 65291, + 65416, + 65238, + 65253, + 65217, + 65256, + 65242, + 65299, + 65238, + 65316, + 65337, + 65269, + 65299, + 65224, + 65333, + 65319, + 65269, + 65316, + 65302, + 65426, + 65281, + 65339, + 65370, + 65268, + 65244, + 65339, + 65293, + 65251, + 65230, + 65229, + 65248, + 65269, + 65284, + 65248, + 65248, + 65194, + 65218, + 65285, + 65325, + 65233, + 65299, + 65251, + 65310, + 65346, + 65274, + 65260, + 65294, + 65224, + 65284, + 65277, + 65253, + 65550, + 65319, + 65319, + 65486, + 65430, + 65364, + 65312, + 65288, + 65257, + 65279, + 65355, + 65397, + 65290, + 65279, + 65268, + 65251, + 65272, + 65250, + 65343, + 65254, + 65251, + 65227, + 65275, + 65310, + 65209, + 65321, + 65340, + 65257, + 65316, + 65263, + 65297, + 65271, + 65233, + 65242, + 65290, + 65247, + 65284, + 65259, + 65292, + 65223, + 65265, + 65285, + 65239, + 65313, + 65260, + 65286, + 65176, + 65266, + 65304, + 65299, + 65286, + 65236, + 65340, + 65221, + 65296, + 65306, + 65224, + 65238, + 65289, + 65251, + 65262, + 65191, + 65277, + 65300, + 65253, + 65224, + 65232, + 65193, + 65282, + 65334, + 65214, + 65203, + 65242, + 65187, + 65180, + 65279, + 65236, + 65208, + 65259, + 65235, + 65199, + 65209, + 65227, + 65263, + 65212, + 65247, + 65226, + 65194, + 65251, + 65200, + 65282, + 65334, + 65230, + 65355, + 65275, + 65286, + 65199, + 65316, + 65218, + 65327, + 65310, + 65217, + 65263, + 65254, + 65245, + 65336, + 65284, + 65214, + 65275, + 65331, + 65260, + 65265, + 65300, + 65244, + 65214, + 65257, + 65328, + 65266, + 65182, + 65260, + 65364, + 65285, + 65274, + 65348, + 65278, + 65407, + 65280, + 65232, + 65291, + 65336, + 65410, + 65393, + 65315, + 65336, + 65206, + 65343, + 65288, + 65309, + 65426, + 65292, + 65424, + 65277, + 65251, + 65208, + 65340, + 65260, + 65248, + 65289, + 65297, + 65272, + 65197, + 65173, + 65279, + 65248, + 65294, + 65354, + 65385, + 65287, + 65337, + 65194, + 65263, + 65313, + 65373, + 65196, + 65248, + 65280, + 65238, + 65343, + 65262, + 65272, + 65312, + 65266, + 65236, + 65358, + 65205, + 65251, + 65272, + 65346, + 65370, + 65345, + 65286, + 65269, + 65290, + 65394, + 65373, + 65259, + 65272, + 65233, + 65279, + 65364, + 65218, + 65279, + 65236, + 65325, + 65245, + 65313, + 65245, + 65390, + 65328, + 65324, + 65308, + 65324, + 65422, + 65247, + 65242, + 65266, + 65212, + 65272, + 65349, + 65269, + 65467, + 65293, + 65301, + 65300, + 65290, + 65331, + 65328, + 65176, + 65319, + 65278, + 65319, + 65399, + 65296, + 65331, + 65297, + 65232, + 65178, + 65295, + 65275, + 65296, + 65372, + 65337, + 65303, + 65321, + 65263, + 65282, + 65265, + 65325, + 65385, + 65272, + 65430, + 65346, + 65241, + 65391, + 65256, + 65283, + 65385, + 65238, + 65376, + 65274, + 65382, + 65268, + 65325, + 65266, + 65421, + 65402, + 65315, + 65358, + 65325, + 65296, + 65134, + 65384, + 65361, + 65358, + 65290, + 65470, + 65238, + 65313, + 65325, + 65311, + 65372, + 65283, + 65372, + 65280, + 65412, + 65292, + 65217, + 65325, + 65250, + 65279, + 65407, + 65400, + 65394, + 65306, + 65233, + 65245, + 65346, + 65333, + 65373, + 65303, + 65230, + 65279, + 65236, + 65354, + 65305, + 65415, + 65325, + 65394, + 65282, + 65215, + 65340, + 65236, + 65233, + 65230, + 65337, + 65248, + 65351, + 65269, + 65290, + 65287, + 65297, + 65227, + 65242, + 65340, + 65376, + 65266, + 65369, + 65343, + 65453, + 65310, + 65372, + 65382, + 65303, + 65256, + 65235, + 65288, + 65248, + 65333, + 65293, + 65262, + 65293, + 65394, + 65304, + 65345, + 65364, + 65202, + 65300, + 65361, + 65325, + 65302, + 65279, + 65316, + 65277, + 65304, + 65358, + 65462, + 65429, + 65399, + 65480, + 65328, + 65360, + 65239, + 65313, + 65355, + 65254, + 65245, + 65275, + 65361, + 65279, + 65227, + 65379, + 65269, + 65266, + 65354, + 65384, + 65306, + 65334, + 65251, + 65361, + 65391, + 65299, + 65361, + 65309, + 65300, + 65313, + 65312, + 65379, + 65363, + 65360, + 65298, + 65254, + 65287, + 65253, + 65269, + 65337, + 65351, + 65366, + 65346, + 65402, + 65275, + 65349, + 74123, + 65334, + 65322, + 65394, + 65291, + 65259, + 65333, + 65300, + 65348, + 65373, + 65388, + 65251, + 65305, + 65388, + 65303, + 65272, + 65400, + 65415, + 65310, + 65322, + 65413, + 65230, + 65304, + 65349, + 65376, + 65343, + 65388, + 65282, + 65308, + 65299, + 65370, + 65339, + 65403, + 65420, + 65391, + 65313, + 65376, + 65327, + 65300, + 65375, + 65266, + 67120, + 65355, + 65319, + 65319, + 65328, + 65282, + 67097, + 65313, + 65345, + 65375, + 65351, + 65361, + 65245, + 65325, + 65369, + 65346, + 65274, + 65357, + 65453, + 65364, + 65358, + 65239, + 65275, + 65269, + 65310, + 65291, + 65328, + 65250, + 65421, + 65394, + 65281, + 65302, + 65285, + 65245, + 65513, + 65465, + 65391, + 65431, + 65453, + 65372, + 65230, + 65239, + 65325, + 65302, + 65366, + 65277, + 65227, + 65346, + 65358, + 65357, + 65311, + 65352, + 65331, + 65400, + 65339, + 65244, + 65251, + 65367, + 65199, + 65342, + 65399, + 65410, + 65262, + 65477, + 65281, + 65325, + 65504, + 65409, + 65306, + 65345, + 65336, + 65215, + 65282, + 65263, + 65250, + 65453, + 65322, + 65251, + 65349, + 65257, + 65364, + 65436, + 65313, + 65251, + 65361, + 65265, + 65286, + 65215, + 65251, + 65296, + 65282, + 65414, + 65275, + 65349, + 65373, + 65233, + 65334, + 65413, + 65349, + 65394, + 65367, + 65388, + 65275, + 65274, + 65360, + 65321, + 65330, + 65361, + 65379, + 65399, + 65393, + 65236, + 65364, + 65331, + 65388, + 65229, + 65360, + 65260, + 65285, + 65313, + 65424, + 65391, + 65248, + 65331, + 65354, + 65352, + 65393, + 65355, + 65334, + 65425, + 65388, + 65339, + 65404, + 65328, + 65283, + 65280, + 65290, + 65349, + 65319, + 65327, + 65429, + 65349, + 65322, + 65269, + 65306, + 65268, + 65238, + 65433, + 65425, + 65385, + 65424, + 65336, + 65421, + 65424, + 65361, + 65360, + 65410, + 65459, + 65334, + 65230, + 65257, + 65379, + 65412, + 65263, + 65382, + 65306, + 65370, + 65275, + 65364, + 65391, + 65257, + 65278, + 65301, + 65325, + 65296, + 65334, + 65334, + 65236, + 65325, + 65459, + 65203, + 65357, + 65242, + 65393, + 65358, + 65230, + 65367, + 65304, + 65306, + 65459, + 65263, + 65331, + 65218, + 65340, + 65340, + 65262, + 65268, + 65339, + 65394, + 65391, + 65343, + 65358, + 65250, + 65319, + 65248, + 65303, + 65295, + 65257, + 65366, + 65257, + 65343, + 65212, + 65351, + 65346, + 65452, + 65393, + 65313, + 65402, + 65305, + 65292, + 65277, + 65378, + 65302, + 65449, + 65318, + 65361, + 65381, + 65321, + 65275, + 65425, + 65382, + 65308, + 65531, + 65473, + 65343, + 65239, + 65391, + 65355, + 65400, + 65233, + 65418, + 65385, + 65443, + 65352, + 65461, + 65262, + 65387, + 65352, + 65525, + 65363, + 65366, + 65387, + 65393, + 65287, + 65316, + 65384, + 65373, + 65313, + 65308, + 65291, + 65397, + 65449, + 65349, + 65316, + 65280, + 65351, + 65352, + 65378, + 65215, + 65331, + 65263, + 65319, + 65355, + 65303, + 65230, + 65351, + 65289, + 65281, + 65297, + 65375, + 65230, + 65343, + 65343, + 65394, + 65304, + 65316, + 65282, + 65288, + 65248, + 65370, + 65277, + 65370, + 65373, + 65247, + 65268, + 65293, + 65325, + 65319, + 65375, + 65349, + 65340, + 65309, + 65183, + 65306, + 65416, + 65382, + 65235, + 65305, + 65251, + 65325, + 65473, + 65316, + 65331, + 65324, + 65334, + 65294, + 65287, + 65268, + 65498, + 65360, + 65269, + 65459, + 65417, + 65269, + 65296, + 65288, + 65221, + 65358, + 65446, + 65376, + 65369, + 65256, + 65253, + 65358, + 65403, + 65288, + 65470, + 65278, + 65423, + 65402, + 65387, + 65431, + 65340, + 65319, + 65331, + 65367, + 65343, + 65367, + 65447, + 65220, + 65283, + 65539, + 65373, + 65441, + 65444, + 65331, + 65394, + 65300, + 65367, + 65334, + 65233, + 65434, + 65449, + 65480, + 65414, + 65435, + 65331, + 65313, + 65432, + 65382, + 65492, + 65349, + 65355, + 65293, + 65299, + 65387, + 65343, + 65277, + 65423, + 65308, + 65197, + 65226, + 65495, + 65376, + 65340, + 65355, + 65384, + 65251, + 65337, + 65322, + 65355, + 65394, + 65327, + 65221, + 65428, + 65427, + 65269, + 65437, + 65367, + 65364, + 65318, + 65293, + 65361, + 65324, + 65355, + 65384, + 65488, + 65343, + 65438, + 65406, + 65279, + 65247, + 65430, + 65342, + 65291, + 65337, + 65263, + 65324, + 65248, + 65369, + 65378, + 65333, + 65382, + 65208, + 65285, + 65205, + 65436, + 65366, + 65405, + 65340, + 65215, + 65412, + 65218, + 65224, + 65404, + 65279, + 65236, + 65417, + 65397, + 65337, + 65376, + 65399, + 65373, + 65391, + 65272, + 65447, + 65289, + 65370, + 65390, + 65288, + 65303, + 65492, + 65444, + 65357, + 65480, + 65337, + 65370, + 65404, + 65319, + 65414, + 65245, + 65400, + 65417, + 65388, + 65437, + 65294, + 65492, + 65281, + 65498, + 65372, + 65489, + 65348, + 65211, + 65431, + 65441, + 65385, + 65277, + 65381, + 65369, + 65391, + 65290, + 65325, + 65275, + 65393, + 65308, + 65316, + 65312, + 65310, + 65358, + 65424, + 65443, + 65370, + 65456, + 65397, + 65259, + 65364, + 65438, + 65352, + 65266, + 65313, + 65433, + 65417, + 65417, + 65372, + 65384, + 65390, + 65427, + 65346, + 65250, + 65400, + 65354, + 65289, + 65464, + 65431, + 65399, + 65227, + 65382, + 65221, + 65266, + 65387, + 65239, + 65432, + 65366, + 65404, + 65462, + 65313, + 65294, + 65232, + 65245, + 65352, + 65346, + 65402, + 65418, + 65482, + 65308, + 65391, + 65322, + 65459, + 65313, + 65223, + 65349, + 65455, + 65403, + 65191, + 65391, + 65285, + 65414, + 65370, + 65465, + 65381, + 65328, + 65272, + 65281, + 65293, + 65297, + 65248, + 65346, + 65233, + 65400, + 65286, + 65417, + 65364, + 65232, + 65299, + 65296, + 65397, + 65379, + 65257, + 65486, + 65236, + 65474, + 65465, + 65417, + 65275, + 65233, + 65391, + 65370, + 65477, + 65340, + 65325, + 65430, + 65402, + 65193, + 65364, + 65393, + 65316, + 65483, + 65379, + 65295, + 65337, + 65410, + 65257, + 65436, + 65402, + 65302, + 65315, + 65397, + 65391, + 65281, + 65361, + 65379, + 65394, + 65464, + 65456, + 65449, + 65434, + 65340, + 65393, + 65418, + 65300, + 65336, + 65397, + 65376, + 65470, + 65316, + 65388, + 65513, + 65422, + 65355, + 65319, + 65355, + 65456, + 65294, + 65278, + 65444, + 65436, + 65409, + 65297, + 65474, + 65413, + 65399, + 65352, + 65411, + 65415, + 65390, + 65266, + 65245, + 65205, + 65349, + 65293, + 65313, + 65406, + 65245, + 65322, + 65226, + 65382, + 65333, + 65447, + 65272, + 65413, + 65416, + 65296, + 65324, + 65480, + 65397, + 65205, + 65312, + 65263, + 65337, + 65424, + 65376, + 65462, + 65322, + 65343, + 65388, + 65414, + 65435, + 65315, + 65390, + 65251, + 65337, + 65376, + 65245, + 65330, + 65239, + 65400, + 65426, + 65419, + 65309, + 65443, + 65464, + 65286, + 65378, + 65406, + 65305, + 65248, + 65245, + 65319, + 65348, + 65358, + 65438, + 65492, + 65238, + 65260, + 65223, + 65306, + 65387, + 65337, + 65349, + 65412, + 65311, + 65436, + 65200, + 65263, + 65376, + 65206, + 65477, + 65419, + 65349, + 65296, + 65372, + 65408, + 65420, + 65348, + 65358, + 65369, + 65247, + 65333, + 65278, + 65343, + 65235, + 65333, + 65324, + 65372, + 65417, + 65327, + 65259, + 65325, + 65303, + 65297, + 65387, + 65325, + 65428, + 65266, + 65297, + 65462, + 65387, + 65418, + 65387, + 65418, + 65272, + 65357, + 65355, + 65308, + 65286, + 65299, + 65423, + 65245, + 65208, + 65309, + 65257, + 65316, + 65319, + 65316, + 65283, + 65381, + 65486, + 65209 + ], + "sample_count": 1267 + }, + { + "pubkey": "3CYxk4tEaudSpKWhQc4PYqB7RHMZfqppW3njZJKZfR5Z", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "Exj2nrztQU3PKCrtWf7yH1vV5T8T4nz1F6qHPN4zmFb7", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242375000000, + "samples": [ + 213316, + 222969, + 226773, + 226773, + 225125, + 221178, + 221178, + 223583, + 210250, + 210250, + 220686, + 220686, + 206310, + 214927, + 232172, + 194854, + 218865, + 176351, + 226286, + 188674, + 202522, + 202522, + 217222, + 217222, + 184826, + 204074, + 188303, + 183971, + 177521, + 184305, + 178493, + 185059, + 176251, + 180737, + 202231, + 184764, + 184999, + 187878, + 176228, + 177734, + 180972, + 180972, + 176282, + 194558, + 176421, + 182205, + 176681, + 177475, + 177512, + 184789, + 190012, + 182268, + 181444, + 176089, + 176358, + 176358, + 176266, + 176266, + 176143, + 184265, + 176342, + 183257, + 176242, + 189199, + 176486, + 196273, + 205525, + 185848, + 180486, + 185686, + 185207, + 184854, + 181792, + 185091, + 177205, + 183417, + 184095, + 184755, + 184755, + 176032, + 176127, + 180511, + 176601, + 176247, + 176096, + 178570, + 178267, + 177437, + 181760, + 176338, + 176338, + 184782, + 187357, + 187357, + 184781, + 184700, + 176664, + 184727, + 184904, + 181860, + 176161, + 197259, + 176248, + 184786, + 184786, + 177098, + 182917, + 182917, + 184578, + 178106, + 178106, + 183992, + 176328, + 184799, + 184908, + 177123, + 176480, + 184834, + 175933, + 185053, + 185053, + 176079, + 184732, + 184732, + 184710, + 176220, + 184732, + 180907, + 176311, + 180537, + 180537, + 176266, + 176086, + 176094, + 176386, + 176386, + 184868, + 179665, + 176030, + 176230, + 176081, + 176081, + 184391, + 175962, + 183773, + 183773, + 178007, + 178007, + 176210, + 184505, + 179130, + 176934, + 178071, + 179906, + 184539, + 176282, + 176325, + 184707, + 176368, + 184757, + 183681, + 176175, + 176103, + 176400, + 176400, + 184691, + 177509, + 176239, + 184595, + 176340, + 184662, + 184662, + 176296, + 176296, + 184856, + 176293, + 184623, + 176146, + 184741, + 181615, + 184736, + 184736, + 176178, + 176310, + 184768, + 176306, + 176157, + 176394, + 176308, + 176232, + 176159, + 176172, + 176172, + 176103, + 176142, + 183795, + 177315, + 176460, + 176142, + 176458, + 180329, + 176290, + 176124, + 177279, + 177279, + 176291, + 175992, + 175992, + 176275, + 176275, + 176294, + 177970, + 181112, + 181112, + 183661, + 175953, + 176686, + 176178, + 176650, + 176650, + 176282, + 177192, + 184756, + 184756, + 179088, + 179088, + 180209, + 176927, + 177346, + 182668, + 176662, + 176362, + 176356, + 182414, + 176268, + 177263, + 181130, + 176285, + 177454, + 176192, + 180137, + 178553, + 178553, + 176290, + 175986, + 176980, + 176409, + 176409, + 176401, + 176283, + 177091, + 180919, + 177023, + 177023, + 176216, + 176271, + 176472, + 176227, + 176277, + 176080, + 176509, + 176431, + 175977, + 176177, + 176254, + 176202, + 176241, + 176073, + 176387, + 176276, + 176357, + 176357, + 175992, + 176116, + 176260, + 176260, + 176347, + 176180, + 176230, + 176223, + 176185, + 176021, + 176154, + 176400, + 176225, + 176225, + 176226, + 176002, + 176419, + 176288, + 176325, + 176261, + 176261, + 176483, + 176228, + 176152, + 176210, + 176020, + 176263, + 176224, + 176168, + 176126, + 176314, + 176110, + 176111, + 176015, + 176236, + 175978, + 176242, + 176233, + 176219, + 176111, + 176510, + 176357, + 176242, + 176257, + 176297, + 176258, + 176101, + 176101, + 176275, + 176263, + 176062, + 176062, + 176233, + 176093, + 176071, + 176164, + 176164, + 176218, + 176259, + 176297, + 176203, + 176203, + 176106, + 176333, + 176429, + 176045, + 176212, + 176212, + 176186, + 176126, + 176479, + 176008, + 176376, + 175947, + 176123, + 176298, + 176199, + 176084, + 176084, + 176351, + 176078, + 176301, + 176266, + 176266, + 176210, + 176110, + 176335, + 176335, + 176107, + 176079, + 176512, + 176057, + 176301, + 176201, + 176210, + 176014, + 176094, + 176187, + 176209, + 176209, + 176002, + 176269, + 176435, + 176435, + 176279, + 176405, + 176244, + 176256, + 176218, + 176131, + 176347, + 176347, + 176114, + 176195, + 176127, + 176160, + 176327, + 176081, + 176081, + 176092, + 175952, + 176039, + 176039, + 176298, + 176269, + 176005, + 176235, + 176105, + 176301, + 176286, + 176251, + 176251, + 176366, + 176366, + 176222, + 176155, + 176004, + 176009, + 176383, + 176395, + 176150, + 176232, + 176241, + 176230, + 175988, + 176224, + 176224, + 176154, + 176146, + 176128, + 176177, + 176177, + 176228, + 176335, + 176384, + 176104, + 176104, + 176259, + 176259, + 176239, + 176184, + 175996, + 176216, + 176326, + 176326, + 176219, + 176175, + 176268, + 176197, + 176324, + 176177, + 176177, + 176257, + 176320, + 176341, + 176213, + 176238, + 176238, + 176364, + 176364, + 176045, + 176139, + 176139, + 176256, + 176586, + 178201, + 176919, + 176919, + 177842, + 176176, + 176270, + 177509, + 176254, + 179255, + 179749, + 176620, + 176450, + 179786, + 177052, + 177052, + 193129, + 178917, + 176417, + 176275, + 176298, + 181778, + 176531, + 176531, + 177741, + 178776, + 176944, + 181934, + 176528, + 177867, + 178357, + 176768, + 176768, + 183935, + 178624, + 179092, + 179092, + 176351, + 176394, + 179866, + 179866, + 177367, + 177367, + 176151, + 176151, + 176086, + 176340, + 176340, + 176137, + 184845, + 176298, + 176160, + 176409, + 184684, + 176212, + 178492, + 184780, + 184780, + 176248, + 177908, + 176269, + 184860, + 184753, + 183556, + 176295, + 176295, + 176353, + 184610, + 176651, + 176651, + 184900, + 184854, + 184854, + 184854, + 184674, + 184907, + 184558, + 184702, + 184660, + 184788, + 184734, + 184734, + 184675, + 184818, + 185004, + 184765, + 184802, + 184802, + 184832, + 184564, + 184910, + 184711, + 184711, + 184845, + 184845, + 184845, + 184631, + 184713, + 184903, + 184538, + 184804, + 184758, + 184779, + 184709, + 184621, + 184829, + 184795, + 184781, + 184814, + 184705, + 184705, + 184767, + 184822, + 184829, + 184649, + 184649, + 184613, + 184632, + 184632, + 184694, + 184694, + 184658, + 184218, + 184218, + 184681, + 184567, + 176101, + 184649, + 184692, + 184744, + 184783, + 184711, + 184717, + 180030, + 180030, + 178119, + 178119, + 184514, + 184472, + 184725, + 183057, + 184716, + 184450, + 184583, + 184625, + 176130, + 176130, + 183569, + 183569, + 181339, + 184857, + 179380, + 181341, + 176246, + 184666, + 184808, + 184757, + 184874, + 184857, + 184857, + 176124, + 178775, + 184790, + 176022, + 176022, + 176746, + 176746, + 183500, + 181154, + 175919, + 176319, + 184548, + 184592, + 184592, + 176084, + 181492, + 181492, + 178286, + 176102, + 184787, + 176340, + 176064, + 183486, + 176088, + 175711, + 184283, + 183427, + 175866, + 176736, + 175666, + 180190, + 183141, + 183141, + 175543, + 176079, + 175833, + 175451, + 184137, + 184137, + 176550, + 184174, + 175683, + 184224, + 184290, + 177040, + 176505, + 175547, + 175547, + 175692, + 175527, + 182072, + 182072, + 182262, + 184324, + 176704, + 175780, + 175663, + 175711, + 180540, + 176199, + 175597, + 175667, + 175484, + 175521, + 175521, + 184247, + 175726, + 175726, + 182952, + 182952, + 184239, + 175580, + 175848, + 175848, + 183386, + 183647, + 183647, + 175763, + 188049, + 175810, + 184294, + 176611, + 184273, + 175709, + 175709, + 176142, + 176008, + 175672, + 179577, + 187663, + 179892, + 178777, + 176612, + 175632, + 183039, + 176498, + 184104, + 184104, + 190437, + 175706, + 181150, + 183256, + 184194, + 175728, + 175728, + 175618, + 175618, + 183277, + 180155, + 195845, + 175656, + 175656, + 178390, + 180550, + 185173, + 182461, + 184827, + 184129, + 176029, + 177611, + 184396, + 175606, + 179669, + 179669, + 176300, + 175937, + 176496, + 178885, + 178885, + 175700, + 184950, + 177102, + 184202, + 183225, + 184999, + 175863, + 175863, + 177737, + 177774, + 177774, + 183640, + 183640, + 183665, + 183665, + 175720, + 182438, + 182438, + 176292, + 175663, + 179256, + 184285, + 176063, + 181505, + 177720, + 177720, + 176285, + 176285, + 175776, + 178929, + 181175, + 175844, + 184182, + 184182, + 184273, + 181707, + 178303, + 179638, + 175561, + 175640, + 175731, + 181077, + 175610, + 184670, + 175966, + 175754, + 175754, + 175807, + 183082, + 175890, + 181820, + 181820, + 180678, + 176004, + 175862, + 175552, + 175769, + 177522, + 177522, + 175714, + 177351, + 179014, + 175712, + 175578, + 184219, + 176793, + 176793, + 175535, + 175710, + 175660, + 176022, + 183121, + 183121, + 178317, + 179310, + 175562, + 175704, + 184498, + 184282, + 184282, + 183737, + 183737, + 175721, + 175745, + 182841, + 180885, + 183754, + 182134, + 183992, + 182735, + 182735, + 175630, + 181304, + 175963, + 178488, + 175658, + 175706, + 175799, + 183351, + 182757, + 175787, + 175838, + 175838, + 175610, + 184208, + 179666, + 175766, + 183968, + 184156, + 184156, + 176000, + 175631, + 175824, + 175579, + 178003, + 175581, + 176408, + 176484, + 176484, + 176151, + 179445, + 177593, + 177100, + 175715, + 184020, + 179629, + 175681, + 184053, + 182886, + 184065, + 184065, + 184128, + 180780, + 175520, + 184165, + 175735, + 182502, + 176052, + 180552, + 175553, + 175553, + 177008, + 184048, + 184048, + 175633, + 183123, + 178255, + 184085, + 183939, + 180985, + 175658, + 175460, + 175619, + 179091, + 175735, + 175503, + 175576, + 175576, + 178133, + 180573, + 184016, + 175748, + 175748, + 176145, + 175432, + 175432, + 184005, + 175972, + 180983, + 175843, + 175504, + 175651, + 176778, + 175716, + 183322, + 184216, + 183749, + 176690, + 179592, + 176617, + 175542, + 175619, + 175651, + 175651, + 176644, + 175573, + 178606, + 179656, + 179656, + 175591, + 177466, + 177317, + 176739, + 176739, + 178783, + 176649, + 175798, + 176303, + 179400, + 182611, + 175397, + 175397, + 177088, + 182807, + 175854, + 175730, + 175730, + 176190, + 176588, + 177564, + 178327, + 175712, + 175896, + 175762, + 175700, + 175700, + 175723, + 175428, + 175634, + 175590, + 175590, + 175599, + 176002, + 176002, + 175576, + 175667, + 176156, + 176156, + 175604, + 175670, + 175464, + 175804, + 175741, + 175741, + 175465, + 175465, + 175701, + 175634, + 175585, + 175724, + 175724, + 175831, + 175619, + 175603, + 175751, + 175836, + 175687, + 175531, + 175531, + 175500, + 175721, + 175638, + 175902, + 175697, + 175697, + 175458, + 175737, + 175607, + 175757, + 175890, + 175915, + 175662, + 175498, + 175498, + 175782, + 175309, + 175762, + 175767, + 175562, + 175562, + 175720, + 175772, + 175772, + 175717, + 176120, + 175721, + 175819, + 175819, + 175543, + 175718, + 175579, + 175853, + 175632, + 175632, + 175539, + 175681, + 175618, + 175657, + 175813, + 175813, + 175522, + 175655, + 175779, + 175616, + 175378, + 175803, + 175803, + 175450, + 175450, + 175693, + 175493, + 175629, + 175502, + 175684, + 175834, + 175758, + 175679, + 175679, + 175685, + 175723, + 175656, + 175656, + 175626, + 175384, + 175769, + 175373, + 175687, + 175700, + 175648, + 176077, + 175785, + 175673, + 175760, + 175698, + 175698, + 175644, + 175964, + 175966, + 175656, + 175606, + 175653, + 175653, + 175356, + 175601, + 176121, + 175712, + 175720, + 175546, + 175717, + 175810, + 175810, + 175965, + 175776, + 175812, + 175712, + 175622, + 175746, + 175691, + 175694, + 175652, + 175750, + 175713, + 175840, + 175694, + 175621, + 175605, + 175605, + 175775, + 175448, + 175654, + 175654, + 175635, + 175628, + 175628, + 175662, + 175820, + 175570, + 175636, + 175626, + 175658, + 175766, + 175556, + 175788, + 175597, + 175655, + 175596, + 175567, + 175582, + 175689, + 175567, + 175567, + 175365, + 175365, + 175792, + 175694, + 175605, + 176168, + 175927, + 175583, + 175583, + 175759, + 175557, + 175802, + 175482, + 175482, + 175624, + 175818, + 175818, + 175756, + 175544, + 175544, + 175887, + 175856, + 175858, + 175356, + 175693, + 175457, + 175457, + 175557, + 175755, + 175755, + 175549, + 176159, + 176159, + 175631, + 175631, + 175627, + 175593, + 175593, + 175660, + 175505, + 175796, + 175520, + 175586, + 175581, + 175581, + 175625, + 176564, + 176843, + 175868, + 175867, + 175652, + 175829, + 175894, + 176928, + 175521, + 175660, + 180008, + 176043, + 176043, + 176055, + 183752, + 180444, + 178782, + 175468, + 179199, + 178454, + 176003, + 176710, + 176060, + 180731, + 178109, + 175776, + 175776, + 183290, + 175647, + 180972, + 184163, + 184476, + 175846, + 178771, + 175956, + 175956, + 176781, + 182132, + 182014, + 183681, + 179485, + 183086, + 183086, + 175862, + 180878, + 175608, + 179859, + 179859, + 175591, + 175473, + 175473, + 175733, + 175715, + 182375, + 183506, + 177747, + 177747, + 175811, + 176999, + 175581, + 184127, + 175568, + 183869, + 175767, + 175700, + 175639, + 184290, + 175828, + 183806, + 182735, + 175764, + 177215, + 177215, + 184312, + 184312, + 175817, + 184126, + 184126, + 180775, + 184418, + 184137, + 175767, + 175767, + 184076, + 184076, + 184193, + 184193, + 175732, + 175732, + 184019, + 176480, + 176480, + 184254 + ], + "sample_count": 1265 + }, + { + "pubkey": "97PRy85EbpsJ95GhR4quo6R5j3Cbu3HrqaEVLpFBoBZi", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "24BSx7hccdhYhkjhhyaTJH1he3nu3HC9JYXvg4pv1XxX", + "target_exchange_pk": "DU6YKau1Cjocxrb87BNEbBBnkiKmgHjRVbVoEZP4Nigu", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242238000000, + "samples": [ + 13013, + 12917, + 12778, + 12857, + 12943, + 12959, + 12883, + 12908, + 12863, + 12919, + 12758, + 12771, + 12906, + 12850, + 13007, + 12986, + 12777, + 12960, + 12789, + 12699, + 12952, + 12789, + 12890, + 12909, + 12857, + 12806, + 12776, + 12857, + 12840, + 13042, + 13143, + 12780, + 12786, + 12858, + 12914, + 12954, + 13032, + 13128, + 12904, + 12859, + 12907, + 12857, + 12891, + 12766, + 12988, + 13426, + 12986, + 12829, + 13080, + 12940, + 13063, + 12876, + 13074, + 12795, + 12757, + 12969, + 12804, + 12843, + 12933, + 12958, + 12926, + 12913, + 12885, + 12880, + 12832, + 13087, + 12799, + 13227, + 12891, + 12858, + 12903, + 12883, + 13155, + 12925, + 13026, + 13285, + 12919, + 12817, + 12844, + 12815, + 13131, + 12984, + 12882, + 12954, + 12918, + 12954, + 12825, + 12827, + 12785, + 12961, + 13584, + 12819, + 12870, + 12797, + 12843, + 12916, + 12958, + 13764, + 12892, + 12838, + 12995, + 12812, + 12840, + 12761, + 12833, + 13066, + 12818, + 12901, + 12874, + 12869, + 12958, + 12888, + 13017, + 12977, + 13280, + 12849, + 12982, + 12727, + 12908, + 12935, + 13285, + 12743, + 12906, + 12933, + 12901, + 13204, + 12984, + 13254, + 12892, + 12778, + 12913, + 13020, + 13010, + 12928, + 12965, + 13014, + 12823, + 13046, + 12963, + 12965, + 13076, + 12769, + 13237, + 12973, + 12894, + 12792, + 13044, + 12923, + 12774, + 12850, + 12922, + 12988, + 13045, + 12982, + 12922, + 12974, + 13131, + 13156, + 12983, + 12785, + 13125, + 13110, + 13075, + 12959, + 13023, + 12933, + 12888, + 12750, + 12973, + 12837, + 12869, + 12792, + 13006, + 12905, + 12913, + 13046, + 12885, + 12931, + 13342, + 12973, + 14439, + 12870, + 12868, + 13010, + 12729, + 13009, + 12761, + 13090, + 13074, + 12776, + 12911, + 12873, + 12962, + 13847, + 13109, + 12947, + 12859, + 12744, + 12908, + 12735, + 12907, + 12952, + 12986, + 12904, + 12753, + 12903, + 12814, + 12828, + 12789, + 12925, + 13050, + 12956, + 12890, + 12772, + 12916, + 12945, + 12788, + 13073, + 12880, + 12756, + 12889, + 12909, + 12899, + 12905, + 12951, + 13028, + 12924, + 12810, + 12871, + 12818, + 12893, + 12864, + 13012, + 12904, + 12748, + 12863, + 12790, + 12795, + 12899, + 12991, + 12852, + 12713, + 13034, + 12920, + 12839, + 13014, + 12882, + 13096, + 13046, + 12792, + 12752, + 12760, + 12844, + 12986, + 12966, + 13025, + 12814, + 12917, + 12792, + 12694, + 12858, + 12840, + 12918, + 12934, + 12743, + 12925, + 12779, + 12890, + 12824, + 12900, + 12889, + 12916, + 12858, + 12817, + 12994, + 12973, + 12800, + 13118, + 12899, + 12850, + 12847, + 12843, + 12813, + 12784, + 13236, + 12918, + 12852, + 12782, + 12838, + 12912, + 13249, + 12987, + 13113, + 12890, + 12773, + 12829, + 12871, + 12823, + 12745, + 12906, + 12988, + 12896, + 13029, + 12748, + 12832, + 12884, + 12902, + 12943, + 12919, + 12721, + 12764, + 12819, + 12919, + 12858, + 13041, + 13020, + 12748, + 12825, + 12910, + 12878, + 13054, + 12912, + 13724, + 12901, + 12927, + 12833, + 12720, + 12920, + 12718, + 12964, + 12883, + 12857, + 12948, + 12920, + 12940, + 13255, + 12916, + 13074, + 12975, + 12736, + 12918, + 12818, + 13029, + 12776, + 12947, + 12897, + 12810, + 12783, + 12799, + 12805, + 12869, + 12963, + 13061, + 12879, + 13068, + 12996, + 12880, + 12866, + 12905, + 12940, + 13320, + 12988, + 12970, + 12814, + 12996, + 12932, + 12841, + 13093, + 12859, + 13035, + 12952, + 12735, + 13026, + 12821, + 13135, + 13161, + 12826, + 12910, + 13050, + 12903, + 13033, + 13024, + 12974, + 12814, + 13109, + 12900, + 12943, + 12902, + 12895, + 13055, + 13065, + 12967, + 12871, + 13061, + 12961, + 13092, + 13061, + 13041, + 13186, + 12875, + 13058, + 12849, + 13062, + 13048, + 12882, + 13027, + 12944, + 12863, + 12845, + 12734, + 13252, + 12929, + 13006, + 12980, + 12983, + 12796, + 12823, + 12777, + 12987, + 13330, + 12969, + 13006, + 13036, + 12905, + 12841, + 13016, + 13006, + 13251, + 12925, + 12814, + 12904, + 12881, + 12924, + 13000, + 13606, + 12912, + 12888, + 13049, + 12788, + 12880, + 13112, + 12881, + 13085, + 12825, + 12875, + 12823, + 12788, + 12882, + 12991, + 12972, + 13326, + 12795, + 12901, + 12779, + 12825, + 12924, + 12931, + 13228, + 12972, + 12827, + 13061, + 12790, + 12828, + 12954, + 12975, + 13163, + 12980, + 12786, + 12909, + 12828, + 13065, + 12814, + 13377, + 13043, + 12794, + 13016, + 12934, + 12867, + 13112, + 12938, + 13225, + 12821, + 12805, + 12863, + 12894, + 13104, + 12898, + 13080, + 12791, + 12880, + 12874, + 12800, + 12944, + 12884, + 12831, + 12930, + 12863, + 13003, + 12835, + 12968, + 12948, + 13098, + 13081, + 12918, + 12973, + 12836, + 12892, + 12809, + 12981, + 13081, + 12981, + 12848, + 13145, + 12962, + 12968, + 13020, + 12977, + 13088, + 13134, + 12993, + 13092, + 12754, + 12849, + 12868, + 12996, + 12874, + 12932, + 12835, + 12905, + 12760, + 13596, + 12906, + 13179, + 12802, + 12775, + 12796, + 12877, + 12853, + 12806, + 12939, + 13106, + 12951, + 12864, + 12890, + 12787, + 13016, + 13048, + 12955, + 12968, + 12907, + 12884, + 12945, + 12718, + 12749, + 12855, + 13136, + 12938, + 12818, + 12791, + 12861, + 12932, + 12855, + 12937, + 13136, + 12867, + 12941, + 12724, + 12871, + 12832, + 12907, + 12857, + 12934, + 12764, + 12853, + 12715, + 12785, + 13046, + 13298, + 12934, + 13122, + 13021, + 14170, + 13051, + 14342, + 12993, + 12942, + 13970, + 12911, + 12780, + 12870, + 14742, + 12868, + 13296, + 12994, + 12867, + 12937, + 12932, + 12859, + 12936, + 13008, + 13085, + 12829, + 12933, + 12856, + 12833, + 12866, + 12949, + 13279, + 13057, + 13182, + 13059, + 12819, + 13061, + 12764, + 12847, + 12970, + 12952, + 12853, + 12877, + 12873, + 13002, + 12784, + 13198, + 12911, + 13108, + 12990, + 12980, + 13023, + 13055, + 12982, + 13697, + 12884, + 12858, + 12916, + 12831, + 12929, + 12846, + 13109, + 12840, + 12787, + 12995, + 12936, + 12936, + 13021, + 12868, + 13053, + 13065, + 12878, + 12961, + 13010, + 12989, + 12895, + 13078, + 12835, + 12872, + 12826, + 12945, + 12892, + 12915, + 13141, + 12927, + 12846, + 12739, + 12959, + 12858, + 12959, + 12773, + 13003, + 12892, + 12771, + 12883, + 12776, + 12797, + 12911, + 12997, + 13064, + 12858, + 12962, + 12812, + 13018, + 13586, + 12775, + 13103, + 12973, + 12915, + 12796, + 12766, + 12997, + 12984, + 12951, + 12883, + 12879, + 12908, + 12977, + 12910, + 12915, + 12971, + 13214, + 12964, + 12723, + 12895, + 12761, + 12882, + 12859, + 12911, + 12924, + 12865, + 13023, + 12847, + 12820, + 12964, + 12863, + 12933, + 12786, + 12797, + 12739, + 12821, + 12907, + 12906, + 13098, + 12904, + 13035, + 12860, + 12789, + 12838, + 12939, + 13005, + 13437, + 13188, + 12975, + 12904, + 12814, + 12876, + 12860, + 13002, + 13014, + 12905, + 12821, + 12916, + 12932, + 12898, + 12850, + 13084, + 12783, + 12929, + 12906, + 12950, + 12842, + 12879, + 13063, + 13035, + 12798, + 12825, + 12847, + 12947, + 12924, + 12818, + 12953, + 12920, + 12831, + 13341, + 12733, + 12786, + 12885, + 13088, + 12927, + 13062, + 12877, + 12848, + 12925, + 12913, + 12913, + 13129, + 12951, + 12941, + 12956, + 13008, + 12916, + 12938, + 13035, + 12980, + 13031, + 12908, + 12824, + 12907, + 12984, + 12805, + 13094, + 13055, + 12832, + 12915, + 12757, + 13323, + 12882, + 13088, + 12872, + 12855, + 12866, + 12910, + 12781, + 12895, + 13053, + 13046, + 12868, + 12836, + 13043, + 12878, + 13003, + 13007, + 12866, + 13066, + 12943, + 13092, + 12901, + 12855, + 12997, + 12746, + 13040, + 13051, + 12930, + 12857, + 12857, + 12854, + 12899, + 13012, + 13014, + 12914, + 12906, + 12833, + 12851, + 12951, + 12824, + 13030, + 12885, + 12951, + 12881, + 12876, + 12886, + 12779, + 12968, + 13068, + 12875, + 12794, + 12863, + 12796, + 12862, + 12840, + 12915, + 13025, + 12726, + 12916, + 12840, + 12921, + 12854, + 12869, + 13100, + 12875, + 12696, + 12882, + 12789, + 13336, + 12857, + 13123, + 12878, + 12940, + 12894, + 12777, + 12772, + 13007, + 13001, + 13169, + 12961, + 12878, + 12888, + 12959, + 13018, + 12901, + 13113, + 12937, + 12873, + 12935, + 12889, + 12878, + 12840, + 13200, + 13117, + 12938, + 13012, + 12933, + 12939, + 12991, + 13053, + 12945, + 12894, + 12993, + 13059, + 12859, + 13025, + 12935, + 12828, + 13140, + 12946, + 12946, + 12998, + 12998, + 12943, + 12970, + 12893, + 12912, + 12912, + 13083, + 12977, + 13010, + 12890, + 12890, + 13070, + 12746, + 12746, + 12855, + 13012, + 12805, + 12813, + 12813, + 12837, + 13015, + 12865, + 12991, + 12859, + 12972, + 12972, + 12964, + 12964, + 12898, + 13206, + 13206, + 12717, + 12837, + 12886, + 12790, + 12790, + 13177, + 12999, + 12941, + 12941, + 12933, + 12858, + 12839, + 12836, + 12872, + 12890, + 12919, + 12903, + 12922, + 12922, + 12814, + 13041, + 13041, + 12921, + 12865, + 12865, + 12755, + 12755, + 12960, + 13727, + 13727, + 12834, + 12834, + 12831, + 12843, + 12843, + 13026, + 13201, + 12931, + 12931, + 13020, + 12745, + 12893, + 12893, + 12826, + 13069, + 12864, + 12817, + 12922, + 12922, + 12881, + 13002, + 13002, + 12957, + 12957, + 13023, + 12835, + 12835, + 12996, + 12923, + 12929, + 12929, + 12951, + 12790, + 12790, + 12795, + 12952, + 13022, + 12938, + 12938, + 12938, + 12764, + 12778, + 12778, + 12887, + 13241, + 12853, + 12853, + 12947, + 12796, + 12796, + 12864, + 13045, + 13045, + 12830, + 12955, + 12821, + 13212, + 13212, + 13248, + 12935, + 12935, + 13149, + 12858, + 12858, + 12941, + 12941, + 12939, + 12939, + 12914, + 12917, + 12917, + 12899, + 12821, + 13126, + 13126, + 12996, + 12909, + 12738, + 12898, + 12898, + 12977, + 12937, + 12937, + 12961, + 12961, + 12843, + 12843, + 13000, + 12891, + 12966, + 13007, + 13007, + 12886, + 12845, + 13134, + 13134, + 13309, + 12968, + 12920, + 12981, + 12981, + 13044, + 13044, + 13142, + 12872, + 12752, + 13020, + 12800, + 12899, + 12899, + 12897, + 13026, + 13026, + 12933, + 12875, + 12770, + 12787, + 12790, + 12790, + 13086, + 13044, + 12899, + 12777, + 12738, + 12738, + 13126, + 13126, + 13017, + 12863, + 12909, + 12899, + 12908, + 12690, + 13072, + 13072, + 12728, + 13209, + 13209, + 12731, + 12731, + 12812, + 12903, + 12903, + 12838, + 12983, + 12810, + 12894, + 12908, + 13261, + 12795, + 12795, + 12851, + 12851, + 13485, + 12842, + 13014, + 12972, + 12791, + 13111, + 13016, + 12820, + 12889, + 12882, + 12882, + 13077, + 12965, + 12843, + 12819, + 12846, + 12746, + 12907, + 12907, + 12879, + 12973, + 12795, + 13158, + 13158, + 13193, + 12787, + 12891, + 12789, + 12789, + 12745, + 12810, + 12810, + 12885, + 12955, + 12916, + 12901, + 13092, + 13092, + 13756, + 13386, + 12834, + 13078, + 12885, + 12794, + 12865, + 12893, + 12882, + 12882, + 12917, + 12712, + 12931, + 12931, + 12929, + 12838, + 12965, + 13219, + 13279, + 12986, + 13230, + 12683, + 12766, + 12805, + 12805, + 13050, + 12791, + 12791, + 12875, + 12862, + 13066, + 13066, + 13544, + 12955, + 12955, + 12885, + 12736, + 12736, + 12871, + 12871, + 12967, + 12798, + 12781, + 12903, + 12918, + 13819, + 12774, + 12989, + 12989, + 13230, + 12898, + 12898, + 12921, + 12887, + 12887, + 12991, + 12821, + 12811, + 12888, + 12888, + 12902, + 12857, + 13479, + 13479, + 12918, + 12849, + 12798, + 12798, + 12952, + 12952, + 12969, + 12878, + 12878, + 12802, + 12802, + 13004, + 12808, + 13195, + 12757, + 12757, + 13334, + 12932, + 12799, + 12799, + 12977, + 12977, + 12962, + 12949, + 12924, + 12830, + 12830, + 13030, + 13122, + 13122, + 12924, + 12784, + 12784, + 13190, + 12851, + 12851, + 12888, + 12949, + 12900, + 12836, + 12927, + 12837, + 12850, + 12850, + 12922, + 12885, + 12883, + 12792, + 12792, + 12879 + ], + "sample_count": 1270 + }, + { + "pubkey": "CU4Go8gE8Wj4P2UYgzDLmF8RyTxVxJQPjbfq9WVH6PgN", + "epoch": 89, + "data_provider_name": "ripeatlas", + "oracle_agent_pk": "HWGQSTmXWMB85NY2vFLhM1nGpXA8f4VCARRyeGNbqDF1", + "origin_exchange_pk": "2XUdR3jmwc8691Ci4AahH7zVaSfcNNM4qb2waho2oERo", + "target_exchange_pk": "2No5V8pDS7rYs8HGFcZEx37yGaNE4bi88p8bfuJqweFL", + "sampling_interval_us": 120000000, + "start_timestamp_us": 1757242367000000, + "samples": [ + 89525, + 86288, + 89576, + 89576, + 83684, + 86256, + 86256, + 83876, + 86588, + 86588, + 83719, + 83719, + 86407, + 83713, + 89346, + 86366, + 83812, + 86237, + 83885, + 89328, + 86550, + 86550, + 86506, + 86506, + 83922, + 89782, + 83529, + 89282, + 89329, + 83631, + 89377, + 89395, + 89535, + 83601, + 83557, + 86349, + 89561, + 89477, + 89463, + 86259, + 83593, + 83593, + 83447, + 89407, + 86451, + 86346, + 83680, + 86251, + 86251, + 86358, + 89316, + 83437, + 86350, + 89467, + 89393, + 89393, + 83875, + 83875, + 89500, + 89500, + 86324, + 86180, + 86457, + 83557, + 89448, + 83693, + 89340, + 83591, + 83538, + 89375, + 83596, + 89456, + 89453, + 89550, + 86223, + 83749, + 86389, + 86320, + 86320, + 83464, + 86100, + 86213, + 86213, + 83593, + 86388, + 89325, + 83313, + 89510, + 89312, + 89357, + 89357, + 86409, + 89351, + 89351, + 86733, + 83582, + 89540, + 83812, + 83821, + 89374, + 83734, + 83620, + 86341, + 86183, + 86183, + 89786, + 89216, + 89483, + 89413, + 89625, + 89625, + 89566, + 89288, + 86347, + 86704, + 86348, + 86463, + 83454, + 83841, + 83581, + 83581, + 89276, + 86363, + 86363, + 86543, + 86281, + 86401, + 86425, + 89527, + 89335, + 89335, + 83957, + 83678, + 83604, + 89642, + 83732, + 89338, + 86433, + 89490, + 89427, + 86557, + 86557, + 86588, + 86463, + 86286, + 86286, + 89592, + 89592, + 89266, + 84611, + 86458, + 89528, + 89405, + 83731, + 86501, + 89548, + 86385, + 86437, + 83800, + 86296, + 86401, + 83660, + 86377, + 86426, + 86426, + 86543, + 86270, + 86220, + 89304, + 89368, + 86351, + 86654, + 89621, + 89368, + 89368, + 89738, + 89418, + 96152, + 86267, + 86419, + 86255, + 89589, + 83551, + 83607, + 86368, + 83803, + 86289, + 86333, + 89603, + 86362, + 89412, + 89267, + 89267, + 89353, + 86319, + 86299, + 86337, + 86423, + 89360, + 89668, + 89399, + 89364, + 89453, + 83652, + 83652, + 86438, + 83788, + 83788, + 86321, + 86321, + 86254, + 89733, + 83800, + 83800, + 87311, + 86300, + 89600, + 86285, + 83663, + 83663, + 86214, + 86387, + 83703, + 83703, + 83933, + 83933, + 86629, + 86197, + 86485, + 89479, + 89492, + 86242, + 89526, + 89430, + 83679, + 83657, + 83654, + 83815, + 89300, + 86558, + 89327, + 86431, + 86431, + 86535, + 86406, + 86614, + 89404, + 89404, + 89512, + 89412, + 89166, + 86626, + 86625, + 86625, + 89277, + 89377, + 89791, + 86192, + 89536, + 86331, + 83738, + 86354, + 89409, + 83847, + 86510, + 89760, + 84587, + 84587, + 86330, + 83701, + 89549, + 89549, + 83858, + 86475, + 83556, + 83556, + 86823, + 86433, + 86266, + 89334, + 83533, + 89435, + 83660, + 89576, + 89254, + 89254, + 89331, + 89537, + 89537, + 83657, + 83490, + 86380, + 86380, + 89459, + 89199, + 86180, + 83784, + 89312, + 83759, + 83759, + 86119, + 86133, + 83685, + 86329, + 83754, + 86247, + 89530, + 83727, + 86507, + 89486, + 89485, + 86148, + 83358, + 89375, + 89274, + 89545, + 86219, + 86390, + 86339, + 86339, + 89540, + 89540, + 89407, + 89407, + 83516, + 89485, + 83794, + 89432, + 89575, + 89473, + 86151, + 83480, + 86154, + 86154, + 83490, + 83450, + 86194, + 86393, + 89262, + 89262, + 86597, + 89346, + 83955, + 89533, + 89385, + 89448, + 90274, + 86160, + 89428, + 86345, + 86345, + 86306, + 89854, + 83545, + 83548, + 83548, + 83643, + 83781, + 86628, + 86628, + 86340, + 86402, + 86127, + 89475, + 89592, + 89457, + 89258, + 83479, + 89572, + 86293, + 86337, + 86337, + 83593, + 83741, + 83570, + 83671, + 86269, + 89298, + 86307, + 83598, + 86202, + 86597, + 86193, + 86193, + 89321, + 89743, + 89221, + 83522, + 83397, + 83461, + 89285, + 89285, + 89420, + 86243, + 86243, + 89510, + 86841, + 83566, + 86250, + 86318, + 86379, + 89357, + 89403, + 89403, + 89256, + 89256, + 86143, + 89233, + 89539, + 83630, + 86082, + 89510, + 86200, + 86281, + 83613, + 86171, + 86309, + 83700, + 83700, + 86120, + 86439, + 86255, + 86319, + 86319, + 86145, + 83359, + 86196, + 86434, + 89302, + 89326, + 89326, + 89316, + 89441, + 89206, + 86416, + 86080, + 86080, + 89234, + 83723, + 83685, + 86147, + 83538, + 86126, + 86126, + 89386, + 86387, + 89337, + 89390, + 89215, + 83667, + 86232, + 86232, + 86450, + 86403, + 86403, + 83729, + 89339, + 89377, + 89936, + 89936, + 86260, + 83468, + 83443, + 83784, + 86389, + 86410, + 83550, + 89349, + 83615, + 86266, + 89451, + 89451, + 89435, + 86051, + 83659, + 86224, + 89603, + 86306, + 83562, + 86324, + 86324, + 89357, + 86372, + 86388, + 86365, + 89583, + 86398, + 86136, + 86136, + 89383, + 83592, + 83629, + 83629, + 83619, + 89339, + 89824, + 86360, + 86360, + 89790, + 86096, + 86223, + 86512, + 89482, + 83696, + 83696, + 89380, + 89409, + 86361, + 86474, + 83536, + 83421, + 89434, + 89379, + 89379, + 89385, + 86357, + 83578, + 86368, + 83720, + 83764, + 86271, + 89385, + 83595, + 83543, + 86473, + 83572, + 90093, + 86225, + 83610, + 83610, + 83666, + 89525, + 86465, + 86323, + 89545, + 89358, + 83556, + 89463, + 84127, + 89439, + 89235, + 83420, + 89633, + 89633, + 89643, + 89474, + 83724, + 86224, + 89608, + 89619, + 89619, + 89334, + 83568, + 89664, + 83524, + 89369, + 86402, + 86467, + 83730, + 86358, + 83660, + 89148, + 89363, + 83665, + 86497, + 86497, + 86497, + 89417, + 83691, + 86344, + 89270, + 89270, + 86297, + 86345, + 86388, + 89310, + 89310, + 90053, + 86175, + 86175, + 83345, + 89427, + 86526, + 89967, + 89330, + 89586, + 86326, + 83401, + 86317, + 86079, + 86079, + 83505, + 83505, + 86330, + 89282, + 83716, + 86247, + 89474, + 83759, + 86321, + 89206, + 89395, + 89395, + 86176, + 86176, + 86462, + 86304, + 83795, + 83795, + 83766, + 83653, + 89464, + 83704, + 83788, + 86090, + 86090, + 83679, + 86271, + 86325, + 83818, + 83818, + 90037, + 90037, + 83439, + 89334, + 86315, + 86236, + 86285, + 83761, + 83761, + 83669, + 83341, + 83341, + 86206, + 86351, + 83654, + 86300, + 86266, + 86339, + 86257, + 89282, + 89174, + 89503, + 83505, + 83495, + 83405, + 89406, + 83434, + 83434, + 89458, + 83395, + 89202, + 86259, + 83427, + 83427, + 86285, + 86300, + 89452, + 89210, + 83657, + 83657, + 89265, + 86132, + 86132, + 89347, + 83440, + 86205, + 86205, + 86125, + 86125, + 83468, + 89246, + 86303, + 83703, + 86216, + 89285, + 86046, + 89145, + 89260, + 83620, + 83620, + 83475, + 86161, + 86161, + 89242, + 89242, + 89278, + 89359, + 89237, + 89237, + 83381, + 86192, + 86192, + 89469, + 89288, + 83468, + 86205, + 83421, + 86454, + 86386, + 86386, + 89442, + 89444, + 89365, + 89339, + 83434, + 86119, + 86365, + 86233, + 83420, + 83403, + 83546, + 89307, + 89307, + 89469, + 83449, + 86355, + 83726, + 83710, + 83538, + 83538, + 86575, + 83425, + 89444, + 83562, + 86369, + 89323, + 89323, + 89627, + 86660, + 83530, + 86062, + 89271, + 86340, + 83884, + 86148, + 83606, + 89240, + 86158, + 86158, + 86481, + 89327, + 86291, + 86217, + 86217, + 89309, + 89470, + 83605, + 84027, + 84869, + 89317, + 89254, + 89254, + 86281, + 89287, + 89287, + 86458, + 86458, + 89442, + 89442, + 89409, + 89477, + 89477, + 86283, + 86030, + 83724, + 83562, + 89404, + 89289, + 83601, + 83601, + 89305, + 86252, + 86058, + 83706, + 83490, + 86129, + 89402, + 89402, + 83963, + 86166, + 83356, + 90785, + 86084, + 83536, + 86240, + 83350, + 89295, + 86502, + 86113, + 89328, + 89328, + 86073, + 89420, + 83628, + 89271, + 89271, + 90044, + 86398, + 89451, + 89345, + 89335, + 83644, + 83644, + 89263, + 89352, + 89409, + 86110, + 83389, + 89272, + 83451, + 83451, + 86331, + 86161, + 83606, + 86083, + 83460, + 89178, + 89132, + 83459, + 86136, + 86233, + 89210, + 86014, + 86014, + 89155, + 89155, + 89149, + 86343, + 86056, + 86337, + 89470, + 89197, + 83479, + 86121, + 86121, + 83515, + 89622, + 86280, + 89323, + 89323, + 89218, + 86205, + 83406, + 86383, + 86215, + 83720, + 83720, + 85955, + 86368, + 89260, + 83893, + 86227, + 89264, + 83506, + 83506, + 86074, + 89344, + 89507, + 86353, + 89402, + 86624, + 86123, + 86123, + 89197, + 83459, + 83562, + 89379, + 83655, + 83517, + 86228, + 86155, + 83471, + 86350, + 86172, + 86172, + 89581, + 89389, + 89235, + 83409, + 89351, + 86066, + 86347, + 86215, + 83453, + 83453, + 83567, + 83813, + 83813, + 89176, + 86356, + 83907, + 86205, + 86117, + 86190, + 83658, + 83613, + 83397, + 89378, + 83502, + 89268, + 86456, + 84435, + 89525, + 83530, + 83530, + 86452, + 86143, + 89578, + 89410, + 89410, + 83478, + 89179, + 89179, + 86483, + 89411, + 89430, + 83495, + 86025, + 89151, + 86315, + 86241, + 83813, + 89501, + 86322, + 83806, + 86179, + 89428, + 86213, + 89444, + 83599, + 83599, + 86185, + 83526, + 86396, + 89401, + 89401, + 89556, + 89210, + 89320, + 89488, + 89488, + 83672, + 86290, + 86599, + 89291, + 89221, + 83844, + 96602, + 96602, + 98526, + 95187, + 100283, + 100283, + 100283, + 101134, + 100457, + 95107, + 96896, + 98097, + 97894, + 94616, + 95358, + 95358, + 95358, + 100688, + 100369, + 86369, + 86369, + 83635, + 83790, + 83790, + 86166, + 86322, + 90982, + 90982, + 83679, + 86112, + 89334, + 86313, + 86304, + 86304, + 83694, + 83694, + 89386, + 86473, + 83829, + 83578, + 83578, + 89493, + 86479, + 86308, + 86230, + 86271, + 86282, + 89351, + 89351, + 83446, + 83446, + 83641, + 83457, + 89426, + 89426, + 89644, + 86342, + 86479, + 89506, + 86402, + 86584, + 86511, + 83645, + 83645, + 89572, + 89521, + 89449, + 86219, + 83468, + 83468, + 83554, + 89426, + 89426, + 83627, + 89532, + 86359, + 86303, + 86303, + 83628, + 83446, + 86384, + 89600, + 83413, + 83413, + 86362, + 83499, + 89353, + 86401, + 86145, + 86145, + 83592, + 89226, + 87544, + 86153, + 89292, + 83747, + 83747, + 83549, + 83549, + 89437, + 89454, + 89715, + 89509, + 89397, + 89328, + 83530, + 86192, + 86192, + 89262, + 89589, + 86546, + 86546, + 83609, + 89431, + 83669, + 89311, + 86253, + 86309, + 83738, + 86461, + 83572, + 89348, + 89404, + 86617, + 86617, + 86576, + 89359, + 86382, + 83590, + 86346, + 89382, + 89382, + 86365, + 86061, + 86354, + 89376, + 89415, + 83442, + 86361, + 83480, + 83480, + 89293, + 86239, + 89441, + 89882, + 89459, + 83491, + 83491, + 86483, + 86672, + 83708, + 83771, + 86209, + 86526, + 83571, + 86370, + 86370, + 89602, + 86365, + 89391, + 89391, + 89368, + 86246, + 86246, + 89567, + 86222, + 86222, + 83616, + 89444, + 83613, + 83647, + 89610, + 83847, + 83598, + 86469, + 86209, + 83598, + 86201, + 86234, + 89626, + 89626, + 89391, + 89391, + 83581, + 89339, + 86222, + 86494, + 86278, + 89367, + 89367, + 83697, + 83482, + 86217, + 86468, + 86468, + 83455, + 86272, + 86272, + 86546, + 89269, + 89269, + 89317, + 89482, + 83583, + 83554, + 83744, + 83635, + 83635, + 89224, + 83611, + 83611, + 89537, + 83682, + 83682, + 86301, + 86301, + 86258, + 89439, + 89439, + 83549, + 89465, + 89370, + 86370, + 89491, + 83536, + 83536, + 86344, + 89347, + 86429, + 86307, + 83575, + 89622, + 86310, + 83702, + 86637, + 89544, + 86313, + 89658, + 90510, + 90510, + 95896, + 90285, + 96063, + 96049, + 95841, + 90297, + 96046, + 96076, + 95782, + 90370, + 90445, + 95999, + 96020, + 96020, + 89444, + 83692, + 86362, + 83391, + 86181, + 86353, + 83651, + 89615, + 89615, + 89377, + 89311, + 83484, + 86104, + 86157, + 83586, + 83586, + 83984, + 89385, + 89385, + 89226, + 89226, + 83588, + 86425, + 86425, + 83461, + 83554, + 86173, + 86339, + 89337, + 89337, + 83954, + 86256, + 89370, + 86268, + 89390, + 86162, + 83799, + 86491, + 89355, + 86324, + 86743, + 86351, + 83529, + 86341, + 86181, + 86181, + 86245, + 89416, + 86366, + 89362, + 89362, + 89492, + 83639, + 84043, + 83604, + 83604, + 89398, + 89398, + 86506, + 89264, + 86252, + 86252, + 86335, + 89359, + 89359, + 83762 + ], + "sample_count": 1268 + } + ] + }, + "start_us": 1757242125634381, + "end_us": 1757394955634381, + "fetched_at": "2025-09-11T19:36:48.173261Z" +} diff --git a/offchain/crates/passport-cli/Cargo.toml b/offchain/crates/passport-cli/Cargo.toml new file mode 100644 index 0000000000..09c4bd8755 --- /dev/null +++ b/offchain/crates/passport-cli/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "doublezero-passport-cli" + +# Workspace inherited keys +version.workspace = true +edition.workspace = true +authors.workspace = true +readme.workspace = true +license.workspace = true +repository.workspace = true +homepage.workspace = true + +# RFC-20 module crate: library-only, no [[bin]]. The unified `doublezero` +# binary (and the offchain `doublezero-solana` binary) mount the exported +# `Command` enum and drive it through `execute(ctx, out)`. +[lib] +name = "doublezero_passport_cli" + +[dependencies] +clap.workspace = true +serde.workspace = true +serde_json.workspace = true +solana-compute-budget-interface.workspace = true +thiserror.workspace = true +tracing.workspace = true +url.workspace = true +solana-client.workspace = true +solana-sdk.workspace = true + +doublezero-cli-core.workspace = true + +# Offchain workspace crates that own the passport transports/state. +doublezero-solana-client-tools.workspace = true +doublezero-solana-sdk.workspace = true +doublezero-ledger-sentinel.workspace = true +doublezero_sdk.workspace = true + +[dev-dependencies] +tokio.workspace = true diff --git a/offchain/crates/passport-cli/src/access_validation.rs b/offchain/crates/passport-cli/src/access_validation.rs new file mode 100644 index 0000000000..f227817320 --- /dev/null +++ b/offchain/crates/passport-cli/src/access_validation.rs @@ -0,0 +1,312 @@ +use std::io::Write; + +use doublezero_ledger_sentinel::{ + client::solana::SolRpcClientType, constants::ENV_PREVIOUS_LEADER_EPOCHS, +}; +use doublezero_solana_client_tools::rpc::SolanaConnection; +use solana_client::rpc_response::RpcContactInfo; +use solana_sdk::pubkey::Pubkey; + +use crate::{ + error::{PassportCliError, Result}, + util::find_node_by_node_id, +}; + +pub async fn validate_validator_access( + out: &mut W, + connection: &SolanaConnection, + sol_client: &C, + primary_validator_id: &Pubkey, + backup_validator_ids: &[Pubkey], + leader_schedule_epochs: Option, +) -> Result> +where + C: SolRpcClientType + Sync, + W: Write, +{ + let nodes = connection.get_cluster_nodes().await?; + if nodes.is_empty() { + return Err(PassportCliError::ClusterNodesUnavailable); + } + + validate_validator_access_with_nodes( + out, + &nodes, + sol_client, + primary_validator_id, + backup_validator_ids, + leader_schedule_epochs, + ) + .await +} + +pub async fn validate_validator_access_with_nodes( + out: &mut W, + nodes: &[RpcContactInfo], + sol_client: &C, + primary_validator_id: &Pubkey, + backup_validator_ids: &[Pubkey], + leader_schedule_epochs: Option, +) -> Result> +where + C: SolRpcClientType + Sync, + W: Write, +{ + let mut errors = Vec::::new(); + let leader_schedule_epochs = leader_schedule_epochs.unwrap_or(ENV_PREVIOUS_LEADER_EPOCHS); + + writeln!( + out, + "Primary validator 🖥️ 💎:\n ID: {primary_validator_id} " + )?; + if let Some(node) = find_node_by_node_id(nodes, primary_validator_id) { + writeln!( + out, + " Gossip: ✅ OK ({})", + node.gossip.as_ref().map(|g| g.ip()).unwrap() + )?; + write!(out, " Leader scheduler: ")?; + + if sol_client + .is_scheduled_leader(primary_validator_id, leader_schedule_epochs) + .await? + { + write!(out, " ✅ OK ")?; + } else { + write!(out, " ❌ Invalid ")?; + errors.push(format!( + "Primary validator ID ({primary_validator_id}) is not an active staked validator. The primary must have stake delegated and be participating in the leader scheduler." + )); + } + } else { + writeln!(out, " ❌ Gossip Fail")?; + errors.push(format!( + "Primary validator ID ({primary_validator_id}) is not visible in gossip. The primary validator must appear in gossip to be considered active." + )); + } + writeln!(out)?; + + if !backup_validator_ids.is_empty() { + writeln!(out, "\nBackup validator 🖥️ 🛟: ")?; + + for backup_id in backup_validator_ids { + write!(out, " ID: {backup_id}\n Gossip: ")?; + + if let Some(ip) = sol_client.get_validator_ip(backup_id).await? { + writeln!(out, " ✅ OK ({ip})")?; + write!(out, " Leader scheduler: ")?; + + if sol_client + .is_scheduled_leader(backup_id, leader_schedule_epochs) + .await? + { + writeln!(out, " ❌ Fail (on leader scheduler)")?; + errors.push(format!( + "Backup validator ID ({backup_id}) should not be on leader scheduler. It must be a non-leader scheduled validator." + )); + } else { + writeln!(out, " ✅ OK (not a leader scheduled validator)")?; + } + } else { + writeln!(out, "❌ Gossip Fail")?; + errors.push(format!( + "Backup validator ID ({backup_id}) is not visible in gossip. Backup validators must appear in gossip to be considered valid." + )); + } + } + } + + Ok(errors) +} + +pub fn should_continue_after_validation( + out: &mut W, + errors: &[String], + force: bool, +) -> Result { + if errors.is_empty() { + return Ok(true); + } + + writeln!(out, "\nErrors found:")?; + for error in errors { + writeln!(out, " - {error}")?; + } + + if force { + writeln!(out, "Proceeding despite validation errors (--force).")?; + Ok(true) + } else { + Ok(false) + } +} + +#[cfg(test)] +mod tests { + use std::net::{Ipv4Addr, SocketAddr}; + + use doublezero_ledger_sentinel::{ + client::solana::MockSolRpcClientType, constants::ENV_PREVIOUS_LEADER_EPOCHS, + }; + use solana_client::rpc_response::RpcContactInfo; + use solana_sdk::pubkey::Pubkey; + + use super::{should_continue_after_validation, validate_validator_access_with_nodes}; + + fn make_contact_info(pubkey: &Pubkey, gossip: Option) -> RpcContactInfo { + RpcContactInfo { + pubkey: pubkey.to_string(), + gossip, + tvu: None, + tpu: None, + tpu_quic: None, + tpu_forwards: None, + tpu_forwards_quic: None, + tpu_vote: None, + serve_repair: None, + rpc: None, + pubsub: None, + version: None, + feature_set: None, + shred_version: None, + } + } + + #[tokio::test] + async fn validation_succeeds_with_default_leader_schedule_epochs() { + let primary = Pubkey::new_unique(); + let backup = Pubkey::new_unique(); + let nodes = vec![ + make_contact_info( + &primary, + Some(SocketAddr::from((Ipv4Addr::LOCALHOST, 8001))), + ), + make_contact_info(&backup, Some(SocketAddr::from((Ipv4Addr::LOCALHOST, 8002)))), + ]; + + let mut client = MockSolRpcClientType::new(); + + { + let primary_clone = primary; + client + .expect_is_scheduled_leader() + .withf(move |validator_id, epochs| { + validator_id == &primary_clone && *epochs == ENV_PREVIOUS_LEADER_EPOCHS + }) + .returning(|_, _| Ok(true)); + } + { + let backup_clone = backup; + client + .expect_get_validator_ip() + .withf(move |validator_id| validator_id == &backup_clone) + .returning(|_| Ok(Some(Ipv4Addr::LOCALHOST))); + } + { + let backup_clone = backup; + client + .expect_is_scheduled_leader() + .withf(move |validator_id, epochs| { + validator_id == &backup_clone && *epochs == ENV_PREVIOUS_LEADER_EPOCHS + }) + .returning(|_, _| Ok(false)); + } + + let mut out = Vec::new(); + let errors = validate_validator_access_with_nodes( + &mut out, + &nodes, + &client, + &primary, + &[backup], + None, + ) + .await + .unwrap(); + + assert!(errors.is_empty()); + } + + #[tokio::test] + async fn validation_fails_for_missing_primary_and_leader_backup() { + let primary = Pubkey::new_unique(); + let backup = Pubkey::new_unique(); + let nodes = vec![make_contact_info( + &backup, + Some(SocketAddr::from((Ipv4Addr::LOCALHOST, 8002))), + )]; + + let mut client = MockSolRpcClientType::new(); + { + let backup_clone = backup; + client + .expect_get_validator_ip() + .withf(move |validator_id| validator_id == &backup_clone) + .returning(|_| Ok(Some(Ipv4Addr::LOCALHOST))); + } + { + let backup_clone = backup; + client + .expect_is_scheduled_leader() + .withf(move |validator_id, epochs| { + validator_id == &backup_clone && *epochs == ENV_PREVIOUS_LEADER_EPOCHS + }) + .returning(|_, _| Ok(true)); + } + + let mut out = Vec::new(); + let errors = validate_validator_access_with_nodes( + &mut out, + &nodes, + &client, + &primary, + &[backup], + None, + ) + .await + .unwrap(); + + assert_eq!(errors.len(), 2); + assert!(errors.iter().any(|e| e.contains("not visible in gossip"))); + assert!( + errors + .iter() + .any(|e| e.contains("should not be on leader scheduler")) + ); + } + + #[test] + fn should_continue_respects_force_flag() { + let errors = vec!["some error".to_string()]; + let mut out = Vec::new(); + assert!(!should_continue_after_validation(&mut out, &errors, false).unwrap()); + let mut out = Vec::new(); + assert!(should_continue_after_validation(&mut out, &errors, true).unwrap()); + } + + #[tokio::test] + async fn validation_uses_custom_leader_schedule_epochs() { + let primary = Pubkey::new_unique(); + let nodes = vec![make_contact_info( + &primary, + Some(SocketAddr::from((Ipv4Addr::LOCALHOST, 8001))), + )]; + + let mut client = MockSolRpcClientType::new(); + { + let primary_clone = primary; + client + .expect_is_scheduled_leader() + .withf(move |validator_id, epochs| validator_id == &primary_clone && *epochs == 1) + .returning(|_, _| Ok(true)); + } + + let mut out = Vec::new(); + let errors = + validate_validator_access_with_nodes(&mut out, &nodes, &client, &primary, &[], Some(1)) + .await + .unwrap(); + + assert!(errors.is_empty()); + } +} diff --git a/offchain/crates/passport-cli/src/command.rs b/offchain/crates/passport-cli/src/command.rs new file mode 100644 index 0000000000..720c655658 --- /dev/null +++ b/offchain/crates/passport-cli/src/command.rs @@ -0,0 +1,36 @@ +//! Top-level passport subcommand enum, mounted by the binary. + +use std::io::Write; + +use clap::Subcommand; +use doublezero_cli_core::CliContext; + +use crate::{error::Result, fetch, find_validator, prepare_access, request_access}; + +/// The passport module's verbs. Variant names and their argument surfaces match +/// the pre-RFC-20 `doublezero-solana passport` commands one-for-one, so the +/// user-facing CLI is unchanged. +#[derive(Debug, Subcommand)] +pub enum Command { + /// Fetch and display the current program configuration and access request (if any) + Fetch(fetch::FetchArgs), + /// Find and display the Current Identity + FindValidator(find_validator::FindValidatorArgs), + /// Validate arguments and generate the required transaction signature command + PrepareValidatorAccess(prepare_access::PrepareValidatorAccessArgs), + /// Request access as a Solana Validator + RequestValidatorAccess(request_access::RequestValidatorAccessArgs), +} + +impl Command { + /// Dispatch to the selected verb. All output is written to `out`; all + /// configuration is read from `ctx`. + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + match self { + Command::Fetch(args) => args.execute(ctx, out).await, + Command::FindValidator(args) => args.execute(ctx, out).await, + Command::PrepareValidatorAccess(args) => args.execute(ctx, out).await, + Command::RequestValidatorAccess(args) => args.execute(ctx, out).await, + } + } +} diff --git a/offchain/crates/passport-cli/src/error.rs b/offchain/crates/passport-cli/src/error.rs new file mode 100644 index 0000000000..3039c23e61 --- /dev/null +++ b/offchain/crates/passport-cli/src/error.rs @@ -0,0 +1,94 @@ +//! Typed errors for the passport CLI verbs. +//! +//! This crate is a reusable library, so it owns neither `anyhow` nor `eyre`. +//! Every verb returns [`PassportCliError`] and each consumer lifts it into its +//! own application error with a single `?` (the `solana-cli` adapter into +//! `anyhow`, the unified `doublezero` binary into `eyre`). Because every +//! conversion is a real `From` rather than a `"{e:#}"` string flatten, the cause +//! chain survives all the way to the binary instead of collapsing into one line. + +use solana_sdk::pubkey::Pubkey; + +/// Errors surfaced by the passport verbs. +#[derive(Debug, thiserror::Error)] +pub enum PassportCliError { + // Boxed to keep the enum small (`ClientError` is ~260 bytes); see + // `clippy::result_large_err`. A manual `From` does the boxing + // so `?` still works at call sites. + #[error(transparent)] + Rpc(Box), + + #[error(transparent)] + ParsePubkey(#[from] solana_sdk::pubkey::ParsePubkeyError), + + #[error(transparent)] + ParseSignature(#[from] solana_sdk::signature::ParseSignatureError), + + #[error(transparent)] + ParseUrl(#[from] url::ParseError), + + #[error("failed to parse IP address: {0}")] + ParseIp(#[from] std::net::AddrParseError), + + #[error(transparent)] + Utf8(#[from] std::str::Utf8Error), + + #[error(transparent)] + Json(#[from] serde_json::Error), + + #[error(transparent)] + Io(#[from] std::io::Error), + + #[error(transparent)] + Sentinel(#[from] doublezero_ledger_sentinel::Error), + + #[error("Unable to fetch cluster nodes. Is your RPC endpoint correct?")] + ClusterNodesUnavailable, + + #[error("Failed to resolve an IPv4 address")] + Ipv4ResolutionFailed, + + #[error("Failed to extract the IP from the response")] + IpExtractionFailed, + + #[error("Access request not found for service key {service_key}")] + AccessRequestNotFound { + service_key: Pubkey, + #[source] + source: Box, + }, + + #[error("Access request already exists: {0}")] + AccessRequestExists(Pubkey), + + #[error("Signature verification failed")] + SignatureVerificationFailed, + + /// Catch-all for foreign errors surfaced by dependencies that expose + /// `anyhow::Error` (the `Wallet` transaction helpers, zero-copy account + /// fetches, instruction building) or other boxed sources. The boxed value + /// keeps the underlying cause chain intact, so `?`-lifting into `anyhow` + /// or `eyre` at the boundary still prints the full chain. + #[error(transparent)] + Other(Box), +} + +impl From for PassportCliError { + fn from(err: solana_client::client_error::ClientError) -> Self { + PassportCliError::Rpc(Box::new(err)) + } +} + +/// Convenience alias used throughout the crate. +pub type Result = std::result::Result; + +impl PassportCliError { + /// Wrap a foreign error (typically `anyhow::Error` from a dependency) into + /// [`PassportCliError::Other`], preserving its cause chain. + pub fn other(err: E) -> Self + where + E: Into>, + { + PassportCliError::Other(err.into()) + } +} diff --git a/offchain/crates/passport-cli/src/fetch.rs b/offchain/crates/passport-cli/src/fetch.rs new file mode 100644 index 0000000000..ed6635ef05 --- /dev/null +++ b/offchain/crates/passport-cli/src/fetch.rs @@ -0,0 +1,346 @@ +use std::io::Write; + +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::rpc::SolanaConnection; +use doublezero_solana_sdk::passport::{ + instruction::AccessMode, + state::{AccessRequest, ProgramConfig}, +}; +use serde::Serialize; +use solana_sdk::pubkey::Pubkey; + +use crate::{ + error::{PassportCliError, Result}, + output::{emit_json, is_json}, +}; + +#[derive(Debug, Args)] +pub struct FetchArgs { + #[arg(long)] + pub config: bool, + + #[arg(long, value_name = "DOUBLEZERO_PUBKEY")] + pub access_request: Option, +} + +#[derive(Serialize)] +struct ProgramConfigView { + program_config: String, + is_paused: bool, + is_request_access_paused: bool, + admin_key: String, + sentinel_key: String, + request_deposit_sol: f64, + request_fee_sol: f64, + solana_validator_backup_ids_limit: u64, +} + +#[derive(Serialize)] +struct AccessRequestView { + access_request: String, + service_key: String, + rent_beneficiary_key: String, + request_fee_sol: f64, + access_mode: String, +} + +/// Combined JSON document emitted when both `--config` and `--access-request` +/// are requested, so the output is a single valid object rather than two +/// back-to-back ones (which would choke `jq`). +#[derive(Serialize)] +struct FetchView { + program_config: ProgramConfigView, + access_request: AccessRequestView, +} + +fn access_mode_label(access_request: &AccessRequest) -> &'static str { + match access_request.checked_access_mode() { + Some(AccessMode::SolanaValidator(_)) => "Solana validator", + Some(AccessMode::SolanaValidatorWithBackupIds { .. }) => "Solana validator with backup IDs", + None => "Unknown", + } +} + +impl FetchArgs { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + tracing::debug!(env = %ctx.env, "passport fetch"); + + let connection = SolanaConnection::new(ctx.solana_l1_rpc_url.clone()); + let format = ctx.output_format; + + if is_json(format) { + let program_config = if self.config { + let (program_config_key, program_config) = + fetch_program_config(&connection).await?; + Some(ProgramConfigView { + program_config: program_config_key.to_string(), + is_paused: program_config.is_paused(), + is_request_access_paused: program_config.is_request_access_paused(), + admin_key: program_config.admin_key.to_string(), + sentinel_key: program_config.sentinel_key.to_string(), + request_deposit_sol: program_config.request_deposit_lamports as f64 * 1e-9, + request_fee_sol: program_config.request_fee_lamports as f64 * 1e-9, + solana_validator_backup_ids_limit: program_config + .solana_validator_backup_ids_limit + as u64, + }) + } else { + None + }; + + let access_request = if let Some(service_key) = self.access_request { + let (access_request_key, access_request) = + fetch_access_request(&connection, &service_key).await?; + Some(AccessRequestView { + access_request: access_request_key.to_string(), + service_key: access_request.service_key.to_string(), + rent_beneficiary_key: access_request.rent_beneficiary_key.to_string(), + request_fee_sol: access_request.request_fee_lamports as f64 * 1e-9, + access_mode: access_mode_label(&access_request).to_string(), + }) + } else { + None + }; + + match (program_config, access_request) { + (Some(program_config), Some(access_request)) => emit_json( + out, + &FetchView { + program_config, + access_request, + }, + format, + )?, + (Some(program_config), None) => emit_json(out, &program_config, format)?, + (None, Some(access_request)) => emit_json(out, &access_request, format)?, + (None, None) => {} + } + + return Ok(()); + } + + // Human-readable path: reproduces the exact pre-RFC-20 output. + if self.config { + let (program_config_key, program_config) = fetch_program_config(&connection).await?; + write_program_config_human(out, &program_config_key, &program_config)?; + } + + // NOTE: If an access request is found, the sentinel is not doing its job. + if let Some(access_request) = self.access_request { + let (access_request_key, access_request) = + fetch_access_request(&connection, &access_request).await?; + write_access_request_human(out, &access_request_key, &access_request)?; + } + + Ok(()) + } +} + +/// Render the program-config pipe-table exactly as the pre-RFC-20 CLI did. +fn write_program_config_human( + out: &mut W, + program_config_key: &Pubkey, + program_config: &ProgramConfig, +) -> Result<()> { + writeln!(out, "Program config: {program_config_key}")?; + writeln!(out)?; + writeln!(out, "Parameter | Value")?; + writeln!( + out, + "----------------------------------+-------------------------------------------------" + )?; + writeln!( + out, + "Is program paused? | {}", + program_config.is_paused() + )?; + writeln!( + out, + "Is request access paused? | {}", + program_config.is_request_access_paused() + )?; + writeln!( + out, + "Admin key | {}", + program_config.admin_key + )?; + writeln!( + out, + "Sentinel key | {}", + program_config.sentinel_key + )?; + writeln!( + out, + "Request deposit | {:.9} SOL", + program_config.request_deposit_lamports as f64 * 1e-9 + )?; + writeln!( + out, + "Request fee | {:.9} SOL", + program_config.request_fee_lamports as f64 * 1e-9 + )?; + writeln!( + out, + "Solana validator backup IDs limit | {}", + program_config.solana_validator_backup_ids_limit + )?; + writeln!(out)?; + Ok(()) +} + +/// Render the access-request pipe-table exactly as the pre-RFC-20 CLI did. +fn write_access_request_human( + out: &mut W, + access_request_key: &Pubkey, + access_request: &AccessRequest, +) -> Result<()> { + let access_mode_str = access_mode_label(access_request); + + writeln!(out, "Access request: {access_request_key}")?; + writeln!(out)?; + writeln!(out, "Field | Value")?; + writeln!( + out, + "---------------------+-------------------------------------------------" + )?; + writeln!(out, "Service key | {}", access_request.service_key)?; + writeln!( + out, + "Rent beneficiary key | {}", + access_request.rent_beneficiary_key + )?; + writeln!( + out, + "Request fee | {:.9} SOL", + access_request.request_fee_lamports as f64 * 1e-9 + )?; + writeln!(out, "Access mode | {access_mode_str}")?; + writeln!(out)?; + Ok(()) +} + +async fn fetch_program_config(connection: &SolanaConnection) -> Result<(Pubkey, ProgramConfig)> { + let (program_config_key, _) = ProgramConfig::find_address(); + + let program_config = connection + .try_fetch_zero_copy_data(&program_config_key) + .await + .map_err(PassportCliError::other)?; + Ok((program_config_key, *program_config)) +} + +async fn fetch_access_request( + connection: &SolanaConnection, + service_key: &Pubkey, +) -> Result<(Pubkey, AccessRequest)> { + let (access_request_key, _) = AccessRequest::find_address(service_key); + + let access_request = connection + .try_fetch_zero_copy_data(&access_request_key) + .await + .map_err(|e| PassportCliError::AccessRequestNotFound { + service_key: *service_key, + source: e.into(), + })?; + + Ok((access_request_key, *access_request.mucked_data)) +} + +#[cfg(test)] +mod tests { + use solana_sdk::pubkey::Pubkey; + + use super::*; + + #[test] + fn program_config_human_output_matches_legacy_layout() { + let key = Pubkey::new_from_array([7u8; 32]); + let admin = Pubkey::new_from_array([1u8; 32]); + let sentinel = Pubkey::new_from_array([2u8; 32]); + + // `ProgramConfig` has private padding fields, so build from `default()` + // and assign the public fields rather than using struct-update syntax. + let mut program_config = ProgramConfig::default(); + program_config.admin_key = admin; + program_config.sentinel_key = sentinel; + program_config.request_deposit_lamports = 1_500_000_000; // 1.5 SOL + program_config.request_fee_lamports = 250_000; // 0.00025 SOL + program_config.solana_validator_backup_ids_limit = 8; + program_config.set_is_paused(false); + program_config.set_is_request_access_paused(true); + + let mut out = Vec::new(); + write_program_config_human(&mut out, &key, &program_config).unwrap(); + let rendered = String::from_utf8(out).unwrap(); + + // Golden layout: exact column widths, separators, SOL precision, and the + // blank lines that bracket the table. Pubkeys are interpolated so the + // assertion pins the layout rather than specific base58 strings. + let expected = format!( + "Program config: {key}\n\ +\n\ +Parameter | Value\n\ +----------------------------------+-------------------------------------------------\n\ +Is program paused? | false\n\ +Is request access paused? | true\n\ +Admin key | {admin}\n\ +Sentinel key | {sentinel}\n\ +Request deposit | 1.500000000 SOL\n\ +Request fee | 0.000250000 SOL\n\ +Solana validator backup IDs limit | 8\n\ +\n" + ); + assert_eq!(rendered, expected); + } + + #[test] + fn request_fee_keeps_nine_decimal_precision() { + let key = Pubkey::new_from_array([7u8; 32]); + let mut program_config = ProgramConfig::default(); + program_config.request_fee_lamports = 1; // 0.000000001 SOL + + let mut out = Vec::new(); + write_program_config_human(&mut out, &key, &program_config).unwrap(); + let rendered = String::from_utf8(out).unwrap(); + + assert!( + rendered.contains("Request fee | 0.000000001 SOL"), + "9-decimal SOL precision must be preserved, got:\n{rendered}" + ); + } + + #[test] + fn access_request_human_output_matches_legacy_layout() { + let key = Pubkey::new_from_array([7u8; 32]); + let service = Pubkey::new_from_array([3u8; 32]); + let rent = Pubkey::new_from_array([4u8; 32]); + + let access_request = AccessRequest { + service_key: service, + rent_beneficiary_key: rent, + request_fee_lamports: 250_000, // 0.00025 SOL + ..Default::default() + }; + + let mut out = Vec::new(); + write_access_request_human(&mut out, &key, &access_request).unwrap(); + let rendered = String::from_utf8(out).unwrap(); + + // A zeroed encoded access mode decodes as the first borsh variant + // (`SolanaValidator` with a zeroed attestation), so the label reads + // "Solana validator". + let expected = format!( + "Access request: {key}\n\ +\n\ +Field | Value\n\ +---------------------+-------------------------------------------------\n\ +Service key | {service}\n\ +Rent beneficiary key | {rent}\n\ +Request fee | 0.000250000 SOL\n\ +Access mode | Solana validator\n\ +\n" + ); + assert_eq!(rendered, expected); + } +} diff --git a/offchain/crates/passport-cli/src/find_validator.rs b/offchain/crates/passport-cli/src/find_validator.rs new file mode 100644 index 0000000000..d28e0bbedd --- /dev/null +++ b/offchain/crates/passport-cli/src/find_validator.rs @@ -0,0 +1,307 @@ +use std::{io::Write, net::Ipv4Addr, sync::Arc}; + +use clap::Args; +use doublezero_cli_core::{CliContext, OutputFormat}; +use doublezero_ledger_sentinel::{ + client::solana::SolRpcClient, constants::ENV_PREVIOUS_LEADER_EPOCHS, +}; +use doublezero_sdk::get_doublezero_pubkey; +use doublezero_solana_client_tools::rpc::SolanaConnection; +use serde::Serialize; +use solana_client::rpc_response::RpcContactInfo; +use solana_sdk::{pubkey::Pubkey, signature::Keypair, signer::Signer}; +use url::Url; + +use crate::{ + error::{PassportCliError, Result}, + output::{emit_json, is_json}, + util::{find_node_by_ip, find_node_by_node_id, identify_cluster, try_get_public_ipv4}, +}; + +#[derive(Debug, Args)] +pub struct FindValidatorArgs { + #[arg(long, value_name = "PUBKEY")] + pub validator_id: Option, + + #[arg(long, value_name = "IP_ADDRESS")] + pub gossip_ip: Option, +} + +impl FindValidatorArgs { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let format = ctx.output_format; + if is_json(format) { + self.run_json(ctx, out, format).await + } else { + self.run_human(ctx, out).await + } + } + + /// Human-readable output. Reproduces the exact pre-RFC-20 behavior, including + /// branch-specific warnings and the print-and-return handling of parse / IP + /// detection failures. + async fn run_human(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + tracing::debug!(env = %ctx.env, "passport find-validator"); + + writeln!(out, "DoubleZero Passport - Find Validator")?; + + let connection = SolanaConnection::new(ctx.solana_l1_rpc_url.clone()); + let sol_client = + SolRpcClient::new(Url::parse(&connection.url())?, Arc::new(Keypair::new())); + + let cluster = identify_cluster(&connection).await?; + writeln!(out, "Connected to Solana: {cluster}\n")?; + + if let Ok(kp) = get_doublezero_pubkey() { + writeln!(out, "DoubleZero ID: {}", kp.pubkey())?; + } + + let nodes = connection.get_cluster_nodes().await?; + if nodes.is_empty() { + return Err(PassportCliError::ClusterNodesUnavailable); + } + + if let Some(node_id) = self.validator_id { + render_node_id_node(&nodes, &node_id, &sol_client, out).await?; + } else if let Some(ip_str) = self.gossip_ip { + let server_ip: Ipv4Addr = match ip_str.parse() { + Ok(addr) => addr, + Err(e) => { + writeln!(out, "Failed to parse server IP: {e}")?; + return Ok(()); + } + }; + render_ip_node(&nodes, server_ip, &sol_client, out).await?; + } else { + match try_get_public_ipv4() { + Ok(ip) => { + writeln!(out, "Detected public IP: {ip}")?; + let server_ip: Ipv4Addr = match ip.parse() { + Ok(addr) => addr, + Err(e) => { + writeln!(out, "Failed to parse detected public IP: {e}")?; + return Ok(()); + } + }; + render_ip_node(&nodes, server_ip, &sol_client, out).await?; + } + Err(e) => writeln!(out, "Failed to get public IP: {e}")?, + } + } + + Ok(()) + } + + /// Additive JSON output for the read verb. Collects the same lookup into a + /// serializable view. + async fn run_json( + self, + ctx: &CliContext, + out: &mut impl Write, + format: OutputFormat, + ) -> Result<()> { + tracing::debug!(env = %ctx.env, "passport find-validator (json)"); + + let connection = SolanaConnection::new(ctx.solana_l1_rpc_url.clone()); + let sol_client = + SolRpcClient::new(Url::parse(&connection.url())?, Arc::new(Keypair::new())); + + let mut view = ValidatorLookupView { + cluster: identify_cluster(&connection).await?.to_string(), + doublezero_id: get_doublezero_pubkey() + .ok() + .map(|kp| kp.pubkey().to_string()), + ..Default::default() + }; + + let nodes = connection.get_cluster_nodes().await?; + if nodes.is_empty() { + return Err(PassportCliError::ClusterNodesUnavailable); + } + + let node: Option<&RpcContactInfo> = if let Some(node_id) = self.validator_id { + find_node_by_node_id(&nodes, &node_id) + } else if let Some(ip_str) = self.gossip_ip { + let server_ip: Ipv4Addr = ip_str.parse()?; + find_node_by_ip(&nodes, server_ip) + } else { + let ip = try_get_public_ipv4()?; + view.detected_public_ip = Some(ip.clone()); + let server_ip: Ipv4Addr = ip.parse()?; + find_node_by_ip(&nodes, server_ip) + }; + + match node { + Some(node) => { + let in_leader_schedule = leader_status(&sol_client, node).await?; + view.validator_id = Some(node.pubkey.clone()); + view.gossip_ip = Some( + node.gossip + .as_ref() + .map(|g| g.ip().to_string()) + .unwrap_or_else(|| "".to_string()), + ); + view.in_leader_schedule = Some(in_leader_schedule); + view.role = Some( + if in_leader_schedule { + "primary" + } else { + "backup" + } + .to_string(), + ); + view.visible_in_gossip = true; + } + None => { + view.visible_in_gossip = false; + view.warning = Some(NOT_IN_GOSSIP_WARNING.to_string()); + } + } + + emit_json(out, &view, format) + } +} + +/// Resolve whether `node` is a scheduled leader. Shared by the human and JSON +/// paths so the pubkey parse and `is_scheduled_leader` lookup live in one place. +async fn leader_status(sol_client: &SolRpcClient, node: &RpcContactInfo) -> Result { + let pubkey = node.pubkey.parse::()?; + Ok(sol_client + .is_scheduled_leader(&pubkey, ENV_PREVIOUS_LEADER_EPOCHS) + .await?) +} + +/// Look up a node by node ID and render it (human path). +async fn render_node_id_node( + nodes: &[RpcContactInfo], + node_id: &Pubkey, + sol_client: &SolRpcClient, + out: &mut W, +) -> Result<()> { + if let Some(node) = find_node_by_node_id(nodes, node_id) { + print_node_info(node, sol_client, out).await + } else { + writeln!( + out, + "⚠️ Warning: Your node ID is not appearing in gossip. Your validator must be visible in gossip in order to connect to DoubleZero." + )?; + Ok(()) + } +} + +/// Look up a node by gossip IP and render it (human path). Shared by the +/// `--gossip-ip` and detected-public-IP branches. +async fn render_ip_node( + nodes: &[RpcContactInfo], + server_ip: Ipv4Addr, + sol_client: &SolRpcClient, + out: &mut W, +) -> Result<()> { + if let Some(node) = find_node_by_ip(nodes, server_ip) { + print_node_info(node, sol_client, out).await + } else { + writeln!( + out, + "⚠️ Warning: Your IP is not appearing in gossip. Your validator must be visible in gossip in order to connect to DoubleZero." + )?; + Ok(()) + } +} + +#[derive(Debug, Default, Serialize)] +struct ValidatorLookupView { + cluster: String, + #[serde(skip_serializing_if = "Option::is_none")] + doublezero_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + detected_public_ip: Option, + #[serde(skip_serializing_if = "Option::is_none")] + validator_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + gossip_ip: Option, + #[serde(skip_serializing_if = "Option::is_none")] + in_leader_schedule: Option, + #[serde(skip_serializing_if = "Option::is_none")] + role: Option, + visible_in_gossip: bool, + #[serde(skip_serializing_if = "Option::is_none")] + warning: Option, +} + +const NOT_IN_GOSSIP_WARNING: &str = + "Your validator must be visible in gossip in order to connect to DoubleZero."; + +async fn print_node_info( + node: &RpcContactInfo, + sol_client: &SolRpcClient, + out: &mut W, +) -> Result<()> { + writeln!(out, "Validator ID: {}", node.pubkey)?; + match &node.gossip { + Some(gossip) => writeln!(out, "Gossip IP: {}", gossip.ip())?, + None => writeln!(out, "Gossip IP: ")?, + } + + if leader_status(sol_client, node).await? { + writeln!(out, "In Leader scheduler")?; + writeln!( + out, + "✅ This validator can connect as a primary in DoubleZero 🖥️ 💎. It is a leader scheduled validator." + )?; + } else { + writeln!( + out, + "✅ This validator can only connect as a backup in DoubleZero 🖥️ 🛟. It is not leader scheduled and cannot act as a primary validator." + )?; + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use std::net::Ipv4Addr; + + use super::*; + + fn dummy_client() -> SolRpcClient { + // No network calls happen on the not-in-gossip paths (the node is never + // found), so any well-formed URL works. + SolRpcClient::new( + Url::parse("http://127.0.0.1:8899").unwrap(), + Arc::new(Keypair::new()), + ) + } + + #[tokio::test] + async fn node_id_not_in_gossip_emits_node_id_warning() { + let sol_client = dummy_client(); + let mut out = Vec::new(); + + render_node_id_node(&[], &Pubkey::new_unique(), &sol_client, &mut out) + .await + .unwrap(); + + let rendered = String::from_utf8(out).unwrap(); + assert_eq!( + rendered, + "⚠️ Warning: Your node ID is not appearing in gossip. Your validator must be visible in gossip in order to connect to DoubleZero.\n" + ); + } + + #[tokio::test] + async fn ip_not_in_gossip_emits_ip_warning() { + let sol_client = dummy_client(); + let mut out = Vec::new(); + + render_ip_node(&[], Ipv4Addr::LOCALHOST, &sol_client, &mut out) + .await + .unwrap(); + + let rendered = String::from_utf8(out).unwrap(); + assert_eq!( + rendered, + "⚠️ Warning: Your IP is not appearing in gossip. Your validator must be visible in gossip in order to connect to DoubleZero.\n" + ); + } +} diff --git a/offchain/crates/passport-cli/src/lib.rs b/offchain/crates/passport-cli/src/lib.rs new file mode 100644 index 0000000000..3bec2d3676 --- /dev/null +++ b/offchain/crates/passport-cli/src/lib.rs @@ -0,0 +1,26 @@ +//! RFC-20 module crate for the `doublezero passport` subcommand tree. +//! +//! See `rfcs/rfc20-cli-standardization.md`. This crate is library-only: it +//! exports a [`Command`] enum that derives clap's `Subcommand` and exposes an +//! async `execute(self, ctx: &CliContext, out: &mut impl Write)` on each verb. +//! All environment-derived configuration is read from [`CliContext`]; the crate +//! never reads environment variables, config files, or `argv` directly, and all +//! output is routed through the supplied writer. +//! +//! Both the unified `doublezero` binary and the offchain `doublezero-solana` +//! binary mount the same [`Command`] enum and supply their own `CliContext`. + +mod access_validation; +pub mod command; +pub mod error; +pub mod fetch; +pub mod find_validator; +mod output; +pub mod prepare_access; +pub mod request_access; +mod shared; +mod util; + +pub use command::Command; +pub use error::{PassportCliError, Result}; +pub use shared::SharedAccessArgs; diff --git a/offchain/crates/passport-cli/src/output.rs b/offchain/crates/passport-cli/src/output.rs new file mode 100644 index 0000000000..35b45fb8f8 --- /dev/null +++ b/offchain/crates/passport-cli/src/output.rs @@ -0,0 +1,34 @@ +//! Shared output-format helpers for the read verbs (`fetch`, `find-validator`). +//! +//! The `--json` / `--json-compact` flags are additive: when neither is set the +//! verbs reproduce the exact pre-RFC-20 human-readable output. The output format +//! is the single source of truth carried on [`CliContext::output_format`]; these +//! helpers keep the JSON-emission logic in one place. + +use std::io::Write; + +use doublezero_cli_core::OutputFormat; +use serde::Serialize; + +use crate::error::Result; + +/// True when the resolved format requests JSON output. +pub fn is_json(format: OutputFormat) -> bool { + matches!(format, OutputFormat::Json | OutputFormat::JsonCompact) +} + +/// Serialize `value` as JSON (compact or pretty per `format`), terminated by a +/// newline. +pub fn emit_json( + out: &mut W, + value: &T, + format: OutputFormat, +) -> Result<()> { + let rendered = if matches!(format, OutputFormat::JsonCompact) { + serde_json::to_string(value)? + } else { + serde_json::to_string_pretty(value)? + }; + writeln!(out, "{rendered}")?; + Ok(()) +} diff --git a/offchain/crates/passport-cli/src/prepare_access.rs b/offchain/crates/passport-cli/src/prepare_access.rs new file mode 100644 index 0000000000..a1c1709261 --- /dev/null +++ b/offchain/crates/passport-cli/src/prepare_access.rs @@ -0,0 +1,97 @@ +use std::{io::Write, sync::Arc}; + +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_ledger_sentinel::client::solana::SolRpcClient; +use doublezero_solana_client_tools::rpc::SolanaConnection; +use doublezero_solana_sdk::passport::{ + instruction::{AccessMode, SolanaValidatorAttestation}, + state::AccessRequest, +}; +use solana_sdk::signature::Keypair; +use url::Url; + +use crate::{ + access_validation::{should_continue_after_validation, validate_validator_access}, + error::Result, + shared::SharedAccessArgs, + util::identify_cluster, +}; + +#[derive(Debug, Args)] +pub struct PrepareValidatorAccessArgs { + #[command(flatten)] + pub shared: SharedAccessArgs, + + #[arg(long, default_value_t = false)] + pub force: bool, +} + +impl PrepareValidatorAccessArgs { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + self.run(ctx, out).await + } + + async fn run(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + tracing::debug!(env = %ctx.env, "passport prepare-validator-access"); + + let SharedAccessArgs { + doublezero_address, + primary_validator_id, + backup_validator_ids, + leader_schedule_epochs, + } = self.shared; + + let connection = SolanaConnection::new(ctx.solana_l1_rpc_url.clone()); + let sol_client = + SolRpcClient::new(Url::parse(&connection.url())?, Arc::new(Keypair::new())); + + let cluster = identify_cluster(&connection).await?; + writeln!( + out, + "DoubleZero Passport - Prepare Validator Access Request" + )?; + writeln!(out, "Connected to Solana: {cluster}")?; + writeln!(out, "\nDoubleZero Address: {doublezero_address}\n")?; + + let errors = validate_validator_access( + out, + &connection, + &sol_client, + &primary_validator_id, + &backup_validator_ids, + leader_schedule_epochs, + ) + .await?; + if !should_continue_after_validation(out, &errors, self.force)? { + return Ok(()); + } + + writeln!( + out, + "\n\nTo request access, sign the following message with your validator's identity key:\n" + )?; + + let attestation = SolanaValidatorAttestation { + validator_id: primary_validator_id, + service_key: doublezero_address, + ed25519_signature: [0u8; 64], + }; + + let raw_message = if backup_validator_ids.is_empty() { + AccessRequest::access_request_message(&AccessMode::SolanaValidator(attestation)) + } else { + AccessRequest::access_request_message(&AccessMode::SolanaValidatorWithBackupIds { + attestation, + backup_ids: backup_validator_ids.clone(), + }) + }; + + writeln!( + out, + "solana sign-offchain-message \\\n {raw_message} \\\n -k \n" + )?; + + Ok(()) + } +} diff --git a/offchain/crates/passport-cli/src/request_access.rs b/offchain/crates/passport-cli/src/request_access.rs new file mode 100644 index 0000000000..046b114bff --- /dev/null +++ b/offchain/crates/passport-cli/src/request_access.rs @@ -0,0 +1,237 @@ +use std::{io::Write, str::FromStr, sync::Arc}; + +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_ledger_sentinel::client::solana::SolRpcClient; +use doublezero_solana_client_tools::{ + payer::{SolanaPayerOptions, SolanaSignerOptions, TransactionOutcome, Wallet}, + rpc::{SolanaConnection, SolanaConnectionOptions}, +}; +use doublezero_solana_sdk::{ + passport::{ + ID, + instruction::{ + AccessMode, PassportInstructionData, SolanaValidatorAttestation, + account::RequestAccessAccounts, + }, + state::AccessRequest, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{ + offchain_message::OffchainMessage, + signature::{Keypair, Signature}, +}; +use url::Url; + +use crate::{ + access_validation::{should_continue_after_validation, validate_validator_access}, + error::{PassportCliError, Result}, + shared::SharedAccessArgs, + util::identify_cluster, +}; + +#[derive(Debug, Args)] +pub struct RequestValidatorAccessArgs { + #[command(flatten)] + pub shared: SharedAccessArgs, + /// Base58-encoded ed25519 signature of the access request message (service_key=AAA,backup_ids=BBBB,CCCC,DDDD) + #[arg(long, short = 's', value_name = "BASE58_STRING")] + pub signature: String, + + /// Continue and submit transaction even if validation fails + #[arg(long = "force", hide = true, default_value_t = false)] + pub force: bool, + + /// Offchain message version. ONLY 0 IS SUPPORTED. + #[arg(long, value_name = "U8", default_value = "0")] + pub message_version: u8, + + // --- Transaction-building knobs (per RFC-20 these are verb-owned, not + // global connection/identity config; connection + keypair come from + // `CliContext`). These mirror the legacy `SolanaSignerOptions` flags so the + // offchain CLI surface is unchanged. + /// Set the compute unit price for transaction in increments of 0.000001 lamports per compute unit. + #[arg(long, value_name = "MICROLAMPORTS", env)] + pub with_compute_unit_price: Option, + + /// Print verbose output. + #[arg( + long, + short = 'v', + value_name = "VERBOSE", + default_value = "false", + env + )] + pub verbose: bool, + + /// Filepath or URL to keypair to pay transaction fee. + #[arg(long = "fee-payer", value_name = "KEYPAIR", env)] + pub fee_payer_path: Option, + + /// Simulate transaction only. + #[arg(long, value_name = "DRY_RUN", env)] + pub dry_run: bool, +} + +impl RequestValidatorAccessArgs { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + self.run(ctx, out).await + } + + async fn run(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + tracing::debug!(env = %ctx.env, "passport request-validator-access"); + + let wallet = self.build_wallet(ctx)?; + + writeln!(out, "DoubleZero Passport - Request Validator Access")?; + + let cluster = identify_cluster(&wallet.connection).await?; + writeln!(out, "Connected to Solana: {cluster}")?; + writeln!( + out, + "\nDoubleZero Address: {}\n", + self.shared.doublezero_address + )?; + + let sol_client = SolRpcClient::new( + Url::parse(&wallet.connection.url())?, + Arc::new(Keypair::new()), + ); + + let validation_errors = validate_validator_access( + out, + &wallet.connection, + &sol_client, + &self.shared.primary_validator_id, + &self.shared.backup_validator_ids, + self.shared.leader_schedule_epochs, + ) + .await?; + if !should_continue_after_validation(out, &validation_errors, self.force)? { + return Ok(()); + } + + let (address, _) = AccessRequest::find_address(&self.shared.doublezero_address); + + let request_account = wallet.connection.get_account(&address).await; + if request_account.is_ok() { + return Err(PassportCliError::AccessRequestExists(address)); + } + + let tx_sig = self.request_access(&wallet, out).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + writeln!(out, "Request Solana validator access: {tx_sig}")?; + + wallet + .print_verbose_output(&[tx_sig]) + .await + .map_err(PassportCliError::other)?; + } + + Ok(()) + } + + /// Build a `Wallet` from `CliContext` (connection URL + keypair path) plus + /// the verb-owned transaction knobs. Reuses the shared keypair-loading and + /// fee-payer logic in `Wallet::try_new`. + fn build_wallet(&self, ctx: &CliContext) -> Result { + // `Wallet::try_new` (and the other `Wallet` helpers below) surface + // `anyhow::Error`; box it through `Other` so the cause chain survives. + let opts = SolanaPayerOptions { + connection_options: SolanaConnectionOptions::default(), + signer_options: SolanaSignerOptions { + keypair_path: ctx + .keypair_path + .as_ref() + .map(|p| p.to_string_lossy().into_owned()), + with_compute_unit_price: self.with_compute_unit_price, + verbose: self.verbose, + fee_payer_path: self.fee_payer_path.clone(), + dry_run: self.dry_run, + }, + }; + let connection = SolanaConnection::new(ctx.solana_l1_rpc_url.clone()); + Wallet::try_new(opts, Some(connection)).map_err(PassportCliError::other) + } + + async fn request_access( + &self, + wallet: &Wallet, + out: &mut impl Write, + ) -> Result { + let ed25519_signature = Signature::from_str(&self.signature)?; + let wallet_key = wallet.pubkey(); + + let attestation = SolanaValidatorAttestation { + validator_id: self.shared.primary_validator_id, + service_key: self.shared.doublezero_address, + ed25519_signature: ed25519_signature.into(), + }; + + let access_mode = if self.shared.backup_validator_ids.is_empty() { + AccessMode::SolanaValidator(attestation) + } else { + AccessMode::SolanaValidatorWithBackupIds { + attestation, + backup_ids: self.shared.backup_validator_ids.clone(), + } + }; + + let raw_message = AccessRequest::access_request_message(&access_mode); + + if self.verbose { + writeln!(out, "Raw message: {raw_message}")?; + } + + let message = OffchainMessage::new(self.message_version, raw_message.as_bytes()) + .map_err(PassportCliError::other)?; + let serialized_message = message.serialize().map_err(PassportCliError::other)?; + + if !ed25519_signature.verify( + self.shared.primary_validator_id.as_array(), + &serialized_message, + ) { + return Err(PassportCliError::SignatureVerificationFailed); + } else if self.verbose { + writeln!( + out, + "Signature recovers node ID: {}", + self.shared.primary_validator_id + )?; + } + + let request_access_ix = try_build_instruction( + &ID, + RequestAccessAccounts::new(&wallet_key, &self.shared.doublezero_address), + &PassportInstructionData::RequestAccess(access_mode), + ) + .map_err(PassportCliError::other)?; + + let (_, bump) = AccessRequest::find_address(&self.shared.doublezero_address); + + let mut compute_unit_limit = 10_000; + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let mut instructions = vec![ + request_access_ix, + ComputeBudgetInstruction::set_compute_unit_limit(compute_unit_limit), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet + .new_transaction(&instructions) + .await + .map_err(PassportCliError::other)?; + + wallet + .send_or_simulate_transaction(&transaction) + .await + .map_err(PassportCliError::other) + } +} diff --git a/offchain/crates/passport-cli/src/shared.rs b/offchain/crates/passport-cli/src/shared.rs new file mode 100644 index 0000000000..a75db43d96 --- /dev/null +++ b/offchain/crates/passport-cli/src/shared.rs @@ -0,0 +1,21 @@ +use clap::Args; +use solana_sdk::pubkey::Pubkey; + +/// Arguments shared by the access-request verbs (`prepare-validator-access`, +/// `request-validator-access`). Field names and flags are unchanged from the +/// pre-RFC-20 CLI. +#[derive(Debug, Args, Clone)] +pub struct SharedAccessArgs { + /// The DoubleZero service key to request access from + #[arg(long)] + pub doublezero_address: Pubkey, + /// The validator's node ID (identity pubkey) + #[arg(long, value_name = "PUBKEY")] + pub primary_validator_id: Pubkey, + /// Optional backup validator IDs (identity pubkeys) + #[arg(long, value_name = "PUBKEY,PUBKEY,PUBKEY", value_delimiter = ',')] + pub backup_validator_ids: Vec, + /// Number of previous epochs to check when evaluating the leader schedule (defaults to ENV_PREVIOUS_LEADER_EPOCHS) + #[arg(long, hide = true)] + pub leader_schedule_epochs: Option, +} diff --git a/offchain/crates/passport-cli/src/util.rs b/offchain/crates/passport-cli/src/util.rs new file mode 100644 index 0000000000..7f96923017 --- /dev/null +++ b/offchain/crates/passport-cli/src/util.rs @@ -0,0 +1,92 @@ +//! Cluster identification and gossip-node lookup helpers used by the passport +//! verbs. Moved verbatim from the offchain `doublezero-solana` binary's +//! `utils` module (these helpers were only ever used by passport). + +use std::{ + fmt, + io::{Read, Write}, + net::{Ipv4Addr, SocketAddr, TcpStream, ToSocketAddrs}, + time::Duration, +}; + +use solana_client::{nonblocking::rpc_client::RpcClient, rpc_response::RpcContactInfo}; +use solana_sdk::pubkey::Pubkey; + +use crate::error::{PassportCliError, Result}; + +pub fn try_get_public_ipv4() -> Result { + // Resolve the host `ifconfig.me` to IPv4 addresses + let socket_addr = "ifconfig.me:80" + .to_socket_addrs()? + .find(|addr| matches!(addr, SocketAddr::V4(_))) + .ok_or(PassportCliError::Ipv4ResolutionFailed)?; + + // Establish a connection to the IPv4 address with a short timeout to avoid hanging CLI calls. + let mut stream = TcpStream::connect_timeout(&socket_addr, Duration::from_secs(5))?; + stream.set_read_timeout(Some(Duration::from_secs(5)))?; + + // Send an HTTP GET request to retrieve only IPv4 + let request = "GET /ip HTTP/1.1\r\nHost: ifconfig.me\r\nConnection: close\r\n\r\n"; + stream.write_all(request.as_bytes())?; + + // Read the response from the server + let mut response = Vec::new(); + stream.read_to_end(&mut response)?; + + // Convert the response to text and find the body of the response + let response_text = str::from_utf8(&response)?; + + // The IP will be in the body after the HTTP headers + if let Some(body_start) = response_text.find("\r\n\r\n") { + let ip = &response_text[body_start + 4..].trim(); + return Ok(ip.to_string()); + } + + Err(PassportCliError::IpExtractionFailed) +} + +#[derive(Debug, PartialEq)] +pub enum Cluster { + MainnetBeta, + Testnet, + Devnet, + Unknown, +} + +impl fmt::Display for Cluster { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Cluster::MainnetBeta => write!(f, "mainnet-beta"), + Cluster::Testnet => write!(f, "testnet"), + Cluster::Devnet => write!(f, "devnet"), + Cluster::Unknown => write!(f, "unknown"), + } + } +} + +pub async fn identify_cluster(client: &RpcClient) -> Result { + let genesis_hash = client.get_genesis_hash().await?; + + Ok(match genesis_hash.to_string().as_str() { + "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d" => Cluster::MainnetBeta, + "4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY" => Cluster::Testnet, + "EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG" => Cluster::Devnet, + _ => Cluster::Unknown, + }) +} + +pub fn find_node_by_node_id<'a>( + nodes: &'a [RpcContactInfo], + node_id: &Pubkey, +) -> Option<&'a RpcContactInfo> { + // Convert the Pubkey to string for comparison + let node_id_str = node_id.to_string(); + // Search for the node in the list + nodes.iter().find(|n| n.pubkey == node_id_str) +} + +pub fn find_node_by_ip(nodes: &[RpcContactInfo], ip: Ipv4Addr) -> Option<&RpcContactInfo> { + nodes + .iter() + .find(|n| n.gossip.as_ref().is_some_and(|gossip| gossip.ip() == ip)) +} diff --git a/offchain/crates/scheduled-command/CHANGELOG.md b/offchain/crates/scheduled-command/CHANGELOG.md new file mode 100644 index 0000000000..2441a19b65 --- /dev/null +++ b/offchain/crates/scheduled-command/CHANGELOG.md @@ -0,0 +1,26 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.0.1](https://github.com/doublezerofoundation/doublezero-offchain/compare/doublezero-scheduled-command/v0.0.0...doublezero-scheduled-command/v0.0.1) - 2025-10-21 + +### Other + +- schedule initializing distributions ([#106](https://github.com/doublezerofoundation/doublezero-offchain/pull/106)) +- Prepare for off-chain components +- Reorg +- Fix api token security, retries and concurrent requests +- Add docs +- More cleanup and simplification +- configuration and defaults +- Cleanup, add TODOs +- Add merkle_generator +- Update README +- Simplify +- Bump README +- Add README diff --git a/offchain/crates/scheduled-command/Cargo.toml b/offchain/crates/scheduled-command/Cargo.toml new file mode 100644 index 0000000000..d3b53078ca --- /dev/null +++ b/offchain/crates/scheduled-command/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "doublezero-scheduled-command" +description = "Schedule CLI commands" + +authors.workspace = true +edition.workspace = true +homepage.workspace = true +license.workspace = true +readme.workspace = true +repository.workspace = true +version.workspace = true + +[dependencies] +anyhow.workspace = true +async-trait.workspace = true +clap.workspace = true +tokio.workspace = true +tokio-cron-scheduler.workspace = true +tracing.workspace = true diff --git a/offchain/crates/scheduled-command/src/lib.rs b/offchain/crates/scheduled-command/src/lib.rs new file mode 100644 index 0000000000..f6b9b93ec5 --- /dev/null +++ b/offchain/crates/scheduled-command/src/lib.rs @@ -0,0 +1,192 @@ +//! A library for making CLI commands schedulable with cron-like intervals. +//! +//! This library provides a simple trait that allows any command to be run once +//! or on a scheduled interval based on a schedule string. +//! +//! # Example +//! +//! ``` +//! use anyhow::Result; +//! use clap::Parser; +//! use doublezero_scheduled_command::{Schedulable, ScheduleOption}; +//! +//! #[derive(Parser, Clone)] +//! struct MyCommand { +//! #[command(flatten)] +//! schedule: ScheduleOption, +//! +//! #[arg(long)] +//! message: String, +//! } +//! +//! #[async_trait::async_trait] +//! impl Schedulable for MyCommand { +//! fn schedule(&self) -> &ScheduleOption { +//! &self.schedule +//! } +//! +//! async fn execute_once(&self) -> Result<()> { +//! println!("{}", self.message); +//! Ok(()) +//! } +//! } +//! ``` + +use std::time::Duration; + +use anyhow::{Result, bail}; +use clap::Args; +use tokio_cron_scheduler::{Job, JobScheduler}; +use tracing::{error, info}; + +/// Schedule configuration that can be flattened into command structs. +#[derive(Debug, Args, Clone, Default)] +pub struct ScheduleOption { + /// Schedule interval (e.g. "5s", "10m", "2h"). If not provided, runs once + /// and exits. + #[arg(long, help = "Schedule interval (e.g. '5s', '10m', '2h')")] + pub schedule: Option, +} + +impl ScheduleOption { + /// Check if a schedule is configured. + pub fn is_scheduled(&self) -> bool { + self.schedule.is_some() + } +} + +/// Trait for commands that can be scheduled to run at intervals. +#[async_trait::async_trait] +pub trait Schedulable: Clone { + /// Get the schedule configuration. + fn schedule(&self) -> &ScheduleOption; + + /// Execute the command once - this is what implementors define. + async fn execute_once(&self) -> Result<()>; + + /// Execute the command, either once or on schedule. + /// + /// This method checks if a schedule is provided and either: + /// - Runs `execute_once()` immediately if no schedule. + /// - Sets up a cron job to run `execute_once()` at intervals if scheduled. + async fn execute(&self) -> Result<()> + where + Self: Sized + Send + Sync + 'static, + { + run_schedulable(self).await + } +} + +/// Run a schedulable command, handling both one-time and scheduled execution. +pub async fn run_schedulable(command: &T) -> Result<()> { + match command.schedule().schedule.as_deref() { + Some(schedule_str) => { + let cron_expr = schedule_to_cron(schedule_str)?; + + let command_clone = command.clone(); + let job = Job::new_async(cron_expr.as_str(), move |_uuid, _l| { + let command = command_clone.clone(); + + Box::pin(async move { + if let Err(e) = command.execute_once().await { + error!("Command execution failed: {e}"); + } + }) + })?; + + let sched = JobScheduler::new().await?; + sched.add(job).await?; + sched.start().await?; + + info!("Scheduler started. Command will run every {schedule_str}"); + info!("Press Ctrl+C to stop..."); + + tokio::signal::ctrl_c().await?; + info!("Shutting down..."); + } + None => { + command.execute_once().await?; + } + } + + Ok(()) +} + +/// Convert a schedule string to a cron expression. +/// +/// Supports formats like "5s", "10m", "2h" or plain numbers (treated as +/// seconds). Maximum allowed duration is less than 24 hours. +fn schedule_to_cron(s: &str) -> Result { + let s = s.trim().to_lowercase(); + + let duration = if let Some(num_str) = s.strip_suffix('s') { + let secs: u64 = num_str.parse()?; + Duration::from_secs(secs) + } else if let Some(num_str) = s.strip_suffix('m') { + let mins: u64 = num_str.parse()?; + Duration::from_secs(mins * 60) + } else if let Some(num_str) = s.strip_suffix('h') { + let hours: u64 = num_str.parse()?; + Duration::from_secs(hours * 3600) + } else { + let secs: u64 = s.parse()?; + Duration::from_secs(secs) + }; + + // Check if duration is 24 hours or more. + if duration.as_secs() >= 24 * 3600 { + bail!("Schedule duration '{s}' is too long. Maximum allowed is less than 24 hours"); + } + + // Convert to cron expression. + let secs = duration.as_secs(); + if secs < 60 { + Ok(format!("*/{secs} * * * * *")) + } else if secs < 3600 { + let mins = secs / 60; + Ok(format!("0 */{mins} * * * *")) + } else { + let hours = secs / 3600; + Ok(format!("0 0 */{hours} * * *")) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_schedule_to_cron() { + // Test direct conversion. + assert_eq!(schedule_to_cron("30s").unwrap(), "*/30 * * * * *"); + assert_eq!(schedule_to_cron("2m").unwrap(), "0 */2 * * * *"); + assert_eq!(schedule_to_cron("2h").unwrap(), "0 0 */2 * * *"); + + // Test plain numbers (seconds). + assert_eq!(schedule_to_cron("5").unwrap(), "*/5 * * * * *"); + assert_eq!(schedule_to_cron("120").unwrap(), "0 */2 * * * *"); + + // Test case insensitive. + assert_eq!(schedule_to_cron("5S").unwrap(), "*/5 * * * * *"); + assert_eq!(schedule_to_cron("10M").unwrap(), "0 */10 * * * *"); + + // Test whitespace. + assert_eq!(schedule_to_cron(" 5s ").unwrap(), "*/5 * * * * *"); + + // Test 24 hour limit. + assert!(schedule_to_cron("24h").is_err()); + assert!(schedule_to_cron("86400").is_err()); + assert!(schedule_to_cron("23h").is_ok()); + } + + #[test] + fn test_schedule() { + let schedule = ScheduleOption::default(); + assert!(!schedule.is_scheduled()); + + let schedule = ScheduleOption { + schedule: Some("5m".to_string()), + }; + assert!(schedule.is_scheduled()); + } +} diff --git a/offchain/crates/sentinel/CHANGELOG.md b/offchain/crates/sentinel/CHANGELOG.md new file mode 100644 index 0000000000..3f08b32e1f --- /dev/null +++ b/offchain/crates/sentinel/CHANGELOG.md @@ -0,0 +1,72 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- migrate to Solana 3.0: workspace `solana-*` crates and `solana-sdk` move to the 3.0 line, `solana-program-test` to 3.0.12, and the doublezero SDK git-deps repin from `client/v0.27.1` to the malbeclabs/doublezero#3830 merge revision (malbeclabs/infra#1853) +- release artifact now builds as a static `x86_64-unknown-linux-musl` binary (malbeclabs/infra#1853) +- TLS for HTTP clients moves from openssl to rustls; trust roots are the bundled webpki Mozilla set plus the host OS certificate store, so OS-installed private CAs remain trusted (malbeclabs/infra#1853) +- chore(contributor-rewards): bump doublezero client to `v0.27.1` ([#388](https://github.com/doublezerofoundation/doublezero-offchain/pull/388)) +- fix(sentinel): adapt to SetAccessPassArgs API change after doublezero dep bump +- refactor(sentinel): replace `multicast_group_codes` setting with `multicast_group_pubkeys` ([#315](https://github.com/doublezerofoundation/doublezero-offchain/pull/315)) +- fix(sentinel): associate access passes with solana tenant PDA ([#283](https://github.com/doublezerofoundation/doublezero-offchain/pull/283)) + +## [0.2.5](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/sentinel%2Fv0.2.5) - 2026-02-26 + +- feat: autojoin validators to approved mcast pub groups +- feat: billing sentinel for tenant payment status monitoring ([#265](https://github.com/doublezerofoundation/doublezero-offchain/pull/265)) +- change default leader schedule lookahead from 2 epochs to 1 ([#259](https://github.com/doublezerofoundation/doublezero-offchain/pull/259)) +- fix(sentinel): improve retry handling for transient RPC errors([#220](https://github.com/doublezerofoundation/doublezero-offchain/pull/220)) +- fix leader schedule evaluation ([#214](https://github.com/doublezerofoundation/doublezero-offchain/pull/214)) +- improve previous epoch slot evaluation ([#213](https://github.com/doublezerofoundation/doublezero-offchain/pull/213)) + +## [0.2.2](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/sentinel%2Fv0.2.2) - 2025-11-11 + +- fix(sentinel): retry on conn reset, one more time [#184](https://github.com/doublezerofoundation/doublezero-offchain/pull/184) +- move binary from /usr/local/bin/ to /usr/bin to comply with package management standards ([#187](https://github.com/doublezerofoundation/doublezero-offchain/pull/187)) + +## [0.2.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/sentinel%2Fv0.2.1) - 2025-11-04 + +- retry on ECONNRESET [#177](https://github.com/doublezerofoundation/doublezero-offchain/pull/177) + +## [0.2.0](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/sentinel%2Fv0.2.0) - 2025-10-21 + +### Fixed + +- fix versioned transaction handling; more logging ([#48](https://github.com/doublezerofoundation/doublezero-offchain/pull/48)) + +### Other + +- testing release-plz integration +- entirely remove websocket support ([#160](https://github.com/doublezerofoundation/doublezero-offchain/pull/160)) +- simplify leader schedule check ([#157](https://github.com/doublezerofoundation/doublezero-offchain/pull/157)) +- add allow_multiple_ips to access pass args, bump deps ([#158](https://github.com/doublezerofoundation/doublezero-offchain/pull/158)) +- version 0.1.9 ([#153](https://github.com/doublezerofoundation/doublezero-offchain/pull/153)) +- drain outstanding access requests ([#144](https://github.com/doublezerofoundation/doublezero-offchain/pull/144)) +- cli flag to control RPC polling interval for access requests ([#136](https://github.com/doublezerofoundation/doublezero-offchain/pull/136)) +- fixup sentinel listener init to also use retries ([#132](https://github.com/doublezerofoundation/doublezero-offchain/pull/132)) +- fix websocket reconnection, improve error resilience ([#131](https://github.com/doublezerofoundation/doublezero-offchain/pull/131)) +- fetch revenue distribution account for epoch ([#128](https://github.com/doublezerofoundation/doublezero-offchain/pull/128)) +- handle multiple requests in a transaction ([#127](https://github.com/doublezerofoundation/doublezero-offchain/pull/127)) +- add find validator command and prepare access functionality ([#121](https://github.com/doublezerofoundation/doublezero-offchain/pull/121)) +- verify_qualifiers return empty vec on SignatureVerify error ([#122](https://github.com/doublezerofoundation/doublezero-offchain/pull/122)) +- read access mode from account data instead of transaction ([#107](https://github.com/doublezerofoundation/doublezero-offchain/pull/107)) +- handle requests with backup IDs ([#105](https://github.com/doublezerofoundation/doublezero-offchain/pull/105)) +- retry all rpc calls on 503 ([#103](https://github.com/doublezerofoundation/doublezero-offchain/pull/103)) +- Add retry logic for access pass operations ([#99](https://github.com/doublezerofoundation/doublezero-offchain/pull/99)) +- Disable leader schedule check ([#98](https://github.com/doublezerofoundation/doublezero-offchain/pull/98)) +- update dependencies and improve access request handling ([#64](https://github.com/doublezerofoundation/doublezero-offchain/pull/64)) +- accept mainnet-beta env moniker ([#62](https://github.com/doublezerofoundation/doublezero-offchain/pull/62)) +- wrap dz instruction properly ([#54](https://github.com/doublezerofoundation/doublezero-offchain/pull/54)) +- wrap message verification in offchain message ([#43](https://github.com/doublezerofoundation/doublezero-offchain/pull/43)) +- remove sentinel setting new validator airdrop ([#40](https://github.com/doublezerofoundation/doublezero-offchain/pull/40)) +- Jg/validator sig update ([#39](https://github.com/doublezerofoundation/doublezero-offchain/pull/39)) +- handle websocket server disconnects ([#37](https://github.com/doublezerofoundation/doublezero-offchain/pull/37)) +- update access pass creation to delegate funding to serviceability ([#32](https://github.com/doublezerofoundation/doublezero-offchain/pull/32)) +- validator ip fetching and issuing access pass ([#29](https://github.com/doublezerofoundation/doublezero-offchain/pull/29)) +- Build public links using exchange based inet telem data ([#23](https://github.com/doublezerofoundation/doublezero-offchain/pull/23)) +- migrate sentinel from solana-programs repo ([#21](https://github.com/doublezerofoundation/doublezero-offchain/pull/21)) diff --git a/offchain/crates/sentinel/Cargo.toml b/offchain/crates/sentinel/Cargo.toml new file mode 100644 index 0000000000..67f61dd48e --- /dev/null +++ b/offchain/crates/sentinel/Cargo.toml @@ -0,0 +1,57 @@ +[package] +name = "doublezero-ledger-sentinel" +description = "Sentinel for access to DoubleZero Ledger Network" +version = "0.2.5" + +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +anyhow.workspace = true +async-trait.workspace = true +base64.workspace = true +bincode.workspace = true +borsh.workspace = true +clap.workspace = true +config.workspace = true +doublezero-passport.workspace = true +doublezero-program-common.workspace = true +doublezero-program-tools.workspace = true +doublezero-record.workspace = true +doublezero-revenue-distribution.workspace = true +doublezero-serviceability.workspace = true +doublezero_sdk.workspace = true +backon.workspace = true +metrics.workspace = true +metrics-exporter-prometheus.workspace = true +mockall.workspace = true +retainer.workspace = true +# Direct dependency so the workspace TLS root features (rustls-tls-native-roots) +# unify into this binary; sentinel otherwise reaches reqwest only through +# solana-client, which enables webpki roots alone. +reqwest.workspace = true +serde.workspace = true +serde_json.workspace = true +solana-account-decoder-client-types.workspace = true +solana-client.workspace = true +solana-commitment-config.workspace = true +solana-compute-budget-interface.workspace = true +solana-sanitize.workspace = true +solana-sdk.workspace = true +solana-transaction-status-client-types.workspace = true +solana-system-interface.workspace = true +spl-associated-token-account-interface.workspace = true +spl-token-interface.workspace = true +strum.workspace = true +thiserror.workspace = true +tokio.workspace = true +tokio-util.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true +url.workspace = true + +[[bin]] +name = "doublezero-sentinel" +path = "src/main.rs" diff --git a/offchain/crates/sentinel/src/client/doublezero_ledger.rs b/offchain/crates/sentinel/src/client/doublezero_ledger.rs new file mode 100644 index 0000000000..a7c9e29256 --- /dev/null +++ b/offchain/crates/sentinel/src/client/doublezero_ledger.rs @@ -0,0 +1,440 @@ +use std::{net::Ipv4Addr, sync::Arc, time::Duration}; + +use async_trait::async_trait; +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_record::instruction as record_instruction; +use doublezero_serviceability::{ + instructions::DoubleZeroInstruction, + pda::{get_accesspass_pda, get_globalstate_pda}, + processors::{ + accesspass::set::SetAccessPassArgs, + multicastgroup::allowlist::publisher::add::AddMulticastGroupPubAllowlistArgs, + tenant::update_payment_status::UpdatePaymentStatusArgs, + }, + state::{ + accesspass::{AccessPass, AccessPassType}, + accounttype::AccountType, + tenant::{Tenant, TenantPaymentStatus}, + }, +}; +use mockall::automock; +use solana_account_decoder_client_types::UiAccountEncoding; +use solana_client::{ + nonblocking::rpc_client::RpcClient, + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::{ + instruction::AccountMeta, + pubkey::Pubkey, + signature::{Keypair, Signature, Signer}, +}; +use solana_system_interface::{instruction as system_instruction, program as system_program}; +use tracing::info; +use url::Url; + +use crate::{ + BILLING_RECEIPT_SEED_PREFIX, BillingReceipt, Error, Result, TenantBillingInfo, new_transaction, +}; + +/// Timeout for `send_and_confirm_transaction` calls to prevent the polling +/// loop from stalling on slow RPC confirmations. +const SEND_AND_CONFIRM_TIMEOUT: Duration = Duration::from_secs(60); + +#[automock] +#[async_trait] +pub trait DzRpcClientType { + async fn issue_access_pass( + &self, + service_key: &Pubkey, + client_ip: &Ipv4Addr, + validator_id: &Pubkey, + ) -> Result; + + async fn add_multicast_publisher_allowlist( + &self, + multicast_group_pda: &Pubkey, + service_key: &Pubkey, + client_ip: &Ipv4Addr, + ) -> Result; + + async fn get_access_pass( + &self, + service_key: &Pubkey, + client_ip: &Ipv4Addr, + ) -> Result; + + async fn get_tenants_with_token_accounts(&self) -> Result>; + + async fn update_tenant_payment_status( + &self, + tenant_pda: &Pubkey, + status: TenantPaymentStatus, + ) -> Result; + + async fn billing_receipt_exists(&self, tenant_pda: &Pubkey, epoch: u64) -> Result; + + async fn create_billing_receipt_and_update_epoch( + &self, + tenant_pda: &Pubkey, + receipt: &BillingReceipt, + ) -> Result; + + async fn get_current_dz_epoch(&self) -> Result; +} + +pub struct DzRpcClient { + client: RpcClient, + payer: Arc, + serviceability_id: Pubkey, +} + +#[async_trait] +impl DzRpcClientType for DzRpcClient { + async fn issue_access_pass( + &self, + service_key: &Pubkey, + client_ip: &Ipv4Addr, + validator_id: &Pubkey, + ) -> Result { + self.issue_access_pass(service_key, client_ip, validator_id) + .await + } + + async fn add_multicast_publisher_allowlist( + &self, + multicast_group_pda: &Pubkey, + service_key: &Pubkey, + client_ip: &Ipv4Addr, + ) -> Result { + self.add_multicast_publisher_allowlist(multicast_group_pda, service_key, client_ip) + .await + } + + async fn get_access_pass( + &self, + service_key: &Pubkey, + client_ip: &Ipv4Addr, + ) -> Result { + self.get_access_pass(service_key, client_ip).await + } + + async fn get_tenants_with_token_accounts(&self) -> Result> { + self.get_tenants_with_token_accounts().await + } + + async fn update_tenant_payment_status( + &self, + tenant_pda: &Pubkey, + status: TenantPaymentStatus, + ) -> Result { + self.update_tenant_payment_status(tenant_pda, status).await + } + + async fn billing_receipt_exists(&self, tenant_pda: &Pubkey, epoch: u64) -> Result { + self.billing_receipt_exists(tenant_pda, epoch).await + } + + async fn create_billing_receipt_and_update_epoch( + &self, + tenant_pda: &Pubkey, + receipt: &BillingReceipt, + ) -> Result { + self.create_billing_receipt_and_update_epoch(tenant_pda, receipt) + .await + } + + async fn get_current_dz_epoch(&self) -> Result { + self.get_current_dz_epoch().await + } +} + +impl DzRpcClient { + pub fn new(rpc_url: Url, payer: Arc, serviceability_id: Pubkey) -> Self { + Self { + client: RpcClient::new_with_commitment( + rpc_url.clone().into(), + CommitmentConfig::confirmed(), + ), + payer, + serviceability_id, + } + } + + pub async fn issue_access_pass( + &self, + service_key: &Pubkey, + client_ip: &Ipv4Addr, + validator_id: &Pubkey, + ) -> Result { + let (globalstate_pk, _) = get_globalstate_pda(&self.serviceability_id); + let (pass_pk, _) = get_accesspass_pda(&self.serviceability_id, client_ip, service_key); + + let args = DoubleZeroInstruction::SetAccessPass(SetAccessPassArgs { + accesspass_type: AccessPassType::SolanaValidator(*validator_id), + client_ip: *client_ip, + last_access_epoch: u64::MAX, + // NOTE: Setting this to false by default + allow_multiple_ip: false, + // NOTE: Setting both to max allowed values + max_unicast_users: u16::MAX, + max_multicast_users: u16::MAX, + }); + let accounts = vec![ + AccountMeta::new(pass_pk, false), + AccountMeta::new_readonly(globalstate_pk, false), + AccountMeta::new(*service_key, false), + AccountMeta::new(self.payer.pubkey(), true), + AccountMeta::new_readonly(system_program::id(), false), + ]; + + let set_pass_ix = try_build_instruction(&self.serviceability_id, accounts, &args)?; + let signer = &self.payer; + let recent_blockhash = self.client.get_latest_blockhash().await?; + let transaction = new_transaction(&[set_pass_ix], &[signer], recent_blockhash); + + let signature = self + .client + .send_and_confirm_transaction(&transaction) + .await?; + info!(validator = %service_key, %signature, "issued validator access pass"); + + Ok(signature) + } + + pub async fn add_multicast_publisher_allowlist( + &self, + multicast_group_pda: &Pubkey, + service_key: &Pubkey, + client_ip: &Ipv4Addr, + ) -> Result { + let (globalstate_pk, _) = get_globalstate_pda(&self.serviceability_id); + let (accesspass_pk, _) = + get_accesspass_pda(&self.serviceability_id, client_ip, service_key); + + let args = DoubleZeroInstruction::AddMulticastGroupPubAllowlist( + AddMulticastGroupPubAllowlistArgs { + client_ip: *client_ip, + user_payer: *service_key, + }, + ); + + let accounts = vec![ + AccountMeta::new(*multicast_group_pda, false), + AccountMeta::new(accesspass_pk, false), + AccountMeta::new_readonly(globalstate_pk, false), + AccountMeta::new(self.payer.pubkey(), true), + AccountMeta::new_readonly(system_program::id(), false), + ]; + + let ix = try_build_instruction(&self.serviceability_id, accounts, &args)?; + let signer = &self.payer; + let recent_blockhash = self.client.get_latest_blockhash().await?; + let transaction = new_transaction(&[ix], &[signer], recent_blockhash); + + let signature = tokio::time::timeout( + SEND_AND_CONFIRM_TIMEOUT, + self.client.send_and_confirm_transaction(&transaction), + ) + .await + .map_err(|_| Error::Deserialize("add_multicast_publisher_allowlist timed out".into()))??; + info!( + validator = %service_key, + %multicast_group_pda, + %client_ip, + %signature, + "added to multicast publisher allowlist" + ); + + Ok(signature) + } + + pub async fn get_access_pass( + &self, + service_key: &Pubkey, + client_ip: &Ipv4Addr, + ) -> Result { + let (accesspass_pk, _) = + get_accesspass_pda(&self.serviceability_id, client_ip, service_key); + let account_data = self.client.get_account_data(&accesspass_pk).await?; + let access_pass = AccessPass::try_from(&account_data[..]) + .map_err(|e| Error::Deserialize(format!("AccessPass deserialization failed: {e}")))?; + Ok(access_pass) + } + + pub async fn get_tenants_with_token_accounts(&self) -> Result> { + let config = RpcProgramAccountsConfig { + filters: Some(vec![RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 0, + vec![AccountType::Tenant as u8], + ))]), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + + let accounts = self + .client + .get_program_accounts_with_config(&self.serviceability_id, config) + .await?; + + let tenants = accounts + .into_iter() + .filter_map(|(pubkey, account)| { + let tenant = Tenant::try_from(&account.data[..]).ok()?; + if tenant.token_account == Pubkey::default() { + return None; + } + Some(TenantBillingInfo { + tenant_pda: pubkey, + token_account: tenant.token_account, + current_payment_status: tenant.payment_status, + billing: tenant.billing, + }) + }) + .collect(); + + Ok(tenants) + } + + pub async fn update_tenant_payment_status( + &self, + tenant_pda: &Pubkey, + status: TenantPaymentStatus, + ) -> Result { + let (globalstate_pk, _) = get_globalstate_pda(&self.serviceability_id); + let args = DoubleZeroInstruction::UpdatePaymentStatus(UpdatePaymentStatusArgs { + payment_status: status as u8, + last_deduction_dz_epoch: None, + }); + let accounts = vec![ + AccountMeta::new(*tenant_pda, false), + AccountMeta::new_readonly(globalstate_pk, false), + AccountMeta::new(self.payer.pubkey(), true), + AccountMeta::new_readonly(system_program::id(), false), + ]; + + let ix = try_build_instruction(&self.serviceability_id, accounts, &args)?; + let signer = &self.payer; + let recent_blockhash = self.client.get_latest_blockhash().await?; + let transaction = new_transaction(&[ix], &[signer], recent_blockhash); + + let signature = tokio::time::timeout( + SEND_AND_CONFIRM_TIMEOUT, + self.client.send_and_confirm_transaction(&transaction), + ) + .await + .map_err(|_| Error::Deserialize("update_payment_status timed out".into()))??; + info!(tenant = %tenant_pda, ?status, %signature, "updated tenant payment status"); + + Ok(signature) + } + + pub async fn billing_receipt_exists(&self, tenant_pda: &Pubkey, epoch: u64) -> Result { + let seeds: &[&[u8]] = &[ + BILLING_RECEIPT_SEED_PREFIX, + tenant_pda.as_ref(), + &epoch.to_le_bytes(), + ]; + let record_key = + doublezero_sdk::record::pubkey::create_record_key(&self.payer.pubkey(), seeds); + let account = self + .client + .get_account_with_commitment(&record_key, CommitmentConfig::confirmed()) + .await?; + Ok(account.value.is_some()) + } + + pub async fn create_billing_receipt_and_update_epoch( + &self, + tenant_pda: &Pubkey, + receipt: &BillingReceipt, + ) -> Result { + let epoch_bytes = receipt.dz_epoch.to_le_bytes(); + let seeds: &[&[u8]] = &[ + BILLING_RECEIPT_SEED_PREFIX, + tenant_pda.as_ref(), + &epoch_bytes, + ]; + let payer_key = self.payer.pubkey(); + let serialized = borsh::to_vec(receipt)?; + + // Record account creation instructions (allocate, assign, initialize) + let init = doublezero_sdk::record::instruction::InitializeRecordInstructions::new( + &payer_key, + seeds, + serialized.len(), + ); + + // Transfer rent lamports + let record_key = doublezero_sdk::record::pubkey::create_record_key(&payer_key, seeds); + let rent_lamports = self + .client + .get_minimum_balance_for_rent_exemption(init.total_space) + .await?; + let transfer_ix = system_instruction::transfer(&payer_key, &record_key, rent_lamports); + + // Write receipt data + let write_ix = record_instruction::write(&record_key, &payer_key, 0, &serialized); + + // Update epoch (UpdatePaymentStatus with last_deduction_dz_epoch) + let (globalstate_pk, _) = get_globalstate_pda(&self.serviceability_id); + let args = DoubleZeroInstruction::UpdatePaymentStatus(UpdatePaymentStatusArgs { + payment_status: TenantPaymentStatus::Paid as u8, + last_deduction_dz_epoch: Some(receipt.dz_epoch), + }); + let accounts = vec![ + AccountMeta::new(*tenant_pda, false), + AccountMeta::new_readonly(globalstate_pk, false), + AccountMeta::new(payer_key, true), + AccountMeta::new_readonly(system_program::id(), false), + ]; + let epoch_ix = try_build_instruction(&self.serviceability_id, accounts, &args)?; + + let signer = &self.payer; + let recent_blockhash = self.client.get_latest_blockhash().await?; + let transaction = new_transaction( + &[ + init.allocate, + init.assign, + transfer_ix, + init.initialize, + write_ix, + epoch_ix, + ], + &[signer], + recent_blockhash, + ); + + let signature = tokio::time::timeout( + SEND_AND_CONFIRM_TIMEOUT, + self.client.send_and_confirm_transaction(&transaction), + ) + .await + .map_err(|_| Error::Deserialize("create_billing_receipt timed out".into()))??; + info!( + tenant = %tenant_pda, + epoch = receipt.dz_epoch, + %signature, + "created billing receipt and updated epoch" + ); + + Ok(signature) + } + + /// Returns the last completed DZ epoch. + /// + /// Queries `getEpochInfo` on the **DZ Ledger RPC** (`self.client`), which + /// runs its own epoch schedule independent of Solana mainnet/testnet. The + /// billable epoch is `epoch - 1` because the current DZ Ledger epoch is + /// still in progress. This matches how revenue-distribution syncs via + /// `ProgramConfig.next_completed_dz_epoch` (see + /// validator-debt/worker/initialize_distribution.rs). + pub async fn get_current_dz_epoch(&self) -> Result { + let epoch_info = self.client.get_epoch_info().await?; + Ok(epoch_info.epoch.saturating_sub(1)) + } +} diff --git a/offchain/crates/sentinel/src/client/mod.rs b/offchain/crates/sentinel/src/client/mod.rs new file mode 100644 index 0000000000..467f6819b0 --- /dev/null +++ b/offchain/crates/sentinel/src/client/mod.rs @@ -0,0 +1,2 @@ +pub mod doublezero_ledger; +pub mod solana; diff --git a/offchain/crates/sentinel/src/client/solana.rs b/offchain/crates/sentinel/src/client/solana.rs new file mode 100644 index 0000000000..509d12a306 --- /dev/null +++ b/offchain/crates/sentinel/src/client/solana.rs @@ -0,0 +1,472 @@ +use std::{ + net::{Ipv4Addr, SocketAddr}, + sync::Arc, + time::Duration, +}; + +use async_trait::async_trait; +use base64::{Engine, engine::general_purpose::STANDARD as BASE64_STD}; +use bincode; +use doublezero_passport::{ + id as passport_id, + instruction::{ + PassportInstructionData, + account::{DenyAccessAccounts, GrantAccessAccounts}, + }, + state::AccessRequest, +}; +use doublezero_program_tools::{ + Discriminator, PrecomputedDiscriminator, instruction::try_build_instruction, zero_copy, +}; +use mockall::automock; +use solana_account_decoder_client_types::UiAccountEncoding; +use solana_client::{ + nonblocking::rpc_client::RpcClient, + rpc_config::{ + RpcAccountInfoConfig, RpcLeaderScheduleConfig, RpcProgramAccountsConfig, + RpcTransactionConfig, + }, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_commitment_config::{CommitmentConfig, CommitmentLevel}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{ + message::compiled_instruction::CompiledInstruction, + program_pack::Pack, + pubkey::Pubkey, + signature::{Keypair, Signature}, + signer::Signer, + transaction::VersionedTransaction, +}; +use solana_transaction_status_client_types::{ + EncodedTransaction, TransactionBinaryEncoding, UiTransactionEncoding, +}; +use url::Url; + +use crate::{AccessId, Error, Result, new_transaction}; + +const ACCESS_REQUEST_ACCOUNT_INDEX: usize = 2; +/// Timeout for `send_and_confirm_transaction` calls to prevent the billing +/// polling loop from stalling on slow RPC confirmations. +const SEND_AND_CONFIRM_TIMEOUT: Duration = Duration::from_secs(60); + +const SLOTS_PER_EPOCH: u64 = 432_000; + +#[automock] +#[async_trait] +pub trait SolRpcClientType { + async fn grant_access( + &self, + access_request_key: &Pubkey, + rent_beneficiary_key: &Pubkey, + ) -> Result; + + async fn deny_access(&self, access_request_key: &Pubkey) -> Result; + + async fn get_access_requests_from_signature( + &self, + signature: Signature, + ) -> Result>; + + async fn get_access_requests(&self) -> Result>; + + async fn is_scheduled_leader( + &self, + validator_id: &Pubkey, + previous_leader_epochs: u8, + ) -> Result; + + async fn get_validator_ip(&self, validator_id: &Pubkey) -> Result>; + + async fn get_token_account_balance(&self, token_account: &Pubkey) -> Result; + + async fn transfer_spl_token( + &self, + from: &Pubkey, + to: &Pubkey, + amount: u64, + ) -> Result; +} + +pub struct SolRpcClient { + client: RpcClient, + payer: Arc, +} + +#[async_trait] +impl SolRpcClientType for SolRpcClient { + async fn grant_access( + &self, + access_request_key: &Pubkey, + rent_beneficiary_key: &Pubkey, + ) -> Result { + self.grant_access(access_request_key, rent_beneficiary_key) + .await + } + + async fn deny_access(&self, access_request_key: &Pubkey) -> Result { + self.deny_access(access_request_key).await + } + + async fn get_access_requests_from_signature( + &self, + signature: Signature, + ) -> Result> { + self.get_access_requests_from_signature(signature).await + } + + async fn get_access_requests(&self) -> Result> { + self.get_access_requests().await + } + + async fn is_scheduled_leader( + &self, + validator_id: &Pubkey, + previous_leader_epochs: u8, + ) -> Result { + self.is_scheduled_leader(validator_id, previous_leader_epochs) + .await + } + + async fn get_validator_ip(&self, validator_id: &Pubkey) -> Result> { + self.get_validator_ip(validator_id).await + } + + async fn get_token_account_balance(&self, token_account: &Pubkey) -> Result { + self.get_token_account_balance(token_account).await + } + + async fn transfer_spl_token( + &self, + from: &Pubkey, + to: &Pubkey, + amount: u64, + ) -> Result { + self.transfer_spl_token(from, to, amount).await + } +} + +impl SolRpcClient { + pub fn new(rpc_url: Url, payer: Arc) -> Self { + Self { + client: RpcClient::new_with_commitment(rpc_url.into(), CommitmentConfig::confirmed()), + payer, + } + } + + pub async fn grant_access( + &self, + access_request_key: &Pubkey, + rent_beneficiary_key: &Pubkey, + ) -> Result { + let signer = &self.payer; + let grant_ix = try_build_instruction( + &passport_id(), + GrantAccessAccounts::new(&signer.pubkey(), access_request_key, rent_beneficiary_key), + &PassportInstructionData::GrantAccess, + )?; + + let recent_blockhash = self.client.get_latest_blockhash().await?; + + // There should be ~5k CU buffer with this limit. + let compute_limit_ix = ComputeBudgetInstruction::set_compute_unit_limit(16_000); + + // TODO: Consider using a priority fee API instead of a fixed price. + let compute_price_ix = ComputeBudgetInstruction::set_compute_unit_price(100_000); + + let transaction = new_transaction( + &[grant_ix, compute_limit_ix, compute_price_ix], + &[signer], + recent_blockhash, + ); + + Ok(self + .client + .send_and_confirm_transaction(&transaction) + .await?) + } + + pub async fn deny_access(&self, access_request_key: &Pubkey) -> Result { + let signer = &self.payer; + let deny_ix = try_build_instruction( + &passport_id(), + DenyAccessAccounts::new(&signer.pubkey(), access_request_key), + &PassportInstructionData::DenyAccess, + )?; + + // There should be ~5k CU buffer with this limit. + let compute_limit_ix = ComputeBudgetInstruction::set_compute_unit_limit(12_000); + + // TODO: Consider using a priority fee API instead of a fixed price. + let compute_price_ix = ComputeBudgetInstruction::set_compute_unit_price(100_000); + + let recent_blockhash = self.client.get_latest_blockhash().await?; + + let transaction = new_transaction( + &[deny_ix, compute_limit_ix, compute_price_ix], + &[signer], + recent_blockhash, + ); + + Ok(self + .client + .send_and_confirm_transaction(&transaction) + .await?) + } + + pub async fn get_access_requests_from_signature( + &self, + signature: Signature, + ) -> Result> { + // Get the transaction to find the AccessRequest account pubkey + let txn = self + .client + .get_transaction_with_config( + &signature, + RpcTransactionConfig { + encoding: Some(UiTransactionEncoding::Base64), + commitment: Some(CommitmentConfig { + commitment: CommitmentLevel::Confirmed, + }), + max_supported_transaction_version: Some(0), + }, + ) + .await?; + + let mut access_ids = Vec::new(); + + if let EncodedTransaction::Binary(data, TransactionBinaryEncoding::Base64) = + txn.transaction.transaction + { + let data = BASE64_STD.decode(data)?; + let tx = bincode::deserialize::(&data)?; + + let static_account_keys = tx.message.static_account_keys(); + let instructions = tx.message.instructions(); + + for compiled_ix in instructions + .iter() + .filter(|ix| is_request_access_instruction(ix, static_account_keys)) + { + // Get the AccessRequest account + let accounts = compiled_ix + .accounts + .iter() + .map(|&idx| static_account_keys.get(idx as usize)) + .collect::>>() + .ok_or(Error::MissingAccountKeys(signature))?; + + let request_pda = accounts + .get(ACCESS_REQUEST_ACCOUNT_INDEX) + .copied() + .ok_or(Error::InstructionInvalid(signature))?; + + // Fetch the AccessRequest account data + let account = self.client.get_account(request_pda).await?; + + // Deserialize the AccessRequest and extract the AccessMode + let access_id = + deserialize_access_request_from_account(request_pda, &account.data)?; + + access_ids.push(access_id); + } + } else { + return Err(Error::TransactionEncoding(signature)); + }; + + Ok(access_ids) + } + + pub async fn get_access_requests(&self) -> Result> { + let config = RpcProgramAccountsConfig { + filters: Some(vec![RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 0, + AccessRequest::discriminator_slice().to_vec(), + ))]), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + + let accounts = self + .client + .get_program_accounts_with_config(&passport_id(), config) + .await?; + + let access_ids = accounts + .into_iter() + .filter_map(|(pubkey, account)| { + deserialize_access_request_from_account(&pubkey, &account.data).ok() + }) + .collect(); + + Ok(access_ids) + } + + /// NOTE: If previous_leader_epochs is 0, this method has no leader + /// schedules to evaluate, so it will return false. + pub async fn is_scheduled_leader( + &self, + validator_id: &Pubkey, + previous_leader_epochs: u8, + ) -> Result { + if previous_leader_epochs == 0 { + return Ok(false); + } + + let epoch_slots = self.client.get_slot().await.map(PreviousEpochSlots)?; + + // We want to ensure that the number of leader schedules evaluated is + // equal to the number of epochs requested. + let mut schedule_count = 0; + + for slot in epoch_slots.take(previous_leader_epochs as usize) { + let config = RpcLeaderScheduleConfig { + identity: Some(validator_id.to_string()), + ..Default::default() + }; + + let schedule = self + .client + .get_leader_schedule_with_config(Some(slot), config) + .await?; + + // Bail out early if there is either no leader schedule or this + // validator has no slot indices. + if schedule.is_none_or(|slot_indices| slot_indices.is_empty()) { + return Ok(false); + } + + schedule_count += 1; + } + + Ok(schedule_count == previous_leader_epochs) + } + + pub async fn get_validator_ip(&self, validator_id: &Pubkey) -> Result> { + let address = self + .client + .get_cluster_nodes() + .await? + .iter() + .find(|contact| contact.pubkey == validator_id.to_string()) + .and_then(|contact| contact.gossip) + .and_then(|addr| match addr { + SocketAddr::V4(addr_v4) => Some(*addr_v4.ip()), + SocketAddr::V6(addr_v6) => addr_v6.ip().to_ipv4_mapped(), + }); + Ok(address) + } + + pub async fn get_token_account_balance(&self, token_account: &Pubkey) -> Result { + let account = self.client.get_account(token_account).await?; + let token_data = spl_token_interface::state::Account::unpack(&account.data) + .map_err(|e| Error::Deserialize(format!("failed to unpack token account: {e}")))?; + if token_data.owner != self.payer.pubkey() { + return Err(Error::TokenAccountOwnerMismatch { + account: *token_account, + owner: token_data.owner, + sentinel: self.payer.pubkey(), + }); + } + Ok(token_data.amount) + } + + pub async fn transfer_spl_token( + &self, + from: &Pubkey, + to: &Pubkey, + amount: u64, + ) -> Result { + let signer = &self.payer; + let ix = spl_token_interface::instruction::transfer( + &spl_token_interface::id(), + from, + to, + &signer.pubkey(), + &[], + amount, + ) + .map_err(|e| Error::SplInstruction(format!("transfer: {e}")))?; + + let recent_blockhash = self.client.get_latest_blockhash().await?; + let transaction = new_transaction(&[ix], &[signer], recent_blockhash); + + let signature = tokio::time::timeout( + SEND_AND_CONFIRM_TIMEOUT, + self.client.send_and_confirm_transaction(&transaction), + ) + .await + .map_err(|_| Error::Deserialize("transfer_spl_token timed out".into()))??; + + Ok(signature) + } +} + +/// Helper function to deserialize AccessMode from AccessRequest account data. +fn deserialize_access_request_from_account( + request_pda: &Pubkey, + account_data: &[u8], +) -> Result { + // Parse the AccessRequest structure using zero_copy + let (access_request, _) = + zero_copy::checked_from_bytes_with_discriminator::(account_data) + .ok_or_else(|| Error::Deserialize("Failed to deserialize AccessRequest".to_string()))?; + + // Deserialize safely + let access_mode = access_request + .checked_access_mode() + .ok_or_else(|| Error::Deserialize("Failed to deserialize AccessMode".to_string()))?; + + Ok(AccessId { + request_pda: *request_pda, + rent_beneficiary_key: access_request.rent_beneficiary_key, + mode: access_mode, + }) +} + +fn is_request_access_instruction(ix: &CompiledInstruction, static_account_keys: &[Pubkey]) -> bool { + ix.program_id(static_account_keys) == &passport_id() + && Discriminator::new(ix.data[..8].try_into().unwrap()) + == PassportInstructionData::REQUEST_ACCESS +} + +struct PreviousEpochSlots(u64); + +impl Iterator for PreviousEpochSlots { + type Item = u64; + + fn next(&mut self) -> Option { + let next_slot = &mut self.0; + + if *next_slot == 0 { + None + } else { + let current_slot = *next_slot; + *next_slot = next_slot.saturating_sub(SLOTS_PER_EPOCH); + Some(current_slot) + } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_reverse_iter() { + let start_slot = 2_000_000; + let num_epochs = 4; + let epoch_slots = PreviousEpochSlots(start_slot) + .take(num_epochs) + .collect::>(); + assert_eq!(epoch_slots.len(), 4); + assert_eq!(epoch_slots.first().unwrap(), &start_slot); + assert_eq!( + epoch_slots.last().unwrap(), + &(start_slot - 3 * SLOTS_PER_EPOCH), + ); + } +} diff --git a/offchain/crates/sentinel/src/constants.rs b/offchain/crates/sentinel/src/constants.rs new file mode 100644 index 0000000000..adac891552 --- /dev/null +++ b/offchain/crates/sentinel/src/constants.rs @@ -0,0 +1,11 @@ +pub const ENV_PREVIOUS_LEADER_EPOCHS: u8 = 1; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn default_leader_schedule_lookahead_is_one_epoch() { + assert_eq!(ENV_PREVIOUS_LEADER_EPOCHS, 1); + } +} diff --git a/offchain/crates/sentinel/src/error.rs b/offchain/crates/sentinel/src/error.rs new file mode 100644 index 0000000000..d2834594ab --- /dev/null +++ b/offchain/crates/sentinel/src/error.rs @@ -0,0 +1,249 @@ +use std::{ + error::Error as StdError, + future::Future, + sync::atomic::{AtomicUsize, Ordering}, + time::Duration, +}; + +use backon::{ExponentialBuilder, Retryable}; +use solana_client::{ + client_error::{ + ClientError, ClientErrorKind, + reqwest::{Error as ReqwestError, StatusCode}, + }, + nonblocking::pubsub_client::PubsubClientError, +}; +use solana_sdk::{ + pubkey::Pubkey, + signature::{ParseSignatureError, Signature}, +}; +use thiserror::Error; +use tracing::warn; + +pub type Result = std::result::Result; + +#[derive(Debug, Error, strum::IntoStaticStr)] +pub enum Error { + #[error("base64 decode error: {0}")] + Base64Decode(#[from] base64::DecodeError), + #[error("bincode deserialization error: {0}")] + BincodeDeser(#[from] bincode::Error), + #[error("borsh deserialization error: {0}")] + BorshIo(#[from] borsh::io::Error), + #[error("deserialization error: {0}")] + Deserialize(String), + #[error("instruction not found in transaction: {0}")] + InstructionNotFound(Signature), + #[error("invalid instruction data: {0}")] + InstructionInvalid(Signature), + #[error("no account keys for transaction ix: {0}")] + MissingAccountKeys(Signature), + #[error("no program id at expected instruction index: {0}")] + MissingProgramId(Signature), + #[error("no transaction id signature")] + MissingTxnSignature, + #[error("pubsub client error: {0}")] + PubsubClient(Box), + #[error("request channel error: {0}")] + ReqChannel(#[from] tokio::sync::mpsc::error::SendError), + #[error("rpc client error: {0}")] + RpcClient(Box), + #[error("invalid transaction signature: {0}")] + SignatureInvalid(#[from] ParseSignatureError), + #[error("access request signature did not verify")] + SignatureVerify, + #[error("token account {account} owner {owner} != sentinel {sentinel}")] + TokenAccountOwnerMismatch { + account: Pubkey, + owner: Pubkey, + sentinel: Pubkey, + }, + #[error("SPL instruction error: {0}")] + SplInstruction(String), + #[error("invalid transaction encoding: {0}")] + TransactionEncoding(Signature), + #[error("solana offchain message error: {0}")] + OffchainSanitize(#[from] solana_sanitize::SanitizeError), +} + +impl From for Error { + fn from(err: ClientError) -> Self { + Error::RpcClient(Box::new(err)) + } +} + +impl From for Error { + fn from(err: PubsubClientError) -> Self { + Error::PubsubClient(Box::new(err)) + } +} + +pub async fn rpc_with_retry(operation: F, label: &'static str) -> Result +where + F: FnMut() -> Fut, + Fut: Future>, +{ + let mut op = operation; + let attempts = AtomicUsize::new(0); + let backoff = ExponentialBuilder::default() + .with_min_delay(Duration::from_secs(1)) + .with_max_delay(Duration::from_secs(30)) + .with_max_times(10) + .with_jitter(); + + let result = (move || op()) + .retry(backoff) + .when(|err: &Error| should_retry(err)) + .notify(|err: &Error, delay: Duration| { + let attempt = attempts.fetch_add(1, Ordering::Relaxed) + 1; + let error_type = classify_rpc_error(err); + + metrics::counter!( + "doublezero_sentinel_rpc_retry_total", + "operation" => label, + "error_type" => error_type + ) + .increment(1); + + warn!(attempt, retry_in = ?delay, error = ?err, operation = label, "transient RPC failure"); + }) + .await; + + if let Err(ref err) = result { + let error_type = classify_rpc_error(err); + metrics::counter!( + "doublezero_sentinel_rpc_retry_exhausted_total", + "operation" => label, + "error_type" => error_type + ) + .increment(1); + } + + result +} + +fn should_retry(err: &Error) -> bool { + match err { + Error::RpcClient(client_err) => retryable_client_error(client_err.as_ref()), + _ => false, + } +} + +fn retryable_client_error(err: &ClientError) -> bool { + match err.kind() { + ClientErrorKind::Reqwest(reqwest_err) => { + if reqwest_err.is_timeout() + || reqwest_err.is_connect() + || reqwest_err.is_request() + || is_connection_reset(reqwest_err) + { + return true; + } + retryable_status(reqwest_err.status()) + } + _ => false, + } +} + +fn is_connection_reset(reqwest_err: &ReqwestError) -> bool { + let mut source = reqwest_err.source(); + + while let Some(err) = source { + if let Some(io_err) = err.downcast_ref::() + && (io_err.kind() == std::io::ErrorKind::ConnectionReset + || io_err.kind() == std::io::ErrorKind::BrokenPipe) + { + return true; + } + source = err.source(); + } + + false +} + +fn classify_rpc_error(err: &Error) -> &'static str { + match err { + Error::RpcClient(client_err) => classify_client_error(client_err.as_ref()), + _ => err.into(), + } +} + +fn classify_client_error(err: &ClientError) -> &'static str { + match err.kind() { + ClientErrorKind::Reqwest(reqwest_err) => { + if reqwest_err.is_timeout() { + return "timeout"; + } + if reqwest_err.is_connect() { + return "connect"; + } + if is_connection_reset(reqwest_err) { + return "connection_reset"; + } + if reqwest_err.is_request() { + return "request"; + } + if reqwest_err.status().is_some() { + return "http_status"; + } + "reqwest" + } + ClientErrorKind::Io(_) => "io", + ClientErrorKind::TransactionError(_) => "transaction", + ClientErrorKind::RpcError(_) => "rpc", + ClientErrorKind::SigningError(_) => "signing", + ClientErrorKind::SerdeJson(_) => "serde_json", + ClientErrorKind::Custom(_) => "custom", + ClientErrorKind::Middleware(_) => "middleware", + } +} + +fn retryable_status(status: Option) -> bool { + match status { + Some(code) => { + code.is_server_error() + || code == StatusCode::TOO_MANY_REQUESTS + || code == StatusCode::FORBIDDEN + } + None => false, + } +} + +#[cfg(test)] +mod tests { + use solana_sdk::transaction::TransactionError; + + use super::{StatusCode, *}; + + #[test] + fn retryable_status_codes() { + // Minimally, 429, 500 and 503 should be retryable + assert!(retryable_status(Some(StatusCode::INTERNAL_SERVER_ERROR))); + assert!(retryable_status(Some(StatusCode::TOO_MANY_REQUESTS))); + assert!(retryable_status(Some(StatusCode::SERVICE_UNAVAILABLE))); + assert!(retryable_status(Some(StatusCode::FORBIDDEN))); + assert!(!retryable_status(Some(StatusCode::BAD_REQUEST))); + assert!(!retryable_status(None)); + } + + #[test] + fn does_not_retry_transaction_errors() { + let err = Error::from(ClientError::from(TransactionError::AccountNotFound)); + assert!(!should_retry(&err)); + } + + #[test] + fn classify_non_rpc_errors_by_variant() { + let err = Error::MissingTxnSignature; + assert_eq!(classify_rpc_error(&err), "MissingTxnSignature"); + + let err = Error::SignatureVerify; + assert_eq!(classify_rpc_error(&err), "SignatureVerify"); + } + + #[test] + fn classify_transaction_errors() { + let err = Error::from(ClientError::from(TransactionError::AccountNotFound)); + assert_eq!(classify_rpc_error(&err), "transaction"); + } +} diff --git a/offchain/crates/sentinel/src/lib.rs b/offchain/crates/sentinel/src/lib.rs new file mode 100644 index 0000000000..92e7fce362 --- /dev/null +++ b/offchain/crates/sentinel/src/lib.rs @@ -0,0 +1,184 @@ +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_passport::{instruction::AccessMode, state::AccessRequest}; +use doublezero_serviceability::state::tenant::{TenantBillingConfig, TenantPaymentStatus}; +use solana_sdk::{ + hash::Hash, + instruction::Instruction, + message::{VersionedMessage, v0::Message}, + offchain_message::OffchainMessage, + pubkey::Pubkey, + signature::{Keypair, Signature}, + signer::Signer, + transaction::VersionedTransaction, +}; + +pub mod client; +pub mod constants; +mod error; +pub mod sentinel; +pub mod settings; + +pub use error::{Error, Result}; + +pub const BILLING_RECEIPT_SEED_PREFIX: &[u8] = b"billing_receipt"; + +#[derive(BorshSerialize, BorshDeserialize, Debug, Clone)] +pub struct BillingReceipt { + pub tenant: Pubkey, + pub dz_epoch: u64, + pub amount: u64, + pub sol_tx_sig: [u8; 64], +} + +#[derive(Debug, Clone)] +pub struct AccessId { + request_pda: Pubkey, + rent_beneficiary_key: Pubkey, + mode: AccessMode, +} + +#[derive(Debug, Clone)] +pub struct TenantBillingInfo { + pub tenant_pda: Pubkey, + pub token_account: Pubkey, + pub current_payment_status: TenantPaymentStatus, + pub billing: TenantBillingConfig, +} + +// Verify access request by and return validator_id (pubkey) if successful +pub fn verify_access_request(access_mode: &AccessMode) -> Result { + const OFFCHAIN_MSG_SUPPORTED_VSN: u8 = 0; + + let raw_message = AccessRequest::access_request_message(access_mode); + let offchain_msg = OffchainMessage::new(OFFCHAIN_MSG_SUPPORTED_VSN, raw_message.as_bytes())?; + let serialized_msg = offchain_msg.serialize()?; + + // Get the attestation + let attestation = match access_mode { + AccessMode::SolanaValidator(attestation) => attestation, + AccessMode::SolanaValidatorWithBackupIds { attestation, .. } => attestation, + }; + + // Get signature from attestation + let signature: Signature = attestation.ed25519_signature.into(); + + if !signature.verify(attestation.validator_id.as_array(), &serialized_msg) { + return Err(Error::SignatureVerify); + } + + Ok(attestation.validator_id) +} + +pub fn new_transaction( + instructions: &[Instruction], + signers: &[&Keypair], + recent_blockhash: Hash, +) -> VersionedTransaction { + let message = + Message::try_compile(&signers[0].pubkey(), instructions, &[], recent_blockhash).unwrap(); + + VersionedTransaction::try_new(VersionedMessage::V0(message), signers).unwrap() +} + +#[cfg(test)] +mod tests { + use doublezero_passport::instruction::SolanaValidatorAttestation; + use solana_sdk::{pubkey::Pubkey, signature::Keypair, signer::Signer}; + + use super::*; + + #[test] + fn test_signature_verification() { + let service_key = Pubkey::new_unique(); + let validator_id = Keypair::new(); + + // Create mutable attestation first to satisfy the access_request_message input type + // We will overwrite the signature later before verification + let mut attestation = SolanaValidatorAttestation { + validator_id: validator_id.pubkey(), + service_key, + ed25519_signature: [0; 64], + }; + + let raw_message = + AccessRequest::access_request_message(&AccessMode::SolanaValidator(attestation)); + let offchain_msg = OffchainMessage::new(0u8, raw_message.as_bytes()).unwrap(); + let signature_bytes: [u8; 64] = validator_id + .sign_message(&offchain_msg.serialize().unwrap()) + .into(); + + // overwrite the signature + attestation.ed25519_signature = signature_bytes; + + let access_mode = AccessMode::SolanaValidator(attestation); + assert_eq!( + verify_access_request(&access_mode).unwrap(), + validator_id.pubkey() + ); + } + + #[test] + fn test_signature_verification_with_backup_ids() { + let service_key = Pubkey::new_unique(); + let validator_id = Keypair::new(); + let backup_id_1 = Pubkey::new_unique(); + let backup_id_2 = Pubkey::new_unique(); + + // Create mutable attestation + let mut attestation = SolanaValidatorAttestation { + validator_id: validator_id.pubkey(), + service_key, + ed25519_signature: [0; 64], + }; + + // Create access mode with backup IDs + let access_mode_for_msg = AccessMode::SolanaValidatorWithBackupIds { + attestation, + backup_ids: vec![backup_id_1, backup_id_2], + }; + + let raw_message = AccessRequest::access_request_message(&access_mode_for_msg); + let offchain_msg = OffchainMessage::new(0u8, raw_message.as_bytes()).unwrap(); + let signature_bytes: [u8; 64] = validator_id + .sign_message(&offchain_msg.serialize().unwrap()) + .into(); + + // Update signature + attestation.ed25519_signature = signature_bytes; + + let access_mode = AccessMode::SolanaValidatorWithBackupIds { + attestation, + backup_ids: vec![backup_id_1, backup_id_2], + }; + assert_eq!( + verify_access_request(&access_mode).unwrap(), + validator_id.pubkey() + ); + } + + #[test] + fn test_signature_verification_failure() { + let service_key = Pubkey::new_unique(); + let validator_id = Keypair::new(); + let wrong_keypair = Keypair::new(); + + let mut attestation = SolanaValidatorAttestation { + validator_id: validator_id.pubkey(), + service_key, + ed25519_signature: [0; 64], + }; + + let raw_message = + AccessRequest::access_request_message(&AccessMode::SolanaValidator(attestation)); + let offchain_msg = OffchainMessage::new(0u8, raw_message.as_bytes()).unwrap(); + // Sign with wrong keypair + let signature_bytes: [u8; 64] = wrong_keypair + .sign_message(&offchain_msg.serialize().unwrap()) + .into(); + + attestation.ed25519_signature = signature_bytes; + + let access_mode = AccessMode::SolanaValidator(attestation); + assert!(verify_access_request(&access_mode).is_err()); + } +} diff --git a/offchain/crates/sentinel/src/main.rs b/offchain/crates/sentinel/src/main.rs new file mode 100644 index 0000000000..7b2767533a --- /dev/null +++ b/offchain/crates/sentinel/src/main.rs @@ -0,0 +1,142 @@ +use clap::Parser; +use doublezero_ledger_sentinel::{ + client::{doublezero_ledger::DzRpcClient, solana::SolRpcClient}, + constants::ENV_PREVIOUS_LEADER_EPOCHS, + sentinel::{BillingConfig, BillingSentinel, PollingSentinel}, + settings::{AppArgs, Settings}, +}; +use doublezero_revenue_distribution::state::Journal; +use metrics_exporter_prometheus::PrometheusBuilder; +use solana_sdk::signer::Signer; +use spl_associated_token_account_interface::address::get_associated_token_address; +use tokio::signal; +use tokio_util::sync::CancellationToken; +use tracing::{error, info}; +use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let args = AppArgs::parse(); + let settings = Settings::new(args.config)?; + + tracing_subscriber::registry() + .with(tracing_subscriber::EnvFilter::new(&settings.log)) + .with(tracing_subscriber::fmt::layer()) + .init(); + + PrometheusBuilder::new() + .with_http_listener(settings.metrics_addr()) + .install()?; + + export_build_info(); + + let sol_rpc_url = settings.sol_rpc(); + let dz_rpc_url = settings.dz_rpc(); + let keypair = settings.keypair(); + let serviceability_id = settings.serviceability_program_id()?; + + info!( + %sol_rpc_url, + %dz_rpc_url, + poll_interval_secs = args.poll_interval, + billing_poll_interval_secs = args.billing_poll_interval, + pubkey = %keypair.pubkey(), + "DoubleZero Ledger Sentinel starting" + ); + + let multicast_group_pubkeys = settings.multicast_group_pubkeys()?; + if multicast_group_pubkeys.is_empty() { + info!("multicast publisher allowlisting disabled (no pubkeys configured)"); + } else { + info!( + count = multicast_group_pubkeys.len(), + pubkeys = ?multicast_group_pubkeys, + "multicast publisher allowlisting enabled" + ); + } + + let mut polling_sentinel = PollingSentinel::new( + dz_rpc_url.clone(), + sol_rpc_url.clone(), + keypair.clone(), + serviceability_id, + args.poll_interval, + ENV_PREVIOUS_LEADER_EPOCHS, + multicast_group_pubkeys, + ) + .await?; + + // Derive billing addresses + let mint = settings.doublezero_mint(); + let (journal_pda, _) = Journal::find_address(); + let journal_ata = get_associated_token_address(&journal_pda, &mint); + + info!(%mint, %journal_ata, "billing: derived 2Z addresses"); + + let mut billing_sentinel = BillingSentinel::new( + DzRpcClient::new(dz_rpc_url, keypair.clone(), serviceability_id), + SolRpcClient::new(sol_rpc_url, keypair), + BillingConfig::new( + args.billing_poll_interval, + args.minimum_balance, + journal_ata, + ), + ) + .await; + + let shutdown_listener = shutdown_listener(); + + tokio::select! { + biased; + _ = shutdown_listener.cancelled() => { + info!("shutdown signal received"); + }, + result = polling_sentinel.run(shutdown_listener.clone()) => { + if let Err(err) = result { + error!(?err, "polling sentinel exited with error"); + } + }, + result = billing_sentinel.run(shutdown_listener.clone()) => { + if let Err(err) = result { + error!(?err, "billing sentinel exited with error"); + } + } + } + + info!("DoubleZero Ledger Sentinel shutting down"); + + Ok(()) +} + +fn shutdown_listener() -> CancellationToken { + let cancellation_token = CancellationToken::new(); + let mut sigterm = signal::unix::signal(signal::unix::SignalKind::terminate()) + .expect("sigterm listener failed"); + tokio::spawn({ + let cancellation_token = cancellation_token.clone(); + async move { + tokio::select! { + _ = sigterm.recv() => cancellation_token.cancel(), + _ = signal::ctrl_c() => cancellation_token.cancel(), + } + } + }); + + cancellation_token +} + +fn export_build_info() { + let version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")); + let build_commit = option_env!("BUILD_COMMIT").unwrap_or("UNKNOWN"); + let build_date = option_env!("DATE").unwrap_or("UNKNOWN"); + let pkg_version = env!("CARGO_PKG_VERSION"); + + metrics::gauge!( + "doublezero_sentinel_build_info", + "version" => version, + "commit" => build_commit, + "date" => build_date, + "pkg_version" => pkg_version + ) + .set(1); +} diff --git a/offchain/crates/sentinel/src/sentinel/billing.rs b/offchain/crates/sentinel/src/sentinel/billing.rs new file mode 100644 index 0000000000..b67ac3f463 --- /dev/null +++ b/offchain/crates/sentinel/src/sentinel/billing.rs @@ -0,0 +1,1155 @@ +use std::{ + sync::Arc, + time::{Duration, Instant}, +}; + +use doublezero_serviceability::state::tenant::{TenantBillingConfig, TenantPaymentStatus}; +use retainer::Cache; +use solana_sdk::pubkey::Pubkey; +use tokio::time::interval; +use tokio_util::sync::CancellationToken; +use tracing::{error, info, warn}; + +use crate::{ + BillingReceipt, TenantBillingInfo, + client::{doublezero_ledger::DzRpcClientType, solana::SolRpcClientType}, + error::rpc_with_retry, +}; + +// cache ttl: 1 hour (covers realistic DZ outage windows; refreshed on each +// failed DZ tx attempt so effective TTL extends indefinitely during outages) +const BILLING_CACHE_TTL: Duration = Duration::from_secs(3600); +// cache monitoring interval, every 2 minutes +const BILLING_CACHE_MONITOR_INTERVAL: Duration = Duration::from_secs(120); + +pub struct BillingConfig { + pub poll_interval_secs: u64, + pub minimum_balance: Option, + pub journal_ata: Pubkey, +} + +impl BillingConfig { + pub fn new(poll_interval_secs: u64, minimum_balance: Option, journal_ata: Pubkey) -> Self { + Self { + poll_interval_secs, + minimum_balance, + journal_ata, + } + } +} + +pub struct BillingSentinel { + dz_rpc_client: D, + sol_rpc_client: S, + status_cache: Arc>, + /// In-process cache: tenant → (epoch, solana_signature_bytes). + /// Prevents re-transferring when the DZ tx fails but the process is still running. + transfer_cache: Arc>, + monitor_handles: Vec>, + poll_interval: Duration, + minimum_balance: u64, + journal_ata: Pubkey, +} + +impl BillingSentinel { + pub async fn new(dz_rpc_client: D, sol_rpc_client: S, config: BillingConfig) -> Self { + let status_cache = Arc::new(Cache::new()); + let transfer_cache = Arc::new(Cache::new()); + + // Spawn background tasks to evict expired cache entries. + // monitor(batch_size, sample_ratio, interval): + // batch_size=5 — check up to 5 entries per sweep + // sample_ratio=0.25 — sample 25% of the cache per sweep + // interval — time between sweeps + let status_clone = status_cache.clone(); + let status_handle = tokio::spawn(async move { + status_clone + .monitor(5, 0.25, BILLING_CACHE_MONITOR_INTERVAL) + .await; + }); + let transfer_clone = transfer_cache.clone(); + let transfer_handle = tokio::spawn(async move { + transfer_clone + .monitor(5, 0.25, BILLING_CACHE_MONITOR_INTERVAL) + .await; + }); + + Self { + dz_rpc_client, + sol_rpc_client, + status_cache, + transfer_cache, + monitor_handles: vec![status_handle, transfer_handle], + poll_interval: Duration::from_secs(config.poll_interval_secs), + minimum_balance: config.minimum_balance.unwrap_or(1), + journal_ata: config.journal_ata, + } + } + + pub async fn run(&mut self, shutdown_listener: CancellationToken) -> crate::Result<()> { + let mut poll_timer = interval(self.poll_interval); + + loop { + tokio::select! { + biased; + _ = shutdown_listener.cancelled() => { + info!("billing sentinel: shutdown signal received"); + break; + } + _ = poll_timer.tick() => { + if let Err(err) = self.poll_cycle().await { + error!(?err, "billing poll cycle failed; will retry in next cycle"); + metrics::counter!("doublezero_sentinel_billing_poll_failed").increment(1); + } + } + } + } + + for handle in &self.monitor_handles { + handle.abort(); + } + + Ok(()) + } + + async fn poll_cycle(&self) -> crate::Result<()> { + let start = Instant::now(); + + // Fetch current DZ epoch for deduction processing. If this fails, + // we can still run legacy balance checks but skip deductions. + let current_epoch = match rpc_with_retry( + || self.dz_rpc_client.get_current_dz_epoch(), + "billing_get_dz_epoch", + ) + .await + { + Ok(epoch) => Some(epoch), + Err(err) => { + warn!( + ?err, + "billing: failed to fetch current DZ epoch; skipping deductions" + ); + None + } + }; + + let tenants = rpc_with_retry( + || self.dz_rpc_client.get_tenants_with_token_accounts(), + "billing_get_tenants", + ) + .await?; + + let total = tenants.len(); + info!(count = total, "billing: checking tenant balances"); + metrics::gauge!("doublezero_sentinel_billing_tenants_checked").set(total as f64); + + let mut failures = 0u64; + for tenant in tenants { + // Currently only one variant exists, but guard against future + // upstream additions so the sentinel degrades gracefully. + #[allow(unreachable_patterns)] + let config = match tenant.billing { + TenantBillingConfig::FlatPerEpoch(ref c) => c, + _ => { + warn!( + tenant = %tenant.tenant_pda, + "billing: unknown billing config variant; skipping" + ); + continue; + } + }; + + let result = if config.rate > 0 { + if let Some(epoch) = current_epoch { + self.deduct_tenant(&tenant, epoch).await + } else { + // Can't process deductions without knowing the current epoch + continue; + } + } else { + // Legacy balance-check path (rate == 0) + self.check_and_update_tenant(&tenant).await + }; + + if let Err(err) = result { + failures += 1; + warn!( + tenant = %tenant.tenant_pda, + ?err, + "billing: failed to process tenant" + ); + metrics::counter!("doublezero_sentinel_billing_tenant_error").increment(1); + } + } + + if failures > 0 { + warn!( + failures, + total, "billing: cycle completed with tenant failures" + ); + } + + let elapsed = start.elapsed(); + metrics::histogram!("doublezero_sentinel_billing_cycle_duration_seconds") + .record(elapsed.as_secs_f64()); + + Ok(()) + } + + async fn deduct_tenant( + &self, + tenant: &TenantBillingInfo, + current_epoch: u64, + ) -> crate::Result<()> { + // See poll_cycle — guard against future upstream variants. + #[allow(unreachable_patterns)] + let config = match tenant.billing { + TenantBillingConfig::FlatPerEpoch(ref c) => c, + _ => { + warn!( + tenant = %tenant.tenant_pda, + "billing: unknown billing config variant; skipping deduction" + ); + return Ok(()); + } + }; + + // Already current — nothing to deduct + if config.last_deduction_dz_epoch >= current_epoch { + return Ok(()); + } + + let target_epoch = config.last_deduction_dz_epoch + 1; + + // Check in-process transfer cache (fast path — avoids re-transferring + // when the DZ tx failed but process is still running). + // A cached entry for epoch N is valid for deducting epoch N because the + // sentinel advances one epoch at a time. + let cached = self.transfer_cache.get(&tenant.tenant_pda).await; + let cached_hit = cached.as_ref().filter(|entry| entry.0 >= target_epoch); + + let sig_bytes = if let Some(entry) = cached_hit { + entry.1 + } else { + // Check on-chain receipt on DZ Ledger + if rpc_with_retry( + || { + self.dz_rpc_client + .billing_receipt_exists(&tenant.tenant_pda, target_epoch) + }, + "billing_receipt_exists", + ) + .await? + { + info!( + tenant = %tenant.tenant_pda, + target_epoch, + "billing: receipt already exists, skipping" + ); + return Ok(()); + } + + info!( + tenant = %tenant.tenant_pda, + rate = config.rate, + target_epoch, + current_epoch, + "billing: deducting tenant" + ); + + // Attempt the SPL token transfer on Solana + match self + .sol_rpc_client + .transfer_spl_token(&tenant.token_account, &self.journal_ata, config.rate) + .await + { + Ok(signature) => { + info!( + tenant = %tenant.tenant_pda, + %signature, + target_epoch, + "billing: transfer successful" + ); + let bytes: [u8; 64] = signature.into(); + self.transfer_cache + .insert(tenant.tenant_pda, (target_epoch, bytes), BILLING_CACHE_TTL) + .await; + bytes + } + Err(err) => { + warn!( + tenant = %tenant.tenant_pda, + ?err, + "billing: deduction transfer failed, checking balance" + ); + + // Check whether the failure is due to insufficient balance + let balance = rpc_with_retry( + || { + self.sol_rpc_client + .get_token_account_balance(&tenant.token_account) + }, + "billing_get_balance", + ) + .await?; + + if balance < config.rate { + info!( + tenant = %tenant.tenant_pda, + balance, + rate = config.rate, + "billing: insufficient balance, marking delinquent" + ); + rpc_with_retry( + || { + self.dz_rpc_client.update_tenant_payment_status( + &tenant.tenant_pda, + TenantPaymentStatus::Delinquent, + ) + }, + "billing_update_status", + ) + .await?; + self.status_cache + .insert( + tenant.tenant_pda, + TenantPaymentStatus::Delinquent, + BILLING_CACHE_TTL, + ) + .await; + metrics::counter!("doublezero_sentinel_billing_status_delinquent") + .increment(1); + } + // If balance >= rate, it was a transient error — will retry next cycle + return Ok(()); + } + } + }; + + // Create billing receipt and update epoch in a single atomic DZ Ledger tx + let receipt = BillingReceipt { + tenant: tenant.tenant_pda, + dz_epoch: target_epoch, + amount: config.rate, + sol_tx_sig: sig_bytes, + }; + + match self + .dz_rpc_client + .create_billing_receipt_and_update_epoch(&tenant.tenant_pda, &receipt) + .await + { + Ok(signature) => { + info!( + tenant = %tenant.tenant_pda, + %signature, + target_epoch, + "billing: receipt created and epoch updated" + ); + self.transfer_cache.remove(&tenant.tenant_pda).await; + self.status_cache + .insert( + tenant.tenant_pda, + TenantPaymentStatus::Paid, + BILLING_CACHE_TTL, + ) + .await; + metrics::counter!("doublezero_sentinel_billing_deduction_success").increment(1); + Ok(()) + } + Err(err) => { + warn!( + tenant = %tenant.tenant_pda, + target_epoch, + ?err, + "billing: DZ tx failed; checking if receipt landed" + ); + + // Check if receipt actually landed (ambiguous tx success / + // allocate-existing-account error) + if let Ok(true) = self + .dz_rpc_client + .billing_receipt_exists(&tenant.tenant_pda, target_epoch) + .await + { + info!( + tenant = %tenant.tenant_pda, + target_epoch, + "billing: receipt exists despite tx error; treating as success" + ); + self.transfer_cache.remove(&tenant.tenant_pda).await; + self.status_cache + .insert( + tenant.tenant_pda, + TenantPaymentStatus::Paid, + BILLING_CACHE_TTL, + ) + .await; + metrics::counter!("doublezero_sentinel_billing_deduction_success").increment(1); + return Ok(()); + } + + // Refresh transfer_cache TTL to survive prolonged DZ outages + self.transfer_cache + .insert( + tenant.tenant_pda, + (target_epoch, sig_bytes), + BILLING_CACHE_TTL, + ) + .await; + Err(err) + } + } + } + + /// Legacy balance-check path for tenants with rate == 0. + async fn check_and_update_tenant(&self, tenant: &TenantBillingInfo) -> crate::Result<()> { + let balance = rpc_with_retry( + || { + self.sol_rpc_client + .get_token_account_balance(&tenant.token_account) + }, + "billing_get_balance", + ) + .await?; + + let new_status = self.derive_status(balance); + + // Check cache — skip if status hasn't changed + if let Some(cached_status) = self.status_cache.get(&tenant.tenant_pda).await + && *cached_status == new_status + { + return Ok(()); + } + + let current_onchain = tenant.current_payment_status; + if current_onchain == new_status { + // Cache the current status so we don't re-check until TTL + self.status_cache + .insert(tenant.tenant_pda, new_status, BILLING_CACHE_TTL) + .await; + return Ok(()); + } + + info!( + tenant = %tenant.tenant_pda, + old_status = ?current_onchain, + new_status = ?new_status, + balance, + "billing: updating tenant payment status" + ); + + rpc_with_retry( + || { + self.dz_rpc_client + .update_tenant_payment_status(&tenant.tenant_pda, new_status) + }, + "billing_update_status", + ) + .await?; + + // Update cache + self.status_cache + .insert(tenant.tenant_pda, new_status, BILLING_CACHE_TTL) + .await; + + // Emit status metrics + match new_status { + TenantPaymentStatus::Paid => { + metrics::counter!("doublezero_sentinel_billing_status_paid").increment(1); + } + TenantPaymentStatus::Delinquent => { + metrics::counter!("doublezero_sentinel_billing_status_delinquent").increment(1); + } + } + + Ok(()) + } + + fn derive_status(&self, balance: u64) -> TenantPaymentStatus { + if balance >= self.minimum_balance { + TenantPaymentStatus::Paid + } else { + TenantPaymentStatus::Delinquent + } + } +} + +#[cfg(test)] +mod tests { + use doublezero_serviceability::state::tenant::FlatPerEpochConfig; + use mockall::predicate; + use solana_sdk::signature::Signature; + + use super::*; + use crate::client::{doublezero_ledger::MockDzRpcClientType, solana::MockSolRpcClientType}; + + const TEST_JOURNAL_ATA: Pubkey = Pubkey::new_from_array([88; 32]); + + fn make_tenant(pda_byte: u8, token_byte: u8, status: TenantPaymentStatus) -> TenantBillingInfo { + make_tenant_with_billing(pda_byte, token_byte, status, TenantBillingConfig::default()) + } + + fn make_tenant_with_billing( + pda_byte: u8, + token_byte: u8, + status: TenantPaymentStatus, + billing: TenantBillingConfig, + ) -> TenantBillingInfo { + let mut pda_bytes = [0u8; 32]; + pda_bytes[0] = pda_byte; + let mut token_bytes = [0u8; 32]; + token_bytes[0] = token_byte; + TenantBillingInfo { + tenant_pda: Pubkey::new_from_array(pda_bytes), + token_account: Pubkey::new_from_array(token_bytes), + current_payment_status: status, + billing, + } + } + + fn billing_config(rate: u64, last_epoch: u64) -> TenantBillingConfig { + TenantBillingConfig::FlatPerEpoch(FlatPerEpochConfig { + rate, + last_deduction_dz_epoch: last_epoch, + }) + } + + async fn new_sentinel( + dz: MockDzRpcClientType, + sol: MockSolRpcClientType, + ) -> BillingSentinel { + BillingSentinel::new( + dz, + sol, + BillingConfig::new(60, Some(1000), TEST_JOURNAL_ATA), + ) + .await + } + + // ── Legacy balance-check tests (rate == 0) ────────────────────────── + + #[tokio::test] + async fn test_derive_status_paid() { + let dz = MockDzRpcClientType::new(); + let sol = MockSolRpcClientType::new(); + + let sentinel = new_sentinel(dz, sol).await; + assert_eq!(sentinel.derive_status(1000), TenantPaymentStatus::Paid); + assert_eq!(sentinel.derive_status(9999), TenantPaymentStatus::Paid); + } + + #[tokio::test] + async fn test_derive_status_delinquent() { + let dz = MockDzRpcClientType::new(); + let sol = MockSolRpcClientType::new(); + + let sentinel = new_sentinel(dz, sol).await; + assert_eq!(sentinel.derive_status(999), TenantPaymentStatus::Delinquent); + assert_eq!(sentinel.derive_status(1), TenantPaymentStatus::Delinquent); + } + + #[tokio::test] + async fn test_cache_prevents_redundant_writes() { + let tenant = make_tenant(1, 2, TenantPaymentStatus::Delinquent); + let tenant_pda = tenant.tenant_pda; + let token_account = tenant.token_account; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + dz.expect_get_tenants_with_token_accounts() + .returning(move || Ok(vec![make_tenant(1, 2, TenantPaymentStatus::Delinquent)])); + + // Balance check happens every call (cache only prevents DZ writes) + sol.expect_get_token_account_balance() + .with(predicate::eq(token_account)) + .times(2) + .returning(|_| Ok(5000)); + + // DZ write should only happen once — second call is skipped by cache + dz.expect_update_tenant_payment_status() + .with( + predicate::eq(tenant_pda), + predicate::eq(TenantPaymentStatus::Paid), + ) + .times(1) + .returning(|_, _| Ok(Signature::new_unique())); + + let sentinel = new_sentinel(dz, sol).await; + + // First check — should trigger update + sentinel.check_and_update_tenant(&tenant).await.unwrap(); + + // Second check — cache hit, no DZ write (mockall would panic if update called again) + sentinel.check_and_update_tenant(&tenant).await.unwrap(); + } + + #[tokio::test] + async fn test_onchain_status_matches_skips_write() { + // Tenant already has Paid status onchain; balance still high. + // Should NOT write to DZ Ledger, but should populate cache. + let tenant = make_tenant(1, 2, TenantPaymentStatus::Paid); + let token_account = tenant.token_account; + + let dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + sol.expect_get_token_account_balance() + .with(predicate::eq(token_account)) + .times(1) + .returning(|_| Ok(5000)); + + // No update expected — status already matches + // (mockall will panic if update_tenant_payment_status is called) + + let sentinel = new_sentinel(dz, sol).await; + sentinel.check_and_update_tenant(&tenant).await.unwrap(); + } + + #[tokio::test] + async fn test_paid_to_delinquent_transition() { + // Tenant is Paid onchain but balance has dropped below threshold + let tenant = make_tenant(1, 2, TenantPaymentStatus::Paid); + let tenant_pda = tenant.tenant_pda; + let token_account = tenant.token_account; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + sol.expect_get_token_account_balance() + .with(predicate::eq(token_account)) + .times(1) + .returning(|_| Ok(0)); + + dz.expect_update_tenant_payment_status() + .with( + predicate::eq(tenant_pda), + predicate::eq(TenantPaymentStatus::Delinquent), + ) + .times(1) + .returning(|_, _| Ok(Signature::new_unique())); + + let sentinel = new_sentinel(dz, sol).await; + sentinel.check_and_update_tenant(&tenant).await.unwrap(); + } + + #[tokio::test] + async fn test_multiple_tenants_tracked_independently() { + let tenant_a = make_tenant(1, 10, TenantPaymentStatus::Delinquent); + let tenant_b = make_tenant(2, 20, TenantPaymentStatus::Delinquent); + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + // Tenant A: high balance + sol.expect_get_token_account_balance() + .with(predicate::eq(tenant_a.token_account)) + .returning(|_| Ok(5000)); + + // Tenant B: zero balance + sol.expect_get_token_account_balance() + .with(predicate::eq(tenant_b.token_account)) + .returning(|_| Ok(0)); + + dz.expect_update_tenant_payment_status() + .with( + predicate::eq(tenant_a.tenant_pda), + predicate::eq(TenantPaymentStatus::Paid), + ) + .times(1) + .returning(|_, _| Ok(Signature::new_unique())); + + // No update expected for tenant_b — already Delinquent and stays Delinquent + // (mockall will panic if update_tenant_payment_status is called with tenant_b) + + let sentinel = new_sentinel(dz, sol).await; + + sentinel.check_and_update_tenant(&tenant_a).await.unwrap(); + sentinel.check_and_update_tenant(&tenant_b).await.unwrap(); + } + + // ── Deduction path tests (rate > 0) ───────────────────────────────── + + #[tokio::test] + async fn test_deduction_happy_path() { + // Tenant with rate > 0, epoch behind current → should deduct + let tenant = make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Paid, + billing_config(1_000_000, 5), + ); + let tenant_pda = tenant.tenant_pda; + let token_account = tenant.token_account; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + // No receipt exists yet + dz.expect_billing_receipt_exists() + .with(predicate::eq(tenant_pda), predicate::eq(6)) + .times(1) + .returning(|_, _| Ok(false)); + + // Transfer succeeds + sol.expect_transfer_spl_token() + .with( + predicate::eq(token_account), + predicate::eq(TEST_JOURNAL_ATA), + predicate::eq(1_000_000), + ) + .times(1) + .returning(|_, _, _| Ok(Signature::new_unique())); + + // Atomic receipt creation + epoch update + dz.expect_create_billing_receipt_and_update_epoch() + .with(predicate::eq(tenant_pda), predicate::always()) + .times(1) + .returning(|_, _| Ok(Signature::new_unique())); + + let sentinel = new_sentinel(dz, sol).await; + sentinel.deduct_tenant(&tenant, 10).await.unwrap(); + } + + #[tokio::test] + async fn test_deduction_insufficient_balance() { + // Transfer fails, balance < rate → Delinquent + let tenant = make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Paid, + billing_config(1_000_000, 5), + ); + let tenant_pda = tenant.tenant_pda; + let token_account = tenant.token_account; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + // No receipt exists + dz.expect_billing_receipt_exists() + .returning(|_, _| Ok(false)); + + // Transfer fails + sol.expect_transfer_spl_token() + .times(1) + .returning(|_, _, _| Err(crate::Error::Deserialize("insufficient funds".into()))); + + // Balance check reveals insufficient funds + sol.expect_get_token_account_balance() + .with(predicate::eq(token_account)) + .times(1) + .returning(|_| Ok(500_000)); // less than rate + + // Should mark Delinquent + dz.expect_update_tenant_payment_status() + .with( + predicate::eq(tenant_pda), + predicate::eq(TenantPaymentStatus::Delinquent), + ) + .times(1) + .returning(|_, _| Ok(Signature::new_unique())); + + let sentinel = new_sentinel(dz, sol).await; + sentinel.deduct_tenant(&tenant, 10).await.unwrap(); + } + + #[tokio::test] + async fn test_deduction_already_current() { + // last_deduction_dz_epoch >= current_epoch → no calls + let tenant = make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Paid, + billing_config(1_000_000, 10), + ); + + let dz = MockDzRpcClientType::new(); + let sol = MockSolRpcClientType::new(); + // No expectations — mockall panics if any method is called + + let sentinel = new_sentinel(dz, sol).await; + sentinel.deduct_tenant(&tenant, 10).await.unwrap(); + } + + #[tokio::test] + async fn test_rate_zero_uses_legacy_path() { + // rate == 0 → poll_cycle routes to check_and_update_tenant, NOT deduct_tenant + let tenant = + make_tenant_with_billing(1, 2, TenantPaymentStatus::Delinquent, billing_config(0, 0)); + let token_account = tenant.token_account; + let tenant_pda = tenant.tenant_pda; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + dz.expect_get_current_dz_epoch().returning(|| Ok(10)); + + dz.expect_get_tenants_with_token_accounts() + .returning(move || { + Ok(vec![make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Delinquent, + billing_config(0, 0), + )]) + }); + + // Legacy balance check path + sol.expect_get_token_account_balance() + .with(predicate::eq(token_account)) + .times(1) + .returning(|_| Ok(5000)); + + dz.expect_update_tenant_payment_status() + .with( + predicate::eq(tenant_pda), + predicate::eq(TenantPaymentStatus::Paid), + ) + .times(1) + .returning(|_, _| Ok(Signature::new_unique())); + + // transfer_spl_token should NOT be called (mockall panics if it is) + + let sentinel = new_sentinel(dz, sol).await; + sentinel.poll_cycle().await.unwrap(); + } + + #[tokio::test] + async fn test_deduction_cache_prevents_duplicate() { + // First call: receipt doesn't exist, transfer + DZ tx succeed. + // Second call: receipt check returns true → skip entirely. + let tenant = make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Paid, + billing_config(1_000_000, 5), + ); + let tenant_pda = tenant.tenant_pda; + let token_account = tenant.token_account; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + // First call: no receipt + // Second call: receipt exists on-chain (covers the "already deducted" path) + let mut receipt_seq = mockall::Sequence::new(); + dz.expect_billing_receipt_exists() + .with(predicate::eq(tenant_pda), predicate::eq(6)) + .times(1) + .in_sequence(&mut receipt_seq) + .returning(|_, _| Ok(false)); + dz.expect_billing_receipt_exists() + .with(predicate::eq(tenant_pda), predicate::eq(6)) + .times(1) + .in_sequence(&mut receipt_seq) + .returning(|_, _| Ok(true)); + + // Transfer succeeds ONCE + sol.expect_transfer_spl_token() + .with( + predicate::eq(token_account), + predicate::eq(TEST_JOURNAL_ATA), + predicate::eq(1_000_000), + ) + .times(1) + .returning(|_, _, _| Ok(Signature::new_unique())); + + // DZ tx called ONCE + dz.expect_create_billing_receipt_and_update_epoch() + .with(predicate::eq(tenant_pda), predicate::always()) + .times(1) + .returning(|_, _| Ok(Signature::new_unique())); + + let sentinel = new_sentinel(dz, sol).await; + + // First call — deducts + sentinel.deduct_tenant(&tenant, 10).await.unwrap(); + + // Second call — receipt exists, no deduction (mockall panics if transfer called again) + sentinel.deduct_tenant(&tenant, 10).await.unwrap(); + } + + #[tokio::test] + async fn test_deduction_catches_up_one_epoch() { + // Tenant is 3 epochs behind (last=5, current=8) → deducts only epoch 6 + let tenant = make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Paid, + billing_config(1_000_000, 5), + ); + let token_account = tenant.token_account; + let tenant_pda = tenant.tenant_pda; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + // No receipt for epoch 6 + dz.expect_billing_receipt_exists() + .with(predicate::eq(tenant_pda), predicate::eq(6)) + .times(1) + .returning(|_, _| Ok(false)); + + // Should transfer for epoch 6 only (last + 1) + sol.expect_transfer_spl_token() + .with( + predicate::eq(token_account), + predicate::eq(TEST_JOURNAL_ATA), + predicate::eq(1_000_000), + ) + .times(1) + .returning(|_, _, _| Ok(Signature::new_unique())); + + // Should create receipt + bump to epoch 6, NOT 7 or 8 + dz.expect_create_billing_receipt_and_update_epoch() + .with(predicate::eq(tenant_pda), predicate::always()) + .times(1) + .returning(|_, _| Ok(Signature::new_unique())); + + let sentinel = new_sentinel(dz, sol).await; + sentinel.deduct_tenant(&tenant, 8).await.unwrap(); + } + + #[tokio::test] + async fn test_transfer_not_retried_after_epoch_update_failure() { + // Transfer succeeds but DZ tx fails → second call retries + // only the DZ tx (via transfer_cache), NOT the SPL transfer + let tenant = make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Paid, + billing_config(1_000_000, 5), + ); + let tenant_pda = tenant.tenant_pda; + let token_account = tenant.token_account; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + // Receipt checks: + // 1. Pre-transfer on first call → false + // 2. Post-DZ-failure on first call → false (receipt didn't land) + // Second call hits transfer_cache so no pre-transfer check. + dz.expect_billing_receipt_exists() + .with(predicate::eq(tenant_pda), predicate::eq(6)) + .times(2) + .returning(|_, _| Ok(false)); + + // Transfer called exactly ONCE — must not be retried + sol.expect_transfer_spl_token() + .with( + predicate::eq(token_account), + predicate::eq(TEST_JOURNAL_ATA), + predicate::eq(1_000_000), + ) + .times(1) + .returning(|_, _, _| Ok(Signature::new_unique())); + + // DZ tx: first call fails, second succeeds + let mut seq = mockall::Sequence::new(); + + dz.expect_create_billing_receipt_and_update_epoch() + .with(predicate::eq(tenant_pda), predicate::always()) + .times(1) + .in_sequence(&mut seq) + .returning(|_, _| Err(crate::Error::Deserialize("network error".into()))); + + dz.expect_create_billing_receipt_and_update_epoch() + .with(predicate::eq(tenant_pda), predicate::always()) + .times(1) + .in_sequence(&mut seq) + .returning(|_, _| Ok(Signature::new_unique())); + + let sentinel = new_sentinel(dz, sol).await; + + // First call: transfer OK, DZ tx fails → error propagated + assert!(sentinel.deduct_tenant(&tenant, 10).await.is_err()); + + // Second call: transfer_cache hit → retries only DZ tx → succeeds + // (mockall would panic if transfer_spl_token were called again) + sentinel.deduct_tenant(&tenant, 10).await.unwrap(); + } + + #[tokio::test] + async fn test_deduction_transient_error_does_not_set_delinquent() { + // Transfer fails but balance >= rate → transient error, no status change + let tenant = make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Paid, + billing_config(1_000_000, 5), + ); + let token_account = tenant.token_account; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + // No receipt exists + dz.expect_billing_receipt_exists() + .returning(|_, _| Ok(false)); + + // Transfer fails + sol.expect_transfer_spl_token() + .times(1) + .returning(|_, _, _| Err(crate::Error::Deserialize("timeout".into()))); + + // Balance is sufficient — transient error + sol.expect_get_token_account_balance() + .with(predicate::eq(token_account)) + .times(1) + .returning(|_| Ok(5_000_000)); + + // update_tenant_payment_status should NOT be called + // (mockall panics if it is) + + let sentinel = new_sentinel(dz, sol).await; + sentinel.deduct_tenant(&tenant, 10).await.unwrap(); + } + + #[tokio::test] + async fn test_receipt_exists_skips_deduction() { + // Receipt already exists on DZ Ledger → no transfer, no DZ tx + let tenant = make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Paid, + billing_config(1_000_000, 5), + ); + let tenant_pda = tenant.tenant_pda; + + let mut dz = MockDzRpcClientType::new(); + let sol = MockSolRpcClientType::new(); + + // Receipt exists + dz.expect_billing_receipt_exists() + .with(predicate::eq(tenant_pda), predicate::eq(6)) + .times(1) + .returning(|_, _| Ok(true)); + + // No transfer or DZ tx expected (mockall panics if called) + + let sentinel = new_sentinel(dz, sol).await; + sentinel.deduct_tenant(&tenant, 10).await.unwrap(); + } + + #[tokio::test] + async fn test_transfer_cached_retry_dz_tx_only() { + // Validates transfer_cache prevents re-transfer when DZ tx fails + // within the same process run + let tenant = make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Paid, + billing_config(1_000_000, 5), + ); + let tenant_pda = tenant.tenant_pda; + let token_account = tenant.token_account; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + // Receipt checks: + // 1. Pre-transfer on first call → false + // 2. Post-DZ-failure on first call → false + // 3. Post-DZ-failure on second call → false + // Third call succeeds so no post-failure check. + dz.expect_billing_receipt_exists() + .with(predicate::eq(tenant_pda), predicate::eq(6)) + .times(3) + .returning(|_, _| Ok(false)); + + // Transfer only once + sol.expect_transfer_spl_token() + .with( + predicate::eq(token_account), + predicate::eq(TEST_JOURNAL_ATA), + predicate::eq(1_000_000), + ) + .times(1) + .returning(|_, _, _| Ok(Signature::new_unique())); + + // DZ tx fails twice, succeeds third time + let mut seq = mockall::Sequence::new(); + + dz.expect_create_billing_receipt_and_update_epoch() + .with(predicate::eq(tenant_pda), predicate::always()) + .times(1) + .in_sequence(&mut seq) + .returning(|_, _| Err(crate::Error::Deserialize("DZ outage".into()))); + + dz.expect_create_billing_receipt_and_update_epoch() + .with(predicate::eq(tenant_pda), predicate::always()) + .times(1) + .in_sequence(&mut seq) + .returning(|_, _| Err(crate::Error::Deserialize("DZ outage".into()))); + + dz.expect_create_billing_receipt_and_update_epoch() + .with(predicate::eq(tenant_pda), predicate::always()) + .times(1) + .in_sequence(&mut seq) + .returning(|_, _| Ok(Signature::new_unique())); + + let sentinel = new_sentinel(dz, sol).await; + + // First call: transfer OK, DZ tx fails + assert!(sentinel.deduct_tenant(&tenant, 10).await.is_err()); + + // Second call: transfer_cache hit, DZ tx fails again + assert!(sentinel.deduct_tenant(&tenant, 10).await.is_err()); + + // Third call: transfer_cache hit, DZ tx succeeds + sentinel.deduct_tenant(&tenant, 10).await.unwrap(); + } + + #[tokio::test] + async fn test_ambiguous_dz_tx_success_treated_as_success() { + // DZ tx returns an error but the receipt actually landed on-chain + // (e.g. timeout or allocate-existing-account). Should treat as success. + let tenant = make_tenant_with_billing( + 1, + 2, + TenantPaymentStatus::Paid, + billing_config(1_000_000, 5), + ); + let tenant_pda = tenant.tenant_pda; + let token_account = tenant.token_account; + + let mut dz = MockDzRpcClientType::new(); + let mut sol = MockSolRpcClientType::new(); + + // No receipt before transfer + dz.expect_billing_receipt_exists() + .with(predicate::eq(tenant_pda), predicate::eq(6)) + .times(1) + .returning(|_, _| Ok(false)); + + // Transfer succeeds + sol.expect_transfer_spl_token() + .with( + predicate::eq(token_account), + predicate::eq(TEST_JOURNAL_ATA), + predicate::eq(1_000_000), + ) + .times(1) + .returning(|_, _, _| Ok(Signature::new_unique())); + + // DZ tx fails with an error... + dz.expect_create_billing_receipt_and_update_epoch() + .with(predicate::eq(tenant_pda), predicate::always()) + .times(1) + .returning(|_, _| Err(crate::Error::Deserialize("allocate: account exists".into()))); + + // ...but the post-failure receipt check finds it on-chain + dz.expect_billing_receipt_exists() + .with(predicate::eq(tenant_pda), predicate::eq(6)) + .times(1) + .returning(|_, _| Ok(true)); + + let sentinel = new_sentinel(dz, sol).await; + + // Should succeed despite the DZ tx error + sentinel.deduct_tenant(&tenant, 10).await.unwrap(); + } +} diff --git a/offchain/crates/sentinel/src/sentinel/mod.rs b/offchain/crates/sentinel/src/sentinel/mod.rs new file mode 100644 index 0000000000..d8e5a6f006 --- /dev/null +++ b/offchain/crates/sentinel/src/sentinel/mod.rs @@ -0,0 +1,7 @@ +pub mod billing; +pub mod poller; +pub mod verification; + +pub use billing::{BillingConfig, BillingSentinel}; +pub use poller::PollingSentinel; +pub use verification::ValidatorVerifier; diff --git a/offchain/crates/sentinel/src/sentinel/poller.rs b/offchain/crates/sentinel/src/sentinel/poller.rs new file mode 100644 index 0000000000..49e5e1d382 --- /dev/null +++ b/offchain/crates/sentinel/src/sentinel/poller.rs @@ -0,0 +1,366 @@ +use std::{ + collections::HashSet, + net::Ipv4Addr, + sync::Arc, + time::{Duration, Instant}, +}; + +use doublezero_passport::instruction::AccessMode; +use retainer::Cache; +use solana_sdk::{pubkey::Pubkey, signature::Keypair}; +use tokio::time::interval; +use tokio_util::sync::CancellationToken; +use tracing::{error, info, warn}; +use url::Url; + +use crate::{ + AccessId, Result, + client::{doublezero_ledger::DzRpcClient, solana::SolRpcClient}, + error::rpc_with_retry, + sentinel::ValidatorVerifier, +}; + +// cache ttl: 5 minutes +const CACHE_TTL: Duration = Duration::from_secs(300); +// cache monitoring interval, every 60s +const CACHE_MONITOR_INTERVAL: Duration = Duration::from_secs(60); + +pub struct PollingSentinel { + dz_rpc_client: DzRpcClient, + sol_rpc_client: SolRpcClient, + processed_cache: Arc>, + poll_interval: Duration, + previous_leader_epochs: u8, + multicast_group_pubkeys: Vec, +} + +impl PollingSentinel { + pub async fn new( + dz_rpc: Url, + sol_rpc: Url, + keypair: Arc, + serviceability_id: Pubkey, + poll_interval_secs: u64, + previous_leader_epochs: u8, + multicast_group_pubkeys: Vec, + ) -> Result { + // Create cache with automatic background cleanup + let processed_cache = Arc::new(Cache::new()); + + // Spawn background task to monitor cache + // every 60s, removing entries older than 300s (5 intervals of 60s) + let cache_clone = processed_cache.clone(); + tokio::spawn(async move { + cache_clone.monitor(5, 0.25, CACHE_MONITOR_INTERVAL).await; + }); + + Ok(Self { + dz_rpc_client: DzRpcClient::new(dz_rpc, keypair.clone(), serviceability_id), + sol_rpc_client: SolRpcClient::new(sol_rpc, keypair), + processed_cache, + poll_interval: Duration::from_secs(poll_interval_secs), + previous_leader_epochs, + multicast_group_pubkeys, + }) + } + + pub async fn run(&mut self, shutdown_listener: CancellationToken) -> Result<()> { + let mut poll_timer = interval(self.poll_interval); + + loop { + tokio::select! { + biased; + _ = shutdown_listener.cancelled() => { + info!("shutdown signal received"); + break; + } + _ = poll_timer.tick() => { + let access_ids = match rpc_with_retry( + || async { + self.sol_rpc_client.get_access_requests().await + }, + "get_access_requests", + ).await { + Ok(ids) => ids, + Err(err) => { + error!(?err, "failed to fetch access requests; will retry in next cycle"); + metrics::counter!("doublezero_sentinel_poll_failed").increment(1); + continue; + } + }; + + // Filter out already-processed requests + let mut new_requests = Vec::new(); + let mut duplicate_count = 0; + + for access_id in access_ids { + if let Some(processed_at) = self.processed_cache.get(&access_id.request_pda).await { + duplicate_count += 1; + let age = processed_at.elapsed(); + metrics::counter!("doublezero_sentinel_duplicate_request_filtered").increment(1); + metrics::histogram!("doublezero_sentinel_duplicate_age_seconds").record(age.as_secs_f64()); + } else { + new_requests.push(access_id); + } + } + + if duplicate_count > 0 { + info!( + duplicates = duplicate_count, + "filtered out recently processed requests" + ); + } + + info!(count = new_requests.len(), "processing unhandled access requests"); + + for access_id in new_requests { + let request_pda = access_id.request_pda; + match self.handle_access_request(access_id).await { + Ok(_) => { + // Only cache after successful processing + self.processed_cache.insert(request_pda, Instant::now(), CACHE_TTL).await; + } + Err(err) => { + error!(?err, "error encountered validating network access request; will retry on next poll"); + // Don't cache failures - allow retry on next poll cycle + } + } + } + } + } + } + + Ok(()) + } + + async fn handle_access_request(&self, access_id: AccessId) -> Result<()> { + let service_key = match &access_id.mode { + AccessMode::SolanaValidator(a) => a.service_key, + AccessMode::SolanaValidatorWithBackupIds { attestation, .. } => attestation.service_key, + }; + + info!(%service_key, request_pda = %access_id.request_pda, "handling access request"); + + let validator_ips = self.verify_qualifiers(&access_id.mode).await?; + + if !validator_ips.is_empty() { + // Issue access passes for all validators (primary + backups) + for (validator_id, validator_ip) in validator_ips { + rpc_with_retry( + || async { + self.dz_rpc_client + .issue_access_pass(&service_key, &validator_ip, &validator_id) + .await + }, + "issue_access_pass", + ) + .await?; + info!(%validator_id, %validator_ip, user = %service_key, "access pass issued"); + + let existing_mgroup_pubs: HashSet = match rpc_with_retry( + || async { + self.dz_rpc_client + .get_access_pass(&service_key, &validator_ip) + .await + }, + "get_access_pass", + ) + .await + { + Ok(access_pass) => access_pass.mgroup_pub_allowlist.into_iter().collect(), + Err(err) => { + warn!( + ?err, %validator_id, %validator_ip, + "failed to fetch access pass for idempotency check; \ + will attempt all multicast allowlist additions" + ); + HashSet::new() + } + }; + + for mgroup_pubkey in &self.multicast_group_pubkeys { + if existing_mgroup_pubs.contains(mgroup_pubkey) { + info!( + %validator_id, %validator_ip, %mgroup_pubkey, + "validator already in multicast publisher allowlist; skipping" + ); + metrics::counter!("doublezero_sentinel_multicast_allowlist_skipped") + .increment(1); + continue; + } + + match rpc_with_retry( + || async { + self.dz_rpc_client + .add_multicast_publisher_allowlist( + mgroup_pubkey, + &service_key, + &validator_ip, + ) + .await + }, + "add_multicast_publisher_allowlist", + ) + .await + { + Ok(_) => { + info!( + %validator_id, %validator_ip, %mgroup_pubkey, + "multicast publisher allowlist added" + ); + metrics::counter!("doublezero_sentinel_multicast_allowlist_success") + .increment(1); + } + Err(err) => { + error!( + ?err, %validator_id, %validator_ip, %mgroup_pubkey, + "multicast allowlist failed; continuing" + ); + metrics::counter!("doublezero_sentinel_multicast_allowlist_failed") + .increment(1); + } + } + } + } + + let signature = rpc_with_retry( + || async { + self.sol_rpc_client + .grant_access(&access_id.request_pda, &access_id.rent_beneficiary_key) + .await + }, + "grant_access", + ) + .await?; + info!(%signature, user = %service_key, "access request granted"); + metrics::counter!("doublezero_sentinel_access_granted").increment(1); + } else { + let signature = rpc_with_retry( + || async { + self.sol_rpc_client + .deny_access(&access_id.request_pda) + .await + }, + "deny_access", + ) + .await?; + info!(%signature, user = %service_key, "access request denied"); + metrics::counter!("doublezero_sentinel_access_denied").increment(1); + } + + Ok(()) + } + + async fn verify_qualifiers(&self, access_mode: &AccessMode) -> Result> { + let verifier = ValidatorVerifier::new(&self.sol_rpc_client, self.previous_leader_epochs); + verifier.verify_qualifiers(access_mode).await + } +} + +#[cfg(test)] +mod tests { + use doublezero_passport::instruction::SolanaValidatorAttestation; + use solana_sdk::pubkey::Pubkey; + + use super::*; + + #[tokio::test] + async fn test_cache_prevents_duplicate_processing() { + // Test that cache correctly identifies already-processed requests + let cache = Cache::new(); + let request_pda = Pubkey::new_unique(); + + // Initially, request should not be in cache + assert!( + cache.get(&request_pda).await.is_none(), + "new request should not be in cache" + ); + + // Insert request into cache + cache.insert(request_pda, Instant::now(), CACHE_TTL).await; + + // Now it should be found + assert!( + cache.get(&request_pda).await.is_some(), + "request should be in cache after insertion" + ); + } + + #[tokio::test] + async fn test_cache_ttl_expiration() { + // Test that cache entries expire after TTL + let cache = Cache::new(); + let request_pda = Pubkey::new_unique(); + + // Use very short TTL for testing (100ms) + let short_ttl = Duration::from_millis(100); + cache.insert(request_pda, Instant::now(), short_ttl).await; + + // Should be in cache immediately + assert!( + cache.get(&request_pda).await.is_some(), + "request should be in cache immediately after insertion" + ); + + // Wait for TTL to expire plus buffer + tokio::time::sleep(Duration::from_millis(150)).await; + + // Should be expired and removed + assert!( + cache.get(&request_pda).await.is_none(), + "request should be removed from cache after TTL expires" + ); + } + + #[tokio::test] + async fn test_cache_handles_multiple_requests() { + // Test that cache can track multiple different requests + let cache = Cache::new(); + let pda1 = Pubkey::new_unique(); + let pda2 = Pubkey::new_unique(); + let pda3 = Pubkey::new_unique(); + + // Insert multiple requests + cache.insert(pda1, Instant::now(), CACHE_TTL).await; + cache.insert(pda2, Instant::now(), CACHE_TTL).await; + + // Both should be in cache + assert!(cache.get(&pda1).await.is_some()); + assert!(cache.get(&pda2).await.is_some()); + + // pda3 not inserted, should not be in cache + assert!(cache.get(&pda3).await.is_none()); + } + + #[tokio::test] + async fn test_verify_qualifiers_signature_verify_error_returns_empty() { + // Build a real PollingSentinel; it won't hit network because we short-circuit on signature + let keypair = Arc::new(Keypair::new()); + let dz_rpc = Url::parse("http://127.0.0.1:1234").unwrap(); + let sol_rpc = Url::parse("http://127.0.0.1:1235").unwrap(); + let serviceability_id = Pubkey::new_unique(); + + let sentinel = PollingSentinel { + dz_rpc_client: DzRpcClient::new(dz_rpc, keypair.clone(), serviceability_id), + sol_rpc_client: SolRpcClient::new(sol_rpc, keypair), + processed_cache: Arc::new(Cache::new()), + poll_interval: Duration::from_secs(15), + previous_leader_epochs: 0, + multicast_group_pubkeys: vec![], + }; + + // Invalid signature -> verify_access_request(...) should return Error::SignatureVerify + let attestation = SolanaValidatorAttestation { + validator_id: Pubkey::new_unique(), + service_key: Pubkey::new_unique(), + ed25519_signature: [0u8; 64], + }; + let access_mode = AccessMode::SolanaValidator(attestation); + + let result = sentinel.verify_qualifiers(&access_mode).await.unwrap(); + assert!( + result.is_empty(), + "expected empty vec when signature verification fails" + ); + } +} diff --git a/offchain/crates/sentinel/src/sentinel/verification.rs b/offchain/crates/sentinel/src/sentinel/verification.rs new file mode 100644 index 0000000000..1b41f9a46d --- /dev/null +++ b/offchain/crates/sentinel/src/sentinel/verification.rs @@ -0,0 +1,131 @@ +use std::net::Ipv4Addr; + +use doublezero_passport::instruction::AccessMode; +use solana_sdk::pubkey::Pubkey; +use tracing::info; + +use crate::{ + Error, Result, client::solana::SolRpcClientType, error::rpc_with_retry, verify_access_request, +}; + +/// Shared validator verification logic used by both WebSocket and polling modes +pub struct ValidatorVerifier<'a, SolRpcClient: SolRpcClientType> { + sol_rpc_client: &'a SolRpcClient, + previous_leader_epochs: u8, +} + +impl<'a, SolRpcClient: SolRpcClientType> ValidatorVerifier<'a, SolRpcClient> { + pub fn new(sol_rpc_client: &'a SolRpcClient, previous_leader_epochs: u8) -> Self { + Self { + sol_rpc_client, + previous_leader_epochs, + } + } + + /// Verify access request qualifiers and return validated (validator_id, ip) pairs + pub async fn verify_qualifiers( + &self, + access_mode: &AccessMode, + ) -> Result> { + // Return early if sig verification fails + let validator_id = match verify_access_request(access_mode) { + Ok(v) => v, + Err(e @ Error::SignatureVerify) => { + return { + info!(reason = %e, "signature verification failed"); + Ok(vec![]) + }; + } + Err(e) => return Err(e), + }; + info!(%validator_id, "Validator passed signature validation"); + + // Extract attestation and backup IDs + let backup_ids = match access_mode { + AccessMode::SolanaValidator(_) => None, + AccessMode::SolanaValidatorWithBackupIds { backup_ids, .. } => Some(backup_ids), + }; + + // Check primary validator is in leader schedule + if !self + .check_validator_in_leader_schedule(&validator_id) + .await? + { + info!( + %validator_id, + "Validator failed leader schedule qualification" + ); + return Ok(vec![]); + } + + // Get primary validator IP immediately after leader schedule check + let validator_ip = match self.get_and_validate_validator_ip(&validator_id).await? { + Some(ip) => ip, + None => { + info!( + %validator_id, + "Validator failed gossip protocol ip qualification" + ); + return Ok(Default::default()); + } + }; + + // Collect all validated IPs (starting with primary) + let mut ips = vec![(validator_id, validator_ip)]; + + // If we have backup IDs, verify they are NOT in leader schedule but ARE in gossip + if let Some(backup_ids) = backup_ids { + for backup_id in backup_ids { + // Backup should NOT be in leader schedule + if self.check_validator_in_leader_schedule(backup_id).await? { + info!( + %backup_id, + "Backup validator is in leader schedule (should not be)" + ); + return Ok(Default::default()); + } + + // Check backup ID is in gossip and store IP + match self.get_and_validate_validator_ip(backup_id).await? { + Some(ip) => { + ips.push((*backup_id, ip)); + } + None => { + info!( + %backup_id, + "Backup validator not found in gossip" + ); + return Ok(Default::default()); + } + } + } + } + + Ok(ips) + } + + /// Check that a validator is in the leader schedule + async fn check_validator_in_leader_schedule(&self, validator_id: &Pubkey) -> Result { + rpc_with_retry( + || async { + self.sol_rpc_client + .is_scheduled_leader(validator_id, self.previous_leader_epochs) + .await + }, + "is_scheduled_leader", + ) + .await + } + + /// Get and validate a validator's IP from gossip + async fn get_and_validate_validator_ip( + &self, + validator_id: &Pubkey, + ) -> Result> { + rpc_with_retry( + || async { self.sol_rpc_client.get_validator_ip(validator_id).await }, + "get_validator_ip", + ) + .await + } +} diff --git a/offchain/crates/sentinel/src/settings.rs b/offchain/crates/sentinel/src/settings.rs new file mode 100644 index 0000000000..5cc7a849ef --- /dev/null +++ b/offchain/crates/sentinel/src/settings.rs @@ -0,0 +1,241 @@ +use std::{ + fs, + net::SocketAddr, + path::{Path, PathBuf}, + str::FromStr, + sync::Arc, +}; + +use clap::Parser; +use config::{Config, Environment, File}; +use doublezero_serviceability::addresses::{devnet, mainnet, testnet}; +use serde::{Deserialize, Serialize}; +use solana_sdk::{ + pubkey::{ParsePubkeyError, Pubkey}, + signer::keypair::Keypair, +}; +use url::Url; + +#[derive(Debug, Parser)] +#[command( + term_width = 0, + name = "DoubleZero Ledger Sentinel", + version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")) +)] +pub struct AppArgs { + /// Path to the config file + #[arg(short = 'c', long)] + pub config: Option, + + /// Polling interval in seconds for checking access requests (required). + /// Recommended: 30-120 seconds for production. + #[arg(long)] + pub poll_interval: u64, + + /// Polling interval in seconds for checking tenant payment status. + /// Recommended: 60-300 seconds for devnet/testnet. + #[arg(long, default_value = "120")] + pub billing_poll_interval: u64, + + /// Minimum 2Z token amount (in smallest unit) for a tenant to be considered paid. + /// Default: 1 (any nonzero balance = paid). + #[arg(long)] + pub minimum_balance: Option, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct Settings { + /// Log level + #[serde(default = "default_log")] + pub log: String, + + /// The DZ ledger environment with which to interface + pub env: String, + + /// Connection URIs for the DZ ledger RPC endpoint + dz_rpc: String, + + /// Connection URI for the Solana RPC endpoint + sol_rpc: String, + + /// The path to the keypair file authorized in the passport program on Solana + /// and holding the oboarding DZ ledger funds to credit authorized validators + keypair: PathBuf, + + /// metrics listening endpoint + #[serde(default = "default_metrics_addr")] + metrics_addr: String, + + /// Comma-separated multicast group pubkeys for publisher allowlisting on + /// validator onboarding. When empty (default), allowlisting is disabled. + #[serde(default)] + multicast_group_pubkeys: Option, +} + +impl Settings { + pub fn new>(path: Option

) -> Result { + let mut builder = Config::builder(); + + if let Some(file) = path { + builder = builder + .add_source(File::with_name(&file.as_ref().to_string_lossy()).required(false)); + } + builder + .add_source( + Environment::with_prefix("SENTINEL") + .prefix_separator("__") + .separator("__") + .try_parsing(true), + ) + .build() + .and_then(|config| config.try_deserialize()) + } + + pub fn keypair(&self) -> Arc { + let file_content = fs::read_to_string(&self.keypair).expect("invalid keypair file path"); + let secret_key_bytes: Vec = + serde_json::from_str(&file_content).expect("invalid keypair file contents"); + Arc::new(Keypair::try_from(secret_key_bytes.as_slice()).expect("invalid keypair")) + } + + pub fn sol_rpc(&self) -> Url { + let url = match self.sol_rpc.as_ref() { + "m" | "mainnet-beta" => "https://api.mainnet-beta.solana.com", + "t" | "testnet" => "https://api.testnet.solana.com", + "d" | "devnet" => "https://api.devnet.solana.com", + "l" | "localhost" => "http://localhost:8899", + url => url, + }; + Url::parse(url).expect("invalid sol_rpc url") + } + + pub fn dz_rpc(&self) -> Url { + Url::parse(&self.dz_rpc).expect("invalid dz_rpc url") + } + + pub fn metrics_addr(&self) -> SocketAddr { + self.metrics_addr + .parse() + .expect("invalid metrics network address and port") + } + + pub fn multicast_group_pubkeys(&self) -> std::result::Result, ParsePubkeyError> { + self.multicast_group_pubkeys + .as_deref() + .map(|s| { + s.split(',') + .map(|s| s.trim()) + .filter(|s| !s.is_empty()) + .map(Pubkey::from_str) + .collect() + }) + .unwrap_or(Ok(vec![])) + } + + pub fn serviceability_program_id( + &self, + ) -> Result { + match self.env.to_lowercase().as_str() { + "local" => Pubkey::from_str("7CTniUa88iJKUHTrCkB4TjAoG6TD7AMivhQeuqN2LPtX"), + "devnet" => Ok(devnet::program_id::id()), + "testnet" => Ok(testnet::program_id::id()), + "mainnet" => Ok(mainnet::program_id::id()), + "mainnet-beta" => Ok(mainnet::program_id::id()), + other => Pubkey::from_str(other), + } + } + + pub fn doublezero_mint(&self) -> Pubkey { + match self.env.to_lowercase().as_str() { + "mainnet" | "mainnet-beta" | "local" | "localhost" => { + // NOTE: local|localhost are forked off of mn-beta + doublezero_revenue_distribution::env::mainnet::DOUBLEZERO_MINT_KEY + } + "testnet" | "devnet" => { + doublezero_revenue_distribution::env::development::DOUBLEZERO_MINT_KEY + } + other => { + tracing::warn!( + env = other, + "unknown environment for mint; defaulting to development key" + ); + doublezero_revenue_distribution::env::development::DOUBLEZERO_MINT_KEY + } + } + } +} + +/// Helper to build a `Settings` with only `multicast_group_pubkeys` set. +/// All other fields use placeholder values (not relevant for the test). +#[cfg(test)] +fn settings_with_mcast_pubkeys(pubkeys: Option<&str>) -> Settings { + Settings { + log: default_log(), + env: "devnet".into(), + dz_rpc: "http://localhost:1234".into(), + sol_rpc: "localhost".into(), + keypair: "/dev/null".into(), + metrics_addr: default_metrics_addr(), + multicast_group_pubkeys: pubkeys.map(String::from), + } +} + +fn default_log() -> String { + "doublezero_ledger_sentinel=info".to_string() +} + +fn default_metrics_addr() -> String { + "127.0.0.1:2112".to_string() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn multicast_group_pubkeys_none() { + let settings = settings_with_mcast_pubkeys(None); + assert!(settings.multicast_group_pubkeys().unwrap().is_empty()); + } + + #[test] + fn multicast_group_pubkeys_empty_string() { + let settings = settings_with_mcast_pubkeys(Some("")); + assert!(settings.multicast_group_pubkeys().unwrap().is_empty()); + } + + #[test] + fn multicast_group_pubkeys_single() { + let pk = Pubkey::new_unique(); + let settings = settings_with_mcast_pubkeys(Some(&pk.to_string())); + assert_eq!(settings.multicast_group_pubkeys().unwrap(), vec![pk]); + } + + #[test] + fn multicast_group_pubkeys_multiple_with_whitespace() { + let pk1 = Pubkey::new_unique(); + let pk2 = Pubkey::new_unique(); + let pk3 = Pubkey::new_unique(); + let input = format!(" {} , {} , {} ", pk1, pk2, pk3); + let settings = settings_with_mcast_pubkeys(Some(&input)); + assert_eq!( + settings.multicast_group_pubkeys().unwrap(), + vec![pk1, pk2, pk3] + ); + } + + #[test] + fn multicast_group_pubkeys_trailing_comma() { + let pk1 = Pubkey::new_unique(); + let pk2 = Pubkey::new_unique(); + let input = format!("{},{},", pk1, pk2); + let settings = settings_with_mcast_pubkeys(Some(&input)); + assert_eq!(settings.multicast_group_pubkeys().unwrap(), vec![pk1, pk2]); + } + + #[test] + fn multicast_group_pubkeys_invalid_returns_error() { + let settings = settings_with_mcast_pubkeys(Some("not-a-pubkey")); + assert!(settings.multicast_group_pubkeys().is_err()); + } +} diff --git a/offchain/crates/slack-notifier/CHANGELOG.md b/offchain/crates/slack-notifier/CHANGELOG.md new file mode 100644 index 0000000000..cd1b890b2d --- /dev/null +++ b/offchain/crates/slack-notifier/CHANGELOG.md @@ -0,0 +1,31 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- feat(contributor-rewards): add support for distribution slack notifications and other minor cleanups ([#285](https://github.com/doublezerofoundation/doublezero-offchain/pull/285)) + +## [0.0.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/slack-notifier%2Fv0.0.1) - 2025-10-21 + +- display distribution in SOL ([#256](https://github.com/doublezerofoundation/doublezero-offchain/pull/256)) +- ignore overlapping dz epochs in report ([#228](https://github.com/doublezerofoundation/doublezero-offchain/pull/228)) + +### Other + +- integrate slack notifications ([#161](https://github.com/doublezerofoundation/doublezero-offchain/pull/161)) +- Prepare for off-chain components +- Reorg +- Fix api token security, retries and concurrent requests +- Add docs +- More cleanup and simplification +- configuration and defaults +- Cleanup, add TODOs +- Add merkle_generator +- Update README +- Simplify +- Bump README +- Add README diff --git a/offchain/crates/slack-notifier/Cargo.toml b/offchain/crates/slack-notifier/Cargo.toml new file mode 100644 index 0000000000..087d5c8850 --- /dev/null +++ b/offchain/crates/slack-notifier/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "slack-notifier" +version = "0.0.1" + +# Workspace inherited keys +edition.workspace = true +authors.workspace = true +readme.workspace = true +license.workspace = true +repository.workspace = true +homepage.workspace = true + +[dependencies] +anyhow.workspace = true +backon.workspace = true +chrono.workspace = true +reqwest.workspace = true +serde.workspace = true +serde_json.workspace = true +tabled.workspace = true +tokio.workspace = true diff --git a/offchain/crates/slack-notifier/src/contributor_rewards.rs b/offchain/crates/slack-notifier/src/contributor_rewards.rs new file mode 100644 index 0000000000..4def078195 --- /dev/null +++ b/offchain/crates/slack-notifier/src/contributor_rewards.rs @@ -0,0 +1,144 @@ +use anyhow::Result; +use reqwest::{Body, Client}; +use tabled::{builder::Builder as TableBuilder, settings::Style}; + +use crate::slack::build_message_request; + +/// Post contributor-rewards completion notification to Slack +/// Displays a table with Type | Value | Identifier format showing all write operations +pub async fn post_contributor_rewards( + webhook_url: &str, + network: String, + epoch: u64, + write_results: Vec, +) -> Result<()> { + let client = Client::new(); + + // Build table using tabled + let mut table_builder = TableBuilder::default(); + + // Add table headers + table_builder.push_record(["Type", "Value", "Identifier"]); + + // Add Environment row + table_builder.push_record(["Environment", &network, "N/A"]); + + // Add DZ Epoch row + table_builder.push_record(["DZ Epoch", &epoch.to_string(), "N/A"]); + + // Add write operation rows + for result in write_results { + let type_name = map_description_to_type(result.description()); + let (value, identifier) = match result { + WriteResultInfo::Success { + description: _, + ref identifier, + } => ("Success", identifier.as_str()), + WriteResultInfo::Failed { + description: _, + ref error, + } => ("Failed", error.as_str()), + }; + + table_builder.push_record([type_name.as_str(), value, identifier]); + } + + // Build table with markdown style + let table = table_builder.build().with(Style::markdown()).to_string(); + + // Create simple text message with header and table + let message_text = format!("```\n{}\n```", table); + + // Build Slack message + let payload = serde_json::json!({ + "text": message_text + }); + + let body = Body::from(serde_json::to_string(&payload)?); + let request = build_message_request(&client, body, webhook_url.to_string())?; + let _resp = request.send().await?; + + Ok(()) +} + +/// Map internal description to user-friendly Type name +fn map_description_to_type(description: &str) -> String { + match description { + "device telemetry aggregates" => "Write Device Telemetry (DZ Ledger)".to_string(), + "internet telemetry aggregates" => "Write Internet Telemetry (DZ Ledger)".to_string(), + "reward calculation input" => "Write Reward Input (DZ Ledger)".to_string(), + "shapley output storage" => "Write Shapley Output (DZ Ledger)".to_string(), + "merkle root posting" => "Post Merkle Root (Solana)".to_string(), + _ => description.to_string(), + } +} + +/// Information about a write result for Slack notification +#[derive(Debug, Clone)] +pub enum WriteResultInfo { + Success { + description: String, + identifier: String, + }, + Failed { + description: String, + error: String, + }, +} + +impl WriteResultInfo { + pub fn description(&self) -> &str { + match self { + WriteResultInfo::Success { description, .. } => description, + WriteResultInfo::Failed { description, .. } => description, + } + } +} + +/// Row data for the distribution rewards Slack notification table. +#[derive(Debug, Clone)] +pub struct DistributionRewardRow { + pub index: usize, + pub contributor: String, + pub proportion: String, + pub reward: String, + pub distributed: String, +} + +/// Post a per-contributor rewards table to Slack after distribution. +pub async fn post_distribution_rewards( + webhook_url: &str, + network: String, + dz_epoch: u64, + rows: Vec, +) -> Result<()> { + let client = Client::new(); + + let mut table_builder = TableBuilder::default(); + table_builder.push_record(["#", "Contributor", "Proportion", "Reward", "Distributed"]); + table_builder.push_record(["", "Environment", &network, "", ""]); + table_builder.push_record(["", "DZ Epoch", &dz_epoch.to_string(), "", ""]); + + for row in rows { + table_builder.push_record([ + &row.index.to_string(), + &row.contributor, + &row.proportion, + &row.reward, + &row.distributed, + ]); + } + + let table = table_builder.build().with(Style::markdown()).to_string(); + let message_text = format!("```\n{}\n```", table); + + let payload = serde_json::json!({ + "text": message_text + }); + + let body = Body::from(serde_json::to_string(&payload)?); + let request = build_message_request(&client, body, webhook_url.to_string())?; + let _resp = request.send().await?; + + Ok(()) +} diff --git a/offchain/crates/slack-notifier/src/lib.rs b/offchain/crates/slack-notifier/src/lib.rs new file mode 100644 index 0000000000..e49a5872bc --- /dev/null +++ b/offchain/crates/slack-notifier/src/lib.rs @@ -0,0 +1,3 @@ +pub mod contributor_rewards; +pub mod slack; +pub mod validator_debt; diff --git a/offchain/crates/slack-notifier/src/slack.rs b/offchain/crates/slack-notifier/src/slack.rs new file mode 100644 index 0000000000..d8ce098d9f --- /dev/null +++ b/offchain/crates/slack-notifier/src/slack.rs @@ -0,0 +1,312 @@ +use std::{env, fs}; + +use anyhow::{Context, Result, bail}; +use reqwest::{ + Body, Client, RequestBuilder, + header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE}, +}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize)] +pub struct SlackMessage { + pub blocks: Vec, +} + +#[derive(Debug, Serialize)] +pub struct Block { + #[serde(rename = "type")] + pub block_type: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub fields: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub column_settings: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub rows: Option>>, +} + +#[derive(Debug, Serialize)] +pub struct ColumnSetting { + pub is_wrapped: bool, + pub align: String, +} + +#[derive(Debug, Serialize)] +pub struct Text { + #[serde(rename = "type")] + pub text_type: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub text: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub emoji: Option, +} + +#[derive(Debug, Serialize)] +pub struct GetFileUploadUrl { + pub length: u64, + pub filename: String, +} + +#[derive(Debug, Deserialize)] +pub struct GetFileUploadUrlResponse { + pub ok: bool, + pub upload_url: String, + pub file_id: String, +} + +#[derive(Debug, Serialize)] +pub struct FileUploadRequest { + pub files: Vec, + pub channel_id: String, +} + +#[derive(Debug, Serialize)] +pub struct FileCompleteRequest { + pub id: String, + pub title: String, +} + +#[derive(Debug, Deserialize)] +pub struct FileCompleteResponse { + pub ok: bool, + pub files: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct UploadedFile { + pub permalink: String, + pub timestamp: u64, + pub permalink_public: String, +} + +pub fn build_message_request( + client: &Client, + body: Body, + webhook: String, +) -> Result { + let msg_request = client + .post(webhook) + .header(ACCEPT, "application/json") + .body(body); + Ok(msg_request) +} + +pub async fn upload_file(filepath: String, channel_id: String) -> anyhow::Result> { + let created_csv = fs::metadata(filepath.clone())?; + let file_size = created_csv.len(); + let client = reqwest::Client::new(); + + let file_upload_url = get_file_upload_url(&client, &filepath, file_size).await?; + + upload_file_bytes(&client, &filepath, &file_upload_url.upload_url).await?; + + let complete_file_upload_response = + complete_file_upload(&client, filepath, file_upload_url.file_id, channel_id).await?; + + // There should only be one file uploaded + let permalink = complete_file_upload_response + .files + .into_iter() + .next() + .map(|file| file.permalink); + + Ok(permalink) +} + +pub fn build_multi_row_table( + header: String, + table_headers: Vec, + table_values: Vec>, +) -> Result { + let mut body: Vec = Vec::new(); + + let header = Block { + column_settings: None, + block_type: "header".to_string(), + fields: None, + rows: None, + text: Some(Text { + text_type: "plain_text".to_string(), + text: Some(header), + emoji: Some(true), + }), + }; + + body.push(header); + + let mut rows: Vec> = Vec::with_capacity(table_values.len() + 1); + + let header_row: Vec = table_headers + .into_iter() + .map(|th| Text { + text_type: "raw_text".to_string(), + text: Some(th), + emoji: None, + }) + .collect(); + + rows.push(header_row); + + for row_values in table_values { + let row: Vec = row_values + .into_iter() + .map(|tv| Text { + text_type: "raw_text".to_string(), + text: Some(tv), + emoji: None, + }) + .collect(); + rows.push(row); + } + + let table = Block { + column_settings: Some(vec![ColumnSetting { + is_wrapped: true, + align: "left".to_string(), + }]), + rows: Some(rows), + block_type: "table".to_string(), + fields: None, + text: None, + }; + + body.push(table); + + Ok(SlackMessage { blocks: body }) +} + +pub fn build_table( + header: String, + table_headers: Vec, + table_values: Vec, +) -> Result { + let mut body: Vec = Vec::new(); + + let header = Block { + column_settings: None, + block_type: "header".to_string(), + fields: None, + rows: None, + text: Some(Text { + text_type: "plain_text".to_string(), + text: Some(header), + emoji: Some(true), + }), + }; + body.push(header); + + let mut table_header: Vec = Vec::with_capacity(table_headers.len()); + for th in table_headers { + let header = Text { + text_type: "raw_text".to_string(), + text: Some(th), + emoji: None, + }; + table_header.push(header) + } + + let mut table_rows: Vec = Vec::with_capacity(table_values.len()); + for tv in table_values { + let row = Text { + text_type: "raw_text".to_string(), + text: Some(tv), + emoji: None, + }; + table_rows.push(row) + } + + let table = Block { + column_settings: Some(vec![ColumnSetting { + is_wrapped: true, + align: "left".to_string(), + }]), + rows: Some(vec![table_header, table_rows]), + block_type: "table".to_string(), + fields: None, + text: None, + }; + body.push(table); + + let slack_message = SlackMessage { blocks: body }; + Ok(slack_message) +} + +async fn complete_file_upload( + client: &Client, + filename: String, + file_id: String, + channel_id: String, +) -> anyhow::Result { + let complete_file_upload_url = "https://slack.com/api/files.completeUploadExternal"; + let file_upload_body = FileUploadRequest { + files: vec![FileCompleteRequest { + id: file_id, + title: filename, + }], + channel_id, + }; + + let response = client + .post(complete_file_upload_url) + .header(AUTHORIZATION, format!("Bearer {}", slack_access_token()?)) + .header("Content-Type", "application/json; charset=utf-8") + .json(&file_upload_body) + .send() + .await? + .json::() + .await?; + + Ok(response) +} + +async fn upload_file_bytes( + client: &Client, + filename: &str, + file_upload_url: &str, +) -> anyhow::Result<()> { + let file_bytes = fs::read(filename)?; + + let response = client + .put(file_upload_url) + .header(CONTENT_TYPE, "application/octet-stream") + .body(file_bytes) + .send() + .await + .context("Failed to upload {filename}")?; + + println!("CSV upload: {}", response.status()); + Ok(()) +} + +async fn get_file_upload_url( + client: &Client, + filename: &str, + length: u64, +) -> anyhow::Result { + let get_file_upload_url = "https://slack.com/api/files.getUploadURLExternal"; + let file_upload_body = GetFileUploadUrl { + filename: filename.to_string(), + length, + }; + let request = client + .post(get_file_upload_url) + .header(CONTENT_TYPE, "application/x-www-form-urlencoded") + .header(AUTHORIZATION, format!("Bearer {}", slack_access_token()?)) + .form(&file_upload_body); + + let resp = request + .send() + .await? + .json::() + .await?; + + Ok(resp) +} + +fn slack_access_token() -> Result { + match env::var("SLACK_ACCESS_TOKEN") { + Ok(token) => Ok(token), + Err(_) => bail!("SLACK_ACCESS_TOKEN env var not set"), + } +} diff --git a/offchain/crates/slack-notifier/src/validator_debt.rs b/offchain/crates/slack-notifier/src/validator_debt.rs new file mode 100644 index 0000000000..fc22f97c3a --- /dev/null +++ b/offchain/crates/slack-notifier/src/validator_debt.rs @@ -0,0 +1,114 @@ +use std::env; + +use anyhow::{Result, bail}; +use reqwest::{Body, Client}; + +use crate::slack; + +const VALIDATOR_DEBT_CHANNEL_ID: &str = "C09LES1Q127"; // #tmp-validator-debt + +pub async fn post_distribution_to_slack( + filepath: Option, + dz_epoch: u64, + solana_epoch: u64, + dry_run: bool, + total_amount: u64, + total_validators: u64, + transaction: Option, +) -> anyhow::Result<()> { + let client = reqwest::Client::new(); + let header = if dry_run { + "DRY RUN Validator Debt DRY RUN" + } else { + "Validator Debt" + }; + + let table_header = vec![ + "Solana Epoch".to_string(), + "DoubleZero Epoch".to_string(), + "Total Debt".to_string(), + "Total Validators".to_string(), + "Transaction Details".to_string(), + ]; + + let table_values = vec![ + solana_epoch.to_string(), + dz_epoch.to_string(), + format!("{:.9} SOL", total_amount as f64 * 1e-9), + total_validators.to_string(), + transaction.unwrap_or("No transaction details".to_string()), + ]; + + post_to_slack(filepath, &client, header, table_header, table_values).await?; + + Ok(()) +} + +pub async fn post_finalized_distribution_to_slack( + finalized_sig: String, + dz_epoch: u64, + dry_run: bool, +) -> Result<()> { + let client = reqwest::Client::new(); + let header = if dry_run { + "DRY RUN Finalized Distribution DRY RUN" + } else { + "Finalized Distribution" + }; + + let table_header = vec!["DoubleZero Epoch".to_string(), "Transaction".to_string()]; + + let table_values = vec![dz_epoch.to_string(), finalized_sig.to_string()]; + + post_to_slack(None, &client, header, table_header, table_values).await?; + + Ok(()) +} + +pub async fn post_debt_collections_to_slack( + client: &Client, + header: &str, + table_header: Vec, + table_values: Vec>, +) -> Result<()> { + let table = slack::build_multi_row_table(header.to_string(), table_header, table_values)?; + + let payload = serde_json::to_string(&table)?; + let body = Body::from(payload); + let request = slack::build_message_request(client, body, slack_webhook()?)?; + let _resp = request.send().await?; + + Ok(()) +} + +pub async fn post_to_slack( + filepath: Option, + client: &Client, + header: &str, + mut table_header: Vec, + mut table_values: Vec, +) -> Result<()> { + if let Some(filepath) = filepath + && let Some(permalink) = + slack::upload_file(filepath, VALIDATOR_DEBT_CHANNEL_ID.to_string()).await? + { + table_header.push("CSV Permalink".to_string()); + table_values.push(permalink); + }; + + let msg = slack::build_table(header.to_string(), table_header, table_values)?; + + let payload = serde_json::to_string(&msg)?; + let body = Body::from(payload); + let request = slack::build_message_request(client, body, slack_webhook()?)?; + let _resp = request.send().await?; + + Ok(()) +} + +fn slack_webhook() -> Result { + match env::var("VALIDATOR_SLACK_WEBHOOK") { + Ok(webhook) => Ok(webhook), + Err(_) => bail!("VALIDATOR_SLACK_WEBHOOK env var not set"), + } +} diff --git a/offchain/crates/solana-admin-cli/passport/CHANGELOG.md b/offchain/crates/solana-admin-cli/passport/CHANGELOG.md new file mode 100644 index 0000000000..c8638843ef --- /dev/null +++ b/offchain/crates/solana-admin-cli/passport/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- migrate to Solana 3.0: workspace `solana-*` crates and `solana-sdk` move to the 3.0 line, `solana-program-test` to 3.0.12, and the doublezero SDK git-deps repin from `client/v0.27.1` to the malbeclabs/doublezero#3830 merge revision (malbeclabs/infra#1853) + +## [0.0.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-passport-admin-cli%2Fv0.0.1) - 2025-10-21 + +- add sol-conversion-admin-cli ([#156](https://github.com/doublezerofoundation/doublezero-offchain/pull/156)) + +### Other diff --git a/offchain/crates/solana-admin-cli/passport/Cargo.toml b/offchain/crates/solana-admin-cli/passport/Cargo.toml new file mode 100644 index 0000000000..22cf9d83b2 --- /dev/null +++ b/offchain/crates/solana-admin-cli/passport/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "doublezero-passport-admin-cli" +version = "0.0.1" + +# Workspace inherited keys +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +anyhow.workspace = true +clap.workspace = true +doublezero-passport.workspace = true +doublezero-program-tools.workspace = true +doublezero-solana-client-tools.workspace = true +solana-compute-budget-interface.workspace = true +solana-sdk.workspace = true +tokio.workspace = true + +[[bin]] +name = "doublezero-passport-admin" +path = "src/main.rs" diff --git a/offchain/crates/solana-admin-cli/passport/src/command.rs b/offchain/crates/solana-admin-cli/passport/src/command.rs new file mode 100644 index 0000000000..fcb0db8888 --- /dev/null +++ b/offchain/crates/solana-admin-cli/passport/src/command.rs @@ -0,0 +1,337 @@ +use anyhow::{Result, bail}; +use clap::{Args, Subcommand}; +use doublezero_passport::{ + ID, + instruction::{ + PassportInstructionData, ProgramConfiguration, ProgramFlagConfiguration, + account::{ConfigureProgramAccounts, InitializeProgramAccounts, SetAdminAccounts}, + }, + state::ProgramConfig, +}; +use doublezero_program_tools::{get_program_data_address, instruction::try_build_instruction}; +use doublezero_solana_client_tools::payer::{SolanaPayerOptions, TransactionOutcome, Wallet}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{instruction::Instruction, pubkey::Pubkey}; + +#[derive(Debug, Subcommand)] +pub enum PassportAdminSubcommand { + /// Initialize and set admin to upgrade authority. + Initialize { + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + /// Set admin to a specified key. + SetAdmin { + admin_key: Pubkey, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + /// Configure the program. + Configure { + #[command(flatten)] + configure_options: ConfigurePassportOptions, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, +} + +impl PassportAdminSubcommand { + pub async fn try_into_execute(self) -> Result<()> { + match self { + PassportAdminSubcommand::Initialize { + solana_payer_options, + } => execute_initialize_program(solana_payer_options).await, + PassportAdminSubcommand::SetAdmin { + admin_key, + solana_payer_options, + } => execute_set_admin(admin_key, solana_payer_options).await, + PassportAdminSubcommand::Configure { + configure_options, + solana_payer_options, + } => execute_configure_program(configure_options, solana_payer_options).await, + } + } +} + +#[derive(Debug, Args)] +pub struct ConfigurePassportOptions { + // Flags. + // + /// Whether to pause the program. Cannot be used with --unpause. + #[arg(long)] + pause: bool, + + /// Whether to unpause the program. Cannot be used with --pause. + #[arg(long)] + unpause: bool, + + /// Whether to pause the request access program. Cannot be used with + /// --unpause_request_access. + #[arg(long)] + pause_request_access: bool, + + /// Whether to unpause the request access program. Cannot be used with + /// --pause_request_access. + #[arg(long)] + unpause_request_access: bool, + + /// Set the DoubleZero Ledger sentinel key. + #[arg(long, value_name = "PUBKEY")] + sentinel: Option, + + /// Set the access request deposit lamports. + #[arg(long, value_name = "LAMPORTS")] + access_request_deposit: Option, + + /// Set the access request fee lamports. + #[arg(long, value_name = "LAMPORTS")] + access_fee: Option, + + /// Set number of Solana validator backup IDs allowed per staked node. + #[arg(long, value_name = "NUMBER")] + solana_validator_backup_ids_limit: Option, +} + +// +// PassportAdminSubcommand::Initialize. +// + +pub async fn execute_initialize_program(solana_payer_options: SolanaPayerOptions) -> Result<()> { + let wallet = Wallet::try_from(solana_payer_options)?; + + let wallet_key = wallet.pubkey(); + + let initialize_program_ix = try_build_instruction( + &ID, + InitializeProgramAccounts::new(&wallet_key), + &PassportInstructionData::InitializeProgram, + )?; + + let set_admin_ix = try_build_instruction( + &ID, + SetAdminAccounts::new(&ID, &wallet_key), + &PassportInstructionData::SetAdmin(wallet_key), + )?; + + // Precisely calculate the amount of compute units needed for the instructions. + // There should be ~5k CU buffer with this base. + let mut compute_unit_limit = 16_000; + + let (_, bump) = ProgramConfig::find_address(); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let (_, bump) = get_program_data_address(&ID); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let mut instructions = vec![ + initialize_program_ix, + set_admin_ix, + ComputeBudgetInstruction::set_compute_unit_limit(compute_unit_limit), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Initialized Passport program: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +// +// PassportAdminSubcommand::SetAdmin. +// + +pub async fn execute_set_admin( + admin_key: Pubkey, + solana_payer_options: SolanaPayerOptions, +) -> Result<()> { + let wallet = Wallet::try_from(solana_payer_options)?; + + let wallet_key = wallet.pubkey(); + + let set_admin_ix = try_build_instruction( + &ID, + SetAdminAccounts::new(&ID, &wallet_key), + &PassportInstructionData::SetAdmin(admin_key), + )?; + + // Precisely calculate the amount of compute units needed for the instructions. + // There should be ~3k CU buffer with this base. + let compute_unit_limit = 10_000; + + let mut instructions = vec![ + set_admin_ix, + ComputeBudgetInstruction::set_compute_unit_limit(compute_unit_limit), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Set Passport program admin: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +// +// PassportAdminSubcommand::Configure. +// + +pub async fn execute_configure_program( + configure_options: ConfigurePassportOptions, + solana_payer_options: SolanaPayerOptions, +) -> Result<()> { + let ConfigurePassportOptions { + pause, + unpause, + pause_request_access, + unpause_request_access, + sentinel, + access_request_deposit, + access_fee, + solana_validator_backup_ids_limit, + } = configure_options; + + let wallet = Wallet::try_from(solana_payer_options)?; + let wallet_key = wallet.pubkey(); + + let mut instructions = vec![]; + let mut compute_unit_limit = 5_000; + + match (pause, unpause) { + (true, true) => { + bail!("Cannot use both --pause and --unpause at the same time"); + } + (true, false) => { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(true)), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 2_000; + } + (false, true) => { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 2_000; + } + (false, false) => {} + } + + match (pause_request_access, unpause_request_access) { + (true, true) => { + bail!( + "Cannot use both --pause_request_access and --unpause_request_access at the same time" + ); + } + (true, false) => { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsRequestAccessPaused(true)), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 2_000; + } + (false, true) => { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsRequestAccessPaused(false)), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 2_000; + } + (false, false) => {} + } + + if let Some(sentinel_key) = sentinel { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::DoubleZeroLedgerSentinel(sentinel_key), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 3_000; + } + + // Both access need to be specified. + match (access_request_deposit, access_fee) { + (Some(request_deposit_lamports), Some(request_fee_lamports)) => { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::AccessRequestDeposit { + request_deposit_lamports, + request_fee_lamports, + }, + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 2_500; + } + (None, None) => {} + _ => { + bail!("Access request deposit and access fee must be specified"); + } + } + + if let Some(limit) = solana_validator_backup_ids_limit { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::SolanaValidatorBackupIdsLimit(limit), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 2_000; + } + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Configured Passport program: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +// + +fn try_build_configure_program_instruction( + admin_key: &Pubkey, + setting: ProgramConfiguration, +) -> Result { + try_build_instruction( + &ID, + ConfigureProgramAccounts::new(admin_key), + &PassportInstructionData::ConfigureProgram(setting), + ) + .map_err(Into::into) +} diff --git a/offchain/crates/solana-admin-cli/passport/src/lib.rs b/offchain/crates/solana-admin-cli/passport/src/lib.rs new file mode 100644 index 0000000000..9fe79612b6 --- /dev/null +++ b/offchain/crates/solana-admin-cli/passport/src/lib.rs @@ -0,0 +1 @@ +pub mod command; diff --git a/offchain/crates/solana-admin-cli/passport/src/main.rs b/offchain/crates/solana-admin-cli/passport/src/main.rs new file mode 100644 index 0000000000..3e2e0991d7 --- /dev/null +++ b/offchain/crates/solana-admin-cli/passport/src/main.rs @@ -0,0 +1,20 @@ +use anyhow::Result; +use clap::Parser; +use doublezero_passport_admin_cli::command::PassportAdminSubcommand; + +#[derive(Debug, Parser)] +#[command(term_width = 0)] +#[command(version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")))] +#[command(about = "DoubleZero Passport Admin Commands on Solana", long_about = None)] +struct DoubleZeroPassportAdminApp { + #[command(subcommand)] + command: PassportAdminSubcommand, +} + +#[tokio::main] +async fn main() -> Result<()> { + DoubleZeroPassportAdminApp::parse() + .command + .try_into_execute() + .await +} diff --git a/offchain/crates/solana-admin-cli/revenue-distribution/CHANGELOG.md b/offchain/crates/solana-admin-cli/revenue-distribution/CHANGELOG.md new file mode 100644 index 0000000000..7c5d1d2b90 --- /dev/null +++ b/offchain/crates/solana-admin-cli/revenue-distribution/CHANGELOG.md @@ -0,0 +1,21 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- migrate to Solana 3.0: workspace `solana-*` crates and `solana-sdk` move to the 3.0 line, `solana-program-test` to 3.0.12, and the doublezero SDK git-deps repin from `client/v0.27.1` to the malbeclabs/doublezero#3830 merge revision (malbeclabs/infra#1853) +- add `initialize-rewards-integration` command (#361) + +## [0.0.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-revenue-distribution-admin-cli%2Fv0.0.1) - 2025-10-21 + +- add `--solana_validator_debt_write_off_feature_activation_epoch` ([#237](https://github.com/doublezerofoundation/doublezero-offchain/pull/237)) +- update migration command ([#229](https://github.com/doublezerofoundation/doublezero-offchain/pull/229)) +- use `doublezero-solana-sdk` as dependency ([#225](https://github.com/doublezerofoundation/doublezero-offchain/pull/225)) +- update migration command ([#195](https://github.com/doublezerofoundation/doublezero-offchain/pull/195)) +- add sol-conversion-admin-cli ([#156](https://github.com/doublezerofoundation/doublezero-offchain/pull/156)) + +## Other diff --git a/offchain/crates/solana-admin-cli/revenue-distribution/Cargo.toml b/offchain/crates/solana-admin-cli/revenue-distribution/Cargo.toml new file mode 100644 index 0000000000..e547d518a8 --- /dev/null +++ b/offchain/crates/solana-admin-cli/revenue-distribution/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "doublezero-revenue-distribution-admin-cli" +version = "0.0.1" + +# Workspace inherited keys +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +anyhow.workspace = true +clap.workspace = true +doublezero-solana-client-tools.workspace = true +doublezero-solana-sdk.workspace = true +solana-compute-budget-interface.workspace = true +solana-sdk.workspace = true +tokio.workspace = true + +[[bin]] +name = "doublezero-revenue-distribution-admin" +path = "src/main.rs" diff --git a/offchain/crates/solana-admin-cli/revenue-distribution/src/command.rs b/offchain/crates/solana-admin-cli/revenue-distribution/src/command.rs new file mode 100644 index 0000000000..5cef9a3d5f --- /dev/null +++ b/offchain/crates/solana-admin-cli/revenue-distribution/src/command.rs @@ -0,0 +1,851 @@ +use anyhow::{Context, Result, anyhow, bail, ensure}; +use clap::{Args, Subcommand}; +use doublezero_solana_client_tools::{ + payer::{SolanaPayerOptions, TransactionOutcome, Wallet}, + rpc::{SolanaConnection, SolanaConnectionOptions}, +}; +use doublezero_solana_sdk::{ + environment_2z_token_mint_key, get_program_data_address, + revenue_distribution::{ + ID, + fetch::try_fetch_config, + instruction::{ + ProgramConfiguration, ProgramFeatureConfiguration, ProgramFlagConfiguration, + RevenueDistributionInstructionData, + account::{ + ConfigureProgramAccounts, InitializeContributorRewardsAccounts, + InitializeJournalAccounts, InitializeProgramAccounts, + InitializeRewardsIntegrationAccounts, InitializeSwapDestinationAccounts, + SetAdminAccounts, SetRewardsManagerAccounts, + }, + }, + state::{self, ContributorRewards, Journal, ProgramConfig, RewardsIntegration}, + types::DoubleZeroEpoch, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, +}; + +#[derive(Debug, Subcommand)] +pub enum RevenueDistributionAdminSubcommand { + /// Initialize and set admin to upgrade authority. + Initialize { + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + /// Set admin to a specified key. + SetAdmin { + admin_key: Pubkey, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + /// Configure the program. + Configure { + #[command(flatten)] + configure_options: Box, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + /// Initialize contributor rewards account for a contributor's service key. + SetRewardsManager { + service_key: Pubkey, + + rewards_manager_key: Pubkey, + + /// Initialize contributor rewards account if it does not exist. + #[arg(long)] + initialize_contributor_rewards: bool, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + /// Register an external program as a rewards integration. + InitializeRewardsIntegration { + /// Program ID of the integration to register. Must be an executable account. + #[arg(long)] + program_id: Pubkey, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + /// Migrate program accounts. + MigrateProgramAccounts { + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + FetchCurrentEpoch { + #[command(flatten)] + solana_connection_options: SolanaConnectionOptions, + }, +} + +impl RevenueDistributionAdminSubcommand { + pub async fn try_into_execute(self) -> Result<()> { + match self { + Self::Initialize { + solana_payer_options, + } => try_execute_initialize_program(solana_payer_options).await, + Self::SetAdmin { + admin_key, + solana_payer_options, + } => try_execute_set_admin(admin_key, solana_payer_options).await, + Self::Configure { + configure_options, + solana_payer_options, + } => try_execute_configure_program(configure_options, solana_payer_options).await, + Self::SetRewardsManager { + service_key, + rewards_manager_key, + initialize_contributor_rewards, + solana_payer_options, + } => { + try_execute_set_rewards_manager( + service_key, + rewards_manager_key, + initialize_contributor_rewards, + solana_payer_options, + ) + .await + } + Self::InitializeRewardsIntegration { + program_id, + solana_payer_options, + } => try_execute_initialize_rewards_integration(program_id, solana_payer_options).await, + Self::MigrateProgramAccounts { + solana_payer_options, + } => try_execute_migrate_program_accounts(solana_payer_options).await, + Self::FetchCurrentEpoch { + solana_connection_options, + } => try_execute_fetch_current_epoch(solana_connection_options).await, + } + } +} + +#[derive(Debug, Args)] +pub struct ConfigureRevenueDistributionOptions { + // Flags. + // + /// Whether to pause the program. Cannot be used with --unpause. + #[arg(long)] + pub pause: bool, + + /// Whether to unpause the program. Cannot be used with --pause. + #[arg(long)] + pub unpause: bool, + + // Other configuration. + // + /// Set the debt accountant key. + #[arg(long, value_name = "PUBKEY")] + pub debt_accountant: Option, + + /// Set the rewards accountant key. + #[arg(long, value_name = "PUBKEY")] + pub rewards_accountant: Option, + + /// Set the contributor manager key. + #[arg(long, value_name = "PUBKEY")] + pub contributor_manager: Option, + + /// Set the SOL/2Z Swap program ID. + #[arg(long, value_name = "PUBKEY")] + pub sol_2z_swap_program: Option, + + /// Solana validator base block rewards fee percentage (max: 100%). + #[arg(long, value_name = "PERCENTAGE")] + pub solana_validator_base_block_rewards_fee_pct: Option, + + /// Solana validator priority block rewards fee percentage (max: 100%). + #[arg(long, value_name = "PERCENTAGE")] + pub solana_validator_priority_block_rewards_fee_pct: Option, + + /// Solana validator inflation rewards fee percentage (max: 100%). + #[arg(long, value_name = "PERCENTAGE")] + pub solana_validator_inflation_rewards_fee_pct: Option, + + /// Solana validator Jito tips fee percentage (max: 100%). + #[arg(long, value_name = "PERCENTAGE")] + pub solana_validator_jito_tips_fee_pct: Option, + + /// Solana validator fixed SOL fee amount. (max: 4,294,967,295). + #[arg(long, value_name = "LAMPORTS")] + pub solana_validator_fixed_sol_fee_amount: Option, + + /// How long the accountant must wait to fetch telemetry data for reward + /// calculations. + #[arg(long, value_name = "MINUTES")] + pub calculation_grace_period_minutes: Option, + + /// How long the accountant must wait to initialize a distribution. + #[arg(long, value_name = "MINUTES")] + pub distribution_initialization_grace_period_minutes: Option, + + #[arg(long, value_name = "LAMPORTS")] + pub distribute_rewards_relay_lamports: Option, + + #[arg(long, value_name = "EPOCHS")] + pub minimum_epochs_to_finalize_rewards: Option, + + /// Community burn rate limit percentage (max: 100%, precision: 7 decimals). + #[arg(long, value_name = "PERCENTAGE")] + pub community_burn_rate_limit: Option, + + #[arg(long, value_name = "EPOCHS")] + pub epochs_to_increasing_community_burn_rate: Option, + + #[arg(long, value_name = "EPOCHS")] + pub epochs_to_community_burn_rate_limit: Option, + + /// Initial community burn rate percentage (max: 100%, precision: 7 + /// decimals). + #[arg(long, value_name = "PERCENTAGE")] + pub initial_community_burn_rate: Option, + + #[arg(long, value_name = "EPOCH")] + pub solana_validator_debt_write_off_feature_activation_epoch: Option, +} + +// +// RevenueDistributionAdminSubcommand::Initialize. +// + +pub async fn try_execute_initialize_program( + solana_payer_options: SolanaPayerOptions, +) -> Result<()> { + let wallet = Wallet::try_from(solana_payer_options)?; + let wallet_key = wallet.pubkey(); + + let dz_mint_key = wallet + .connection + .try_network_environment() + .await + .map(environment_2z_token_mint_key)?; + + let initialize_program_ix = try_build_instruction( + &ID, + InitializeProgramAccounts::new(&wallet_key, &dz_mint_key), + &RevenueDistributionInstructionData::InitializeProgram, + )?; + + let initialize_journal_ix = try_build_instruction( + &ID, + InitializeJournalAccounts::new(&wallet_key, &dz_mint_key), + &RevenueDistributionInstructionData::InitializeJournal, + )?; + + let initialize_swap_destination_ix = try_build_instruction( + &ID, + InitializeSwapDestinationAccounts::new(&wallet_key, &dz_mint_key), + &RevenueDistributionInstructionData::InitializeSwapDestination, + )?; + + let set_admin_ix = try_build_instruction( + &ID, + SetAdminAccounts::new(&ID, &wallet_key), + &RevenueDistributionInstructionData::SetAdmin(wallet_key), + )?; + + // Precisely calculate the amount of compute units needed for the instructions. + // There should be ~5k CU buffer with this base. + let mut compute_unit_limit = 54_000; + + let (program_config_key, bump) = ProgramConfig::find_address(); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let (_, bump) = state::find_2z_token_pda_address(&program_config_key); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let (journal_key, bump) = Journal::find_address(); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let (_, bump) = state::find_2z_token_pda_address(&journal_key); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let (swap_authority_key, bump) = state::find_swap_authority_address(); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let (_, bump) = state::find_2z_token_pda_address(&swap_authority_key); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let (_, bump) = get_program_data_address(&ID); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let mut instructions = vec![ + initialize_program_ix, + initialize_journal_ix, + initialize_swap_destination_ix, + set_admin_ix, + ComputeBudgetInstruction::set_compute_unit_limit(compute_unit_limit), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Initialized Revenue Distribution program: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +// +// RevenueDistributionAdminSubcommand::MigrateProgramAccounts. +// + +pub async fn try_execute_migrate_program_accounts( + solana_payer_options: SolanaPayerOptions, +) -> Result<()> { + let wallet = Wallet::try_from(solana_payer_options)?; + let wallet_key = wallet.pubkey(); + + let accounts = vec![ + AccountMeta::new_readonly(get_program_data_address(&ID).0, false), + AccountMeta::new_readonly(wallet_key, true), + AccountMeta::new(ProgramConfig::find_address().0, false), + ]; + + let migrate_program_accounts_ix = try_build_instruction( + &ID, + accounts, + &RevenueDistributionInstructionData::MigrateProgramAccounts, + )?; + + let compute_unit_limit = 100_000; + + let mut instructions = vec![ + migrate_program_accounts_ix, + ComputeBudgetInstruction::set_compute_unit_limit(compute_unit_limit), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Migrated program accounts: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +// +// RevenueDistributionAdminSubcommand::SetAdmin. +// + +pub async fn try_execute_set_admin( + admin_key: Pubkey, + solana_payer_options: SolanaPayerOptions, +) -> Result<()> { + let wallet = Wallet::try_from(solana_payer_options)?; + let wallet_key = wallet.pubkey(); + + let set_admin_ix = try_build_instruction( + &ID, + SetAdminAccounts::new(&ID, &wallet_key), + &RevenueDistributionInstructionData::SetAdmin(admin_key), + )?; + + // Precisely calculate the amount of compute units needed for the + // instructions. There should be ~3k CU buffer with this base. + let compute_unit_limit = 10_000; + + let mut instructions = vec![ + set_admin_ix, + ComputeBudgetInstruction::set_compute_unit_limit(compute_unit_limit), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Set Revenue Distribution program admin: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +// +// RevenueDistributionAdminSubcommand::Configure. +// + +pub async fn try_execute_configure_program( + configure_options: Box, + solana_payer_options: SolanaPayerOptions, +) -> Result<()> { + let ConfigureRevenueDistributionOptions { + pause, + unpause, + debt_accountant, + rewards_accountant, + contributor_manager, + sol_2z_swap_program, + solana_validator_base_block_rewards_fee_pct, + solana_validator_priority_block_rewards_fee_pct, + solana_validator_inflation_rewards_fee_pct, + solana_validator_jito_tips_fee_pct, + solana_validator_fixed_sol_fee_amount, + calculation_grace_period_minutes, + distribution_initialization_grace_period_minutes, + distribute_rewards_relay_lamports, + minimum_epochs_to_finalize_rewards, + community_burn_rate_limit, + epochs_to_increasing_community_burn_rate, + epochs_to_community_burn_rate_limit, + initial_community_burn_rate, + solana_validator_debt_write_off_feature_activation_epoch, + } = *configure_options; + + let wallet = Wallet::try_from(solana_payer_options)?; + let wallet_key = wallet.pubkey(); + + let mut instructions = vec![]; + let mut compute_unit_limit = 5_000; + + match (pause, unpause) { + (true, true) => { + bail!("Cannot use both --pause and --unpause at the same time"); + } + (true, false) => { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(true)), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 2_000; + } + (false, true) => { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 2_000; + } + (false, false) => {} + } + + if let Some(debt_accountant_key) = debt_accountant { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::DebtAccountant(debt_accountant_key), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 3_000; + } + + if let Some(rewards_accountant_key) = rewards_accountant { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::RewardsAccountant(rewards_accountant_key), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 3_000; + } + + if let Some(contributor_manager_key) = contributor_manager { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::ContributorManager(contributor_manager_key), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 3_000; + } + + if let Some(sol_2z_swap_program_id) = sol_2z_swap_program { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::Sol2zSwapProgram(sol_2z_swap_program_id), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 3_000; + + let (_, bump) = state::find_withdraw_sol_authority_address(&sol_2z_swap_program_id); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + } + + if let Some(calculation_grace_period_minutes) = calculation_grace_period_minutes { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::CalculationGracePeriodMinutes(calculation_grace_period_minutes), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 1_500; + } + + if let Some(distribution_initialization_grace_period_minutes) = + distribution_initialization_grace_period_minutes + { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::DistributionInitializationGracePeriodMinutes( + distribution_initialization_grace_period_minutes, + ), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 1_500; + } + + if let Some(distribute_rewards_relay_lamports) = distribute_rewards_relay_lamports { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::DistributeRewardsRelayLamports(distribute_rewards_relay_lamports), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 1_500; + } + + if let Some(minimum_epochs_to_finalize_rewards) = minimum_epochs_to_finalize_rewards { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::MinimumEpochDurationToFinalizeRewards( + minimum_epochs_to_finalize_rewards, + ), + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 1_500; + } + + // All Solana validator fee parameters must be specified together in order to + // construct the configure program instruction. + match ( + solana_validator_base_block_rewards_fee_pct, + solana_validator_priority_block_rewards_fee_pct, + solana_validator_inflation_rewards_fee_pct, + solana_validator_jito_tips_fee_pct, + solana_validator_fixed_sol_fee_amount, + ) { + ( + Some(base_str), + Some(priority_str), + Some(inflation_str), + Some(jito_str), + Some(fixed_sol_amount), + ) => { + // Parse all fee percentages. + let base_block_rewards_pct = parse_fee_percentage(base_str)?; + let priority_block_rewards_pct = parse_fee_percentage(priority_str)?; + let inflation_rewards_pct = parse_fee_percentage(inflation_str)?; + let jito_tips_pct = parse_fee_percentage(jito_str)?; + + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::SolanaValidatorFeeParameters { + base_block_rewards_pct, + priority_block_rewards_pct, + inflation_rewards_pct, + jito_tips_pct, + fixed_sol_amount, + _unused: Default::default(), + }, + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 4_500; + } + (None, None, None, None, None) => {} + _ => { + bail!( + "Must specify all Solana validator fee parameters together (--solana-validator-base-block-rewards-fee, --solana-validator-priority-block-rewards-fee, --solana-validator-inflation-rewards-fee, --solana-validator-jito-tips-fee, --solana-validator-fixed-sol-amount)" + ); + } + } + + // All required community burn rate parameters must be specified together in order to + // construct the configure program instruction (initial_rate is optional). + match ( + community_burn_rate_limit, + epochs_to_increasing_community_burn_rate, + epochs_to_community_burn_rate_limit, + initial_community_burn_rate, + ) { + (Some(limit_str), Some(epochs_to_increasing), Some(epochs_to_limit), initial_rate_str) => { + // Parse burn rate percentages (limit and initial_rate are percentages). + let limit = parse_burn_rate_percentage(limit_str)?; + let initial_rate = initial_rate_str + .map(parse_burn_rate_percentage) + .transpose()?; + + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: epochs_to_increasing, + dz_epochs_to_limit: epochs_to_limit, + initial_rate, + }, + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 5_000; + } + (None, None, None, None) => {} + _ => { + bail!( + "Must specify all required community burn rate parameters together (--community-burn-rate-limit, --epochs-to-increasing-community-burn-rate, --epochs-to-community-burn-rate-limit)" + ); + } + } + + if let Some(activation_epoch) = solana_validator_debt_write_off_feature_activation_epoch { + let configure_program_ix = try_build_configure_program_instruction( + &wallet_key, + ProgramConfiguration::FeatureActivation { + feature: ProgramFeatureConfiguration::SolanaValidatorDebtWriteOff, + activation_epoch: DoubleZeroEpoch::new(activation_epoch), + }, + )?; + instructions.push(configure_program_ix); + compute_unit_limit += 5_000; + } + + if instructions.is_empty() { + bail!("No configuration options provided"); + } + + // NOTE: We may need to chunk these instructions if more configurations are + // added. + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Configured Revenue Distribution program: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +// +// RevenueDistributionAdminSubcommand::SetRewardsManager. +// + +pub async fn try_execute_set_rewards_manager( + service_key: Pubkey, + rewards_manager_key: Pubkey, + initialize_contributor_rewards: bool, + solana_payer_options: SolanaPayerOptions, +) -> Result<()> { + let wallet = Wallet::try_from(solana_payer_options)?; + let wallet_key = wallet.pubkey(); + + let mut instructions = Vec::new(); + let mut compute_unit_limit = 10_000; + + if initialize_contributor_rewards { + let initialize_contributor_rewards_ix = try_build_instruction( + &ID, + InitializeContributorRewardsAccounts::new(&wallet_key, &service_key), + &RevenueDistributionInstructionData::InitializeContributorRewards(service_key), + )?; + instructions.push(initialize_contributor_rewards_ix); + compute_unit_limit += 10_000; + + let (_, bump) = ContributorRewards::find_address(&service_key); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + } + + let set_rewards_manager_ix = try_build_instruction( + &ID, + SetRewardsManagerAccounts::new(&wallet_key, &service_key), + &RevenueDistributionInstructionData::SetRewardsManager(rewards_manager_key), + )?; + instructions.push(set_rewards_manager_ix); + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Set rewards manager: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +// +// RevenueDistributionAdminSubcommand::InitializeRewardsIntegration. +// + +pub async fn try_execute_initialize_rewards_integration( + program_id: Pubkey, + solana_payer_options: SolanaPayerOptions, +) -> Result<()> { + let wallet = Wallet::try_from(solana_payer_options)?; + let wallet_key = wallet.pubkey(); + + // Pre-flight: ensure the supplied account exists and is executable so the + // operator gets a clear error before we send the transaction. + let program_account = wallet + .connection + .get_account(&program_id) + .await + .with_context(|| format!("Failed to fetch program account {program_id}"))?; + ensure!( + program_account.executable, + "Account {program_id} is not executable", + ); + + let initialize_rewards_integration_ix = try_build_instruction( + &ID, + InitializeRewardsIntegrationAccounts::new(&wallet_key, &wallet_key, &program_id), + &RevenueDistributionInstructionData::InitializeRewardsIntegration, + )?; + + let mut compute_unit_limit = 10_000; + let (_, bump) = RewardsIntegration::find_address(&program_id); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let mut instructions = vec![ + initialize_rewards_integration_ix, + ComputeBudgetInstruction::set_compute_unit_limit(compute_unit_limit), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Initialized rewards integration for {program_id}: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +// +// RevenueDistributionAdminSubcommand::FetchCurrentEpoch. +// + +pub async fn try_execute_fetch_current_epoch( + solana_connection_options: SolanaConnectionOptions, +) -> Result<()> { + let connection = SolanaConnection::from(solana_connection_options); + + let (_, config) = try_fetch_config(&connection).await?; + println!("{}", config.next_completed_dz_epoch.value()); + + Ok(()) +} + +fn try_build_configure_program_instruction( + admin_key: &Pubkey, + setting: ProgramConfiguration, +) -> Result { + try_build_instruction( + &ID, + ConfigureProgramAccounts::new(admin_key), + &RevenueDistributionInstructionData::ConfigureProgram(setting), + ) + .map_err(Into::into) +} + +/// Parse a percentage string (e.g., "12.5" or "50.0") into a u16 value. +/// The value is stored as basis points where 100% = 10,000. +/// This gives us precision up to 0.01% (e.g., 12.34% = 1234). +fn parse_fee_percentage(percentage_str: String) -> Result { + const MAX_PERCENTAGE: f64 = 100.0; + + // Check for excessive decimal precision. + if let Some(decimal_index) = percentage_str.find('.') { + let decimal_part = &percentage_str[decimal_index + 1..]; + if decimal_part.len() > 2 { + bail!( + "Percentage value has too much precision (max 2 decimal places): {percentage_str}" + ); + } + } + + let percentage = percentage_str + .parse::() + .map_err(|_| anyhow!("Invalid percentage value: {percentage_str}"))?; + + // Values must be between 0.01% and 100% + if !(0.0..=MAX_PERCENTAGE).contains(&percentage) { + bail!("Percentage must between 0.01% and 100%, got: {percentage}"); + } + + // This conversion is safe because we've already checked the value + // is between 0.01% and 100%. + Ok((percentage * MAX_PERCENTAGE).round() as u16) +} + +/// Parse a burn rate percentage string (e.g., "12.5" or "50.0000001") into a u32 value. +/// The value is stored with 7 decimal places of precision where 100% = 1,000,000,000. +/// This gives us precision up to 0.0000001% (e.g., 12.3456789% = 123456789). +fn parse_burn_rate_percentage(percentage_str: String) -> Result { + const MAX_PERCENTAGE: f64 = 100.0; + const SCALE_FACTOR: f64 = 10_000_000.0; // 10^7 for 7 decimal places + + // Check for excessive decimal precision (more than 7 decimal places). + if let Some(decimal_index) = percentage_str.find('.') { + let decimal_part = &percentage_str[decimal_index + 1..]; + if decimal_part.len() > 7 { + bail!( + "Percentage value has too much precision (max 7 decimal places): {percentage_str}", + ); + } + } + + let percentage = percentage_str + .parse::() + .map_err(|_| anyhow!("Invalid percentage value: {percentage_str}"))?; + + // Values must be between 0.0000001% and 100% + if !(0.0..=MAX_PERCENTAGE).contains(&percentage) { + bail!("Percentage must be between 0.0000001% and 100%, got: {percentage}"); + } + + // This conversion is safe because we've already checked the value + // is between 0.0000001% and 100%. + Ok((percentage * SCALE_FACTOR).round() as u32) +} diff --git a/offchain/crates/solana-admin-cli/revenue-distribution/src/lib.rs b/offchain/crates/solana-admin-cli/revenue-distribution/src/lib.rs new file mode 100644 index 0000000000..9fe79612b6 --- /dev/null +++ b/offchain/crates/solana-admin-cli/revenue-distribution/src/lib.rs @@ -0,0 +1 @@ +pub mod command; diff --git a/offchain/crates/solana-admin-cli/revenue-distribution/src/main.rs b/offchain/crates/solana-admin-cli/revenue-distribution/src/main.rs new file mode 100644 index 0000000000..847afca50d --- /dev/null +++ b/offchain/crates/solana-admin-cli/revenue-distribution/src/main.rs @@ -0,0 +1,20 @@ +use anyhow::Result; +use clap::Parser; +use doublezero_revenue_distribution_admin_cli::command::RevenueDistributionAdminSubcommand; + +#[derive(Debug, Parser)] +#[command(term_width = 0)] +#[command(version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")))] +#[command(about = "DoubleZero Revenue Distribution Admin Commands on Solana", long_about = None)] +struct DoubleZeroRevenueDistributionAdminApp { + #[command(subcommand)] + command: RevenueDistributionAdminSubcommand, +} + +#[tokio::main] +async fn main() -> Result<()> { + DoubleZeroRevenueDistributionAdminApp::parse() + .command + .try_into_execute() + .await +} diff --git a/offchain/crates/solana-admin-cli/sol-conversion/CHANGELOG.md b/offchain/crates/solana-admin-cli/sol-conversion/CHANGELOG.md new file mode 100644 index 0000000000..60b002ea43 --- /dev/null +++ b/offchain/crates/solana-admin-cli/sol-conversion/CHANGELOG.md @@ -0,0 +1,17 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- migrate to Solana 3.0: workspace `solana-*` crates and `solana-sdk` move to the 3.0 line, `solana-program-test` to 3.0.12, and the doublezero SDK git-deps repin from `client/v0.27.1` to the malbeclabs/doublezero#3830 merge revision (malbeclabs/infra#1853) + +## [0.0.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-sol-conversion-admin-cli%2Fv0.0.1) - 2025-10-21 + +- fix println ([#226](https://github.com/doublezerofoundation/doublezero-offchain/pull/226)) +- add sol-conversion-admin-cli ([#156](https://github.com/doublezerofoundation/doublezero-offchain/pull/156)) + +### Other diff --git a/offchain/crates/solana-admin-cli/sol-conversion/Cargo.toml b/offchain/crates/solana-admin-cli/sol-conversion/Cargo.toml new file mode 100644 index 0000000000..e177c3d09a --- /dev/null +++ b/offchain/crates/solana-admin-cli/sol-conversion/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "doublezero-sol-conversion-admin-cli" +version = "0.0.1" + +# Workspace inherited keys +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +anyhow.workspace = true +clap.workspace = true +doublezero-program-tools.workspace = true +doublezero-revenue-distribution.workspace = true +doublezero-sol-conversion-interface.workspace = true +doublezero-solana-client-tools.workspace = true +solana-compute-budget-interface.workspace = true +solana-sdk.workspace = true +solana-system-interface.workspace = true +tokio.workspace = true + +[[bin]] +name = "doublezero-sol-conversion-admin" +path = "src/main.rs" diff --git a/offchain/crates/solana-admin-cli/sol-conversion/src/command.rs b/offchain/crates/solana-admin-cli/sol-conversion/src/command.rs new file mode 100644 index 0000000000..17e385b81a --- /dev/null +++ b/offchain/crates/solana-admin-cli/sol-conversion/src/command.rs @@ -0,0 +1,392 @@ +use anyhow::{Result, anyhow, ensure}; +use clap::{Args, Subcommand}; +use doublezero_program_tools::{instruction::try_build_instruction, zero_copy}; +use doublezero_revenue_distribution::state::Journal; +use doublezero_sol_conversion_interface::{ + ID, + instruction::{ + SolConversionInstructionData, + account::{ + InitializeSystemAccounts, SetAdminAccounts, SetFillsConsumerAccounts, + ToggleSystemStateAccounts, UpdateConfigurationRegistryAccounts, + }, + }, + state::FillsRegistry, +}; +use doublezero_solana_client_tools::payer::{SolanaPayerOptions, TransactionOutcome, Wallet}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{pubkey::Pubkey, signature::Keypair, signer::Signer}; + +#[derive(Debug, Subcommand)] +pub enum SolConversionAdminSubcommand { + /// Initialize and set admin to upgrade authority. + Initialize { + #[arg(long, value_name = "LAMPORTS")] + fixed_fill_quantity_lamports: u64, + + #[arg(long, value_name = "SECONDS")] + price_maximum_age_seconds: u32, + + #[arg(long, value_name = "DECIMAL")] + coefficient: String, + + #[arg(long, value_name = "PERCENTAGE")] + max_discount_rate_pct: String, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + /// Set admin to a specified key. + SetAdmin { + admin_key: Pubkey, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + Configure(ConfigureCommand), +} + +impl SolConversionAdminSubcommand { + pub async fn try_into_execute(self) -> Result<()> { + match self { + Self::Initialize { + fixed_fill_quantity_lamports, + price_maximum_age_seconds, + coefficient, + max_discount_rate_pct, + solana_payer_options, + } => { + execute_initialize( + fixed_fill_quantity_lamports, + price_maximum_age_seconds, + coefficient, + max_discount_rate_pct, + solana_payer_options, + ) + .await + } + Self::SetAdmin { + admin_key, + solana_payer_options, + } => execute_set_admin(admin_key, solana_payer_options).await, + Self::Configure(command) => command.try_into_execute().await, + } + } +} + +async fn execute_initialize( + fixed_fill_quantity_lamports: u64, + price_maximum_age_seconds: u32, + coefficient_str: String, + max_discount_rate_pct_str: String, + solana_payer_options: SolanaPayerOptions, +) -> Result<()> { + let wallet = Wallet::try_from(solana_payer_options)?; + let wallet_key = wallet.pubkey(); + + let coefficient = parse_coefficient(coefficient_str)?; + let max_discount_rate = parse_discount_rate_percentage(max_discount_rate_pct_str)?; + + let fills_registry_signer = Keypair::new(); + println!( + "Generated fills registry: {}", + fills_registry_signer.pubkey() + ); + + const FILLS_REGISTRY_SIZE: usize = zero_copy::data_end::(); + + let rent_exemption_lamports = wallet + .connection + .get_minimum_balance_for_rent_exemption(FILLS_REGISTRY_SIZE) + .await?; + + let create_account_ix = solana_system_interface::instruction::create_account( + &wallet_key, + &fills_registry_signer.pubkey(), + rent_exemption_lamports, + FILLS_REGISTRY_SIZE as u64, + &ID, + ); + + let initialize_system_ix = try_build_instruction( + &ID, + InitializeSystemAccounts::new(&fills_registry_signer.pubkey(), &wallet_key), + &SolConversionInstructionData::InitializeSystem { + oracle_key: Default::default(), + fixed_fill_quantity_lamports, + price_maximum_age_seconds: price_maximum_age_seconds.into(), + coefficient, + max_discount_rate, + min_discount_rate: 0, + }, + )?; + + let set_fills_consumer_ix = try_build_instruction( + &ID, + SetFillsConsumerAccounts::new(&wallet_key), + &SolConversionInstructionData::SetFillsConsumer(Journal::find_address().0), + )?; + + let toggle_system_state_ix = try_build_instruction( + &ID, + ToggleSystemStateAccounts::new(&wallet_key), + &SolConversionInstructionData::ToggleSystemState(true), + )?; + + let transaction = wallet + .new_transaction_with_additional_signers_and_lookup_tables( + &[ + create_account_ix, + initialize_system_ix, + set_fills_consumer_ix, + toggle_system_state_ix, + ], + &[&fills_registry_signer], + &[], + ) + .await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Initialized program: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +async fn execute_set_admin( + admin_key: Pubkey, + solana_payer_options: SolanaPayerOptions, +) -> Result<()> { + let wallet = Wallet::try_from(solana_payer_options)?; + let wallet_key = wallet.pubkey(); + + let set_admin_ix = try_build_instruction( + &ID, + SetAdminAccounts::new(&wallet_key), + &SolConversionInstructionData::SetAdmin(admin_key), + )?; + + let transaction = wallet.new_transaction(&[set_admin_ix]).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + println!("Set admin: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +#[derive(Debug, Args, Clone)] +pub struct ConfigureCommand { + /// Whether to pause the program. Cannot be used with --unpause. + #[arg(long)] + pause: bool, + + /// Whether to unpause the program. Cannot be used with --pause. + #[arg(long)] + unpause: bool, + + #[arg(long, value_name = "PUBKEY")] + oracle: Option, + + #[arg(long, value_name = "LAMPORTS")] + fixed_fill_quantity_lamports: Option, + + #[arg(long, value_name = "SECONDS")] + price_maximum_age_seconds: Option, + + #[arg(long, value_name = "DECIMAL")] + coefficient: Option, + + #[arg(long, value_name = "PERCENTAGE")] + max_discount_rate_pct: Option, + + #[arg(long, value_name = "PERCENTAGE")] + min_discount_rate_pct: Option, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, +} + +impl ConfigureCommand { + pub async fn try_into_execute(self) -> Result<()> { + let Self { + pause, + unpause, + oracle: oracle_key, + fixed_fill_quantity_lamports, + price_maximum_age_seconds, + coefficient: coefficient_str, + max_discount_rate_pct: max_discount_rate_pct_str, + min_discount_rate_pct: min_discount_rate_pct_str, + solana_payer_options, + } = self; + + // Revert if all specified configurables are none + ensure!( + pause + || unpause + || oracle_key.is_some() + || fixed_fill_quantity_lamports.is_some() + || price_maximum_age_seconds.is_some() + || coefficient_str.is_some() + || max_discount_rate_pct_str.is_some() + || min_discount_rate_pct_str.is_some(), + "At least one configuration parameter must be specified" + ); + + // Check for conflicting pause/unpause flags + ensure!( + !(pause && unpause), + "Cannot use both --pause and --unpause at the same time" + ); + + let wallet = Wallet::try_from(solana_payer_options)?; + let wallet_key = wallet.pubkey(); + + // Parse string arguments if provided + let coefficient = coefficient_str.map(parse_coefficient).transpose()?; + let max_discount_rate = max_discount_rate_pct_str + .map(parse_discount_rate_percentage) + .transpose()?; + let min_discount_rate = min_discount_rate_pct_str + .map(parse_discount_rate_percentage) + .transpose()?; + + let mut instructions = vec![]; + let mut compute_unit_limit = 10_000; + + // Handle pause/unpause if specified. + if pause { + let toggle_system_state_ix = try_build_instruction( + &ID, + ToggleSystemStateAccounts::new(&wallet_key), + &SolConversionInstructionData::ToggleSystemState(true), + )?; + instructions.push(toggle_system_state_ix); + } else if unpause { + let toggle_system_state_ix = try_build_instruction( + &ID, + ToggleSystemStateAccounts::new(&wallet_key), + &SolConversionInstructionData::ToggleSystemState(false), + )?; + instructions.push(toggle_system_state_ix); + compute_unit_limit += 5_000; + } + + // Handle configuration updates if any are specified + if oracle_key.is_some() + || fixed_fill_quantity_lamports.is_some() + || price_maximum_age_seconds.is_some() + || coefficient.is_some() + || max_discount_rate.is_some() + || min_discount_rate.is_some() + { + let update_configuration_ix = try_build_instruction( + &ID, + UpdateConfigurationRegistryAccounts::new(&wallet_key), + &SolConversionInstructionData::UpdateConfigurationRegistry { + oracle_key, + fixed_fill_quantity_lamports, + price_maximum_age_seconds: price_maximum_age_seconds.map(Into::into), + coefficient, + max_discount_rate, + min_discount_rate, + }, + )?; + instructions.push(update_configuration_ix); + compute_unit_limit += 15_000; + } + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet + .new_transaction_with_additional_signers_and_lookup_tables(&instructions, &[], &[]) + .await?; + let tx_sig = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + println!("Updated configuration: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) + } +} + +/// Parse a coefficient string (e.g., "1.23456789") into a u64 value. +/// The value is stored with 8 decimal places of precision. +/// This gives us precision up to 0.00000001 (e.g., 1.23456789 = 123,456,789). +fn parse_coefficient(coefficient_str: String) -> Result { + const SCALE_FACTOR: f64 = 100_000_000.0; // 10^8 for 8 decimal places. + + // Check for excessive decimal precision. + if let Some(decimal_index) = coefficient_str.find('.') { + let decimal_part = &coefficient_str[decimal_index + 1..]; + ensure!( + decimal_part.len() <= 8, + "Coefficient value has too much precision (max 8 decimal places): {coefficient_str}" + ); + } + + let coefficient = coefficient_str + .parse::() + .map_err(|_| anyhow!("Invalid coefficient value: {coefficient_str}"))?; + + ensure!( + coefficient >= 0.0, + "Coefficient must be non-negative, got: {coefficient}" + ); + + let scaled_value = (coefficient * SCALE_FACTOR).round(); + ensure!( + scaled_value <= u64::MAX as f64, + "Coefficient value too large: {coefficient}" + ); + + Ok(scaled_value as u64) +} + +/// Parse a discount rate percentage string (e.g., "12.5" or "0.01") into a u64 +/// value. The value is stored as basis points where 0.01% = 1 bp and +/// 100% = 10,000 bp. This gives us precision up to 0.01% (e.g., 0.01% = 1, +/// 12.34% = 1,234, 100% = 10,000). +fn parse_discount_rate_percentage(percentage_str: String) -> Result { + const MAX_PERCENTAGE: f64 = 100.0; + + // Check for excessive decimal precision (more than 2 decimal places). + if let Some(decimal_index) = percentage_str.find('.') { + let decimal_part = &percentage_str[decimal_index + 1..]; + ensure!( + decimal_part.len() <= 2, + "Discount rate percentage has too much precision (max 2 decimal places): {percentage_str}" + ); + } + + let percentage = percentage_str + .parse::() + .map_err(|_| anyhow!("Invalid discount rate percentage value: {percentage_str}"))?; + + // Values must be between 0% and 100%. + ensure!( + (0.0..=MAX_PERCENTAGE).contains(&percentage), + "Discount rate percentage must be between 0% and 100%, got: {percentage}" + ); + + // Convert to basis points (e.g., 0.01% = 1, 12.34% = 1,234). + Ok((percentage * MAX_PERCENTAGE).round() as u64) +} diff --git a/offchain/crates/solana-admin-cli/sol-conversion/src/lib.rs b/offchain/crates/solana-admin-cli/sol-conversion/src/lib.rs new file mode 100644 index 0000000000..9fe79612b6 --- /dev/null +++ b/offchain/crates/solana-admin-cli/sol-conversion/src/lib.rs @@ -0,0 +1 @@ +pub mod command; diff --git a/offchain/crates/solana-admin-cli/sol-conversion/src/main.rs b/offchain/crates/solana-admin-cli/sol-conversion/src/main.rs new file mode 100644 index 0000000000..374c50a7a1 --- /dev/null +++ b/offchain/crates/solana-admin-cli/sol-conversion/src/main.rs @@ -0,0 +1,20 @@ +use anyhow::Result; +use clap::Parser; +use doublezero_sol_conversion_admin_cli::command::SolConversionAdminSubcommand; + +#[derive(Debug, Parser)] +#[command(term_width = 0)] +#[command(version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")))] +#[command(about = "DoubleZero Sol Conversion Admin Commands on Solana", long_about = None)] +struct DoubleZeroSolConversionAdminApp { + #[command(subcommand)] + command: SolConversionAdminSubcommand, +} + +#[tokio::main] +async fn main() -> Result<()> { + DoubleZeroSolConversionAdminApp::parse() + .command + .try_into_execute() + .await +} diff --git a/offchain/crates/solana-cli/CHANGELOG.md b/offchain/crates/solana-cli/CHANGELOG.md new file mode 100644 index 0000000000..46185e5604 --- /dev/null +++ b/offchain/crates/solana-cli/CHANGELOG.md @@ -0,0 +1,219 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- `shreds`: collapse `pay`'s `SLOT_DURATION_SECS` and `prepare-offchain-message`'s `SLOT_DURATION_MS` into one `NOMINAL_SLOT_DURATION` at 350ms, matching mainnet-beta from epoch 1020 (2026-08-21). Deliberately cluster-independent, because a `~` prefixed estimate and a deadline slot the CLI and operator must both compute want reproducibility over accuracy. `--valid-for 1h` now resolves to 10,285 slots rather than 9,000, and the epoch-remaining estimates shrink by an eighth. Testnet runs at 200ms, so its estimates stay wrong in the other direction, and SIMD-0525 will need one more bump here (malbeclabs/infra#2317) +- `shreds validator-client-rewards`: read the `ValidatorClientRewards` account through the SDK's zero-copy mirror instead of the hand-written byte-offset parser. Every subcommand now requires at least 184 bytes of account data rather than 116 +- `shreds pay`: print the fastshreds.com transition notice, and require a y/N confirmation when the operator can actually answer it. The notice fires before the wallet is built and before the first RPC call, so declining needs neither a loadable keypair nor a reachable cluster and signs nothing. The prompt requires *both* stdin and stdout to be a terminal: the prompt is written to stdout, so under a redirect (`> pay.log`, `| tee`) the question would land in the file while `read_line` blocked on a terminal showing nothing. Dry runs print the notice without prompting, matching the epoch-remaining prompt, because a simulation signs and sends nothing. A non-terminal stdin also prints without prompting — `read_line` there returns EOF, which the helper reads as "no", and keypair-from-stdin requires a non-terminal stdin, so a prompt would consume the keypair bytes. `--accept-deprecation-notice` skips the prompt for interactive batch and multi-seat workflows; the notice still prints. Declining exits non-zero, matching the epoch-remaining prompt, so a `shreds pay ... && ...` chain does not treat a decline as a completed payment (malbeclabs/infra#2164) +- `shreds pay`: check the `--amount` floor against the price the program actually charges. A new instant seat allocation is priced from the metro/device ring entries at the execution controller's `last_settled_epoch` (the seat covers the remainder of the epoch currently being served), not from the newest entries — those two agree only while prices are static, so the epoch a metro repriced the preflight passed an underfunded amount through to an opaque `invalid account data for instruction`. A pure escrow top-up for an already-active seat submits no `RequestInstantSeatAllocation` and keeps its floor at the newest entry's price. When either ring has no entry for `last_settled_epoch` the command refuses to submit instead of falling back to the newest entry, mirroring the program's own error. The rejection message now names both prices and both epochs (#405) +- `shreds price`: new `Instant Price (USDC)` column (`instant_allocation_price` in `--json`) with the amount `shreds pay` charges right now, alongside the existing `Epoch Price` (unchanged: what the next settlement charges). The two differ for one epoch after a metro reprices. Empty when the execution controller or a ring entry for that epoch is missing; the rest of the listing still prints (#405) +- RFC-20 verb contract: all CLI verbs now follow `execute(self, ctx: &CliContext, out: &mut impl Write)`. New global flags (`--env`, `--solana-url`/`--url`, `--dz-ledger-url`, `--keypair`) construct a `CliContext` at startup. Output uses `writeln!(out, ...)` for testability. Unblocks mounting into unified `doublezero` binary (#1517). Backwards compatible: invocations without the new global flags behave exactly as before — per-verb `--url`/`-u`, `--keypair`/`-k`, `--dz-env`, and `shreds --dz-ledger-url` keep their positions and their meaning, including everything the per-verb moniker implies (network environment, token mints, oracle key, serviceability program id, DZ Ledger URL), resolved per-verb from the moniker or the connection's genesis hash as before. The global flags only supply defaults; per-verb flags win. +- `--env` uses the DoubleZero environment taxonomy (`mainnet-beta`, `testnet`, `devnet`, `local`), matching the `doublezero` CLI: `--env devnet` selects the DZ devnet environment (Solana L1 = testnet). To target the Solana devnet cluster (e.g. the testnet shred-subscription program), keep using `-u devnet` after the subcommand. +- `shreds`: remove the testnet shred-subscription special-case that routed reads/writes to the DZ Ledger. The testnet shred-subscription program now lives on Solana devnet, so the `-u`/`--url` option resolves to the network's Solana RPC URL for all monikers; reach the testnet program with `-u devnet`. Write subcommands now build their `Wallet` directly from `-u`/`--url` (`Wallet::try_new(opts, None)`) and read subcommands from `SolanaConnection::from(connection_options)`, collapsing the redundant second connection that the special-case required. Device codes still resolve against the DZ Ledger via `--dz-ledger-url`. Mainnet behavior is unchanged (#1763) +- migrate to Solana 3.0: workspace `solana-*` crates and `solana-sdk` move to the 3.0 line, `solana-program-test` to 3.0.12, and the doublezero SDK git-deps repin from `client/v0.27.1` to the malbeclabs/doublezero#3830 merge revision (malbeclabs/infra#1853) +- release artifact now builds as a static `x86_64-unknown-linux-musl` binary so it runs on older glibc hosts (malbeclabs/infra#1853) +- TLS for HTTP clients moves from openssl to rustls; trust roots are the bundled webpki Mozilla set plus the host OS certificate store, so OS-installed private CAs remain trusted (malbeclabs/infra#1853) + +## [0.5.10](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.5.10) + +- uptick crate to v0.5.10 (#395) +- `shreds withdraw`: compare the seat's shred-subscription `active_epoch` against the program's `last_settled_epoch` (from the `ExecutionController`), mirroring the on-chain withdrawal guard (reject when `active_epoch < last_settled_epoch`), instead of the Solana cluster epoch (`getEpochInfo`). On clusters where the cluster epoch exceeds the subscription epoch (e.g. Solana devnet) the previous comparison was always false, so the instant seat withdrawal was silently skipped and the command only closed the payment escrow — leaving the seat active and its multicast subscription up (#395) + +## [0.5.9](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.5.9) + +- uptick crate to v0.5.9 (#394) +- `shreds validator-client-rewards claim`: claim every outstanding holding by default. `--subscription-epoch` is now optional — omit it to discover and drain all holdings for the client and mint (current epoch read from `getEpochInfo`). The 16-epoch cap is replaced by automatic batching into `≤16`-per-tx transactions, and explicit epochs whose holding is missing/wrong-mint/invalid are warned and skipped instead of failing the whole claim (#393) + +## [0.5.8](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.5.8) + +- uptick crate to v0.5.8 (#392) +- use the shared `Wallet` memo helpers from `solana-client-tools` in place of the local `RELAY_MEMO_CU` constant and the inline 5,000/15,000 memo estimates in `validator-deposit` +- use the shared create-ATA compute-unit helper from `solana-client-tools` (#386) +- `shreds list --all`: restrict to seats active in the latest subscription epoch (`active_epoch == max` across the queried seats) and print that epoch, so the result reflects current subscriptions instead of every seat that still has an on-chain escrow (lapsed seats whose accounts persist are excluded) (#392) + +## [0.5.7](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.5.7) + +- uptick crate to v0.5.7 (#385) +- `shreds publisher-rewards status`: new read-only per-epoch reward table for a validator (`--node-id`, default last 20 epochs via `--num-epochs`). Every epoch with an on-chain `ShredDistribution` gets a row with status `not ready` / `ready` / `claimed` / `no rewards` / `no data`, plus the reward mint and amount — `claimed` amounts read exactly from the distribute transaction, `ready` amounts estimated (`~`) from the on-chain pool/slots/proportion/burn math (#381) +- `revenue-distribution fetch validator-debts`: remove the written-off debt sanity check that aborted the command. It compared a windowed sum (the last 100 epochs of debt records) against the deposit's lifetime cumulative `written_off_sol_debt`, so it fired whenever a validator had a write-off older than the window (#380) +- `passport`: route verbs through a typed `PassportCliError` (no more `"{e:#}"` cause-chain flattening), remove the remaining `.expect()`/`.unwrap()` panics, add golden-output tests for `fetch --config` and the find-validator gossip warnings, and emit a single combined JSON object when `fetch` is given both `--config` and `--access-request` (#378) +- support the `-ud`/`devnet` network environment (#384) + +## [0.5.6](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.5.6) + +- uptick crate to v0.5.6 (#376) +- `shreds publisher-rewards configure`: after the configure tx lands, scan the last 100 subscription epochs and submit `DistributeValidatorRewards` for any unsettled leaf so the validator's pending rewards land in the same operator session. Skipped under dry-run; per-epoch soft-fail so one bad epoch doesn't tank the rest (#375) +- `solana-client-tools`: `try_fetch_multiple_zero_copy_data` now returns `Vec>`; a single missing or layout-invalid account surfaces as `None` in its slot instead of failing the whole batch (#374) +- `shreds publisher-rewards`: ergonomics pass — `configure` / `prepare-offchain-message` direct auth now uses the global `-k` signer (its pubkey must equal `--node-id`) instead of a separate `--validator-identity-keypair`, plus sensible default refinements across the subcommand group (#373) + +## [0.5.5](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.5.5) + +- uptick crate to v0.5.5 (#372) +- relax ownership constraint so that a user can manage their connection but oracle is ultimately the authority (#367) +- align `shreds validator-client-rewards init-holding` with on-chain `shred-subscription/v0.6.6` rename: `InitializeClaimHoldingAccount` → `InitializeClaimHolding` (discriminator string `dz::ix::initialize_claim_holding_account` → `dz::ix::initialize_claim_holding`). Required to unbreak `init-holding` after the on-chain redeploy on 2026-05-15 (#365) +- `shreds validator-client-rewards`: relocate existing `set-proportion` behavior into a subcommand group (hidden); preparation for `claim`, `init-holding`, `show` (#365) +- `shreds validator-client-rewards init-holding`: new permissionless command to initialize claim holding accounts for one or more `(subscription_epoch, mint)` pairs under a `ValidatorClientRewards` PDA (#365) +- `shreds validator-client-rewards claim`: new manager-signed command to drain claim holdings into a destination token account. Defaults destination to ATA(manager, mint); override with `--destination-token-account`. Reads `program_config.shred_oracle_key` to set the on-chain rent beneficiary (#365) +- `shreds validator-client-rewards show`: new read-only command. With just `--client-id`, prints the VCR PDA, manager, description, and claim holding count. With `--rewards-token-mint --subscription-epoch ...`, also lists per-epoch holding balances (or `(not initialized)`) (#365) +- Add `shreds publisher-rewards` subcommands for validators to configure their on-chain `ValidatorPublisherRewards` (rewards token mint + destination owner) (#360): + - `init` — permissionless creation of the VPR PDA seeded by validator node identity. + - `prepare-offchain-message` — print the hex blob to be signed via `solana sign-offchain-message` (with `--json` for scripting and `--valid-for ` / `--deadline-slot ` for the expiry). + - `configure` — submit the on-chain configure transaction. Two auth paths: direct (the global `-k` signer keypair signs the tx and its pubkey must equal `--node-id`) or offchain (`--signature --deadline-slot ` carries an ed25519 sig). Auto-inits the VPR PDA if missing. Pre-flights that the rewards token mint is a registered, enabled `ShredRewardToken`. Idempotently creates the rewards ATA (`--rewards-token-owner` over `--rewards-token-mint`) in the same transaction so payouts are immediately deliverable. + - `show` — print the current VPR fields and the resolved ATA (`get_associated_token_address(owner, mint)`); reports ATA existence as a status line rather than erroring. +- `shreds payments`: extend instruction-data match to cover the new `InitializeValidatorPublisherRewards` and `ConfigureValidatorPublisherRewards` SDK variants (no-op for escrow event accounting) (#360) +- `shreds pay`: integrate prorated instant seat allocation — when the onchain `is_prorated_service_enabled` flag is set, suppress the late-epoch warning; legacy behavior preserved when the flag is unset (#350) +- `shreds pay`: run the client-side min-amount preflight uniformly (previously bypassed in prorated mode); matches the onchain `FundPaymentEscrowUsdc` minimum which is enforced regardless of proration (#368) +- `shreds withdraw`: use `RequestProratedInstantSeatWithdrawal` to receive a prorated USDC refund when the onchain flag is set and the seat has a recorded `last_usdc_price_dollars`; falls back to the legacy instruction when the flag is unset or the seat pre-dates the prorated rollout (#351) +- `shreds withdraw`: bail with a clear error when an instant seat allocation request is in flight for the seat, rather than submitting a transaction that would be rejected onchain (#357) +- `shreds validator-client-rewards show`: when `--rewards-token-mint` is supplied without `--subscription-epoch`, print the manager's ATA address and balance (previously silently no-op) (#365) +- `shreds validator-client-rewards claim`: print per-holding drained breakdown and re-fetch the VCR to report the remaining `claim_holding_count` after the claim transaction lands (#365) +- `shreds validator-client-rewards claim`: split "wrong owner" and "wrong mint" pre-flight checks into distinct error messages so a non-SPL holding is no longer mislabeled as a wrong-mint holding (#365) + +## [0.5.3](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.5.3) + +- uptick crate to v0.5.3 (#348) +- `shreds withdraw`: allow withdrawing funds from stale seats and add `--funds-only` flag (#347) +- `shreds list`: fall back to showing all seats when no default keypair is found (#346) + +## [0.5.2](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.5.2) + +- uptick crate to v0.5.2 (#345) +- uptick crate to v0.5.1 (#344) +- add `--withdraw-excess-balance` to `revenue-distribution validator-deposit` (#343) +- `shreds`: prepend `CheckCliVersion` instruction to all write transactions (pay, withdraw, validator-client-rewards) for onchain minimum CLI version enforcement (#342) + +## [0.5.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.5.1) + +- `shreds list`: filter by funder (withdraw-authority) by default, add `--all` flag (#328) +- `shreds pay`: block duplicate client IP across devices — prevent creating a seat for an IP that already has an active seat on a different device (#340) +- `shreds validator-client-rewards`: add hidden command to set validator client rewards proportion (#339) + +## [0.5.0](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.5.0) + +- uptick version 0.5.0 (#337) +- `shreds pay`: allow top-up when multicast user is owned by the shred oracle (#336) +- support env var fallback for all CLI args (#334) +- add memos, instruction sizing (#330) +- fix env USDC mint (#333) +- `shreds pay`: fix re-funded seats not getting instant allocation after tenure was cleared (#332) +- fix transaction batch size checks to include compute budget instructions (#331) +- meaningful keypair errors (#329) +- shreds: check active service before shreds withdraw (#326) +- revenue-distribution: fix `fetch validator-debts` record logic (#327) +- shreds: remove experimental feature flag from shreds subcommands (#325) +- shreds: hide devices with no remaining seats in shreds price by default (#324) +- solana-client-tools: match DZ ledger testnet genesis hash (#323) +- replace get_program_accounts scans with PDA lookups in shreds price (#318) +- fix broken pipe panic when piping output to head/grep (#317) +- solana-client-tools: derive network defaults from -u moniker in shreds CLI (#313) +- shreds: block shreds pay when device has no available seats (#316) +- `shreds pay`: use per-seat price override in client-side price floor check, and allow `--amount 0` (#314) +- derive network defaults from `-u` moniker: resolve DZ Ledger URLs, USDC mint, and keypair path automatically (#313) +- shreds: correct est epochs paid calculation in shreds list (#312) +- solana-sdk: update default shred subscription program id (#310) +- shreds: add shreds payments command (#307) +- shreds: skip instant seat allocation when re-funding an already-active seat (#306) +- shreds: fix settled seats and available seats in price command (#305) +- shreds: fix est epochs unit mismatch in shreds list (#304) +- shreds: warn when paying for shreds late in epoch (#302) (#302) +- shreds: add --dz-ledger-url flag to override dz ledger rpc endpoint (#303) +- shreds: make instant seat allocation and withdrawal the default (#301) +- shreds: fix reservation price --json outputting text (#300) +- shreds: rework shreds list command for better trader UX (#299) +- shreds: enrich price command with device status and seat info (#287) +- shreds: add guards for pay and withdraw commands (#298) +- solana-sdk: make client-seat account writable (#297) +- solana-sdk: make execution controller writable for instant withdrawal (#296) +- solana-sdk: align instruction discriminators with onchain program (#295) +- shreds: add --unsafe-now flag to withdraw for instant seat withdrawal (#294) +- shreds: add --now flag for instant seat allocation (#293) +- reservation: rename command to shreds (#291) +- reservation: combine initialize-seat and fund into pay command (#289) +- reservation: fix execution_controller writable flag for InitializeClientSeat (#284) +- reservation: update SDK and CLI for on-chain USDC custody changes (#282) +- reservation: add CLI commands (initialize-seat, withdraw, list, price) (#276) + +## [0.4.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.4.1) - 2026-02-26 + +- solana-cli: add `revenue-distribution configure-contributor-rewards` command to update ContributorRewards recipients and (optionally) protocol-management block/allow flags (#257) +- ensure debt is finalized before collection (#268) +- add prepaid 2Z row for `revenue-distribution fetch distribution` (#266) + +## [0.4.0](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.4.0) - 2026-01-29 + +- sum delinquent debt for `revenue-distribution fetch validator-debts` (#260) +- change default leader schedule lookahead from 2 epochs to 1 for `prepare-validator-access` and `request-validator-access` commands (#259) + +## [0.3.3](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.3.3) - 2026-01-21 + +- solana-cli: show validator debt write-off activation epoch in `revenue-distribution fetch config` (#258) +- solana-cli: add `revenue-distribution fetch contributor-rewards` (#254) +- move fetch methods to SDK (#243) +- migrate `harvest-2z` Jupiter integration to authenticated `api.jup.ag` with optional `--jupiter-api-key` (falls back to `lite-api.jup.ag` without a key) (#242) +- update return value from pay_debt command (#228) + +## [0.3.2](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.3.2) - 2025-12-29 + +- uptick version to 0.3.2 (#241) +- handle missing fee fields for `harvest-2z` Jupiter quotes (#239) + +## [0.3.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.3.1) - 2025-12-18 + +- uptick version to 0.3.1 (#233) +- add memos to `relay distribute-rewards` and `validator-deposit` commands (#232) +- add `--fund-outstanding-debt` to `revenue-distribution validator-deposit` (#231) +- incorporate debt write-off in views (#225) +- use tracing for `revenue-distribution relay` commands (#226) + +## [0.3.0](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.3.0) - 2025-11-24 + +- uptick to v0.3.0 (#210) +- add `revenue-distribution fetch validator-debts` command (#201) +- add shared validator access validation for `prepare-validator-access` and `request-validator-access` commands (#211) + +## [0.2.2](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.2.2) - 2025-11-12 + +- uptick to v0.2.2 (#191) +- correct default limit price for `convert-2z` and `harvest-2z` (#190) +- add `--specific-dex` option for `harvest-2z` (#189) + +## [0.2.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.2.1) - 2025-11-11 + +- add `revenue-distribution fetch distribution --view` argument (#182) +- add `revenue-distribution harvest-2z` command (#180) +- add `revenue-distribution relay distribute-rewards` command (#173) +- move binary from /usr/local/bin/ to /usr/bin to comply with package management standards (#187) + +## [0.2.0](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.2.0) - 2025-10-22 + +- fixed identity search in Solana leader schedule (#166) +- testing release-plz integration +- simplify leader schedule check (#157) +- add token balances and more info in stdout (#162) +- integrate slack notifications (#161) +- add SOL conversion commands (#159) +- add sol-conversion-admin-cli (#156) +- import from and export to CSV, add verify command, bug fixes (#147) + +## [0.1.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana/v0.1.1) - 2025-10-14 + +- uptick to v0.1.1 (#152) +- bump doublezero-solana-cli version to 0.1.10 (#151) +- fix backup validator leader schedule check output (#150) +- fix instruction data when requesting access (#149) +- display balance for uninitialized deposit account (#137) +- fix validator deposits not found (#135) +- fetch revenue distribution account for epoch (#128) +- handle multiple requests in a transaction (#127) +- fetch solana validator deposit accounts (#125) +- add find validator command and prepare access functionality (#121) +- lamports -> SOL (#115) +- add Solana validator deposit commands (#111) +- add `find` subcommand to locate nodes by ID or IP address (#108) +- handle requests with backup IDs (#105) +- clean up (#104) diff --git a/offchain/crates/solana-cli/Cargo.toml b/offchain/crates/solana-cli/Cargo.toml new file mode 100644 index 0000000000..7a1b13c2f5 --- /dev/null +++ b/offchain/crates/solana-cli/Cargo.toml @@ -0,0 +1,62 @@ +[package] +name = "doublezero-solana-cli" +description = "Command line to interact with DoubleZero Solana programs" +version = "0.5.10" + +# Workspace inherited keys +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +anyhow.workspace = true +async-trait.workspace = true +base64.workspace = true +borsh.workspace = true +chrono.workspace = true +clap.workspace = true +csv.workspace = true +eyre.workspace = true +doublezero-cli-core.workspace = true +doublezero-config.workspace = true +doublezero-contributor-rewards.workspace = true +doublezero-ledger-sentinel.workspace = true +doublezero-passport-cli.workspace = true +doublezero-scheduled-command.workspace = true +doublezero-serviceability.workspace = true +doublezero-solana-client-tools.workspace = true +doublezero-solana-sdk.workspace = true +doublezero-solana-validator-debt.workspace = true +doublezero_sdk.workspace = true +futures.workspace = true +humantime.workspace = true +itertools.workspace = true +libc.workspace = true +reqwest.workspace = true +serde.workspace = true +serde_json.workspace = true +slack-notifier.workspace = true +solana-account-decoder-client-types.workspace = true +solana-client.workspace = true +solana-commitment-config.workspace = true +solana-compute-budget-interface.workspace = true +solana-sdk.workspace = true +solana-sdk-ids.workspace = true +solana-system-interface.workspace = true +solana-transaction-status-client-types.workspace = true +spl-associated-token-account-interface.workspace = true +spl-token-interface.workspace = true +tabled.workspace = true +tokio.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true +url.workspace = true + +[dev-dependencies] +bytemuck.workspace = true +wiremock = "0.6" + +[[bin]] +name = "doublezero-solana" +path = "src/main.rs" diff --git a/offchain/crates/solana-cli/src/command/mod.rs b/offchain/crates/solana-cli/src/command/mod.rs new file mode 100644 index 0000000000..34dc48513b --- /dev/null +++ b/offchain/crates/solana-cli/src/command/mod.rs @@ -0,0 +1,161 @@ +mod passport; +mod revenue_distribution; +mod shreds; + +// + +use std::io::Write; + +use anyhow::Result; +use clap::{Args, Subcommand}; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + payer::{SolanaPayerOptions, SolanaSignerOptions, Wallet}, + rpc::{NetworkEnvironment, SolanaConnection, SolanaConnectionOptions}, +}; + +// ── Shared types & helpers ────────────────────────────────────────────── + +/// Per-verb options for write verbs: the signer-specific flags plus per-verb +/// `--url`/`--keypair` overrides (back-compat) that win over the global +/// `CliContext` values when present. +#[derive(Debug, Args, Clone, Default)] +pub struct WriteVerbOptions { + /// Solana RPC URL or moniker. Overrides the global value for this verb. + #[command(flatten)] + pub connection_options: SolanaConnectionOptions, + + /// Filepath or URL to a keypair. Overrides the global keypair for this verb. + #[arg(long = "keypair", short = 'k', value_name = "KEYPAIR", env)] + pub keypair_path: Option, + + /// Set the compute unit price (micro-lamports per compute unit). + #[arg(long, value_name = "MICROLAMPORTS", env)] + pub with_compute_unit_price: Option, + + /// Print verbose output. + #[arg(long, short = 'v', default_value = "false", env)] + pub verbose: bool, + + /// Filepath or URL to keypair to pay transaction fee. + #[arg(long = "fee-payer", value_name = "KEYPAIR", env)] + pub fee_payer_path: Option, + + /// Simulate transaction only. + #[arg(long, env)] + pub dry_run: bool, +} + +/// Build a [`Wallet`] from the global `CliContext` and per-verb write options. +/// Per-verb `--url`/`--keypair` (back-compat) win over the global CliContext. +pub(crate) fn build_wallet(ctx: &CliContext, opts: WriteVerbOptions) -> Result { + let solana_url_or_moniker = opts + .connection_options + .solana_url_or_moniker + .or_else(|| Some(ctx.solana_l1_rpc_url.clone())); + let keypair_path = opts + .keypair_path + .or_else(|| ctx.keypair_path.as_ref().map(|p| p.display().to_string())); + let payer_opts = SolanaPayerOptions { + connection_options: SolanaConnectionOptions { + solana_url_or_moniker, + }, + signer_options: SolanaSignerOptions { + keypair_path, + with_compute_unit_price: opts.with_compute_unit_price, + verbose: opts.verbose, + fee_payer_path: opts.fee_payer_path, + dry_run: opts.dry_run, + }, + }; + Wallet::try_new(payer_opts, None) +} + +/// Build a `SolanaConnection`: per-verb `--url` (back-compat) wins over the +/// global ctx L1 URL. +pub(crate) fn solana_connection( + ctx: &CliContext, + connection_options: &SolanaConnectionOptions, +) -> SolanaConnection { + if connection_options.solana_url_or_moniker.is_some() { + SolanaConnection::from(connection_options.clone()) + } else { + SolanaConnection::new(ctx.solana_l1_rpc_url.clone()) + } +} + +/// Resolve the `NetworkEnvironment` the way the pre-RFC-20 CLI did: a per-verb +/// `-u ` wins; otherwise detect from the connection's genesis hash. +/// The global `--env`/`--solana-url` flags participate through the URL the +/// connection was built from, so they supply the default without changing the +/// behavior of invocations that predate them. +pub(crate) async fn resolve_network_env( + connection: &SolanaConnection, + moniker_env: Option, +) -> Result { + match moniker_env { + Some(environment) => Ok(environment), + None => connection.try_network_environment().await, + } +} + +// ── Top-level dispatch ────────────────────────────────────────────────── + +#[derive(Debug, Subcommand)] +pub enum DoubleZeroSolanaCommand { + /// Passport program commands. + Passport(passport::PassportCommand), + + /// Revenue distribution program commands. + RevenueDistribution(revenue_distribution::RevenueDistributionCommand), + + /// Shred subscription program commands. + Shreds(shreds::ShredsCommand), +} + +impl DoubleZeroSolanaCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + match self { + Self::Passport(passport) => passport.command.execute(ctx, out).await, + Self::RevenueDistribution(revenue_distribution) => { + revenue_distribution.command.execute(ctx, out).await + } + Self::Shreds(shreds) => shreds.execute(ctx, out).await, + } + } +} + +// ── Shared interactive prompt ─────────────────────────────────────────── + +pub(crate) fn try_prompt_proceed_confirmation( + out: &mut impl Write, + prompt_message: &str, + abort_message: &str, +) -> Result<()> { + loop { + writeln!(out, "⚠️ {prompt_message}. Proceed? [y/N]")?; + // A buffered writer would otherwise hold the prompt while stdin blocks. + out.flush()?; + + let mut input = String::new(); + std::io::stdin().read_line(&mut input)?; + + let first_char = input + .trim() + .chars() + .next() + .map(|c| c.to_lowercase().next().unwrap()); + + match first_char { + Some('y') => return Ok(()), + Some('n') | None => anyhow::bail!("{abort_message}"), + _ => { + writeln!( + out, + "Invalid input. Please enter 'y' for yes or 'n' for no." + )?; + continue; + } + } + } +} diff --git a/offchain/crates/solana-cli/src/command/passport.rs b/offchain/crates/solana-cli/src/command/passport.rs new file mode 100644 index 0000000000..568c6ed599 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/passport.rs @@ -0,0 +1,268 @@ +//! Backward-compatibility adapter for the `passport` command tree. +//! +//! The passport verbs now live in the RFC-20 module crate +//! `doublezero-passport-cli`, whose verbs read all connection/identity +//! configuration from a `CliContext`. This adapter preserves the exact +//! pre-RFC-20 `doublezero-solana passport ...` flag surface (per-verb `--url`, +//! `--keypair`, signer flags) by re-declaring those flags here, building a +//! `CliContext` from them, and delegating to the library's `execute(ctx, out)`. +//! +//! New flags (`--json`, `--json-compact`) are additive on the read verbs. + +use std::path::PathBuf; + +use anyhow::Result; +use clap::{Args, Subcommand}; +use doublezero_cli_core::{CliContext, CliContextBuilder, OutputFormat}; +use doublezero_config::Environment; +use doublezero_passport_cli as lib; +use doublezero_solana_client_tools::rpc::{ + NetworkEnvironment, SolanaConnection, SolanaConnectionOptions, +}; + +#[derive(Debug, Args)] +pub struct PassportCommand { + #[command(subcommand)] + pub command: PassportSubcommand, +} + +#[derive(Debug, Subcommand)] +pub enum PassportSubcommand { + /// Fetch and display the current program configuration and access request (if any) + Fetch(FetchAdapter), + /// Find and display the Current Identity + FindValidator(FindValidatorAdapter), + /// Validate arguments and generate the required transaction signature command + PrepareValidatorAccess(PrepareAdapter), + /// Request access as a Solana Validator + RequestValidatorAccess(RequestAdapter), +} + +#[derive(Debug, Args)] +pub struct FetchAdapter { + #[command(flatten)] + inner: lib::fetch::FetchArgs, + #[command(flatten)] + conn: SolanaConnectionOptions, + /// Output as pretty JSON + #[arg(long, default_value_t = false, conflicts_with = "json_compact")] + json: bool, + /// Output as single-line JSON suitable for piping + #[arg( + long = "json-compact", + default_value_t = false, + conflicts_with = "json" + )] + json_compact: bool, +} + +#[derive(Debug, Args)] +pub struct FindValidatorAdapter { + #[command(flatten)] + inner: lib::find_validator::FindValidatorArgs, + #[command(flatten)] + conn: SolanaConnectionOptions, + /// Output as pretty JSON + #[arg(long, default_value_t = false, conflicts_with = "json_compact")] + json: bool, + /// Output as single-line JSON suitable for piping + #[arg( + long = "json-compact", + default_value_t = false, + conflicts_with = "json" + )] + json_compact: bool, +} + +#[derive(Debug, Args)] +pub struct PrepareAdapter { + #[command(flatten)] + inner: lib::prepare_access::PrepareValidatorAccessArgs, + #[command(flatten)] + conn: SolanaConnectionOptions, +} + +#[derive(Debug, Args)] +pub struct RequestAdapter { + #[command(flatten)] + inner: lib::request_access::RequestValidatorAccessArgs, + #[command(flatten)] + conn: SolanaConnectionOptions, + /// Filepath or URL to a keypair. + #[arg(long = "keypair", short = 'k', value_name = "KEYPAIR", env)] + keypair_path: Option, +} + +impl PassportSubcommand { + pub async fn execute( + self, + parent_ctx: &CliContext, + out: &mut impl std::io::Write, + ) -> Result<()> { + match self { + PassportSubcommand::Fetch(FetchAdapter { + inner, + conn, + json, + json_compact, + }) => { + let ctx = merge_ctx(parent_ctx, conn, None, json, json_compact)?; + inner.execute(&ctx, out).await?; + } + PassportSubcommand::FindValidator(FindValidatorAdapter { + inner, + conn, + json, + json_compact, + }) => { + let ctx = merge_ctx(parent_ctx, conn, None, json, json_compact)?; + inner.execute(&ctx, out).await?; + } + PassportSubcommand::PrepareValidatorAccess(PrepareAdapter { inner, conn }) => { + let ctx = merge_ctx(parent_ctx, conn, None, false, false)?; + inner.execute(&ctx, out).await?; + } + PassportSubcommand::RequestValidatorAccess(RequestAdapter { + inner, + conn, + keypair_path, + }) => { + let ctx = merge_ctx(parent_ctx, conn, keypair_path, false, false)?; + inner.execute(&ctx, out).await?; + } + } + Ok(()) + } +} + +/// Build a `CliContext` by merging the global context with per-verb overrides. +/// +/// Per-verb `--url` / `--keypair` / `--json` flags (kept for backward +/// compatibility) take precedence over the global context. When the per-verb +/// flags are absent, the global context values are used. +fn merge_ctx( + parent: &CliContext, + conn: SolanaConnectionOptions, + keypair_path: Option, + json: bool, + json_compact: bool, +) -> Result { + // Per-verb moniker (back-compat) wins and is validated (passport is not + // deployed on Solana devnet); otherwise inherit the global ctx env. When + // the moniker overrides the env, the parent's ledger URL is NOT pinned — + // the builder derives it from the overridden env so the resolved context + // stays internally consistent (env, ledger, and program IDs agree). + let (env, ledger_rpc_url) = match conn.moniker_env() { + Some(moniker_env) => (try_map_env(moniker_env)?, None), + None => (parent.env, Some(parent.ledger_rpc_url.clone())), + }; + let solana_l1_rpc_url = if conn.solana_url_or_moniker.is_some() { + SolanaConnection::from(conn).url() + } else { + parent.solana_l1_rpc_url.clone() + }; + let output_format = if json || json_compact { + OutputFormat::from_flags(json, json_compact) + } else { + parent.output_format + }; + let keypair = keypair_path + .map(PathBuf::from) + .or_else(|| parent.keypair_path.clone()); + + // Maintenance hazard: this rebuilds a `CliContext` field-by-field rather + // than overriding the parent, so any field added to `CliContext` is + // silently dropped here until mirrored below. Keep in sync, or replace with + // a `CliContext::with_overrides()` helper in cli-core if one lands. + let mut builder = CliContextBuilder::new() + .with_env(env) + .with_solana_l1_rpc_url(solana_l1_rpc_url) + .with_output_format(output_format) + .with_client_version(parent.client_version.clone()); + if let Some(url) = ledger_rpc_url { + builder = builder.with_ledger_rpc_url(url); + } + if let Some(path) = keypair { + builder = builder.with_keypair_path(path); + } + builder.build().map_err(anyhow::Error::msg) +} + +fn try_map_env(network_environment: NetworkEnvironment) -> Result { + let env = match network_environment { + NetworkEnvironment::MainnetBeta => Environment::MainnetBeta, + NetworkEnvironment::Testnet => Environment::Testnet, + NetworkEnvironment::Devnet => anyhow::bail!("passport is not available on Solana devnet"), + NetworkEnvironment::Localnet => Environment::Local, + }; + Ok(env) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn parent_ctx() -> CliContext { + CliContextBuilder::new() + .with_env(Environment::MainnetBeta) + .with_keypair_path(PathBuf::from("/tmp/parent-id.json")) + .with_client_version("1.2.3") + .build() + .expect("parent ctx builds") + } + + /// A trailing `-u ` overrides the env AND every env-derived field + /// follows it: the ledger URL is re-derived from the overridden env rather + /// than pinned to the parent's, so the merged context stays internally + /// consistent. Also locks in that non-overridden fields (keypair, + /// client_version) survive the rebuild. + #[test] + fn test_merge_ctx_moniker_override_rederives_env_fields() { + let parent = parent_ctx(); + let conn = SolanaConnectionOptions { + solana_url_or_moniker: Some("t".to_string()), + }; + let merged = merge_ctx(&parent, conn, None, false, false).expect("merge succeeds"); + + let testnet = Environment::Testnet.config().expect("testnet config"); + assert_eq!(merged.env, Environment::Testnet); + assert_eq!(merged.ledger_rpc_url, testnet.ledger_public_rpc_url); + assert_ne!(merged.ledger_rpc_url, parent.ledger_rpc_url); + assert_eq!(merged.keypair_path, parent.keypair_path); + assert_eq!(merged.client_version, parent.client_version); + } + + /// Without per-verb overrides the parent context passes through unchanged. + #[test] + fn test_merge_ctx_without_overrides_inherits_parent() { + let parent = parent_ctx(); + let merged = merge_ctx( + &parent, + SolanaConnectionOptions::default(), + None, + false, + false, + ) + .expect("merge succeeds"); + + assert_eq!(merged.env, parent.env); + assert_eq!(merged.solana_l1_rpc_url, parent.solana_l1_rpc_url); + assert_eq!(merged.ledger_rpc_url, parent.ledger_rpc_url); + assert_eq!(merged.keypair_path, parent.keypair_path); + assert_eq!(merged.output_format, parent.output_format); + assert_eq!(merged.client_version, parent.client_version); + } + + /// The devnet moniker is rejected with an actionable error (passport is not + /// deployed on the Solana devnet cluster). + #[test] + fn test_merge_ctx_devnet_moniker_errors() { + let parent = parent_ctx(); + let conn = SolanaConnectionOptions { + solana_url_or_moniker: Some("devnet".to_string()), + }; + let err = merge_ctx(&parent, conn, None, false, false) + .expect_err("devnet moniker must be rejected"); + assert!(err.to_string().contains("not available on Solana devnet")); + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/configure_contributor_rewards.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/configure_contributor_rewards.rs new file mode 100644 index 0000000000..167d993eee --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/configure_contributor_rewards.rs @@ -0,0 +1,765 @@ +use std::{io::Write, str::FromStr}; + +use anyhow::{Result, bail, ensure}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + payer::{TransactionOutcome, Wallet}, +}; +use doublezero_solana_sdk::{ + revenue_distribution::{ + ID, + instruction::{ + ContributorRewardsConfiguration, RevenueDistributionInstructionData, + account::ConfigureContributorRewardsAccounts, + }, + state::{ContributorRewards, MAX_RECIPIENTS}, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{instruction::Instruction, pubkey::Pubkey}; + +pub const BASIS_POINTS_SCALE: u16 = 10_000; +pub const HUMAN_PERCENT_SCALE: u8 = 100; + +/// Configure a contributor rewards account. +/// +/// This command allows setting recipient shares and/or controlling whether +/// protocol management can change the rewards manager. +#[derive(Debug, Args)] +#[command(name = "configure-contributor-rewards")] +pub struct ConfigureContributorRewardsCommand { + /// The service key that identifies the ContributorRewards account (PDA seed). + #[arg(long, value_name = "PUBKEY")] + service_key: Pubkey, + + /// Recipient share in the format PUBKEY:PERCENT (1-100, integer). + /// Can be specified multiple times. Maximum 8 recipients. + /// All percentages must sum to exactly 100. + /// + /// Example: --recipient HFishy...:30 --recipient 7xKXt...:70 + #[arg(long = "recipient", value_name = "PUBKEY:PERCENT")] + recipients: Vec, + + /// Block protocol management from changing the rewards manager. + /// Mutually exclusive with --allow-protocol-management. + #[arg(long, conflicts_with = "allow_protocol_management")] + block_protocol_management: bool, + + /// Allow protocol management to change the rewards manager. + /// Mutually exclusive with --block-protocol-management. + #[arg(long, conflicts_with = "block_protocol_management")] + allow_protocol_management: bool, + + #[command(flatten)] + write_opts: crate::command::WriteVerbOptions, +} + +#[derive(Debug, Clone)] +pub struct ConfigureContributorRewardsArgs { + /// The service key that identifies the ContributorRewards account. + pub service_key: Pubkey, + /// The wallet/signer pubkey (rewards manager). + pub signer_key: Pubkey, + /// Parsed recipients as (Pubkey, basis_points). + pub recipients: Vec<(Pubkey, u16)>, + /// Whether to block protocol management. + pub block_protocol_management: bool, + /// Whether to allow protocol management. + pub allow_protocol_management: bool, + /// Optional compute unit price instruction. + pub compute_unit_price_ix: Option, +} + +#[derive(Debug)] +pub struct ConfigureContributorRewardsInstructions { + /// The full list of instructions, with ComputeBudget instructions first. + pub instructions: Vec, + /// The computed unit limit used (exposed for testing/logging). + #[allow(dead_code)] + pub compute_unit_limit: u32, +} + +pub fn build_configure_contributor_rewards_instructions( + args: &ConfigureContributorRewardsArgs, +) -> Result { + let ConfigureContributorRewardsArgs { + service_key, + signer_key, + recipients, + block_protocol_management, + allow_protocol_management, + compute_unit_price_ix, + } = args; + + let has_recipients = !recipients.is_empty(); + let has_block_flag = *block_protocol_management || *allow_protocol_management; + + if !has_recipients && !has_block_flag { + bail!( + "Nothing to configure. Provide at least one --recipient \ + or use --block-protocol-management / --allow-protocol-management" + ); + } + + if has_recipients { + validate_recipients(recipients)?; + } + + let mut program_instructions = Vec::new(); + let mut compute_unit_limit = 5_000u32; + + let (_, bump) = ContributorRewards::find_address(service_key); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + if has_recipients { + let recipients_ix = try_build_instruction( + &ID, + ConfigureContributorRewardsAccounts::new(signer_key, service_key), + &RevenueDistributionInstructionData::ConfigureContributorRewards( + ContributorRewardsConfiguration::Recipients(recipients.clone()), + ), + )?; + program_instructions.push(recipients_ix); + compute_unit_limit += 10_000; + } + + if *block_protocol_management { + let block_ix = try_build_instruction( + &ID, + ConfigureContributorRewardsAccounts::new(signer_key, service_key), + &RevenueDistributionInstructionData::ConfigureContributorRewards( + ContributorRewardsConfiguration::IsSetRewardsManagerBlocked(true), + ), + )?; + program_instructions.push(block_ix); + compute_unit_limit += 5_000; + } else if *allow_protocol_management { + let allow_ix = try_build_instruction( + &ID, + ConfigureContributorRewardsAccounts::new(signer_key, service_key), + &RevenueDistributionInstructionData::ConfigureContributorRewards( + ContributorRewardsConfiguration::IsSetRewardsManagerBlocked(false), + ), + )?; + program_instructions.push(allow_ix); + compute_unit_limit += 5_000; + } + + let mut instructions = Vec::with_capacity(program_instructions.len() + 2); + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(price_ix) = compute_unit_price_ix { + instructions.push(price_ix.clone()); + } + + instructions.extend(program_instructions); + + Ok(ConfigureContributorRewardsInstructions { + instructions, + compute_unit_limit, + }) +} + +impl ConfigureContributorRewardsCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let ConfigureContributorRewardsCommand { + service_key, + recipients, + block_protocol_management, + allow_protocol_management, + write_opts, + } = self; + + // Parse recipients from CLI strings (human percent -> basis points). + let parsed_recipients = parse_recipients(&recipients)?; + + let wallet = crate::command::build_wallet(ctx, write_opts)?; + let wallet_key = wallet.pubkey(); + + // Preflight check: verify the signer is the rewards manager. + preflight_check_rewards_manager(&wallet, &service_key, &wallet_key).await?; + + // Build instructions. + let args = ConfigureContributorRewardsArgs { + service_key, + signer_key: wallet_key, + recipients: parsed_recipients, + block_protocol_management, + allow_protocol_management, + compute_unit_price_ix: wallet.compute_unit_price_ix.clone(), + }; + + let result = build_configure_contributor_rewards_instructions(&args)?; + + let transaction = wallet.new_transaction(&result.instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + writeln!(out, "Configured contributor rewards: {tx_sig}")?; + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + Ok(()) + } +} + +/// Preflight check: fetch the ContributorRewards account and verify the signer +/// is the current rewards_manager_key. +/// +/// This provides a clear local error before sending a transaction that would fail. +async fn preflight_check_rewards_manager( + wallet: &Wallet, + service_key: &Pubkey, + signer_key: &Pubkey, +) -> Result<()> { + let (pda_key, _) = ContributorRewards::find_address(service_key); + + let contributor_rewards: ZeroCopyAccountOwnedData = + match wallet.connection.try_fetch_zero_copy_data(&pda_key).await { + Ok(data) => data, + Err(_) => { + return Ok(()); + } + }; + + // Check if signer matches the stored rewards_manager_key. + if contributor_rewards.rewards_manager_key != *signer_key { + bail!( + "Signer {} is not the rewards manager for this ContributorRewards account.\n\ + Current rewards manager: {}\n\ + ContributorRewards PDA: {}", + signer_key, + contributor_rewards.rewards_manager_key, + pda_key + ); + } + + Ok(()) +} + +/// Parse a single recipient string in the format "PUBKEY:PERCENT". +/// +/// PERCENT is human-readable (1-100), converted to basis points (100-10000) internally. +/// Returns (Pubkey, u16) where u16 is the share in basis points. +fn parse_recipient(s: &str) -> Result<(Pubkey, u16)> { + let parts: Vec<&str> = s.split(':').collect(); + + ensure!( + parts.len() == 2, + "Invalid recipient format: '{}'. Expected PUBKEY:PERCENT (e.g., HFishy...:30)", + s + ); + + let pubkey_str = parts[0]; + let percent_str = parts[1]; + + let pubkey = Pubkey::from_str(pubkey_str).map_err(|e| { + anyhow::anyhow!( + "Invalid pubkey '{}' in recipient '{}': {}", + pubkey_str, + s, + e + ) + })?; + + ensure!( + pubkey != Pubkey::default(), + "Invalid recipient: zero pubkey is not allowed" + ); + + let percent: u8 = percent_str.parse().map_err(|e| { + anyhow::anyhow!( + "Invalid percentage '{}' in recipient '{}': {}. Must be an integer 1-100", + percent_str, + s, + e + ) + })?; + + ensure!( + percent > 0, + "Invalid percentage {} in recipient '{}': must be greater than 0", + percent, + s + ); + ensure!( + percent <= HUMAN_PERCENT_SCALE, + "Invalid percentage {} in recipient '{}': must be at most {} (100%)", + percent, + s, + HUMAN_PERCENT_SCALE + ); + + let basis_points = u16::from(percent) * (BASIS_POINTS_SCALE / u16::from(HUMAN_PERCENT_SCALE)); + + Ok((pubkey, basis_points)) +} + +fn parse_recipients(recipients: &[String]) -> Result> { + recipients.iter().map(|s| parse_recipient(s)).collect() +} + +fn validate_recipients(recipients: &[(Pubkey, u16)]) -> Result<()> { + ensure!( + recipients.len() <= MAX_RECIPIENTS, + "Too many recipients: {} provided, maximum is {}", + recipients.len(), + MAX_RECIPIENTS + ); + + let mut seen = std::collections::HashSet::new(); + for (pubkey, _) in recipients { + ensure!( + seen.insert(*pubkey), + "Duplicate recipient pubkey: {}", + pubkey + ); + } + + let total: u32 = recipients.iter().map(|(_, share)| u32::from(*share)).sum(); + ensure!( + total == u32::from(BASIS_POINTS_SCALE), + "Recipient percentages must sum to 100% (got {}%)", + total / 100 + ); + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + // A valid non-zero pubkey for testing (Token program). + const TEST_PUBKEY: &str = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + // Another valid pubkey for testing (Associated Token program). + const TEST_PUBKEY_2: &str = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"; + + #[test] + fn test_parse_recipient_valid() { + let input = format!("{}:50", TEST_PUBKEY); + let result = parse_recipient(&input); + assert!(result.is_ok()); + let (pubkey, bps) = result.unwrap(); + assert_eq!(pubkey, Pubkey::from_str(TEST_PUBKEY).unwrap()); + assert_eq!(bps, 5000); + } + + #[test] + fn test_parse_recipient_max_percentage() { + let input = format!("{}:100", TEST_PUBKEY); + let result = parse_recipient(&input); + assert!(result.is_ok()); + assert_eq!(result.unwrap().1, 10000); + } + + #[test] + fn test_parse_recipient_small_percentage() { + let input = format!("{}:1", TEST_PUBKEY); + let result = parse_recipient(&input); + assert!(result.is_ok()); + assert_eq!(result.unwrap().1, 100); + } + + #[test] + fn test_parse_recipient_missing_colon() { + let input = format!("{}50", TEST_PUBKEY); + let result = parse_recipient(&input); + assert!(result.is_err()); + assert!( + result + .unwrap_err() + .to_string() + .contains("Expected PUBKEY:PERCENT") + ); + } + + #[test] + fn test_parse_recipient_extra_colon() { + let input = format!("{}:50:00", TEST_PUBKEY); + let result = parse_recipient(&input); + assert!(result.is_err()); + assert!( + result + .unwrap_err() + .to_string() + .contains("Expected PUBKEY:PERCENT") + ); + } + + #[test] + fn test_parse_recipient_invalid_pubkey() { + let input = "not_a_valid_pubkey:50"; + let result = parse_recipient(input); + assert!(result.is_err()); + assert!(result.unwrap_err().to_string().contains("Invalid pubkey")); + } + + #[test] + fn test_parse_recipient_non_numeric_percentage() { + let input = format!("{}:abc", TEST_PUBKEY); + let result = parse_recipient(&input); + assert!(result.is_err()); + assert!( + result + .unwrap_err() + .to_string() + .contains("Invalid percentage") + ); + } + + #[test] + fn test_parse_recipient_zero_percentage() { + let input = format!("{}:0", TEST_PUBKEY); + let result = parse_recipient(&input); + assert!(result.is_err()); + assert!( + result + .unwrap_err() + .to_string() + .contains("must be greater than 0") + ); + } + + #[test] + fn test_parse_recipient_percentage_too_high() { + let input = format!("{}:101", TEST_PUBKEY); + let result = parse_recipient(&input); + assert!(result.is_err()); + assert!(result.unwrap_err().to_string().contains("must be at most")); + } + + #[test] + fn test_parse_recipient_zero_pubkey() { + let input = "11111111111111111111111111111111:50"; + let result = parse_recipient(input); + assert!(result.is_err()); + assert!( + result + .unwrap_err() + .to_string() + .contains("zero pubkey is not allowed") + ); + } + + #[test] + fn test_validate_recipients_valid() { + let recipients = vec![(Pubkey::new_unique(), 3000), (Pubkey::new_unique(), 7000)]; + assert!(validate_recipients(&recipients).is_ok()); + } + + #[test] + fn test_validate_recipients_sum_not_100() { + let recipients = vec![(Pubkey::new_unique(), 3000), (Pubkey::new_unique(), 5000)]; + let result = validate_recipients(&recipients); + assert!(result.is_err()); + assert!(result.unwrap_err().to_string().contains("sum to 100%")); + } + + #[test] + fn test_validate_recipients_duplicates() { + let key = Pubkey::new_unique(); + let recipients = vec![(key, 5000), (key, 5000)]; + let result = validate_recipients(&recipients); + assert!(result.is_err()); + assert!( + result + .unwrap_err() + .to_string() + .contains("Duplicate recipient") + ); + } + + #[test] + fn test_validate_recipients_max_exceeded() { + let recipients: Vec<_> = (0..9).map(|_| (Pubkey::new_unique(), 1111)).collect(); + let result = validate_recipients(&recipients); + assert!(result.is_err()); + assert!(result.unwrap_err().to_string().contains("maximum is 8")); + } + + #[test] + fn test_validate_recipients_exactly_8() { + let recipients: Vec<_> = (0..8).map(|_| (Pubkey::new_unique(), 1250)).collect(); + assert!(validate_recipients(&recipients).is_ok()); + } + + #[test] + fn test_validate_recipients_single_recipient_100_percent() { + let recipients = vec![(Pubkey::new_unique(), 10000)]; + assert!(validate_recipients(&recipients).is_ok()); + } + + #[test] + fn test_validate_recipients_empty() { + let recipients: Vec<(Pubkey, u16)> = vec![]; + let result = validate_recipients(&recipients); + assert!(result.is_err()); + assert!(result.unwrap_err().to_string().contains("sum to 100%")); + } + + #[test] + fn test_build_instructions_nothing_to_do() { + let args = ConfigureContributorRewardsArgs { + service_key: Pubkey::new_unique(), + signer_key: Pubkey::new_unique(), + recipients: vec![], + block_protocol_management: false, + allow_protocol_management: false, + compute_unit_price_ix: None, + }; + let result = build_configure_contributor_rewards_instructions(&args); + assert!(result.is_err()); + assert!( + result + .unwrap_err() + .to_string() + .contains("Nothing to configure") + ); + } + + #[test] + fn test_build_instructions_recipients_only() { + let args = ConfigureContributorRewardsArgs { + service_key: Pubkey::new_unique(), + signer_key: Pubkey::new_unique(), + recipients: vec![(Pubkey::new_unique(), 10000)], + block_protocol_management: false, + allow_protocol_management: false, + compute_unit_price_ix: None, + }; + let result = build_configure_contributor_rewards_instructions(&args).unwrap(); + + assert_eq!(result.instructions.len(), 2); + + assert_eq!( + result.instructions[0].program_id, + solana_sdk_ids::compute_budget::id() + ); + } + + #[test] + fn test_build_instructions_block_flag_only() { + let args = ConfigureContributorRewardsArgs { + service_key: Pubkey::new_unique(), + signer_key: Pubkey::new_unique(), + recipients: vec![], + block_protocol_management: true, + allow_protocol_management: false, + compute_unit_price_ix: None, + }; + let result = build_configure_contributor_rewards_instructions(&args).unwrap(); + + assert_eq!(result.instructions.len(), 2); + + assert_eq!( + result.instructions[0].program_id, + solana_sdk_ids::compute_budget::id() + ); + } + + #[test] + fn test_build_instructions_allow_flag_only() { + let args = ConfigureContributorRewardsArgs { + service_key: Pubkey::new_unique(), + signer_key: Pubkey::new_unique(), + recipients: vec![], + block_protocol_management: false, + allow_protocol_management: true, + compute_unit_price_ix: None, + }; + let result = build_configure_contributor_rewards_instructions(&args).unwrap(); + + assert_eq!(result.instructions.len(), 2); + } + + #[test] + fn test_build_instructions_with_priority_fee() { + let priority_ix = ComputeBudgetInstruction::set_compute_unit_price(1000); + + let args = ConfigureContributorRewardsArgs { + service_key: Pubkey::new_unique(), + signer_key: Pubkey::new_unique(), + recipients: vec![(Pubkey::new_unique(), 10000)], + block_protocol_management: false, + allow_protocol_management: false, + compute_unit_price_ix: Some(priority_ix), + }; + let result = build_configure_contributor_rewards_instructions(&args).unwrap(); + + assert_eq!(result.instructions.len(), 3); + + assert_eq!( + result.instructions[0].program_id, + solana_sdk_ids::compute_budget::id() + ); + assert_eq!( + result.instructions[1].program_id, + solana_sdk_ids::compute_budget::id() + ); + } + + #[test] + fn test_build_instructions_compute_budget_first() { + let priority_ix = ComputeBudgetInstruction::set_compute_unit_price(1000); + + let args = ConfigureContributorRewardsArgs { + service_key: Pubkey::new_unique(), + signer_key: Pubkey::new_unique(), + recipients: vec![(Pubkey::new_unique(), 5000), (Pubkey::new_unique(), 5000)], + block_protocol_management: true, + allow_protocol_management: false, + compute_unit_price_ix: Some(priority_ix), + }; + let result = build_configure_contributor_rewards_instructions(&args).unwrap(); + + assert_eq!(result.instructions.len(), 4); + + assert_eq!( + result.instructions[0].program_id, + solana_sdk_ids::compute_budget::id(), + "First instruction must be ComputeBudget" + ); + assert_eq!( + result.instructions[1].program_id, + solana_sdk_ids::compute_budget::id(), + "Second instruction must be ComputeBudget" + ); + + assert_eq!(result.instructions[2].program_id, ID); + assert_eq!(result.instructions[3].program_id, ID); + } + + #[test] + fn test_build_instructions_no_block_flag_means_no_block_ix() { + let args = ConfigureContributorRewardsArgs { + service_key: Pubkey::new_unique(), + signer_key: Pubkey::new_unique(), + recipients: vec![(Pubkey::new_unique(), 10000)], + block_protocol_management: false, + allow_protocol_management: false, + compute_unit_price_ix: None, + }; + let result = build_configure_contributor_rewards_instructions(&args).unwrap(); + + assert_eq!(result.instructions.len(), 2); + + let program_ixs: Vec<_> = result + .instructions + .iter() + .filter(|ix| ix.program_id == ID) + .collect(); + assert_eq!( + program_ixs.len(), + 1, + "Should have exactly 1 program instruction" + ); + } + + #[test] + fn test_build_instructions_block_true_adds_block_ix() { + let args = ConfigureContributorRewardsArgs { + service_key: Pubkey::new_unique(), + signer_key: Pubkey::new_unique(), + recipients: vec![], + block_protocol_management: true, + allow_protocol_management: false, + compute_unit_price_ix: None, + }; + let result = build_configure_contributor_rewards_instructions(&args).unwrap(); + + assert_eq!(result.instructions.len(), 2); + + let program_ixs: Vec<_> = result + .instructions + .iter() + .filter(|ix| ix.program_id == ID) + .collect(); + assert_eq!(program_ixs.len(), 1); + } + + #[test] + fn test_build_instructions_allow_true_adds_allow_ix() { + let args = ConfigureContributorRewardsArgs { + service_key: Pubkey::new_unique(), + signer_key: Pubkey::new_unique(), + recipients: vec![], + block_protocol_management: false, + allow_protocol_management: true, + compute_unit_price_ix: None, + }; + let result = build_configure_contributor_rewards_instructions(&args).unwrap(); + + assert_eq!(result.instructions.len(), 2); + + let program_ixs: Vec<_> = result + .instructions + .iter() + .filter(|ix| ix.program_id == ID) + .collect(); + assert_eq!(program_ixs.len(), 1); + } + + #[test] + fn test_build_instructions_recipients_and_block() { + let args = ConfigureContributorRewardsArgs { + service_key: Pubkey::new_unique(), + signer_key: Pubkey::new_unique(), + recipients: vec![(Pubkey::new_unique(), 10000)], + block_protocol_management: true, + allow_protocol_management: false, + compute_unit_price_ix: None, + }; + let result = build_configure_contributor_rewards_instructions(&args).unwrap(); + + assert_eq!(result.instructions.len(), 3); + + let program_ixs: Vec<_> = result + .instructions + .iter() + .filter(|ix| ix.program_id == ID) + .collect(); + assert_eq!(program_ixs.len(), 2); + } + + #[test] + fn test_parse_and_validate_30_70_split() { + let inputs = vec![ + format!("{}:30", TEST_PUBKEY), + format!("{}:70", TEST_PUBKEY_2), + ]; + let parsed = parse_recipients(&inputs).unwrap(); + + assert_eq!(parsed[0].1, 3000); + assert_eq!(parsed[1].1, 7000); + + assert!(validate_recipients(&parsed).is_ok()); + } + + #[test] + fn test_parse_and_validate_equal_split() { + let inputs = vec![ + format!("{}:50", TEST_PUBKEY), + format!("{}:50", TEST_PUBKEY_2), + ]; + let parsed = parse_recipients(&inputs).unwrap(); + assert!(validate_recipients(&parsed).is_ok()); + } + + #[test] + fn test_parse_and_validate_uneven_split_fails() { + let inputs = vec![ + format!("{}:30", TEST_PUBKEY), + format!("{}:60", TEST_PUBKEY_2), + ]; + let parsed = parse_recipients(&inputs).unwrap(); + let result = validate_recipients(&parsed); + assert!(result.is_err()); + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/contributor_rewards.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/contributor_rewards.rs new file mode 100644 index 0000000000..02409ff14e --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/contributor_rewards.rs @@ -0,0 +1,77 @@ +use std::io::Write; + +use anyhow::{Result, bail}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::payer::{TransactionOutcome, Wallet}; +use doublezero_solana_sdk::{ + revenue_distribution::{ + ID, + instruction::{ + RevenueDistributionInstructionData, account::InitializeContributorRewardsAccounts, + }, + state::ContributorRewards, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::pubkey::Pubkey; + +#[derive(Debug, Args)] +pub struct ContributorRewardsCommand { + service_key: Pubkey, + + #[arg(long)] + initialize: bool, + + #[command(flatten)] + write_opts: crate::command::WriteVerbOptions, +} + +impl ContributorRewardsCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let ContributorRewardsCommand { + service_key, + initialize, + write_opts, + } = self; + + if !initialize { + bail!("Nothing to do. Please specify `--initialize`"); + } + + let wallet = crate::command::build_wallet(ctx, write_opts)?; + let wallet_key = wallet.pubkey(); + + let initialize_contributor_rewards_ix = try_build_instruction( + &ID, + InitializeContributorRewardsAccounts::new(&wallet_key, &service_key), + &RevenueDistributionInstructionData::InitializeContributorRewards(service_key), + )?; + + let mut compute_unit_limit = 10_000; + + let (_, bump) = ContributorRewards::find_address(&service_key); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let mut instructions = vec![ + initialize_contributor_rewards_ix, + ComputeBudgetInstruction::set_compute_unit_limit(compute_unit_limit), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_sig = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + writeln!(out, "Initialized contributor rewards: {tx_sig}")?; + + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + Ok(()) + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/convert_2z.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/convert_2z.rs new file mode 100644 index 0000000000..2d38167c36 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/convert_2z.rs @@ -0,0 +1,273 @@ +use std::io::Write; + +use anyhow::{Context, Result, ensure}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + instruction::take_instruction, + payer::{TransactionOutcome, Wallet}, + rpc::SolanaConnection, +}; +use doublezero_solana_sdk::{ + revenue_distribution::{env::mainnet::DOUBLEZERO_MINT_KEY, fetch::SolConversionState}, + sol_conversion::{ + ID, + instruction::{SolConversionInstructionData, account::BuySolAccounts}, + oracle, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{instruction::Instruction, program_pack::Pack, pubkey::Pubkey}; + +use crate::command::{ + revenue_distribution::try_request_oracle_conversion_price, try_prompt_proceed_confirmation, +}; + +#[derive(Debug, Args, Clone)] +pub struct Convert2zCommand { + /// Limit price defaults to the current SOL/2Z oracle price. + #[arg(long, value_name = "2Z_SOL_PRICE")] + limit_price: Option, + + /// Token account must be owned by the signer. Defaults to signer ATA if not + /// specified. + #[arg(long, value_name = "PUBKEY")] + source_2z_account: Option, + + /// Explicitly check SOL amount. When specified, this amount will be checked + /// against the fixed fill quantity. + #[arg(long, value_name = "SOL")] + checked_sol_amount: Option, + + #[command(flatten)] + write_opts: crate::command::WriteVerbOptions, +} + +impl Convert2zCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let Self { + limit_price: limit_price_str, + source_2z_account: source_token_account_key, + checked_sol_amount: checked_sol_amount_str, + write_opts, + } = self; + + let mut wallet = crate::command::build_wallet(ctx, write_opts)?; + + let checked_lamports = match checked_sol_amount_str { + Some(checked_sol_amount_str) => { + let checked_lamports = + crate::utils::parse_sol_amount_to_lamports(checked_sol_amount_str)?; + + try_prompt_proceed_confirmation( + out, + &format!( + "You are converting 2Z to exactly {:0.9} SOL", + checked_lamports as f64 * 1e-9 + ), + "Aborting command with --checked-sol-amount", + )?; + + Some(checked_lamports) + } + None => None, + }; + + let sol_conversion_state = SolConversionState::try_fetch(&wallet.connection).await?; + let fixed_fill_quantity = sol_conversion_state.fixed_fill_quantity; + + let mut convert_2z_context = Convert2zContext::try_prepare( + &wallet, + &sol_conversion_state, + limit_price_str, + source_token_account_key, + checked_lamports, + ) + .await?; + let buy_sol_ix = take_instruction(&mut convert_2z_context.instruction); + + let balance_before = convert_2z_context + .try_token_balance(&wallet.connection) + .await?; + writeln!(out, "2Z token balance: {:.8}", balance_before as f64 * 1e-8)?; + + let mut instructions = vec![ + buy_sol_ix, + ComputeBudgetInstruction::set_compute_unit_limit( + Convert2zContext::BUY_SOL_COMPUTE_UNIT_LIMIT, + ), + ]; + + if let Some(compute_unit_price_ix) = wallet.compute_unit_price_ix.as_mut() { + instructions.push(take_instruction(compute_unit_price_ix)); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_sig = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + writeln!(out, "Converted 2Z to SOL: {tx_sig}")?; + + let balance_after = convert_2z_context + .try_token_balance(&wallet.connection) + .await?; + writeln!( + out, + "Converted {:.8} 2Z tokens to {:.9} SOL", + (balance_before - balance_after) as f64 * 1e-8, + (fixed_fill_quantity as f64 * 1e-9) + )?; + + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + Ok(()) + } +} + +// + +fn parse_limit_price_to_u64(bid_price_str: String) -> Result { + const RATE_PRECISION: f64 = + doublezero_solana_sdk::sol_conversion::oracle::RATE_PRECISION as f64; + + let bid_price_str = bid_price_str.trim(); + ensure!(!bid_price_str.is_empty(), "Bid price cannot be empty"); + + let bid_price = bid_price_str + .parse::() + .map_err(|_| anyhow::anyhow!("Invalid bid price: '{bid_price_str}'"))?; + ensure!(bid_price > 0.0, "Bid price must be a positive value"); + ensure!( + bid_price <= (u64::MAX as f64 / RATE_PRECISION), + "Bid price too large" + ); + + // Check that value is at most 8 decimal places. + if let Some(decimal_index) = bid_price_str.find('.') { + let decimal_places = bid_price_str.len() - decimal_index - 1; + ensure!( + decimal_places <= 8, + "Bid price cannot have more than 8 decimal places" + ); + } + + Ok((bid_price * RATE_PRECISION).round() as u64) +} + +pub fn unwrap_token_account_or_ata( + wallet: &Wallet, + source_token_account_key: Option, +) -> Pubkey { + source_token_account_key.unwrap_or( + spl_associated_token_account_interface::address::get_associated_token_address( + &wallet.pubkey(), + &DOUBLEZERO_MINT_KEY, + ), + ) +} + +pub struct Convert2zContext { + pub instruction: Instruction, + pub user_token_account_key: Pubkey, + pub limit_price: u64, + pub discount_params: oracle::DiscountParameters, +} + +impl Convert2zContext { + pub const BUY_SOL_COMPUTE_UNIT_LIMIT: u32 = 80_000; + + pub async fn try_prepare( + wallet: &Wallet, + sol_conversion_state: &SolConversionState, + limit_price_str: Option, + source_token_account_key: Option, + checked_lamports: Option, + ) -> Result { + let network_env = wallet.connection.try_network_environment().await?; + ensure!( + network_env.is_mainnet_beta(), + "2Z conversion is only supported on mainnet-beta" + ); + let wallet_key = wallet.pubkey(); + + let SolConversionState { + program_state: (_, sol_conversion_program_state), + configuration_registry: _, + journal: (_, journal), + fixed_fill_quantity, + } = sol_conversion_state; + + let required_lamports = *fixed_fill_quantity; + ensure!( + journal.total_sol_balance >= required_lamports, + "Not enough SOL liquidity to cover conversion" + ); + + if let Some(specified_lamports) = checked_lamports { + ensure!( + specified_lamports == required_lamports, + "SOL amount must be {:0.9} for 2Z -> SOL conversion. Got {:0.9}", + required_lamports as f64 * 1e-9, + specified_lamports as f64 * 1e-9, + ); + } + + let user_token_account_key = unwrap_token_account_or_ata(wallet, source_token_account_key); + + let current_slot = wallet.connection.get_slot().await?; + let oracle_price_data = try_request_oracle_conversion_price().await?; + + // Compute discount. + let discount_params = oracle::DiscountParameters::from_configuration_registry( + &sol_conversion_state.configuration_registry.1, + ); + + let discount = discount_params + .checked_compute(current_slot - sol_conversion_state.program_state.1.last_trade_slot) + .context("Failed to calculate discount")?; + let discounted_swap_rate = + oracle::checked_discounted_swap_rate(oracle_price_data.swap_rate, discount).unwrap(); + + let limit_price = match limit_price_str { + Some(limit_price_str) => parse_limit_price_to_u64(limit_price_str)?, + None => discounted_swap_rate, + }; + + let instruction = try_build_instruction( + &ID, + BuySolAccounts::new( + &sol_conversion_program_state.fills_registry_key, + &user_token_account_key, + &DOUBLEZERO_MINT_KEY, + &wallet_key, + ), + &SolConversionInstructionData::BuySol { + limit_price, + oracle_price_data, + }, + ) + .context("Failed to build buy SOL instruction")?; + + Ok(Self { + instruction, + user_token_account_key, + limit_price, + discount_params, + }) + } + + pub async fn try_token_balance(&self, connection: &SolanaConnection) -> Result { + let user_token_account_key = self.user_token_account_key; + + let token_account = connection + .get_account(&user_token_account_key) + .await + .with_context(|| format!("2Z token account not found: {user_token_account_key}"))?; + + spl_token_interface::state::Account::unpack(&token_account.data) + .map(|account| account.amount) + .with_context(|| format!("Account {user_token_account_key} not token account")) + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/config.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/config.rs new file mode 100644 index 0000000000..d2a84833d8 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/config.rs @@ -0,0 +1,374 @@ +use std::io::Write; + +use anyhow::Result; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::rpc::SolanaConnectionOptions; +use doublezero_solana_sdk::{ + environment_2z_token_mint_key, + revenue_distribution::{ + fetch::try_fetch_config, + state::{CommunityBurnRateMode, Journal}, + }, +}; +use spl_associated_token_account_interface::address::get_associated_token_address; + +#[derive(Debug, Args)] +pub struct ConfigCommand { + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +#[derive(Debug, tabled::Tabled)] +struct ConfigTableRow { + field: &'static str, + value: String, + note: String, +} + +impl ConfigCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let Self { connection_options } = self; + let connection = crate::command::solana_connection(ctx, &connection_options); + let (config_key, config) = try_fetch_config(&connection).await?; + + if config.is_paused() { + writeln!(out, "⚠️ Warning: Program is paused")?; + writeln!(out)?; + } + + let network_env = + crate::command::resolve_network_env(&connection, connection_options.moniker_env()) + .await?; + let dz_mint_key = environment_2z_token_mint_key(network_env); + + let (journal_key, _) = Journal::find_address(); + let journal_ata = get_associated_token_address(&journal_key, &dz_mint_key); + + let distribution_parameters = &config.distribution_parameters; + let community_burn_rate_params = &distribution_parameters.community_burn_rate_parameters; + let community_burn_rate_mode = community_burn_rate_params.mode(); + let validator_fee_params = &distribution_parameters.solana_validator_fee_parameters; + + let mut value_rows = vec![ + ConfigTableRow { + field: "PDA key", + value: config_key.to_string(), + note: Default::default(), + }, + ConfigTableRow { + field: "2Z Token key", + value: dz_mint_key.to_string(), + note: Default::default(), + }, + ConfigTableRow { + field: "Journal key", + value: journal_key.to_string(), + note: Default::default(), + }, + ConfigTableRow { + field: "Direct 2Z Payment key", + value: journal_ata.to_string(), + note: "Journal's ATA".to_string(), + }, + ConfigTableRow { + field: "Administrator", + value: config.admin_key.to_string(), + note: Default::default(), + }, + ConfigTableRow { + field: "Debt accountant", + value: config.debt_accountant_key.to_string(), + note: Default::default(), + }, + ConfigTableRow { + field: "Rewards accountant", + value: config.rewards_accountant_key.to_string(), + note: Default::default(), + }, + ConfigTableRow { + field: "Contributor manager", + value: config.contributor_manager_key.to_string(), + note: Default::default(), + }, + ConfigTableRow { + field: "SOL Conversion program", + value: config.sol_2z_swap_program_id.to_string(), + note: Default::default(), + }, + ConfigTableRow { + field: "Next distribution", + value: config.next_completed_dz_epoch.value().to_string(), + note: "Current DoubleZero Ledger epoch".to_string(), + }, + ConfigTableRow { + field: "Calculation grace period", + value: format!( + "{:?}", + std::time::Duration::from_secs( + u64::from( + config + .distribution_parameters + .calculation_grace_period_minutes, + ) * 60, + ) + ), + note: Default::default(), + }, + ConfigTableRow { + field: "Duration to finalize rewards", + value: format!( + "{} epochs", + config + .distribution_parameters + .minimum_epoch_duration_to_finalize_rewards + ), + note: "Minimum number required for distribution".to_string(), + }, + ConfigTableRow { + field: "Next community burn rate", + value: format!( + "({}) {:.7}%", + community_burn_rate_params.mode().to_string().to_lowercase(), + u32::from(community_burn_rate_params.next_burn_rate().unwrap()) as f64 + / 10_000_000.0, + ), + note: "Burn rate for the next distribution".to_string(), + }, + ConfigTableRow { + field: "Community burn rate limit", + value: format!( + "{:.7}%", + u32::from(community_burn_rate_params.limit) as f64 / 10_000_000.0 + ), + note: "Absolute maximum burn rate".to_string(), + }, + ]; + + match community_burn_rate_mode { + CommunityBurnRateMode::Static => { + value_rows.push(ConfigTableRow { + field: "Community burn rate increases after", + value: format!( + "{} epoch{}", + community_burn_rate_params.dz_epochs_to_increasing, + if community_burn_rate_params.dz_epochs_to_increasing == 1 { + "" + } else { + "s" + }, + ), + note: "How long until the rate increases".to_string(), + }); + value_rows.push(ConfigTableRow { + field: "Community burn rate limit reached after", + value: format!( + "{} epoch{}", + community_burn_rate_params.dz_epochs_to_limit, + if community_burn_rate_params.dz_epochs_to_limit == 1 { + "" + } else { + "s" + } + ), + note: "How long until the limit is reached".to_string(), + }); + } + CommunityBurnRateMode::Increasing => { + value_rows.push(ConfigTableRow { + field: "Community burn rate limit reached after", + value: format!( + "{} epoch{}", + community_burn_rate_params.dz_epochs_to_limit, + if community_burn_rate_params.dz_epochs_to_limit == 1 { + "" + } else { + "s" + } + ), + note: "How long until the limit is reached".to_string(), + }); + } + CommunityBurnRateMode::Limit => {} + } + + let validator_fee_rows = vec![ + ConfigTableRow { + field: "Solana validator base block rewards fee", + value: format!( + "{:.2}%", + u16::from(validator_fee_params.base_block_rewards_pct) as f64 / 100.0 + ), + note: "Proportion of base block rewards charged".to_string(), + }, + ConfigTableRow { + field: "Solana validator priority block rewards fee", + value: format!( + "{:.2}%", + u16::from(validator_fee_params.priority_block_rewards_pct) as f64 / 100.0 + ), + note: "Proportion of priority block rewards charged".to_string(), + }, + ConfigTableRow { + field: "Solana validator inflation rewards fee", + value: format!( + "{:.2}%", + u16::from(validator_fee_params.inflation_rewards_pct) as f64 / 100.0 + ), + note: "Proportion of inflation rewards charged".to_string(), + }, + ConfigTableRow { + field: "Solana validator Jito tips fee", + value: format!( + "{:.2}%", + u16::from(validator_fee_params.jito_tips_pct) as f64 / 100.0 + ), + note: "Proportion of Jito tips charged".to_string(), + }, + ConfigTableRow { + field: "Solana validator fixed SOL fee", + value: format!( + "{:.9} SOL", + validator_fee_params.fixed_sol_amount as f64 * 1e-9 + ), + note: "Fixed SOL amount charged".to_string(), + }, + ]; + value_rows.extend(validator_fee_rows); + + let (write_off_value, write_off_note) = format_write_off_activation_epoch( + config.debt_write_off_feature_activation_epoch.value(), + config.is_debt_write_off_feature_activated(), + ); + value_rows.push(ConfigTableRow { + field: "Solana validator debt write-off activation", + value: write_off_value, + note: write_off_note, + }); + + super::write_table( + out, + value_rows, + super::TableOptions { + columns_aligned_right: Some(&[1]), + }, + )?; + + Ok(()) + } +} + +fn format_write_off_activation_epoch( + activation_epoch: u64, + is_activated: bool, +) -> (String, String) { + if activation_epoch == 0 { + ("disabled".to_string(), String::new()) + } else if is_activated { + (format!("epoch {activation_epoch}"), "Active".to_string()) + } else { + (format!("epoch {activation_epoch}"), "Pending".to_string()) + } +} + +#[derive(Debug, Args)] +pub struct ValidatorFeesCommand { + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +impl ValidatorFeesCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let Self { connection_options } = self; + let connection = crate::command::solana_connection(ctx, &connection_options); + let (_, config) = try_fetch_config(&connection).await?; + + let mut value_rows = Vec::new(); + + if let Some(fee_params) = config.checked_solana_validator_fee_parameters() { + if fee_params.base_block_rewards_pct != Default::default() { + value_rows.push(ConfigTableRow { + field: "Base block rewards fee", + value: format!( + "{:.2}%", + u16::from(fee_params.base_block_rewards_pct) as f64 / 100.0 + ), + note: "Amount charged to Solana validators for base block rewards".to_string(), + }); + } + if fee_params.priority_block_rewards_pct != Default::default() { + value_rows.push(ConfigTableRow { + field: "Priority block rewards fee", + value: format!( + "{:.2}%", + u16::from(fee_params.priority_block_rewards_pct) as f64 / 100.0 + ), + note: "Amount charged to Solana validators for priority block rewards" + .to_string(), + }); + } + if fee_params.inflation_rewards_pct != Default::default() { + value_rows.push(ConfigTableRow { + field: "Inflation rewards fee", + value: format!( + "{:.2}%", + u16::from(fee_params.inflation_rewards_pct) as f64 / 100.0 + ), + note: "Amount charged to Solana validators for inflation rewards".to_string(), + }); + } + if fee_params.jito_tips_pct != Default::default() { + value_rows.push(ConfigTableRow { + field: "Jito tips fee", + value: format!("{:.2}%", u16::from(fee_params.jito_tips_pct) as f64 / 100.0), + note: "Amount charged to Solana validators for Jito tips".to_string(), + }); + } + if fee_params.fixed_sol_amount != 0 { + value_rows.push(ConfigTableRow { + field: "Fixed SOL fee", + value: format!("{:.9} SOL", fee_params.fixed_sol_amount as f64 * 1e-9), + note: "Fixed SOL amount charged to Solana validators".to_string(), + }); + } + } + + if value_rows.is_empty() { + writeln!( + out, + "... Solana validator fee parameters not configured yet" + )?; + return Ok(()); + } + + super::write_table(out, value_rows, Default::default())?; + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_format_write_off_activation_epoch_disabled() { + let (value, note) = format_write_off_activation_epoch(0, false); + assert_eq!(value, "disabled"); + assert_eq!(note, ""); + } + + #[test] + fn test_format_write_off_activation_epoch_pending() { + let (value, note) = format_write_off_activation_epoch(42, false); + assert_eq!(value, "epoch 42"); + assert_eq!(note, "Pending"); + } + + #[test] + fn test_format_write_off_activation_epoch_active() { + let (value, note) = format_write_off_activation_epoch(42, true); + assert_eq!(value, "epoch 42"); + assert_eq!(note, "Active"); + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/contributor_rewards.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/contributor_rewards.rs new file mode 100644 index 0000000000..c4131938fc --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/contributor_rewards.rs @@ -0,0 +1,341 @@ +use std::io::Write; + +use anyhow::{Context, Result, bail}; +use clap::{Args, ValueEnum}; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + rpc::{SolanaConnection, SolanaConnectionOptions}, +}; +use doublezero_solana_sdk::{ + PrecomputedDiscriminator, environment_2z_token_mint_key, + revenue_distribution::{self, state::ContributorRewards}, +}; +use solana_account_decoder_client_types::UiAccountEncoding; +use solana_client::{ + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_sdk::pubkey::Pubkey; +use spl_associated_token_account_interface::address::get_associated_token_address_and_bump_seed; +use tabled::Tabled; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum, Default)] +pub enum ContributorRewardsViewMode { + #[default] + Summary, + Recipients, +} + +#[derive(Debug, Args)] +pub struct ContributorRewardsCommand { + #[arg(long)] + service_key: Option, + + #[arg(long)] + manager: Option, + + #[arg(long, value_enum, default_value = "summary")] + view: ContributorRewardsViewMode, + + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +#[derive(Debug, Tabled)] +struct ContributorRewardsSummaryRow { + service_key: Pubkey, + manager: String, + blocks_protocol_management: &'static str, + recipients_configured_count: u8, +} + +#[derive(Debug, Tabled)] +struct ContributorRewardsRecipientRow { + index: usize, + recipient: Pubkey, + ata: Pubkey, + proportion: String, +} + +impl ContributorRewardsCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let Self { + service_key, + manager, + view, + connection_options, + } = self; + + // Validate: --service-key and --manager are mutually exclusive + if service_key.is_some() && manager.is_some() { + bail!("--service-key and --manager are mutually exclusive, please specify only one."); + } + + // Validate: recipients view requires --service-key + if view == ContributorRewardsViewMode::Recipients && service_key.is_none() { + bail!("--view recipients requires --service-key to be specified"); + } + + let connection = crate::command::solana_connection(ctx, &connection_options); + + match view { + ContributorRewardsViewMode::Summary => { + try_write_summary_view(out, &connection, service_key, manager).await + } + ContributorRewardsViewMode::Recipients => { + try_write_recipients_view(out, &connection, service_key.unwrap()).await + } + } + } +} + +async fn try_write_summary_view( + out: &mut impl Write, + connection: &SolanaConnection, + service_key: Option, + manager_filter: Option, +) -> Result<()> { + let accounts = if let Some(service_key) = service_key { + let (pda_key, _) = ContributorRewards::find_address(&service_key); + + match connection + .try_fetch_zero_copy_data::(&pda_key) + .await + { + Ok(data) => vec![(pda_key, data)], + Err(_) => { + bail!("No contributor rewards account found for service key {service_key}"); + } + } + } else { + let mut filters = vec![RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 0, + ContributorRewards::discriminator_slice().to_vec(), + ))]; + + if let Some(manager) = manager_filter { + filters.push(RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 8, + manager.to_bytes().to_vec(), + ))); + } + + let config = RpcProgramAccountsConfig { + filters: Some(filters), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + + connection + .get_program_accounts_with_config(&revenue_distribution::ID, config) + .await? + .into_iter() + .filter_map(|(key, account)| { + ZeroCopyAccountOwnedData::::from_account(&account) + .map(|data| (key, data)) + }) + .collect() + }; + + if accounts.is_empty() { + if manager_filter.is_some() { + bail!("No contributor rewards accounts found for the specified manager"); + } else { + bail!("No contributor rewards accounts found"); + } + } + + let mut rows: Vec = accounts + .iter() + .map(|(_, data)| { + let recipient_count = data.recipient_shares.active_iter().count() as u8; + let manager_display = if data.rewards_manager_key == Pubkey::default() { + String::new() + } else { + data.rewards_manager_key.to_string() + }; + ContributorRewardsSummaryRow { + service_key: data.service_key, + manager: manager_display, + blocks_protocol_management: if data.is_set_rewards_manager_blocked() { + "yes" + } else { + "no" + }, + recipients_configured_count: recipient_count, + } + }) + .collect(); + + // Sort by service_key for consistent output + rows.sort_by_key(|row| row.service_key.to_string()); + + super::write_table( + out, + rows, + super::TableOptions { + columns_aligned_right: Some(&[2, 3]), + }, + )?; + + Ok(()) +} + +async fn try_write_recipients_view( + out: &mut impl Write, + connection: &SolanaConnection, + service_key: Pubkey, +) -> Result<()> { + let (pda_key, _) = ContributorRewards::find_address(&service_key); + + let data = connection + .try_fetch_zero_copy_data::(&pda_key) + .await + .with_context(|| format!("Contributor rewards not found for service key {service_key}"))?; + + let network_env = connection.try_network_environment().await?; + let dz_mint_key = environment_2z_token_mint_key(network_env); + + let rows: Vec = data + .recipient_shares + .active_iter() + .enumerate() + .map(|(index, share)| { + let (ata, _) = get_associated_token_address_and_bump_seed( + &share.recipient_key, + &dz_mint_key, + &spl_associated_token_account_interface::program::ID, + &spl_token_interface::ID, + ); + + let proportion_pct = u16::from(share.share) as f64 / 100.0; + + ContributorRewardsRecipientRow { + index, + recipient: share.recipient_key, + ata, + proportion: format!("{:.2}%", proportion_pct), + } + }) + .collect(); + + if rows.is_empty() { + bail!("No recipients configured for service key {service_key}"); + } + + super::write_table( + out, + rows, + super::TableOptions { + columns_aligned_right: Some(&[0, 3]), + }, + )?; + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + const UNIT_SHARE16_MAX: u16 = 10_000; + + fn format_proportion(share: u16) -> String { + format!("{:.2}%", share as f64 / 100.0) + } + + #[test] + fn test_proportion_formatting() { + // 100% = UNIT_SHARE16_MAX = 10,000 + assert_eq!(format_proportion(UNIT_SHARE16_MAX), "100.00%"); + // 50% = 5,000 + assert_eq!(format_proportion(UNIT_SHARE16_MAX / 2), "50.00%"); + // 25% = 2,500 + assert_eq!(format_proportion(UNIT_SHARE16_MAX / 4), "25.00%"); + // 1% = 100 + assert_eq!(format_proportion(100), "1.00%"); + // 0.01% = 1 (minimum non-zero) + assert_eq!(format_proportion(1), "0.01%"); + // 0% = 0 + assert_eq!(format_proportion(0), "0.00%"); + } + + #[test] + fn test_view_mode_default() { + assert_eq!( + ContributorRewardsViewMode::default(), + ContributorRewardsViewMode::Summary + ); + } + + #[tokio::test] + async fn test_recipients_view_requires_service_key() { + // Construct the command with Recipients view but no service_key + let cmd = ContributorRewardsCommand { + service_key: None, + manager: None, + view: ContributorRewardsViewMode::Recipients, + connection_options: SolanaConnectionOptions::default(), + }; + + let ctx = doublezero_cli_core::testing::cli_context_default_for_tests(); + let mut out = Vec::new(); + + // Call the real execute method - validation happens before any RPC calls + let result = cmd.execute(&ctx, &mut out).await; + + // Must be an error + assert!( + result.is_err(), + "Expected error when --service-key is missing" + ); + + let err_msg = result.unwrap_err().to_string(); + + // Error message must mention both the view mode and the required flag + assert!( + err_msg.contains("--service-key"), + "Error should mention --service-key, got: {err_msg}" + ); + assert!( + err_msg.contains("recipients"), + "Error should mention recipients view, got: {err_msg}" + ); + } + + #[tokio::test] + async fn test_service_key_and_manager_mutually_exclusive() { + let cmd = ContributorRewardsCommand { + service_key: Some(Pubkey::new_unique()), + manager: Some(Pubkey::new_unique()), + view: ContributorRewardsViewMode::Summary, + connection_options: SolanaConnectionOptions::default(), + }; + + let ctx = doublezero_cli_core::testing::cli_context_default_for_tests(); + let mut out = Vec::new(); + + // Call the real execute method - validation happens before any RPC calls + let result = cmd.execute(&ctx, &mut out).await; + + assert!( + result.is_err(), + "Expected error when both --service-key and --manager are provided" + ); + + let err_msg = result.unwrap_err().to_string(); + + assert!( + err_msg.contains("--service-key") && err_msg.contains("--manager"), + "Error should mention both flags, got: {err_msg}" + ); + assert!( + err_msg.contains("mutually exclusive"), + "Error should mention mutual exclusivity, got: {err_msg}" + ); + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/distribution.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/distribution.rs new file mode 100644 index 0000000000..0ccbf840a9 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/distribution.rs @@ -0,0 +1,645 @@ +use std::{collections::HashMap, io::Write}; + +use anyhow::{Context, Result, ensure}; +use clap::{Args, ValueEnum}; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + rpc::{ + DoubleZeroLedgerConnection, DoubleZeroLedgerEnvironmentOverride, SolanaConnection, + SolanaConnectionOptions, + }, +}; +use doublezero_solana_sdk::{ + DOUBLEZERO_MINT_DECIMALS, + revenue_distribution::{ + fetch::{try_fetch_config, try_fetch_distribution}, + state::{Distribution, SolanaValidatorDeposit}, + types::UnitShare32, + }, +}; +use solana_client::{ + rpc_config::RpcProgramAccountsConfig, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_sdk::{native_token::LAMPORTS_PER_SOL, pubkey::Pubkey}; +use tabled::Tabled; + +use crate::command::revenue_distribution::{ + fetch::{TableOptions, write_table}, + try_distribution_rewards_iter, try_distribution_solana_validator_debt_iter, + try_fetch_shapley_record, +}; + +#[derive(Debug, Clone, PartialEq, Eq, ValueEnum)] +pub enum DistributionViewMode { + Summary, + ValidatorDebt, + UnprocessedValidatorDebt, + WrittenOffValidatorDebt, + Rewards, +} + +#[derive(Debug, Args)] +pub struct DistributionCommand { + #[arg(long, short = 'e')] + dz_epoch: Option, + + #[arg(long, value_enum, default_value = "summary")] + view: DistributionViewMode, + + #[arg(hide = true, long)] + debt_accountant: Option, + + #[arg(hide = true, long)] + rewards_accountant: Option, + + #[command(flatten)] + connection_options: SolanaConnectionOptions, + + #[command(flatten)] + dz_env: DoubleZeroLedgerEnvironmentOverride, +} + +#[derive(Debug, Tabled)] +struct DistributionSummaryTableRow { + field: &'static str, + value: String, + note: String, +} + +#[derive(Debug, Tabled)] +struct DistributionSolanaValidatorDebtTableRow { + dz_epoch: u64, + solana_epoch: String, + index: usize, + node_id: String, + amount: String, + deposit_balance: String, + processed: &'static str, + written_off: &'static str, + note: String, +} + +#[derive(Debug, Tabled)] +struct DistributionRewardsTableRow { + dz_epoch: u64, + index: usize, + contributor: String, + proportion: String, + reward: String, + distributed: &'static str, +} + +impl DistributionCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let Self { + dz_epoch, + view: view_mode, + debt_accountant: debt_accountant_key, + rewards_accountant: rewards_accountant_key, + connection_options, + dz_env, + } = self; + + let solana_connection = crate::command::solana_connection(ctx, &connection_options); + + let dz_connection = match dz_env.dz_env { + Some(e) => DoubleZeroLedgerConnection::from(e), + None => DoubleZeroLedgerConnection::new(ctx.ledger_rpc_url.clone()), + }; + + let (_, config) = try_fetch_config(&solana_connection).await?; + + let epoch_value = match dz_epoch { + Some(epoch) => epoch, + None => config.next_completed_dz_epoch.value().saturating_sub(1), + }; + + let debt_accountant_key = debt_accountant_key.unwrap_or(config.debt_accountant_key); + + let (distribution_key, distribution) = + try_fetch_distribution(&solana_connection, epoch_value).await?; + + match view_mode { + DistributionViewMode::Summary => { + try_write_distribution_summary_table( + out, + &dz_connection, + &distribution_key, + &distribution, + &debt_accountant_key, + ) + .await + } + DistributionViewMode::ValidatorDebt + | DistributionViewMode::UnprocessedValidatorDebt + | DistributionViewMode::WrittenOffValidatorDebt => { + ensure!( + distribution.is_debt_calculation_finalized(), + "Debt calculation is not finalized yet" + ); + + try_write_distribution_debt_table( + out, + &solana_connection, + &dz_connection, + &debt_accountant_key, + &distribution, + view_mode, + ) + .await + } + DistributionViewMode::Rewards => { + ensure!( + distribution.is_rewards_calculation_finalized(), + "Rewards calculation is not finalized yet" + ); + + try_write_distribution_rewards_table( + out, + &dz_connection, + &rewards_accountant_key.unwrap_or(config.rewards_accountant_key), + &distribution, + ) + .await + } + } + } +} + +// + +async fn try_write_distribution_summary_table( + out: &mut impl Write, + dz_connection: &DoubleZeroLedgerConnection, + distribution_key: &Pubkey, + distribution: &Distribution, + debt_accountant_key: &Pubkey, +) -> Result<()> { + let dz_epoch = distribution.dz_epoch.value(); + + let mut value_rows = vec![ + DistributionSummaryTableRow { + field: "Distribution", + value: dz_epoch.to_string(), + note: "Epoch of DoubleZero Ledger Network".to_string(), + }, + DistributionSummaryTableRow { + field: "PDA key", + value: distribution_key.to_string(), + note: Default::default(), + }, + DistributionSummaryTableRow { + field: "Community burn rate", + value: format!( + "{:.7}%", + u32::from(distribution.community_burn_rate) as f64 / 10_000_000.0 + ), + note: "Lower-bound proportion of rewards burned".to_string(), + }, + DistributionSummaryTableRow { + field: "Collected 2Z payments", + value: format!( + "{:.1} 2Z", + distribution.collected_prepaid_2z_payments as f64 + / f64::powi(10.0, DOUBLEZERO_MINT_DECIMALS as i32), + ), + note: "Includes direct 2Z payments".to_string(), + }, + ]; + + let fee_parameters = distribution.solana_validator_fee_parameters; + + if fee_parameters.base_block_rewards_pct != Default::default() { + value_rows.push(DistributionSummaryTableRow { + field: "Solana validator base block rewards fee", + value: format!( + "{:.2}%", + u16::from(fee_parameters.base_block_rewards_pct) as f64 / 100.0 + ), + note: "Proportion of base block rewards charged".to_string(), + }); + } + if fee_parameters.priority_block_rewards_pct != Default::default() { + value_rows.push(DistributionSummaryTableRow { + field: "Solana validator priority block rewards fee", + value: format!( + "{:.2}%", + u16::from(fee_parameters.priority_block_rewards_pct) as f64 / 100.0 + ), + note: "Proportion of priority block rewards charged".to_string(), + }); + } + if fee_parameters.inflation_rewards_pct != Default::default() { + value_rows.push(DistributionSummaryTableRow { + field: "Solana validator inflation rewards fee", + value: format!( + "{:.2}%", + u16::from(fee_parameters.inflation_rewards_pct) as f64 / 100.0 + ), + note: "Proportion of inflation rewards charged".to_string(), + }); + } + if fee_parameters.jito_tips_pct != Default::default() { + value_rows.push(DistributionSummaryTableRow { + field: "Solana validator Jito tips fee", + value: format!( + "{:.2}%", + u16::from(fee_parameters.jito_tips_pct) as f64 / 100.0 + ), + note: "Proportion of Jito tips charged".to_string(), + }); + } + if fee_parameters.fixed_sol_amount != 0 { + value_rows.push(DistributionSummaryTableRow { + field: "Fixed SOL fee", + value: format!("{:.9} SOL", fee_parameters.fixed_sol_amount as f64 * 1e-9), + note: "Fixed SOL amount charged".to_string(), + }); + } + + // Add rows for Solana validator debt if the root has been posted. + let solana_validator_debt_merkle_root = distribution.solana_validator_debt_merkle_root; + let has_solana_validator_debt = solana_validator_debt_merkle_root != Default::default(); + + if has_solana_validator_debt { + let (_, computed_debt) = doublezero_solana_validator_debt::ledger::try_fetch_debt_record( + dz_connection, + debt_accountant_key, + dz_epoch, + dz_connection.commitment(), + ) + .await?; + + // Unlikely to happen, but there can be multiple Solana epochs per DZ epoch. + if !computed_debt.debts.is_empty() { + value_rows.push(DistributionSummaryTableRow { + field: "Solana epoch", + value: (computed_debt.first_solana_epoch..=computed_debt.last_solana_epoch) + .map(|epoch| epoch.to_string()) + .collect::>() + .join(","), + note: Default::default(), + }); + }; + + let unpaid_solana_validators_count = + distribution.total_solana_validators - distribution.solana_validator_payments_count; + + let more_rows = vec![ + DistributionSummaryTableRow { + field: "Solana validator debt merkle root", + value: solana_validator_debt_merkle_root.to_string(), + note: if distribution.is_debt_calculation_finalized() { + "Final".to_string() + } else { + "Staged".to_string() + }, + }, + DistributionSummaryTableRow { + field: "Solana validators processed debt count", + value: format!( + "{} / {}", + distribution.solana_validator_payments_count, + distribution.total_solana_validators, + ), + note: format!( + "{} {} not paid", + unpaid_solana_validators_count, + if unpaid_solana_validators_count == 1 { + "has" + } else { + "have" + } + ), + }, + DistributionSummaryTableRow { + field: "Total Solana validator payments", + value: format!( + "{:.9} SOL", + distribution.collected_solana_validator_payments as f64 + / LAMPORTS_PER_SOL as f64, + ), + note: format!( + "{:.3}% collected", + distribution.collected_solana_validator_payments as f64 * 100.0 + / distribution.total_solana_validator_debt as f64 + ), + }, + DistributionSummaryTableRow { + field: "Uncollected Solana validator debt", + value: format!( + "{:.9} SOL", + (distribution.total_solana_validator_debt + - distribution.collected_solana_validator_payments) + as f64 + / LAMPORTS_PER_SOL as f64, + ), + note: if distribution.is_solana_validator_debt_write_off_enabled() { + "Write-off enabled".to_string() + } else { + Default::default() + }, + }, + DistributionSummaryTableRow { + field: "SOL to be exchanged", + value: format!( + "{:.9} SOL", + distribution.checked_total_sol_debt().unwrap() as f64 / LAMPORTS_PER_SOL as f64, + ), + note: if distribution.uncollectible_sol_debt == 0 { + Default::default() + } else { + format!( + "{:.9} SOL written off", + distribution.uncollectible_sol_debt as f64 / LAMPORTS_PER_SOL as f64 + ) + }, + }, + ]; + value_rows.extend(more_rows); + } else { + value_rows.push(DistributionSummaryTableRow { + field: "Solana validator debt merkle root", + value: solana_validator_debt_merkle_root.to_string(), + note: if distribution.is_debt_calculation_finalized() { + "Final".to_string() + } else { + "Not posted".to_string() + }, + }); + } + + // Add rows for rewards if the root has been posted. + let rewards_merkle_root = distribution.rewards_merkle_root; + let has_rewards = rewards_merkle_root != Default::default(); + + if has_rewards { + let more_rows = vec![ + DistributionSummaryTableRow { + field: "Rewards merkle root", + value: rewards_merkle_root.to_string(), + note: if distribution.is_rewards_calculation_finalized() { + "Final".to_string() + } else { + "Staged".to_string() + }, + }, + DistributionSummaryTableRow { + field: "Contributors distributed rewards count", + value: format!( + "{} / {}", + distribution.distributed_rewards_count, distribution.total_contributors + ), + note: format!( + "{} remaining", + distribution.total_contributors - distribution.distributed_rewards_count + ), + }, + DistributionSummaryTableRow { + field: "Total distributed rewards", + value: format!( + "{:.1} 2Z", + distribution.distributed_2z_amount as f64 + / f64::powi(10.0, DOUBLEZERO_MINT_DECIMALS as i32), + ), + note: Default::default(), + }, + DistributionSummaryTableRow { + field: "Total burned rewards", + value: format!( + "{:.1} 2Z", + distribution.burned_2z_amount as f64 + / f64::powi(10.0, DOUBLEZERO_MINT_DECIMALS as i32), + ), + note: Default::default(), + }, + DistributionSummaryTableRow { + field: "Total remaining 2Z rewards", + value: format!( + "{:.1} 2Z", + (distribution.total_collected_2z_tokens() + - distribution.distributed_2z_amount + - distribution.burned_2z_amount) as f64 + / f64::powi(10.0, DOUBLEZERO_MINT_DECIMALS as i32), + ), + note: Default::default(), + }, + ]; + value_rows.extend(more_rows); + } else { + value_rows.push(DistributionSummaryTableRow { + field: "Rewards merkle root", + value: rewards_merkle_root.to_string(), + note: if distribution.is_rewards_calculation_finalized() { + "Final".to_string() + } else { + "Not posted".to_string() + }, + }); + } + + write_table( + out, + value_rows, + TableOptions { + columns_aligned_right: Some(&[1]), + }, + )?; + + Ok(()) +} + +async fn try_write_distribution_debt_table( + out: &mut impl Write, + solana_connection: &SolanaConnection, + dz_connection: &DoubleZeroLedgerConnection, + debt_accountant_key: &Pubkey, + distribution: &ZeroCopyAccountOwnedData, + view_mode: DistributionViewMode, +) -> Result<()> { + let dz_epoch = distribution.dz_epoch.value(); + + let (_, computed_debt) = doublezero_solana_validator_debt::ledger::try_fetch_debt_record( + dz_connection, + debt_accountant_key, + dz_epoch, + dz_connection.commitment(), + ) + .await?; + + if computed_debt.debts.is_empty() { + writeln!(out, "No debts found for DZ epoch {dz_epoch}")?; + return Ok(()); + } + + // Unlikely to happen, but there can be multiple Solana epochs per DZ epoch. + let solana_epoch = (computed_debt.first_solana_epoch..=computed_debt.last_solana_epoch) + .map(|epoch| epoch.to_string()) + .collect::>() + .join(","); + + let mut outputs = Vec::with_capacity(distribution.total_solana_validators as usize); + + let mut deposit_keys = Vec::with_capacity(computed_debt.debts.len()); + let mut cached_debt_amounts = Vec::with_capacity(computed_debt.debts.len()); + + for (leaf_index, debt, is_processed_leaf, is_written_off_leaf) in + try_distribution_solana_validator_debt_iter(distribution, &computed_debt)? + { + match view_mode { + DistributionViewMode::UnprocessedValidatorDebt => { + if is_processed_leaf { + continue; + } + } + DistributionViewMode::WrittenOffValidatorDebt => { + if !is_written_off_leaf { + continue; + } + } + _ => (), + } + + outputs.push(DistributionSolanaValidatorDebtTableRow { + dz_epoch, + solana_epoch: solana_epoch.clone(), + index: leaf_index, + node_id: debt.node_id.to_string(), + amount: format!("{:.9} SOL", debt.amount as f64 / LAMPORTS_PER_SOL as f64), + deposit_balance: Default::default(), + processed: if is_processed_leaf { "yes" } else { "no" }, + written_off: if is_written_off_leaf { "yes" } else { "no" }, + note: Default::default(), + }); + + deposit_keys.push(SolanaValidatorDeposit::find_address(&debt.node_id).0); + cached_debt_amounts.push(debt.amount); + } + + let rent_sysvar = solana_connection + .try_fetch_sysvar::() + .await?; + + let deposit_balances = solana_connection + .try_fetch_multiple_accounts(&deposit_keys) + .await? + .into_iter() + .map(|account_info| { + doublezero_solana_client_tools::account::balance(&account_info, &rent_sysvar) + }); + + for ((value_row, debt_amount), deposit_balance) in outputs + .iter_mut() + .zip(cached_debt_amounts) + .zip(deposit_balances) + { + value_row.deposit_balance = format!( + "{:.9} SOL", + deposit_balance as f64 / LAMPORTS_PER_SOL as f64 + ); + + if value_row.processed == "yes" { + continue; + } + + if deposit_balance < debt_amount { + if deposit_balance == 0 { + value_row.note = "Not funded".to_string() + } else { + value_row.note = format!( + "{:.9} SOL needed", + (debt_amount - deposit_balance) as f64 / LAMPORTS_PER_SOL as f64 + ); + } + } + } + + write_table( + out, + outputs, + TableOptions { + columns_aligned_right: Some(&[0, 1, 2, 4, 5, 6, 7]), + }, + )?; + + Ok(()) +} + +async fn try_write_distribution_rewards_table( + out: &mut impl Write, + dz_connection: &DoubleZeroLedgerConnection, + rewards_accountant_key: &Pubkey, + distribution: &ZeroCopyAccountOwnedData, +) -> Result<()> { + let dz_epoch = distribution.dz_epoch; + + // Grab all existing contributors. + // + // TODO: Support testnet? + let mut contributor_label_mapping = dz_connection + .get_program_accounts_with_config( + &doublezero_sdk::mainnet::program_id::ID, + RpcProgramAccountsConfig { + filters: Some(vec![RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 0, + borsh::to_vec(&doublezero_sdk::AccountType::Contributor)?, + ))]), + ..Default::default() + }, + ) + .await? + .into_iter() + .map(|(key, account_info)| { + let contributor = doublezero_sdk::Contributor::try_from(&account_info.data[..]) + .with_context(|| format!("Failed to deserialize contributor account {key}"))?; + Ok((contributor.owner, contributor.code)) + }) + .collect::>>()?; + + let shapley_record = + try_fetch_shapley_record(dz_connection, rewards_accountant_key, dz_epoch.value()).await?; + + // TODO: Revisit when economic burn rate is introduced. + let collected_rewards = distribution.total_collected_2z_tokens(); + let burnable_rewards = distribution + .community_burn_rate + .mul_scalar(collected_rewards); + let distributable_rewards = collected_rewards - burnable_rewards; + + let mut rewards_rows = Vec::with_capacity(distribution.total_contributors as usize); + + for (leaf_index, reward_share, is_processed_leaf) in + try_distribution_rewards_iter(distribution, &shapley_record)? + { + let proportion = reward_share.unit_share as f64 / u32::from(UnitShare32::MAX) as f64; + + let unit_share = reward_share.checked_unit_share().unwrap(); + let reward = unit_share.mul_scalar(distributable_rewards) as f64 + / f64::powi(10.0, DOUBLEZERO_MINT_DECIMALS as i32); + + let contributor_label = contributor_label_mapping + .remove(&reward_share.contributor_key) + .unwrap_or(reward_share.contributor_key.to_string()); + + rewards_rows.push(DistributionRewardsTableRow { + dz_epoch: dz_epoch.value(), + index: leaf_index, + contributor: contributor_label, + proportion: format!("{:.2}%", 100.0 * proportion), + reward: format!("{:.1} 2Z", reward), + distributed: if is_processed_leaf { "yes" } else { "no" }, + }); + } + + write_table( + out, + rewards_rows, + TableOptions { + columns_aligned_right: Some(&[0, 1, 3, 4, 5]), + }, + )?; + + Ok(()) +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/mod.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/mod.rs new file mode 100644 index 0000000000..b8ea3287ed --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/mod.rs @@ -0,0 +1,89 @@ +mod config; +mod contributor_rewards; +mod distribution; +mod sol_conversion; +mod validator_debts; +mod validator_deposits; + +// + +use std::io::Write; + +use anyhow::Result; +use clap::{Args, Subcommand}; +use doublezero_cli_core::CliContext; +use tabled::{ + Table, Tabled, + settings::{Alignment, Style, object::Columns}, +}; + +#[derive(Debug, Args)] +pub struct FetchCommand { + #[command(subcommand)] + cmd: FetchSubcommand, +} + +#[derive(Debug, Subcommand)] +pub enum FetchSubcommand { + /// Show program config and parameters. + Config(config::ConfigCommand), + + /// Show contributor rewards accounts with optional filters. Use --view + /// recipients to see recipient details (requires --service-key). + ContributorRewards(contributor_rewards::ContributorRewardsCommand), + + /// Show distribution account with optional epoch filter. Default is to show + /// the distribution account for the current epoch. + Distribution(distribution::DistributionCommand), + + /// Show the current SOL/2Z conversion price. + SolConversion(sol_conversion::SolConversionCommand), + + /// Show validator debts owed to the Revenue Distribution program. + ValidatorDebts(validator_debts::ValidatorDebtsCommand), + + /// List Solana validator deposit accounts with their balances with optional + /// node ID filter + ValidatorDeposits(validator_deposits::ValidatorDepositsCommand), + + /// Show configured Solana validator fee parameters (if any). + ValidatorFees(config::ValidatorFeesCommand), +} + +impl FetchCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + match self.cmd { + FetchSubcommand::Config(command) => command.execute(ctx, out).await, + FetchSubcommand::ContributorRewards(command) => command.execute(ctx, out).await, + FetchSubcommand::Distribution(command) => command.execute(ctx, out).await, + FetchSubcommand::SolConversion(command) => command.execute(ctx, out).await, + FetchSubcommand::ValidatorDebts(command) => command.execute(ctx, out).await, + FetchSubcommand::ValidatorDeposits(command) => command.execute(ctx, out).await, + FetchSubcommand::ValidatorFees(command) => command.execute(ctx, out).await, + } + } +} + +// + +#[derive(Debug, Default)] +struct TableOptions<'a> { + columns_aligned_right: Option<&'a [usize]>, +} + +fn write_table( + out: &mut impl Write, + value_rows: Vec, + options: TableOptions, +) -> Result<()> { + let mut table = Table::new(value_rows); + table.with(Style::markdown()); + + if let Some(columns_aligned_right) = options.columns_aligned_right { + for column_index in columns_aligned_right { + table.modify(Columns::one(*column_index), Alignment::right()); + } + } + writeln!(out, "{table}")?; + Ok(()) +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/sol_conversion.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/sol_conversion.rs new file mode 100644 index 0000000000..c185bff940 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/sol_conversion.rs @@ -0,0 +1,85 @@ +use std::io::Write; + +use anyhow::{Context, Result}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::rpc::SolanaConnectionOptions; +use doublezero_solana_sdk::{ + revenue_distribution::fetch::SolConversionState, sol_conversion::oracle::DiscountParameters, +}; + +use crate::command::revenue_distribution::try_request_oracle_conversion_price; + +#[derive(Debug, Args)] +pub struct SolConversionCommand { + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +#[derive(Debug, tabled::Tabled)] +struct SolConversionTableRow { + field: &'static str, + description: &'static str, + value: String, + note: String, +} + +impl SolConversionCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let Self { connection_options } = self; + let connection = crate::command::solana_connection(ctx, &connection_options); + + let SolConversionState { + program_state: (_, program_state), + configuration_registry: (_, configuration_registry), + journal: (_, journal), + fixed_fill_quantity, + } = SolConversionState::try_fetch(&connection).await?; + let last_slot = program_state.last_trade_slot; + + let current_slot = connection.get_slot().await?; + + let discount_parameters = + DiscountParameters::from_configuration_registry(&configuration_registry); + let discount = discount_parameters + .checked_compute(current_slot - last_slot) + .context("Failed to calculate discount")?; + + let oracle_price_data = try_request_oracle_conversion_price().await?; + + let discounted_swap_rate = oracle_price_data + .checked_discounted_swap_rate(discount) + .context("Failed to calculate discounted swap rate")?; + + let value_rows = vec![ + SolConversionTableRow { + field: "Swap rate", + description: "2Z amount for 1 SOL", + value: format!("{:.8}", oracle_price_data.swap_rate as f64 * 1e-8), + note: Default::default(), + }, + SolConversionTableRow { + field: "Swap rate", + description: "2Z amount for 1 SOL", + value: format!("{:.8}", discounted_swap_rate as f64 * 1e-8), + note: format!("Includes {:.8}% discount", discount as f64 * 1e-6), + }, + SolConversionTableRow { + field: "Journal balance", + description: "SOL available for conversion", + value: format!("{:.9}", journal.total_sol_balance as f64 * 1e-9), + note: Default::default(), + }, + SolConversionTableRow { + field: "SOL per swap", + description: "Fixed amount", + value: format!("{:.9}", fixed_fill_quantity as f64 * 1e-9), + note: Default::default(), + }, + ]; + + super::write_table(out, value_rows, Default::default())?; + + Ok(()) + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/validator_debts.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/validator_debts.rs new file mode 100644 index 0000000000..54d9e26a7a --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/validator_debts.rs @@ -0,0 +1,297 @@ +use std::{collections::HashSet, io::Write}; + +use anyhow::{Context, Result}; +use clap::{Args, ValueEnum}; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + account::{record::BorshRecordAccountData, zero_copy::ZeroCopyAccountOwnedData}, + rpc::{DoubleZeroLedgerEnvironmentOverride, SolanaConnection, SolanaConnectionOptions}, +}; +use doublezero_solana_sdk::revenue_distribution::{ + state::{Distribution, SolanaValidatorDeposit}, + try_is_processed_leaf, +}; +use doublezero_solana_validator_debt::{ + rpc::try_fetch_debt_records_and_distributions, validator_debt::ComputedSolanaValidatorDebts, +}; +use solana_sdk::{native_token::LAMPORTS_PER_SOL, pubkey::Pubkey}; + +#[derive(Debug, Clone, PartialEq, Eq, ValueEnum)] +pub enum ValidatorDebtsViewMode { + Outstanding, + Node, + ExcessBalance, +} + +#[derive(Debug, Args)] +pub struct ValidatorDebtsCommand { + #[arg(long, short = 'n', value_name = "PUBKEY")] + node_id: Option, + + #[arg(long, value_enum, default_value = "outstanding")] + view: ValidatorDebtsViewMode, + + #[arg(hide = true, long)] + debt_accountant: Option, + + #[command(flatten)] + connection_options: SolanaConnectionOptions, + + #[command(flatten)] + dz_env: DoubleZeroLedgerEnvironmentOverride, +} + +#[derive(Debug, tabled::Tabled)] +struct ValidatorDebtsOutstandingTableRow { + node_id: Pubkey, + total_amount: String, + deposit_balance: String, + note: String, +} + +#[derive(Debug, tabled::Tabled)] +struct ValidatorDebtsNodeTableRow { + node_id: Pubkey, + dz_epoch: u64, + solana_epoch: String, + amount: String, + status: &'static str, +} + +impl ValidatorDebtsCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let Self { + node_id, + view, + debt_accountant: debt_accountant_key, + connection_options, + dz_env, + } = self; + + let solana_connection = crate::command::solana_connection(ctx, &connection_options); + + let (debt_records, distributions) = try_fetch_debt_records_and_distributions( + &solana_connection, + dz_env.dz_env, + debt_accountant_key.as_ref(), + ) + .await? + .into_iter() + .unzip::<_, _, Vec<_>, Vec<_>>(); + + match view { + ValidatorDebtsViewMode::Outstanding | ValidatorDebtsViewMode::ExcessBalance => { + try_write_validator_debts_outstanding_table( + out, + &solana_connection, + &debt_records, + &distributions, + node_id.as_ref(), + view == ValidatorDebtsViewMode::ExcessBalance, + ) + .await + } + ValidatorDebtsViewMode::Node => { + let node_id = node_id.context("--node-id is required for --view node")?; + try_write_validator_debts_node_table(out, &debt_records, &distributions, &node_id) + } + } + } +} + +// + +async fn try_write_validator_debts_outstanding_table( + out: &mut impl Write, + solana_connection: &SolanaConnection, + debt_records: &[BorshRecordAccountData], + distributions: &[ZeroCopyAccountOwnedData], + node_id: Option<&Pubkey>, + excess_mode: bool, +) -> Result<()> { + let node_ids = match node_id { + Some(node_id) => HashSet::from_iter([*node_id]), + None => debt_records + .iter() + .flat_map(|debt_record| debt_record.data.debts.iter().map(|debt| debt.node_id)) + .collect::>(), + }; + + let rent_sysvar = solana_connection + .try_fetch_sysvar::() + .await?; + + let deposit_keys = node_ids + .iter() + .map(|node_id| SolanaValidatorDeposit::find_address(node_id).0) + .collect::>(); + + let deposit_account_infos = solana_connection + .try_fetch_multiple_accounts(&deposit_keys) + .await?; + + let deposit_balances = deposit_account_infos + .iter() + .map(|account_info| { + doublezero_solana_client_tools::account::balance(account_info, &rent_sysvar) + }) + .collect::>(); + + let mut outputs = Vec::with_capacity(debt_records.len()); + + for (node_id, deposit_balance) in node_ids.into_iter().zip(deposit_balances) { + let mut total_debt = 0; + + for (debt_record, distribution) in debt_records.iter().zip(distributions) { + if debt_record.debts.is_empty() { + continue; + } + + let index = debt_record + .data + .debts + .iter() + .position(|debt| debt.node_id == node_id); + + if let Some(index) = index { + let bitmap_range = distribution.processed_solana_validator_debt_bitmap_range(); + let processed_leaf_data = &distribution.remaining_data[bitmap_range]; + + let is_written_off = if distribution.is_solana_validator_debt_write_off_enabled() { + let bitmap_range = + distribution.processed_solana_validator_debt_write_off_bitmap_range(); + let written_off_leaf_data = &distribution.remaining_data[bitmap_range]; + try_is_processed_leaf(written_off_leaf_data, index).unwrap_or_default() + } else { + false + }; + + // If the debt is not processed or if it is processed but + // written off, we should include it in the total debt. + if !try_is_processed_leaf(processed_leaf_data, index).unwrap() || is_written_off { + total_debt += debt_record.data.debts[index].amount; + } + } + } + + if excess_mode { + if total_debt >= deposit_balance { + continue; + } + + outputs.push(ValidatorDebtsOutstandingTableRow { + node_id, + total_amount: format!("{:.9} SOL", total_debt as f64 * 1e-9), + deposit_balance: format!("{:.9} SOL", deposit_balance as f64 * 1e-9), + note: format!( + "{:.9} SOL in excess", + (deposit_balance - total_debt) as f64 / LAMPORTS_PER_SOL as f64 + ), + }); + } else { + if deposit_balance >= total_debt { + continue; + } + + outputs.push(ValidatorDebtsOutstandingTableRow { + node_id, + total_amount: format!("{:.9} SOL", total_debt as f64 * 1e-9), + deposit_balance: format!("{:.9} SOL", deposit_balance as f64 * 1e-9), + note: format!( + "{:.9} SOL needed", + (total_debt - deposit_balance) as f64 / LAMPORTS_PER_SOL as f64 + ), + }); + } + } + + outputs.sort_by_key(|row| row.node_id.to_string()); + + if outputs.is_empty() { + writeln!(out, "No outstanding debts found")?; + } else { + super::write_table( + out, + outputs, + super::TableOptions { + columns_aligned_right: Some(&[1, 2]), + }, + )?; + } + + Ok(()) +} + +fn try_write_validator_debts_node_table( + out: &mut impl Write, + debt_records: &[BorshRecordAccountData], + distributions: &[ZeroCopyAccountOwnedData], + node_id: &Pubkey, +) -> Result<()> { + let mut outputs = Vec::with_capacity(debt_records.len()); + + for (computed_debt, distribution) in debt_records.iter().zip(distributions) { + if computed_debt.debts.is_empty() { + continue; + } + + let index = computed_debt + .debts + .iter() + .position(|debt| &debt.node_id == node_id); + + if let Some(index) = index { + let start_index = distribution.processed_solana_validator_debt_start_index as usize; + let end_index = distribution.processed_solana_validator_debt_end_index as usize; + let processed_leaf_data = &distribution.remaining_data[start_index..end_index]; + + let is_processed = try_is_processed_leaf(processed_leaf_data, index).unwrap(); + + let is_written_off = if distribution.is_solana_validator_debt_write_off_enabled() { + let start_index = + distribution.processed_solana_validator_debt_write_off_start_index as usize; + let end_index = + distribution.processed_solana_validator_debt_write_off_end_index as usize; + let written_off_leaf_data = &distribution.remaining_data[start_index..end_index]; + try_is_processed_leaf(written_off_leaf_data, index).unwrap() + } else { + false + }; + + let debt = &computed_debt.debts[index]; + + // Unlikely to happen, but there can be multiple Solana epochs per + // DZ epoch. + let solana_epoch = (computed_debt.first_solana_epoch..=computed_debt.last_solana_epoch) + .map(|epoch| epoch.to_string()) + .collect::>() + .join(","); + + outputs.push(ValidatorDebtsNodeTableRow { + node_id: *node_id, + dz_epoch: distribution.dz_epoch.value(), + solana_epoch, + amount: format!("{:.9} SOL", debt.amount as f64 * 1e-9), + status: if !is_processed { + "unpaid" + } else if is_written_off { + "delinquent" + } else { + "paid" + }, + }); + } + } + + outputs.sort_by_key(|row| row.dz_epoch); + + super::write_table( + out, + outputs, + super::TableOptions { + columns_aligned_right: Some(&[1, 2, 3, 4]), + }, + )?; + + Ok(()) +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/validator_deposits.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/validator_deposits.rs new file mode 100644 index 0000000000..a3798adb9b --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/fetch/validator_deposits.rs @@ -0,0 +1,176 @@ +use std::io::Write; + +use anyhow::{Result, bail}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, rpc::SolanaConnectionOptions, +}; +use doublezero_solana_sdk::{ + PrecomputedDiscriminator, + revenue_distribution::{self, state::SolanaValidatorDeposit}, +}; +use solana_account_decoder_client_types::UiAccountEncoding; +use solana_client::{ + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_sdk::pubkey::Pubkey; + +use crate::command::revenue_distribution::try_fetch_solana_validator_deposit; + +#[derive(Debug, Args)] +pub struct ValidatorDepositsCommand { + #[arg(long, short = 'n', value_name = "PUBKEY")] + node_id: Option, + + /// Can only be used with --node-id. + #[arg(long, short = 'b')] + balance_only: bool, + + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +#[derive(Debug, tabled::Tabled)] +struct ValidatorDepositsTableRow { + deposit_pda: Pubkey, + node_id: Pubkey, + balance: String, + written_off_debt: String, +} + +impl ValidatorDepositsCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let Self { + node_id, + balance_only, + connection_options, + } = self; + + let connection = crate::command::solana_connection(ctx, &connection_options); + + let (outputs, fund_warning_message) = if let Some(node_id) = node_id { + let (deposit_key, deposit, deposit_balance) = + try_fetch_solana_validator_deposit(&connection, &node_id).await?; + + if let Some(deposit) = deposit { + if balance_only { + writeln!(out, "{:.9}", deposit_balance as f64 * 1e-9)?; + + return Ok(()); + } + + ( + vec![ValidatorDepositsTableRow { + deposit_pda: deposit_key, + node_id: deposit.node_id, + balance: format!("{:.9} SOL", deposit_balance as f64 * 1e-9), + written_off_debt: if deposit.written_off_sol_debt == 0 { + Default::default() + } else { + format!("{:.9} SOL", deposit.written_off_sol_debt as f64 * 1e-9) + }, + }], + None, + ) + } else if deposit_balance != 0 { + let warning_message = format!( + "⚠️ Warning: Please use \"doublezero-solana revenue-distribution validator-deposit --node-id {node_id} -i\" to create {deposit_key}" + ); + + if balance_only { + writeln!(out, "{:.9}", deposit_balance as f64 * 1e-9)?; + eprintln!(); + eprintln!("{warning_message}"); + + return Ok(()); + } + + ( + vec![ValidatorDepositsTableRow { + deposit_pda: deposit_key, + node_id, + balance: format!("{:.9} SOL", deposit_balance as f64 * 1e-9), + written_off_debt: Default::default(), + }], + Some(warning_message), + ) + } else { + bail!( + "No deposit account found at {deposit_key}. Please use \"doublezero-solana revenue-distribution validator-deposit --node-id {node_id} --fund \" to deposit SOL" + ); + } + } else { + if balance_only { + bail!("Cannot use --balance-only without specifying --node-id"); + } + + let config = RpcProgramAccountsConfig { + filters: Some(vec![RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 0, + SolanaValidatorDeposit::discriminator_slice().to_vec(), + ))]), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + + let rent_sysvar = connection + .try_fetch_sysvar::() + .await?; + + let mut outputs = connection + .get_program_accounts_with_config(&revenue_distribution::ID, config) + .await? + .into_iter() + .map(|(deposit_key, deposit_account_info)| { + let balance = doublezero_solana_client_tools::account::balance( + &deposit_account_info, + &rent_sysvar, + ); + let deposit_account = + ZeroCopyAccountOwnedData::::from_account( + &deposit_account_info, + ) + .unwrap(); + + ValidatorDepositsTableRow { + deposit_pda: deposit_key, + node_id: deposit_account.node_id, + balance: format!("{:.9} SOL", balance as f64 * 1e-9), + written_off_debt: if deposit_account.written_off_sol_debt == 0 { + Default::default() + } else { + format!( + "{:.9} SOL", + deposit_account.written_off_sol_debt as f64 * 1e-9 + ) + }, + } + }) + .collect::>(); + + outputs.sort_by_key(|row| row.node_id.to_string()); + + (outputs, None) + }; + + super::write_table( + out, + outputs, + super::TableOptions { + columns_aligned_right: Some(&[2, 3]), + }, + )?; + + if let Some(fund_warning_message) = fund_warning_message { + writeln!(out, "{fund_warning_message}")?; + writeln!(out)?; + } + + Ok(()) + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/client.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/client.rs new file mode 100644 index 0000000000..4aed609666 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/client.rs @@ -0,0 +1,288 @@ +use std::time::Duration; + +use anyhow::{Context, Result, bail}; +use reqwest::{Client, StatusCode, header}; +use url::Url; + +/// Base URL for Jupiter API with authentication (requires API key). +pub const JUPITER_API_BASE_URL: &str = "https://api.jup.ag"; + +/// Base URL for Jupiter legacy API (no authentication required, deprecated Jan 31 2026). +pub const JUPITER_LITE_API_BASE_URL: &str = "https://lite-api.jup.ag"; + +/// Jupiter API client. +/// +/// Supports two modes: +/// - Authenticated: Uses `api.jup.ag` with `x-api-key` header (when API key provided) +/// - Unauthenticated: Uses `lite-api.jup.ag` without header (legacy, deprecated Jan 31 2026) +#[derive(Debug, Clone)] +pub struct JupiterClient { + client: Client, + base_url: Url, +} + +impl JupiterClient { + /// Creates a new Jupiter client. + /// + /// - If `api_key` is `Some`, uses `api.jup.ag` with the `x-api-key` header. + /// - If `api_key` is `None`, uses `lite-api.jup.ag` without authentication. + pub fn new(api_key: Option<&str>) -> Result { + let base_url = if api_key.is_some() { + JUPITER_API_BASE_URL + } else { + JUPITER_LITE_API_BASE_URL + }; + + Self::with_base_url(api_key, base_url) + } + + /// Creates a new Jupiter client with a custom base URL (for testing). + pub fn with_base_url(api_key: Option<&str>, base_url: &str) -> Result { + let base_url = + Url::parse(base_url).with_context(|| format!("Invalid base URL: {base_url}"))?; + + let mut client_builder = Client::builder().timeout(Duration::from_secs(30)); + + if let Some(key) = api_key { + let mut headers = header::HeaderMap::new(); + headers.insert( + "x-api-key", + header::HeaderValue::from_str(key).context("Invalid Jupiter API key format")?, + ); + client_builder = client_builder.default_headers(headers); + } + + let client = client_builder + .build() + .context("Failed to build HTTP client")?; + + Ok(Self { client, base_url }) + } + + /// Executes a GET request to the Jupiter API. + pub async fn get( + &self, + path: &str, + query: &impl serde::Serialize, + ) -> Result { + let url = self.build_url(path)?; + let response = self + .client + .get(url) + .query(query) + .send() + .await + .context("Jupiter API request failed")?; + + self.handle_response(response).await + } + + /// Executes a POST request to the Jupiter API. + pub async fn post( + &self, + path: &str, + body: &impl serde::Serialize, + ) -> Result { + let url = self.build_url(path)?; + let response = self + .client + .post(url) + .json(body) + .send() + .await + .context("Jupiter API request failed")?; + + self.handle_response(response).await + } + + fn build_url(&self, path: &str) -> Result { + self.base_url + .join(path) + .with_context(|| format!("Invalid API path: {path}")) + } + + async fn handle_response( + &self, + response: reqwest::Response, + ) -> Result { + let status = response.status(); + + if status.is_success() { + return response + .json() + .await + .context("Failed to parse Jupiter API response"); + } + + let body = response + .text() + .await + .unwrap_or_else(|_| "".to_string()); + let body_snippet = if body.len() > 200 { + format!("{}...", &body[..200]) + } else { + body + }; + + if status == StatusCode::UNAUTHORIZED || status == StatusCode::FORBIDDEN { + bail!( + "Jupiter API authentication failed (HTTP {status}): {body_snippet}\n\ + Hint: Provide a valid API key via --jupiter-api-key" + ); + } + + bail!("Jupiter API request failed (HTTP {status}): {body_snippet}"); + } +} + +#[cfg(test)] +mod tests { + use wiremock::{Mock, MockServer, ResponseTemplate, matchers}; + + use super::*; + + #[tokio::test] + async fn test_authenticated_client_sends_api_key_header() { + let mock_server = MockServer::start().await; + + Mock::given(matchers::method("GET")) + .and(matchers::path("/swap/v1/quote")) + .and(matchers::header("x-api-key", "test-api-key-123")) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ + "data": "ok" + }))) + .expect(1) + .mount(&mock_server) + .await; + + let client = + JupiterClient::with_base_url(Some("test-api-key-123"), &mock_server.uri()).unwrap(); + + #[derive(serde::Serialize)] + struct Query { + amount: u64, + } + + #[derive(serde::Deserialize)] + struct Response { + data: String, + } + + let result: Response = client + .get("/swap/v1/quote", &Query { amount: 1000 }) + .await + .unwrap(); + + assert_eq!(result.data, "ok"); + } + + #[tokio::test] + async fn test_unauthenticated_client_does_not_send_api_key_header() { + let mock_server = MockServer::start().await; + + // For unauthenticated client, we just verify the request succeeds + // without requiring an x-api-key header. The mock accepts any request. + Mock::given(matchers::method("GET")) + .and(matchers::path("/swap/v1/quote")) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ + "data": "ok" + }))) + .expect(1) + .mount(&mock_server) + .await; + + let client = JupiterClient::with_base_url(None, &mock_server.uri()).unwrap(); + + #[derive(serde::Serialize)] + struct Query { + amount: u64, + } + + #[derive(serde::Deserialize)] + struct Response { + data: String, + } + + let result: Response = client + .get("/swap/v1/quote", &Query { amount: 1000 }) + .await + .unwrap(); + + assert_eq!(result.data, "ok"); + } + + #[tokio::test] + async fn test_authenticated_client_uses_api_jup_ag() { + let client = JupiterClient::new(Some("my-key")).unwrap(); + assert!(client.base_url.as_str().starts_with("https://api.jup.ag")); + assert!(!client.base_url.as_str().contains("lite-api")); + } + + #[tokio::test] + async fn test_unauthenticated_client_uses_lite_api() { + let client = JupiterClient::new(None).unwrap(); + assert!(client.base_url.as_str().contains("lite-api")); + } + + #[tokio::test] + async fn test_401_error_includes_helpful_message() { + let mock_server = MockServer::start().await; + + Mock::given(matchers::any()) + .respond_with( + ResponseTemplate::new(401).set_body_string(r#"{"error": "Invalid API key"}"#), + ) + .mount(&mock_server) + .await; + + let client = JupiterClient::with_base_url(Some("bad-key"), &mock_server.uri()).unwrap(); + + #[derive(serde::Serialize)] + struct Query {} + + let result: Result = client.get("/test", &Query {}).await; + + assert!(result.is_err()); + let err_msg = result.unwrap_err().to_string(); + assert!(err_msg.contains("401")); + assert!(err_msg.contains("authentication failed")); + } + + #[tokio::test] + async fn test_post_request() { + let mock_server = MockServer::start().await; + + Mock::given(matchers::method("POST")) + .and(matchers::path("/swap/v1/swap-instructions")) + .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ + "success": true + }))) + .expect(1) + .mount(&mock_server) + .await; + + let client = JupiterClient::with_base_url(None, &mock_server.uri()).unwrap(); + + #[derive(serde::Serialize)] + struct Body { + user: String, + } + + #[derive(serde::Deserialize)] + struct Response { + success: bool, + } + + let result: Response = client + .post( + "/swap/v1/swap-instructions", + &Body { + user: "test".to_string(), + }, + ) + .await + .unwrap(); + + assert!(result.success); + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/mod.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/mod.rs new file mode 100644 index 0000000000..d224120bbf --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/mod.rs @@ -0,0 +1,30 @@ +pub mod client; +pub mod quote; +pub mod swap_instructions; + +// + +pub use client::JupiterClient; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct JupiterRoutePlan { + pub swap_info: JupiterSwapInfo, + pub percent: u8, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct JupiterSwapInfo { + pub amm_key: String, + pub label: String, + pub input_mint: String, + pub output_mint: String, + pub in_amount: String, + pub out_amount: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub fee_amount: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub fee_mint: Option, +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/quote.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/quote.rs new file mode 100644 index 0000000000..b48bf8ec48 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/quote.rs @@ -0,0 +1,72 @@ +use anyhow::Result; +use serde::{Deserialize, Serialize}; + +use super::JupiterClient; + +const JUPITER_QUOTE_PATH: &str = "/swap/v1/quote"; + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +pub enum JupiterSwapMode { + #[default] + ExactIn, + ExactOut, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +pub enum JupiterInstructionVersion { + #[default] + V1, + V2, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct JupiterLegacyQuoteRequest { + /// Max value: 10_000 (100%). + pub slippage_bps: u16, + + pub swap_mode: JupiterSwapMode, + + #[serde(skip_serializing_if = "Option::is_none")] + pub only_direct_routes: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub restrict_intermediate_tokens: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub max_accounts: Option, + + pub instruction_version: JupiterInstructionVersion, + + pub amount: u64, + + pub output_mint: String, + + pub input_mint: String, + + /// NOTE: Only supports one dex at a time. + #[serde(skip_serializing_if = "Option::is_none")] + pub dexes: Option, +} + +impl JupiterLegacyQuoteRequest { + pub async fn try_execute(&self, client: &JupiterClient) -> Result { + client.get(JUPITER_QUOTE_PATH, self).await + } +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct JupiterLegacyQuoteResponse { + pub input_mint: String, + pub in_amount: String, + pub output_mint: String, + pub out_amount: String, + pub other_amount_threshold: String, + pub swap_mode: JupiterSwapMode, + pub slippage_bps: u16, + #[serde(skip_serializing_if = "Option::is_none")] + pub platform_fee: Option, + pub price_impact_pct: String, + pub route_plan: Vec, +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/swap_instructions.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/swap_instructions.rs new file mode 100644 index 0000000000..68c05def80 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/jupiter/swap_instructions.rs @@ -0,0 +1,126 @@ +use anyhow::Result; +use base64::Engine; +use serde::{Deserialize, Serialize}; +use solana_sdk::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, +}; + +use super::JupiterClient; + +const JUPITER_SWAP_INSTRUCTIONS_PATH: &str = "/swap/v1/swap-instructions"; + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub enum JupiterPriorityLevel { + #[default] + Medium, + High, + VeryHigh, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct JupiterPrioritizationFeeLamports { + pub priority_level_with_max_lamports: JupiterPriorityLevelWithMaxLamports, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct JupiterPriorityLevelWithMaxLamports { + pub max_lamports: u64, + pub priority_level: JupiterPriorityLevel, + pub global: bool, +} + +// Jupiter's instruction format -> needs conversion to Solana SDK's Instruction +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct JupiterInstruction { + pub program_id: String, + pub accounts: Vec, + /// Base64 encoded data. + pub data: String, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct JupiterAccountMeta { + pub pubkey: String, + pub is_signer: bool, + pub is_writable: bool, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct JupiterLegacySwapInstructionsResponse { + pub compute_budget_instructions: Vec, + pub setup_instructions: Vec, + pub swap_instruction: JupiterInstruction, + pub cleanup_instruction: Option, + pub other_instructions: Vec, + pub address_lookup_table_addresses: Vec, +} + +impl TryFrom for Instruction { + type Error = anyhow::Error; + + fn try_from(instruction: JupiterInstruction) -> Result { + let JupiterInstruction { + program_id, + accounts, + data, + } = instruction; + + let accounts = accounts + .into_iter() + .map( + |JupiterAccountMeta { + pubkey, + is_signer, + is_writable, + }| { + Ok(AccountMeta { + pubkey: Pubkey::from_str_const(&pubkey), + is_signer, + is_writable, + }) + }, + ) + .collect::>()?; + + Ok(Instruction { + program_id: Pubkey::from_str_const(&program_id), + accounts, + data: base64::engine::general_purpose::STANDARD.decode(&data)?, + }) + } +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct JupiterLegacySwapInstructionsRequest { + pub user_public_key: String, + pub quote_response: super::quote::JupiterLegacyQuoteResponse, + #[serde(skip_serializing_if = "Option::is_none")] + pub prioritization_fee_lamports: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub dynamic_compute_unit_limit: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub wrap_and_unwrap_sol: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub as_legacy_transaction: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub skip_user_accounts_rpc_calls: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub dynamic_slippage: Option, +} + +impl JupiterLegacySwapInstructionsRequest { + pub async fn try_execute( + &self, + client: &JupiterClient, + ) -> Result { + client.post(JUPITER_SWAP_INSTRUCTIONS_PATH, self).await + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/mod.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/mod.rs new file mode 100644 index 0000000000..aac9579ab7 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/harvest_2z/mod.rs @@ -0,0 +1,279 @@ +mod jupiter; + +use std::io::Write; + +use anyhow::{Context, Result, bail, ensure}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{instruction::take_instruction, payer::TransactionOutcome}; +use doublezero_solana_sdk::revenue_distribution::{ + env::mainnet::DOUBLEZERO_MINT_KEY, fetch::SolConversionState, +}; +use jupiter::{JupiterClient, quote::JupiterLegacyQuoteResponse}; +use solana_client::rpc_config::{ + RpcSimulateTransactionAccountsConfig, RpcSimulateTransactionConfig, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{native_token::LAMPORTS_PER_SOL, program_pack::Pack, pubkey::Pubkey}; + +use crate::command::revenue_distribution::convert_2z::Convert2zContext; + +const DEFAULT_BUY_SOL_ADDRESS_LOOKUP_TABLE_KEY: Pubkey = + solana_sdk::pubkey!("GnwZZZVudHSqChJiAh1RULWJe2itLHSZ9HCNXrbBQKPs"); + +const TOKEN_ACCOUNT_RENT_EXEMPTION_LAMPORTS: u64 = 2_039_280; + +#[derive(Debug, Args, Clone)] +pub struct Harvest2zCommand { + /// See https://dev.jup.ag/api-reference/swap/program-id-to-label for available + /// program ID labels. + #[arg(long, value_name = "JUPITER_LABEL")] + specific_dex: Option, + + /// Jupiter API key for authenticated access. If not provided, falls back + /// to the legacy lite-api.jup.ag endpoint (deprecated Jan 31 2026). + #[arg(long, value_name = "API_KEY")] + jupiter_api_key: Option, + + #[command(flatten)] + write_opts: crate::command::WriteVerbOptions, +} + +impl Harvest2zCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let Self { + specific_dex, + jupiter_api_key, + write_opts, + } = self; + + let jupiter_client = JupiterClient::new(jupiter_api_key.as_deref())?; + + let wallet = crate::command::build_wallet(ctx, write_opts)?; + ensure!( + wallet.compute_unit_price_ix.is_none(), + "Compute unit price is not supported for harvest-2z command" + ); + + let wallet_key = wallet.pubkey(); + let lamports_balance_before = wallet.connection.get_balance(&wallet_key).await?; + + let sol_conversion_state = SolConversionState::try_fetch(&wallet.connection).await?; + let fixed_fill_quantity = sol_conversion_state.fixed_fill_quantity; + + let mut convert_2z_context = Convert2zContext::try_prepare( + &wallet, + &sol_conversion_state, + None, //limit_price_str + None, //source_token_account_key + None, //checked_lamports + ) + .await?; + let buy_sol_ix = take_instruction(&mut convert_2z_context.instruction); + + ensure!( + lamports_balance_before >= fixed_fill_quantity, + "Not enough SOL to cover conversion. Need at least {:0.9} SOL", + fixed_fill_quantity as f64 * 1e-9, + ); + + let mut input_sol_amount = fixed_fill_quantity - 5_000; + + let token_balance_before = match convert_2z_context + .try_token_balance(&wallet.connection) + .await + { + Ok(token_balance) => token_balance, + Err(_) => { + input_sol_amount -= TOKEN_ACCOUNT_RENT_EXEMPTION_LAMPORTS; + 0 + } + }; + + let mut quote_response = try_quote_sol_to_2z( + &jupiter_client, + input_sol_amount, + convert_2z_context.discount_params.max_discount, + specific_dex, + ) + .await?; + + let discounted_swap_rate = convert_2z_context.limit_price; + let min_amount_out = u128::from(discounted_swap_rate) * u128::from(input_sol_amount) + / u128::from(LAMPORTS_PER_SOL); + let min_amount_out = + u64::try_from(min_amount_out).context("Overflow when calculating min amount out")?; + override_quote_response(&mut quote_response, min_amount_out); + + let swap_request = jupiter::swap_instructions::JupiterLegacySwapInstructionsRequest { + user_public_key: wallet_key.to_string(), + quote_response, + wrap_and_unwrap_sol: Some(true), + ..Default::default() + }; + + let jupiter::swap_instructions::JupiterLegacySwapInstructionsResponse { + compute_budget_instructions: _, + setup_instructions: jupiter_setup_instructions, + swap_instruction: jupiter_swap_instruction, + cleanup_instruction: jupiter_cleanup_instruction, + other_instructions: jupiter_other_instructions, + address_lookup_table_addresses, + } = swap_request.try_execute(&jupiter_client).await?; + + let mut instructions = Vec::new(); + for jup_ix in jupiter_setup_instructions { + instructions.push(jup_ix.try_into()?); + } + + instructions.push(jupiter_swap_instruction.try_into()?); + + if let Some(jup_ix) = jupiter_cleanup_instruction { + instructions.push(jup_ix.try_into()?); + } + + for jup_ix in jupiter_other_instructions { + instructions.push(jup_ix.try_into()?); + } + + instructions.push(buy_sol_ix); + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit(420_000)); + + let mut address_lookup_table_keys = address_lookup_table_addresses + .iter() + .map(|s| Pubkey::from_str_const(s)) + .collect::>(); + address_lookup_table_keys.push(DEFAULT_BUY_SOL_ADDRESS_LOOKUP_TABLE_KEY); + + let transaction = wallet + .new_transaction_with_additional_signers_and_lookup_tables( + &instructions, + &[], + &address_lookup_table_keys, + ) + .await?; + let tx_outcome = wallet + .send_or_simulate_transaction_with_configs( + &transaction, + wallet.default_send_transaction_config(), + RpcSimulateTransactionConfig { + accounts: Some(RpcSimulateTransactionAccountsConfig { + encoding: Default::default(), + addresses: vec![ + wallet_key.to_string(), + convert_2z_context.user_token_account_key.to_string(), + ], + }), + ..wallet.default_simulate_transaction_config() + }, + ) + .await?; + + match tx_outcome { + TransactionOutcome::Executed(tx_sig) => { + writeln!(out, "Harvested 2Z tokens: {tx_sig}")?; + + let token_balance_after = convert_2z_context + .try_token_balance(&wallet.connection) + .await?; + writeln!( + out, + "Harvested {:.8} 2Z tokens with {:.9} SOL", + (token_balance_after - token_balance_before) as f64 * 1e-8, + (fixed_fill_quantity as f64 * 1e-9) + )?; + + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + TransactionOutcome::Simulated(simulation_response) => { + let mut post_simulation_account_infos = simulation_response + .accounts + .unwrap() + .into_iter() + .flatten() + .collect::>(); + ensure!( + post_simulation_account_infos.len() == 2, + "Expected 2 accounts after simulation, got {}", + post_simulation_account_infos.len() + ); + + let ata_account_data = post_simulation_account_infos + .pop() + .unwrap() + .data + .decode() + .context("Failed to decode ATA account info")?; + let token_balance_after = + spl_token_interface::state::Account::unpack(&ata_account_data) + .unwrap() + .amount; + ensure!( + token_balance_after >= token_balance_before, + "Simulated harvesting 2Z tokens failed" + ); + writeln!( + out, + "Simulated harvesting {:.8} 2Z tokens with {:.9} SOL", + (token_balance_after - token_balance_before) as f64 * 1e-8, + (fixed_fill_quantity as f64 * 1e-9) + )?; + + let lamports_balance_after = post_simulation_account_infos.pop().unwrap().lamports; + ensure!( + lamports_balance_after == lamports_balance_before, + "SOL balance changed after simulation" + ); + } + } + + Ok(()) + } +} + +async fn try_quote_sol_to_2z( + jupiter_client: &JupiterClient, + amount: u64, + max_discount_rate: u64, + specific_dex: Option, +) -> Result { + let slippage_bps = u16::try_from(max_discount_rate) + .context("Overflow when calculating slippage bps with max discount rate")?; + + let quote_request = jupiter::quote::JupiterLegacyQuoteRequest { + slippage_bps, + restrict_intermediate_tokens: Some(true), + amount, + output_mint: DOUBLEZERO_MINT_KEY.to_string(), + input_mint: spl_token_interface::native_mint::ID.to_string(), + dexes: specific_dex, + ..Default::default() + }; + + for _ in 0..5 { + let response = quote_request.try_execute(jupiter_client).await?; + + // Any route plans that involve more intermediate steps will not fit in + // the transaction. + if response.route_plan.len() <= 2 { + return Ok(response); + } + + println!("Waiting for quote response to be updated..."); + tokio::time::sleep(tokio::time::Duration::from_millis(400)).await; + } + + bail!("Failed to get valid quote response in 5 attempts"); +} + +fn override_quote_response(response: &mut JupiterLegacyQuoteResponse, min_amount_out: u64) { + let min_amount_out_str = min_amount_out.to_string(); + + response.price_impact_pct = "0.0".to_string(); + response.out_amount = min_amount_out_str.clone(); + response.other_amount_threshold = min_amount_out_str.clone(); + + // Last leg of the swap is XYZ -> 2Z. + let last_leg = response.route_plan.last_mut().unwrap(); + last_leg.swap_info.out_amount = min_amount_out_str; +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/mod.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/mod.rs new file mode 100644 index 0000000000..4f9c6df640 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/mod.rs @@ -0,0 +1,238 @@ +mod configure_contributor_rewards; +mod contributor_rewards; +mod convert_2z; +mod fetch; +mod harvest_2z; +mod relay; +mod validator_deposit; + +// + +use std::io::Write; + +use anyhow::{Context, Result, ensure}; +use clap::{Args, Subcommand}; +use doublezero_cli_core::CliContext; +use doublezero_contributor_rewards::calculator::proof::ShapleyOutputStorage; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + rpc::{DoubleZeroLedgerConnection, SolanaConnection}, +}; +use doublezero_solana_sdk::{ + revenue_distribution::{ + state::{Distribution, SolanaValidatorDeposit}, + try_is_processed_leaf, + types::RewardShare, + }, + sol_conversion::oracle::OraclePriceData, +}; +use doublezero_solana_validator_debt::validator_debt::{ + ComputedSolanaValidatorDebt, ComputedSolanaValidatorDebts, +}; +use solana_sdk::{pubkey::Pubkey, rent::Rent}; + +// TODO: Add testnet? +const SOL_2Z_ORACLE_ENDPOINT: &str = + "https://sol-2z-oracle-api-v1.mainnet-beta.doublezero.xyz/swap-rate"; + +#[derive(Debug, Args)] +pub struct RevenueDistributionCommand { + #[command(subcommand)] + pub command: RevenueDistributionSubcommand, +} + +#[derive(Debug, Subcommand)] +pub enum RevenueDistributionSubcommand { + /// Fetch accounts associated with the Revenue Distribution program. + Fetch(fetch::FetchCommand), + + /// Contributor rewards account management. + ContributorRewards(contributor_rewards::ContributorRewardsCommand), + + /// Configure a contributor rewards account: set recipient shares and/or + /// control whether protocol management can change the rewards manager. + #[command(name = "configure-contributor-rewards")] + ConfigureContributorRewards(configure_contributor_rewards::ConfigureContributorRewardsCommand), + + /// Using the Revenue Distribution program's SOL liquidity, convert 2Z + /// tokens to SOL. If there is not enough SOL liquidity for the + /// fixed-quantity conversion, the command will fail. + #[command(name = "convert-2z")] + Convert2z(convert_2z::Convert2zCommand), + + #[command(name = "harvest-2z")] + Harvest2z(harvest_2z::Harvest2zCommand), + + /// Manage a Solana validator deposit account. Funding can be directly with + /// SOL or with 2Z limited by specified conversion rate for 2Z -> SOL. + ValidatorDeposit(validator_deposit::ValidatorDepositCommand), + + /// Relayer instructions for the Revenue Distribution program. + Relay(relay::RevenueDistributionRelayCommand), +} + +impl RevenueDistributionSubcommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + match self { + Self::Fetch(command) => command.execute(ctx, out).await, + Self::ContributorRewards(command) => command.execute(ctx, out).await, + Self::ConfigureContributorRewards(command) => command.execute(ctx, out).await, + Self::Convert2z(command) => command.execute(ctx, out).await, + Self::Harvest2z(command) => command.execute(ctx, out).await, + Self::ValidatorDeposit(command) => command.execute(ctx, out).await, + Self::Relay(command) => command.inner.execute(ctx, out).await, + } + } +} + +// + +async fn try_fetch_solana_validator_deposit( + connection: &SolanaConnection, + node_id: &Pubkey, +) -> Result<( + Pubkey, + Option, + u64, // balance +)> { + let (solana_validator_deposit_key, _) = SolanaValidatorDeposit::find_address(node_id); + + match connection + .get_multiple_accounts(&[solana_validator_deposit_key, solana_sdk::sysvar::rent::ID]) + .await + { + Ok(account_infos) => { + let account_infos = account_infos + .into_iter() + .map(Option::unwrap_or_default) + .collect::>(); + + let solana_validator_deposit_info = &account_infos[0]; + let rent_sysvar = + solana_sdk::account::from_account::(&account_infos[1]).unwrap(); + + let balance = doublezero_solana_client_tools::account::balance( + solana_validator_deposit_info, + &rent_sysvar, + ); + + let solana_validator_deposit = + ZeroCopyAccountOwnedData::::from_account( + solana_validator_deposit_info, + ); + + match solana_validator_deposit { + Some(data) => Ok(( + solana_validator_deposit_key, + Some(*data.mucked_data), + balance, + )), + None => Ok((solana_validator_deposit_key, None, balance)), + } + } + Err(_) => Ok((solana_validator_deposit_key, None, 0)), + } +} + +async fn try_request_oracle_conversion_price() -> Result { + reqwest::Client::new() + .get(SOL_2Z_ORACLE_ENDPOINT) + .header("User-Agent", "DoubleZero Solana CLI") + .send() + .await + .with_context(|| format!("Failed to request SOL/2Z price from {SOL_2Z_ORACLE_ENDPOINT}"))? + .json() + .await + .context("Failed to parse oracle response. Please try again") +} + +async fn try_fetch_shapley_record( + dz_connection: &DoubleZeroLedgerConnection, + rewards_accountant_key: &Pubkey, + dz_epoch_value: u64, +) -> Result { + const DEFAULT_SHAPLEY_OUTPUT_STORAGE_PREFIX: &[u8] = b"dz_contributor_rewards"; + + doublezero_contributor_rewards::calculator::ledger_operations::try_fetch_shapley_output( + dz_connection, + DEFAULT_SHAPLEY_OUTPUT_STORAGE_PREFIX, + rewards_accountant_key, + dz_epoch_value, + ) + .await +} + +fn try_distribution_rewards_iter<'a>( + distribution: &ZeroCopyAccountOwnedData, + shapley_output: &'a ShapleyOutputStorage, +) -> Result> { + let start_index = distribution.processed_rewards_start_index as usize; + let end_index = distribution.processed_rewards_end_index as usize; + let processed_leaf_data = &distribution.remaining_data[start_index..end_index]; + + let num_rewards = shapley_output.rewards.len(); + let max_supported_rewards = processed_leaf_data.len() * 8; + + ensure!( + max_supported_rewards >= num_rewards, + "Insufficient processed leaf data for epoch {}: can support {max_supported_rewards} rewards, but got {num_rewards}", + distribution.dz_epoch + ); + + Ok(shapley_output + .rewards + .iter() + .enumerate() + .map(|(index, reward_share)| { + let is_processed = try_is_processed_leaf(processed_leaf_data, index).unwrap(); + (index, reward_share, is_processed) + })) +} + +fn try_distribution_solana_validator_debt_iter<'a>( + distribution: &ZeroCopyAccountOwnedData, + computed_debt: &'a ComputedSolanaValidatorDebts, +) -> Result< + impl Iterator< + Item = ( + usize, + &'a ComputedSolanaValidatorDebt, + bool, // is_processed_leaf + bool, // is_written_off_leaf + ), + >, +> { + let start_index = distribution.processed_solana_validator_debt_start_index as usize; + let end_index = distribution.processed_solana_validator_debt_end_index as usize; + let processed_leaf_data = &distribution.remaining_data[start_index..end_index]; + + let num_debts = computed_debt.debts.len(); + let max_supported_debts = processed_leaf_data.len() * 8; + + let written_off_leaf_data = if distribution.is_solana_validator_debt_write_off_enabled() { + let start_index = + distribution.processed_solana_validator_debt_write_off_start_index as usize; + let end_index = distribution.processed_solana_validator_debt_write_off_end_index as usize; + Some(&distribution.remaining_data[start_index..end_index]) + } else { + None + }; + + ensure!( + max_supported_debts >= num_debts, + "Insufficient processed leaf data for epoch {}: can support {max_supported_debts} debts, but got {num_debts}", + distribution.dz_epoch + ); + + Ok(computed_debt + .debts + .iter() + .enumerate() + .map(move |(index, debt)| { + let is_processed = try_is_processed_leaf(processed_leaf_data, index).unwrap(); + let is_written_off = written_off_leaf_data + .map(|data| try_is_processed_leaf(data, index).unwrap()) + .unwrap_or(false); + (index, debt, is_processed, is_written_off) + })) +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/relay/distribute_rewards.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/relay/distribute_rewards.rs new file mode 100644 index 0000000000..17e13bba98 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/relay/distribute_rewards.rs @@ -0,0 +1,352 @@ +use anyhow::{Context, Result, ensure}; +use clap::Args; +use doublezero_contributor_rewards::calculator::proof::ShapleyOutputStorage; +use doublezero_scheduled_command::{Schedulable, ScheduleOption}; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + payer::{SolanaPayerOptions, TransactionOutcome, Wallet}, + rpc::{DoubleZeroLedgerConnection, DoubleZeroLedgerEnvironmentOverride}, +}; +use doublezero_solana_sdk::{ + environment_2z_token_mint_key, + revenue_distribution::{ + ID, + fetch::{try_fetch_config, try_fetch_distribution}, + instruction::{RevenueDistributionInstructionData, account::DistributeRewardsAccounts}, + state::{ContributorRewards, Distribution, ProgramConfig}, + types::{RewardShare, UnitShare32}, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::pubkey::Pubkey; +use spl_associated_token_account_interface::instruction::create_associated_token_account_idempotent; + +use crate::command::revenue_distribution::{ + relay::{ + finalize_distribution_rewards::FinalizeDistributionRewardsContext, + sweep_distribution_tokens::SweepDistributionTokensContext, + }, + try_distribution_rewards_iter, try_fetch_shapley_record, +}; + +#[derive(Debug, Args, Clone)] +pub struct DistributeRewards { + #[arg(long, short = 'e')] + dz_epoch: Option, + + #[command(flatten)] + schedule: ScheduleOption, + + #[command(flatten)] + pub(crate) solana_payer_options: SolanaPayerOptions, + + #[command(flatten)] + dz_env: DoubleZeroLedgerEnvironmentOverride, + + #[arg(hide = true, long)] + rewards_accountant: Option, +} + +#[async_trait::async_trait] +impl Schedulable for DistributeRewards { + fn schedule(&self) -> &ScheduleOption { + &self.schedule + } + + async fn execute_once(&self) -> Result<()> { + let Self { + dz_epoch, + schedule, + solana_payer_options, + dz_env, + rewards_accountant: rewards_accountant_key, + } = self; + + ensure!( + !schedule.is_scheduled() || dz_epoch.is_none(), + "Cannot specify both dz_epoch and schedule" + ); + + let wallet = Wallet::try_from(solana_payer_options.clone())?; + + let (_, config) = try_fetch_config(&wallet.connection).await?; + + let dz_epoch_value = match dz_epoch { + Some(dz_epoch) => *dz_epoch, + None => { + let deferral_period = config + .checked_minimum_epoch_duration_to_finalize_rewards() + .context("Minimum epoch duration to finalize rewards not set")?; + config + .next_completed_dz_epoch + .value() + .saturating_sub(deferral_period.into()) + } + }; + + // Make sure the distribution's rewards calculation is finalized and + // that 2Z tokens have been swept. + let distribution = + try_prepare_distribution_rewards(&wallet, &config, dz_epoch_value).await?; + + let network_env = wallet.connection.try_network_environment().await?; + let dz_mint_key = environment_2z_token_mint_key(network_env); + + let dz_env = dz_env.dz_env.unwrap_or(network_env); + let dz_connection = DoubleZeroLedgerConnection::from(dz_env); + + let shapley_output = try_fetch_shapley_record( + &dz_connection, + &rewards_accountant_key.unwrap_or(config.rewards_accountant_key), + dz_epoch_value, + ) + .await?; + + for (leaf_index, reward_share, is_processed_leaf) in + try_distribution_rewards_iter(&distribution, &shapley_output)? + { + tracing::info!( + "Processing epoch {dz_epoch_value} merkle leaf index {leaf_index}, contributor: {}, share: {:.9}", + reward_share.contributor_key, + reward_share.unit_share as f64 / u32::from(UnitShare32::MAX) as f64 + ); + + if is_processed_leaf { + tracing::warn!( + "Merkle leaf index {} has already been processed", + leaf_index + ); + continue; + } + + try_distribute_contributor_rewards( + &wallet, + &dz_mint_key, + &distribution, + &shapley_output, + leaf_index, + reward_share, + ) + .await?; + } + + Ok(()) + } +} + +// + +async fn try_prepare_distribution_rewards( + wallet: &Wallet, + config: &ProgramConfig, + dz_epoch_value: u64, +) -> Result> { + // Fetch distribution. If we had to finalize rewards, we will need to fetch + // again at the end. + let (_, distribution) = try_fetch_distribution(&wallet.connection, dz_epoch_value).await?; + + let mut instructions = Vec::new(); + let mut compute_unit_limit = 5_000; + + if !distribution.is_rewards_calculation_finalized() { + let finalize_distribution_tokens_context = + FinalizeDistributionRewardsContext::try_prepare(wallet, dz_epoch_value)?; + + instructions.push(finalize_distribution_tokens_context.instruction); + compute_unit_limit += FinalizeDistributionRewardsContext::COMPUTE_UNIT_LIMIT; + }; + + if !distribution.has_swept_2z_tokens() { + let sweep_distribution_tokens_context = + SweepDistributionTokensContext::try_prepare(wallet, config, Some(&distribution)) + .await?; + + instructions.push(sweep_distribution_tokens_context.instruction); + compute_unit_limit += sweep_distribution_tokens_context.compute_unit_limit; + }; + + if instructions.is_empty() { + tracing::info!( + "No instructions to prepare distribution rewards for epoch {dz_epoch_value}" + ); + + return Ok(distribution); + } + + // Add simple memo to indicate that distributing rewards was relayed. + let (memo_ix, memo_compute_units) = Wallet::build_memo_instruction_with_compute_units(b"Relay"); + instructions.push(memo_ix); + compute_unit_limit += memo_compute_units; + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + tracing::info!("Prepare distribution rewards for epoch {dz_epoch_value}: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + // Fetch the distribution again to get the remaining data. + let (_, distribution) = try_fetch_distribution(&wallet.connection, dz_epoch_value).await?; + + Ok(distribution) +} + +async fn try_distribute_contributor_rewards( + wallet: &Wallet, + dz_mint_key: &Pubkey, + distribution: &Distribution, + shapley_output: &ShapleyOutputStorage, + leaf_index: usize, + reward_share: &RewardShare, +) -> Result<()> { + const DISTRIBUTE_REWARDS_CU_BASE: u32 = 30_000; + const PER_RECIPIENT_CU: u32 = 12_500; + + let wallet_key = wallet.pubkey(); + + let (contributor_rewards_key, _) = + ContributorRewards::find_address(&reward_share.contributor_key); + + // Fetch contributor reward recipients. + let recipient_shares = match wallet + .connection + .try_fetch_zero_copy_data::(&contributor_rewards_key) + .await + { + Ok(contributor_rewards) => { + let recipient_shares = contributor_rewards + .recipient_shares + .active_iter() + .copied() + .collect::>(); + + if recipient_shares.is_empty() { + tracing::warn!( + "No recipients in {contributor_rewards_key} for contributor {}", + reward_share.contributor_key + ); + + return Ok(()); + } + + recipient_shares + } + _ => { + tracing::warn!( + "Contributor rewards {contributor_rewards_key} not found for contributor {}", + reward_share.contributor_key + ); + + return Ok(()); + } + }; + + let recipient_keys = recipient_shares + .iter() + .map(|share| &share.recipient_key) + .collect::>(); + + let distribute_rewards_ix = try_build_instruction( + &ID, + DistributeRewardsAccounts::new( + distribution.dz_epoch, + &reward_share.contributor_key, + dz_mint_key, + &wallet_key, + &recipient_keys, + ), + &RevenueDistributionInstructionData::DistributeRewards { + unit_share: reward_share.unit_share, + economic_burn_rate: reward_share.economic_burn_rate(), + proof: shapley_output.generate_merkle_proof(leaf_index)?, + }, + )?; + + // Derive ATA addresses together with their create-ATA compute-unit + // estimates. The address is needed for the existence check below. The CU is + // carried through to the recipients whose ATA must be created. + let (ata_keys, recipient_create_compute_units) = recipient_keys + .iter() + .map(|recipient_key| { + Wallet::ata_address_and_create_compute_units(recipient_key, dz_mint_key) + }) + .unzip::<_, _, Vec<_>, Vec<_>>(); + + // Build instructions to create missing ATAs. We are using idempotent just + // in case there is a race when creating the ATAs. + let (mut instructions, create_ata_compute_units) = wallet + .connection + .get_multiple_accounts(&ata_keys) + .await? + .into_iter() + .zip(recipient_keys.iter()) + .zip(recipient_create_compute_units) + .filter_map( + |((account_info, recipient_key), create_compute_units)| match account_info { + Some(account_info) if account_info.owner == Pubkey::default() => { + Some((recipient_key, create_compute_units)) + } + None => Some((recipient_key, create_compute_units)), + _ => None, + }, + ) + .map(|(recipient_key, create_compute_units)| { + let ix = create_associated_token_account_idempotent( + &wallet_key, + recipient_key, + dz_mint_key, + &spl_token_interface::ID, + ); + + (ix, create_compute_units) + }) + .unzip::<_, _, Vec<_>, Vec<_>>(); + + if !instructions.is_empty() { + tracing::warn!("Creating {} ATAs", instructions.len()); + } + + instructions.push(distribute_rewards_ix); + + // Add simple memo to indicate that distributing rewards was relayed. + let (memo_ix, memo_compute_units) = Wallet::build_memo_instruction_with_compute_units(b"Relay"); + instructions.push(memo_ix); + + let compute_unit_limit = DISTRIBUTE_REWARDS_CU_BASE + + recipient_keys.len() as u32 * PER_RECIPIENT_CU + + create_ata_compute_units.iter().sum::() + + memo_compute_units; + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + tracing::info!( + "Distribute rewards for epoch {}: {tx_sig}", + distribution.dz_epoch + ); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/relay/finalize_distribution_rewards.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/relay/finalize_distribution_rewards.rs new file mode 100644 index 0000000000..9e0703d2a4 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/relay/finalize_distribution_rewards.rs @@ -0,0 +1,125 @@ +use anyhow::{Result, anyhow, bail, ensure}; +use clap::Args; +use doublezero_scheduled_command::{Schedulable, ScheduleOption}; +use doublezero_solana_client_tools::payer::{SolanaPayerOptions, TransactionOutcome, Wallet}; +use doublezero_solana_sdk::{ + revenue_distribution::{ + ID, + fetch::{try_fetch_config, try_fetch_distribution}, + instruction::{ + RevenueDistributionInstructionData, account::FinalizeDistributionRewardsAccounts, + }, + types::DoubleZeroEpoch, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::instruction::Instruction; + +#[derive(Debug, Args, Clone)] +pub struct FinalizeDistributionRewards { + #[arg(long, short = 'e')] + dz_epoch: Option, + + #[command(flatten)] + schedule: ScheduleOption, + + #[command(flatten)] + pub(crate) solana_payer_options: SolanaPayerOptions, +} + +#[async_trait::async_trait] +impl Schedulable for FinalizeDistributionRewards { + fn schedule(&self) -> &ScheduleOption { + &self.schedule + } + + async fn execute_once(&self) -> Result<()> { + let Self { + dz_epoch, + schedule, + solana_payer_options, + } = self; + + ensure!( + !schedule.is_scheduled() || dz_epoch.is_none(), + "Cannot specify both dz_epoch and schedule" + ); + + let wallet = Wallet::try_from(solana_payer_options.clone())?; + + let dz_epoch_value = match dz_epoch { + Some(dz_epoch) => *dz_epoch, + None => { + let (_, program_config) = try_fetch_config(&wallet.connection).await?; + let deferral_period = program_config + .checked_minimum_epoch_duration_to_finalize_rewards() + .ok_or(anyhow!( + "Minimum epoch duration to finalize rewards not set" + ))?; + program_config + .next_completed_dz_epoch + .value() + .saturating_sub(deferral_period.into()) + } + }; + + let (_, distribution) = try_fetch_distribution(&wallet.connection, dz_epoch_value).await?; + + if distribution.is_rewards_calculation_finalized() { + if schedule.is_scheduled() { + tracing::warn!("Rewards calculation already finalized for epoch {dz_epoch_value}"); + + return Ok(()); + } else { + bail!("Rewards calculation already finalized for epoch {dz_epoch_value}"); + } + } + + let finalize_distribution_tokens_context = + FinalizeDistributionRewardsContext::try_prepare(&wallet, dz_epoch_value)?; + + let mut instructions = vec![ + finalize_distribution_tokens_context.instruction, + ComputeBudgetInstruction::set_compute_unit_limit( + FinalizeDistributionRewardsContext::COMPUTE_UNIT_LIMIT, + ), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_sig = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + tracing::info!("Finalize distribution rewards for epoch {dz_epoch_value}: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) + } +} + +pub struct FinalizeDistributionRewardsContext { + pub instruction: Instruction, +} + +impl FinalizeDistributionRewardsContext { + pub const COMPUTE_UNIT_LIMIT: u32 = 7_500; + + pub fn try_prepare(wallet: &Wallet, dz_epoch_value: u64) -> Result { + let instruction = try_build_instruction( + &ID, + FinalizeDistributionRewardsAccounts::new( + &wallet.pubkey(), + DoubleZeroEpoch::new(dz_epoch_value), + ), + &RevenueDistributionInstructionData::FinalizeDistributionRewards, + )?; + + Ok(Self { instruction }) + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/relay/mod.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/relay/mod.rs new file mode 100644 index 0000000000..9d81788f0a --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/relay/mod.rs @@ -0,0 +1,151 @@ +mod distribute_rewards; +mod finalize_distribution_rewards; +mod sweep_distribution_tokens; + +// The relay verbs keep their pre-RFC-20 `SolanaPayerOptions` because the +// `Schedulable` trait's `execute_once(&self)` cannot take a `CliContext`; +// `patch_payer_opts` merges only the global `--solana-url`/`--keypair` into +// them. The global `--env` and `--dz-ledger-url` are NOT applied here — each +// relay verb resolves its DZ environment from its own (hidden) `--dz-env` +// flag or genesis-hash detection. Tracked for the #1520 migration. + +use std::io::Write; + +use anyhow::Result; +use chrono::Utc; +use clap::{Args, Subcommand, ValueEnum}; +use doublezero_cli_core::CliContext; +use doublezero_scheduled_command::Schedulable; +use doublezero_solana_client_tools::{ + payer::{SolanaPayerOptions, Wallet}, + rpc::DoubleZeroLedgerConnection, +}; +use doublezero_solana_sdk::revenue_distribution::fetch::{ + try_fetch_config, try_fetch_distribution, +}; +use doublezero_solana_validator_debt::worker; + +#[derive(Debug, Clone, ValueEnum)] +pub enum ExportFormat { + Csv, + Slack, +} + +#[derive(Debug, Args)] +pub struct RevenueDistributionRelayCommand { + #[command(subcommand)] + pub inner: RevenueDistributionRelaySubcommand, +} + +#[derive(Debug, Subcommand)] +pub enum RevenueDistributionRelaySubcommand { + // TODO: add schedule + PaySolanaValidatorDebt { + #[arg(long)] + dz_epoch: u64, + + /// export results: csv, slack + #[arg(long, value_enum)] + export: Option, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + }, + + SweepDistributionTokens(sweep_distribution_tokens::SweepDistributionTokens), + + FinalizeDistributionRewards(finalize_distribution_rewards::FinalizeDistributionRewards), + + DistributeRewards(distribute_rewards::DistributeRewards), +} + +/// Inject `CliContext` defaults into a `SolanaPayerOptions` that may have been +/// left empty by the user (relay verbs keep `SolanaPayerOptions` because the +/// `Schedulable` trait requires `execute_once(&self)` — see #1520 for full +/// migration to `CliContext`). +fn patch_payer_opts(ctx: &CliContext, opts: &mut SolanaPayerOptions) { + if opts.connection_options.solana_url_or_moniker.is_none() { + opts.connection_options.solana_url_or_moniker = Some(ctx.solana_l1_rpc_url.clone()); + } + if opts.signer_options.keypair_path.is_none() { + opts.signer_options.keypair_path = + ctx.keypair_path.as_ref().map(|p| p.display().to_string()); + } +} + +impl RevenueDistributionRelaySubcommand { + pub async fn execute(self, ctx: &CliContext, _out: &mut impl Write) -> Result<()> { + match self { + Self::PaySolanaValidatorDebt { + dz_epoch, + mut solana_payer_options, + export, + } => { + patch_payer_opts(ctx, &mut solana_payer_options); + execute_pay_solana_validator_debt(dz_epoch, solana_payer_options, export).await + } + Self::SweepDistributionTokens(mut command) => { + patch_payer_opts(ctx, &mut command.solana_payer_options); + command.execute().await + } + Self::FinalizeDistributionRewards(mut command) => { + patch_payer_opts(ctx, &mut command.solana_payer_options); + command.execute().await + } + Self::DistributeRewards(mut command) => { + patch_payer_opts(ctx, &mut command.solana_payer_options); + command.execute().await + } + } + } +} + +async fn execute_pay_solana_validator_debt( + epoch: u64, + solana_payer_options: SolanaPayerOptions, + export: Option, +) -> Result<()> { + let wallet = Wallet::try_from(solana_payer_options)?; + + let dz_env = wallet.connection.try_network_environment().await?; + let dz_connection = DoubleZeroLedgerConnection::from(dz_env); + + let dry_run = wallet.dry_run; + let (_, config) = try_fetch_config(&wallet.connection).await?; + + let (_, distribution) = try_fetch_distribution(&wallet.connection, epoch).await?; + + if !distribution.is_debt_calculation_finalized() { + tracing::warn!("{epoch} is not finalized, skipping"); + return Ok(()); + } + + let tx_results = + worker::pay_solana_validator_debt(&wallet, &dz_connection, epoch, &config, &distribution) + .await?; + + let mut filename: Option = None; + + if let Some(ExportFormat::Csv) = export { + let now = Utc::now(); + let timestamp_milliseconds: i64 = now.timestamp_millis(); + let string_filename = if dry_run { + format!("DRY_RUN_dz_epoch_{epoch}_pay_solana_debt_{timestamp_milliseconds}.csv") + } else { + format!("dz_epoch_{epoch}_pay_solana_debt_{timestamp_milliseconds}.csv") + }; + let mut writer = csv::Writer::from_path(string_filename.clone())?; + + for tx_result in tx_results.collection_results.clone() { + writer.serialize(tx_result)?; + } + filename = Some(string_filename); + writer.flush()?; + }; + + if let Some(ExportFormat::Slack) = export { + worker::post_debt_collection_to_slack(tx_results, dry_run, filename).await?; + } + + Ok(()) +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/relay/sweep_distribution_tokens.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/relay/sweep_distribution_tokens.rs new file mode 100644 index 0000000000..6d6537cf5f --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/relay/sweep_distribution_tokens.rs @@ -0,0 +1,164 @@ +use anyhow::{Result, bail, ensure}; +use clap::Args; +use doublezero_scheduled_command::{Schedulable, ScheduleOption}; +use doublezero_solana_client_tools::payer::{SolanaPayerOptions, TransactionOutcome, Wallet}; +use doublezero_solana_sdk::{ + revenue_distribution::{ + ID, + fetch::{SolConversionState, try_fetch_config, try_fetch_distribution}, + instruction::{ + RevenueDistributionInstructionData, account::SweepDistributionTokensAccounts, + }, + state::{Distribution, ProgramConfig}, + types::DoubleZeroEpoch, + }, + sol_conversion::state::MAX_FILLS_QUEUE_SIZE, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::instruction::Instruction; + +#[derive(Debug, Args, Clone)] +pub struct SweepDistributionTokens { + #[command(flatten)] + schedule: ScheduleOption, + + #[command(flatten)] + pub(crate) solana_payer_options: SolanaPayerOptions, +} + +#[async_trait::async_trait] +impl Schedulable for SweepDistributionTokens { + fn schedule(&self) -> &ScheduleOption { + &self.schedule + } + + async fn execute_once(&self) -> Result<()> { + let Self { + schedule, + solana_payer_options, + } = self; + let wallet = Wallet::try_from(solana_payer_options.clone())?; + + let (_, config) = try_fetch_config(&wallet.connection).await?; + + let sweep_distribution_tokens_context = match SweepDistributionTokensContext::try_prepare( + &wallet, &config, None, // dz_epoch + ) + .await + { + Ok(context) => context, + Err(e) => { + if schedule.is_scheduled() { + tracing::warn!("{e}"); + + return Ok(()); + } else { + bail!(e); + } + } + }; + + let mut instructions = vec![ + sweep_distribution_tokens_context.instruction, + ComputeBudgetInstruction::set_compute_unit_limit( + sweep_distribution_tokens_context.compute_unit_limit, + ), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + + // TODO: We should fetch the distribution and journal to check whether + // there are enough 2Z tokens to sweep instead of warning on an RPC + // error. + let tx_sig = match wallet.send_or_simulate_transaction(&transaction).await { + Ok(tx_sig) => tx_sig, + Err(e) => { + if schedule.is_scheduled() { + tracing::warn!("{e}"); + + return Ok(()); + } else { + bail!(e); + } + } + }; + + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + tracing::info!( + "Sweep distribution tokens for epoch {}: {tx_sig}", + sweep_distribution_tokens_context.dz_epoch + ); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) + } +} + +pub struct SweepDistributionTokensContext { + pub instruction: Instruction, + pub compute_unit_limit: u32, + pub dz_epoch: DoubleZeroEpoch, +} + +impl SweepDistributionTokensContext { + pub async fn try_prepare( + wallet: &Wallet, + config: &ProgramConfig, + distribution: Option<&Distribution>, + ) -> Result { + let SolConversionState { + program_state: (_, sol_conversion_program_state), + configuration_registry: _, + journal: (_, journal), + fixed_fill_quantity, + } = SolConversionState::try_fetch(&wallet.connection).await?; + + let expected_dz_epoch = journal.next_dz_epoch_to_sweep_tokens; + let distribution = match distribution { + Some(distribution) => { + ensure!( + distribution.dz_epoch == expected_dz_epoch, + "DZ epoch does not match next epoch to sweep tokens" + ); + + *distribution + } + None => { + let (_, distribution_data) = + try_fetch_distribution(&wallet.connection, expected_dz_epoch.value()).await?; + *distribution_data.mucked_data + } + }; + + let expected_fill_count = + distribution.checked_total_sol_debt().unwrap() / fixed_fill_quantity + 1; + ensure!( + expected_fill_count <= MAX_FILLS_QUEUE_SIZE as u64, + "Expected fill count is too large" + ); + + let sweep_distribution_tokens_ix = try_build_instruction( + &ID, + SweepDistributionTokensAccounts::new( + expected_dz_epoch, + &config.sol_2z_swap_program_id, + &sol_conversion_program_state.fills_registry_key, + ), + &RevenueDistributionInstructionData::SweepDistributionTokens, + )?; + let compute_unit_limit = 35_000 + 80 * expected_fill_count as u32; + + Ok(Self { + instruction: sweep_distribution_tokens_ix, + compute_unit_limit, + dz_epoch: expected_dz_epoch, + }) + } +} diff --git a/offchain/crates/solana-cli/src/command/revenue_distribution/validator_deposit.rs b/offchain/crates/solana-cli/src/command/revenue_distribution/validator_deposit.rs new file mode 100644 index 0000000000..52dc6b3831 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/revenue_distribution/validator_deposit.rs @@ -0,0 +1,421 @@ +use std::io::Write; + +use anyhow::{Context, Result, ensure}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + instruction::take_instruction, + payer::{TransactionOutcome, Wallet}, + rpc::{DoubleZeroLedgerEnvironmentOverride, SolanaConnection}, +}; +use doublezero_solana_sdk::{ + NetworkEnvironment, + revenue_distribution::{ + ID, + fetch::SolConversionState, + instruction::{ + RevenueDistributionInstructionData, + account::{ + InitializeSolanaValidatorDepositAccounts, WithdrawSolanaValidatorDepositAccounts, + }, + }, + state::SolanaValidatorDeposit, + try_is_processed_leaf, + }, + try_build_instruction, +}; +use doublezero_solana_validator_debt::rpc::try_fetch_debt_records_and_distributions; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::pubkey::Pubkey; + +use crate::command::{ + revenue_distribution::convert_2z::Convert2zContext, try_prompt_proceed_confirmation, +}; + +#[derive(Debug, Args)] +pub struct ValidatorDepositCommand { + /// Node (Validator) identity. + #[arg(long, short = 'n', value_name = "PUBKEY")] + node_id: Pubkey, + + /// Initialize the Solana validator deposit account if it does not exist. + #[arg(long, short = 'i')] + initialize: bool, + + /// Fund the Solana validator deposit account with SOL. When + /// `--convert-2z-limit-price` is specified, the fund amount must match the + /// required (fixed fill quantity) amount for the 2Z -> SOL conversion. + #[arg(long, value_name = "SOL")] + fund: Option, + + /// Fund the Solana validator deposit account with outstanding debt. This + /// argument cannot be used with `--fund`. + #[arg(long)] + fund_outstanding_debt: bool, + + /// Withdraw excess balance from the Solana validator deposit account. This + /// argument cannot be used with `--fund` or `--fund-outstanding-debt`. + #[arg(long)] + withdraw_excess_balance: bool, + + /// The public key of the account that will receive the excess balance. This + /// argument is required when `--withdraw-excess-balance` is specified. + /// + /// NOTE: The keypair invoking the command must be the validator identity + /// relevant to the deposit account. + #[arg(long, value_name = "PUBKEY")] + excess_balance_beneficiary: Option, + + /// Fund with 2Z limited by specified conversion rate for 2Z -> SOL. + #[arg(long, value_name = "PRICE_LIMIT")] + convert_2z_limit_price: Option, + + /// Token account must be owned by the signer. Defaults to signer ATA if not + /// specified. + #[arg(long, value_name = "PUBKEY")] + source_2z_account: Option, + + #[command(flatten)] + write_opts: crate::command::WriteVerbOptions, + + #[arg(hide = true, long)] + debt_accountant: Option, + + #[command(flatten)] + dz_env: DoubleZeroLedgerEnvironmentOverride, +} + +impl ValidatorDepositCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let ValidatorDepositCommand { + node_id, + initialize: mut should_initialize, + fund: fund_amount_str, + fund_outstanding_debt: should_fund_outstanding_debt, + withdraw_excess_balance: should_withdraw_excess_balance, + excess_balance_beneficiary: excess_balance_beneficiary_key, + convert_2z_limit_price: convert_2z_limit_price_str, + source_2z_account: source_2z_account_key, + write_opts, + debt_accountant: debt_accountant_key, + dz_env, + } = self; + + let wallet = crate::command::build_wallet(ctx, write_opts)?; + let wallet_key = wallet.pubkey(); + + let exclusive_flag_count = u8::from(should_withdraw_excess_balance) + + u8::from(should_fund_outstanding_debt) + + u8::from(fund_amount_str.is_some()); + ensure!( + exclusive_flag_count <= 1, + "Cannot use --withdraw-excess-balance, --fund-outstanding-debt or --fund together" + ); + + if should_withdraw_excess_balance { + return try_withdraw_excess_balance( + out, + &wallet, + &node_id, + excess_balance_beneficiary_key.as_ref(), + ) + .await; + } + + // First check if the Solana validator deposit is already initialized. + let (deposit_key, deposit, mut deposit_balance) = + super::try_fetch_solana_validator_deposit(&wallet.connection, &node_id).await?; + ensure!( + !should_initialize || deposit.is_none(), + "Solana validator deposit already initialized" + ); + + // If specified, fund any outstanding debt. Otherwise, use the specified + // fund amount. + let (fund_lamports, memo_ix_and_compute_units) = if should_fund_outstanding_debt { + ensure!( + fund_amount_str.is_none(), + "Cannot use --fund and --fund-outstanding-debt together" + ); + + let OutstandingDebt { + amount: outstanding_debt_amount, + last_solana_epoch, + } = try_compute_outstanding_debt( + &wallet.connection, + &node_id, + deposit_balance, + dz_env.dz_env, + debt_accountant_key.as_ref(), + ) + .await?; + + if outstanding_debt_amount == 0 { + writeln!(out, "No outstanding debt found. Nothing to do")?; + return Ok(()); + } + + let memo = format!("Funded through Solana epoch {last_solana_epoch}"); + let (memo_ix, memo_compute_units) = + Wallet::build_memo_instruction_with_compute_units(memo.as_bytes()); + + (outstanding_debt_amount, Some((memo_ix, memo_compute_units))) + } + // Parse fund amount from SOL string (representing 9 decimal places at + // most) to lamports. + else if let Some(fund_str) = fund_amount_str { + let fund_lamports = crate::utils::parse_sol_amount_to_lamports(fund_str)?; + + let (memo_ix, memo_compute_units) = + Wallet::build_memo_instruction_with_compute_units(b"Funded"); + + (fund_lamports, Some((memo_ix, memo_compute_units))) + } else { + Default::default() + }; + + // Ensure that we initialize if it does not exist and we are funding. + should_initialize |= deposit.is_none() && fund_lamports != 0; + + let mut instructions = vec![]; + let mut compute_unit_limit = 5_000; + + if should_initialize { + let initialize_solana_validator_deposit_ix = try_build_instruction( + &ID, + InitializeSolanaValidatorDepositAccounts::new(&wallet_key, &node_id), + &RevenueDistributionInstructionData::InitializeSolanaValidatorDeposit(node_id), + )?; + + instructions.push(initialize_solana_validator_deposit_ix); + compute_unit_limit += 10_000; + + let (_, bump) = SolanaValidatorDeposit::find_address(&node_id); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + }; + + struct Convert2zContextItems { + context: Convert2zContext, + token_balance_before: u64, + required_lamports: u64, + } + + let convert_2z_context_items = if let Some(limit_price_str) = convert_2z_limit_price_str { + try_prompt_proceed_confirmation( + out, + &format!( + "By specifying --convert-2z-limit-price, you are funding {:0.9} SOL to your deposit account", + fund_lamports as f64 * 1e-9, + ), + "Aborting command with --convert-2z-limit-price", + )?; + + let sol_conversion_state = SolConversionState::try_fetch(&wallet.connection).await?; + + let mut convert_2z_context = Convert2zContext::try_prepare( + &wallet, + &sol_conversion_state, + Some(limit_price_str), + source_2z_account_key, + Some(fund_lamports), + ) + .await?; + let buy_sol_ix = take_instruction(&mut convert_2z_context.instruction); + + let token_balance_before = convert_2z_context + .try_token_balance(&wallet.connection) + .await?; + writeln!( + out, + "2Z token balance: {:.8}", + token_balance_before as f64 * 1e-8 + )?; + + instructions.push(buy_sol_ix); + compute_unit_limit += Convert2zContext::BUY_SOL_COMPUTE_UNIT_LIMIT; + + Some(Convert2zContextItems { + context: convert_2z_context, + token_balance_before, + required_lamports: sol_conversion_state.fixed_fill_quantity, + }) + } else { + None + }; + + if fund_lamports != 0 { + deposit_balance += fund_lamports; + + let transfer_ix = solana_system_interface::instruction::transfer( + &wallet_key, + &deposit_key, + fund_lamports, + ); + instructions.push(transfer_ix); + + compute_unit_limit += 5_000; + } + + ensure!( + !instructions.is_empty(), + "Please specify `--initialize`, `--fund-outstanding-debt` or `--fund`" + ); + + if let Some((memo_ix, memo_compute_units)) = memo_ix_and_compute_units { + instructions.push(memo_ix); + compute_unit_limit += memo_compute_units; + } + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_sig = wallet.send_or_simulate_transaction(&transaction).await?; + + // TODO: Add simulation result handling with state changes. + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + writeln!(out, "Solana validator deposit: {deposit_key}")?; + if should_initialize { + writeln!(out, "Funded and initialized: {tx_sig}")?; + } else { + writeln!(out, "Funded: {tx_sig}")?; + } + writeln!(out, "Node ID: {node_id}")?; + writeln!(out, "Balance: {:.9} SOL", deposit_balance as f64 * 1e-9)?; + + if let Some(Convert2zContextItems { + context: convert_2z_context, + token_balance_before, + required_lamports, + }) = convert_2z_context_items + { + let token_balance_after = convert_2z_context + .try_token_balance(&wallet.connection) + .await?; + writeln!( + out, + "Converted {:.8} 2Z tokens to fund deposit with {:.9} SOL", + (token_balance_before - token_balance_after) as f64 * 1e-8, + (required_lamports as f64 * 1e-9) + )?; + } + + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + Ok(()) + } +} + +struct OutstandingDebt { + amount: u64, + last_solana_epoch: u64, +} + +async fn try_compute_outstanding_debt( + solana_connection: &SolanaConnection, + node_id: &Pubkey, + deposit_balance: u64, + dz_env_override: Option, + debt_accountant_key: Option<&Pubkey>, +) -> Result { + let debt_records_and_distributions = try_fetch_debt_records_and_distributions( + solana_connection, + dz_env_override, + debt_accountant_key, + ) + .await?; + + let mut total_debt = 0; + let mut last_solana_epoch = 0; + + for (debt_record, distribution) in debt_records_and_distributions { + if debt_record.debts.is_empty() { + continue; + } + + let index = debt_record + .data + .debts + .iter() + .position(|debt| &debt.node_id == node_id); + + if let Some(index) = index { + let processed_range = distribution.processed_solana_validator_debt_bitmap_range(); + let processed_leaf_data = &distribution.remaining_data[processed_range]; + + let is_written_off = if distribution.is_solana_validator_debt_write_off_enabled() { + let write_off_range = + distribution.processed_solana_validator_debt_write_off_bitmap_range(); + let written_off_leaf_data = &distribution.remaining_data[write_off_range]; + try_is_processed_leaf(written_off_leaf_data, index).unwrap_or_default() + } else { + false + }; + + // Include debt if not processed or if processed but written off (delinquent). + if !try_is_processed_leaf(processed_leaf_data, index).unwrap() || is_written_off { + total_debt += debt_record.data.debts[index].amount; + last_solana_epoch = debt_record.data.last_solana_epoch; + } + } + } + + Ok(OutstandingDebt { + amount: total_debt.saturating_sub(deposit_balance), + last_solana_epoch, + }) +} + +async fn try_withdraw_excess_balance( + out: &mut impl Write, + wallet: &Wallet, + node_id: &Pubkey, + excess_balance_beneficiary_key: Option<&Pubkey>, +) -> Result<()> { + ensure!( + excess_balance_beneficiary_key.is_none() || wallet.pubkey() == *node_id, + "The keypair invoking the command must be the validator identity relevant to the deposit account" + ); + + let (deposit_key, deposit, deposit_balance) = + super::try_fetch_solana_validator_deposit(&wallet.connection, node_id).await?; + + let deposit = + deposit.with_context(|| format!("No deposit account found for node ID {node_id}"))?; + ensure!( + deposit_balance.saturating_sub(deposit.written_off_sol_debt) > 0, + "No excess balance found for node ID {node_id}" + ); + + let mut instructions = vec![ + try_build_instruction( + &ID, + WithdrawSolanaValidatorDepositAccounts::new(node_id, excess_balance_beneficiary_key), + &RevenueDistributionInstructionData::WithdrawSolanaValidatorDeposit, + )?, + Wallet::build_memo_instruction(b"Withdrawn excess balance"), + ComputeBudgetInstruction::set_compute_unit_limit(20_000), + ]; + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_sig = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + writeln!(out, "Solana validator deposit: {deposit_key}")?; + writeln!(out, "Withdrawn excess balance: {tx_sig}")?; + writeln!(out, "Node ID: {node_id}")?; + writeln!(out, "Withdrawn {:.9} SOL", deposit_balance as f64 * 1e-9)?; + } + + Ok(()) +} diff --git a/offchain/crates/solana-cli/src/command/shreds/list.rs b/offchain/crates/solana-cli/src/command/shreds/list.rs new file mode 100644 index 0000000000..c546d845b3 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/list.rs @@ -0,0 +1,410 @@ +use std::{collections::HashMap, io::Write, net::Ipv4Addr}; + +use anyhow::Result; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_serviceability::state::device::Device; +use doublezero_solana_client_tools::{ + payer::try_load_keypair, + rpc::{SolanaConnection, SolanaConnectionOptions}, +}; +use doublezero_solana_sdk::shred_subscription::{self, state}; +use solana_account_decoder_client_types::UiAccountEncoding; +use solana_client::{ + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_sdk::{account::Account, pubkey::Pubkey, signer::Signer}; +use tabled::{Table, Tabled, settings::Style}; + +use super::make_dz_connection; + +/* + doublezero-solana shred-subscription list [--device | --device-code ] +*/ + +#[derive(Debug, Args)] +pub struct ListCommand { + /// Filter seats by device. + #[command(flatten)] + device_args: super::DeviceArgs, + + /// Filter seats by funder (withdraw authority). Accepts a public key or a + /// path to a keypair file. When omitted, defaults to the default keypair's + /// public key; if no default keypair is found, shows all seats. + #[arg(long, short = 'k')] + funder: Option, + + /// Filter seats by client IPv4 address. + #[arg(long)] + client_ip: Option, + + /// Show seats regardless of funder, restricted to those active in the + /// current subscription epoch (whose `active_epoch >= current_epoch`). + /// Lapsed seats, whose accounts persist on-chain, are excluded. + #[arg(long)] + all: bool, + + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +/// A parsed client seat: `(seat_key, device_key, client_ip, tenure)`. +type ParsedSeat = (Pubkey, Pubkey, Ipv4Addr, u16); + +#[derive(Debug, Tabled)] +struct SeatRow { + #[tabled(rename = "Device Code")] + device_code: String, + #[tabled(rename = "Client IP")] + client_ip: Ipv4Addr, + #[tabled(rename = "Tenure")] + tenure: u16, + #[tabled(rename = "Balance (USDC)")] + escrow_usdc: String, + #[tabled(rename = "Est. Epochs Paid")] + est_epochs_paid: String, +} + +impl ListCommand { + pub async fn execute( + self, + dz_ledger_url: Option, + ctx: &CliContext, + out: &mut impl Write, + ) -> Result<()> { + let connection = crate::command::solana_connection(ctx, &self.connection_options); + + let discriminator_bytes = + borsh::to_vec(&state::CLIENT_SEAT_DISCRIMINATOR).expect("discriminator serialization"); + + let mut filters = vec![RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 0, + discriminator_bytes, + ))]; + + // Resolve device filter. + let network_env = + crate::command::resolve_network_env(&connection, self.connection_options.moniker_env()) + .await?; + if self.device_args.device.is_some() || self.device_args.device_code.is_some() { + let device = self + .device_args + .resolve(network_env, &dz_ledger_url) + .await?; + filters.push(RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + state::CLIENT_SEAT_DEVICE_KEY_OFFSET, + device.to_bytes().to_vec(), + ))); + } + + if let Some(client_ip) = self.client_ip { + let ip_bits = u32::from(client_ip); + filters.push(RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + state::CLIENT_SEAT_CLIENT_IP_OFFSET, + ip_bits.to_le_bytes().to_vec(), + ))); + } + + let config = RpcProgramAccountsConfig { + filters: Some(filters), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + + let accounts: Vec<(Pubkey, Account)> = connection + .get_program_accounts_with_config(&shred_subscription::ID, config) + .await?; + + if accounts.is_empty() { + writeln!(out, "No client seats found.")?; + return Ok(()); + } + + // Parse all seats. When `--all` is set, also record each seat's + // active_epoch for the active-seat filter below. + let mut active_epoch_by_seat: HashMap = HashMap::new(); + let parsed_seats: Vec = accounts + .iter() + .filter_map(|(seat_key, account)| { + let (device_key, client_ip, tenure, _, active_epoch) = + state::parse_client_seat(&account.data)?; + if self.all { + active_epoch_by_seat.insert(*seat_key, active_epoch); + } + Some((*seat_key, device_key, client_ip, tenure)) + }) + .collect(); + + // Resolve the funder (withdraw authority) filter. + let funder: Option = if let Some(ref funder_str) = self.funder { + if let Ok(pubkey) = funder_str.parse::() { + Some(pubkey) + } else { + let keypair = try_load_keypair(Some(funder_str.into()))?; + Some(keypair.pubkey()) + } + } else if !self.all { + try_load_keypair(None).ok().map(|kp| kp.pubkey()) + } else { + None + }; + + // Fetch escrow balances. + let (escrow_balances, filtered_seats) = if let Some(ref authority) = funder { + let escrow_keys: Vec = parsed_seats + .iter() + .map(|(seat_key, _, _, _)| { + state::find_payment_escrow_address(seat_key, authority).0 + }) + .collect(); + let escrow_accounts = connection.try_fetch_multiple_accounts(&escrow_keys).await?; + + let mut balances: HashMap = HashMap::new(); + let mut matching_seats = Vec::new(); + for (seat, account) in parsed_seats.into_iter().zip(escrow_accounts.into_iter()) { + if let Some((seat_key, _, balance)) = state::parse_payment_escrow(&account.data) { + balances.insert(seat_key, balance); + matching_seats.push(seat); + } + } + (balances, matching_seats) + } else { + let escrow_disc_bytes = borsh::to_vec(&state::PAYMENT_ESCROW_DISCRIMINATOR) + .expect("discriminator serialization"); + let escrow_config = RpcProgramAccountsConfig { + filters: Some(vec![RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 0, + escrow_disc_bytes, + ))]), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + let escrow_accounts: Vec<(Pubkey, Account)> = connection + .get_program_accounts_with_config(&shred_subscription::ID, escrow_config) + .await?; + + let mut balances: HashMap = HashMap::new(); + for (_, account) in &escrow_accounts { + if let Some((seat_key, _, balance)) = state::parse_payment_escrow(&account.data) { + balances.insert(seat_key, balance); + } + } + let matching_seats: Vec<_> = parsed_seats + .into_iter() + .filter(|(seat_key, _, _, _)| balances.contains_key(seat_key)) + .collect(); + (balances, matching_seats) + }; + + let filtered_seats = if self.all { + let current_epoch = connection.get_epoch_info().await?.epoch; + writeln!(out, "Active subscription epoch: {current_epoch}\n")?; + active_seats(filtered_seats, &active_epoch_by_seat, current_epoch) + } else { + filtered_seats + }; + + if filtered_seats.is_empty() { + writeln!(out, "No client seats found.")?; + return Ok(()); + } + + // Collect unique device keys. + let unique_devices: Vec = filtered_seats + .iter() + .map(|(_, device_key, _, _)| *device_key) + .collect::>() + .into_iter() + .collect(); + + // Resolve device codes from DZ Ledger (best-effort). + let device_codes: HashMap = { + let dz_connection = make_dz_connection(&dz_ledger_url, network_env); + let dz_accounts = dz_connection.get_multiple_accounts(&unique_devices).await; + dz_accounts + .unwrap_or_default() + .into_iter() + .zip(unique_devices.iter()) + .filter_map(|(account, key)| { + let device = Device::try_from(account?.data.as_slice()).ok()?; + Some((*key, device.code)) + }) + .collect() + }; + + // Fetch epoch pricing per device. + let device_prices = fetch_device_prices(&connection, &unique_devices).await?; + + // Build rows. + let mut rows: Vec = filtered_seats + .iter() + .map(|(seat_key, device_key, client_ip, tenure)| { + let device_code = device_codes + .get(device_key) + .cloned() + .unwrap_or_else(|| device_key.to_string()); + + let balance = escrow_balances.get(seat_key).copied().unwrap_or(0); + let escrow_usdc = format!("{:.2}", balance as f64 / 1_000_000.0); + let price = device_prices.get(device_key).copied().unwrap_or(0); + // balance is micro-USDC (1 USDC = 1_000_000), price is whole USDC. + let est_epochs_paid = if price > 0 { + format!("~{}", balance / (price * 1_000_000)) + } else { + "N/A".to_string() + }; + + SeatRow { + device_code, + client_ip: *client_ip, + tenure: *tenure, + escrow_usdc, + est_epochs_paid, + } + }) + .collect(); + + rows.sort_by(|a, b| { + a.device_code + .cmp(&b.device_code) + .then(a.client_ip.cmp(&b.client_ip)) + }); + + writeln!(out, "{} seat(s) found:\n", rows.len())?; + + let mut table = Table::new(rows); + table.with(Style::markdown()); + writeln!(out, "{table}")?; + + Ok(()) + } +} + +fn active_seats( + seats: Vec, + active_epoch_by_seat: &HashMap, + current_epoch: u64, +) -> Vec { + seats + .into_iter() + .filter(|(seat_key, _, _, _)| { + active_epoch_by_seat + .get(seat_key) + .is_some_and(|&active_epoch| active_epoch >= current_epoch) + }) + .collect() +} + +/// Fetch the current epoch price (base + premium, in whole USDC) for each device. +async fn fetch_device_prices( + connection: &SolanaConnection, + device_keys: &[Pubkey], +) -> Result> { + if device_keys.is_empty() { + return Ok(HashMap::new()); + } + + // Fetch DeviceHistory accounts. + let dh_keys: Vec = device_keys + .iter() + .map(|dk| state::find_device_history_address(dk).0) + .collect(); + let dh_accounts = connection.try_fetch_multiple_accounts(&dh_keys).await?; + + // Parse device infos and collect unique exchange keys. + let mut device_infos: Vec<(Pubkey, Pubkey, i16)> = Vec::new(); + let mut exchange_keys_set = std::collections::HashSet::new(); + for account in &dh_accounts { + if let Some(info) = state::parse_device_history(&account.data) { + exchange_keys_set.insert(info.exchange_key); + device_infos.push((info.device_key, info.exchange_key, info.current_premium)); + } + } + + // Fetch MetroHistory accounts. + let exchange_keys: Vec = exchange_keys_set.into_iter().collect(); + let mh_keys: Vec = exchange_keys + .iter() + .map(|ek| state::find_metro_history_address(ek).0) + .collect(); + let mh_accounts = connection.try_fetch_multiple_accounts(&mh_keys).await?; + + let mut metro_prices: HashMap = HashMap::new(); + for account in &mh_accounts { + if let Some(info) = state::parse_metro_history(&account.data) { + metro_prices.insert(info.exchange_key, info.current_usdc_price); + } + } + + // Compute total price per device. + let mut prices = HashMap::new(); + for (device_key, exchange_key, premium) in &device_infos { + if let Some(&base) = metro_prices.get(exchange_key) { + let total = (base as i32 + *premium as i32).max(0) as u64; + prices.insert(*device_key, total); + } + } + + Ok(prices) +} + +#[cfg(test)] +mod tests { + use super::*; + + /// Build a seat with the given active_epoch, returning the seat tuple and + /// its `(seat_key, active_epoch)` entry for the lookup map. + fn make_seat(active_epoch: u64) -> (ParsedSeat, (Pubkey, u64)) { + let seat_key = Pubkey::new_unique(); + let seat = ( + seat_key, + Pubkey::new_unique(), + Ipv4Addr::new(10, 0, 0, 1), + 1, + ); + (seat, (seat_key, active_epoch)) + } + + #[test] + fn active_seats_keeps_current_and_future_epochs() { + let (lapsed, lapsed_e) = make_seat(4); + let (current, current_e) = make_seat(5); + let (ahead, ahead_e) = make_seat(6); + let seats = vec![lapsed, current, ahead]; + let map = HashMap::from([lapsed_e, current_e, ahead_e]); + + let result = active_seats(seats, &map, 5); + + let keys: Vec = result.iter().map(|(k, ..)| *k).collect(); + assert_eq!(keys, vec![current.0, ahead.0]); + } + + #[test] + fn active_seats_excludes_all_when_subset_is_lapsed() { + // Regression: a --device subset where every seat has lapsed must not + // report stale seats as active. The old max()/== logic treated the + // most-recent lapsed seat as "active" against a stale derived epoch. + let (s1, e1) = make_seat(3); + let (s2, e2) = make_seat(4); + let seats = vec![s1, s2]; + let map = HashMap::from([e1, e2]); + + let result = active_seats(seats, &map, 5); + + assert!(result.is_empty()); + } + + #[test] + fn active_seats_excludes_seat_missing_from_map() { + let (seat, _) = make_seat(5); + let result = active_seats(vec![seat], &HashMap::new(), 5); + assert!(result.is_empty()); + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/mod.rs b/offchain/crates/solana-cli/src/command/shreds/mod.rs new file mode 100644 index 0000000000..d2199c0d69 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/mod.rs @@ -0,0 +1,247 @@ +pub mod list; +pub mod pay; +pub mod payments; +pub mod price; +pub mod publisher_rewards; +pub mod validator_client_rewards; +pub mod withdraw; + +use std::{io::Write, time::Duration}; + +use anyhow::{Result, bail}; +use clap::{Args, Subcommand}; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::rpc::{DoubleZeroLedgerConnection, NetworkEnvironment}; +use doublezero_solana_sdk::shred_subscription::{ + ID as SHRED_SUBSCRIPTION_PROGRAM_ID, + instruction::{ShredSubscriptionInstructionData, account::CheckCliVersionAccounts}, +}; +use solana_account_decoder_client_types::UiAccountEncoding; +use solana_client::{ + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_sdk::pubkey::Pubkey; + +// Solana's nominal slot duration. Mainnet-beta moves 400ms to 350ms at the +// start of epoch 1020 (2026-08-21) and SIMD-0525 continues stepping it down to +// 200ms, so this needs one more update when that rollout completes. Testnet is +// already at 200ms. This value deliberately does not vary by cluster, because +// both users want a deterministic, reproducible number more than an accurate +// one: one prints a "~" prefixed estimate and the other computes a deadline +// slot that the CLI and the operator must agree on. +pub(in crate::command::shreds) const NOMINAL_SLOT_DURATION: Duration = Duration::from_millis(350); + +#[derive(Debug, Args)] +pub struct ShredsCommand { + /// Override the DZ Ledger RPC URL. When omitted, the URL is derived from + /// the Solana network environment. Required for e2e / Docker environments + /// where the DZ Ledger runs on the same validator as the shred-subscription + /// program. + // `pub` so the binary can fill this slot from the global --dz-ledger-url + // when it is not given here (the subcommand-level flag wins). + #[arg(long, env)] + pub dz_ledger_url: Option, + + #[command(subcommand)] + pub command: ShredsSubcommand, +} + +impl ShredsCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + self.command.execute(self.dz_ledger_url, ctx, out).await + } +} + +#[derive(Debug, Subcommand)] +pub enum ShredsSubcommand { + /// Initialize a client seat (if needed) and fund a payment escrow with USDC. + Pay(pay::PayCommand), + /// Close a payment escrow and withdraw any remaining USDC. + Withdraw(withdraw::WithdrawCommand), + /// List client seats. + List(list::ListCommand), + /// Show payment history for a client seat escrow. + Payments(payments::PaymentsCommand), + /// Show current device pricing. + Price(price::PriceCommand), + /// Validator client rewards: claim accumulated rewards and manage proportions. + ValidatorClientRewards(validator_client_rewards::ValidatorClientRewardsCommand), + /// Validator publisher rewards configuration. + PublisherRewards(publisher_rewards::PublisherRewardsCommand), +} + +impl ShredsSubcommand { + pub async fn execute( + self, + dz_ledger_url: Option, + ctx: &CliContext, + out: &mut impl Write, + ) -> Result<()> { + match self { + Self::Pay(command) => command.execute(dz_ledger_url, ctx, out).await, + Self::Withdraw(command) => command.execute(dz_ledger_url, ctx, out).await, + Self::List(command) => command.execute(dz_ledger_url, ctx, out).await, + Self::Payments(command) => command.execute(dz_ledger_url, ctx, out).await, + Self::Price(command) => command.execute(dz_ledger_url, ctx, out).await, + Self::ValidatorClientRewards(command) => command.execute(ctx, out).await, + Self::PublisherRewards(command) => command.execute(ctx, out).await, + } + } +} + +/// Shared device identification args. Accepts either `--device ` or +/// `--device-code ` (mutually exclusive). When using `--device-code`, +/// the DZ Ledger URL and serviceability program ID are derived automatically +/// from the Solana network environment. +#[derive(Debug, Args, Clone)] +pub struct DeviceArgs { + /// Device public key. + #[arg(long, group = "device_id", env)] + pub device: Option, + /// Human-readable device code (e.g. "MIA-1"). + #[arg(long, group = "device_id", env)] + pub device_code: Option, +} + +impl DeviceArgs { + /// Resolve the device pubkey. When `--device-code` is used, queries the + /// DZ Ledger's serviceability program based on the given network environment. + pub async fn resolve( + &self, + network_env: NetworkEnvironment, + dz_ledger_url: &Option, + ) -> Result { + if let Some(device) = self.device { + return Ok(device); + } + if let Some(ref code) = self.device_code { + let dz_connection = make_dz_connection(dz_ledger_url, network_env); + let program_id = serviceability_program_id(network_env)?; + resolve_device_code(&dz_connection, &program_id, code).await + } else { + bail!("Either --device or --device-code must be specified"); + } + } +} + +/// Construct a DZ Ledger connection, using the explicit URL if provided or +/// falling back to the environment-derived URL. +pub(in crate::command::shreds) fn make_dz_connection( + dz_ledger_url: &Option, + network_env: NetworkEnvironment, +) -> DoubleZeroLedgerConnection { + match dz_ledger_url { + Some(url) => DoubleZeroLedgerConnection::new(url.clone()), + None => DoubleZeroLedgerConnection::from(network_env), + } +} + +/// Known shred oracle pubkey per environment. Returns `None` on localnet +/// (the multicast-user guard is already skipped there because +/// `serviceability_program_id` returns `Err`). +pub(in crate::command::shreds) fn shred_oracle_key(env: NetworkEnvironment) -> Option { + match env { + NetworkEnvironment::MainnetBeta => Some(solana_sdk::pubkey!( + "3b2Ze7VYUvhwQBfx5oCMCmsc2xvyZ74s2Lata5vmQeeN" + )), + NetworkEnvironment::Testnet => Some(solana_sdk::pubkey!( + "BUtAWK4GaUV42YRp7jSHZhchspsshabn67HnBHnKxzsY" + )), + NetworkEnvironment::Devnet => None, + NetworkEnvironment::Localnet => None, + } +} + +/// Parse the CLI's build version into (major, minor, patch). +/// +/// Handles version strings like "0.5.0" or "0.5.0-rc1" by only considering +/// the first three numeric components. +fn cli_version() -> (u32, u32, u32) { + let version_str = option_env!("BUILD_VERSION") + .unwrap_or(env!("CARGO_PKG_VERSION")) + .trim_start_matches('v'); + let mut parts = version_str.split('.'); + let major = parts.next().and_then(|s| s.parse().ok()).unwrap_or(0); + let minor = parts.next().and_then(|s| s.parse().ok()).unwrap_or(0); + // Strip any pre-release suffix (e.g. "0-rc1" -> "0"). + let patch = parts + .next() + .and_then(|s| s.split('-').next()) + .and_then(|s| s.parse().ok()) + .unwrap_or(0); + (major, minor, patch) +} + +/// Build a `CheckCliVersion` instruction to prepend to write transactions. +pub(in crate::command::shreds) fn build_check_cli_version_instruction() +-> Result { + let (major, minor, patch) = cli_version(); + let ix = doublezero_solana_sdk::try_build_instruction( + &SHRED_SUBSCRIPTION_PROGRAM_ID, + CheckCliVersionAccounts::new(), + &ShredSubscriptionInstructionData::CheckCliVersion { + major, + minor, + patch, + }, + )?; + Ok(ix) +} + +pub(in crate::command::shreds) fn serviceability_program_id( + env: NetworkEnvironment, +) -> Result { + match env { + NetworkEnvironment::MainnetBeta => { + Ok(doublezero_serviceability::addresses::mainnet::program_id::id()) + } + NetworkEnvironment::Testnet => { + Ok(doublezero_serviceability::addresses::testnet::program_id::id()) + } + NetworkEnvironment::Devnet => { + Ok(doublezero_serviceability::addresses::testnet::program_id::id()) + } + NetworkEnvironment::Localnet => { + bail!("Device code resolution is not supported on localnet; use --device instead") + } + } +} + +/// Resolve a human-readable device code to a pubkey by querying the +/// serviceability program's Device accounts on the DZ Ledger. +/// +/// The Device account layout (Borsh-serialized) has: +/// offset 0: account_type (1 byte, Device = 5) +/// offset 120: code (Borsh String: 4-byte LE length + utf8 bytes) +async fn resolve_device_code( + connection: &DoubleZeroLedgerConnection, + program_id: &Pubkey, + code: &str, +) -> Result { + let match_bytes = borsh::to_vec(code).expect("borsh string serialization"); + + let config = RpcProgramAccountsConfig { + filters: Some(vec![ + // AccountType::Device = 5 + RpcFilterType::Memcmp(Memcmp::new_raw_bytes(0, vec![5])), + // code field at offset 120 + RpcFilterType::Memcmp(Memcmp::new_raw_bytes(120, match_bytes)), + ]), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + + let accounts = connection + .get_program_accounts_with_config(program_id, config) + .await?; + + match accounts.len() { + 0 => bail!("No device found with code \"{code}\""), + 1 => Ok(accounts[0].0), + n => bail!("Ambiguous: {n} devices found with code \"{code}\""), + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/pay.rs b/offchain/crates/solana-cli/src/command/shreds/pay.rs new file mode 100644 index 0000000000..64290acb45 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/pay.rs @@ -0,0 +1,1423 @@ +use std::{ + io::{IsTerminal, Write}, + net::Ipv4Addr, +}; + +use anyhow::{Context, Result, bail}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_serviceability::{pda::get_user_pda, state::user::UserType}; +use doublezero_solana_client_tools::payer::{TransactionOutcome, Wallet}; +use doublezero_solana_sdk::{ + environment_usdc_token_mint_key, + shred_subscription::{ + ID, + instruction::{ + ShredSubscriptionInstructionData, + account::{ + FundPaymentEscrowUsdcAccounts, InitializeClientSeatAccounts, + InitializePaymentEscrowAccounts, RequestInstantSeatAllocationAccounts, + }, + }, + state, + }, + try_build_instruction, +}; +use solana_account_decoder_client_types::UiAccountEncoding; +use solana_client::{ + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_commitment_config::CommitmentConfig; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::pubkey::Pubkey; +use spl_associated_token_account_interface::address::get_associated_token_address; + +use super::{NOMINAL_SLOT_DURATION, make_dz_connection, serviceability_program_id}; + +/// Warn if less than 10% of the current Solana epoch remains. +const EPOCH_REMAINING_WARNING_THRESHOLD: f64 = 0.10; + +// No trailing period: `try_prompt_proceed_confirmation` appends +// ". Proceed? [y/N]". +const DEPRECATION_NOTICE: &str = "The doublezero-solana client will soon be deprecated for Edge \ + shreds payments. You will be able to manage your account through https://www.fastshreds.com. \ + For existing users, we suggest making a new purchase on the front end when monthly payments \ + are available. You can then proceed to withdraw funds in the CLI and close out this account. \ + This command will fund your seat now"; + +/// Inputs for the epoch-remaining warning check, separated from I/O for testability. +struct EpochWarningInput { + accept_partial_epoch: bool, + dry_run: bool, + seat_active_this_epoch: bool, + prorated_service_enabled: bool, + slot_index: u64, + slots_in_epoch: u64, +} + +/// Returns `true` when the client seat already has an active allocation +/// (`tenure_epochs > 0`). Re-funding an active seat only needs to top up the +/// escrow — requesting a new instant allocation would fail onchain because the +/// seat is already counted against the device's available capacity. +/// +/// Uses `tenure_epochs` rather than `active_epoch` because `BatchClearTenure` +/// zeros only `tenure_epochs` when a seat loses its allocation (leaving +/// `active_epoch` stale). Checking `active_epoch > 0` would incorrectly +/// treat a cleared seat as active and skip the instant allocation request. +fn is_seat_already_active(seat_data: Option<&[u8]>) -> bool { + seat_data + .and_then(state::parse_client_seat) + .map(|(_, _, tenure_epochs, _, _)| tenure_epochs > 0) + .unwrap_or(false) +} + +/// Returns `Some(prompt_message)` if the user should be warned about paying late +/// in the epoch, or `None` if no warning is needed. +fn epoch_warning_prompt(input: &EpochWarningInput) -> Option { + if input.accept_partial_epoch + || input.dry_run + || input.seat_active_this_epoch + || input.prorated_service_enabled + { + return None; + } + + if input.slot_index >= input.slots_in_epoch { + return None; + } + + let remaining_pct = + (input.slots_in_epoch - input.slot_index) as f64 / input.slots_in_epoch as f64; + + if remaining_pct >= EPOCH_REMAINING_WARNING_THRESHOLD { + return None; + } + + // The nominal slot duration, not the observed one. Actual slot times vary + // with network conditions, so both numbers are approximate and are printed + // with a "~" prefix. + let remaining_secs = + (input.slots_in_epoch - input.slot_index) as f64 * NOMINAL_SLOT_DURATION.as_secs_f64(); + let total_secs = input.slots_in_epoch as f64 * NOMINAL_SLOT_DURATION.as_secs_f64(); + + Some(format!( + "Only {:.1}% of the current Solana epoch remains ({} of {}).\n \ + Your seat will be allocated immediately, but covers only the remaining {} of this epoch.\n \ + A separate payment for the next epoch will be deducted in {} when this epoch ends", + remaining_pct * 100.0, + format_duration(remaining_secs), + format_duration(total_secs), + format_duration(remaining_secs), + format_duration(remaining_secs), + )) +} + +// Inputs for the `--amount` floor, separated from I/O for testability. +struct SeatPriceInput { + amount_micro: u64, + seat_price_override: Option, + // What the program charges, and the epoch that payment covers. For a new + // instant seat allocation this is the ring entry at `last_settled_epoch`, + // because the seat covers the remainder of the epoch currently being + // served. For an already-active seat it is the newest ring entry, because + // no `RequestInstantSeatAllocation` is submitted and the payment funds the + // next settlement. + charged_price_dollars: u16, + charged_epoch: u64, + is_instant_allocation: bool, + // The newest ring entry: what the next settlement charges. Used only to + // explain a divergence on the instant-allocation path, where a metro that + // repriced at the epoch boundary charges more than `shreds price` quotes. + next_settlement_epoch: u64, + next_settlement_price_dollars: u16, +} + +/// Returns `Some(message)` when `amount_micro` is below the price the program +/// will charge, or `None` when the amount covers it. +/// +/// The floor is deliberately not prorated. With `prorated_service_enabled` the +/// program charges only for the remainder of the epoch, so a full-price floor +/// is stricter than required — but it is always >= what the program requires, +/// and any surplus stays in the escrow. +fn seat_price_shortfall_message(input: &SeatPriceInput) -> Option { + let required_micro = input + .seat_price_override + .unwrap_or(input.charged_price_dollars as u64 * 1_000_000); + + if input.amount_micro >= required_micro { + return None; + } + + let amount_usdc = input.amount_micro as f64 / 1_000_000.0; + let required_usdc = required_micro as f64 / 1_000_000.0; + let required_dollars = required_micro / 1_000_000; + let charged_epoch = input.charged_epoch; + + if !input.is_instant_allocation { + return Some(format!( + "Amount ({amount_usdc:.6} USDC) is below the seat price for the next epoch \ + ({required_usdc:.6} USDC).\n \ + Your seat is already active, so this payment funds the escrow for epoch \ + {charged_epoch}, priced at {required_dollars} USDC." + )); + } + + let mut message = format!( + "Amount ({amount_usdc:.6} USDC) is below the seat price charged for this epoch \ + ({required_usdc:.6} USDC).\n \ + The seat you are buying covers the remainder of epoch {charged_epoch}, priced at \ + {required_dollars} USDC." + ); + + // A per-seat override applies regardless of epoch, so there is no + // divergence to explain in that case. + if input.seat_price_override.is_none() + && input.next_settlement_price_dollars != input.charged_price_dollars + { + message.push_str(&format!( + "\n The price changes to {} USDC in epoch {}.", + input.next_settlement_price_dollars, input.next_settlement_epoch, + )); + } + + Some(message) +} + +/// Given raw account data from a `getProgramAccounts` query filtered by +/// client IP, return the device keys of any **active** seats that are NOT on +/// `target_device`. Withdrawn seats (`tenure_epochs == 0`) are excluded +/// because they will never win an auction and are harmless — blocking on +/// them would prevent users from migrating an IP to a new device after +/// withdrawal. An empty vec means no conflict. +/// Whether an existing serviceability User PDA for this IP, owned by +/// `user_owner`, is benign for this `pay` call. The shred oracle's +/// `CreateSubscribeUser` would collide on the User PDA unless the existing +/// owner is either the oracle (legacy top-up / re-sub) or the wallet +/// running this command (self-owned per the new design). +fn user_owner_is_acceptable( + user_owner: Option, + oracle_key: Option, + wallet_key: Pubkey, +) -> bool { + let is_shred_oracle_user = oracle_key.zip(user_owner).is_some_and(|(o, u)| o == u); + let is_self_owned = user_owner == Some(wallet_key); + is_shred_oracle_user || is_self_owned +} + +fn other_device_keys_for_ip( + accounts: &[(Pubkey, solana_sdk::account::Account)], + target_device: &Pubkey, +) -> Vec { + accounts + .iter() + .filter_map(|(_, account)| { + let (device_key, _, tenure_epochs, _, _) = state::parse_client_seat(&account.data)?; + if device_key != *target_device && tenure_epochs > 0 { + Some(device_key) + } else { + None + } + }) + .collect() +} + +/* + doublezero-solana shreds pay \ + --device | --device-code \ + --client-ip --amount +*/ + +#[derive(Debug, Args)] +pub struct PayCommand { + #[command(flatten)] + device_args: super::DeviceArgs, + /// Client IPv4 address + #[arg(long)] + client_ip: Ipv4Addr, + /// Amount of USDC to fund (in decimal, e.g. 1.5 = 1_500_000 micro-USDC) + #[arg(long)] + amount: f64, + /// USDC mint (auto-detected from network: mainnet or development) + #[arg(long, hide = true)] + usdc_mint: Option, + /// Source USDC token account (defaults to payer's ATA) + #[arg(long)] + source_token_account: Option, + /// Skip the epoch-remaining warning prompt (for batch/multi-seat workflows) + #[arg(long)] + accept_partial_epoch: bool, + /// Acknowledge the fastshreds.com transition notice without prompting + /// (for batch/multi-seat workflows). The notice is still printed. + #[arg(long)] + accept_deprecation_notice: bool, + /// Shred oracle pubkey (auto-detected from network; override for local dev) + #[arg(long, hide = true)] + shred_oracle_key: Option, + /// Serviceability program ID for the multicast user guard (auto-detected; override for e2e) + #[arg(long, hide = true)] + serviceability_program_id: Option, + + #[command(flatten)] + write_opts: crate::command::WriteVerbOptions, +} + +impl PayCommand { + pub async fn execute( + self, + dz_ledger_url: Option, + ctx: &CliContext, + out: &mut impl Write, + ) -> Result<()> { + // Ahead of `build_wallet` and any RPC, so declining needs neither a + // loadable keypair nor a reachable cluster, and signs nothing. + // + // Both ends of the terminal are required, not just stdin: the prompt is + // written to `out`, so with stdout redirected the question lands in the + // file while `read_line` blocks on a terminal showing nothing. Dry runs + // print only, matching the epoch-remaining prompt below, because a + // simulation signs and sends nothing. A non-terminal stdin must not + // prompt for a second reason — keypair-from-stdin requires a non-tty + // stdin, so prompting there would consume the keypair bytes. + let should_prompt = !self.accept_deprecation_notice + && !self.write_opts.dry_run + && std::io::stdin().is_terminal() + && std::io::stdout().is_terminal(); + + if should_prompt { + crate::command::try_prompt_proceed_confirmation( + out, + DEPRECATION_NOTICE, + "Aborted. Manage your account at https://www.fastshreds.com.", + )?; + } else { + writeln!(out, "⚠️ {DEPRECATION_NOTICE}.")?; + } + + let moniker_env = self.write_opts.connection_options.moniker_env(); + let wallet = crate::command::build_wallet(ctx, self.write_opts)?; + let wallet_key = wallet.pubkey(); + + writeln!(out, "Shred subscription - Pay")?; + + let network_env = + crate::command::resolve_network_env(&wallet.connection, moniker_env).await?; + writeln!(out, "Connected to Solana: {network_env:?}")?; + + let device = self + .device_args + .resolve(network_env, &dz_ledger_url) + .await?; + let client_ip_bits = u32::from(self.client_ip); + + // Best-effort check: if this client IP already has a Multicast user on + // serviceability owned by neither the shred oracle nor the wallet + // running this command, the shred oracle's CreateSubscribeUser would + // collide on the User PDA. Both oracle-owned (legacy top-up / re-sub) + // and self-owned (validator-owned per the new design) are benign. + let svc_program_id_result = match self.serviceability_program_id { + Some(id) => Ok(id), + None => serviceability_program_id(network_env), + }; + if let Ok(svc_program_id) = svc_program_id_result { + let oracle_key = self + .shred_oracle_key + .or_else(|| super::shred_oracle_key(network_env)); + + let dz_connection = make_dz_connection(&dz_ledger_url, network_env); + let (user_pda, _) = get_user_pda(&svc_program_id, &self.client_ip, UserType::Multicast); + if let Ok(Some(user_account)) = dz_connection + .get_account_with_commitment(&user_pda, CommitmentConfig::confirmed()) + .await + .map(|r| r.value) + { + let user_owner = if user_account.data.len() >= 33 { + Pubkey::try_from(&user_account.data[1..33]).ok() + } else { + None + }; + + if !user_owner_is_acceptable(user_owner, oracle_key, wallet.pubkey()) { + bail!( + "Client IP {} already has a multicast user on serviceability \ + owned by neither the shred oracle nor your wallet. This IP \ + may be subscribed to another wallet's multicast group. \ + Disconnect first (doublezero disconnect) before purchasing \ + a shred subscription.", + self.client_ip, + ); + } + } + } + + // Derive PDAs. + let (client_seat_key, seat_bump) = state::find_client_seat_address(&device, client_ip_bits); + let (escrow_key, escrow_bump) = + state::find_payment_escrow_address(&client_seat_key, &wallet_key); + let (program_config_key, _) = state::find_program_config_address(); + let (execution_controller_key, _) = state::find_execution_controller_address(); + + // Check which accounts already exist onchain, and read the epoch the + // program prices an instant seat allocation from. + let mut accounts = wallet + .connection + .get_multiple_accounts(&[ + client_seat_key, + escrow_key, + program_config_key, + execution_controller_key, + ]) + .await? + .into_iter(); + let seat_account = accounts.next().flatten(); + let seat_exists = seat_account.is_some(); + let escrow_exists = accounts.next().flatten().is_some(); + let prorated_service_enabled = accounts + .next() + .flatten() + .is_some_and(|a| state::is_prorated_service_enabled(&a.data)); + let last_settled_epoch = accounts + .next() + .flatten() + .and_then(|a| state::parse_execution_controller_last_settled_epoch(&a.data)) + .with_context(|| { + format!("Execution controller {execution_controller_key} missing or unparseable") + })?; + + // Block if this client IP already has a seat on a DIFFERENT device. + // The serviceability User PDA is keyed by (IP, user_type) with no + // device dimension, so two seats for the same IP on different devices + // causes the oracle to fail with AccountAlreadyInitialized. + let discriminator_bytes = + borsh::to_vec(&state::CLIENT_SEAT_DISCRIMINATOR).expect("discriminator serialization"); + let ip_bytes = client_ip_bits.to_le_bytes().to_vec(); + let filters = vec![ + RpcFilterType::Memcmp(Memcmp::new_raw_bytes(0, discriminator_bytes)), + RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + state::CLIENT_SEAT_CLIENT_IP_OFFSET, + ip_bytes, + )), + ]; + let config = RpcProgramAccountsConfig { + filters: Some(filters), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + let existing_seats = wallet + .connection + .get_program_accounts_with_config(&ID, config) + .await?; + + let other_device_keys = other_device_keys_for_ip(&existing_seats, &device); + + if !other_device_keys.is_empty() { + let device_list = other_device_keys + .iter() + .map(|k| k.to_string()) + .collect::>() + .join(", "); + bail!( + "Client IP {} already has a seat on device {}. \ + Withdraw from that device first before creating a seat on a new device.", + self.client_ip, + device_list, + ); + } + + let seat_already_active = + is_seat_already_active(seat_account.as_ref().map(|a| a.data.as_slice())); + + // Epoch-remaining warning: if <10% of the epoch remains, the user is + // paying full price for a partial epoch. Skip if: flag set, dry-run, + // or seat is already active for this epoch (re-fund). + // Single RPC call to avoid race conditions at epoch boundaries. + match wallet.connection.get_epoch_info().await { + Ok(epoch_info) => { + // Use >= (not ==) to handle the unlikely case where active_epoch + // is ahead of the RPC's reported epoch due to timing. + let seat_active_this_epoch = if let Some(seat_account) = seat_account.as_ref() { + if let Some((_, _, _, _, active_epoch)) = + state::parse_client_seat(&seat_account.data) + { + active_epoch >= epoch_info.epoch + } else { + false + } + } else { + false + }; + + let input = EpochWarningInput { + accept_partial_epoch: self.accept_partial_epoch, + dry_run: wallet.dry_run, + seat_active_this_epoch, + prorated_service_enabled, + slot_index: epoch_info.slot_index, + slots_in_epoch: epoch_info.slots_in_epoch, + }; + + if let Some(prompt) = epoch_warning_prompt(&input) { + crate::command::try_prompt_proceed_confirmation( + out, + &prompt, + "Aborted. Consider waiting for the next epoch to start to get a full epoch of service.", + )?; + } + } + Err(e) => { + eprintln!("Warning: could not fetch epoch info: {e}"); + } + } + + let usdc_mint_key = self + .usdc_mint + .unwrap_or(environment_usdc_token_mint_key(network_env)); + + // Convert decimal USDC to micro-USDC (6 decimals). + if self.amount < 0.0 { + bail!("Amount must be a non-negative value"); + } + let amount_micro = (self.amount * 1_000_000.0).round() as u64; + + // Derive the exchange key from the onchain DeviceHistory account. + let device_history_key = state::find_device_history_address(&device).0; + let device_history_account = wallet.connection.get_account(&device_history_key).await?; + let device_info = state::parse_device_history(&device_history_account.data) + .ok_or_else(|| anyhow::anyhow!("Failed to parse DeviceHistory account"))?; + let exchange_key = device_info.exchange_key; + + // Check the price the program will charge so the user gets a friendly + // error instead of an opaque onchain revert. If the seat has a + // per-seat price override, use that instead of the metro base + device + // premium. + let seat_price_override = seat_account + .as_ref() + .and_then(|a| state::parse_client_seat_price_override(&a.data)); + + let metro_history_key = state::find_metro_history_address(&exchange_key).0; + let metro_history_account = wallet.connection.get_account(&metro_history_key).await?; + let metro_info = state::parse_metro_history(&metro_history_account.data) + .with_context(|| format!("Failed to parse MetroHistory {metro_history_key}"))?; + + // Price from the newest ring entries: what the next settlement charges. + let next_settlement_price_dollars = state::seat_usdc_price_dollars( + metro_info.current_usdc_price, + device_info.current_premium, + ); + + // Only a new instant seat allocation is charged from the ring entries + // at `last_settled_epoch` — that seat covers the remainder of the epoch + // currently being served. An already-active seat submits no + // `RequestInstantSeatAllocation`, so this pay is a pure escrow top-up + // and the next settlement charges the newest entry's price. + let (charged_price_dollars, charged_epoch) = if seat_already_active { + (next_settlement_price_dollars, metro_info.current_epoch) + } else { + // Refuse to submit when either ring lacks the settled epoch — + // `RequestInstantSeatAllocation` fails the same way. + let settled_metro_price_dollars = state::parse_metro_history_price_at_epoch( + &metro_history_account.data, + last_settled_epoch, + ) + .with_context(|| { + format!( + "Metro history {metro_history_key} has no price for the last settled epoch \ + {last_settled_epoch}, so the instant seat allocation would be rejected onchain" + ) + })?; + let settled_device_premium_dollars = state::parse_device_history_premium_at_epoch( + &device_history_account.data, + last_settled_epoch, + ) + .with_context(|| { + format!( + "Device history {device_history_key} has no subscription for the last settled \ + epoch {last_settled_epoch}, so the instant seat allocation would be rejected \ + onchain" + ) + })?; + ( + state::seat_usdc_price_dollars( + settled_metro_price_dollars, + settled_device_premium_dollars, + ), + last_settled_epoch, + ) + }; + + if let Some(message) = seat_price_shortfall_message(&SeatPriceInput { + amount_micro, + seat_price_override, + charged_price_dollars, + charged_epoch, + is_instant_allocation: !seat_already_active, + next_settlement_epoch: metro_info.current_epoch, + next_settlement_price_dollars, + }) { + bail!(message); + } + + if !seat_already_active + && device_info.granted_seat_count >= device_info.total_available_seats + { + bail!( + "Device has no available seats ({}/{} granted). Choose another device.", + device_info.granted_seat_count, + device_info.total_available_seats, + ); + } + + let mut instructions = vec![super::build_check_cli_version_instruction()?]; + let mut compute_unit_limit = 5_000u32; + + if !seat_exists { + let seat_ix = try_build_instruction( + &ID, + InitializeClientSeatAccounts::new(&wallet_key, &device, client_ip_bits), + &ShredSubscriptionInstructionData::InitializeClientSeat { + client_ip: client_ip_bits, + }, + )?; + instructions.push(seat_ix); + compute_unit_limit += 50_000 + Wallet::compute_units_for_bump_seed(seat_bump); + } + + if !escrow_exists { + let escrow_ix = try_build_instruction( + &ID, + InitializePaymentEscrowAccounts::new(&client_seat_key, &wallet_key), + &ShredSubscriptionInstructionData::InitializePaymentEscrow, + )?; + instructions.push(escrow_ix); + compute_unit_limit += 50_000 + Wallet::compute_units_for_bump_seed(escrow_bump); + } + + let source_usdc_token_account = self + .source_token_account + .unwrap_or_else(|| get_associated_token_address(&wallet_key, &usdc_mint_key)); + + let fund_ix = try_build_instruction( + &ID, + FundPaymentEscrowUsdcAccounts::new( + &exchange_key, + &device, + client_ip_bits, + &wallet_key, + &usdc_mint_key, + &source_usdc_token_account, + &wallet_key, + ), + &ShredSubscriptionInstructionData::FundPaymentEscrowUsdc(amount_micro), + )?; + instructions.push(fund_ix); + compute_unit_limit += 50_000; + + if !seat_already_active { + let request_ix = try_build_instruction( + &ID, + RequestInstantSeatAllocationAccounts::new( + &exchange_key, + &device, + client_ip_bits, + &wallet_key, + &wallet_key, + ), + &ShredSubscriptionInstructionData::RequestInstantSeatAllocation, + )?; + instructions.push(request_ix); + compute_unit_limit += 50_000; + } + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + writeln!(out, "Fund escrow ({} USDC): {tx_sig}", self.amount)?; + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + Ok(()) + } +} + +/// Format a duration in seconds as a human-readable approximate string. +fn format_duration(seconds: f64) -> String { + if seconds >= 3600.0 { + format!("~{:.1} hours", seconds / 3600.0) + } else { + let minutes = (seconds / 60.0).round() as u64; + if minutes == 1 { + "~1 minute".to_string() + } else { + format!("~{minutes} minutes") + } + } +} + +#[cfg(test)] +mod tests { + use solana_sdk::account::Account; + + use super::*; + + // --- format_duration tests --- + + #[test] + fn format_duration_hours() { + assert_eq!(format_duration(7200.0), "~2.0 hours"); + assert_eq!(format_duration(5400.0), "~1.5 hours"); + assert_eq!(format_duration(3600.0), "~1.0 hours"); + } + + #[test] + fn format_duration_minutes() { + assert_eq!(format_duration(600.0), "~10 minutes"); + assert_eq!(format_duration(90.0), "~2 minutes"); + assert_eq!(format_duration(30.0), "~1 minute"); + } + + #[test] + fn format_duration_zero() { + assert_eq!(format_duration(0.0), "~0 minutes"); + } + + #[test] + fn format_duration_boundary() { + // Just under an hour -> minutes + assert_eq!(format_duration(3599.0), "~60 minutes"); + // Exactly an hour -> hours + assert_eq!(format_duration(3600.0), "~1.0 hours"); + } + + // --- deprecation notice tests --- + + #[test] + fn test_notice_text_has_no_trailing_period() { + assert!(!DEPRECATION_NOTICE.ends_with('.')); + assert!(!DEPRECATION_NOTICE.contains('\n')); + } + + #[derive(clap::Parser)] + struct NoticeCli { + #[command(flatten)] + command: PayCommand, + } + + // `--keypair` points at a path that cannot exist, so `build_wallet` fails + // deterministically instead of finding a developer's keypair and reaching + // the network. + fn pay_command(extra_args: &[&str]) -> PayCommand { + use clap::Parser; + + let device = Pubkey::new_unique().to_string(); + let mut args = vec![ + "test", + "--device", + &device, + "--client-ip", + "203.0.113.10", + "--amount", + "30", + "--keypair", + "/nonexistent/keypair.json", + ]; + args.extend_from_slice(extra_args); + + NoticeCli::try_parse_from(args) + .expect("pay args parse") + .command + } + + #[tokio::test] + async fn test_notice_prints_when_flag_is_absent() { + let ctx = doublezero_cli_core::testing::cli_context_default_for_tests(); + let mut out = Vec::new(); + + let result = pay_command(&[]).execute(None, &ctx, &mut out).await; + + assert_eq!( + String::from_utf8(out).expect("output is utf8"), + format!("⚠️ {DEPRECATION_NOTICE}.\n") + ); + assert_eq!( + result.unwrap_err().to_string(), + "Failed to read keypair file '/nonexistent/keypair.json': \ + No such file or directory (os error 2)" + ); + } + + #[tokio::test] + async fn test_notice_flag_proceeds_to_the_payment_flow() { + let ctx = doublezero_cli_core::testing::cli_context_default_for_tests(); + let mut out = Vec::new(); + + let result = pay_command(&["--accept-deprecation-notice"]) + .execute(None, &ctx, &mut out) + .await; + + assert_eq!( + String::from_utf8(out).expect("output is utf8"), + format!("⚠️ {DEPRECATION_NOTICE}.\n") + ); + + assert_eq!( + result.unwrap_err().to_string(), + "Failed to read keypair file '/nonexistent/keypair.json': \ + No such file or directory (os error 2)" + ); + } + + // --- epoch_warning_prompt tests (behavior matrix) --- + + fn make_input(remaining_pct: f64) -> EpochWarningInput { + let slots_in_epoch = 432_000; // typical Solana epoch + let slot_index = ((1.0 - remaining_pct) * slots_in_epoch as f64) as u64; + EpochWarningInput { + accept_partial_epoch: false, + dry_run: false, + seat_active_this_epoch: false, + prorated_service_enabled: false, + slot_index, + slots_in_epoch, + } + } + + #[test] + fn no_warning_when_epoch_has_plenty_remaining() { + let input = make_input(0.50); // 50% remaining + assert!(epoch_warning_prompt(&input).is_none()); + } + + #[test] + fn no_warning_at_exactly_threshold() { + let input = make_input(0.10); // exactly 10% + assert!(epoch_warning_prompt(&input).is_none()); + } + + #[test] + fn warning_when_below_threshold() { + let input = make_input(0.05); // 5% remaining + let prompt = epoch_warning_prompt(&input).expect("should warn"); + assert!(prompt.contains("5.0%")); + assert!(prompt.contains("Your seat will be allocated immediately")); + assert!(prompt.contains("A separate payment for the next epoch")); + } + + #[test] + fn no_warning_when_accept_partial_epoch_set() { + let mut input = make_input(0.05); + input.accept_partial_epoch = true; + assert!(epoch_warning_prompt(&input).is_none()); + } + + #[test] + fn no_warning_when_dry_run() { + let mut input = make_input(0.05); + input.dry_run = true; + assert!(epoch_warning_prompt(&input).is_none()); + } + + #[test] + fn no_warning_when_seat_already_active() { + let mut input = make_input(0.05); + input.seat_active_this_epoch = true; + assert!(epoch_warning_prompt(&input).is_none()); + } + + #[test] + fn no_warning_when_prorated_service_enabled() { + // Late in epoch + prorated on → warning is moot because the user + // only pays for the remaining slots. + let mut input = make_input(0.02); + input.prorated_service_enabled = true; + assert!(epoch_warning_prompt(&input).is_none()); + } + + #[test] + fn no_warning_when_slots_in_epoch_zero() { + let input = EpochWarningInput { + accept_partial_epoch: false, + dry_run: false, + seat_active_this_epoch: false, + prorated_service_enabled: false, + slot_index: 0, + slots_in_epoch: 0, + }; + assert!(epoch_warning_prompt(&input).is_none()); + } + + #[test] + fn warning_message_contains_time_estimates() { + let input = make_input(0.05); + let prompt = epoch_warning_prompt(&input).expect("should warn"); + // 5% of 432,000 slots = 21,600 slots * 0.35 s = 7,560 s = 2.1 hours + assert!(prompt.contains("~2.1 hours")); + // Total epoch: 432,000 * 0.35 s = 151,200 s = 42.0 hours + assert!(prompt.contains("~42.0 hours")); + } + + #[test] + fn warning_near_epoch_end() { + // ~1% remaining + let input = make_input(0.01); + let prompt = epoch_warning_prompt(&input).expect("should warn"); + assert!(prompt.contains("1.0%")); + } + + // --- Additional coverage: format_duration edge cases --- + + // 29 s rounds to 0, 30 s rounds to 1. The existing test_minutes test + // covers 30 s ("~1 minute") but never calls the sub-minute path. + #[test] + fn format_duration_sub_minute_rounds_to_zero() { + // 29 s → 0.483 minutes → rounds to 0 + assert_eq!(format_duration(29.0), "~0 minutes"); + } + + #[test] + fn format_duration_fractional_seconds_rounds_correctly() { + // 89.9 s → 1.498 minutes → rounds to 1 + assert_eq!(format_duration(89.9), "~1 minute"); + // 90.1 s → 1.502 minutes → rounds to 2 + assert_eq!(format_duration(90.1), "~2 minutes"); + } + + // The spec says format_duration is used exclusively for display of slot-based + // time estimates (non-negative). Confirm zero-slot-remaining produces "~0 minutes" + // rather than panicking. + #[test] + fn format_duration_exactly_zero_slots_remaining() { + // 0 slots * 0.35 s = 0.0 s + assert_eq!( + format_duration(0.0 * NOMINAL_SLOT_DURATION.as_secs_f64()), + "~0 minutes" + ); + } + + // --- Additional coverage: epoch_warning_prompt edge cases --- + + // Spec row: "not passed | no | no | >= 10% → Proceed silently". + // The 10% boundary is already tested; cover 10.0001% to be sure the + // threshold is exclusive-above (>= 0.10 means no warning). + #[test] + fn no_warning_just_above_threshold() { + // 10.01% remaining — should NOT warn + let slots_in_epoch = 432_000u64; + let slot_index = ((1.0 - 0.1001_f64) * slots_in_epoch as f64) as u64; + let input = EpochWarningInput { + accept_partial_epoch: false, + dry_run: false, + seat_active_this_epoch: false, + prorated_service_enabled: false, + slot_index, + slots_in_epoch, + }; + assert!(epoch_warning_prompt(&input).is_none()); + } + + // Spec row: "not passed | no | no | < 10% → Show warning + prompt". + // Test the boundary from the other side: just under 10%. + #[test] + fn warning_just_below_threshold() { + // 9.99% remaining — should warn + let slots_in_epoch = 432_000u64; + let slot_index = ((1.0 - 0.0999_f64) * slots_in_epoch as f64) as u64; + let input = EpochWarningInput { + accept_partial_epoch: false, + dry_run: false, + seat_active_this_epoch: false, + prorated_service_enabled: false, + slot_index, + slots_in_epoch, + }; + assert!(epoch_warning_prompt(&input).is_some()); + } + + // When slot_index == slots_in_epoch (epoch boundary), the guard returns + // None to avoid u64 underflow. This is safe — the epoch is transitioning. + #[test] + fn no_warning_when_slot_index_equals_slots_in_epoch() { + let slots_in_epoch = 432_000u64; + let input = EpochWarningInput { + accept_partial_epoch: false, + dry_run: false, + seat_active_this_epoch: false, + prorated_service_enabled: false, + slot_index: slots_in_epoch, + slots_in_epoch, + }; + assert!(epoch_warning_prompt(&input).is_none()); + } + + // When slot_index > slots_in_epoch (transient RPC timing), the guard + // returns None to prevent u64 underflow panic. + #[test] + fn no_warning_when_slot_index_exceeds_slots_in_epoch() { + let input = EpochWarningInput { + accept_partial_epoch: false, + dry_run: false, + seat_active_this_epoch: false, + prorated_service_enabled: false, + slot_index: 432_001, + slots_in_epoch: 432_000, + }; + assert!(epoch_warning_prompt(&input).is_none()); + } + + // Verify that exactly 1 slot remaining triggers a warning and produces + // a minutes-based (not hours-based) time estimate. + #[test] + fn warning_with_one_slot_remaining() { + let slots_in_epoch = 432_000u64; + let input = EpochWarningInput { + accept_partial_epoch: false, + dry_run: false, + seat_active_this_epoch: false, + prorated_service_enabled: false, + slot_index: slots_in_epoch - 1, // 1 slot = 0.35 s remaining + slots_in_epoch, + }; + let prompt = epoch_warning_prompt(&input).expect("should warn"); + // 1 slot * 0.35 s = 0.35 s → rounds to "~0 minutes" + assert!(prompt.contains("~0 minutes")); + // Total epoch is hours, not minutes + assert!(prompt.contains("~42.0 hours")); + } + + // Spec row: "passed | any | any | any → Proceed silently, no warning". + // Test that accept_partial_epoch suppresses the warning even when all + // other flags would also suppress it (ensure the OR-of-suppressors + // never produces a warning regardless of combination). + #[test] + fn no_warning_when_all_suppress_flags_set_simultaneously() { + let mut input = make_input(0.01); // deep in warning zone + input.accept_partial_epoch = true; + input.dry_run = true; + input.seat_active_this_epoch = true; + assert!(epoch_warning_prompt(&input).is_none()); + } + + // accept_partial_epoch + dry_run (two flags, seat not active) + #[test] + fn no_warning_accept_partial_and_dry_run_combined() { + let mut input = make_input(0.01); + input.accept_partial_epoch = true; + input.dry_run = true; + assert!(epoch_warning_prompt(&input).is_none()); + } + + // dry_run + seat_active (two flags, accept_partial not set) + #[test] + fn no_warning_dry_run_and_seat_active_combined() { + let mut input = make_input(0.01); + input.dry_run = true; + input.seat_active_this_epoch = true; + assert!(epoch_warning_prompt(&input).is_none()); + } + + // Verify the warning content uses minutes (not hours) for the remaining-time + // fields when less than an hour remains, even though the total epoch time is + // still rendered in hours. + // 1% of a 432,000-slot epoch = 4,320 slots * 0.35 s = 1,512 s = 25.2 minutes + #[test] + fn warning_near_epoch_end_shows_minutes_for_remaining_time() { + let input = make_input(0.01); // 1% remaining → ~25 minutes + let prompt = epoch_warning_prompt(&input).expect("should warn"); + // The remaining-time estimate must appear as minutes. + assert!( + prompt.contains("~25 minutes"), + "expected '~25 minutes' for remaining time, got: {prompt}" + ); + // The total epoch estimate is still rendered in hours. + assert!( + prompt.contains("~42.0 hours"), + "expected '~42.0 hours' for total epoch, got: {prompt}" + ); + } + + // Verify the warning message contains the percentage, both time estimates + // (remaining and total), and the key user-facing sentences — a complete + // structural check rather than spot-checks. + #[test] + fn warning_message_complete_structure() { + let input = make_input(0.05); // 5% remaining + let prompt = epoch_warning_prompt(&input).unwrap(); + assert!(prompt.contains("5.0%"), "missing percentage"); + assert!( + prompt.contains("~2.1 hours"), + "missing remaining time estimate" + ); + assert!( + prompt.contains("~42.0 hours"), + "missing total epoch time estimate" + ); + assert!( + prompt.contains("Your seat will be allocated immediately"), + "missing allocation sentence" + ); + assert!( + prompt.contains("covers only the remaining"), + "missing coverage sentence" + ); + assert!( + prompt.contains("A separate payment for the next epoch"), + "missing next-epoch payment sentence" + ); + assert!( + prompt.contains("when this epoch ends"), + "missing epoch-end clause" + ); + } + + // Verify that a non-standard (small) epoch size still computes correctly. + // Solana devnet and localnet use smaller epoch sizes. + #[test] + fn warning_with_small_epoch_size() { + // 8-slot devnet-like epoch, 1 slot remaining = 12.5%, below threshold + let slots_in_epoch = 8u64; + // 7/8 = 87.5% used → 12.5% remaining: above threshold, no warning + let input_above = EpochWarningInput { + accept_partial_epoch: false, + dry_run: false, + seat_active_this_epoch: false, + prorated_service_enabled: false, + slot_index: 7, + slots_in_epoch, + }; + assert!(epoch_warning_prompt(&input_above).is_none()); + + // 8/8 used → slot_index == slots_in_epoch: guard returns None (epoch boundary) + let input_boundary = EpochWarningInput { + accept_partial_epoch: false, + dry_run: false, + seat_active_this_epoch: false, + prorated_service_enabled: false, + slot_index: 8, + slots_in_epoch, + }; + assert!(epoch_warning_prompt(&input_boundary).is_none()); + } + + // Verify that slots_in_epoch = 1 (pathological minimum non-zero epoch) + // does not panic and returns None because 100% - 0% = 100% > 10%. + #[test] + fn no_warning_with_single_slot_epoch_at_start() { + let input = EpochWarningInput { + accept_partial_epoch: false, + dry_run: false, + seat_active_this_epoch: false, + prorated_service_enabled: false, + slot_index: 0, + slots_in_epoch: 1, + }; + // 1/1 = 100% remaining → no warning + assert!(epoch_warning_prompt(&input).is_none()); + } + + // --- is_seat_already_active tests --- + + const TENURE_OFFSET: usize = 46; // DISCRIMINATOR_LEN (8) + 38 + const ACTIVE_EPOCH_OFFSET: usize = 64; // DISCRIMINATOR_LEN (8) + 56 + + /// Build a minimal ClientSeat byte buffer with the given tenure_epochs + /// and active_epoch. The buffer must be at least 72 bytes for + /// `parse_client_seat` to succeed. + fn make_seat_data_ex(tenure_epochs: u16, active_epoch: u64) -> Vec { + let mut data = vec![0u8; 72]; + data[TENURE_OFFSET..TENURE_OFFSET + 2].copy_from_slice(&tenure_epochs.to_le_bytes()); + data[ACTIVE_EPOCH_OFFSET..ACTIVE_EPOCH_OFFSET + 8] + .copy_from_slice(&active_epoch.to_le_bytes()); + data + } + + #[test] + fn seat_active_when_tenure_nonzero() { + let data = make_seat_data_ex(3, 7); + assert!(is_seat_already_active(Some(&data))); + } + + #[test] + fn seat_not_active_when_tenure_zero() { + let data = make_seat_data_ex(0, 0); + assert!(!is_seat_already_active(Some(&data))); + } + + #[test] + fn seat_not_active_when_tenure_cleared_but_active_epoch_stale() { + // Regression: BatchClearTenure zeros tenure_epochs but leaves + // active_epoch at the old value. The old `active_epoch > 0` check + // would incorrectly return true here. + let data = make_seat_data_ex(0, 5); + assert!(!is_seat_already_active(Some(&data))); + } + + #[test] + fn seat_not_active_when_no_account() { + assert!(!is_seat_already_active(None)); + } + + #[test] + fn seat_not_active_when_data_too_short() { + let short_data = vec![0u8; 10]; + assert!(!is_seat_already_active(Some(&short_data))); + } + + // --- other_device_keys_for_ip tests --- + + /// Build a minimal ClientSeat byte buffer with the given device key and + /// tenure_epochs value. + fn make_seat_with_device(device: &Pubkey, tenure_epochs: u16) -> Account { + let mut data = vec![0u8; 72]; + data[8..40].copy_from_slice(device.as_ref()); + data[TENURE_OFFSET..TENURE_OFFSET + 2].copy_from_slice(&tenure_epochs.to_le_bytes()); + Account { + data, + ..Account::default() + } + } + + #[test] + fn no_conflict_when_no_seats() { + let target = Pubkey::new_unique(); + assert!(other_device_keys_for_ip(&[], &target).is_empty()); + } + + #[test] + fn no_conflict_when_only_same_device() { + let target = Pubkey::new_unique(); + let accounts = vec![(Pubkey::new_unique(), make_seat_with_device(&target, 1))]; + assert!(other_device_keys_for_ip(&accounts, &target).is_empty()); + } + + #[test] + fn conflict_when_different_device() { + let target = Pubkey::new_unique(); + let other = Pubkey::new_unique(); + let accounts = vec![(Pubkey::new_unique(), make_seat_with_device(&other, 1))]; + let result = other_device_keys_for_ip(&accounts, &target); + assert_eq!(result.len(), 1); + assert_eq!(result[0], other); + } + + #[test] + fn conflict_filters_out_target_device() { + let target = Pubkey::new_unique(); + let other = Pubkey::new_unique(); + let accounts = vec![ + (Pubkey::new_unique(), make_seat_with_device(&target, 1)), + (Pubkey::new_unique(), make_seat_with_device(&other, 1)), + ]; + let result = other_device_keys_for_ip(&accounts, &target); + assert_eq!(result.len(), 1); + assert_eq!(result[0], other); + } + + #[test] + fn conflict_multiple_other_devices() { + let target = Pubkey::new_unique(); + let other1 = Pubkey::new_unique(); + let other2 = Pubkey::new_unique(); + let accounts = vec![ + (Pubkey::new_unique(), make_seat_with_device(&other1, 1)), + (Pubkey::new_unique(), make_seat_with_device(&other2, 1)), + ]; + let result = other_device_keys_for_ip(&accounts, &target); + assert_eq!(result.len(), 2); + } + + #[test] + fn no_conflict_when_other_device_seat_withdrawn() { + let target = Pubkey::new_unique(); + let other = Pubkey::new_unique(); + let accounts = vec![(Pubkey::new_unique(), make_seat_with_device(&other, 0))]; + assert!(other_device_keys_for_ip(&accounts, &target).is_empty()); + } + + // --- seat_price_shortfall_message tests --- + + /// The production incident, buying a new seat: metro `lax-dz001` repriced + /// 43 -> 10, so the entry at `last_settled_epoch` charges 43 while the + /// newest entry quotes 10. The floor must be 43. + fn repriced_metro_input(amount_micro: u64) -> SeatPriceInput { + SeatPriceInput { + amount_micro, + seat_price_override: None, + charged_price_dollars: 43, + charged_epoch: 946, + is_instant_allocation: true, + next_settlement_epoch: 947, + next_settlement_price_dollars: 10, + } + } + + #[test] + fn test_shortfall_rejects_amount_at_the_newest_entry_price() { + let message = + seat_price_shortfall_message(&repriced_metro_input(10_000_000)).expect("should reject"); + assert!( + message.contains("Amount (10.000000 USDC) is below the seat price charged for this epoch (43.000000 USDC)."), + "got: {message}" + ); + assert!( + message.contains("covers the remainder of epoch 946, priced at 43 USDC"), + "got: {message}" + ); + assert!( + message.contains("The price changes to 10 USDC in epoch 947."), + "got: {message}" + ); + } + + #[test] + fn test_shortfall_accepts_the_settled_epoch_price() { + assert!(seat_price_shortfall_message(&repriced_metro_input(43_000_000)).is_none()); + assert!(seat_price_shortfall_message(&repriced_metro_input(50_000_000)).is_none()); + assert!(seat_price_shortfall_message(&repriced_metro_input(42_999_999)).is_some()); + } + + // An already-active seat submits no instant allocation request, so the + // floor is the next settlement's price. After the same 43 -> 10 decrease, + // topping up at the new price must be accepted — the settled-epoch floor + // applies only to the seat purchase. + #[test] + fn test_shortfall_active_seat_top_up_uses_the_next_settlement_price() { + let input = SeatPriceInput { + amount_micro: 10_000_000, + seat_price_override: None, + charged_price_dollars: 10, + charged_epoch: 947, + is_instant_allocation: false, + next_settlement_epoch: 947, + next_settlement_price_dollars: 10, + }; + assert!(seat_price_shortfall_message(&input).is_none()); + } + + #[test] + fn test_shortfall_active_seat_top_up_message_describes_the_escrow() { + let input = SeatPriceInput { + amount_micro: 9_000_000, + seat_price_override: None, + charged_price_dollars: 10, + charged_epoch: 947, + is_instant_allocation: false, + next_settlement_epoch: 947, + next_settlement_price_dollars: 10, + }; + let message = seat_price_shortfall_message(&input).expect("should reject"); + assert!( + message.contains( + "Amount (9.000000 USDC) is below the seat price for the next epoch (10.000000 USDC)." + ), + "got: {message}" + ); + assert!( + message.contains("funds the escrow for epoch 947, priced at 10 USDC"), + "got: {message}" + ); + // The user is not buying a seat, so the purchase wording must not appear. + assert!( + !message.contains("The seat you are buying"), + "got: {message}" + ); + } + + #[test] + fn test_shortfall_omits_divergence_line_when_price_is_stable() { + let mut input = repriced_metro_input(5_000_000); + input.next_settlement_price_dollars = 43; + let message = seat_price_shortfall_message(&input).expect("should reject"); + assert!( + !message.contains("The price changes"), + "unexpected divergence line: {message}" + ); + } + + #[test] + fn test_shortfall_seat_price_override_takes_precedence() { + // Override (5 USDC) wins over the epoch-derived price (43 USDC). + let mut input = repriced_metro_input(5_000_000); + input.seat_price_override = Some(5_000_000); + assert!(seat_price_shortfall_message(&input).is_none()); + + let mut input = repriced_metro_input(4_000_000); + input.seat_price_override = Some(5_000_000); + let message = seat_price_shortfall_message(&input).expect("should reject"); + assert!(message.contains("priced at 5 USDC"), "got: {message}"); + // The override applies every epoch, so there is no divergence to note. + assert!( + !message.contains("The price changes"), + "unexpected divergence line: {message}" + ); + } + + #[test] + fn test_shortfall_accepts_any_amount_when_seat_is_free() { + let mut input = repriced_metro_input(0); + input.charged_price_dollars = 0; + input.next_settlement_price_dollars = 0; + assert!(seat_price_shortfall_message(&input).is_none()); + } + + // --- user_owner_is_acceptable tests --- + + #[test] + fn user_acceptable_when_owned_by_shred_oracle() { + let oracle = Pubkey::new_unique(); + let wallet = Pubkey::new_unique(); + assert!(user_owner_is_acceptable(Some(oracle), Some(oracle), wallet,)); + } + + #[test] + fn user_acceptable_when_self_owned() { + // New behavior: validator-owned (self-owned) Users are benign. + let oracle = Pubkey::new_unique(); + let wallet = Pubkey::new_unique(); + assert!(user_owner_is_acceptable(Some(wallet), Some(oracle), wallet,)); + } + + #[test] + fn user_acceptable_self_owned_even_when_oracle_key_unknown() { + // If we can't resolve the oracle pubkey, self-ownership still passes. + let wallet = Pubkey::new_unique(); + assert!(user_owner_is_acceptable(Some(wallet), None, wallet)); + } + + #[test] + fn user_rejected_when_owned_by_third_party() { + let oracle = Pubkey::new_unique(); + let wallet = Pubkey::new_unique(); + let third_party = Pubkey::new_unique(); + assert!(!user_owner_is_acceptable( + Some(third_party), + Some(oracle), + wallet, + )); + } + + #[test] + fn user_rejected_when_owner_missing() { + // Malformed account data → user_owner is None → bail (safe default). + let oracle = Pubkey::new_unique(); + let wallet = Pubkey::new_unique(); + assert!(!user_owner_is_acceptable(None, Some(oracle), wallet)); + } + + #[test] + fn user_rejected_when_third_party_and_oracle_unknown() { + let wallet = Pubkey::new_unique(); + let third_party = Pubkey::new_unique(); + assert!(!user_owner_is_acceptable(Some(third_party), None, wallet)); + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/payments.rs b/offchain/crates/solana-cli/src/command/shreds/payments.rs new file mode 100644 index 0000000000..1cf25fce01 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/payments.rs @@ -0,0 +1,310 @@ +use std::{io::Write, net::Ipv4Addr}; + +use anyhow::Result; +use borsh::BorshDeserialize; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::rpc::SolanaConnectionOptions; +use doublezero_solana_sdk::shred_subscription::{ + self as shred_subscription, instruction::ShredSubscriptionInstructionData, state, +}; +use solana_account_decoder_client_types::UiAccountEncoding; +use solana_client::{ + rpc_client::GetConfirmedSignaturesForAddress2Config, + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig, RpcTransactionConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::{account::Account, pubkey::Pubkey, signature::Signature}; +use solana_transaction_status_client_types::UiTransactionEncoding; +use tabled::{Table, Tabled, settings::Style}; + +/* + doublezero-solana shreds payments \ + --device | --device-code \ + --client-ip +*/ + +#[derive(Debug, Args)] +pub struct PaymentsCommand { + #[command(flatten)] + device_args: super::DeviceArgs, + + /// Client IPv4 address. + #[arg(long)] + client_ip: Ipv4Addr, + + /// Maximum number of transactions to inspect. + #[arg(long, default_value = "50")] + limit: usize, + + #[arg(long)] + json: bool, + + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +#[derive(Debug, Tabled, serde::Serialize)] +struct PaymentRow { + #[tabled(rename = "Event")] + event: String, + #[tabled(rename = "Amount (USDC)")] + amount: String, + #[tabled(rename = "Date/Time")] + datetime: String, + #[tabled(rename = "Balance (USDC)")] + balance: String, +} + +#[derive(Debug)] +struct PaymentEvent { + event_type: EventType, + /// Signed amount in micro-USDC (positive = credit, negative = debit). + amount_micro: i64, + block_time: Option, +} + +#[derive(Debug)] +#[allow(dead_code)] // Payment variant reserved for phase 2 (oracle settlement debits). +enum EventType { + Funded, + Payment, + Withdrawal, +} + +impl std::fmt::Display for EventType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + EventType::Funded => write!(f, "funded"), + EventType::Payment => write!(f, "payment"), + EventType::Withdrawal => write!(f, "withdrawal"), + } + } +} + +impl PaymentsCommand { + pub async fn execute( + self, + dz_ledger_url: Option, + ctx: &CliContext, + out: &mut impl Write, + ) -> Result<()> { + let connection = crate::command::solana_connection(ctx, &self.connection_options); + let network_env = + crate::command::resolve_network_env(&connection, self.connection_options.moniker_env()) + .await?; + + let device = self + .device_args + .resolve(network_env, &dz_ledger_url) + .await?; + + let client_ip_bits = u32::from(self.client_ip); + let (client_seat_key, _) = state::find_client_seat_address(&device, client_ip_bits); + + // Discover all escrows for this seat. + let escrow_disc_bytes = borsh::to_vec(&state::PAYMENT_ESCROW_DISCRIMINATOR) + .expect("discriminator serialization"); + let config = RpcProgramAccountsConfig { + filters: Some(vec![ + RpcFilterType::Memcmp(Memcmp::new_raw_bytes(0, escrow_disc_bytes)), + RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + state::PAYMENT_ESCROW_SEAT_OFFSET, + client_seat_key.to_bytes().to_vec(), + )), + ]), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + + let escrow_accounts: Vec<(Pubkey, Account)> = connection + .get_program_accounts_with_config(&shred_subscription::ID, config) + .await?; + + if escrow_accounts.is_empty() { + writeln!(out, "No payment escrows found for this seat.")?; + return Ok(()); + } + + let escrow_keys: Vec = escrow_accounts.iter().map(|(key, _)| *key).collect(); + + // Fetch transaction history for each escrow. + let mut events: Vec = Vec::new(); + + for escrow_key in &escrow_keys { + let sigs_config = GetConfirmedSignaturesForAddress2Config { + limit: Some(self.limit), + commitment: Some(CommitmentConfig::confirmed()), + ..Default::default() + }; + + let signatures = connection + .get_signatures_for_address_with_config(escrow_key, sigs_config) + .await?; + + for sig_info in &signatures { + // Skip failed transactions. + if sig_info.err.is_some() { + continue; + } + + let signature: Signature = sig_info.signature.parse()?; + + let tx_config = RpcTransactionConfig { + encoding: Some(UiTransactionEncoding::Base64), + commitment: Some(CommitmentConfig::confirmed()), + max_supported_transaction_version: Some(0), + }; + + let tx_response = connection + .get_transaction_with_config(&signature, tx_config) + .await?; + + let versioned_tx = match tx_response.transaction.transaction.decode() { + Some(tx) => tx, + None => continue, + }; + + let message = versioned_tx.message; + let account_keys = message.static_account_keys(); + + for ix in message.instructions() { + let program_id = account_keys + .get(ix.program_id_index as usize) + .copied() + .unwrap_or_default(); + + if program_id != *shred_subscription::ID { + continue; + } + + // Check that this instruction touches our escrow account. + let touches_escrow = ix.accounts.iter().any(|&idx| { + account_keys + .get(idx as usize) + .map(|k| escrow_keys.contains(k)) + .unwrap_or(false) + }); + + if !touches_escrow { + continue; + } + + match ShredSubscriptionInstructionData::try_from_slice(&ix.data) { + Ok(ShredSubscriptionInstructionData::FundPaymentEscrowUsdc(amount)) => { + events.push(PaymentEvent { + event_type: EventType::Funded, + amount_micro: amount as i64, + block_time: tx_response.block_time, + }); + } + // TODO: ClosePaymentEscrow (withdrawal) — the actual + // refunded amount is in the tx log message "Withdrew {} + // USDC from payment escrow to refund account". Parse that + // to get the negative amount. Without it, we can't derive + // the correct withdrawal amount from the running balance + // alone because oracle debits are not yet tracked. + Ok(ShredSubscriptionInstructionData::ClosePaymentEscrow) => {} + // These instructions touch the escrow account but don't + // move funds — they appear in the same tx as fund/close. + // + // NOTE: the `InitializeValidatorPublisherRewards` and + // `ConfigureValidatorPublisherRewards` variants were + // previously listed here, but their account lists do + // not reference the escrow PDA so the `touches_escrow` + // pre-filter above already excludes them. A sibling + // task audits the rest of this listing for the same + // reason — the wildcard arm below makes the match + // robust to future variants in either direction. + Ok( + ShredSubscriptionInstructionData::InitializePaymentEscrow + | ShredSubscriptionInstructionData::InitializeClientSeat { .. } + | ShredSubscriptionInstructionData::RequestInstantSeatAllocation + | ShredSubscriptionInstructionData::RequestInstantSeatWithdrawal + | ShredSubscriptionInstructionData::RequestProratedInstantSeatWithdrawal + | ShredSubscriptionInstructionData::SetValidatorClientRewardsProportion( + _, + ) + | ShredSubscriptionInstructionData::InitializeClaimHolding(_) + | ShredSubscriptionInstructionData::ClaimValidatorClientRewards(_) + | ShredSubscriptionInstructionData::CheckCliVersion { .. }, + ) => {} + Ok(_) => {} + // TODO: oracle instructions (BatchAllocateSeats, + // InstantAllocateSeat) debit the escrow. Their + // discriminators are not in the offchain SDK. The debit + // amount is in the tx log "Escrow balance: {}" (the + // post-debit balance). Parse that and compute the delta + // from the running balance to get the negative amount. + Err(_) => {} + } + } + } + } + + if events.is_empty() { + if self.json { + writeln!(out, "[]")?; + } else { + writeln!(out, "No payment events found.")?; + } + return Ok(()); + } + + // Sort oldest-first by block_time so we can compute running balances. + events.sort_by_key(|e| e.block_time.unwrap_or(0)); + + // Compute running balance and build rows. + let mut balance: i64 = 0; + let mut rows: Vec = events + .iter() + .map(|event| { + balance += event.amount_micro; + + let amount_str = if event.amount_micro >= 0 { + format!("+{:.2}", event.amount_micro as f64 / 1_000_000.0) + } else { + format!("{:.2}", event.amount_micro as f64 / 1_000_000.0) + }; + + let datetime = event + .block_time + .and_then(|ts| { + chrono::DateTime::from_timestamp(ts, 0) + .map(|dt| dt.format("%Y-%m-%d %H:%M:%S UTC").to_string()) + }) + .unwrap_or_else(|| "—".to_string()); + + PaymentRow { + event: event.event_type.to_string(), + amount: amount_str, + datetime, + balance: format!("{:.2}", balance as f64 / 1_000_000.0), + } + }) + .collect(); + + // Reverse for display: most recent first. + rows.reverse(); + + if self.json { + writeln!(out, "{}", serde_json::to_string_pretty(&rows)?)?; + } else { + writeln!( + out, + "Payment history for seat {} (client IP {}):\n", + client_seat_key, self.client_ip + )?; + + let mut table = Table::new(rows); + table.with(Style::markdown()); + writeln!(out, "{table}")?; + } + + Ok(()) + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/price.rs b/offchain/crates/solana-cli/src/command/shreds/price.rs new file mode 100644 index 0000000000..edfe82974e --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/price.rs @@ -0,0 +1,378 @@ +use std::{collections::HashMap, io::Write}; + +use anyhow::Result; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_serviceability::state::{device::Device, exchange::Exchange}; +use doublezero_solana_client_tools::rpc::SolanaConnectionOptions; +use doublezero_solana_sdk::shred_subscription::state; +use solana_account_decoder_client_types::UiAccountEncoding; +use solana_client::{ + rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use solana_sdk::pubkey::Pubkey; +use tabled::{ + Table, Tabled, + settings::{Remove, Style, location::ByColumnName}, +}; + +use super::{make_dz_connection, serviceability_program_id}; + +/* + doublezero-solana shreds price [--device | --device-code | --metro ] +*/ + +#[derive(Debug, Args)] +pub struct PriceCommand { + /// Filter by device. + #[command(flatten)] + device_args: super::DeviceArgs, + + /// Filter by metro exchange public key. + #[arg(long, group = "device_id")] + metro: Option, + + #[arg(long)] + wide: bool, + + #[arg(long)] + json: bool, + + /// Show all devices, including those with no remaining seats. + #[arg(long)] + all: bool, + + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +#[derive(Debug, Tabled, serde::Serialize)] +struct PriceRow { + #[tabled(rename = "Device Code")] + device_code: String, + #[tabled(rename = "Device Pubkey")] + device: String, + #[tabled(rename = "Metro Code")] + metro_code: String, + #[tabled(rename = "Metro Name")] + metro_name: String, + #[tabled(rename = "Metro Pubkey")] + metro: String, + #[tabled(rename = "Status")] + status: String, + #[tabled(rename = "Settled Seats")] + settled_seats: u16, + #[tabled(rename = "Available Seats")] + available_seats: u16, + #[tabled(rename = "Base Price (USDC)")] + base_price: i32, + #[tabled(rename = "Premium (USDC)")] + premium: i32, + #[tabled(rename = "Epoch Price (USDC)")] + epoch_price: i32, + // What `shreds pay` charges right now: the price at the execution + // controller's `last_settled_epoch`, which the instant seat allocation is + // priced from. Diverges from `epoch_price` for one epoch after a + // reprice. `None` when the device or metro ring has no entry for that + // epoch, in which case an instant allocation would fail onchain. + #[tabled(rename = "Instant Price (USDC)")] + #[tabled(display("display_instant_allocation_price"))] + instant_allocation_price: Option, +} + +fn display_instant_allocation_price(price: &Option) -> String { + match price { + Some(price) => price.to_string(), + None => "-".to_string(), + } +} + +impl PriceCommand { + pub async fn execute( + self, + dz_ledger_url: Option, + ctx: &CliContext, + out: &mut impl Write, + ) -> Result<()> { + let connection = crate::command::solana_connection(ctx, &self.connection_options); + let network_env = + crate::command::resolve_network_env(&connection, self.connection_options.moniker_env()) + .await?; + + let dz_connection = make_dz_connection(&dz_ledger_url, network_env); + + // Fetch Device accounts from DZ Ledger. + let (device_keys, device_map): (Vec, HashMap) = + if self.device_args.device.is_some() || self.device_args.device_code.is_some() { + let device_key = self + .device_args + .resolve(network_env, &dz_ledger_url) + .await?; + let accounts = dz_connection.get_multiple_accounts(&[device_key]).await?; + let mut map = HashMap::new(); + if let Some(Some(account)) = accounts.first() + && let Ok(device) = Device::try_from(account.data.as_slice()) + { + map.insert(device_key, device); + } + (vec![device_key], map) + } else { + let program_id = serviceability_program_id(network_env)?; + let config = RpcProgramAccountsConfig { + filters: Some(vec![RpcFilterType::Memcmp(Memcmp::new_raw_bytes( + 0, + vec![5], // AccountType::Device + ))]), + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + let accounts = dz_connection + .get_program_accounts_with_config(&program_id, config) + .await?; + let mut keys = Vec::new(); + let mut map = HashMap::new(); + for (key, account) in &accounts { + if let Ok(device) = Device::try_from(account.data.as_slice()) { + keys.push(*key); + map.insert(*key, device); + } + } + (keys, map) + }; + + // Apply --metro filter client-side. + let (device_keys, device_map) = if let Some(metro) = self.metro { + let filtered: HashMap = device_map + .into_iter() + .filter(|(_, d)| d.exchange_pk == metro) + .collect(); + let keys: Vec = device_keys + .into_iter() + .filter(|k| filtered.contains_key(k)) + .collect(); + (keys, filtered) + } else { + (device_keys, device_map) + }; + + if device_keys.is_empty() { + if self.json { + writeln!(out, "[]")?; + } else { + writeln!(out, "No devices found.")?; + } + return Ok(()); + } + + // Derive DeviceHistory + MetroHistory PDA addresses. + let exchange_keys: Vec = device_map + .values() + .map(|d| d.exchange_pk) + .collect::>() + .into_iter() + .collect(); + + let dh_keys: Vec = device_keys + .iter() + .map(|dk| state::find_device_history_address(dk).0) + .collect(); + let mh_keys: Vec = exchange_keys + .iter() + .map(|ek| state::find_metro_history_address(ek).0) + .collect(); + + let (execution_controller_key, _) = state::find_execution_controller_address(); + + // Fetch all histories + the execution controller (one call) + exchanges + // (one call) in parallel. + let mut all_history_keys = Vec::with_capacity(dh_keys.len() + mh_keys.len() + 1); + all_history_keys.extend_from_slice(&dh_keys); + all_history_keys.extend_from_slice(&mh_keys); + all_history_keys.push(execution_controller_key); + + let (history_accounts, exchange_accounts) = tokio::try_join!( + connection.try_fetch_multiple_accounts(&all_history_keys), + dz_connection.try_fetch_multiple_accounts(&exchange_keys), + )?; + + let (dh_data, rest) = history_accounts.split_at(dh_keys.len()); + let (mh_data, execution_controller_data) = rest.split_at(mh_keys.len()); + + // The epoch an instant seat allocation is priced from. Missing or + // unparseable leaves the Instant Price column empty rather than failing + // the whole listing — every other column stands on its own. + let last_settled_epoch = execution_controller_data.first().and_then(|account| { + state::parse_execution_controller_last_settled_epoch(&account.data) + }); + + let device_infos: Vec = dh_data + .iter() + .filter_map(|account| state::parse_device_history(&account.data)) + .collect(); + + let metro_map: HashMap = mh_data + .iter() + .filter_map(|account| { + let info = state::parse_metro_history(&account.data)?; + Some((info.exchange_key, info)) + }) + .collect(); + + let settled_metro_prices: HashMap = exchange_keys + .iter() + .zip(mh_data.iter()) + .filter_map(|(exchange_key, account)| { + let price_dollars = + state::parse_metro_history_price_at_epoch(&account.data, last_settled_epoch?)?; + Some((*exchange_key, price_dollars)) + }) + .collect(); + + let settled_device_premiums: HashMap = device_keys + .iter() + .zip(dh_data.iter()) + .filter_map(|(device_key, account)| { + let premium_dollars = state::parse_device_history_premium_at_epoch( + &account.data, + last_settled_epoch?, + )?; + Some((*device_key, premium_dollars)) + }) + .collect(); + + let exchange_map: HashMap = exchange_keys + .iter() + .zip(exchange_accounts.iter()) + .filter_map(|(key, account)| { + let account = account.as_ref()?; + let exchange = Exchange::try_from(account.data.as_slice()).ok()?; + Some((*key, exchange)) + }) + .collect(); + + if device_infos.is_empty() { + if self.json { + writeln!(out, "[]")?; + } else { + writeln!(out, "No devices found.")?; + } + return Ok(()); + } + + // Join: compute epoch price per device. + let mut rows: Vec = device_infos + .iter() + .filter_map(|device_info| { + let metro_info = metro_map.get(&device_info.exchange_key)?; + let base = metro_info.current_usdc_price as i32; + let premium = device_info.current_premium as i32; + let epoch_price = base + premium; + + let dz_device = device_map.get(&device_info.device_key); + let device_code = dz_device + .map(|d| d.code.clone()) + .unwrap_or_else(|| "?".to_string()); + let status = dz_device + .map(|d| d.status.to_string()) + .unwrap_or_else(|| "?".to_string()); + + let dz_exchange = exchange_map.get(&device_info.exchange_key); + let metro_code = dz_exchange + .map(|e| e.code.clone()) + .unwrap_or_else(|| "?".to_string()); + let metro_name = dz_exchange + .map(|e| e.name.clone()) + .unwrap_or_else(|| "?".to_string()); + + Some(PriceRow { + device_code, + device: device_info.device_key.to_string(), + metro_code, + metro_name, + metro: device_info.exchange_key.to_string(), + status, + settled_seats: device_info.granted_seat_count, + available_seats: device_info.total_available_seats, + base_price: base, + premium, + epoch_price, + instant_allocation_price: settled_metro_prices + .get(&device_info.exchange_key) + .zip(settled_device_premiums.get(&device_info.device_key)) + .map(|(metro_price_dollars, premium_dollars)| { + state::seat_usdc_price_dollars(*metro_price_dollars, *premium_dollars) + }), + }) + }) + .collect(); + + let total_count = rows.len(); + if !self.all { + rows.retain(|row| row.settled_seats < row.available_seats); + } + let hidden_count = total_count - rows.len(); + + if rows.is_empty() { + if self.json { + writeln!(out, "[]")?; + } else if hidden_count > 0 { + writeln!( + out, + "No devices with remaining seats found ({hidden_count} device(s) hidden, use --all to show)." + )?; + } else { + writeln!(out, "No devices found.")?; + } + return Ok(()); + } + + rows.sort_by(|a, b| { + a.metro_code + .cmp(&b.metro_code) + .then(a.device_code.cmp(&b.device_code)) + }); + + if self.json { + writeln!(out, "{}", serde_json::to_string_pretty(&rows)?)?; + } else { + if hidden_count > 0 { + writeln!( + out, + "{} device(s) found ({} with no remaining seats hidden, use --all to show):\n", + rows.len(), + hidden_count, + )?; + } else { + writeln!(out, "{} device(s) found:\n", rows.len())?; + } + + match last_settled_epoch { + Some(epoch) => writeln!( + out, + "Instant Price is what `shreds pay` charges now, for the remainder of epoch \ + {epoch}. Epoch Price applies from the next settlement.\n" + )?, + None => writeln!( + out, + "Instant Price is unavailable: execution controller \ + {execution_controller_key} is missing or unparseable.\n" + )?, + } + + let mut table = Table::new(rows); + if !self.wide { + table + .with(Remove::column(ByColumnName::new("Device Pubkey"))) + .with(Remove::column(ByColumnName::new("Metro Pubkey"))); + } + table.with(Style::markdown()); + writeln!(out, "{table}")?; + } + + Ok(()) + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/configure.rs b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/configure.rs new file mode 100644 index 0000000000..4f4ded0427 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/configure.rs @@ -0,0 +1,451 @@ +use std::{io::Write, str::FromStr}; + +use anyhow::{Context, Result, bail}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::payer::{TransactionOutcome, Wallet}; +use doublezero_solana_sdk::{ + Pubkey, + shred_subscription::{ + ID, + instruction::{ + ShredSubscriptionInstructionData, ValidatorOffchainAuthorization, + account::{ + ConfigureValidatorPublisherRewardsAccounts, + InitializeValidatorPublisherRewardsAccounts, + }, + }, + state::{find_shred_reward_token_address, find_validator_publisher_rewards_address}, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{signature::Signature, signer::Signer}; +use spl_associated_token_account_interface::instruction::create_associated_token_account_idempotent; + +use super::rewards_mint_arg::RewardsMintArg; + +/* + # Direct path (the `-k` signer keypair must be the validator identity) + doublezero-solana shreds publisher-rewards configure \ + --node-id --rewards-token-owner \ + [--rewards-token-mint ] [-k ] + + # Offchain path + doublezero-solana shreds publisher-rewards configure \ + --node-id --rewards-token-owner \ + [--rewards-token-mint ] \ + --signature --deadline-slot +*/ + +#[derive(Debug, Args)] +pub struct ConfigureCommand { + /// Validator node identity being configured. + #[arg(long)] + pub node_id: Pubkey, + + /// Mint to receive rewards in. Must correspond to a registered, enabled + /// `ShredRewardToken`. Accepts a base58 pubkey or one of the aliases + /// `2z`, `usdc`, `wsol` (env-aware where applicable). Defaults to `2z`. + #[arg(long, default_value = "2z")] + pub rewards_token_mint: RewardsMintArg, + + /// Wallet that will own the ATA that receives rewards. + #[arg(long)] + pub rewards_token_owner: Pubkey, + + /// Base58-encoded ed25519 signature produced by the validator identity + /// keypair via `solana sign-offchain-message`. When omitted, the `-k` + /// signer keypair must equal `--node-id` and signs the transaction + /// directly as the validator identity. + #[arg(long, requires = "deadline_slot")] + pub signature: Option, + + /// Absolute slot deadline. Must match what was hashed when the signature + /// was produced (see `prepare-offchain-message`). Required with `--signature`. + #[arg(long, requires = "signature")] + pub deadline_slot: Option, + + #[command(flatten)] + pub write_opts: crate::command::WriteVerbOptions, +} + +/// Resolved auth path after CLI parsing. The variant maps 1:1 to which auth +/// surface the on-chain `ConfigureValidatorPublisherRewards` instruction +/// expects: a Solana transaction signature from `validator_node` (Direct) or +/// an instruction-data ed25519 envelope (Offchain). +#[derive(Debug)] +pub(crate) enum ResolvedAuth { + Direct, + Offchain(ValidatorOffchainAuthorization), +} + +impl ResolvedAuth { + pub(crate) fn is_node_signer(&self) -> bool { + matches!(self, ResolvedAuth::Direct) + } +} + +/// Resolve `ResolvedAuth` from CLI inputs. Pure: no I/O, no network. +/// +/// - `node_id`: from `--node-id`, used to validate the direct-path signer match. +/// - `signer_pubkey`: the pubkey of the keypair that signs the transaction +/// (`-k`). With `--fee-payer` overriding the fee payer, this is the +/// signer-of-record, not necessarily the fee payer. +/// - `offchain`: `(--signature, --deadline-slot)` zipped — both present means +/// offchain path, both absent means direct path. Clap's `requires` enforces +/// both-or-neither, so the awkward middle case is unreachable. +/// +/// In the direct path (`offchain.is_none()`), the signer signs as the +/// validator identity, so `--node-id` must equal `signer_pubkey`. +pub(crate) fn resolve_auth( + node_id: Pubkey, + signer_pubkey: Pubkey, + offchain: Option<(&str, u64)>, +) -> Result { + match offchain { + Some((sig_b58, deadline_slot)) => { + let sig = Signature::from_str(sig_b58).with_context(|| { + "--signature must be a base58-encoded ed25519 signature \ + (64 bytes / 88 base58 chars)" + })?; + let bytes: [u8; 64] = sig + .as_ref() + .try_into() + .with_context(|| "decoded signature is not 64 bytes")?; + Ok(ResolvedAuth::Offchain(ValidatorOffchainAuthorization { + deadline_slot, + signature: bytes, + })) + } + None => { + if node_id != signer_pubkey { + bail!( + "in the direct path the signer keypair (-k) must be the validator \ + identity, but its pubkey {signer_pubkey} does not match --node-id {node_id}. \ + The validator identity keypair lives on the validator host, so the offchain \ + workflow is usually what you want: \n \ + 1. Workstation: \ + `doublezero-solana shreds publisher-rewards prepare-offchain-message ...` \ + to print the hex blob.\n \ + 2. Validator host: `solana sign-offchain-message \ + --keypair ` to produce the base58 signature.\n \ + 3. Workstation: re-run `configure` with \ + `--signature --deadline-slot `.\n\ + Or, if the validator identity keypair is accessible locally, pass it as \ + `-k` so its pubkey equals {node_id}." + ); + } + Ok(ResolvedAuth::Direct) + } + } +} + +impl ConfigureCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + if self.node_id == Pubkey::default() { + bail!("--node-id must not be the default pubkey"); + } + if self.rewards_token_owner == Pubkey::default() { + bail!("--rewards-token-owner must not be the default pubkey"); + } + + let wallet = crate::command::build_wallet(ctx, self.write_opts)?; + let rewards_token_mint = self.rewards_token_mint.resolve(&wallet.connection).await?; + let wallet_key = wallet.pubkey(); + // When `--fee-payer` is set, the ATA rent must come from the fee + // payer, not the signer. Otherwise an operator who passed + // `--fee-payer` because the validator identity is rent-poor would + // still see the transaction fail at submit. The `Wallet` does not + // expose a helper for "the pubkey that actually pays this tx", so + // re-derive it here; a follow-up will hoist this into `Wallet`. + let funding_key = wallet + .fee_payer + .as_ref() + .map(Signer::pubkey) + .unwrap_or(wallet_key); + + let offchain = self.signature.as_deref().zip(self.deadline_slot); + let auth = resolve_auth(self.node_id, wallet_key, offchain)?; + let is_node_signer = auth.is_node_signer(); + + // Capture bumps so the CU budget can be sized from the actual cost + // of each PDA derivation rather than a single conservative ceiling. + let (srt_pda, srt_bump) = find_shred_reward_token_address(&rewards_token_mint); + let (vpr_pda, vpr_bump) = find_validator_publisher_rewards_address(&self.node_id); + let (rewards_token_ata, ata_create_compute_units) = + Wallet::ata_address_and_create_compute_units( + &self.rewards_token_owner, + &rewards_token_mint, + ); + + writeln!( + out, + "Shred subscription - Configure Validator Publisher Rewards" + )?; + writeln!(out, "Node ID: {}", self.node_id)?; + writeln!(out, "Rewards owner: {}", self.rewards_token_owner)?; + writeln!(out, "Rewards mint: {rewards_token_mint}")?; + writeln!(out, "Rewards ATA: {rewards_token_ata}")?; + writeln!( + out, + "Auth path: {}", + if is_node_signer { "direct" } else { "offchain" } + )?; + + // Pre-flight: shred_reward_token must exist + be enabled; auto-init + // validator publisher rewards if it doesn't exist yet; only push the + // ATA-create instruction if the ATA isn't already there. Batched into + // one RPC call. + let accounts = wallet + .connection + .get_multiple_accounts(&[srt_pda, vpr_pda, rewards_token_ata]) + .await + .context("failed to read pre-flight accounts")?; + + let srt_account = accounts.first().and_then(|a| a.as_ref()); + super::validate_shred_reward_token(&rewards_token_mint, &srt_pda, srt_account)?; + let vpr_exists = accounts.get(1).and_then(|a| a.as_ref()).is_some(); + let ata_exists = accounts.get(2).and_then(|a| a.as_ref()).is_some(); + + // CU budget built incrementally per pushed instruction. The on-chain + // program re-derives each PDA, and the bump dominates the variation + // in CU cost — see `Wallet::compute_units_for_bump_seed`. Base costs + // come from prior runs of these instructions. + const INIT_VPR_CU_BASE: u32 = 20_000; + const CONFIGURE_VPR_CU_BASE: u32 = 20_000; + const ED25519_VERIFY_CU: u32 = 150_000; + const CHECK_CLI_VERSION_CU: u32 = 5_000; + + let mut compute_unit_limit: u32 = CHECK_CLI_VERSION_CU; + let mut instructions = vec![super::super::build_check_cli_version_instruction()?]; + + if !vpr_exists { + writeln!( + out, + "Validator publisher rewards account missing; will initialize as part of this transaction." + )?; + let init_ix = try_build_instruction( + &ID, + InitializeValidatorPublisherRewardsAccounts::new(&wallet_key, &self.node_id), + &ShredSubscriptionInstructionData::InitializeValidatorPublisherRewards( + self.node_id, + ), + )?; + instructions.push(init_ix); + compute_unit_limit += INIT_VPR_CU_BASE + Wallet::compute_units_for_bump_seed(vpr_bump); + } + + let offchain_authorization = match &auth { + ResolvedAuth::Direct => None, + ResolvedAuth::Offchain(a) => Some(a.clone()), + }; + let configure_ix = try_build_instruction( + &ID, + ConfigureValidatorPublisherRewardsAccounts::new( + &self.node_id, + &rewards_token_mint, + is_node_signer, + ), + &ShredSubscriptionInstructionData::ConfigureValidatorPublisherRewards { + rewards_token_owner_key: self.rewards_token_owner, + offchain_authorization, + }, + )?; + instructions.push(configure_ix); + // Configure re-derives both the VPR and SRT PDAs; the offchain auth + // path additionally runs an ed25519 verify. + compute_unit_limit += CONFIGURE_VPR_CU_BASE + + Wallet::compute_units_for_bump_seed(vpr_bump) + + Wallet::compute_units_for_bump_seed(srt_bump); + if !is_node_signer { + compute_unit_limit += ED25519_VERIFY_CU; + } + + // Push the ATA-create only when the account doesn't already exist. + // The idempotent variant is the on-chain race-condition safety net + // (someone could race us between the read and the submit), not the + // primary mechanism — skipping it on the happy path keeps the + // transaction smaller and burns less compute. The fee-payer (or + // signer, if no `--fee-payer` is set) pays the rent; the account is + // owned by --rewards-token-owner. + if !ata_exists { + writeln!( + out, + "Rewards ATA missing; will create as part of this transaction." + )?; + instructions.push(create_associated_token_account_idempotent( + &funding_key, + &self.rewards_token_owner, + &rewards_token_mint, + &spl_token_interface::ID, + )); + compute_unit_limit += ata_create_compute_units; + } + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + // In the direct path the `-k` signer signs both as the transaction + // signer-of-record (fee payer, when `--fee-payer` is not set) and as + // the validator identity. In the offchain path the validator + // identity authorization is carried in instruction data instead, so + // `-k` only needs to be a signer of the transaction. + let transaction = wallet.new_transaction(&instructions).await?; + + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + let configure_executed = matches!(tx_outcome, TransactionOutcome::Executed(_)); + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + writeln!(out, "Configured validator publisher rewards: {tx_sig}")?; + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + // Post-configure: distribute this validator's pending rewards for + // any recent subscription epoch where accumulation has completed + // but distribute hasn't run for this leaf yet. Skipped under + // dry-run (the configure tx never actually wrote the ValidatorPublisherRewards + // state we would distribute under). + if configure_executed { + let distribute_result = async { + let network_env = wallet + .connection + .try_network_environment() + .await + .context("detecting network environment")?; + super::distribute::try_distribute_pending( + &wallet, + &wallet.connection, + &self.node_id, + &self.rewards_token_owner, + network_env, + out, + ) + .await + } + .await; + match distribute_result { + Ok(outcome) => { + writeln!( + out, + "\nDistribute pass complete: {} distributed, {} failed.", + outcome.distributed, outcome.failed, + )?; + } + Err(error) => { + eprintln!( + "\nDistribute pass failed (configure already landed; safe to re-run): {error:#}" + ); + } + } + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use clap::Parser; + use solana_sdk::signature::{Keypair, Signer}; + + use super::*; + + #[derive(Debug, Parser)] + struct TestCli { + #[command(flatten)] + cmd: ConfigureCommand, + } + + #[test] + fn signature_without_deadline_errors() { + let result = TestCli::try_parse_from([ + "test", + "--node-id", + "11111111111111111111111111111111", + "--rewards-token-owner", + "11111111111111111111111111111111", + "--signature", + "5xyz", + ]); + assert!(result.is_err()); + } + + #[test] + fn deadline_without_signature_errors() { + let result = TestCli::try_parse_from([ + "test", + "--node-id", + "11111111111111111111111111111111", + "--rewards-token-owner", + "11111111111111111111111111111111", + "--deadline-slot", + "100", + ]); + assert!(result.is_err()); + } + + #[test] + fn missing_node_id_errors() { + let result = TestCli::try_parse_from([ + "test", + "--rewards-token-owner", + "11111111111111111111111111111111", + ]); + assert!(result.is_err()); + } + + #[test] + fn resolve_auth_direct_path_matches_signer() { + let signer = Pubkey::new_unique(); + let auth = resolve_auth(signer, signer, None).expect("matching pubkey resolves to Direct"); + assert!(auth.is_node_signer()); + assert!(matches!(auth, ResolvedAuth::Direct)); + } + + #[test] + fn resolve_auth_direct_path_node_id_signer_mismatch_errors() { + let signer = Pubkey::new_unique(); + let other = Pubkey::new_unique(); + let err = resolve_auth(other, signer, None).expect_err("mismatched node_id must error"); + let msg = err.to_string(); + assert!(msg.contains("does not match --node-id"), "got: {msg}"); + // The remedy must lead with the offchain workflow because the + // validator identity keypair lives on the validator host. + assert!( + msg.contains("prepare-offchain-message"), + "expected message to point at prepare-offchain-message, got: {msg}" + ); + } + + #[test] + fn resolve_auth_offchain_path_happy() { + let node_id = Pubkey::new_unique(); + let signer = Pubkey::new_unique(); + let kp = Keypair::new(); + let sig = kp.sign_message(b"anything"); + let sig_b58 = sig.to_string(); + let auth = resolve_auth(node_id, signer, Some((&sig_b58, 42_000))) + .expect("offchain path resolves"); + assert!(!auth.is_node_signer()); + match auth { + ResolvedAuth::Offchain(envelope) => { + assert_eq!(envelope.deadline_slot, 42_000); + assert_eq!(envelope.signature, <[u8; 64]>::from(sig)); + } + _ => panic!("expected Offchain"), + } + } + + #[test] + fn resolve_auth_offchain_path_invalid_signature_errors() { + let node_id = Pubkey::new_unique(); + let signer = Pubkey::new_unique(); + let err = resolve_auth(node_id, signer, Some(("not-base58!!", 1))) + .expect_err("bad base58 must error"); + assert!(err.to_string().contains("base58-encoded ed25519 signature")); + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/distribute.rs b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/distribute.rs new file mode 100644 index 0000000000..73758524fb --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/distribute.rs @@ -0,0 +1,646 @@ +// Not a standalone subcommand: `try_distribute_pending` is invoked only by +// `configure` as a post-configure pass. Subscription epoch == Solana epoch +// here, so the current epoch is resolved via `getEpochInfo` on a Solana RPC, +// not the DZ-Ledger RPC that hosts the program (on testnet/localnet those are +// distinct chains with independent epoch numbers). + +use std::{ + collections::{HashMap, HashSet}, + io::Write, +}; + +use anyhow::{Context, Result}; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + payer::{TransactionOutcome, Wallet}, + rpc::{NetworkEnvironment, SolanaConnection}, +}; +use doublezero_solana_sdk::{ + Pubkey, environment_2z_token_mint_key, environment_usdc_token_mint_key, + merkle::MerkleProof, + revenue_distribution::{state::Distribution as ParentDistribution, types::DoubleZeroEpoch}, + shred_subscription::{ + ID, + instruction::{ + ShredSubscriptionInstructionData, + account::{ + DistributeValidatorRewardsAccountsInitializer, InitializeClaimHoldingAccounts, + }, + }, + state::{ + ShredDistribution, ShredDistributionJournal, find_claim_holding_address, + find_program_config_address, find_shred_distribution_address, + find_shred_distribution_journal_address, find_validator_client_rewards_address, + is_distribute_validator_rewards_enabled, + }, + types::ValidatorRewardsLeaf, + }, + try_build_instruction, +}; +use futures::stream::{self, StreamExt}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::instruction::Instruction; +use spl_associated_token_account_interface::{ + address::get_associated_token_address, instruction::create_associated_token_account_idempotent, +}; + +use super::s3; + +/// Subscription-epoch lookback window for the post-configure distribute +/// pass. Sized to fit one `getMultipleAccounts` chunk (100 keys) for the +/// `ShredDistribution` batch; journal batches at 3 mints fit in 3 chunks. +const DISTRIBUTE_LOOKBACK_EPOCHS: u64 = 100; + +/// Max in-flight S3 fetches during the leaf-discovery fan-out. The full +/// lookback at typical S3 latencies (~50-200 ms per request) is +/// 5-20 seconds wall-clock when sequential; 8 concurrent fetches cuts +/// that roughly 8x while staying polite to S3. +const S3_FETCH_CONCURRENCY: usize = 8; + +/// Counters surfaced at the end of a distribute pass. +/// - `distributed`: distribute txs that landed. +/// - `failed`: distribute txs that errored, plus epochs we couldn't even +/// evaluate (S3 fetch / merkle-leaf failures). Each has a logged reason. +/// +/// Epochs with nothing to do — the leaf's bitmap bit is already clear +/// because it was distributed in a prior run or never routed to this +/// journal — are intentionally NOT counted. A clear bit means "settled", +/// so counting it would make every re-run report a growing pile of +/// phantom "unsettled" epochs. +#[derive(Debug, Default)] +pub struct DistributeOutcome { + pub distributed: u32, + pub failed: u32, +} + +/// Per-(epoch, leaf) bundle of everything needed to build a distribute tx +/// after the upfront batched fetches complete. +struct Candidate { + subscription_epoch: u64, + associated_dz_epoch: u64, + leaf_index: usize, + leaf: ValidatorRewardsLeaf, + proof: MerkleProof, +} + +pub async fn try_distribute_pending( + wallet: &Wallet, + solana_connection: &SolanaConnection, + node_id: &Pubkey, + rewards_token_owner_key: &Pubkey, + network_env: NetworkEnvironment, + out: &mut impl Write, +) -> Result { + let mut outcome = DistributeOutcome::default(); + + // Check if distribute flag is enabled in ProgramConfig. + let program_config_account = wallet + .connection + .try_fetch_multiple_accounts(&[find_program_config_address().0]) + .await + .context("fetching program config")?; + let distribute_enabled = program_config_account + .first() + .is_some_and(|account| is_distribute_validator_rewards_enabled(&account.data)); + if !distribute_enabled { + writeln!( + out, + "\nDistribute is not enabled on this cluster yet; skipping pending-rewards distribution." + )?; + return Ok(outcome); + } + + // `wallet.connection` is the DZ-Ledger RPC (program host). Its epoch + // is the DZ-Ledger epoch, which has no relation to the Solana epoch + // on testnet/localnet. `subscription_epoch` PDAs and S3 file names + // are Solana-epoch keyed, so we must ask a Solana RPC. + let current_epoch = solana_connection + .0 + .get_epoch_info() + .await + .context("fetching current Solana epoch")? + .epoch; + let from_epoch = current_epoch.saturating_sub(DISTRIBUTE_LOOKBACK_EPOCHS); + + writeln!( + out, + "\nScanning epochs {from_epoch}..={current_epoch} for unsettled validator rewards." + )?; + + // Mints we probe each epoch. We don't assume the validator's current + // VPR mint matches what they were configured against historically; + // accumulate may have routed earlier-epoch rewards into a different + // journal. Probing all three covers that case. + let dz_mint_key = environment_2z_token_mint_key(network_env); + let usdc_mint_key = environment_usdc_token_mint_key(network_env); + let wsol_mint_key = spl_token_interface::native_mint::ID; + let journal_mint_candidates = [dz_mint_key, usdc_mint_key, wsol_mint_key]; + + // ----- Step 1: batch fetch ShredDistribution accounts in the window ----- + + let shred_distribution_pdas: Vec = (from_epoch..=current_epoch) + .map(|epoch| find_shred_distribution_address(epoch).0) + .collect(); + let shred_distribution_accounts = wallet + .connection + .try_fetch_multiple_accounts(&shred_distribution_pdas) + .await + .context("fetching candidate ShredDistribution accounts")?; + + let accumulated: Vec<(u64, ZeroCopyAccountOwnedData)> = + shred_distribution_accounts + .into_iter() + .enumerate() + .filter_map(|(offset, account)| { + if account.data.is_empty() { + return None; + } + let epoch = from_epoch + offset as u64; + let shred_distribution: ZeroCopyAccountOwnedData = + account.try_into().ok()?; + shred_distribution + .is_validator_rewards_accumulated() + .then_some((epoch, shred_distribution)) + }) + .collect(); + + if accumulated.is_empty() { + writeln!( + out, + "No accumulated epochs in the window; nothing to distribute." + )?; + return Ok(outcome); + } + + // ----- Step 2: fan out S3 to find this validator's leaf per epoch ----- + + let s3_client = s3::build_s3_client()?; + + // Issue all S3 fetches concurrently (capped at `S3_FETCH_CONCURRENCY`), + // carrying the `shred_distribution` reference alongside the fetch + // result so the post-fetch loop doesn't have to re-scan + // `accumulated`. `reqwest::Client` clones are Arc-cheap. Each tuple + // element: `(epoch, &shred_distribution, fetch_result)`. + let mut fetch_results = stream::iter(accumulated.iter()) + .map(|(epoch, shred_distribution)| { + let s3_client = s3_client.clone(); + async move { + let result = s3::fetch_leader_slot_data(&s3_client, *epoch).await; + (*epoch, shred_distribution, result) + } + }) + .buffer_unordered(S3_FETCH_CONCURRENCY) + .collect::>() + .await; + // `buffer_unordered` yields in completion order; sort ascending by + // epoch so the per-epoch logs below print chronologically. + fetch_results.sort_by_key(|(epoch, _, _)| *epoch); + + let mut candidates: Vec = Vec::new(); + for (epoch, shred_distribution, fetch_result) in fetch_results { + let entries = match fetch_result { + Ok(entries) => entries, + Err(err) => { + eprintln!(" epoch {epoch}: failed to fetch S3 leaves: {err:#}"); + outcome.failed += 1; + continue; + } + }; + // Build the sorted leaf set once per epoch, then compute proofs + // ONLY for the leaves matching this validator. With ~1500 + // validators per epoch × 100 epochs of lookback, computing all + // proofs up front would be tens of millions of SHA-256 ops per + // configure call; this restricts us to O(log N) work per matched + // leaf (typically 1, occasionally 2+ for multi-client-id + // validators). + let computed = match s3::compute_leaves(&entries) { + Ok(c) => c, + Err(err) => { + eprintln!(" epoch {epoch}: failed to compute merkle leaves: {err:#}"); + outcome.failed += 1; + continue; + } + }; + // A validator can legitimately appear under multiple client_ids + // in the same epoch — the leaf schema's dedup key is + // `(node_id, client_id)`, not `node_id` alone. Each `(node_id, + // client_id)` leaf has its own merkle proof and its own bit in + // the journal's bitmap, so we emit one `Candidate` per match + // here. Downstream batching and the per-leaf bitmap check + // already handle each `Candidate` independently. + for (leaf_index, leaf) in computed.leaves.iter().enumerate() { + if &leaf.node_id != node_id { + continue; + } + let proof = match s3::compute_proof_for_leaf(&computed.leaves, leaf_index) { + Ok(proof) => proof, + Err(err) => { + eprintln!( + " epoch {epoch} leaf {leaf_index}: failed to compute proof: {err:#}" + ); + continue; + } + }; + candidates.push(Candidate { + subscription_epoch: epoch, + associated_dz_epoch: shred_distribution.associated_dz_epoch.value(), + leaf_index, + leaf: *leaf, + proof, + }); + } + // If no leaves matched, the validator wasn't a leader this + // epoch — silent skip (no work to do, not an error). + } + + if candidates.is_empty() { + writeln!( + out, + "No candidate epochs with this validator as a leaf; nothing to distribute." + )?; + return Ok(outcome); + } + + // ----- Step 3: batch fetch journals at all three mints per candidate ----- + // + // Layout: journal_accounts[candidate_idx * 3 + mint_idx]. The internal + // chunking in `try_fetch_multiple_accounts` keeps a single call under + // the 100-key getMultipleAccounts limit, so a 100-candidate × 3-mint + // (= 300-key) batch lands in three RPCs. + + let mut journal_pdas: Vec = Vec::with_capacity(candidates.len() * 3); + for candidate in &candidates { + for mint in &journal_mint_candidates { + journal_pdas.push( + find_shred_distribution_journal_address(candidate.subscription_epoch, mint).0, + ); + } + } + let journal_accounts = wallet + .connection + .try_fetch_multiple_accounts(&journal_pdas) + .await + .context("fetching journal accounts")?; + + // ----- Step 4: batch fetch parent distributions, deduped by DZ epoch ----- + + let mut parent_index_for_dz_epoch: HashMap = HashMap::new(); + let mut parent_pdas: Vec = Vec::new(); + for candidate in &candidates { + parent_index_for_dz_epoch + .entry(candidate.associated_dz_epoch) + .or_insert_with(|| { + let pda = ParentDistribution::find_address(DoubleZeroEpoch::new( + candidate.associated_dz_epoch, + )) + .0; + parent_pdas.push(pda); + parent_pdas.len() - 1 + }); + } + let parent_accounts = wallet + .connection + .try_fetch_multiple_accounts(&parent_pdas) + .await + .context("fetching parent Distribution accounts")?; + + // ----- Step 5: batch fetch claim holdings (one per candidate) ----- + + let claim_holding_pdas: Vec = candidates + .iter() + .map(|candidate| { + let validator_client_rewards_key = + find_validator_client_rewards_address(candidate.leaf.client_id).0; + find_claim_holding_address( + &validator_client_rewards_key, + candidate.subscription_epoch, + &dz_mint_key, + ) + .0 + }) + .collect(); + let claim_holding_accounts = wallet + .connection + .try_fetch_multiple_accounts(&claim_holding_pdas) + .await + .context("fetching claim holding accounts")?; + + // ----- Step 6: pre-fetch destination ATAs ----- + // + // Across the entire pass there are at most three distinct + // destination ATAs (one per candidate reward mint: + // `get_associated_token_address(rewards_token_owner_key, mint)`). + // Probe them once via a single `getMultipleAccounts` so per-tx + // we only emit `create_associated_token_account_idempotent` when + // the destination is actually missing — saves ~25k CU per tx that + // would otherwise pay the SPL Token existence check on a no-op + // create. The set is mutated as freshly-created ATAs land. + let candidate_destination_atas: Vec = journal_mint_candidates + .iter() + .map(|mint| get_associated_token_address(rewards_token_owner_key, mint)) + .collect(); + let candidate_destination_ata_accounts = wallet + .connection + .try_fetch_multiple_accounts(&candidate_destination_atas) + .await + .context("pre-fetching destination ATAs")?; + let mut known_existing_atas: HashSet = candidate_destination_atas + .iter() + .zip(candidate_destination_ata_accounts.iter()) + .filter_map(|(ata, account)| (!account.data.is_empty()).then_some(*ata)) + .collect(); + + // ----- Step 7: in-memory decision loop, submit per (epoch, mint) ----- + // + // `InitializeClaimHolding` is idempotent on-chain but a re-issued init + // still costs a CPI and tx bytes. Dedup by `(epoch, client_id)` — + // the claim_holding PDA is seeded by `validator_client_rewards_key` + // (per-client_id) + epoch + 2Z mint, so a validator that appears + // under two client_ids in the same epoch has TWO separate claim + // holdings and needs an init for each. Keying by epoch alone would + // wrongly skip the second init. + + let mut emitted_init_for_holding: HashSet<(u64, u16)> = HashSet::new(); + + for (candidate_index, candidate) in candidates.iter().enumerate() { + // Parent distribution gate. + let parent_index = parent_index_for_dz_epoch[&candidate.associated_dz_epoch]; + let parent_account = &parent_accounts[parent_index]; + if parent_account.data.is_empty() { + writeln!( + out, + " epoch {}: skipped — parent distribution missing", + candidate.subscription_epoch + )?; + continue; + } + let parent_distribution: ZeroCopyAccountOwnedData = + match parent_account.clone().try_into() { + Ok(data) => data, + Err(_) => { + writeln!( + out, + " epoch {}: skipped — parent distribution malformed", + candidate.subscription_epoch + )?; + continue; + } + }; + if !parent_distribution.is_rewards_calculation_finalized() { + writeln!( + out, + " epoch {}: skipped — parent rewards not finalized", + candidate.subscription_epoch + )?; + continue; + } + + let claim_holding_exists = !claim_holding_accounts[candidate_index].data.is_empty(); + + for (mint_index, publisher_mint) in journal_mint_candidates.iter().enumerate() { + let journal_account = &journal_accounts[candidate_index * 3 + mint_index]; + if journal_account.data.is_empty() { + continue; + } + let publisher_journal: ZeroCopyAccountOwnedData = + match journal_account.clone().try_into() { + Ok(data) => data, + Err(_) => continue, + }; + if !publisher_journal.is_swap_complete() { + continue; + } + let Some(bitmap_range) = + publisher_journal.checked_publisher_accumulation_bitmap_range() + else { + continue; + }; + let bitmap = match publisher_journal + .remaining_data + .get(bitmap_range.start..bitmap_range.end) + { + Some(slice) => slice, + None => continue, + }; + if !bitmap_bit_set(bitmap, candidate.leaf_index) { + continue; + } + + let init_key = (candidate.subscription_epoch, candidate.leaf.client_id); + let needs_init = !claim_holding_exists && !emitted_init_for_holding.contains(&init_key); + let destination_ata = get_associated_token_address( + rewards_token_owner_key, + &publisher_journal.reward_mint_key, + ); + let needs_ata_create = !known_existing_atas.contains(&destination_ata); + match submit_distribute_tx( + wallet, + candidate, + &publisher_journal, + publisher_mint, + rewards_token_owner_key, + node_id, + &dz_mint_key, + needs_init, + needs_ata_create, + out, + ) + .await + { + Ok(()) => { + outcome.distributed += 1; + if needs_init { + emitted_init_for_holding.insert(init_key); + } + if needs_ata_create { + // Now-created ATA exists for the rest of the pass. + known_existing_atas.insert(destination_ata); + } + } + Err(error) => { + let full = format!("{error:#}"); + let summary = full.lines().next().unwrap_or(&full); + eprintln!( + " epoch {} mint {publisher_mint}: failed: {summary}", + candidate.subscription_epoch + ); + outcome.failed += 1; + } + } + } + } + + Ok(outcome) +} + +// Builds and submits one distribute tx. The CLI version check is NOT +// prepended here — the configure tx that ran before this pass already +// enforced version compatibility for the operator session, so re-running +// it ~300 times during the pass is wasted CU. Future callers that invoke +// `try_distribute_pending` outside the configure flow are responsible for +// running their own version gate at the top of the pass. +#[allow(clippy::too_many_arguments)] +async fn submit_distribute_tx( + wallet: &Wallet, + candidate: &Candidate, + publisher_journal: &ZeroCopyAccountOwnedData, + publisher_mint_key: &Pubkey, + rewards_token_owner_key: &Pubkey, + node_id: &Pubkey, + dz_mint_key: &Pubkey, + needs_init: bool, + needs_ata_create: bool, + out: &mut impl Write, +) -> Result<()> { + let mut instructions: Vec = Vec::new(); + + if needs_init { + let init_ix = try_build_instruction( + &ID, + InitializeClaimHoldingAccounts::new( + candidate.leaf.client_id, + candidate.subscription_epoch, + dz_mint_key, + &wallet.pubkey(), + ), + &ShredSubscriptionInstructionData::InitializeClaimHolding(candidate.subscription_epoch), + )?; + instructions.push(init_ix); + } + + // The destination ATA is at `(rewards_token_owner_key, journal's + // reward_mint_key)` — which can differ from the validator's currently + // configured mint when we're distributing from a journal seeded + // historically against a different mint. `configure` only creates the + // ATA for the current mint, so we (idempotently) create whatever + // destination this specific tx needs. Skipped when we already know + // the destination ATA exists (pre-fetched at the top of the pass, + // plus any ATA freshly created earlier in the same pass). + if needs_ata_create { + instructions.push(create_associated_token_account_idempotent( + &wallet.pubkey(), + rewards_token_owner_key, + &publisher_journal.reward_mint_key, + &spl_token_interface::ID, + )); + } + + let distribute_ix = try_build_instruction( + &ID, + DistributeValidatorRewardsAccountsInitializer { + subscription_epoch: candidate.subscription_epoch, + associated_dz_epoch: candidate.associated_dz_epoch, + node_id, + client_id: candidate.leaf.client_id, + rewards_token_owner_key, + publisher_mint_key, + publisher_reward_mint_key: &publisher_journal.reward_mint_key, + // Builder applies the omit-rule when this equals + // `publisher_mint_key`. + client_mint_key: dz_mint_key, + }, + &ShredSubscriptionInstructionData::DistributeValidatorRewards { + leader_slots: candidate.leaf.leader_slots, + proof: candidate.proof.clone(), + }, + )?; + instructions.push(distribute_ix); + + // Per-ix headroom: ~30k init_claim_holding (only when `needs_init`), + // ~25k create_ata_idempotent (only when `needs_ata_create`), ~150k + // distribute. Same upper bounds as the admin command's submission loop. + let cu_limit = + 150_000 + if needs_init { 30_000 } else { 0 } + if needs_ata_create { 25_000 } else { 0 }; + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit(cu_limit)); + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + // Fetch a fresh blockhash per tx. The pass submits sequentially and a + // validator with many pending epochs can run long enough that a single + // blockhash cached up front ages out of the cluster's validity window + // mid-pass — every later tx then fails with "Blockhash not found". + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + writeln!( + out, + " epoch {} mint {publisher_mint_key}: distributed ({tx_sig})", + candidate.subscription_epoch + )?; + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + Ok(()) +} + +pub(crate) fn bitmap_bit_set(bitmap: &[u8], leaf_index: usize) -> bool { + let byte_idx = leaf_index / 8; + let bit_idx = leaf_index % 8; + bitmap + .get(byte_idx) + .map(|b| (b >> bit_idx) & 1 == 1) + .unwrap_or(false) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_bitmap_bit_set_in_range() { + let bitmap = vec![0b0000_1001, 0b0000_0010]; + assert!(bitmap_bit_set(&bitmap, 0)); + assert!(!bitmap_bit_set(&bitmap, 1)); + assert!(bitmap_bit_set(&bitmap, 3)); + assert!(!bitmap_bit_set(&bitmap, 8)); + assert!(bitmap_bit_set(&bitmap, 9)); + } + + #[test] + fn test_bitmap_bit_set_out_of_range() { + let bitmap = vec![0xff]; + assert!(!bitmap_bit_set(&bitmap, 8)); + assert!(!bitmap_bit_set(&bitmap, 1_000)); + } + + #[test] + fn test_bitmap_bit_set_empty() { + assert!(!bitmap_bit_set(&[], 0)); + } + + /// Mirrors on-chain `try_process_remaining_data_leaf_index` (see + /// `programs/shred-subscription/src/processor/common.rs`) byte-for-byte: + /// `bitmap[leaf_index / 8] |= 1 << (leaf_index % 8)` (LSB-first within + /// the byte, via `ByteFlags::set_bit`). If the on-chain accumulate ix + /// ever changes either the byte indexing or the bit ordering, update + /// this helper to match — the parity test below will then fail until + /// `bitmap_bit_set` is brought back in sync. + fn set_leaf_accumulated_onchain_style(bitmap: &mut [u8], leaf_index: u32) { + let byte_index = (leaf_index as usize) / 8; + let bit_index = (leaf_index as usize) % 8; + bitmap[byte_index] |= 1 << bit_index; + } + + #[test] + fn bitmap_bit_set_matches_onchain_accumulate_convention() { + // Build a bitmap by following the on-chain accumulate steps for a + // chosen set of leaf indices, then verify our reader sees exactly + // those bits set. Indices are deliberately sparse across byte + // boundaries (0, 7, 8 hit the byte-boundary edge; 64, 100, 127 + // exercise sparse high indices). + let mut bitmap = vec![0u8; 16]; + let accumulated_indices: &[u32] = &[0, 3, 7, 8, 9, 17, 64, 100, 127]; + for &leaf_index in accumulated_indices { + set_leaf_accumulated_onchain_style(&mut bitmap, leaf_index); + } + for leaf_index in 0u32..128 { + let expected = accumulated_indices.contains(&leaf_index); + assert_eq!( + bitmap_bit_set(&bitmap, leaf_index as usize), + expected, + "leaf_index {leaf_index}" + ); + } + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/init.rs b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/init.rs new file mode 100644 index 0000000000..ca27516d2c --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/init.rs @@ -0,0 +1,72 @@ +use std::io::Write; + +use anyhow::{Result, bail}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::payer::TransactionOutcome; +use doublezero_solana_sdk::{ + shred_subscription::{ + ID, + instruction::{ + ShredSubscriptionInstructionData, account::InitializeValidatorPublisherRewardsAccounts, + }, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::pubkey::Pubkey; + +/* + doublezero-solana shreds publisher-rewards init --node-id +*/ + +#[derive(Debug, Args)] +pub struct InitCommand { + /// Validator node identity. The seed for the validator publisher rewards PDA. + #[arg(long)] + pub node_id: Pubkey, + + #[command(flatten)] + pub write_opts: crate::command::WriteVerbOptions, +} + +impl InitCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + if self.node_id == Pubkey::default() { + bail!("--node-id must not be the default pubkey"); + } + + let wallet = crate::command::build_wallet(ctx, self.write_opts)?; + let wallet_key = wallet.pubkey(); + + writeln!( + out, + "Shred subscription - Initialize Validator Publisher Rewards" + )?; + writeln!(out, "Node ID: {}", self.node_id)?; + + let ix = try_build_instruction( + &ID, + InitializeValidatorPublisherRewardsAccounts::new(&wallet_key, &self.node_id), + &ShredSubscriptionInstructionData::InitializeValidatorPublisherRewards(self.node_id), + )?; + + let check_ix = super::super::build_check_cli_version_instruction()?; + let mut instructions = vec![check_ix, ix]; + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit(20_000)); + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + writeln!(out, "Initialized validator publisher rewards: {tx_sig}")?; + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + Ok(()) + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/mod.rs b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/mod.rs new file mode 100644 index 0000000000..2c3f0b357c --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/mod.rs @@ -0,0 +1,160 @@ +pub mod configure; +pub mod distribute; +pub mod init; +pub mod prepare_offchain_message; +pub mod rewards_mint_arg; +pub mod s3; +pub mod show; +pub mod status; + +use std::io::Write; + +use anyhow::{Context, Result, bail}; +use clap::{Args, Subcommand}; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::account::zero_copy::ZeroCopyAccountOwnedData; +use doublezero_solana_sdk::{Pubkey, shred_subscription::state::ShredRewardToken}; +use solana_sdk::account::Account; + +#[derive(Debug, Args)] +pub struct PublisherRewardsCommand { + #[command(subcommand)] + pub command: PublisherRewardsSubcommand, +} + +#[derive(Debug, Subcommand)] +pub enum PublisherRewardsSubcommand { + /// Initialize the ValidatorPublisherRewards PDA (permissionless). + Init(init::InitCommand), + /// Print the hex blob to be signed via `solana sign-offchain-message`. + PrepareOffchainMessage(prepare_offchain_message::PrepareOffchainMessageCommand), + /// Configure the ValidatorPublisherRewards PDA (auto-inits if missing). + Configure(configure::ConfigureCommand), + /// Print current ValidatorPublisherRewards fields. + Show(show::ShowCommand), + /// Print a per-epoch reward status table (not ready / ready / claimed). + Status(status::StatusCommand), +} + +impl PublisherRewardsCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + match self.command { + PublisherRewardsSubcommand::Init(c) => c.execute(ctx, out).await, + PublisherRewardsSubcommand::PrepareOffchainMessage(c) => c.execute(ctx, out).await, + PublisherRewardsSubcommand::Configure(c) => c.execute(ctx, out).await, + PublisherRewardsSubcommand::Show(c) => c.execute(ctx, out).await, + PublisherRewardsSubcommand::Status(c) => c.execute(ctx, out).await, + } + } +} + +/// Validate that `rewards_token_mint` corresponds to a registered, enabled +/// `ShredRewardToken`. The caller passes the already-fetched account at the +/// SRT PDA (`None` means the account does not exist). +/// +/// Used as a pre-flight by both `configure` (which spends a transaction) and +/// `prepare-offchain-message` (which produces a hex blob that would otherwise +/// only fail after a full offline round-trip + signing on the validator host). +pub(crate) fn validate_shred_reward_token( + rewards_token_mint: &Pubkey, + srt_pda: &Pubkey, + account: Option<&Account>, +) -> Result<()> { + let srt_account = account.with_context(|| { + format!("rewards token mint {rewards_token_mint} is not a registered ShredRewardToken") + })?; + let srt = ZeroCopyAccountOwnedData::::from_account(srt_account) + .with_context(|| format!("ShredRewardToken account at {srt_pda} is malformed"))?; + if !srt.is_enabled() { + bail!( + "rewards token mint {rewards_token_mint} is registered but disabled — \ + pick an enabled mint or wait for the admin to re-enable it" + ); + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use bytemuck::Zeroable; + use doublezero_solana_sdk::{ + PrecomputedDiscriminator, shred_subscription::state::ShredRewardToken, + }; + + use super::*; + + /// Build an `Account` whose data is + /// `[discriminator || bytemuck(ShredRewardToken)]`, matching the on-chain + /// layout. `enabled` toggles `ShredRewardToken::FLAG_IS_ENABLED_BIT`. + fn shred_reward_token_account(enabled: bool) -> Account { + let mut shred_reward_token = ShredRewardToken::zeroed(); + if enabled { + // Set the IS_ENABLED bit directly in the underlying flag bytes so + // the test fixture does not need to import `ruint`. `flags` is the + // first field after `mint_key` (32 bytes), and `Flags = ruint::U64` + // is 8 bytes laid out little-endian — bit 1 lives in byte 0. + let bytes = bytemuck::bytes_of_mut(&mut shred_reward_token); + bytes[32] |= 1u8 << ShredRewardToken::FLAG_IS_ENABLED_BIT; + } + let mut data = Vec::with_capacity(8 + std::mem::size_of::()); + data.extend_from_slice(ShredRewardToken::discriminator_slice()); + data.extend_from_slice(bytemuck::bytes_of(&shred_reward_token)); + Account { + data, + ..Account::default() + } + } + + #[test] + fn validate_shred_reward_token_none_is_not_registered() { + let mint = Pubkey::new_unique(); + let pda = Pubkey::new_unique(); + let err = validate_shred_reward_token(&mint, &pda, None) + .expect_err("None must be rejected as not-registered"); + let message = format!("{err:#}"); + assert!( + message.contains("not a registered ShredRewardToken"), + "got: {message}" + ); + } + + #[test] + fn validate_shred_reward_token_malformed_data_errors() { + let mint = Pubkey::new_unique(); + let pda = Pubkey::new_unique(); + // Wrong discriminator + arbitrary trailing bytes → `from_account` + // returns None and the helper surfaces a "malformed" error rather + // than silently parsing junk. + let bogus = Account { + data: vec![0u8; 8 + std::mem::size_of::()], + ..Account::default() + }; + let err = validate_shred_reward_token(&mint, &pda, Some(&bogus)) + .expect_err("zero-discriminator data must be rejected"); + let message = format!("{err:#}"); + assert!(message.contains("is malformed"), "got: {message}"); + } + + #[test] + fn validate_shred_reward_token_disabled_errors() { + let mint = Pubkey::new_unique(); + let pda = Pubkey::new_unique(); + let account = shred_reward_token_account(false); + let err = validate_shred_reward_token(&mint, &pda, Some(&account)) + .expect_err("disabled ShredRewardToken must be rejected"); + let message = format!("{err:#}"); + assert!( + message.contains("registered but disabled"), + "got: {message}" + ); + } + + #[test] + fn validate_shred_reward_token_enabled_ok() { + let mint = Pubkey::new_unique(); + let pda = Pubkey::new_unique(); + let account = shred_reward_token_account(true); + validate_shred_reward_token(&mint, &pda, Some(&account)) + .expect("enabled ShredRewardToken must pass pre-flight"); + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/prepare_offchain_message.rs b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/prepare_offchain_message.rs new file mode 100644 index 0000000000..d2849e9446 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/prepare_offchain_message.rs @@ -0,0 +1,235 @@ +use std::{io::Write, time::Duration}; + +use anyhow::{Context, Result, bail}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::rpc::SolanaConnectionOptions; +use doublezero_solana_sdk::{ + Pubkey, + shred_subscription::{ + ID, state::find_shred_reward_token_address, + types::ConfigureValidatorPublisherRewardsAuthMessage, + }, +}; + +use super::{super::NOMINAL_SLOT_DURATION, rewards_mint_arg::RewardsMintArg}; + +/* + doublezero-solana shreds publisher-rewards prepare-offchain-message \ + --node-id --rewards-token-owner \ + [--rewards-token-mint ] \ + [--deadline-slot | --valid-for ] [--json] +*/ + +const DEFAULT_VALID_FOR: Duration = Duration::from_secs(60 * 60); + +#[derive(Debug, Args)] +pub struct PrepareOffchainMessageCommand { + #[arg(long)] + pub node_id: Pubkey, + /// Mint to receive rewards in. Accepts a base58 pubkey or one of the + /// aliases `2z`, `usdc`, `wsol` (env-aware where applicable). Defaults + /// to `2z`. + #[arg(long, default_value = "2z")] + pub rewards_token_mint: RewardsMintArg, + #[arg(long)] + pub rewards_token_owner: Pubkey, + + /// Absolute slot after which the authorization is no longer valid. + /// Mutually exclusive with `--valid-for`. + #[arg(long, conflicts_with = "valid_for")] + pub deadline_slot: Option, + + /// Duration the authorization remains valid (e.g. `1h`, `30m`, `7200s`). + /// Default: `1h`. Parsed via `humantime`. The program enforces an absolute + /// slot, so this is converted at a nominal 350ms per slot and the real + /// elapsed time varies with the cluster's slot rate. + #[arg(long, value_parser = parse_valid_for)] + pub valid_for: Option, + + /// Emit machine-readable JSON instead of the human-friendly multi-line + /// summary. Useful for shell pipelines. + #[arg(long)] + pub json: bool, + + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +impl PrepareOffchainMessageCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + if self.node_id == Pubkey::default() { + bail!("--node-id must not be the default pubkey"); + } + if self.rewards_token_owner == Pubkey::default() { + bail!("--rewards-token-owner must not be the default pubkey"); + } + + let connection = crate::command::solana_connection(ctx, &self.connection_options); + let rewards_token_mint = self.rewards_token_mint.resolve(&connection).await?; + + // Pre-flight: the on-chain `configure` rejects unregistered/disabled + // mints. Catching it here saves a full offline round-trip (hex → + // validator-host signing → back → configure submit) for a mint that + // would never succeed. + let srt_pda = find_shred_reward_token_address(&rewards_token_mint).0; + let srt_account = connection + .0 + .get_account_with_commitment(&srt_pda, connection.0.commitment()) + .await + .with_context(|| { + format!("failed to read ShredRewardToken account at {srt_pda} for pre-flight") + })? + .value; + super::validate_shred_reward_token(&rewards_token_mint, &srt_pda, srt_account.as_ref())?; + + let current_slot = connection + .get_slot() + .await + .context("failed to query current slot from RPC")?; + + let deadline_slot = + resolve_deadline_slot(current_slot, self.deadline_slot, self.valid_for)?; + + let message = ConfigureValidatorPublisherRewardsAuthMessage { + program_id: *ID, + node_id: self.node_id, + rewards_token_owner_key: self.rewards_token_owner, + rewards_token_mint_key: rewards_token_mint, + deadline_slot, + }; + + let hex = std::str::from_utf8(&message.to_hex_encoded()) + .expect("hex output is ASCII") + .to_owned(); + + if self.json { + writeln!( + out, + "{}", + serde_json::json!({ + "hex": hex, + "deadline_slot": deadline_slot, + }) + )?; + } else { + writeln!(out, "Hex message: {hex}")?; + writeln!(out, "Deadline slot: {deadline_slot}")?; + writeln!(out)?; + writeln!(out, "Sign with:")?; + writeln!( + out, + " solana sign-offchain-message {hex} --keypair " + )?; + writeln!(out)?; + writeln!(out, "Then submit:")?; + writeln!( + out, + " doublezero-solana shreds publisher-rewards configure \\ + --node-id {} --rewards-token-mint {rewards_token_mint} --rewards-token-owner {} \\ + --deadline-slot {deadline_slot} --signature ", + self.node_id, self.rewards_token_owner + )?; + } + + Ok(()) + } +} + +/// Pure helper: resolve the absolute deadline slot from CLI inputs. +/// +/// `--deadline-slot` always wins. If absent, `--valid-for` is divided by +/// `NOMINAL_SLOT_DURATION` and added to `current_slot`. If both are `None`, +/// defaults to 1h. Both supplied is an error. +pub(crate) fn resolve_deadline_slot( + current_slot: u64, + deadline_slot: Option, + valid_for: Option, +) -> Result { + if deadline_slot.is_some() && valid_for.is_some() { + // Defense in depth — clap also catches this via `conflicts_with`. + bail!("--deadline-slot and --valid-for are mutually exclusive"); + } + if let Some(d) = deadline_slot { + return Ok(d); + } + let duration = valid_for.unwrap_or(DEFAULT_VALID_FOR); + let slots = duration + .as_millis() + .checked_div(NOMINAL_SLOT_DURATION.as_millis()) + .context("invalid slot duration")?; + let slots: u64 = slots + .try_into() + .context("--valid-for too large to encode as a slot delta")?; + Ok(current_slot.saturating_add(slots)) +} + +/// Parse `--valid-for` via `humantime` and reject a zero duration. A zero +/// duration would put `deadline_slot` at the current slot, so the +/// authorization would be born already-expired. +fn parse_valid_for(s: &str) -> Result { + let duration = humantime::parse_duration(s).map_err(|e| format!("invalid duration: {e}"))?; + if duration.is_zero() { + return Err("--valid-for must be greater than zero".to_owned()); + } + Ok(duration) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn explicit_deadline_slot_wins() { + let resolved = resolve_deadline_slot(100, Some(500), None).unwrap(); + assert_eq!(resolved, 500); + } + + #[test] + fn valid_for_default_one_hour() { + let resolved = resolve_deadline_slot(100, None, None).unwrap(); + // 3,600,000 ms / 350 ms = 10,285 slots (integer division truncates the + // remainder of 250 ms). + assert_eq!(resolved, 100 + 10_285); + } + + #[test] + fn valid_for_explicit_30m() { + let resolved = + resolve_deadline_slot(100, None, Some(Duration::from_secs(30 * 60))).unwrap(); + // 1,800,000 ms / 350 ms = 5,142 slots (integer division truncates the + // remainder of 300 ms). + assert_eq!(resolved, 100 + 5_142); + } + + #[test] + fn explicit_and_valid_for_is_error() { + let r = resolve_deadline_slot(100, Some(500), Some(Duration::from_secs(60))); + assert!(r.is_err()); + } + + #[test] + fn parse_valid_for_examples() { + assert_eq!(parse_valid_for("60s").unwrap(), Duration::from_secs(60)); + assert_eq!(parse_valid_for("5m").unwrap(), Duration::from_secs(300)); + assert_eq!(parse_valid_for("2h").unwrap(), Duration::from_secs(7200)); + // humantime accepts whitespace between number and unit (the + // hand-rolled parser previously rejected this). + assert_eq!(parse_valid_for("1 h").unwrap(), Duration::from_secs(3600)); + assert!(parse_valid_for("5x").is_err()); + assert!(parse_valid_for("hello").is_err()); + } + + #[test] + fn parse_valid_for_zero_rejected() { + assert!(parse_valid_for("0s").is_err()); + assert!(parse_valid_for("0m").is_err()); + } + + #[test] + fn parse_valid_for_overflow_rejected() { + // u64::MAX seconds would overflow the old hand-rolled `num * 60 * 60`. + // humantime rejects values that don't fit in a `Duration`. + assert!(parse_valid_for("99999999999999999999h").is_err()); + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/rewards_mint_arg.rs b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/rewards_mint_arg.rs new file mode 100644 index 0000000000..ba88bfe342 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/rewards_mint_arg.rs @@ -0,0 +1,107 @@ +use std::str::FromStr; + +use anyhow::{Context, Result, anyhow}; +use doublezero_solana_client_tools::rpc::SolanaConnection; +use doublezero_solana_sdk::{ + Pubkey, environment_2z_token_mint_key, environment_usdc_token_mint_key, +}; + +/// A `--rewards-token-mint` argument: either an explicit pubkey or a +/// well-known alias resolved against the connected network environment. +/// +/// Aliases accepted (case-insensitive): `2z`, `usdc`, `wsol`. +#[derive(Debug, Clone)] +pub enum RewardsMintArg { + Pubkey(Pubkey), + Alias(MintAlias), +} + +#[derive(Debug, Clone, Copy)] +pub enum MintAlias { + TwoZ, + Usdc, + Wsol, +} + +impl FromStr for RewardsMintArg { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + match s.to_ascii_lowercase().as_str() { + "2z" => Ok(Self::Alias(MintAlias::TwoZ)), + "usdc" => Ok(Self::Alias(MintAlias::Usdc)), + "wsol" => Ok(Self::Alias(MintAlias::Wsol)), + _ => Pubkey::from_str(s).map(Self::Pubkey).map_err(|_| { + anyhow!("expected a base58 pubkey or one of '2z', 'usdc', 'wsol' (got '{s}')") + }), + } + } +} + +impl RewardsMintArg { + /// Resolve to an on-chain mint pubkey. Looks up the network environment + /// via `connection` only when the alias actually requires it. + pub async fn resolve(&self, connection: &SolanaConnection) -> Result { + match self { + Self::Pubkey(p) => Ok(*p), + Self::Alias(MintAlias::TwoZ) => { + let env = connection + .try_network_environment() + .await + .context("failed to determine network environment for '2z' alias")?; + Ok(environment_2z_token_mint_key(env)) + } + Self::Alias(MintAlias::Usdc) => { + let env = connection + .try_network_environment() + .await + .context("failed to determine network environment for 'usdc' alias")?; + Ok(environment_usdc_token_mint_key(env)) + } + Self::Alias(MintAlias::Wsol) => Ok(spl_token_interface::native_mint::ID), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parses_aliases_case_insensitive() { + for s in ["2z", "2Z"] { + assert!(matches!( + RewardsMintArg::from_str(s).unwrap(), + RewardsMintArg::Alias(MintAlias::TwoZ) + )); + } + for s in ["usdc", "USDC", "Usdc"] { + assert!(matches!( + RewardsMintArg::from_str(s).unwrap(), + RewardsMintArg::Alias(MintAlias::Usdc) + )); + } + for s in ["wsol", "WSOL"] { + assert!(matches!( + RewardsMintArg::from_str(s).unwrap(), + RewardsMintArg::Alias(MintAlias::Wsol) + )); + } + } + + #[test] + fn parses_explicit_pubkey() { + let pk = Pubkey::new_unique(); + let arg = RewardsMintArg::from_str(&pk.to_string()).unwrap(); + assert!(matches!(arg, RewardsMintArg::Pubkey(p) if p == pk)); + } + + #[test] + fn rejects_unknown_alias() { + let err = RewardsMintArg::from_str("eth").expect_err("unknown alias must error"); + assert!( + err.to_string().contains("'2z', 'usdc', 'wsol'"), + "got: {err}" + ); + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/s3.rs b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/s3.rs new file mode 100644 index 0000000000..b64209acad --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/s3.rs @@ -0,0 +1,241 @@ +// VENDORED from `malbeclabs/doublezero-shreds`: +// `crates/shred-oracle/src/validator_rewards/s3.rs`. Kept in sync by hand +// because offchain only needs the S3 fetch + merkle-tree primitives, not the +// rest of the oracle. Remove this file once the shreds repo is merged into +// the monorepo and we can depend on `doublezero_shred_oracle::validator_rewards::s3` +// directly. + +use std::{str::FromStr, time::Duration}; + +use anyhow::{Context, Result, ensure}; +use doublezero_solana_sdk::{ + Pubkey, + merkle::{MerkleProof, merkle_root_from_indexed_pod_leaves}, + sha2::Hash, + shred_subscription::types::ValidatorRewardsLeaf, +}; +use reqwest::Client; +use serde::Deserialize; +use tracing::{debug, warn}; + +pub const S3_BASE_URL: &str = "https://doublezero-foundation-public.s3.us-east-2.amazonaws.com/exports/multicast_validator_leader_slots"; + +pub fn build_s3_client() -> Result { + Client::builder() + .connect_timeout(Duration::from_secs(10)) + .timeout(Duration::from_secs(30)) + .build() + .context("build S3 reqwest client") +} + +#[derive(Debug, Clone, Deserialize)] +#[allow(dead_code)] // `epoch` is in the wire format but unused offchain (URL carries it). +pub struct ValidatorLeaderSlotEntry { + pub epoch: u64, + pub node_identity: String, + pub client_id: u16, + pub number_of_leader_slots: u32, +} + +#[derive(Debug, Clone)] +#[allow(dead_code)] // `root` + totals are kept for parity with the canonical impl; not used offchain today. +pub struct ComputedLeaves { + pub leaves: Vec, + pub root: Hash, + pub total_publishing_validators: u32, + pub total_published_leader_slots: u32, +} + +pub async fn fetch_leader_slot_data( + client: &Client, + solana_epoch: u64, +) -> Result> { + let url = format!("{S3_BASE_URL}/{solana_epoch}.json"); + debug!(url, "Fetching validator leader-slot data"); + + let response = client + .get(&url) + .send() + .await + .with_context(|| format!("HTTP request to {url}"))?; + + ensure!( + response.status().is_success(), + "S3 returned status {} for epoch {solana_epoch}", + response.status(), + ); + + let entries = response + .json::>() + .await + .with_context(|| format!("deserialize leader-slot JSON for epoch {solana_epoch}"))?; + + debug!(count = entries.len(), "Fetched validator entries"); + Ok(entries) +} + +pub fn compute_leaves(entries: &[ValidatorLeaderSlotEntry]) -> Result { + ensure!(!entries.is_empty(), "no validator entries to compute root"); + + let mut leaves = entries + .iter() + .filter_map(|entry| match Pubkey::from_str(&entry.node_identity) { + Ok(pubkey) => Some(ValidatorRewardsLeaf::new( + pubkey, + entry.number_of_leader_slots, + entry.client_id, + )), + Err(err) => { + warn!( + node_identity = %entry.node_identity, + client_id = entry.client_id, + %err, + "dropping entry with unparseable node_identity \ + (must match canonical oracle; if this is a real \ + validator the merkle root will diverge from on-chain)" + ); + None + } + }) + .collect::>(); + + leaves.sort_unstable_by_key(|l| (l.node_id, l.client_id)); + + if let Some(pair) = leaves + .windows(2) + .find(|w| w[0].node_id == w[1].node_id && w[0].client_id == w[1].client_id) + { + anyhow::bail!( + "duplicate (node_id, client_id) pair: node_id {}, client_id {} in validator leader-slot data", + pair[0].node_id, + pair[0].client_id, + ); + } + + let total = ::try_from(leaves.len()).context("too many validators")?; + ensure!(total > 0, "no valid validator entries after filtering"); + + let total_published_leader_slots = leaves.iter().map(|leaf| leaf.leader_slots).try_fold( + u32::default(), + |running_total, slots| { + running_total + .checked_add(slots) + .context("total published leader slots overflow") + }, + )?; + + let root = + merkle_root_from_indexed_pod_leaves(&leaves, Some(ValidatorRewardsLeaf::LEAF_PREFIX)) + .context("failed to compute merkle root")?; + + Ok(ComputedLeaves { + leaves, + root, + total_publishing_validators: total, + total_published_leader_slots, + }) +} + +// --------------------------------------------------------------------------- +// OFFCHAIN-ONLY ADDITIONS (not in canonical doublezero-shreds). +// These helpers layer on top of the vendored primitives above for offchain +// CLI use. When the shreds repo merges into the monorepo, decide whether +// to upstream these or fold them back into the caller. +// --------------------------------------------------------------------------- + +/// Compute the merkle proof for a single leaf at `leaf_index` against the +/// sorted leaf set returned by [`compute_leaves`]. Per-leaf cost is +/// O(log N), so callers that only need a few proofs out of a tree pay +/// proportionally — for the post-configure distribute pass at ~1500 +/// validators × 100 epochs of lookback, that's ~10 ops per matched leaf +/// instead of the ~16k ops per epoch a build-every-proof approach would +/// cost. +pub fn compute_proof_for_leaf( + leaves: &[ValidatorRewardsLeaf], + leaf_index: usize, +) -> Result { + let leaf_index_u32 = + u32::try_from(leaf_index).context("leaf_index too large for merkle proof")?; + MerkleProof::from_indexed_pod_leaves( + leaves, + leaf_index_u32, + Some(ValidatorRewardsLeaf::LEAF_PREFIX), + ) + .with_context(|| format!("compute merkle proof for leaf {leaf_index}")) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn make_entry(identity: &str, client_id: u16, slots: u32) -> ValidatorLeaderSlotEntry { + ValidatorLeaderSlotEntry { + epoch: 951, + node_identity: identity.to_string(), + client_id, + number_of_leader_slots: slots, + } + } + + /// PARITY PIN: canonical oracle's `compute_leaves` silently drops + /// entries whose `node_identity` doesn't parse as a Pubkey. This + /// test pins the same behavior in our offchain mirror — if a future + /// PR changes `compute_leaves` to hard-fail on bad parses, this + /// test fails and forces the author to also update the canonical + /// (or document why the divergence is acceptable). + #[test] + fn compute_leaves_drops_unparseable_pubkeys_silently() { + let valid_pubkey = Pubkey::new_unique(); + let entries = vec![ + make_entry(&valid_pubkey.to_string(), 1, 100), + // Two clearly unparseable entries — different malformations + // to exercise both lengths/charsets. + make_entry("not-a-pubkey", 2, 200), + make_entry("", 3, 300), + ]; + let computed = + compute_leaves(&entries).expect("valid entry survives; bad entries are dropped"); + assert_eq!( + computed.leaves.len(), + 1, + "only the valid entry should remain" + ); + assert_eq!(computed.leaves[0].node_id, valid_pubkey); + assert_eq!(computed.total_publishing_validators, 1); + assert_eq!(computed.total_published_leader_slots, 100); + } + + /// End-to-end check of the offchain proof path: build the sorted + /// leaf set, then assert each per-leaf proof reconstructs the same + /// root that `compute_leaves` produced. This is the contract that + /// matters on-chain — the distribute ix verifies leaves against the + /// posted root via these proofs. + #[test] + fn compute_proof_for_leaf_reconstructs_root() { + let pk1 = Pubkey::new_unique(); + let pk2 = Pubkey::new_unique(); + let pk3 = Pubkey::new_unique(); + let entries = vec![ + make_entry(&pk2.to_string(), 2, 200), + make_entry(&pk1.to_string(), 1, 100), + make_entry(&pk3.to_string(), 3, 300), + ]; + + let computed = compute_leaves(&entries).unwrap(); + + assert_eq!(computed.leaves.len(), 3); + assert_eq!(computed.total_publishing_validators, 3); + assert_eq!(computed.total_published_leader_slots, 600); + // Sorted by (node_id, client_id) — secondary key is irrelevant + // here since all three node_ids differ. + assert!(computed.leaves[0].node_id < computed.leaves[1].node_id); + assert!(computed.leaves[1].node_id < computed.leaves[2].node_id); + + for (leaf_index, leaf) in computed.leaves.iter().enumerate() { + let proof = compute_proof_for_leaf(&computed.leaves, leaf_index).unwrap(); + let reconstructed = + proof.root_from_pod_leaf(leaf, Some(ValidatorRewardsLeaf::LEAF_PREFIX)); + assert_eq!(reconstructed, computed.root, "leaf_index {leaf_index}"); + } + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/show.rs b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/show.rs new file mode 100644 index 0000000000..727bf1d0ad --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/show.rs @@ -0,0 +1,75 @@ +use std::io::Write; + +use anyhow::{Context, Result}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::rpc::SolanaConnectionOptions; +use doublezero_solana_sdk::{ + Pubkey, + shred_subscription::state::{ + ValidatorPublisherRewards, find_validator_publisher_rewards_address, + }, +}; +use spl_associated_token_account_interface::address::get_associated_token_address; + +/* + doublezero-solana shreds publisher-rewards show --node-id +*/ + +#[derive(Debug, Args)] +pub struct ShowCommand { + #[arg(long)] + pub node_id: Pubkey, + + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +impl ShowCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let connection = crate::command::solana_connection(ctx, &self.connection_options); + let commitment = connection.0.commitment(); + let pda = find_validator_publisher_rewards_address(&self.node_id).0; + + // Distinguish RPC failure (propagated `?`) from absent account + // ("Failed to fetch account {pda}"). + let vpr = connection + .try_fetch_zero_copy_data_with_commitment::(&pda, commitment) + .await + .with_context(|| { + format!( + "failed to read validator publisher rewards for node {} (PDA {pda})", + self.node_id + ) + })?; + let owner = vpr.rewards_token_owner_key; + let mint = vpr.rewards_token_mint_key; + let ata = get_associated_token_address(&owner, &mint); + + writeln!(out, "Node ID: {}", vpr.node_id)?; + writeln!(out, "Rewards owner: {owner}")?; + writeln!(out, "Rewards mint: {mint}")?; + writeln!(out, "Resolved ATA: {ata}")?; + + // Rewards won't be distributed unless the ATA exists. `configure` + // creates it idempotently, so this is a status line (None) rather + // than an error. RPC failures propagate so a transient network blip + // is not silently reported as "missing". + let ata_account = connection + .0 + .get_account_with_commitment(&ata, commitment) + .await + .with_context(|| format!("failed to query ATA {ata} status"))? + .value; + match ata_account { + Some(_) => writeln!(out, "ATA status: exists")?, + None => writeln!( + out, + "ATA status: missing — rewards won't be distributed until it's created. \ + Re-run `doublezero-solana shreds publisher-rewards configure` to create it, \ + or run `spl-token create-account {mint} --owner {owner}` manually." + )?, + } + Ok(()) + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/status.rs b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/status.rs new file mode 100644 index 0000000000..e2b2b9fb9b --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/publisher_rewards/status.rs @@ -0,0 +1,858 @@ +use std::{ + collections::{HashMap, HashSet}, + io::Write, +}; + +use anyhow::{Context, Result}; +use borsh::BorshDeserialize; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + rpc::{SolanaConnection, SolanaConnectionOptions}, +}; +use doublezero_solana_sdk::{ + Pubkey, environment_2z_token_mint_key, environment_usdc_token_mint_key, + revenue_distribution::{ + state::Distribution as ParentDistribution, + types::{BurnRate, DoubleZeroEpoch, UnitShare16}, + }, + shred_subscription::{ + self, + instruction::ShredSubscriptionInstructionData, + state::{ + ShredDistribution, ShredDistributionJournal, ValidatorClientRewardsConfig, + ValidatorPublisherRewards, find_shred_distribution_address, + find_shred_distribution_journal_address, find_validator_publisher_rewards_address, + }, + }, +}; +use futures::stream::{self, StreamExt}; +use solana_client::{ + rpc_client::GetConfirmedSignaturesForAddress2Config, rpc_config::RpcTransactionConfig, +}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::signature::Signature; +use solana_transaction_status_client_types::UiTransactionEncoding; +use tabled::{ + Table, + settings::{Alignment, Style, object::Columns}, +}; + +use super::{distribute::bitmap_bit_set, s3}; + +/// Default subscription-epoch lookback window; widen with `--num-epochs`. +const DEFAULT_LOOKBACK_EPOCHS: u64 = 20; + +/// Max in-flight S3 fetches during the per-epoch leaf-discovery fan-out +/// (same bound and rationale as the distribute pass). +const S3_FETCH_CONCURRENCY: usize = 8; + +/// Max in-flight `getTransaction` fetches when resolving claimed payouts. +const TX_FETCH_CONCURRENCY: usize = 8; + +/* + doublezero-solana shreds publisher-rewards status --node-id [--num-epochs ] +*/ + +#[derive(Debug, Args)] +pub struct StatusCommand { + /// Validator node identity to report on. + #[arg(long)] + pub node_id: Pubkey, + + /// How many subscription epochs back from the current Solana epoch to + /// scan. + #[arg(long, default_value_t = DEFAULT_LOOKBACK_EPOCHS)] + pub num_epochs: u64, + + #[command(flatten)] + pub connection_options: SolanaConnectionOptions, +} + +#[derive(Debug, Clone, Copy)] +enum RewardStatus { + NotReady, + Ready, + Claimed, + NoRewards, + NoData, +} + +impl RewardStatus { + fn label(self) -> &'static str { + match self { + RewardStatus::NotReady => "not ready", + RewardStatus::Ready => "ready", + RewardStatus::Claimed => "claimed", + RewardStatus::NoRewards => "no rewards", + RewardStatus::NoData => "no data", + } + } +} + +/// What we can say about the reward amount for an epoch. +enum AmountInfo { + /// `ready`: not yet paid, so projected from on-chain pool/slots/burn math. + Estimated { + raw: u64, + mint: Pubkey, + }, + /// `claimed`: the exact paid amount is read from the distribute tx later. + FromTx, + Unknown, +} + +#[derive(Debug, tabled::Tabled)] +struct StatusRow { + #[tabled(rename = "EPOCH")] + epoch: u64, + #[tabled(rename = "LEADER SLOTS")] + leader_slots: String, + #[tabled(rename = "MINT")] + mint: String, + #[tabled(rename = "AMOUNT")] + amount: String, + #[tabled(rename = "STATUS")] + status: &'static str, +} + +fn mint_symbol(mint: &Pubkey, mints: &[Pubkey; 3]) -> String { + if mint == &mints[0] { + "2Z".to_string() + } else if mint == &mints[1] { + "USDC".to_string() + } else if mint == &mints[2] { + "WSOL".to_string() + } else { + format!("{}…", &mint.to_string()[..4]) + } +} + +/// This validator's leaves in one epoch's sorted leaf set, with the epoch's +/// accumulation state and the per-client proportion config (for the `ready` +/// payout estimate). +struct EpochLeaves { + epoch: u64, + associated_dz_epoch: u64, + is_accumulated: bool, + client_rewards_config: ValidatorClientRewardsConfig, + /// `(leaf_index, leader_slots, client_id)` per `(node_id, client_id)` match. + leaves: Vec<(usize, u32, u16)>, +} + +/// Per-epoch result of the S3 leaf scan. Every epoch with an on-chain +/// `ShredDistribution` produces one of these — never silently dropped. +enum EpochOutcome { + Leader(EpochLeaves), + NoRewards { epoch: u64 }, + NoData { epoch: u64 }, +} + +impl StatusCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let connection = crate::command::solana_connection(ctx, &self.connection_options); + let commitment = connection.0.commitment(); + + let vpr_pda = find_validator_publisher_rewards_address(&self.node_id).0; + let vpr = connection + .try_fetch_zero_copy_data_with_commitment::( + &vpr_pda, commitment, + ) + .await + .with_context(|| { + format!( + "failed to read validator publisher rewards for node {} (PDA {vpr_pda}); \ + run `doublezero-solana shreds publisher-rewards configure` first", + self.node_id + ) + })?; + + let network_env = connection + .try_network_environment() + .await + .context("detecting network environment")?; + + let mints = [ + environment_2z_token_mint_key(network_env), + environment_usdc_token_mint_key(network_env), + spl_token_interface::native_mint::ID, + ]; + + writeln!(out, "Node ID: {}", vpr.node_id)?; + writeln!(out, "Rewards owner: {}", vpr.rewards_token_owner_key)?; + writeln!( + out, + "Rewards mint: {}", + mint_symbol(&vpr.rewards_token_mint_key, &mints) + )?; + + // Subscription epoch == Solana epoch; resolve the window against the + // Solana RPC the program lives on. Same reasoning as distribute. + let current_epoch = connection + .0 + .get_epoch_info() + .await + .context("fetching current Solana epoch")? + .epoch; + let from_epoch = current_epoch.saturating_sub(self.num_epochs); + + writeln!(out, "\nScanning epochs {from_epoch}..={current_epoch}.")?; + + let rows = scan_epoch_status( + &connection, + &self.node_id, + &vpr_pda, + &vpr.rewards_token_owner_key, + from_epoch, + current_epoch, + &mints, + ) + .await?; + + if rows.is_empty() { + writeln!( + out, + "\nNo shred distributions found in epochs {from_epoch}..={current_epoch}. \ + Widen the window with --num-epochs if you expected older rewards." + )?; + return Ok(()); + } + + let mut table = Table::new(&rows); + table.with(Style::markdown()); + table.modify(Columns::one(1), Alignment::right()); + table.modify(Columns::one(3), Alignment::right()); + writeln!(out, "\n{table}")?; + + writeln!( + out, + "\nStatus:\n \ + ready reward is accumulated and waiting to be distributed to your ATA\n \ + not ready reward for this epoch isn't distributable yet (still being collected, \ + calculated, or swapped)\n \ + claimed reward has already been distributed to your ATA\n \ + no rewards you published no shreds this epoch, so there's nothing to distribute\n \ + no data this epoch's leader-slot export isn't available yet" + )?; + + Ok(()) + } +} + +#[allow(clippy::too_many_arguments)] +async fn scan_epoch_status( + dz_connection: &SolanaConnection, + node_id: &Pubkey, + vpr_pda: &Pubkey, + rewards_token_owner_key: &Pubkey, + from_epoch: u64, + current_epoch: u64, + mints: &[Pubkey; 3], +) -> Result> { + let shred_distribution_pdas = (from_epoch..=current_epoch) + .map(|epoch| find_shred_distribution_address(epoch).0) + .collect::>(); + let shred_distribution_accounts = dz_connection + .try_fetch_multiple_accounts(&shred_distribution_pdas) + .await + .context("fetching ShredDistribution accounts")?; + + let existing = shred_distribution_accounts + .into_iter() + .enumerate() + .filter_map(|(offset, account)| { + if account.data.is_empty() { + return None; + } + let epoch = from_epoch + offset as u64; + let shred_distribution: ZeroCopyAccountOwnedData = + account.try_into().ok()?; + Some((epoch, shred_distribution)) + }) + .collect::>(); + + if existing.is_empty() { + return Ok(Vec::new()); + } + + // Fan out S3 to find this validator's leaves per epoch. + let s3_client = s3::build_s3_client()?; + let mut fetch_results = stream::iter(existing.iter()) + .map(|(epoch, shred_distribution)| { + let s3_client = s3_client.clone(); + async move { + let result = s3::fetch_leader_slot_data(&s3_client, *epoch).await; + (*epoch, shred_distribution, result) + } + }) + .buffer_unordered(S3_FETCH_CONCURRENCY) + .collect::>() + .await; + fetch_results.sort_by_key(|(epoch, _, _)| *epoch); + + let mut outcomes: Vec = Vec::new(); + for (epoch, shred_distribution, fetch_result) in fetch_results { + // A missing export is expected for the most recent epoch (it hasn't run + // yet); surface it as `no data` rather than dropping the epoch. + let entries = match fetch_result { + Ok(entries) => entries, + Err(_) => { + outcomes.push(EpochOutcome::NoData { epoch }); + continue; + } + }; + let computed = match s3::compute_leaves(&entries) { + Ok(computed) => computed, + Err(err) => { + eprintln!(" epoch {epoch}: leader-slot data unusable: {err:#}"); + outcomes.push(EpochOutcome::NoData { epoch }); + continue; + } + }; + let leaves = computed + .leaves + .iter() + .enumerate() + .filter(|(_, leaf)| &leaf.node_id == node_id) + .map(|(leaf_index, leaf)| (leaf_index, leaf.leader_slots, leaf.client_id)) + .collect::>(); + if leaves.is_empty() { + outcomes.push(EpochOutcome::NoRewards { epoch }); + } else { + outcomes.push(EpochOutcome::Leader(EpochLeaves { + epoch, + associated_dz_epoch: shred_distribution.associated_dz_epoch.value(), + is_accumulated: shred_distribution.is_validator_rewards_accumulated(), + client_rewards_config: shred_distribution.validator_client_rewards_config, + leaves, + })); + } + } + + // Only accumulated leader epochs need journal / parent reads. They're + // visited in `outcomes` order both here and in the classify loop, so one + // cursor walks their journal triples in lockstep. + let accumulated_leader_epochs = outcomes + .iter() + .filter_map(|outcome| match outcome { + EpochOutcome::Leader(leaves) if leaves.is_accumulated => Some(leaves), + _ => None, + }) + .collect::>(); + + let mut journal_pdas = Vec::with_capacity(accumulated_leader_epochs.len() * 3); + for leaves in &accumulated_leader_epochs { + for mint in mints { + journal_pdas.push(find_shred_distribution_journal_address(leaves.epoch, mint).0); + } + } + let journal_accounts = dz_connection + .try_fetch_multiple_accounts(&journal_pdas) + .await + .context("fetching journal accounts")?; + + let mut parent_index_for_dz_epoch = HashMap::new(); + let mut parent_pdas = Vec::new(); + for leaves in &accumulated_leader_epochs { + parent_index_for_dz_epoch + .entry(leaves.associated_dz_epoch) + .or_insert_with(|| { + parent_pdas.push( + ParentDistribution::find_address(DoubleZeroEpoch::new( + leaves.associated_dz_epoch, + )) + .0, + ); + parent_pdas.len() - 1 + }); + } + let parent_accounts = dz_connection + .try_fetch_multiple_accounts(&parent_pdas) + .await + .context("fetching parent Distribution accounts")?; + + let mut classified: Vec<(u64, String, RewardStatus, Option, AmountInfo)> = + Vec::with_capacity(outcomes.len()); + let mut accumulated_cursor = 0usize; + + for outcome in &outcomes { + let row = match outcome { + EpochOutcome::NoData { epoch } => ( + *epoch, + "—".to_string(), + RewardStatus::NoData, + None, + AmountInfo::Unknown, + ), + EpochOutcome::NoRewards { epoch } => ( + *epoch, + "0".to_string(), + RewardStatus::NoRewards, + None, + AmountInfo::Unknown, + ), + EpochOutcome::Leader(leaves) => { + let leader_slots: u32 = leaves.leaves.iter().map(|(_, slots, _)| slots).sum(); + let (status, mint, amount) = if !leaves.is_accumulated { + (RewardStatus::NotReady, None, AmountInfo::Unknown) + } else { + let journal_base = accumulated_cursor * 3; + accumulated_cursor += 1; + classify_accumulated( + leaves, + &journal_accounts[journal_base..journal_base + 3], + &parent_accounts, + &parent_index_for_dz_epoch, + ) + }; + (leaves.epoch, leader_slots.to_string(), status, mint, amount) + } + }; + classified.push(row); + } + + // `claimed` rewards already moved, so the exact figure lives in the + // distribute tx — no math, no drift. + let claimed_epochs = classified + .iter() + .filter_map(|(epoch, _, _, _, amount)| { + matches!(amount, AmountInfo::FromTx).then_some(*epoch) + }) + .collect::>(); + + let resolved_payouts = if claimed_epochs.is_empty() { + HashMap::new() + } else { + let pda_to_epoch = claimed_epochs + .iter() + .map(|&epoch| (find_shred_distribution_address(epoch).0, epoch)) + .collect::>(); + let signature_limit = ((current_epoch - from_epoch + 1) as usize * 4).clamp(50, 1000); + resolve_distributed_payouts( + dz_connection, + vpr_pda, + &pda_to_epoch, + rewards_token_owner_key, + signature_limit, + ) + .await + }; + + let needs_amounts = classified + .iter() + .any(|(_, _, _, _, amount)| !matches!(amount, AmountInfo::Unknown)); + let decimals_by_mint = if needs_amounts { + fetch_mint_decimals(dz_connection, mints).await + } else { + HashMap::new() + }; + + // For claimed epochs the tx scan is authoritative for both mint and amount; + // everything else falls back to the journal verdict. + let rows = classified + .into_iter() + .map(|(epoch, leader_slots, status, mint, amount)| { + let resolved = resolved_payouts.get(&epoch); + let mint = match (resolved, mint) { + (Some((mint, _)), _) => mint_symbol(mint, mints), + (None, Some(mint)) => mint_symbol(&mint, mints), + (None, None) => "—".to_string(), + }; + let amount = match (resolved, amount) { + (Some((mint, raw)), _) => format_amount(*raw, &decimals_by_mint, mint), + (None, AmountInfo::Estimated { raw, mint }) => { + format!("~{}", format_amount(raw, &decimals_by_mint, &mint)) + } + (None, _) => "—".to_string(), + }; + StatusRow { + epoch, + leader_slots, + mint, + amount, + status: status.label(), + } + }) + .collect(); + + Ok(rows) +} + +/// Reads the SPL mint's `decimals` byte (offset 44 in the canonical layout). +/// Unresolved mints are absent — formatting then falls back to the raw amount. +async fn fetch_mint_decimals( + dz_connection: &SolanaConnection, + mints: &[Pubkey; 3], +) -> HashMap { + const MINT_DECIMALS_OFFSET: usize = 44; + let accounts = match dz_connection.try_fetch_multiple_accounts(mints).await { + Ok(accounts) => accounts, + Err(_) => return HashMap::new(), + }; + mints + .iter() + .zip(accounts) + .filter_map(|(mint, account)| { + account + .data + .get(MINT_DECIMALS_OFFSET) + .map(|decimals| (*mint, *decimals)) + }) + .collect() +} + +/// Format a raw token amount to at most three (truncated) fractional digits with +/// trailing zeros trimmed, falling back to the raw integer when decimals are +/// unknown. Keeping three digits stops small-but-real payouts (e.g. 0.05 SOL at +/// 9 decimals) from collapsing to `0`. +fn format_amount(raw: u64, decimals_by_mint: &HashMap, mint: &Pubkey) -> String { + let Some(&decimals) = decimals_by_mint.get(mint) else { + return raw.to_string(); + }; + if decimals == 0 { + return raw.to_string(); + } + let scale = 10u128.pow(decimals as u32); + let raw = raw as u128; + let integer = raw / scale; + // Truncate the fraction to three digits, then drop trailing zeros. + let frac = (raw % scale) * 1_000 / scale; + if frac == 0 { + return integer.to_string(); + } + let frac = format!("{frac:03}"); + format!("{integer}.{}", frac.trim_end_matches('0')) +} + +/// Resolve `(epoch → (reward mint, exact paid amount))` for `claimed` epochs by +/// replaying the validator's distribute history. Anchored on the +/// `ValidatorPublisherRewards` PDA, which every `DistributeValidatorRewards` +/// references, so the signature set is validator-specific. The epoch comes from +/// the `ShredDistribution` PDA in the ix accounts; the mint and amount from the +/// destination-ATA token-balance delta. Best-effort: transactions beyond the +/// RPC's history retention stay unresolved (rendered as `—`). +async fn resolve_distributed_payouts( + dz_connection: &SolanaConnection, + vpr_pda: &Pubkey, + pda_to_epoch: &HashMap, + rewards_token_owner_key: &Pubkey, + signature_limit: usize, +) -> HashMap { + let sigs_config = GetConfirmedSignaturesForAddress2Config { + limit: Some(signature_limit), + commitment: Some(CommitmentConfig::confirmed()), + ..Default::default() + }; + let signatures = match dz_connection + .0 + .get_signatures_for_address_with_config(vpr_pda, sigs_config) + .await + { + Ok(signatures) => signatures, + Err(err) => { + eprintln!( + " warning: couldn't read distribute history ({err:#}); some amounts unknown" + ); + return HashMap::new(); + } + }; + + let tx_config = RpcTransactionConfig { + encoding: Some(UiTransactionEncoding::Base64), + commitment: Some(CommitmentConfig::confirmed()), + max_supported_transaction_version: Some(0), + }; + + let transactions = stream::iter(signatures.into_iter().filter(|sig| sig.err.is_none())) + .map(|sig_info| async move { + let signature: Signature = sig_info.signature.parse().ok()?; + dz_connection + .0 + .get_transaction_with_config(&signature, tx_config) + .await + .ok() + }) + .buffer_unordered(TX_FETCH_CONCURRENCY) + .collect::>() + .await; + + let owner = rewards_token_owner_key.to_string(); + let mut resolved: HashMap = HashMap::new(); + for response in transactions.into_iter().flatten() { + let meta = response.transaction.meta; + let Some(versioned_tx) = response.transaction.transaction.decode() else { + continue; + }; + let message = versioned_tx.message; + let account_keys = message.static_account_keys(); + + let mut epoch = None; + for ix in message.instructions() { + let program_id = account_keys + .get(ix.program_id_index as usize) + .copied() + .unwrap_or_default(); + if program_id != *shred_subscription::ID { + continue; + } + if !matches!( + ShredSubscriptionInstructionData::try_from_slice(&ix.data), + Ok(ShredSubscriptionInstructionData::DistributeValidatorRewards { .. }) + ) { + continue; + } + for &account_index in &ix.accounts { + if let Some(epoch_for_key) = account_keys + .get(account_index as usize) + .and_then(|key| pda_to_epoch.get(key)) + { + epoch = Some(*epoch_for_key); + } + } + } + let Some(epoch) = epoch else { continue }; + + // The publisher payout is the credit to the destination ATA — the only + // token account in the tx owned by `rewards_token_owner_key`. + let Some(meta) = meta else { continue }; + let post = Option::>::from(meta.post_token_balances).unwrap_or_default(); + let pre = Option::>::from(meta.pre_token_balances).unwrap_or_default(); + let Some(destination) = post.iter().find(|balance| { + Option::::from(balance.owner.clone()).as_deref() == Some(owner.as_str()) + }) else { + continue; + }; + let post_raw = destination + .ui_token_amount + .amount + .parse::() + .unwrap_or_default(); + let pre_raw = pre + .iter() + .find(|balance| balance.account_index == destination.account_index) + .and_then(|balance| balance.ui_token_amount.amount.parse::().ok()) + .unwrap_or_default(); + let paid = post_raw.saturating_sub(pre_raw) as u64; + if let Ok(mint) = destination.mint.parse::() { + // A multi-client validator has multiple leaves per epoch, and + // distribute emits one tx per leaf crediting the same ATA, so sum + // them to match `estimate_publisher_payout`'s per-leaf total. + resolved + .entry(epoch) + .and_modify(|(_, amount)| *amount += paid) + .or_insert((mint, paid)); + } + } + resolved +} + +/// The per-`client_id` publisher/client split, mirroring the program's +/// `proportion_at_or_default`: an override applies only when an entry's `id` +/// matches and its `set_bitmap` slot is set; otherwise `default_proportion` +/// (with the program's legacy 35% fallback when the default is zero). +fn client_proportion(config: &ValidatorClientRewardsConfig, client_id: u16) -> u64 { + const LEGACY_DEFAULT_PROPORTION: u64 = 3_500; + let override_proportion = config + .proportions + .proportions + .iter() + .enumerate() + .find(|(slot, entry)| { + entry.id == client_id && config.proportions.set_bitmap & (1u32 << slot) != 0 + }) + .map(|(_, entry)| u64::from(entry.rewards_proportion)); + override_proportion.unwrap_or_else(|| { + let default = u64::from(config.default_proportion); + if default == 0 { + LEGACY_DEFAULT_PROPORTION + } else { + default + } + }) +} + +/// Project the post-burn publisher payout for a `ready` epoch from the journal +/// it routes to, mirroring the program's per-leaf `try_validator_share_pre_burn` +/// then burn, summed over the validator's leaves. An estimate because the burn +/// rate is read live at distribute time. +fn estimate_publisher_payout( + journal: &ShredDistributionJournal, + config: &ValidatorClientRewardsConfig, + leaves: &[(usize, u32, u16)], + burn_rate: BurnRate, +) -> u64 { + let rewards_amount = if journal.is_swap_bypassed() { + journal.checked_usdc_swap_budget().unwrap_or_default() + } else { + journal.tokens_received_amount + }; + let denominator = u128::from(journal.accumulated_publisher_slots_scaled) + + u128::from(journal.accumulated_client_slots_scaled); + if denominator == 0 { + return 0; + } + let max = u64::from(UnitShare16::MAX); + + leaves + .iter() + .map(|(_, leader_slots, client_id)| { + let publisher_scaled = + u64::from(*leader_slots) * (max - client_proportion(config, *client_id)); + let pre_burn = + (u128::from(publisher_scaled) * u128::from(rewards_amount) / denominator) as u64; + pre_burn - burn_rate.mul_scalar(pre_burn) + }) + .sum() +} + +/// Classify an accumulated epoch into its status, reward mint, and amount. +/// +/// A clear bitmap bit in one journal is ambiguous (never routed there vs. +/// already distributed), so the verdict is collapsed across all three: an +/// accumulated leaf with no bit set anywhere can only have been distributed. +/// The mint is the journal's `reward_mint_key`; for `claimed` it's only known +/// when every swap-complete journal agrees (else resolved from tx history). +fn classify_accumulated( + epoch: &EpochLeaves, + journals: &[solana_sdk::account::Account], + parent_accounts: &[solana_sdk::account::Account], + parent_index_for_dz_epoch: &HashMap, +) -> (RewardStatus, Option, AmountInfo) { + // Distribute won't pay until the parent distribution is finalized. + let parent = parent_index_for_dz_epoch + .get(&epoch.associated_dz_epoch) + .and_then(|&index| parent_accounts.get(index)) + .filter(|account| !account.data.is_empty()) + .and_then(ZeroCopyAccountOwnedData::::from_account) + .filter(|parent| parent.is_rewards_calculation_finalized()); + let Some(parent) = parent else { + return (RewardStatus::NotReady, None, AmountInfo::Unknown); + }; + let burn_rate = parent.burn_rate(BurnRate::default()); + + let mut ready: Option<(Pubkey, u64)> = None; + let mut swap_complete_reward_mints: Vec = Vec::new(); + + for journal_account in journals { + if journal_account.data.is_empty() { + continue; + } + let Some(journal) = + ZeroCopyAccountOwnedData::::from_account(journal_account) + else { + continue; + }; + if !journal.is_swap_complete() { + continue; + } + swap_complete_reward_mints.push(journal.reward_mint_key); + + let Some(bitmap_range) = journal.checked_publisher_accumulation_bitmap_range() else { + continue; + }; + let Some(bitmap) = journal + .remaining_data + .get(bitmap_range.start..bitmap_range.end) + else { + continue; + }; + if ready.is_none() + && epoch + .leaves + .iter() + .any(|(leaf_index, _, _)| bitmap_bit_set(bitmap, *leaf_index)) + { + let payout = estimate_publisher_payout( + &journal, + &epoch.client_rewards_config, + &epoch.leaves, + burn_rate, + ); + ready = Some((journal.reward_mint_key, payout)); + } + } + + if let Some((mint, payout)) = ready { + ( + RewardStatus::Ready, + Some(mint), + AmountInfo::Estimated { raw: payout, mint }, + ) + } else if let Some(&first) = swap_complete_reward_mints.first() { + let mint = swap_complete_reward_mints + .iter() + .all(|m| *m == first) + .then_some(first); + (RewardStatus::Claimed, mint, AmountInfo::FromTx) + } else { + (RewardStatus::NotReady, None, AmountInfo::Unknown) + } +} + +#[cfg(test)] +mod tests { + use doublezero_solana_sdk::shred_subscription::state::ValidatorClientRewardsProportion; + + use super::*; + + fn unit_share(value: u16) -> UnitShare16 { + UnitShare16::new(value).expect("value within UnitShare16 range") + } + + #[test] + fn client_proportion_uses_default_when_no_override() { + let mut config = ValidatorClientRewardsConfig::default(); + config.default_proportion = unit_share(2_000); + assert_eq!(client_proportion(&config, 7), 2_000); + } + + #[test] + fn client_proportion_legacy_fallback_when_default_zero() { + let config = ValidatorClientRewardsConfig::default(); + assert_eq!(client_proportion(&config, 7), 3_500); + } + + #[test] + fn client_proportion_override_requires_matching_id_and_set_bit() { + let mut config = ValidatorClientRewardsConfig::default(); + config.default_proportion = unit_share(2_000); + config.proportions.proportions[0] = ValidatorClientRewardsProportion { + id: 7, + rewards_proportion: unit_share(1_000), + }; + + // Entry present but its set_bitmap slot is clear -> ignored. + assert_eq!(client_proportion(&config, 7), 2_000); + + // Slot marked set -> override applies, but only for the matching id. + config.proportions.set_bitmap |= 1 << 0; + assert_eq!(client_proportion(&config, 7), 1_000); + assert_eq!(client_proportion(&config, 8), 2_000); + } + + #[test] + fn format_amount_trims_to_three_fractional_digits() { + let mint = Pubkey::new_unique(); + let decimals = HashMap::from([(mint, 6u8)]); + assert_eq!(format_amount(1_234_560, &decimals, &mint), "1.234"); // truncates, not rounds + assert_eq!(format_amount(1_000_000, &decimals, &mint), "1"); // trailing zeros trimmed + assert_eq!(format_amount(500_000, &decimals, &mint), "0.5"); + assert_eq!(format_amount(0, &decimals, &mint), "0"); + } + + #[test] + fn format_amount_keeps_small_nonzero_amounts_visible() { + let mint = Pubkey::new_unique(); + // 9 decimals (e.g. WSOL): a sub-0.1 amount must not collapse to "0". + let decimals = HashMap::from([(mint, 9u8)]); + assert_eq!(format_amount(50_000_000, &decimals, &mint), "0.05"); + assert_eq!(format_amount(1_000_000, &decimals, &mint), "0.001"); + } + + #[test] + fn format_amount_falls_back_to_raw_when_decimals_unknown() { + let mint = Pubkey::new_unique(); + assert_eq!(format_amount(42, &HashMap::new(), &mint), "42"); + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/claim.rs b/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/claim.rs new file mode 100644 index 0000000000..1a0ee939d6 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/claim.rs @@ -0,0 +1,583 @@ +use std::io::Write; + +use anyhow::{Context, Result, bail, ensure}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + payer::{TransactionOutcome, Wallet}, + rpc::try_fetch_multiple_accounts, +}; +use doublezero_solana_sdk::{ + shred_subscription::{ + ID, + instruction::{ + ClaimHoldingId, ShredSubscriptionInstructionData, + account::ClaimValidatorClientRewardsAccounts, + }, + state::{ + ValidatorClientRewards, find_claim_holding_address, find_program_config_address, + find_validator_client_rewards_address, parse_program_config_shred_oracle_key, + }, + }, + try_build_instruction, +}; +use solana_commitment_config::CommitmentConfig; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{account::Account, instruction::AccountMeta, program_pack::Pack, pubkey::Pubkey}; +use spl_associated_token_account_interface::address::get_associated_token_address; + +/* + doublezero-solana shreds validator-client-rewards claim \ + --client-id --rewards-token-mint \ + [--subscription-epoch ...] \ + [--destination-token-account ] + + When no --subscription-epoch is given, every outstanding holding for the + client and mint is discovered and claimed across as many transactions as + needed (up to MAX_CLAIM_EPOCHS_PER_TX holdings per tx). +*/ + +#[derive(Debug, Args)] +pub struct ClaimCommand { + /// Validator client ID. + #[arg(long)] + pub client_id: u16, + /// Token mint that holdings are denominated in. + #[arg(long)] + pub rewards_token_mint: Pubkey, + /// Subscription epochs to claim. When omitted, every outstanding holding + /// for this client and mint is discovered and claimed. + #[arg(long = "subscription-epoch", num_args = 1..)] + pub subscription_epochs: Vec, + /// Destination token account. Defaults to ATA(manager, rewards_token_mint). + #[arg(long)] + pub destination_token_account: Option, + #[command(flatten)] + pub write_opts: crate::command::WriteVerbOptions, +} + +pub(crate) fn resolve_destination( + manager: &Pubkey, + mint: &Pubkey, + override_destination: Option, +) -> Pubkey { + override_destination.unwrap_or_else(|| get_associated_token_address(manager, mint)) +} + +pub(crate) fn validate_manager( + wallet: &Pubkey, + validator_client_rewards_manager: &Pubkey, +) -> Result<()> { + ensure!( + wallet == validator_client_rewards_manager, + "manager mismatch: wallet is {wallet}, validator client rewards manager is {validator_client_rewards_manager}" + ); + Ok(()) +} + +// Upper bound on epochs per claim tx. Each `ClaimHoldingId` adds 9 bytes of +// instruction data and the holding account adds 32 bytes to the account list, +// so beyond ~20 the tx blows past the 1232-byte packet limit. 16 is a +// conservative cap that leaves room for the destination/rent/program-config +// accounts and the CheckCliVersion ix. +pub(crate) const MAX_CLAIM_EPOCHS_PER_TX: usize = 16; + +// How far back (in subscription epochs) auto-discovery probes from the current +// epoch. Holdings older than the on-chain abandonment window are swept, so this +// covers every holding that can still exist. +const MAX_DISCOVERY_LOOKBACK: u64 = 90; + +struct HoldingToClaim { + epoch: u64, + bump_seed: u8, + holding_pda: Pubkey, + pre_balance: u64, +} + +/// Decode a fetched account as a claim holding for `mint`, returning its +/// balance. +fn holding_balance(account: Option<&Account>, mint: &Pubkey) -> Option { + let account = account?; + if account.owner != spl_token_interface::ID { + return None; + } + let token = spl_token_interface::state::Account::unpack(&account.data).ok()?; + (token.mint == *mint).then_some(token.amount) +} + +impl ClaimCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let wallet = crate::command::build_wallet(ctx, self.write_opts)?; + let wallet_key = wallet.pubkey(); + + let validator_client_rewards_key = find_validator_client_rewards_address(self.client_id).0; + let program_config_key = find_program_config_address().0; + + // Single fetch: validator client rewards, program config. + let accounts = try_fetch_multiple_accounts( + &wallet.connection, + &[validator_client_rewards_key, program_config_key], + ) + .await + .context("fetching validator client rewards + program config")?; + + let validator_client_rewards_account = + accounts.first().and_then(|a| a.as_ref()).with_context(|| { + format!( + "validator client rewards not initialized for client-id {} (PDA {validator_client_rewards_key})", + self.client_id + ) + })?; + let validator_client_rewards = + ZeroCopyAccountOwnedData::::from_account( + validator_client_rewards_account, + ) + .with_context(|| { + format!("failed to decode ValidatorClientRewards at {validator_client_rewards_key}") + })?; + validate_manager(&wallet_key, &validator_client_rewards.manager_key)?; + + let config_account = accounts + .get(1) + .and_then(|a| a.as_ref()) + .with_context(|| format!("ProgramConfig {program_config_key} not found onchain"))?; + let rent_beneficiary = parse_program_config_shred_oracle_key(&config_account.data) + .context("failed to parse shred_oracle_key from ProgramConfig")?; + + // Resolve the set of holdings to claim: explicit epochs (validated), or + // every outstanding holding discovered on chain. + let holdings = if self.subscription_epochs.is_empty() { + let target = validator_client_rewards.claim_holding_count as usize; + if target == 0 { + writeln!( + out, + "No outstanding claim holdings for client_id {} (claim_holding_count is 0).", + self.client_id + )?; + return Ok(()); + } + // The shred-subscription program stamps `current_subscription_epoch` + // from the Clock of the cluster it runs on, which is exactly the + // cluster `wallet.connection` talks to, so the live epoch there is + // the discovery ceiling. + let current_epoch = wallet + .connection + .get_epoch_info() + .await + .context("fetching current epoch")? + .epoch; + let discovered = discover_holdings( + &wallet, + &validator_client_rewards_key, + &self.rewards_token_mint, + current_epoch, + ) + .await?; + if discovered.is_empty() { + writeln!( + out, + "No claim holdings for client_id {} found for mint {} within the last {MAX_DISCOVERY_LOOKBACK} epochs.", + self.client_id, self.rewards_token_mint, + )?; + return Ok(()); + } + if discovered.len() < target { + eprintln!( + "warning: found {} holding(s) for mint {} but claim_holding_count is {target}; \ + the remainder may be denominated in another mint or older than the \ + {MAX_DISCOVERY_LOOKBACK}-epoch discovery window.", + discovered.len(), + self.rewards_token_mint, + ); + } + writeln!( + out, + "Discovered {} outstanding holding(s) for client_id {} (mint {}).", + discovered.len(), + self.client_id, + self.rewards_token_mint, + )?; + discovered + } else { + validate_explicit_holdings( + &wallet, + &validator_client_rewards_key, + &self.rewards_token_mint, + &self.subscription_epochs, + ) + .await? + }; + + if holdings.is_empty() { + writeln!( + out, + "Nothing to claim for client_id {} (mint {}); no valid holdings.", + self.client_id, self.rewards_token_mint, + )?; + return Ok(()); + } + + // Resolve destination token account and validate it. + let destination = resolve_destination( + &wallet_key, + &self.rewards_token_mint, + self.destination_token_account, + ); + let destination_account = wallet + .connection + .get_account_with_commitment(&destination, CommitmentConfig::confirmed()) + .await + .with_context(|| format!("fetching destination token account {destination}"))? + .value + .with_context(|| { + format!( + "destination token account {destination} does not exist. \ + Run: `spl-token create-account --owner {wallet_key} {} --fee-payer {wallet_key}`", + self.rewards_token_mint + ) + })?; + if destination_account.owner != spl_token_interface::ID { + bail!( + "destination {destination} is not an SPL token account (owner = {})", + destination_account.owner + ); + } + let destination_token = + spl_token_interface::state::Account::unpack(&destination_account.data) + .with_context(|| format!("unpacking destination token account {destination}"))?; + if destination_token.mint != self.rewards_token_mint { + bail!( + "destination {destination} mint mismatch: expected {}, found {}", + self.rewards_token_mint, + destination_token.mint + ); + } + + let total_holdings = holdings.len(); + let total_pre_balance = holdings.iter().fold(0u64, |total, holding| { + total.saturating_add(holding.pre_balance) + }); + let batches = holdings.chunks(MAX_CLAIM_EPOCHS_PER_TX).collect::>(); + let batch_count = batches.len(); + + writeln!( + out, + "Shred subscription - Claim Validator Client Rewards \ + (client_id={}, mint={}, holdings={total_holdings}, transactions={batch_count})", + self.client_id, self.rewards_token_mint, + )?; + writeln!(out, " manager : {wallet_key}")?; + writeln!(out, " destination : {destination}")?; + writeln!(out, " rent recovers : {rent_beneficiary}")?; + + // Submit one transaction per batch of up to MAX_CLAIM_EPOCHS_PER_TX + // holdings. Batches are independent, so a later failure does not undo an + // earlier executed batch. + let mut executed_holdings = 0; + let mut last_executed = false; + for (batch_index, batch) in batches.into_iter().enumerate() { + let epochs = batch + .iter() + .map(|holding| holding.epoch) + .collect::>(); + let claim_holding_ids = batch + .iter() + .map(|holding| ClaimHoldingId { + subscription_epoch: holding.epoch, + bump_seed: holding.bump_seed, + }) + .collect::>(); + + let claim_accounts = ClaimValidatorClientRewardsAccounts::new( + self.client_id, + &wallet_key, + &destination, + &rent_beneficiary, + &self.rewards_token_mint, + &epochs, + ); + let metas: Vec = claim_accounts.into(); + let ix = try_build_instruction( + &ID, + metas, + &ShredSubscriptionInstructionData::ClaimValidatorClientRewards(claim_holding_ids), + )?; + + let mut instructions = vec![super::super::build_check_cli_version_instruction()?, ix]; + // ~30k CU per holding (token transfer + close + state decrement), + // plus the check-cli-version ix. + let compute_unit_limit = 30_000u32.saturating_mul(epochs.len() as u32 + 1); + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + if batch_count > 1 { + writeln!( + out, + "\nTransaction {}/{batch_count}: {} holding(s), epochs {epochs:?}", + batch_index + 1, + batch.len(), + )?; + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + executed_holdings += batch.len(); + last_executed = true; + writeln!(out, "Claimed: {tx_sig}")?; + // The on-chain handler transfers the full balance of each + // holding, but these balances were read pre-tx — a top-up + // between the read and the claim makes the actual drained amount + // higher. Diff the destination balance before/after for the + // authoritative number. + for holding in batch { + writeln!( + out, + " epoch {}: {} from {} (pre-claim)", + holding.epoch, holding.pre_balance, holding.holding_pda, + )?; + } + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + } + + if last_executed { + writeln!( + out, + "\nPre-claim total: {total_pre_balance} ({executed_holdings}/{total_holdings} holding(s) claimed across {batch_count} transaction(s))." + )?; + + // Re-fetch the validator client rewards account to report the + // post-tx claim_holding_count. + match wallet + .connection + .try_fetch_zero_copy_data_with_commitment::( + &validator_client_rewards_key, + CommitmentConfig::confirmed(), + ) + .await + { + Ok(refetched) => writeln!( + out, + "Remaining claim holding count: {}", + refetched.claim_holding_count + )?, + Err(err) => { + eprintln!( + "warning: post-claim validator client rewards re-fetch failed: {err}" + ); + writeln!(out, "Remaining claim holding count: (unavailable)")?; + } + } + } + + Ok(()) + } +} + +/// Discover every outstanding claim holding for `validator_client_rewards_key`/`mint` +/// by probing every holding PDA in +/// `[ceiling_epoch - MAX_DISCOVERY_LOOKBACK, ceiling_epoch]`. Returns the +/// holdings that exist, sorted by epoch. +async fn discover_holdings( + wallet: &Wallet, + validator_client_rewards_key: &Pubkey, + mint: &Pubkey, + ceiling_epoch: u64, +) -> Result> { + let floor = ceiling_epoch.saturating_sub(MAX_DISCOVERY_LOOKBACK); + let derived = (floor..=ceiling_epoch) + .map(|epoch| { + let (pda, bump) = find_claim_holding_address(validator_client_rewards_key, epoch, mint); + (epoch, pda, bump) + }) + .collect::>(); + let keys = derived.iter().map(|(_, pda, _)| *pda).collect::>(); + let probed = try_fetch_multiple_accounts(&wallet.connection, &keys) + .await + .context("probing claim holdings")?; + let mut found = Vec::new(); + for ((epoch, pda, bump), account) in derived.into_iter().zip(probed) { + if let Some(pre_balance) = holding_balance(account.as_ref(), mint) { + found.push(HoldingToClaim { + epoch, + bump_seed: bump, + holding_pda: pda, + pre_balance, + }); + } + } + found.sort_unstable_by_key(|holding| holding.epoch); + Ok(found) +} + +/// Resolve an explicit set of subscription epochs into claimable holdings. +async fn validate_explicit_holdings( + wallet: &Wallet, + validator_client_rewards_key: &Pubkey, + mint: &Pubkey, + epochs: &[u64], +) -> Result> { + let mut epochs = epochs.to_vec(); + epochs.sort_unstable(); + epochs.dedup(); + + let derived = epochs + .iter() + .map(|&epoch| { + let (pda, bump) = find_claim_holding_address(validator_client_rewards_key, epoch, mint); + (epoch, pda, bump) + }) + .collect::>(); + + let keys = derived.iter().map(|(_, pda, _)| *pda).collect::>(); + let accounts = try_fetch_multiple_accounts(&wallet.connection, &keys) + .await + .context("fetching claim holdings")?; + + let mut holdings = Vec::new(); + for ((epoch, pda, bump), maybe_account) in derived.iter().zip(accounts) { + match maybe_account.as_ref() { + None => eprintln!( + "warning: epoch {epoch} holding {pda} is not initialized; skipping. \ + Run `shreds validator-client-rewards init-holding ...` to create it." + ), + Some(account) if account.owner != spl_token_interface::ID => eprintln!( + "warning: epoch {epoch} holding {pda} is not an SPL token account (owner {}); skipping.", + account.owner + ), + Some(account) => match spl_token_interface::state::Account::unpack(&account.data) { + Ok(token) if token.mint != *mint => eprintln!( + "warning: epoch {epoch} holding {pda} is for mint {} (expected {mint}); skipping.", + token.mint + ), + Ok(token) => { + if token.amount == 0 { + eprintln!( + "warning: epoch {epoch} holding has 0 balance; will still close and recover rent." + ); + } + holdings.push(HoldingToClaim { + epoch: *epoch, + bump_seed: *bump, + holding_pda: *pda, + pre_balance: token.amount, + }); + } + Err(err) => eprintln!( + "warning: epoch {epoch} holding {pda} failed to unpack ({err}); skipping." + ), + }, + } + } + Ok(holdings) +} + +#[cfg(test)] +mod tests { + use clap::Parser; + + use super::*; + + #[derive(Parser)] + struct Cli { + #[command(flatten)] + cmd: ClaimCommand, + } + + #[test] + fn test_parses_required_args_with_implicit_destination() { + let mint = Pubkey::new_unique(); + let cli = Cli::try_parse_from([ + "test", + "--client-id", + "7", + "--rewards-token-mint", + &mint.to_string(), + "--subscription-epoch", + "100", + ]) + .unwrap(); + assert_eq!(cli.cmd.client_id, 7); + assert_eq!(cli.cmd.rewards_token_mint, mint); + assert_eq!(cli.cmd.subscription_epochs, vec![100]); + assert!(cli.cmd.destination_token_account.is_none()); + } + + #[test] + fn test_parses_explicit_destination() { + let mint = Pubkey::new_unique(); + let destination = Pubkey::new_unique(); + let cli = Cli::try_parse_from([ + "test", + "--client-id", + "7", + "--rewards-token-mint", + &mint.to_string(), + "--subscription-epoch", + "100", + "--destination-token-account", + &destination.to_string(), + ]) + .unwrap(); + assert_eq!(cli.cmd.destination_token_account, Some(destination)); + } + + #[test] + fn test_resolve_destination_uses_override_when_provided() { + let manager = Pubkey::new_unique(); + let mint = Pubkey::new_unique(); + let override_destination = Pubkey::new_unique(); + assert_eq!( + resolve_destination(&manager, &mint, Some(override_destination)), + override_destination + ); + } + + #[test] + fn test_resolve_destination_defaults_to_ata() { + let manager = Pubkey::new_unique(); + let mint = Pubkey::new_unique(); + let expected = get_associated_token_address(&manager, &mint); + assert_eq!(resolve_destination(&manager, &mint, None), expected); + } + + #[test] + fn test_validate_manager_matches() { + let wallet = Pubkey::new_unique(); + assert!(validate_manager(&wallet, &wallet).is_ok()); + } + + #[test] + fn test_validate_manager_mismatch() { + let wallet = Pubkey::new_unique(); + let manager = Pubkey::new_unique(); + let err = validate_manager(&wallet, &manager).unwrap_err(); + let message = format!("{err}"); + assert!(message.contains("manager mismatch")); + assert!(message.contains(&wallet.to_string())); + assert!(message.contains(&manager.to_string())); + } + + #[test] + fn test_allows_missing_subscription_epoch() { + // Omitting --subscription-epoch is valid: the command discovers and + // claims every outstanding holding for the client and mint. + let mint = Pubkey::new_unique(); + let cli = Cli::try_parse_from([ + "test", + "--client-id", + "7", + "--rewards-token-mint", + &mint.to_string(), + ]) + .unwrap(); + assert!(cli.cmd.subscription_epochs.is_empty()); + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/init_holding.rs b/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/init_holding.rs new file mode 100644 index 0000000000..56907d2961 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/init_holding.rs @@ -0,0 +1,245 @@ +use std::io::Write; + +use anyhow::{Context, Result, bail}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::payer::TransactionOutcome; +use doublezero_solana_sdk::{ + shred_subscription::{ + ID, + instruction::{ShredSubscriptionInstructionData, account::InitializeClaimHoldingAccounts}, + state::{ + ValidatorClientRewards, find_claim_holding_address, + find_validator_client_rewards_address, + }, + }, + try_build_instruction, +}; +use solana_commitment_config::CommitmentConfig; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::pubkey::Pubkey; + +/* + doublezero-solana shreds validator-client-rewards init-holding \ + --client-id --rewards-token-mint \ + --subscription-epoch [--subscription-epoch ...] +*/ + +/// Upper bound on epochs per init tx. Each init adds one instruction +/// (~22 bytes incl. accounts/data) plus two new holding/mint-token accounts +/// to the message; beyond ~20 the tx blows past the 1232-byte packet limit. +/// 16 leaves headroom for the CheckCliVersion ix and the fee-payer/system +/// account metas. +pub(crate) const MAX_INIT_HOLDING_EPOCHS_PER_TX: usize = 16; + +#[derive(Debug, Args)] +pub struct InitHoldingCommand { + /// Validator client ID. + #[arg(long)] + pub client_id: u16, + /// Token mint that the holding account will hold. + #[arg(long)] + pub rewards_token_mint: Pubkey, + /// One or more subscription epochs to initialize claim holding accounts for. + #[arg(long = "subscription-epoch", required = true, num_args = 1..)] + pub subscription_epochs: Vec, + #[command(flatten)] + pub write_opts: crate::command::WriteVerbOptions, +} + +impl InitHoldingCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + if self.subscription_epochs.len() > MAX_INIT_HOLDING_EPOCHS_PER_TX { + bail!( + "too many --subscription-epoch values ({}); max {} per tx. Split into multiple `init-holding` calls.", + self.subscription_epochs.len(), + MAX_INIT_HOLDING_EPOCHS_PER_TX + ); + } + + let wallet = crate::command::build_wallet(ctx, self.write_opts)?; + let wallet_key = wallet.pubkey(); + + let validator_client_rewards_key = find_validator_client_rewards_address(self.client_id).0; + + wallet + .connection + .try_fetch_zero_copy_data_with_commitment::( + &validator_client_rewards_key, + CommitmentConfig::confirmed(), + ) + .await + .with_context(|| { + format!( + "failed to read validator client rewards for client-id {} (PDA {validator_client_rewards_key})", + self.client_id + ) + })?; + + // Pre-flight: filter epochs whose holding account already exists. + let holding_keys = self + .subscription_epochs + .iter() + .map(|epoch| { + find_claim_holding_address( + &validator_client_rewards_key, + *epoch, + &self.rewards_token_mint, + ) + .0 + }) + .collect::>(); + let holding_accounts = wallet + .connection + .get_multiple_accounts(&holding_keys) + .await + .with_context(|| "fetching claim holding accounts")?; + + let mut to_init = Vec::new(); + for ((epoch, key), maybe_acct) in self + .subscription_epochs + .iter() + .zip(holding_keys.iter()) + .zip(holding_accounts.into_iter()) + { + if maybe_acct.is_some() { + writeln!( + out, + "epoch {epoch}: holding {key} already exists; skipping init" + )?; + } else { + to_init.push((*epoch, *key)); + } + } + + if to_init.is_empty() { + writeln!(out, "All requested claim holdings already initialized.")?; + return Ok(()); + } + + writeln!( + out, + "Shred subscription - Initialize Claim Holding Account (client_id={}, mint={}, epochs={})", + self.client_id, + self.rewards_token_mint, + to_init + .iter() + .map(|(e, _)| e.to_string()) + .collect::>() + .join(",") + )?; + + let mut instructions = vec![super::super::build_check_cli_version_instruction()?]; + for (epoch, _) in &to_init { + let ix = try_build_instruction( + &ID, + InitializeClaimHoldingAccounts::new( + self.client_id, + *epoch, + &self.rewards_token_mint, + &wallet_key, + ), + &ShredSubscriptionInstructionData::InitializeClaimHolding(*epoch), + )?; + instructions.push(ix); + } + + // Allow ~25k CU per init (system create + spl-token init + state update), + // plus one for the check-cli-version ix. + let cu_limit: u32 = 25_000u32.saturating_mul(to_init.len() as u32 + 1); + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit(cu_limit)); + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + writeln!(out, "Initialize claim holdings: {tx_sig}")?; + for (epoch, key) in &to_init { + writeln!(out, " epoch {epoch}: {key}")?; + } + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use clap::Parser; + + use super::*; + + #[derive(Parser)] + struct Cli { + #[command(flatten)] + cmd: InitHoldingCommand, + } + + #[test] + fn parses_required_args() { + let mint = Pubkey::new_unique(); + let cli = Cli::try_parse_from([ + "test", + "--client-id", + "7", + "--rewards-token-mint", + &mint.to_string(), + "--subscription-epoch", + "100", + ]) + .unwrap(); + assert_eq!(cli.cmd.client_id, 7); + assert_eq!(cli.cmd.rewards_token_mint, mint); + assert_eq!(cli.cmd.subscription_epochs, vec![100u64]); + } + + #[test] + fn parses_multiple_subscription_epochs() { + let mint = Pubkey::new_unique(); + let cli = Cli::try_parse_from([ + "test", + "--client-id", + "7", + "--rewards-token-mint", + &mint.to_string(), + "--subscription-epoch", + "100", + "--subscription-epoch", + "101", + "--subscription-epoch", + "102", + ]) + .unwrap(); + assert_eq!(cli.cmd.subscription_epochs, vec![100u64, 101, 102]); + } + + #[test] + fn rejects_missing_client_id() { + let mint = Pubkey::new_unique(); + let result = Cli::try_parse_from([ + "test", + "--rewards-token-mint", + &mint.to_string(), + "--subscription-epoch", + "100", + ]); + assert!(result.is_err()); + } + + #[test] + fn rejects_missing_subscription_epoch() { + let mint = Pubkey::new_unique(); + let result = Cli::try_parse_from([ + "test", + "--client-id", + "7", + "--rewards-token-mint", + &mint.to_string(), + ]); + assert!(result.is_err()); + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/mod.rs b/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/mod.rs new file mode 100644 index 0000000000..278144d1cd --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/mod.rs @@ -0,0 +1,46 @@ +mod claim; +mod init_holding; +mod set_proportion; +mod show; + +use std::io::Write; + +use anyhow::Result; +use clap::{Args, Subcommand}; +use doublezero_cli_core::CliContext; + +#[derive(Debug, Args)] +pub struct ValidatorClientRewardsCommand { + #[command(subcommand)] + pub command: ValidatorClientRewardsSubcommand, +} + +impl ValidatorClientRewardsCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + self.command.execute(ctx, out).await + } +} + +#[derive(Debug, Subcommand)] +pub enum ValidatorClientRewardsSubcommand { + /// Set the rewards proportion for a validator client. + #[command(hide = true)] + SetProportion(set_proportion::SetProportionCommand), + /// Initialize one or more claim holding accounts (permissionless). + InitHolding(init_holding::InitHoldingCommand), + /// Drain N claim holdings into a destination token account. + Claim(claim::ClaimCommand), + /// Inspect a validator-client-rewards PDA and optional claim holdings. + Show(show::ShowCommand), +} + +impl ValidatorClientRewardsSubcommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + match self { + Self::SetProportion(command) => command.execute(ctx, out).await, + Self::InitHolding(command) => command.execute(ctx, out).await, + Self::Claim(command) => command.execute(ctx, out).await, + Self::Show(command) => command.execute(ctx, out).await, + } + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/set_proportion.rs b/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/set_proportion.rs new file mode 100644 index 0000000000..73ad354c8a --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/set_proportion.rs @@ -0,0 +1,83 @@ +use std::io::Write; + +use anyhow::{Result, bail}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::payer::TransactionOutcome; +use doublezero_solana_sdk::{ + shred_subscription::{ + ID, + instruction::{ + ShredSubscriptionInstructionData, account::SetValidatorClientRewardsProportionAccounts, + }, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; + +/* + doublezero-solana shreds validator-client-rewards set-proportion \ + --client-id --proportion +*/ + +#[derive(Debug, Args)] +pub struct SetProportionCommand { + /// Validator client ID. + #[arg(long)] + client_id: u16, + /// Rewards proportion as a percentage (0–100, e.g. 50.5 for 50.5%). + #[arg(long)] + proportion: f64, + #[command(flatten)] + write_opts: crate::command::WriteVerbOptions, +} + +impl SetProportionCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + let proportion_bps = percentage_to_bps(self.proportion)?; + + let wallet = crate::command::build_wallet(ctx, self.write_opts)?; + let wallet_key = wallet.pubkey(); + + writeln!( + out, + "Shred subscription - Set Validator Client Rewards Proportion" + )?; + writeln!( + out, + "Client ID: {}, Proportion: {}% ({} bps)", + self.client_id, self.proportion, proportion_bps + )?; + + let ix = try_build_instruction( + &ID, + SetValidatorClientRewardsProportionAccounts::new(&wallet_key, self.client_id), + &ShredSubscriptionInstructionData::SetValidatorClientRewardsProportion(proportion_bps), + )?; + + let check_ix = super::super::build_check_cli_version_instruction()?; + let mut instructions = vec![check_ix, ix]; + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit(35_000)); + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + writeln!(out, "Set validator client rewards proportion: {tx_sig}")?; + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + Ok(()) + } +} + +fn percentage_to_bps(pct: f64) -> Result { + if !(0.0..=100.0).contains(&pct) { + bail!("Proportion must be between 0 and 100 (got {pct})"); + } + Ok((pct * 100.0).round() as u16) +} diff --git a/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/show.rs b/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/show.rs new file mode 100644 index 0000000000..0c45a868ef --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/validator_client_rewards/show.rs @@ -0,0 +1,362 @@ +use std::io::Write; + +use anyhow::{Context, Result, bail}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, rpc::SolanaConnectionOptions, +}; +use doublezero_solana_sdk::shred_subscription::state::{ + ValidatorClientRewards, find_claim_holding_address, find_validator_client_rewards_address, +}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::{program_pack::Pack, pubkey::Pubkey}; +use spl_associated_token_account_interface::address::get_associated_token_address; + +/* + doublezero-solana shreds validator-client-rewards show \ + --client-id [--rewards-token-mint ] \ + [--subscription-epoch ...] +*/ + +#[derive(Debug, Args)] +pub struct ShowCommand { + /// Validator client ID. + #[arg(long)] + pub client_id: u16, + /// Filter to a specific token mint when listing holdings. + #[arg(long)] + pub rewards_token_mint: Option, + /// One or more subscription epochs to inspect. Requires --rewards-token-mint. + #[arg(long = "subscription-epoch", num_args = 0..)] + pub subscription_epochs: Vec, + + #[command(flatten)] + connection_options: SolanaConnectionOptions, +} + +pub(crate) fn render_validator_client_rewards_summary( + validator_client_rewards_key: &Pubkey, + validator_client_rewards: &ValidatorClientRewards, +) -> String { + format!( + "Validator client rewards (client_id={})\n \ + PDA : {validator_client_rewards_key}\n \ + manager : {}\n \ + description : {}\n \ + claim holding count : {}\n", + validator_client_rewards.client_id, + validator_client_rewards.manager_key, + validator_client_rewards + .checked_short_description() + .unwrap_or("(none)"), + validator_client_rewards.claim_holding_count, + ) +} + +/// Status of a token-bearing account (manager ATA or per-epoch holding PDA) +/// for display purposes. Splits the cases that `Option` previously +/// collapsed so the user can tell apart "wasn't created" from "wrong owner / +/// malformed". +pub(crate) enum TokenAccountStatus { + Balance(u64), + DoesNotExist, + WrongOwner(Pubkey), + Malformed, + WrongMint(Pubkey), +} + +impl TokenAccountStatus { + fn render_tail(&self, expected_mint: Option<&Pubkey>) -> String { + match self { + TokenAccountStatus::Balance(amt) => format!("balance={amt}"), + TokenAccountStatus::DoesNotExist => "(does not exist)".to_string(), + TokenAccountStatus::WrongOwner(owner) => format!("(wrong owner: {owner})"), + TokenAccountStatus::Malformed => "(malformed token account)".to_string(), + TokenAccountStatus::WrongMint(found) => match expected_mint { + Some(expected) => { + format!("(wrong mint: found {found}, expected {expected})") + } + None => format!("(wrong mint: found {found})"), + }, + } + } +} + +/// Classify a fetched token account against the expected mint (when known). +pub(crate) fn classify_token_account( + account: Option<&solana_sdk::account::Account>, + expected_mint: Option<&Pubkey>, +) -> TokenAccountStatus { + let Some(account) = account else { + return TokenAccountStatus::DoesNotExist; + }; + if account.owner != spl_token_interface::ID { + return TokenAccountStatus::WrongOwner(account.owner); + } + match spl_token_interface::state::Account::unpack(&account.data) { + Err(_) => TokenAccountStatus::Malformed, + Ok(token) => match expected_mint { + Some(expected) if token.mint != *expected => TokenAccountStatus::WrongMint(token.mint), + _ => TokenAccountStatus::Balance(token.amount), + }, + } +} + +// Format is grep'd by sh/test_doublezero_solana_fork.sh — keep +// " epoch balance=" stable or update the grep. +pub(crate) fn render_holding_row( + epoch: u64, + holding_key: &Pubkey, + status: &TokenAccountStatus, + expected_mint: Option<&Pubkey>, +) -> String { + format!( + " epoch {epoch:>5} {holding_key} {}", + status.render_tail(expected_mint) + ) +} + +pub(crate) fn render_manager_ata_row( + ata: &Pubkey, + status: &TokenAccountStatus, + expected_mint: Option<&Pubkey>, +) -> String { + format!( + " manager ATA {ata} {}", + status.render_tail(expected_mint) + ) +} + +impl ShowCommand { + pub async fn execute(self, ctx: &CliContext, out: &mut impl Write) -> Result<()> { + if !self.subscription_epochs.is_empty() && self.rewards_token_mint.is_none() { + bail!("--subscription-epoch requires --rewards-token-mint"); + } + + let connection = crate::command::solana_connection(ctx, &self.connection_options); + + let validator_client_rewards_key = find_validator_client_rewards_address(self.client_id).0; + let validator_client_rewards_account = connection + .get_account_with_commitment( + &validator_client_rewards_key, + CommitmentConfig::confirmed(), + ) + .await + .with_context(|| { + format!("fetching validator client rewards PDA {validator_client_rewards_key}") + })? + .value; + let Some(validator_client_rewards_account) = validator_client_rewards_account else { + writeln!( + out, + "Validator client rewards not initialized for client-id {} (PDA {validator_client_rewards_key})", + self.client_id + )?; + return Ok(()); + }; + let validator_client_rewards = + ZeroCopyAccountOwnedData::::from_account( + &validator_client_rewards_account, + ) + .with_context(|| { + format!("failed to decode ValidatorClientRewards at {validator_client_rewards_key}") + })?; + write!( + out, + "{}", + render_validator_client_rewards_summary( + &validator_client_rewards_key, + &validator_client_rewards + ) + )?; + + // When a mint is supplied, always print the manager's ATA address and + // balance. Per-epoch holding rows are only listed when the user also + // supplies one or more `--subscription-epoch` values. + if let Some(mint) = self.rewards_token_mint { + writeln!(out, "Claim holdings for mint {mint}:")?; + let manager_ata_key = + get_associated_token_address(&validator_client_rewards.manager_key, &mint); + let ata_account = connection + .get_account_with_commitment(&manager_ata_key, CommitmentConfig::confirmed()) + .await + .with_context(|| format!("fetching manager ATA {manager_ata_key}"))? + .value; + let ata_status = classify_token_account(ata_account.as_ref(), Some(&mint)); + writeln!( + out, + "{}", + render_manager_ata_row(&manager_ata_key, &ata_status, Some(&mint)) + )?; + + if !self.subscription_epochs.is_empty() { + let holding_keys = self + .subscription_epochs + .iter() + .map(|e| find_claim_holding_address(&validator_client_rewards_key, *e, &mint).0) + .collect::>(); + let holding_accounts = connection + .get_multiple_accounts(&holding_keys) + .await + .with_context(|| "fetching claim holdings")?; + for ((epoch, key), maybe_acct) in self + .subscription_epochs + .iter() + .zip(holding_keys.iter()) + .zip(holding_accounts.into_iter()) + { + let status = classify_token_account(maybe_acct.as_ref(), Some(&mint)); + writeln!( + out, + "{}", + render_holding_row(*epoch, key, &status, Some(&mint)) + )?; + } + } + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use clap::Parser; + + use super::*; + + #[derive(Parser)] + struct Cli { + #[command(flatten)] + cmd: ShowCommand, + } + + #[test] + fn parses_minimum_args() { + let cli = Cli::try_parse_from(["test", "--client-id", "7"]).unwrap(); + assert_eq!(cli.cmd.client_id, 7); + assert!(cli.cmd.rewards_token_mint.is_none()); + assert!(cli.cmd.subscription_epochs.is_empty()); + } + + #[test] + fn parses_full_inspection_args() { + let mint = Pubkey::new_unique(); + let cli = Cli::try_parse_from([ + "test", + "--client-id", + "7", + "--rewards-token-mint", + &mint.to_string(), + "--subscription-epoch", + "100", + "--subscription-epoch", + "101", + ]) + .unwrap(); + assert_eq!(cli.cmd.rewards_token_mint, Some(mint)); + assert_eq!(cli.cmd.subscription_epochs, vec![100u64, 101]); + } + + #[test] + fn test_render_validator_client_rewards_summary_uses_none_when_description_empty() { + let mut validator_client_rewards = ValidatorClientRewards::default(); + validator_client_rewards.client_id = 7; + validator_client_rewards.manager_key = Pubkey::new_from_array([1; 32]); + let validator_client_rewards_key = Pubkey::new_from_array([2; 32]); + let out = render_validator_client_rewards_summary( + &validator_client_rewards_key, + &validator_client_rewards, + ); + assert_eq!( + out, + [ + "Validator client rewards (client_id=7)", + &format!(" PDA : {validator_client_rewards_key}"), + &format!( + " manager : {}", + validator_client_rewards.manager_key + ), + " description : (none)", + " claim holding count : 0", + "", + ] + .join("\n") + ); + } + + #[test] + fn test_render_validator_client_rewards_summary_renders_description() { + let mut validator_client_rewards = ValidatorClientRewards::default(); + validator_client_rewards.client_id = 7; + validator_client_rewards.manager_key = Pubkey::new_from_array([1; 32]); + validator_client_rewards.short_description_bytes[..4].copy_from_slice(b"acme"); + validator_client_rewards.claim_holding_count = 4; + let validator_client_rewards_key = Pubkey::new_from_array([2; 32]); + let out = render_validator_client_rewards_summary( + &validator_client_rewards_key, + &validator_client_rewards, + ); + assert!(out.contains(" description : acme")); + assert!(out.contains(" claim holding count : 4")); + } + + #[test] + fn render_holding_row_distinguishes_statuses() { + let key = Pubkey::new_from_array([3u8; 32]); + let expected_mint = Pubkey::new_from_array([5u8; 32]); + let other_mint = Pubkey::new_from_array([6u8; 32]); + let wrong_owner = Pubkey::new_from_array([7u8; 32]); + + let balance = render_holding_row(100, &key, &TokenAccountStatus::Balance(1_234_567), None); + assert!(balance.contains("epoch 100")); + assert!(balance.contains("balance=1234567")); + + let missing = render_holding_row(101, &key, &TokenAccountStatus::DoesNotExist, None); + assert!(missing.contains("(does not exist)")); + + let bad_owner = render_holding_row( + 102, + &key, + &TokenAccountStatus::WrongOwner(wrong_owner), + None, + ); + assert!(bad_owner.contains("(wrong owner:")); + assert!(bad_owner.contains(&wrong_owner.to_string())); + + let malformed = render_holding_row(103, &key, &TokenAccountStatus::Malformed, None); + assert!(malformed.contains("(malformed token account)")); + + let wrong_mint = render_holding_row( + 104, + &key, + &TokenAccountStatus::WrongMint(other_mint), + Some(&expected_mint), + ); + assert!(wrong_mint.contains("(wrong mint: found")); + assert!(wrong_mint.contains(&other_mint.to_string())); + assert!(wrong_mint.contains(&expected_mint.to_string())); + } + + #[test] + fn render_manager_ata_row_distinguishes_statuses() { + let ata = Pubkey::new_from_array([4u8; 32]); + let present = render_manager_ata_row(&ata, &TokenAccountStatus::Balance(9_876_543), None); + let missing = render_manager_ata_row(&ata, &TokenAccountStatus::DoesNotExist, None); + let wrong_owner_key = Pubkey::new_from_array([8u8; 32]); + let wrong_owner = + render_manager_ata_row(&ata, &TokenAccountStatus::WrongOwner(wrong_owner_key), None); + + assert!(present.contains("manager ATA")); + assert!(present.contains(&ata.to_string())); + assert!(present.contains("balance=9876543")); + + assert!(missing.contains("manager ATA")); + assert!(missing.contains(&ata.to_string())); + assert!(missing.contains("(does not exist)")); + + assert!(wrong_owner.contains("(wrong owner:")); + assert!(wrong_owner.contains(&wrong_owner_key.to_string())); + } +} diff --git a/offchain/crates/solana-cli/src/command/shreds/withdraw.rs b/offchain/crates/solana-cli/src/command/shreds/withdraw.rs new file mode 100644 index 0000000000..8d62a4a279 --- /dev/null +++ b/offchain/crates/solana-cli/src/command/shreds/withdraw.rs @@ -0,0 +1,218 @@ +use std::{io::Write, net::Ipv4Addr}; + +use anyhow::{Context, Result, bail}; +use clap::Args; +use doublezero_cli_core::CliContext; +use doublezero_solana_client_tools::payer::TransactionOutcome; +use doublezero_solana_sdk::{ + environment_usdc_token_mint_key, + shred_subscription::{ + ID, + instruction::{ + ShredSubscriptionInstructionData, + account::{ + ClosePaymentEscrowAccounts, RequestInstantSeatWithdrawalAccounts, + RequestProratedInstantSeatWithdrawalAccounts, + }, + }, + state, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::pubkey::Pubkey; + +/* + doublezero-solana shreds withdraw \ + --device | --device-code \ + --client-ip [--funds-only] [--usdc-mint ] [--refund-token-account ] +*/ + +#[derive(Debug, Args)] +pub struct WithdrawCommand { + #[command(flatten)] + device_args: super::DeviceArgs, + /// Client IPv4 address + #[arg(long)] + client_ip: Ipv4Addr, + /// Only close the payment escrow and withdraw USDC funds, without + /// requesting an instant seat withdrawal. + #[arg(long)] + funds_only: bool, + /// USDC mint (auto-detected from network: mainnet or development) + #[arg(long, hide = true)] + usdc_mint: Option, + /// USDC token account to receive the refund (defaults to your ATA) + #[arg(long)] + refund_token_account: Option, + #[command(flatten)] + write_opts: crate::command::WriteVerbOptions, +} + +impl WithdrawCommand { + pub async fn execute( + self, + dz_ledger_url: Option, + ctx: &CliContext, + out: &mut impl Write, + ) -> Result<()> { + let moniker_env = self.write_opts.connection_options.moniker_env(); + let wallet = crate::command::build_wallet(ctx, self.write_opts)?; + let wallet_key = wallet.pubkey(); + + writeln!(out, "Shred subscription - Withdraw (Close Payment Escrow)")?; + + let network_env = + crate::command::resolve_network_env(&wallet.connection, moniker_env).await?; + writeln!(out, "Connected to Solana: {network_env:?}")?; + + let device = self + .device_args + .resolve(network_env, &dz_ledger_url) + .await?; + + let usdc_mint_key = self + .usdc_mint + .unwrap_or(environment_usdc_token_mint_key(network_env)); + + let client_ip_bits = u32::from(self.client_ip); + let (client_seat_key, _) = state::find_client_seat_address(&device, client_ip_bits); + let (escrow_key, _) = state::find_payment_escrow_address(&client_seat_key, &wallet_key); + let (program_config_key, _) = state::find_program_config_address(); + let (allocation_request_key, _) = + state::find_instant_allocation_request_address(&device, client_ip_bits); + + let (execution_controller_key, _) = state::find_execution_controller_address(); + + // Fetch client seat, payment escrow, program config, any in-flight + // instant seat allocation request, and the execution controller in a + // single RPC. + let mut accounts = wallet + .connection + .get_multiple_accounts(&[ + client_seat_key, + escrow_key, + program_config_key, + allocation_request_key, + execution_controller_key, + ]) + .await?; + + // Pop in reverse order: execution_controller (4), allocation_request (3), + // program_config (2), escrow (1), seat (0). + let last_settled_epoch = accounts + .pop() + .flatten() + .and_then(|a| state::parse_execution_controller_last_settled_epoch(&a.data)) + .with_context(|| { + format!("Execution controller {execution_controller_key} missing or unparseable") + })?; + let allocation_request_in_flight = accounts.pop().flatten().is_some(); + let prorated_service_enabled = accounts + .pop() + .flatten() + .is_some_and(|a| state::is_prorated_service_enabled(&a.data)); + let escrow_exists = accounts.pop().flatten().is_some(); + + if allocation_request_in_flight { + bail!( + "Instant seat allocation request {allocation_request_key} is in flight for \ + client seat {client_seat_key}. Wait for the oracle to ack or reject it before \ + withdrawing." + ); + } + + let seat_data = accounts + .pop() + .flatten() + .with_context(|| format!("Client seat {client_seat_key} does not exist"))?; + let (_, _, _, _, active_epoch) = state::parse_client_seat(&seat_data.data) + .with_context(|| format!("Failed to parse client seat {client_seat_key}"))?; + // Pre-upgrade seats carry `last_usdc_price_dollars == 0` and the + // prorated instruction reverts for them. Fall back to the legacy + // instruction until the next settlement cycle repopulates the field. + let seat_has_recorded_price = + state::parse_client_seat_last_usdc_price_dollars(&seat_data.data) + .is_some_and(|price| price > 0); + // Mirror the on-chain withdrawal guard exactly: a seat is withdrawable + // iff `active_epoch >= last_settled_epoch` (the on-chain + // request_(prorated_)instant_seat_withdrawal handlers reject when + // `active_epoch < last_settled_epoch`). A fresh instant allocation sets + // `active_epoch = last_settled_epoch`, so the seat is withdrawable + // immediately. Comparing against `current_subscription_epoch` (always + // `last_settled_epoch + 1` — the *next* epoch) is off by one and skips + // the withdrawal for every just-allocated seat; comparing against the + // Solana cluster epoch (pre-0.5.10) is also wrong whenever the cluster + // epoch exceeds the subscription epoch. + let has_active_service = active_epoch >= last_settled_epoch; + + // Only request instant withdrawal when the seat is active. Stale seats + // (or --funds-only) skip the request and just close the payment escrow. + let request_instant_withdrawal = has_active_service && !self.funds_only; + + if !request_instant_withdrawal && !escrow_exists { + bail!( + "Client seat {client_seat_key} has no payment escrow to close and no active service to withdraw" + ); + } + + let mut instructions = vec![super::build_check_cli_version_instruction()?]; + let mut compute_unit_limit = 5_000 + 30_000; + + if request_instant_withdrawal { + if prorated_service_enabled && seat_has_recorded_price { + instructions.push(try_build_instruction( + &ID, + RequestProratedInstantSeatWithdrawalAccounts::new( + &device, + client_ip_bits, + &wallet_key, + active_epoch, + &usdc_mint_key, + &wallet_key, + ), + &ShredSubscriptionInstructionData::RequestProratedInstantSeatWithdrawal, + )?); + } else { + instructions.push(try_build_instruction( + &ID, + RequestInstantSeatWithdrawalAccounts::new(&device, client_ip_bits, &wallet_key), + &ShredSubscriptionInstructionData::RequestInstantSeatWithdrawal, + )?); + } + compute_unit_limit += 50_000; + } + + if escrow_exists { + instructions.push(try_build_instruction( + &ID, + ClosePaymentEscrowAccounts::new( + &device, + client_ip_bits, + &wallet_key, + &usdc_mint_key, + self.refund_token_account.as_ref(), + ), + &ShredSubscriptionInstructionData::ClosePaymentEscrow, + )?); + } + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_outcome = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_outcome { + writeln!(out, "Withdraw: {tx_sig}")?; + wallet.write_verbose_output(out, &[tx_sig]).await?; + } + + Ok(()) + } +} diff --git a/offchain/crates/solana-cli/src/lib.rs b/offchain/crates/solana-cli/src/lib.rs new file mode 100644 index 0000000000..3b143e032a --- /dev/null +++ b/offchain/crates/solana-cli/src/lib.rs @@ -0,0 +1,2 @@ +pub mod command; +pub mod utils; diff --git a/offchain/crates/solana-cli/src/main.rs b/offchain/crates/solana-cli/src/main.rs new file mode 100644 index 0000000000..9514263e38 --- /dev/null +++ b/offchain/crates/solana-cli/src/main.rs @@ -0,0 +1,401 @@ +use std::path::PathBuf; + +use anyhow::Result; +use clap::Parser; +use doublezero_cli_core::CliContextBuilder; +use doublezero_config::Environment; +use doublezero_solana_cli::command::DoubleZeroSolanaCommand; +use doublezero_solana_client_tools::rpc::{SolanaConnection, SolanaConnectionOptions}; +use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt}; + +#[derive(Debug, Parser)] +#[command(term_width = 0)] +#[command(version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")))] +#[command(about = "DoubleZero Solana-related Commands", long_about = None)] +struct DoubleZeroSolanaApp { + /// DoubleZero environment: mainnet-beta (default), testnet, devnet, local. + /// This is the DoubleZero environment taxonomy (matching the `doublezero` + /// CLI), not a Solana cluster name: `devnet` is the DZ devnet environment, + /// whose Solana L1 is testnet. To target the Solana devnet cluster, pass + /// `-u devnet` after the subcommand. + #[arg(long, default_value_t = Environment::MainnetBeta)] + env: Environment, + + /// Solana RPC URL or moniker. Overrides the environment default. + #[arg(long = "solana-url", visible_alias = "url", short = 'u', env)] + solana_url: Option, + + /// DZ Ledger RPC URL override. When omitted, derived from --env. Consumed + /// by the shreds subcommands (device-code resolution) and carried in the + /// context for passport; the revenue-distribution verbs resolve the DZ + /// Ledger from their own (hidden) --dz-env flag pending #1520. + #[arg(long, env)] + dz_ledger_url: Option, + + /// Filepath or URL to a keypair. + #[arg(long = "keypair", short = 'k', env)] + keypair_path: Option, + + #[command(subcommand)] + command: DoubleZeroSolanaCommand, +} + +#[tokio::main] +async fn main() -> Result<()> { + unsafe { + libc::signal(libc::SIGPIPE, libc::SIG_DFL); + } + + tracing_subscriber::registry() + .with(EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"))) + .with( + tracing_subscriber::fmt::layer() + .with_target(false) + .with_thread_ids(false) + .with_thread_names(false), + ) + .init(); + + let mut app = DoubleZeroSolanaApp::parse(); + // The shreds subcommands take `--dz-ledger-url` in the pre-RFC-20 position + // (`shreds --dz-ledger-url `); the global flag fills that slot + // when the subcommand-level one is absent, so both spellings work and the + // subcommand-level one wins. + if let DoubleZeroSolanaCommand::Shreds(ref mut shreds) = app.command + && shreds.dz_ledger_url.is_none() + { + shreds.dz_ledger_url = app.dz_ledger_url.clone(); + } + let ctx = build_cli_context(&app)?; + let mut out = std::io::stdout(); + app.command.execute(&ctx, &mut out).await +} + +fn build_cli_context(app: &DoubleZeroSolanaApp) -> Result { + let mut builder = CliContextBuilder::new() + .with_env(app.env) + .with_client_version(option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION"))); + // --solana-url may be a moniker; resolve it to a URL. When absent, the + // builder derives the L1 URL (and every other unset field) from --env. + if let Some(ref url_or_moniker) = app.solana_url { + let url = SolanaConnection::from(SolanaConnectionOptions { + solana_url_or_moniker: Some(url_or_moniker.clone()), + }) + .url() + .to_string(); + builder = builder.with_solana_l1_rpc_url(url); + } + if let Some(ref url) = app.dz_ledger_url { + builder = builder.with_ledger_rpc_url(url.clone()); + } + if let Some(ref path) = app.keypair_path { + builder = builder.with_keypair_path(PathBuf::from(path)); + } + builder.build().map_err(anyhow::Error::msg) +} + +#[cfg(test)] +mod tests { + use clap::CommandFactory; + + use super::*; + + const PK: &str = "DZtnuQ839pSaDMFG5q1ad2V95G82S5EC4RrB3Ndw2Heb"; + const SIG: &str = + "5wHu1qwD4kLwd9DnXcAgkbdJVDQfqQfXY3xn2pxBYNqDjT9rh9XkVxqGc8gQH6w2xR8jKfP4t1pYqJ7sJ5h4wK2"; + + /// clap's own consistency checks for the whole command tree (no overlapping + /// flags, valid arg config, etc.). + #[test] + fn test_command_tree_is_valid() { + DoubleZeroSolanaApp::command().debug_assert(); + } + + /// `--env` selects a DoubleZero environment and every unset context field + /// is derived from that environment's config: with `--env testnet`, the + /// L1 URL, DZ-ledger URL, and serviceability program ID all come from the + /// testnet `NetworkConfig`. + #[test] + fn test_build_cli_context_resolves_env_defaults_from_env_flag() { + let app = DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "--env", + "testnet", + "passport", + "fetch", + "--config", + ]) + .expect("--env testnet should parse"); + let ctx = build_cli_context(&app).expect("CliContext should build"); + + let config = Environment::Testnet + .config() + .expect("testnet network config"); + assert_eq!(ctx.env, Environment::Testnet); + assert_eq!(ctx.ledger_rpc_url, config.ledger_public_rpc_url); + assert_eq!( + ctx.serviceability_program_id, + config.serviceability_program_id + ); + // Guarded against an ambient `SOLANA_URL` env var that would populate + // `--solana-url` and override the env default. + if app.solana_url.is_none() { + assert_eq!(ctx.solana_l1_rpc_url, config.solana_l1_rpc_url); + } + } + + /// `--env devnet` means the DoubleZero devnet environment (whose Solana L1 + /// is testnet), NOT the Solana devnet cluster — matching the `doublezero` + /// CLI's `--env` taxonomy. The context is internally consistent: all fields + /// come from the DZ devnet config. The Solana devnet cluster remains + /// reachable with a trailing `-u devnet`. + #[test] + fn test_build_cli_context_devnet_is_doublezero_devnet() { + let app = DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "--env", + "devnet", + "shreds", + "price", + "--device", + PK, + ]) + .expect("--env devnet should parse"); + let ctx = build_cli_context(&app).expect("CliContext should build"); + + let config = Environment::Devnet.config().expect("devnet network config"); + assert_eq!(ctx.env, Environment::Devnet); + assert_eq!( + ctx.serviceability_program_id, + config.serviceability_program_id + ); + if app.solana_url.is_none() { + assert_eq!(ctx.solana_l1_rpc_url, config.solana_l1_rpc_url); + } + } + + /// With no global flags at all, the context defaults match the pre-RFC-20 + /// CLI: mainnet-beta, public mainnet L1 URL. + #[test] + fn test_build_cli_context_defaults_to_mainnet() { + let app = DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "revenue-distribution", + "fetch", + "config", + ]) + .expect("bare invocation should parse"); + let ctx = build_cli_context(&app).expect("CliContext should build"); + + assert_eq!(ctx.env, Environment::MainnetBeta); + if app.solana_url.is_none() { + assert_eq!(ctx.solana_l1_rpc_url, "https://api.mainnet-beta.solana.com"); + } + } + + /// Global flags + passport fetch invocation parses. + #[test] + fn test_passport_fetch_with_global_flags_parse() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "--env", + "testnet", + "passport", + "fetch", + "--config", + ]) + .expect("global --env + fetch should parse"); + } + + /// Legacy per-verb `--url` on passport fetch still parses (adapter keeps it). + #[test] + fn test_passport_fetch_legacy_args_parse() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "passport", + "fetch", + "--config", + "--url", + "t", + ]) + .expect("legacy fetch args should parse"); + } + + /// The additive `--json` / `--json-compact` flags must parse on read verbs. + #[test] + fn test_passport_fetch_accepts_json_flags() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "passport", + "fetch", + "--config", + "--json", + ]) + .expect("--json should parse"); + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "passport", + "fetch", + "--config", + "--json-compact", + ]) + .expect("--json-compact should parse"); + // --json and --json-compact are mutually exclusive. + assert!( + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "passport", + "fetch", + "--json", + "--json-compact", + ]) + .is_err() + ); + } + + #[test] + fn test_passport_find_validator_legacy_and_json_parse() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "passport", + "find-validator", + "--validator-id", + PK, + "-u", + "m", + ]) + .expect("legacy find-validator args should parse"); + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "passport", + "find-validator", + "--json", + ]) + .expect("find-validator --json should parse"); + } + + #[test] + fn test_passport_request_access_legacy_signer_flags_parse() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "passport", + "request-validator-access", + "--doublezero-address", + PK, + "--primary-validator-id", + PK, + "--signature", + SIG, + "-k", + "/path/to/id.json", + "--with-compute-unit-price", + "1000", + "-v", + "--dry-run", + "--message-version", + "0", + ]) + .expect("legacy request-validator-access signer flags should parse"); + } + + #[test] + fn test_passport_prepare_access_legacy_args_parse() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "passport", + "prepare-validator-access", + "--doublezero-address", + PK, + "--primary-validator-id", + PK, + "--backup-validator-ids", + &format!("{PK},{PK}"), + "--url", + "t", + ]) + .expect("legacy prepare-validator-access args should parse"); + } + + /// Global `--solana-url` alias `--url` parses at the app level. + #[test] + fn test_global_url_alias_parses() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "--url", + "t", + "revenue-distribution", + "fetch", + "config", + ]) + .expect("global --url alias should parse"); + } + + /// Global `--keypair` parses at the app level. + #[test] + fn test_global_keypair_parses() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "-k", + "/path/to/id.json", + "revenue-distribution", + "fetch", + "config", + ]) + .expect("global -k should parse"); + } + + // ── Backwards-compat: per-verb flags AFTER the subcommand ─────────────── + // + // Pre-RFC-20 scripts pass `-u`/`-k`/`--dz-env` trailing the verb. These + // must keep parsing (they override the new global flags for that verb). + + /// Trailing `-u` on a revenue-distribution read verb still parses. + #[test] + fn test_trailing_url_flag_still_parses() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "revenue-distribution", + "fetch", + "config", + "-ul", + ]) + .expect("trailing -u on `fetch config` should parse"); + } + + /// Trailing `-u` plus the hidden `--dz-env` on a read verb still parses. + #[test] + fn test_trailing_url_and_dz_env_flags_still_parse() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "revenue-distribution", + "fetch", + "distribution", + "-ul", + "--dz-env", + "mainnet-beta", + ]) + .expect("trailing -u + --dz-env on `fetch distribution` should parse"); + } + + /// Trailing `-k` on a revenue-distribution write verb still parses. + #[test] + fn test_trailing_keypair_flag_still_parses() { + DoubleZeroSolanaApp::try_parse_from([ + "doublezero-solana", + "revenue-distribution", + "configure-contributor-rewards", + "--service-key", + PK, + "-k", + "/tmp/x.json", + ]) + .expect("trailing -k on `configure-contributor-rewards` should parse"); + } + + /// Trailing `-u` on a shreds read verb still parses. + #[test] + fn test_trailing_url_flag_on_shreds_read_verb_still_parses() { + DoubleZeroSolanaApp::try_parse_from(["doublezero-solana", "shreds", "price", "-ul"]) + .expect("trailing -u on `shreds price` should parse"); + } +} diff --git a/offchain/crates/solana-cli/src/utils.rs b/offchain/crates/solana-cli/src/utils.rs new file mode 100644 index 0000000000..c3cef3f5da --- /dev/null +++ b/offchain/crates/solana-cli/src/utils.rs @@ -0,0 +1,31 @@ +use anyhow::{Result, bail}; + +pub fn parse_sol_amount_to_lamports(sol_amount_str: String) -> Result { + let sol_amount_str = sol_amount_str.trim(); + + if sol_amount_str.is_empty() { + bail!("SOL amount cannot be empty"); + } + + let sol_amount = sol_amount_str + .parse::() + .map_err(|_| anyhow::anyhow!("Invalid SOL amount: '{sol_amount_str}'"))?; + + if sol_amount <= 0.0 { + bail!("SOL amount must be a positive value"); + } + + if sol_amount > (u64::MAX as f64 / 1e9) { + bail!("SOL amount too large"); + } + + // Check that value is at most 9 decimal places. + if let Some(decimal_index) = sol_amount_str.find('.') { + let decimal_places = sol_amount_str.len() - decimal_index - 1; + if decimal_places > 9 { + bail!("SOL amount cannot have more than 9 decimal places"); + } + } + + Ok((sol_amount * 1e9).round() as u64) +} diff --git a/offchain/crates/solana-client-tools/CHANGELOG.md b/offchain/crates/solana-client-tools/CHANGELOG.md new file mode 100644 index 0000000000..124773ed2e --- /dev/null +++ b/offchain/crates/solana-client-tools/CHANGELOG.md @@ -0,0 +1,39 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] +- add `squads::vault_transaction_payload_budget` and `squads::try_encode_vault_transaction`, which size a payload against the transaction Squads wraps around it rather than the transaction limit alone. Replaces `encode_vault_transaction` and `print_vault_transaction` with checked `try_` forms ([malbeclabs/doublezero#4184](https://github.com/malbeclabs/doublezero/issues/4184)) +- add a `squads` module with Squads Protocol v4 vault support. Behind a new default-on `squads` feature, so consumers can opt out with `default-features = false` +- add a crate `README.md` covering the `squads` module +- add `Wallet::write_verbose_output` and `write_transaction_details` methods that write to an arbitrary `impl Write` instead of stdout, for testability (#383) +- remove the testnet shred-subscription DZ Ledger special-case: drop `NetworkEnvironment::shred_subscription_url()` and `SolanaConnectionOptions::into_shred_subscription_connection()`. The testnet shred-subscription program now lives on Solana devnet, so callers build a `SolanaConnection` from `-u`/`--url` via the existing `From` impl (`Wallet::try_new(opts, None)` for signing paths). The `Option` override on `Wallet::try_new` remains for callers that source the connection elsewhere ([infra #1763](https://github.com/malbeclabs/infra/issues/1763)) +- migrate to Solana 3.0: workspace `solana-*` crates and `solana-sdk` move to the 3.0 line, `solana-program-test` to 3.0.12, and the doublezero SDK git-deps repin from `client/v0.27.1` to the malbeclabs/doublezero#3830 merge revision (malbeclabs/infra#1853) +- (breaking) `try_fetch_sysvar` now bounds on `SysvarSerialize` instead of `Sysvar` (the Solana 3.0 trait split moved `id()` and account deserialization out of `Sysvar`) (malbeclabs/infra#1853) +- (breaking) `TransactionOutcome` no longer derives `Eq`, and `Simulated` now boxes `RpcSimulateTransactionResult` (the type dropped `Eq` and grew in Solana 3.0) (malbeclabs/infra#1853) +- add `Wallet::build_memo_instruction`, `Wallet::build_memo_instruction_with_compute_units`, and `Wallet::memo_compute_units` for building spl-memo instructions and estimating their compute units from the memo byte length, calibrated against the spl-memo v3 program in `solana-program-test` (relocated from `solana-sdk`) +- add `Wallet::create_ata_compute_units` and `Wallet::ata_address_and_create_compute_units` helpers for estimating create-ATA compute units ([#386](https://github.com/doublezerofoundation/doublezero-offchain/pull/386)) +- add `Devnet` to `NetworkEnvironment`: `-ud`/`devnet` moniker, Solana devnet RPC URL, and genesis-hash detection ([#384](https://github.com/doublezerofoundation/doublezero-offchain/pull/384)) +- tolerate missing and unparseable accounts in try_fetch_multiple_zero_copy_data. Return type is now Result>> (breaking) ([#374](https://github.com/doublezerofoundation/doublezero-offchain/pull/374)) +- update solana-cli to handle defaults and tighten up error messages ([#373](https://github.com/doublezerofoundation/doublezero-offchain/pull/373)) +- support env var fallback for all CLI args ([#334](https://github.com/doublezerofoundation/doublezero-offchain/pull/334)) +- fix transaction batch size checks to include compute budget instructions ([#331](https://github.com/doublezerofoundation/doublezero-offchain/pull/331)) +- add in memos, transaction sizing ([#330](https://github.com/doublezerofoundation/doublezero-offchain/pull/330)) +- provide meaningful keypair error if invalid or missing ([#329](https://github.com/doublezerofoundation/doublezero-offchain/pull/329)) +- match DZ ledger testnet genesis hash ([#323](https://github.com/doublezerofoundation/doublezero-offchain/pull/323)) +- derive `Default` for command structs ([#243](https://github.com/doublezerofoundation/doublezero-offchain/pull/243)) +- use `unwrap_or_default` for `try_fetch_multiple_accounts` ([#231](https://github.com/doublezerofoundation/doublezero-offchain/pull/231)) +- add instruction batching and better network env handling ([#225](https://github.com/doublezerofoundation/doublezero-offchain/pull/225)) +- remove tracing feature and log submodule ([#226](https://github.com/doublezerofoundation/doublezero-offchain/pull/226)) +- add stdin support for keypair loading ([#217](https://github.com/doublezerofoundation/doublezero-offchain/pull/217)) +- add accounts submodule and refactor RPC methods ([#201](https://github.com/doublezerofoundation/doublezero-offchain/pull/201)) +- add Solana RPC helpers ([#182](https://github.com/doublezerofoundation/doublezero-offchain/pull/182)) + +## [0.0.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana-client-tools/v0.0.1) - 2025-10-21 + +- add error contexts ([#159](https://github.com/doublezerofoundation/doublezero-offchain/pull/159)) +- add better error handling and fix tracing macros ([#156](https://github.com/doublezerofoundation/doublezero-offchain/pull/156)) +- port client-tools and admin CLIs from doublezero-solana ([#154](https://github.com/doublezerofoundation/doublezero-offchain/pull/154)) diff --git a/offchain/crates/solana-client-tools/Cargo.toml b/offchain/crates/solana-client-tools/Cargo.toml new file mode 100644 index 0000000000..99f0f13c25 --- /dev/null +++ b/offchain/crates/solana-client-tools/Cargo.toml @@ -0,0 +1,53 @@ +[package] +name = "doublezero-solana-client-tools" +edition.workspace = true +homepage.workspace = true +license.workspace = true +readme = "README.md" +repository.workspace = true +version.workspace = true + +[features] +default = ["squads"] +squads = [ + "dep:bs58", + "dep:percent-encoding", + "dep:solana-loader-v3-interface", + "dep:solana-message", +] + +[dependencies] +anyhow.workspace = true +bincode.workspace = true +borsh.workspace = true +bs58 = { workspace = true, optional = true } +bytemuck.workspace = true +clap.workspace = true +doublezero-program-tools.workspace = true +doublezero_sdk.workspace = true +home.workspace = true +percent-encoding = { workspace = true, optional = true } +serde_json.workspace = true +solana-address-lookup-table-interface.workspace = true +solana-client.workspace = true +solana-commitment-config.workspace = true +solana-compute-budget-interface.workspace = true +solana-loader-v3-interface = { workspace = true, optional = true } +solana-message = { workspace = true, optional = true } +solana-sdk.workspace = true +solana-transaction-status-client-types.workspace = true +spl-associated-token-account-interface.workspace = true +spl-memo-interface.workspace = true +spl-token-interface.workspace = true +thiserror.workspace = true +url.workspace = true + +[dev-dependencies] +leaky-bucket.workspace = true +solana-program-test.workspace = true +solana-reward-info.workspace = true +solana-rpc-client-types.workspace = true +tempfile.workspace = true +tokio.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true \ No newline at end of file diff --git a/offchain/crates/solana-client-tools/README.md b/offchain/crates/solana-client-tools/README.md new file mode 100644 index 0000000000..35e769c8de --- /dev/null +++ b/offchain/crates/solana-client-tools/README.md @@ -0,0 +1,184 @@ +# doublezero-solana-client-tools + +Shared Solana client helpers for the offchain crates: wallet and payer handling, +keypair loading, RPC and account fetching, instruction batching, and transaction +building. + +TODO: document the rest of the crate. + +## Squads + +Squads multisig support for any CLI whose instructions need a vault to authorize +them. Behind the `squads` feature, which is on by default. + +A Squads vault is a PDA, so no local keypair can sign for it. Any instruction the +vault must authorize is therefore built against the vault, encoded, and imported +into the Squads UI, where the members approve and execute it. This module holds +the parts of that flow worth having in one place: deriving the vault, checking +that the multisig is real before anything irreversible happens, and encoding the +result in the form the UI accepts. + +### Command-line options + +Flatten one of these into a clap command to give it a Squads mode. Which one +depends on whether the command always acts as a vault. + +| Struct | `--multisig` | Use for | +|----------------------|--------------|--------------------------------------------| +| `SquadsArgs` | required | A command that only ever acts as a vault. | +| `OptionalSquadsArgs` | optional | An existing command gaining a Squads mode. | + +`OptionalSquadsArgs` is the migration shape. Naming a multisig switches the +command over to the vault. Leaving it off keeps the wallet behavior the command +already had, so adopting Squads does not mean reshaping every subcommand: + +```rust +#[command(flatten)] +squads: OptionalSquadsArgs, +``` + +```rust +if let Some(vault_key) = squads.try_find_vault_address(&connection).await? { + // Build against the vault and print it for import. +} else { + // Sign with the wallet, as before. +} +``` + +Both structs also take `--vault-index `, defaulting to vault 0. `SquadsArgs` +additionally carries `--allow-vault-subaccounts`, which only +`try_find_handover_vault_address` reads. + +**Choose your entry point by whether the vault is about to receive an authority.** + +| Method | Use when | +|-----------------------------------------|-------------------------------------------------| +| `try_find_handover_vault_address(conn)` | About to hand an authority to the vault. | +| `try_find_vault_address(conn)` | Acting as a vault that already holds something. | + +The handover variant additionally refuses a non-zero vault index on Solana mainnet, +where Squads offers only vault 0 unless the multisig is on a paid plan with +subaccounts. Every index derives a well-formed PDA and nothing onchain +distinguishes the two, so it refuses rather than verifies, and +`--allow-vault-subaccounts` overrides it. The network comes from the genesis hash +rather than the URL, and is read only when a non-zero index is named, so the +default path costs nothing. + +The plain variant carries no such check because a caller acting as a vault that +already holds something has better proof than the check could offer. Reach for the +handover variant whenever being wrong about the vault cannot be undone. + +### Deriving and verifying the vault + +`try_find_vault_address` verifies the multisig before deriving, which is the +important part. Pubkeys carry no checksum, so a mistyped `--multisig` still +derives a perfectly well-formed vault PDA. Handing an authority to one of those +cannot be undone: nothing can ever sign for the vault of a multisig that does +not exist. + +| Function | Purpose | +|---------------------------------------------|--------------------------------------------------------| +| `try_verify_multisig(connection, multisig)` | Confirms the account exists and is owned by Squads v4. | +| `find_vault_address(multisig, vault_index)` | Pure PDA derivation, no RPC. | +| `SQUADS_V4_PROGRAM_ID` | The program the vault is derived under. | + +The derivation uses the seeds `"multisig"`, the multisig account, `"vault"`, and +the vault index. It is covered by a known-answer test against a real devnet +multisig and its vault. + +### Emitting a transaction for the UI + +```rust +try_print_vault_transaction(&connection, &vault_key, &[instruction])?; +``` + +Alongside the base58 payload this prints an explorer transaction inspector link +that decodes it, so the caller can read the instruction back rather than import an +opaque blob. The link carries the same base58 payload, so there is one encoding to +reason about. The inspector reads that parameter with `atob` and therefore falls back +to its input box, which retries base58 and renders the transaction, at the cost of +dropping the parameter from the address bar. Reloading an opened link loses it, so +open the link fresh rather than passing a reloaded tab's URL on. + +The link passes the connection's own endpoint as `cluster=custom&customUrl=`, +percent-encoded, rather than naming a cluster. A Squads deployment on another SVM +network is not something the explorer's cluster list covers, and pointing it back +at the endpoint this command used works whatever the network is. + +That means the endpoint travels inside the link. When it is not one of Solana's +known-harmless URLs, meaning Solana's three public endpoints and +`http://localhost:8899`, the output carries a warning not to share the link where +the endpoint should not go. The warning does not claim the endpoint is a secret, only +that it is now part of the link, since an endpoint on another SVM network is +unrecognizable from here and that says nothing either way about how sensitive it +is. Whether it matters is the caller's call. + +`try_encode_vault_transaction` is the same thing without the surrounding output, for +callers that want the string. + +This is a wire contract with the Squads UI, so it is worth stating exactly: a +base58 encoded legacy message, the vault as fee payer and sole signer, and a +zeroed placeholder blockhash that Squads replaces when it wraps the instructions +into a vault transaction. How members import it differs by UI. + +The format is pinned by a test that decodes the output back and asserts those +properties, and it has been confirmed by executing emitted transactions against a +devnet Squad. + +### Sizing a payload + +The transaction that has to carry a payload is the one Squads wraps around it, not +the payload itself. That wrapper is a `vault_transaction_create` carrying the payload +as its `transaction_message`, bundled with the compute budget pair, a +`proposal_create`, and a `proposal_approve`, which is how one transaction takes a +payload all the way to the approvers. A payload that overruns it is refused at import, +before any approval exists. + +| Function | Purpose | +|-------------------------------------------------------|------------------------------------------| +| `vault_transaction_payload_budget(instruction_count)` | Bytes the payload's message may occupy. | +| `try_encode_vault_transaction(vault, instructions)` | Encodes, or refuses an unusable payload. | + +The budget governs the serialized legacy message, meaning +`Message::serialize().len()`, not the base58 string the encoder returns, which is +around 1.37 times longer. A caller sizing its own instruction measures the former. + +It is `MAX_TRANSACTION_SIZE` less a 384-byte reserve, less one byte per payload +instruction. The derivation, and the Squads app behavior it deliberately does not +cover, sit beside the constant. A memo typed at import is unbounded, so no reserve can +cover one, which is the reason a payload sized to the last byte is a payload a memo +breaks. A test assembles the wrapper and asserts that a payload sized to the budget +still fits, so the arithmetic beside the constant is executable rather than asserted. + +Size is not the only thing that makes a payload unusable, and the other two checks +matter more, because a size failure surfaces at import while these surface at execute, +after the approvals are spent. The encoder refuses a payload naming a signer other than +the vault, since any such key has to sign the execute transaction itself and nothing +here knows who will run it. It refuses more than 48 instructions, since each runs as +its own invocation against an instruction trace the whole execute transaction shares. +That 48 is an arbitrarily conservative lower bound, not the runtime's limit. + +An empty payload is refused too, which is a courtesy rather than a correctness matter: +it imports and executes nothing, at the cost of the approvals. + +`vault_transaction_execute` is checked as well, though nothing the budget accepts can +overrun it. By execute the payload's instruction data lives in the transaction account +and no longer travels, which leaves execute looser than create at every size, so create +binds. A test pins that pairing rather than leaving it a claim. + +### Reading loader-v3 authorities + +Deciding whether a vault already controls a program, or a buffer, means reading +the loader's own accounts. Both decodes take an already-deserialized +`UpgradeableLoaderState` so a caller that has fetched the account does not fetch +it twice. + +| Function | Returns | +|--------------------------------|---------------------------------------------------------| +| `try_upgrade_authority(state)` | The program's upgrade authority, from its program data. | +| `try_buffer_authority(state)` | The buffer's authority. | + +Both return `Result>`. The error means the account is not the kind +asked for, and names what it is instead. `Ok(None)` means the account is that +kind but immutable, which is a real state rather than a malformed account, so +what it means is left to the caller. diff --git a/offchain/crates/solana-client-tools/examples/get_blocks.rs b/offchain/crates/solana-client-tools/examples/get_blocks.rs new file mode 100644 index 0000000000..c7ceccfc99 --- /dev/null +++ b/offchain/crates/solana-client-tools/examples/get_blocks.rs @@ -0,0 +1,191 @@ +use std::sync::Arc; + +use anyhow::{Result, bail}; +use clap::Parser; +use doublezero_solana_client_tools::rpc::{SolanaConnection, SolanaConnectionOptions}; +use leaky_bucket::RateLimiter; +use solana_client::{ + client_error::ClientErrorKind, + rpc_config::RpcBlockConfig, + rpc_custom_error::{ + JSON_RPC_SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED, JSON_RPC_SERVER_ERROR_SLOT_SKIPPED, + }, + rpc_request::RpcError, +}; +use solana_commitment_config::CommitmentConfig; +use solana_reward_info::RewardType; +use solana_transaction_status_client_types::TransactionDetails; +use tracing_subscriber::FmtSubscriber; + +#[tokio::main] +async fn main() -> Result<()> { + GetBlocksExampleApp::parse().into_execute().await +} + +#[derive(Debug, Parser)] +#[command(term_width = 0)] +#[command(version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")))] +#[command(about = "Get blocks example", long_about = None)] +struct GetBlocksExampleApp { + #[arg(long)] + first_slot: Option, + + #[arg(long)] + last_slot: Option, + + #[arg(long)] + rate_limit: Option, + + #[arg(long)] + debug: bool, + + #[command(flatten)] + solana_connection_options: SolanaConnectionOptions, +} + +#[derive(Debug, Default)] +struct BlockInfo { + i: usize, + slot: u64, + rewards: u64, +} + +impl GetBlocksExampleApp { + async fn into_execute(self) -> Result<()> { + let subscriber = FmtSubscriber::builder() + .with_max_level(tracing::Level::DEBUG) + .finish(); + + tracing::subscriber::set_global_default(subscriber).unwrap(); + + let Self { + first_slot, + last_slot, + rate_limit, + debug, + solana_connection_options, + } = self; + + let connection = SolanaConnection::from(solana_connection_options); + + let last_slot = match last_slot { + Some(last_slot) => last_slot, + None => { + let epoch_info = connection.get_epoch_info().await?; + epoch_info.absolute_slot + } + }; + + let first_slot = first_slot.unwrap_or(last_slot - 10); + if first_slot > last_slot { + bail!("First slot must be less than or equal to last slot"); + } + + let rate_limit = rate_limit.unwrap_or(5); + let rate_limiter = Arc::new( + RateLimiter::builder() + .max(rate_limit) + .initial(rate_limit) + .refill(rate_limit) + .interval(std::time::Duration::from_secs(1)) + .build(), + ); + + let rpc_block_config = RpcBlockConfig { + transaction_details: Some(TransactionDetails::None), + commitment: Some(CommitmentConfig::confirmed()), + ..Default::default() + }; + + let rpc_client = Arc::new(connection); + + let mut tasks = vec![]; + for (i, slot) in (first_slot..=last_slot).enumerate() { + let rate_limiter = Arc::clone(&rate_limiter); + rate_limiter.acquire_one().await; + + let rpc_client = Arc::clone(&rpc_client); + + let task = tokio::spawn(async move { + tracing::info!("Fetching i={i}, slot={slot}"); + + let mut block = None; + + while block.is_none() { + match rpc_client + .get_block_with_config(slot, rpc_block_config) + .await + { + Ok(confirmed_block) => { + block.replace(confirmed_block); + } + Err(e) => match e.kind() { + ClientErrorKind::RpcError(RpcError::RpcResponseError { + code: + JSON_RPC_SERVER_ERROR_SLOT_SKIPPED + | JSON_RPC_SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED, + message: _, + data: _, + }) => { + return Some(BlockInfo { + i, + slot, + rewards: 0, + }); + } + ClientErrorKind::Reqwest(_) => { + if debug { + tracing::warn!( + "Reqwest error at slot={slot}: Retry after 1 second" + ); + } + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + rate_limiter.acquire_one().await; + } + _ => { + tracing::error!("Failed to get block {slot}: {e:?}"); + return None; + } + }, + }; + } + + let rewards = block + .unwrap() + .rewards + .unwrap() + .iter() + .filter_map(|reward| { + if reward.reward_type.unwrap() == RewardType::Fee { + u64::try_from(reward.lamports).ok() + } else { + None + } + }) + .sum::(); + + Some(BlockInfo { i, slot, rewards }) + }); + + tasks.push(task); + } + + let mut block_infos = Vec::new(); + for task in tasks { + let block_info = match task.await? { + Some(block_info) => block_info, + None => continue, + }; + block_infos.push(block_info); + } + + block_infos.sort_by_key(|info| info.i); + + tracing::info!("Block infos:"); + for info in block_infos { + tracing::info!("i={}, slot={}, rewards={}", info.i, info.slot, info.rewards); + } + + Ok(()) + } +} diff --git a/offchain/crates/solana-client-tools/src/account/mod.rs b/offchain/crates/solana-client-tools/src/account/mod.rs new file mode 100644 index 0000000000..846e446229 --- /dev/null +++ b/offchain/crates/solana-client-tools/src/account/mod.rs @@ -0,0 +1,11 @@ +pub mod record; +pub mod zero_copy; + +// + +use solana_sdk::{account::Account, rent::Rent}; + +pub fn balance(account: &Account, rent: &Rent) -> u64 { + let rent_exemption_lamports = rent.minimum_balance(account.data.len()); + account.lamports.saturating_sub(rent_exemption_lamports) +} diff --git a/offchain/crates/solana-client-tools/src/account/record.rs b/offchain/crates/solana-client-tools/src/account/record.rs new file mode 100644 index 0000000000..e1b17ff0b2 --- /dev/null +++ b/offchain/crates/solana-client-tools/src/account/record.rs @@ -0,0 +1,43 @@ +use std::ops::Deref; + +use anyhow::{Context, Result}; +use borsh::BorshDeserialize; +use doublezero_sdk::record::state::RecordData; +use solana_sdk::account::Account; + +#[derive(Debug, Clone, PartialEq)] +pub struct BorshRecordAccountData { + pub header: RecordData, + pub data: T, +} + +impl BorshRecordAccountData { + pub fn from_account(account: &Account) -> Option { + let (header_data, record_data) = account.data.split_at(size_of::()); + let header = *bytemuck::from_bytes::(header_data); + let data = borsh::from_slice(record_data).ok()?; + + Some(Self { header, data }) + } +} + +impl Deref for BorshRecordAccountData { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.data + } +} + +impl TryFrom for BorshRecordAccountData { + type Error = anyhow::Error; + + fn try_from(account: Account) -> Result { + Self::from_account(&account).with_context(|| { + format!( + "Failed to deserialize account data as Borsh record of {}", + std::any::type_name::(), + ) + }) + } +} diff --git a/offchain/crates/solana-client-tools/src/account/zero_copy.rs b/offchain/crates/solana-client-tools/src/account/zero_copy.rs new file mode 100644 index 0000000000..28b997ba11 --- /dev/null +++ b/offchain/crates/solana-client-tools/src/account/zero_copy.rs @@ -0,0 +1,111 @@ +use std::ops::Deref; + +use anyhow::{Context, Result}; +use bytemuck::Pod; +use doublezero_program_tools::PrecomputedDiscriminator; +use solana_sdk::account::Account; + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct ZeroCopyAccountOwnedData { + pub mucked_data: Box, + pub remaining_data: Vec, +} + +impl ZeroCopyAccountOwnedData { + pub fn from_account(account: &Account) -> Option { + doublezero_program_tools::zero_copy::checked_from_bytes_with_discriminator(&account.data) + .map(|(mucked_data, remaining_data)| ZeroCopyAccountOwnedData { + mucked_data: Box::new(*mucked_data), + remaining_data: remaining_data.to_vec(), + }) + } +} + +impl Deref for ZeroCopyAccountOwnedData { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.mucked_data + } +} + +impl TryFrom for ZeroCopyAccountOwnedData { + type Error = anyhow::Error; + + fn try_from(account: Account) -> Result { + Self::from_account(&account).with_context(|| { + format!( + "Failed to deserialize account data as zero-copy {}", + std::any::type_name::(), + ) + }) + } +} + +#[cfg(test)] +mod tests { + use bytemuck::Zeroable; + use doublezero_program_tools::Discriminator; + + use super::*; + + #[repr(C)] + #[derive(Clone, Copy, Debug, PartialEq, Eq, Pod, Zeroable)] + struct TestState { + value: u64, + } + + impl PrecomputedDiscriminator for TestState { + const DISCRIMINATOR: Discriminator<8> = Discriminator::new([1, 2, 3, 4, 5, 6, 7, 8]); + } + + fn account_with_data(data: Vec) -> Account { + Account { + data, + ..Default::default() + } + } + + fn well_formed_bytes(state: &TestState) -> Vec { + let mut bytes = Vec::new(); + bytes.extend_from_slice(TestState::discriminator_slice()); + bytes.extend_from_slice(bytemuck::bytes_of(state)); + bytes + } + + #[test] + fn test_from_account_returns_some_for_well_formed_data() { + let state = TestState { value: 42 }; + let account = account_with_data(well_formed_bytes(&state)); + + let parsed = ZeroCopyAccountOwnedData::::from_account(&account).unwrap(); + assert_eq!(*parsed.mucked_data, state); + assert!(parsed.remaining_data.is_empty()); + } + + #[test] + fn test_from_account_returns_none_for_wrong_discriminator() { + let state = TestState { value: 42 }; + let mut bytes = well_formed_bytes(&state); + bytes[0] ^= 0xff; + + let account = account_with_data(bytes); + assert!(ZeroCopyAccountOwnedData::::from_account(&account).is_none()); + } + + #[test] + fn test_from_account_returns_none_for_too_short_data() { + let state = TestState { value: 42 }; + let mut bytes = well_formed_bytes(&state); + bytes.pop(); + + let account = account_with_data(bytes); + assert!(ZeroCopyAccountOwnedData::::from_account(&account).is_none()); + } + + #[test] + fn test_from_account_returns_none_for_empty_data() { + let account = account_with_data(vec![]); + assert!(ZeroCopyAccountOwnedData::::from_account(&account).is_none()); + } +} diff --git a/offchain/crates/solana-client-tools/src/instruction.rs b/offchain/crates/solana-client-tools/src/instruction.rs new file mode 100644 index 0000000000..9a82d2002f --- /dev/null +++ b/offchain/crates/solana-client-tools/src/instruction.rs @@ -0,0 +1,14 @@ +use solana_sdk::instruction::Instruction; + +/// Unfortunately, Instruction does not implement Default, so we need to replace +/// it with a new Instruction with default values. +pub fn take_instruction(instruction: &mut Instruction) -> Instruction { + std::mem::replace( + instruction, + Instruction { + program_id: Default::default(), + accounts: Default::default(), + data: Default::default(), + }, + ) +} diff --git a/offchain/crates/solana-client-tools/src/keypair/error.rs b/offchain/crates/solana-client-tools/src/keypair/error.rs new file mode 100644 index 0000000000..543172e568 --- /dev/null +++ b/offchain/crates/solana-client-tools/src/keypair/error.rs @@ -0,0 +1,63 @@ +use thiserror::Error; + +/// Error type for keypair loading operations. +#[derive(Debug, Error)] +pub enum KeypairLoadError { + /// No keypair source was available + #[error("No keypair source available. Tried:\n{}\n\nHint: Provide keypair via:\n - doublezero-solana --keypair /path/to/key.json\n - cat key.json | doublezero-solana ...", format_attempted(.attempted))] + NoSourceAvailable { + /// List of sources that were attempted + attempted: Vec, + }, + + /// Failed to read keypair from stdin + #[error("Failed to read keypair from stdin: {message}")] + StdinReadError { + /// Error message + message: String, + }, + + /// Failed to read keypair file + #[error("Failed to read keypair file '{path}': {message}")] + FileReadError { + /// Path that was attempted + path: String, + /// Error message + message: String, + }, + + /// Invalid JSON format in keypair data + #[error("Invalid keypair JSON format from {origin}: {message}")] + InvalidJsonFormat { + /// Source description + origin: String, + /// Error message + message: String, + }, + + /// Invalid keypair bytes (not 64 bytes) + #[error("Invalid keypair bytes from {origin}: expected 64 bytes")] + InvalidKeypairBytes { + /// Source description + origin: String, + }, + + /// Stdin is a TTY, cannot read interactively + #[error( + "Stdin is a TTY - cannot read keypair interactively. Pipe keypair JSON via stdin or use --keypair" + )] + StdinIsTty, + + /// Could not determine home directory + #[error("Could not determine home directory for default keypair path")] + HomeDirNotFound, +} + +fn format_attempted(attempted: &[String]) -> String { + attempted + .iter() + .enumerate() + .map(|(i, s)| format!(" {}. {}", i + 1, s)) + .collect::>() + .join("\n") +} diff --git a/offchain/crates/solana-client-tools/src/keypair/loader.rs b/offchain/crates/solana-client-tools/src/keypair/loader.rs new file mode 100644 index 0000000000..1f609fdb0f --- /dev/null +++ b/offchain/crates/solana-client-tools/src/keypair/loader.rs @@ -0,0 +1,248 @@ +use std::{ + fs, + io::{IsTerminal, Read}, + path::PathBuf, +}; + +use solana_sdk::signature::Keypair; + +use crate::keypair::{error::KeypairLoadError, source::KeypairSource}; + +/// Default keypair path relative to HOME +const DEFAULT_KEYPAIR_PATH: &str = ".config/solana/id.json"; + +/// Result of loading a keypair, including provenance information +#[derive(Debug)] +pub struct KeypairLoadResult { + /// The loaded keypair + pub keypair: Keypair, + /// The source from which the keypair was loaded + pub source: KeypairSource, +} + +/// Parse keypair from JSON string +pub fn parse_keypair_json(json_str: &str, source_desc: &str) -> Result { + let secret_key_bytes: Vec = + serde_json::from_str(json_str).map_err(|e| KeypairLoadError::InvalidJsonFormat { + origin: source_desc.to_string(), + message: e.to_string(), + })?; + + Keypair::try_from(secret_key_bytes.as_slice()).map_err(|_| { + KeypairLoadError::InvalidKeypairBytes { + origin: source_desc.to_string(), + } + }) +} + +/// Read keypair from a file path +fn read_keypair_from_path(path: &PathBuf) -> Result { + let content = fs::read_to_string(path).map_err(|e| KeypairLoadError::FileReadError { + path: path.display().to_string(), + message: e.to_string(), + })?; + + parse_keypair_json(&content, &path.display().to_string()) +} + +/// Read keypair from stdin +fn read_keypair_from_stdin() -> Result { + if std::io::stdin().is_terminal() { + return Err(KeypairLoadError::StdinIsTty); + } + + let mut buffer = String::new(); + std::io::stdin() + .read_to_string(&mut buffer) + .map_err(|e| KeypairLoadError::StdinReadError { + message: e.to_string(), + })?; + + if buffer.trim().is_empty() { + return Err(KeypairLoadError::StdinReadError { + message: "stdin was empty".to_string(), + }); + } + + parse_keypair_json(&buffer, "stdin") +} + +/// Load keypair following the precedence chain: +/// 1. CLI argument (--keypair) +/// 2. Stdin (if not a TTY) +/// 3. Default path (~/.config/solana/id.json) +/// +/// # Arguments +/// * `cli_path` - Optional path from CLI --keypair argument +/// * `default_path` - Default path if no other source available +/// +/// # Returns +/// * `Ok(KeypairLoadResult)` - Successfully loaded keypair with source +/// * `Err(KeypairLoadError)` - Failed to load keypair from any source +pub fn load_keypair( + cli_path: Option, + default_path: PathBuf, +) -> Result { + // 1. Try CLI argument (highest precedence) + // If explicitly provided, fail immediately on error rather than silently + // falling through to other sources (which could sign with the wrong key). + if let Some(path) = cli_path { + let keypair = read_keypair_from_path(&path)?; + return Ok(KeypairLoadResult { + keypair, + source: KeypairSource::CliArgument(path), + }); + } + let mut attempted: Vec = Vec::new(); + attempted.push("CLI --keypair: not provided".to_string()); + + // 2. Try stdin (if not a TTY) + match read_keypair_from_stdin() { + Ok(keypair) => { + return Ok(KeypairLoadResult { + keypair, + source: KeypairSource::Stdin, + }); + } + Err(KeypairLoadError::StdinIsTty) => { + attempted.push("Stdin: is a TTY (not piped)".to_string()); + } + Err(e) => { + attempted.push(format!("Stdin: {}", e)); + } + } + + // 3. Try default path + match read_keypair_from_path(&default_path) { + Ok(keypair) => { + return Ok(KeypairLoadResult { + keypair, + source: KeypairSource::DefaultPath(default_path), + }); + } + Err(e) => { + attempted.push(format!("Default path ({}): {}", default_path.display(), e)); + } + } + + Err(KeypairLoadError::NoSourceAvailable { attempted }) +} + +/// Load keypair following the precedence chain: +/// 1. CLI argument (--keypair) +/// 2. Stdin (if not a TTY) +/// 3. Default path (~/.config/solana/id.json) +/// +/// This is a convenience wrapper around [`load_keypair`] that automatically +/// computes the default path from the HOME environment variable. +/// +/// # Arguments +/// * `cli_path` - Optional path from CLI --keypair argument +/// +/// # Returns +/// * `Ok(Keypair)` - Successfully loaded keypair +/// * `Err(KeypairLoadError)` - Failed to load keypair from any source +pub fn try_load_keypair(cli_path: Option) -> Result { + let home = home::home_dir().ok_or(KeypairLoadError::HomeDirNotFound)?; + let default_path = home.join(DEFAULT_KEYPAIR_PATH); + let result = load_keypair(cli_path, default_path)?; + Ok(result.keypair) +} + +#[cfg(test)] +mod tests { + use std::io::Write; + + use solana_sdk::signer::Signer; + use tempfile::NamedTempFile; + + use super::*; + + fn write_keypair_file(keypair: &Keypair) -> NamedTempFile { + let mut file = NamedTempFile::new().unwrap(); + let bytes: Vec = keypair.to_bytes().to_vec(); + write!(file, "{}", serde_json::to_string(&bytes).unwrap()).unwrap(); + file + } + + #[test] + fn cli_path_valid_keypair_succeeds() { + let keypair = Keypair::new(); + let file = write_keypair_file(&keypair); + + let result = load_keypair(Some(file.path().into()), PathBuf::from("/nonexistent")).unwrap(); + + assert_eq!(result.keypair.pubkey(), keypair.pubkey()); + assert_eq!( + result.source, + KeypairSource::CliArgument(file.path().into()) + ); + } + + #[test] + fn cli_path_missing_file_fails_immediately() { + let valid_keypair = Keypair::new(); + let valid_file = write_keypair_file(&valid_keypair); + + // Even though default_path is a valid keypair, specifying a missing + // --keypair must fail rather than falling through to the default. + let result = load_keypair( + Some(PathBuf::from("/nonexistent/keypair.json")), + valid_file.path().into(), + ); + + assert!(result.is_err()); + assert!(matches!( + result.unwrap_err(), + KeypairLoadError::FileReadError { .. } + )); + } + + #[test] + fn cli_path_invalid_json_fails_immediately() { + let mut bad_file = NamedTempFile::new().unwrap(); + write!(bad_file, "not json").unwrap(); + + let valid_keypair = Keypair::new(); + let valid_default = write_keypair_file(&valid_keypair); + + let result = load_keypair(Some(bad_file.path().into()), valid_default.path().into()); + + assert!(result.is_err()); + assert!(matches!( + result.unwrap_err(), + KeypairLoadError::InvalidJsonFormat { .. } + )); + } + + #[test] + fn cli_path_wrong_byte_length_fails_immediately() { + let mut bad_file = NamedTempFile::new().unwrap(); + write!(bad_file, "[1, 2, 3]").unwrap(); + + let valid_keypair = Keypair::new(); + let valid_default = write_keypair_file(&valid_keypair); + + let result = load_keypair(Some(bad_file.path().into()), valid_default.path().into()); + + assert!(result.is_err()); + assert!(matches!( + result.unwrap_err(), + KeypairLoadError::InvalidKeypairBytes { .. } + )); + } + + #[test] + fn no_cli_path_falls_back_to_default() { + let keypair = Keypair::new(); + let file = write_keypair_file(&keypair); + + let result = load_keypair(None, file.path().into()).unwrap(); + + assert_eq!(result.keypair.pubkey(), keypair.pubkey()); + assert_eq!( + result.source, + KeypairSource::DefaultPath(file.path().into()) + ); + } +} diff --git a/offchain/crates/solana-client-tools/src/keypair/mod.rs b/offchain/crates/solana-client-tools/src/keypair/mod.rs new file mode 100644 index 0000000000..59b6b7a97f --- /dev/null +++ b/offchain/crates/solana-client-tools/src/keypair/mod.rs @@ -0,0 +1,27 @@ +//! Keypair loading module with support for multiple input sources. +//! +//! This module provides flexible keypair loading with the following precedence: +//! 1. CLI argument (`--keypair /path/to/key.json`) +//! 2. Stdin (if piped, not a TTY) +//! 3. Default path (`~/.config/solana/id.json`) +//! +//! # Example +//! +//! ```ignore +//! use solana_client_tools::keypair::try_load_keypair; +//! use std::path::PathBuf; +//! +//! // Load from CLI path, falling back to stdin or ~/.config/solana/id.json +//! let keypair = try_load_keypair(Some(PathBuf::from("/path/from/cli")))?; +//! +//! // Or let it use the default precedence chain +//! let keypair = try_load_keypair(None)?; +//! ``` + +mod error; +mod loader; +mod source; + +pub use error::KeypairLoadError; +pub use loader::{KeypairLoadResult, load_keypair, parse_keypair_json, try_load_keypair}; +pub use source::KeypairSource; diff --git a/offchain/crates/solana-client-tools/src/keypair/source.rs b/offchain/crates/solana-client-tools/src/keypair/source.rs new file mode 100644 index 0000000000..018d818938 --- /dev/null +++ b/offchain/crates/solana-client-tools/src/keypair/source.rs @@ -0,0 +1,23 @@ +use std::{fmt, path::PathBuf}; + +/// Represents the source from which a keypair was loaded. +/// Used for provenance tracking and debugging. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum KeypairSource { + /// Keypair loaded from CLI argument (highest precedence) + CliArgument(PathBuf), + /// Keypair loaded from stdin (piped input) + Stdin, + /// Keypair loaded from default path + DefaultPath(PathBuf), +} + +impl fmt::Display for KeypairSource { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::CliArgument(path) => write!(f, "CLI argument ({})", path.display()), + Self::Stdin => write!(f, "stdin"), + Self::DefaultPath(path) => write!(f, "default path ({})", path.display()), + } + } +} diff --git a/offchain/crates/solana-client-tools/src/lib.rs b/offchain/crates/solana-client-tools/src/lib.rs new file mode 100644 index 0000000000..338cce5072 --- /dev/null +++ b/offchain/crates/solana-client-tools/src/lib.rs @@ -0,0 +1,8 @@ +pub mod account; +pub mod instruction; +pub mod keypair; +pub mod payer; +pub mod rpc; +#[cfg(feature = "squads")] +pub mod squads; +pub mod transaction; diff --git a/offchain/crates/solana-client-tools/src/payer.rs b/offchain/crates/solana-client-tools/src/payer.rs new file mode 100644 index 0000000000..1e2f1709b4 --- /dev/null +++ b/offchain/crates/solana-client-tools/src/payer.rs @@ -0,0 +1,464 @@ +use std::path::PathBuf; + +use anyhow::{Context, Result, ensure}; +use clap::Args; +use solana_address_lookup_table_interface::state::AddressLookupTable; +use solana_client::{ + rpc_config::{RpcSendTransactionConfig, RpcSimulateTransactionConfig, RpcTransactionConfig}, + rpc_response::RpcSimulateTransactionResult, +}; +use solana_commitment_config::CommitmentConfig; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{ + instruction::Instruction, + message::AddressLookupTableAccount, + pubkey::Pubkey, + signature::{Keypair, Signature}, + signer::Signer, + transaction::{TransactionError, VersionedTransaction}, +}; +use solana_transaction_status_client_types::UiTransactionEncoding; +use spl_associated_token_account_interface::address::get_associated_token_address_and_bump_seed; + +// Re-export for backward compatibility +pub use crate::keypair::try_load_keypair; +use crate::{ + rpc::{SolanaConnection, SolanaConnectionOptions}, + transaction::try_new_transaction, +}; + +#[derive(Debug, Args, Clone, Default)] +pub struct SolanaPayerOptions { + #[command(flatten)] + pub connection_options: SolanaConnectionOptions, + + #[command(flatten)] + pub signer_options: SolanaSignerOptions, +} + +#[derive(Debug, Args, Clone, Default)] +pub struct SolanaSignerOptions { + /// Filepath or URL to a keypair. + #[arg(long = "keypair", short = 'k', value_name = "KEYPAIR", env)] + pub keypair_path: Option, + + /// Set the compute unit price for transaction in increments of 0.000001 lamports per compute + /// unit. + #[arg(long, value_name = "MICROLAMPORTS", env)] + pub with_compute_unit_price: Option, + + /// Print verbose output. + #[arg( + long, + short = 'v', + value_name = "VERBOSE", + default_value = "false", + env + )] + pub verbose: bool, + + /// Filepath or URL to keypair to pay transaction fee. + #[arg(long = "fee-payer", value_name = "KEYPAIR", env)] + pub fee_payer_path: Option, + + /// Simulate transaction only. + #[arg(long, value_name = "DRY_RUN", env)] + pub dry_run: bool, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum TransactionOutcome { + Simulated(Box), + Executed(Signature), +} + +pub struct Wallet { + pub connection: SolanaConnection, + pub signer: Keypair, + pub compute_unit_price_ix: Option, + pub verbose: bool, + pub fee_payer: Option, + pub dry_run: bool, +} + +impl Wallet { + /// Build a `Wallet` from CLI options. Pass `None` to derive the + /// `SolanaConnection` from `opts.connection_options` (the `-u`/`--url` + /// option); pass `Some(connection)` when the connection is built from a + /// different source, such as a URL carried in a separate CLI context. + pub fn try_new(opts: SolanaPayerOptions, connection: Option) -> Result { + let SolanaPayerOptions { + connection_options, + signer_options: + SolanaSignerOptions { + keypair_path, + with_compute_unit_price, + verbose, + fee_payer_path, + dry_run, + }, + } = opts; + + let signer = try_load_keypair(keypair_path.map(Into::into))?; + + let fee_payer = match fee_payer_path { + Some(path) => { + let payer_signer = try_load_specified_keypair(&PathBuf::from(path))?; + ensure!( + payer_signer.pubkey() != signer.pubkey(), + "Specify fee payer if it differs from the main keypair" + ); + + Some(payer_signer) + } + None => None, + }; + + Ok(Wallet { + connection: connection.unwrap_or_else(|| connection_options.into()), + signer, + compute_unit_price_ix: with_compute_unit_price + .map(ComputeBudgetInstruction::set_compute_unit_price), + verbose, + fee_payer, + dry_run, + }) + } + + pub fn pubkey(&self) -> Pubkey { + self.signer.pubkey() + } + + pub async fn new_transaction_with_additional_signers_and_lookup_tables( + &self, + instructions: &[Instruction], + additional_signers: &[&Keypair], + address_lookup_table_keys: &[Pubkey], + ) -> Result { + let recent_blockhash = self.connection.get_latest_blockhash().await?; + + let mut signers = Vec::with_capacity(2 + additional_signers.len()); + + match self.fee_payer { + Some(ref fee_payer) => { + signers.push(fee_payer); + + if self.signer.pubkey() != fee_payer.pubkey() { + signers.push(&self.signer); + } + } + None => { + signers.push(&self.signer); + } + } + + signers.extend_from_slice(additional_signers); + + if address_lookup_table_keys.is_empty() { + return try_new_transaction(instructions, &signers, &[], recent_blockhash); + } + + let lut_account_infos = self + .connection + .get_multiple_accounts(address_lookup_table_keys) + .await + .context("Failed to get address lookup table accounts")? + .into_iter() + .flatten() + .collect::>(); + ensure!( + lut_account_infos.len() == address_lookup_table_keys.len(), + "Expected {} address lookup table accounts, got {}", + address_lookup_table_keys.len(), + lut_account_infos.len() + ); + + let address_lookup_table_accounts = lut_account_infos + .into_iter() + .zip(address_lookup_table_keys) + .map(|(account_info, key)| { + let lut = + AddressLookupTable::deserialize(&account_info.data).with_context(|| { + format!("Failed to deserialize {key} as address lookup table") + })?; + + Ok(AddressLookupTableAccount { + key: *key, + addresses: lut.addresses.into_owned(), + }) + }) + .collect::>>()?; + + try_new_transaction( + instructions, + &signers, + &address_lookup_table_accounts, + recent_blockhash, + ) + } + + pub async fn new_transaction( + &self, + instructions: &[Instruction], + ) -> Result { + self.new_transaction_with_additional_signers_and_lookup_tables(instructions, &[], &[]) + .await + } + + pub async fn write_verbose_output( + &self, + out: &mut impl std::io::Write, + tx_sigs: &[Signature], + ) -> Result<()> { + if self.verbose { + writeln!(out)?; + writeln!(out, "Url: {}", self.connection.url())?; + writeln!(out, "Signer: {}", self.signer.pubkey())?; + if let Some(fee_payer) = &self.fee_payer { + writeln!(out, "Fee payer: {}", fee_payer.pubkey())?; + } + + for tx_sig in tx_sigs { + self.write_transaction_details(out, tx_sig).await?; + } + } + + Ok(()) + } + + pub async fn print_verbose_output(&self, tx_sigs: &[Signature]) -> Result<()> { + self.write_verbose_output(&mut std::io::stdout(), tx_sigs) + .await + } + + async fn write_transaction_details( + &self, + out: &mut impl std::io::Write, + tx_sig: &Signature, + ) -> Result<()> { + let tx_response = self + .connection + .get_transaction_with_config( + tx_sig, + RpcTransactionConfig { + encoding: Some(UiTransactionEncoding::JsonParsed), + commitment: Some(CommitmentConfig::confirmed()), + max_supported_transaction_version: Some(0), + }, + ) + .await?; + + let tx_meta = tx_response + .transaction + .meta + .context("Transaction meta not found")?; + + writeln!(out, "\nTransaction details for {tx_sig}")?; + writeln!(out, " Fee (lamports): {}", tx_meta.fee)?; + writeln!( + out, + " Compute units: {}", + tx_meta.compute_units_consumed.unwrap() + )?; + writeln!(out, " Cost units: {}", tx_meta.cost_units.unwrap())?; + + writeln!(out, "\n Program logs:")?; + for log in tx_meta.log_messages.unwrap() { + writeln!(out, " {log}")?; + } + + Ok(()) + } + + pub async fn send_or_simulate_transaction( + &self, + transaction: &VersionedTransaction, + ) -> Result { + self.send_or_simulate_transaction_with_configs( + transaction, + self.default_send_transaction_config(), + self.default_simulate_transaction_config(), + ) + .await + } + + pub async fn send_or_simulate_transaction_with_configs( + &self, + transaction: &VersionedTransaction, + send_config: RpcSendTransactionConfig, + simulate_config: RpcSimulateTransactionConfig, + ) -> Result { + if self.dry_run { + let simulation_response = self + .connection + .simulate_transaction_with_config(transaction, simulate_config) + .await? + .value; + + let has_instruction_error = match &simulation_response.err { + Some(tx_err) => { + ensure!( + matches!( + TransactionError::from(tx_err.clone()), + TransactionError::InstructionError(_, _) + ), + "Simulation failed: {tx_err}" + ); + true + } + None => false, + }; + + if let Some(units_consumed) = &simulation_response.units_consumed { + println!("Compute units consumed: {}", units_consumed); + } + + println!("Simulated program logs:"); + simulation_response + .logs + .as_ref() + .unwrap() + .iter() + .for_each(|log| { + println!(" {log}"); + }); + + ensure!(!has_instruction_error, "Simulation failed"); + Ok(TransactionOutcome::Simulated(Box::new(simulation_response))) + } else { + let tx_sig = self + .connection + .send_and_confirm_transaction_with_spinner_and_config( + transaction, + self.connection.commitment(), + send_config, + ) + .await?; + + Ok(TransactionOutcome::Executed(tx_sig)) + } + } + + pub fn compute_units_for_bump_seed(bump: u8) -> u32 { + 1_500 * u32::from(255 - bump) + } + + // Base compute units for create_associated_token_account_idempotent, before + // the bump-dependent address re-derivation cost. + const CREATE_ATA_CU_BASE: u32 = 25_000; + + pub fn create_ata_compute_units(bump: u8) -> u32 { + Self::CREATE_ATA_CU_BASE + Self::compute_units_for_bump_seed(bump) + } + + pub fn ata_address_and_create_compute_units(owner: &Pubkey, mint: &Pubkey) -> (Pubkey, u32) { + let (address, bump) = get_associated_token_address_and_bump_seed( + owner, + mint, + &spl_associated_token_account_interface::program::ID, + &spl_token_interface::ID, + ); + (address, Self::create_ata_compute_units(bump)) + } + + // Compute-unit cost of an spl-memo instruction with zero signer accounts. The + // v3 program logs the memo with debug formatting, so the cost is a fixed base + // plus a per-byte term. Calibrated against the program in solana-program-test + // (see tests/memo_compute_units.rs): plain-text consumption tracks 1_382 + 352 + // per byte, and these rounded values keep a small margin above that line. Memos + // with bytes that debug-escape to several characters cost more per byte, so this + // fits the printable text memos callers pass, not arbitrary binary input. + const MEMO_CU_BASE: u32 = 2_000; + const MEMO_CU_PER_BYTE: u32 = 400; + + pub fn memo_compute_units(memo_len: usize) -> u32 { + Self::MEMO_CU_BASE + Self::MEMO_CU_PER_BYTE * memo_len as u32 + } + + pub fn build_memo_instruction(memo: &[u8]) -> Instruction { + spl_memo_interface::instruction::build_memo(&spl_memo_interface::v3::ID, memo, &[]) + } + + pub fn build_memo_instruction_with_compute_units(memo: &[u8]) -> (Instruction, u32) { + ( + Self::build_memo_instruction(memo), + Self::memo_compute_units(memo.len()), + ) + } + + pub fn default_send_transaction_config(&self) -> RpcSendTransactionConfig { + RpcSendTransactionConfig { + preflight_commitment: Some(self.connection.commitment().commitment), + ..Default::default() + } + } + + pub fn default_simulate_transaction_config(&self) -> RpcSimulateTransactionConfig { + RpcSimulateTransactionConfig { + commitment: Some(self.connection.commitment()), + ..Default::default() + } + } +} + +impl std::ops::Deref for Wallet { + type Target = Keypair; + + fn deref(&self) -> &Self::Target { + &self.signer + } +} + +impl TryFrom for Wallet { + type Error = anyhow::Error; + + fn try_from(opts: SolanaPayerOptions) -> Result { + Wallet::try_new(opts, None) + } +} + +fn try_load_specified_keypair(path: &PathBuf) -> Result { + let keypair_file = std::fs::read_to_string(path) + .with_context(|| format!("Keypair not found at {}", path.display()))?; + let keypair_bytes = serde_json::from_str::>(&keypair_file) + .with_context(|| format!("Keypair not valid JSON at {}", path.display()))?; + let default_keypair = Keypair::try_from(keypair_bytes.as_slice()) + .with_context(|| format!("Invalid keypair found at {}", path.display()))?; + + Ok(default_keypair) +} + +#[cfg(test)] +mod tests { + use spl_associated_token_account_interface::address::get_associated_token_address_and_bump_seed; + + use super::*; + + #[test] + fn test_create_ata_compute_units_adds_base_to_bump_cost() { + // Bump 255 has zero re-derivation cost, so the result is just the base. + assert_eq!(Wallet::create_ata_compute_units(255), 25_000); + // Each bump candidate below 255 adds 1_500 CU. + assert_eq!(Wallet::create_ata_compute_units(254), 26_500); + } + + #[test] + fn test_ata_address_and_create_compute_units_uses_classic_spl_token() { + let owner = Pubkey::new_unique(); + let mint = Pubkey::new_unique(); + + let (address, compute_units) = Wallet::ata_address_and_create_compute_units(&owner, &mint); + + let (expected_address, expected_bump) = get_associated_token_address_and_bump_seed( + &owner, + &mint, + &spl_associated_token_account_interface::program::ID, + &spl_token_interface::ID, + ); + assert_eq!(address, expected_address); + assert_eq!( + compute_units, + Wallet::create_ata_compute_units(expected_bump) + ); + } +} diff --git a/offchain/crates/solana-client-tools/src/rpc.rs b/offchain/crates/solana-client-tools/src/rpc.rs new file mode 100644 index 0000000000..cb2723da52 --- /dev/null +++ b/offchain/crates/solana-client-tools/src/rpc.rs @@ -0,0 +1,381 @@ +use std::{ops::Deref, str::FromStr}; + +use anyhow::{Context, Result, bail}; +use borsh::BorshDeserialize; +use bytemuck::Pod; +use clap::{Args, ValueEnum}; +use doublezero_program_tools::PrecomputedDiscriminator; +use doublezero_sdk::record::pubkey::create_record_key; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::{account::Account, pubkey, pubkey::Pubkey, sysvar::SysvarSerialize}; + +use crate::account::{record::BorshRecordAccountData, zero_copy::ZeroCopyAccountOwnedData}; + +// TODO: We should be able to remove this and anything that depends on this +// connection option. `DoubleZeroLedgerEnvironment` should be the replacement. +#[derive(Debug, Args, Clone)] +pub struct DoubleZeroLedgerConnectionOptions { + /// URL for DoubleZero Ledger's JSON RPC. Required. + #[arg(long, required = true, env)] + pub dz_ledger_url: String, +} + +/// If specified, the DoubleZero Ledger environment will not be the same as the +/// Solana connection's. This argument is useful for local development. +#[derive(Debug, Args, Clone)] +pub struct DoubleZeroLedgerEnvironmentOverride { + #[arg(hide = true, long)] + pub dz_env: Option, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, ValueEnum)] +pub enum NetworkEnvironment { + #[default] + MainnetBeta, + Testnet, + Devnet, + Localnet, +} + +impl NetworkEnvironment { + pub const DEFAULT_LOCALNET_URL: &str = "http://localhost:8899"; + + pub const PUBLIC_SOLANA_MAINNET_BETA_URL: &str = "https://api.mainnet-beta.solana.com"; + pub const PUBLIC_SOLANA_TESTNET_URL: &str = "https://api.testnet.solana.com"; + pub const PUBLIC_SOLANA_DEVNET_URL: &str = "https://api.devnet.solana.com"; + + pub const PUBLIC_DOUBLEZERO_LEDGER_MAINNET_BETA_URL: &str = + "https://doublezero-mainnet-beta.rpcpool.com/db336024-e7a8-46b1-80e5-352dd77060ab"; + pub const PUBLIC_DOUBLEZERO_LEDGER_TESTNET_URL: &str = + "https://doublezerolocalnet.rpcpool.com/8a4fd3f4-0977-449f-88c7-63d4b0f10f16"; + + pub const fn doublezero_ledger_public_url(&self) -> &'static str { + match self { + NetworkEnvironment::MainnetBeta => Self::PUBLIC_DOUBLEZERO_LEDGER_MAINNET_BETA_URL, + NetworkEnvironment::Testnet => Self::PUBLIC_DOUBLEZERO_LEDGER_TESTNET_URL, + // There is no DoubleZero Ledger devnet. Reuse the testnet ledger. + NetworkEnvironment::Devnet => Self::PUBLIC_DOUBLEZERO_LEDGER_TESTNET_URL, + NetworkEnvironment::Localnet => Self::DEFAULT_LOCALNET_URL, + } + } + + pub const fn solana_public_url(&self) -> &'static str { + match self { + NetworkEnvironment::MainnetBeta => Self::PUBLIC_SOLANA_MAINNET_BETA_URL, + NetworkEnvironment::Testnet => Self::PUBLIC_SOLANA_TESTNET_URL, + NetworkEnvironment::Devnet => Self::PUBLIC_SOLANA_DEVNET_URL, + NetworkEnvironment::Localnet => Self::DEFAULT_LOCALNET_URL, + } + } + + pub fn is_mainnet_beta(&self) -> bool { + self == &NetworkEnvironment::MainnetBeta + } + + pub fn is_testnet(&self) -> bool { + self == &NetworkEnvironment::Testnet + } + + pub fn is_localnet(&self) -> bool { + self == &NetworkEnvironment::Localnet + } +} + +impl From for DoubleZeroLedgerConnection { + fn from(opts: NetworkEnvironment) -> Self { + DoubleZeroLedgerConnection::new(opts.doublezero_ledger_public_url().to_string()) + } +} + +impl From for SolanaConnection { + fn from(opts: NetworkEnvironment) -> Self { + SolanaConnection::new(opts.solana_public_url().to_string()) + } +} + +impl FromStr for NetworkEnvironment { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + match s { + "m" | "mainnet-beta" => Ok(NetworkEnvironment::MainnetBeta), + "t" | "testnet" => Ok(NetworkEnvironment::Testnet), + "d" | "devnet" => Ok(NetworkEnvironment::Devnet), + "l" | "localhost" => Ok(NetworkEnvironment::Localnet), + _ => bail!("Cannot convert moniker '{s}' to network environment"), + } + } +} + +#[derive(Debug, Args, Clone, Default)] +pub struct SolanaConnectionOptions { + /// URL for Solana's JSON RPC or moniker (or their first letter): + /// [mainnet-beta, testnet, devnet, localhost]. + #[arg(long = "url", short = 'u', value_name = "URL_OR_MONIKER", env)] + pub solana_url_or_moniker: Option, +} + +impl SolanaConnectionOptions { + const DEFAULT_MONIKER: &str = "m"; + + /// If the URL is a known moniker (m/t/d/l), return the corresponding network + /// environment. Returns `None` when a raw URL was provided. + pub fn moniker_env(&self) -> Option { + let url_or_moniker = self + .solana_url_or_moniker + .as_deref() + .unwrap_or(Self::DEFAULT_MONIKER); + ::from_str(url_or_moniker).ok() + } +} + +pub struct SolanaConnection(pub RpcClient); + +impl SolanaConnection { + pub const SOLANA_MAINNET_BETA_GENESIS_HASH: Pubkey = + pubkey!("5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d"); + pub const SOLANA_TESTNET_GENESIS_HASH: Pubkey = + pubkey!("4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY"); + pub const DZ_LEDGER_TESTNET_GENESIS_HASH: Pubkey = + pubkey!("GG2A8FHDoSH3cbQrTsxmMYZ6iy2yyRh7NY1yP7sXSH3v"); + pub const SOLANA_DEVNET_GENESIS_HASH: Pubkey = + pubkey!("EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG"); + + pub fn new(url: String) -> Self { + Self::new_with_commitment(url, CommitmentConfig::confirmed()) + } + + pub fn new_with_commitment(url: String, commitment_config: CommitmentConfig) -> Self { + Self(RpcClient::new_with_commitment(url, commitment_config)) + } + + pub async fn try_network_environment(&self) -> Result { + let genesis_hash = self.0.get_genesis_hash().await?; + + match Pubkey::from(genesis_hash.to_bytes()) { + Self::SOLANA_MAINNET_BETA_GENESIS_HASH => Ok(NetworkEnvironment::MainnetBeta), + Self::SOLANA_TESTNET_GENESIS_HASH | Self::DZ_LEDGER_TESTNET_GENESIS_HASH => { + Ok(NetworkEnvironment::Testnet) + } + Self::SOLANA_DEVNET_GENESIS_HASH => Ok(NetworkEnvironment::Devnet), + _ => Ok(NetworkEnvironment::Localnet), + } + } + + pub async fn try_fetch_sysvar(&self) -> Result { + try_fetch_sysvar(&self.0).await + } + + pub async fn try_fetch_zero_copy_data_with_commitment( + &self, + key: &Pubkey, + commitment_config: CommitmentConfig, + ) -> Result> { + try_fetch_zero_copy_data_with_commitment(&self.0, key, commitment_config).await + } + + pub async fn try_fetch_zero_copy_data( + &self, + key: &Pubkey, + ) -> Result> { + try_fetch_zero_copy_data_with_commitment(&self.0, key, self.0.commitment()).await + } + + pub async fn try_fetch_multiple_accounts(&self, keys: &[Pubkey]) -> Result> { + let account_infos = try_fetch_multiple_accounts(&self.0, keys) + .await? + .into_iter() + .map(Option::unwrap_or_default) + .collect::>(); + + Ok(account_infos) + } + + /// Returns one slot per input key. Missing accounts and accounts whose + /// bytes fail discriminator/layout checks both surface as `None`, so a + /// single bad slot can't poison the entire batch. The two reasons are + /// not distinguishable from the return value; a caller that needs the + /// distinction must re-fetch the raw account. + /// + /// The helper validates only discriminator and layout. Account ownership, + /// semantic validity of the parsed contents, and whether the key was + /// expected to exist at all are the caller's responsibility. + pub async fn try_fetch_multiple_zero_copy_data( + &self, + keys: &[Pubkey], + ) -> Result>>> { + Ok(try_fetch_multiple_accounts(&self.0, keys) + .await? + .into_iter() + .map(|opt| opt.and_then(|a| ZeroCopyAccountOwnedData::from_account(&a))) + .collect()) + } +} + +impl From for SolanaConnection { + fn from(opts: SolanaConnectionOptions) -> Self { + let SolanaConnectionOptions { + solana_url_or_moniker, + } = opts; + + let url_or_moniker = solana_url_or_moniker + .as_deref() + .unwrap_or(SolanaConnectionOptions::DEFAULT_MONIKER); + + // Give it the ol' college try to convert a moniker. If it fails, assume + // a URL was provided. + let url = ::from_str(url_or_moniker) + .as_ref() + .map(NetworkEnvironment::solana_public_url) + .unwrap_or(url_or_moniker); + Self::new(url.to_string()) + } +} + +impl Deref for SolanaConnection { + type Target = RpcClient; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +pub struct DoubleZeroLedgerConnection(pub RpcClient); + +impl DoubleZeroLedgerConnection { + pub fn new(url: String) -> Self { + Self::new_with_commitment(url, CommitmentConfig::confirmed()) + } + + pub fn new_with_commitment(url: String, commitment_config: CommitmentConfig) -> Self { + Self(RpcClient::new_with_commitment(url, commitment_config)) + } + + pub async fn try_fetch_borsh_record( + &self, + payer_key: &Pubkey, + record_seeds: &[&[u8]], + ) -> Result> { + self.try_fetch_borsh_record_with_commitment(payer_key, record_seeds, self.0.commitment()) + .await + } + + pub async fn try_fetch_borsh_record_with_commitment( + &self, + payer_key: &Pubkey, + record_seeds: &[&[u8]], + commitment_config: CommitmentConfig, + ) -> Result> { + try_fetch_borsh_record_with_commitment(&self.0, payer_key, record_seeds, commitment_config) + .await + } + + pub async fn try_fetch_multiple_accounts( + &self, + keys: &[Pubkey], + ) -> Result>> { + try_fetch_multiple_accounts(&self.0, keys).await + } +} + +impl Deref for DoubleZeroLedgerConnection { + type Target = RpcClient; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +pub async fn try_fetch_sysvar(rpc_client: &RpcClient) -> Result { + let sysvar_account_info = rpc_client.get_account(&T::id()).await?; + solana_sdk::account::from_account(&sysvar_account_info).context("Failed to deserialize sysvar") +} + +pub async fn try_fetch_zero_copy_data_with_commitment( + rpc_client: &RpcClient, + key: &Pubkey, + commitment_config: CommitmentConfig, +) -> Result> { + rpc_client + .get_account_with_commitment(key, commitment_config) + .await? + .value + .with_context(|| format!("Failed to fetch account {key}"))? + .try_into() +} + +pub async fn try_fetch_borsh_record_with_commitment( + rpc_client: &RpcClient, + payer_key: &Pubkey, + record_seeds: &[&[u8]], + commitment_config: CommitmentConfig, +) -> Result> { + let record_key = create_record_key(payer_key, record_seeds); + + rpc_client + .get_account_with_commitment(&record_key, commitment_config) + .await? + .value + .with_context(|| format!("Failed to fetch record {record_key}"))? + .try_into() +} + +// TODO: Make more efficient with async fetches. Adding async fetches will +// require a rate limiter. +pub async fn try_fetch_multiple_accounts( + rpc_client: &RpcClient, + keys: &[Pubkey], +) -> Result>> { + // https://solana.com/docs/rpc/http/getmultipleaccounts#:~:text=up%20to%20a%20maximum%20of%20100. + const MAX_FETCH_SIZE: usize = 100; + + let mut accounts = Vec::with_capacity(keys.len()); + + for keys_chunk in keys.chunks(MAX_FETCH_SIZE) { + let accounts_chunk = rpc_client.get_multiple_accounts(keys_chunk).await?; + accounts.extend(accounts_chunk); + } + + Ok(accounts) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn moniker_env_defaults_to_mainnet() { + let opts = SolanaConnectionOptions { + solana_url_or_moniker: None, + }; + assert_eq!(opts.moniker_env(), Some(NetworkEnvironment::MainnetBeta)); + } + + #[test] + fn moniker_env_recognizes_monikers() { + for (input, expected) in [ + ("m", NetworkEnvironment::MainnetBeta), + ("mainnet-beta", NetworkEnvironment::MainnetBeta), + ("t", NetworkEnvironment::Testnet), + ("testnet", NetworkEnvironment::Testnet), + ("d", NetworkEnvironment::Devnet), + ("devnet", NetworkEnvironment::Devnet), + ("l", NetworkEnvironment::Localnet), + ("localhost", NetworkEnvironment::Localnet), + ] { + let opts = SolanaConnectionOptions { + solana_url_or_moniker: Some(input.to_string()), + }; + assert_eq!(opts.moniker_env(), Some(expected), "input: {input}"); + } + } + + #[test] + fn moniker_env_returns_none_for_raw_url() { + let opts = SolanaConnectionOptions { + solana_url_or_moniker: Some("https://my-rpc.example.com".to_string()), + }; + assert_eq!(opts.moniker_env(), None); + } +} diff --git a/offchain/crates/solana-client-tools/src/squads.rs b/offchain/crates/solana-client-tools/src/squads.rs new file mode 100644 index 0000000000..ef8f4cfdbe --- /dev/null +++ b/offchain/crates/solana-client-tools/src/squads.rs @@ -0,0 +1,892 @@ +use anyhow::{Context, Result, bail, ensure}; +use clap::Args; +use percent_encoding::{AsciiSet, NON_ALPHANUMERIC, utf8_percent_encode}; +use solana_loader_v3_interface::state::UpgradeableLoaderState; +use solana_message::Message; +use solana_sdk::{instruction::Instruction, pubkey, pubkey::Pubkey}; + +use crate::{ + rpc::{NetworkEnvironment, SolanaConnection}, + transaction::MAX_TRANSACTION_SIZE, +}; + +// Squads Protocol v4 multisig program. +pub const SQUADS_V4_PROGRAM_ID: Pubkey = pubkey!("SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf"); + +const VAULT_SEED_PREFIX: &[u8] = b"multisig"; +const VAULT_SEED: &[u8] = b"vault"; + +// A payload travels as the `transaction_message` of `vault_transaction_create`, and the +// app bundles the compute budget pair, a `proposal_create`, and a `proposal_approve` into +// that same transaction, which is how one transaction takes a payload all the way to the +// approvers. That transaction is what has to fit MAX_TRANSACTION_SIZE, so what it spends +// is what a payload does not get to spend. Each block below adds up to the byte count its +// assertion names, and the total is the reserve. + +// vault_transaction_create, as a legacy transaction. +const VAULT_TRANSACTION_CREATE_BYTES: usize = 1 // signature count (shortvec) + + 64 // creator signature + + 3 // message header + + 1 // account key count (shortvec) + + 32 // multisig key + + 32 // transaction account key + + 32 // member key, both creator and rent payer + + 32 // system program key + + 32 // Squads program key + + 32 // recent blockhash + + 1 // instruction count (shortvec) + + 1 // program id index + + 1 // account index count (shortvec) + + 5 // account indexes + // Instruction data length (shortvec), 2 bytes once a payload pushes the data past 127. + + 2 + + 8 // instruction discriminator + + 1 // vault_index + + 1 // ephemeral_signers + + 4 // transaction_message length (borsh Vec prefix) + + 1; // memo: None +const _: () = assert!(VAULT_TRANSACTION_CREATE_BYTES == 286); + +// The compute budget pair the app bundles. +const COMPUTE_BUDGET_PAIR_BYTES: usize = 32 // compute budget program key + + 1 // program id index (limit) + + 1 // account index count (shortvec) + + 1 // instruction data length (shortvec) + + 5 // SetComputeUnitLimit payload, a discriminator and a u32 + + 1 // program id index (price) + + 1 // account index count (shortvec) + + 1 // instruction data length (shortvec) + + 9; // SetComputeUnitPrice payload, a discriminator and a u64 +const _: () = assert!(COMPUTE_BUDGET_PAIR_BYTES == 52); + +// The proposal_create the app bundles, whose other four accounts are already keys of the +// create instruction. +const PROPOSAL_CREATE_BYTES: usize = 32 // proposal account key + + 1 // program id index + + 1 // account index count (shortvec) + + 5 // account indexes + + 1 // instruction data length (shortvec) + + 8 // instruction discriminator + + 8 // transaction_index, a u64 + + 1; // draft +const _: () = assert!(PROPOSAL_CREATE_BYTES == 57); + +// The proposal_approve the app bundles, all of whose accounts are already keys. +const PROPOSAL_APPROVE_BYTES: usize = 1 // program id index + + 1 // account index count (shortvec) + + 3 // account indexes + + 1 // instruction data length (shortvec) + + 8 // instruction discriminator + + 1; // memo: None +const _: () = assert!(PROPOSAL_APPROVE_BYTES == 15); + +// What Squads spends around a payload, against the length that payload measures as a +// legacy message. +const VAULT_TRANSACTION_RESERVED_BYTES: usize = VAULT_TRANSACTION_CREATE_BYTES + + COMPUTE_BUDGET_PAIR_BYTES + + PROPOSAL_CREATE_BYTES + + PROPOSAL_APPROVE_BYTES + + 2 // in case the app compiles that transaction as v0 rather than legacy + - 32 // recent blockhash a Squads TransactionMessage does not carry + + 1 // address_table_lookups length a Squads TransactionMessage always writes + + 3; // rounding up the 381 of everything above +const _: () = assert!(VAULT_TRANSACTION_RESERVED_BYTES == 384); + +// Three Squads app behaviors the terms above assume away are not program schema, and the +// three bytes of rounding cover none of them: +// +4 and the text, per memo typed at import, on the create instruction and again on +// the approval, where text of 115 bytes or more costs one further byte for the +// approval's own data length prefix. Borsh writes Some(String) as a tag, a +// 4-byte length and the text where None writes one byte, and nothing bounds the +// text, so no reserve can cover a memo. It spends from a payload's own headroom, +// which is why a payload sized to the last byte is a payload that a memo breaks. +// +96 for a rent payer separate from the creator, being 32 for the key and 64 for +// its signature. The app pays from the connected wallet, which is also the +// creator, so this is assumed away rather than reserved for. +// +33 per further account key the wrapper carries, being 32 for the key and 1 for +// the index of it, and more where that key arrives with an instruction of its +// own. A tip account paid by a System transfer costs 49. + +// Payload instructions run as separate invocations from vault_transaction_execute, +// against a runtime instruction trace that holds 64 entries for the whole transaction. +// Execute spends three of them on the compute budget pair and on itself, leaving around +// 61, and fewer for every payload instruction that invokes further. +// +// 48 is an arbitrarily conservative lower bound, not that ceiling. Nothing here measures +// how deep a payload's own invocations go, so the limit leaves room for them rather than +// pricing them, and a real payload needing more is the reason to raise it. +pub const MAX_PAYLOAD_INSTRUCTIONS: usize = 48; + +// Squads options for a command that always acts as a vault. +#[derive(Debug, Args)] +pub struct SquadsArgs { + /// Squads multisig account, never the vault itself. + #[arg(long, value_name = "PUBKEY")] + pub multisig: Pubkey, + + /// Squads vault index. Vault 0 is the default vault. + #[arg(long, default_value_t = 0, value_name = "U8")] + pub vault_index: u8, + + /// Assert the multisig has the Squads subaccounts a non-zero vault index + /// needs on Solana mainnet. + #[arg(long)] + pub allow_vault_subaccounts: bool, +} + +impl SquadsArgs { + /// The vault to act as. + pub async fn try_find_vault_address(&self, connection: &SolanaConnection) -> Result { + // Verify before deriving, so a mistyped key fails here rather than handing an + // authority to a vault nothing can sign for. + try_verify_multisig(connection, &self.multisig).await?; + + Ok(find_vault_address(&self.multisig, self.vault_index).0) + } + + /// The vault to hand an authority to. + pub async fn try_find_handover_vault_address( + &self, + connection: &SolanaConnection, + ) -> Result { + // Named apart from `try_find_vault_address` so the irreversible path is the one + // carrying the vault index check, rather than a check a caller has to know to + // ask for. A command acting as a vault that already holds something has better + // proof than that check offers, and wants the plain one. + let vault_key = self.try_find_vault_address(connection).await?; + self.try_refuse_unusable_vault_index(connection).await?; + + Ok(vault_key) + } + + /// Refuse a vault index the multisig may have no way to operate. + async fn try_refuse_unusable_vault_index(&self, connection: &SolanaConnection) -> Result<()> { + // The rule below permits vault 0 anyway. Returning here is what keeps the + // default path from paying for a genesis hash read to be told so. + if self.vault_index == 0 || self.allow_vault_subaccounts { + return Ok(()); + } + + let network = connection.try_network_environment().await.context( + "cannot tell which network this endpoint serves, and a non-zero vault index is only \ + safe once that is known. Retry, or name an endpoint that answers getGenesisHash", + )?; + + try_refuse_unusable_vault_index(network, self.vault_index) + } +} + +/// The rule itself, split out so every network can be covered without a request. +fn try_refuse_unusable_vault_index(network: NetworkEnvironment, vault_index: u8) -> Result<()> { + // Nothing onchain distinguishes a multisig with subaccounts from one without, so + // this refuses rather than verifies. + ensure!( + vault_index == 0 || !network.is_mainnet_beta(), + "Squads offers only vault 0 on Solana mainnet unless the multisig is on a paid plan with \ + subaccounts, and acting as vault {vault_index} of a multisig that cannot operate it \ + strands whatever is handed to it. Drop --vault-index if vault 0 was meant, or pass \ + --allow-vault-subaccounts if this multisig really does have subaccounts" + ); + + Ok(()) +} + +// Squads options for a CLI whose commands normally sign with the wallet. Naming a +// multisig switches a command over to the vault: it acts in place of the wallet and +// the instruction is printed for import into Squads rather than sent, because only +// the multisig can sign for a vault. +#[derive(Debug, Args)] +pub struct OptionalSquadsArgs { + /// Squads multisig account, never the vault itself. When set, the vault + /// acts in place of the wallet and the instruction is printed for import + /// into Squads instead of being sent. + #[arg(long, value_name = "PUBKEY")] + pub multisig: Option, + + /// Squads vault index. Vault 0 is the default vault. + #[arg(long, default_value_t = 0, value_name = "U8", requires = "multisig")] + pub vault_index: u8, +} + +impl OptionalSquadsArgs { + /// The vault to act as, or `None` when the wallet should sign for itself. + pub async fn try_find_vault_address( + &self, + connection: &SolanaConnection, + ) -> Result> { + let Some(multisig_key) = self.multisig else { + return Ok(None); + }; + + // Verify before deriving, so a mistyped key fails here rather than producing a + // proposal nothing can execute. + try_verify_multisig(connection, &multisig_key).await?; + + Ok(Some(find_vault_address(&multisig_key, self.vault_index).0)) + } +} + +pub fn find_vault_address(multisig_key: &Pubkey, vault_index: u8) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + VAULT_SEED_PREFIX, + multisig_key.as_ref(), + VAULT_SEED, + &[vault_index], + ], + &SQUADS_V4_PROGRAM_ID, + ) +} + +/// Confirm the account exists and is owned by Squads v4. +pub async fn try_verify_multisig( + connection: &SolanaConnection, + multisig_key: &Pubkey, +) -> Result<()> { + // Pubkeys carry no checksum, so a mistyped multisig still derives a perfectly + // well-formed vault PDA. Handing an authority to one of those is irreversible, + // because nothing can ever sign for the vault of a multisig that does not exist. + let multisig_account = connection + .get_account_with_commitment(multisig_key, connection.commitment()) + .await + .context("failed to fetch multisig")? + .value + .with_context(|| format!("multisig {multisig_key} does not exist on this cluster"))?; + ensure!( + multisig_account.owner == SQUADS_V4_PROGRAM_ID, + "account {multisig_key} is owned by {}, not the Squads v4 program \ + {SQUADS_V4_PROGRAM_ID}. Pass the multisig account, not the vault", + multisig_account.owner + ); + + Ok(()) +} + +/// The buffer's authority, or `None` when the buffer is immutable. +pub fn try_buffer_authority(state: &UpgradeableLoaderState) -> Result> { + // Matched exhaustively on purpose: a variant added upstream should be a compile + // error here, not a misleading message. + match state { + UpgradeableLoaderState::Buffer { authority_address } => Ok(*authority_address), + UpgradeableLoaderState::Program { .. } => bail!("the account is an upgradeable program"), + UpgradeableLoaderState::ProgramData { .. } => { + bail!("the account is a program data account") + } + UpgradeableLoaderState::Uninitialized => bail!("the account is uninitialized"), + } +} + +/// The program's upgrade authority, or `None` when the program is immutable. +pub fn try_upgrade_authority(state: &UpgradeableLoaderState) -> Result> { + // Takes the program's *program data* account state, which is where loader-v3 + // records the authority. + match state { + UpgradeableLoaderState::ProgramData { + upgrade_authority_address, + .. + } => Ok(*upgrade_authority_address), + UpgradeableLoaderState::Buffer { .. } => bail!("the account is a buffer"), + UpgradeableLoaderState::Program { .. } => { + bail!("the account is a program, not its program data") + } + UpgradeableLoaderState::Uninitialized => bail!("the account is uninitialized"), + } +} + +/// Print a base58 encoded transaction for import into the Squads UI. +pub fn try_print_vault_transaction( + connection: &SolanaConnection, + vault_key: &Pubkey, + instructions: &[Instruction], +) -> Result<()> { + let encoded = try_encode_vault_transaction(vault_key, instructions)?; + let rpc_url = connection.url(); + + println!("Import this base58 encoded transaction into Squads:"); + println!("{encoded}"); + println!(); + println!("Read it back first:"); + println!("{}", inspector_url(&encoded, &rpc_url)); + + if !is_public_solana_endpoint(&rpc_url) { + println!(); + println!("WARNING: that link carries the endpoint this command was given."); + println!("Do not share it anywhere that endpoint should not go."); + } + + Ok(()) +} + +/// Explorer link that decodes the message, so it can be read before it is signed. +fn inspector_url(encoded: &str, rpc_url: &str) -> String { + // Unreserved characters per RFC 3986. The base58 alphabet is already within + // that set, so only the endpoint needs escaping. + const QUERY_VALUE: &AsciiSet = &NON_ALPHANUMERIC + .remove(b'-') + .remove(b'.') + .remove(b'_') + .remove(b'~'); + + format!( + "https://explorer.solana.com/tx/inspector?message={encoded}&cluster=custom&customUrl={}", + utf8_percent_encode(rpc_url, QUERY_VALUE) + ) +} + +/// Whether the endpoint is one there is nothing to be careful about sharing. +fn is_public_solana_endpoint(rpc_url: &str) -> bool { + [ + NetworkEnvironment::PUBLIC_SOLANA_MAINNET_BETA_URL, + NetworkEnvironment::PUBLIC_SOLANA_TESTNET_URL, + NetworkEnvironment::PUBLIC_SOLANA_DEVNET_URL, + // Not public, but it names nothing that exists off this machine. + NetworkEnvironment::DEFAULT_LOCALNET_URL, + ] + .contains(&rpc_url.trim_end_matches('/')) +} + +/// Bytes `Message::serialize` may produce for a payload of `instruction_count` +/// instructions, and not the length of the base58 the encoder returns. Sizing to the last +/// byte leaves no room for a memo typed at import. +pub fn vault_transaction_payload_budget(instruction_count: usize) -> usize { + // A Squads TransactionMessage writes each instruction's data length as a u16 + // where a legacy message writes it in one byte, so every payload instruction + // costs one byte more once wrapped than the payload measures here. The term + // stops being spent at 128 data bytes, where the legacy prefix grows to two as + // well, which makes it conservative rather than exact. + // + // Const subtraction on purpose, so a reserve raised past the transaction limit is a + // build failure rather than a budget of zero that refuses every payload. + (MAX_TRANSACTION_SIZE - VAULT_TRANSACTION_RESERVED_BYTES).saturating_sub(instruction_count) +} + +/// Encode instructions as the base58 payload the Squads UI imports, refusing one +/// that will not fit the transaction Squads wraps around it. +pub fn try_encode_vault_transaction( + vault_key: &Pubkey, + instructions: &[Instruction], +) -> Result { + // An empty payload encodes and imports perfectly well, and costs a human the + // approvals to execute nothing. + ensure!( + !instructions.is_empty(), + "no instructions to encode for the vault" + ); + ensure!( + instructions.len() <= MAX_PAYLOAD_INSTRUCTIONS, + "payload has {} instructions, over the {MAX_PAYLOAD_INSTRUCTIONS} a Squads vault \ + transaction is allowed here. Each one runs as its own invocation against an \ + instruction trace the whole execute transaction shares", + instructions.len() + ); + + // The wire contract with that UI: a legacy message, the vault as fee payer and + // sole signer, and a placeholder blockhash Squads replaces when it wraps the + // instructions into a vault transaction. + let message = Message::new(instructions, Some(vault_key)); + + // Squads signs for the vault. Any other signer the payload names has to sign the + // execute transaction itself, which the UI can only arrange for the member running + // it, and nothing here knows who that will be. Such a payload imports and collects + // approvals before running out of signers, unlike an oversized one, which is refused + // at import. + ensure!( + message.header.num_required_signatures == 1, + "payload requires {} signatures. Squads signs for the vault, and any other signer the \ + payload names has to sign the execute transaction itself, which cannot be arranged for a \ + key chosen when the payload was written", + message.header.num_required_signatures + ); + + let account_key_count = message.account_keys.len(); + let payload = message.serialize(); + + let budget = vault_transaction_payload_budget(instructions.len()); + ensure!( + payload.len() <= budget, + "payload is {} bytes, {} over the {budget} a Squads vault transaction can \ + carry. Squads spends {VAULT_TRANSACTION_RESERVED_BYTES} of the \ + {MAX_TRANSACTION_SIZE}-byte transaction limit wrapping a payload into a \ + create transaction alongside its proposal and approval, plus a byte per \ + payload instruction. Emit fewer or smaller instructions", + payload.len(), + payload.len() - budget + ); + + // By execute the payload's instruction data lives in the transaction account and + // does not travel, which leaves execute looser than create at every size, so this + // cannot fire on a payload create accepted. Checked anyway, so nothing certifies a + // payload that imports and then cannot execute. + let execute_size = vault_transaction_execute_size(account_key_count); + ensure!( + execute_size <= MAX_TRANSACTION_SIZE, + "the payload's {account_key_count} account keys need a {execute_size}-byte transaction to \ + execute, over the {MAX_TRANSACTION_SIZE}-byte limit. Emit instructions touching fewer \ + accounts" + ); + + Ok(bs58::encode(payload).into_string()) +} + +// vault_transaction_execute, as a legacy transaction bundled with the same compute budget +// pair the app puts alongside create. +const VAULT_TRANSACTION_EXECUTE_BYTES: usize = 1 // signature count (shortvec) + + 64 // member signature + + 3 // message header + + 1 // account key count (shortvec) + + 32 // multisig key + + 32 // proposal key + + 32 // transaction account key + + 32 // member key + + 32 // Squads program key + + 32 // recent blockhash + + 1 // instruction count (shortvec) + + 1 // program id index + + 1 // account index count (shortvec) + + 4 // account indexes + + 1 // instruction data length (shortvec) + + 8 // instruction discriminator + + COMPUTE_BUDGET_PAIR_BYTES; +const _: () = assert!(VAULT_TRANSACTION_EXECUTE_BYTES == 329); + +// What each payload account key costs the transaction carrying it, whether that is the +// payload's own message or the execute that passes it as a remaining account. +const PER_ACCOUNT_KEY_BYTES: usize = 32 // the key + + 1; // the index of it +const _: () = assert!(PER_ACCOUNT_KEY_BYTES == 33); + +fn vault_transaction_execute_size(account_key_count: usize) -> usize { + VAULT_TRANSACTION_EXECUTE_BYTES + PER_ACCOUNT_KEY_BYTES * account_key_count +} + +#[cfg(test)] +mod tests { + use solana_compute_budget_interface::ComputeBudgetInstruction; + use solana_sdk::instruction::AccountMeta; + + use super::*; + + const MULTISIG_KEY: Pubkey = pubkey!("6GRbcdzDCYdCddcZZBU5ziKXxcKDAcTGyfFPibvSyZgP"); + const VAULT_KEY: Pubkey = pubkey!("2KAv4oDNwoB9oy6ja29jZ38KPqUqQiJpnaHr5QS4yTd3"); + const PROGRAM_KEY: Pubkey = pubkey!("a1oQyDEkMKk8PLcKTXgAVP8C9g4HUBAmB564Dvszh6F"); + + // What a single-instruction payload spends around that instruction's data and the + // data's own length prefix. + const AROUND_INSTRUCTION_DATA: usize = 3 // message header + + 1 // account key count (shortvec) + + 32 // vault key, the fee payer + + 32 // multisig key, the instruction's one account + + 32 // program key + + 32 // recent blockhash + + 1 // instruction count (shortvec) + + 1 // program id index + + 1 // account index count (shortvec) + + 1; // account index + const _: () = assert!(AROUND_INSTRUCTION_DATA == 136); + + // The same framing for a payload of unique accounts and no instruction data, which + // spends an instruction data length where the one above spends an account index. + const AROUND_ACCOUNT_KEYS: usize = 3 // message header + + 1 // account key count (shortvec) + + 32 // vault key, the fee payer + + 32 // program key + + 32 // recent blockhash + + 1 // instruction count (shortvec) + + 1 // program id index + + 1 // account index count (shortvec) + + 1; // instruction data length (shortvec) + const _: () = assert!(AROUND_ACCOUNT_KEYS == 104); + + // A second instruction over the same account and program, before its own data and + // that data's length prefix. + const AROUND_SECOND_INSTRUCTION: usize = 1 // program id index + + 1 // account index count (shortvec) + + 1; // account index + const _: () = assert!(AROUND_SECOND_INSTRUCTION == 3); + + fn instruction_with_data_len(data_len: usize) -> Instruction { + let data = vec![0; data_len]; + + Instruction::new_with_bytes( + PROGRAM_KEY, + &data, + vec![AccountMeta::new_readonly(MULTISIG_KEY, false)], + ) + } + + fn instruction_with_account_count(account_count: usize) -> Instruction { + let accounts = (0..account_count) + .map(|_| AccountMeta::new_readonly(Pubkey::new_unique(), false)) + .collect(); + + Instruction::new_with_bytes(PROGRAM_KEY, &[], accounts) + } + + fn payload_len(instructions: &[Instruction]) -> usize { + let encoded = try_encode_vault_transaction(&VAULT_KEY, instructions).unwrap(); + + bs58::decode(encoded).into_vec().unwrap().len() + } + + #[test] + fn test_inspector_url_carries_the_message_squads_takes() { + let encoded = + try_encode_vault_transaction(&VAULT_KEY, &[instruction_with_data_len(3)]).unwrap(); + let url = inspector_url(&encoded, "https://api.devnet.solana.com"); + + // Unescaped on purpose: the base58 alphabet is URL safe. + assert_eq!( + url, + format!( + "https://explorer.solana.com/tx/inspector?message={encoded}&cluster=custom\ + &customUrl=https%3A%2F%2Fapi.devnet.solana.com" + ) + ); + } + + #[test] + fn test_inspector_url_escapes_an_endpoint_carrying_its_own_query() { + let url = inspector_url("abc", "https://rpc.example.com/v1?api-key=secret&x=1"); + + // Unescaped, the endpoint's own separators would read as parameters of + // the explorer link rather than as part of customUrl. + assert!( + url.ends_with( + "&customUrl=https%3A%2F%2Frpc.example.com%2Fv1%3Fapi-key%3Dsecret%26x%3D1" + ) + ); + } + + #[test] + fn test_only_known_harmless_endpoints_skip_the_sharing_warning() { + assert!(is_public_solana_endpoint("https://api.devnet.solana.com")); + assert!(is_public_solana_endpoint( + "https://api.mainnet-beta.solana.com/" + )); + assert!(is_public_solana_endpoint( + NetworkEnvironment::DEFAULT_LOCALNET_URL + )); + assert!(!is_public_solana_endpoint( + "https://rpc.example.com/?api-key=secret" + )); + assert!(!is_public_solana_endpoint( + NetworkEnvironment::PUBLIC_DOUBLEZERO_LEDGER_TESTNET_URL + )); + } + + #[test] + fn test_only_solana_mainnet_refuses_a_nonzero_vault_index() { + assert!(try_refuse_unusable_vault_index(NetworkEnvironment::MainnetBeta, 3).is_err()); + + // Everywhere else the other indexes are free to use. Localnet is also + // where any genesis hash the mapping does not recognize lands. + for network in [ + NetworkEnvironment::Devnet, + NetworkEnvironment::Testnet, + NetworkEnvironment::Localnet, + ] { + assert!( + try_refuse_unusable_vault_index(network, 3).is_ok(), + "{network:?} should permit a non-zero vault index" + ); + } + } + + #[test] + fn test_vault_0_is_never_refused() { + assert!(try_refuse_unusable_vault_index(NetworkEnvironment::MainnetBeta, 0).is_ok()); + } + + #[test] + fn test_find_vault_address_for_default_vault_index() { + assert_eq!(find_vault_address(&MULTISIG_KEY, 0).0, VAULT_KEY); + } + + #[test] + fn test_authority_decodes_separate_immutable_from_the_wrong_account_kind() { + let authority = Pubkey::new_unique(); + + let buffer = UpgradeableLoaderState::Buffer { + authority_address: Some(authority), + }; + let immutable_buffer = UpgradeableLoaderState::Buffer { + authority_address: None, + }; + let program_data = UpgradeableLoaderState::ProgramData { + slot: 0, + upgrade_authority_address: Some(authority), + }; + let immutable_program_data = UpgradeableLoaderState::ProgramData { + slot: 0, + upgrade_authority_address: None, + }; + let program = UpgradeableLoaderState::Program { + programdata_address: Pubkey::new_unique(), + }; + + // Present, absent, and wrong-kind, for each decode. + assert_eq!(try_buffer_authority(&buffer).unwrap(), Some(authority)); + assert_eq!(try_buffer_authority(&immutable_buffer).unwrap(), None); + assert!(try_buffer_authority(&program_data).is_err()); + assert!(try_buffer_authority(&program).is_err()); + assert!(try_buffer_authority(&UpgradeableLoaderState::Uninitialized).is_err()); + + assert_eq!( + try_upgrade_authority(&program_data).unwrap(), + Some(authority) + ); + assert_eq!( + try_upgrade_authority(&immutable_program_data).unwrap(), + None + ); + assert!(try_upgrade_authority(&buffer).is_err()); + assert!(try_upgrade_authority(&program).is_err()); + assert!(try_upgrade_authority(&UpgradeableLoaderState::Uninitialized).is_err()); + } + + #[test] + fn test_encoded_payload_makes_the_vault_the_sole_signer() { + let encoded = + try_encode_vault_transaction(&VAULT_KEY, &[instruction_with_data_len(3)]).unwrap(); + let message: Message = + bincode::deserialize(&bs58::decode(&encoded).into_vec().unwrap()).unwrap(); + + // The zeroed blockhash is correct: Squads overwrites it when wrapping + // this into a vault transaction. + assert_eq!(message.account_keys[0], VAULT_KEY); + assert_eq!(message.header.num_required_signatures, 1); + assert_eq!(message.recent_blockhash, Default::default()); + assert_eq!(message.instructions.len(), 1); + } + + #[test] + fn test_budget_spends_one_byte_per_payload_instruction() { + // 1_232 - 384, then one byte per instruction for the u16 data length a Squads + // TransactionMessage writes where a legacy message writes one byte. + assert_eq!(vault_transaction_payload_budget(0), 848); + assert_eq!(vault_transaction_payload_budget(1), 847); + assert_eq!(vault_transaction_payload_budget(4), 844); + } + + #[test] + fn test_payload_length_prefix_grows_where_the_per_instruction_term_stops() { + assert_eq!( + payload_len(&[instruction_with_data_len(3)]), + AROUND_INSTRUCTION_DATA + 1 + 3 + ); + + // The legacy prefix grows to two bytes here, which is where the budget's + // per-instruction term stops buying anything. + assert_eq!( + payload_len(&[instruction_with_data_len(127)]), + AROUND_INSTRUCTION_DATA + 1 + 127 + ); + assert_eq!( + payload_len(&[instruction_with_data_len(128)]), + AROUND_INSTRUCTION_DATA + 2 + 128 + ); + } + + #[test] + fn test_encoder_takes_the_budget_the_accessor_reports_and_refuses_one_byte_more() { + let budget = vault_transaction_payload_budget(1); + + // The framing above, plus the 2-byte legacy length prefix that much data needs. + let data_len = budget - (AROUND_INSTRUCTION_DATA + 2); + + assert_eq!(payload_len(&[instruction_with_data_len(data_len)]), budget); + + let error = + try_encode_vault_transaction(&VAULT_KEY, &[instruction_with_data_len(data_len + 1)]) + .unwrap_err() + .to_string(); + + // The numbers rather than the explanation around them, so rewording the message + // is not a test change. + assert!( + error.starts_with(&format!( + "payload is {} bytes, 1 over the {budget} ", + budget + 1 + )), + "{error}" + ); + } + + #[test] + fn test_encoder_spends_the_per_instruction_byte_on_a_second_instruction() { + let budget = vault_transaction_payload_budget(2); + + let data_len = budget + - (AROUND_INSTRUCTION_DATA + + 1 // the first instruction's data length prefix + + 3 // the first instruction's data + + AROUND_SECOND_INSTRUCTION + + 2); // the second instruction's data length prefix + let instructions = [ + instruction_with_data_len(3), + instruction_with_data_len(data_len), + ]; + + assert_eq!(payload_len(&instructions), budget); + + let over = [ + instruction_with_data_len(3), + instruction_with_data_len(data_len + 1), + ]; + assert!(try_encode_vault_transaction(&VAULT_KEY, &over).is_err()); + } + + #[test] + fn test_create_binds_before_execute_at_the_widest_payload_the_budget_takes() { + // Account keys are all execute charges for, so the payload that gets closest to + // its limit is unique accounts and no instruction data. + let account_count = + (vault_transaction_payload_budget(1) - AROUND_ACCOUNT_KEYS) / PER_ACCOUNT_KEY_BYTES; + + assert_eq!( + payload_len(&[instruction_with_account_count(account_count)]), + AROUND_ACCOUNT_KEYS + PER_ACCOUNT_KEY_BYTES * account_count + ); + assert!( + try_encode_vault_transaction( + &VAULT_KEY, + &[instruction_with_account_count(account_count + 1)] + ) + .is_err() + ); + + // The vault and the program are account keys of that payload too, and execute + // passes every one of them as a remaining account. Failing here means execute + // has become the binding constraint and the check in the encoder can now fire. + assert!(vault_transaction_execute_size(account_count + 2) <= MAX_TRANSACTION_SIZE); + } + + #[test] + fn test_cannot_encode_when_there_are_no_instructions() { + let error = try_encode_vault_transaction(&VAULT_KEY, &[]).unwrap_err(); + + // Named rather than any error, since an empty payload is inside every size + // check and would otherwise pass this test for the wrong reason. + assert_eq!(error.to_string(), "no instructions to encode for the vault"); + } + + #[test] + fn test_cannot_encode_more_instructions_than_execute_runs() { + let within = vec![instruction_with_data_len(0); MAX_PAYLOAD_INSTRUCTIONS]; + let over = vec![instruction_with_data_len(0); MAX_PAYLOAD_INSTRUCTIONS + 1]; + + // Both are far inside the byte budget, so the count is the only thing refusing + // the second. + assert!(payload_len(&within) < vault_transaction_payload_budget(within.len())); + + let error = try_encode_vault_transaction(&VAULT_KEY, &over).unwrap_err(); + assert!( + error + .to_string() + .starts_with(&format!("payload has {} instructions", over.len())), + "{error}" + ); + } + + #[test] + fn test_cannot_encode_when_an_instruction_names_another_signer() { + let instruction = Instruction::new_with_bytes( + PROGRAM_KEY, + &[], + vec![AccountMeta::new(Pubkey::new_unique(), true)], + ); + let error = try_encode_vault_transaction(&VAULT_KEY, &[instruction]).unwrap_err(); + + assert!( + error + .to_string() + .starts_with("payload requires 2 signatures"), + "{error}" + ); + } + + #[test] + fn test_the_wrapper_around_a_budget_sized_payload_still_fits() { + let budget = vault_transaction_payload_budget(1); + let payload_size = payload_len(&[instruction_with_data_len( + budget - (AROUND_INSTRUCTION_DATA + 2), + )]); + assert_eq!(payload_size, budget); + + // What Squads stores in place of the payload's own message. The last term is what + // the budget charges rather than what this payload spends, whose data is past 127 + // and so already carries a two-byte legacy prefix. + let transaction_message_len = payload_size + - 32 // recent blockhash a TransactionMessage does not carry + + 1 // address_table_lookups length it always writes + + 1; // the u16 data length, per payload instruction + + // The transaction the app submits at import. Only keys and data lengths decide + // its size, so the discriminators and arguments are stand-ins of the right size. + let member_key = Pubkey::new_unique(); + let transaction_key = Pubkey::new_unique(); + let proposal_key = Pubkey::new_unique(); + let system_program_key = Pubkey::new_unique(); + + let create_data_len = 8 // instruction discriminator + + 1 // vault_index + + 1 // ephemeral_signers + + 4 // transaction_message length (borsh Vec prefix) + + transaction_message_len + + 1; // memo: None + let proposal_create_data_len = 8 // instruction discriminator + + 8 // transaction_index, a u64 + + 1; // draft + let proposal_approve_data_len = 8 // instruction discriminator + + 1; // memo: None + + let wrapper = Message::new( + &[ + ComputeBudgetInstruction::set_compute_unit_limit(0), + ComputeBudgetInstruction::set_compute_unit_price(0), + Instruction::new_with_bytes( + SQUADS_V4_PROGRAM_ID, + &vec![0; create_data_len], + vec![ + AccountMeta::new(MULTISIG_KEY, false), + AccountMeta::new(transaction_key, false), + AccountMeta::new_readonly(member_key, true), + AccountMeta::new(member_key, true), + AccountMeta::new_readonly(system_program_key, false), + ], + ), + Instruction::new_with_bytes( + SQUADS_V4_PROGRAM_ID, + &vec![0; proposal_create_data_len], + vec![ + AccountMeta::new_readonly(MULTISIG_KEY, false), + AccountMeta::new(proposal_key, false), + AccountMeta::new_readonly(member_key, true), + AccountMeta::new(member_key, true), + AccountMeta::new_readonly(system_program_key, false), + ], + ), + Instruction::new_with_bytes( + SQUADS_V4_PROGRAM_ID, + &vec![0; proposal_approve_data_len], + vec![ + AccountMeta::new_readonly(MULTISIG_KEY, false), + AccountMeta::new(member_key, true), + AccountMeta::new(proposal_key, false), + ], + ), + ], + Some(&member_key), + ); + + let wrapper_size = 1 // signature count (shortvec) + + 64 // member signature + + wrapper.serialize().len() + + 2; // what a v0 compile would add over legacy + + // The reserve rounds 381 up to 384, so a payload sized to the budget leaves + // exactly three bytes unspent. Failing here means the derivation beside the + // constant no longer describes the transaction Squads builds. + assert_eq!(wrapper_size, MAX_TRANSACTION_SIZE - 3); + } +} diff --git a/offchain/crates/solana-client-tools/src/transaction.rs b/offchain/crates/solana-client-tools/src/transaction.rs new file mode 100644 index 0000000000..41dbe2a72b --- /dev/null +++ b/offchain/crates/solana-client-tools/src/transaction.rs @@ -0,0 +1,319 @@ +pub const MAX_TRANSACTION_SIZE: usize = 1_232; + +use anyhow::{Context, Result}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{ + hash::Hash, + instruction::Instruction, + message::{AddressLookupTableAccount, VersionedMessage, v0::Message}, + signature::Keypair, + signer::Signer, + transaction::VersionedTransaction, +}; + +pub fn try_new_transaction( + instructions: &[Instruction], + signers: &[&Keypair], + address_lookup_table_accounts: &[AddressLookupTableAccount], + recent_blockhash: Hash, +) -> Result { + let message = Message::try_compile( + &signers[0].pubkey(), + instructions, + address_lookup_table_accounts, + recent_blockhash, + )?; + + VersionedTransaction::try_new(VersionedMessage::V0(message), signers) + .context("Failed to create versioned transaction") +} + +pub fn try_batch_instructions_with_common_signers( + mut instructions_and_compute_units: Vec<(Instruction, u32)>, + signers: &[&Keypair], + address_lookup_table_accounts: &[AddressLookupTableAccount], + allow_compute_price_instruction: bool, + extra_trial_instructions: &[Instruction], +) -> Result>> { + const TRANSACTION_CU_BUFFER: u32 = 5_000; + + instructions_and_compute_units.reverse(); + + let mut batches = Vec::new(); + + let mut last_batch = Vec::new(); + let mut last_compute_units = TRANSACTION_CU_BUFFER; + + while let Some((instruction, compute_units)) = instructions_and_compute_units.pop() { + last_batch.push(instruction); + last_compute_units += compute_units; + + // Build a trial transaction with all compute budget instructions included + // so the size check accounts for the full final transaction size. + let trial_size = trial_transaction_size( + &last_batch, + signers, + address_lookup_table_accounts, + last_compute_units, + allow_compute_price_instruction, + extra_trial_instructions, + )?; + + if trial_size > MAX_TRANSACTION_SIZE { + let instruction = last_batch.pop().unwrap(); + let batch_compute_units = last_compute_units - compute_units; + + let batch = std::mem::replace(&mut last_batch, vec![instruction]); + if batch.is_empty() { + anyhow::bail!( + "single instruction ({trial_size} bytes with compute budget \ + and extra instructions) exceeds the {MAX_TRANSACTION_SIZE}-byte \ + transaction limit" + ); + } + // Only append the CU limit instruction; the caller is responsible + // for appending the price instruction if needed. + let mut batch = batch; + batch.push(ComputeBudgetInstruction::set_compute_unit_limit( + batch_compute_units, + )); + + batches.push(batch); + last_compute_units = TRANSACTION_CU_BUFFER + compute_units; + } + } + + if !last_batch.is_empty() { + last_batch.push(ComputeBudgetInstruction::set_compute_unit_limit( + last_compute_units, + )); + + batches.push(last_batch); + } + + Ok(batches) +} + +/// Build a trial transaction including compute budget instructions and return +/// its serialized size. This gives an accurate measurement of the final +/// transaction size, avoiding the need to estimate CU instruction overhead. +fn trial_transaction_size( + batch: &[Instruction], + signers: &[&Keypair], + address_lookup_table_accounts: &[AddressLookupTableAccount], + compute_units: u32, + include_price_ix: bool, + extra_instructions: &[Instruction], +) -> Result { + let mut instructions = batch.to_vec(); + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_units, + )); + if include_price_ix { + // Use a placeholder price; the actual value doesn't affect serialized size. + instructions.push(ComputeBudgetInstruction::set_compute_unit_price(0)); + } + instructions.extend_from_slice(extra_instructions); + + let transaction = try_new_transaction( + &instructions, + signers, + address_lookup_table_accounts, + Default::default(), + )?; + + Ok(bincode::serialize(&transaction).unwrap().len()) +} + +#[cfg(test)] +mod tests { + use solana_sdk::{instruction::AccountMeta, pubkey::Pubkey}; + + use super::*; + + /// Build a fake instruction that mimics InitializeDeviceHistory: + /// 10 account metas (some shared, some unique per device), ~33 bytes of data. + fn fake_device_history_ix( + program_id: &Pubkey, + oracle_key: &Pubkey, + payer_key: &Pubkey, + shared_keys: &[Pubkey], + metro_history: &Pubkey, + ) -> Instruction { + let device_history = Pubkey::new_unique(); + let device_history_token = Pubkey::new_unique(); + + Instruction { + program_id: *program_id, + accounts: vec![ + AccountMeta::new_readonly(shared_keys[0], false), + AccountMeta::new_readonly(*oracle_key, true), + AccountMeta::new(shared_keys[1], false), + AccountMeta::new(*metro_history, false), + AccountMeta::new(*payer_key, true), + AccountMeta::new(device_history, false), + AccountMeta::new(device_history_token, false), + AccountMeta::new_readonly(shared_keys[2], false), + AccountMeta::new_readonly(shared_keys[3], false), + AccountMeta::new_readonly(shared_keys[4], false), + ], + data: vec![0u8; 33], + } + } + + fn make_ixs(count: usize) -> (Vec<(Instruction, u32)>, Vec) { + let oracle = Keypair::new(); + let payer = Keypair::new(); + let program_id = Pubkey::new_unique(); + let shared_keys: Vec = (0..5).map(|_| Pubkey::new_unique()).collect(); + let metro_history = Pubkey::new_unique(); + let oracle_pk = oracle.pubkey(); + let payer_pk = payer.pubkey(); + + let instructions = (0..count) + .map(|_| { + let ix = fake_device_history_ix( + &program_id, + &oracle_pk, + &payer_pk, + &shared_keys, + &metro_history, + ); + (ix, 50_000u32) + }) + .collect(); + + (instructions, vec![payer, oracle]) + } + + /// All batched transactions must fit within MAX_TRANSACTION_SIZE, even after the + /// caller appends a compute unit price instruction. + fn assert_batches_fit(batches: &[Vec], signers: &[&Keypair], with_price: bool) { + for (i, batch) in batches.iter().enumerate() { + let mut final_batch = batch.clone(); + if with_price { + final_batch.push(ComputeBudgetInstruction::set_compute_unit_price(1_000)); + } + let tx = try_new_transaction(&final_batch, signers, &[], Default::default()).unwrap(); + let size = bincode::serialize(&tx).unwrap().len(); + assert!( + size <= MAX_TRANSACTION_SIZE, + "batch {i}: {size} bytes exceeds {MAX_TRANSACTION_SIZE}-byte limit" + ); + } + } + + #[test] + fn test_batching_128_instructions_with_price() { + let (instructions, keys) = make_ixs(128); + let signers: Vec<&Keypair> = keys.iter().collect(); + + let batches = + try_batch_instructions_with_common_signers(instructions, &signers, &[], true, &[]) + .expect("batching should succeed"); + + assert!( + batches.len() > 1, + "128 instructions should require multiple batches" + ); + assert_batches_fit(&batches, &signers, true); + } + + #[test] + fn test_batching_128_instructions_without_price() { + let (instructions, keys) = make_ixs(128); + let signers: Vec<&Keypair> = keys.iter().collect(); + + let batches = + try_batch_instructions_with_common_signers(instructions, &signers, &[], false, &[]) + .expect("batching should succeed"); + + assert!(batches.len() > 1); + assert_batches_fit(&batches, &signers, false); + } + + #[test] + fn test_batching_single_instruction() { + let (instructions, keys) = make_ixs(1); + let signers: Vec<&Keypair> = keys.iter().collect(); + + let batches = + try_batch_instructions_with_common_signers(instructions, &signers, &[], true, &[]) + .expect("single instruction should batch"); + + assert_eq!(batches.len(), 1); + assert_batches_fit(&batches, &signers, true); + } + + #[test] + fn test_batching_with_extra_trial_instructions() { + let (instructions, keys) = make_ixs(128); + let signers: Vec<&Keypair> = keys.iter().collect(); + + // A memo instruction similar to what callers actually pass. + let memo_program_id: Pubkey = "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr" + .parse() + .unwrap(); + let memo_ix = Instruction { + program_id: memo_program_id, + accounts: vec![AccountMeta::new_readonly(signers[0].pubkey(), true)], + data: b"test memo".to_vec(), + }; + + let batches = try_batch_instructions_with_common_signers( + instructions, + &signers, + &[], + true, + std::slice::from_ref(&memo_ix), + ) + .expect("batching with memo should succeed"); + + assert!( + batches.len() > 1, + "128 instructions with memo should require multiple batches" + ); + + // Each batch must still fit when we append the extra instructions + // the caller will add at send time (CU price + memo). + for (i, batch) in batches.iter().enumerate() { + let mut final_batch = batch.clone(); + final_batch.push(ComputeBudgetInstruction::set_compute_unit_price(1_000)); + final_batch.push(memo_ix.clone()); + let tx = try_new_transaction(&final_batch, &signers, &[], Default::default()).unwrap(); + let size = bincode::serialize(&tx).unwrap().len(); + assert!( + size <= MAX_TRANSACTION_SIZE, + "batch {i}: {size} bytes exceeds {MAX_TRANSACTION_SIZE}-byte limit" + ); + } + } + + #[test] + fn test_batching_oversized_single_instruction_errors() { + let payer = Keypair::new(); + let signers: Vec<&Keypair> = vec![&payer]; + + // Craft an instruction with enough data to exceed MAX_TRANSACTION_SIZE on its own. + let oversized_ix = Instruction { + program_id: Pubkey::new_unique(), + accounts: vec![AccountMeta::new(payer.pubkey(), true)], + data: vec![0u8; MAX_TRANSACTION_SIZE], + }; + + let result = try_batch_instructions_with_common_signers( + vec![(oversized_ix, 100_000)], + &signers, + &[], + true, + &[], + ); + + assert!(result.is_err()); + let err_msg = result.unwrap_err().to_string(); + assert!( + err_msg.contains("single instruction"), + "expected oversized-instruction error, got: {err_msg}" + ); + } +} diff --git a/offchain/crates/solana-client-tools/tests/memo_compute_units.rs b/offchain/crates/solana-client-tools/tests/memo_compute_units.rs new file mode 100644 index 0000000000..2eb89fb771 --- /dev/null +++ b/offchain/crates/solana-client-tools/tests/memo_compute_units.rs @@ -0,0 +1,44 @@ +use doublezero_solana_client_tools::payer::Wallet; +use solana_program_test::ProgramTest; +use solana_sdk::{signature::Signer, transaction::Transaction}; + +// Calibration guard for Wallet::memo_compute_units. Runs the real spl-memo v3 +// program (bundled by solana-program-test) across a range of byte lengths and +// confirms the estimate stays a safe ceiling over actual consumption without +// grossly over provisioning. A toolchain bump that moves the program cost trips +// this test. +#[tokio::test] +async fn memo_compute_units_covers_actual_consumption() { + let (banks_client, payer, recent_blockhash) = ProgramTest::default().start().await; + + // Spans the lengths callers use ("Relay" is 5 bytes, the validator deposit + // memos run to about 32) plus larger samples to confirm the line holds. + let lengths = [0, 5, 6, 24, 32, 64, 128, 256]; + for len in lengths { + let memo = vec![b'a'; len]; + let (memo_ix, memo_cu) = Wallet::build_memo_instruction_with_compute_units(&memo); + let transaction = Transaction::new_signed_with_payer( + &[memo_ix], + Some(&payer.pubkey()), + &[&payer], + recent_blockhash, + ); + let outcome = banks_client + .process_transaction_with_metadata(transaction) + .await + .unwrap(); + assert!(outcome.result.is_ok(), "len {len}: {:?}", outcome.result); + + let consumed = outcome.metadata.unwrap().compute_units_consumed; + let memo_cu = u64::from(memo_cu); + assert!( + memo_cu >= consumed, + "len {len}: estimate {memo_cu} below consumed {consumed}" + ); + // Guard against regressing to a wasteful flat over-estimate. + assert!( + memo_cu <= consumed * 2, + "len {len}: estimate {memo_cu} more than double consumed {consumed}" + ); + } +} diff --git a/offchain/crates/solana-fork/CHANGELOG.md b/offchain/crates/solana-fork/CHANGELOG.md new file mode 100644 index 0000000000..e236273cfd --- /dev/null +++ b/offchain/crates/solana-fork/CHANGELOG.md @@ -0,0 +1,24 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- add `--synthetic-validator-client-rewards-manager ` flag that bakes a `ValidatorClientRewards` PDA for `client_id=65535` with the given manager into the fork at genesis, for exercising `shreds validator-client-rewards claim` in fork tests +- build the synthetic `ValidatorClientRewards` account from the SDK's `Pod` mirror instead of copying bytes to hand-written offsets, so its size and field offsets follow the mirror rather than a separate constant table +- the environment variable clap derives from that flag moved with its rename, from `SYNTHETIC_VCR_MANAGER` to `SYNTHETIC_VALIDATOR_CLIENT_REWARDS_MANAGER`. A value left under the old name is ignored rather than rejected, so the fork boots with no synthetic account and `sh/test_doublezero_solana_fork.sh` fails later at the first `validator-client-rewards show` +- Load shred-subscription program and its accounts into the fork so CLI smoke tests (e.g. `shreds publisher-rewards`) can run end-to-end. +- revert: seed journal and fills registry in localnet fork ([#322](https://github.com/doublezerofoundation/doublezero-offchain/pull/322)) +- seed journal and fills registry in localnet fork ([#309](https://github.com/doublezerofoundation/doublezero-offchain/pull/309)) + +## [0.0.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-solana-fork-cli/v0.0.1) - 2025-10-22 + +- fetch journal ATA ([#266](https://github.com/doublezerofoundation/doublezero-offchain/pull/266)) +- add `--next-completed-dz-epoch-override` ([#240](https://github.com/doublezerofoundation/doublezero-offchain/pull/240)) +- replace `spl-token` with `spl-token-interface` ([#232](https://github.com/doublezerofoundation/doublezero-offchain/pull/232)) +- use `doublezero-solana-sdk` as dependency ([#225](https://github.com/doublezerofoundation/doublezero-offchain/pull/225)) +- add god mode ([#146](https://github.com/doublezerofoundation/doublezero-offchain/pull/146)) +- add doublezero-solana-fork-cli ([#140](https://github.com/doublezerofoundation/doublezero-offchain/pull/140)) diff --git a/offchain/crates/solana-fork/Cargo.toml b/offchain/crates/solana-fork/Cargo.toml new file mode 100644 index 0000000000..8a59d29d7d --- /dev/null +++ b/offchain/crates/solana-fork/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "doublezero-solana-fork-cli" +version = "0.0.1" + +# Workspace inherited keys +edition.workspace = true +authors.workspace = true +readme.workspace = true +license.workspace = true +repository.workspace = true +homepage.workspace = true + +[dependencies] +anyhow.workspace = true +base64.workspace = true +borsh.workspace = true +bytemuck.workspace = true +clap.workspace = true +doublezero-solana-client-tools.workspace = true +doublezero-solana-sdk.workspace = true +serde.workspace = true +serde_json.workspace = true +solana-account-decoder-client-types.workspace = true +solana-client.workspace = true +solana-sdk.workspace = true +spl-associated-token-account-interface.workspace = true +spl-token-interface.workspace = true +tokio.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true + +[[bin]] +name = "doublezero-solana-fork" +path = "src/main.rs" diff --git a/offchain/crates/solana-fork/src/main.rs b/offchain/crates/solana-fork/src/main.rs new file mode 100644 index 0000000000..67b5f4afc4 --- /dev/null +++ b/offchain/crates/solana-fork/src/main.rs @@ -0,0 +1,711 @@ +use std::{fs, process::Command}; + +use anyhow::{Context, Result, ensure}; +use base64::{Engine, engine::general_purpose::STANDARD as BASE64}; +use clap::Parser; +use doublezero_solana_client_tools::{ + payer::try_load_keypair, + rpc::{SolanaConnection, SolanaConnectionOptions}, +}; +use doublezero_solana_sdk::{ + NetworkEnvironment, PrecomputedDiscriminator, environment_2z_token_mint_key, + passport::{ID as PASSPORT_PROGRAM_ID, state::ProgramConfig as PassportProgramConfig}, + revenue_distribution::{ + self, ID as REVENUE_DISTRIBUTION_PROGRAM_ID, + state::{Distribution, Journal, ProgramConfig as RevenueDistributionProgramConfig}, + types::DoubleZeroEpoch, + }, + shred_subscription::{ + ID as SHRED_SUBSCRIPTION_PROGRAM_ID, + state::{ValidatorClientRewards, find_validator_client_rewards_address}, + }, + sol_conversion::{ + ID as SOL_CONVERSION_PROGRAM_ID, state::ProgramState as SolConversionProgramState, + }, + zero_copy, +}; +use serde::{Deserialize, Serialize}; +use solana_account_decoder_client_types::UiAccountEncoding; +use solana_client::rpc_config::{RpcAccountInfoConfig, RpcProgramAccountsConfig}; +use solana_sdk::{ + account::Account, program_pack::Pack, pubkey::Pubkey, rent::Rent, signer::Signer, +}; +use spl_token_interface::state::Mint; +use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt}; + +const ACCOUNTS_PATH: &str = "forked-accounts"; +const TMP_ACCOUNTS_PATH: &str = "forked-accounts.tmp"; + +#[derive(Deserialize, Serialize)] +struct WrittenAccountInfo { + lamports: u64, + data: (String, String), + owner: String, + executable: bool, + #[serde(rename = "rentEpoch")] + rent_epoch: u64, + space: usize, +} + +#[derive(Deserialize, Serialize)] +struct WrittenAccount { + pubkey: String, + account: WrittenAccountInfo, +} + +#[derive(Parser, Debug)] +#[command(term_width = 0)] +#[command(version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")))] +#[command(about = "Solana local validator fork of DoubleZero programs", long_about = None)] +struct Args { + /// Upgrade authority for the program (defaults to pubkey from Solana config + /// keypair). + #[arg(long, value_name = "PUBKEY")] + upgrade_authority: Option, + + /// Reset accounts by fetching fresh data, overwriting existing accounts. + #[arg(long)] + reset: bool, + + /// Hidden god-mode command, which will overwrite admin and other + /// authorities with the upgrade authority. + #[arg(long, hide = true)] + god_mode: bool, + + /// Override the next completed DZ epoch to the specified epoch. This option + /// can only be used in combination with --god-mode and can only be less + /// than the forked next completed DZ epoch found in the Revenue + /// Distribution config account. + #[arg(long, value_name = "EPOCH")] + next_completed_dz_epoch_override: Option, + + /// Pubkey to use as the manager of a synthetic ValidatorClientRewards PDA + /// (`client_id=65535`). When set, the fork loader bakes the account at + /// genesis so the fork test can exercise `validator-client-rewards claim`. + /// Defaults to disabled. + #[arg(long, env, value_name = "PUBKEY")] + synthetic_validator_client_rewards_manager: Option, + + #[command(flatten)] + solana_connection_options: SolanaConnectionOptions, +} + +#[tokio::main] +async fn main() -> Result<()> { + tracing_subscriber::registry() + .with(EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"))) + .with( + tracing_subscriber::fmt::layer() + .with_target(false) + .with_thread_ids(false) + .with_thread_names(false), + ) + .init(); + + let Args { + upgrade_authority: upgrade_authority_key, + reset: should_reset, + god_mode: should_god_mode, + next_completed_dz_epoch_override, + synthetic_validator_client_rewards_manager, + solana_connection_options, + } = Args::parse(); + + ensure!( + next_completed_dz_epoch_override.is_none() || should_god_mode, + "--next-completed-dz-epoch-override can only be used in combination with --god-mode" + ); + + let connection = SolanaConnection::from(solana_connection_options); + let network_env = connection.try_network_environment().await?; + + // Get upgrade authority from argument or default keypair. + let upgrade_authority_key = match upgrade_authority_key { + Some(key) => key, + None => { + let keypair = try_load_keypair(None)?; + keypair.pubkey() + } + }; + + // Warn if god mode is enabled but reset is not. + if should_god_mode && !should_reset { + tracing::warn!( + "--god-mode was passed but --reset was not. God mode will not apply without resetting accounts" + ); + } + + if should_reset { + // Clean up any leftover temporary directory from previous failed runs. + if fs::metadata(TMP_ACCOUNTS_PATH).is_ok() { + fs::remove_dir_all(TMP_ACCOUNTS_PATH)?; + } + + // Remove existing accounts directory if it exists. + if fs::metadata(ACCOUNTS_PATH).is_ok() { + fs::remove_dir_all(ACCOUNTS_PATH)?; + } + + fs::create_dir_all(TMP_ACCOUNTS_PATH)?; + + match try_fetch_and_write_accounts( + &connection, + network_env, + upgrade_authority_key, + should_god_mode, + next_completed_dz_epoch_override, + ) + .await + { + Ok(_) => { + // Optionally bake a synthetic ValidatorClientRewards PDA into + // the fork. Used by fork tests to exercise + // `validator-client-rewards claim` without needing the + // shred-subscription admin keypair. + if let Some(ref manager) = synthetic_validator_client_rewards_manager + && let Err(e) = try_write_synthetic_validator_client_rewards_account( + manager, + TMP_ACCOUNTS_PATH, + ) + { + fs::remove_dir_all(TMP_ACCOUNTS_PATH)?; + return Err(e); + } + // Rename temporary directory to final location. + fs::rename(TMP_ACCOUNTS_PATH, ACCOUNTS_PATH)?; + } + Err(e) => { + fs::remove_dir_all(TMP_ACCOUNTS_PATH)?; + return Err(e); + } + } + } else { + // Ensure ACCOUNTS_PATH exists when not resetting. + ensure!( + fs::metadata(ACCOUNTS_PATH).is_ok(), + "Directory {ACCOUNTS_PATH} does not exist. Run with --reset to fetch accounts from the network" + ); + } + + // Check if solana-test-validator is available. + let check = Command::new("which") + .arg("solana-test-validator") + .output()?; + + ensure!( + check.status.success(), + "solana-test-validator not found. Please install Solana CLI tools" + ); + + let mut command = Command::new("solana-test-validator"); + command + .arg("--url") + .arg(connection.url()) + .arg("--account-dir") + .arg(ACCOUNTS_PATH) + .arg("--upgradeable-program") + .arg(REVENUE_DISTRIBUTION_PROGRAM_ID.to_string()) + .arg(format!("{ACCOUNTS_PATH}/revenue_distribution.so")) + .arg(upgrade_authority_key.to_string()) + .arg("--upgradeable-program") + .arg(PASSPORT_PROGRAM_ID.to_string()) + .arg(format!("{ACCOUNTS_PATH}/passport.so")) + .arg(upgrade_authority_key.to_string()) + .arg("--upgradeable-program") + .arg(SOL_CONVERSION_PROGRAM_ID.to_string()) + .arg(format!("{ACCOUNTS_PATH}/sol_conversion.so")) + .arg(upgrade_authority_key.to_string()) + .arg("--upgradeable-program") + .arg(SHRED_SUBSCRIPTION_PROGRAM_ID.to_string()) + .arg(format!("{ACCOUNTS_PATH}/shred_subscription.so")) + .arg(upgrade_authority_key.to_string()); + + if should_reset { + command.arg("--reset"); + } + + let status = command.status()?; + + ensure!( + status.success(), + "solana-test-validator exited with status: {status}" + ); + + Ok(()) +} + +// + +async fn try_fetch_and_write_accounts( + connection: &SolanaConnection, + network_env: NetworkEnvironment, + upgrade_authority_key: Pubkey, + should_god_mode: bool, + next_completed_dz_epoch_override: Option, +) -> Result<()> { + // Fetch 2Z mint account. + + let token_2z_mint_key = environment_2z_token_mint_key(network_env); + + let mint_account = connection.get_account(&token_2z_mint_key).await?; + try_write_account_to_file(&token_2z_mint_key, &mint_account, TMP_ACCOUNTS_PATH)?; + tracing::info!("Wrote 2Z SPL mint account to {TMP_ACCOUNTS_PATH}/"); + + // Fetch program accounts. + + let config = RpcProgramAccountsConfig { + filters: None, + account_config: RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + ..Default::default() + }, + ..Default::default() + }; + + // Fetch all program accounts. + + try_fetch_and_write_program_accounts( + connection, + &REVENUE_DISTRIBUTION_PROGRAM_ID, + "Revenue Distribution", + TMP_ACCOUNTS_PATH, + &config, + ) + .await?; + + try_fetch_and_write_program_accounts( + connection, + &PASSPORT_PROGRAM_ID, + "Passport", + TMP_ACCOUNTS_PATH, + &config, + ) + .await?; + + try_fetch_and_write_program_accounts( + connection, + &SOL_CONVERSION_PROGRAM_ID, + "SOL Conversion", + TMP_ACCOUNTS_PATH, + &config, + ) + .await?; + + try_fetch_and_write_program_accounts( + connection, + &SHRED_SUBSCRIPTION_PROGRAM_ID, + "Shred Subscription", + TMP_ACCOUNTS_PATH, + &config, + ) + .await?; + + // Dump programs. + + try_dump_program( + connection, + &REVENUE_DISTRIBUTION_PROGRAM_ID, + "Revenue Distribution", + &format!("{TMP_ACCOUNTS_PATH}/revenue_distribution.so"), + )?; + + try_dump_program( + connection, + &PASSPORT_PROGRAM_ID, + "Passport", + &format!("{TMP_ACCOUNTS_PATH}/passport.so"), + )?; + + try_dump_program( + connection, + &SOL_CONVERSION_PROGRAM_ID, + "SOL Conversion", + &format!("{TMP_ACCOUNTS_PATH}/sol_conversion.so"), + )?; + + try_dump_program( + connection, + &SHRED_SUBSCRIPTION_PROGRAM_ID, + "Shred Subscription", + &format!("{TMP_ACCOUNTS_PATH}/shred_subscription.so"), + )?; + + if should_god_mode { + tracing::info!("God mode enabled"); + + let forked_next_completed_dz_epoch = try_modify_zero_copy_account::< + RevenueDistributionProgramConfig, + _, + >( + &RevenueDistributionProgramConfig::find_address().0, + TMP_ACCOUNTS_PATH, + |config| { + let forked_next_completed_dz_epoch = config.next_completed_dz_epoch.value(); + + config.admin_key = upgrade_authority_key; + config.debt_accountant_key = upgrade_authority_key; + config.rewards_accountant_key = upgrade_authority_key; + config.contributor_manager_key = upgrade_authority_key; + config.last_initialized_distribution_timestamp = Default::default(); + + let distribution_params = &mut config.distribution_parameters; + distribution_params.calculation_grace_period_minutes = 1; + distribution_params.initialization_grace_period_minutes = 1; + + if let Some(dz_epoch) = next_completed_dz_epoch_override { + if dz_epoch > forked_next_completed_dz_epoch { + tracing::warn!( + "DZ epoch {dz_epoch} override is greater than forked DZ epoch {forked_next_completed_dz_epoch}. Ignoring --next-completed-dz-epoch-override" + ); + } else { + tracing::info!("Overriding next completed DZ epoch to {dz_epoch}"); + config.next_completed_dz_epoch = DoubleZeroEpoch::new(dz_epoch); + } + } + + forked_next_completed_dz_epoch + }, + )?; + tracing::info!("Updated Revenue Distribution config authorities"); + + if let Some(next_completed_dz_epoch_override) = next_completed_dz_epoch_override { + for dz_epoch in next_completed_dz_epoch_override..forked_next_completed_dz_epoch { + let (distribution_key, _) = + Distribution::find_address(DoubleZeroEpoch::new(dz_epoch)); + + // Remove the file representing this distribution key. + let path = format!("{TMP_ACCOUNTS_PATH}/{distribution_key}.json"); + if fs::metadata(&path).is_ok() { + fs::remove_file(&path)?; + tracing::info!("Removed distribution account for epoch {dz_epoch}"); + } + } + } + + try_modify_zero_copy_account::( + &PassportProgramConfig::find_address().0, + TMP_ACCOUNTS_PATH, + |config| { + config.admin_key = upgrade_authority_key; + config.sentinel_key = upgrade_authority_key; + }, + )?; + tracing::info!("Updated Passport config authorities"); + + try_modify_borsh_account::( + &SolConversionProgramState::find_address().0, + TMP_ACCOUNTS_PATH, + |config| { + config.admin_key = upgrade_authority_key; + config.last_trade_slot = 0; + config.deny_list_authority = upgrade_authority_key; + }, + )?; + tracing::info!("Updated SOL Conversion config authorities"); + + // Override mint authority. + + let mint_path = format!("{TMP_ACCOUNTS_PATH}/{token_2z_mint_key}.json"); + let mint_json = fs::read_to_string(&mint_path) + .with_context(|| format!("Failed to read mint account file: {mint_path}"))?; + let mut mint_wrapper = serde_json::from_str::(&mint_json)?; + let mut mint_data = BASE64.decode(&mint_wrapper.account.data.0)?; + + let mut mint = Mint::unpack(&mint_data)?; + mint.mint_authority = upgrade_authority_key.into(); + + Mint::pack(mint, &mut mint_data)?; + mint_wrapper.account.data.0 = BASE64.encode(&mint_data); + try_write_wrapped_account_to_file(&token_2z_mint_key, &mint_wrapper, TMP_ACCOUNTS_PATH)?; + } + + // Fetch various 2Z Token accounts. + + let mut token_account_keys = Vec::new(); + + let (revenue_distribution_config_key, _) = RevenueDistributionProgramConfig::find_address(); + token_account_keys.push( + revenue_distribution::state::find_2z_token_pda_address(&revenue_distribution_config_key).0, + ); + + let (swap_authority_key, _) = revenue_distribution::state::find_swap_authority_address(); + token_account_keys + .push(revenue_distribution::state::find_2z_token_pda_address(&swap_authority_key).0); + + let (journal_key, _) = Journal::find_address(); + token_account_keys.push(revenue_distribution::state::find_2z_token_pda_address(&journal_key).0); + + let journal_ata_key = + spl_associated_token_account_interface::address::get_associated_token_address( + &journal_key, + &token_2z_mint_key, + ); + token_account_keys.push(journal_ata_key); + + // For existing distributions, fetch the 2Z token PDAs. Read the + // Revenue Distribution config account file to deserialize the data + // and read the next completed DZ epoch. + let (_, revenue_distribution_config, _) = + try_read_zero_copy_account::( + &revenue_distribution_config_key, + TMP_ACCOUNTS_PATH, + )?; + + let forked_next_completed_dz_epoch = + revenue_distribution_config.next_completed_dz_epoch.value(); + let next_completed_dz_epoch = next_completed_dz_epoch_override + .unwrap_or(forked_next_completed_dz_epoch) + .min(forked_next_completed_dz_epoch); + for epoch in 0..next_completed_dz_epoch { + let (distribution_key, _) = Distribution::find_address(DoubleZeroEpoch::new(epoch)); + token_account_keys + .push(revenue_distribution::state::find_2z_token_pda_address(&distribution_key).0); + } + + // Fetch all 2Z token PDA accounts, chunking 100 accounts at a time. + for token_pda_keys_chunk in token_account_keys.chunks(100) { + let token_accounts = connection + .get_multiple_accounts(token_pda_keys_chunk) + .await?; + for (key, token_account) in token_pda_keys_chunk.iter().zip(token_accounts) { + let account = token_account + .as_ref() + .with_context(|| format!("Account does not exist: {}", key))?; + try_write_account_to_file(key, account, TMP_ACCOUNTS_PATH)?; + } + } + + let token_pda_keys_len = token_account_keys.len(); + tracing::info!( + "Wrote {} 2Z token account{} to {TMP_ACCOUNTS_PATH}/", + token_pda_keys_len, + if token_pda_keys_len == 1 { "" } else { "s" } + ); + + Ok(()) +} + +fn try_read_zero_copy_account( + account_key: &Pubkey, + accounts_dir: &str, +) -> Result<(WrittenAccount, Box, Vec)> +where + T: PrecomputedDiscriminator + bytemuck::Pod, +{ + let path = format!("{accounts_dir}/{account_key}.json"); + let json = fs::read_to_string(&path) + .with_context(|| format!("Failed to read account file: {path}"))?; + let wrapper = serde_json::from_str::(&json)?; + let data = BASE64.decode(&wrapper.account.data.0)?; + + let (mucked_data, remaining_data) = zero_copy::checked_from_bytes_with_discriminator(&data) + .map(|data| (Box::new(*data.0), data.1)) + .unwrap(); + + Ok((wrapper, mucked_data, remaining_data.to_vec())) +} + +fn try_modify_zero_copy_account( + account_key: &Pubkey, + accounts_dir: &str, + modify_fn: impl FnOnce(&mut T) -> U, +) -> Result +where + T: PrecomputedDiscriminator + bytemuck::Pod, +{ + let (wrapper, mut mucked_data, remaining_data) = + try_read_zero_copy_account::(account_key, accounts_dir)?; + + let out = modify_fn(&mut mucked_data); + + let mut modified_data = Vec::with_capacity(zero_copy::data_end::() + remaining_data.len()); + modified_data.extend_from_slice(T::discriminator_slice()); + modified_data.extend_from_slice(bytemuck::bytes_of(&*mucked_data)); + modified_data.extend_from_slice(&remaining_data); + + let modified_account = Account { + lamports: wrapper.account.lamports, + data: modified_data, + owner: wrapper.account.owner.parse()?, + executable: wrapper.account.executable, + rent_epoch: wrapper.account.rent_epoch, + }; + + try_write_account_to_file(account_key, &modified_account, accounts_dir)?; + + Ok(out) +} + +fn try_read_borsh_account( + account_key: &Pubkey, + accounts_dir: &str, +) -> Result<(WrittenAccount, Box)> +where + T: PrecomputedDiscriminator + borsh::BorshDeserialize, +{ + let path = format!("{accounts_dir}/{account_key}.json"); + let json = fs::read_to_string(&path) + .with_context(|| format!("Failed to read account file: {path}"))?; + let wrapper = serde_json::from_str::(&json)?; + let data = BASE64.decode(&wrapper.account.data.0)?; + + ensure!( + data.len() > 8 && &data[..8] == T::discriminator_slice(), + "Invalid discriminator for account: {account_key}", + ); + + let borshed_data = T::deserialize(&mut &data[8..]).map(Box::new)?; + + Ok((wrapper, borshed_data)) +} + +fn try_modify_borsh_account( + account_key: &Pubkey, + accounts_dir: &str, + modify_fn: impl FnOnce(&mut Box), +) -> Result<()> +where + T: PrecomputedDiscriminator + borsh::BorshDeserialize + borsh::BorshSerialize, +{ + let (wrapper, mut borshed_data) = try_read_borsh_account::(account_key, accounts_dir)?; + + modify_fn(&mut borshed_data); + + let serialized_data = borsh::to_vec(&borshed_data)?; + let mut modified_data = Vec::with_capacity(8 + serialized_data.len()); + modified_data.extend_from_slice(T::discriminator_slice()); + modified_data.extend_from_slice(&serialized_data); + + let modified_account = Account { + lamports: wrapper.account.lamports, + data: modified_data, + owner: wrapper.account.owner.parse()?, + executable: wrapper.account.executable, + rent_epoch: wrapper.account.rent_epoch, + }; + + try_write_account_to_file(account_key, &modified_account, accounts_dir) +} + +fn try_write_account_to_file( + account_key: &Pubkey, + account: &Account, + accounts_dir: &str, +) -> Result<()> { + let wrapper = WrittenAccount { + pubkey: account_key.to_string(), + account: WrittenAccountInfo { + lamports: account.lamports, + data: (BASE64.encode(&account.data), "base64".to_string()), + owner: account.owner.to_string(), + executable: account.executable, + rent_epoch: account.rent_epoch, + space: account.data.len(), + }, + }; + + try_write_wrapped_account_to_file(account_key, &wrapper, accounts_dir) +} + +fn try_write_wrapped_account_to_file( + account_key: &Pubkey, + wrapper: &WrittenAccount, + accounts_dir: &str, +) -> Result<()> { + let json = serde_json::to_string_pretty(&wrapper)?; + let file_path = format!("{accounts_dir}/{account_key}.json"); + fs::write(&file_path, json).map_err(Into::into) +} + +async fn try_fetch_and_write_program_accounts( + connection: &SolanaConnection, + program_id: &Pubkey, + program_name: &str, + accounts_dir: &str, + config: &RpcProgramAccountsConfig, +) -> Result { + let accounts = connection + .get_program_accounts_with_config(program_id, config.clone()) + .await?; + + for (key, account) in &accounts { + try_write_account_to_file(key, account, accounts_dir)?; + } + + let accounts_len = accounts.len(); + tracing::info!( + "Wrote {} {program_name} account{} to {accounts_dir}/", + accounts_len, + if accounts_len == 1 { "" } else { "s" }, + ); + + Ok(accounts_len) +} + +fn try_dump_program( + connection: &SolanaConnection, + program_id: &Pubkey, + program_name: &str, + output_path: &str, +) -> Result<()> { + tracing::info!("Dumping {} program to {}...", program_name, output_path); + + let dump_status = Command::new("solana") + .arg("program") + .arg("dump") + .arg("--url") + .arg(connection.url()) + .arg(program_id.to_string()) + .arg(output_path) + .status()?; + + ensure!( + dump_status.success(), + "solana program dump exited with status: {}", + dump_status + ); + + tracing::info!("{} program dumped successfully", program_name); + Ok(()) +} + +const SYNTHETIC_VALIDATOR_CLIENT_REWARDS_CLIENT_ID: u16 = 65535; + +/// Bake a synthetic `ValidatorClientRewards` PDA into the fork's accounts +/// directory. `manager_key` is the test-wallet pubkey (the same key that +/// the fork test uses as `-k` for the `claim` command). +fn try_write_synthetic_validator_client_rewards_account( + manager_key: &Pubkey, + accounts_dir: &str, +) -> Result<()> { + let (validator_client_rewards_key, bump) = + find_validator_client_rewards_address(SYNTHETIC_VALIDATOR_CLIENT_REWARDS_CLIENT_ID); + let mut validator_client_rewards = ValidatorClientRewards::default(); + validator_client_rewards.client_id = SYNTHETIC_VALIDATOR_CLIENT_REWARDS_CLIENT_ID; + validator_client_rewards.bump_seed = bump; + validator_client_rewards.manager_key = *manager_key; + + let mut data = Vec::with_capacity(zero_copy::data_end::()); + data.extend_from_slice(ValidatorClientRewards::discriminator_slice()); + data.extend_from_slice(bytemuck::bytes_of(&validator_client_rewards)); + + let rent = Rent::default(); + let lamports = rent.minimum_balance(data.len()); + + let account = Account { + lamports, + data, + owner: *SHRED_SUBSCRIPTION_PROGRAM_ID, + executable: false, + rent_epoch: 0, + }; + + tracing::info!( + "Baking synthetic ValidatorClientRewards (client_id={}, manager={}) at {} into {}", + SYNTHETIC_VALIDATOR_CLIENT_REWARDS_CLIENT_ID, + manager_key, + validator_client_rewards_key, + accounts_dir, + ); + try_write_account_to_file(&validator_client_rewards_key, &account, accounts_dir) +} diff --git a/offchain/crates/solana-interface/sol-conversion/CHANGELOG.md b/offchain/crates/solana-interface/sol-conversion/CHANGELOG.md new file mode 100644 index 0000000000..8a5cc52149 --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/CHANGELOG.md @@ -0,0 +1,15 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.0.1](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/doublezero-sol-conversion-interface/v0.0.1) - 2025-10-22 + +- replace `spl-token` with `spl-token-interface` ([#232](https://github.com/doublezerofoundation/doublezero-offchain/pull/232)) +- add SOL conversion commands ([#159](https://github.com/doublezerofoundation/doublezero-offchain/pull/159)) +- add god mode ([#146](https://github.com/doublezerofoundation/doublezero-offchain/pull/146)) +- add sol-conversion-admin-cli ([#156](https://github.com/doublezerofoundation/doublezero-offchain/pull/156)) diff --git a/offchain/crates/solana-interface/sol-conversion/Cargo.toml b/offchain/crates/solana-interface/sol-conversion/Cargo.toml new file mode 100644 index 0000000000..e5573ef517 --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "doublezero-sol-conversion-interface" +version = "0.0.1" + +# Workspace inherited keys +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +borsh.workspace = true +bytemuck.workspace = true +doublezero-program-tools.workspace = true +doublezero-revenue-distribution.workspace = true +serde = { optional = true, workspace = true } +solana-instruction.workspace = true +solana-pubkey.workspace = true +solana-system-interface.workspace = true +spl-token-interface.workspace = true + +[features] +serde = ["dep:serde"] diff --git a/offchain/crates/solana-interface/sol-conversion/src/instruction/account.rs b/offchain/crates/solana-interface/sol-conversion/src/instruction/account.rs new file mode 100644 index 0000000000..8ee289a9b8 --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/src/instruction/account.rs @@ -0,0 +1,267 @@ +use doublezero_program_tools::get_program_data_address; +use doublezero_revenue_distribution::{ID as REVENUE_DISTRIBUTION_PROGRAM_ID, state as dz_state}; +use solana_instruction::AccountMeta; +use solana_pubkey::Pubkey; + +use crate::{ + ID, + state::{ConfigurationRegistry, DenyListRegistry, ProgramState}, +}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeSystemAccounts { + pub new_configuration_registry_key: Pubkey, + pub new_program_state_key: Pubkey, + pub new_deny_list_registry_key: Pubkey, + pub fills_registry_key: Pubkey, + pub withdraw_authority_key: Pubkey, + pub program_data_key: Pubkey, + pub upgrade_authority_key: Pubkey, +} + +impl InitializeSystemAccounts { + pub fn new(fills_registry_key: &Pubkey, upgrade_authority_key: &Pubkey) -> Self { + Self { + new_configuration_registry_key: ConfigurationRegistry::find_address().0, + new_program_state_key: ProgramState::find_address().0, + new_deny_list_registry_key: DenyListRegistry::find_address().0, + fills_registry_key: *fills_registry_key, + withdraw_authority_key: dz_state::find_withdraw_sol_authority_address(&ID).0, + program_data_key: get_program_data_address(&ID).0, + upgrade_authority_key: *upgrade_authority_key, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeSystemAccounts) -> Self { + let InitializeSystemAccounts { + new_configuration_registry_key, + new_program_state_key, + new_deny_list_registry_key, + fills_registry_key, + withdraw_authority_key, + program_data_key, + upgrade_authority_key, + } = accounts; + + vec![ + AccountMeta::new(new_configuration_registry_key, false), + AccountMeta::new(new_program_state_key, false), + AccountMeta::new(new_deny_list_registry_key, false), + AccountMeta::new(fills_registry_key, false), + AccountMeta::new_readonly(withdraw_authority_key, false), + AccountMeta::new_readonly(ID, false), + AccountMeta::new_readonly(program_data_key, false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + AccountMeta::new(upgrade_authority_key, true), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct UpdateConfigurationRegistryAccounts { + pub configuration_registry_key: Pubkey, + pub program_state_key: Pubkey, + pub admin_key: Pubkey, +} + +impl UpdateConfigurationRegistryAccounts { + pub fn new(admin_key: &Pubkey) -> Self { + Self { + configuration_registry_key: ConfigurationRegistry::find_address().0, + program_state_key: ProgramState::find_address().0, + admin_key: *admin_key, + } + } +} + +impl From for Vec { + fn from(accounts: UpdateConfigurationRegistryAccounts) -> Self { + let UpdateConfigurationRegistryAccounts { + configuration_registry_key, + program_state_key, + admin_key, + } = accounts; + + vec![ + AccountMeta::new(configuration_registry_key, false), + AccountMeta::new_readonly(program_state_key, false), + AccountMeta::new_readonly(admin_key, true), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SetFillsConsumerAccounts { + pub configuration_registry_key: Pubkey, + pub program_state_key: Pubkey, + pub admin_key: Pubkey, +} + +impl SetFillsConsumerAccounts { + pub fn new(admin_key: &Pubkey) -> Self { + Self { + configuration_registry_key: ConfigurationRegistry::find_address().0, + program_state_key: ProgramState::find_address().0, + admin_key: *admin_key, + } + } +} + +impl From for Vec { + fn from(accounts: SetFillsConsumerAccounts) -> Self { + let SetFillsConsumerAccounts { + configuration_registry_key, + program_state_key, + admin_key, + } = accounts; + + vec![ + AccountMeta::new(configuration_registry_key, false), + AccountMeta::new_readonly(program_state_key, false), + AccountMeta::new_readonly(admin_key, true), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SetAdminAccounts { + pub upgrade_authority_key: Pubkey, + pub program_state_key: Pubkey, + pub program_data_key: Pubkey, +} + +impl SetAdminAccounts { + pub fn new(upgrade_authority_key: &Pubkey) -> Self { + Self { + upgrade_authority_key: *upgrade_authority_key, + program_state_key: ProgramState::find_address().0, + program_data_key: get_program_data_address(&ID).0, + } + } +} + +impl From for Vec { + fn from(accounts: SetAdminAccounts) -> Self { + let SetAdminAccounts { + upgrade_authority_key, + program_state_key, + program_data_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(upgrade_authority_key, true), + AccountMeta::new(program_state_key, false), + AccountMeta::new_readonly(ID, false), + AccountMeta::new_readonly(program_data_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ToggleSystemStateAccounts { + pub admin_key: Pubkey, + pub program_state_key: Pubkey, +} + +impl ToggleSystemStateAccounts { + pub fn new(admin_key: &Pubkey) -> Self { + Self { + admin_key: *admin_key, + program_state_key: ProgramState::find_address().0, + } + } +} + +impl From for Vec { + fn from(accounts: ToggleSystemStateAccounts) -> Self { + let ToggleSystemStateAccounts { + admin_key, + program_state_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(admin_key, true), + AccountMeta::new(program_state_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct BuySolAccounts { + pub configuration_registry_key: Pubkey, + pub program_state_key: Pubkey, + pub deny_list_registry_key: Pubkey, + pub fills_registry_key: Pubkey, + pub withdraw_authority_key: Pubkey, + pub user_token_account_key: Pubkey, + pub swap_destination_key: Pubkey, + pub dz_mint_key: Pubkey, + pub dz_config_key: Pubkey, + pub dz_journal_key: Pubkey, + pub user_key: Pubkey, +} + +impl BuySolAccounts { + pub fn new( + fill_registry_key: &Pubkey, + user_token_account_key: &Pubkey, + dz_mint_key: &Pubkey, + user_key: &Pubkey, + ) -> Self { + let swap_authority_key = + doublezero_revenue_distribution::state::find_swap_authority_address().0; + Self { + configuration_registry_key: ConfigurationRegistry::find_address().0, + program_state_key: ProgramState::find_address().0, + deny_list_registry_key: DenyListRegistry::find_address().0, + fills_registry_key: *fill_registry_key, + withdraw_authority_key: dz_state::find_withdraw_sol_authority_address(&ID).0, + user_token_account_key: *user_token_account_key, + swap_destination_key: + doublezero_revenue_distribution::state::find_2z_token_pda_address( + &swap_authority_key, + ) + .0, + dz_mint_key: *dz_mint_key, + dz_config_key: dz_state::ProgramConfig::find_address().0, + dz_journal_key: dz_state::Journal::find_address().0, + user_key: *user_key, + } + } +} + +impl From for Vec { + fn from(accounts: BuySolAccounts) -> Self { + let BuySolAccounts { + configuration_registry_key, + program_state_key, + deny_list_registry_key, + fills_registry_key, + withdraw_authority_key, + user_token_account_key, + swap_destination_key, + dz_mint_key, + dz_config_key, + dz_journal_key, + user_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(configuration_registry_key, false), + AccountMeta::new(program_state_key, false), + AccountMeta::new_readonly(deny_list_registry_key, false), + AccountMeta::new(fills_registry_key, false), + AccountMeta::new_readonly(withdraw_authority_key, false), + AccountMeta::new(user_token_account_key, false), + AccountMeta::new(swap_destination_key, false), + AccountMeta::new_readonly(dz_mint_key, false), + AccountMeta::new_readonly(dz_config_key, false), + AccountMeta::new(dz_journal_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + AccountMeta::new_readonly(REVENUE_DISTRIBUTION_PROGRAM_ID, false), + AccountMeta::new(user_key, true), + ] + } +} diff --git a/offchain/crates/solana-interface/sol-conversion/src/instruction/mod.rs b/offchain/crates/solana-interface/sol-conversion/src/instruction/mod.rs new file mode 100644 index 0000000000..f85d15469f --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/src/instruction/mod.rs @@ -0,0 +1,210 @@ +pub mod account; + +// + +use std::io; + +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_tools::{DISCRIMINATOR_LEN, Discriminator}; +use solana_pubkey::Pubkey; + +use crate::oracle::OraclePriceData; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum SolConversionInstructionData { + /// Set up initial state. Requires the upgrade authority. + InitializeSystem { + oracle_key: Pubkey, + fixed_fill_quantity_lamports: u64, + price_maximum_age_seconds: i64, + coefficient: u64, + max_discount_rate: u64, + min_discount_rate: u64, + }, + + UpdateConfigurationRegistry { + oracle_key: Option, + fixed_fill_quantity_lamports: Option, + price_maximum_age_seconds: Option, + coefficient: Option, + max_discount_rate: Option, + min_discount_rate: Option, + }, + + SetFillsConsumer(Pubkey), + + AddToDenyList, + + RemoveFromDenyList, + + SetAdmin(Pubkey), + + SetDenyListAuthority, + + /// In other words, pause or unpause the system. + ToggleSystemState(bool), + + BuySol { + limit_price: u64, + oracle_price_data: OraclePriceData, + }, + + GetConversionRate, + + DequeueFills, +} + +impl SolConversionInstructionData { + pub const INITIALIZE_SYSTEM: Discriminator = + Discriminator::new_sha2(b"global:initialize_system"); + pub const UPDATE_CONFIGURATION_REGISTRY: Discriminator = + Discriminator::new_sha2(b"global:update_configuration_registry"); + pub const SET_FILLS_CONSUMER: Discriminator = + Discriminator::new_sha2(b"global:set_fills_consumer"); + pub const ADD_TO_DENY_LIST: Discriminator = + Discriminator::new_sha2(b"global:add_to_deny_list"); + pub const REMOVE_FROM_DENY_LIST: Discriminator = + Discriminator::new_sha2(b"global:remove_from_deny_list"); + pub const SET_ADMIN: Discriminator = + Discriminator::new_sha2(b"global:set_admin"); + pub const SET_DENY_LIST_AUTHORITY: Discriminator = + Discriminator::new_sha2(b"global:set_deny_list_authority"); + pub const TOGGLE_SYSTEM_STATE: Discriminator = + Discriminator::new_sha2(b"global:toggle_system_state"); + pub const BUY_SOL: Discriminator = + Discriminator::new_sha2(b"global:buy_sol"); + pub const GET_CONVERSION_RATE: Discriminator = + Discriminator::new_sha2(b"global:get_conversion_rate"); + pub const DEQUEUE_FILLS: Discriminator = + Discriminator::new_sha2(b"global:dequeue_fills"); +} + +impl BorshDeserialize for SolConversionInstructionData { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + match Discriminator::deserialize_reader(reader)? { + Self::INITIALIZE_SYSTEM => { + let oracle_key = BorshDeserialize::deserialize_reader(reader)?; + let fixed_fill_quantity_lamports = BorshDeserialize::deserialize_reader(reader)?; + let price_maximum_age_seconds = BorshDeserialize::deserialize_reader(reader)?; + let coefficient = BorshDeserialize::deserialize_reader(reader)?; + let max_discount_rate = BorshDeserialize::deserialize_reader(reader)?; + let min_discount_rate = BorshDeserialize::deserialize_reader(reader)?; + + Ok(Self::InitializeSystem { + oracle_key, + fixed_fill_quantity_lamports, + price_maximum_age_seconds, + coefficient, + max_discount_rate, + min_discount_rate, + }) + } + Self::UPDATE_CONFIGURATION_REGISTRY => { + let oracle_key = BorshDeserialize::deserialize_reader(reader)?; + let fixed_fill_quantity_lamports = BorshDeserialize::deserialize_reader(reader)?; + let price_maximum_age_seconds = BorshDeserialize::deserialize_reader(reader)?; + let coefficient = BorshDeserialize::deserialize_reader(reader)?; + let max_discount_rate = BorshDeserialize::deserialize_reader(reader)?; + let min_discount_rate = BorshDeserialize::deserialize_reader(reader)?; + + Ok(Self::UpdateConfigurationRegistry { + oracle_key, + fixed_fill_quantity_lamports, + price_maximum_age_seconds, + coefficient, + max_discount_rate, + min_discount_rate, + }) + } + Self::SET_FILLS_CONSUMER => { + BorshDeserialize::deserialize_reader(reader).map(Self::SetFillsConsumer) + } + Self::ADD_TO_DENY_LIST => Ok(Self::AddToDenyList), + Self::REMOVE_FROM_DENY_LIST => Ok(Self::RemoveFromDenyList), + Self::SET_ADMIN => BorshDeserialize::deserialize_reader(reader).map(Self::SetAdmin), + Self::SET_DENY_LIST_AUTHORITY => Ok(Self::SetDenyListAuthority), + Self::TOGGLE_SYSTEM_STATE => { + BorshDeserialize::deserialize_reader(reader).map(Self::ToggleSystemState) + } + Self::BUY_SOL => { + let limit_price = BorshDeserialize::deserialize_reader(reader)?; + let oracle_price_data = BorshDeserialize::deserialize_reader(reader)?; + + Ok(Self::BuySol { + limit_price, + oracle_price_data, + }) + } + Self::GET_CONVERSION_RATE => Ok(Self::GetConversionRate), + Self::DEQUEUE_FILLS => Ok(Self::DequeueFills), + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid discriminator", + )), + } + } +} + +impl BorshSerialize for SolConversionInstructionData { + fn serialize(&self, writer: &mut W) -> io::Result<()> { + match self { + Self::InitializeSystem { + oracle_key, + fixed_fill_quantity_lamports, + price_maximum_age_seconds, + coefficient, + max_discount_rate, + min_discount_rate, + } => { + Self::INITIALIZE_SYSTEM.serialize(writer)?; + oracle_key.serialize(writer)?; + fixed_fill_quantity_lamports.serialize(writer)?; + price_maximum_age_seconds.serialize(writer)?; + coefficient.serialize(writer)?; + max_discount_rate.serialize(writer)?; + min_discount_rate.serialize(writer) + } + Self::UpdateConfigurationRegistry { + oracle_key, + fixed_fill_quantity_lamports, + price_maximum_age_seconds, + coefficient, + max_discount_rate, + min_discount_rate, + } => { + Self::UPDATE_CONFIGURATION_REGISTRY.serialize(writer)?; + oracle_key.serialize(writer)?; + fixed_fill_quantity_lamports.serialize(writer)?; + price_maximum_age_seconds.serialize(writer)?; + coefficient.serialize(writer)?; + max_discount_rate.serialize(writer)?; + min_discount_rate.serialize(writer) + } + Self::SetFillsConsumer(fills_consumer_key) => { + Self::SET_FILLS_CONSUMER.serialize(writer)?; + fills_consumer_key.serialize(writer) + } + Self::AddToDenyList => Self::ADD_TO_DENY_LIST.serialize(writer), + Self::RemoveFromDenyList => Self::REMOVE_FROM_DENY_LIST.serialize(writer), + Self::SetAdmin(admin_key) => { + Self::SET_ADMIN.serialize(writer)?; + admin_key.serialize(writer) + } + Self::SetDenyListAuthority => Self::SET_DENY_LIST_AUTHORITY.serialize(writer), + Self::ToggleSystemState(should_pause) => { + Self::TOGGLE_SYSTEM_STATE.serialize(writer)?; + should_pause.serialize(writer) + } + Self::BuySol { + limit_price, + oracle_price_data, + } => { + Self::BUY_SOL.serialize(writer)?; + limit_price.serialize(writer)?; + oracle_price_data.serialize(writer) + } + Self::GetConversionRate => Self::GET_CONVERSION_RATE.serialize(writer), + Self::DequeueFills => Self::DEQUEUE_FILLS.serialize(writer), + } + } +} diff --git a/offchain/crates/solana-interface/sol-conversion/src/lib.rs b/offchain/crates/solana-interface/sol-conversion/src/lib.rs new file mode 100644 index 0000000000..18613f1839 --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/src/lib.rs @@ -0,0 +1,7 @@ +pub mod instruction; +pub mod oracle; +pub mod state; + +// + +solana_pubkey::declare_id!("9DRcqsJUCo8CL2xDCXpogwzLEVKRDzSyNtVgXqsXHfDs"); diff --git a/offchain/crates/solana-interface/sol-conversion/src/oracle.rs b/offchain/crates/solana-interface/sol-conversion/src/oracle.rs new file mode 100644 index 0000000000..642b4f698e --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/src/oracle.rs @@ -0,0 +1,582 @@ +use borsh::{BorshDeserialize, BorshSerialize}; + +use crate::state::ConfigurationRegistry; + +pub const RATE_PRECISION: u64 = 100_000_000; +pub const MAX_DISCOUNT: u64 = 10_000; + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, Default, PartialEq, Eq)] +#[cfg_attr( + feature = "serde", + derive(serde::Deserialize), + serde(rename_all = "camelCase") +)] +pub struct OraclePriceData { + pub swap_rate: u64, + pub timestamp: i64, + pub signature: String, +} + +impl OraclePriceData { + pub fn checked_discounted_swap_rate(&self, discount: u64) -> Option { + checked_discounted_swap_rate(self.swap_rate, discount) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct DiscountParameters { + pub coefficient: u64, + pub max_discount: u64, + pub min_discount: u64, +} + +impl DiscountParameters { + pub fn from_configuration_registry(configuration_registry: &ConfigurationRegistry) -> Self { + Self { + coefficient: configuration_registry.coefficient, + max_discount: configuration_registry.max_discount_rate, + min_discount: configuration_registry.min_discount_rate, + } + } + + /// 8-decimal precision discount. + /// + /// discount = min(γ * (S_now - S_last) + Dmin, Dmax). + pub fn checked_compute(&self, slot_difference: u64) -> Option { + const DISCOUNT_SCALING_FACTOR: u64 = RATE_PRECISION / MAX_DISCOUNT; + + if self.coefficient > RATE_PRECISION + || self.max_discount > MAX_DISCOUNT + || self.min_discount > self.max_discount + { + return None; + } + + // Maximum rate value is 10_000. + // Multiplied by 100_000_000 / 10_000 = 10_000. + // + // This will never overflow u64. + let min_discount_rate_scaled = self.min_discount * DISCOUNT_SCALING_FACTOR; + let max_discount_rate_scaled = self.max_discount * DISCOUNT_SCALING_FACTOR; + + let discount_rate = self.coefficient * slot_difference + min_discount_rate_scaled; + + Some(discount_rate.min(max_discount_rate_scaled)) + } +} + +#[inline] +pub fn checked_discounted_swap_rate(swap_rate: u64, discount: u64) -> Option { + const RATE_PRECISION_U128: u128 = RATE_PRECISION as u128; + + if discount > RATE_PRECISION { + return None; + } + + let swap_rate = u128::from(swap_rate); + let adjustment = swap_rate * u128::from(discount); + + let discounted = (swap_rate * RATE_PRECISION_U128 - adjustment) / RATE_PRECISION_U128; + discounted.try_into().ok() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_checked_compute_and_checked_discounted_rate() { + // Unbounded discounts: 0% to 100% based on slot differences. + + // 0% discount at same slot. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 10_000, + min_discount: 0, + }; + let discount = discount_params.checked_compute(0).unwrap(); + assert_eq!(discount, 0); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 1_000_000_000 + ); + + // 10% discount at 200 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 10_000, + min_discount: 0, + }; + let discount = discount_params.checked_compute(200).unwrap(); + assert_eq!(discount, 10_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 900_000_000 + ); + + // 25% discount at 500 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 10_000, + min_discount: 0, + }; + let discount = discount_params.checked_compute(500).unwrap(); + assert_eq!(discount, 25_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 750_000_000 + ); + + // 50% discount at 1,000 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 10_000, + min_discount: 0, + }; + let discount = discount_params.checked_compute(1_000).unwrap(); + assert_eq!(discount, 50_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 500_000_000 + ); + + // 75% discount at 1,500 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 10_000, + min_discount: 0, + }; + let discount = discount_params.checked_compute(1_500).unwrap(); + assert_eq!(discount, 75_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 250_000_000 + ); + + // 100% discount at 2,000 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 10_000, + min_discount: 0, + }; + let discount = discount_params.checked_compute(2_000).unwrap(); + assert_eq!(discount, 100_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 0 + ); + + // 100% discount beyond max slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 10_000, + min_discount: 0, + }; + let discount = discount_params.checked_compute(2_900).unwrap(); + assert_eq!(discount, 100_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 0 + ); + + // Coefficient = 0.0005. + // Discount bounds: [10%, 50%]. + + // 10% min discount at 0 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(0).unwrap(); + assert_eq!(discount, 10_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 900_000_000 + ); + + // 15% discount at 100 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(100).unwrap(); + assert_eq!(discount, 15_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 850_000_000 + ); + + // 20% discount at 200 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(200).unwrap(); + assert_eq!(discount, 20_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 800_000_000 + ); + + // 25% discount at 300 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(300).unwrap(); + assert_eq!(discount, 25_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 750_000_000 + ); + + // 30% discount at 400 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(400).unwrap(); + assert_eq!(discount, 30_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 700_000_000 + ); + + // 35% discount at 500 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(500).unwrap(); + assert_eq!(discount, 35_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 650_000_000 + ); + + // 40% discount at 600 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(600).unwrap(); + assert_eq!(discount, 40_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 600_000_000 + ); + + // 45% discount at 700 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(700).unwrap(); + assert_eq!(discount, 45_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 550_000_000 + ); + + // 50% max discount at 800 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(800).unwrap(); + assert_eq!(discount, 50_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 500_000_000 + ); + + // 50% max discount capped at 900 slot difference. + let discount_params = DiscountParameters { + coefficient: 50_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(900).unwrap(); + assert_eq!(discount, 50_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 500_000_000 + ); + + // Coefficient = 0.00004500. + // Discount bounds: [10%, 50%]. + + // Same slot. + let discount_params = DiscountParameters { + coefficient: 4500, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(0).unwrap(); + assert_eq!(discount, 10_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 900_000_000 + ); + + // 1 slot difference. + let discount_params = DiscountParameters { + coefficient: 4500, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(1).unwrap(); + assert_eq!(discount, 10_004_500); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 899_955_000 + ); + + // 50 slot difference. + let discount_params = DiscountParameters { + coefficient: 4500, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(50).unwrap(); + assert_eq!(discount, 10_225_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 897_750_000 + ); + + // 100 slot difference. + let discount_params = DiscountParameters { + coefficient: 4500, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(100).unwrap(); + assert_eq!(discount, 10_450_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 895_500_000 + ); + + // Almost max slot difference. + let discount_params = DiscountParameters { + coefficient: 4500, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(8_888).unwrap(); + assert_eq!(discount, 49_996_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 500_040_000 + ); + + // Just past max slot difference. + let discount_params = DiscountParameters { + coefficient: 4500, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(8_889).unwrap(); + assert_eq!(discount, 50_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 500_000_000 + ); + + // Well beyond max slot difference. + let discount_params = DiscountParameters { + coefficient: 4500, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(9_900).unwrap(); + assert_eq!(discount, 50_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 500_000_000 + ); + + // Edge cases. + + // Zero coefficient. + let discount_params = DiscountParameters { + coefficient: 0, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(100).unwrap(); + assert_eq!(discount, 10_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 900_000_000 + ); + + // Max coefficient. + let discount_params = DiscountParameters { + coefficient: 100_000_000, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(100).unwrap(); + assert_eq!(discount, 50_000_000); + assert_eq!( + OraclePriceData { + swap_rate: 1_000_000_000, + ..Default::default() + } + .checked_discounted_swap_rate(discount) + .unwrap(), + 500_000_000 + ); + + // Zero swap rate. + let discount_params = DiscountParameters { + coefficient: 4_500, + max_discount: 5_000, + min_discount: 1_000, + }; + let discount = discount_params.checked_compute(100).unwrap(); + assert_eq!(discount, 10_450_000); + assert_eq!( + OraclePriceData::default() + .checked_discounted_swap_rate(discount) + .unwrap(), + 0 + ); + } +} diff --git a/offchain/crates/solana-interface/sol-conversion/src/state/configuration_registry.rs b/offchain/crates/solana-interface/sol-conversion/src/state/configuration_registry.rs new file mode 100644 index 0000000000..4cefe61a3d --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/src/state/configuration_registry.rs @@ -0,0 +1,27 @@ +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_tools::{Discriminator, PrecomputedDiscriminator}; +use solana_pubkey::Pubkey; + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)] +pub struct ConfigurationRegistry { + pub oracle_key: Pubkey, + pub fixed_fill_quantity: u64, + pub price_maximum_age_seconds: i64, + pub fill_consumer_key: Pubkey, + pub coefficient: u64, + pub max_discount_rate: u64, + pub min_discount_rate: u64, +} + +impl PrecomputedDiscriminator for ConfigurationRegistry { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"account:ConfigurationRegistry"); +} + +impl ConfigurationRegistry { + pub const SEED_PREFIX: &'static [u8] = b"system_config"; + + pub fn find_address() -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX], &crate::ID) + } +} diff --git a/offchain/crates/solana-interface/sol-conversion/src/state/deny_list_registry.rs b/offchain/crates/solana-interface/sol-conversion/src/state/deny_list_registry.rs new file mode 100644 index 0000000000..658afe77c5 --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/src/state/deny_list_registry.rs @@ -0,0 +1,22 @@ +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_tools::{Discriminator, PrecomputedDiscriminator}; +use solana_pubkey::Pubkey; + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)] +pub struct DenyListRegistry { + pub denied_keys: Vec, + pub last_updated: i64, + pub update_count: u64, +} + +impl PrecomputedDiscriminator for DenyListRegistry { + const DISCRIMINATOR: Discriminator<8> = Discriminator::new_sha2(b"account:DenyListRegistry"); +} + +impl DenyListRegistry { + pub const SEED_PREFIX: &'static [u8] = b"deny_list"; + + pub fn find_address() -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX], &crate::ID) + } +} diff --git a/offchain/crates/solana-interface/sol-conversion/src/state/fills_registry.rs b/offchain/crates/solana-interface/sol-conversion/src/state/fills_registry.rs new file mode 100644 index 0000000000..b5872deb09 --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/src/state/fills_registry.rs @@ -0,0 +1,40 @@ +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{Discriminator, PrecomputedDiscriminator}; + +// TODO: Reduce and fix in program. +pub const MAX_FILLS_QUEUE_SIZE: u32 = 20_000; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct FillsRegistry { + pub total_sol_pending: u64, + pub total_2z_pending: u64, + pub fills: [Fill; MAX_FILLS_QUEUE_SIZE as usize], + pub head: u64, + pub tail: u64, + pub count: u64, +} + +impl Default for FillsRegistry { + fn default() -> Self { + Self { + total_sol_pending: 0, + total_2z_pending: 0, + fills: [Fill::default(); MAX_FILLS_QUEUE_SIZE as usize], + head: 0, + tail: 0, + count: 0, + } + } +} + +impl PrecomputedDiscriminator for FillsRegistry { + const DISCRIMINATOR: Discriminator<8> = Discriminator::new_sha2(b"account:FillsRegistry"); +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct Fill { + pub amount_sol_in: u64, + pub amount_2z_out: u64, +} diff --git a/offchain/crates/solana-interface/sol-conversion/src/state/mod.rs b/offchain/crates/solana-interface/sol-conversion/src/state/mod.rs new file mode 100644 index 0000000000..80f4f9203d --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/src/state/mod.rs @@ -0,0 +1,9 @@ +mod configuration_registry; +mod deny_list_registry; +mod fills_registry; +mod program_state; + +pub use configuration_registry::*; +pub use deny_list_registry::*; +pub use fills_registry::*; +pub use program_state::*; diff --git a/offchain/crates/solana-interface/sol-conversion/src/state/program_state.rs b/offchain/crates/solana-interface/sol-conversion/src/state/program_state.rs new file mode 100644 index 0000000000..a7242b7eea --- /dev/null +++ b/offchain/crates/solana-interface/sol-conversion/src/state/program_state.rs @@ -0,0 +1,28 @@ +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_tools::{Discriminator, PrecomputedDiscriminator}; +use solana_pubkey::Pubkey; + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)] +pub struct ProgramState { + pub admin_key: Pubkey, + pub fills_registry_key: Pubkey, + pub is_paused: bool, + pub configuration_registry_bump: u8, + pub program_state_bump: u8, + pub deny_list_registry_bump: u8, + pub withdraw_authority_bump: u8, + pub last_trade_slot: u64, + pub deny_list_authority: Pubkey, +} + +impl PrecomputedDiscriminator for ProgramState { + const DISCRIMINATOR: Discriminator<8> = Discriminator::new_sha2(b"account:ProgramStateAccount"); +} + +impl ProgramState { + pub const SEED_PREFIX: &'static [u8] = b"state"; + + pub fn find_address() -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX], &crate::ID) + } +} diff --git a/offchain/crates/solana-sdk/CHANGELOG.md b/offchain/crates/solana-sdk/CHANGELOG.md new file mode 100644 index 0000000000..7ec8ea2525 --- /dev/null +++ b/offchain/crates/solana-sdk/CHANGELOG.md @@ -0,0 +1,34 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- add `parse_metro_history_price_at_epoch` and `parse_device_history_premium_at_epoch` for reading a `MetroHistory`/`DeviceHistory` ring entry at a specific epoch, mirroring the onchain `RingBuffer::find` (backwards walk from `current_index` bounded by `total_count`, so `epoch == 0` cannot match a zero-initialized slot), plus `seat_usdc_price_dollars` mirroring `DeviceSubscription::usdc_price_dollars`. `parse_metro_history` / `parse_device_history` keep returning the newest entry (#405) +- migrate to Solana 3.0: workspace `solana-*` crates and `solana-sdk` move to the 3.0 line, `solana-program-test` to 3.0.12, and the doublezero SDK git-deps repin from `client/v0.27.1` to the malbeclabs/doublezero#3830 merge revision (malbeclabs/infra#1853) +- remove `build_memo_instruction` (moved to `Wallet::build_memo_instruction` in `solana-client-tools`, alongside the memo compute-unit helpers) +- add `find_claim_holding_address` PDA helper and `CLAIM_HOLDING_SEED_PREFIX` constant for `ValidatorClientRewards` claim holding accounts +- add `ValidatorClientRewards` as a `Pod` mirror of the onchain struct, with a `checked_short_description` accessor and a compile-time assertion pinning the account at 184 bytes +- add `parse_program_config_shred_oracle_key` helper for reading `ProgramConfig.shred_oracle_key` +- add `InitializeClaimHolding` and `ClaimValidatorClientRewards` instruction variants and the `ClaimHoldingId` Borsh struct (rename mirrors on-chain `shred-subscription/v0.6.6`: discriminator string `dz::ix::initialize_claim_holding_account` → `dz::ix::initialize_claim_holding`) +- add `InitializeClaimHoldingAccounts` builder for the `InitializeClaimHolding` instruction +- add `ClaimValidatorClientRewardsAccounts` builder for the `ClaimValidatorClientRewards` instruction (6 fixed + N holding accounts) +- add shred-subscription publisher-rewards SDK surface for offchain consumers: + - `ValidatorPublisherRewards` and `ShredRewardToken` `Pod` types with `PrecomputedDiscriminator` impls, plus `state::find_validator_publisher_rewards_address` and `state::find_shred_reward_token_address` PDA helpers. + - `instruction::ShredSubscriptionInstructionData::{InitializeValidatorPublisherRewards, ConfigureValidatorPublisherRewards}` variants with discriminators and Borsh round-trip. + - `instruction::account::{InitializeValidatorPublisherRewardsAccounts, ConfigureValidatorPublisherRewardsAccounts}` account-list builders. + - `instruction::ValidatorOffchainAuthorization` envelope carrying an ed25519 signature + deadline-slot for the offchain auth path. + - new `types::ConfigureValidatorPublisherRewardsAuthMessage` mirroring the on-chain canonical bytes (sha256 over `DOMAIN_TAG || bytemuck::bytes_of(self)`, hex-encoded for `solana sign-offchain-message`). +- add `bytemuck` and `hex` dependencies (and `solana-offchain-message` dev-dependency) for shred-subscription publisher-rewards sign/verify round-trip tests +- add `RequestProratedInstantSeatWithdrawal` instruction variant and accounts builder +- add `find_shred_distribution_address` PDA helper and `parse_client_seat_last_usdc_price_dollars` parser for prorated withdrawal integration +- add `is_prorated_service_enabled` helper and `ProgramConfig` flag/offset constants for raw-byte parsing +- add `RequestInstantSeatWithdrawal` instruction builder and `withdraw_seat_request` PDA helper +- add reservation module: PDA helpers, instruction builders, and account parsers for the seat reservation program +- add more revenue-distribution fetch methods ([#243](https://github.com/doublezerofoundation/doublezero-offchain/pull/243)) +- add `build_memo_instruction` ([#232](https://github.com/doublezerofoundation/doublezero-offchain/pull/232)) +- add fetch submodule ([#231](https://github.com/doublezerofoundation/doublezero-offchain/pull/231)) +- re-export Passport and Revenue Distribution program interfaces ([#225](https://github.com/doublezerofoundation/doublezero-offchain/pull/225)) \ No newline at end of file diff --git a/offchain/crates/solana-sdk/Cargo.toml b/offchain/crates/solana-sdk/Cargo.toml new file mode 100644 index 0000000000..7fe470e538 --- /dev/null +++ b/offchain/crates/solana-sdk/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "doublezero-solana-sdk" +description = "SDK for DoubleZero Smart Contracts on Solana" + +version.workspace = true +edition.workspace = true +authors.workspace = true +readme.workspace = true +license.workspace = true +repository.workspace = true +homepage.workspace = true + +[dependencies] +anyhow.workspace = true +borsh.workspace = true +bytemuck.workspace = true +doublezero-passport.workspace = true +doublezero-program-tools.workspace = true +doublezero-revenue-distribution.workspace = true +doublezero-sol-conversion-interface.workspace = true +doublezero-solana-client-tools.workspace = true +hex.workspace = true +solana-sdk.workspace = true +solana-sdk-ids.workspace = true +spl-associated-token-account-interface.workspace = true +spl-token-interface.workspace = true +svm-hash.workspace = true + +[dev-dependencies] +serde_json.workspace = true +solana-client.workspace = true +solana-loader-v3-interface.workspace = true +solana-offchain-message.workspace = true +solana-program-pack.workspace = true +tempfile.workspace = true \ No newline at end of file diff --git a/offchain/crates/solana-sdk/src/lib.rs b/offchain/crates/solana-sdk/src/lib.rs new file mode 100644 index 0000000000..b7e6c00172 --- /dev/null +++ b/offchain/crates/solana-sdk/src/lib.rs @@ -0,0 +1,37 @@ +pub mod passport; +pub mod revenue_distribution; +pub mod shred_subscription; + +// + +pub use doublezero_program_tools::{ + DISCRIMINATOR_LEN, Discriminator, PrecomputedDiscriminator, get_program_data_address, + instruction::try_build_instruction, zero_copy, +}; +pub use doublezero_revenue_distribution::DOUBLEZERO_MINT_DECIMALS; +pub use doublezero_sol_conversion_interface as sol_conversion; +pub use doublezero_solana_client_tools::rpc::NetworkEnvironment; +pub use solana_sdk::pubkey::Pubkey; +pub use svm_hash::{merkle, sha2}; + +// TODO: Determine where to remove this duplicate. Re-export? +pub const fn compute_units_for_bump_seed(bump: u8) -> u32 { + 1_500 * (255 - bump) as u32 +} + +pub fn environment_2z_token_mint_key(network_env: NetworkEnvironment) -> Pubkey { + match network_env { + NetworkEnvironment::Testnet | NetworkEnvironment::Devnet => { + revenue_distribution::env::development::DOUBLEZERO_MINT_KEY + } + _ => revenue_distribution::env::mainnet::DOUBLEZERO_MINT_KEY, + } +} + +pub fn environment_usdc_token_mint_key(network_env: NetworkEnvironment) -> Pubkey { + match network_env { + NetworkEnvironment::Testnet => shred_subscription::env::development::USDC_MINT_KEY, + NetworkEnvironment::Devnet => shred_subscription::env::solana_devnet::USDC_MINT_KEY, + _ => shred_subscription::env::mainnet::USDC_MINT_KEY, + } +} diff --git a/offchain/crates/solana-sdk/src/passport/mod.rs b/offchain/crates/solana-sdk/src/passport/mod.rs new file mode 100644 index 0000000000..1cdc8e2373 --- /dev/null +++ b/offchain/crates/solana-sdk/src/passport/mod.rs @@ -0,0 +1 @@ +pub use doublezero_passport::{ID, instruction, state}; diff --git a/offchain/crates/solana-sdk/src/revenue_distribution/compute_unit.rs b/offchain/crates/solana-sdk/src/revenue_distribution/compute_unit.rs new file mode 100644 index 0000000000..dd7035692c --- /dev/null +++ b/offchain/crates/solana-sdk/src/revenue_distribution/compute_unit.rs @@ -0,0 +1,19 @@ +use crate::merkle::MerkleProof; + +/// Overestimation of CU needed to create a new account. +pub const CREATE_ACCOUNT_COMPUTE_UNITS: u32 = 10_000; + +pub const fn initialize_solana_validator_deposit(deposit_pda_bump: u8) -> u32 { + crate::compute_units_for_bump_seed(deposit_pda_bump) + .saturating_add(CREATE_ACCOUNT_COMPUTE_UNITS) +} + +// TODO: Scale based on proof size. +pub const fn pay_solana_validator_debt(_proof: &MerkleProof) -> u32 { + 10_000 +} + +// TODO: Scale based on proof size. +pub const fn write_off_solana_validator_debt(_proof: &MerkleProof) -> u32 { + 10_000 +} diff --git a/offchain/crates/solana-sdk/src/revenue_distribution/fetch.rs b/offchain/crates/solana-sdk/src/revenue_distribution/fetch.rs new file mode 100644 index 0000000000..f92141ecfc --- /dev/null +++ b/offchain/crates/solana-sdk/src/revenue_distribution/fetch.rs @@ -0,0 +1,97 @@ +use anyhow::{Context, Result, ensure}; +use borsh::BorshDeserialize; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, rpc::SolanaConnection, +}; +use solana_sdk::pubkey::Pubkey; + +use super::{ + state::{Distribution, Journal, ProgramConfig}, + types::DoubleZeroEpoch, +}; +use crate::sol_conversion::state::{ + ConfigurationRegistry as SolConversionConfigurationRegistry, FillsRegistry, + ProgramState as SolConversionProgramState, +}; + +pub async fn try_fetch_config( + connection: &SolanaConnection, +) -> Result<(Pubkey, Box)> { + let (program_config_key, _) = ProgramConfig::find_address(); + + let program_config = connection + .try_fetch_zero_copy_data(&program_config_key) + .await + .context("Revenue Distribution program not initialized")?; + Ok((program_config_key, program_config.mucked_data)) +} + +pub async fn try_fetch_distribution( + connection: &SolanaConnection, + dz_epoch_value: u64, +) -> Result<(Pubkey, ZeroCopyAccountOwnedData)> { + let dz_epoch = DoubleZeroEpoch::new(dz_epoch_value); + let (distribution_key, _) = Distribution::find_address(dz_epoch); + + let distribution = connection + .try_fetch_zero_copy_data(&distribution_key) + .await + .with_context(|| format!("Distribution not found for epoch {dz_epoch}"))?; + Ok((distribution_key, distribution)) +} + +pub struct SolConversionState { + pub program_state: (Pubkey, Box), + pub configuration_registry: (Pubkey, Box), + pub journal: (Pubkey, ZeroCopyAccountOwnedData), + pub fixed_fill_quantity: u64, +} + +impl SolConversionState { + pub async fn try_fetch(connection: &SolanaConnection) -> Result { + const FAILED_FETCH_ERROR: &str = "SOL Conversion program not initialized"; + + let (program_state_key, _) = SolConversionProgramState::find_address(); + let (configuration_registry_key, _) = SolConversionConfigurationRegistry::find_address(); + let (journal_key, _) = Journal::find_address(); + + let account_infos = connection + .get_multiple_accounts(&[program_state_key, configuration_registry_key, journal_key]) + .await + .context(FAILED_FETCH_ERROR)? + .into_iter() + .flatten() + .collect::>(); + ensure!(account_infos.len() == 3, FAILED_FETCH_ERROR); + + let program_state_data = Box::<_>::deserialize(&mut &account_infos[0].data[8..])?; + + // Type is not known at compile time for some reason. + let configuration_registry_data = Box::::deserialize( + &mut &account_infos[1].data[8..], + )?; + + let journal_data = ZeroCopyAccountOwnedData::from_account(&account_infos[2]) + .context("Revenue Distribution program not initialized")?; + + let fixed_fill_quantity = configuration_registry_data.fixed_fill_quantity; + + Ok(Self { + program_state: (program_state_key, program_state_data), + configuration_registry: (configuration_registry_key, configuration_registry_data), + journal: (journal_key, journal_data), + fixed_fill_quantity, + }) + } + + pub async fn try_fetch_fill_registry( + &self, + connection: &SolanaConnection, + ) -> Result<(Pubkey, ZeroCopyAccountOwnedData)> { + let fill_registry_key = self.program_state.1.fills_registry_key; + let fill_registry = connection + .try_fetch_zero_copy_data(&fill_registry_key) + .await?; + Ok((fill_registry_key, fill_registry)) + } +} diff --git a/offchain/crates/solana-sdk/src/revenue_distribution/mod.rs b/offchain/crates/solana-sdk/src/revenue_distribution/mod.rs new file mode 100644 index 0000000000..9256922c7c --- /dev/null +++ b/offchain/crates/solana-sdk/src/revenue_distribution/mod.rs @@ -0,0 +1,29 @@ +pub mod compute_unit; +pub mod fetch; + +// + +use anyhow::{Context, Result}; + +/// First DZ epoch to generate rewards for network contributors. +pub const GENESIS_DZ_EPOCH_MAINNET_BETA: u64 = 31; + +pub use doublezero_revenue_distribution::{ID, env, instruction, state, types}; + +pub fn try_is_processed_leaf(processed_leaf_data: &[u8], leaf_index: usize) -> Result { + // Calculate which byte contains the bit for this leaf index + // (8 bits per byte, so divide by 8). + let leaf_byte_index = leaf_index / 8; + + // First, we have to grab the relevant byte from the processed data. + // Create ByteFlags from the byte value to check the bit. + let leaf_byte = processed_leaf_data + .get(leaf_byte_index) + .copied() + .map(doublezero_revenue_distribution::types::ByteFlags::new) + .with_context(|| format!("Invalid leaf index: {leaf_index}"))?; + + // Calculate which bit within the byte corresponds to this leaf + // (modulo 8 gives us the bit position within the byte: 0-7). + Ok(leaf_byte.bit(leaf_index % 8)) +} diff --git a/offchain/crates/solana-sdk/src/shred_subscription/env.rs b/offchain/crates/solana-sdk/src/shred_subscription/env.rs new file mode 100644 index 0000000000..b26403d49a --- /dev/null +++ b/offchain/crates/solana-sdk/src/shred_subscription/env.rs @@ -0,0 +1,15 @@ +pub mod mainnet { + pub const USDC_MINT_KEY: solana_sdk::pubkey::Pubkey = + solana_sdk::pubkey!("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); +} + +pub mod development { + pub const USDC_MINT_KEY: solana_sdk::pubkey::Pubkey = + solana_sdk::pubkey!("uSDZq2RMuxrEf7gqgDjR8wJCtCyaDAQk2e5jLAaoeeM"); +} + +pub mod solana_devnet { + // Circle's USDC mint on Solana devnet, Crossmint uses this one. + pub const USDC_MINT_KEY: solana_sdk::pubkey::Pubkey = + solana_sdk::pubkey!("4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU"); +} diff --git a/offchain/crates/solana-sdk/src/shred_subscription/instruction/account.rs b/offchain/crates/solana-sdk/src/shred_subscription/instruction/account.rs new file mode 100644 index 0000000000..d16c13dc41 --- /dev/null +++ b/offchain/crates/solana-sdk/src/shred_subscription/instruction/account.rs @@ -0,0 +1,941 @@ +use solana_sdk::{instruction::AccountMeta, pubkey::Pubkey}; +use spl_associated_token_account_interface::address::get_associated_token_address; + +use crate::shred_subscription::state; + +/// Accounts for the `InitializeClientSeat` instruction (6 accounts). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeClientSeatAccounts { + pub program_config_key: Pubkey, + pub execution_controller_key: Pubkey, + pub device_history_key: Pubkey, + pub payer_key: Pubkey, + pub new_client_seat_key: Pubkey, +} + +impl InitializeClientSeatAccounts { + pub fn new(payer: &Pubkey, device_key: &Pubkey, client_ip_bits: u32) -> Self { + Self { + program_config_key: state::find_program_config_address().0, + execution_controller_key: state::find_execution_controller_address().0, + device_history_key: state::find_device_history_address(device_key).0, + payer_key: *payer, + new_client_seat_key: state::find_client_seat_address(device_key, client_ip_bits).0, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeClientSeatAccounts) -> Self { + vec![ + AccountMeta::new_readonly(accounts.program_config_key, false), + AccountMeta::new(accounts.execution_controller_key, false), + AccountMeta::new_readonly(accounts.device_history_key, false), + AccountMeta::new(accounts.payer_key, true), + AccountMeta::new(accounts.new_client_seat_key, false), + AccountMeta::new_readonly(solana_sdk_ids::system_program::ID, false), + ] + } +} + +/// Accounts for the `InitializePaymentEscrow` instruction (5 accounts). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializePaymentEscrowAccounts { + pub program_config_key: Pubkey, + pub client_seat_key: Pubkey, + pub withdraw_authority_key: Pubkey, + pub new_payment_escrow_key: Pubkey, +} + +impl InitializePaymentEscrowAccounts { + pub fn new(client_seat_key: &Pubkey, withdraw_authority: &Pubkey) -> Self { + Self { + program_config_key: state::find_program_config_address().0, + client_seat_key: *client_seat_key, + withdraw_authority_key: *withdraw_authority, + new_payment_escrow_key: state::find_payment_escrow_address( + client_seat_key, + withdraw_authority, + ) + .0, + } + } +} + +impl From for Vec { + fn from(accounts: InitializePaymentEscrowAccounts) -> Self { + vec![ + AccountMeta::new_readonly(accounts.program_config_key, false), + AccountMeta::new(accounts.client_seat_key, false), + AccountMeta::new(accounts.withdraw_authority_key, true), + AccountMeta::new(accounts.new_payment_escrow_key, false), + AccountMeta::new_readonly(solana_sdk_ids::system_program::ID, false), + ] + } +} + +/// Accounts for the `ClosePaymentEscrow` instruction (9 accounts). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ClosePaymentEscrowAccounts { + pub program_config_key: Pubkey, + pub execution_controller_key: Pubkey, + pub payment_escrow_key: Pubkey, + pub withdraw_authority_key: Pubkey, + pub client_seat_key: Pubkey, + pub device_history_key: Pubkey, + pub device_history_usdc_token_account_key: Pubkey, + pub refund_usdc_token_account_key: Pubkey, +} + +impl ClosePaymentEscrowAccounts { + pub fn new( + device_key: &Pubkey, + client_ip_bits: u32, + withdraw_authority: &Pubkey, + usdc_mint: &Pubkey, + refund_usdc_token_account: Option<&Pubkey>, + ) -> Self { + let refund_key = refund_usdc_token_account + .copied() + .unwrap_or_else(|| get_associated_token_address(withdraw_authority, usdc_mint)); + let client_seat_key = state::find_client_seat_address(device_key, client_ip_bits).0; + let device_history_key = state::find_device_history_address(device_key).0; + Self { + program_config_key: state::find_program_config_address().0, + execution_controller_key: state::find_execution_controller_address().0, + payment_escrow_key: state::find_payment_escrow_address( + &client_seat_key, + withdraw_authority, + ) + .0, + withdraw_authority_key: *withdraw_authority, + client_seat_key, + device_history_key, + device_history_usdc_token_account_key: state::find_token_pda_address( + &device_history_key, + usdc_mint, + ) + .0, + refund_usdc_token_account_key: refund_key, + } + } +} + +impl From for Vec { + fn from(accounts: ClosePaymentEscrowAccounts) -> Self { + vec![ + AccountMeta::new_readonly(accounts.program_config_key, false), + AccountMeta::new_readonly(accounts.execution_controller_key, false), + AccountMeta::new(accounts.payment_escrow_key, false), + AccountMeta::new(accounts.withdraw_authority_key, true), + AccountMeta::new(accounts.client_seat_key, false), + AccountMeta::new_readonly(accounts.device_history_key, false), + AccountMeta::new(accounts.device_history_usdc_token_account_key, false), + AccountMeta::new(accounts.refund_usdc_token_account_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + ] + } +} + +/// Accounts for the `RequestInstantSeatAllocation` instruction (9 accounts). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RequestInstantSeatAllocationAccounts { + pub program_config_key: Pubkey, + pub execution_controller_key: Pubkey, + pub metro_history_key: Pubkey, + pub device_history_key: Pubkey, + pub client_seat_key: Pubkey, + pub payment_escrow_key: Pubkey, + pub payer_key: Pubkey, + pub new_instant_allocation_request_key: Pubkey, +} + +impl RequestInstantSeatAllocationAccounts { + pub fn new( + exchange_key: &Pubkey, + device_key: &Pubkey, + client_ip_bits: u32, + withdraw_authority_key: &Pubkey, + payer_key: &Pubkey, + ) -> Self { + let client_seat_key = state::find_client_seat_address(device_key, client_ip_bits).0; + Self { + program_config_key: state::find_program_config_address().0, + execution_controller_key: state::find_execution_controller_address().0, + metro_history_key: state::find_metro_history_address(exchange_key).0, + device_history_key: state::find_device_history_address(device_key).0, + client_seat_key, + payment_escrow_key: state::find_payment_escrow_address( + &client_seat_key, + withdraw_authority_key, + ) + .0, + payer_key: *payer_key, + new_instant_allocation_request_key: state::find_instant_allocation_request_address( + device_key, + client_ip_bits, + ) + .0, + } + } +} + +impl From for Vec { + fn from(accounts: RequestInstantSeatAllocationAccounts) -> Self { + vec![ + AccountMeta::new_readonly(accounts.program_config_key, false), + AccountMeta::new(accounts.execution_controller_key, false), + AccountMeta::new_readonly(accounts.metro_history_key, false), + AccountMeta::new(accounts.device_history_key, false), + AccountMeta::new(accounts.client_seat_key, false), + AccountMeta::new(accounts.payment_escrow_key, false), + AccountMeta::new(accounts.payer_key, true), + AccountMeta::new(accounts.new_instant_allocation_request_key, false), + AccountMeta::new_readonly(solana_sdk_ids::system_program::ID, false), + ] + } +} + +/// Accounts for the `RequestInstantSeatWithdrawal` instruction (7 accounts). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RequestInstantSeatWithdrawalAccounts { + pub program_config_key: Pubkey, + pub execution_controller_key: Pubkey, + pub client_seat_key: Pubkey, + pub device_history_key: Pubkey, + pub payer_key: Pubkey, + pub withdraw_seat_request_key: Pubkey, +} + +impl RequestInstantSeatWithdrawalAccounts { + pub fn new(device_key: &Pubkey, client_ip_bits: u32, payer_key: &Pubkey) -> Self { + let client_seat_key = state::find_client_seat_address(device_key, client_ip_bits).0; + Self { + program_config_key: state::find_program_config_address().0, + execution_controller_key: state::find_execution_controller_address().0, + client_seat_key, + device_history_key: state::find_device_history_address(device_key).0, + payer_key: *payer_key, + withdraw_seat_request_key: state::find_withdraw_seat_request_address(&client_seat_key) + .0, + } + } +} + +impl From for Vec { + fn from(accounts: RequestInstantSeatWithdrawalAccounts) -> Self { + vec![ + AccountMeta::new_readonly(accounts.program_config_key, false), + AccountMeta::new(accounts.execution_controller_key, false), + AccountMeta::new(accounts.client_seat_key, false), + AccountMeta::new(accounts.device_history_key, false), + AccountMeta::new(accounts.payer_key, true), + AccountMeta::new(accounts.withdraw_seat_request_key, false), + AccountMeta::new_readonly(solana_sdk_ids::system_program::ID, false), + ] + } +} + +/// Accounts for the `RequestProratedInstantSeatWithdrawal` instruction (12 accounts). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RequestProratedInstantSeatWithdrawalAccounts { + pub program_config_key: Pubkey, + pub execution_controller_key: Pubkey, + pub client_seat_key: Pubkey, + pub device_history_key: Pubkey, + pub payment_escrow_key: Pubkey, + pub shred_distribution_key: Pubkey, + pub device_history_usdc_token_account_key: Pubkey, + pub shred_distribution_usdc_ata_key: Pubkey, + pub payer_key: Pubkey, + pub withdraw_seat_request_key: Pubkey, +} + +impl RequestProratedInstantSeatWithdrawalAccounts { + pub fn new( + device_key: &Pubkey, + client_ip_bits: u32, + funding_authority_key: &Pubkey, + subscription_epoch: u64, + usdc_mint_key: &Pubkey, + payer_key: &Pubkey, + ) -> Self { + let client_seat_key = state::find_client_seat_address(device_key, client_ip_bits).0; + let device_history_key = state::find_device_history_address(device_key).0; + let shred_distribution_key = state::find_shred_distribution_address(subscription_epoch).0; + Self { + program_config_key: state::find_program_config_address().0, + execution_controller_key: state::find_execution_controller_address().0, + client_seat_key, + device_history_key, + payment_escrow_key: state::find_payment_escrow_address( + &client_seat_key, + funding_authority_key, + ) + .0, + shred_distribution_key, + device_history_usdc_token_account_key: state::find_token_pda_address( + &device_history_key, + usdc_mint_key, + ) + .0, + shred_distribution_usdc_ata_key: get_associated_token_address( + &shred_distribution_key, + usdc_mint_key, + ), + payer_key: *payer_key, + withdraw_seat_request_key: state::find_withdraw_seat_request_address(&client_seat_key) + .0, + } + } +} + +impl From for Vec { + fn from(accounts: RequestProratedInstantSeatWithdrawalAccounts) -> Self { + vec![ + AccountMeta::new_readonly(accounts.program_config_key, false), + AccountMeta::new(accounts.execution_controller_key, false), + AccountMeta::new(accounts.client_seat_key, false), + AccountMeta::new(accounts.device_history_key, false), + AccountMeta::new(accounts.payment_escrow_key, false), + AccountMeta::new(accounts.shred_distribution_key, false), + AccountMeta::new(accounts.device_history_usdc_token_account_key, false), + AccountMeta::new(accounts.shred_distribution_usdc_ata_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + AccountMeta::new(accounts.payer_key, true), + AccountMeta::new(accounts.withdraw_seat_request_key, false), + AccountMeta::new_readonly(solana_sdk_ids::system_program::ID, false), + ] + } +} + +/// Accounts for the `SetValidatorClientRewardsProportion` instruction (3 accounts). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SetValidatorClientRewardsProportionAccounts { + pub program_config_key: Pubkey, + pub manager_key: Pubkey, + pub validator_client_rewards_key: Pubkey, +} + +impl SetValidatorClientRewardsProportionAccounts { + pub fn new(manager_key: &Pubkey, client_id: u16) -> Self { + Self { + program_config_key: state::find_program_config_address().0, + manager_key: *manager_key, + validator_client_rewards_key: state::find_validator_client_rewards_address(client_id).0, + } + } +} + +impl From for Vec { + fn from(accounts: SetValidatorClientRewardsProportionAccounts) -> Self { + vec![ + AccountMeta::new(accounts.program_config_key, false), + AccountMeta::new_readonly(accounts.manager_key, true), + AccountMeta::new_readonly(accounts.validator_client_rewards_key, false), + ] + } +} + +/// Accounts for the `CheckCliVersion` instruction (1 account). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CheckCliVersionAccounts { + pub program_config_key: Pubkey, +} + +impl Default for CheckCliVersionAccounts { + fn default() -> Self { + Self::new() + } +} + +impl CheckCliVersionAccounts { + pub fn new() -> Self { + Self { + program_config_key: state::find_program_config_address().0, + } + } +} + +impl From for Vec { + fn from(accounts: CheckCliVersionAccounts) -> Self { + vec![AccountMeta::new_readonly( + accounts.program_config_key, + false, + )] + } +} + +/// Accounts for the `FundPaymentEscrowUsdc` instruction (10 accounts). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct FundPaymentEscrowUsdcAccounts { + pub program_config_key: Pubkey, + pub execution_controller_key: Pubkey, + pub metro_history_key: Pubkey, + pub device_history_key: Pubkey, + pub client_seat_key: Pubkey, + pub payment_escrow_key: Pubkey, + pub device_history_usdc_token_account_key: Pubkey, + pub source_usdc_token_account_key: Pubkey, + pub transfer_authority_key: Pubkey, +} + +impl FundPaymentEscrowUsdcAccounts { + pub fn new( + exchange_key: &Pubkey, + device_key: &Pubkey, + client_ip_bits: u32, + withdraw_authority_key: &Pubkey, + usdc_mint_key: &Pubkey, + source_usdc_token_account_key: &Pubkey, + transfer_authority_key: &Pubkey, + ) -> Self { + let client_seat_key = state::find_client_seat_address(device_key, client_ip_bits).0; + let device_history_key = state::find_device_history_address(device_key).0; + Self { + program_config_key: state::find_program_config_address().0, + execution_controller_key: state::find_execution_controller_address().0, + metro_history_key: state::find_metro_history_address(exchange_key).0, + device_history_key, + client_seat_key, + payment_escrow_key: state::find_payment_escrow_address( + &client_seat_key, + withdraw_authority_key, + ) + .0, + device_history_usdc_token_account_key: state::find_token_pda_address( + &device_history_key, + usdc_mint_key, + ) + .0, + source_usdc_token_account_key: *source_usdc_token_account_key, + transfer_authority_key: *transfer_authority_key, + } + } +} + +impl From for Vec { + fn from(accounts: FundPaymentEscrowUsdcAccounts) -> Self { + vec![ + AccountMeta::new_readonly(accounts.program_config_key, false), + AccountMeta::new(accounts.execution_controller_key, false), + AccountMeta::new_readonly(accounts.metro_history_key, false), + AccountMeta::new_readonly(accounts.device_history_key, false), + AccountMeta::new(accounts.client_seat_key, false), + AccountMeta::new(accounts.payment_escrow_key, false), + AccountMeta::new(accounts.device_history_usdc_token_account_key, false), + AccountMeta::new(accounts.source_usdc_token_account_key, false), + AccountMeta::new_readonly(accounts.transfer_authority_key, true), + AccountMeta::new_readonly(spl_token_interface::ID, false), + ] + } +} + +/// Accounts for the `InitializeClaimHolding` instruction (6 accounts). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeClaimHoldingAccounts { + pub parent_pda_key: Pubkey, + pub payer_key: Pubkey, + pub new_claim_holding_key: Pubkey, + pub mint_key: Pubkey, +} + +impl InitializeClaimHoldingAccounts { + pub fn new( + client_id: u16, + subscription_epoch: u64, + mint_key: &Pubkey, + payer_key: &Pubkey, + ) -> Self { + let parent_pda_key = state::find_validator_client_rewards_address(client_id).0; + let new_claim_holding_key = + state::find_claim_holding_address(&parent_pda_key, subscription_epoch, mint_key).0; + Self { + parent_pda_key, + payer_key: *payer_key, + new_claim_holding_key, + mint_key: *mint_key, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeClaimHoldingAccounts) -> Self { + vec![ + AccountMeta::new(accounts.parent_pda_key, false), + AccountMeta::new(accounts.payer_key, true), + AccountMeta::new(accounts.new_claim_holding_key, false), + AccountMeta::new_readonly(accounts.mint_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + AccountMeta::new_readonly(solana_sdk_ids::system_program::ID, false), + ] + } +} + +/// Accounts for the `ClaimValidatorClientRewards` instruction (6 fixed + +/// one writable per claim holding in `claim_holding_account_keys`). +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ClaimValidatorClientRewardsAccounts { + pub program_config_key: Pubkey, + pub validator_client_rewards_key: Pubkey, + pub manager_key: Pubkey, + pub destination_token_account_key: Pubkey, + pub rent_beneficiary_key: Pubkey, + pub claim_holding_account_keys: Vec, +} + +impl ClaimValidatorClientRewardsAccounts { + pub fn new( + client_id: u16, + manager_key: &Pubkey, + destination_token_account_key: &Pubkey, + rent_beneficiary_key: &Pubkey, + mint_key: &Pubkey, + subscription_epochs: &[u64], + ) -> Self { + let validator_client_rewards_key = + state::find_validator_client_rewards_address(client_id).0; + let claim_holding_account_keys = subscription_epochs + .iter() + .map(|epoch| { + state::find_claim_holding_address(&validator_client_rewards_key, *epoch, mint_key).0 + }) + .collect(); + Self { + program_config_key: state::find_program_config_address().0, + validator_client_rewards_key, + manager_key: *manager_key, + destination_token_account_key: *destination_token_account_key, + rent_beneficiary_key: *rent_beneficiary_key, + claim_holding_account_keys, + } + } +} + +impl From for Vec { + fn from(accounts: ClaimValidatorClientRewardsAccounts) -> Self { + let mut metas = vec![ + AccountMeta::new_readonly(accounts.program_config_key, false), + AccountMeta::new(accounts.validator_client_rewards_key, false), + AccountMeta::new_readonly(accounts.manager_key, true), + AccountMeta::new(accounts.destination_token_account_key, false), + AccountMeta::new(accounts.rent_beneficiary_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + ]; + metas.extend( + accounts + .claim_holding_account_keys + .into_iter() + .map(|key| AccountMeta::new(key, false)), + ); + metas + } +} + +/// Accounts for the `InitializeValidatorPublisherRewards` instruction. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeValidatorPublisherRewardsAccounts { + pub payer_key: Pubkey, + pub new_validator_publisher_rewards_key: Pubkey, +} + +impl InitializeValidatorPublisherRewardsAccounts { + pub fn new(payer_key: &Pubkey, node_id: &Pubkey) -> Self { + Self { + payer_key: *payer_key, + new_validator_publisher_rewards_key: state::find_validator_publisher_rewards_address( + node_id, + ) + .0, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeValidatorPublisherRewardsAccounts) -> Self { + vec![ + AccountMeta::new(accounts.payer_key, true), + AccountMeta::new(accounts.new_validator_publisher_rewards_key, false), + AccountMeta::new_readonly(solana_sdk_ids::system_program::ID, false), + ] + } +} + +/// Accounts for the `ConfigureValidatorPublisherRewards` instruction. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ConfigureValidatorPublisherRewardsAccounts { + pub program_config_key: Pubkey, + pub shred_reward_token_key: Pubkey, + pub validator_node_key: Pubkey, + pub validator_publisher_rewards_key: Pubkey, + /// `true` when the `validator_node` account is a Solana signer on the + /// transaction (direct path); `false` when authorization is carried in + /// instruction data via `ValidatorOffchainAuthorization`. + pub is_node_signer: bool, +} + +impl ConfigureValidatorPublisherRewardsAccounts { + pub fn new(node_id: &Pubkey, rewards_token_mint_key: &Pubkey, is_node_signer: bool) -> Self { + Self { + program_config_key: state::find_program_config_address().0, + shred_reward_token_key: state::find_shred_reward_token_address(rewards_token_mint_key) + .0, + validator_node_key: *node_id, + validator_publisher_rewards_key: state::find_validator_publisher_rewards_address( + node_id, + ) + .0, + is_node_signer, + } + } +} + +impl From for Vec { + fn from(accounts: ConfigureValidatorPublisherRewardsAccounts) -> Self { + vec![ + AccountMeta::new_readonly(accounts.program_config_key, false), + AccountMeta::new_readonly(accounts.shred_reward_token_key, false), + AccountMeta::new_readonly(accounts.validator_node_key, accounts.is_node_signer), + AccountMeta::new(accounts.validator_publisher_rewards_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct DistributeValidatorRewardsAccounts { + pub program_config_key: Pubkey, + pub shred_distribution_key: Pubkey, + pub parent_distribution_key: Pubkey, + pub validator_publisher_rewards_key: Pubkey, + pub validator_client_rewards_key: Pubkey, + pub validator_publisher_journal_key: Pubkey, + // Omitted when the publisher journal IS the client journal (omit-rule + // fires when `client_mint_key` equals `publisher_mint_key`). The publisher + // journal then plays both roles, mirroring accumulate. + pub validator_client_journal_key: Option, + pub destination_ata_key: Pubkey, + pub shred_distribution_publisher_ata_key: Pubkey, + pub shred_distribution_client_ata_key: Pubkey, + pub client_claim_holding_key: Pubkey, +} + +#[derive(Debug)] +pub struct DistributeValidatorRewardsAccountsInitializer<'a> { + pub subscription_epoch: u64, + pub associated_dz_epoch: u64, + pub node_id: &'a Pubkey, + pub client_id: u16, + pub rewards_token_owner_key: &'a Pubkey, + pub publisher_mint_key: &'a Pubkey, + pub publisher_reward_mint_key: &'a Pubkey, + /// Mint that identifies the client-side journal. In the current + /// protocol this is always the 2Z mint (client rewards are routed + /// exclusively to the 2Z journal), so every caller today passes the + /// 2Z mint — but the field is a generic `&Pubkey` so a future + /// protocol version that routes client rewards to a different mint + /// works without an API change. + pub client_mint_key: &'a Pubkey, +} + +impl DistributeValidatorRewardsAccounts { + pub fn new(initializer: DistributeValidatorRewardsAccountsInitializer<'_>) -> Self { + let DistributeValidatorRewardsAccountsInitializer { + subscription_epoch, + associated_dz_epoch, + node_id, + client_id, + rewards_token_owner_key, + publisher_mint_key, + publisher_reward_mint_key, + client_mint_key, + } = initializer; + + let shred_distribution_key = state::find_shred_distribution_address(subscription_epoch).0; + let validator_client_rewards_key = + state::find_validator_client_rewards_address(client_id).0; + + // Omit-rule: when the publisher journal IS the client journal + // (their mints match), the publisher journal plays both roles and + // the client-side journal account drops out of the meta list. + // Otherwise the client side has its own journal at the 2Z mint, + // and the client-side ATA / claim_holding use the 2Z mint too. + let client_side_present = client_mint_key != publisher_mint_key; + let validator_client_journal_key = client_side_present.then(|| { + state::find_shred_distribution_journal_address(subscription_epoch, client_mint_key).0 + }); + let client_addresses_mint_key = if client_side_present { + client_mint_key + } else { + publisher_reward_mint_key + }; + + Self { + program_config_key: state::find_program_config_address().0, + shred_distribution_key, + parent_distribution_key: + crate::revenue_distribution::state::Distribution::find_address( + crate::revenue_distribution::types::DoubleZeroEpoch::new(associated_dz_epoch), + ) + .0, + validator_publisher_rewards_key: state::find_validator_publisher_rewards_address( + node_id, + ) + .0, + validator_client_rewards_key, + validator_publisher_journal_key: state::find_shred_distribution_journal_address( + subscription_epoch, + publisher_mint_key, + ) + .0, + validator_client_journal_key, + destination_ata_key: get_associated_token_address( + rewards_token_owner_key, + publisher_reward_mint_key, + ), + shred_distribution_publisher_ata_key: get_associated_token_address( + &shred_distribution_key, + publisher_reward_mint_key, + ), + shred_distribution_client_ata_key: get_associated_token_address( + &shred_distribution_key, + client_addresses_mint_key, + ), + client_claim_holding_key: state::find_claim_holding_address( + &validator_client_rewards_key, + subscription_epoch, + client_addresses_mint_key, + ) + .0, + } + } +} + +impl From> + for DistributeValidatorRewardsAccounts +{ + fn from(initializer: DistributeValidatorRewardsAccountsInitializer<'_>) -> Self { + Self::new(initializer) + } +} + +impl From> for Vec { + fn from(initializer: DistributeValidatorRewardsAccountsInitializer<'_>) -> Self { + DistributeValidatorRewardsAccounts::new(initializer).into() + } +} + +impl From for Vec { + fn from(accounts: DistributeValidatorRewardsAccounts) -> Self { + let DistributeValidatorRewardsAccounts { + program_config_key, + shred_distribution_key, + parent_distribution_key, + validator_publisher_rewards_key, + validator_client_rewards_key, + validator_publisher_journal_key, + validator_client_journal_key, + destination_ata_key, + shred_distribution_publisher_ata_key, + shred_distribution_client_ata_key, + client_claim_holding_key, + } = accounts; + + let mut account_metas = vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new_readonly(shred_distribution_key, false), + AccountMeta::new_readonly(parent_distribution_key, false), + AccountMeta::new_readonly(validator_publisher_rewards_key, false), + AccountMeta::new_readonly(validator_client_rewards_key, false), + AccountMeta::new(validator_publisher_journal_key, false), + ]; + + if let Some(validator_client_journal_key) = validator_client_journal_key { + account_metas.push(AccountMeta::new(validator_client_journal_key, false)); + } + + account_metas.extend([ + AccountMeta::new(destination_ata_key, false), + AccountMeta::new(shred_distribution_publisher_ata_key, false), + AccountMeta::new(shred_distribution_client_ata_key, false), + AccountMeta::new(client_claim_holding_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + ]); + + account_metas + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn initialize_claim_holding_metas_order() { + let payer = Pubkey::new_unique(); + let mint = Pubkey::new_unique(); + let client_id: u16 = 7; + let epoch: u64 = 1234; + let accounts = InitializeClaimHoldingAccounts::new(client_id, epoch, &mint, &payer); + let parent_pda = state::find_validator_client_rewards_address(client_id).0; + let holding_pda = state::find_claim_holding_address(&parent_pda, epoch, &mint).0; + assert_eq!(accounts.parent_pda_key, parent_pda); + assert_eq!(accounts.new_claim_holding_key, holding_pda); + assert_eq!(accounts.payer_key, payer); + assert_eq!(accounts.mint_key, mint); + + let metas: Vec = accounts.into(); + assert_eq!(metas.len(), 6); + // 0: parent_pda (writable, not signer) + assert_eq!(metas[0].pubkey, parent_pda); + assert!(metas[0].is_writable && !metas[0].is_signer); + // 1: payer (writable, signer) + assert_eq!(metas[1].pubkey, payer); + assert!(metas[1].is_writable && metas[1].is_signer); + // 2: new_holding (writable, not signer) + assert_eq!(metas[2].pubkey, holding_pda); + assert!(metas[2].is_writable && !metas[2].is_signer); + // 3: mint (readonly, not signer) + assert_eq!(metas[3].pubkey, mint); + assert!(!metas[3].is_writable && !metas[3].is_signer); + // 4: spl token program (readonly, not signer) + assert_eq!(metas[4].pubkey, spl_token_interface::ID); + assert!(!metas[4].is_writable && !metas[4].is_signer); + // 5: system program (readonly, not signer) + assert_eq!(metas[5].pubkey, solana_sdk_ids::system_program::ID); + assert!(!metas[5].is_writable && !metas[5].is_signer); + } + + #[test] + fn claim_validator_client_rewards_metas_order_empty() { + let manager = Pubkey::new_unique(); + let destination = Pubkey::new_unique(); + let rent_beneficiary = Pubkey::new_unique(); + let mint = Pubkey::new_unique(); + let client_id: u16 = 11; + let accounts = ClaimValidatorClientRewardsAccounts::new( + client_id, + &manager, + &destination, + &rent_beneficiary, + &mint, + &[], + ); + let vcr = state::find_validator_client_rewards_address(client_id).0; + let cfg = state::find_program_config_address().0; + assert_eq!(accounts.program_config_key, cfg); + assert_eq!(accounts.validator_client_rewards_key, vcr); + assert_eq!(accounts.manager_key, manager); + assert_eq!(accounts.destination_token_account_key, destination); + assert_eq!(accounts.rent_beneficiary_key, rent_beneficiary); + assert!(accounts.claim_holding_account_keys.is_empty()); + + let metas: Vec = accounts.into(); + assert_eq!(metas.len(), 6); + // 0: program_config (readonly, not signer) + assert_eq!(metas[0].pubkey, cfg); + assert!(!metas[0].is_writable && !metas[0].is_signer); + // 1: VCR (writable, not signer) + assert_eq!(metas[1].pubkey, vcr); + assert!(metas[1].is_writable && !metas[1].is_signer); + // 2: manager (readonly, SIGNER) + assert_eq!(metas[2].pubkey, manager); + assert!(!metas[2].is_writable && metas[2].is_signer); + // 3: destination (writable, not signer) + assert_eq!(metas[3].pubkey, destination); + assert!(metas[3].is_writable && !metas[3].is_signer); + // 4: rent_beneficiary (writable, not signer) + assert_eq!(metas[4].pubkey, rent_beneficiary); + assert!(metas[4].is_writable && !metas[4].is_signer); + // 5: spl token program (readonly, not signer) + assert_eq!(metas[5].pubkey, spl_token_interface::ID); + assert!(!metas[5].is_writable && !metas[5].is_signer); + } + + #[test] + fn claim_validator_client_rewards_metas_with_three_holdings() { + let manager = Pubkey::new_unique(); + let destination = Pubkey::new_unique(); + let rent_beneficiary = Pubkey::new_unique(); + let mint = Pubkey::new_unique(); + let client_id: u16 = 11; + let epochs: &[u64] = &[100, 101, 102]; + let accounts = ClaimValidatorClientRewardsAccounts::new( + client_id, + &manager, + &destination, + &rent_beneficiary, + &mint, + epochs, + ); + let vcr = state::find_validator_client_rewards_address(client_id).0; + let expected_holdings: Vec = epochs + .iter() + .map(|e| state::find_claim_holding_address(&vcr, *e, &mint).0) + .collect(); + assert_eq!(accounts.claim_holding_account_keys, expected_holdings); + + let metas: Vec = accounts.into(); + assert_eq!(metas.len(), 6 + 3); + for (i, expected_holding) in expected_holdings.iter().enumerate() { + let meta = &metas[6 + i]; + assert_eq!(meta.pubkey, *expected_holding); + assert!(meta.is_writable && !meta.is_signer); + } + } + + #[test] + fn initialize_vpr_account_metas() { + let payer = Pubkey::new_unique(); + let node_id = Pubkey::new_unique(); + let metas: Vec = + InitializeValidatorPublisherRewardsAccounts::new(&payer, &node_id).into(); + assert_eq!(metas.len(), 3); + // 0: payer (signer, mut) + assert!(metas[0].is_signer); + assert!(metas[0].is_writable); + assert_eq!(metas[0].pubkey, payer); + // 1: new VPR PDA (mut, not signer) + assert!(!metas[1].is_signer); + assert!(metas[1].is_writable); + // 2: system program (ro) + assert!(!metas[2].is_signer); + assert!(!metas[2].is_writable); + assert_eq!(metas[2].pubkey, solana_sdk_ids::system_program::ID); + } + + #[test] + fn configure_vpr_account_metas_direct() { + let node_id = Pubkey::new_unique(); + let mint = Pubkey::new_unique(); + let metas: Vec = ConfigureValidatorPublisherRewardsAccounts::new( + &node_id, &mint, /* is_node_signer = */ true, + ) + .into(); + assert_eq!(metas.len(), 4); + // 0: program_config (ro) + assert!(!metas[0].is_signer); + assert!(!metas[0].is_writable); + // 1: shred_reward_token (ro) + assert!(!metas[1].is_signer); + assert!(!metas[1].is_writable); + // 2: validator_node (signer in direct path, ro) + assert!(metas[2].is_signer); + assert!(!metas[2].is_writable); + assert_eq!(metas[2].pubkey, node_id); + // 3: vpr PDA (mut) + assert!(!metas[3].is_signer); + assert!(metas[3].is_writable); + } + + #[test] + fn configure_vpr_account_metas_offchain() { + let node_id = Pubkey::new_unique(); + let mint = Pubkey::new_unique(); + let metas: Vec = ConfigureValidatorPublisherRewardsAccounts::new( + &node_id, &mint, /* is_node_signer = */ false, + ) + .into(); + // Validator node not a signer in offchain path. + assert!(!metas[2].is_signer); + } +} diff --git a/offchain/crates/solana-sdk/src/shred_subscription/instruction/mod.rs b/offchain/crates/solana-sdk/src/shred_subscription/instruction/mod.rs new file mode 100644 index 0000000000..82a613f753 --- /dev/null +++ b/offchain/crates/solana-sdk/src/shred_subscription/instruction/mod.rs @@ -0,0 +1,394 @@ +pub mod account; + +use std::io; + +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_tools::{DISCRIMINATOR_LEN, Discriminator}; +use solana_sdk::pubkey::Pubkey; +use svm_hash::merkle::MerkleProof; + +/// Envelope for an offchain authorization produced by a validator operator +/// via `solana sign-offchain-message`. Carries the ed25519 signature plus the +/// cluster slot after which the authorization is no longer valid. Mirrors the +/// on-chain `ValidatorOffchainAuthorization` Borsh layout. +#[derive(Debug, Clone, PartialEq, Eq, BorshSerialize, BorshDeserialize)] +pub struct ValidatorOffchainAuthorization { + pub deadline_slot: u64, + pub signature: [u8; 64], +} + +/// Identifier for a single claim holding account, used as a payload element +/// in `ClaimValidatorClientRewards`. Mirrors the on-chain struct byte for +/// byte: `subscription_epoch: u64` followed by `bump_seed: u8`. +#[derive(Clone, Copy, Debug, PartialEq, Eq, BorshSerialize, BorshDeserialize)] +pub struct ClaimHoldingId { + pub subscription_epoch: u64, + pub bump_seed: u8, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ShredSubscriptionInstructionData { + /// Initialize a client seat for a (device, client_ip) pair. + InitializeClientSeat { client_ip: u32 }, + /// Initialize a payment escrow for a (seat, withdraw_authority) pair. + InitializePaymentEscrow, + /// Close a payment escrow and refund any remaining USDC. + ClosePaymentEscrow, + /// Fund a payment escrow with USDC. + FundPaymentEscrowUsdc(u64), + /// Request instant allocation for a funded seat (skips auction settlement). + RequestInstantSeatAllocation, + /// Request instant seat withdrawal. + RequestInstantSeatWithdrawal, + /// Request instant seat withdrawal with a prorated USDC refund based on + /// the remaining slots in the epoch. Superset of + /// `RequestInstantSeatWithdrawal` (more accounts). + RequestProratedInstantSeatWithdrawal, + /// Set the rewards proportion for a validator client. + SetValidatorClientRewardsProportion(u16), + /// Permissionless. Initialize a non-ATA claim holding token account + /// owned by the `ValidatorClientRewards` parent PDA for + /// `(subscription_epoch, mint)`. Payload is the subscription epoch. + InitializeClaimHolding(u64), + /// `ValidatorClientRewards.manager_key`-signed. Drain N claim holdings + /// into a destination token account and close each, recovering rent to + /// `program_config.shred_oracle_key`. + ClaimValidatorClientRewards(Vec), + /// Anyone can initialize validator publisher rewards for a given node. + /// The `node_id` must not be `Pubkey::default()`. + InitializeValidatorPublisherRewards(Pubkey), + /// Set the reward token owner and mint on a previously initialized + /// validator publisher rewards account. Two auth paths: + /// - `offchain_authorization = Some(_)`: ed25519 signature produced by the + /// `node_id` keypair via `solana sign-offchain-message` over + /// `ConfigureValidatorPublisherRewardsAuthMessage::to_hex_encoded()`. + /// - `offchain_authorization = None`: the `validator_node` account must be + /// a Solana signer on the transaction. + ConfigureValidatorPublisherRewards { + rewards_token_owner_key: Pubkey, + offchain_authorization: Option, + }, + /// Permissionless. Distribute a single validator's accumulated rewards + /// for one (subscription_epoch, journal) pair: transfers the publisher + /// share to the validator's destination ATA and the client share into + /// the per-epoch claim-holding account. Authenticates the leaf via the + /// merkle proof against the journal's root. + DistributeValidatorRewards { + leader_slots: u32, + proof: MerkleProof, + }, + /// Validates the provided CLI version against the onchain minimum. + CheckCliVersion { major: u32, minor: u32, patch: u32 }, +} + +impl ShredSubscriptionInstructionData { + pub const INITIALIZE_CLIENT_SEAT: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_client_seat"); + pub const INITIALIZE_PAYMENT_ESCROW: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_payment_escrow"); + pub const CLOSE_PAYMENT_ESCROW: Discriminator = + Discriminator::new_sha2(b"dz::ix::close_payment_escrow"); + pub const FUND_PAYMENT_ESCROW_USDC: Discriminator = + Discriminator::new_sha2(b"dz::ix::fund_payment_escrow_usdc"); + pub const REQUEST_INSTANT_SEAT_ALLOCATION: Discriminator = + Discriminator::new_sha2(b"dz::ix::request_instant_seat_allocation"); + pub const REQUEST_INSTANT_SEAT_WITHDRAWAL: Discriminator = + Discriminator::new_sha2(b"dz::ix::request_instant_seat_withdrawal"); + pub const REQUEST_PRORATED_INSTANT_SEAT_WITHDRAWAL: Discriminator = + Discriminator::new_sha2(b"dz::ix::request_prorated_instant_seat_withdrawal"); + pub const SET_VALIDATOR_CLIENT_REWARDS_PROPORTION: Discriminator = + Discriminator::new_sha2(b"dz::ix::set_validator_client_rewards_proportion"); + pub const INITIALIZE_CLAIM_HOLDING: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_claim_holding"); + pub const CLAIM_VALIDATOR_CLIENT_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::ix::claim_validator_client_rewards"); + pub const INITIALIZE_VALIDATOR_PUBLISHER_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_validator_publisher_rewards"); + pub const CONFIGURE_VALIDATOR_PUBLISHER_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::ix::configure_validator_publisher_rewards"); + pub const DISTRIBUTE_VALIDATOR_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::ix::distribute_validator_rewards"); + pub const CHECK_CLI_VERSION: Discriminator = + Discriminator::new_sha2(b"dz::ix::check_cli_version"); +} + +impl BorshSerialize for ShredSubscriptionInstructionData { + fn serialize(&self, writer: &mut W) -> io::Result<()> { + match self { + Self::InitializeClientSeat { client_ip } => { + Self::INITIALIZE_CLIENT_SEAT.serialize(writer)?; + client_ip.serialize(writer) + } + Self::InitializePaymentEscrow => Self::INITIALIZE_PAYMENT_ESCROW.serialize(writer), + Self::ClosePaymentEscrow => Self::CLOSE_PAYMENT_ESCROW.serialize(writer), + Self::FundPaymentEscrowUsdc(amount) => { + Self::FUND_PAYMENT_ESCROW_USDC.serialize(writer)?; + amount.serialize(writer) + } + Self::RequestInstantSeatAllocation => { + Self::REQUEST_INSTANT_SEAT_ALLOCATION.serialize(writer) + } + Self::RequestInstantSeatWithdrawal => { + Self::REQUEST_INSTANT_SEAT_WITHDRAWAL.serialize(writer) + } + Self::RequestProratedInstantSeatWithdrawal => { + Self::REQUEST_PRORATED_INSTANT_SEAT_WITHDRAWAL.serialize(writer) + } + Self::SetValidatorClientRewardsProportion(proportion) => { + Self::SET_VALIDATOR_CLIENT_REWARDS_PROPORTION.serialize(writer)?; + proportion.serialize(writer) + } + Self::InitializeClaimHolding(subscription_epoch) => { + Self::INITIALIZE_CLAIM_HOLDING.serialize(writer)?; + subscription_epoch.serialize(writer) + } + Self::ClaimValidatorClientRewards(holdings) => { + Self::CLAIM_VALIDATOR_CLIENT_REWARDS.serialize(writer)?; + holdings.serialize(writer) + } + Self::InitializeValidatorPublisherRewards(node_id) => { + Self::INITIALIZE_VALIDATOR_PUBLISHER_REWARDS.serialize(writer)?; + node_id.serialize(writer) + } + Self::ConfigureValidatorPublisherRewards { + rewards_token_owner_key, + offchain_authorization, + } => { + Self::CONFIGURE_VALIDATOR_PUBLISHER_REWARDS.serialize(writer)?; + rewards_token_owner_key.serialize(writer)?; + offchain_authorization.serialize(writer) + } + Self::DistributeValidatorRewards { + leader_slots, + proof, + } => { + Self::DISTRIBUTE_VALIDATOR_REWARDS.serialize(writer)?; + leader_slots.serialize(writer)?; + proof.serialize(writer) + } + Self::CheckCliVersion { + major, + minor, + patch, + } => { + Self::CHECK_CLI_VERSION.serialize(writer)?; + major.serialize(writer)?; + minor.serialize(writer)?; + patch.serialize(writer) + } + } + } +} + +impl BorshDeserialize for ShredSubscriptionInstructionData { + fn deserialize_reader(reader: &mut R) -> io::Result { + match Discriminator::deserialize_reader(reader)? { + Self::INITIALIZE_CLIENT_SEAT => { + let client_ip = u32::deserialize_reader(reader)?; + Ok(Self::InitializeClientSeat { client_ip }) + } + Self::INITIALIZE_PAYMENT_ESCROW => Ok(Self::InitializePaymentEscrow), + Self::CLOSE_PAYMENT_ESCROW => Ok(Self::ClosePaymentEscrow), + Self::FUND_PAYMENT_ESCROW_USDC => { + let amount = u64::deserialize_reader(reader)?; + Ok(Self::FundPaymentEscrowUsdc(amount)) + } + Self::REQUEST_INSTANT_SEAT_ALLOCATION => Ok(Self::RequestInstantSeatAllocation), + Self::REQUEST_INSTANT_SEAT_WITHDRAWAL => Ok(Self::RequestInstantSeatWithdrawal), + Self::REQUEST_PRORATED_INSTANT_SEAT_WITHDRAWAL => { + Ok(Self::RequestProratedInstantSeatWithdrawal) + } + Self::SET_VALIDATOR_CLIENT_REWARDS_PROPORTION => { + let proportion = u16::deserialize_reader(reader)?; + Ok(Self::SetValidatorClientRewardsProportion(proportion)) + } + Self::INITIALIZE_CLAIM_HOLDING => { + let subscription_epoch = u64::deserialize_reader(reader)?; + Ok(Self::InitializeClaimHolding(subscription_epoch)) + } + Self::CLAIM_VALIDATOR_CLIENT_REWARDS => { + let holdings = Vec::::deserialize_reader(reader)?; + Ok(Self::ClaimValidatorClientRewards(holdings)) + } + Self::INITIALIZE_VALIDATOR_PUBLISHER_REWARDS => { + let node_id = Pubkey::deserialize_reader(reader)?; + Ok(Self::InitializeValidatorPublisherRewards(node_id)) + } + Self::CONFIGURE_VALIDATOR_PUBLISHER_REWARDS => { + let rewards_token_owner_key = Pubkey::deserialize_reader(reader)?; + let offchain_authorization = + Option::::deserialize_reader(reader)?; + Ok(Self::ConfigureValidatorPublisherRewards { + rewards_token_owner_key, + offchain_authorization, + }) + } + Self::DISTRIBUTE_VALIDATOR_REWARDS => { + let leader_slots = u32::deserialize_reader(reader)?; + let proof = MerkleProof::deserialize_reader(reader)?; + Ok(Self::DistributeValidatorRewards { + leader_slots, + proof, + }) + } + Self::CHECK_CLI_VERSION => { + let major = u32::deserialize_reader(reader)?; + let minor = u32::deserialize_reader(reader)?; + let patch = u32::deserialize_reader(reader)?; + Ok(Self::CheckCliVersion { + major, + minor, + patch, + }) + } + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid discriminator", + )), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn round_trip(ix: &ShredSubscriptionInstructionData) { + let bytes = borsh::to_vec(ix).unwrap(); + let parsed = ShredSubscriptionInstructionData::try_from_slice(&bytes).unwrap(); + assert_eq!(*ix, parsed); + } + + #[test] + fn claim_holding_id_round_trip() { + let id = ClaimHoldingId { + subscription_epoch: 0x1122_3344_5566_7788, + bump_seed: 0xAB, + }; + let bytes = borsh::to_vec(&id).unwrap(); + assert_eq!(bytes.len(), 9); + let decoded: ClaimHoldingId = borsh::from_slice(&bytes).unwrap(); + assert_eq!(decoded, id); + } + + #[test] + fn claim_holding_id_frozen_bytes() { + let id = ClaimHoldingId { + subscription_epoch: 0x0807_0605_0403_0201, + bump_seed: 0xFF, + }; + let bytes = borsh::to_vec(&id).unwrap(); + assert_eq!( + bytes, + vec![0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF] + ); + } + + #[test] + fn round_trip_initialize_claim_holding() { + let ix = ShredSubscriptionInstructionData::InitializeClaimHolding(0xDEAD_BEEF_CAFE_BABE); + let bytes = borsh::to_vec(&ix).unwrap(); + let decoded = ShredSubscriptionInstructionData::try_from_slice(&bytes).unwrap(); + assert_eq!(decoded, ix); + } + + #[test] + fn round_trip_claim_validator_client_rewards_empty() { + let ix = ShredSubscriptionInstructionData::ClaimValidatorClientRewards(vec![]); + let bytes = borsh::to_vec(&ix).unwrap(); + let decoded = ShredSubscriptionInstructionData::try_from_slice(&bytes).unwrap(); + assert_eq!(decoded, ix); + } + + #[test] + fn round_trip_claim_validator_client_rewards_multiple() { + let ix = ShredSubscriptionInstructionData::ClaimValidatorClientRewards(vec![ + ClaimHoldingId { + subscription_epoch: 100, + bump_seed: 254, + }, + ClaimHoldingId { + subscription_epoch: 101, + bump_seed: 253, + }, + ClaimHoldingId { + subscription_epoch: 102, + bump_seed: 252, + }, + ]); + let bytes = borsh::to_vec(&ix).unwrap(); + let decoded = ShredSubscriptionInstructionData::try_from_slice(&bytes).unwrap(); + assert_eq!(decoded, ix); + } + + #[test] + fn frozen_bytes_initialize_claim_holding() { + let ix = ShredSubscriptionInstructionData::InitializeClaimHolding(0x01); + let mut expected = + borsh::to_vec(&ShredSubscriptionInstructionData::INITIALIZE_CLAIM_HOLDING) + .expect("discriminator serialization"); + expected.extend_from_slice(&1u64.to_le_bytes()); + assert_eq!(borsh::to_vec(&ix).unwrap(), expected); + } + + #[test] + fn frozen_bytes_claim_validator_client_rewards_one_entry() { + let ix = + ShredSubscriptionInstructionData::ClaimValidatorClientRewards(vec![ClaimHoldingId { + subscription_epoch: 7, + bump_seed: 250, + }]); + let mut expected = + borsh::to_vec(&ShredSubscriptionInstructionData::CLAIM_VALIDATOR_CLIENT_REWARDS) + .expect("discriminator serialization"); + // Borsh vec length prefix is u32 LE. + expected.extend_from_slice(&1u32.to_le_bytes()); + expected.extend_from_slice(&7u64.to_le_bytes()); + expected.push(250); + assert_eq!(borsh::to_vec(&ix).unwrap(), expected); + } + + #[test] + fn round_trip_initialize_validator_publisher_rewards() { + round_trip( + &ShredSubscriptionInstructionData::InitializeValidatorPublisherRewards( + Pubkey::new_unique(), + ), + ); + } + + #[test] + fn round_trip_configure_validator_publisher_rewards_direct() { + round_trip( + &ShredSubscriptionInstructionData::ConfigureValidatorPublisherRewards { + rewards_token_owner_key: Pubkey::new_unique(), + offchain_authorization: None, + }, + ); + } + + #[test] + fn round_trip_configure_validator_publisher_rewards_offchain() { + round_trip( + &ShredSubscriptionInstructionData::ConfigureValidatorPublisherRewards { + rewards_token_owner_key: Pubkey::new_unique(), + offchain_authorization: Some(ValidatorOffchainAuthorization { + deadline_slot: 999_888, + signature: [7u8; 64], + }), + }, + ); + } + + #[test] + fn round_trip_distribute_validator_rewards() { + let leaves: [&[u8]; 2] = [b"leaf_a", b"leaf_b"]; + let proof = MerkleProof::from_leaves(&leaves, 0, None).expect("two-leaf proof at index 0"); + round_trip( + &ShredSubscriptionInstructionData::DistributeValidatorRewards { + leader_slots: 1_234, + proof, + }, + ); + } +} diff --git a/offchain/crates/solana-sdk/src/shred_subscription/mod.rs b/offchain/crates/solana-sdk/src/shred_subscription/mod.rs new file mode 100644 index 0000000000..c557d7818b --- /dev/null +++ b/offchain/crates/solana-sdk/src/shred_subscription/mod.rs @@ -0,0 +1,18 @@ +pub mod env; +pub mod instruction; +pub mod state; +pub mod types; + +use std::sync::LazyLock; + +use solana_sdk::pubkey::Pubkey; + +const DEFAULT_ID: Pubkey = solana_sdk::pubkey!("dzshrr3yL57SB13sJPYHYo3TV8Bo1i1FxkyrZr3bKNE"); + +/// Shred subscription program ID. +pub static ID: LazyLock = LazyLock::new(|| { + std::env::var("SHRED_SUBSCRIPTION_PROGRAM_ID") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(DEFAULT_ID) +}); diff --git a/offchain/crates/solana-sdk/src/shred_subscription/state.rs b/offchain/crates/solana-sdk/src/shred_subscription/state.rs new file mode 100644 index 0000000000..a644e11eb2 --- /dev/null +++ b/offchain/crates/solana-sdk/src/shred_subscription/state.rs @@ -0,0 +1,1268 @@ +use std::{net::Ipv4Addr, ops::Range}; + +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{ + DISCRIMINATOR_LEN, Discriminator, PrecomputedDiscriminator, + types::{Flags, StorageGap}, +}; +use doublezero_revenue_distribution::types::{DoubleZeroEpoch, UnitShare16}; +use solana_sdk::pubkey::Pubkey; +use svm_hash::sha2::Hash; + +pub const PROGRAM_CONFIG_SEED_PREFIX: &[u8] = b"program_config"; +pub const EXECUTION_CONTROLLER_SEED_PREFIX: &[u8] = b"execution_controller"; +pub const DEVICE_HISTORY_SEED_PREFIX: &[u8] = b"device_history"; +pub const CLIENT_SEAT_SEED_PREFIX: &[u8] = b"client_seat"; +pub const METRO_HISTORY_SEED_PREFIX: &[u8] = b"metro_history"; +pub const TOKEN_PDA_SEED_PREFIX: &[u8] = b"token"; +pub const PAYMENT_ESCROW_SEED_PREFIX: &[u8] = b"payment_escrow"; +pub const VALIDATOR_CLIENT_REWARDS_SEED_PREFIX: &[u8] = b"validator_client_rewards"; +pub const VALIDATOR_PUBLISHER_REWARDS_SEED_PREFIX: &[u8] = b"validator_publisher_rewards"; +pub const SHRED_REWARD_TOKEN_SEED_PREFIX: &[u8] = b"shred_reward_token"; +pub const INSTANT_ALLOCATION_REQUEST_SEED_PREFIX: &[u8] = b"instant_seat_allocation_request"; +pub const WITHDRAW_SEAT_REQUEST_SEED_PREFIX: &[u8] = b"withdraw_seat_request"; +pub const SHRED_DISTRIBUTION_SEED_PREFIX: &[u8] = b"shred_distribution"; +pub const SHRED_DISTRIBUTION_JOURNAL_SEED_PREFIX: &[u8] = b"shred_distribution_journal"; +pub const CLAIM_HOLDING_SEED_PREFIX: &[u8] = b"claim"; + +pub fn find_program_config_address() -> (Pubkey, u8) { + Pubkey::find_program_address( + &[PROGRAM_CONFIG_SEED_PREFIX], + &crate::shred_subscription::ID, + ) +} + +pub fn find_execution_controller_address() -> (Pubkey, u8) { + Pubkey::find_program_address( + &[EXECUTION_CONTROLLER_SEED_PREFIX], + &crate::shred_subscription::ID, + ) +} + +pub fn find_device_history_address(device_key: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[DEVICE_HISTORY_SEED_PREFIX, device_key.as_ref()], + &crate::shred_subscription::ID, + ) +} + +pub fn find_client_seat_address(device_key: &Pubkey, client_ip_bits: u32) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + CLIENT_SEAT_SEED_PREFIX, + device_key.as_ref(), + &client_ip_bits.to_le_bytes(), + ], + &crate::shred_subscription::ID, + ) +} + +pub fn find_metro_history_address(exchange_key: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[METRO_HISTORY_SEED_PREFIX, exchange_key.as_ref()], + &crate::shred_subscription::ID, + ) +} + +pub fn find_token_pda_address(token_owner_key: &Pubkey, mint_key: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + TOKEN_PDA_SEED_PREFIX, + token_owner_key.as_ref(), + mint_key.as_ref(), + ], + &crate::shred_subscription::ID, + ) +} + +pub fn find_validator_client_rewards_address(client_id: u16) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + VALIDATOR_CLIENT_REWARDS_SEED_PREFIX, + &client_id.to_le_bytes(), + ], + &crate::shred_subscription::ID, + ) +} + +pub fn find_validator_publisher_rewards_address(node_id: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[VALIDATOR_PUBLISHER_REWARDS_SEED_PREFIX, node_id.as_ref()], + &crate::shred_subscription::ID, + ) +} + +pub fn find_shred_reward_token_address(mint_key: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[SHRED_REWARD_TOKEN_SEED_PREFIX, mint_key.as_ref()], + &crate::shred_subscription::ID, + ) +} + +pub fn find_instant_allocation_request_address( + device_key: &Pubkey, + client_ip_bits: u32, +) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + INSTANT_ALLOCATION_REQUEST_SEED_PREFIX, + device_key.as_ref(), + &client_ip_bits.to_le_bytes(), + ], + &crate::shred_subscription::ID, + ) +} + +pub fn find_withdraw_seat_request_address(client_seat_key: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[WITHDRAW_SEAT_REQUEST_SEED_PREFIX, client_seat_key.as_ref()], + &crate::shred_subscription::ID, + ) +} + +pub fn find_payment_escrow_address( + client_seat_key: &Pubkey, + withdraw_authority_key: &Pubkey, +) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + PAYMENT_ESCROW_SEED_PREFIX, + client_seat_key.as_ref(), + withdraw_authority_key.as_ref(), + ], + &crate::shred_subscription::ID, + ) +} + +pub fn find_shred_distribution_address(subscription_epoch: u64) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + SHRED_DISTRIBUTION_SEED_PREFIX, + &subscription_epoch.to_le_bytes(), + ], + &crate::shred_subscription::ID, + ) +} + +pub fn find_shred_distribution_journal_address( + subscription_epoch: u64, + mint_key: &Pubkey, +) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + SHRED_DISTRIBUTION_JOURNAL_SEED_PREFIX, + &subscription_epoch.to_le_bytes(), + mint_key.as_ref(), + ], + &crate::shred_subscription::ID, + ) +} + +pub fn find_claim_holding_address( + parent_pda_key: &Pubkey, + subscription_epoch: u64, + mint_key: &Pubkey, +) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + CLAIM_HOLDING_SEED_PREFIX, + parent_pda_key.as_ref(), + &subscription_epoch.to_le_bytes(), + mint_key.as_ref(), + ], + &crate::shred_subscription::ID, + ) +} + +// --------------------------------------------------------------------------- +// ProgramConfig raw-byte parsing. +// +// Layout (ZeroCopy with 8-byte discriminator prefix): +// [0..8) discriminator +// [8..16) flags: Flags (u64, LE) -- first field, stable since account +// was introduced. Bit 2 gates prorated instant service. +// ... (remaining fields irrelevant for the CLI today) +// --------------------------------------------------------------------------- + +pub const PROGRAM_CONFIG_DISCRIMINATOR: Discriminator = + Discriminator::new_sha2(b"dz::account::program_config"); + +pub const PROGRAM_CONFIG_FLAGS_OFFSET: usize = DISCRIMINATOR_LEN; +pub const PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET: usize = DISCRIMINATOR_LEN + 48; + +const PROGRAM_CONFIG_FLAG_IS_PRORATED_SERVICE_ENABLED_BIT: u64 = 1 << 2; +const PROGRAM_CONFIG_FLAG_DISTRIBUTE_VALIDATOR_REWARDS_ENABLED_BIT: u64 = 1 << 5; + +/// Returns `true` if the `is_prorated_service_enabled` bit is set on the +/// raw `ProgramConfig` account data. Returns `false` for accounts that are +/// too short to contain the flags word (e.g. a pre-prorated program +/// deployment), which is the same behavior as the flag being unset. +pub fn is_prorated_service_enabled(data: &[u8]) -> bool { + if data.len() < PROGRAM_CONFIG_FLAGS_OFFSET + 8 { + return false; + } + let Ok(flags_bytes) = + <[u8; 8]>::try_from(&data[PROGRAM_CONFIG_FLAGS_OFFSET..PROGRAM_CONFIG_FLAGS_OFFSET + 8]) + else { + return false; + }; + let flags = u64::from_le_bytes(flags_bytes); + flags & PROGRAM_CONFIG_FLAG_IS_PRORATED_SERVICE_ENABLED_BIT != 0 +} + +/// Offset of `ExecutionController::last_settled_epoch` within the raw account +/// data (after the discriminator). On-chain field layout preceding it: +/// +/// ```text +/// phase_field(u8) + bump_seed(u8) + pad(2) + total_metros(u16) + +/// total_enabled_devices(u16) + total_client_seats(u32) + +/// oracle_instant_request_count(u16) + validator_client_ids_count(u8) + pad(1) +/// + flags(8) = 24 bytes to current_subscription_epoch, then 120 more: +/// current_subscription_epoch(u64) + +/// updated_device_prices_count(u16) + settled_devices_count(u16) + +/// settled_client_seats_count(u16) + total_devices(u16) + last_settled_slot(u64) +/// + last_updating_prices_slot(u64) + last_open_for_requests_slot(u64) + +/// last_closed_for_requests_slot(u64) + epoch_round_commitment(32) + +/// epoch_round_reveal(32) + next_seat_funding_index(u64) = 120 → 24 + 120 = 144. +/// ``` +pub const EXECUTION_CONTROLLER_LAST_SETTLED_EPOCH_OFFSET: usize = DISCRIMINATOR_LEN + 144; + +/// Reads `last_settled_epoch` from raw `ExecutionController` account data. +/// Returns `None` if the account is too short to contain the field. +pub fn parse_execution_controller_last_settled_epoch(data: &[u8]) -> Option { + let start = EXECUTION_CONTROLLER_LAST_SETTLED_EPOCH_OFFSET; + let bytes = data.get(start..start + 8)?; + Some(u64::from_le_bytes(<[u8; 8]>::try_from(bytes).ok()?)) +} + +/// Returns `true` if the `distribute_validator_rewards_enabled` bit is set +/// on the raw `ProgramConfig` account data. Mirrors the on-chain +/// `ProgramConfig::FLAG_DISTRIBUTE_VALIDATOR_REWARDS_ENABLED_BIT` (bit 5). +/// Returns `false` when the account is too short or the flag is unset — +/// the on-chain `DistributeValidatorRewards` handler rejects with +/// "Distribute validator rewards is disabled" in that state, so callers +/// should skip distribute attempts when this returns `false`. +pub fn is_distribute_validator_rewards_enabled(data: &[u8]) -> bool { + if data.len() < PROGRAM_CONFIG_FLAGS_OFFSET + 8 { + return false; + } + let Ok(flags_bytes) = + <[u8; 8]>::try_from(&data[PROGRAM_CONFIG_FLAGS_OFFSET..PROGRAM_CONFIG_FLAGS_OFFSET + 8]) + else { + return false; + }; + let flags = u64::from_le_bytes(flags_bytes); + flags & PROGRAM_CONFIG_FLAG_DISTRIBUTE_VALIDATOR_REWARDS_ENABLED_BIT != 0 +} + +/// Parse the `shred_oracle_key` from a `ProgramConfig` account. Returns +/// `None` when the data is too short or the discriminator does not match. +pub fn parse_program_config_shred_oracle_key(data: &[u8]) -> Option { + if data.len() < PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET + 32 { + return None; + } + let expected_disc = + borsh::to_vec(&PROGRAM_CONFIG_DISCRIMINATOR).expect("discriminator serialization"); + if data[..DISCRIMINATOR_LEN] != expected_disc[..] { + return None; + } + Some(Pubkey::new_from_array( + data[PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET..PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET + 32] + .try_into() + .ok()?, + )) +} + +// --------------------------------------------------------------------------- +// ClientSeat raw-byte parsing (for the `list` command). +// +// Layout (ZeroCopy with 8-byte discriminator prefix): +// [0..8) discriminator +// [8..40) device_key: Pubkey +// [40..44) client_ip_bits: u32 +// [44..46) _padding: [u8; 2] +// [46..48) tenure_epochs: u16 +// [48..56) _flags: Flags (u64) +// [56..64) funded_epoch: u64 +// [64..72) active_epoch: u64 +// [72..80) funding_index: u64 +// [80..112) new_settlement_sort_key: Hash +// [112..144) funding_authority_key: Pubkey +// [144..148) escrow_count: u32 +// [148..150) override_usdc_price_dollars: u16 +// [152..160) subscription_start_slot: u64 +// [160..162) last_usdc_price_dollars: u16 +// --------------------------------------------------------------------------- + +pub const CLIENT_SEAT_DISCRIMINATOR: Discriminator = + Discriminator::new_sha2(b"dz::account::client_seat"); + +pub const CLIENT_SEAT_DEVICE_KEY_OFFSET: usize = DISCRIMINATOR_LEN; +pub const CLIENT_SEAT_CLIENT_IP_OFFSET: usize = DISCRIMINATOR_LEN + 32; +pub const CLIENT_SEAT_TENURE_OFFSET: usize = DISCRIMINATOR_LEN + 38; +pub const CLIENT_SEAT_FUNDED_EPOCH_OFFSET: usize = DISCRIMINATOR_LEN + 48; +pub const CLIENT_SEAT_ACTIVE_EPOCH_OFFSET: usize = DISCRIMINATOR_LEN + 56; +pub const CLIENT_SEAT_FLAGS_OFFSET: usize = DISCRIMINATOR_LEN + 40; +pub const CLIENT_SEAT_FUNDING_INDEX_OFFSET: usize = DISCRIMINATOR_LEN + 64; +pub const CLIENT_SEAT_OVERRIDE_USDC_PRICE_OFFSET: usize = DISCRIMINATOR_LEN + 140; +pub const CLIENT_SEAT_LAST_USDC_PRICE_OFFSET: usize = DISCRIMINATOR_LEN + 152; + +/// Parse a `ClientSeat` from raw account data. Returns +/// `(device_key, client_ip, tenure_epochs, funded_epoch, active_epoch)`. +pub fn parse_client_seat(data: &[u8]) -> Option<(Pubkey, Ipv4Addr, u16, u64, u64)> { + if data.len() < CLIENT_SEAT_ACTIVE_EPOCH_OFFSET + 8 { + return None; + } + let device_key = Pubkey::new_from_array( + data[CLIENT_SEAT_DEVICE_KEY_OFFSET..CLIENT_SEAT_DEVICE_KEY_OFFSET + 32] + .try_into() + .ok()?, + ); + let client_ip_bits = u32::from_le_bytes( + data[CLIENT_SEAT_CLIENT_IP_OFFSET..CLIENT_SEAT_CLIENT_IP_OFFSET + 4] + .try_into() + .ok()?, + ); + let tenure_epochs = u16::from_le_bytes( + data[CLIENT_SEAT_TENURE_OFFSET..CLIENT_SEAT_TENURE_OFFSET + 2] + .try_into() + .ok()?, + ); + let funded_epoch = u64::from_le_bytes( + data[CLIENT_SEAT_FUNDED_EPOCH_OFFSET..CLIENT_SEAT_FUNDED_EPOCH_OFFSET + 8] + .try_into() + .ok()?, + ); + let active_epoch = u64::from_le_bytes( + data[CLIENT_SEAT_ACTIVE_EPOCH_OFFSET..CLIENT_SEAT_ACTIVE_EPOCH_OFFSET + 8] + .try_into() + .ok()?, + ); + Some(( + device_key, + Ipv4Addr::from(client_ip_bits), + tenure_epochs, + funded_epoch, + active_epoch, + )) +} + +/// Returns the seat's `last_usdc_price_dollars` (whole USDC dollars charged +/// at the most recent allocation). Returns `None` when the account data is +/// too short (e.g. a program predating prorated-service fields). A returned +/// value of `Some(0)` means the field exists but is zero — a "pre-upgrade" +/// seat that has not yet been repopulated by a settlement cycle. +pub fn parse_client_seat_last_usdc_price_dollars(data: &[u8]) -> Option { + if data.len() < CLIENT_SEAT_LAST_USDC_PRICE_OFFSET + 2 { + return None; + } + let bytes = <[u8; 2]>::try_from( + &data[CLIENT_SEAT_LAST_USDC_PRICE_OFFSET..CLIENT_SEAT_LAST_USDC_PRICE_OFFSET + 2], + ) + .ok()?; + Some(u16::from_le_bytes(bytes)) +} + +const CLIENT_SEAT_FLAG_HAS_PRICE_OVERRIDE_BIT: u64 = 1 << 0; + +/// If the `ClientSeat` has a price override, returns the override amount in +/// micro-USDC. Otherwise returns `None`. +pub fn parse_client_seat_price_override(data: &[u8]) -> Option { + if data.len() < CLIENT_SEAT_OVERRIDE_USDC_PRICE_OFFSET + 2 { + return None; + } + let flags = u64::from_le_bytes( + data[CLIENT_SEAT_FLAGS_OFFSET..CLIENT_SEAT_FLAGS_OFFSET + 8] + .try_into() + .ok()?, + ); + if flags & CLIENT_SEAT_FLAG_HAS_PRICE_OVERRIDE_BIT == 0 { + return None; + } + let override_dollars = u16::from_le_bytes( + data[CLIENT_SEAT_OVERRIDE_USDC_PRICE_OFFSET..CLIENT_SEAT_OVERRIDE_USDC_PRICE_OFFSET + 2] + .try_into() + .ok()?, + ); + Some(override_dollars as u64 * 1_000_000) +} + +// --------------------------------------------------------------------------- +// PaymentEscrow raw-byte parsing. +// +// Layout (ZeroCopy with 8-byte discriminator prefix): +// [0..8) discriminator +// [8..40) client_seat_key: Pubkey +// [40..72) withdraw_authority_key: Pubkey +// [72..80) usdc_balance: u64 +// --------------------------------------------------------------------------- + +pub const PAYMENT_ESCROW_DISCRIMINATOR: Discriminator = + Discriminator::new_sha2(b"dz::account::payment_escrow"); + +pub const PAYMENT_ESCROW_SEAT_OFFSET: usize = DISCRIMINATOR_LEN; +pub const PAYMENT_ESCROW_AUTHORITY_OFFSET: usize = DISCRIMINATOR_LEN + 32; +pub const PAYMENT_ESCROW_BALANCE_OFFSET: usize = DISCRIMINATOR_LEN + 64; + +/// Parse a `PaymentEscrow` from raw account data. Returns +/// `(client_seat_key, withdraw_authority_key, usdc_balance)`. +pub fn parse_payment_escrow(data: &[u8]) -> Option<(Pubkey, Pubkey, u64)> { + if data.len() < PAYMENT_ESCROW_BALANCE_OFFSET + 8 { + return None; + } + let client_seat_key = Pubkey::new_from_array( + data[PAYMENT_ESCROW_SEAT_OFFSET..PAYMENT_ESCROW_SEAT_OFFSET + 32] + .try_into() + .ok()?, + ); + let withdraw_authority_key = Pubkey::new_from_array( + data[PAYMENT_ESCROW_AUTHORITY_OFFSET..PAYMENT_ESCROW_AUTHORITY_OFFSET + 32] + .try_into() + .ok()?, + ); + let usdc_balance = u64::from_le_bytes( + data[PAYMENT_ESCROW_BALANCE_OFFSET..PAYMENT_ESCROW_BALANCE_OFFSET + 8] + .try_into() + .ok()?, + ); + Some((client_seat_key, withdraw_authority_key, usdc_balance)) +} + +// --------------------------------------------------------------------------- +// Ring buffer epoch lookup, shared by DeviceHistory and MetroHistory. +// +// Both accounts embed a `RingBuffer<_, 32>` laid out as: +// [ring_offset] current_index: u8 +// [ring_offset + 1] total_count: u8 +// [ring_offset + 2..ring_offset + 8) padding +// [ring_offset + 8..) entries, each starting with epoch: u64 +// --------------------------------------------------------------------------- + +const RING_BUFFER_CAPACITY: usize = 32; + +/// Returns the byte offset of the entry holding `epoch`, or `None` when no +/// entry matches. Mirrors the onchain `RingBuffer::find`: walk backwards from +/// `current_index`, bounded by `total_count`. The bound matters — scanning all +/// 32 slots would make `epoch == 0` match a zero-initialized slot. +fn find_ring_buffer_entry_offset( + data: &[u8], + ring_offset: usize, + entry_size: usize, + epoch: u64, +) -> Option { + let current_index = *data.get(ring_offset)? as usize; + let total_count = (*data.get(ring_offset + 1)? as usize).min(RING_BUFFER_CAPACITY); + let entries_offset = ring_offset + 8; + + (0..total_count).find_map(|steps_back| { + let index = (current_index + RING_BUFFER_CAPACITY - steps_back) % RING_BUFFER_CAPACITY; + let entry_offset = entries_offset + index * entry_size; + let entry_epoch = u64::from_le_bytes( + <[u8; 8]>::try_from(data.get(entry_offset..entry_offset + 8)?).ok()?, + ); + (entry_epoch == epoch).then_some(entry_offset) + }) +} + +/// Combines a metro base price with a device's signed premium, mirroring the +/// onchain `DeviceSubscription::usdc_price_dollars`. +pub fn seat_usdc_price_dollars(metro_price_dollars: u16, device_premium_dollars: i16) -> u16 { + if device_premium_dollars < 0 { + metro_price_dollars.saturating_sub(device_premium_dollars.unsigned_abs()) + } else { + metro_price_dollars.saturating_add(device_premium_dollars.unsigned_abs()) + } +} + +// --------------------------------------------------------------------------- +// DeviceHistory raw-byte parsing. +// +// Layout (ZeroCopy with 8-byte discriminator prefix): +// [0..8) discriminator +// [8..40) device_key: Pubkey +// [40..48) flags: u64 +// [48) bump_seed: u8 +// [49) usdc_token_pda_bump_seed: u8 +// [50..56) _padding: [u8; 6] +// [56..88) metro_exchange_key: Pubkey +// [88..90) active_granted_seats: u16 +// [90..92) active_total_available_seats: u16 +// [92..120) _padding +// [120..216) StorageGap<3> +// [216..) subscriptions: RingBuffer +// --------------------------------------------------------------------------- + +pub const DEVICE_HISTORY_DISCRIMINATOR: Discriminator = + Discriminator::new_sha2(b"dz::account::device_history"); + +pub const DEVICE_HISTORY_DEVICE_KEY_OFFSET: usize = DISCRIMINATOR_LEN; +pub const DEVICE_HISTORY_FLAGS_OFFSET: usize = DISCRIMINATOR_LEN + 32; +pub const DEVICE_HISTORY_EXCHANGE_KEY_OFFSET: usize = DISCRIMINATOR_LEN + 32 + 16; +const DEVICE_HISTORY_ACTIVE_GRANTED_SEATS_OFFSET: usize = DISCRIMINATOR_LEN + 80; +const DEVICE_HISTORY_ACTIVE_TOTAL_AVAILABLE_SEATS_OFFSET: usize = DISCRIMINATOR_LEN + 82; +const DEVICE_HISTORY_RING_OFFSET: usize = DISCRIMINATOR_LEN + 208; // after active seat fields + StorageGap<3> (128 bytes total) +const DEVICE_HISTORY_ENTRY_SIZE: usize = 80; // EpochEntry + +/// Parse the metro exchange pubkey directly from raw `DeviceHistory` account data. +pub fn parse_exchange_key_from_device_history(data: &[u8]) -> Option { + let start = DEVICE_HISTORY_EXCHANGE_KEY_OFFSET; + let end = start + 32; + if data.len() < end { + return None; + } + Some(Pubkey::new_from_array(data[start..end].try_into().ok()?)) +} + +pub struct DeviceHistoryInfo { + pub device_key: Pubkey, + pub exchange_key: Pubkey, + pub is_enabled: bool, + pub current_epoch: u64, + pub current_premium: i16, + pub requested_seat_count: u16, + pub total_available_seats: u16, + pub granted_seat_count: u16, +} + +/// Parse a `DeviceHistory` account's current-epoch pricing from raw bytes. +pub fn parse_device_history(data: &[u8]) -> Option { + let ring_offset = DEVICE_HISTORY_RING_OFFSET; + if data.len() < ring_offset + 8 { + return None; + } + + let device_key = Pubkey::new_from_array( + data[DEVICE_HISTORY_DEVICE_KEY_OFFSET..DEVICE_HISTORY_DEVICE_KEY_OFFSET + 32] + .try_into() + .ok()?, + ); + let flags = u64::from_le_bytes( + data[DEVICE_HISTORY_FLAGS_OFFSET..DEVICE_HISTORY_FLAGS_OFFSET + 8] + .try_into() + .ok()?, + ); + let is_enabled = flags & (1 << 1) != 0; + let exchange_key = Pubkey::new_from_array( + data[DEVICE_HISTORY_EXCHANGE_KEY_OFFSET..DEVICE_HISTORY_EXCHANGE_KEY_OFFSET + 32] + .try_into() + .ok()?, + ); + + let current_index = data[ring_offset] as usize; + let total_count = data[ring_offset + 1]; + if total_count == 0 { + return None; + } + + let entries_offset = ring_offset + 8; // skip current_index + total_count + padding + let entry_offset = entries_offset + current_index * DEVICE_HISTORY_ENTRY_SIZE; + if data.len() < entry_offset + 16 { + return None; + } + + let current_epoch = u64::from_le_bytes(data[entry_offset..entry_offset + 8].try_into().ok()?); + let current_premium = + i16::from_le_bytes(data[entry_offset + 8..entry_offset + 10].try_into().ok()?); + let requested_seat_count = + u16::from_le_bytes(data[entry_offset + 10..entry_offset + 12].try_into().ok()?); + + // Read device-level active seat fields from the header (outside the ring + // buffer). These are maintained by instant allocation/withdrawal and synced + // during settlement, so they always reflect the current state. + let total_available_seats = u16::from_le_bytes( + data[DEVICE_HISTORY_ACTIVE_TOTAL_AVAILABLE_SEATS_OFFSET + ..DEVICE_HISTORY_ACTIVE_TOTAL_AVAILABLE_SEATS_OFFSET + 2] + .try_into() + .ok()?, + ); + let granted_seat_count = u16::from_le_bytes( + data[DEVICE_HISTORY_ACTIVE_GRANTED_SEATS_OFFSET + ..DEVICE_HISTORY_ACTIVE_GRANTED_SEATS_OFFSET + 2] + .try_into() + .ok()?, + ); + + Some(DeviceHistoryInfo { + device_key, + exchange_key, + is_enabled, + current_epoch, + current_premium, + requested_seat_count, + total_available_seats, + granted_seat_count, + }) +} + +/// Returns the device's `usdc_metro_premium_dollars` for `epoch`, or `None` +/// when the ring buffer holds no entry for that epoch. Callers that price an +/// instant seat allocation want this rather than `parse_device_history`: the +/// program charges from the entry at `last_settled_epoch`, which during +/// `OpenForRequests` is one epoch behind the newest entry. +pub fn parse_device_history_premium_at_epoch(data: &[u8], epoch: u64) -> Option { + let entry_offset = find_ring_buffer_entry_offset( + data, + DEVICE_HISTORY_RING_OFFSET, + DEVICE_HISTORY_ENTRY_SIZE, + epoch, + )?; + let bytes = <[u8; 2]>::try_from(data.get(entry_offset + 8..entry_offset + 10)?).ok()?; + Some(i16::from_le_bytes(bytes)) +} + +// --------------------------------------------------------------------------- +// MetroHistory raw-byte parsing. +// +// Layout (ZeroCopy with 8-byte discriminator prefix): +// [0..8) discriminator +// [8..40) exchange_key: Pubkey +// [40..48) _flags: Flags (u64) +// [48..50) total_initialized_devices: u16 +// [50..56) _padding: [u8; 6] +// [56..184) StorageGap<4> ([[u8; 32]; 4] = 128 bytes) +// [184) ring_buffer.current_index: u8 +// [185) ring_buffer.total_count: u8 +// [186..192) padding +// [192..) entries: 32 × EpochEntry (80 bytes each) +// --------------------------------------------------------------------------- + +pub const METRO_HISTORY_DISCRIMINATOR: Discriminator = + Discriminator::new_sha2(b"dz::account::metro_history"); + +pub const METRO_HISTORY_EXCHANGE_KEY_OFFSET: usize = DISCRIMINATOR_LEN; +const METRO_HISTORY_DEVICES_OFFSET: usize = DISCRIMINATOR_LEN + 40; +const METRO_HISTORY_RING_OFFSET: usize = DISCRIMINATOR_LEN + 176; // after StorageGap<4> (128 bytes) +const METRO_HISTORY_ENTRY_SIZE: usize = 80; // EpochEntry + +pub struct MetroHistoryInfo { + pub exchange_key: Pubkey, + pub total_devices: u16, + pub current_epoch: u64, + pub current_usdc_price: u16, +} + +/// Parse a `MetroHistory` account's current-epoch pricing from raw bytes. +pub fn parse_metro_history(data: &[u8]) -> Option { + let ring_offset = METRO_HISTORY_RING_OFFSET; + if data.len() < ring_offset + 8 { + return None; + } + + let exchange_key = Pubkey::new_from_array( + data[METRO_HISTORY_EXCHANGE_KEY_OFFSET..METRO_HISTORY_EXCHANGE_KEY_OFFSET + 32] + .try_into() + .ok()?, + ); + let total_devices = u16::from_le_bytes( + data[METRO_HISTORY_DEVICES_OFFSET..METRO_HISTORY_DEVICES_OFFSET + 2] + .try_into() + .ok()?, + ); + + let current_index = data[ring_offset] as usize; + let total_count = data[ring_offset + 1]; + if total_count == 0 { + return None; + } + + let entries_offset = ring_offset + 8; // skip current_index + total_count + padding + let entry_offset = entries_offset + current_index * METRO_HISTORY_ENTRY_SIZE; + if data.len() < entry_offset + 10 { + return None; + } + + let current_epoch = u64::from_le_bytes(data[entry_offset..entry_offset + 8].try_into().ok()?); + let current_usdc_price = + u16::from_le_bytes(data[entry_offset + 8..entry_offset + 10].try_into().ok()?); + + Some(MetroHistoryInfo { + exchange_key, + total_devices, + current_epoch, + current_usdc_price, + }) +} + +/// Returns the metro's `usdc_price_dollars` for `epoch`, or `None` when the +/// ring buffer holds no entry for that epoch. See +/// [`parse_device_history_premium_at_epoch`] for why instant-allocation +/// pricing needs a specific epoch rather than the newest entry. +pub fn parse_metro_history_price_at_epoch(data: &[u8], epoch: u64) -> Option { + let entry_offset = find_ring_buffer_entry_offset( + data, + METRO_HISTORY_RING_OFFSET, + METRO_HISTORY_ENTRY_SIZE, + epoch, + )?; + let bytes = <[u8; 2]>::try_from(data.get(entry_offset + 8..entry_offset + 10)?).ok()?; + Some(u16::from_le_bytes(bytes)) +} + +// --------------------------------------------------------------------------- +// ValidatorClientRewards, ShredRewardToken and ValidatorPublisherRewards: +// layout mirrored from the onchain `doublezero-shred-subscription` program +// (state module). Kept here to avoid pulling the program crate as a dependency +// just for three account types. If the onchain layout changes, update both +// this file and the discriminator strings together. +// --------------------------------------------------------------------------- + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct ValidatorClientRewards { + pub client_id: u16, + pub bump_seed: u8, + _padding_0: [u8; 5], + pub manager_key: Pubkey, + pub short_description_bytes: [u8; 64], + pub claim_holding_count: u32, + _padding_1: [u8; 4], + _gap: StorageGap<2>, +} + +impl PrecomputedDiscriminator for ValidatorClientRewards { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"dz::account::validator_client_rewards"); +} + +// `[u8; 64]` is wider than the array sizes `std` implements `Default` for, so +// this cannot be derived. The onchain struct carries the same manual impl. +impl Default for ValidatorClientRewards { + fn default() -> Self { + Zeroable::zeroed() + } +} + +impl ValidatorClientRewards { + pub fn checked_short_description(&self) -> Option<&str> { + let end = self.short_description_bytes.iter().rposition(|&b| b != 0)?; + std::str::from_utf8(&self.short_description_bytes[..=end]).ok() + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct ShredRewardToken { + pub mint_key: Pubkey, + pub flags: Flags, + pub max_slippage_bps: UnitShare16, + _padding_0: [u8; 6], + _gap: StorageGap<2>, +} + +impl PrecomputedDiscriminator for ShredRewardToken { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"dz::account::shred_reward_token"); +} + +impl ShredRewardToken { + pub const FLAG_IS_ENABLED_BIT: usize = 1; + + pub fn is_enabled(&self) -> bool { + self.flags.bit(Self::FLAG_IS_ENABLED_BIT) + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct ValidatorPublisherRewards { + pub node_id: Pubkey, + pub rewards_token_owner_key: Pubkey, + pub rewards_token_mint_key: Pubkey, + _gap: StorageGap<4>, +} + +impl PrecomputedDiscriminator for ValidatorPublisherRewards { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"dz::account::validator_publisher_rewards"); +} + +// --------------------------------------------------------------------------- +// ShredDistribution + ShredDistributionJournal + the +// ValidatorClientRewardsConfig field they nest. Layouts mirrored from +// `malbeclabs/doublezero-shreds` (program crate). Vendored here so the +// offchain CLI can `bytemuck::from_bytes` these accounts without depending +// on the shreds program crate. Remove once the shreds repo is merged into +// the monorepo. +// +// The compile-time `const _: () = assert!(...)` lines at the bottom of this +// block mirror the on-chain `assert!(zero_copy::data_end::() == N)` for +// each Pod struct (`data_end::() == DISCRIMINATOR_LEN + size_of::()`). +// Without them, a silent upstream drift in any field — or in +// `Flags`/`StorageGap`'s size against a different `program-tools` pin — +// would shift `remaining_data`'s start by some number of bytes. Bitmap +// reads via `publisher_accumulation_bitmap_{start,end}_index` would then +// land on the wrong bytes and `bitmap_bit_set` would return garbage, +// silently undercounting or duplicating distribute work. If on-chain +// changes any of these layouts, update both sides together (offchain +// struct + the expected size below + the on-chain `assert!`). +// --------------------------------------------------------------------------- + +pub const MAX_VALIDATOR_CLIENT_REWARDS_PROPORTIONS: usize = 32; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(4))] +pub struct ValidatorClientRewardsProportion { + pub id: u16, + pub rewards_proportion: UnitShare16, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(4))] +pub struct ValidatorClientRewardProportions { + pub set_bitmap: u32, + pub proportions: [ValidatorClientRewardsProportion; MAX_VALIDATOR_CLIENT_REWARDS_PROPORTIONS], +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct ValidatorClientRewardsConfig { + pub default_proportion: UnitShare16, + _padding_0: [u8; 2], + pub proportions: ValidatorClientRewardProportions, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct ShredDistribution { + pub subscription_epoch: u64, + pub flags: Flags, + pub associated_dz_epoch: DoubleZeroEpoch, + pub bump_seed: u8, + pub ata_usdc_bump_seed: u8, + pub ata_2z_bump_seed: u8, + _padding_0: [u8; 1], + pub device_count: u16, + pub client_seat_count: u16, + pub journal_count: u16, + pub validator_rewards_proportion: UnitShare16, + pub total_publishing_validators: u32, + pub validator_rewards_merkle_root: Hash, + pub collected_usdc_payments: u64, + pub contributor_collected_2z_converted_from_usdc: u64, + pub contributor_usdc_swapped: u64, + pub validator_client_rewards_config: ValidatorClientRewardsConfig, + pub accumulated_validator_rewards_count: u32, + _padding_1: [u8; 28], + pub total_published_leader_slots: u32, + _padding_2: [u8; 28], + _gap: StorageGap<3>, +} + +impl PrecomputedDiscriminator for ShredDistribution { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"dz::account::shred_distribution"); +} + +impl ShredDistribution { + pub const FLAG_VALIDATOR_REWARDS_CALCULATION_FINALIZED_BIT: usize = 1; + pub const FLAG_VALIDATOR_REWARDS_ACCUMULATED_BIT: usize = 2; + pub const FLAG_INTEGRATION_FUNDED_BIT: usize = 3; + + #[inline] + pub fn is_validator_rewards_calculation_finalized(&self) -> bool { + self.flags + .bit(Self::FLAG_VALIDATOR_REWARDS_CALCULATION_FINALIZED_BIT) + } + + #[inline] + pub fn is_validator_rewards_accumulated(&self) -> bool { + self.flags.bit(Self::FLAG_VALIDATOR_REWARDS_ACCUMULATED_BIT) + } + + #[inline] + pub fn is_integration_funded(&self) -> bool { + self.flags.bit(Self::FLAG_INTEGRATION_FUNDED_BIT) + } +} + +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct ShredDistributionJournal { + pub subscription_epoch: u64, + pub mint_key: Pubkey, + pub reward_mint_key: Pubkey, + flags: Flags, + pub usdc_swapped_amount: u64, + pub tokens_received_amount: u64, + pub publisher_accumulation_bitmap_start_index: u32, + pub publisher_accumulation_bitmap_end_index: u32, + pub client_accumulation_bitmap_start_index: u32, + pub client_accumulation_bitmap_end_index: u32, + pub validator_pool: u64, + pub total_leader_slots: u32, + _padding_0: [u8; 4], + pub accumulated_publisher_slots_scaled: u64, + pub accumulated_client_slots_scaled: u64, + pub accumulated_publisher_leaf_count: u32, + pub distributed_publisher_leaf_count: u32, + pub distributed_amount: u64, + pub accumulated_client_leaf_count: u32, + pub distributed_client_leaf_count: u32, + _padding_1: [u8; 16], + pub first_distribute_timestamp: i64, + _gap: StorageGap<3>, +} + +impl PrecomputedDiscriminator for ShredDistributionJournal { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"dz::account::shred_distribution_journal"); +} + +impl ShredDistributionJournal { + pub const FLAG_SWAP_BYPASSED_BIT: usize = 0; + pub const FLAG_SWEPT_BIT: usize = 1; + + #[inline] + pub fn is_swap_bypassed(&self) -> bool { + self.flags.bit(Self::FLAG_SWAP_BYPASSED_BIT) + } + + #[inline] + pub fn is_swept(&self) -> bool { + self.flags.bit(Self::FLAG_SWEPT_BIT) + } + + #[inline] + pub fn checked_publisher_accumulation_bitmap_range(&self) -> Option> { + let has_end_index = self.publisher_accumulation_bitmap_end_index != 0; + let range = self.publisher_accumulation_bitmap_start_index as usize + ..self.publisher_accumulation_bitmap_end_index as usize; + has_end_index.then_some(range) + } + + #[inline] + pub fn checked_client_accumulation_bitmap_range(&self) -> Option> { + let has_end_index = self.client_accumulation_bitmap_end_index != 0; + let range = self.client_accumulation_bitmap_start_index as usize + ..self.client_accumulation_bitmap_end_index as usize; + has_end_index.then_some(range) + } + + #[inline] + pub fn checked_usdc_swap_budget(&self) -> Option { + if self.total_leader_slots == 0 { + return None; + } + let accumulated_slots_scaled = + self.accumulated_publisher_slots_scaled + self.accumulated_client_slots_scaled; + let total_slots_scaled = u64::from(self.total_leader_slots) * u64::from(UnitShare16::MAX); + let budget = u128::from(self.validator_pool) * u128::from(accumulated_slots_scaled) + / u128::from(total_slots_scaled); + Some(budget as u64) + } + + #[inline] + pub fn is_swap_complete(&self) -> bool { + if self.is_swap_bypassed() { + return true; + } + match self.checked_usdc_swap_budget() { + Some(budget) => self.usdc_swapped_amount == budget, + None => true, + } + } +} + +// Mirror the on-chain +// `assert!(zero_copy::data_end::() == N)` lines in +// `programs/shred-subscription/src/processor/mod.rs`. `data_end` is +// `DISCRIMINATOR_LEN + size_of::()`, so the offchain size assert is +// `size_of::() == N - DISCRIMINATOR_LEN`. If on-chain bumps either +// value, update both sides together. +const _: () = assert!(std::mem::size_of::() == 184 - DISCRIMINATOR_LEN); +const _: () = assert!(std::mem::size_of::() == 400 - DISCRIMINATOR_LEN); +const _: () = assert!(std::mem::size_of::() == 296 - DISCRIMINATOR_LEN); +// `ValidatorClientRewardsConfig` is a field inside `ShredDistribution`, +// not a top-level account, so the on-chain code has no separate +// `data_end::()` assert for it. Pin its size here directly so any +// upstream layout shift breaks the build instead of silently relocating +// later fields of `ShredDistribution`. +const _: () = assert!(std::mem::size_of::() == 136); + +#[cfg(test)] +mod tests { + use super::*; + + fn program_config_data_with_flags(flags: u64) -> Vec { + let mut data = vec![0u8; PROGRAM_CONFIG_FLAGS_OFFSET + 8]; + data[PROGRAM_CONFIG_FLAGS_OFFSET..PROGRAM_CONFIG_FLAGS_OFFSET + 8] + .copy_from_slice(&flags.to_le_bytes()); + data + } + + #[test] + fn prorated_enabled_bit_set() { + let data = + program_config_data_with_flags(PROGRAM_CONFIG_FLAG_IS_PRORATED_SERVICE_ENABLED_BIT); + assert!(is_prorated_service_enabled(&data)); + } + + #[test] + fn prorated_enabled_bit_unset() { + let data = program_config_data_with_flags(0); + assert!(!is_prorated_service_enabled(&data)); + } + + #[test] + fn prorated_enabled_other_bits_ignored() { + // is_paused (bit 0) + is_migrated (bit 1) set, but not bit 2. + let data = program_config_data_with_flags(0b011); + assert!(!is_prorated_service_enabled(&data)); + } + + #[test] + fn prorated_enabled_short_buffer_returns_false() { + // Pre-prorated program deployment: account data too short for the + // flags word. Treat as flag unset rather than panicking. + let data = vec![0u8; PROGRAM_CONFIG_FLAGS_OFFSET + 4]; + assert!(!is_prorated_service_enabled(&data)); + } + + #[test] + fn prorated_enabled_empty_buffer_returns_false() { + assert!(!is_prorated_service_enabled(&[])); + } + + #[test] + fn distribute_validator_rewards_enabled_bit_set() { + let data = program_config_data_with_flags( + PROGRAM_CONFIG_FLAG_DISTRIBUTE_VALIDATOR_REWARDS_ENABLED_BIT, + ); + assert!(is_distribute_validator_rewards_enabled(&data)); + } + + #[test] + fn distribute_validator_rewards_disabled_when_unset() { + // All lower bits set (paused, prorated, accumulate, jupiter) but + // not bit 5 — must not be mistaken for distribute-enabled. + let data = program_config_data_with_flags(0b01_1111); + assert!(!is_distribute_validator_rewards_enabled(&data)); + } + + #[test] + fn distribute_validator_rewards_enabled_short_buffer_returns_false() { + let data = vec![0u8; PROGRAM_CONFIG_FLAGS_OFFSET + 4]; + assert!(!is_distribute_validator_rewards_enabled(&data)); + } + + fn client_seat_data_with_last_price(price_dollars: u16) -> Vec { + let mut data = vec![0u8; CLIENT_SEAT_LAST_USDC_PRICE_OFFSET + 2]; + data[CLIENT_SEAT_LAST_USDC_PRICE_OFFSET..CLIENT_SEAT_LAST_USDC_PRICE_OFFSET + 2] + .copy_from_slice(&price_dollars.to_le_bytes()); + data + } + + #[test] + fn last_usdc_price_zero() { + let data = client_seat_data_with_last_price(0); + assert_eq!(parse_client_seat_last_usdc_price_dollars(&data), Some(0)); + } + + #[test] + fn last_usdc_price_nonzero() { + let data = client_seat_data_with_last_price(42); + assert_eq!(parse_client_seat_last_usdc_price_dollars(&data), Some(42)); + } + + #[test] + fn last_usdc_price_short_buffer_returns_none() { + let data = vec![0u8; CLIENT_SEAT_LAST_USDC_PRICE_OFFSET]; + assert_eq!(parse_client_seat_last_usdc_price_dollars(&data), None); + } + + #[test] + fn find_claim_holding_address_matches_seed() { + use solana_sdk::pubkey::Pubkey; + let parent = Pubkey::new_from_array([7u8; 32]); + let mint = Pubkey::new_from_array([3u8; 32]); + let epoch: u64 = 42; + let (addr, bump) = find_claim_holding_address(&parent, epoch, &mint); + let (expected_addr, expected_bump) = Pubkey::find_program_address( + &[ + CLAIM_HOLDING_SEED_PREFIX, + parent.as_ref(), + &epoch.to_le_bytes(), + mint.as_ref(), + ], + &crate::shred_subscription::ID, + ); + assert_eq!(addr, expected_addr); + assert_eq!(bump, expected_bump); + } + + fn validator_client_rewards_with_description(description: &[u8]) -> ValidatorClientRewards { + let mut validator_client_rewards = ValidatorClientRewards::default(); + validator_client_rewards.short_description_bytes[..description.len()] + .copy_from_slice(description); + validator_client_rewards + } + + #[test] + fn test_checked_short_description_returns_str() { + let validator_client_rewards = validator_client_rewards_with_description(b"acme"); + assert_eq!( + validator_client_rewards.checked_short_description(), + Some("acme") + ); + } + + #[test] + fn test_checked_short_description_empty_returns_none() { + let validator_client_rewards = ValidatorClientRewards::default(); + assert!( + validator_client_rewards + .checked_short_description() + .is_none() + ); + } + + #[test] + fn test_checked_short_description_full_length() { + // 64 is the width of short_description_bytes, so the fill leaves no + // trailing zero to scan back from. + let description = "a".repeat(64); + let validator_client_rewards = + validator_client_rewards_with_description(description.as_bytes()); + assert_eq!( + validator_client_rewards.checked_short_description(), + Some(description.as_str()) + ); + } + + #[test] + fn parse_program_config_shred_oracle_key_happy_path() { + use solana_sdk::pubkey::Pubkey; + let oracle = Pubkey::new_from_array([5u8; 32]); + let mut data = vec![0u8; PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET + 32]; + let disc_bytes = + borsh::to_vec(&PROGRAM_CONFIG_DISCRIMINATOR).expect("discriminator serialization"); + data[..DISCRIMINATOR_LEN].copy_from_slice(&disc_bytes); + data[PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET..PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET + 32] + .copy_from_slice(oracle.as_ref()); + assert_eq!(parse_program_config_shred_oracle_key(&data), Some(oracle)); + } + + #[test] + fn parse_program_config_shred_oracle_key_short_buffer_returns_none() { + let data = vec![0u8; PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET + 31]; + assert_eq!(parse_program_config_shred_oracle_key(&data), None); + } + + /// Build a `MetroHistory` buffer whose ring holds `entries` as + /// `(ring_slot, epoch, usdc_price_dollars)`. + fn metro_history_data( + current_index: u8, + total_count: u8, + entries: &[(usize, u64, u16)], + ) -> Vec { + let mut data = + vec![ + 0; + METRO_HISTORY_RING_OFFSET + 8 + RING_BUFFER_CAPACITY * METRO_HISTORY_ENTRY_SIZE + ]; + data[METRO_HISTORY_RING_OFFSET] = current_index; + data[METRO_HISTORY_RING_OFFSET + 1] = total_count; + for (ring_slot, epoch, price_dollars) in entries { + let offset = METRO_HISTORY_RING_OFFSET + 8 + ring_slot * METRO_HISTORY_ENTRY_SIZE; + data[offset..offset + 8].copy_from_slice(&epoch.to_le_bytes()); + data[offset + 8..offset + 10].copy_from_slice(&price_dollars.to_le_bytes()); + } + data + } + + #[test] + fn test_metro_price_at_epoch_exact_hit() { + // Slots 0..3 written, newest at 2 (epoch 12). + let data = metro_history_data(2, 3, &[(0, 10, 30), (1, 11, 43), (2, 12, 10)]); + assert_eq!(parse_metro_history_price_at_epoch(&data, 12), Some(10)); + assert_eq!(parse_metro_history_price_at_epoch(&data, 11), Some(43)); + assert_eq!(parse_metro_history_price_at_epoch(&data, 10), Some(30)); + } + + #[test] + fn test_metro_price_at_epoch_wraps_past_index_zero() { + // current_index 0 with 3 written entries: the two older ones live in + // slots 31 and 30, so the search has to wrap backwards. + let data = metro_history_data(0, 3, &[(30, 10, 30), (31, 11, 43), (0, 12, 10)]); + assert_eq!(parse_metro_history_price_at_epoch(&data, 11), Some(43)); + assert_eq!(parse_metro_history_price_at_epoch(&data, 10), Some(30)); + } + + #[test] + fn test_metro_price_at_epoch_respects_total_count_bound() { + // Epoch 9 sits in slot 31, one step beyond the two written entries. + // The onchain `find` never reaches it, so neither may this. + let data = metro_history_data(1, 2, &[(31, 9, 60), (0, 10, 30), (1, 11, 43)]); + assert_eq!(parse_metro_history_price_at_epoch(&data, 11), Some(43)); + assert_eq!(parse_metro_history_price_at_epoch(&data, 10), Some(30)); + assert_eq!(parse_metro_history_price_at_epoch(&data, 9), None); + } + + #[test] + fn test_metro_price_at_epoch_zero_on_uninitialized_buffer() { + // total_count 0: every slot is zeroed, and epoch 0 must not match. + let data = metro_history_data(0, 0, &[]); + assert_eq!(parse_metro_history_price_at_epoch(&data, 0), None); + } + + #[test] + fn test_metro_price_at_epoch_zero_matches_written_entry() { + // Epoch 0 is a legitimate epoch once written. + let data = metro_history_data(0, 1, &[(0, 0, 30)]); + assert_eq!(parse_metro_history_price_at_epoch(&data, 0), Some(30)); + } + + #[test] + fn test_metro_price_at_epoch_miss_returns_none() { + let data = metro_history_data(1, 2, &[(0, 10, 30), (1, 11, 43)]); + assert_eq!(parse_metro_history_price_at_epoch(&data, 12), None); + assert_eq!(parse_metro_history_price_at_epoch(&data, 9), None); + } + + #[test] + fn test_metro_price_at_epoch_short_buffer_returns_none() { + assert_eq!(parse_metro_history_price_at_epoch(&[], 10), None); + let truncated = vec![0; METRO_HISTORY_RING_OFFSET]; + assert_eq!(parse_metro_history_price_at_epoch(&truncated, 10), None); + } + + #[test] + fn test_device_premium_at_epoch_reads_signed_premium() { + let mut data = + vec![ + 0; + DEVICE_HISTORY_RING_OFFSET + 8 + RING_BUFFER_CAPACITY * DEVICE_HISTORY_ENTRY_SIZE + ]; + data[DEVICE_HISTORY_RING_OFFSET] = 1; + data[DEVICE_HISTORY_RING_OFFSET + 1] = 2; + for (ring_slot, epoch, premium_dollars) in [(0, 10, -5), (1, 11, 7)] { + let offset = DEVICE_HISTORY_RING_OFFSET + 8 + ring_slot * DEVICE_HISTORY_ENTRY_SIZE; + data[offset..offset + 8].copy_from_slice(&::to_le_bytes(epoch)); + data[offset + 8..offset + 10].copy_from_slice(&::to_le_bytes(premium_dollars)); + } + assert_eq!(parse_device_history_premium_at_epoch(&data, 11), Some(7)); + assert_eq!(parse_device_history_premium_at_epoch(&data, 10), Some(-5)); + assert_eq!(parse_device_history_premium_at_epoch(&data, 12), None); + } + + #[test] + fn test_seat_usdc_price_dollars_applies_signed_premium() { + assert_eq!(seat_usdc_price_dollars(30, 13), 43); + assert_eq!(seat_usdc_price_dollars(30, -20), 10); + assert_eq!(seat_usdc_price_dollars(30, 0), 30); + // Floors at zero rather than wrapping. + assert_eq!(seat_usdc_price_dollars(10, -30), 0); + assert_eq!(seat_usdc_price_dollars(u16::MAX, 5), u16::MAX); + } + + #[test] + fn parse_program_config_shred_oracle_key_wrong_discriminator_returns_none() { + use solana_sdk::pubkey::Pubkey; + let oracle = Pubkey::new_from_array([5u8; 32]); + let mut data = vec![0u8; PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET + 32]; + data[0] = 0x01; + data[PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET..PROGRAM_CONFIG_SHRED_ORACLE_KEY_OFFSET + 32] + .copy_from_slice(oracle.as_ref()); + assert_eq!(parse_program_config_shred_oracle_key(&data), None); + } +} diff --git a/offchain/crates/solana-sdk/src/shred_subscription/types/configure_validator_publisher_rewards_auth_message.rs b/offchain/crates/solana-sdk/src/shred_subscription/types/configure_validator_publisher_rewards_auth_message.rs new file mode 100644 index 0000000000..526309081f --- /dev/null +++ b/offchain/crates/solana-sdk/src/shred_subscription/types/configure_validator_publisher_rewards_auth_message.rs @@ -0,0 +1,102 @@ +use bytemuck::{Pod, Zeroable}; +use solana_sdk::pubkey::Pubkey; +use svm_hash::sha2::{Hash, hashv}; + +/// Canonical authorization message for `ConfigureValidatorPublisherRewards`. +/// +/// Layout is fixed and matches the on-chain crate verbatim. The `node_id` +/// keypair signs `to_hex_encoded()` via `solana sign-offchain-message`; the +/// program rebuilds the offchain-message envelope around the hex body and +/// verifies the ed25519 signature. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C)] +pub struct ConfigureValidatorPublisherRewardsAuthMessage { + pub program_id: Pubkey, + pub node_id: Pubkey, + pub rewards_token_owner_key: Pubkey, + pub rewards_token_mint_key: Pubkey, + pub deadline_slot: u64, +} + +impl ConfigureValidatorPublisherRewardsAuthMessage { + /// Domain tag — versioned so a future v2 layout can't be replayed against + /// the v1 program. Must match the on-chain constant of the same name. + pub const DOMAIN_TAG: &'static [u8] = b"dz::configure_validator_publisher_rewards::v1"; + + /// Length (bytes) of the hex-encoded hash body inside the offchain-message + /// envelope. 32-byte sha256 * 2 hex chars = 64. + pub const OFFCHAIN_MESSAGE_LENGTH: u16 = 64; + + /// SHA-256 over `DOMAIN_TAG` and the canonical struct bytes. + #[inline] + pub fn hash(&self) -> Hash { + hashv(&[Self::DOMAIN_TAG, bytemuck::bytes_of(self)]) + } + + /// Lower-case ASCII hex of `self.hash()`. This is the exact string a node + /// operator passes to `solana sign-offchain-message`. + #[inline] + pub fn to_hex_encoded(&self) -> [u8; Self::OFFCHAIN_MESSAGE_LENGTH as usize] { + let mut buf = [0u8; Self::OFFCHAIN_MESSAGE_LENGTH as usize]; + hex::encode_to_slice(self.hash().to_bytes(), &mut buf) + .expect("hash is 32 bytes; buffer is 64 bytes"); + buf + } +} + +#[cfg(test)] +mod tests { + use solana_offchain_message::OffchainMessage; + use solana_sdk::signature::{Keypair, Signature, Signer}; + + use super::*; + + fn sample(keypair: &Keypair) -> ConfigureValidatorPublisherRewardsAuthMessage { + ConfigureValidatorPublisherRewardsAuthMessage { + program_id: Pubkey::new_unique(), + node_id: keypair.pubkey(), + rewards_token_owner_key: Pubkey::new_unique(), + rewards_token_mint_key: Pubkey::new_unique(), + deadline_slot: 12_345, + } + } + + /// Sign the hex-of-hash via `OffchainMessage` (byte-for-byte identical to + /// `solana sign-offchain-message`) and verify with the same envelope. This + /// is the cross-crate canary that detects DOMAIN_TAG / field-order drift + /// between this SDK and the on-chain program. + #[test] + fn sign_and_verify_round_trip() { + let keypair = Keypair::new(); + let message = sample(&keypair); + + let hex = message.to_hex_encoded(); + let offchain = OffchainMessage::new(0, &hex).unwrap(); + let signature: Signature = offchain.sign(&keypair).unwrap(); + + // Re-construct the envelope and verify with the public key. + assert!(offchain.verify(&keypair.pubkey(), &signature).unwrap()); + } + + /// Locks the byte layout against a frozen reference hash. If the on-chain + /// `DOMAIN_TAG` or field order ever change, this test fails. Update only + /// when the on-chain layout actually changes (and bump DOMAIN_TAG to v2). + #[test] + fn frozen_reference_hash() { + let message = ConfigureValidatorPublisherRewardsAuthMessage { + program_id: Pubkey::new_from_array([1u8; 32]), + node_id: Pubkey::new_from_array([2u8; 32]), + rewards_token_owner_key: Pubkey::new_from_array([3u8; 32]), + rewards_token_mint_key: Pubkey::new_from_array([4u8; 32]), + deadline_slot: 0xdead_beef, + }; + // Frozen reference. To (re)generate: replace with `[0u8; 64]`, run + // the test, and copy the 64-char hex string printed as the + // assertion's `left` value. Updating this should only happen when + // the on-chain `DOMAIN_TAG` or struct layout changes (i.e. on a + // major version bump that breaks compatibility on purpose). + let expected: &[u8; 64] = + b"97d29f79630bd3871bb73784f4baa4ed685758a26afb6257e13a439defe2b2c2"; + assert_eq!(&message.to_hex_encoded(), expected); + } +} diff --git a/offchain/crates/solana-sdk/src/shred_subscription/types/mod.rs b/offchain/crates/solana-sdk/src/shred_subscription/types/mod.rs new file mode 100644 index 0000000000..b39b76aaf0 --- /dev/null +++ b/offchain/crates/solana-sdk/src/shred_subscription/types/mod.rs @@ -0,0 +1,5 @@ +pub mod configure_validator_publisher_rewards_auth_message; +pub mod validator_rewards_leaf; + +pub use configure_validator_publisher_rewards_auth_message::ConfigureValidatorPublisherRewardsAuthMessage; +pub use validator_rewards_leaf::ValidatorRewardsLeaf; diff --git a/offchain/crates/solana-sdk/src/shred_subscription/types/validator_rewards_leaf.rs b/offchain/crates/solana-sdk/src/shred_subscription/types/validator_rewards_leaf.rs new file mode 100644 index 0000000000..00e9444086 --- /dev/null +++ b/offchain/crates/solana-sdk/src/shred_subscription/types/validator_rewards_leaf.rs @@ -0,0 +1,37 @@ +// VENDORED from `malbeclabs/doublezero-shreds`: +// `programs/shred-subscription/src/types/validator_rewards_leaf.rs`. +// Kept byte-for-byte compatible with the canonical impl so merkle leaves +// hash identically on both sides. Remove once the shreds program crate is +// merged into the monorepo and can be depended on directly. + +use bytemuck::{Pod, Zeroable}; +use solana_sdk::pubkey::Pubkey; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C)] +pub struct ValidatorRewardsLeaf { + pub node_id: Pubkey, + pub leader_slots: u32, + pub client_id: u16, + _reserved: [u8; 2], +} + +// Mirror the canonical impl's `assert_eq!(size_of::(), 40)`. +// This leaf is hashed into the merkle tree the on-chain program verifies +// proofs against, so any field-order or padding drift must break the build +// here rather than silently produce non-matching proofs. +const _: () = assert!(std::mem::size_of::() == 40); + +impl ValidatorRewardsLeaf { + pub const LEAF_PREFIX: &'static [u8] = b"dz::validator_rewards"; + + #[inline] + pub fn new(node_id: Pubkey, leader_slots: u32, client_id: u16) -> Self { + Self { + node_id, + leader_slots, + client_id, + _reserved: [0; 2], + } + } +} diff --git a/offchain/crates/validator-debt/CHANGELOG.md b/offchain/crates/validator-debt/CHANGELOG.md new file mode 100644 index 0000000000..060526f11f --- /dev/null +++ b/offchain/crates/validator-debt/CHANGELOG.md @@ -0,0 +1,85 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +- refactor(validator-debt): delete the two dead timestamp to Solana epoch code paths that hardcoded a 0.4s slot duration, both `SLOT_TIME_DURATION_SECONDS` constants, and the two `ValidatorRewards` trait methods only they reached. Nothing called them: `rpc.rs` already maps DZ epochs to Solana epochs from real block times for the production path, and the worker calls `get_total_rewards` with an explicit epoch. Also removes an unsigned subtraction that panicked in debug and wrapped silently in release. Note that `estimate_block_time_for_skipped_slot` in `rpc.rs` still assumes 0.4s per slot implicitly (malbeclabs/infra#2317) +- migrate to Solana 3.0: workspace `solana-*` crates and `solana-sdk` move to the 3.0 line, `solana-program-test` to 3.0.12, and the doublezero SDK git-deps repin from `client/v0.27.1` to the malbeclabs/doublezero#3830 merge revision (malbeclabs/infra#1853) +- release artifact now builds as a static `x86_64-unknown-linux-musl` binary (malbeclabs/infra#1853) +- TLS for HTTP clients moves from openssl to rustls; trust roots are the bundled webpki Mozilla set plus the host OS certificate store, so OS-installed private CAs remain trusted (malbeclabs/infra#1853) +- fix fetching multiple accounts (#343) +- update instruction call with optional memo ([#330](https://github.com/doublezerofoundation/doublezero-offchain/pull/330))) +- fix `fetch validator-debts` record logic ([#327](https://github.com/doublezerofoundation/doublezero-offchain/pull/327)) +- conditionally sweep 2Z based on balance ([#322](https://github.com/doublezerofoundation/doublezero-offchain/pull/322)) +- feat(validator-debt): abort calculation if fees are zero ([#286](https://github.com/doublezerofoundation/doublezero-offchain/pull/286)) +- feat(contributor-rewards): add on-chain reward distribution ([#269](https://github.com/doublezerofoundation/doublezero-offchain/pull/269)) +- ensure debt is finalized before collection ([#268](https://github.com/doublezerofoundation/doublezero-offchain/pull/268)) +- use inclusive range for completed DZ epochs ([#2815](https://github.com/malbeclabs/doublezero/issues/2815)) +- remove dz_ledger as argument ([#255](https://github.com/doublezerofoundation/doublezero-offchain/pull/255)) +- Make “Total Debt Collection” Slack summary a global (unfiltered) total while keeping the per-epoch “Debt Collected” table filtered ([#252](https://github.com/doublezerofoundation/doublezero-offchain/pull/252)) +- use vote key from past ([#250](https://github.com/doublezerofoundation/doublezero-offchain/pull/250)) +- bail early when Revenue Distribution program is paused ([#244](https://github.com/doublezerofoundation/doublezero-offchain/pull/244)) +- finalize zero debt ([#248](https://github.com/doublezerofoundation/doublezero-offchain/pull/248)) +- parallelize finalize distribution calls (([#247](https://github.com/doublezerofoundation/doublezero-offchain/pull/247)) +- filter out epochs with no successful debt collection (([#246](https://github.com/doublezerofoundation/doublezero-offchain/pull/246)) +- remove unnecessary loops to calculate results, only display epochs that debt is collected (([#245](https://github.com/doublezerofoundation/doublezero-offchain/pull/245)) +- add finalize rewards and sweep tokens to initialize distribution workflow ([#243](https://github.com/doublezerofoundation/doublezero-offchain/pull/243)) +- parallelize debt collection and reduce collection_results being sent around, ignore overlapping dz epochs in report ([#228](https://github.com/doublezerofoundation/doublezero-offchain/pull/228)) +- fix local uncollectible debt tracking for write-off logic ([#240](https://github.com/doublezerofoundation/doublezero-offchain/pull/240)) +- enable debt write-off at activation ([#237](https://github.com/doublezerofoundation/doublezero-offchain/pull/237)) +- add `try_fetch_debt_records_and_distributions` ([#231](https://github.com/doublezerofoundation/doublezero-offchain/pull/231)) +- track eligibility by vote account instead of identity ([#230](https://github.com/doublezerofoundation/doublezero-offchain/pull/230)) +- add debt write-off logic ([#225](https://github.com/doublezerofoundation/doublezero-offchain/pull/225)) +- replace old client-tools log macros with `tracing` ([#226](https://github.com/doublezerofoundation/doublezero-offchain/pull/226)) +- add overrides flat file to exclude validators from debt collection ([216](https://github.com/doublezerofoundation/doublezero-offchain/pull/216)) +- add `debt_record_key` method ([#201](https://github.com/doublezerofoundation/doublezero-offchain/pull/201)) +- use s3 bucket to fetch validator keys ([#196](https://github.com/doublezerofoundation/doublezero-offchain/pull/196)) + +## [0.1.0-rc6](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/solana-validator-debt/v0.1.0-rc6) - 2025-11-11 + +- feat(solana-cli): add `revenue-distribution fetch distribution --view` argument ([#182](https://github.com/doublezerofoundation/doublezero-offchain/pull/182)) +- parse program logs, attach exported csv to slack msg ([#163](https://github.com/doublezerofoundation/doublezero-offchain/pull/163)) +- move binary from /usr/local/bin/ to /usr/bin to comply with package management standards ([#187](https://github.com/doublezerofoundation/doublezero-offchain/pull/187)) + +## [0.1.0-rc4](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/solana-validator-debt/v0.1.0-rc4) - 2025-10-21 + +- testing release-plz integration +- integrate slack notifications ([#161](https://github.com/doublezerofoundation/doublezero-offchain/pull/161)) +- add sol-conversion-admin-cli ([#156](https://github.com/doublezerofoundation/doublezero-offchain/pull/156)) +- import from and export to CSV, add verify command, bug fixes ([#147](https://github.com/doublezerofoundation/doublezero-offchain/pull/147)) +- display balance for uninitialized deposit account ([#137](https://github.com/doublezerofoundation/doublezero-offchain/pull/137)) +- default epoch to latest for calculating debt ([#133](https://github.com/doublezerofoundation/doublezero-offchain/pull/133)) +- option to post to DZ ledger only ([#130](https://github.com/doublezerofoundation/doublezero-offchain/pull/130)) +- update solana epoch finder ([#129](https://github.com/doublezerofoundation/doublezero-offchain/pull/129)) +- fetch revenue distribution account for epoch ([#128](https://github.com/doublezerofoundation/doublezero-offchain/pull/128)) +- estimate block time if slot is skipped ([#126](https://github.com/doublezerofoundation/doublezero-offchain/pull/126)) +- add find Solana epoch command ([#119](https://github.com/doublezerofoundation/doublezero-offchain/pull/119)) +- fix fetched epoch ([#118](https://github.com/doublezerofoundation/doublezero-offchain/pull/118)) +- add missing mainnet check ([#117](https://github.com/doublezerofoundation/doublezero-offchain/pull/117)) +- schedule initializing distributions ([#106](https://github.com/doublezerofoundation/doublezero-offchain/pull/106)) +- handle requests with backup IDs ([#105](https://github.com/doublezerofoundation/doublezero-offchain/pull/105)) +- handle overlapping Solana epochs ([#96](https://github.com/doublezerofoundation/doublezero-offchain/pull/96)) +- add checks after writing to ledger ([#95](https://github.com/doublezerofoundation/doublezero-offchain/pull/95)) +- ensure distribution has passed calculation_allowed_timestamp ([#93](https://github.com/doublezerofoundation/doublezero-offchain/pull/93)) +- output result of `write_debts` to tabled format ([#88](https://github.com/doublezerofoundation/doublezero-offchain/pull/88)) +- add CLI ([#91](https://github.com/doublezerofoundation/doublezero-offchain/pull/91)) +- separate `initialize_distribution` into its own process ([#89](https://github.com/doublezerofoundation/doublezero-offchain/pull/89)) +- fetch validator pubkeys from access passes ([#82](https://github.com/doublezerofoundation/doublezero-offchain/pull/82)) +- Add retry/backoff to Jito/solana RPC calls ([#87](https://github.com/doublezerofoundation/doublezero-offchain/pull/87)) +- add pay debt commands ([#80](https://github.com/doublezerofoundation/doublezero-offchain/pull/80)) +- Prepare for off-chain components +- Reorg +- Fix api token security, retries and concurrent requests +- Add docs +- More cleanup and simplification +- configuration and defaults +- Cleanup, add TODOs +- Add merkle_generator +- Update README +- Simplify +- Bump README +- Add README diff --git a/offchain/crates/validator-debt/Cargo.toml b/offchain/crates/validator-debt/Cargo.toml new file mode 100644 index 0000000000..a7880c1631 --- /dev/null +++ b/offchain/crates/validator-debt/Cargo.toml @@ -0,0 +1,57 @@ +[package] +name = "doublezero-solana-validator-debt" +description = "Crate that processes debt for validators" +version = "0.1.0-rc6" + +edition.workspace = true +homepage.workspace = true +license.workspace = true +readme.workspace = true +repository.workspace = true + +[dependencies] +anyhow.workspace = true +arrow.workspace = true +async-trait.workspace = true +aws-config.workspace = true +aws-sdk-s3.workspace = true +backon.workspace = true +bincode.workspace = true +borsh.workspace = true +chrono.workspace = true +clap.workspace = true +csv.workspace = true +doublezero-record.workspace = true +doublezero-serviceability.workspace = true +doublezero_sdk.workspace = true +doublezero-solana-client-tools.workspace = true +doublezero-solana-sdk.workspace = true +futures.workspace = true +leaky-bucket.workspace = true +metrics.workspace = true +metrics-exporter-prometheus.workspace = true +mockall.workspace = true +parquet.workspace = true +reqwest.workspace = true +serde.workspace = true +serde_json.workspace = true +slack-notifier.workspace = true +solana-account-decoder.workspace = true +solana-client.workspace = true +solana-commitment-config.workspace = true +solana-compute-budget-interface.workspace = true +solana-reward-info.workspace = true +solana-sdk.workspace = true +solana-transaction-status-client-types.workspace = true +tabled.workspace = true +tempfile.workspace = true +tokio.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true +url.workspace = true + +[dev-dependencies] +dirs = "6" + +[features] +integration = [] diff --git a/offchain/crates/validator-debt/src/block.rs b/offchain/crates/validator-debt/src/block.rs new file mode 100644 index 0000000000..a7ad07f201 --- /dev/null +++ b/offchain/crates/validator-debt/src/block.rs @@ -0,0 +1,225 @@ +use std::{collections::HashMap, time::Duration}; + +use anyhow::{Context, Result, bail}; +use backon::{ExponentialBuilder, Retryable}; +use futures::{StreamExt, TryStreamExt, stream}; +use solana_client::{ + client_error::{ClientError, ClientErrorKind}, + rpc_custom_error::{ + JSON_RPC_SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED, JSON_RPC_SERVER_ERROR_SLOT_SKIPPED, + }, + rpc_request::RpcError, +}; +use solana_reward_info::RewardType; + +use crate::solana_debt_calculator::ValidatorRewards; + +pub async fn get_block_rewards( + api_provider: &impl ValidatorRewards, + validator_ids: &[String], + epoch: u64, +) -> Result> { + let epoch_info = api_provider.get_epoch_info().await?; + let first_slot_in_current_epoch = epoch_info.absolute_slot - epoch_info.slot_index; + + let epoch_diff = epoch_info.epoch - epoch; + + // TODO: Do we need this check? + if epoch_diff >= 5 { + bail!("Epoch diff is greater than 5") + } + let first_slot = first_slot_in_current_epoch - (epoch_info.slots_in_epoch * epoch_diff); + + // Fetch the leader schedule + let leader_schedule = api_provider.get_leader_schedule(Some(first_slot)).await?; + + // Build validator schedules + tracing::info!("Building validator schedules"); + let validator_schedules: HashMap> = validator_ids + .iter() + .filter_map(|validator_id| { + leader_schedule.get(validator_id).map(|schedule| { + let slots = schedule + .iter() + .map(|&idx| first_slot + idx as u64) + .collect(); + (validator_id.clone(), slots) + }) + }) + .collect(); + + let block_rewards = + stream::iter( + validator_schedules + .into_iter() + .flat_map(|(validator_id, slots)| { + tracing::info!("getting block rewards for {}", validator_id.clone()); + slots + .into_iter() + .map(move |slot| (validator_id.clone(), slot)) + }), + ) + .map(|(validator_id, slot)| async move { + match (|| async { api_provider.get_block_with_config(slot).await }) + .retry( + &ExponentialBuilder::default() + .with_max_times(5) + .with_min_delay(Duration::from_millis(100)) + .with_max_delay(Duration::from_secs(10)) + .with_jitter(), + ) + .when(|err| { + let should_retry = !client_error_matches_slot_skipped_code(err); + + if should_retry { + tracing::info!("{validator_id}: {err} for slot {slot}, retrying"); + } + + should_retry + }) + .notify(|err, dur: Duration| { + tracing::info!( + "get_block_with_config call failed, retrying in {:?}: {}", + dur, + err + ); + }) + .await + { + Ok(block) => { + let mut signature_lamports: u64 = 0; + if let Some(sigs) = &block.signatures { + signature_lamports = sigs.len() as u64; + signature_lamports *= 2_500; + }; + let lamports: u64 = block + .rewards + .map(|rewards| { + rewards + .iter() + .filter_map(|reward| { + if reward.reward_type == Some(RewardType::Fee) + && reward.lamports > 0 + { + Some(reward.lamports.unsigned_abs()) + } else { + None + } + }) + .sum() + }) + .context("no block rewards")?; + Ok(( + validator_id, + (signature_lamports, lamports - signature_lamports), + )) + } + Err(ref err) if client_error_matches_slot_skipped_code(err) => { + Ok((validator_id, Default::default())) + } + Err(other_err) => bail!("Failed to fetch block for slot {slot}: {other_err}"), + } + }) + .buffer_unordered(20) + .try_fold( + Default::default(), + |mut acc: HashMap, + (validator_id, (signature_lamports, lamports))| async move { + let entry = acc.entry(validator_id).or_default(); + entry.0 += signature_lamports; + entry.1 += lamports; + Ok(acc) + }, + ) + .await?; + + Ok(block_rewards) +} + +fn client_error_matches_slot_skipped_code(err: &ClientError) -> bool { + if let ClientErrorKind::RpcError(RpcError::RpcResponseError { code, .. }) = err.kind() { + matches!( + code, + &JSON_RPC_SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED + | &JSON_RPC_SERVER_ERROR_SLOT_SKIPPED + ) + } else { + false + } +} + +#[cfg(test)] +mod tests { + use solana_sdk::epoch_info::EpochInfo; + use solana_transaction_status_client_types::{Reward, UiConfirmedBlock}; + + use super::*; + use crate::solana_debt_calculator::MockValidatorRewards; + + #[tokio::test] + async fn test_get_block_rewards() { + let mut mock_api_provider = MockValidatorRewards::new(); + let validator_id = "some_validator_pubkey".to_string(); + let validator_ids = std::slice::from_ref(&validator_id); + let epoch = 100; + let slot_index = 10; + + let mut leader_schedule = HashMap::new(); + leader_schedule.insert(validator_id.clone(), vec![slot_index]); + + mock_api_provider + .expect_get_leader_schedule() + .times(1) + .returning(move |_| Ok(leader_schedule.clone())); + + let block_reward = (7500, 0); + let mock_block = UiConfirmedBlock { + num_reward_partitions: Some(1), + signatures: Some(vec![ + "One".to_string(), + "two".to_string(), + "three".to_string(), + ]), + rewards: Some(vec![Reward { + pubkey: validator_id.clone(), + lamports: block_reward.0, + post_balance: 10000, + reward_type: Some(RewardType::Fee), + commission: None, + }]), + previous_blockhash: "".to_string(), + blockhash: "".to_string(), + parent_slot: 0, + transactions: None, + block_time: None, + block_height: None, + }; + + let mock_epoch_info = EpochInfo { + epoch: 101, + slot_index: 1000, + absolute_slot: 100000, + block_height: 1030303, + slots_in_epoch: 4000, + transaction_count: Some(1000), + }; + + mock_api_provider + .expect_get_epoch_info() + .times(1) + .returning(move || Ok(mock_epoch_info.clone())); + + mock_api_provider + .expect_get_block_with_config() + .returning(move |_| Ok(mock_block.clone())); + + let rewards = get_block_rewards(&mock_api_provider, validator_ids, epoch) + .await + .unwrap(); + + let base_rewards = rewards.get(&validator_id).unwrap(); + + assert_eq!(base_rewards.0, block_reward.0 as u64); + assert_eq!(base_rewards.1, block_reward.1); + } +} diff --git a/offchain/crates/validator-debt/src/command/calculate.rs b/offchain/crates/validator-debt/src/command/calculate.rs new file mode 100644 index 0000000000..7cbaa1b516 --- /dev/null +++ b/offchain/crates/validator-debt/src/command/calculate.rs @@ -0,0 +1,223 @@ +use anyhow::Result; +use chrono::Utc; +use clap::{Args, ValueEnum}; +use doublezero_solana_client_tools::{ + payer::{SolanaPayerOptions, try_load_keypair}, + rpc::{DoubleZeroLedgerConnectionOptions, SolanaConnection, SolanaConnectionOptions}, +}; +use doublezero_solana_sdk::revenue_distribution::state::ProgramConfig; +use leaky_bucket::RateLimiter; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_commitment_config::CommitmentConfig; +use tabled::{Table, settings::Style}; + +use crate::{ + rpc::{JoinedSolanaEpochs, SolanaValidatorDebtConnectionOptions}, + solana_debt_calculator::SolanaDebtCalculator, + transaction::Transaction, +}; + +#[derive(Debug, Clone, ValueEnum)] +pub enum ExportFormat { + Csv, + Slack, +} + +#[derive(Debug, Args, Clone)] +pub struct CalculateValidatorDebtCommand { + #[arg(long)] + force: bool, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + + #[command(flatten)] + dz_ledger_connection_options: DoubleZeroLedgerConnectionOptions, + + /// Option to post validator debt only to the DoubleZero Ledger + #[arg(long)] + post_to_ledger_only: bool, + + /// export results: csv, slack + #[arg(long, value_enum)] + export: Option, +} + +impl CalculateValidatorDebtCommand { + pub async fn try_into_execute(self) -> Result<()> { + let Self { + force, + solana_payer_options, + dz_ledger_connection_options, + post_to_ledger_only, + export, + } = self; + + let connection_options = SolanaValidatorDebtConnectionOptions { + solana_url_or_moniker: solana_payer_options + .connection_options + .solana_url_or_moniker + .clone(), + dz_ledger_url: dz_ledger_connection_options.dz_ledger_url.clone(), + }; + let solana_debt_calculator: SolanaDebtCalculator = + SolanaDebtCalculator::try_from(connection_options)?; + let signer = try_load_keypair(None).expect("failed to load keypair"); + let transaction = Transaction::new( + signer.into(), + solana_payer_options.signer_options.dry_run, + force, + ); + let dry_run = transaction.dry_run; + let write_summary = crate::worker::calculate_distribution( + &solana_debt_calculator, + transaction, + post_to_ledger_only, + ) + .await?; + + let mut filename: Option = None; + + if let Some(ExportFormat::Csv) = export { + let now = Utc::now(); + let timestamp_milliseconds: i64 = now.timestamp_millis(); + let string_filename = if dry_run { + format!( + "DRY_RUN_dz_epoch_{}_calculate_distribution_{timestamp_milliseconds}.csv", + write_summary.dz_epoch + ) + } else { + format!( + "dz_epoch_{}_calculate_distribution_{timestamp_milliseconds}.csv", + write_summary.dz_epoch + ) + }; + let mut writer = csv::Writer::from_path(string_filename.clone())?; + filename = Some(string_filename); + for w in write_summary.validator_summaries.iter() { + writer.serialize(w)?; + } + writer.flush()?; + }; + + if let Some(ExportFormat::Slack) = export { + slack_notifier::validator_debt::post_distribution_to_slack( + filename, + write_summary.solana_epoch, + write_summary.dz_epoch, + dry_run, + write_summary.total_debt, + write_summary.total_validators, + write_summary.transaction_id, + ) + .await?; + } + + tracing::info!( + "Validator rewards for solana epoch {} and validator debt for DoubleZero epoch {}:\n{}", + write_summary.solana_epoch, + write_summary.dz_epoch, + Table::new(write_summary.validator_summaries).with(Style::psql().remove_horizontals()) + ); + + Ok(()) + } +} + +#[derive(Debug, Args, Clone)] +pub struct FindSolanaEpochCommand { + /// Target DoubleZero Ledger epoch. + #[arg(long)] + epoch: Option, + + #[command(flatten)] + solana_connection_options: SolanaConnectionOptions, + + #[command(flatten)] + dz_ledger_connection_options: DoubleZeroLedgerConnectionOptions, + + /// Limit requests per second for Solana RPC. + #[arg(long, default_value_t = 10)] + solana_rate_limit: usize, +} + +impl FindSolanaEpochCommand { + pub async fn try_into_execute(self) -> Result<()> { + let Self { + epoch, + solana_connection_options, + dz_ledger_connection_options, + solana_rate_limit, + } = self; + + let latest_distribution_epoch = + latest_distribution_epoch(&solana_connection_options, &dz_ledger_connection_options) + .await?; + + let target_dz_epoch = epoch.as_ref().copied().unwrap_or(latest_distribution_epoch); + tracing::info!("Target DZ epoch: {target_dz_epoch}"); + + let rate_limiter = RateLimiter::builder() + .max(solana_rate_limit) + .initial(solana_rate_limit) + .refill(solana_rate_limit) + .interval(std::time::Duration::from_secs(1)) + .build(); + + let solana_connection = SolanaConnection::from(solana_connection_options.clone()); + + let dz_ledger_rpc_client = RpcClient::new_with_commitment( + dz_ledger_connection_options.dz_ledger_url.clone(), + CommitmentConfig::confirmed(), + ); + + match JoinedSolanaEpochs::try_new( + &solana_connection, + &dz_ledger_rpc_client, + target_dz_epoch, + &rate_limiter, + ) + .await? + { + JoinedSolanaEpochs::Range(solana_epoch_range) => { + solana_epoch_range.into_iter().for_each(|solana_epoch| { + tracing::info!("Joined Solana epoch: {solana_epoch}"); + }); + } + JoinedSolanaEpochs::Duplicate(solana_epoch) => { + tracing::warn!("Duplicated joined Solana epoch: {solana_epoch}"); + } + }; + + Ok(()) + } +} + +// TODO: Does the dz ledger connection need to be an argument? Also, this is a +// duplicate of the function in verify.rs. +async fn latest_distribution_epoch( + solana_connection_options: &SolanaConnectionOptions, + dz_ledger_connection_options: &DoubleZeroLedgerConnectionOptions, +) -> Result { + let solana_connection = SolanaConnection::from(solana_connection_options.clone()); + let is_mainnet = solana_connection + .try_network_environment() + .await? + .is_mainnet_beta(); + + let dz_ledger_rpc_client = RpcClient::new_with_commitment( + dz_ledger_connection_options.dz_ledger_url.clone(), + CommitmentConfig::confirmed(), + ); + + super::ensure_same_network_environment(&dz_ledger_rpc_client, is_mainnet).await?; + + let program_config = solana_connection + .try_fetch_zero_copy_data::(&ProgramConfig::find_address().0) + .await?; + + Ok(program_config + .next_completed_dz_epoch + .value() + .saturating_sub(1)) +} diff --git a/offchain/crates/validator-debt/src/command/export_validators.rs b/offchain/crates/validator-debt/src/command/export_validators.rs new file mode 100644 index 0000000000..8d17fcb446 --- /dev/null +++ b/offchain/crates/validator-debt/src/command/export_validators.rs @@ -0,0 +1,93 @@ +use std::path::PathBuf; + +use anyhow::Result; +use clap::Args; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_commitment_config::CommitmentConfig; +use url::Url; + +use crate::{rpc::normalize_to_url_if_moniker, s3_fetcher}; + +#[derive(Debug, Args, Clone)] +pub struct ExportValidatorsCommand { + /// Solana epoch number to fetch validators for + #[arg(long, short = 'e')] + epoch: u64, + + /// Output CSV file path (default: validators_{epoch}.csv) + #[arg(long, short = 'o')] + output: Option, + + /// URL for Solana's JSON RPC or moniker (or their first letter): + /// [mainnet-beta, testnet, localhost]. + #[arg(long = "url", short = 'u')] + solana_url_or_moniker: Option, +} + +impl ExportValidatorsCommand { + pub async fn try_into_execute(self) -> Result<()> { + let Self { + epoch, + output, + solana_url_or_moniker, + } = self; + + tracing::info!("Exporting validators for Solana epoch {}", epoch); + + // Create RPC client + let solana_url_or_moniker = solana_url_or_moniker.as_deref().unwrap_or("m"); + let solana_url = Url::parse(normalize_to_url_if_moniker(solana_url_or_moniker))?; + let rpc_client = + RpcClient::new_with_commitment(solana_url.into(), CommitmentConfig::confirmed()); + + // Fetch validators from S3 + tracing::info!("Fetching validator pubkeys from S3..."); + let validator_keys = s3_fetcher::fetch_validator_pubkeys( + epoch, + &rpc_client, + s3_fetcher::Network::MainnetBeta, + ) + .await?; + + tracing::info!( + "[OK] Found {} validators (after 12-hour rule)", + validator_keys.len() + ); + + // Determine output path + let output_path = + output.unwrap_or_else(|| PathBuf::from(format!("validators_{}.csv", epoch))); + + // Sort by identity_count (desc) to surface rotated validators first, + // then by vote_account_pubkey to group them together + let mut validator_keys = validator_keys; + validator_keys.sort_by(|a, b| { + b.identity_count + .cmp(&a.identity_count) + .then_with(|| a.vote_account_pubkey.cmp(&b.vote_account_pubkey)) + }); + + // Write to CSV + tracing::info!("Writing to {}...", output_path.display()); + let mut writer = csv::WriterBuilder::new().from_path(&output_path)?; + + // Write validator data + for validator in &validator_keys { + writer.serialize(validator)?; + } + + writer.flush()?; + + tracing::info!( + "[OK] Exported {} validators to {}", + validator_keys.len(), + output_path.display() + ); + tracing::info!("Summary:"); + tracing::info!(" Epoch: {}", epoch); + tracing::info!(" Validators: {}", validator_keys.len()); + tracing::info!(" Output: {}", output_path.display()); + + Ok(()) + } +} diff --git a/offchain/crates/validator-debt/src/command/initialize.rs b/offchain/crates/validator-debt/src/command/initialize.rs new file mode 100644 index 0000000000..edf8b0d38b --- /dev/null +++ b/offchain/crates/validator-debt/src/command/initialize.rs @@ -0,0 +1,45 @@ +use anyhow::Result; +use clap::Args; +use doublezero_solana_client_tools::{ + payer::{SolanaPayerOptions, Wallet}, + rpc::DoubleZeroLedgerEnvironmentOverride, +}; +use solana_sdk::pubkey::Pubkey; + +use crate::worker; + +#[derive(Debug, Args, Clone)] +pub struct InitializeDistributionCommand { + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + + #[command(flatten)] + dz_env: DoubleZeroLedgerEnvironmentOverride, + + #[arg(hide = true, long)] + bypass_dz_epoch_check: bool, + + #[arg(hide = true, long)] + record_debt_accountant: Option, +} + +impl InitializeDistributionCommand { + pub async fn try_into_execute(self) -> Result<()> { + let Self { + solana_payer_options, + dz_env, + bypass_dz_epoch_check, + record_debt_accountant: record_accountant_key, + } = self; + + let wallet = Wallet::try_from(solana_payer_options)?; + + worker::try_initialize_distribution( + &wallet, + dz_env.dz_env, + bypass_dz_epoch_check, + record_accountant_key, + ) + .await + } +} diff --git a/offchain/crates/validator-debt/src/command/mod.rs b/offchain/crates/validator-debt/src/command/mod.rs new file mode 100644 index 0000000000..e99cdd298d --- /dev/null +++ b/offchain/crates/validator-debt/src/command/mod.rs @@ -0,0 +1,110 @@ +mod calculate; +mod export_validators; +mod initialize; +mod verify; + +// + +use anyhow::{Result, bail}; +use doublezero_solana_client_tools::payer::try_load_keypair; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_sdk::pubkey::Pubkey; + +use crate::{ + rpc::SolanaValidatorDebtConnectionOptions, solana_debt_calculator::SolanaDebtCalculator, + transaction::Transaction, worker, +}; + +const DOUBLEZERO_LEDGER_MAINNET_BETA_GENESIS_HASH: Pubkey = + solana_sdk::pubkey!("5wVUvkFcFGYiKRUZ8Jp8Wc5swjhDEqT7hTdyssxDpC7P"); + +#[derive(Debug, clap::Subcommand)] +pub enum ValidatorDebtCommand { + /// Calculate Validator Debt. + CalculateValidatorDebt(calculate::CalculateValidatorDebtCommand), + + FindSolanaEpoch(calculate::FindSolanaEpochCommand), + + VerifyValidatorDebt(verify::VerifyValidatorDebtCommand), + + /// Export validator pubkeys for a given Solana epoch. + ExportValidators(export_validators::ExportValidatorsCommand), + + /// Finalize Epoch Distribution. + FinalizeDistribution { + #[command(flatten)] + solana_connection_options: SolanaValidatorDebtConnectionOptions, + #[arg(long)] + epoch: u64, + #[arg(long, value_name = "DRY_RUN")] + dry_run: bool, + #[arg(long, value_name = "FORCE")] + force: bool, + }, + + // Initialize a new distribution on Solana. + // + // TODO: Consider only allowing localnet for this command since the + // scheduler handles initialization. + #[command(hide = true)] + InitializeDistribution(initialize::InitializeDistributionCommand), +} + +impl ValidatorDebtCommand { + pub async fn try_into_execute(self) -> Result<()> { + match self { + ValidatorDebtCommand::InitializeDistribution(command) => { + command.try_into_execute().await + } + ValidatorDebtCommand::CalculateValidatorDebt(command) => { + command.try_into_execute().await + } + ValidatorDebtCommand::FindSolanaEpoch(command) => command.try_into_execute().await, + ValidatorDebtCommand::VerifyValidatorDebt(command) => command.try_into_execute().await, + ValidatorDebtCommand::ExportValidators(command) => command.try_into_execute().await, + ValidatorDebtCommand::FinalizeDistribution { + solana_connection_options, + epoch, + dry_run, + force, + } => { + execute_finalize_transaction(solana_connection_options, epoch, dry_run, force).await + } + } + } +} + +async fn execute_finalize_transaction( + solana_connection_options: SolanaValidatorDebtConnectionOptions, + epoch: u64, + dry_run: bool, + force: bool, +) -> Result<()> { + let solana_debt_calculator: SolanaDebtCalculator = + SolanaDebtCalculator::try_from(solana_connection_options)?; + let signer = try_load_keypair(None)?; + let transaction = Transaction::new(signer.into(), dry_run, force); + worker::finalize_distribution(&solana_debt_calculator, transaction, epoch).await?; + Ok(()) +} + +// + +async fn ensure_same_network_environment( + dz_ledger_rpc: &RpcClient, + is_mainnet: bool, +) -> Result<()> { + let genesis_hash = dz_ledger_rpc.get_genesis_hash().await?; + + // This check is safe to do because there are only two possible DoubleZero + // Ledger networks: mainnet and testnet. + if (is_mainnet + && genesis_hash.to_bytes() != DOUBLEZERO_LEDGER_MAINNET_BETA_GENESIS_HASH.to_bytes()) + || (!is_mainnet + && genesis_hash.to_bytes() == DOUBLEZERO_LEDGER_MAINNET_BETA_GENESIS_HASH.to_bytes()) + { + bail!("DoubleZero Ledger environment is not the same as the Solana environment"); + } + + Ok(()) +} diff --git a/offchain/crates/validator-debt/src/command/verify.rs b/offchain/crates/validator-debt/src/command/verify.rs new file mode 100644 index 0000000000..a8ab5e931f --- /dev/null +++ b/offchain/crates/validator-debt/src/command/verify.rs @@ -0,0 +1,107 @@ +use anyhow::Result; +use clap::Args; +use doublezero_solana_client_tools::{ + payer::{SolanaPayerOptions, try_load_keypair}, + rpc::{DoubleZeroLedgerConnectionOptions, SolanaConnection, SolanaConnectionOptions}, +}; +use doublezero_solana_sdk::revenue_distribution::state::ProgramConfig; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_commitment_config::CommitmentConfig; + +use crate::{ + rpc::SolanaValidatorDebtConnectionOptions, solana_debt_calculator::SolanaDebtCalculator, + transaction::Transaction, +}; + +#[derive(Debug, Args, Clone)] +pub struct VerifyValidatorDebtCommand { + #[arg(long)] + epoch: Option, + + #[arg(long)] + validator_id: String, + + #[arg(long)] + amount: u64, + + #[command(flatten)] + solana_payer_options: SolanaPayerOptions, + + #[command(flatten)] + dz_ledger_connection_options: DoubleZeroLedgerConnectionOptions, +} + +impl VerifyValidatorDebtCommand { + pub async fn try_into_execute(self) -> Result<()> { + let Self { + epoch, + validator_id, + amount, + solana_payer_options, + dz_ledger_connection_options, + } = self; + + let epoch = match epoch { + Some(epoch) => epoch, + None => { + latest_distribution_epoch( + &solana_payer_options.connection_options, + &dz_ledger_connection_options, + ) + .await? + } + }; + + let connection_options = SolanaValidatorDebtConnectionOptions { + solana_url_or_moniker: solana_payer_options + .connection_options + .solana_url_or_moniker + .clone(), + dz_ledger_url: dz_ledger_connection_options.dz_ledger_url.clone(), + }; + + let solana_debt_calculator: SolanaDebtCalculator = + SolanaDebtCalculator::try_from(connection_options)?; + let signer = try_load_keypair(None).expect("failed to load keypair"); + let transaction = Transaction::new(signer.into(), true, false); + crate::worker::verify_validator_debt( + &solana_debt_calculator, + transaction, + epoch, + validator_id.as_str(), + amount, + ) + .await?; + + Ok(()) + } +} + +// TODO: Does the dz ledger connection need to be an argument? Also, this is a +// duplicate of the function in calculate.rs. +async fn latest_distribution_epoch( + solana_connection_options: &SolanaConnectionOptions, + dz_ledger_connection_options: &DoubleZeroLedgerConnectionOptions, +) -> Result { + let solana_connection = SolanaConnection::from(solana_connection_options.clone()); + let is_mainnet = solana_connection + .try_network_environment() + .await? + .is_mainnet_beta(); + + let dz_ledger_rpc_client = RpcClient::new_with_commitment( + dz_ledger_connection_options.dz_ledger_url.clone(), + CommitmentConfig::confirmed(), + ); + + super::ensure_same_network_environment(&dz_ledger_rpc_client, is_mainnet).await?; + + let program_config = solana_connection + .try_fetch_zero_copy_data::(&ProgramConfig::find_address().0) + .await?; + + Ok(program_config + .next_completed_dz_epoch + .value() + .saturating_sub(1)) +} diff --git a/offchain/crates/validator-debt/src/inflation.rs b/offchain/crates/validator-debt/src/inflation.rs new file mode 100644 index 0000000000..7e48b5d3ba --- /dev/null +++ b/offchain/crates/validator-debt/src/inflation.rs @@ -0,0 +1,124 @@ +use std::{collections::HashMap, str::FromStr, time::Duration}; + +use anyhow::{Result, anyhow}; +use backon::{ExponentialBuilder, Retryable}; +use solana_sdk::pubkey::Pubkey; + +use crate::solana_debt_calculator::ValidatorRewards; + +pub async fn get_inflation_rewards( + solana_debt_calculator: &impl ValidatorRewards, + validator_ids: &[String], + epoch: u64, +) -> Result> { + let mut vote_keys: Vec = Vec::with_capacity(validator_ids.len()); + + tracing::info!("get inflation rewards for epoch {epoch}"); + let vote_accounts = (|| async { + solana_debt_calculator + .get_vote_accounts_with_config() + .await + }).retry(&ExponentialBuilder::default() + .with_max_times(5) + .with_min_delay(Duration::from_millis(100)) + .with_max_delay(Duration::from_secs(10)) + .with_jitter()) + .notify(|err, dur: Duration| { + tracing::info!("get_vote_accounts_with_config call failed, retrying in {:?}: {}", dur, err); + }).await.map_err(|e| { + anyhow!("Failed to fetch get_vote_accounts_with_config for epoch {epoch} after retries: {e:#?}") + })?; + + // this can be cleaned up i'm sure + tracing::info!("getting vote account keys for inflation rewards"); + for validator_id in validator_ids { + match vote_accounts + .current + .iter() + .find(|vote_account| vote_account.node_pubkey == *validator_id) + .map(|vote_account| { + Pubkey::from_str(&vote_account.vote_pubkey) + .map_err(|e| anyhow!("Invalid vote_pubkey '{}': {e}", vote_account.vote_pubkey)) + }) + .transpose()? + { + Some(vote_account) => vote_keys.push(vote_account), + None => { + tracing::warn!("Validator ID {validator_id} not found"); + continue; + } + }; + } + + let inflation_rewards = solana_debt_calculator + .get_inflation_reward(vote_keys, epoch) + .await?; + + let rewards: Vec = inflation_rewards + .iter() + .map(|ir| match ir { + Some(rewards) => rewards.amount, + None => 0, + }) + .collect(); + + // probably a better way to do this + let inflation_rewards: HashMap = + validator_ids.iter().cloned().zip(rewards).collect(); + Ok(inflation_rewards) +} + +#[cfg(test)] +mod tests { + use solana_client::rpc_response::{ + RpcInflationReward, RpcVoteAccountInfo, RpcVoteAccountStatus, + }; + + use super::*; + use crate::solana_debt_calculator::MockValidatorRewards; + + #[tokio::test] + async fn test_get_inflation_rewards() { + let mut mock_solana_debt_calculator = MockValidatorRewards::new(); + let validator_id = "some_validator_pubkey".to_string(); + let validator_ids = std::slice::from_ref(&validator_id); + let epoch = 100; + let mock_rpc_vote_account_status = RpcVoteAccountStatus { + current: vec![RpcVoteAccountInfo { + vote_pubkey: "some vote pubkey".to_string(), + node_pubkey: "some pubkey".to_string(), + activated_stake: 4_200_000_000_000, + epoch_vote_account: true, + epoch_credits: vec![(812, 256, 128), (811, 128, 64)], + commission: 10, + last_vote: 123456789, + root_slot: 123456700, + }], + delinquent: vec![], + }; + mock_solana_debt_calculator + .expect_get_vote_accounts_with_config() + .withf(move || true) + .times(1) + .returning(move || Ok(mock_rpc_vote_account_status.clone())); + + let mock_rpc_inflation_reward = vec![Some(RpcInflationReward { + epoch: 812, + effective_slot: 123456789, + amount: 2500, + post_balance: 1_500_002_500, + commission: Some(1), + })]; + + mock_solana_debt_calculator + .expect_get_inflation_reward() + .times(1) + .returning(move |_, _| Ok(mock_rpc_inflation_reward.clone())); + + let inflation_reward: u64 = 2500; + let rewards = get_inflation_rewards(&mock_solana_debt_calculator, validator_ids, epoch) + .await + .unwrap(); + assert_eq!(rewards.get(&validator_id), Some(&(inflation_reward))); + } +} diff --git a/offchain/crates/validator-debt/src/jito.rs b/offchain/crates/validator-debt/src/jito.rs new file mode 100644 index 0000000000..918fac2c12 --- /dev/null +++ b/offchain/crates/validator-debt/src/jito.rs @@ -0,0 +1,111 @@ +use std::{collections::HashMap, time::Duration}; + +use anyhow::{Result, anyhow}; +use backon::{ExponentialBuilder, Retryable}; +use serde::Deserialize; + +use crate::solana_debt_calculator::ValidatorRewards; + +const JITO_BASE_URL: &str = "https://kobe.mainnet.jito.network/api/v1/"; + +pub const JITO_REWARDS_LIMIT: u16 = 1_500; + +#[derive(Deserialize, Debug)] +pub struct JitoRewards { + // TODO: check total_count to see if it exceeds entries in a single response + // limit - default: 100, max: 10000 + pub total_count: u16, + pub rewards: Vec, +} + +#[derive(Deserialize, Debug)] +pub struct JitoReward { + pub vote_account: String, + pub mev_revenue: u64, +} + +// may need to add in pagination +pub async fn get_jito_rewards<'a>( + solana_debt_calculator: &impl ValidatorRewards, + validator_ids: &'a [String], + epoch: u64, +) -> Result> { + let url = format!( + // TODO: make limit an env var + // based on very unscientific checking of a number of epochs, 1200 is the highest count + "{JITO_BASE_URL}validator_rewards?epoch={epoch}&limit={JITO_REWARDS_LIMIT}" + ); + + tracing::info!("Fetching Jito rewards for epoch {epoch}"); + let rewards = (|| async { solana_debt_calculator.get::(&url).await }) + .retry( + &ExponentialBuilder::default() + .with_max_times(5) + .with_min_delay(Duration::from_millis(100)) + .with_max_delay(Duration::from_secs(10)) + .with_jitter(), + ) + .notify(|err, dur: Duration| { + tracing::info!("Jito API call failed, retrying in {:?}: {}", dur, err); + }) + .await + .map_err(|e| { + anyhow!("Failed to fetch Jito rewards for epoch {epoch} after retries: {e:#?}") + })?; + + if rewards.total_count > JITO_REWARDS_LIMIT { + tracing::info!( + "Unexpectedly received total count higher than 1500; actual count is {}", + rewards.total_count + ); + } + let jito_rewards = validator_ids + .iter() + .map(|validator_id| { + tracing::info!("Fetching Jito rewards for validator_id {validator_id}"); + let mev_revenue = rewards + .rewards + .iter() + .find(|reward| validator_id == &reward.vote_account) + .map(|reward| reward.mev_revenue) + .unwrap_or_default(); + (validator_id.as_str(), mev_revenue) + }) + .collect::>(); + + Ok(jito_rewards) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::solana_debt_calculator::MockValidatorRewards; + + #[tokio::test] + async fn test_get_jito_rewards() { + let mut jito_mock_fetcher = MockValidatorRewards::new(); + let pubkey = "CvSb7wdQAFpHuSpTYTJnX5SYH4hCfQ9VuGnqrKaKwycB"; + let validator_ids: &[String] = &[String::from(pubkey)]; + let epoch = 812; + let expected_mev_revenue = 503423196855; + jito_mock_fetcher + .expect_get::() + .withf(move |url| url.contains(&format!("epoch={epoch}"))) + .times(1) + .returning(move |_| { + Ok(JitoRewards { + total_count: 1000, + rewards: vec![JitoReward { + vote_account: pubkey.to_string(), + mev_revenue: expected_mev_revenue, + }], + }) + }); + + let mock_response = get_jito_rewards(&jito_mock_fetcher, validator_ids, epoch) + .await + .unwrap(); + + assert_eq!(mock_response.get(pubkey), Some(&expected_mev_revenue)); + } +} diff --git a/offchain/crates/validator-debt/src/ledger.rs b/offchain/crates/validator-debt/src/ledger.rs new file mode 100644 index 0000000000..3071edb440 --- /dev/null +++ b/offchain/crates/validator-debt/src/ledger.rs @@ -0,0 +1,111 @@ +use anyhow::{Result, bail}; +use doublezero_record::state::RecordData; +use doublezero_sdk::record as doublezero_record; +use doublezero_solana_client_tools::rpc::DoubleZeroLedgerConnection; +use solana_client::{nonblocking::rpc_client::RpcClient, rpc_config::RpcSendTransactionConfig}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::{ + hash::Hash, + pubkey::Pubkey, + signer::{Signer, keypair::Keypair}, +}; + +use crate::validator_debt::ComputedSolanaValidatorDebts; + +pub const DOUBLEZERO_LEDGER_MAINNET_BETA_GENESIS_HASH: Pubkey = + solana_sdk::pubkey!("5wVUvkFcFGYiKRUZ8Jp8Wc5swjhDEqT7hTdyssxDpC7P"); + +pub async fn create_record_on_ledger( + rpc_client: &RpcClient, + recent_blockhash: Hash, + payer_signer: &Keypair, + record_data: &T, + commitment_config: CommitmentConfig, + seeds: &[&[u8]], +) -> Result<()> { + let payer_key = payer_signer.pubkey(); + + let serialized = borsh::to_vec(record_data)?; + // todo : log signature + let created_record = doublezero_record::client::try_create_record( + rpc_client, + recent_blockhash, + payer_signer, + seeds, + serialized.len(), + ) + .await?; + + tracing::info!("Attempting to create record {:#?}", created_record); + + for chunk in doublezero_record::instruction::write_record_chunks(&payer_key, seeds, &serialized) + { + chunk + .into_send_transaction_with_config( + rpc_client, + recent_blockhash, + payer_signer, + true, + RpcSendTransactionConfig { + preflight_commitment: Some(commitment_config.commitment), + ..Default::default() + }, + ) + .await?; + } + tracing::info!( + "wrote {} bytes for blockhash {recent_blockhash}", + serialized.len() + ); + Ok(()) +} + +pub fn debt_record_key(payer_key: &Pubkey, dz_epoch: u64) -> Pubkey { + doublezero_sdk::record::pubkey::create_record_key( + payer_key, + &[ + ComputedSolanaValidatorDebts::RECORD_SEED_PREFIX, + &dz_epoch.to_le_bytes(), + ], + ) +} + +// TODO: Use BorshRecordAccountData as return type instead? +pub async fn try_fetch_debt_record( + connection: &DoubleZeroLedgerConnection, + payer_key: &Pubkey, + dz_epoch: u64, + commitment_config: CommitmentConfig, +) -> Result<(RecordData, ComputedSolanaValidatorDebts)> { + let debt_record = connection + .try_fetch_borsh_record_with_commitment( + payer_key, + &[ + ComputedSolanaValidatorDebts::RECORD_SEED_PREFIX, + &dz_epoch.to_le_bytes(), + ], + commitment_config, + ) + .await?; + + Ok((debt_record.header, debt_record.data)) +} + +pub async fn ensure_same_network_environment( + dz_ledger_rpc: &RpcClient, + is_mainnet: bool, +) -> Result<()> { + let genesis_hash = dz_ledger_rpc.get_genesis_hash().await?; + + // This check is safe to do because there are only two possible DoubleZero + // Ledger networks: mainnet and testnet. + if (is_mainnet + && genesis_hash.to_bytes() != DOUBLEZERO_LEDGER_MAINNET_BETA_GENESIS_HASH.to_bytes()) + || (!is_mainnet + && genesis_hash.to_bytes() == DOUBLEZERO_LEDGER_MAINNET_BETA_GENESIS_HASH.to_bytes()) + { + bail!("DoubleZero Ledger environment is not the same as the Solana environment"); + } + + Ok(()) +} diff --git a/offchain/crates/validator-debt/src/lib.rs b/offchain/crates/validator-debt/src/lib.rs new file mode 100644 index 0000000000..5584c8ec08 --- /dev/null +++ b/offchain/crates/validator-debt/src/lib.rs @@ -0,0 +1,14 @@ +// + +pub mod block; +pub mod command; +pub mod inflation; +pub mod jito; +pub mod ledger; +pub mod rewards; +pub mod rpc; +pub mod s3_fetcher; +pub mod solana_debt_calculator; +pub mod transaction; +pub mod validator_debt; +pub mod worker; diff --git a/offchain/crates/validator-debt/src/main.rs b/offchain/crates/validator-debt/src/main.rs new file mode 100644 index 0000000000..637d9a56d0 --- /dev/null +++ b/offchain/crates/validator-debt/src/main.rs @@ -0,0 +1,71 @@ +use std::{ + env, + net::{IpAddr, SocketAddr}, + str::FromStr, +}; + +use anyhow::Result; +use clap::Parser; +use doublezero_solana_validator_debt::command::ValidatorDebtCommand; +use metrics_exporter_prometheus::PrometheusBuilder; +use tracing::{debug, warn}; +use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt}; + +#[derive(Debug, Parser)] +#[command(term_width = 0)] +#[command(version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")))] +#[command(about = "DoubleZero Solana Debt Calculation Commands", long_about = None)] +struct ValidatorDebtApp { + #[command(subcommand)] + command: ValidatorDebtCommand, +} + +#[tokio::main] +async fn main() -> Result<()> { + tracing_subscriber::registry() + .with(EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"))) + .with( + tracing_subscriber::fmt::layer() + .with_target(false) + .with_thread_ids(false) + .with_thread_names(false), + ) + .init(); + + if let Some(socket) = metrics_addr() { + if let Err(e) = PrometheusBuilder::new() + .with_http_listener(socket) + .install() + { + warn!("Failed to initialize metrics exporter: {e}. Continuing without metrics."); + } else { + export_build_info(); + debug!("Metrics exporter initialized on {}", socket); + }; + } + + ValidatorDebtApp::parse().command.try_into_execute().await +} + +fn export_build_info() { + let version = option_env!("BUILD_VERSION").unwrap_or(env!("CARGO_PKG_VERSION")); + let build_commit = option_env!("BUILD_COMMIT").unwrap_or("UNKNOWN"); + let build_date = option_env!("DATE").unwrap_or("UNKNOWN"); + let pkg_version = env!("CARGO_PKG_VERSION"); + + metrics::gauge!( + "doublezero_validator_debt_build_info", + "version" => version, + "commit" => build_commit, + "date" => build_date, + "pkg_version" => pkg_version + ) + .set(1.0); +} + +fn metrics_addr() -> Option { + env::var("VALIDATOR_DEBT_METRICS_ADDR") + .ok() + .and_then(|addr_str| IpAddr::from_str(&addr_str).ok()) + .map(|ip_addr| SocketAddr::new(ip_addr, 9090)) +} diff --git a/offchain/crates/validator-debt/src/rewards.rs b/offchain/crates/validator-debt/src/rewards.rs new file mode 100644 index 0000000000..c996f522cc --- /dev/null +++ b/offchain/crates/validator-debt/src/rewards.rs @@ -0,0 +1,229 @@ +//! This module fetches rewards for a particular validator by the validator pubkey +//! Rewards are delineated by a given epoch and rewards come from three sources: +//! - blocks from a leader schedule +//! - inflation rewards +//! - JITO rewards per epoch +//! +//! The rewards from all sources for an epoch are summed and associated with a validator_id +use anyhow::Result; +use borsh::{BorshDeserialize, BorshSerialize}; +use serde::Deserialize; + +use crate::{block, inflation, jito, solana_debt_calculator::ValidatorRewards}; + +#[derive(Deserialize, Debug, BorshDeserialize, BorshSerialize)] +pub struct EpochRewards { + pub epoch: u64, + pub rewards: Vec, +} + +#[derive(Deserialize, Debug, BorshDeserialize, BorshSerialize)] +pub struct Reward { + pub epoch: u64, + pub validator_id: String, + pub total: u64, + pub block_priority: u64, + pub jito: u64, + pub inflation: u64, + pub block_base: u64, +} + +// this function will return a hashmap of total rewards keyed by validator pubkey +pub async fn get_total_rewards( + solana_debt_calculator: &impl ValidatorRewards, + validator_ids: &[String], + epoch: u64, +) -> Result { + let mut validator_rewards: Vec = Vec::with_capacity(validator_ids.len()); + + let (inflation_rewards, jito_rewards, block_rewards) = tokio::join!( + inflation::get_inflation_rewards(solana_debt_calculator, validator_ids, epoch,), + jito::get_jito_rewards(solana_debt_calculator, validator_ids, epoch), + block::get_block_rewards(solana_debt_calculator, validator_ids, epoch,) + ); + + let inflation_rewards = inflation_rewards?; + let jito_rewards = jito_rewards?; + + let block_rewards = block_rewards?; + + for validator_id in validator_ids { + let mut total_reward: u64 = 0; + let jito_reward = jito_rewards + .get(validator_id.as_str()) + .cloned() + .unwrap_or_default(); + let inflation_reward = inflation_rewards + .get(validator_id) + .cloned() + .unwrap_or_default(); + let block_reward = block_rewards.get(validator_id).cloned().unwrap_or_default(); + + total_reward += inflation_reward + block_reward.0 + block_reward.1 + jito_reward; + let rewards = Reward { + validator_id: validator_id.to_string(), + jito: jito_reward, + inflation: inflation_reward, + total: total_reward, + block_priority: block_reward.1, + block_base: block_reward.0, + epoch, + }; + validator_rewards.push(rewards); + } + + let rewards = EpochRewards { + epoch, + rewards: validator_rewards, + }; + Ok(rewards) +} + +#[cfg(test)] +mod tests { + use std::collections::HashMap; + + use solana_client::rpc_response::{ + RpcInflationReward, RpcVoteAccountInfo, RpcVoteAccountStatus, + }; + use solana_reward_info::RewardType::Fee; + use solana_sdk::epoch_info::EpochInfo; + use solana_transaction_status_client_types::UiConfirmedBlock; + + use super::*; + use crate::{ + jito::{JitoReward, JitoRewards}, + solana_debt_calculator::MockValidatorRewards, + }; + + #[tokio::test] + async fn test_get_total_rewards() { + // Set up test variables and mock data. + let validator_id = "6WgdYhhGE53WrZ7ywJA15hBVkw7CRbQ8yDBBTwmBtAHN"; + let validator_ids: &[String] = &[String::from(validator_id)]; + let epoch = 823; + let block_reward: u64 = 40000; + let inflation_reward = 5500; + let jito_reward = 10000; + + let mut mock_solana_debt_calculator = MockValidatorRewards::new(); + + // Set up mock expectations for the ValidatorRewards trait. + // These mocks simulate the behavior of external dependencies. + let mock_rpc_vote_account_status = RpcVoteAccountStatus { + current: vec![RpcVoteAccountInfo { + vote_pubkey: "6WgdYhhGE53WrZ7ywJA15hBVkw7CRbQ8yDBBTwmBtABB".to_string(), + node_pubkey: validator_id.to_string(), + activated_stake: 4_200_000_000_000, + epoch_vote_account: true, + epoch_credits: vec![(812, 256, 128), (811, 128, 64)], + commission: 10, + last_vote: 123456789, + root_slot: 123456700, + }], + delinquent: vec![], + }; + + mock_solana_debt_calculator + .expect_get_vote_accounts_with_config() + .withf(move || true) + .times(1) + .returning(move || Ok(mock_rpc_vote_account_status.clone())); + + let mock_rpc_inflation_reward = vec![Some(RpcInflationReward { + epoch, + effective_slot: 123456789, + amount: inflation_reward, + post_balance: 1_500_002_500, + commission: Some(1), + })]; + + mock_solana_debt_calculator + .expect_get_inflation_reward() + .times(1) + .returning(move |_, _| Ok(mock_rpc_inflation_reward.clone())); + + let slot_index: usize = 10; + + let mut leader_schedule = HashMap::new(); + leader_schedule.insert(validator_id.to_string(), vec![slot_index]); + + mock_solana_debt_calculator + .expect_get_leader_schedule() + .times(1) + .returning(move |_| Ok(leader_schedule.clone())); + + let mock_block = UiConfirmedBlock { + num_reward_partitions: Some(1), + signatures: Some(vec!["One".to_string()]), + rewards: Some(vec![solana_transaction_status_client_types::Reward { + pubkey: validator_id.to_string(), + lamports: block_reward as i64, + post_balance: block_reward, + reward_type: Some(Fee), + commission: None, + }]), + previous_blockhash: "".to_string(), + blockhash: "".to_string(), + parent_slot: 0, + transactions: None, + block_time: None, + block_height: None, + }; + + let mock_epoch_info = EpochInfo { + epoch: 824, + slot_index: 100000, + absolute_slot: 10000000, + block_height: 103030003, + slots_in_epoch: 5000000, + transaction_count: Some(1000), + }; + + mock_solana_debt_calculator + .expect_get_epoch_info() + .times(1) + .returning(move || Ok(mock_epoch_info.clone())); + + mock_solana_debt_calculator + .expect_get_block_with_config() + .times(1) + .returning(move |_| Ok(mock_block.clone())); + + mock_solana_debt_calculator + .expect_get::() + .withf(move |url| url.contains(&format!("epoch={epoch}"))) + .times(1) + .returning(move |_| { + Ok(JitoRewards { + total_count: 1000, + rewards: vec![JitoReward { + vote_account: validator_id.to_string(), + mev_revenue: jito_reward, + }], + }) + }); + + // Call the function under test with the prepared data and mocks. + let rewards = get_total_rewards(&mock_solana_debt_calculator, validator_ids, epoch) + .await + .unwrap(); + + // Verify that the function produced the correct results. + let reward = rewards + .rewards + .iter() + .find(|&reward| reward.validator_id == validator_id) + .unwrap(); + + assert_eq!(reward.epoch, epoch); + assert_eq!(reward.block_base + reward.block_priority, block_reward); + assert_eq!(reward.inflation, inflation_reward); + assert_eq!(reward.jito, jito_reward); + assert_eq!( + reward.total, + reward.block_base + reward.inflation + reward.jito + reward.block_priority + ); + assert_eq!(reward.block_priority + reward.block_base, block_reward); + } +} diff --git a/offchain/crates/validator-debt/src/rpc.rs b/offchain/crates/validator-debt/src/rpc.rs new file mode 100644 index 0000000000..f8ccd6c769 --- /dev/null +++ b/offchain/crates/validator-debt/src/rpc.rs @@ -0,0 +1,375 @@ +use anyhow::{Error, Result, bail, ensure}; +use clap::Args; +use doublezero_solana_client_tools::{ + account::{record::BorshRecordAccountData, zero_copy::ZeroCopyAccountOwnedData}, + rpc::{DoubleZeroLedgerConnection, SolanaConnection}, +}; +use doublezero_solana_sdk::{ + NetworkEnvironment, Pubkey, + revenue_distribution::{ + GENESIS_DZ_EPOCH_MAINNET_BETA, fetch::try_fetch_config, state::Distribution, + types::DoubleZeroEpoch, + }, +}; +use leaky_bucket::RateLimiter; +use solana_client::{ + client_error::ClientErrorKind, + nonblocking::rpc_client::RpcClient, + rpc_config::{RpcBlockConfig, RpcGetVoteAccountsConfig}, + rpc_custom_error::{ + JSON_RPC_SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED, JSON_RPC_SERVER_ERROR_SLOT_SKIPPED, + }, + rpc_request::RpcError, +}; +use solana_commitment_config::CommitmentConfig; +use solana_transaction_status_client_types::{TransactionDetails, UiTransactionEncoding}; +use url::Url; + +use crate::{ + solana_debt_calculator::SolanaDebtCalculator, validator_debt::ComputedSolanaValidatorDebts, +}; + +#[derive(Debug, Args)] +pub struct SolanaValidatorDebtConnectionOptions { + /// URL for DoubleZero Ledger's JSON RPC. Required. + #[arg(long)] + pub dz_ledger_url: String, + + /// URL for Solana's JSON RPC or moniker (or their first letter): + /// [mainnet-beta, testnet, localhost]. + #[arg(long = "url", short = 'u')] + pub solana_url_or_moniker: Option, +} + +impl TryFrom for SolanaDebtCalculator { + type Error = Error; + + fn try_from(opts: SolanaValidatorDebtConnectionOptions) -> Result { + let SolanaValidatorDebtConnectionOptions { + solana_url_or_moniker, + dz_ledger_url, + } = opts; + + let ledger_rpc_client = Url::parse(&dz_ledger_url).map(|url| { + DoubleZeroLedgerConnection::new_with_commitment( + url.into(), + CommitmentConfig::confirmed(), + ) + })?; + + let solana_url_or_moniker = solana_url_or_moniker.as_deref().unwrap_or("m"); + let solana_url = Url::parse(normalize_to_url_if_moniker(solana_url_or_moniker))?; + + let solana_rpc_client = + RpcClient::new_with_commitment(solana_url.into(), CommitmentConfig::confirmed()); + + let rpc_block_config = RpcBlockConfig { + encoding: Some(UiTransactionEncoding::Base58), + transaction_details: Some(TransactionDetails::Signatures), + rewards: Some(true), + commitment: None, + max_supported_transaction_version: Some(0), + }; + + let vote_accounts_config = RpcGetVoteAccountsConfig { + vote_pubkey: None, + commitment: CommitmentConfig::confirmed().into(), + keep_unstaked_delinquents: None, + delinquent_slot_distance: None, + }; + + Ok(SolanaDebtCalculator { + ledger_rpc_client, + solana_rpc_client, + vote_accounts_config, + rpc_block_config, + }) + } +} + +// Forked from solana-clap-utils. +pub fn normalize_to_url_if_moniker(url_or_moniker: &str) -> &str { + match url_or_moniker { + "m" | "mainnet-beta" => "https://api.mainnet-beta.solana.com", + "t" | "testnet" => "https://api.testnet.solana.com", + "l" | "localhost" => "http://localhost:8899", + url => url, + } +} + +pub enum JoinedSolanaEpochs { + Range(std::ops::RangeInclusive), + Duplicate(u64), +} + +impl JoinedSolanaEpochs { + /// Estimates block time for a skipped slot by searching forward for a + /// non-skipped slot. + async fn estimate_block_time_for_skipped_slot( + solana_client: &RpcClient, + rate_limiter: &RateLimiter, + slot: u64, + current_epoch: u64, + ) -> Result { + const SLOTS_TO_SKIP: u32 = 10; + const ESTIMATED_SKIP_TIME: i64 = 4; + const MAX_SLOTS_TO_SEARCH: u32 = 432_000; + + tracing::warn!( + "Block time for slot {} in epoch {} not found. Estimating block time", + slot, + current_epoch, + ); + + // Start at SLOTS_TO_SKIP since we already know slot 0 failed. + let mut slots_count = SLOTS_TO_SKIP; + + // Traverse forward from the current slot until we find a block time + // that is not skipped. + while slots_count < MAX_SLOTS_TO_SEARCH { + rate_limiter.acquire_one().await; + + let search_slot = slot + u64::from(slots_count); + + match solana_client.get_block_time(search_slot).await { + Ok(block_time) => { + // Estimate the original slot's block time by subtracting + // estimated time. + return Ok(block_time + - ESTIMATED_SKIP_TIME * i64::from(slots_count) / i64::from(SLOTS_TO_SKIP)); + } + _ => { + tracing::warn!( + "Block time for slot {} in epoch {} not found. Continuing search...", + search_slot, + current_epoch, + ); + } + } + + slots_count += SLOTS_TO_SKIP; + } + + bail!( + "Cannot estimate block time for slot {} in epoch {} after searching {} slots", + slot, + current_epoch, + MAX_SLOTS_TO_SEARCH + ) + } + + /// Gets block time for a slot, with fallback to estimation if the slot was + /// skipped. + async fn get_block_time_with_estimation( + solana_client: &RpcClient, + rate_limiter: &RateLimiter, + slot: u64, + current_epoch: u64, + ) -> Result { + rate_limiter.acquire_one().await; + + match solana_client.get_block_time(slot).await { + Ok(block_time) => Ok(block_time), + Err(e) => { + let slot_skipped = matches!( + e.kind(), + ClientErrorKind::RpcError(RpcError::RpcResponseError { + code: JSON_RPC_SERVER_ERROR_SLOT_SKIPPED + | JSON_RPC_SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED, + .. + }) + ); + if !slot_skipped { + bail!(e); + } + Self::estimate_block_time_for_skipped_slot( + solana_client, + rate_limiter, + slot, + current_epoch, + ) + .await + } + } + } + + // A second chain-verified epoch search lives in the contributor-rewards crate + // (`ingestor::epoch::EpochFinder::find_epoch_at_timestamp`). That one steps + // from an estimated seed slot and threads no rate limiter, so the two are not + // yet worth unifying. A fix to the skipped-slot or boundary handling here + // probably belongs there too. + async fn find_solana_epoch_before_timestamp( + solana_client: &RpcClient, + rate_limiter: &RateLimiter, + initial_solana_epoch: u64, + initial_last_slot_of_epoch: u64, + slots_per_epoch: u64, + target_timestamp: i64, + ) -> Result { + let mut current_epoch = initial_solana_epoch; + let mut current_last_slot = initial_last_slot_of_epoch; + + // This loop will always terminate. + loop { + let last_slot_block_time = Self::get_block_time_with_estimation( + solana_client, + rate_limiter, + current_last_slot, + current_epoch, + ) + .await?; + + if last_slot_block_time < target_timestamp { + return Ok(current_epoch); + } + + current_epoch -= 1; + current_last_slot -= slots_per_epoch; + } + } + + pub async fn try_new( + solana_client: &RpcClient, + dz_ledger_client: &RpcClient, + target_dz_epoch: u64, + rate_limiter: &RateLimiter, + ) -> Result { + let current_dz_epoch_info = dz_ledger_client.get_epoch_info().await?; + ensure!( + target_dz_epoch < current_dz_epoch_info.epoch, + "DZ epoch {target_dz_epoch} is not less than the current DZ epoch {}", + current_dz_epoch_info.epoch + ); + + let dz_epoch_diff = current_dz_epoch_info.epoch - target_dz_epoch; + + let last_slot_of_current_dz_epoch = current_dz_epoch_info.absolute_slot + - current_dz_epoch_info.slot_index + + current_dz_epoch_info.slots_in_epoch + - 1; + + let last_slot_of_target_dz_epoch = + last_slot_of_current_dz_epoch - (current_dz_epoch_info.slots_in_epoch * dz_epoch_diff); + + let last_dz_block_time = dz_ledger_client + .get_block_time(last_slot_of_target_dz_epoch) + .await?; + + let current_solana_epoch_info = solana_client.get_epoch_info().await?; + + let initial_solana_epoch = current_solana_epoch_info.epoch - 1; + let initial_last_slot_of_solana_epoch = + current_solana_epoch_info.absolute_slot - current_solana_epoch_info.slot_index - 1; + + // Find the last Solana epoch that ends before the target DZ epoch ends. + let last_solana_epoch = Self::find_solana_epoch_before_timestamp( + solana_client, + rate_limiter, + initial_solana_epoch, + initial_last_slot_of_solana_epoch, + current_solana_epoch_info.slots_in_epoch, + last_dz_block_time, + ) + .await?; + + let last_slot_of_previous_dz_epoch = + last_slot_of_target_dz_epoch - current_dz_epoch_info.slots_in_epoch; + + let previous_dz_block_time = dz_ledger_client + .get_block_time(last_slot_of_previous_dz_epoch) + .await?; + + // Calculate the last slot for the last Solana epoch we found. + let last_slot_of_last_solana_epoch = initial_last_slot_of_solana_epoch + - (initial_solana_epoch - last_solana_epoch) * current_solana_epoch_info.slots_in_epoch; + + // Find the Solana epoch that ends before the previous DZ epoch ends. + let solana_epoch_before_previous = Self::find_solana_epoch_before_timestamp( + solana_client, + rate_limiter, + last_solana_epoch, + last_slot_of_last_solana_epoch, + current_solana_epoch_info.slots_in_epoch, + previous_dz_block_time, + ) + .await?; + + // This epoch could be the same as the last solana epoch, which means + // the last DZ epoch that determined Solana epochs already accounted for + // the last Solana epoch. + if solana_epoch_before_previous == last_solana_epoch { + Ok(Self::Duplicate(last_solana_epoch)) + } else { + let first_solana_epoch = solana_epoch_before_previous + 1; + + Ok(Self::Range(first_solana_epoch..=last_solana_epoch)) + } + } +} + +pub async fn try_fetch_debt_records_and_distributions( + solana_connection: &SolanaConnection, + dz_env_override: Option, + accountant_key: Option<&Pubkey>, +) -> Result< + Vec<( + BorshRecordAccountData, + ZeroCopyAccountOwnedData, + )>, +> { + let (_, config) = try_fetch_config(solana_connection).await?; + let last_dz_epoch = config + .last_completed_epoch() + .unwrap_or(DoubleZeroEpoch::new(GENESIS_DZ_EPOCH_MAINNET_BETA)) + .value(); + + // Limit to either the last 100 epochs or the default (first) epoch. + let since_dz_epoch = last_dz_epoch + .saturating_sub(100) + .max(GENESIS_DZ_EPOCH_MAINNET_BETA); + + let distribution_keys = (since_dz_epoch..=last_dz_epoch) + .map(|dz_epoch| Distribution::find_address(DoubleZeroEpoch::new(dz_epoch)).0) + .collect::>(); + + let distributions = solana_connection + .try_fetch_multiple_zero_copy_data::(&distribution_keys) + .await? + .into_iter() + .flatten() + .filter(|distribution| { + distribution.solana_validator_debt_merkle_root != Default::default() + && distribution.is_debt_calculation_finalized() + }) + .collect::>(); + + let network_env = solana_connection.try_network_environment().await?; + let dz_env = dz_env_override.unwrap_or(network_env); + let dz_connection = DoubleZeroLedgerConnection::from(dz_env); + + let debt_record_keys = distributions + .iter() + .map(|distribution| { + crate::ledger::debt_record_key( + accountant_key.unwrap_or(&config.debt_accountant_key), + distribution.dz_epoch.value(), + ) + }) + .collect::>(); + + let debt_records = dz_connection + .try_fetch_multiple_accounts(&debt_record_keys) + .await? + .iter() + .flatten() + .filter_map(BorshRecordAccountData::::from_account) + .collect::>(); + ensure!( + debt_records.len() == distributions.len(), + "Expected {} debt records, but got {}", + distributions.len(), + debt_records.len() + ); + + Ok(debt_records.into_iter().zip(distributions).collect()) +} diff --git a/offchain/crates/validator-debt/src/s3_fetcher.rs b/offchain/crates/validator-debt/src/s3_fetcher.rs new file mode 100644 index 0000000000..71c0126f83 --- /dev/null +++ b/offchain/crates/validator-debt/src/s3_fetcher.rs @@ -0,0 +1,778 @@ +//! S3 Validator Pubkeys Fetcher +//! +//! This module fetches validator public keys from the S3 metrics bucket by: +//! 1. Downloading hourly Parquet snapshots for a given Solana epoch +//! 2. Merging gossip, validators, users, and devices datasets +//! 3. Applying the 12-hour connection rule (validators must appear in >12 hourly snapshots) +//! 4. Returning the list of qualifying validator public keys +//! +//! This replicates the canonical Python script approach for identifying validators +//! eligible for fees, replacing the point-in-time access pass approach. +//! +//! ## Environment Variables +//! +//! Required: +//! - `VALIDATOR_DEBT_AWS_ACCESS_KEY_ID`: AWS access key ID for S3 access +//! - `VALIDATOR_DEBT_AWS_SECRET_ACCESS_KEY`: AWS secret access key for S3 access +//! +//! Optional: +//! - `VALIDATOR_DEBT_S3_BUCKET`: S3 bucket name (default: "malbeclabs-data-metrics-dev") +//! - `VALIDATOR_DEBT_AWS_REGION`: AWS region (default: "us-east-1") +//! - `VALIDATOR_DEBT_S3_MAX_CONSECUTIVE_FAILURES`: Max consecutive failures before stopping (default: 12) +//! - `VALIDATOR_DEBT_S3_ENDPOINT`: Custom S3 endpoint for S3-compatible services (optional) + +use std::{ + collections::{HashMap, HashSet}, + env, + fs::File as StdFile, + sync::Arc, +}; + +use anyhow::{Context, Result}; +use arrow::{ + array::{Array, AsArray, BooleanArray, RecordBatch, StringArray}, + datatypes::DataType, +}; +use aws_config::BehaviorVersion; +use aws_sdk_s3::{ + Client as S3Client, + config::{Credentials, Region}, +}; +use chrono::{DateTime, Duration, Timelike, Utc}; +use parquet::arrow::arrow_reader::ParquetRecordBatchReaderBuilder; +use serde::Serialize; +use solana_client::nonblocking::rpc_client::RpcClient; +use tempfile::NamedTempFile; +use tokio::{fs::File, io::AsyncWriteExt, sync::Semaphore, task::JoinSet}; +use tracing::{debug, info, warn}; + +/// Maximum number of concurrent S3 downloads +const MAX_CONCURRENT_DOWNLOADS: usize = 10; + +/// Vote account key -> Number of hours recorded +type VoteAccountHours = HashMap; + +/// Vote account key -> Set of validator pubkeys +type VoteAccountIdentities = HashMap>; + +/// Validator identity pubkey with associated vote account +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize)] +pub struct ValidatorKey { + /// The validator's identity pubkey (NodeID) + pub pubkey: String, + /// The validator's vote account pubkey (stable identifier) + pub vote_account_pubkey: String, + /// Number of identity pubkeys used by this vote account (>1 indicates rotation) + pub identity_count: usize, +} + +impl ValidatorKey { + pub fn new(pubkey: String, vote_account_pubkey: String, identity_count: usize) -> Self { + Self { + pubkey, + vote_account_pubkey, + identity_count, + } + } +} + +/// Network type for dataset selection +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Network { + MainnetBeta, + Testnet, +} + +impl Network { + fn prefix(&self) -> &'static str { + match self { + Network::MainnetBeta => "mainnet-beta", + Network::Testnet => "testnet", + } + } +} + +/// S3 configuration +#[derive(Clone)] +struct S3Config { + client: S3Client, + bucket: String, + max_consecutive_failures: usize, +} + +impl S3Config { + async fn new() -> Result { + let bucket = env::var("VALIDATOR_DEBT_S3_BUCKET") + .unwrap_or_else(|_| "malbeclabs-data-metrics-dev".to_string()); + + let max_consecutive_failures = env::var("VALIDATOR_DEBT_S3_MAX_CONSECUTIVE_FAILURES") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(12); + + // Load AWS credentials from environment variables + let access_key_id = env::var("VALIDATOR_DEBT_AWS_ACCESS_KEY_ID") + .context("VALIDATOR_DEBT_AWS_ACCESS_KEY_ID environment variable not set")?; + + let secret_access_key = env::var("VALIDATOR_DEBT_AWS_SECRET_ACCESS_KEY") + .context("VALIDATOR_DEBT_AWS_SECRET_ACCESS_KEY environment variable not set")?; + + let region = + env::var("VALIDATOR_DEBT_AWS_REGION").unwrap_or_else(|_| "us-east-1".to_string()); + + // Create credentials + let credentials = Credentials::new( + access_key_id, + secret_access_key, + None, + None, + "validator-debt-s3-fetcher", + ); + + // Build S3 config with explicit credentials + let mut config_builder = aws_sdk_s3::Config::builder() + .region(Region::new(region.clone())) + .behavior_version(BehaviorVersion::latest()) + .credentials_provider(credentials); + + // Support custom endpoint (for MinIO or other S3-compatible services) + if let Ok(endpoint) = env::var("VALIDATOR_DEBT_S3_ENDPOINT") { + info!("Using custom S3 endpoint: {}", endpoint); + config_builder = config_builder.endpoint_url(endpoint).force_path_style(true); + } + + let config = config_builder.build(); + let client = S3Client::from_conf(config); + + info!( + "S3 client initialized: bucket={}, region={}, max_consecutive_failures={}", + bucket, region, max_consecutive_failures + ); + + Ok(Self { + client, + bucket, + max_consecutive_failures, + }) + } +} + +/// Fetches validator public keys for a given Solana epoch from S3 metrics bucket +/// +/// This function replicates the canonical Python script approach: +/// 1. Converts epoch to timestamp range +/// 2. Downloads hourly Parquet files from S3 +/// 3. Merges datasets and applies filters +/// 4. Applies 12-hour connection rule +/// 5. Returns validator keys +pub async fn fetch_validator_pubkeys( + solana_epoch: u64, + rpc_client: &RpcClient, + network: Network, +) -> Result> { + info!( + "Fetching validator pubkeys for Solana epoch {} ({:?})", + solana_epoch, network + ); + + let s3_config = S3Config::new().await?; + + // Convert epoch to timestamp range + let (start_time, end_time) = epoch_to_timestamps(rpc_client, solana_epoch).await?; + info!( + "Epoch {} time range: {} to {}", + solana_epoch, start_time, end_time + ); + + // Generate hourly timestamps + let hourly_timestamps = generate_hourly_timestamps(start_time, end_time); + info!( + "Processing {} hourly snapshots for epoch {}", + hourly_timestamps.len(), + solana_epoch + ); + + // Fetch and process hourly data in parallel + let sem = Arc::new(Semaphore::new(MAX_CONCURRENT_DOWNLOADS)); + let mut tasks = JoinSet::new(); + + // Spawn tasks for all hourly snapshots + for timestamp in hourly_timestamps { + let s3_config_clone = s3_config.clone(); + let sem_clone = sem.clone(); + + tasks.spawn(async move { + // Acquire permit to limit concurrent downloads + let _permit = sem_clone.acquire().await.unwrap(); + + let result = process_hourly_data(&s3_config_clone, timestamp, network).await; + + (timestamp, result) + }); + } + + let leader_scheduling_epoch = solana_epoch.saturating_sub(2); + + // Convert epoch to timestamp range two epochs ago. + let (start_time, end_time) = epoch_to_timestamps(rpc_client, leader_scheduling_epoch).await?; + info!( + "Leader scheduling epoch {} time range: {} to {}", + leader_scheduling_epoch, start_time, end_time + ); + + // Generate hourly timestamps + let hourly_timestamps = generate_hourly_timestamps(start_time, end_time); + info!( + "Processing {} hourly snapshots for epoch {}", + hourly_timestamps.len(), + solana_epoch + ); + + let mut two_epochs_ago_tasks = JoinSet::new(); + + // Spawn tasks for all hourly snapshots + for timestamp in hourly_timestamps { + let s3_config_clone = s3_config.clone(); + let sem_clone = sem.clone(); + + two_epochs_ago_tasks.spawn(async move { + // Acquire permit to limit concurrent downloads + let _ = sem_clone.acquire().await.unwrap(); + + let result = download_and_parse_parquet( + &s3_config_clone, + &format!("snapshot-solana-{}-validators", network.prefix()), + timestamp, + ) + .await; + + (timestamp, result) + }); + } + + // This is a bloody hack to get the identities of validators that had active + // stake two epochs ago. We should clean this up later. + let mut two_epochs_ago_vote_key_identities = HashMap::new(); + + // Collect results as they complete + // Count hours by vote_account_pubkey (not identity_pubkey) to prevent rotation + let mut vote_account_hours = VoteAccountHours::new(); + // Track all identity_pubkeys associated with each vote_account_pubkey + let mut vote_account_identities = VoteAccountIdentities::new(); + + let mut processed_count = 0; + let mut failed_count = 0; + let total_hours = two_epochs_ago_tasks.len(); + + while let Some(task_result) = two_epochs_ago_tasks.join_next().await { + match task_result { + Ok((timestamp, Ok(batches))) => { + processed_count += 1; + + let vote_key_identities = build_lut(&batches, "identity_pubkey")? + .into_iter() + .map(|(k, mut v)| (v.remove("vote_account_pubkey").unwrap(), k)) + .collect::>(); + + for (vote_key, identity) in vote_key_identities { + two_epochs_ago_vote_key_identities + .entry(vote_key) + .or_insert(HashSet::new()) + .insert(identity); + } + + info!( + "Processed vote key identities for two epochs ago hour {} [{}/{}]", + timestamp.format("%Y-%m-%d %H:00"), + processed_count + failed_count, + total_hours, + ); + } + Ok((timestamp, Err(e))) => { + failed_count += 1; + warn!( + "Failed to process hour {} [{}/{}]: {}", + timestamp.format("%Y-%m-%d %H:00"), + processed_count + failed_count, + total_hours, + e + ); + } + Err(e) => { + failed_count += 1; + warn!("Task join error: {}", e); + } + } + } + + let mut processed_count = 0; + let mut failed_count = 0; + let total_hours = tasks.len(); + + while let Some(task_result) = tasks.join_next().await { + match task_result { + Ok((timestamp, Ok(validators))) => { + processed_count += 1; + let count = validators.len(); + + // Count appearances by vote_account_pubkey and track all identities + for validator in validators { + *vote_account_hours + .entry(validator.vote_account_pubkey.clone()) + .or_insert(0) += 1; + + let relevant_identities = two_epochs_ago_vote_key_identities + .get(&validator.vote_account_pubkey) + .cloned() + .unwrap_or_default(); + + vote_account_identities + .entry(validator.vote_account_pubkey) + .or_default() + .extend(relevant_identities); + } + + info!( + "Hour {} [{}/{}]: Found {} validators (total unique vote accounts: {})", + timestamp.format("%Y-%m-%d %H:00"), + processed_count, + total_hours, + count, + vote_account_hours.len() + ); + } + Ok((timestamp, Err(e))) => { + failed_count += 1; + warn!( + "Failed to process hour {} [{}/{}]: {}", + timestamp.format("%Y-%m-%d %H:00"), + processed_count + failed_count, + total_hours, + e + ); + } + Err(e) => { + failed_count += 1; + warn!("Task join error: {}", e); + } + } + } + + if failed_count > 0 { + warn!( + "Completed with {} successful and {} failed hours", + processed_count, failed_count + ); + + // Check if we exceeded the failure threshold + if failed_count >= s3_config.max_consecutive_failures { + warn!( + "Failed hour count ({}) exceeded threshold ({})", + failed_count, s3_config.max_consecutive_failures + ); + } + } + + // Apply 12-hour connection rule by vote_account_pubkey + // When a vote_account qualifies, return ALL associated identity_pubkeys + let mut qualified_validators = Vec::new(); + let mut qualified_vote_accounts = 0; + + for (vote_account, hours) in vote_account_hours { + if hours > 12 { + qualified_vote_accounts += 1; + // Get all identity_pubkeys for this qualifying vote_account + if let Some(identities) = vote_account_identities.remove(&vote_account) { + let identity_count = identities.len(); + for identity in identities { + qualified_validators.push(ValidatorKey::new( + identity, + vote_account.clone(), + identity_count, + )); + } + } + } + } + + qualified_validators.sort_by(|a, b| a.vote_account_pubkey.cmp(&b.vote_account_pubkey)); + + info!( + "Applied 12-hour rule: {} vote accounts qualified, {} identity pubkeys returned", + qualified_vote_accounts, + qualified_validators.len() + ); + + Ok(qualified_validators) +} + +/// Converts Solana epoch number to start and end timestamps +async fn epoch_to_timestamps( + rpc_client: &RpcClient, + epoch: u64, +) -> Result<(DateTime, DateTime)> { + // Calculate the first slot of the target epoch + // Solana epochs have 432,000 slots each + const SLOTS_PER_EPOCH: u64 = 432_000; + let epoch_start_slot = epoch * SLOTS_PER_EPOCH; + let epoch_end_slot = epoch_start_slot + SLOTS_PER_EPOCH - 1; + + // Get block time for first slot of epoch + let start_timestamp = rpc_client + .get_block_time(epoch_start_slot) + .await + .context("Failed to get block time for epoch start")?; + + // Get block time for last slot of epoch + let end_timestamp = rpc_client + .get_block_time(epoch_end_slot) + .await + .context("Failed to get block time for epoch end")?; + + let start_time = + DateTime::from_timestamp(start_timestamp, 0).context("Invalid start timestamp")?; + let end_time = DateTime::from_timestamp(end_timestamp, 0).context("Invalid end timestamp")?; + + Ok((start_time, end_time)) +} + +/// Generates list of hourly timestamps matching the R script filter logic +fn generate_hourly_timestamps(start: DateTime, end: DateTime) -> Vec> { + let mut timestamps = Vec::new(); + + // Start from the first hour that is >= start time + // If start is 03:27, the first valid hour is 04:00 (since 03:00 < 03:27) + let start_hour = start + .date_naive() + .and_hms_opt(start.hour(), 0, 0) + .unwrap() + .and_utc(); + + let mut current = if start_hour >= start { + // If start is exactly on the hour (unlikely), include it + start_hour + } else { + // Otherwise, start from the next hour + start_hour + Duration::hours(1) + }; + + // Include all hours up to and including the hour containing end time + // If end is 03:29, we include 03:00 (since 03:00 <= 03:29) + while current <= end { + timestamps.push(current); + current += Duration::hours(1); + } + + timestamps +} + +/// Processes data for a single hour: downloads Parquet files, merges, filters +async fn process_hourly_data( + s3_config: &S3Config, + timestamp: DateTime, + network: Network, +) -> Result> { + // Download Parquet files for this hour + let gossip_batches = download_and_parse_parquet( + s3_config, + &format!("snapshot-solana-{}-gossip", network.prefix()), + timestamp, + ) + .await?; + + let validators_batches = download_and_parse_parquet( + s3_config, + &format!("snapshot-solana-{}-validators", network.prefix()), + timestamp, + ) + .await?; + + let users_batches = download_and_parse_parquet( + s3_config, + &format!("snapshot-doublezero-{}-device-users", network.prefix()), + timestamp, + ) + .await?; + + let devices_batches = download_and_parse_parquet( + s3_config, + &format!("snapshot-doublezero-{}-devices", network.prefix()), + timestamp, + ) + .await?; + + // Merge datasets + let merged = merge_hourly_datasets( + gossip_batches, + validators_batches, + users_batches, + devices_batches, + )?; + + // Extract validator identities (with vote account) + extract_validator_identities(merged) +} + +/// Downloads a Parquet file from S3 and parses it with Arrow +async fn download_and_parse_parquet( + s3_config: &S3Config, + prefix: &str, + timestamp: DateTime, +) -> Result> { + let key = build_s3_key(prefix, timestamp); + debug!("Downloading s3://{}/{}", s3_config.bucket, key); + + // Download to temporary file + let temp_file = NamedTempFile::new().context("Failed to create temporary file")?; + let temp_path = temp_file.path().to_path_buf(); + + let response = s3_config + .client + .get_object() + .bucket(&s3_config.bucket) + .key(&key) + .send() + .await + .context(format!("Failed to download S3 object: {}", key))?; + + // Write to temp file + let mut file = File::create(&temp_path).await?; + let body = response.body.collect().await?; + file.write_all(&body.into_bytes()).await?; + file.flush().await?; + // Close file before reading + drop(file); + + // Parse Parquet with Arrow + let file = StdFile::open(&temp_path)?; + let builder = ParquetRecordBatchReaderBuilder::try_new(file) + .context(format!("Failed to create Parquet reader for: {}", key))?; + + let reader = builder.build()?; + let mut batches = Vec::new(); + let mut total_rows = 0; + + for batch_result in reader { + let batch = batch_result.context(format!("Failed to read batch from: {}", key))?; + total_rows += batch.num_rows(); + batches.push(batch); + } + + debug!( + "Parsed {}: {} rows, {} batches", + key, + total_rows, + batches.len() + ); + + Ok(batches) +} + +/// Builds S3 key for a Parquet file +/// Format: datasets/{prefix}/date={YYYY-MM-DD}/hour={HH}/part-00000.parquet +fn build_s3_key(prefix: &str, timestamp: DateTime) -> String { + format!( + "datasets/{}/date={}/hour={:02}/part-00000.parquet", + prefix, + timestamp.format("%Y-%m-%d"), + timestamp.hour() + ) +} + +/// Merges hourly datasets (gossip + validators + users + devices) using manual joins +fn merge_hourly_datasets( + gossip_batches: Vec, + validators_batches: Vec, + users_batches: Vec, + devices_batches: Vec, +) -> Result> { + // Build HashMaps for each dataset + let gossip_map = build_lut(&gossip_batches, "identity_pubkey")?; + let validators_map = build_lut(&validators_batches, "identity_pubkey")?; + let users_map = build_lut(&users_batches, "client_ip")?; + let devices_map = build_lut(&devices_batches, "pubkey")?; + + debug!( + "Built indexes: gossip={}, validators={}, users={}, devices={}", + gossip_map.len(), + validators_map.len(), + users_map.len(), + devices_map.len() + ); + + // Perform manual joins + // Store (identity_pubkey, vote_account_pubkey) pairs + let mut identity_results: Vec = Vec::new(); + let mut vote_account_results: Vec = Vec::new(); + + for (identity_pubkey, gossip_row) in &gossip_map { + // Join with validators on identity_pubkey + if let Some(validator_row) = validators_map.get(identity_pubkey) { + // Filter out delinquent validators (matches R script: connection[!(delinquent)]) + // The gather_data.py script includes delinquent column in output, + // but the fee_per_epoch.R script filters it out at line 26 + if let Some(delinquent_str) = validator_row.get("delinquent") + && (delinquent_str == "true" || delinquent_str == "True" || delinquent_str == "1") + { + // Skip delinquent validators + continue; + } + + // Extract vote_account_pubkey from validator row + let vote_account_pubkey = match validator_row.get("vote_account_pubkey") { + Some(v) => v.clone(), + None => { + // Skip validators without vote_account_pubkey (should not happen) + warn!( + "Validator {} missing vote_account_pubkey, skipping", + identity_pubkey + ); + continue; + } + }; + + // Join with users on ip_address -> client_ip + if let Some(ip_address) = get_string_field(gossip_row, "ip_address") + && let Some(user_row) = users_map.get(ip_address) + { + // Join with devices on device_pubkey -> pubkey + if let Some(device_pubkey) = get_string_field(user_row, "device_pubkey") + && devices_map.contains_key(device_pubkey) + { + // All joins succeeded, keep both identity and vote account + identity_results.push(identity_pubkey.clone()); + vote_account_results.push(vote_account_pubkey); + } + } + } + } + + debug!( + "After merging and filtering: {} validators", + identity_results.len() + ); + + // Convert results to RecordBatch format with both columns + let identity_array = Arc::new(StringArray::from(identity_results)); + let vote_account_array = Arc::new(StringArray::from(vote_account_results)); + let schema = Arc::new(arrow::datatypes::Schema::new(vec![ + arrow::datatypes::Field::new("identity_pubkey", DataType::Utf8, false), + arrow::datatypes::Field::new("vote_account_pubkey", DataType::Utf8, false), + ])); + + let batch = RecordBatch::try_new(schema, vec![identity_array, vote_account_array])?; + Ok(vec![batch]) +} + +/// Builds a lookup table from record batches using a specific column as key +fn build_lut( + batches: &[RecordBatch], + key_column: &str, +) -> Result>> { + let mut index = HashMap::new(); + + for batch in batches { + let schema = batch.schema(); + let key_col = batch + .column_by_name(key_column) + .context(format!("Missing column: {}", key_column))?; + + let key_array = key_col + .as_any() + .downcast_ref::() + .context(format!("Column {} is not a string array", key_column))?; + + for row_idx in 0..batch.num_rows() { + // Skip rows with null keys + if key_array.is_null(row_idx) { + continue; + } + + let key_value = key_array.value(row_idx).to_string(); + let mut row_data = HashMap::new(); + + // Store all columns for this row + for field in schema.fields() { + let col_name = field.name(); + if let Some(col) = batch.column_by_name(col_name) + && let Some(value) = get_column_value_as_string(col, row_idx) + { + row_data.insert(col_name.clone(), value); + } + } + + index.insert(key_value, row_data); + } + } + + Ok(index) +} + +/// Gets a string field value from a row +fn get_string_field<'a>(row: &'a HashMap, field: &str) -> Option<&'a String> { + row.get(field) +} + +/// Converts a column value at a given index to a string +fn get_column_value_as_string(col: &Arc, row_idx: usize) -> Option { + if col.is_null(row_idx) { + return None; + } + + match col.data_type() { + DataType::Utf8 => { + let array: &StringArray = col.as_string(); + Some(array.value(row_idx).to_string()) + } + DataType::Boolean => { + let array = col.as_any().downcast_ref::()?; + Some(array.value(row_idx).to_string()) + } + DataType::Int64 => { + let array = col.as_primitive::(); + Some(array.value(row_idx).to_string()) + } + DataType::Float64 => { + let array = col.as_primitive::(); + Some(array.value(row_idx).to_string()) + } + _ => None, + } +} + +/// Extracts validator identities (identity + vote account) from merged record batches +fn extract_validator_identities(batches: Vec) -> Result> { + let mut validators = Vec::new(); + + for batch in batches { + let identity_col = batch + .column_by_name("identity_pubkey") + .context("Missing identity_pubkey column")?; + + let vote_account_col = batch + .column_by_name("vote_account_pubkey") + .context("Missing vote_account_pubkey column")?; + + let identity_array = identity_col + .as_any() + .downcast_ref::() + .context("identity_pubkey is not a string array")?; + + let vote_account_array = vote_account_col + .as_any() + .downcast_ref::() + .context("vote_account_pubkey is not a string array")?; + + for i in 0..batch.num_rows() { + if !identity_array.is_null(i) && !vote_account_array.is_null(i) { + validators.push(ValidatorKey::new( + identity_array.value(i).to_string(), + vote_account_array.value(i).to_string(), + 0, + )); + } + } + } + + Ok(validators) +} diff --git a/offchain/crates/validator-debt/src/solana_debt_calculator.rs b/offchain/crates/validator-debt/src/solana_debt_calculator.rs new file mode 100644 index 0000000000..a92b4ee95f --- /dev/null +++ b/offchain/crates/validator-debt/src/solana_debt_calculator.rs @@ -0,0 +1,132 @@ +use std::{collections::HashMap, env, error::Error}; + +use anyhow::{Result, anyhow}; +use async_trait::async_trait; +use doublezero_solana_client_tools::rpc::DoubleZeroLedgerConnection; +use mockall::automock; +use serde::de::DeserializeOwned; +use solana_client::{ + client_error::ClientError, + nonblocking::rpc_client::RpcClient, + rpc_config::{RpcBlockConfig, RpcGetVoteAccountsConfig}, + rpc_response::{RpcInflationReward, RpcVoteAccountStatus}, +}; +use solana_commitment_config::CommitmentConfig; +use solana_sdk::{epoch_info::EpochInfo, pubkey::Pubkey}; +use solana_transaction_status_client_types::UiConfirmedBlock; + +const DEFAULT_LEDGER_URL: &str = "http://localhost:8899"; +pub fn ledger_rpc() -> String { + match env::var("LEDGER_RPC") { + Ok(rpc) => rpc, + Err(_) => DEFAULT_LEDGER_URL.to_string(), + } +} + +pub fn solana_rpc() -> String { + match env::var("SOLANA_RPC") { + Ok(rpc) => rpc, + Err(_) => DEFAULT_LEDGER_URL.to_string(), + } +} + +#[automock] +#[async_trait] +pub trait ValidatorRewards { + fn solana_rpc_client(&self) -> &RpcClient; + fn ledger_rpc_client(&self) -> &DoubleZeroLedgerConnection; + fn solana_commitment_config(&self) -> CommitmentConfig; + fn ledger_commitment_config(&self) -> CommitmentConfig; + async fn get_epoch_info(&self) -> Result; + async fn get_leader_schedule(&self, epoch: Option) -> Result>>; + async fn get_block_with_config(&self, slot: u64) -> Result; + + async fn get( + &self, + url: &str, + ) -> Result>; + async fn get_vote_accounts_with_config(&self) -> Result; + async fn get_inflation_reward( + &self, + vote_keys: Vec, + epoch: u64, + ) -> Result>, ClientError>; +} + +pub struct SolanaDebtCalculator { + pub ledger_rpc_client: DoubleZeroLedgerConnection, + pub solana_rpc_client: RpcClient, + pub vote_accounts_config: RpcGetVoteAccountsConfig, + pub rpc_block_config: RpcBlockConfig, +} + +impl SolanaDebtCalculator { + pub fn new( + ledger_rpc_client: DoubleZeroLedgerConnection, + solana_rpc_client: RpcClient, + rpc_block_config: RpcBlockConfig, + vote_accounts_config: RpcGetVoteAccountsConfig, + ) -> Self { + Self { + rpc_block_config, + solana_rpc_client, + ledger_rpc_client, + vote_accounts_config, + } + } +} + +#[async_trait] +impl ValidatorRewards for SolanaDebtCalculator { + fn ledger_commitment_config(&self) -> CommitmentConfig { + self.ledger_rpc_client.commitment() + } + fn solana_commitment_config(&self) -> CommitmentConfig { + self.solana_rpc_client.commitment() + } + fn solana_rpc_client(&self) -> &RpcClient { + &self.solana_rpc_client + } + + fn ledger_rpc_client(&self) -> &DoubleZeroLedgerConnection { + &self.ledger_rpc_client + } + async fn get_epoch_info(&self) -> Result { + self.solana_rpc_client.get_epoch_info().await + } + async fn get_leader_schedule(&self, epoch: Option) -> Result>> { + let schedule = self.solana_rpc_client.get_leader_schedule(epoch).await?; + schedule.ok_or(anyhow!("No leader schedule found")) + } + + async fn get_block_with_config(&self, slot: u64) -> Result { + self.solana_rpc_client + .get_block_with_config(slot, self.rpc_block_config) + .await + } + async fn get( + &self, + url: &str, + ) -> Result> { + let response = reqwest::get(url).await?.error_for_status()?; + + let body = response.json::().await?; + + Ok(body) + } + + async fn get_vote_accounts_with_config(&self) -> Result { + self.solana_rpc_client + .get_vote_accounts_with_config(self.vote_accounts_config.clone()) + .await + } + async fn get_inflation_reward( + &self, + vote_keys: Vec, + epoch: u64, + ) -> Result>, ClientError> { + self.solana_rpc_client + .get_inflation_reward(&vote_keys, Some(epoch)) + .await + } +} diff --git a/offchain/crates/validator-debt/src/transaction.rs b/offchain/crates/validator-debt/src/transaction.rs new file mode 100644 index 0000000000..3ea93d85c8 --- /dev/null +++ b/offchain/crates/validator-debt/src/transaction.rs @@ -0,0 +1,538 @@ +use std::{fs::File, sync::Arc}; + +use anyhow::{Result, anyhow}; +use doublezero_sdk::record::pubkey; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, rpc::DoubleZeroLedgerConnection, +}; +use doublezero_solana_sdk::{ + merkle::MerkleProof, + revenue_distribution::{ + ID, + instruction::{ + DistributionMerkleRootKind, RevenueDistributionInstructionData, + account::{ + ConfigureDistributionDebtAccounts, FinalizeDistributionDebtAccounts, + PaySolanaValidatorDebtAccounts, VerifyDistributionMerkleRootAccounts, + }, + }, + state::Distribution, + try_is_processed_leaf, + types::{DoubleZeroEpoch, SolanaValidatorDebt}, + }, + try_build_instruction, zero_copy, +}; +use futures::stream::{self, StreamExt, TryStreamExt}; +use serde::Serialize; +use solana_client::{ + client_error::{ClientError, ClientErrorKind}, + nonblocking::rpc_client::RpcClient, + rpc_client::SerializableTransaction, + rpc_request::{RpcError, RpcResponseErrorData}, +}; +use solana_sdk::{ + hash::Hash, + message::{VersionedMessage, v0::Message}, + pubkey::Pubkey, + signature::Keypair, + signer::Signer, + transaction::{TransactionError, VersionedTransaction}, +}; +use tokio::sync::Semaphore; + +use crate::{ + ledger, + validator_debt::{ComputedSolanaValidatorDebt, ComputedSolanaValidatorDebts}, +}; + +const MAX_CONCURRENT_CONNECTIONS: usize = 10; + +#[derive(Debug)] +pub struct Transaction { + pub signer: Arc, + pub dry_run: bool, + pub force: bool, +} + +#[derive(Clone, Debug, Default, Serialize)] +pub struct DebtCollectionResults { + pub collection_results: Vec, + pub dz_epoch: u64, + pub successful_transactions_count: usize, + pub insufficient_funds_count: usize, + pub already_paid_count: usize, + pub total_debt: u64, + pub total_paid: u64, + pub already_paid: u64, + pub total_validators: usize, +} + +#[derive(Clone, Debug, Serialize)] +pub struct DebtCollectionResult { + pub validator_id: String, + pub amount: u64, + pub result: Option, + pub success: bool, +} + +impl Transaction { + pub fn new(signer: Arc, dry_run: bool, force: bool) -> Transaction { + Transaction { + signer, + dry_run, + force, + } + } + + pub fn pubkey(&self) -> Pubkey { + self.signer.pubkey() + } + + pub async fn submit_distribution( + &self, + solana_rpc_client: &RpcClient, + dz_epoch: u64, + debts: RevenueDistributionInstructionData, + ) -> Result { + let doublezero_epoch = DoubleZeroEpoch::new(dz_epoch); + match try_build_instruction( + &ID, + ConfigureDistributionDebtAccounts::new(&self.signer.pubkey(), doublezero_epoch), + &debts, + ) { + Ok(instruction) => { + let recent_blockhash = solana_rpc_client.get_latest_blockhash().await?; + let message = Message::try_compile( + &self.signer.pubkey(), + &[instruction], + &[], + recent_blockhash, + ) + .unwrap(); + + let new_transaction = + VersionedTransaction::try_new(VersionedMessage::V0(message), &[&self.signer]) + .unwrap(); + Ok(new_transaction) + } + Err(err) => Err(anyhow!( + "Failed to build initialize distribution instruction: {err:?}" + )), + } + } + + pub async fn finalize_distribution( + &self, + solana_rpc_client: &RpcClient, + dz_connection: &DoubleZeroLedgerConnection, + dz_epoch: u64, + ) -> Result { + let (_, computed_debt) = ledger::try_fetch_debt_record( + dz_connection, + &self.signer.pubkey(), + dz_epoch, + dz_connection.commitment(), + ) + .await?; + + let computed_debt_arc = Arc::new(computed_debt); + stream::iter(computed_debt_arc.debts.iter()) + .map(|debt_entry| { + let debt_entry_node_id = debt_entry.node_id; + let computed_debt_arc = Arc::clone(&computed_debt_arc); + async move { + let (_, proof) = computed_debt_arc + .find_debt_proof(&debt_entry_node_id) + .ok_or_else(|| { + anyhow!("No debt proof found for node {}", debt_entry_node_id) + })?; + + let leaf = SolanaValidatorDebt { + node_id: debt_entry_node_id, + amount: debt_entry.amount, + }; + + self.verify_merkle_root(solana_rpc_client, dz_epoch, proof, leaf) + .await + } + }) + .buffer_unordered(20) + .try_collect::>() + .await?; + let dz_epoch_struct = DoubleZeroEpoch::new(dz_epoch); + + match try_build_instruction( + &ID, + FinalizeDistributionDebtAccounts::new(&self.pubkey(), dz_epoch_struct, &self.pubkey()), + &RevenueDistributionInstructionData::FinalizeDistributionDebt, + ) { + Ok(instruction) => { + let recent_blockhash = solana_rpc_client.get_latest_blockhash().await?; + let message = Message::try_compile( + &self.signer.pubkey(), + &[instruction], + &[], + recent_blockhash, + ) + .unwrap(); + + let finalized_transaction = + VersionedTransaction::try_new(VersionedMessage::V0(message), &[&self.signer]) + .unwrap(); + Ok(finalized_transaction) + } + Err(err) => Err(anyhow!( + "Failed to build finalize distribution instruction: {err:?}" + )), + } + } + + // only simulate transaction + pub async fn verify_merkle_root( + &self, + solana_rpc_client: &RpcClient, + dz_epoch: u64, + proof: MerkleProof, + leaf: SolanaValidatorDebt, + ) -> Result<()> { + let dz_epoch = DoubleZeroEpoch::new(dz_epoch); + let instruction = try_build_instruction( + &ID, + VerifyDistributionMerkleRootAccounts::new(dz_epoch), + &RevenueDistributionInstructionData::VerifyDistributionMerkleRoot { + kind: DistributionMerkleRootKind::SolanaValidatorDebt(leaf), + proof, + }, + )?; + + let recent_blockhash = solana_rpc_client.get_latest_blockhash().await?; + let message = + Message::try_compile(&self.signer.pubkey(), &[instruction], &[], recent_blockhash) + .unwrap(); + + let verified_transaction = + VersionedTransaction::try_new(VersionedMessage::V0(message), &[&self.signer]) + .map_err(|e| anyhow!("Failed to create verified instruction: {e:?}"))?; + let verification = solana_rpc_client + .simulate_transaction(&verified_transaction) + .await?; + anyhow::ensure!( + verification.value.err.is_none(), + "simulation verification failed" + ); + + tracing::info!( + "Verification Result: {:#?}", + verification.value.logs.unwrap_or(Vec::new()) + ); + + Ok(()) + } + + pub async fn send_or_simulate_transaction( + &self, + solana_rpc_client: &RpcClient, + transaction: &impl SerializableTransaction, + ) -> Result> { + if self.dry_run { + let simulation_response = solana_rpc_client.simulate_transaction(transaction).await?; + Ok(Some(simulation_response.value.logs.unwrap().join("\n "))) + } else { + let tx_sig = solana_rpc_client + .send_and_confirm_transaction(transaction) + .await?; + Ok(Some(tx_sig.to_string())) + } + } + + pub async fn close_account( + &self, + ledger_rpc_client: &RpcClient, + dz_epoch: u64, + recent_blockhash: Hash, + ) -> Result<()> { + let dz_epoch_bytes = dz_epoch.to_le_bytes(); + let seed = &[ + ComputedSolanaValidatorDebts::RECORD_SEED_PREFIX, + &dz_epoch_bytes, + ]; + let key = pubkey::create_record_key(&self.pubkey(), seed); + let instruction = + doublezero_record::instruction::close_account(&key, &self.pubkey(), &self.pubkey()); + + let message = + Message::try_compile(&self.pubkey(), &[instruction], &[], recent_blockhash).unwrap(); + + let verified_transaction = + VersionedTransaction::try_new(VersionedMessage::V0(message), &[&self.signer]) + .map_err(|e| anyhow::anyhow!("Failed to create verified instruction: {e:?}"))?; + + let tx = &self + .send_or_simulate_transaction(ledger_rpc_client, &verified_transaction) + .await?; + + tracing::info!("{:#?}", tx); + Ok(()) + } + + pub async fn pay_solana_validator_debt( + &self, + solana_rpc_client: &RpcClient, + debt: ComputedSolanaValidatorDebts, + dz_epoch: u64, + distribution: &ZeroCopyAccountOwnedData, + ) -> Result { + let mut overrides = Vec::new(); + // TODO: This is a temporary fix to exclude a couple of validators + // the longer term fix will be using data on-chain as it's more transparent, less error-prone + if let Ok(file) = File::open("/opt/doublezero-offchain-scheduler/overrides.csv") { + let mut rdr = csv::Reader::from_reader(file); + overrides.extend( + rdr.records() + .filter_map(|result| result.ok()) + .filter_map(|record| { + let pubkey = record.get(0)?; + let epoch = record.get(1)?.parse::().ok()?; + Some((pubkey.to_string(), epoch)) + }), + ); + } + let debts_to_process: Vec = debt.debts.iter().filter(|debt| { + let node_id_str = debt.node_id.to_string(); + let excluded = overrides.iter().any(|(key, epoch)| key == &node_id_str && *epoch == dz_epoch); + if excluded { + tracing::info!( + "Validator {node_id_str} for epoch #{dz_epoch} excluded from debt collection" + ); + + } + !excluded + + }).cloned().collect(); + + let start_index = distribution.processed_solana_validator_debt_start_index as usize; + let end_index = distribution.processed_solana_validator_debt_end_index as usize; + let processed_leaf_data = &distribution.remaining_data[start_index..end_index]; + + let semaphore = Arc::new(Semaphore::new(MAX_CONCURRENT_CONNECTIONS)); + let debt_clone = Arc::new(debt); + + let debt_collection_results: Vec> = + stream::iter(debts_to_process) + .map(|debt| { + let semaphore = semaphore.clone(); + let debt_clone = debt_clone.clone(); + + let debt_proof = debt_clone.find_debt_proof(&debt.node_id).unwrap(); + let (_, proof) = debt_proof; + let leaf_index = proof.leaf_index.unwrap() as usize; + + async move { + let _permit = semaphore + .acquire() + .await + .map_err(|e| anyhow!("Semaphore error: {}", e))?; + + if try_is_processed_leaf(processed_leaf_data, leaf_index).unwrap() { + Ok(DebtCollectionResult { + validator_id: debt.node_id.to_string(), + amount: debt.amount, + result: Some("Merkle leaf".to_string()), + success: false, + }) + } else { + Self::process_single_debt_payment( + self, + solana_rpc_client, + &debt, + proof, + dz_epoch, + ) + .await + } + } + }) + .buffer_unordered(20) + .collect() + .await; + + let mut debt_collection_result: Vec = + Vec::with_capacity(debt_collection_results.len()); + + for result in debt_collection_results { + match result { + Ok(payment_result) => { + debt_collection_result.push(payment_result); + } + + Err(err) => { + eprintln!("Error processing debt payment: {}", err); + } + } + } + + let mut successful_transactions_count = 0; + let mut successful_transactions_amount = 0; + let mut already_paid_count = 0; + let mut already_paid = 0; + let mut insufficient_funds_count = 0; + let mut total_debt: u64 = 0; + + for dcr in &debt_collection_result { + total_debt += dcr.amount; + if dcr.success { + successful_transactions_count += 1; + successful_transactions_amount += dcr.amount; + } else if let Some(result_str) = &dcr.result { + if result_str.contains("Merkle leaf") { + // already paid + already_paid_count += 1; + already_paid += dcr.amount; + } else if result_str.contains("Insufficient funds") { + insufficient_funds_count += 1; + } + } + } + let total_validators = debt_collection_result.len(); + let total_paid = already_paid + successful_transactions_amount; + + let debt_collection_results = DebtCollectionResults { + collection_results: debt_collection_result, + dz_epoch, + successful_transactions_count, + insufficient_funds_count, + already_paid_count, + already_paid, + total_debt, + total_paid, + total_validators, + }; + Ok(debt_collection_results) + } + + async fn process_single_debt_payment( + transaction: &Transaction, + solana_rpc_client: &RpcClient, + debt: &ComputedSolanaValidatorDebt, + proof: MerkleProof, + dz_epoch: u64, + ) -> Result { + let instruction = try_build_instruction( + &ID, + PaySolanaValidatorDebtAccounts::new(DoubleZeroEpoch::new(dz_epoch), &debt.node_id), + &RevenueDistributionInstructionData::PaySolanaValidatorDebt { + amount: debt.amount, + proof, + }, + ) + .unwrap(); + + let recent_blockhash = solana_rpc_client.get_latest_blockhash().await?; + + let message = Message::try_compile( + &transaction.signer.pubkey(), + &[instruction], + &[], + recent_blockhash, + ) + .unwrap(); + + let versioned_transaction = + VersionedTransaction::try_new(VersionedMessage::V0(message), &[&transaction.signer]) + .unwrap(); + + let result = Self::send_or_simulate_transaction( + transaction, + solana_rpc_client, + &versioned_transaction, + ) + .await; + + match result { + Ok(success) => { + let payment_result = parse_program_logs(debt.amount, debt.node_id, success); + Ok(payment_result) + } + Err(err) => { + if let Some(client_error) = err.downcast_ref::() { + match client_error.kind() { + ClientErrorKind::RpcError(RpcError::RpcResponseError { + data: RpcResponseErrorData::SendTransactionPreflightFailure(sim_result), + .. + }) => { + if matches!( + sim_result.err.clone().map(TransactionError::from), + Some(TransactionError::InstructionError(_, _)) + ) { + let payment_result = DebtCollectionResult { + amount: debt.amount, + validator_id: debt.node_id.to_string(), + result: if let Some(logs) = sim_result.logs.clone() { + logs.get(4).cloned() + } else { + None + }, + success: false, + }; + Ok(payment_result) + } else { + Err(err) + } + } + _ => { + let counter = metrics::counter!("doublezero_validator_debt_pay_debt_transaction_failed", "client_error" => client_error.to_string()); + counter.increment(1); + Err(err) + } + } + } else { + Err(err) + } + } + } + } + + // TODO: Get rid of this because only one thing calls it. + pub async fn read_distribution( + &self, + dz_epoch: u64, + rpc_client: &RpcClient, + ) -> Result { + let (distribution_key, _bump) = Distribution::find_address(DoubleZeroEpoch::new(dz_epoch)); + let distribution_account = rpc_client.get_account(&distribution_key).await?; + + let distribution_state = zero_copy::checked_from_bytes_with_discriminator::( + &distribution_account.data, + ) + .expect("Failed to deserialize Distribution account data.") + .0; + + Ok(*distribution_state) + } +} + +pub fn parse_program_logs( + amount: u64, + node_id: Pubkey, + program_logs: Option, +) -> DebtCollectionResult { + let parsed_data = program_logs.as_ref().map(|logs| { + let success_or_fail_line = logs.lines().nth(4); + + // should no longer see uninitialized account errors + let success = success_or_fail_line + .map(|line| !line.contains("Merkle leaf") && !line.contains("Insufficient funds")) + .unwrap_or(true); + + (success, success_or_fail_line.map(String::from)) + }); + + let (success, result) = parsed_data.unwrap_or((true, None)); + + DebtCollectionResult { + amount, + validator_id: node_id.to_string(), + result, + success, + } +} diff --git a/offchain/crates/validator-debt/src/validator_debt.rs b/offchain/crates/validator-debt/src/validator_debt.rs new file mode 100644 index 0000000000..bf6464eadb --- /dev/null +++ b/offchain/crates/validator-debt/src/validator_debt.rs @@ -0,0 +1,139 @@ +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_solana_sdk::{ + merkle::{MerkleProof, merkle_root_from_indexed_byte_ref_leaves}, + sha2, +}; +use solana_sdk::{hash::Hash, pubkey::Pubkey}; + +#[derive(Debug, Default, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)] +pub struct ComputedSolanaValidatorDebts { + pub blockhash: Hash, + pub first_solana_epoch: u64, + pub last_solana_epoch: u64, + pub debts: Vec, +} + +impl ComputedSolanaValidatorDebts { + pub const RECORD_SEED_PREFIX: &[u8] = b"solana_validator_debt"; + + pub fn find_debt_proof( + &self, + validator_id: &Pubkey, + ) -> Option<(&ComputedSolanaValidatorDebt, MerkleProof)> { + let index = self + .debts + .iter() + .position(|debt| &debt.node_id == validator_id)?; + + let solana_validator_debt_entry = &self.debts[index]; + let leaves = self.to_byte_leaves(); + let proof = MerkleProof::from_indexed_byte_ref_leaves( + &leaves, + index as u32, + Some(ComputedSolanaValidatorDebt::LEAF_PREFIX), + )?; + Some((solana_validator_debt_entry, proof)) + } + + pub fn merkle_root(&self) -> Option { + let leaves = self.to_byte_leaves(); + merkle_root_from_indexed_byte_ref_leaves( + &leaves, + Some(ComputedSolanaValidatorDebt::LEAF_PREFIX), + ) + } + + fn to_byte_leaves(&self) -> Vec> { + self.debts + .iter() + .map(|debt| borsh::to_vec(&debt).unwrap()) + .collect() + } +} + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, Copy, Default, PartialEq, Eq)] +pub struct ComputedSolanaValidatorDebt { + pub node_id: Pubkey, + pub amount: u64, +} + +impl ComputedSolanaValidatorDebt { + pub const LEAF_PREFIX: &'static [u8] = b"solana_validator_debt"; + + pub fn merkle_root(&self, proof: MerkleProof) -> sha2::Hash { + let mut leaf = [0; 40]; + + // This is infallible because we know the size of the struct. + borsh::to_writer(&mut leaf[..], &self).unwrap(); + + proof.root_from_leaf(&leaf, Some(Self::LEAF_PREFIX)) + } +} + +#[cfg(test)] +mod tests { + use anyhow::Result; + + use super::*; + + #[test] + fn test_add_rewards_to_tree() -> Result<()> { + let debts = ComputedSolanaValidatorDebts { + blockhash: Hash::new_unique(), + first_solana_epoch: 822, + last_solana_epoch: 823, + debts: vec![ + ComputedSolanaValidatorDebt { + node_id: Pubkey::new_unique(), + amount: 1343542456, + }, + ComputedSolanaValidatorDebt { + node_id: Pubkey::new_unique(), + amount: 234234324, + }, + ], + }; + + let leaf_prefix = Some(ComputedSolanaValidatorDebt::LEAF_PREFIX); + let leaves = debts.to_byte_leaves(); + let leaves_ref: Vec<&[u8]> = leaves.iter().map(|v| v.as_slice()).collect(); + let root = debts.merkle_root().unwrap(); + + let proof_left = debts.find_debt_proof(&debts.debts[0].node_id).unwrap(); + + let computed_proof_left = proof_left.1.root_from_byte_ref_leaf( + &leaves_ref[0], + Some(ComputedSolanaValidatorDebt::LEAF_PREFIX), + ); + + let proof_right = debts.find_debt_proof(&debts.debts[1].node_id).unwrap(); + + let computed_proof_right = proof_right.1.root_from_byte_ref_leaf( + &leaves_ref[1], + Some(ComputedSolanaValidatorDebt::LEAF_PREFIX), + ); + + assert_eq!( + proof_left.1.root_from_leaf(leaves_ref[0], leaf_prefix), + computed_proof_left + ); + assert_eq!( + proof_left.1.root_from_leaf(leaves_ref[0], leaf_prefix), + root + ); + + assert_eq!( + proof_right.1.root_from_leaf(leaves_ref[1], leaf_prefix), + computed_proof_right + ); + assert_eq!( + proof_right.1.root_from_leaf(leaves_ref[1], leaf_prefix), + root + ); + + assert_eq!(proof_left.0.node_id, debts.debts[0].node_id); + assert_eq!(proof_right.0.node_id, debts.debts[1].node_id); + + Ok(()) + } +} diff --git a/offchain/crates/validator-debt/src/worker/initialize_distribution.rs b/offchain/crates/validator-debt/src/worker/initialize_distribution.rs new file mode 100644 index 0000000000..465bf2d1f5 --- /dev/null +++ b/offchain/crates/validator-debt/src/worker/initialize_distribution.rs @@ -0,0 +1,478 @@ +use std::collections::HashMap; + +use anyhow::{Context, Result, ensure}; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + payer::{TransactionOutcome, Wallet}, + rpc::{DoubleZeroLedgerConnection, NetworkEnvironment}, +}; +use doublezero_solana_sdk::{ + environment_2z_token_mint_key, + revenue_distribution::{ + self, GENESIS_DZ_EPOCH_MAINNET_BETA, ID, + fetch::SolConversionState, + instruction::{ + RevenueDistributionInstructionData, + account::{ + EnableSolanaValidatorDebtWriteOffAccounts, FinalizeDistributionDebtAccounts, + FinalizeDistributionRewardsAccounts, InitializeDistributionAccounts, + InitializeSolanaValidatorDepositAccounts, PaySolanaValidatorDebtAccounts, + SweepDistributionTokensAccounts, WriteOffSolanaValidatorDebtAccounts, + }, + }, + state::{self, Distribution, ProgramConfig, SolanaValidatorDeposit}, + types::DoubleZeroEpoch, + }, + try_build_instruction, +}; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{pubkey::Pubkey, signer::Signer}; + +pub async fn try_initialize_distribution( + wallet: &Wallet, + dz_env_override: Option, + bypass_dz_epoch_check: bool, + record_accountant_key: Option, +) -> Result<()> { + let network_env = wallet.connection.try_network_environment().await?; + + // Allow an override to the DoubleZero Ledger environment. + let dz_env = dz_env_override.unwrap_or(network_env); + let dz_connection = DoubleZeroLedgerConnection::from(dz_env); + + let config = wallet + .connection + .try_fetch_zero_copy_data::(&ProgramConfig::find_address().0) + .await?; + + if super::is_config_paused(&config) { + return Ok(()); + } + + let record_accountant_key = match record_accountant_key { + Some(accountant_key) => { + // Disallow if the accountant key is not used with localnet. + ensure!( + network_env.is_localnet(), + "Cannot specify accountant key with non-localnet network" + ); + + accountant_key + } + None => { + let expected_accountant_key = config.debt_accountant_key; + ensure!( + wallet.signer.pubkey() == expected_accountant_key, + "Signer does not match expected debt accountant" + ); + + expected_accountant_key + } + }; + + let next_dz_epoch = config.next_completed_dz_epoch; + + // We want to make sure the next DZ epoch is in sync with the last + // completed DZ epoch. + if bypass_dz_epoch_check { + // Disallow if the bypass is not used with localnet. + ensure!( + network_env.is_localnet(), + "Cannot bypass DZ epoch check with non-localnet network" + ); + } else { + let expected_completed_dz_epoch = dz_connection + .get_epoch_info() + .await? + .epoch + .saturating_sub(1); + + // Ensure that the epoch from the DoubleZero Ledger network equals + // the next one known by the Revenue Distribution program. + if next_dz_epoch.value() != expected_completed_dz_epoch { + tracing::warn!( + "Last completed DZ epoch {expected_completed_dz_epoch} != program's epoch {next_dz_epoch}" + ); + return Ok(()); + } + } + + let minimum_epoch_duration_to_finalize_rewards = config + .checked_minimum_epoch_duration_to_finalize_rewards() + .context("Minimum epoch duration to finalize rewards not set")?; + let rewards_dz_epoch = DoubleZeroEpoch::new( + next_dz_epoch + .value() + .saturating_sub(minimum_epoch_duration_to_finalize_rewards.into()) + .saturating_add(1), + ); + + let rewards_distribution = wallet + .connection + .try_fetch_zero_copy_data::(&Distribution::find_address(rewards_dz_epoch).0) + .await?; + + if config.is_debt_write_off_feature_activated() { + tracing::info!("Processing debt write-offs affecting epoch {rewards_dz_epoch}"); + + // Try to write off distribution debt for the distribution that will have + // rewards distributed to network contributors. If rewards were already + // distributed or all debt is already accounted for, this is a no-op. + try_write_off_distribution_debt( + wallet, + &dz_connection, + &record_accountant_key, + &rewards_distribution, + ) + .await?; + } else { + tracing::warn!("Debt write off feature is not activated yet"); + } + + let wallet_key = wallet.pubkey(); + let dz_mint_key = environment_2z_token_mint_key(network_env); + + let initialize_distribution_ix = try_build_instruction( + &ID, + InitializeDistributionAccounts::new(&wallet_key, &wallet_key, next_dz_epoch, &dz_mint_key), + &RevenueDistributionInstructionData::InitializeDistribution, + ) + .unwrap(); + + let mut compute_unit_limit = 75_000; + + let (distribution_key, bump) = Distribution::find_address(next_dz_epoch); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let (_, bump) = state::find_2z_token_pda_address(&distribution_key); + compute_unit_limit += Wallet::compute_units_for_bump_seed(bump); + + let mut instructions = vec![initialize_distribution_ix]; + + let has_zero_debt = has_zero_distribution_debt(&rewards_distribution); + + if rewards_distribution.is_debt_calculation_finalized() || has_zero_debt { + // The debt calculation may not have been finalized yet if there was no + // debt calculated. Finalizing must be done before rewards can be + // distributed. + if has_zero_debt { + tracing::warn!( + "Finalizing debt calculation for epoch {rewards_dz_epoch} with zero debt" + ); + let finalize_debt_ix = try_build_instruction( + &ID, + FinalizeDistributionDebtAccounts::new(&wallet_key, rewards_dz_epoch, &wallet_key), + &RevenueDistributionInstructionData::FinalizeDistributionDebt, + )?; + instructions.push(finalize_debt_ix); + compute_unit_limit += 5_000; + } + + let SolConversionState { + program_state: (_, sol_conversion_program_state), + configuration_registry: _, + journal: (_, journal), + fixed_fill_quantity, + } = SolConversionState::try_fetch(&wallet.connection).await?; + + let sweep_dz_epoch = journal.next_dz_epoch_to_sweep_tokens; + + let sweep_distribution = wallet + .connection + .try_fetch_zero_copy_data::(&Distribution::find_address(sweep_dz_epoch).0) + .await?; + let total_sol_debt = sweep_distribution.checked_total_sol_debt().unwrap(); + let journal_swapped_sol_amount = journal.swapped_sol_amount; + tracing::info!("Total SOL debt to sweep: {total_sol_debt}"); + tracing::info!("Journal swapped SOL amount: {journal_swapped_sol_amount}"); + + if total_sol_debt > journal_swapped_sol_amount { + tracing::warn!( + "Total SOL debt to sweep is greater than journal swapped SOL amount. Skipping sweep" + ); + } else { + let finalize_rewards_ix = try_build_instruction( + &ID, + FinalizeDistributionRewardsAccounts::new(&wallet_key, sweep_dz_epoch), + &RevenueDistributionInstructionData::FinalizeDistributionRewards, + )?; + instructions.push(finalize_rewards_ix); + + let expected_fill_count = + rewards_distribution.checked_total_sol_debt().unwrap() / fixed_fill_quantity + 1; + + let sweep_distribution_tokens_ix = try_build_instruction( + &ID, + SweepDistributionTokensAccounts::new( + sweep_dz_epoch, + &config.sol_2z_swap_program_id, + &sol_conversion_program_state.fills_registry_key, + ), + &RevenueDistributionInstructionData::SweepDistributionTokens, + )?; + instructions.push(sweep_distribution_tokens_ix); + compute_unit_limit += 10_000 + 80 * expected_fill_count as u32; + } + } + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + // We intentionally ignore the --with-compute-unit-price flag here to + // ensure that we land the distribution initialization. + instructions.push(ComputeBudgetInstruction::set_compute_unit_price(100_000)); + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_sig = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + tracing::info!("Initialize distribution: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + + Ok(()) +} + +// + +// TODO: This method may need a rate limiter for account fetches. +async fn try_write_off_distribution_debt( + wallet: &Wallet, + dz_ledger_connection: &DoubleZeroLedgerConnection, + record_accountant_key: &Pubkey, + rewards_distribution: &ZeroCopyAccountOwnedData, +) -> Result<()> { + let wallet_key = wallet.pubkey(); + let rewards_dz_epoch = rewards_distribution.dz_epoch; + + // Track running deposit balances when we iterate through epochs. + let mut deposit_balances = HashMap::new(); + + if rewards_distribution.is_rewards_calculation_finalized() { + tracing::info!("Rewards already finalized for epoch {rewards_dz_epoch}"); + return Ok(()); + } + + if has_zero_distribution_debt(rewards_distribution) { + tracing::info!("No debt found for epoch {rewards_dz_epoch}"); + return Ok(()); + } + + let mut rewards_distribution = rewards_distribution.clone(); + + // Write-offs will have to terminate if the uncollectible debt exceeds the + // total debt. This boolean will never be false if the only debt written off + // is from the same epoch. But for any lingering bad debt, we may have to + // bail out. + let mut must_terminate_debt_write_offs = false; + + // Traverse backwards through epochs to write off debt. + // + // TODO: We should be able to terminate this loop early if we find that + // all processed debt is already accounted for. But for now, we will just + // iterate through all epochs. + for dz_epoch in (GENESIS_DZ_EPOCH_MAINNET_BETA..=rewards_dz_epoch.value()) + .rev() + .map(DoubleZeroEpoch::new) + { + if must_terminate_debt_write_offs { + tracing::warn!( + "Terminating debt write-offs because uncollectible debt exceeds total debt" + ); + break; + } + + let (distribution_key, _) = Distribution::find_address(dz_epoch); + + let distribution = if dz_epoch == rewards_dz_epoch { + rewards_distribution.clone() + } else { + wallet + .connection + .try_fetch_zero_copy_data::(&distribution_key) + .await? + }; + + if distribution.is_all_solana_validator_debt_processed() { + continue; + } + + let processed_range = distribution.processed_solana_validator_debt_bitmap_range(); + let processed_leaf_data = &distribution.remaining_data[processed_range]; + + let (_, computed_debt) = crate::ledger::try_fetch_debt_record( + dz_ledger_connection, + record_accountant_key, + dz_epoch.value(), + dz_ledger_connection.commitment(), + ) + .await?; + + let rent_sysvar = wallet + .connection + .try_fetch_sysvar::() + .await?; + + let mut instructions_and_compute_units = Vec::new(); + let mut pay_count = 0; + let mut write_off_count = 0; + + for (leaf_index, debt) in computed_debt.debts.iter().enumerate() { + if revenue_distribution::try_is_processed_leaf(processed_leaf_data, leaf_index).unwrap() + { + continue; + } + + let remaining_sol_debt = rewards_distribution + .checked_total_sol_debt() + .unwrap_or_default(); + + let node_id = debt.node_id; + let (deposit_key, deposit_bump) = SolanaValidatorDeposit::find_address(&node_id); + + if let std::collections::hash_map::Entry::Vacant(entry) = + deposit_balances.entry(node_id) + { + let deposit_account_info = wallet + .connection + .get_account(&deposit_key) + .await + .unwrap_or_default(); + + if deposit_account_info.data.is_empty() { + let instruction = try_build_instruction( + &ID, + InitializeSolanaValidatorDepositAccounts::new(&wallet_key, &node_id), + &RevenueDistributionInstructionData::InitializeSolanaValidatorDeposit( + node_id, + ), + ) + .unwrap(); + + let compute_units = Wallet::compute_units_for_bump_seed(deposit_bump); + instructions_and_compute_units.push((instruction, compute_units)); + } + + let deposit_balance = doublezero_solana_client_tools::account::balance( + &deposit_account_info, + &rent_sysvar, + ); + entry.insert(deposit_balance); + tracing::debug!("Fetched deposit balance for node {node_id}: {deposit_balance}"); + } + + let deposit_balance = deposit_balances.get_mut(&node_id).unwrap(); + + let (_, proof) = computed_debt.find_debt_proof(&node_id).unwrap(); + + if debt.amount == 0 || *deposit_balance >= debt.amount { + let compute_units = + revenue_distribution::compute_unit::pay_solana_validator_debt(&proof); + + let instruction = try_build_instruction( + &ID, + PaySolanaValidatorDebtAccounts::new(dz_epoch, &node_id), + &RevenueDistributionInstructionData::PaySolanaValidatorDebt { + amount: debt.amount, + proof, + }, + ) + .unwrap(); + + instructions_and_compute_units.push((instruction, compute_units)); + + *deposit_balance -= debt.amount; + tracing::debug!("Updated deposit balance for node {node_id} to {deposit_balance}"); + + pay_count += 1; + } + // Only write off debt if there is enough remaining SOL debt to + // cover the write-off. + else if debt.amount <= remaining_sol_debt { + tracing::info!( + "Remaining {remaining_sol_debt} debt on rewards epoch {rewards_dz_epoch}. Writing off {} from epoch {dz_epoch}", + debt.amount + ); + if !distribution.is_solana_validator_debt_write_off_enabled() + && write_off_count == 0 + { + let instruction = try_build_instruction( + &ID, + EnableSolanaValidatorDebtWriteOffAccounts::new(dz_epoch, &wallet_key), + &RevenueDistributionInstructionData::EnableSolanaValidatorDebtWriteOff, + ) + .unwrap(); + + instructions_and_compute_units.push((instruction, 5_000)); + } + + let compute_units = + revenue_distribution::compute_unit::write_off_solana_validator_debt(&proof); + + let instruction = try_build_instruction( + &ID, + WriteOffSolanaValidatorDebtAccounts::new( + &wallet_key, + dz_epoch, + &node_id, + rewards_dz_epoch, + ), + &RevenueDistributionInstructionData::WriteOffSolanaValidatorDebt { + amount: debt.amount, + proof, + }, + ) + .unwrap(); + + instructions_and_compute_units.push((instruction, compute_units)); + write_off_count += 1; + + // Update the uncollectible debt locally. + rewards_distribution.mucked_data.uncollectible_sol_debt += debt.amount; + } else { + must_terminate_debt_write_offs = true; + } + } + + if pay_count == 0 && write_off_count == 0 { + continue; + } + + tracing::info!( + "Epoch {dz_epoch} summary: {pay_count} payments, {write_off_count} write-offs" + ); + + let instruction_batches = + doublezero_solana_client_tools::transaction::try_batch_instructions_with_common_signers( + instructions_and_compute_units, + &[wallet], + &[], + true, // allow_compute_price_instruction + &[], + )?; + + for mut instructions in instruction_batches { + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_sig = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + tracing::info!("Process Solana validator debt for epoch {dz_epoch}: {tx_sig}"); + + wallet.print_verbose_output(&[tx_sig]).await?; + } + } + } + + Ok(()) +} + +#[inline(always)] +fn has_zero_distribution_debt(rewards_distribution: &Distribution) -> bool { + rewards_distribution.solana_validator_debt_merkle_root == Default::default() +} diff --git a/offchain/crates/validator-debt/src/worker/mod.rs b/offchain/crates/validator-debt/src/worker/mod.rs new file mode 100644 index 0000000000..2bea7e80d6 --- /dev/null +++ b/offchain/crates/validator-debt/src/worker/mod.rs @@ -0,0 +1,879 @@ +mod initialize_distribution; +mod pause_gate; +mod slack_report; + +// + +use std::{collections::HashMap, str::FromStr, sync::Arc}; + +use anyhow::{Result, bail, ensure}; +use doublezero_solana_client_tools::{ + account::zero_copy::ZeroCopyAccountOwnedData, + payer::{TransactionOutcome, Wallet}, + rpc::{DoubleZeroLedgerConnection, SolanaConnection}, +}; +use doublezero_solana_sdk::{ + revenue_distribution::{ + GENESIS_DZ_EPOCH_MAINNET_BETA, ID, + fetch::{try_fetch_config, try_fetch_distribution}, + instruction::{ + RevenueDistributionInstructionData, account::InitializeSolanaValidatorDepositAccounts, + }, + state::{Distribution, ProgramConfig, SolanaValidatorDeposit}, + types::{SolanaValidatorDebt, UnitShare16}, + }, + try_build_instruction, +}; +use futures::{StreamExt, TryStreamExt, stream}; +pub use initialize_distribution::*; +use leaky_bucket::RateLimiter; +pub(super) use pause_gate::is_config_paused; +use reqwest::Client; +use serde::Serialize; +use slack_notifier; +use solana_client::nonblocking::rpc_client::RpcClient; +use solana_compute_budget_interface::ComputeBudgetInstruction; +use solana_sdk::{clock::Clock, pubkey::Pubkey, signer::Signer, sysvar::clock}; +use tabled::Tabled; + +use crate::{ + ledger, rewards, + rpc::JoinedSolanaEpochs, + s3_fetcher, + solana_debt_calculator::ValidatorRewards, + transaction::{DebtCollectionResults, Transaction}, + validator_debt::{ComputedSolanaValidatorDebt, ComputedSolanaValidatorDebts}, +}; + +#[derive(Debug, Default, Serialize)] +pub struct WriteSummary { + pub dz_epoch: u64, + pub solana_epoch: u64, + pub dry_run: bool, + pub total_debt: u64, + pub total_validators: u64, + pub validator_summaries: Vec, + pub transaction_id: Option, +} + +#[derive(Debug, Default, Serialize, Tabled)] +pub struct ValidatorSummary { + pub validator_pubkey: String, + pub total_debt: u64, +} + +/// Helper to fetch ProgramConfig using an RpcClient. +async fn fetch_config_from_rpc(rpc_client: &RpcClient) -> anyhow::Result> { + let connection = + SolanaConnection::new_with_commitment(rpc_client.url(), rpc_client.commitment()); + let (_, config) = try_fetch_config(&connection).await?; + Ok(config) +} + +pub async fn finalize_distribution( + solana_debt_calculator: &impl ValidatorRewards, + transaction: Transaction, + dz_epoch: u64, +) -> Result<()> { + let config = fetch_config_from_rpc(solana_debt_calculator.solana_rpc_client()).await?; + if is_config_paused(&config) { + return Ok(()); + } + + let transaction_to_submit = transaction + .finalize_distribution( + solana_debt_calculator.solana_rpc_client(), + solana_debt_calculator.ledger_rpc_client(), + dz_epoch, + ) + .await?; + + let transaction_signature = transaction + .send_or_simulate_transaction( + solana_debt_calculator.solana_rpc_client(), + &transaction_to_submit, + ) + .await?; + + if let Some(finalized_sig) = transaction_signature { + tracing::info!("finalized distribution tx: {finalized_sig:?}"); + slack_notifier::validator_debt::post_finalized_distribution_to_slack( + finalized_sig, + dz_epoch, + transaction.dry_run, + ) + .await?; + } + Ok(()) +} + +pub async fn verify_validator_debt( + solana_debt_calculator: &impl ValidatorRewards, + transaction: Transaction, + dz_epoch: u64, + validator_id: &str, + amount: u64, +) -> Result<()> { + let (_, computed_debt) = ledger::try_fetch_debt_record( + solana_debt_calculator.ledger_rpc_client(), + &transaction.signer.pubkey(), + dz_epoch, + solana_debt_calculator.ledger_commitment_config(), + ) + .await?; + + let leaf = SolanaValidatorDebt { + node_id: Pubkey::from_str(validator_id).unwrap(), + amount, + }; + + let debt_proof = computed_debt.find_debt_proof(&Pubkey::from_str(validator_id).unwrap()); + let (_, proof) = debt_proof.unwrap(); + transaction + .verify_merkle_root( + solana_debt_calculator.solana_rpc_client(), + dz_epoch, + proof, + leaf, + ) + .await?; + + Ok(()) +} + +pub async fn calculate_distribution( + solana_debt_calculator: &impl ValidatorRewards, + transaction: Transaction, + post_to_ledger_only: bool, +) -> Result { + let config = fetch_config_from_rpc(solana_debt_calculator.solana_rpc_client()).await?; + let dz_epoch = config.last_completed_epoch().unwrap_or_default().value(); + if is_config_paused(&config) { + // Return an empty summary when paused (skip work). + return Ok(WriteSummary { + dz_epoch, + dry_run: transaction.dry_run, + ..Default::default() + }); + } + + let fetched_dz_epoch_info = solana_debt_calculator + .ledger_rpc_client() + .get_epoch_info() + .await?; + + if fetched_dz_epoch_info.epoch == dz_epoch { + bail!( + "Fetched DZ epoch {} == dz_epoch parameter {dz_epoch}", + fetched_dz_epoch_info.epoch + ); + }; + + // fetch the distribution to get the fee percentages and calculation_allowed_timestamp + let distribution = transaction + .read_distribution(dz_epoch, solana_debt_calculator.solana_rpc_client()) + .await?; + + if distribution + .solana_validator_fee_parameters + .base_block_rewards_pct + == UnitShare16::default() + { + tracing::warn!("No fees collected - aborting distribution calculation"); + return Ok(WriteSummary::default()); + } + + if distribution.is_debt_calculation_finalized() { + bail!("distribution has already been finalized for dz epoch {dz_epoch}"); + } + + // get solana current timestamp + let clock_account = solana_debt_calculator + .solana_rpc_client() + .get_account(&clock::id()) + .await?; + + let clock = bincode::deserialize::(&clock_account.data)?; + let solana_timestamp = clock.unix_timestamp; + + if distribution.calculation_allowed_timestamp as i64 >= solana_timestamp { + bail!( + "Solana timestamp {solana_timestamp} has not passed the calculation_allowed_timestamp: {}", + distribution.calculation_allowed_timestamp + ); + }; + + let rate_limiter = RateLimiter::builder() + .max(10) + .initial(10) + .refill(10) + .interval(std::time::Duration::from_secs(1)) + .build(); + + let mut epochs: Vec = Vec::new(); + + match JoinedSolanaEpochs::try_new( + solana_debt_calculator.solana_rpc_client(), + solana_debt_calculator.ledger_rpc_client(), + dz_epoch, + &rate_limiter, + ) + .await? + { + JoinedSolanaEpochs::Range(solana_epoch_range) => { + solana_epoch_range.into_iter().for_each(|solana_epoch| { + epochs.push(solana_epoch); + tracing::info!("Joined Solana epoch: {solana_epoch}"); + }); + } + JoinedSolanaEpochs::Duplicate(solana_epoch) => { + tracing::warn!("Duplicated joined Solana epoch: {solana_epoch}"); + let counter = metrics::counter!("doublezero_validator_debt_overlapping_epochs", "dz_epoch" => dz_epoch.to_string(), "solana_epoch" => solana_epoch.to_string()); + counter.increment(1); + } + }; + + let recent_blockhash = solana_debt_calculator + .ledger_rpc_client() + .get_latest_blockhash() + .await?; + + // this means the previous dz epoch traversed more than one solana epoch + // if the current dz_epoch_record's solana epoch is also in the previous record's epoch + // then we've already calculated the debt for that epoch and will send a zeroed-out record + // and transaction for the current dz epoch + if epochs.is_empty() { + // zero out the debt + let computed_solana_validator_debts = ComputedSolanaValidatorDebts::default(); + + ledger::create_record_on_ledger( + solana_debt_calculator.ledger_rpc_client(), + recent_blockhash, + &transaction.signer, + &computed_solana_validator_debts, + solana_debt_calculator.ledger_commitment_config(), + &[ + ComputedSolanaValidatorDebts::RECORD_SEED_PREFIX, + &dz_epoch.to_le_bytes(), + ], + ) + .await?; + + // TODO: Do we want force as an option? + if transaction.force { + tracing::warn!( + "No non-overlapping solana epoch found. Zeroing out debt for DZ epoch {dz_epoch}" + ); + transaction + .finalize_distribution( + solana_debt_calculator.solana_rpc_client(), + solana_debt_calculator.ledger_rpc_client(), + dz_epoch, + ) + .await?; + bail!("No debt to pay for dz epoch {dz_epoch}") + } else { + bail!("To finalize the debt for an empty DZ epoch use `--force`"); + }; + }; + + let solana_epoch_from_first_dz_epoch_block = epochs.first().unwrap().to_owned(); + let solana_epoch_from_last_dz_epoch_block = epochs.last().unwrap().to_owned(); + + let solana_epoch = if solana_epoch_from_first_dz_epoch_block + == solana_epoch_from_last_dz_epoch_block + { + tracing::info!( + "DZ epoch {dz_epoch} contains only {solana_epoch_from_first_dz_epoch_block} only" + ); + solana_epoch_from_first_dz_epoch_block + } else { + tracing::info!( + "DZ epoch {dz_epoch} overlaps {solana_epoch_from_last_dz_epoch_block} and {solana_epoch_from_first_dz_epoch_block}" + ); + solana_epoch_from_last_dz_epoch_block + }; + + // Fetch validator pubkeys from S3 using the canonical approach + tracing::info!("Fetching validator pubkeys from S3 for epoch {solana_epoch}"); + let s3_validator_keys = s3_fetcher::fetch_validator_pubkeys( + solana_epoch, + solana_debt_calculator.solana_rpc_client(), + s3_fetcher::Network::MainnetBeta, + ) + .await?; + + tracing::info!( + "Found {} validators from S3 (after 12-hour rule)", + s3_validator_keys.len() + ); + + // Convert to validator pubkey strings for rewards calculation + let mut validator_pubkeys: Vec = s3_validator_keys + .iter() + .map(|vk| vk.pubkey.clone()) + .collect(); + + validator_pubkeys.sort(); + + // Use S3-fetched validators and calculate rewards + let validator_rewards = + rewards::get_total_rewards(solana_debt_calculator, &validator_pubkeys, solana_epoch) + .await?; + + // gather rewards into debts for all validators + tracing::info!("Computing solana validator debt"); + let computed_solana_validator_debt_vec: Vec = validator_rewards + .rewards + .iter() + .map(|reward| ComputedSolanaValidatorDebt { + node_id: Pubkey::from_str(&reward.validator_id).unwrap(), + amount: distribution + .solana_validator_fee_parameters + .base_block_rewards_pct + .mul_scalar(reward.block_base) + + distribution + .solana_validator_fee_parameters + .priority_block_rewards_pct + .mul_scalar(reward.block_priority) + + distribution + .solana_validator_fee_parameters + .jito_tips_pct + .mul_scalar(reward.jito) + + distribution + .solana_validator_fee_parameters + .inflation_rewards_pct + .mul_scalar(reward.inflation) + + distribution + .solana_validator_fee_parameters + .fixed_sol_amount as u64, + }) + .collect(); + + let computed_solana_validator_debt_vec = computed_solana_validator_debt_vec + .into_iter() + .filter(|vd| vd.amount != 0) + .collect::>(); + + let recent_blockhash = solana_debt_calculator + .ledger_rpc_client() + .get_latest_blockhash() + .await?; + + let computed_solana_validator_debts = ComputedSolanaValidatorDebts { + blockhash: recent_blockhash, + first_solana_epoch: solana_epoch, + last_solana_epoch: solana_epoch, + debts: computed_solana_validator_debt_vec.clone(), + }; + + if transaction.dry_run { + // TODO: Should this be an error? + tracing::warn!("Posting to ledger is not supported with `--dry-run`"); + } else { + create_or_validate_ledger_record( + solana_debt_calculator, + &transaction, + computed_solana_validator_debts.clone(), + dz_epoch, + recent_blockhash, + ) + .await?; + } + + if post_to_ledger_only { + bail!("Debt posted only to DoubleZero Ledger and process exited") + } + + let submitted_tx = write_transaction( + solana_debt_calculator.solana_rpc_client(), + &computed_solana_validator_debts, + &transaction, + dz_epoch, + ) + .await?; + + let debt_map: HashMap = computed_solana_validator_debts + .debts + .iter() + .map(|debt| (debt.node_id.to_string(), debt.amount)) + .collect(); + + let validator_summaries: Vec = computed_solana_validator_debt_vec + .clone() + .into_iter() + .map(|vr| ValidatorSummary { + validator_pubkey: vr.node_id.to_string().clone(), + total_debt: vr.amount, + }) + .collect(); + + let write_summary = WriteSummary { + dz_epoch, + solana_epoch, + total_debt: debt_map.iter().map(|dm| dm.1).sum(), + dry_run: transaction.dry_run, + total_validators: computed_solana_validator_debts.debts.len() as u64, + transaction_id: submitted_tx, + validator_summaries, + }; + + Ok(write_summary) +} + +pub async fn pay_all_solana_validator_debt( + wallet: Wallet, + dz_ledger: DoubleZeroLedgerConnection, +) -> Result<()> { + let (_, config) = try_fetch_config(&wallet.connection).await?; + + if is_config_paused(&config) { + return Ok(()); + } + + let dz_epoch_range = Vec::from_iter( + GENESIS_DZ_EPOCH_MAINNET_BETA..=(config.last_completed_epoch().unwrap().value()), + ); + + let tasks: Vec = stream::iter(dz_epoch_range) + .map(|dz_epoch| { + let wallet_ref = &wallet; + let ledger_ref = &dz_ledger; + let config_ref = &config; + + async move { + let (_, distribution) = + try_fetch_distribution(&wallet_ref.connection, dz_epoch).await?; + + if !distribution.is_debt_calculation_finalized() { + tracing::warn!("{dz_epoch} is not finalized, skipping"); + + return Ok(Default::default()); + } + let result = pay_solana_validator_debt( + wallet_ref, + ledger_ref, + dz_epoch, + config_ref, + &distribution, + ) + .await?; + tracing::info!("Finished debt collection for epoch {dz_epoch}"); + Ok::<_, anyhow::Error>(result) + } + }) + .buffer_unordered(2) + .try_collect() + .await?; + + let client = reqwest::Client::new(); + + post_debt_collection_summary_to_slack(&tasks, &client).await?; + post_debt_collections_to_slack(&tasks, false, &client).await?; + + Ok(()) +} + +pub async fn pay_solana_validator_debt( + wallet: &Wallet, + dz_ledger: &DoubleZeroLedgerConnection, + dz_epoch_value: u64, + config: &ProgramConfig, + distribution: &ZeroCopyAccountOwnedData, +) -> Result { + let (_, computed_debt) = ledger::try_fetch_debt_record( + dz_ledger, + &config.debt_accountant_key, + dz_epoch_value, + dz_ledger.commitment(), + ) + .await?; + + try_initialize_missing_deposit_accounts(wallet, &computed_debt).await?; + + let arc_signer = Arc::new(wallet.signer.insecure_clone()); + let transaction = Transaction::new(arc_signer, wallet.dry_run, false); + + transaction + .pay_solana_validator_debt( + &wallet.connection, + computed_debt, + dz_epoch_value, + distribution, + ) + .await +} + +async fn write_transaction( + solana_rpc_client: &RpcClient, + computed_solana_validator_debts: &ComputedSolanaValidatorDebts, + transaction: &Transaction, + dz_epoch: u64, +) -> Result> { + let merkle_root = computed_solana_validator_debts.merkle_root(); + + // Create the data for the solana transaction + let total_validators: u32 = computed_solana_validator_debts.debts.len() as u32; + let total_debt: u64 = computed_solana_validator_debts + .debts + .iter() + .map(|debt| debt.amount) + .sum(); + + tracing::info!("Writing total debt {total_debt} to solana for {total_validators} validators"); + + let debt = RevenueDistributionInstructionData::ConfigureDistributionDebt { + total_validators, + total_debt, + merkle_root: merkle_root.unwrap(), + }; + + let submitted_distribution = transaction + .submit_distribution(solana_rpc_client, dz_epoch, debt) + .await?; + + let tx_submitted_sig = transaction + .send_or_simulate_transaction(solana_rpc_client, &submitted_distribution) + .await?; + + if let Some(tx) = tx_submitted_sig { + tracing::info!("Submitted distribution tx: {tx:?}"); + metrics::gauge!("doublezero_validator_debt_total_debt", "dz_epoch" => dz_epoch.to_string()) + .set(total_debt as f64); + metrics::gauge!("doublezero_validator_debt_total_validators", "dz_epoch" => dz_epoch.to_string()).set(total_validators as f64); + + Ok(Some(tx)) + } else { + Ok(None) + } +} + +pub async fn post_debt_collection_summary_to_slack( + debt_collection_results: &[DebtCollectionResults], + client: &Client, +) -> Result<()> { + let total_paid: u64 = debt_collection_results.iter().map(|tp| tp.total_paid).sum(); + let total_debt: u64 = debt_collection_results.iter().map(|td| td.total_debt).sum(); + let insufficient_funds_count: usize = debt_collection_results + .iter() + .map(|ifc| ifc.insufficient_funds_count) + .sum(); + + let header = "Total Debt Collection"; + let table_header = vec![ + "Total Paid".to_string(), + "Total Debt".to_string(), + "Total Outstanding".to_string(), + "Total Percentage Paid".to_string(), + "Total Insufficient Funds Count".to_string(), + ]; + + // TODO: figure out why a mysterious empty total debt collection is posted only on remote env + // this is a dumb bandaid to fix the quirk + if total_debt == 0 { + return Ok(()); + }; + + let total_outstanding = total_debt.saturating_sub(total_paid); + let percentage_paid = total_paid as f64 / total_debt as f64; + + let table_values = vec![ + format!("{:.9} SOL", total_paid as f64 * 1e-9), + format!("{:.9} SOL", total_debt as f64 * 1e-9), + format!("{:.9} SOL", total_outstanding as f64 * 1e-9), + format!("{:.2}%", percentage_paid * 100.0), + insufficient_funds_count.to_string(), + ]; + slack_notifier::validator_debt::post_to_slack(None, client, header, table_header, table_values) + .await?; + Ok(()) +} + +pub async fn post_debt_collections_to_slack( + debt_collection_results: &[DebtCollectionResults], + dry_run: bool, + client: &Client, +) -> Result<()> { + let header = if dry_run { + "DRY RUN Debt Collected DRY RUN" + } else { + "Debt Collected" + }; + + let table_header = vec![ + "DoubleZero Epoch".to_string(), + "Total Paid".to_string(), + "Outstanding Debt".to_string(), + "Total Debt".to_string(), + "Percentage Paid".to_string(), + "Total Attempted Transactions".to_string(), + "Successful Transactions".to_string(), + "Insufficient Funds".to_string(), + "Already Paid".to_string(), + ]; + + let visible = slack_report::visible_rows(debt_collection_results); + let mut table_values: Vec> = Vec::with_capacity(visible.len()); + + for dcr in visible { + let total_attempted_transactions_count: u64 = dcr.total_validators as u64; + let successful_transactions_count: u64 = dcr.successful_transactions_count as u64; + let already_paid_count: u64 = dcr.already_paid_count as u64; + + let percentage_paid = (already_paid_count + successful_transactions_count) as f64 + / total_attempted_transactions_count as f64; + + let row_values = vec![ + dcr.dz_epoch.to_string(), + format!("{:.9} SOL", dcr.total_paid as f64 * 1e-9), + format!("{:.9} SOL", (dcr.total_debt - dcr.total_paid) as f64 * 1e-9), + format!("{:.9} SOL", dcr.total_debt as f64 * 1e-9), + format!("{:.2}%", percentage_paid * 100.0), + total_attempted_transactions_count.to_string(), + successful_transactions_count.to_string(), + dcr.insufficient_funds_count.to_string(), + already_paid_count.to_string(), + ]; + + table_values.push(row_values); + } + + if !table_values.is_empty() { + slack_notifier::validator_debt::post_debt_collections_to_slack( + client, + header, + table_header, + table_values, + ) + .await?; + }; + Ok(()) +} + +pub async fn post_debt_collection_to_slack( + debt_collection_results: DebtCollectionResults, + dry_run: bool, + filepath: Option, +) -> Result<()> { + let client = reqwest::Client::new(); + let header = if dry_run { + "DRY RUN Debt Collected DRY RUN" + } else { + "Debt Collected" + }; + + let table_header = vec![ + "DoubleZero Epoch".to_string(), + "Total Paid".to_string(), + "Outstanding Debt".to_string(), + "Total Debt".to_string(), + "Percentage Paid".to_string(), + "Total Attempted Transactions".to_string(), + "Successful Transactions".to_string(), + "Insufficient Funds".to_string(), + "Already Paid".to_string(), + ]; + + let total_attempted_transactions_count: u64 = debt_collection_results.total_validators as u64; + + if total_attempted_transactions_count == 0 { + return Ok(()); + }; + + let successful_transactions_count: u64 = + debt_collection_results.successful_transactions_count as u64; + let already_paid_count: u64 = debt_collection_results.already_paid_count as u64; + + let percentage_paid: f64 = if total_attempted_transactions_count == 0 { + 0.0 + } else { + (already_paid_count + successful_transactions_count) as f64 + / total_attempted_transactions_count as f64 + }; + + let table_values = vec![ + debt_collection_results.dz_epoch.to_string(), + format!( + "{:.9} SOL", + debt_collection_results.total_paid as f64 * 1e-9 + ), + format!( + "{:.9} SOL", + (debt_collection_results.total_debt - debt_collection_results.total_paid) as f64 * 1e-9 + ), + format!( + "{:.9} SOL", + debt_collection_results.total_debt as f64 * 1e-9 + ), + format!("{:.2}%", percentage_paid * 100.0), + total_attempted_transactions_count.to_string(), + successful_transactions_count.to_string(), + debt_collection_results.insufficient_funds_count.to_string(), + already_paid_count.to_string(), + ]; + + slack_notifier::validator_debt::post_to_slack( + filepath, + &client, + header, + table_header, + table_values, + ) + .await?; + + Ok(()) +} + +async fn create_or_validate_ledger_record( + solana_debt_calculator: &impl ValidatorRewards, + transaction: &Transaction, + new_computed_debt: ComputedSolanaValidatorDebts, + dz_epoch: u64, + recent_blockhash: solana_sdk::hash::Hash, +) -> Result { + let record_result = ledger::try_fetch_debt_record( + solana_debt_calculator.ledger_rpc_client(), + &transaction.signer.pubkey(), + dz_epoch, + solana_debt_calculator.ledger_commitment_config(), + ) + .await; + + match record_result { + Ok((_, existing_computed_debt)) => { + if existing_computed_debt.blockhash == new_computed_debt.blockhash { + bail!( + "retrieved record blockhash {} is equal to created record blockhash {}", + &existing_computed_debt.blockhash, + &new_computed_debt.blockhash + ); + } + + if transaction.force { + ledger::create_record_on_ledger( + solana_debt_calculator.ledger_rpc_client(), + recent_blockhash, + &transaction.signer, + &new_computed_debt, + solana_debt_calculator.ledger_commitment_config(), + &[ + ComputedSolanaValidatorDebts::RECORD_SEED_PREFIX, + &dz_epoch.to_le_bytes(), + ], + ) + .await?; + tracing::warn!( + "DZ Ledger record does not match the new computed solana validator debt and has been overwritten" + ); + } else { + ensure!( + existing_computed_debt.debts == new_computed_debt.debts, + "Existing computed debt does not match new computed debt" + ) + }; + + tracing::warn!( + "Computed debt and deserialized ledger record data are identical, proceeding to write transaction" + ); + Ok(existing_computed_debt) + } + Err(_err) => { + // create record + tracing::info!("Creating a new record on DZ ledger"); + ledger::create_record_on_ledger( + solana_debt_calculator.ledger_rpc_client(), + recent_blockhash, + &transaction.signer, + &new_computed_debt, + solana_debt_calculator.ledger_commitment_config(), + &[ + ComputedSolanaValidatorDebts::RECORD_SEED_PREFIX, + &dz_epoch.to_le_bytes(), + ], + ) + .await?; + bail!("new record created; shutting down until the next check") + } + } +} + +async fn try_initialize_missing_deposit_accounts( + wallet: &Wallet, + computed_debt: &ComputedSolanaValidatorDebts, +) -> Result<()> { + let wallet_key = wallet.pubkey(); + + let node_ids = computed_debt + .debts + .iter() + .map(|debt| debt.node_id) + .collect::>(); + + let mut uninitialized_items = Vec::<(Pubkey, (Pubkey, u8))>::new(); + + for node_ids_chunk in node_ids.chunks(100) { + let deposit_keys_and_bumps = node_ids_chunk + .iter() + .map(SolanaValidatorDeposit::find_address) + .collect::>(); + let deposit_accounts = wallet + .connection + .get_multiple_accounts( + &deposit_keys_and_bumps + .iter() + .map(|(key, _)| key) + .copied() + .collect::>(), + ) + .await?; + + uninitialized_items.extend( + deposit_accounts + .iter() + .zip(deposit_keys_and_bumps) + .zip(node_ids_chunk.iter().copied()) + .filter_map(|((account, deposit_key_and_bump), node_id)| { + if account.is_none() { + Some((node_id, deposit_key_and_bump)) + } else { + None + } + }), + ); + } + + for uninitialized_items_chunk in uninitialized_items.chunks(16) { + let mut instructions = Vec::new(); + let mut compute_unit_limit = 5_000; + + for (node_id, (deposit_key, bump)) in uninitialized_items_chunk { + let ix = try_build_instruction( + &ID, + InitializeSolanaValidatorDepositAccounts { + new_solana_validator_deposit_key: *deposit_key, + payer_key: wallet_key, + }, + &RevenueDistributionInstructionData::InitializeSolanaValidatorDeposit(*node_id), + )?; + instructions.push(ix); + compute_unit_limit += 10_000 + Wallet::compute_units_for_bump_seed(*bump); + } + + instructions.push(ComputeBudgetInstruction::set_compute_unit_limit( + compute_unit_limit, + )); + + if let Some(ref compute_unit_price_ix) = wallet.compute_unit_price_ix { + instructions.push(compute_unit_price_ix.clone()); + } + + let transaction = wallet.new_transaction(&instructions).await?; + let tx_sig = wallet.send_or_simulate_transaction(&transaction).await?; + + if let TransactionOutcome::Executed(tx_sig) = tx_sig { + tracing::info!("Initialize Solana validator deposits: {tx_sig}"); + } + } + + Ok(()) +} diff --git a/offchain/crates/validator-debt/src/worker/pause_gate.rs b/offchain/crates/validator-debt/src/worker/pause_gate.rs new file mode 100644 index 0000000000..ae33963e63 --- /dev/null +++ b/offchain/crates/validator-debt/src/worker/pause_gate.rs @@ -0,0 +1,98 @@ +use std::sync::atomic::{AtomicBool, Ordering}; + +use doublezero_solana_sdk::revenue_distribution::state::ProgramConfig; + +/// Tracks whether we've already seen the paused state (to avoid WARN spam). +static WAS_PAUSED: AtomicBool = AtomicBool::new(false); + +/// Check if the Revenue Distribution program is paused. +/// Returns `true` if paused (caller should bail with `Ok`), `false` otherwise. +pub fn is_config_paused(config: &ProgramConfig) -> bool { + let paused = config.is_paused(); + + if paused { + let was_previously_paused = WAS_PAUSED.swap(true, Ordering::SeqCst); + if !was_previously_paused { + tracing::warn!( + "Revenue Distribution program is PAUSED. Skipping validator debt operations." + ); + } else { + tracing::debug!( + "Revenue Distribution program is still paused. Skipping validator debt operations." + ); + } + } else { + let was_previously_paused = WAS_PAUSED.swap(false, Ordering::SeqCst); + if was_previously_paused { + tracing::info!( + "Revenue Distribution program has RESUMED. Proceeding with validator debt operations." + ); + } + } + + paused +} + +#[cfg(test)] +mod tests { + use std::sync::Mutex; + + use super::*; + + /// Mutex to serialize tests that depend on the static WAS_PAUSED state. + /// This prevents test flakiness from parallel execution. + static TEST_MUTEX: Mutex<()> = Mutex::new(()); + + fn reset_pause_state() { + WAS_PAUSED.store(false, Ordering::SeqCst); + } + + #[test] + fn test_pause_transition_first_detection_triggers_warn_path() { + let _guard = TEST_MUTEX.lock().unwrap(); + reset_pause_state(); + + let mut config = ProgramConfig::default(); + config.set_is_paused(true); + + let result = is_config_paused(&config); + assert!(result); // paused = should skip + assert!(WAS_PAUSED.load(Ordering::SeqCst)); + } + + #[test] + fn test_pause_repeated_detection_does_not_retrigger() { + let _guard = TEST_MUTEX.lock().unwrap(); + reset_pause_state(); + + let mut config = ProgramConfig::default(); + config.set_is_paused(true); + + let _ = is_config_paused(&config); + assert!(WAS_PAUSED.load(Ordering::SeqCst)); + + let was_before = WAS_PAUSED.load(Ordering::SeqCst); + let result = is_config_paused(&config); + assert!(result); // still paused + assert_eq!(was_before, WAS_PAUSED.load(Ordering::SeqCst)); // unchanged + } + + #[test] + fn test_resume_transition_flips_state() { + let _guard = TEST_MUTEX.lock().unwrap(); + reset_pause_state(); + + let mut paused_config = ProgramConfig::default(); + paused_config.set_is_paused(true); + + let _ = is_config_paused(&paused_config); + assert!(WAS_PAUSED.load(Ordering::SeqCst)); + + let mut unpaused_config = ProgramConfig::default(); + unpaused_config.set_is_paused(false); + + let result = is_config_paused(&unpaused_config); + assert!(!result); // not paused = proceed + assert!(!WAS_PAUSED.load(Ordering::SeqCst)); // state is now false + } +} diff --git a/offchain/crates/validator-debt/src/worker/slack_report.rs b/offchain/crates/validator-debt/src/worker/slack_report.rs new file mode 100644 index 0000000000..f04baf0013 --- /dev/null +++ b/offchain/crates/validator-debt/src/worker/slack_report.rs @@ -0,0 +1,199 @@ +use crate::transaction::DebtCollectionResults; + +/// Summary struct used in tests to verify summary calculations. +#[allow(dead_code)] +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct DebtCollectionSummary { + pub total_paid: u64, + pub total_debt: u64, + pub insufficient_funds_count: usize, + pub visible_epoch_count: usize, +} + +#[allow(dead_code)] +impl DebtCollectionSummary { + /// Outstanding debt = total_debt - total_paid + pub fn total_outstanding(&self) -> u64 { + self.total_debt.saturating_sub(self.total_paid) + } + + pub fn percentage_paid(&self) -> f64 { + if self.total_debt == 0 { + 0.0 + } else { + self.total_paid as f64 / self.total_debt as f64 + } + } +} + +/// Determines if a debt collection result should be displayed as a row in Slack. +/// +/// A row is visible if: +/// - `total_validators > 0` +/// - `successful_transactions_count > 0` +/// +/// Epochs that don't meet these criteria are skipped in the table display. +#[inline] +pub fn is_row_visible(dcr: &DebtCollectionResults) -> bool { + dcr.total_validators > 0 && dcr.successful_transactions_count > 0 +} + +/// Filters debt collection results to only those that will be displayed in Slack. +pub fn visible_rows(results: &[DebtCollectionResults]) -> Vec<&DebtCollectionResults> { + results.iter().filter(|dcr| is_row_visible(dcr)).collect() +} + +#[allow(dead_code)] +pub fn compute_summary(results: &[&DebtCollectionResults]) -> DebtCollectionSummary { + let mut summary = DebtCollectionSummary::default(); + + for dcr in results { + summary.total_paid += dcr.total_paid; + summary.total_debt += dcr.total_debt; + summary.insufficient_funds_count += dcr.insufficient_funds_count; + } + summary.visible_epoch_count = results.len(); + + summary +} + +/// filter to visible rows and compute summary in one step. +#[allow(dead_code)] +pub fn compute_visible_summary(results: &[DebtCollectionResults]) -> DebtCollectionSummary { + let visible = visible_rows(results); + compute_summary(&visible) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn make_result( + dz_epoch: u64, + total_validators: usize, + successful_transactions_count: usize, + total_debt: u64, + total_paid: u64, + insufficient_funds_count: usize, + ) -> DebtCollectionResults { + DebtCollectionResults { + collection_results: vec![], + dz_epoch, + successful_transactions_count, + insufficient_funds_count, + already_paid_count: 0, + total_debt, + total_paid, + already_paid: 0, + total_validators, + } + } + + #[test] + fn test_is_row_visible_with_activity() { + let dcr = make_result(1, 10, 5, 1000, 500, 0); + assert!(is_row_visible(&dcr)); + } + + #[test] + fn test_is_row_visible_no_validators() { + let dcr = make_result(1, 0, 0, 0, 0, 0); + assert!(!is_row_visible(&dcr)); + } + + #[test] + fn test_is_row_visible_no_successful_transactions() { + let dcr = make_result(1, 10, 0, 1000, 0, 5); + assert!(!is_row_visible(&dcr)); + } + + #[test] + fn test_visible_rows_filters_correctly() { + let results = vec![ + make_result(1, 10, 5, 1000, 500, 0), // visible + make_result(2, 0, 0, 0, 0, 0), // hidden: no validators + make_result(3, 5, 0, 500, 0, 2), // hidden: no successful tx + make_result(4, 8, 3, 800, 300, 1), // visible + ]; + + let visible = visible_rows(&results); + assert_eq!(visible.len(), 2); + assert_eq!(visible[0].dz_epoch, 1); + assert_eq!(visible[1].dz_epoch, 4); + } + + #[test] + fn test_compute_visible_summary_filters_correctly() { + let results = vec![ + make_result(1, 10, 5, 1_000_000_000, 500_000_000, 1), + make_result(2, 0, 0, 2_000_000_000, 0, 0), // hidden + make_result(3, 5, 0, 3_000_000_000, 0, 10), // hidden + make_result(4, 8, 3, 800_000_000, 300_000_000, 2), + ]; + + let summary = compute_visible_summary(&results); + + // compute_visible_summary only counts visible epochs (1 and 4) + assert_eq!(summary.visible_epoch_count, 2); + assert_eq!(summary.total_debt, 1_000_000_000 + 800_000_000); + assert_eq!(summary.total_paid, 500_000_000 + 300_000_000); + assert_eq!(summary.insufficient_funds_count, 1 + 2); + } + + #[test] + fn test_compute_summary_sums_all_passed_rows() { + // compute_summary does NO filtering - it sums whatever is passed in + let results = [ + make_result(1, 10, 5, 1_000_000_000, 500_000_000, 1), + make_result(2, 0, 0, 2_000_000_000, 0, 0), + make_result(3, 5, 0, 3_000_000_000, 0, 10), + make_result(4, 8, 3, 800_000_000, 300_000_000, 2), + ]; + + let refs: Vec<&DebtCollectionResults> = results.iter().collect(); + let summary = compute_summary(&refs); + + // All 4 epochs should be summed + assert_eq!(summary.visible_epoch_count, 4); + assert_eq!( + summary.total_debt, + 1_000_000_000 + 2_000_000_000 + 3_000_000_000 + 800_000_000 + ); + assert_eq!(summary.total_paid, 500_000_000 + 300_000_000); + assert_eq!(summary.insufficient_funds_count, 13); // 1 + 0 + 10 + 2 + } + + #[test] + fn test_summary_outstanding_calculation() { + let results = vec![make_result(1, 10, 5, 1000, 400, 0)]; + let summary = compute_visible_summary(&results); + + assert_eq!(summary.total_outstanding(), 600); + } + + #[test] + fn test_summary_percentage_paid() { + let results = vec![make_result(1, 10, 5, 1000, 250, 0)]; + let summary = compute_visible_summary(&results); + + assert!((summary.percentage_paid() - 0.25).abs() < 0.0001); + } + + #[test] + fn test_summary_percentage_paid_zero_debt() { + let results = vec![make_result(1, 10, 5, 0, 0, 0)]; + let summary = compute_visible_summary(&results); + + assert_eq!(summary.percentage_paid(), 0.0); + } + + #[test] + fn test_empty_results() { + let results: Vec = vec![]; + let summary = compute_visible_summary(&results); + + assert_eq!(summary.visible_epoch_count, 0); + assert_eq!(summary.total_debt, 0); + assert_eq!(summary.total_paid, 0); + } +} diff --git a/offchain/docs/audits/adevar_audit_sentinel_202510.pdf b/offchain/docs/audits/adevar_audit_sentinel_202510.pdf new file mode 100644 index 0000000000..f179f6370e Binary files /dev/null and b/offchain/docs/audits/adevar_audit_sentinel_202510.pdf differ diff --git a/offchain/docs/audits/ottersec_audit_sentinel_202510.pdf b/offchain/docs/audits/ottersec_audit_sentinel_202510.pdf new file mode 100644 index 0000000000..c1a16916da Binary files /dev/null and b/offchain/docs/audits/ottersec_audit_sentinel_202510.pdf differ diff --git a/offchain/release/.goreleaser.contributor-rewards.yaml b/offchain/release/.goreleaser.contributor-rewards.yaml new file mode 100644 index 0000000000..68230df70a --- /dev/null +++ b/offchain/release/.goreleaser.contributor-rewards.yaml @@ -0,0 +1,108 @@ +# yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json +# vim: set ts=2 sw=2 tw=0 fo=cnqoj + +version: 2 + +project_name: doublezero-contributor-rewards + +monorepo: + tag_prefix: contributor-rewards/ + +builds: + - id: doublezero-contributor-rewards + binary: doublezero-contributor-rewards + builder: rust + tool: cargo + command: build + flags: + - --package=doublezero-contributor-rewards + - --release + targets: + - x86_64-unknown-linux-musl + env: + - CC_x86_64_unknown_linux_musl=musl-gcc + - CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=musl-gcc + - BUILD_VERSION={{ .Version }} + - BUILD_COMMIT={{ .ShortCommit }} + - DATE={{ .Date }} + +archives: + - id: contributor_rewards_archive + formats: ["tar.gz"] + ids: [doublezero-contributor-rewards] + # this name template makes the OS and Arch compatible with the results of `uname` + name_template: >- + {{ .ProjectName }}_ + {{- title .Os }}_ + {{- if eq .Arch "amd64" }}x86_64 + {{- else if eq .Arch "386" }}i386 + {{- else }}{{ .Arch }}{{ end }} + {{- if .Arm }}v{{ .Arm }}{{ end }} + +nfpms: + - id: doublezero-contributor-rewards + package_name: doublezero-contributor-rewards + ids: [doublezero-contributor-rewards] + vendor: doublezero + homepage: doublezero.xyz + maintainer: tech + description: |- + DoubleZero Contributor Rewards + license: Apache 2.0 + formats: + - deb + bindir: /usr/bin + release: "1" + section: default + contents: + - src: release/packaging/systemd/doublezero-contributor-rewards.service + dst: /lib/systemd/system/doublezero-contributor-rewards.service + type: config + overrides: + rpm: + contents: + - src: release/packaging/systemd/doublezero-contributor-rewards.service + dst: /usr/lib/systemd/system/doublezero-contributor-rewards.service + type: config + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + +release: + github: + owner: malbeclabs + name: doublezero-offchain + draft: false + replace_existing_artifacts: true + +announce: + slack: + enabled: true + message_template: "DoubleZero Contributor Rewards {{ .Tag }} has been released! Check it out at {{ .ReleaseURL }}" + channel: "#bots" + +git: + ignore_tags: + - contributor-rewards/daily + +nightly: + publish_release: true + keep_single_release: true + version_template: "{{ incpatch .Version }}~git{{ .Env.BUILD_DATE }}.{{ .ShortCommit }}" + tag_name: "contributor-rewards/daily" + +cloudsmiths: + - organization: malbeclabs + repository: doublezero + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" + - organization: malbeclabs + repository: doublezero-testnet + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" diff --git a/offchain/release/.goreleaser.doublezero-offchain-scheduler.yaml b/offchain/release/.goreleaser.doublezero-offchain-scheduler.yaml new file mode 100644 index 0000000000..e3ccac9d21 --- /dev/null +++ b/offchain/release/.goreleaser.doublezero-offchain-scheduler.yaml @@ -0,0 +1,114 @@ +# yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json +# vim: set ts=2 sw=2 tw=0 fo=cnqoj + +version: 2 + +project_name: doublezero-offchain-scheduler + +monorepo: + tag_prefix: offchain-scheduler/ + +builds: + - id: doublezero-offchain-scheduler + binary: doublezero-offchain-scheduler + builder: prebuilt + goos: + - linux + goarch: + - amd64 + env: + - MIX_ENV=prod + - CARGO_TERM_VERBOSE=true + hooks: + pre: + - cmd: echo $MIX_ENV + - cmd: mix deps.clean --all + dir: scheduler + - cmd: mix deps.get --only prod + dir: scheduler + - cmd: mix compile --warnings-as-errors --verbose + dir: scheduler + - cmd: mix release + dir: scheduler + prebuilt: + path: ./scheduler/_build/prod/rel/scheduler/bin/scheduler + +archives: + - id: doublezero_offchain_scheduler_archive + formats: ["tar.gz"] + ids: [doublezero-offchain-scheduler] + # this name template makes the OS and Arch compatible with the results of `uname` + name_template: >- + {{ .ProjectName }}_ + {{- title .Os }}_ + {{- if eq .Arch "amd64" }}x86_64 + {{- else if eq .Arch "386" }}i386 + {{- else }}{{ .Arch }}{{ end }} + {{- if .Arm }}v{{ .Arm }}{{ end }} + +nfpms: + - id: doublezero-offchain-scheduler + package_name: doublezero-offchain-scheduler + meta: true + vendor: doublezero + homepage: doublezero.xyz + maintainer: tech + description: |- + DoubleZero Offchain Scheduler + license: Apache 2.0 + formats: + - deb + release: 1 + section: default + contents: + - src: release/packaging/systemd/doublezero-offchain-scheduler.service + dst: /lib/systemd/system/doublezero-offchain-scheduler.service + type: config + - src: scheduler/_build/prod/rel/scheduler + dst: /opt/doublezero-offchain-scheduler + type: tree + - src: /opt/doublezero-offchain-scheduler/bin/scheduler + dst: /usr/bin/doublezero-offchain-scheduler + type: symlink + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + +release: + github: + owner: malbeclabs + name: doublezero-offchain + draft: false + replace_existing_artifacts: true + +announce: + slack: + enabled: true + message_template: "DoubleZero Offchain Scheduler {{ .Tag }} has been released! Check it out at {{ .ReleaseURL }}" + channel: "#bots" + +git: + ignore_tags: + - offchain-scheduler/daily + +nightly: + publish_release: true + keep_single_release: true + version_template: "{{ incpatch .Version }}~git{{ .Env.BUILD_DATE }}.{{ .ShortCommit }}" + tag_name: "offchain-scheduler/daily" + +cloudsmiths: + - organization: malbeclabs + repository: doublezero + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" + - organization: malbeclabs + repository: doublezero-testnet + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" diff --git a/offchain/release/.goreleaser.doublezero-solana-cli.yaml b/offchain/release/.goreleaser.doublezero-solana-cli.yaml new file mode 100644 index 0000000000..44b6fc7c91 --- /dev/null +++ b/offchain/release/.goreleaser.doublezero-solana-cli.yaml @@ -0,0 +1,100 @@ +# yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json +# vim: set ts=2 sw=2 tw=0 fo=cnqoj + +version: 2 + +project_name: doublezero-solana + +monorepo: + tag_prefix: doublezero-solana/ + +builds: + - id: doublezero-solana + binary: doublezero-solana + builder: rust + tool: cargo + command: build + flags: + - --package=doublezero-solana-cli + - --release + targets: + - x86_64-unknown-linux-musl + env: + - CC_x86_64_unknown_linux_musl=musl-gcc + - CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=musl-gcc + - BUILD_VERSION={{ .Version }} + - BUILD_COMMIT={{ .ShortCommit }} + - DATE={{ .Date }} + +archives: + - id: doublezero_solana_archive + formats: ["tar.gz"] + ids: [doublezero-solana] + # this name template makes the OS and Arch compatible with the results of `uname` + name_template: >- + {{ .ProjectName }}_ + {{- title .Os }}_ + {{- if eq .Arch "amd64" }}x86_64 + {{- else if eq .Arch "386" }}i386 + {{- else }}{{ .Arch }}{{ end }} + {{- if .Arm }}v{{ .Arm }}{{ end }} + +nfpms: + - id: doublezero-solana + package_name: doublezero-solana + ids: [doublezero-solana] + vendor: doublezero + homepage: doublezero.xyz + maintainer: tech + description: |- + DoubleZero Solana CLI + license: Apache 2.0 + formats: + - deb + - rpm + bindir: /usr/bin + release: "1" + section: default + # NOTE: doublezero-solana-cli is not required to be a systemd service + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + +release: + github: + owner: malbeclabs + name: doublezero-offchain + draft: false + replace_existing_artifacts: true + +announce: + slack: + enabled: true + message_template: "DoubleZero Solana CLI {{ .Tag }} has been released! Check it out at {{ .ReleaseURL }}" + channel: "#bots" + +git: + ignore_tags: + - doublezero-solana/daily + +nightly: + publish_release: true + keep_single_release: true + version_template: "{{ incpatch .Version }}~git{{ .Env.BUILD_DATE }}.{{ .ShortCommit }}" + tag_name: "doublezero-solana/daily" + +cloudsmiths: + - organization: malbeclabs + repository: doublezero + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" + - organization: malbeclabs + repository: doublezero-testnet + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" diff --git a/offchain/release/.goreleaser.doublezero-solana-validator-debt.yaml b/offchain/release/.goreleaser.doublezero-solana-validator-debt.yaml new file mode 100644 index 0000000000..125278f9ed --- /dev/null +++ b/offchain/release/.goreleaser.doublezero-solana-validator-debt.yaml @@ -0,0 +1,108 @@ +# yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json +# vim: set ts=2 sw=2 tw=0 fo=cnqoj + +version: 2 + +project_name: doublezero-solana-validator-debt + +monorepo: + tag_prefix: solana-validator-debt/ + +builds: + - id: doublezero-solana-validator-debt + binary: doublezero-solana-validator-debt + builder: rust + tool: cargo + command: build + flags: + - --package=doublezero-solana-validator-debt + - --release + targets: + - x86_64-unknown-linux-musl + env: + - CC_x86_64_unknown_linux_musl=musl-gcc + - CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=musl-gcc + - BUILD_VERSION={{ .Version }} + - BUILD_COMMIT={{ .ShortCommit }} + - DATE={{ .Date }} + +archives: + - id: doublezero_solana_validator_debt_archive + formats: ["tar.gz"] + ids: [doublezero-solana-validator-debt] + # this name template makes the OS and Arch compatible with the results of `uname` + name_template: >- + {{ .ProjectName }}_ + {{- title .Os }}_ + {{- if eq .Arch "amd64" }}x86_64 + {{- else if eq .Arch "386" }}i386 + {{- else }}{{ .Arch }}{{ end }} + {{- if .Arm }}v{{ .Arm }}{{ end }} + +nfpms: + - id: doublezero-solana-validator-debt + package_name: doublezero-solana-validator-debt + ids: [doublezero-solana-validator-debt] + vendor: doublezero + homepage: doublezero.xyz + maintainer: tech + description: |- + DoubleZero Solana Validator Debt + license: Apache 2.0 + formats: + - deb + bindir: /usr/bin + release: 1 + section: default + contents: + - src: release/packaging/systemd/doublezero-solana-validator-debt.service + dst: /lib/systemd/system/doublezero-solana-validator-debt.service + type: config + overrides: + rpm: + contents: + - src: release/packaging/systemd/doublezero-solana-validator-debt.service + dst: /usr/lib/systemd/system/doublezero-solana-validator-debt.service + type: config + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + +release: + github: + owner: malbeclabs + name: doublezero-offchain + draft: false + replace_existing_artifacts: true + +announce: + slack: + enabled: true + message_template: "DoubleZero Solana Validator Debt {{ .Tag }} has been released! Check it out at {{ .ReleaseURL }}" + channel: "#bots" + +git: + ignore_tags: + - solana-validator-debt/daily + +nightly: + publish_release: true + keep_single_release: true + version_template: "{{ incpatch .Version }}~git{{ .Env.BUILD_DATE }}.{{ .ShortCommit }}" + tag_name: "solana-validator-debt/daily" + +cloudsmiths: + - organization: malbeclabs + repository: doublezero + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" + - organization: malbeclabs + repository: doublezero-testnet + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" diff --git a/offchain/release/.goreleaser.sentinel.yaml b/offchain/release/.goreleaser.sentinel.yaml new file mode 100644 index 0000000000..d07fa68902 --- /dev/null +++ b/offchain/release/.goreleaser.sentinel.yaml @@ -0,0 +1,113 @@ +# yaml-language-server: $schema=https://goreleaser.com/static/schema-pro.json +# vim: set ts=2 sw=2 tw=0 fo=cnqoj + +version: 2 + +project_name: doublezero-sentinel + +monorepo: + tag_prefix: sentinel/ + +builds: + - id: doublezero-sentinel + binary: doublezero-sentinel + builder: rust + tool: cargo + command: build + flags: + - --package=doublezero-ledger-sentinel + - --release + targets: + - x86_64-unknown-linux-musl + env: + - CC_x86_64_unknown_linux_musl=musl-gcc + - CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=musl-gcc + - BUILD_VERSION={{ .Version }} + - BUILD_COMMIT={{ .ShortCommit }} + - DATE={{ .Date }} + +archives: + - id: sentinel_archive + formats: ['tar.gz'] + ids: [sentinel] + # this name template makes the OS and Arch compatible with the results of `uname` + name_template: >- + {{ .ProjectName }}_ + {{- title .Os }}_ + {{- if eq .Arch "amd64" }}x86_64 + {{- else if eq .Arch "386" }}i386 + {{- else }}{{ .Arch }}{{ end }} + {{- if .Arm }}v{{ .Arm }}{{ end }} + +nfpms: + - id: doublezero-sentinel + package_name: doublezero-sentinel + ids: [doublezero-sentinel] + vendor: doublezero + homepage: doublezero.xyz + maintainer: tech + description: |- + DoubleZero Sentinel + license: Apache 2.0 + formats: + - deb + bindir: /usr/bin + release: 1 + section: default + contents: + - src: release/packaging/systemd/doublezero-sentinel.service + dst: /lib/systemd/system/doublezero-sentinel.service + type: config + overrides: + rpm: + contents: + - src: release/packaging/systemd/doublezero-sentinel.service + dst: /usr/lib/systemd/system/doublezero-sentinel.service + type: config + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + +release: + github: + owner: malbeclabs + name: doublezero-offchain + draft: false + replace_existing_artifacts: true + +announce: + slack: + enabled: true + message_template: "DoubleZero Sentinel {{ .Tag }} has been released! Check it out at {{ .ReleaseURL }}" + channel: "#bots" + +git: + ignore_tags: + - sentinel/daily + +nightly: + publish_release: true + keep_single_release: true + version_template: '{{ incpatch .Version }}~git{{ .Env.BUILD_DATE }}.{{ .ShortCommit }}' + tag_name: 'sentinel/daily' + +cloudsmiths: + - organization: malbeclabs + repository: doublezero + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" + - organization: malbeclabs + repository: doublezero-testnet + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" + - organization: malbeclabs + repository: doublezero-devnet + distributions: + deb: "any-distro/any-version" + rpm: "any-distro/any-version" diff --git a/offchain/release/Dockerfile.release b/offchain/release/Dockerfile.release new file mode 100644 index 0000000000..c34966903f --- /dev/null +++ b/offchain/release/Dockerfile.release @@ -0,0 +1,13 @@ +# The base tag supplies rustup and system deps; rust-toolchain.toml pins the +# toolchain that actually builds releases (rustup fetches it on first use). +FROM rust:1.94.0 + +RUN apt-get update -qq \ + && apt-get install -y -qq rpm musl-tools cmake > /dev/null 2>&1 \ + && echo "deb [trusted=yes] https://repo.goreleaser.com/apt/ /" \ + > /etc/apt/sources.list.d/goreleaser.list \ + && apt-get update -qq \ + && apt-get install -y -qq goreleaser-pro=2.14.3 > /dev/null 2>&1 \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /workspace diff --git a/offchain/release/packaging/systemd/doublezero-contributor-rewards.service b/offchain/release/packaging/systemd/doublezero-contributor-rewards.service new file mode 100644 index 0000000000..8cdfd522d9 --- /dev/null +++ b/offchain/release/packaging/systemd/doublezero-contributor-rewards.service @@ -0,0 +1,18 @@ +# NOTE: This is a placeholder unit. +# It will NOT start the monitor with correct runtime flags. +# Expected: Ansible will manage an override file at: +# /etc/systemd/system/doublezero-contributor-rewards.service.d/override.conf +# which will set the real ExecStart and options. + +[Unit] +Description=DoubleZero Contributor Rewards +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +ExecStart=/usr/bin/doublezero-contributor-rewards +Restart=on-failure + +[Install] +WantedBy=multi-user.target diff --git a/offchain/release/packaging/systemd/doublezero-offchain-scheduler.service b/offchain/release/packaging/systemd/doublezero-offchain-scheduler.service new file mode 100644 index 0000000000..b906a541c0 --- /dev/null +++ b/offchain/release/packaging/systemd/doublezero-offchain-scheduler.service @@ -0,0 +1,18 @@ +# NOTE: This is a placeholder unit. +# It will NOT start the monitor with correct runtime flags. +# Expected: Ansible will manage an override file at: +# /etc/systemd/system/doublezero-offchain-scheduler.service.d/override.conf +# which will set the real ExecStart and options. + +[Unit] +Description=DoubleZero Offchain Scheduler +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +ExecStart=/usr/bin/doublezero-offchain-scheduler +Restart=on-failure + +[Install] +WantedBy=multi-user.target diff --git a/offchain/release/packaging/systemd/doublezero-sentinel.service b/offchain/release/packaging/systemd/doublezero-sentinel.service new file mode 100644 index 0000000000..550c745d8a --- /dev/null +++ b/offchain/release/packaging/systemd/doublezero-sentinel.service @@ -0,0 +1,18 @@ +# NOTE: This is a placeholder unit. +# It will NOT start the monitor with correct runtime flags. +# Expected: Ansible will manage an override file at: +# /etc/systemd/system/doublezero-sentinel.service.d/override.conf +# which will set the real ExecStart and options. + +[Unit] +Description=DoubleZero Sentinel +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +ExecStart=/usr/bin/doublezero-sentinel +Restart=on-failure + +[Install] +WantedBy=multi-user.target diff --git a/offchain/release/packaging/systemd/doublezero-solana-validator-debt.service b/offchain/release/packaging/systemd/doublezero-solana-validator-debt.service new file mode 100644 index 0000000000..20528b6e50 --- /dev/null +++ b/offchain/release/packaging/systemd/doublezero-solana-validator-debt.service @@ -0,0 +1,18 @@ +# NOTE: This is a placeholder unit. +# It will NOT start the monitor with correct runtime flags. +# Expected: Ansible will manage an override file at: +# /etc/systemd/system/doublezero-solana-validator-debt.service.d/override.conf +# which will set the real ExecStart and options. + +[Unit] +Description=DoubleZero Solana Validator Debt +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +ExecStart=/usr/bin/doublezero-solana-validator-debt +Restart=on-failure + +[Install] +WantedBy=multi-user.target diff --git a/offchain/rust-toolchain.toml b/offchain/rust-toolchain.toml new file mode 100644 index 0000000000..7b10c8fb65 --- /dev/null +++ b/offchain/rust-toolchain.toml @@ -0,0 +1,6 @@ +[toolchain] +channel = "1.92.0" +components = ["clippy", "rust-analyzer", "rustfmt"] +# The CLI and daemons release as static musl binaries; provision the target +# everywhere (CI, the release container, local dev) via rustup. +targets = ["x86_64-unknown-linux-musl"] diff --git a/offchain/scheduler/.formatter.exs b/offchain/scheduler/.formatter.exs new file mode 100644 index 0000000000..d2cda26edd --- /dev/null +++ b/offchain/scheduler/.formatter.exs @@ -0,0 +1,4 @@ +# Used by "mix format" +[ + inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] +] diff --git a/offchain/scheduler/.gitignore b/offchain/scheduler/.gitignore new file mode 100644 index 0000000000..1080a96add --- /dev/null +++ b/offchain/scheduler/.gitignore @@ -0,0 +1,27 @@ +# The directory Mix will write compiled artifacts to. +/_build/ + +# If you run "mix test --cover", coverage assets end up here. +/cover/ + +# The directory Mix downloads your dependencies sources to. +/deps/ + +# Where third-party dependencies like ExDoc output generated docs. +/doc/ + +# If the VM crashes, it generates a dump, let's ignore it too. +erl_crash.dump + +# Also ignore archive artifacts (built via "mix archive.build"). +*.ez + +# Ignore package tarball (built via "mix hex.build"). +scheduler-*.tar + +# Temporary files, for example, from tests. +/tmp/ + +# Rust binary artifacts +/target/ +/priv/native \ No newline at end of file diff --git a/offchain/scheduler/CHANGELOG.md b/offchain/scheduler/CHANGELOG.md new file mode 100644 index 0000000000..53a13ffc55 --- /dev/null +++ b/offchain/scheduler/CHANGELOG.md @@ -0,0 +1,51 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [v0.1.10](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/offchain-scheduler/v0.1.10) - 2026-02-19 +- result from calculate_distribution_returns value only, not ok tuple ([#270](https://github.com/doublezerofoundation/doublezero-offchain/pull/270)) + +## [v0.1.9](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/offchain-scheduler/v0.1.9) - 2026-02-12 +- ensure debt is finalized before collection ([#268](https://github.com/doublezerofoundation/doublezero-offchain/pull/268)) + +## [v0.1.8](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/offchain-scheduler/v0.1.8) - 2026-02-12 + +- remove dz_ledger as argument ([#255](https://github.com/doublezerofoundation/doublezero-offchain/pull/255)) + +## [v0.1.7](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/offchain-scheduler/v0.1.7) - 2026-01-14 + +- use vote key from past ([#250](https://github.com/doublezerofoundation/doublezero-offchain/pull/250)) +- add check and filter for 0 total debt messages posted to slack ([#247](https://github.com/doublezerofoundation/doublezero-offchain/pull/247)) + +## [v0.1.6](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/offchain-scheduler/v0.1.6) - 2026-01-12 + +- finalize zero debt ([#248](https://github.com/doublezerofoundation/doublezero-offchain/pull/248)) +- filter out epochs with no successful debt collection ([#246](https://github.com/doublezerofoundation/doublezero-offchain/pull/246)) + +## [v0.1.5](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/offchain-scheduler/v0.1.5) - 2026-01-08 + +- shutdown `:normal` after successful distribution initialized ([#245](https://github.com/doublezerofoundation/doublezero-offchain/pull/245)) +- add compute unit price handling for wallet ([#243](https://github.com/doublezerofoundation/doublezero-offchain/pull/243)) +- update return value from pay_debt command, add pay_debt_for_all_epochs, use :normal exit for GenServer ([#228](https://github.com/doublezerofoundation/doublezero-offchain/pull/228)) +- remove unnecessary private functions in lib.rs ([#238](https://github.com/doublezerofoundation/doublezero-offchain/pull/238)) +- update `initialize_distribution` call ([#237](https://github.com/doublezerofoundation/doublezero-offchain/pull/237)) + +## [v0.1.4](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/offchain-scheduler/v0.1.4) + +- inline initialize distribution call and remove ledger RPC argument ([#225](https://github.com/doublezerofoundation/doublezero-offchain/pull/225)) +- add prom metrics collector and instrument a few critical functions as well as add a `health_check` endpoint ([#207](https://github.com/doublezerofoundation/doublezero-offchain/pull/207)) +- summarize debt for each epoch and then for all epochs ([#218](https://github.com/doublezerofoundation/doublezero-offchain/pull/218)) + +## [v0.1.3](https://github.com/doublezerofoundation/doublezero-offchain/releases/tag/offchain-scheduler/v0.1.3) + +- add deploy steps through actions and goreleaser ([#205](https://github.com/doublezerofoundation/doublezero-offchain/pull/205)) +- update calculate distribution GenServer to finalize distribution through a Rust NIF ([#200](https://github.com/doublezerofoundation/doublezero-offchain/pull/200)) +- add GenServer and Rust NIF to automatically calculate a distribution on a configurable interval ([#199](https://github.com/doublezerofoundation/doublezero-offchain/pull/199)) +- add GenServer and Rust NIF to automatically initialize a distribution on a configurable interval ([#197](https://github.com/doublezerofoundation/doublezero-offchain/pull/197)) +- add GenServer and Rust NIF to automatically collect debt on a configurable interval ([#183](https://github.com/doublezerofoundation/doublezero-offchain/pull/183)) +- add Elixir app that manages scheduling and executing Rust processes for debt collection and payment ([#183](https://github.com/doublezerofoundation/doublezero-offchain/pull/183)) diff --git a/offchain/scheduler/README.md b/offchain/scheduler/README.md new file mode 100644 index 0000000000..f178b92f85 --- /dev/null +++ b/offchain/scheduler/README.md @@ -0,0 +1,74 @@ +# Scheduler + +Scheduler is an Elixir application designed to automate and manage the lifecycle of debts within a financial system. It schedules, tracks, and processes various stages of debt management, such as creation, payment reminders, overdue notifications, and closure. The scheduler ensures that all debt-related events are handled in a timely and reliable manner, reducing manual intervention and improving operational efficiency. + +## How It Works + +The scheduler operates by periodically checking the status of debts and triggering appropriate actions based on predefined rules and schedules. For example, it can send reminders before payment due dates, escalate overdue debts, and mark debts as resolved once payments are completed. The system is designed to be extensible, allowing for the addition of new lifecycle events as business requirements evolve. + +## Running the Application + +To run the scheduler locally: + +1. Ensure you have Elixir installed. You can download it from [elixir-lang.org](https://elixir-lang.org/install.html). +2. Clone this repository and navigate to the project directory. +3. Install dependencies: + + ```sh + mix deps.get +## Installation + +If [available in Hex](https://hex.pm/docs/publish), the package can be installed +by adding `scheduler` to your list of dependencies in `mix.exs`: + +```elixir +def deps do + [ + {:scheduler, "~> 0.1.0"} + ] +end +``` + +To add additional supervised processes, there are two required changes: + +The first is updating `config.exs` with the cron-like syntax of how often the process will be run and then the Module, Function, Arity (MFA) format. Since the workers are almost certainly GenServers, they will follow this format - +`{"some interval", {WorkerModuleName, :start_link, []}}`. The Module is `WorkerModuleName`, the function is `start_link` and the arity is an empty list `[]`. + +The second is creating a worker in the `worker` subdirectory. Using the GenServer behaviour (interface), it's trivial to fill out the details: + +```elixir +defmodule Scheduler.Worker.PayDebt do + use GenServer + + require Logger + + def start_link(_var \\ []) do + # state = %{} whatever startup state + GenServer.start_link(__MODULE__, state, name: __MODULE__) # this calls the `init/1` callback + end + + def init(state) do + # most likely you will want to have the GenServer automatically continue the loop with {:continue, _} as this example shows + {:ok, state, {:continue, :your_callback_name}} + end + + def handle_info(:info_name, state) do + # logic here + # here you can either do nothing with {:noreply, state} or continue the loop with `{:noreply, state, {:continue, :your_callback_name}} + {:noreply, state} + end + + ## this is a catch-all for unexpected messages and is standard practice + def handle_info(msg, state) do + Logger.warning("Received unexpected msg: #{msg}") + {:noreply, state} + end + + ## handle_continue/2 callbacks are called automatically triggered by the {:continue, _} tuple + def handle_continue(:your_callback_name, state) do + # logic goes here + # can call this in a loop or at some interval with Process.send_after/4 - `handle_info/2 receives the message from send_after + {:noreply, state} + end +end +``` \ No newline at end of file diff --git a/offchain/scheduler/config/config.exs b/offchain/scheduler/config/config.exs new file mode 100644 index 0000000000..94b80e3049 --- /dev/null +++ b/offchain/scheduler/config/config.exs @@ -0,0 +1,8 @@ +import Config + +config :scheduler, Scheduler.Scheduler, + jobs: [ + {"0 */2 * * *", {Scheduler.Worker.CollectAllDebt, :start_link, []}}, + {"*/2 * * * *", {Scheduler.Worker.InitializeDistribution, :start_link, []}}, + {"30 */2 * * *", {Scheduler.Worker.CalculateDistribution, :start_link, []}} + ] diff --git a/offchain/scheduler/config/dev.exs b/offchain/scheduler/config/dev.exs new file mode 100644 index 0000000000..a55f6ea02a --- /dev/null +++ b/offchain/scheduler/config/dev.exs @@ -0,0 +1,3 @@ +import Config + +config :logger, level: :debug diff --git a/offchain/scheduler/config/prod.exs b/offchain/scheduler/config/prod.exs new file mode 100644 index 0000000000..759af237df --- /dev/null +++ b/offchain/scheduler/config/prod.exs @@ -0,0 +1,7 @@ +import Config + +config :logger, level: :info + +config :scheduler, + plug_router_port: String.to_integer(System.get_env("SCHEDULER_HTTP_PORT", "4001")), + prometheus_endpoint: System.get_env("PROMETHEUS_ENDPOINT", "localhost") diff --git a/offchain/scheduler/config/runtime.exs b/offchain/scheduler/config/runtime.exs new file mode 100644 index 0000000000..5d1658bf0b --- /dev/null +++ b/offchain/scheduler/config/runtime.exs @@ -0,0 +1,15 @@ +import Config + +config :scheduler, + genesis_epoch: 31, + ledger_rpc: System.get_env("DZ_LEDGER_RPC"), + solana_rpc: System.get_env("SOLANA_RPC"), + prometheus_endpoint: System.get_env("PROMETHEUS_ENDPOINT", "localhost"), + plug_router_port: String.to_integer(System.get_env("SCHEDULER_HTTP_PORT", "4001")) + +config :scheduler, Scheduler.PromEx, + disabled: false, + manual_metrics_start_delay: :no_delay, + drop_metrics_groups: [], + grafana: :disabled, + metrics_server: :disabled diff --git a/offchain/scheduler/lib/scheduler/application.ex b/offchain/scheduler/lib/scheduler/application.ex new file mode 100644 index 0000000000..d127936e68 --- /dev/null +++ b/offchain/scheduler/lib/scheduler/application.ex @@ -0,0 +1,22 @@ +defmodule Scheduler.Application do + @moduledoc false + + use Application + + @impl true + def start(_type, _args) do + children = [ + Scheduler.PromEx, + {Plug.Cowboy, scheme: :http, plug: Scheduler.Router, options: [port: plug_router_port()]}, + Scheduler.Scheduler + ] + + opts = [strategy: :one_for_one, name: Scheduler.Supervisor] + Scheduler.DoubleZero.initialize_tracing_subscriber() + Supervisor.start_link(children, opts) + end + + def plug_router_port do + Application.get_env(:scheduler, :plug_router_port) + end +end diff --git a/offchain/scheduler/lib/scheduler/doublezero_nif.ex b/offchain/scheduler/lib/scheduler/doublezero_nif.ex new file mode 100644 index 0000000000..27d31e6c0d --- /dev/null +++ b/offchain/scheduler/lib/scheduler/doublezero_nif.ex @@ -0,0 +1,115 @@ +defmodule Scheduler.DoubleZeroNIF do + @moduledoc """ + Behaviour module for DoubleZero NIF functions. + + This module defines callbacks for all NIF functions, allowing for + dependency injection in tests. The actual implementation is in + `Scheduler.DoubleZero`, which uses Rustler to load the native code. + + ## Usage in Workers + + Workers should use a private `nif_module/0` function to allow injection: + + defp nif_module do + Application.get_env(:scheduler, :nif_module, Scheduler.DoubleZero) + end + + def handle_continue(:do_work, state) do + case nif_module().some_function(arg) do + {:ok, result} -> ... + {:error, error} -> ... + end + end + + ## Testing with Mox + + In test_helper.exs: + + Mox.defmock(Scheduler.MockNIF, for: Scheduler.DoubleZeroNIF) + + In tests: + + import Mox + + setup :verify_on_exit! + + test "worker handles success" do + expect(Scheduler.MockNIF, :some_function, fn _arg -> + {:ok, "result"} + end) + # ... test code + end + """ + + @doc """ + Initialize the tracing subscriber for logging. + Returns an empty tuple on success. + """ + @callback initialize_tracing_subscriber() :: {} | {:error, term()} + + @doc """ + Collect all outstanding debt across all epochs. + + ## Parameters + - `solana_rpc`: The Solana RPC URL to connect to + + ## Returns + - `{}` on success + - `{:error, reason}` on failure + """ + @callback collect_all_debt(solana_rpc :: String.t()) :: {} | {:error, term()} + + @doc """ + Collect debt for a specific DZ epoch. + + ## Parameters + - `dz_epoch`: The DoubleZero epoch number + - `solana_rpc`: The Solana RPC URL to connect to + + ## Returns + - `{}` on success + - `{:error, reason}` on failure + """ + @callback collect_epoch_debt(dz_epoch :: non_neg_integer(), solana_rpc :: String.t()) :: + {} | {:error, term()} + + @doc """ + Initialize distribution for the current epoch. + + ## Parameters + - `solana_rpc`: The Solana RPC URL to connect to + + ## Returns + - `{}` on success + - `{:error, reason}` on failure + """ + @callback initialize_distribution(solana_rpc :: String.t()) :: {} | {:error, term()} + + @doc """ + Calculate validator debt distribution. + + ## Parameters + - `solana_rpc`: The Solana RPC URL to connect to + - `post_to_slack`: Whether to post results to Slack + + ## Returns + - `{}` on success (or any non-error tuple) + - `{:error, reason}` on failure + """ + @callback calculate_distribution(solana_rpc :: String.t(), post_to_slack :: boolean()) :: + non_neg_integer() | {:error, term()} + + @doc """ + Finalize the distribution for a specific epoch. + + ## Parameters + - `dz_epoch`: The DoubleZero epoch number + - `solana_rpc`: The Solana RPC URL to connect to + + ## Returns + - `{}` on success + - `{:error, reason}` on failure + """ + @callback finalize_distribution(dz_epoch :: non_neg_integer(), solana_rpc :: String.t()) :: + {} | {:error, term()} +end diff --git a/offchain/scheduler/lib/scheduler/prom_ex.ex b/offchain/scheduler/lib/scheduler/prom_ex.ex new file mode 100644 index 0000000000..4e840131b6 --- /dev/null +++ b/offchain/scheduler/lib/scheduler/prom_ex.ex @@ -0,0 +1,35 @@ +defmodule Scheduler.PromEx do + @moduledoc false + + use PromEx, otp_app: :scheduler + + alias PromEx.Plugins + + @impl true + def plugins do + [ + Plugins.Application, + Plugins.Beam + ] + end + + @impl true + def dashboard_assigns do + [ + datasource_id: prometheus_endpoint(), + default_selected_interval: "30s" + ] + end + + @impl true + def dashboards do + [ + {:prom_ex, "application.json"}, + {:prom_ex, "beam.json"} + ] + end + + def prometheus_endpoint do + Application.get_env(:scheduler, :prometheus_endpoint) + end +end diff --git a/offchain/scheduler/lib/scheduler/router.ex b/offchain/scheduler/lib/scheduler/router.ex new file mode 100644 index 0000000000..e97795362e --- /dev/null +++ b/offchain/scheduler/lib/scheduler/router.ex @@ -0,0 +1,16 @@ +defmodule Scheduler.Router do + use Plug.Router + plug(PromEx.Plug, prom_ex_module: Scheduler.PromEx) + plug(Plug.Telemetry, event_prefix: [:doublezero_offchain_scheduler]) + plug(Plug.Logger) + plug(:match) + plug(:dispatch) + + get "/health_check" do + send_resp(conn, 200, ":ok") + end + + match _ do + send_resp(conn, 404, "not found") + end +end diff --git a/offchain/scheduler/lib/scheduler/scheduler.ex b/offchain/scheduler/lib/scheduler/scheduler.ex new file mode 100644 index 0000000000..05617f63a0 --- /dev/null +++ b/offchain/scheduler/lib/scheduler/scheduler.ex @@ -0,0 +1,4 @@ +defmodule Scheduler.Scheduler do + @moduledoc false + use Quantum, otp_app: :scheduler +end diff --git a/offchain/scheduler/lib/scheduler/scheduler_doublezero.ex b/offchain/scheduler/lib/scheduler/scheduler_doublezero.ex new file mode 100644 index 0000000000..8b9a45fd16 --- /dev/null +++ b/offchain/scheduler/lib/scheduler/scheduler_doublezero.ex @@ -0,0 +1,29 @@ +defmodule Scheduler.DoubleZero do + @moduledoc """ + NIF module for DoubleZero Rust functions. + + This module loads native Rust code via Rustler and implements + the `Scheduler.DoubleZeroNIF` behaviour for testability. + """ + @behaviour Scheduler.DoubleZeroNIF + + use Rustler, + otp_app: :scheduler, + crate: "scheduler_doublezero", + mode: if(Mix.env() == :prod, do: :release, else: :debug) + + def initialize_tracing_subscriber, do: :erlang.nif_error(:nif_not_loaded) + + def collect_all_debt(_solana_rpc), do: :erlang.nif_error(:nif_not_loaded) + + def collect_epoch_debt(_dz_epoch, _solana_rpc), + do: :erlang.nif_error(:nif_not_loaded) + + def initialize_distribution(_solana_rpc), do: :erlang.nif_error(:nif_not_loaded) + + def calculate_distribution(_solana_rpc, _post_to_slack), + do: :erlang.nif_error(:nif_not_loaded) + + def finalize_distribution(_dz_epoch, _solana_rpc), + do: :erlang.nif_error(:nif_not_loaded) +end diff --git a/offchain/scheduler/lib/scheduler/validator_debt/debt_collection.ex b/offchain/scheduler/lib/scheduler/validator_debt/debt_collection.ex new file mode 100644 index 0000000000..8379d9929d --- /dev/null +++ b/offchain/scheduler/lib/scheduler/validator_debt/debt_collection.ex @@ -0,0 +1,13 @@ +defmodule Scheduler.ValidatorDebt.DebtCollection do + @moduledoc false + defstruct total_paid: 0, + already_paid: 0, + total_debt: 0, + total_validators: 0, + insufficient_funds_count: 0 +end + +defmodule Scheduler.ValidatorDebt.Debt do + @moduledoc false + defstruct [:validator_id, :amount, :result, :success] +end diff --git a/offchain/scheduler/lib/scheduler/worker/calculate_distribution.ex b/offchain/scheduler/lib/scheduler/worker/calculate_distribution.ex new file mode 100644 index 0000000000..b73958229f --- /dev/null +++ b/offchain/scheduler/lib/scheduler/worker/calculate_distribution.ex @@ -0,0 +1,78 @@ +defmodule Scheduler.Worker.CalculateDistribution do + @moduledoc """ + Calculates distribution for the current dz epoch - 1 (most recently closed epoch) and runs three times to ensure that the outcome is the same (this is done in worker.rs calculate_distribution) for calculated debt. If it's equal for three runs, the debt is finalized. + """ + use GenServer + + require Logger + + def start_link(_var \\ []) do + state = %{count: 0} + GenServer.start_link(__MODULE__, state, name: __MODULE__) + end + + def init(state) do + {:ok, state, {:continue, :calculate_distribution}} + end + + def handle_continue(:calculate_distribution, %{count: 2} = state) do + case nif_module().calculate_distribution( + solana_rpc(), + true + ) do + dz_epoch when is_integer(dz_epoch) -> + Logger.info("Proceeding to finalize debt for dz epoch #{dz_epoch}") + state = Map.put(state, :dz_epoch, dz_epoch) + {:noreply, state, {:continue, :finalize_distribution}} + + {:error, error} -> + Logger.error("calculate_distribution: received error: #{inspect(error)}") + {:stop, :shutdown, state} + end + end + + def handle_continue(:calculate_distribution, state) do + case nif_module().calculate_distribution( + solana_rpc(), + false + ) do + dz_epoch when is_integer(dz_epoch) -> + state = %{state | count: state.count + 1} + Logger.info("Completed calculation for debt ##{state.count}") + {:noreply, state, {:continue, :calculate_distribution}} + + {:error, error} -> + Logger.error("calculate_distribution: received error: #{inspect(error)}") + {:stop, :shutdown, state} + end + end + + def handle_continue(:finalize_distribution, state) do + Logger.info("Finalizing debt for dz epoch #{state.dz_epoch}") + + case nif_module().finalize_distribution(state.dz_epoch, solana_rpc()) do + {:error, error} -> + Logger.error("calculate_distribution: received error: #{inspect(error)}") + + _ -> + Logger.info( + "calculate_distribution: finalized distribution for dz epoch #{state.dz_epoch}" + ) + end + + {:stop, :normal, state} + end + + def handle_info(msg, state) do + Logger.warning("Received unexpected msg: #{msg}") + {:noreply, state} + end + + defp solana_rpc do + Application.get_env(:scheduler, :solana_rpc) + end + + defp nif_module do + Application.get_env(:scheduler, :nif_module, Scheduler.DoubleZero) + end +end diff --git a/offchain/scheduler/lib/scheduler/worker/collect_all_debt.ex b/offchain/scheduler/lib/scheduler/worker/collect_all_debt.ex new file mode 100644 index 0000000000..3ae8c60cb7 --- /dev/null +++ b/offchain/scheduler/lib/scheduler/worker/collect_all_debt.ex @@ -0,0 +1,46 @@ +defmodule Scheduler.Worker.CollectAllDebt do + @moduledoc """ + - Genserver that collects debt + - it runs every two hours + - currently it starts at the genesis epoch of 31 + - once debt forgiveness comes into play, that will change + """ + use GenServer + + require Logger + + def start_link(_var \\ []) do + state = %{} + + GenServer.start_link(__MODULE__, state, name: __MODULE__) + end + + def init(state) do + {:ok, state, {:continue, :collect_all_debt}} + end + + def handle_info(msg, state) do + Logger.warning("Received unexpected msg: #{msg}") + {:noreply, state} + end + + def handle_continue(:collect_all_debt, state) do + case nif_module().collect_all_debt(solana_rpc()) do + {} -> + Logger.info("Successfully collected debts for all epochs") + + {:error, error} -> + Logger.error("CollectAllDebt worker encountered an error: #{inspect(error)}") + end + + {:stop, :normal, state} + end + + defp solana_rpc do + Application.get_env(:scheduler, :solana_rpc) + end + + defp nif_module do + Application.get_env(:scheduler, :nif_module, Scheduler.DoubleZero) + end +end diff --git a/offchain/scheduler/lib/scheduler/worker/initialize_distribution.ex b/offchain/scheduler/lib/scheduler/worker/initialize_distribution.ex new file mode 100644 index 0000000000..1cd0ceae2f --- /dev/null +++ b/offchain/scheduler/lib/scheduler/worker/initialize_distribution.ex @@ -0,0 +1,42 @@ +defmodule Scheduler.Worker.InitializeDistribution do + @moduledoc """ + - GenServer that initializes a distribution + - it runs once a minute and either initializes the distribution or shuts down + """ + use GenServer + + require Logger + + def start_link(_var \\ []) do + GenServer.start_link(__MODULE__, [], name: __MODULE__) + end + + def init([] = state) do + {:ok, state, {:continue, :initialize_distribution}} + end + + def handle_continue(:initialize_distribution, state) do + case nif_module().initialize_distribution(solana_rpc()) do + {:error, error} -> + Logger.error("initialize_distribution: received error: #{inspect(error)}") + {:stop, :shutdown, state} + + {} -> + Logger.info("initialize_distribution: completed") + {:stop, :normal, state} + end + end + + def handle_info(msg, state) do + Logger.warning("Received unexpected msg: #{msg}") + {:noreply, state} + end + + defp solana_rpc do + Application.get_env(:scheduler, :solana_rpc) + end + + defp nif_module do + Application.get_env(:scheduler, :nif_module, Scheduler.DoubleZero) + end +end diff --git a/offchain/scheduler/mix.exs b/offchain/scheduler/mix.exs new file mode 100644 index 0000000000..0876085fea --- /dev/null +++ b/offchain/scheduler/mix.exs @@ -0,0 +1,37 @@ +defmodule Scheduler.MixProject do + use Mix.Project + + def project do + [ + app: :scheduler, + version: "0.1.0", + elixir: "~> 1.18", + start_permanent: Mix.env() == :prod, + test_coverage: [ + threshold: 60, + ignore_modules: [Scheduler.PromEx, Scheduler.Router, Scheduler.DoubleZero] + ], + deps: deps() + ] + end + + # Run "mix help compile.app" to learn about applications. + def application do + [ + extra_applications: [:logger], + mod: {Scheduler.Application, []} + ] + end + + # Run "mix help deps" to learn about dependencies. + defp deps do + [ + {:credo, "~> 1.7"}, + {:mox, "~> 1.0", only: :test}, + {:plug_cowboy, "~> 2.0"}, + {:prom_ex, "~> 1.11"}, + {:quantum, "~> 3.5"}, + {:rustler, "~> 0.37.1"} + ] + end +end diff --git a/offchain/scheduler/mix.lock b/offchain/scheduler/mix.lock new file mode 100644 index 0000000000..66272e6521 --- /dev/null +++ b/offchain/scheduler/mix.lock @@ -0,0 +1,36 @@ +%{ + "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, + "castore": {:hex, :castore, "1.0.16", "8a4f9a7c8b81cda88231a08fe69e3254f16833053b23fa63274b05cbc61d2a1e", [:mix], [], "hexpm", "33689203a0eaaf02fcd0e86eadfbcf1bd636100455350592e7e2628564022aaf"}, + "cowboy": {:hex, :cowboy, "2.14.2", "4008be1df6ade45e4f2a4e9e2d22b36d0b5aba4e20b0a0d7049e28d124e34847", [:make, :rebar3], [{:cowlib, ">= 2.16.0 and < 3.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, ">= 1.8.0 and < 3.0.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "569081da046e7b41b5df36aa359be71a0c8874e5b9cff6f747073fc57baf1ab9"}, + "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, + "cowlib": {:hex, :cowlib, "2.16.0", "54592074ebbbb92ee4746c8a8846e5605052f29309d3a873468d76cdf932076f", [:make, :rebar3], [], "hexpm", "7f478d80d66b747344f0ea7708c187645cfcc08b11aa424632f78e25bf05db51"}, + "credo": {:hex, :credo, "1.7.13", "126a0697df6b7b71cd18c81bc92335297839a806b6f62b61d417500d1070ff4e", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "47641e6d2bbff1e241e87695b29f617f1a8f912adea34296fb10ecc3d7e9e84f"}, + "crontab": {:hex, :crontab, "1.2.0", "503611820257939d5d0fd272eb2b454f48a470435a809479ddc2c40bb515495c", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "ebd7ef4d831e1b20fa4700f0de0284a04cac4347e813337978e25b4cc5cc2207"}, + "file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"}, + "finch": {:hex, :finch, "0.20.0", "5330aefb6b010f424dcbbc4615d914e9e3deae40095e73ab0c1bb0968933cadf", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2658131a74d051aabfcba936093c903b8e89da9a1b63e430bee62045fa9b2ee2"}, + "gen_stage": {:hex, :gen_stage, "1.3.2", "7c77e5d1e97de2c6c2f78f306f463bca64bf2f4c3cdd606affc0100b89743b7b", [:mix], [], "hexpm", "0ffae547fa777b3ed889a6b9e1e64566217413d018cabd825f786e843ffe63e7"}, + "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, + "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, + "mox": {:hex, :mox, "1.2.0", "a2cd96b4b80a3883e3100a221e8adc1b98e4c3a332a8fc434c39526babafd5b3", [:mix], [{:nimble_ownership, "~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}], "hexpm", "c7b92b3cc69ee24a7eeeaf944cd7be22013c52fcb580c1f33f50845ec821089a"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, + "nimble_ownership": {:hex, :nimble_ownership, "1.0.2", "fa8a6f2d8c592ad4d79b2ca617473c6aefd5869abfa02563a77682038bf916cf", [:mix], [], "hexpm", "098af64e1f6f8609c6672127cfe9e9590a5d3fcdd82bc17a377b8692fd81a879"}, + "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, + "octo_fetch": {:hex, :octo_fetch, "0.4.0", "074b5ecbc08be10b05b27e9db08bc20a3060142769436242702931c418695b19", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "cf8be6f40cd519d7000bb4e84adcf661c32e59369ca2827c4e20042eda7a7fc6"}, + "peep": {:hex, :peep, "3.5.0", "9f6ead7b0f2c684494200c8fc02e7e62e8c459afe861b29bd859e4c96f402ed8", [:mix], [{:nimble_options, "~> 1.1", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:plug, "~> 1.16", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry_metrics, "~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "5a73a99c6e60062415efeb7e536a663387146463a3d3df1417da31fd665ac210"}, + "plug": {:hex, :plug, "1.18.1", "5067f26f7745b7e31bc3368bc1a2b818b9779faa959b49c934c17730efc911cf", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "57a57db70df2b422b564437d2d33cf8d33cd16339c1edb190cd11b1a3a546cc2"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.7.5", "261f21b67aea8162239b2d6d3b4c31efde4daa22a20d80b19c2c0f21b34b270e", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "20884bf58a90ff5a5663420f5d2c368e9e15ed1ad5e911daf0916ea3c57f77ac"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"}, + "prom_ex": {:hex, :prom_ex, "1.11.0", "1f6d67f2dead92224cb4f59beb3e4d319257c5728d9638b4a5e8ceb51a4f9c7e", [:mix], [{:absinthe, ">= 1.7.0", [hex: :absinthe, repo: "hexpm", optional: true]}, {:broadway, ">= 1.1.0", [hex: :broadway, repo: "hexpm", optional: true]}, {:ecto, ">= 3.11.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:finch, "~> 0.18", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:oban, ">= 2.10.0", [hex: :oban, repo: "hexpm", optional: true]}, {:octo_fetch, "~> 0.4", [hex: :octo_fetch, repo: "hexpm", optional: false]}, {:peep, "~> 3.0", [hex: :peep, repo: "hexpm", optional: false]}, {:phoenix, ">= 1.7.0", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_live_view, ">= 0.20.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, ">= 1.16.0", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 2.6.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, ">= 1.0.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.2", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}, {:telemetry_poller, "~> 1.1", [hex: :telemetry_poller, repo: "hexpm", optional: false]}], "hexpm", "76b074bc3730f0802978a7eb5c7091a65473eaaf07e99ec9e933138dcc327805"}, + "quantum": {:hex, :quantum, "3.5.3", "ee38838a07761663468145f489ad93e16a79440bebd7c0f90dc1ec9850776d99", [:mix], [{:crontab, "~> 1.1", [hex: :crontab, repo: "hexpm", optional: false]}, {:gen_stage, "~> 0.14 or ~> 1.0", [hex: :gen_stage, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_registry, "~> 0.2", [hex: :telemetry_registry, repo: "hexpm", optional: false]}], "hexpm", "500fd3fa77dcd723ed9f766d4a175b684919ff7b6b8cfd9d7d0564d58eba8734"}, + "ranch": {:hex, :ranch, "2.2.0", "25528f82bc8d7c6152c57666ca99ec716510fe0925cb188172f41ce93117b1b0", [:make, :rebar3], [], "hexpm", "fa0b99a1780c80218a4197a59ea8d3bdae32fbff7e88527d7d8a4787eff4f8e7"}, + "req": {:hex, :req, "0.5.15", "662020efb6ea60b9f0e0fac9be88cd7558b53fe51155a2d9899de594f9906ba9", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "a6513a35fad65467893ced9785457e91693352c70b58bbc045b47e5eb2ef0c53"}, + "rustler": {:hex, :rustler, "0.37.1", "721434020c7f6f8e1cdc57f44f75c490435b01de96384f8ccb96043f12e8a7e0", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "24547e9b8640cf00e6a2071acb710f3e12ce0346692e45098d84d45cdb54fd79"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, + "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, + "telemetry_metrics_prometheus_core": {:hex, :telemetry_metrics_prometheus_core, "1.2.1", "c9755987d7b959b557084e6990990cb96a50d6482c683fb9622a63837f3cd3d8", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "5e2c599da4983c4f88a33e9571f1458bf98b0cf6ba930f1dc3a6e8cf45d5afb6"}, + "telemetry_poller": {:hex, :telemetry_poller, "1.3.0", "d5c46420126b5ac2d72bc6580fb4f537d35e851cc0f8dbd571acf6d6e10f5ec7", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "51f18bed7128544a50f75897db9974436ea9bfba560420b646af27a9a9b35211"}, + "telemetry_registry": {:hex, :telemetry_registry, "0.3.2", "701576890320be6428189bff963e865e8f23e0ff3615eade8f78662be0fc003c", [:mix, :rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7ed191eb1d115a3034af8e1e35e4e63d5348851d556646d46ca3d1b4e16bab9"}, +} diff --git a/offchain/scheduler/native/scheduler_doublezero/Cargo.toml b/offchain/scheduler/native/scheduler_doublezero/Cargo.toml new file mode 100644 index 0000000000..447b1480eb --- /dev/null +++ b/offchain/scheduler/native/scheduler_doublezero/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "scheduler_doublezero" +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true + +[lib] +crate-type = ["cdylib"] + +[dependencies] +anyhow.workspace = true +doublezero-solana-client-tools.workspace = true +doublezero-solana-sdk.workspace = true +doublezero-solana-validator-debt.workspace = true +reqwest.workspace = true +rustler = "0.37.0" +serde_json.workspace = true +solana-client.workspace = true +solana-commitment-config.workspace = true +solana-sdk.workspace = true +slack-notifier.workspace = true +solana-transaction-status-client-types.workspace = true +tokio.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true diff --git a/offchain/scheduler/native/scheduler_doublezero/README.md b/offchain/scheduler/native/scheduler_doublezero/README.md new file mode 100644 index 0000000000..10c82b782a --- /dev/null +++ b/offchain/scheduler/native/scheduler_doublezero/README.md @@ -0,0 +1,20 @@ +# NIF for Scheduler.DoubleZero + +## To build the NIF module: + +- Your NIF will now build along with your project. + +## To load the NIF: + +```elixir +defmodule Scheduler.DoubleZero do + use Rustler, otp_app: :scheduler, crate: "scheduler_doublezero" + + # When your NIF is loaded, it will override this function. + def pay_debt(_debtor, _amount), do: :erlang.nif_error(:nif_not_loaded) +end +``` + +## Examples + +[This](https://github.com/rusterlium/NifIo) is a complete example of a NIF written in Rust. diff --git a/offchain/scheduler/native/scheduler_doublezero/src/lib.rs b/offchain/scheduler/native/scheduler_doublezero/src/lib.rs new file mode 100644 index 0000000000..832579d919 --- /dev/null +++ b/offchain/scheduler/native/scheduler_doublezero/src/lib.rs @@ -0,0 +1,261 @@ +use std::sync::Arc; + +use anyhow::Result; +use doublezero_solana_client_tools::{ + payer::{SolanaPayerOptions, SolanaSignerOptions, Wallet, try_load_keypair}, + rpc::{DoubleZeroLedgerConnection, SolanaConnectionOptions}, +}; +use doublezero_solana_sdk::{ + NetworkEnvironment, + revenue_distribution::fetch::{try_fetch_config, try_fetch_distribution}, +}; +use doublezero_solana_validator_debt::{ + rpc::SolanaValidatorDebtConnectionOptions, + solana_debt_calculator::SolanaDebtCalculator, + transaction::{DebtCollectionResults, Transaction}, + worker, +}; +use rustler::{Error as NifError, NifStruct}; +use tokio::runtime::Runtime; +use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt}; + +const INITIALIZE_DISTRIBUTION_COMPUTE_UNIT_PRICE: u64 = 1_000; // 0.001 lamports + +#[derive(NifStruct)] +#[module = "Scheduler.ValidatorDebt.DebtCollection"] +pub struct DebtCollection { + pub dz_epoch: u64, + pub total_paid: u64, + pub total_debt: u64, + pub already_paid: u64, + pub outstanding_debt: u64, + pub total_validators: usize, + pub insufficient_funds_count: usize, +} + +#[derive(NifStruct)] +#[module = "Scheduler.ValidatorDebt.Debt"] +pub struct Debt { + pub validator_id: String, + pub amount: u64, + pub result: Option, + pub success: bool, +} + +#[rustler::nif] +pub fn initialize_tracing_subscriber() -> Result<(), NifError> { + tracing_subscriber::registry() + .with(EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"))) + .with( + tracing_subscriber::fmt::layer() + .with_target(false) + .with_thread_ids(false) + .with_thread_names(false), + ) + .init(); + + Ok(()) +} + +#[rustler::nif(schedule = "DirtyIo")] +pub fn collect_epoch_debt( + dz_epoch: u64, + solana_rpc_url: String, +) -> Result { + // Block the current thread and wait for the async operation to complete. + let tx_results = Runtime::new() + .map_err(display_to_nif_error)? + .block_on(async { + let wallet = try_initialize_wallet( + solana_rpc_url, // + None, // with_compute_unit_price + )?; + + let dz_connection = get_dz_ledger(&wallet, None).await?; + let (_, config) = try_fetch_config(&wallet.connection).await?; + let (_, distribution) = try_fetch_distribution(&wallet.connection, dz_epoch).await?; + + if !distribution.is_debt_calculation_finalized() { + tracing::warn!("{dz_epoch} is not finalized, skipping"); + return Ok(Default::default()); + } + let tx_results = worker::pay_solana_validator_debt( + &wallet, + &dz_connection, + dz_epoch, + &config, + &distribution, + ) + .await?; + + worker::post_debt_collection_to_slack(tx_results.clone(), false, None).await?; + + Ok::(tx_results) + }) + .map_err(display_to_nif_error)?; + let debt_collection = DebtCollection { + dz_epoch: tx_results.dz_epoch, + already_paid: tx_results.already_paid, + total_debt: tx_results.total_debt, + total_paid: tx_results.total_paid, + outstanding_debt: (tx_results.total_debt - tx_results.total_paid), + total_validators: tx_results.total_validators, + insufficient_funds_count: tx_results.insufficient_funds_count, + }; + + Ok(debt_collection) +} + +#[rustler::nif] +pub fn initialize_distribution(solana_rpc_url: String) -> Result<(), NifError> { + Runtime::new() + .map_err(display_to_nif_error)? + .block_on(async { + let wallet = try_initialize_wallet( + solana_rpc_url, + Some(INITIALIZE_DISTRIBUTION_COMPUTE_UNIT_PRICE), + )?; + + worker::try_initialize_distribution( + &wallet, // + None, // dz_env + false, // bypass_dz_epoch_check + None, // record_accountant_key + ) + .await + }) + .map_err(display_to_nif_error)?; + + Ok(()) +} + +#[rustler::nif(schedule = "DirtyIo")] +pub fn collect_all_debt(solana_rpc_url: String) -> Result<(), NifError> { + Runtime::new() + .map_err(display_to_nif_error)? + .block_on(async { + let wallet = try_initialize_wallet( + solana_rpc_url, // + None, // with_compute_unit_price + )?; + + let dz_connection = get_dz_ledger(&wallet, None).await?; + + worker::pay_all_solana_validator_debt(wallet, dz_connection).await + }) + .map_err(display_to_nif_error)?; + Ok(()) +} + +#[rustler::nif(schedule = "DirtyIo")] +pub fn calculate_distribution( + solana_rpc_url: String, + post_to_slack: bool, +) -> Result { + let dz_epoch = Runtime::new() + .map_err(display_to_nif_error)? + .block_on(async { + let wallet = try_initialize_wallet( + solana_rpc_url, // + None, // with_compute_unit_price + )?; + + let dz_connection = get_dz_ledger(&wallet, None).await?; + + let connection_options = SolanaValidatorDebtConnectionOptions { + solana_url_or_moniker: Some(wallet.connection.url()), + dz_ledger_url: dz_connection.url(), + }; + let solana_debt_calculator: SolanaDebtCalculator = + SolanaDebtCalculator::try_from(connection_options)?; + let keypair = try_load_keypair(None)?; + let arc_keypair = Arc::new(keypair); + let transaction = Transaction::new(arc_keypair, false, false); + + let write_summary = + worker::calculate_distribution(&solana_debt_calculator, transaction, false).await?; + if post_to_slack { + slack_notifier::validator_debt::post_distribution_to_slack( + None, + write_summary.solana_epoch, + write_summary.dz_epoch, + false, + write_summary.total_debt, + write_summary.total_validators, + write_summary.transaction_id, + ) + .await?; + } + + Ok::(write_summary.dz_epoch) + }) + .map_err(display_to_nif_error)?; + + Ok(dz_epoch) +} + +#[rustler::nif(schedule = "DirtyIo")] +pub fn finalize_distribution(dz_epoch: u64, solana_rpc_url: String) -> Result<(), NifError> { + Runtime::new() + .map_err(display_to_nif_error)? + .block_on(async { + let wallet = try_initialize_wallet( + solana_rpc_url, // + None, // with_compute_unit_price + )?; + + let dz_connection = get_dz_ledger(&wallet, None).await?; + + let connection_options = SolanaValidatorDebtConnectionOptions { + solana_url_or_moniker: Some(wallet.connection.url()), + dz_ledger_url: dz_connection.url(), + }; + let solana_debt_calculator: SolanaDebtCalculator = + SolanaDebtCalculator::try_from(connection_options)?; + + let keypair = try_load_keypair(None)?; + let arc_keypair = Arc::new(keypair); + let transaction = Transaction::new(arc_keypair, false, false); + + worker::finalize_distribution(&solana_debt_calculator, transaction, dz_epoch).await?; + + Ok::<(), anyhow::Error>(()) + }) + .map_err(display_to_nif_error)?; + + Ok(()) +} + +fn display_to_nif_error(e: impl std::fmt::Display) -> NifError { + NifError::Term(Box::new(e.to_string())) +} + +fn try_initialize_wallet( + solana_rpc_url: String, + with_compute_unit_price: Option, +) -> Result { + let payer_options = SolanaPayerOptions { + connection_options: SolanaConnectionOptions { + solana_url_or_moniker: Some(solana_rpc_url), + }, + signer_options: SolanaSignerOptions { + with_compute_unit_price, + ..Default::default() + }, + }; + + Wallet::try_from(payer_options) +} + +async fn get_dz_ledger( + wallet: &Wallet, + dz_env_override: Option, +) -> Result { + let network_env = wallet.connection.try_network_environment().await?; + + // Allow an override to the DoubleZero Ledger environment. + let dz_env = dz_env_override.unwrap_or(network_env); + Ok(DoubleZeroLedgerConnection::from(dz_env)) +} + +rustler::init!("Elixir.Scheduler.DoubleZero"); diff --git a/offchain/scheduler/test/test_helper.exs b/offchain/scheduler/test/test_helper.exs new file mode 100644 index 0000000000..02ee79521c --- /dev/null +++ b/offchain/scheduler/test/test_helper.exs @@ -0,0 +1,4 @@ +ExUnit.start() + +# Define the mock module for NIF boundary testing +Mox.defmock(Scheduler.MockNIF, for: Scheduler.DoubleZeroNIF) diff --git a/offchain/scheduler/test/worker_integration_test.exs b/offchain/scheduler/test/worker_integration_test.exs new file mode 100644 index 0000000000..f60b4444ff --- /dev/null +++ b/offchain/scheduler/test/worker_integration_test.exs @@ -0,0 +1,311 @@ +defmodule Scheduler.WorkerIntegrationTest do + @moduledoc """ + Integration tests for scheduler workers using Mox to mock the NIF boundary. + + These tests verify the GenServer behavior with mocked NIF responses, + allowing us to test: + - Happy path: NIF returns success + - Error path: NIF returns error, GenServer handles gracefully + - CalculateDistribution 3-run confirmation logic + """ + use ExUnit.Case, async: false + + import ExUnit.CaptureLog + import Mox + + alias Scheduler.Worker.CalculateDistribution + alias Scheduler.Worker.CollectAllDebt + alias Scheduler.Worker.InitializeDistribution + + # Use global mode for cross-process mocking (GenServers spawn in separate processes) + setup :set_mox_global + setup :verify_on_exit! + + # Set the mock module for tests + setup do + Application.put_env(:scheduler, :nif_module, Scheduler.MockNIF) + Application.put_env(:scheduler, :solana_rpc, "http://localhost:8899") + + on_exit(fn -> + Application.delete_env(:scheduler, :nif_module) + Application.delete_env(:scheduler, :solana_rpc) + end) + + :ok + end + + describe "InitializeDistribution worker" do + test "stops normally on successful NIF call" do + expect(Scheduler.MockNIF, :initialize_distribution, fn _rpc -> + {} + end) + + log = + capture_log(fn -> + # Trap exits so we can monitor without crashing + Process.flag(:trap_exit, true) + {:ok, pid} = InitializeDistribution.start_link() + + receive do + {:EXIT, ^pid, reason} -> + assert reason == :normal + after + 5000 -> flunk("Worker did not stop in time") + end + end) + + assert log =~ "completed" + end + + test "stops with shutdown on NIF error" do + expect(Scheduler.MockNIF, :initialize_distribution, fn _rpc -> + {:error, "RPC connection failed"} + end) + + log = + capture_log(fn -> + Process.flag(:trap_exit, true) + {:ok, pid} = InitializeDistribution.start_link() + + receive do + {:EXIT, ^pid, reason} -> + assert reason == :shutdown + after + 5000 -> flunk("Worker did not stop in time") + end + end) + + assert log =~ "error" + assert log =~ "RPC connection failed" + end + end + + describe "CollectAllDebt worker" do + test "stops normally on successful NIF call" do + expect(Scheduler.MockNIF, :collect_all_debt, fn _rpc -> + {} + end) + + log = + capture_log(fn -> + Process.flag(:trap_exit, true) + {:ok, pid} = CollectAllDebt.start_link() + + receive do + {:EXIT, ^pid, reason} -> + assert reason == :normal + after + 5000 -> flunk("Worker did not stop in time") + end + end) + + assert log =~ "Successfully collected debts" + end + + test "stops normally even on NIF error (fire and forget)" do + expect(Scheduler.MockNIF, :collect_all_debt, fn _rpc -> + {:error, "Some error occurred"} + end) + + log = + capture_log(fn -> + Process.flag(:trap_exit, true) + {:ok, pid} = CollectAllDebt.start_link() + + receive do + {:EXIT, ^pid, reason} -> + # CollectAllDebt stops with :normal even on error + assert reason == :normal + after + 5000 -> flunk("Worker did not stop in time") + end + end) + + assert log =~ "error" + end + end + + describe "CalculateDistribution worker 3-run confirmation logic" do + test "runs calculate 3 times then finalizes on success" do + # First two calls with post_to_slack=false + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> + 42 + end) + + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> + 42 + end) + + # Third call with post_to_slack=true (count == 2) + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, true -> + 42 + end) + + # Then finalize with dz_epoch=42 + expect(Scheduler.MockNIF, :finalize_distribution, fn 42, _rpc -> + {} + end) + + log = + capture_log(fn -> + Process.flag(:trap_exit, true) + {:ok, pid} = CalculateDistribution.start_link() + + receive do + {:EXIT, ^pid, reason} -> + assert reason == :normal + after + 5000 -> flunk("Worker did not stop in time") + end + end) + + # Verify the progression + assert log =~ "Completed calculation for debt #1" + assert log =~ "Completed calculation for debt #2" + assert log =~ "Proceeding to finalize debt for dz epoch 42" + assert log =~ "finalized distribution for dz epoch 42" + end + + test "passes dz_epoch from calculate to finalize" do + dz_epoch = 99 + + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> dz_epoch end) + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> dz_epoch end) + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, true -> dz_epoch end) + + expect(Scheduler.MockNIF, :finalize_distribution, fn ^dz_epoch, _rpc -> + {} + end) + + log = + capture_log(fn -> + Process.flag(:trap_exit, true) + {:ok, pid} = CalculateDistribution.start_link() + + receive do + {:EXIT, ^pid, reason} -> assert reason == :normal + after + 5000 -> flunk("Worker did not stop in time") + end + end) + + assert log =~ "Finalizing debt for dz epoch 99" + assert log =~ "finalized distribution for dz epoch 99" + end + + test "stops with shutdown on first calculation error" do + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> + {:error, "Calculation failed"} + end) + + log = + capture_log(fn -> + Process.flag(:trap_exit, true) + {:ok, pid} = CalculateDistribution.start_link() + + receive do + {:EXIT, ^pid, reason} -> + assert reason == :shutdown + after + 5000 -> flunk("Worker did not stop in time") + end + end) + + assert log =~ "error" + assert log =~ "Calculation failed" + end + + test "stops with shutdown on second calculation error" do + # First call succeeds + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> + 42 + end) + + # Second call fails + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> + {:error, "Second calculation failed"} + end) + + log = + capture_log(fn -> + Process.flag(:trap_exit, true) + {:ok, pid} = CalculateDistribution.start_link() + + receive do + {:EXIT, ^pid, reason} -> + assert reason == :shutdown + after + 5000 -> flunk("Worker did not stop in time") + end + end) + + assert log =~ "Completed calculation for debt #1" + assert log =~ "error" + assert log =~ "Second calculation failed" + end + + test "stops with shutdown on third calculation error" do + # First two calls succeed + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> + 42 + end) + + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> + 42 + end) + + # Third call fails + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, true -> + {:error, "Third calculation failed"} + end) + + log = + capture_log(fn -> + Process.flag(:trap_exit, true) + {:ok, pid} = CalculateDistribution.start_link() + + receive do + {:EXIT, ^pid, reason} -> + assert reason == :shutdown + after + 5000 -> flunk("Worker did not stop in time") + end + end) + + assert log =~ "Completed calculation for debt #1" + assert log =~ "Completed calculation for debt #2" + assert log =~ "error" + assert log =~ "Third calculation failed" + end + + test "finalization error logs but worker stops normally" do + # All three calculations succeed + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> 42 end) + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, false -> 42 end) + expect(Scheduler.MockNIF, :calculate_distribution, fn _rpc, true -> 42 end) + + # Finalization fails + expect(Scheduler.MockNIF, :finalize_distribution, fn 42, _rpc -> + {:error, "Finalization failed"} + end) + + log = + capture_log(fn -> + Process.flag(:trap_exit, true) + {:ok, pid} = CalculateDistribution.start_link() + + receive do + {:EXIT, ^pid, reason} -> + # Worker still stops normally after finalization (fire and forget) + assert reason == :normal + after + 5000 -> flunk("Worker did not stop in time") + end + end) + + assert log =~ "Proceeding to finalize debt" + assert log =~ "error" + assert log =~ "Finalization failed" + end + end +end diff --git a/offchain/scripts/install-doublezero-solana.sh b/offchain/scripts/install-doublezero-solana.sh new file mode 100755 index 0000000000..9428d87980 --- /dev/null +++ b/offchain/scripts/install-doublezero-solana.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash +# Install doublezero-solana from GitHub Releases. +# +# Usage: +# curl -fsSL https://raw.githubusercontent.com/malbeclabs/doublezero-offchain/main/scripts/install-doublezero-solana.sh | sudo bash +# curl -fsSL https://raw.githubusercontent.com/malbeclabs/doublezero-offchain/main/scripts/install-doublezero-solana.sh | bash -s -- --version 0.4.2-rc4 +# curl -fsSL https://raw.githubusercontent.com/malbeclabs/doublezero-offchain/main/scripts/install-doublezero-solana.sh | bash -s -- --install-dir . +# curl -fsSL https://raw.githubusercontent.com/malbeclabs/doublezero-offchain/main/scripts/install-doublezero-solana.sh | bash -s -- --format tar.gz +# +# By default, installs via .deb on Debian/Ubuntu, .rpm on RHEL/Fedora, or +# .tar.gz otherwise. Use --install-dir to extract the binary to a custom +# location instead of using a package manager. + +set -euo pipefail + +REPO="malbeclabs/doublezero-offchain" +TAG_PREFIX="doublezero-solana" + +# --- Formatting --- + +BOLD='\033[1m' DIM='\033[2m' GREEN='\033[0;32m' +RED='\033[0;31m' YELLOW='\033[0;33m' RESET='\033[0m' +if [[ ! -t 1 ]]; then BOLD="" DIM="" GREEN="" RED="" YELLOW="" RESET=""; fi + +die() { echo -e "${RED}ERROR:${RESET} $*" >&2; exit 1; } +info() { echo -e "${BOLD}$*${RESET}"; } + +# --- Args --- + +VERSION="" +INSTALL_DIR="" +FORMAT="" +while [[ $# -gt 0 ]]; do + case "$1" in + --version) [[ -n "${2:-}" ]] || die "--version requires a value"; VERSION="$2"; shift 2 ;; + --install-dir) [[ -n "${2:-}" ]] || die "--install-dir requires a value"; INSTALL_DIR="$2"; shift 2 ;; + --format) [[ -n "${2:-}" ]] || die "--format requires a value"; FORMAT="$2"; shift 2 ;; + --help|-h) + echo "Usage: $0 [--version ] [--install-dir

] [--format ]" + echo "" + echo "Install doublezero-solana from GitHub Releases." + echo "" + echo "Flags:" + echo " --version Version to install (e.g. 0.4.2-rc4); defaults to latest" + echo " --install-dir Extract binary to this directory (uses tar.gz)" + echo " --format Force asset format: deb, rpm, or tar.gz" + echo " --help Show this help" + exit 0 + ;; + *) die "Unknown argument: $1" ;; + esac +done + +# --- Preflight --- + +command -v curl >/dev/null 2>&1 || die "curl is required" + +# --- Detect install method --- + +if [[ -n "$INSTALL_DIR" ]]; then + # --install-dir forces tar.gz extraction. + METHOD="tar" +elif [[ -n "$FORMAT" ]]; then + case "$FORMAT" in + deb) METHOD="deb" ;; + rpm) METHOD="rpm" ;; + tar.gz) METHOD="tar" ;; + *) die "Unknown format: $FORMAT (expected deb, rpm, or tar.gz)" ;; + esac +elif command -v dpkg >/dev/null 2>&1; then + METHOD="deb" +elif command -v rpm >/dev/null 2>&1; then + METHOD="rpm" +else + METHOD="tar" +fi + +# Check if we need root for package manager installs. +if [[ "$METHOD" != "tar" && $(id -u) -ne 0 ]]; then + echo -e "${YELLOW}Root is required to install via ${METHOD}.${RESET}" + echo "" + echo "Options:" + echo " sudo $0 $*" + echo " $0 $* --install-dir . # extract binary to current directory" + echo "" + exit 1 +fi + +# Set asset pattern for download. +case "$METHOD" in + deb) ASSET_PATTERN="\.deb\"" ;; + rpm) ASSET_PATTERN="\.rpm\"" ;; + tar) ASSET_PATTERN="\.tar\.gz\"" ;; +esac + +# --- Determine version --- + +if [[ -z "$VERSION" ]]; then + info "Finding latest release..." + + # Get the latest release tag (including pre-releases). + VERSION=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases" \ + | grep -o "\"tag_name\": *\"${TAG_PREFIX}/v[^\"]*\"" \ + | head -1 \ + | sed "s|.*${TAG_PREFIX}/v||; s|\"||g") + + [[ -n "$VERSION" ]] || die "Could not find any ${TAG_PREFIX} releases" +fi + +TAG="${TAG_PREFIX}/v${VERSION}" + +info "Installing doublezero-solana ${VERSION} (via ${METHOD})" +echo "" + +# --- Download asset --- + +info "Downloading..." + +ASSET_URL=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/tags/${TAG}" \ + | grep -o "\"browser_download_url\": *\"[^\"]*${ASSET_PATTERN}" \ + | head -1 \ + | sed 's/"browser_download_url": *"//; s/"$//') + +[[ -n "$ASSET_URL" ]] || die "No ${METHOD} asset found for ${TAG}" + +TMPDIR=$(mktemp -d) +trap 'rm -rf "$TMPDIR"' EXIT + +ASSET_FILE="${TMPDIR}/$(basename "$ASSET_URL")" +curl -fsSL -o "$ASSET_FILE" "$ASSET_URL" + +echo -e " ${DIM}$(basename "$ASSET_URL")${RESET}" +echo "" + +# --- Install --- + +info "Installing..." +echo "" + +case "$METHOD" in + deb) + dpkg -i "$ASSET_FILE" + ;; + rpm) + rpm -U --force "$ASSET_FILE" + ;; + tar) + [[ -z "$INSTALL_DIR" ]] && INSTALL_DIR="." + mkdir -p "$INSTALL_DIR" + tar -xzf "$ASSET_FILE" -C "$TMPDIR" + BINARY=$(find "$TMPDIR" -name "doublezero-solana" -type f | head -1) + [[ -n "$BINARY" ]] || die "Could not find doublezero-solana binary in archive" + install -m 755 "$BINARY" "${INSTALL_DIR}/doublezero-solana" + echo -e " ${DIM}Installed to ${INSTALL_DIR}/doublezero-solana${RESET}" + ;; +esac + +echo "" +echo -e "${GREEN}${BOLD}doublezero-solana ${VERSION} installed!${RESET}" +echo "" + +doublezero-solana --version 2>/dev/null || true diff --git a/offchain/scripts/release-rc.sh b/offchain/scripts/release-rc.sh new file mode 100755 index 0000000000..366e3f0f29 --- /dev/null +++ b/offchain/scripts/release-rc.sh @@ -0,0 +1,252 @@ +#!/usr/bin/env bash +# Build a goreleaser snapshot in a linux/amd64 Docker container and publish it +# as a release candidate on GitHub Releases. +# +# Usage: ./scripts/release-rc.sh [--version ] [--dry-run] +# +# Examples: +# ./scripts/release-rc.sh doublezero-solana-cli # continues latest RC series +# ./scripts/release-rc.sh doublezero-solana-cli --version 0.4.2 # starts or continues 0.4.2 RCs +# ./scripts/release-rc.sh sentinel --version 0.2.6 --dry-run +# +# The corresponds to a goreleaser config file at: +# release/.goreleaser..yaml +# +# Requirements: docker, gh (GitHub CLI, authenticated) +# Environment: GORELEASER_KEY (goreleaser pro license key) +# +# The script will: +# 1. Parse tag prefix from the goreleaser config +# 2. Determine the next RC number from existing GitHub releases +# 3. Run goreleaser snapshot inside a linux/amd64 container +# 4. Upload the artifacts as a pre-release to GitHub + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +# --- Formatting --- + +BOLD='\033[1m' DIM='\033[2m' GREEN='\033[0;32m' YELLOW='\033[0;33m' +RED='\033[0;31m' CYAN='\033[0;36m' RESET='\033[0m' +if [[ ! -t 1 ]]; then BOLD="" DIM="" GREEN="" YELLOW="" RED="" CYAN="" RESET=""; fi + +die() { echo -e "${RED}ERROR:${RESET} $*" >&2; exit 1; } + +# --- Args --- + +DRY_RUN=false +QUIET=false +CONFIG_NAME="" +BASE_VERSION="" +while [[ $# -gt 0 ]]; do + case "$1" in + --dry-run) DRY_RUN=true; shift ;; + --quiet|-q) QUIET=true; shift ;; + --version) [[ -n "${2:-}" ]] || die "--version requires a value"; BASE_VERSION="$2"; shift 2 ;; + --help|-h) + echo "Usage: $0 [--version ] [--dry-run]" + echo "" + echo "Build a goreleaser snapshot in a linux/amd64 Docker container" + echo "and publish it as a release candidate on GitHub." + echo "" + echo "Arguments:" + echo " Name of the goreleaser config (e.g. doublezero-solana-cli)" + echo " Must match: release/.goreleaser..yaml" + echo "" + echo "Available configs:" + ls release/.goreleaser.*.yaml 2>/dev/null | sed 's|.*/\.goreleaser\.||; s|\.yaml$||; s|^| |' + echo "" + echo "Flags:" + echo " --version Base version for the RC (e.g. 0.4.2); defaults to latest RC series" + echo " --quiet, -q Suppress verbose goreleaser output" + echo " --dry-run Build only, skip publishing to GitHub" + echo " --help Show this help" + echo "" + echo "Environment:" + echo " GORELEASER_KEY Goreleaser Pro license key (required)" + exit 0 + ;; + -*) die "Unknown flag: $1" ;; + *) + [[ -n "$CONFIG_NAME" ]] && die "Unexpected argument: $1" + CONFIG_NAME="$1"; shift + ;; + esac +done + +[[ -n "$CONFIG_NAME" ]] || die "Missing required argument: \nRun '$0 --help' for usage." + +# --- Preflight --- + +command -v docker >/dev/null 2>&1 || die "docker is required" +command -v gh >/dev/null 2>&1 || die "gh (GitHub CLI) is required" +[[ -n "${GORELEASER_KEY:-}" ]] || die "GORELEASER_KEY environment variable is required" + +cd "$REPO_ROOT" + +GORELEASER_CONFIG="release/.goreleaser.${CONFIG_NAME}.yaml" +[[ -f "$GORELEASER_CONFIG" ]] || die "Config not found: $GORELEASER_CONFIG" + +# --- Parse goreleaser config --- + +# Extract the tag prefix (e.g. "doublezero-solana/"). +TAG_PREFIX=$(grep 'tag_prefix:' "$GORELEASER_CONFIG" | head -1 | sed 's/.*tag_prefix: *//' | tr -d '[:space:]') +[[ -n "$TAG_PREFIX" ]] || die "Could not parse tag_prefix from $GORELEASER_CONFIG" + +# --- Determine version and RC number --- + +# If no --version given, infer from the latest RC release on GitHub. +if [[ -z "$BASE_VERSION" ]]; then + LATEST_RC_TAG=$(gh release list --limit 50 \ + | grep "${TAG_PREFIX}v.*-rc" \ + | head -1 \ + | sed "s|.*${TAG_PREFIX}v\([0-9.]*\)-rc.*|\1|" || true) + + if [[ -n "$LATEST_RC_TAG" ]]; then + BASE_VERSION="$LATEST_RC_TAG" + else + die "No existing RC releases found for ${TAG_PREFIX}. Use --version to specify." + fi +fi + +# Find next RC number by inspecting existing releases. +LAST_RC=$(gh release list --limit 50 \ + | grep "${TAG_PREFIX}v${BASE_VERSION}-rc" \ + | head -1 \ + | sed "s|.*v${BASE_VERSION}-rc\([0-9]*\).*|\1|" || true) + +if [[ -n "$LAST_RC" ]]; then + NEXT_RC=$((LAST_RC + 1)) +else + NEXT_RC=1 +fi + +RC_VERSION="${BASE_VERSION}-rc${NEXT_RC}" +RC_TAG="${TAG_PREFIX}v${RC_VERSION}" +SHORT_COMMIT=$(git rev-parse --short HEAD) + +# Extract project name for display. +PROJECT_NAME=$(grep 'project_name:' "$GORELEASER_CONFIG" | head -1 | sed 's/.*project_name: *//' | tr -d '[:space:]') +[[ -n "$PROJECT_NAME" ]] || PROJECT_NAME="$CONFIG_NAME" + +echo "" +echo -e "${BOLD}${PROJECT_NAME} release candidate${RESET}" +echo -e " Version: ${DIM}${RC_VERSION}${RESET}" +echo -e " Tag: ${DIM}${RC_TAG}${RESET}" +echo -e " Commit: ${DIM}${SHORT_COMMIT}${RESET}" +if [[ "$DRY_RUN" == true ]]; then + echo -e " Mode: ${YELLOW}DRY RUN (build only, no publish)${RESET}" +fi +echo "" + +read -rp "Press Enter to continue, or Ctrl-C to abort... " +echo "" + +# --- Build in Docker --- + +RELEASE_IMAGE="doublezero-release" + +# Build the release Docker image if it doesn't exist or if --no-cache is desired. +if ! docker image inspect "$RELEASE_IMAGE" >/dev/null 2>&1; then + echo -e "${BOLD}${CYAN}[0/2]${RESET} ${BOLD}Building release Docker image${RESET}" + echo "" + docker build --platform linux/amd64 \ + -t "$RELEASE_IMAGE" \ + -f release/Dockerfile.release \ + release/ + echo "" +fi + +# goreleaser writes artifacts to dist/ by default. +DIST_DIR="$REPO_ROOT/dist" +rm -rf "$DIST_DIR" + +VERBOSE_FLAG="--verbose" +if [[ "$QUIET" == true ]]; then + VERBOSE_FLAG="" +fi + +echo -e "${BOLD}${CYAN}[1/2]${RESET} ${BOLD}Building snapshot in linux/amd64 container${RESET}" +echo "" + +# Use named volumes for cargo registry and build cache so subsequent builds +# are fast. The release image has rust + goreleaser-pro + rpm pre-installed. +CONTAINER_NAME="doublezero-release-$$" +trap 'docker rm -f "$CONTAINER_NAME" 2>/dev/null; exit 130' INT TERM + +docker run --rm --init \ + --name "$CONTAINER_NAME" \ + --platform linux/amd64 \ + -v "$REPO_ROOT":/workspace \ + -v doublezero-cargo-registry:/usr/local/cargo/registry \ + -v doublezero-cargo-git:/usr/local/cargo/git \ + -v "doublezero-cargo-target-${CONFIG_NAME}:/workspace/target" \ + -w /workspace \ + -e "GORELEASER_KEY=${GORELEASER_KEY}" \ + -e "GORELEASER_CURRENT_TAG=${RC_TAG}" \ + "$RELEASE_IMAGE" \ + bash -c " + set -euo pipefail + + goreleaser release \ + -f ${GORELEASER_CONFIG} \ + --snapshot \ + --clean \ + ${VERBOSE_FLAG} + " + +trap - INT TERM + +echo "" + +# Collect uploadable artifacts (debs, rpms, tar.gz, checksums). +ARTIFACTS=() +for f in "$DIST_DIR"/*.deb "$DIST_DIR"/*.rpm "$DIST_DIR"/*.tar.gz "$DIST_DIR"/*checksums*; do + [[ -f "$f" ]] && ARTIFACTS+=("$f") +done + +if [[ ${#ARTIFACTS[@]} -eq 0 ]]; then + die "No artifacts found in $DIST_DIR" +fi + +echo -e " ${GREEN}✓${RESET} Build complete" +echo "" +for f in "${ARTIFACTS[@]}"; do + echo -e " ${DIM}$(basename "$f")${RESET}" +done + +# --- Publish --- + +if [[ "$DRY_RUN" == true ]]; then + echo "" + echo -e "${YELLOW}Dry run — skipping publish. Artifacts in:${RESET} $DIST_DIR" + echo "" + exit 0 +fi + +echo "" +echo -e "${BOLD}${CYAN}[2/2]${RESET} ${BOLD}Publishing ${RC_TAG} to GitHub Releases${RESET}" +echo "" + +# Create a lightweight tag (-m forces it to skip the editor). +git tag -m "Release candidate ${RC_VERSION}" "$RC_TAG" +git push origin "$RC_TAG" + +# Create the release with artifacts. +gh release create "$RC_TAG" \ + --prerelease \ + --title "$RC_TAG" \ + --notes "Release candidate \`${RC_VERSION}\` built from commit \`${SHORT_COMMIT}\`." \ + "${ARTIFACTS[@]}" + +RELEASE_URL=$(gh release view "$RC_TAG" --json url --jq '.url') + +echo "" +echo -e "${BOLD}${GREEN}Published!${RESET}" +echo -e " ${DIM}${RELEASE_URL}${RESET}" +echo "" + +# Clean up dist directory. +rm -rf "$DIST_DIR" diff --git a/offchain/sh/test_doublezero_solana_fork.sh b/offchain/sh/test_doublezero_solana_fork.sh new file mode 100755 index 0000000000..e06dea2b5f --- /dev/null +++ b/offchain/sh/test_doublezero_solana_fork.sh @@ -0,0 +1,383 @@ +#!/bin/bash + +GENESIS_DZ_EPOCH=31 + +set -eu + +# Wait for Solana fork to start. Only try for 60 seconds. +for i in {1..60}; do + if solana cluster-version -u l > /dev/null 2>&1; then + echo "Solana fork is ready." + break + fi + sleep 2 +done + +# If not ready after 60 seconds, bail out. +if ! solana cluster-version -u l > /dev/null 2>&1; then + echo "Solana fork did not start within 60 seconds." >&2 + exit 1 +fi + +CLI_BIN=target/debug/doublezero-solana + +$CLI_BIN -h +echo + +echo "solana-keygen new --silent --no-bip39-passphrase -o dummy.json" +solana-keygen new --silent --no-bip39-passphrase -o dummy.json +solana airdrop -ul 1 -k dummy.json +echo + +DUMMY_KEY=$(solana address -k dummy.json) + +### Establish another payer. + +echo "solana-keygen new --silent --no-bip39-passphrase -o another_payer.json" +solana-keygen new --silent --no-bip39-passphrase -o another_payer.json +solana airdrop -ul 69 -k another_payer.json +echo + +### Establish rewards manager. +echo "solana-keygen new --silent --no-bip39-passphrase -o rewards_manager.json" +solana-keygen new --silent --no-bip39-passphrase -o rewards_manager.json +solana airdrop -ul 1 -k rewards_manager.json +echo + +### Establish service keys. + +echo "solana-keygen new --silent --no-bip39-passphrase -o service_key_1.json" +solana-keygen new --silent --no-bip39-passphrase -o service_key_1.json +echo + +### Passport commands. + +echo "doublezero-solana passport -h" +$CLI_BIN passport -h +echo + +echo "doublezero-solana passport fetch -h" +$CLI_BIN passport fetch -h +echo + +echo "doublezero-solana passport fetch -ul --config" +$CLI_BIN passport fetch -ul --config +echo + +echo "doublezero-solana passport request-validator-access -h" +$CLI_BIN passport request-validator-access -h +echo + +# Generate the signature using solana sign-offchain-message +VALIDATOR_KEYPAIR=test-ledger/validator-keypair.json +NODE_ID=$(solana address -k $VALIDATOR_KEYPAIR) +MESSAGE="service_key=$DUMMY_KEY" +SIGNATURE=$(solana sign-offchain-message -k $VALIDATOR_KEYPAIR service_key=$DUMMY_KEY) + +echo "doublezero-solana passport request-validator-access -ul -v --primary-validator-id $NODE_ID --signature $SIGNATURE --doublezero-address $DUMMY_KEY --leader-schedule-epochs 1" +$CLI_BIN passport request-validator-access \ + -ul \ + -v \ + --primary-validator-id $NODE_ID \ + --signature $SIGNATURE \ + --doublezero-address $DUMMY_KEY \ + --leader-schedule-epochs 1 +echo + +echo "doublezero-solana passport fetch -ul --access-request $DUMMY_KEY" +$CLI_BIN passport fetch -ul --access-request $DUMMY_KEY +echo + +### Revenue distribution commands. + +echo "doublezero-solana revenue-distribution -h" +$CLI_BIN revenue-distribution -h +echo + +echo "doublezero-solana revenue-distribution fetch -h" +$CLI_BIN revenue-distribution fetch -h +echo + +echo "doublezero-solana -ul revenue-distribution fetch config" +$CLI_BIN -ul revenue-distribution fetch config +echo + +echo "doublezero-solana -ul revenue-distribution fetch validator-deposits" +$CLI_BIN -ul revenue-distribution fetch validator-deposits +echo + +### Backwards compatibility: the legacy per-verb (trailing) flag form must keep +### working. These mirror the global-flag invocations above but pass --url/-u and +### the hidden --dz-env AFTER the subcommand, the way pre-RFC-20 scripts did. The +### output must match the equivalent global-flag invocation. (-k coverage: see the +### publisher-rewards init below, which uses the trailing form.) + +echo "[back-compat] doublezero-solana revenue-distribution fetch config -ul" +$CLI_BIN revenue-distribution fetch config -ul +echo + +echo "[back-compat] doublezero-solana revenue-distribution fetch validator-deposits -ul" +$CLI_BIN revenue-distribution fetch validator-deposits -ul +echo + +echo "[back-compat] doublezero-solana revenue-distribution fetch distribution -ul --dz-env mainnet-beta" +$CLI_BIN revenue-distribution fetch distribution -ul --dz-env mainnet-beta +echo + +echo "doublezero-solana revenue-distribution contributor-rewards -h" +$CLI_BIN revenue-distribution contributor-rewards -h +echo + +echo "doublezero-solana -ul revenue-distribution contributor-rewards --initialize -v $(solana address -k service_key_1.json)" +$CLI_BIN -ul revenue-distribution contributor-rewards \ + --initialize \ + -v \ + $(solana address -k service_key_1.json) +echo + +echo "doublezero-solana -ul revenue-distribution validator-deposit --fund 4.2069 -v --node-id $DUMMY_KEY" +$CLI_BIN -ul revenue-distribution validator-deposit \ + --fund 4.2069 \ + -v \ + --node-id $DUMMY_KEY +echo + +echo "doublezero-solana -ul revenue-distribution validator-deposit --fund 69.420 -v --node-id $DUMMY_KEY" +$CLI_BIN -ul revenue-distribution validator-deposit \ + --fund 69.420 \ + -v \ + --node-id $DUMMY_KEY +echo + +echo "doublezero-solana -ul revenue-distribution fetch validator-deposits --node-id $DUMMY_KEY" +$CLI_BIN -ul revenue-distribution fetch validator-deposits --node-id $DUMMY_KEY +echo + +echo "doublezero-solana -ul revenue-distribution fetch validator-deposits --node-id $DUMMY_KEY --balance-only" +$CLI_BIN -ul revenue-distribution fetch validator-deposits --node-id $DUMMY_KEY --balance-only +echo + +echo "doublezero-solana -ul revenue-distribution fetch validator-deposits" +$CLI_BIN -ul revenue-distribution fetch validator-deposits +echo + +echo "doublezero-solana -ul revenue-distribution fetch distribution" +$CLI_BIN -ul revenue-distribution fetch distribution +echo + +echo "doublezero-solana -um revenue-distribution fetch distribution --dz-epoch $GENESIS_DZ_EPOCH" +$CLI_BIN -um revenue-distribution fetch distribution --dz-epoch $GENESIS_DZ_EPOCH +echo + +echo "doublezero-solana -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH" +$CLI_BIN -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH +echo + +echo "doublezero-solana -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH --view summary" +$CLI_BIN -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH --view summary +echo + +echo "doublezero-solana -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH --view validator-debt" +$CLI_BIN -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH --view validator-debt +echo + +echo "doublezero-solana -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH --view unprocessed-validator-debt" +$CLI_BIN -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH --view unprocessed-validator-debt +echo + +echo "doublezero-solana -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH --view written-off-validator-debt" +$CLI_BIN -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH --view written-off-validator-debt +echo + +echo "doublezero-solana -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH --view rewards" +$CLI_BIN -um revenue-distribution fetch distribution -e $GENESIS_DZ_EPOCH --view rewards +echo + +### Pay outstanding debt for a random validator. +NODE_ID=12i8gndWWWMTRzJBFhnYkobNgZB3XMUUJq75HeUrshrk + +echo "doublezero-solana -ul revenue-distribution fetch validator-deposits --node-id $NODE_ID" +$CLI_BIN -ul revenue-distribution fetch validator-deposits --node-id $NODE_ID +echo + +# --dz-env pins the DZ Ledger environment (debt records live there): the +# fork's genesis hash is unknown, so detection would fall back to localnet. +# Same flag main's pre-RFC-20 script passes on these invocations. +echo "doublezero-solana -ul revenue-distribution fetch validator-debts --node-id $NODE_ID --dz-env mainnet-beta" +$CLI_BIN -ul revenue-distribution fetch validator-debts --node-id $NODE_ID --dz-env mainnet-beta +echo + +echo "doublezero-solana -ul revenue-distribution validator-deposit --node-id $NODE_ID --fund-outstanding-debt --dz-env mainnet-beta" +$CLI_BIN -ul revenue-distribution validator-deposit \ + --node-id $NODE_ID \ + --fund-outstanding-debt \ + --dz-env mainnet-beta +echo + +echo "doublezero-solana -ul revenue-distribution fetch validator-deposits --node-id $NODE_ID" +$CLI_BIN -ul revenue-distribution fetch validator-deposits --node-id $NODE_ID +echo + +echo "doublezero-solana -ul revenue-distribution fetch validator-debts --node-id $NODE_ID --dz-env mainnet-beta" +$CLI_BIN -ul revenue-distribution fetch validator-debts --node-id $NODE_ID --dz-env mainnet-beta +echo + +echo "doublezero-solana -ul revenue-distribution validator-deposit --withdraw-excess-balance -v --node-id $DUMMY_KEY" +$CLI_BIN -ul revenue-distribution validator-deposit \ + --withdraw-excess-balance \ + -v \ + --node-id $DUMMY_KEY +echo + +### Validator-client claim commands. +# Skipped when manager_keypair.json is not present. To exercise this block, +# generate the keypair BEFORE starting the fork loader and pass its pubkey: +# +# solana-keygen new --silent --no-bip39-passphrase -o manager_keypair.json +# cargo run --bin doublezero-solana-fork -- -um --reset \ +# --synthetic-validator-client-rewards-manager $(solana address -k manager_keypair.json) +# bash sh/test_doublezero_solana_fork.sh +# +# The fork loader bakes a synthetic ValidatorClientRewards PDA at +# `client_id=65535` with the keypair's pubkey as the manager_key. +# +# Note: in v1, the on-chain `InitializeClaimHoldingAccount` handler +# constrains the mint to the 2Z mint. We can't `mint-to` 2Z (no +# authority on mainnet), so the holding stays at balance=0; claim still +# exercises the full ix path and closes the holding, recovering rent. + +# Mainnet 2Z mint, hard-coded because the fork is `-um` mainnet. +DOUBLEZERO_MINT=J6pQQ3FAcJQeWPPGppWRb4nM8jU3wLyYbRrLh7feMfvd +MANAGER_KEY_PATH=manager_keypair.json +if [ -f "$MANAGER_KEY_PATH" ]; then + CLIENT_ID=65535 + MANAGER_PUBKEY=$(solana address -k $MANAGER_KEY_PATH) + TEST_EPOCH=100 + + echo "solana airdrop -ul 1 -k $MANAGER_KEY_PATH" + solana airdrop -ul 1 -k $MANAGER_KEY_PATH + echo + + echo "solana-keygen new --silent --no-bip39-passphrase -o claim_payer.json" + solana-keygen new --silent --no-bip39-passphrase -o claim_payer.json + solana airdrop -ul 10 -k claim_payer.json + echo + + echo "spl-token create-account -ul $DOUBLEZERO_MINT --owner $MANAGER_PUBKEY --fee-payer claim_payer.json" + spl-token create-account \ + -ul \ + $DOUBLEZERO_MINT \ + --owner $MANAGER_PUBKEY \ + --fee-payer claim_payer.json + echo + + echo "doublezero-solana -ul shreds validator-client-rewards show --client-id $CLIENT_ID" + $CLI_BIN -ul shreds validator-client-rewards show --client-id $CLIENT_ID + echo + + echo "doublezero-solana -ul -k claim_payer.json shreds validator-client-rewards init-holding --client-id $CLIENT_ID --rewards-token-mint $DOUBLEZERO_MINT --subscription-epoch $TEST_EPOCH" + $CLI_BIN -ul -k claim_payer.json shreds validator-client-rewards init-holding \ + --client-id $CLIENT_ID \ + --rewards-token-mint $DOUBLEZERO_MINT \ + --subscription-epoch $TEST_EPOCH + echo + + echo "doublezero-solana -ul shreds validator-client-rewards show --client-id $CLIENT_ID --rewards-token-mint $DOUBLEZERO_MINT --subscription-epoch $TEST_EPOCH" + $CLI_BIN -ul shreds validator-client-rewards show \ + --client-id $CLIENT_ID \ + --rewards-token-mint $DOUBLEZERO_MINT \ + --subscription-epoch $TEST_EPOCH + echo + + echo "doublezero-solana -ul -k $MANAGER_KEY_PATH shreds validator-client-rewards claim --client-id $CLIENT_ID --rewards-token-mint $DOUBLEZERO_MINT --subscription-epoch $TEST_EPOCH" + $CLI_BIN -ul -k $MANAGER_KEY_PATH shreds validator-client-rewards claim \ + --client-id $CLIENT_ID \ + --rewards-token-mint $DOUBLEZERO_MINT \ + --subscription-epoch $TEST_EPOCH + echo + + echo "doublezero-solana -ul shreds validator-client-rewards show --client-id $CLIENT_ID --rewards-token-mint $DOUBLEZERO_MINT --subscription-epoch $TEST_EPOCH" + $CLI_BIN -ul shreds validator-client-rewards show \ + --client-id $CLIENT_ID \ + --rewards-token-mint $DOUBLEZERO_MINT \ + --subscription-epoch $TEST_EPOCH + echo +else + echo "Skipping validator-client claim commands: $MANAGER_KEY_PATH not found." + echo "To exercise this block, generate the keypair before starting the fork loader:" + echo " solana-keygen new --silent --no-bip39-passphrase -o $MANAGER_KEY_PATH" + echo " cargo run --bin doublezero-solana-fork -- -um --reset --synthetic-validator-client-rewards-manager \$(solana address -k $MANAGER_KEY_PATH)" + echo +fi + +### Shreds publisher-rewards commands. + +echo "doublezero-solana shreds publisher-rewards -h" +$CLI_BIN shreds publisher-rewards -h +echo + +NODE_ID=$(solana address -k test-ledger/validator-keypair.json) +# Canonical 2Z mint on mainnet-beta. Pinned literal so the script doesn't +# need to import Rust constants. Source: doublezero_revenue_distribution::env::mainnet::DOUBLEZERO_MINT_KEY. +DZ_MINT="J6pQQ3FAcJQeWPPGppWRb4nM8jU3wLyYbRrLh7feMfvd" +ANOTHER_PAYER_KEY=$(solana address -k another_payer.json) + +# Airdrop SOL to the validator identity so it can pay tx fees on the direct +# configure path (where the fee-payer keypair doubles as the validator +# identity). +solana airdrop -ul 1 -k test-ledger/validator-keypair.json +echo + +# `configure` idempotently creates the rewards-token ATA for the supplied +# owner/mint pair, so no separate `spl-token create-account` step is needed. +# The 2Z mint is forked from mainnet. + +# Init (paid by dummy). Uses the legacy trailing-flag form (-ul/-k AFTER the +# subcommand) to exercise backwards compatibility of a write verb end-to-end. +echo "[back-compat] doublezero-solana shreds publisher-rewards init --node-id $NODE_ID -ul -k dummy.json" +$CLI_BIN shreds publisher-rewards init --node-id $NODE_ID -ul -k dummy.json +echo + +# Direct path: fee-payer keypair (-k) doubles as the validator identity, so we +# pass the validator-keypair as the fee-payer and --node-id matches its pubkey. +echo "doublezero-solana -ul -k test-ledger/validator-keypair.json shreds publisher-rewards configure (direct path)" +$CLI_BIN -ul -k test-ledger/validator-keypair.json shreds publisher-rewards configure \ + --node-id $NODE_ID --rewards-token-mint $DZ_MINT --rewards-token-owner $DUMMY_KEY +echo + +echo "doublezero-solana -ul shreds publisher-rewards show --node-id $NODE_ID" +$CLI_BIN -ul shreds publisher-rewards show --node-id $NODE_ID +echo + +# Offchain path: prepare -> solana sign-offchain-message -> configure +echo "Preparing offchain authorization message..." +PREPARED=$($CLI_BIN -ul shreds publisher-rewards prepare-offchain-message \ + --node-id $NODE_ID --rewards-token-mint $DZ_MINT \ + --rewards-token-owner $ANOTHER_PAYER_KEY --valid-for 1h --json) +HEX=$(echo "$PREPARED" | jq -r .hex) +DEADLINE=$(echo "$PREPARED" | jq -r .deadline_slot) + +echo "Signing message with validator identity..." +SIG=$(solana sign-offchain-message -k test-ledger/validator-keypair.json "$HEX") + +echo "doublezero-solana -ul -k another_payer.json shreds publisher-rewards configure (offchain path)" +$CLI_BIN -ul -k another_payer.json shreds publisher-rewards configure \ + --node-id $NODE_ID --rewards-token-mint $DZ_MINT \ + --rewards-token-owner $ANOTHER_PAYER_KEY \ + --signature "$SIG" --deadline-slot "$DEADLINE" +echo + +echo "doublezero-solana -ul shreds publisher-rewards show --node-id $NODE_ID" +$CLI_BIN -ul shreds publisher-rewards show --node-id $NODE_ID +echo + +### Clean up. + +echo "rm dummy.json another_payer.json rewards_manager.json " \ + "service_key_1.json validator_node_id.json claim_payer.json" +rm \ + dummy.json \ + another_payer.json \ + rewards_manager.json \ + service_key_1.json +rm -f claim_payer.json diff --git a/offchain/sh/test_full_debt_flow.sh b/offchain/sh/test_full_debt_flow.sh new file mode 100755 index 0000000000..392d35bfe8 --- /dev/null +++ b/offchain/sh/test_full_debt_flow.sh @@ -0,0 +1,414 @@ +#!/bin/bash +# +# End-to-End Test: Initialize → Calculate → Finalize → Collect Debt +# +# This script tests the full validator debt lifecycle on a local Solana fork. +# It requires: +# - Built binaries in target/debug/ +# - Forked mainnet accounts with revenue distribution program state +# +# The script will automatically start and stop the Solana fork. +# +# Usage: +# ./sh/test_full_debt_flow.sh +# +# Environment variables: +# DZ_EPOCH - Override the DZ epoch to test (default: auto-detect) +# SKIP_INITIALIZE - Set to "1" to skip initialization step +# SKIP_CALCULATE - Set to "1" to skip calculation step +# SKIP_FINALIZE - Set to "1" to skip finalization step +# SKIP_COLLECT - Set to "1" to skip debt collection step +# SKIP_FORK_START - Set to "1" to skip starting the fork (use existing) +# VERBOSE - Set to "1" for verbose debugging output + +set -eu + +# Verbose mode +if [ "${VERBOSE:-0}" = "1" ]; then + set -x +fi + +# Constants +TEST_DEBT_ACCOUNTANT_KEY=acLisxTpNkoctPZoqssyo58pcdnHzJyRFhod7Wxkz5a +VALIDATOR_DEBT_CLI=target/debug/doublezero-solana-validator-debt +ADMIN_CLI=target/debug/doublezero-revenue-distribution-admin +SOLANA_CLI=target/debug/doublezero-solana +SOLANA_FORK_CLI=target/debug/doublezero-solana-fork +FORK_STARTUP_WAIT=${FORK_STARTUP_WAIT:-120} +FORK_STARTUP_INTERVAL=${FORK_STARTUP_INTERVAL:-2} +TRANSACTION_CONFIRMATION_WAIT=${TRANSACTION_CONFIRMATION_WAIT:-10} + +# PID of the fork process (for cleanup) +FORK_PID="" +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +log_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +log_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +log_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +log_step() { + echo "" + echo -e "${GREEN}============================================${NC}" + echo -e "${GREEN} STEP: $1${NC}" + echo -e "${GREEN}============================================${NC}" + echo "" +} + +# Cleanup function to stop the fork on exit +cleanup() { + if [ -n "$FORK_PID" ] && kill -0 "$FORK_PID" 2>/dev/null; then + log_info "Stopping Solana fork (PID: $FORK_PID)..." + kill "$FORK_PID" 2>/dev/null || true + wait "$FORK_PID" 2>/dev/null || true + log_success "Solana fork stopped" + fi +} + +# Set up trap to cleanup on exit +trap cleanup EXIT INT TERM + +# Start the Solana fork +start_solana_fork() { + if [ "${SKIP_FORK_START:-0}" = "1" ]; then + log_warning "Skipping fork start (SKIP_FORK_START=1)" + return 0 + fi + + log_info "Starting Solana fork..." + + if [ ! -f "$SOLANA_FORK_CLI" ]; then + log_error "Solana fork CLI not found at $SOLANA_FORK_CLI" + log_info "Run 'cargo build' first" + exit 1 + fi + + # Start the fork in the background + $SOLANA_FORK_CLI --reset --god-mode & + FORK_PID=$! + + log_info "Solana fork started with PID: $FORK_PID" +} + +# Wait for Solana fork to start +wait_for_solana() { + log_info "Waiting for Solana fork to start..." + local max_attempts=$((FORK_STARTUP_WAIT / FORK_STARTUP_INTERVAL)) + for i in $(seq 1 "$max_attempts"); do + if solana cluster-version -u l > /dev/null 2>&1; then + log_success "Solana fork is ready." + return 0 + fi + sleep "$FORK_STARTUP_INTERVAL" + done + + log_error "Solana fork did not start within $FORK_STARTUP_WAIT seconds" + exit 1 +} + +# Verify binaries exist +verify_binaries() { + log_info "Verifying required binaries..." + + if [ ! -f "$VALIDATOR_DEBT_CLI" ]; then + log_error "Validator debt CLI not found at $VALIDATOR_DEBT_CLI" + log_info "Run 'cargo build' first" + exit 1 + fi + + if [ ! -f "$ADMIN_CLI" ]; then + log_error "Admin CLI not found at $ADMIN_CLI" + log_info "Run 'cargo build' first" + exit 1 + fi + + if [ ! -f "$SOLANA_CLI" ]; then + log_error "Solana CLI not found at $SOLANA_CLI" + log_info "Run 'cargo build' first" + exit 1 + fi + + if [ ! -f "$SOLANA_FORK_CLI" ]; then + log_error "Solana fork CLI not found at $SOLANA_FORK_CLI" + log_info "Run 'cargo build' first" + exit 1 + fi + + log_success "All binaries found" +} + +# Get current epoch from program config +get_current_epoch() { + $ADMIN_CLI fetch-current-epoch -ul +} + +# Configure the debt write-off feature (required for full flow) +configure_debt_write_off() { + local current_epoch=$1 + local activation_epoch=$((current_epoch + 1)) + + log_info "Configuring Solana validator debt write-off feature activation epoch to $activation_epoch" + + $ADMIN_CLI configure -ul \ + --solana-validator-debt-write-off-feature-activation-epoch "$activation_epoch" \ + || log_warning "Configuration may have already been set" +} + +# Step 1: Initialize Distribution +step_initialize() { + log_step "1. INITIALIZE DISTRIBUTION" + + if [ "${SKIP_INITIALIZE:-0}" = "1" ]; then + log_warning "Skipping initialization (SKIP_INITIALIZE=1)" + return 0 + fi + + log_info "Initializing distribution for DZ epoch: $DZ_EPOCH" + log_info "Using debt accountant: $TEST_DEBT_ACCOUNTANT_KEY" + + echo "$ $VALIDATOR_DEBT_CLI initialize-distribution -v -ul --dz-env mainnet-beta --bypass-dz-epoch-check --record-debt-accountant $TEST_DEBT_ACCOUNTANT_KEY --with-compute-unit-price 1000" + + $VALIDATOR_DEBT_CLI initialize-distribution \ + -v \ + -ul \ + --dz-env mainnet-beta \ + --bypass-dz-epoch-check \ + --record-debt-accountant "$TEST_DEBT_ACCOUNTANT_KEY" \ + --with-compute-unit-price 1000 + + log_success "Distribution initialized" +} + +# Step 2: Calculate Validator Debt +step_calculate() { + log_step "2. CALCULATE VALIDATOR DEBT" + + if [ "${SKIP_CALCULATE:-0}" = "1" ]; then + log_warning "Skipping calculation (SKIP_CALCULATE=1)" + return 0 + fi + + log_info "Calculating validator debt for DZ epoch: $DZ_EPOCH" + + # Fetch the distribution to verify it exists + log_info "Verifying distribution exists..." + echo "$ $SOLANA_CLI revenue-distribution fetch distribution -ul --dz-epoch $DZ_EPOCH" + $SOLANA_CLI revenue-distribution fetch distribution -ul --dz-epoch "$DZ_EPOCH" --view summary || true + + log_info "Running debt calculation..." + echo "$ $VALIDATOR_DEBT_CLI calculate-validator-debt --epoch $DZ_EPOCH -ul --dz-ledger-url http://localhost:8899" + + # Note: This requires the DZ Ledger to be running or a mock. + # In local testing, we might need to use --post-to-ledger-only or --dry-run + $VALIDATOR_DEBT_CLI calculate-validator-debt \ + --epoch "$DZ_EPOCH" \ + -ul \ + --dz-ledger-url http://localhost:8899 \ + --force \ + || { + log_warning "Calculation failed - this may be expected if DZ Ledger is not available" + log_info "Trying with --dry-run instead..." + $VALIDATOR_DEBT_CLI calculate-validator-debt \ + --epoch "$DZ_EPOCH" \ + -ul \ + --dz-ledger-url http://localhost:8899 \ + --dry-run \ + --force \ + || log_warning "Dry run also failed - continuing anyway" + } + + log_success "Debt calculation step completed" +} + +# Step 3: Finalize Distribution +step_finalize() { + log_step "3. FINALIZE DISTRIBUTION" + + if [ "${SKIP_FINALIZE:-0}" = "1" ]; then + log_warning "Skipping finalization (SKIP_FINALIZE=1)" + return 0 + fi + + log_info "Finalizing distribution for DZ epoch: $DZ_EPOCH" + + echo "$ $VALIDATOR_DEBT_CLI finalize-distribution --epoch $DZ_EPOCH -ul --dz-ledger-url http://localhost:8899" + + $VALIDATOR_DEBT_CLI finalize-distribution \ + --epoch "$DZ_EPOCH" \ + -ul \ + || { + log_warning "Finalization may have failed or already completed" + } + + # Verify the distribution is finalized + log_info "Verifying finalization..." + $SOLANA_CLI revenue-distribution fetch distribution -ul --dz-epoch "$DZ_EPOCH" --view summary || true + + log_success "Finalization step completed" +} + +# Step 4: Collect Debt +step_collect() { + log_step "4. COLLECT VALIDATOR DEBT" + + if [ "${SKIP_COLLECT:-0}" = "1" ]; then + log_warning "Skipping debt collection (SKIP_COLLECT=1)" + return 0 + fi + + # First, let's fund a test validator deposit account + log_info "Setting up test validator for debt collection..." + + # Generate a test validator keypair + solana-keygen new --silent --no-bip39-passphrase -o test_validator.json --force + local test_validator_id + test_validator_id=$(solana address -k test_validator.json) + log_info "Test validator ID: $test_validator_id" + + # Fund the validator deposit + log_info "Funding validator deposit account..." + $SOLANA_CLI revenue-distribution validator-deposit \ + --fund 1.0 \ + -ul \ + -v \ + --node-id "$test_validator_id" \ + || log_warning "Could not fund validator deposit" + + # Check validator deposit balance + log_info "Checking validator deposit balance..." + $SOLANA_CLI revenue-distribution fetch validator-deposits -ul --node-id "$test_validator_id" || true + + # Check if there's outstanding debt for any validators + log_info "Checking for outstanding validator debts..." + $SOLANA_CLI revenue-distribution fetch validator-debts -ul --dz-env mainnet-beta || true + + # Attempt to pay outstanding debt (this uses the Solana CLI) + log_info "Attempting to pay outstanding debt..." + $SOLANA_CLI revenue-distribution validator-deposit \ + --node-id "$test_validator_id" \ + -ul \ + --fund-outstanding-debt \ + --dz-env mainnet-beta \ + || log_warning "No outstanding debt to pay or payment failed" + + # Clean up test validator keypair + rm -f test_validator.json + + log_success "Debt collection step completed" +} + +# View distribution summary +view_distribution_summary() { + log_step "DISTRIBUTION SUMMARY" + + log_info "Fetching distribution summary for epoch $DZ_EPOCH..." + + echo "" + echo "=== Full Distribution Details ===" + $SOLANA_CLI revenue-distribution fetch distribution -ul --dz-epoch "$DZ_EPOCH" || true + + echo "" + echo "=== Summary View ===" + $SOLANA_CLI revenue-distribution fetch distribution -ul --dz-epoch "$DZ_EPOCH" --view summary || true + + echo "" + echo "=== Validator Debt View ===" + $SOLANA_CLI revenue-distribution fetch distribution -ul --dz-epoch "$DZ_EPOCH" --view validator-debt || true + + echo "" + echo "=== Unprocessed Validator Debt ===" + $SOLANA_CLI revenue-distribution fetch distribution -ul --dz-epoch "$DZ_EPOCH" --view unprocessed-validator-debt || true + + echo "" + echo "=== Rewards View ===" + $SOLANA_CLI revenue-distribution fetch distribution -ul --dz-epoch "$DZ_EPOCH" --view rewards || true +} + +# Run a quick sanity check of the CLI binaries +sanity_check() { + log_step "SANITY CHECK" + + log_info "Checking validator debt CLI..." + $VALIDATOR_DEBT_CLI --version + $VALIDATOR_DEBT_CLI -h | head -10 + + log_info "Checking admin CLI..." + $ADMIN_CLI --version || true + + log_info "Checking Solana CLI..." + $SOLANA_CLI --version +} + +# Main execution +main() { + echo "" + echo "============================================" + echo " DoubleZero Validator Debt End-to-End Test" + echo "============================================" + echo "" + + # Verify environment + verify_binaries + + # Start the Solana fork + start_solana_fork + + # Wait for it to be ready + wait_for_solana + + # Fund the test wallet on the fork + log_info "Airdropping SOL to test wallet..." + solana airdrop 100 -ul + + sanity_check + + # Get current epoch + log_info "Fetching current DZ epoch..." + CURRENT_EPOCH=$(get_current_epoch) + log_info "Current DZ epoch from program: $CURRENT_EPOCH" + + # Use provided DZ_EPOCH or default to current + DZ_EPOCH=${DZ_EPOCH:-$CURRENT_EPOCH} + log_info "Testing with DZ epoch: $DZ_EPOCH" + + # Configure debt write-off feature + configure_debt_write_off "$CURRENT_EPOCH" + + # Run all steps + step_initialize + + # If we just initialized, we might need to wait + if [ "${SKIP_INITIALIZE:-0}" != "1" ]; then + log_info "Waiting $TRANSACTION_CONFIRMATION_WAIT seconds for transaction to confirm..." + sleep "$TRANSACTION_CONFIRMATION_WAIT" + fi + + step_calculate + step_finalize + step_collect + + # Show final summary + view_distribution_summary + + log_step "TEST COMPLETE" + log_success "All steps executed. Check output above for any warnings or errors." +} + +# Run main +main "$@" \ No newline at end of file diff --git a/offchain/sh/test_validator_debt_fork.sh b/offchain/sh/test_validator_debt_fork.sh new file mode 100755 index 0000000000..9addcc8130 --- /dev/null +++ b/offchain/sh/test_validator_debt_fork.sh @@ -0,0 +1,137 @@ + +#!/bin/bash + +MAINNET_BETA_DEBT_ACCOUNTANT_KEY=acLisxTpNkoctPZoqssyo58pcdnHzJyRFhod7Wxkz5a + +set -eu + +# Wait for Solana fork to start. Only try for 60 seconds. +for i in {1..60}; do + if solana cluster-version -u l > /dev/null 2>&1; then + echo "Solana fork is ready." + break + fi + sleep 2 +done + +# If not ready after 60 seconds, bail out. +if ! solana cluster-version -u l > /dev/null 2>&1; then + echo "Solana fork did not start within 60 seconds." >&2 + exit 1 +fi + +### Fund the test wallet on the fork. +echo "Airdropping SOL to test wallet..." +solana airdrop 100 -ul + +### Set up environment. + +ADMIN_CLI_BIN=target/debug/doublezero-revenue-distribution-admin +CLI_BIN=target/debug/doublezero-solana-validator-debt +DZ_SOLANA_CLI_BIN=target/debug/doublezero-solana + +### Mimic 2Z transfers to the Journal's ATA. +spl-token mint -ul J6pQQ3FAcJQeWPPGppWRb4nM8jU3wLyYbRrLh7feMfvd 69000000 7ZQuXUHeeK4HkQCM49fqgqfwcoBvuAiHGm1eUTiUaRep +spl-token mint -ul J6pQQ3FAcJQeWPPGppWRb4nM8jU3wLyYbRrLh7feMfvd 420000 7ZQuXUHeeK4HkQCM49fqgqfwcoBvuAiHGm1eUTiUaRep + +echo "doublezero-revenue-distribution-admin fetch-current-epoch -ul" +CURRENT_EPOCH=$($ADMIN_CLI_BIN fetch-current-epoch -ul) +echo $CURRENT_EPOCH + +### Activate Solana validator debt write-off feature after the next epoch. +SOLANA_VALIDATOR_DEBT_WRITE_OFF_ACTIVATION_EPOCH=$((CURRENT_EPOCH + 1)) + +echo "doublezero-revenue-distribution-admin configure -ul --solana-validator-debt-write-off-feature-activation-epoch $SOLANA_VALIDATOR_DEBT_WRITE_OFF_ACTIVATION_EPOCH" +$ADMIN_CLI_BIN configure \ + -ul \ + --solana-validator-debt-write-off-feature-activation-epoch $SOLANA_VALIDATOR_DEBT_WRITE_OFF_ACTIVATION_EPOCH + +### Begin tests. + +$CLI_BIN -h +echo + +echo "Revenue Distribution Program Config" +echo "-----------------------------------" +echo + +$DZ_SOLANA_CLI_BIN -ul revenue-distribution fetch config +echo + +echo "Current distribution" +echo "--------------------" +echo + +$DZ_SOLANA_CLI_BIN -ul revenue-distribution fetch distribution \ + --debt-accountant $MAINNET_BETA_DEBT_ACCOUNTANT_KEY +echo + +### Backwards compatibility: the legacy per-verb (trailing) flag form must keep +### working. Mirrors the fetch above but passes --url/-u and the hidden --dz-env +### AFTER the subcommand; output must match the global-flag form. +echo "[back-compat] doublezero-solana revenue-distribution fetch distribution -ul --dz-env mainnet-beta --debt-accountant ..." +$DZ_SOLANA_CLI_BIN revenue-distribution fetch distribution -ul \ + --dz-env mainnet-beta \ + --debt-accountant $MAINNET_BETA_DEBT_ACCOUNTANT_KEY +echo + +### Initialize. + +echo "doublezero-solana-validator-debt initialize-distribution -h" +$CLI_BIN initialize-distribution -h +echo + +echo "doublezero-solana-validator-debt initialize-distribution -v -ul --dz-env mainnet-beta --bypass-dz-epoch-check --record-debt-accountant ${MAINNET_BETA_DEBT_ACCOUNTANT_KEY} --with-compute-unit-price 1000" +$CLI_BIN initialize-distribution \ + -v \ + -ul \ + --dz-env mainnet-beta \ + --bypass-dz-epoch-check \ + --record-debt-accountant $MAINNET_BETA_DEBT_ACCOUNTANT_KEY \ + --with-compute-unit-price 1000 +echo + +echo "Revenue Distribution Program Config" +echo "-----------------------------------" +echo + +$DZ_SOLANA_CLI_BIN -ul revenue-distribution fetch config +echo + +echo "Current distribution" +echo "--------------------" +echo + +$DZ_SOLANA_CLI_BIN -ul revenue-distribution fetch distribution \ + --debt-accountant $MAINNET_BETA_DEBT_ACCOUNTANT_KEY +echo + +### In --god-mode, the time to wait for a new initialized distribution is one +### minute. +echo "sleep 60" +sleep 60 + +echo "doublezero-solana-validator-debt initialize-distribution -v -ul --dz-env mainnet-beta --bypass-dz-epoch-check --record-debt-accountant ${MAINNET_BETA_DEBT_ACCOUNTANT_KEY} --with-compute-unit-price 1000" +$CLI_BIN initialize-distribution \ + -v \ + -ul \ + --dz-env mainnet-beta \ + --bypass-dz-epoch-check \ + --record-debt-accountant $MAINNET_BETA_DEBT_ACCOUNTANT_KEY \ + --with-compute-unit-price 1000 +echo + +echo "Revenue Distribution Program Config" +echo "-----------------------------------" +echo + +$DZ_SOLANA_CLI_BIN -ul revenue-distribution fetch config +echo + +echo "Current distribution" +echo "--------------------" +echo + +$DZ_SOLANA_CLI_BIN -ul revenue-distribution fetch distribution \ + --debt-accountant $MAINNET_BETA_DEBT_ACCOUNTANT_KEY +echo diff --git a/solana/.github/workflows/local-validator.yml b/solana/.github/workflows/local-validator.yml new file mode 100644 index 0000000000..61f728b0c1 --- /dev/null +++ b/solana/.github/workflows/local-validator.yml @@ -0,0 +1,59 @@ +name: local-validator +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + SOLANA_CLI: v3.0.12 + DOUBLEZERO_OFFCHAIN_GIT_INSTALL: --git https://github.com/malbeclabs/doublezero-offchain.git --locked + +jobs: + mainnet-fork-upgrade: + # Disabled: the migrate-program-accounts instruction now takes a journal + # plus a list of distribution accounts, so the admin CLI invocation below + # no longer matches. Needs a rethink before this can run again. + if: false + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - name: Solana toolchain + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/$SOLANA_CLI/install)" + echo "$HOME/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH + - name: Generate ~/.config/solana/id.json + run: solana-keygen new --silent --no-bip39-passphrase + - name: Install `doublezero-solana-fork` CLI + run: cargo install doublezero-solana-fork-cli $DOUBLEZERO_OFFCHAIN_GIT_INSTALL + - name: Start Solana mainnet-beta fork in background + run: doublezero-solana-fork -um --reset --god-mode > /dev/null 2>&1 & + - name: Install `doublezero-revenue-distribution-admin` CLI + run: cargo install doublezero-revenue-distribution-admin-cli $DOUBLEZERO_OFFCHAIN_GIT_INSTALL + - name: Build Revenue Distribution program + run: make build-artifacts + - name: Wait for local validator to be ready + run: | + echo "Waiting for solana-test-validator to start..." + for i in {1..30}; do + if solana cluster-version -ul > /dev/null 2>&1; then + solana cluster-version -ul + break + fi + echo "Attempt $i: solana-test-validator not ready yet, waiting..." + sleep 5 + done + if ! solana cluster-version -ul > /dev/null 2>&1; then + echo "solana-test-validator failed to start within timeout" + exit 1 + fi + - name: Upgrade Revenue Distribution program + run: solana program deploy -ul --program-id dzrevZC94tBLwuHw1dyynZxaXTWyp7yocsinyEVPtt4 artifacts-mainnet-beta/doublezero_revenue_distribution.so + - name: Wait for upgrade to finalize + run: sleep 15 + - name: Perform Revenue Distribution program migration + run: doublezero-revenue-distribution-admin migrate-program-accounts -ul -v + - name: Perform Revenue Distribution program migration again + run: doublezero-revenue-distribution-admin migrate-program-accounts -ul -v diff --git a/solana/.github/workflows/rust.yml b/solana/.github/workflows/rust.yml new file mode 100644 index 0000000000..24c42b3cef --- /dev/null +++ b/solana/.github/workflows/rust.yml @@ -0,0 +1,58 @@ +name: rust +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +env: + SOLANA_CLI: v3.0.12 + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - run: make lint + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - run: make test-lib + + doc: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - run: make doc + + test-sbf: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - name: Solana toolchain + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/$SOLANA_CLI/install)" + echo "$HOME/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH + - run: make test-sbf + + test-sbf-development: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 + - name: Solana toolchain + run: | + sh -c "$(curl -sSfL https://release.anza.xyz/$SOLANA_CLI/install)" + echo "$HOME/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH + - run: NETWORK=development make test-sbf diff --git a/solana/.github/workflows/verify-build.yml b/solana/.github/workflows/verify-build.yml new file mode 100644 index 0000000000..c5809624c6 --- /dev/null +++ b/solana/.github/workflows/verify-build.yml @@ -0,0 +1,14 @@ +name: verify-build +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + sha256sums: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: NETWORK=mainnet-beta make build-checked-artifacts + - run: NETWORK=development make build-checked-artifacts diff --git a/solana/.gitignore b/solana/.gitignore new file mode 100644 index 0000000000..2e5c5d13b4 --- /dev/null +++ b/solana/.gitignore @@ -0,0 +1,9 @@ +.idea +.private +.vscode +target +test-ledger +.zed +.DS_Store +artifacts-* +localnet/cache \ No newline at end of file diff --git a/solana/Cargo.lock b/solana/Cargo.lock new file mode 100644 index 0000000000..770ff2904a --- /dev/null +++ b/solana/Cargo.lock @@ -0,0 +1,8806 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "agave-feature-set" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60d1d6cdea1a6102777bc970c96f5eb80635b097b7bbc0ee8770425fb13e6020" +dependencies = [ + "ahash 0.8.12", + "solana-epoch-schedule", + "solana-hash 3.1.0", + "solana-pubkey 3.0.0", + "solana-sha256-hasher", + "solana-svm-feature-set", +] + +[[package]] +name = "agave-io-uring" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3349bc98a1ee30343b32a6b4d7e6f2a7efe7b65a359d1c638e00cdcff1c0ba" +dependencies = [ + "io-uring", + "libc", + "log", + "slab", + "smallvec", +] + +[[package]] +name = "agave-precompiles" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add43fafbff72439a1a9f3323dd8f3d6ff3cffe926c8e3fe9c79980d620664ab" +dependencies = [ + "agave-feature-set", + "bincode", + "digest 0.10.7", + "ed25519-dalek 1.0.1", + "libsecp256k1", + "openssl", + "sha3", + "solana-ed25519-program", + "solana-message", + "solana-precompile-error", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-secp256k1-program", + "solana-secp256r1-program", +] + +[[package]] +name = "agave-reserved-account-keys" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e42f6eada9c1a059c32fa416f7885c3c85ffe07f3f2b95bdd8ddd0749e918d" +dependencies = [ + "agave-feature-set", + "solana-pubkey 3.0.0", + "solana-sdk-ids", +] + +[[package]] +name = "agave-syscalls" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c23bd4d08321e47b656fdeb5c89106d547f6460c84ace049cc4f676074dd1e54" +dependencies = [ + "bincode", + "libsecp256k1", + "num-traits", + "solana-account", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-bn254", + "solana-clock", + "solana-cpi", + "solana-curve25519", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keccak-hasher", + "solana-loader-v3-interface", + "solana-poseidon", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-sha256-hasher", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-type-overrides", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction-context", + "thiserror 2.0.17", +] + +[[package]] +name = "agave-transaction-view" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf111212dc76970e53eeb7e506b73ed8fa42f4de24f8ceced67b0c56bea730d7" +dependencies = [ + "solana-hash 3.1.0", + "solana-message", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-svm-transaction", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "arrayvec", + "bytes", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "aquamarine" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" +dependencies = [ + "include_dir", + "itertools 0.10.5", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "asn1-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-compression" +version = "0.4.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ec5f6c2f8bc326c994cb9e241cc257ddaba9afa8555a43cffbb5dd86efaa37" +dependencies = [ + "compression-codecs", + "compression-core", + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-lock" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +dependencies = [ + "event-listener 5.4.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +dependencies = [ + "serde", +] + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "caps" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd1ddba47aba30b6a889298ad0109c3b8dcb0e8fc993b459daa7067d46f865e0" +dependencies = [ + "libc", +] + +[[package]] +name = "cc" +version = "1.2.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cfg_eval" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "num-traits", + "windows-link", +] + +[[package]] +name = "chrono-humanize" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" +dependencies = [ + "chrono", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compression-codecs" +version = "0.4.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0f7ac3e5b97fdce45e8922fb05cae2c37f7bbd63d30dd94821dacfd8f3f2bf2" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.61.2", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctor" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rand_core 0.6.4", + "rustc_version 0.4.1", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.111", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", + "rayon", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.6", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dir-diff" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ad16bf5f84253b50d6557681c58c3ab67c47c77d39fed9aeb56e947290bd10" +dependencies = [ + "walkdir", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "doublezero-passport" +version = "0.2.0" +dependencies = [ + "base64 0.22.1", + "bincode", + "borsh", + "bytemuck", + "ctor", + "doublezero-program-tools", + "env_logger", + "itertools 0.14.0", + "log", + "solana-account-info", + "solana-instruction", + "solana-loader-v3-interface", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-test", + "solana-pubkey 3.0.0", + "solana-sdk", + "solana-system-interface", + "solana-sysvar", +] + +[[package]] +name = "doublezero-program-tools" +version = "0.0.0" +dependencies = [ + "bincode", + "borsh", + "bytemuck", + "ruint", + "sha2-const-stable", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-loader-v3-interface", + "solana-msg", + "solana-program-error", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-system-interface", + "solana-sysvar", + "spl-token-interface", +] + +[[package]] +name = "doublezero-revenue-distribution" +version = "0.3.7" +dependencies = [ + "bincode", + "borsh", + "bytemuck", + "ctor", + "doublezero-program-tools", + "env_logger", + "log", + "mock-rewards-integration", + "mock-swap-sol-2z", + "ruint", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-loader-v3-interface", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-pack", + "solana-program-test", + "solana-pubkey 3.0.0", + "solana-sdk", + "solana-system-interface", + "solana-sysvar", + "spl-associated-token-account-interface", + "spl-token-interface", + "svm-hash", +] + +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + +[[package]] +name = "dtor" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature 2.2.0", + "spki", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature 1.6.4", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature 2.2.0", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek 3.2.0", + "ed25519 1.5.3", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek 4.1.3", + "ed25519 2.2.3", + "rand_core 0.6.4", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", +] + +[[package]] +name = "ed25519-dalek-bip32" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b49a684b133c4980d7ee783936af771516011c8cd15f429dbda77245e282f03" +dependencies = [ + "derivation-path", + "ed25519-dalek 2.2.0", + "hmac 0.12.1", + "sha2 0.10.9", +] + +[[package]] +name = "educe" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "enum-ordinalize" +version = "3.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.1", + "pin-project-lite", +] + +[[package]] +name = "fastbloom" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18c1ddb9231d8554c2d6bdf4cfaabf0c59251658c68b6c95cd52dd0c513a912a" +dependencies = [ + "getrandom 0.3.4", + "libm", + "rand 0.9.2", + "siphasher 1.0.1", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "filetime" +version = "0.2.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.60.2", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "five8" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75b8549488b4715defcb0d8a8a1c1c76a80661b5fa106b4ca0e7fce59d7d875" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f76610e969fa1784327ded240f1e28a3fd9520c9cec93b636fcf62dd37f772" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_const" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0f1728185f277989ca573a402716ae0beaaea3f76a8ff87ef9dd8fb19436c5" +dependencies = [ + "five8_core", +] + +[[package]] +name = "five8_core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fragile" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "governor" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" +dependencies = [ + "cfg-if", + "dashmap", + "futures", + "futures-timer", + "no-std-compat", + "nonzero_ext", + "parking_lot", + "portable-atomic", + "quanta", + "rand 0.8.5", + "smallvec", + "spinning_top", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.12", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "histogram" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.4.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.4.0", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http 1.4.0", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.4.0", + "hyper", + "hyper-util", + "rustls 0.23.35", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tower-service", + "webpki-roots 1.0.4", +] + +[[package]] +name = "hyper-util" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "rayon", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", +] + +[[package]] +name = "indicatif" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88" +dependencies = [ + "console", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "io-uring" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd7bddefd0a8833b88a4b68f90dae22c7450d11b354198baee3874fd811b344" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine 4.6.7", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.9", + "signature 2.2.0", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.178" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" +dependencies = [ + "bitflags", + "libc", + "redox_syscall 0.6.0", +] + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff 0.4.2", + "num-bigint 0.4.6", + "thiserror 1.0.69", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown 0.12.3", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lz4" +version = "1.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" +dependencies = [ + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "mock-rewards-integration" +version = "0.0.0" +dependencies = [ + "borsh", + "bytemuck", + "doublezero-program-tools", + "doublezero-revenue-distribution", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-system-interface", + "solana-sysvar", + "spl-token-interface", +] + +[[package]] +name = "mock-swap-sol-2z" +version = "0.0.0" +dependencies = [ + "borsh", + "bytemuck", + "doublezero-program-tools", + "doublezero-revenue-distribution", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-system-interface", + "solana-sysvar", + "spl-token-interface", +] + +[[package]] +name = "mockall" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "lazy_static", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "modular-bitfield" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" +dependencies = [ + "modular-bitfield-impl", + "static_assertions", +] + +[[package]] +name = "modular-bitfield-impl" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" + +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-src" +version = "300.5.4+3.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "opentelemetry" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" +dependencies = [ + "async-trait", + "crossbeam-channel", + "futures-channel", + "futures-executor", + "futures-util", + "js-sys", + "lazy_static", + "percent-encoding", + "pin-project", + "rand 0.8.5", + "thiserror 1.0.69", +] + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pest" +version = "2.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools 0.10.5", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" + +[[package]] +name = "predicates-tree" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +dependencies = [ + "bitflags", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "quanta" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi 0.11.1+wasi-snapshot-preview1", + "web-sys", + "winapi", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.35", + "socket2", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "fastbloom", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls 0.23.35", + "rustls-pki-types", + "rustls-platform-verifier", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "reqwest" +version = "0.12.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b4c14b2d9afca6a60277086b0cc6a6ae0b568f6f7916c943a8cdc79f8be240f" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.35", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls 0.26.4", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.4", +] + +[[package]] +name = "reqwest-middleware" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" +dependencies = [ + "anyhow", + "async-trait", + "http 1.4.0", + "reqwest", + "serde", + "thiserror 1.0.69", + "tower-service", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac 0.12.1", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "ruint" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecb38f82477f20c5c3d62ef52d7c4e536e38ea9b73fb570a20c5cae0e14bcf6" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytemuck", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.2", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.27", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.103.8", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.35", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.8", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "seqlock" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5c67b6f14ecc5b86c66fa63d76b5092352678545a8a3cdae80aef5128371910" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "serde_core", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2-const-stable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "solana-account" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "014dcb9293341241dd153b35f89ea906e4170914f4a347a95e7fb07ade47cd6f" +dependencies = [ + "bincode", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-instruction-error", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-sysvar", +] + +[[package]] +name = "solana-account-decoder-client-types" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30db952cfdee7a817108f0034a1e10ca6ec3e4aebf73b043286069b8c9c2cb9" +dependencies = [ + "base64 0.22.1", + "bs58", + "serde", + "serde_derive", + "serde_json", + "solana-account", + "solana-pubkey 3.0.0", + "zstd", +] + +[[package]] +name = "solana-account-info" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc3397241392f5756925029acaa8515dc70fcbe3d8059d4885d7d6533baf64fd" +dependencies = [ + "bincode", + "serde_core", + "solana-address 2.0.0", + "solana-program-error", + "solana-program-memory", +] + +[[package]] +name = "solana-accounts-db" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4e24246ff12fe39bb7f2d26745d9168caa783d05cc20a53265c747e862dbb94" +dependencies = [ + "agave-io-uring", + "ahash 0.8.12", + "bincode", + "blake3", + "bv", + "bytemuck", + "bytemuck_derive", + "bzip2", + "crossbeam-channel", + "dashmap", + "indexmap", + "io-uring", + "itertools 0.12.1", + "libc", + "log", + "lz4", + "memmap2 0.9.9", + "modular-bitfield", + "num_cpus", + "num_enum", + "rand 0.8.5", + "rayon", + "seqlock", + "serde", + "serde_derive", + "slab", + "smallvec", + "solana-account", + "solana-address-lookup-table-interface", + "solana-bucket-map", + "solana-clock", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-genesis-config", + "solana-hash 3.1.0", + "solana-lattice-hash", + "solana-measure", + "solana-message", + "solana-metrics", + "solana-nohash-hasher", + "solana-pubkey 3.0.0", + "solana-rayon-threadlimit", + "solana-reward-info", + "solana-sha256-hasher", + "solana-slot-hashes", + "solana-svm-transaction", + "solana-system-interface", + "solana-sysvar", + "solana-time-utils", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "spl-generic-token", + "static_assertions", + "tar", + "tempfile", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-address" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" +dependencies = [ + "solana-address 2.0.0", +] + +[[package]] +name = "solana-address" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e37320fd2945c5d654b2c6210624a52d66c3f1f73b653ed211ab91a703b35bdd" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "five8 1.0.0", + "five8_const", + "rand 0.8.5", + "serde", + "serde_derive", + "solana-atomic-u64", + "solana-define-syscall 4.0.1", + "solana-program-error", + "solana-sanitize", + "solana-sha256-hasher", +] + +[[package]] +name = "solana-address-lookup-table-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2f56cac5e70517a2f27d05e5100b20de7182473ffd0035b23ea273307905987" +dependencies = [ + "bincode", + "bytemuck", + "serde", + "serde_derive", + "solana-clock", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-slot-hashes", +] + +[[package]] +name = "solana-atomic-u64" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a933ff1e50aff72d02173cfcd7511bd8540b027ee720b75f353f594f834216d0" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "solana-banks-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc887eb35277bce8b8ba8f6ac020a5ab94cc9857920fd9f52a7041a235b476c" +dependencies = [ + "borsh", + "futures", + "solana-account", + "solana-banks-interface", + "solana-clock", + "solana-commitment-config", + "solana-hash 3.1.0", + "solana-message", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-signature", + "solana-sysvar", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "tarpc", + "thiserror 2.0.17", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-banks-interface" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b0bb806697ca9f7e6c9082749a6b6f891d126f7c31d3d84a8264880afec16f" +dependencies = [ + "serde", + "serde_derive", + "solana-account", + "solana-clock", + "solana-commitment-config", + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-signature", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "tarpc", +] + +[[package]] +name = "solana-banks-server" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057ef1b15b16e022338fabd6bd61823eba0a34cf7b082730dfd5c3594f533bed" +dependencies = [ + "agave-feature-set", + "bincode", + "crossbeam-channel", + "futures", + "solana-account", + "solana-banks-interface", + "solana-client", + "solana-clock", + "solana-commitment-config", + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-runtime", + "solana-runtime-transaction", + "solana-send-transaction-service", + "solana-signature", + "solana-svm", + "solana-transaction", + "solana-transaction-error", + "tarpc", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-big-mod-exp" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "solana-define-syscall 3.0.0", +] + +[[package]] +name = "solana-bincode" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278a1a5bad62cd9da89ac8d4b7ec444e83caa8ae96aa656dfc27684b28d49a5d" +dependencies = [ + "bincode", + "serde_core", + "solana-instruction-error", +] + +[[package]] +name = "solana-blake3-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" +dependencies = [ + "blake3", + "solana-define-syscall 4.0.1", + "solana-hash 4.0.1", +] + +[[package]] +name = "solana-bn254" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d08583be08d2d5f19aa21efbb6fbdb968ba7fd0de74562441437a7d776772bf" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "bytemuck", + "solana-define-syscall 3.0.0", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-borsh" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc402b16657abbfa9991cd5cbfac5a11d809f7e7d28d3bb291baeb088b39060e" +dependencies = [ + "borsh", +] + +[[package]] +name = "solana-bpf-loader-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e450aab0c6ce825fbad7baf9e64c706d51def4842b7176fb172abfa1307939f" +dependencies = [ + "agave-syscalls", + "bincode", + "qualifier_attr", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-system-interface", + "solana-transaction-context", +] + +[[package]] +name = "solana-bucket-map" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "286c8b3d6c7fa13adf2a94015aedba55349f4d762710527b2fb32c4cf4df1803" +dependencies = [ + "bv", + "bytemuck", + "bytemuck_derive", + "memmap2 0.9.9", + "modular-bitfield", + "num_enum", + "rand 0.8.5", + "solana-clock", + "solana-measure", + "solana-pubkey 3.0.0", + "tempfile", +] + +[[package]] +name = "solana-builtins" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9759b566a98e17bb376f49d7b01d210b114fd6bff985c2e6c1704e83a36da20" +dependencies = [ + "agave-feature-set", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-hash 3.1.0", + "solana-loader-v4-program", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", + "solana-zk-elgamal-proof-program", + "solana-zk-token-proof-program", +] + +[[package]] +name = "solana-builtins-default-costs" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b7f80ebad1d995d419719048be643cc4ff4c5699a72f218736917196f03a67" +dependencies = [ + "agave-feature-set", + "ahash 0.8.12", + "log", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-loader-v4-program", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", +] + +[[package]] +name = "solana-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905b9527a1b11dc6c30c71366e66c493a9907f6cefcd3352bac031993b1bf512" +dependencies = [ + "async-trait", + "bincode", + "dashmap", + "futures", + "futures-util", + "indexmap", + "indicatif", + "log", + "quinn", + "rayon", + "solana-account", + "solana-client-traits", + "solana-commitment-config", + "solana-connection-cache", + "solana-epoch-info", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-measure", + "solana-message", + "solana-pubkey 3.0.0", + "solana-pubsub-client", + "solana-quic-client", + "solana-quic-definitions", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", + "solana-signature", + "solana-signer", + "solana-streamer", + "solana-time-utils", + "solana-tpu-client", + "solana-transaction", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-udp-client", + "thiserror 2.0.17", + "tokio", +] + +[[package]] +name = "solana-client-traits" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08618ed587e128105510c54ae3e456b9a06d674d8640db75afe66dad65cb4e02" +dependencies = [ + "solana-account", + "solana-commitment-config", + "solana-epoch-info", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-message", + "solana-pubkey 3.0.0", + "solana-signature", + "solana-signer", + "solana-system-interface", + "solana-transaction", + "solana-transaction-error", +] + +[[package]] +name = "solana-clock" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb62e9381182459a4520b5fe7fb22d423cae736239a6427fc398a88743d0ed59" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-cluster-type" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb7692fa6bf10a1a86b450c4775526f56d7e0e2116a53313f2533b5694abea64" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 3.1.0", +] + +[[package]] +name = "solana-commitment-config" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e41a3917076a8b5375809078ae3a6fb76a53e364b596ef8c4265e7f410876f3" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-compute-budget" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0949c3244fdbd06f958fdcc9a83ec5778da418fb030a96621aa3cf0597f7acf6" +dependencies = [ + "solana-fee-structure", + "solana-program-runtime", +] + +[[package]] +name = "solana-compute-budget-instruction" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "110a37e3926f56252d5fc79be0d5b2c286aec0c11200c31f817796359e34359b" +dependencies = [ + "agave-feature-set", + "log", + "solana-borsh", + "solana-builtins-default-costs", + "solana-compute-budget", + "solana-compute-budget-interface", + "solana-instruction", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-transaction", + "solana-transaction-error", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-compute-budget-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8292c436b269ad23cecc8b24f7da3ab07ca111661e25e00ce0e1d22771951ab9" +dependencies = [ + "borsh", + "solana-instruction", + "solana-sdk-ids", +] + +[[package]] +name = "solana-compute-budget-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcabf05e88736a8596072967e192da1883ca9ad1515e198068c13c9233ca7ba6" +dependencies = [ + "solana-program-runtime", +] + +[[package]] +name = "solana-config-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e401ae56aed512821cc7a0adaa412ff97fecd2dff4602be7b1330d2daec0c4" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-short-vec", + "solana-system-interface", +] + +[[package]] +name = "solana-connection-cache" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ec1735aac392497e3e2d9ef127cf55070086b6969f02c210162427fffefa39" +dependencies = [ + "async-trait", + "bincode", + "crossbeam-channel", + "futures-util", + "indexmap", + "log", + "rand 0.8.5", + "rayon", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-time-utils", + "solana-transaction-error", + "thiserror 2.0.17", + "tokio", +] + +[[package]] +name = "solana-cost-model" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0feb7f49393e353a84da75fdbe437e6fadf1b217ae2524278f1f64034ce7ed4a" +dependencies = [ + "agave-feature-set", + "ahash 0.8.12", + "log", + "solana-bincode", + "solana-borsh", + "solana-builtins-default-costs", + "solana-clock", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-compute-budget-interface", + "solana-fee-structure", + "solana-metrics", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-runtime-transaction", + "solana-sdk-ids", + "solana-svm-transaction", + "solana-system-interface", + "solana-transaction-error", + "solana-vote-program", +] + +[[package]] +name = "solana-cpi" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dea26709d867aada85d0d3617db0944215c8bb28d3745b912de7db13a23280c" +dependencies = [ + "solana-account-info", + "solana-define-syscall 4.0.1", + "solana-instruction", + "solana-program-error", + "solana-pubkey 4.0.0", + "solana-stable-layout", +] + +[[package]] +name = "solana-curve25519" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7e0f6e024ec8f1b141b1fb6388813277bcfaef640e717ebefca26225f687643" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "solana-define-syscall 3.0.0", + "subtle", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-define-syscall" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9697086a4e102d28a156b8d6b521730335d6951bd39a5e766512bbe09007cee" + +[[package]] +name = "solana-define-syscall" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e5b1c0bc1d4a4d10c88a4100499d954c09d3fecfae4912c1a074dff68b1738" + +[[package]] +name = "solana-derivation-path" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff71743072690fdbdfcdc37700ae1cb77485aaad49019473a81aee099b1e0b8c" +dependencies = [ + "derivation-path", + "qstring", + "uriparse", +] + +[[package]] +name = "solana-ed25519-program" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1419197f1c06abf760043f6d64ba9d79a03ad5a43f18c7586471937122094da" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "solana-instruction", + "solana-sdk-ids", +] + +[[package]] +name = "solana-epoch-info" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e093c84f6ece620a6b10cd036574b0cd51944231ab32d81f80f76d54aba833e6" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-epoch-rewards" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b319a4ed70390af911090c020571f0ff1f4ec432522d05ab89f5c08080381995" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 3.1.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-epoch-rewards-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee8beac9bff4db9225e57d532d169b0be5e447f1e6601a2f50f27a01bf5518f" +dependencies = [ + "siphasher 0.3.11", + "solana-address 2.0.0", + "solana-hash 4.0.1", +] + +[[package]] +name = "solana-epoch-schedule" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5481e72cc4d52c169db73e4c0cd16de8bc943078aac587ec4817a75cc6388f" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-epoch-stake" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc6693d0ea833b880514b9b88d95afb80b42762dca98b0712465d1fcbbcb89e" +dependencies = [ + "solana-define-syscall 3.0.0", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-example-mocks" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978855d164845c1b0235d4b4d101cadc55373fffaf0b5b6cfa2194d25b2ed658" +dependencies = [ + "serde", + "serde_derive", + "solana-address-lookup-table-interface", + "solana-clock", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keccak-hasher", + "solana-message", + "solana-nonce", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-feature-gate-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7347ab62e6d47a82e340c865133795b394feea7c2b2771d293f57691c6544c3f" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-sdk-ids", + "solana-system-interface", +] + +[[package]] +name = "solana-fee" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18995640d5ea221f7f053c3e66f03386567984f867b12c4aa4a6a119bbae4b31" +dependencies = [ + "agave-feature-set", + "solana-fee-structure", + "solana-svm-transaction", +] + +[[package]] +name = "solana-fee-calculator" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a73cc03ca4bed871ca174558108835f8323e85917bb38b9c81c7af2ab853efe" +dependencies = [ + "log", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-fee-structure" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2abdb1223eea8ec64136f39cb1ffcf257e00f915c957c35c0dd9e3f4e700b0" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-genesis-config" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "749eccc960e85c9b33608450093d256006253e1cb436b8380e71777840a3f675" +dependencies = [ + "bincode", + "chrono", + "memmap2 0.5.10", + "serde", + "serde_derive", + "solana-account", + "solana-clock", + "solana-cluster-type", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash 3.1.0", + "solana-inflation", + "solana-keypair", + "solana-poh-config", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-sdk-ids", + "solana-sha256-hasher", + "solana-shred-version", + "solana-signer", + "solana-time-utils", +] + +[[package]] +name = "solana-hard-forks" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0abacc4b66ce471f135f48f22facf75cbbb0f8a252fbe2c1e0aa59d5b203f519" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-hash" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "337c246447142f660f778cf6cb582beba8e28deb05b3b24bfb9ffd7c562e5f41" +dependencies = [ + "solana-hash 4.0.1", +] + +[[package]] +name = "solana-hash" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a5d48a6ee7b91fc7b998944ab026ed7b3e2fc8ee3bc58452644a86c2648152f" +dependencies = [ + "borsh", + "bytemuck", + "bytemuck_derive", + "five8 1.0.0", + "serde", + "serde_derive", + "solana-atomic-u64", + "solana-sanitize", +] + +[[package]] +name = "solana-inflation" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e92f37a14e7c660628752833250dd3dcd8e95309876aee751d7f8769a27947c6" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-instruction" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee1b699a2c1518028a9982e255e0eca10c44d90006542d9d7f9f40dbce3f7c78" +dependencies = [ + "bincode", + "borsh", + "serde", + "serde_derive", + "solana-define-syscall 4.0.1", + "solana-instruction-error", + "solana-pubkey 4.0.0", +] + +[[package]] +name = "solana-instruction-error" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b04259e03c05faf38a8c24217b5cfe4c90572ae6184ab49cddb1584fdd756d3f" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-program-error", +] + +[[package]] +name = "solana-instructions-sysvar" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ddf67876c541aa1e21ee1acae35c95c6fbc61119814bfef70579317a5e26955" +dependencies = [ + "bitflags", + "solana-account-info", + "solana-instruction", + "solana-instruction-error", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-sanitize", + "solana-sdk-ids", + "solana-serialize-utils", + "solana-sysvar-id", +] + +[[package]] +name = "solana-keccak-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed1c0d16d6fdeba12291a1f068cdf0d479d9bff1141bf44afd7aa9d485f65ef8" +dependencies = [ + "sha3", + "solana-define-syscall 4.0.1", + "solana-hash 4.0.1", +] + +[[package]] +name = "solana-keypair" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ac8be597c9e231b0cab2928ce3bc3e4ee77d9c0ad92977b9d901f3879f25a7a" +dependencies = [ + "ed25519-dalek 2.2.0", + "ed25519-dalek-bip32", + "five8 1.0.0", + "rand 0.8.5", + "solana-address 2.0.0", + "solana-derivation-path", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", +] + +[[package]] +name = "solana-last-restart-slot" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcda154ec827f5fc1e4da0af3417951b7e9b8157540f81f936c4a8b1156134d0" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-lattice-hash" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e27cbdda66b2379f5122ecfd78695c5815e8109c0f7339d3cf7340ed4d6d64" +dependencies = [ + "base64 0.22.1", + "blake3", + "bs58", + "bytemuck", +] + +[[package]] +name = "solana-loader-v3-interface" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee44c9b1328c5c712c68966fb8de07b47f3e7bac006e74ddd1bb053d3e46e5d" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface", +] + +[[package]] +name = "solana-loader-v4-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c948b33ff81fa89699911b207059e493defdba9647eaf18f23abdf3674e0fb" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface", +] + +[[package]] +name = "solana-loader-v4-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ddacd3cff6428639606bf5f4b1d3bf7d9eadd5eedcc22947ba79e3fa48fbe44" +dependencies = [ + "log", + "qualifier_attr", + "solana-account", + "solana-bincode", + "solana-bpf-loader-program", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-transaction-context", +] + +[[package]] +name = "solana-logger" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef7421d1092680d72065edbf5c7605856719b021bf5f173656c71febcdd5d003" +dependencies = [ + "env_logger", + "lazy_static", + "libc", + "log", + "signal-hook", +] + +[[package]] +name = "solana-measure" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54d09ba4775513d877ff3dc22807ace9eee71b5eea78405f073b61e40c34e56" + +[[package]] +name = "solana-message" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85666605c9fd727f865ed381665db0a8fc29f984a030ecc1e40f43bfb2541623" +dependencies = [ + "bincode", + "blake3", + "lazy_static", + "serde", + "serde_derive", + "solana-address 1.1.0", + "solana-hash 3.1.0", + "solana-instruction", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-transaction-error", +] + +[[package]] +name = "solana-metrics" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca6ac7323395b9363be946e308ab8c85769ff501b641f123b64709ca07cc7c3" +dependencies = [ + "crossbeam-channel", + "gethostname", + "log", + "reqwest", + "solana-cluster-type", + "solana-sha256-hasher", + "solana-time-utils", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-msg" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "264275c556ea7e22b9d3f87d56305546a38d4eee8ec884f3b126236cb7dcbbb4" +dependencies = [ + "solana-define-syscall 3.0.0", +] + +[[package]] +name = "solana-native-token" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" + +[[package]] +name = "solana-net-utils" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07a6059b386b7a880be65c263115deec3d578edb38510eb83866f1f59972b27" +dependencies = [ + "anyhow", + "bincode", + "bytes", + "itertools 0.12.1", + "log", + "nix", + "rand 0.8.5", + "serde", + "serde_derive", + "socket2", + "solana-serde", + "tokio", + "url", +] + +[[package]] +name = "solana-nohash-hasher" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" + +[[package]] +name = "solana-nonce" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abbdc6c8caf1c08db9f36a50967539d0f72b9f1d4aea04fec5430f532e5afadc" +dependencies = [ + "serde", + "serde_derive", + "solana-fee-calculator", + "solana-hash 3.1.0", + "solana-pubkey 3.0.0", + "solana-sha256-hasher", +] + +[[package]] +name = "solana-nonce-account" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" +dependencies = [ + "solana-account", + "solana-hash 3.1.0", + "solana-nonce", + "solana-sdk-ids", +] + +[[package]] +name = "solana-offchain-message" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e2a1141a673f72a05cf406b99e4b2b8a457792b7c01afa07b3f00d4e2de393" +dependencies = [ + "num_enum", + "solana-hash 3.1.0", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sanitize", + "solana-sha256-hasher", + "solana-signature", + "solana-signer", +] + +[[package]] +name = "solana-packet" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edf2f25743c95229ac0fdc32f8f5893ef738dbf332c669e9861d33ddb0f469d" +dependencies = [ + "bincode", + "bitflags", + "cfg_eval", + "serde", + "serde_derive", + "serde_with", +] + +[[package]] +name = "solana-perf" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1e71dfb4fa49492f1e94b0526d52f51c41eb01d4bb46097b0c0949ac5210dc" +dependencies = [ + "ahash 0.8.12", + "bincode", + "bv", + "bytes", + "caps", + "curve25519-dalek 4.1.3", + "dlopen2", + "fnv", + "libc", + "log", + "nix", + "rand 0.8.5", + "rayon", + "serde", + "solana-hash 3.1.0", + "solana-message", + "solana-metrics", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-rayon-threadlimit", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-time-utils", +] + +[[package]] +name = "solana-poh-config" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f1fef1f2ff2480fdbcc64bef5e3c47bec6e1647270db88b43f23e3a55f8d9cf" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-poseidon" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71f0626f8c9f3237ba8bbfc90761fa28ce8979b8ea3e08b5019bb495a70f0c7a" +dependencies = [ + "ark-bn254", + "light-poseidon", + "solana-define-syscall 3.0.0", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-precompile-error" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cafcd950de74c6c39d55dc8ca108bbb007799842ab370ef26cf45a34453c31e1" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-presigner" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f704eaf825be3180832445b9e4983b875340696e8e7239bf2d535b0f86c14a2" +dependencies = [ + "solana-pubkey 3.0.0", + "solana-signature", + "solana-signer", +] + +[[package]] +name = "solana-program" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91b12305dd81045d705f427acd0435a2e46444b65367d7179d7bdcfc3bc5f5eb" +dependencies = [ + "memoffset", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-borsh", + "solana-clock", + "solana-cpi", + "solana-define-syscall 3.0.0", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-epoch-stake", + "solana-example-mocks", + "solana-fee-calculator", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instruction-error", + "solana-instructions-sysvar", + "solana-keccak-hasher", + "solana-last-restart-slot", + "solana-msg", + "solana-native-token", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-serde-varint", + "solana-serialize-utils", + "solana-sha256-hasher", + "solana-short-vec", + "solana-slot-hashes", + "solana-slot-history", + "solana-stable-layout", + "solana-sysvar", + "solana-sysvar-id", +] + +[[package]] +name = "solana-program-entrypoint" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c9b0a1ff494e05f503a08b3d51150b73aa639544631e510279d6375f290997" +dependencies = [ + "solana-account-info", + "solana-define-syscall 4.0.1", + "solana-program-error", + "solana-pubkey 4.0.0", +] + +[[package]] +name = "solana-program-error" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1af32c995a7b692a915bb7414d5f8e838450cf7c70414e763d8abcae7b51f28" +dependencies = [ + "borsh", + "serde", + "serde_derive", +] + +[[package]] +name = "solana-program-memory" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4068648649653c2c50546e9a7fb761791b5ab0cda054c771bb5808d3a4b9eb52" +dependencies = [ + "solana-define-syscall 4.0.1", +] + +[[package]] +name = "solana-program-option" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7b4ddb464f274deb4a497712664c3b612e3f5f82471d4e47710fc4ab1c3095" + +[[package]] +name = "solana-program-pack" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c169359de21f6034a63ebf96d6b380980307df17a8d371344ff04a883ec4e9d0" +dependencies = [ + "solana-program-error", +] + +[[package]] +name = "solana-program-runtime" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6ad17b62e8c0c4d1129a4f0355e459d722f66d05fa5686aa5c799f1e561cc2" +dependencies = [ + "base64 0.22.1", + "bincode", + "itertools 0.12.1", + "log", + "percentage", + "rand 0.8.5", + "serde", + "solana-account", + "solana-clock", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-sbpf", + "solana-sdk-ids", + "solana-slot-hashes", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-transaction", + "solana-svm-type-overrides", + "solana-system-interface", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction-context", +] + +[[package]] +name = "solana-program-test" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "154cf61364d8dd7abdf42f482c77801605671b359e201d41bd40728ff97cb147" +dependencies = [ + "agave-feature-set", + "assert_matches", + "async-trait", + "base64 0.22.1", + "bincode", + "chrono-humanize", + "crossbeam-channel", + "log", + "serde", + "solana-account", + "solana-account-info", + "solana-accounts-db", + "solana-banks-client", + "solana-banks-interface", + "solana-banks-server", + "solana-clock", + "solana-cluster-type", + "solana-commitment-config", + "solana-compute-budget", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-genesis-config", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-loader-v3-interface", + "solana-logger", + "solana-message", + "solana-msg", + "solana-native-token", + "solana-poh-config", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-runtime", + "solana-sbpf", + "solana-sdk-ids", + "solana-signer", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm", + "solana-svm-log-collector", + "solana-svm-timings", + "solana-system-interface", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "solana-vote-program", + "spl-generic-token", + "thiserror 2.0.17", + "tokio", +] + +[[package]] +name = "solana-pubkey" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8909d399deb0851aa524420beeb5646b115fd253ef446e35fe4504c904da3941" +dependencies = [ + "rand 0.8.5", + "solana-address 1.1.0", +] + +[[package]] +name = "solana-pubkey" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6f7104d456b58e1418c21a8581e89810278d1190f70f27ece7fc0b2c9282a57" +dependencies = [ + "solana-address 2.0.0", +] + +[[package]] +name = "solana-pubsub-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d576830da33ab32decfe2b4544fce157241c20de8331f27eca7d902062c2323b" +dependencies = [ + "crossbeam-channel", + "futures-util", + "http 0.2.12", + "log", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-clock", + "solana-pubkey 3.0.0", + "solana-rpc-client-types", + "solana-signature", + "thiserror 2.0.17", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ada1c8fa92747e20621d33ea1fb715e97060787863492c6ce8250d0517f7a00" +dependencies = [ + "async-lock", + "async-trait", + "futures", + "itertools 0.12.1", + "log", + "quinn", + "quinn-proto", + "rustls 0.23.35", + "solana-connection-cache", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-pubkey 3.0.0", + "solana-quic-definitions", + "solana-rpc-client-api", + "solana-signer", + "solana-streamer", + "solana-tls-utils", + "solana-transaction-error", + "thiserror 2.0.17", + "tokio", +] + +[[package]] +name = "solana-quic-definitions" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15319accf7d3afd845817aeffa6edd8cc185f135cefbc6b985df29cfd8c09609" +dependencies = [ + "solana-keypair", +] + +[[package]] +name = "solana-rayon-threadlimit" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325993b3a280fb9712164db45521bd62074536a9b768e3f488b432b31df141df" +dependencies = [ + "log", + "num_cpus", +] + +[[package]] +name = "solana-rent" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e860d5499a705369778647e97d760f7670adfb6fc8419dd3d568deccd46d5487" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-reward-info" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82be7946105c2ee6be9f9ee7bd18a068b558389221d29efa92b906476102bfcc" +dependencies = [ + "serde", + "serde_derive", +] + +[[package]] +name = "solana-rpc-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc46e47bda34aee5cc04c794f2b3eaf2e2fccd09742c162aaae34dcd4932b6d" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bincode", + "bs58", + "futures", + "indicatif", + "log", + "reqwest", + "reqwest-middleware", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "solana-account", + "solana-account-decoder-client-types", + "solana-clock", + "solana-commitment-config", + "solana-epoch-info", + "solana-epoch-schedule", + "solana-feature-gate-interface", + "solana-hash 3.1.0", + "solana-instruction", + "solana-message", + "solana-pubkey 3.0.0", + "solana-rpc-client-api", + "solana-signature", + "solana-transaction", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-version", + "solana-vote-interface", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fe213690cc657c1f0604d4f0955ca78ff912e3c6df2ed8925479ca850332c44" +dependencies = [ + "anyhow", + "jsonrpc-core", + "reqwest", + "reqwest-middleware", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-clock", + "solana-rpc-client-types", + "solana-signer", + "solana-transaction-error", + "solana-transaction-status-client-types", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feef6cb97e3f48a0fde1cee07c900629fdcd9414fa8abf3aa475f693226d62eb" +dependencies = [ + "solana-account", + "solana-commitment-config", + "solana-hash 3.1.0", + "solana-message", + "solana-nonce", + "solana-pubkey 3.0.0", + "solana-rpc-client", + "solana-sdk-ids", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-rpc-client-types" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcafd3a8a77baef8b8c1725746ba3cbaf6e8a9ef9df0f13599c4b468aa344fcc" +dependencies = [ + "base64 0.22.1", + "bs58", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "solana-account", + "solana-account-decoder-client-types", + "solana-clock", + "solana-commitment-config", + "solana-fee-calculator", + "solana-inflation", + "solana-pubkey 3.0.0", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-version", + "spl-generic-token", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-runtime" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f61ce070c2a80b9ae53c12217a2c386377e1cc26b60358deb025b05ef93f80" +dependencies = [ + "agave-feature-set", + "agave-precompiles", + "agave-reserved-account-keys", + "agave-syscalls", + "ahash 0.8.12", + "aquamarine", + "arc-swap", + "arrayref", + "assert_matches", + "base64 0.22.1", + "bincode", + "blake3", + "bv", + "bytemuck", + "crossbeam-channel", + "dashmap", + "dir-diff", + "fnv", + "im", + "itertools 0.12.1", + "libc", + "log", + "lz4", + "memmap2 0.9.9", + "mockall", + "modular-bitfield", + "num-derive", + "num-traits", + "num_cpus", + "num_enum", + "percentage", + "qualifier_attr", + "rand 0.8.5", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "serde_with", + "solana-account", + "solana-account-info", + "solana-accounts-db", + "solana-address-lookup-table-interface", + "solana-bpf-loader-program", + "solana-bucket-map", + "solana-builtins", + "solana-client-traits", + "solana-clock", + "solana-cluster-type", + "solana-commitment-config", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-compute-budget-interface", + "solana-cost-model", + "solana-cpi", + "solana-ed25519-program", + "solana-epoch-info", + "solana-epoch-rewards-hasher", + "solana-epoch-schedule", + "solana-feature-gate-interface", + "solana-fee", + "solana-fee-calculator", + "solana-fee-structure", + "solana-genesis-config", + "solana-hard-forks", + "solana-hash 3.1.0", + "solana-inflation", + "solana-instruction", + "solana-keypair", + "solana-lattice-hash", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-measure", + "solana-message", + "solana-metrics", + "solana-native-token", + "solana-nohash-hasher", + "solana-nonce", + "solana-nonce-account", + "solana-packet", + "solana-perf", + "solana-poh-config", + "solana-precompile-error", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rayon-threadlimit", + "solana-rent", + "solana-reward-info", + "solana-runtime-transaction", + "solana-sdk-ids", + "solana-secp256k1-program", + "solana-seed-derivable", + "solana-serde", + "solana-sha256-hasher", + "solana-signature", + "solana-signer", + "solana-slot-hashes", + "solana-slot-history", + "solana-stake-interface", + "solana-stake-program", + "solana-svm", + "solana-svm-callback", + "solana-svm-timings", + "solana-svm-transaction", + "solana-system-interface", + "solana-system-transaction", + "solana-sysvar", + "solana-sysvar-id", + "solana-time-utils", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "solana-transaction-status-client-types", + "solana-unified-scheduler-logic", + "solana-version", + "solana-vote", + "solana-vote-interface", + "solana-vote-program", + "spl-generic-token", + "static_assertions", + "strum", + "strum_macros", + "symlink", + "tar", + "tempfile", + "thiserror 2.0.17", + "zstd", +] + +[[package]] +name = "solana-runtime-transaction" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe17453378bb43c44793f3b5361e14318d5693237682c77ea7b1f749eb1c675" +dependencies = [ + "agave-transaction-view", + "log", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-signature", + "solana-svm-transaction", + "solana-transaction", + "solana-transaction-error", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-sanitize" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" + +[[package]] +name = "solana-sbpf" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f224d906c14efc7ed7f42bc5fe9588f3f09db8cabe7f6023adda62a69678e1a" +dependencies = [ + "byteorder", + "combine 3.8.1", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "thiserror 2.0.17", + "winapi", +] + +[[package]] +name = "solana-sdk" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f03df7969f5e723ad31b6c9eadccc209037ac4caa34d8dc259316b05c11e82b" +dependencies = [ + "bincode", + "bs58", + "serde", + "solana-account", + "solana-epoch-info", + "solana-epoch-rewards-hasher", + "solana-fee-structure", + "solana-inflation", + "solana-keypair", + "solana-message", + "solana-offchain-message", + "solana-presigner", + "solana-program", + "solana-program-memory", + "solana-pubkey 3.0.0", + "solana-sanitize", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-serde", + "solana-serde-varint", + "solana-short-vec", + "solana-shred-version", + "solana-signature", + "solana-signer", + "solana-time-utils", + "solana-transaction", + "solana-transaction-error", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-sdk-ids" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" +dependencies = [ + "solana-address 2.0.0", +] + +[[package]] +name = "solana-sdk-macro" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6430000e97083460b71d9fbadc52a2ab2f88f53b3a4c5e58c5ae3640a0e8c00" +dependencies = [ + "bs58", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "solana-secp256k1-program" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8efa767b0188f577edae7080e8bf080e5db9458e2b6ee5beaa73e2e6bb54e99d" +dependencies = [ + "digest 0.10.7", + "k256", + "serde", + "serde_derive", + "sha3", + "solana-signature", +] + +[[package]] +name = "solana-secp256k1-recover" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de18cfdab99eeb940fbedd8c981fa130c0d76252da75d05446f22fae8b51932" +dependencies = [ + "k256", + "solana-define-syscall 4.0.1", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-secp256r1-program" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445d8e12592631d76fc4dc57858bae66c9fd7cc838c306c62a472547fc9d0ce6" +dependencies = [ + "bytemuck", + "openssl", + "solana-instruction", + "solana-sdk-ids", +] + +[[package]] +name = "solana-seed-derivable" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7bdb72758e3bec33ed0e2658a920f1f35dfb9ed576b951d20d63cb61ecd95c" +dependencies = [ + "solana-derivation-path", +] + +[[package]] +name = "solana-seed-phrase" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc905b200a95f2ea9146e43f2a7181e3aeb55de6bc12afb36462d00a3c7310de" +dependencies = [ + "hmac 0.12.1", + "pbkdf2", + "sha2 0.10.9", +] + +[[package]] +name = "solana-send-transaction-service" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a1818c7704bf16d5cee1d264c75012092ab35ceb1b39da1f79d803afcccde23" +dependencies = [ + "async-trait", + "crossbeam-channel", + "itertools 0.12.1", + "log", + "solana-client", + "solana-clock", + "solana-connection-cache", + "solana-hash 3.1.0", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-nonce-account", + "solana-pubkey 3.0.0", + "solana-quic-definitions", + "solana-runtime", + "solana-signature", + "solana-time-utils", + "solana-tpu-client-next", + "tokio", + "tokio-util 0.7.17", +] + +[[package]] +name = "solana-serde" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709a93cab694c70f40b279d497639788fc2ccbcf9b4aa32273d4b361322c02dd" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-serde-varint" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e5174c57d5ff3c1995f274d17156964664566e2cde18a07bba1586d35a70d3b" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-serialize-utils" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e41dd8feea239516c623a02f0a81c2367f4b604d7965237fed0751aeec33ed" +dependencies = [ + "solana-instruction-error", + "solana-pubkey 3.0.0", + "solana-sanitize", +] + +[[package]] +name = "solana-sha256-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" +dependencies = [ + "sha2 0.10.9", + "solana-define-syscall 4.0.1", + "solana-hash 4.0.1", +] + +[[package]] +name = "solana-short-vec" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79fb1809a32cfcf7d9c47b7070a92fa17cdb620ab5829e9a8a9ff9d138a7a175" +dependencies = [ + "serde_core", +] + +[[package]] +name = "solana-shred-version" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94953e22ca28fe4541a3447d6baeaf519cc4ddc063253bfa673b721f34c136bb" +dependencies = [ + "solana-hard-forks", + "solana-hash 3.1.0", + "solana-sha256-hasher", +] + +[[package]] +name = "solana-signature" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb8057cc0e9f7b5e89883d49de6f407df655bb6f3a71d0b7baf9986a2218fd9" +dependencies = [ + "ed25519-dalek 2.2.0", + "five8 0.2.1", + "rand 0.8.5", + "serde", + "serde-big-array", + "serde_derive", + "solana-sanitize", +] + +[[package]] +name = "solana-signer" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bfea97951fee8bae0d6038f39a5efcb6230ecdfe33425ac75196d1a1e3e3235" +dependencies = [ + "solana-pubkey 3.0.0", + "solana-signature", + "solana-transaction-error", +] + +[[package]] +name = "solana-slot-hashes" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80a293f952293281443c04f4d96afd9d547721923d596e92b4377ed2360f1746" +dependencies = [ + "serde", + "serde_derive", + "solana-hash 3.1.0", + "solana-sdk-ids", + "solana-sysvar-id", +] + +[[package]] +name = "solana-slot-history" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f914f6b108f5bba14a280b458d023e3621c9973f27f015a4d755b50e88d89e97" +dependencies = [ + "bv", + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sysvar-id", +] + +[[package]] +name = "solana-stable-layout" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1da74507795b6e8fb60b7c7306c0c36e2c315805d16eaaf479452661234685ac" +dependencies = [ + "solana-instruction", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-stake-interface" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-clock", + "solana-cpi", + "solana-instruction", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-system-interface", + "solana-sysvar", + "solana-sysvar-id", +] + +[[package]] +name = "solana-stake-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "813b38448d59514b29553a450aaf9d8b37d86105a7c77f64f61feef37540fe91" +dependencies = [ + "agave-feature-set", + "bincode", + "log", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-config-interface", + "solana-genesis-config", + "solana-instruction", + "solana-native-token", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-sdk-ids", + "solana-stake-interface", + "solana-svm-log-collector", + "solana-svm-type-overrides", + "solana-sysvar", + "solana-transaction-context", + "solana-vote-interface", +] + +[[package]] +name = "solana-streamer" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f9b5710a67b472c99ab3c11b4b9a0c6325a6b01b22ed200ed144ec548eeaa4" +dependencies = [ + "arc-swap", + "async-channel", + "bytes", + "crossbeam-channel", + "dashmap", + "futures", + "futures-util", + "governor", + "histogram", + "indexmap", + "itertools 0.12.1", + "libc", + "log", + "nix", + "num_cpus", + "pem", + "percentage", + "quinn", + "quinn-proto", + "rand 0.8.5", + "rustls 0.23.35", + "smallvec", + "socket2", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-packet", + "solana-perf", + "solana-pubkey 3.0.0", + "solana-quic-definitions", + "solana-signature", + "solana-signer", + "solana-time-utils", + "solana-tls-utils", + "solana-transaction-error", + "solana-transaction-metrics-tracker", + "thiserror 2.0.17", + "tokio", + "tokio-util 0.7.17", + "x509-parser", +] + +[[package]] +name = "solana-svm" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb1bccdf5c6a0d17fa9a3b1a6b3414f993aeaeeee8ee49702a36b34203d572d" +dependencies = [ + "ahash 0.8.12", + "log", + "percentage", + "serde", + "serde_derive", + "solana-account", + "solana-clock", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instructions-sysvar", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-loader-v4-program", + "solana-message", + "solana-nonce", + "solana-nonce-account", + "solana-program-entrypoint", + "solana-program-pack", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-sdk-ids", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-transaction", + "solana-svm-type-overrides", + "solana-system-interface", + "solana-sysvar-id", + "solana-transaction-context", + "solana-transaction-error", + "spl-generic-token", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-svm-callback" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be2f26d7b6940c76e6b01f437b13972e7bcbedffdaa2923f181b63bd692df92" +dependencies = [ + "solana-account", + "solana-clock", + "solana-precompile-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-feature-set" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7ecbcb61e0686ab5a31a19b58532f322c70e5869d354d18e4f680df1bd7100" + +[[package]] +name = "solana-svm-log-collector" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824cab5bf43604210a59d99ad39f11fedecca2c77806ba43e61799e04383ce67" +dependencies = [ + "log", +] + +[[package]] +name = "solana-svm-measure" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2185a9dd28d4f6f63bd15e727018c6e2ee1e8412416fb7ae7ffcd8f6fa3d4808" + +[[package]] +name = "solana-svm-timings" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c05c5a004c4a2698396ed3be4dd486075a0f99432595eb9b02f2ec0143fd942" +dependencies = [ + "eager", + "enum-iterator", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-transaction" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2df7a0213bc369f1b7e9481495362a92e966bca547d77188b235370910c98866" +dependencies = [ + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-signature", + "solana-transaction", +] + +[[package]] +name = "solana-svm-type-overrides" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c878c6880ebec401133983857f296b71f177afccbc551b3fb0fd1fe39fec9d5" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "solana-system-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-system-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e399cba7565e4549776426cef7ecd780a7e577febd64546b4083428641e3962" +dependencies = [ + "bincode", + "log", + "serde", + "serde_derive", + "solana-account", + "solana-bincode", + "solana-fee-calculator", + "solana-instruction", + "solana-nonce", + "solana-nonce-account", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-type-overrides", + "solana-system-interface", + "solana-sysvar", + "solana-transaction-context", +] + +[[package]] +name = "solana-system-transaction" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31b5699ec533621515e714f1533ee6b3b0e71c463301d919eb59b8c1e249d30" +dependencies = [ + "solana-hash 3.1.0", + "solana-keypair", + "solana-message", + "solana-pubkey 3.0.0", + "solana-signer", + "solana-system-interface", + "solana-transaction", +] + +[[package]] +name = "solana-sysvar" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-define-syscall 4.0.1", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash 4.0.1", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey 4.0.0", + "solana-rent", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", + "solana-sysvar-id", +] + +[[package]] +name = "solana-sysvar-id" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +dependencies = [ + "solana-address 2.0.0", + "solana-sdk-ids", +] + +[[package]] +name = "solana-time-utils" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced92c60aa76ec4780a9d93f3bd64dfa916e1b998eacc6f1c110f3f444f02c9" + +[[package]] +name = "solana-tls-utils" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53980fcde4ee812d26a7bd4cb07ca9b3a111951145c9f0f3533e6d6139dafea0" +dependencies = [ + "rustls 0.23.35", + "solana-keypair", + "solana-pubkey 3.0.0", + "solana-signer", + "x509-parser", +] + +[[package]] +name = "solana-tpu-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00122487e49ad299e5568082cd8753e5be159b09c8a8bebf430ed50d8837efdc" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap", + "indicatif", + "log", + "rayon", + "solana-client-traits", + "solana-clock", + "solana-commitment-config", + "solana-connection-cache", + "solana-epoch-schedule", + "solana-measure", + "solana-message", + "solana-net-utils", + "solana-pubkey 3.0.0", + "solana-pubsub-client", + "solana-quic-definitions", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-signature", + "solana-signer", + "solana-transaction", + "solana-transaction-error", + "thiserror 2.0.17", + "tokio", +] + +[[package]] +name = "solana-tpu-client-next" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d9a42530995727ee60cf72fd84d0e8b29eaca38a13c53bf11bb82a523c9bcdb" +dependencies = [ + "async-trait", + "log", + "lru", + "quinn", + "rustls 0.23.35", + "solana-clock", + "solana-connection-cache", + "solana-keypair", + "solana-measure", + "solana-metrics", + "solana-quic-definitions", + "solana-rpc-client", + "solana-streamer", + "solana-time-utils", + "solana-tls-utils", + "solana-tpu-client", + "thiserror 2.0.17", + "tokio", + "tokio-util 0.7.17", +] + +[[package]] +name = "solana-transaction" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ceb2efbf427a91b884709ffac4dac29117752ce1e37e9ae04977e450aa0bb76" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-address 2.0.0", + "solana-hash 4.0.1", + "solana-instruction", + "solana-instruction-error", + "solana-message", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-signer", + "solana-transaction-error", +] + +[[package]] +name = "solana-transaction-context" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acc12cfe0ac1e3d23ddca08cb01123d08c5b98b8b4814eb367ec245122c0d7d1" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account", + "solana-instruction", + "solana-instructions-sysvar", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-sbpf", + "solana-sdk-ids", +] + +[[package]] +name = "solana-transaction-error" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4222065402340d7e6aec9dc3e54d22992ddcf923d91edcd815443c2bfca3144a" +dependencies = [ + "serde", + "serde_derive", + "solana-instruction-error", + "solana-sanitize", +] + +[[package]] +name = "solana-transaction-metrics-tracker" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4abd1130318189f464bfb814fc9ee7544f76f9f86de219cc5eb4a02a3564743" +dependencies = [ + "base64 0.22.1", + "bincode", + "log", + "rand 0.8.5", + "solana-packet", + "solana-perf", + "solana-short-vec", + "solana-signature", +] + +[[package]] +name = "solana-transaction-status-client-types" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983dcea68b4626b8829098b4046869124fb107e6a67897b1e5964c92b8d31bc" +dependencies = [ + "base64 0.22.1", + "bincode", + "bs58", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder-client-types", + "solana-commitment-config", + "solana-instruction", + "solana-message", + "solana-pubkey 3.0.0", + "solana-reward-info", + "solana-signature", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-udp-client" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f642b80d0c71fead2d794e9cc67dabbc3fc94c6ea9d43be8562c8cb249d83f9a" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-keypair", + "solana-net-utils", + "solana-streamer", + "solana-transaction-error", + "thiserror 2.0.17", + "tokio", +] + +[[package]] +name = "solana-unified-scheduler-logic" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d17226a237a7f3269063827d9752c3f8d7c62487ba49ac848794893527d80c03" +dependencies = [ + "assert_matches", + "solana-pubkey 3.0.0", + "solana-runtime-transaction", + "solana-transaction", + "static_assertions", + "unwrap_none", +] + +[[package]] +name = "solana-version" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff03ccee2881ce60058fda9d256b68fcc3b6ecd467e613a1d7c3d64b78d91083" +dependencies = [ + "agave-feature-set", + "rand 0.8.5", + "semver 1.0.27", + "serde", + "serde_derive", + "solana-sanitize", + "solana-serde-varint", +] + +[[package]] +name = "solana-vote" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1dfa471b3cf5ee27ba535d9256da6628b1fb89c8f1cbba2f3dbf081576fee32" +dependencies = [ + "itertools 0.12.1", + "log", + "serde", + "serde_derive", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-serialize-utils", + "solana-signature", + "solana-signer", + "solana-svm-transaction", + "solana-transaction", + "solana-vote-interface", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-vote-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66631ddbe889dab5ec663294648cd1df395ec9df7a4476e7b3e095604cfdb539" +dependencies = [ + "bincode", + "cfg_eval", + "num-derive", + "num-traits", + "serde", + "serde_derive", + "serde_with", + "solana-clock", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-sdk-ids", + "solana-serde-varint", + "solana-serialize-utils", + "solana-short-vec", + "solana-system-interface", +] + +[[package]] +name = "solana-vote-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9f470d8bb37eeed628532ab2c9a2c1f1dc91acf11c2d17c9260157009992dd1" +dependencies = [ + "agave-feature-set", + "bincode", + "log", + "num-derive", + "num-traits", + "serde", + "serde_derive", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-epoch-schedule", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keypair", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent", + "solana-sdk-ids", + "solana-signer", + "solana-slot-hashes", + "solana-transaction", + "solana-transaction-context", + "solana-vote-interface", + "thiserror 2.0.17", +] + +[[package]] +name = "solana-zk-elgamal-proof-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3608816af7d734e557997da585ebea22a138d53a06b723d8d9d20e87d4a4cb" +dependencies = [ + "agave-feature-set", + "bytemuck", + "num-derive", + "num-traits", + "solana-instruction", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-sdk", +] + +[[package]] +name = "solana-zk-sdk" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "getrandom 0.2.16", + "itertools 0.12.1", + "js-sys", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.5", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-derivation-path", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "subtle", + "thiserror 2.0.17", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-zk-token-proof-program" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa8432001b2fc671040f944db567f25b33b3a36a3d8889a93ba86082ca2fc2d" +dependencies = [ + "agave-feature-set", + "bytemuck", + "num-derive", + "num-traits", + "solana-instruction", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-token-sdk", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc229188fab61e2ba16c2a6eb4ed04589c41ade03cf708ae4a5c3db5ae4b01f0" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek 4.1.3", + "itertools 0.12.1", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.5", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-curve25519", + "solana-derivation-path", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "subtle", + "thiserror 2.0.17", + "zeroize", +] + +[[package]] +name = "spinning_top" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "spl-associated-token-account-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6433917b60441d68d99a17e121d9db0ea15a9a69c0e5afa34649cf5ba12612f" +dependencies = [ + "solana-instruction", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "spl-generic-token" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233df81b75ab99b42f002b5cdd6e65a7505ffa930624f7096a7580a56765e9cf" +dependencies = [ + "bytemuck", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "spl-token-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c564ac05a7c8d8b12e988a37d82695b5ba4db376d07ea98bc4882c81f96c7f3" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-instruction", + "solana-program-error", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "thiserror 2.0.17", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svm-hash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5daf24ef00565f2d53ab3fd548b0ac1f19325524061028ba9698902d86bb71" +dependencies = [ + "borsh", + "bytemuck", + "solana-hash 4.0.1", + "solana-sha256-hasher", +] + +[[package]] +name = "symlink" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tarpc" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38a012bed6fb9681d3bf71ffaa4f88f3b4b9ed3198cda6e4c8462d24d4bb80" +dependencies = [ + "anyhow", + "fnv", + "futures", + "humantime", + "opentelemetry", + "pin-project", + "rand 0.8.5", + "serde", + "static_assertions", + "tarpc-plugins", + "thiserror 1.0.69", + "tokio", + "tokio-serde", + "tokio-util 0.6.10", + "tracing", + "tracing-opentelemetry", +] + +[[package]] +name = "tarpc-plugins" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "termtree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.35", + "tokio", +] + +[[package]] +name = "tokio-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" +dependencies = [ + "bincode", + "bytes", + "educe", + "futures-core", + "futures-sink", + "pin-project", + "serde", + "serde_json", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", + "tungstenite", + "webpki-roots 0.25.4", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.7.4+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe3cea6b2aa3b910092f6abd4053ea464fab5f9c170ba5e9a6aead16ec4af2b6" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.5+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c03bee5ce3696f31250db0bbaff18bc43301ce0e8db2ed1f07cbb2acf89984c" +dependencies = [ + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "async-compression", + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http 1.4.0", + "http-body", + "http-body-util", + "iri-string", + "pin-project-lite", + "tokio", + "tokio-util 0.7.17", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "tracing-core" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" +dependencies = [ + "once_cell", + "opentelemetry", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 0.2.12", + "httparse", + "log", + "rand 0.8.5", + "rustls 0.21.12", + "sha1", + "thiserror 1.0.69", + "url", + "utf-8", + "webpki-roots 0.24.0", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unwrap_none" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "461d0c5956fcc728ecc03a3a961e4adc9a7975d86f6f8371389a289517c02ca9" + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.111", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +dependencies = [ + "js-sys", + "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-root-certs" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee3e3b5f5e80bc89f30ce8d0343bf4e5f12341c51f3e26cbeecbc7c85443e85b" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" +dependencies = [ + "rustls-webpki 0.101.7", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "webpki-roots" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs", + "base64 0.13.1", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 1.0.69", + "time", +] + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure 0.13.2", +] + +[[package]] +name = "zerocopy" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure 0.13.2", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/solana/Cargo.toml b/solana/Cargo.toml new file mode 100644 index 0000000000..bf23a7a756 --- /dev/null +++ b/solana/Cargo.toml @@ -0,0 +1,64 @@ +[workspace] +exclude = [] +members = [ + "crates/program-tools", + "mock/rewards-integration", + "mock/swap-sol-2z", + "programs/passport", + "programs/revenue-distribution", +] +resolver = "2" + +[workspace.package] +edition = "2021" +homepage = "https://doublezero.xyz" +license = "Apache-2.0" +repository = "" +rust-version = "1.84.1" +version = "0.0.0" + +[workspace.dependencies] +base64 = "0.22" +bincode = "1" +borsh = "1" +bytemuck = "1" +ctor = "0.4" +env_logger = "0.11" +itertools = "0.14" +log = "0.4" +ruint = { version = "<=1.16", features = ["bytemuck"] } +solana-account-info = ">=2,<=3" +solana-cpi = ">=2,<=3" +solana-instruction = ">=2,<=3" +solana-loader-v3-interface = ">=5,<=6" +solana-msg = ">=2,<=3" +solana-program-entrypoint = ">=2,<=3" +solana-program-error = ">=2,<=3" +solana-program-memory = ">=2,<=3" +solana-program-pack = ">=2,<=3" +solana-pubkey = ">=2,<=3" +solana-system-interface = { version = ">=1,<=3", features = ["bincode"] } +solana-sysvar = ">=2,<=3" +spl-associated-token-account-interface = ">=1,<=2" +spl-token-interface = ">=1,<=2" +svm-hash = ">=0.1,<=0.2" + +### Please keep these packages pinned for now. +sha2-const-stable = "=0.1.0" +solana-program-test = "=3.0.12" +solana-sdk = "=3.0" + +[workspace.dependencies.doublezero-passport] +path = "programs/passport" + +[workspace.dependencies.doublezero-program-tools] +path = "crates/program-tools" + +[workspace.dependencies.doublezero-revenue-distribution] +path = "programs/revenue-distribution" + +[workspace.dependencies.mock-rewards-integration] +path = "mock/rewards-integration" + +[workspace.dependencies.mock-swap-sol-2z] +path = "mock/swap-sol-2z" diff --git a/solana/Dockerfile b/solana/Dockerfile new file mode 100644 index 0000000000..a036bda032 --- /dev/null +++ b/solana/Dockerfile @@ -0,0 +1,33 @@ +ARG RUST_VERSION=1.91 +ARG SOLANA_VERSION=v3.0.12 + +FROM rust:${RUST_VERSION}-slim AS builder + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + curl \ + make + +ARG SOLANA_VERSION +RUN sh -c "$(curl -sSfL https://release.anza.xyz/${SOLANA_VERSION}/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:${PATH}" +RUN solana --version + +WORKDIR /build + +COPY rust-toolchain.toml Cargo.toml Cargo.lock Makefile ./ +COPY programs ./programs +COPY crates ./crates +COPY mock ./mock + +RUN cargo fetch --locked + +ARG NETWORK +RUN set -e; \ + mkdir "artifacts-${NETWORK}"; \ + NETWORK=${NETWORK} make build-sbf + +FROM scratch AS artifacts +COPY --from=builder /build/target/deploy/*.so / diff --git a/solana/LICENSE b/solana/LICENSE new file mode 100644 index 0000000000..1084ccd866 --- /dev/null +++ b/solana/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2025 DoubleZero Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/solana/Makefile b/solana/Makefile new file mode 100644 index 0000000000..399383dc03 --- /dev/null +++ b/solana/Makefile @@ -0,0 +1,81 @@ +PASSPORT_PATH = programs/passport/Cargo.toml +REVENUE_DISTRIBUTION_PATH = programs/revenue-distribution/Cargo.toml + +NETWORK ?= mainnet-beta + +# Validate NETWORK parameter +ifneq ($(NETWORK),mainnet-beta) +ifneq ($(NETWORK),development) + $(error NETWORK must be either "mainnet-beta" or "development". Got "$(NETWORK)") +endif +endif + +ifeq ($(NETWORK),mainnet-beta) + CARGO_FEATURES = entrypoint +else + CARGO_FEATURES = development,entrypoint +endif + +.PHONY: clean +clean: + rm -rf artifacts-* test-ledger + cargo clean + +.PHONY: build-sbf +build-sbf: + cargo build-sbf --features $(CARGO_FEATURES) --manifest-path $(PASSPORT_PATH) + cargo build-sbf --features $(CARGO_FEATURES) --manifest-path $(REVENUE_DISTRIBUTION_PATH) + +artifacts-$(NETWORK): + DOCKER_BUILDKIT=1 docker build \ + --build-arg NETWORK=${NETWORK} \ + --platform linux/amd64 \ + --output type=local,dest=./artifacts-${NETWORK} \ + . + +.PHONY: build-artifacts +build-artifacts: artifacts-$(NETWORK) + +.PHONY: verify-checksums +verify-checksums: + shasum -a 256 -c programs/sha256sums_$(subst -,_,$(NETWORK)).txt + +.PHONY: build-checked-artifacts +build-checked-artifacts: build-artifacts verify-checksums + +.PHONY: build-sbf-mock +build-sbf-mock: + cargo build-sbf --features $(CARGO_FEATURES) --manifest-path mock/swap-sol-2z/Cargo.toml + cargo build-sbf --features $(CARGO_FEATURES) --manifest-path mock/rewards-integration/Cargo.toml + +.PHONY: test-sbf +test-sbf: build-sbf-mock + cargo test-sbf --features $(CARGO_FEATURES) --manifest-path $(PASSPORT_PATH) + cargo test-sbf --features $(CARGO_FEATURES) --manifest-path $(REVENUE_DISTRIBUTION_PATH) + +.PHONY: test-sbf-debug +test-sbf-debug: + DEBUG=1 $(MAKE) test-sbf + +.PHONY: test-lib +test-lib: + cargo test --lib --features development,offchain + +.PHONY: lint +lint: + cargo fmt --check + cargo clippy --all-features --all-targets -- -Dwarnings + +.PHONY: doc +doc: + cargo doc --all-features --no-deps --document-private-items + +.PHONY: write-checksums +write-checksums: + $(MAKE) build-artifacts NETWORK=mainnet-beta && \ + $(MAKE) build-artifacts NETWORK=development && \ + shasum -a 256 artifacts-mainnet-beta/*.so > programs/sha256sums_mainnet_beta.txt && \ + shasum -a 256 artifacts-development/*.so > programs/sha256sums_development.txt + +.PHONY: clean-write-checksums +clean-write-checksums: clean write-checksums diff --git a/solana/README.md b/solana/README.md new file mode 100644 index 0000000000..da747178d1 --- /dev/null +++ b/solana/README.md @@ -0,0 +1,10 @@ +# DoubleZero Solana Contracts + +These contracts are a work-in-progress. + +To run Solana BPF integration tests, you need to install the Solana CLI and run: + +```shell +make build-sbf +make test-sbf +``` diff --git a/solana/crates/program-tools/CHANGELOG.md b/solana/crates/program-tools/CHANGELOG.md new file mode 100644 index 0000000000..43eef41a8c --- /dev/null +++ b/solana/crates/program-tools/CHANGELOG.md @@ -0,0 +1,27 @@ +# Changelog + +## Unreleased + +- add program-tools ([#1]) +- add `create_token_account` and `try_build_instruction` ([#2]) +- add `Flags` and `StorageGap` ([#4]) +- add additional lamports handling for creating account ([#16]) +- add create account options ([#19]) +- uptick msrv to 1.84 and solana version 2.3.7 ([#32]) +- add `Discriminator::new` ([#51]) +- remove initializer ([#54]) +- fix `try_initialize` ([#81]) +- update dependencies ([#92]) +- update Solana crates to v3 ([#94]) + +[#1]: https://github.com/doublezerofoundation/doublezero-solana/pull/1 +[#2]: https://github.com/doublezerofoundation/doublezero-solana/pull/2 +[#4]: https://github.com/doublezerofoundation/doublezero-solana/pull/4 +[#16]: https://github.com/doublezerofoundation/doublezero-solana/pull/16 +[#19]: https://github.com/doublezerofoundation/doublezero-solana/pull/19 +[#32]: https://github.com/doublezerofoundation/doublezero-solana/pull/32 +[#51]: https://github.com/doublezerofoundation/doublezero-solana/pull/51 +[#54]: https://github.com/doublezerofoundation/doublezero-solana/pull/54 +[#81]: https://github.com/doublezerofoundation/doublezero-solana/pull/81 +[#92]: https://github.com/doublezerofoundation/doublezero-solana/pull/92 +[#94]: https://github.com/doublezerofoundation/doublezero-solana/pull/94 diff --git a/solana/crates/program-tools/Cargo.toml b/solana/crates/program-tools/Cargo.toml new file mode 100644 index 0000000000..b0fae54049 --- /dev/null +++ b/solana/crates/program-tools/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "doublezero-program-tools" +description = "DoubleZero SVM Utilities" +publish = false + +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +version.workspace = true + +[dependencies] +bincode.workspace = true +borsh = { workspace = true, features = ["derive"] } +bytemuck = { workspace = true, features = ["derive"] } +ruint.workspace = true +sha2-const-stable.workspace = true +solana-account-info.workspace = true +solana-cpi.workspace = true +solana-instruction.workspace = true +solana-loader-v3-interface = { workspace = true, features = ["serde"] } +solana-msg.workspace = true +solana-program-error.workspace = true +solana-program-pack.workspace = true +solana-pubkey.workspace = true +solana-system-interface.workspace = true +solana-sysvar = { workspace = true, features = ["bincode"] } +spl-token-interface.workspace = true + +[features] +default = [] +entrypoint = [] diff --git a/solana/crates/program-tools/README.md b/solana/crates/program-tools/README.md new file mode 100644 index 0000000000..bc6317f5ed --- /dev/null +++ b/solana/crates/program-tools/README.md @@ -0,0 +1 @@ +# DoubleZero Program Tools diff --git a/solana/crates/program-tools/src/account_info/iter.rs b/solana/crates/program-tools/src/account_info/iter.rs new file mode 100644 index 0000000000..42e837ca52 --- /dev/null +++ b/solana/crates/program-tools/src/account_info/iter.rs @@ -0,0 +1,69 @@ +use std::{iter::Enumerate, slice::Iter}; + +use solana_account_info::AccountInfo; +use solana_msg::msg; +use solana_program_error::ProgramError; +use solana_pubkey::Pubkey; + +pub type EnumeratedAccountInfoIter<'a, 'b> = Enumerate>>; + +pub trait TryNextAccounts<'a, 'b: 'a, ExtraArgs>: Sized { + fn try_next_accounts( + accounts_iter: &mut EnumeratedAccountInfoIter<'a, 'b>, + extra_args: ExtraArgs, + ) -> Result; +} + +#[derive(Debug, Default, PartialEq)] +pub struct NextAccountOptions<'a> { + pub must_be_signer: bool, + pub must_be_writable: bool, + pub must_be_executable: bool, + pub owned_by: Option<&'a Pubkey>, +} + +#[inline(always)] +pub fn try_next_enumerated_account<'a, 'b>( + accounts_iter: &mut EnumeratedAccountInfoIter<'a, 'b>, + opts: NextAccountOptions, +) -> Result<(usize, &'a AccountInfo<'b>), ProgramError> { + let (index, account_info) = accounts_iter + .next() + .ok_or(ProgramError::NotEnoughAccountKeys)?; + + let NextAccountOptions { + must_be_signer, + must_be_writable, + must_be_executable, + owned_by, + } = opts; + + if must_be_signer && !account_info.is_signer { + msg!("Account {} must be signer", index); + return Err(ProgramError::MissingRequiredSignature); + } + + if must_be_writable && !account_info.is_writable { + msg!("Account {} must be writable", index); + return Err(ProgramError::InvalidAccountData); + } + + if must_be_executable && !account_info.executable { + msg!("Account {} must be executable", index); + return Err(ProgramError::InvalidAccountData); + } + + if let Some(expected_owner) = owned_by { + if account_info.owner != expected_owner { + msg!( + "Unexpected owner for account {}. Expected {}, found {}", + index, + expected_owner, + account_info.owner + ); + return Err(ProgramError::InvalidAccountOwner); + } + } + + Ok((index, account_info)) +} diff --git a/solana/crates/program-tools/src/account_info/mod.rs b/solana/crates/program-tools/src/account_info/mod.rs new file mode 100644 index 0000000000..f6c58ac81d --- /dev/null +++ b/solana/crates/program-tools/src/account_info/mod.rs @@ -0,0 +1,32 @@ +mod iter; +mod upgrade_authority; + +pub use iter::*; +pub use upgrade_authority::*; + +// + +use std::cell::{Ref, RefMut}; + +use solana_account_info::AccountInfo; +use solana_program_error::ProgramError; + +/// A silly (but effective) way to make sure we get Ref<[u8]> because +/// [AccountInfo::try_borrow_data] returns Ref<&mut [u8]>. +#[inline(always)] +pub fn try_borrow_data<'a>( + account_info: &'a AccountInfo<'_>, +) -> Result, ProgramError> { + let data = account_info.try_borrow_data()?; + Ok(Ref::map(data, |data| &data[..])) +} + +/// A silly (but effective) way to make sure we get RefMut<[u8]> because +/// [AccountInfo::try_borrow_mut_data] returns RefMut<&mut [u8]>. +#[inline(always)] +pub fn try_borrow_mut_data<'a>( + account_info: &'a AccountInfo<'_>, +) -> Result, ProgramError> { + let data = account_info.try_borrow_mut_data()?; + Ok(RefMut::map(data, |data| &mut data[..])) +} diff --git a/solana/crates/program-tools/src/account_info/upgrade_authority.rs b/solana/crates/program-tools/src/account_info/upgrade_authority.rs new file mode 100644 index 0000000000..95cc3f0c9c --- /dev/null +++ b/solana/crates/program-tools/src/account_info/upgrade_authority.rs @@ -0,0 +1,64 @@ +use solana_account_info::AccountInfo; +use solana_loader_v3_interface::state::UpgradeableLoaderState; +use solana_msg::msg; +use solana_program_error::ProgramError; +use solana_pubkey::Pubkey; + +use crate::get_program_data_address; + +use super::{ + try_next_enumerated_account, EnumeratedAccountInfoIter, NextAccountOptions, TryNextAccounts, +}; + +pub struct UpgradeAuthority<'a, 'b> { + pub program_data: (usize, &'a AccountInfo<'b>), + pub owner: (usize, &'a AccountInfo<'b>), +} + +impl<'a, 'b> TryNextAccounts<'a, 'b, &'a Pubkey> for UpgradeAuthority<'a, 'b> { + fn try_next_accounts( + accounts_iter: &mut EnumeratedAccountInfoIter<'a, 'b>, + program_id: &'a Pubkey, + ) -> Result { + // Index == 0. + let (index, program_data_info) = + try_next_enumerated_account(accounts_iter, Default::default())?; + if program_data_info.key != &get_program_data_address(program_id).0 { + msg!("Invalid program data address (account {})", index); + return Err(ProgramError::InvalidAccountData); + } + + // Index == 1. + let (index, owner_info) = try_next_enumerated_account( + accounts_iter, + NextAccountOptions { + must_be_signer: true, + ..Default::default() + }, + )?; + + let program_data_info_data = program_data_info.data.borrow(); + match bincode::deserialize(&program_data_info_data) { + Ok(UpgradeableLoaderState::ProgramData { + slot: _, + upgrade_authority_address: Some(authority), + }) => { + if owner_info.key != &authority { + msg!( + "Owner (account {}) must match upgrade authority from program data (account {})", index, index - 1 + ); + Err(ProgramError::InvalidAccountData) + } else { + Ok(Self { + program_data: (index - 1, program_data_info), + owner: (index, owner_info), + }) + } + } + _ => { + msg!("Invalid program data (account {})", index - 1); + Err(ProgramError::InvalidAccountData) + } + } + } +} diff --git a/solana/crates/program-tools/src/instruction.rs b/solana/crates/program-tools/src/instruction.rs new file mode 100644 index 0000000000..ff08e60bd7 --- /dev/null +++ b/solana/crates/program-tools/src/instruction.rs @@ -0,0 +1,15 @@ +use borsh::BorshSerialize; +use solana_instruction::{AccountMeta, Instruction}; +use solana_pubkey::Pubkey; + +pub fn try_build_instruction( + program_id: &Pubkey, + accounts: impl Into>, + data: &impl BorshSerialize, +) -> std::io::Result { + Ok(Instruction { + program_id: *program_id, + accounts: accounts.into(), + data: borsh::to_vec(data)?, + }) +} diff --git a/solana/crates/program-tools/src/lib.rs b/solana/crates/program-tools/src/lib.rs new file mode 100644 index 0000000000..b0242adba4 --- /dev/null +++ b/solana/crates/program-tools/src/lib.rs @@ -0,0 +1,95 @@ +#[cfg(feature = "entrypoint")] +pub mod account_info; +pub mod instruction; +#[cfg(feature = "entrypoint")] +pub mod recipe; +pub mod types; +pub mod zero_copy; + +// + +use std::fmt::Display; + +use borsh::{BorshDeserialize, BorshSerialize}; +use solana_pubkey::Pubkey; + +pub const BPF_LOADER_UPGRADEABLE_ID: Pubkey = + solana_pubkey::pubkey!("BPFLoaderUpgradeab1e11111111111111111111111"); + +/// If there is a discriminator used for any data, it should be 8 bytes long. For account data +/// represented as a C-struct, 8 bytes is a convenient size for the discriminator. +/// +/// NOTE: Some programs may have instruction selectors that do not follow this rule (where there is +/// only one byte to discriminate among instructions). +pub const DISCRIMINATOR_LEN: usize = 8; + +pub trait PrecomputedDiscriminator { + const DISCRIMINATOR: Discriminator<8>; + + #[inline(always)] + fn has_discriminator(data: &[u8]) -> bool { + data.len() >= DISCRIMINATOR_LEN && data[..DISCRIMINATOR_LEN] == Self::DISCRIMINATOR.0 + } + + fn discriminator_slice() -> &'static [u8] { + &Self::DISCRIMINATOR.0 + } +} + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, Copy, PartialEq, Eq)] +pub struct Discriminator([u8; N]); + +impl Discriminator { + pub const fn new(value: [u8; N]) -> Self { + Self(value) + } +} + +impl Display for Discriminator { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for byte in &self.0 { + write!(f, "{byte:02x}")?; + } + Ok(()) + } +} + +impl Discriminator { + pub const fn new_sha2(input: &[u8]) -> Self { + assert!(N <= 32, "Exceeds 32 bytes"); + + let digest = sha2_const_stable::Sha256::new().update(input).finalize(); + let mut trimmed = [0; N]; + let mut i = 0; + + loop { + if i >= N { + break; + } + trimmed[i] = digest[i]; + i += 1; + } + + Self(trimmed) + } +} + +pub fn get_program_data_address(program_id: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[program_id.as_ref()], &BPF_LOADER_UPGRADEABLE_ID) +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_sha2_discriminator() { + assert_eq!( + Discriminator::new_sha2(b"hello world"), + Discriminator([ + 185, 77, 39, 185, 147, 77, 62, 8, 165, 46, 82, 215, 218, 125, 171, 250, 196, 132, + 239, 227, 122, 83, 128, 238, 144, 136, 247, 172, 226, 239, 205 + ]) + ); + } +} diff --git a/solana/crates/program-tools/src/recipe/create_account.rs b/solana/crates/program-tools/src/recipe/create_account.rs new file mode 100644 index 0000000000..f912db00ca --- /dev/null +++ b/solana/crates/program-tools/src/recipe/create_account.rs @@ -0,0 +1,156 @@ +use solana_account_info::AccountInfo; +use solana_cpi::invoke_signed_unchecked; +use solana_program_error::ProgramResult; +use solana_pubkey::Pubkey; +use solana_system_interface::instruction as system_instruction; +use solana_sysvar::{rent::Rent, Sysvar}; + +use super::Invoker; + +#[derive(Debug, Default)] +pub struct CreateAccountOptions<'a> { + pub rent_sysvar: Option<&'a Rent>, + pub additional_lamports: Option, +} + +pub fn try_create_account( + payer: Invoker, + new_account: Invoker, + current_lamports: u64, + data_len: usize, + program_id: &Pubkey, + accounts: &[AccountInfo], + options: CreateAccountOptions, +) -> ProgramResult { + let CreateAccountOptions { + rent_sysvar, + additional_lamports, + } = options; + + let rent_exemption_lamports = match rent_sysvar { + Some(rent_sysvar) => rent_sysvar.minimum_balance(data_len), + None => Rent::get().unwrap().minimum_balance(data_len), + }; + + let lamports = additional_lamports + .unwrap_or_default() + .saturating_add(rent_exemption_lamports); + + if current_lamports == 0 { + // PC Load Letter? + match (payer, new_account) { + ( + Invoker::Pda { + key: payer_key, + signer_seeds: payer_signer_seeds, + }, + Invoker::Pda { + key: new_account_key, + signer_seeds: new_account_signer_seeds, + }, + ) => { + let create_account_ix = system_instruction::create_account( + payer_key, + new_account_key, + lamports, + data_len as u64, + program_id, + ); + invoke_signed_unchecked( + &create_account_ix, + accounts, + &[payer_signer_seeds, new_account_signer_seeds], + )?; + } + ( + Invoker::Pda { + key: payer_key, + signer_seeds: payer_signer_seeds, + }, + Invoker::Signer(new_account_key), + ) => { + let create_account_ix = system_instruction::create_account( + payer_key, + new_account_key, + lamports, + data_len as u64, + program_id, + ); + invoke_signed_unchecked(&create_account_ix, accounts, &[payer_signer_seeds])?; + } + ( + Invoker::Signer(payer_key), + Invoker::Pda { + key: new_account_key, + signer_seeds: new_account_signer_seeds, + }, + ) => { + let create_account_ix = system_instruction::create_account( + payer_key, + new_account_key, + lamports, + data_len as u64, + program_id, + ); + invoke_signed_unchecked(&create_account_ix, accounts, &[new_account_signer_seeds])?; + } + (Invoker::Signer(payer_key), Invoker::Signer(new_account_key)) => { + let create_account_ix = system_instruction::create_account( + payer_key, + new_account_key, + lamports, + data_len as u64, + program_id, + ); + invoke_signed_unchecked(&create_account_ix, accounts, &[])?; + } + } + } else { + let new_account_key = match new_account { + Invoker::Pda { + key: new_account_key, + signer_seeds: new_account_signer_seeds, + } => { + let allocate_ix = system_instruction::allocate(new_account_key, data_len as u64); + invoke_signed_unchecked(&allocate_ix, accounts, &[new_account_signer_seeds])?; + + let assign_ix = system_instruction::assign(new_account_key, program_id); + invoke_signed_unchecked(&assign_ix, accounts, &[new_account_signer_seeds])?; + + new_account_key + } + Invoker::Signer(new_account_key) => { + let allocate_ix = system_instruction::allocate(new_account_key, data_len as u64); + invoke_signed_unchecked(&allocate_ix, accounts, &[])?; + + let assign_ix = system_instruction::assign(new_account_key, program_id); + invoke_signed_unchecked(&assign_ix, accounts, &[])?; + + new_account_key + } + }; + + let lamport_diff = lamports.saturating_sub(current_lamports); + + // Transfer as much as we need for this account to be rent-exempt. + if lamport_diff != 0 { + match payer { + Invoker::Pda { + key: payer_key, + signer_seeds: payer_signer_seeds, + } => { + let transfer_ix = + system_instruction::transfer(payer_key, new_account_key, lamport_diff); + invoke_signed_unchecked(&transfer_ix, accounts, &[payer_signer_seeds])?; + } + Invoker::Signer(payer_key) => { + let transfer_ix = + system_instruction::transfer(payer_key, new_account_key, lamport_diff); + invoke_signed_unchecked(&transfer_ix, accounts, &[])?; + } + } + } + } + + Ok(()) +} diff --git a/solana/crates/program-tools/src/recipe/create_token_account.rs b/solana/crates/program-tools/src/recipe/create_token_account.rs new file mode 100644 index 0000000000..e6b4c7cf98 --- /dev/null +++ b/solana/crates/program-tools/src/recipe/create_token_account.rs @@ -0,0 +1,43 @@ +use solana_account_info::AccountInfo; +use solana_cpi::invoke_signed_unchecked; +use solana_program_error::ProgramResult; +use solana_program_pack::Pack; +use solana_pubkey::Pubkey; +use solana_sysvar::rent::Rent; + +use super::Invoker; + +pub fn try_create_token_account( + payer: Invoker, + new_token_account: Invoker, + mint_key: &Pubkey, + token_owner_key: &Pubkey, + current_lamports: u64, + accounts: &[AccountInfo], + rent_sysvar: Option<&Rent>, +) -> ProgramResult { + super::create_account::try_create_account( + payer, + new_token_account, + current_lamports, + spl_token_interface::state::Account::LEN, + &spl_token_interface::ID, + accounts, + super::create_account::CreateAccountOptions { + rent_sysvar, + additional_lamports: None, // No additional lamports for token accounts + }, + )?; + + let initialize_token_account_ix = spl_token_interface::instruction::initialize_account3( + &spl_token_interface::ID, + new_token_account.key(), + mint_key, + token_owner_key, + ) + .unwrap(); + + invoke_signed_unchecked(&initialize_token_account_ix, accounts, &[])?; + + Ok(()) +} diff --git a/solana/crates/program-tools/src/recipe/mod.rs b/solana/crates/program-tools/src/recipe/mod.rs new file mode 100644 index 0000000000..295313ac47 --- /dev/null +++ b/solana/crates/program-tools/src/recipe/mod.rs @@ -0,0 +1,22 @@ +pub mod create_account; +pub mod create_token_account; + +use solana_pubkey::Pubkey; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Invoker<'a, 'b> { + Signer(&'a Pubkey), + Pda { + key: &'a Pubkey, + signer_seeds: &'a [&'b [u8]], + }, +} + +impl Invoker<'_, '_> { + pub fn key(&self) -> &Pubkey { + match self { + Invoker::Signer(key) => key, + Invoker::Pda { key, .. } => key, + } + } +} diff --git a/solana/crates/program-tools/src/system.rs b/solana/crates/program-tools/src/system.rs new file mode 100644 index 0000000000..f67ddd4a2d --- /dev/null +++ b/solana/crates/program-tools/src/system.rs @@ -0,0 +1,128 @@ +use solana_account_info::AccountInfo; +use solana_program_error::ProgramResult; +use solana_pubkey::Pubkey; +use solana_rent::Rent; +use solana_sysvar::Sysvar; + +#[inline(always)] +fn create_account( + payer_key: &Pubkey, + account_key: &Pubkey, + current_lamports: u64, + data_len: usize, + accounts: &[AccountInfo], +) -> ProgramResult { + let lamports = Rent::get().unwrap().minimum_balance(data_len); + + if current_lamports == 0 { + let ix = system_instruction::create_account( + payer_key, + account_key, + lamports, + data_len as u64, + &ID, + ); + + invoke_signed_unchecked(&ix, accounts, &[])?; + } else { + const MAX_CPI_DATA_LEN: usize = 36; + const TRANSFER_ALLOCATE_DATA_LEN: usize = 12; + const SYSTEM_PROGRAM_SELECTOR_LEN: usize = 4; + + // Perform up to three CPIs: + // 1. Transfer lamports from payer to account (may not be necessary). + // 2. Allocate data to the account. + // 3. Assign the account owner to this program. + // + // The max length of instruction data is 36 bytes among the three + // instructions, so we will reuse the same allocated memory for all. + let mut cpi_ix = Instruction { + program_id: solana_program::system_program::ID, + accounts: vec![ + AccountMeta::new(*payer_key, true), + AccountMeta::new(*account_key, true), + ], + data: Vec::with_capacity(MAX_CPI_DATA_LEN), + }; + + // Safety: Because capacity is > 12, it is safe to set this length and + // to set the first 4 elements to zero, which covers the System program + // instruction selectors. + // + // The transfer and allocate instructions are 12 bytes long: + // - 4 bytes for the discriminator + // - 8 bytes for the lamports (transfer) or data length (allocate) + // + // The last 8 bytes will be copied to the data slice. + unsafe { + let cpi_data = &mut cpi_ix.data; + + core::ptr::write_bytes(cpi_data.as_mut_ptr(), 0, TRANSFER_ALLOCATE_DATA_LEN); + cpi_data.set_len(TRANSFER_ALLOCATE_DATA_LEN); + } + + // We will have to transfer the remaining lamports needed to cover rent + // for the account. + let lamport_diff = lamports.saturating_sub(current_lamports); + + // Only invoke transfer if there are lamports required. + if lamport_diff != 0 { + let cpi_data = &mut cpi_ix.data; + + cpi_data[0] = 2; // transfer selector + cpi_data[SYSTEM_PROGRAM_SELECTOR_LEN..TRANSFER_ALLOCATE_DATA_LEN] + .copy_from_slice(&lamport_diff.to_le_bytes()); + + invoke_signed_unchecked(&cpi_ix, accounts, &[])?; + } + + let cpi_accounts = &mut cpi_ix.accounts; + + // Safety: Setting the length reduces the previous length from the last + // CPI call. + // + // Both allocate and assign instructions require one account (the + // account being created). + unsafe { + cpi_accounts.set_len(1); + } + + // Because the payer and account are writable signers, we can simply + // overwrite the pubkey of the first account. + cpi_accounts[0].pubkey = *account_key; + + { + let cpi_data = &mut cpi_ix.data; + + cpi_data[0] = 8; // allocate selector + cpi_data[SYSTEM_PROGRAM_SELECTOR_LEN..TRANSFER_ALLOCATE_DATA_LEN] + .copy_from_slice(&(data_len as u64).to_le_bytes()); + + invoke_signed_unchecked(&cpi_ix, accounts, &[])?; + } + + { + let cpi_data = &mut cpi_ix.data; + + // Safety: The capacity of this vector is 36. This data will be + // overwritten for the next CPI call. + unsafe { + core::ptr::write_bytes( + cpi_data + .as_mut_ptr() + .offset(TRANSFER_ALLOCATE_DATA_LEN as isize), + 0, + MAX_CPI_DATA_LEN - TRANSFER_ALLOCATE_DATA_LEN, + ); + cpi_data.set_len(MAX_CPI_DATA_LEN); + } + + cpi_data[0] = 1; // assign selector + cpi_data[SYSTEM_PROGRAM_SELECTOR_LEN..MAX_CPI_DATA_LEN].copy_from_slice(&ID.to_bytes()); + + invoke_signed_unchecked(&cpi_ix, accounts, &[])?; + } + } + + Ok(()) +} diff --git a/solana/crates/program-tools/src/types.rs b/solana/crates/program-tools/src/types.rs new file mode 100644 index 0000000000..cee81b16d4 --- /dev/null +++ b/solana/crates/program-tools/src/types.rs @@ -0,0 +1,25 @@ +use bytemuck::{Pod, Zeroable}; +use ruint::aliases::U64; + +pub type Flags = U64; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[repr(C)] +pub struct StorageGap([[u8; 32]; N]); + +impl Default for StorageGap { + fn default() -> Self { + Self([Default::default(); N]) + } +} + +macro_rules! impl_storage_gap_pod_zeroable { + ($($n:literal),* $(,)?) => { + $( + unsafe impl Zeroable for StorageGap<$n> {} + unsafe impl Pod for StorageGap<$n> {} + )* + }; +} + +impl_storage_gap_pod_zeroable!(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); diff --git a/solana/crates/program-tools/src/zero_copy/account_info.rs b/solana/crates/program-tools/src/zero_copy/account_info.rs new file mode 100644 index 0000000000..9cd8dbb0db --- /dev/null +++ b/solana/crates/program-tools/src/zero_copy/account_info.rs @@ -0,0 +1,267 @@ +use std::{ + cell::{Ref, RefMut}, + iter::Enumerate, + ops::{Deref, DerefMut}, + slice::Iter, +}; + +use bytemuck::Pod; +use solana_account_info::AccountInfo; +use solana_msg::msg; +use solana_program_error::ProgramError; +use solana_pubkey::Pubkey; + +use crate::{ + account_info::{ + try_borrow_data, try_borrow_mut_data, try_next_enumerated_account, TryNextAccounts, + }, + Discriminator, PrecomputedDiscriminator, DISCRIMINATOR_LEN, +}; + +use super::data_range; + +#[derive(Debug)] +pub struct ZeroCopyAccount<'a, 'b, T: Pod + PrecomputedDiscriminator> { + pub index: usize, + pub info: &'a AccountInfo<'b>, + pub data: Ref<'a, T>, + pub remaining_data: Ref<'a, [u8]>, +} + +impl Deref for ZeroCopyAccount<'_, '_, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.data + } +} + +impl<'a, 'b, T: Pod + PrecomputedDiscriminator> ZeroCopyAccount<'a, 'b, T> { + /// Build a read-only zero-copy view from an already-held `&AccountInfo`. + /// Callers that peel accounts via a shared helper (e.g. interface + /// structs) can use this to typed-deserialize a specific slot after the + /// fact. Enforces optional owner check + discriminator. + #[inline] + pub fn try_from_account_info( + index: usize, + account_info: &'a AccountInfo<'b>, + program_id: Option<&Pubkey>, + ) -> Result { + if let Some(expected_owner) = program_id { + if account_info.owner != expected_owner { + return Err(ProgramError::InvalidAccountOwner); + } + } + + let data = try_borrow_data(account_info)?; + let RefSplit { + discriminator, + mucked_data, + remaining_data, + } = RefSplit::try_new(data)?; + + if !T::has_discriminator(&discriminator) { + msg!( + "Expected discriminator {} for account {}", + T::DISCRIMINATOR, + index + ); + return Err(ProgramError::InvalidAccountData); + } + + Ok(Self { + index, + info: account_info, + data: mucked_data, + remaining_data, + }) + } +} + +impl<'a, 'b, T: Pod + PrecomputedDiscriminator> TryNextAccounts<'a, 'b, Option<&'a Pubkey>> + for ZeroCopyAccount<'a, 'b, T> +{ + #[inline] + fn try_next_accounts( + accounts_iter: &mut Enumerate>>, + program_id: Option<&'a Pubkey>, + ) -> Result { + let (index, account_info) = try_next_enumerated_account(accounts_iter, Default::default())?; + + Self::try_from_account_info(index, account_info, program_id) + } +} + +#[derive(Debug)] +pub struct ZeroCopyMutAccount<'a, 'b, T: Pod + PrecomputedDiscriminator> { + pub index: usize, + pub info: &'a AccountInfo<'b>, + pub data: RefMut<'a, T>, + pub remaining_data: RefMut<'a, [u8]>, +} + +impl Deref for ZeroCopyMutAccount<'_, '_, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.data + } +} + +impl DerefMut for ZeroCopyMutAccount<'_, '_, T> { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.data + } +} + +impl<'a, 'b, T: Pod + PrecomputedDiscriminator> ZeroCopyMutAccount<'a, 'b, T> { + /// Build a mutable zero-copy view from an already-held `&AccountInfo`. + /// Callers that peel accounts via a shared helper can use this to + /// typed-deserialize a specific slot afterwards. Enforces writable, + /// optional owner check, and discriminator. + #[inline] + pub fn try_from_account_info( + index: usize, + account_info: &'a AccountInfo<'b>, + program_id: Option<&Pubkey>, + ) -> Result { + if !account_info.is_writable { + msg!("Account {} must be writable", index); + return Err(ProgramError::InvalidAccountData); + } + if let Some(expected_owner) = program_id { + if account_info.owner != expected_owner { + return Err(ProgramError::InvalidAccountOwner); + } + } + + let data = try_borrow_mut_data(account_info)?; + let RefMutSplit { + discriminator, + mucked_data, + remaining_data, + } = RefMutSplit::try_new(data)?; + + if !T::has_discriminator(&discriminator) { + msg!( + "Expected discriminator {} for account {}", + T::DISCRIMINATOR, + index + ); + return Err(ProgramError::InvalidAccountData); + } + + Ok(Self { + index, + info: account_info, + data: mucked_data, + remaining_data, + }) + } +} + +impl<'a, 'b, T: Pod + PrecomputedDiscriminator> TryNextAccounts<'a, 'b, Option<&'a Pubkey>> + for ZeroCopyMutAccount<'a, 'b, T> +{ + #[inline] + fn try_next_accounts( + accounts_iter: &mut Enumerate>>, + program_id: Option<&'a Pubkey>, + ) -> Result { + let (index, account_info) = try_next_enumerated_account(accounts_iter, Default::default())?; + + Self::try_from_account_info(index, account_info, program_id) + } +} + +pub fn try_initialize<'a, T: Default + Pod + PrecomputedDiscriminator>( + account_info: &'a AccountInfo<'_>, +) -> Result<(RefMut<'a, T>, RefMut<'a, [u8]>), ProgramError> { + let data = try_borrow_mut_data(account_info)?; + + let RefMutSplit { + mut discriminator, + mucked_data, + remaining_data, + } = RefMutSplit::try_new(data)?; + + // If this account already has a discriminator, it means it has already been + // initialized. + if discriminator.as_ref() != [0, 0, 0, 0, 0, 0, 0, 0] { + let mut buf = [0; DISCRIMINATOR_LEN]; + buf.copy_from_slice(&discriminator); + + msg!( + "Account {} already initialized with discriminator {}", + account_info.key, + Discriminator::new(buf), + ); + return Err(ProgramError::InvalidAccountData); + } + + // First, serialize the discriminator. + discriminator.copy_from_slice(T::discriminator_slice()); + + Ok((mucked_data, remaining_data)) +} + +// +// Helpers. +// + +struct RefSplit<'a, T: Pod + PrecomputedDiscriminator> { + discriminator: Ref<'a, [u8]>, + mucked_data: Ref<'a, T>, + remaining_data: Ref<'a, [u8]>, +} + +impl<'a, T: Pod + PrecomputedDiscriminator> RefSplit<'a, T> { + #[inline(always)] + fn try_new(data: Ref<'a, [u8]>) -> Result, ProgramError> { + // Would love to use const here. + let range = data_range::(); + + if data.len() < range.end { + return Err(ProgramError::AccountDataTooSmall); + } + + let (left_data, remaining_data) = Ref::map_split(data, |data| data.split_at(range.end)); + let (discriminator, account_data) = + Ref::map_split(left_data, |data| data.split_at(DISCRIMINATOR_LEN)); + + Ok(Self { + discriminator, + mucked_data: Ref::map(account_data, bytemuck::from_bytes), + remaining_data, + }) + } +} + +struct RefMutSplit<'a, T: Pod + PrecomputedDiscriminator> { + discriminator: RefMut<'a, [u8]>, + mucked_data: RefMut<'a, T>, + remaining_data: RefMut<'a, [u8]>, +} + +impl<'a, T: Pod + PrecomputedDiscriminator> RefMutSplit<'a, T> { + #[inline(always)] + fn try_new(data: RefMut<'a, [u8]>) -> Result, ProgramError> { + // Would love to use const here. + let range = data_range::(); + + if data.len() < range.end { + return Err(ProgramError::AccountDataTooSmall); + } + + let (left_data, remaining_data) = + RefMut::map_split(data, |data| data.split_at_mut(range.end)); + let (discriminator, account_data) = + RefMut::map_split(left_data, |data| data.split_at_mut(DISCRIMINATOR_LEN)); + + Ok(Self { + discriminator, + mucked_data: RefMut::map(account_data, bytemuck::from_bytes_mut), + remaining_data, + }) + } +} diff --git a/solana/crates/program-tools/src/zero_copy/mod.rs b/solana/crates/program-tools/src/zero_copy/mod.rs new file mode 100644 index 0000000000..2ff472211b --- /dev/null +++ b/solana/crates/program-tools/src/zero_copy/mod.rs @@ -0,0 +1,33 @@ +#[cfg(feature = "entrypoint")] +mod account_info; + +#[cfg(feature = "entrypoint")] +pub use account_info::*; + +// + +use bytemuck::Pod; + +use crate::{PrecomputedDiscriminator, DISCRIMINATOR_LEN}; + +pub const fn data_end() -> usize { + DISCRIMINATOR_LEN + size_of::() +} + +pub const fn data_range() -> std::ops::Range { + DISCRIMINATOR_LEN..data_end::() +} + +pub fn checked_from_bytes_with_discriminator(data: &[u8]) -> Option<(&T, &[u8])> +where + T: Pod + PrecomputedDiscriminator, +{ + let range = data_range::(); + let (account_data, remaining_data) = data.split_at_checked(range.end)?; + + if T::has_discriminator(account_data) { + Some((bytemuck::from_bytes(&account_data[range]), remaining_data)) + } else { + None + } +} diff --git a/solana/docs/audits/adevar_audit_revenue_distribution_202511.pdf b/solana/docs/audits/adevar_audit_revenue_distribution_202511.pdf new file mode 100644 index 0000000000..e6080dd3f4 Binary files /dev/null and b/solana/docs/audits/adevar_audit_revenue_distribution_202511.pdf differ diff --git a/solana/docs/audits/ottersec_audit_passport_202510.pdf b/solana/docs/audits/ottersec_audit_passport_202510.pdf new file mode 100644 index 0000000000..06b787c26a Binary files /dev/null and b/solana/docs/audits/ottersec_audit_passport_202510.pdf differ diff --git a/solana/docs/audits/ottersec_audit_revenue_distribution_202510.pdf b/solana/docs/audits/ottersec_audit_revenue_distribution_202510.pdf new file mode 100644 index 0000000000..6fbeb8296b Binary files /dev/null and b/solana/docs/audits/ottersec_audit_revenue_distribution_202510.pdf differ diff --git a/solana/docs/rfc/0001_ALLOW_WRITING_OFF_DEBT_FOR_SAME_DISTRIBUTION.md b/solana/docs/rfc/0001_ALLOW_WRITING_OFF_DEBT_FOR_SAME_DISTRIBUTION.md new file mode 100644 index 0000000000..6d7008b738 --- /dev/null +++ b/solana/docs/rfc/0001_ALLOW_WRITING_OFF_DEBT_FOR_SAME_DISTRIBUTION.md @@ -0,0 +1,161 @@ +# Allow Writing Off Debt for Same Distribution + +--- + +## Summary + +The proposed feature is to allow uncollectible debt accounting for a given +DoubleZero rewards distribution to apply to the same distribution for which the +debt was originally computed. Without this feature, uncollectible debt is pushed +to another future distribution’s accounting, which may not be fair to network +contributors. + +## Motivation + +With the current method to write off debt, two distribution accounts are +required to execute the instruction onchain: one, whose debt is uncollectible, +and another (future) one, which will modify its debt calculation to satisfy the +uncollectible debt amount from the first distribution. For example, if +distribution #1 has collected 99 of 100 SOL and does not expect the remaining 1 +SOL to be collectible, this 1 SOL can be written off and attributed to the total +collectible amount of distribution #2. + +Debt accounting is used to determine how much 2Z can be swept into the +distribution after this SOL revenue is converted to 2Z. Using the example above, +if distribution #2 has 105 SOL debt, the amount of 2Z that is allowed to be +converted for this distribution is this amount less the written off amount from +distribution #1, which means only 104 SOL is convertible to 2Z. + +The mechanism was designed this way because the 2Z sweeping was meant to not be +blocked by delays in determining whether any debt is uncollectible. So while the +accountant process determines whether to write off debt, contributors for the +current distribution can still be rewarded without delay. This mechanism works +fine if the proportion of bad debt is small and changes in contributor reward +calculation differences between distributions are unremarkable. But this +scenario may not be accurate in situations like existing contributors adding +more valuable links or new contributors providing connectivity to the DoubleZero +network. In conjunction with a significant amount of bad debt, these new +contributions would not be rewarded sufficiently. + +The protocol should strive for rewards to be as accurate as possible. By +attributing bad debt to the same distribution the debt was originally +calculated, we achieve this goal. + +## New Terminology + +There is no new terminology introduced. + +## Alternatives Considered + +The protocol can do nothing, which avoids a smart contract upgrade. As long as +the risk of large uncollectible debt is managed in a way that it gets smoothed +out across future distributions, the effect of this bad debt may not be felt as +much. But any large amount of debt from a given user can make smoothing more +difficult. + +The protocol can also consider a way to remove swept 2Z from a distribution to +attribute to a future distribution. But this accounting is not straightforward +due to not knowing how much 2Z should be associated with any amount of bad debt +after the sweep. + +## Detailed Design + +There are two parts of the instruction processor that need to change in order to +allow same-distribution debt write-off. + +In the `try_forgive_solana_validator_debt` processor, we need to change the +current logic: + +```rust +if next_distribution.dz_epoch <= distribution.dz_epoch { + msg!("Next distribution's epoch must be ahead of the current distribution's epoch"); + return Err(ProgramError::InvalidAccountData); +} +``` + +The change is simply: + +```rust +if next_distribution.dz_epoch < distribution.dz_epoch { + msg!("Next distribution's epoch must be at least the epoch of the current distribution"); + return Err(ProgramError::InvalidAccountData); +} +``` + +When the accountant invokes this instruction, he will pass in the same pubkey +for both distribution accounts. The rest of the checks that follow will still +apply (making sure that debt has been finalized and 2Z has not been swept yet). +Even though these checks would have been already performed on the first +distribution, the redundancy does not cost much more compute units. + +The next change must occur in the `try_sweep_distribution_tokens` processor, +where we will need to check that the rewards calculation has been finalized: + +```rust +// Make sure the distribution rewards calculation is finalized. +if !distribution.is_rewards_calculation_finalized() { + msg!("Distribution rewards have not been finalized"); + return Err(ProgramError::InvalidAccountData); +} +``` + +This check can occur anywhere after deserializing the distribution account in +this processor. + +This check constrains the 2Z sweep to only occur after the reward deferral +period, which gives the accountant time to write off debt. And since the rewards +finalization is a prerequisite for sweeping 2Z, this check can now be removed +from the distribute rewards instruction processor. + +## Impact + +Only three instruction processors will be modified (see Detailed Design), with +one of these modifications being the elimination of a redundant check caused by +this change. + +Tests will be added or modified to support this change, specifically the +forgive-solana-validator-debt and sweep-distribution-tokens instructions. + +This change will require an onchain upgrade. + +The effects of this change will result in more accurate rewards calculated for +network contributors whenever the accountant needs to write off debt. + +## Security Considerations + +Without this change, sweeping 2Z isolated an attack surface to steal funds to +the distribution account level. Whenever these tokens are swept, the amount of +2Z reflecting the amount of rewards to distribute and burn reside in a token +account associated only with this distribution. By allowing the sweep to be +performed whenever there is sufficient 2Z liquidity to satisfy the total debt +of this distribution, the cost of the attack on the swap destination account +(where 2Z sits as a result of SOL/2Z conversions prior to being swept) is +minimized. + +Now that finalizing rewards is a prerequisite to sweeping 2Z, at least the +amount that covers the deferral period will sit in the swap destination account, +making the financial incentive to attack the protocol a multiple of what it was +(determined by this deferral period). So if the deferral period were configured +to 32 epochs, for example, the financial incentive increases by 32 fold since +there would be 32 epochs of rewards sitting before they can finally be +distributed. + +When this change is implemented, it should be assumed that there is no +vulnerability or loophole that would allow an attacker to take these funds. The +existing safeties and additional checks associated with this change will make it +unlikely that an attack would succeed. + +## Backward Compatibility + +The only compatibility change is associated with the timing of sweeping 2Z, +which will require the rewards finalization as a prerequisite. Because it is a +permissionless instruction, any offchain process trying to call this instruction +will encounter a revert if rewards have not been finalized. + +Aside from that change, the smart contract will be backward compatible since no +instruction interfaces or account schemas will change. + +## Open Questions + +- Are there any other checks that need to be introduced? Or are there any + existing checks that are not redundant? \ No newline at end of file diff --git a/solana/docs/rfc/0002_IMPROVED_DEBT_WRITE_OFF_TRACKING.md b/solana/docs/rfc/0002_IMPROVED_DEBT_WRITE_OFF_TRACKING.md new file mode 100644 index 0000000000..49897febd7 --- /dev/null +++ b/solana/docs/rfc/0002_IMPROVED_DEBT_WRITE_OFF_TRACKING.md @@ -0,0 +1,152 @@ +# Improved Debt Write-Off Tracking + +--- + +## Summary + +The proposed feature is to add more account data for ease of uncollectible debt +tracking. Currently, it requires fetching transaction data to search for this +information, which is inefficient. Instead, this information should be added to +account data to avoid having to spend resources on RPC calls and indexing. + +## Motivation + +It is currently possible to fetch information of whose debt is written off and +how much. But doing so requires fetching every transaction, which will become +more like finding a needle in a haystack as more validators connect to the +DoubleZero network. + +For example, a distribution would have a number of transactions roughly equal to +the number of Solana validators that owe debt towards this distribution. So if +there are 400 validators, we should expect at least 400 transactions associated +with this distribution PDA. + +If one of these transactions is a debt write off, we would have to first fetch +all transaction hashes associated with this distribution account. Then, we would +have to fetch details for each transaction to deserialize the instruction data +to find which transactions are associated with the debt write off instruction. +If we do not save this information offchain, we would have to perform the same +search mission. + +This fetch could be condensed into one account fetch where all of this data +would basically be indexed for us. There would be no need for an offchain +indexer since it lives onchain. + +The cost of keeping track of a bitmap of written off debt is 0.00000696 SOL +multiplied by the number of Solana validators divided by 8. This translates to a +very small amount of money that the accountant has to outlay to store this +information onchain. + +If someone wanted to track the history of bad debt, the number of fetches is a +function of the number of distributions. Better yet, all distributions in +existence can be fetched by using `getProgramAccounts` with a filter for the +distribution account’s data discriminator, which is just one call. + +## New Terminology + +There is no new terminology introduced. + +## Alternatives Considered + +Data can be saved with an indexer, where this indexer would listen to +transactions and save the transaction hashes (or transaction drains) associated +with writing off debt, keyed off by the distribution’s epoch. But this process +would be offchain, meaning that folks would have to rely on a third party for +this information. + +An SDK can be written that demonstrates how to fetch these transactions on +demand. But these fetches can be costly depending on the RPC rates and may have +a limit to how far back in time the RPC has access to archival data. + +## Detailed Design + +There should be two index fields added to the distribution accounts schema to +point to where in the account data to find the bitmap of debt write offs. The +Solana validator deposit account will track the total amount of debt written +off. + +The forgive-solana-validator-debt instruction should change to take the Solana +validator deposit account as writable so the amount of written off debt can be +updated. The protocol can also deprecate this instruction in favor of another +instruction that writes off debt. + +```rust +let solana_validator_deposit = ZeroCopyMutAccount::::try_next_accounts( + &mut accounts_iter, + Some(&ID), +)?; +msg!("Node ID: {}", solana_validator_deposit.node_id); +``` + +Currently the node ID is read in via instruction data. Its interface should +change to resemble the pay-solana-validator-debt instruction, where the node ID +can be read from the deposit account. + +```rust + +pub enum RevenueDistributionInstructionData { + .. + WriteOffSolanaValidatorDebt { + amount: u64, + proof: MerkleProof, + }, + .. +} +``` + +An instruction to reallocate data to the distribution account based on the +number of Solana validators who have debt should be be introduced. This +instruction can be permissionless. The new instruction will check if the debt +write off indices have been set yet. If not, set them and reallocate the +account. + +```rust +pub enum RevenueDistributionInstructionData { + .. + AllowSolanaValidatorDebtWriteOff, + .. +} +``` + +This new instruction requires the System program in order to transfer lamports +from the invoker in order to make the Distribution account rent-exempt after the +data reallocation. + +## Impact + +Only one existing interface is affected by this change, but its instruction can +only be called by the debt accountant. The offchain process to handle writing +off debt will have to change to factor the additional account (Solana validator +deposit) and the change in instruction data. + +If there is any written off debt executed before this change, the new debt +write-off bitmap and deposit account write-off tracking will not reflect +reality. In this case, offchain processes will have to fallback to fetching +transactions to resolve whose debt was written off and how much. The protocol +can consider an account migration after upgrading the smart contract to sync the +account states. + +Performance in fetching written off debt information will be improved since this +data will now live onchain. This change will also improve debt accounting +transparency. + +## Security Considerations + +This change does not introduce new attack surfaces. Although the new account +data makes the debt accounting processing more transparent, there are no privacy +issues introduced since all of the data is onchain still (via fetching +transaction details). + +## Backward Compatibility + +If the debt accountant already handles debt write-offs, the offchain process +will have to account for the instruction interface change. Everything else is +backwards compatible. + +Because this change introduces an interface change, the smart contract version +necessitates a major bump if a major version is established or a minor version +bump if zero-versioned. + +## Open Questions + +No open questions. \ No newline at end of file diff --git a/solana/docs/rfc/0003_BAD_DEBT_RECOVERY_AND_ERRONEOUS_DEBT_ACCOUNTING.md b/solana/docs/rfc/0003_BAD_DEBT_RECOVERY_AND_ERRONEOUS_DEBT_ACCOUNTING.md new file mode 100644 index 0000000000..de9db6a77d --- /dev/null +++ b/solana/docs/rfc/0003_BAD_DEBT_RECOVERY_AND_ERRONEOUS_DEBT_ACCOUNTING.md @@ -0,0 +1,292 @@ +# Bad Debt Recovery and Erroneous Debt Accounting + +--- + +## Summary + +The proposed feature is to allow the following handling of written-off debt: + +1. Recover bad debt if Solana validators pay back the debt that the protocol + wrote off. If a Solana validator expresses his intent of wanting to be + connected to the DoubleZero network by paying off his bad debt, there is + currently no way for the network contributors to benefit. +2. Record erroneously calculated debt. There may be unforeseen circumstances + which result in the accountant to miscalculate debt for a given Solana + validator. By recording this debt as erroneous, the protocol effectively + forgives this debt due to its own error. + +With the new feature, this debt recovery will provide a windfall to network +contributors for a future rewards distribution. + +## Motivation + +Currently, there are only two pathways to handle Solana validator debt: pay and +write-off. Paid debt goes towards network contributor rewards. Debt write-offs +help the protocol by relieving the system from accruing bad debt, which reduces +the rewards for a given distribution. + +If there were no mechanism to write off bad debt, the protocol will eventually +not be able to distribute rewards as soon as the rewards deferral period ends. +But the protocol does not benefit from keeping this debt written off without any +recourse to recoup these losses. + +There are two pathways on how to handle written-off debt. + +1. Attempt to collect this debt to recover the losses incurred from the past. +2. Forgive this debt if the protocol accrued this debt by mistake. + +The second pathway is effectively no different than keeping the debt written-off +as-is, but it clears up whether a Solana validator is still on the hook to pay. +The first pathway, though, is crucial for rewarding network contributors. + +Network contributors may project future revenue based on written-off debt. With +debt recovery, these projections will more accurately reflect the +creditworthiness of users on the network. + +Once rewards have been distributed for a given distribution, there is nothing +left to do with that distribution. 2Z tokens swept into those distributions +effectively finalize the amount of rewards that will be distributed to network +contributors and burned. Because the distribution has reached the end of its +lifecycle, recovered debt will act as a windfall for a future distribution. A +future distribution’s swept 2Z amount will be determined by the sum of collected +debt for that distribution and the recovered debt from a past distribution. + +## New Terminology + +Two new terms are introduced to the protocol: debt recovery and erroneous debt. + +Debt recovery defines the mechanism of providing a windfall for a future +distribution based on paying back past bad debt. The term also captures the +ability to improve a Solana validator’s standing in the protocol by showing how +reliable he is paying off his debts. + +Erroneous debt is a classification of written-off debt, which can be toggled on +or off. When debt for a given epoch and Solana validator is erroneous, debt will +not be recovered. + +## Alternatives Considered + +Debt calculations for a given distribution can account for any to-be-recovered +bad debt. This method requires the accountant to know (or guess) the amount a +Solana validator intends to pay back by monitoring this validator’s deposit +account balance. Monitoring Solana validator deposit balances introduces a +significant offchain burden and is prone to error. Even if the Solana validator +were to attach a memo with a particular transfer to his deposit account, the +memo and the deposit balance may not agree because both of these instructions +are independently constructed. + +Debt recovery does not have to be implemented at all. If recovery were not +considered, all written-off debt is effectively forgiven, which should not be +the end state of this debt. Solana validator creditworthiness will forever be +tarnished, which is also not an accurate reflection of their ability to pay +their dues. + +## Detailed Design + +### Onchain + +There should be additional fields introduced to the distribution account schema, +which tracks the amount of recovered SOL debt and erroneous merkle leaves. + +```rust +pub struct Distribution { + .. + /// The amount of SOL that was accrued from a past distribution, but was + /// written off. This amount is added to the total debt for this + /// distribution and acts as a windfall for network contributors. + pub recovered_sol_debt: u64, + + pub erroneous_solana_validator_debt_start_index: u32, + pub erroneous_solana_validator_debt_end_index: u32, + .. +} +``` + +The recovered SOL debt tracking will be modified for the distribution that will +be receiving the windfall. And the distribution who owns the bad debt, the +erroneous bitmap will be modified. + +The following method will change to incorporate this recovered SOL debt. + +```rust + pub fn checked_total_sol_debt(&self) -> Option { + self.total_solana_validator_debt + .saturating_add(self.recovered_sol_debt) + .checked_sub(self.uncollectible_sol_debt) + } +``` + +Instead of tracking with the existing `written_off_sol_debt`, where the recovery +process can reduce this value, there should also be another field introduced to +the Solana validator deposit account schema to track the amount of recovered SOL +debt separately. Additionally, a field to track erroneous debt should be added. + +```rust +pub struct SolanaValidatorDeposit { + .. + /// The amount of SOL that was accrued from a past distribution, but was + /// written off. + recovered_sol_debt: u64, + + /// The amount of SOL that was erroneously calculated by the protocol. + erroneous_sol_debt: u64, + .. +} +``` + +Recoverable debt would then be calculated as: + +```rust + pub fn checked_recoverable_sol_debt(&self) -> Option { + self.written_off_sol_debt + .saturating_sub(self.recovered_sol_debt) + .checked_sub(self.erroneous_sol_debt) + } +``` + +Two instructions should be introduced. + +```rust +pub enum RevenueDistributionInstructionData { + .. + ResolveBadSolanaValidatorDebt { + amount: u64, + proof: MerkleProof, + resolution: BadSolanaValidatorDebtResolution + }, + EnableErroneousSolanaValidatorDebt, + .. +} + +pub enum BadSolanaValidatorDebtResolution { + #[default] + Recover, + ReclassifyUnpaid, + ReclassifyErroneous, +} +``` + +The resolve-bad-solana-validator-debt instruction arguments are similar to the +pay-solana-validator-debt instruction, but will have an additional enumeration +of values determining the type of resolution. This instruction can only be +called by the debt accountant because he will determine which distributions to +prioritize for debt recovery. This instruction requires the following accounts: + +1. Program config. The instruction will check whether the program is paused. If + it is, force the instruction to revert. + +2. Debt accountant. This account’s key will be checked against the debt + accountant key encoded in the program config. This account must be a signer, + which enforces that the debt accountant is calling this instruction. If the + instruction becomes permissionless, this account will not be checked. + +3. Distribution with bad debt. This account will have the debt write-off bitmap + to validate whether the Solana validator has debt written off for this + distribution. The write-off bitmap value must be true or the instruction will + revert. + + Depending on the resolution type, different bitmaps will be referenced. For + the recover type, the write-off bitmap’s value at this Solana validator’s + index will be set to false by the time the instruction succeeds. For both + reclassify types, the erroneous bitmap’s value will be set to true if + erroneous and false if unpaid. + + The distribution account must have already had rewards finalized or the + instruction will revert. + +4. Solana validator deposit account. Depending on the resolution type, this + account will have its debt tracking variables modified. For the recover type, + `recovered_sol_debt` increases by the amount of debt. For the reclassify + unpaid type, `erroneous_sol_debt` decreases by the amount of debt. For the + reclassify erroneous type, `erroneous_sol_debt` increases by the amount of + debt. + + Its node ID along with the instruction data will be used to construct the + leaf to compute the merkle root, which will be verified against the debt + merkle root in the distribution with bad debt. If the roots do not agree, the + instruction will revert. The instruction should also revert if the debt + calculated using this deposit account is not at least as much as the amount + passed into this instruction when attempting to recover. + +5. Journal. This account will only be used with the recover resolution type. It + will receive the SOL from the Solana validator deposit account for the + recovered debt amount. This SOL transfer is consistent with the + pay-solana-validator-debt instruction. + +6. Distribution for windfall. This account will only be used with the recover + resolution type. It will have its `recovered_sol_debt` increase by the amount + of debt recovered. This distribution’s debt merkle root must be finalized and + rewards root must not be finalized (otherwise the instruction will revert). + This distribution does not have to have any debt computed for it; recovered + debt is additive, so the total collected debt would then result in swept 2Z + for rewards. + +The enable-erroneous-solana-validator-debt instruction will work similarly to +how the enable-solana-validator-debt-write-off. It will reallocate data to the +disetribution account based on the number of Solana validators who have debt. +This isntruction can be permissionless. The new instruction will check if the +erroneous debt indices have been set yet. If not, set them and reallocate the +account. + +### Offchain + +The debt accountant offchain process should introduce a programmatic way of +trying to recover debt. For every new epoch, it should attempt to recover debt +from the earliest distribution with written-off debt. The easiest way to +determine whether the process should recover debt is by fetching the Solana +validator deposit balances for all node IDs who have debt calculated and +checking whether the balance of each exceeds the calculated debt for a given +epoch. This debt recovery will apply to the next distribution whose rewards will +be distributed at the turn of the next epoch. + +The debt accountant should also add a command to specify erroneous debt +attributed to a Solana validator’s node ID. This command simply invokes the +configure-solana-validator-deposit instruction while specifying an amount for +erroneous SOL debt. + +## Impact + +Because the proposal adds instructions handling written-off debt only, these +instructions are isolated from the existing Revenue Distribution smart contract +functionality. The offchain changes required to handle debt recovery should +precede a smart contract upgrade, which will support the new instructions. + +The debt accountant offchain process will require more logic when it runs. The +programmatic debt recovery can occur immediately after initializing a new +distribution to ensure it runs once per epoch. Or it can be implemented more +simply by running asynchronously by trying to recover debt at a fixed interval +(but this method will require more cycles to run). + +There should be no impact to offchain performance. + +This change will increase the expected value of rewards for network contributors +by providing a windfall of 2Z tokens as a result of recovering bad debt. And the +community can use the written-off, recovered and erroneous debt amounts to +determine creditworthiness of Solana validators. + +## Security Considerations + +This change does not introduce new attack surfaces. Both instructions are +guarded by checking that the caller is the debt accountant. + +The erroneous debt amount may reveal bugs in tracking Solana validator users, +either in the debt accounting process or at the DoubleZero network layer. + +## Backward Compatibility + +Everything is backwards compatible because no existing interfaces change. The +existing debt accountant offchain process can continue running while the debt +recovery logic is added. + +This change only requires a minor version bump if a major version is established +or a patch version bump if zero-versioned. + +## Open Questions + +- Can debt recovery be introduced as a permissionless instruction? How can the + Revenue Distribution program ensure that a recover-bad-solana-validator-debt + instruction is called at the right time if anyone can call it? +- Should debt be allowed to be classified as erroneous before it was written + off? There is nothing precluding the accountant from writing off debt and then + setting as erroneous. But there may be an advantage to having this toggle + apply to either written off or unprocessed debt. diff --git a/solana/docs/rfc/0004_ALLOW_DIRECT_2Z_PAYMENTS_FOR_NETWORK_RESOURCES.md b/solana/docs/rfc/0004_ALLOW_DIRECT_2Z_PAYMENTS_FOR_NETWORK_RESOURCES.md new file mode 100644 index 0000000000..0c08ce65c3 --- /dev/null +++ b/solana/docs/rfc/0004_ALLOW_DIRECT_2Z_PAYMENTS_FOR_NETWORK_RESOURCES.md @@ -0,0 +1,145 @@ +# Allow Direct 2Z Payments for Network Resources + +--- + +## Summary + +This RFC introduces a canonical token account for collecting 2Z payments. It +does not define how payment amounts are determined or enforced. + +For minimum viable products (MVPs) using a specific resource on the network +(e.g. multicast publishing), onchain enforcement of paying for these specific +products may not be defined at the time of product deployment on the physical +network. But in the meantime, there should be a mechanism to reward network +contributors with offchain processes to validate these 2Z payments. + +This RFC exists to decouple resource availability from enforceable onchain +billing. + +## Motivation + +Currently, the protocol only supports one type of user: Solana validators paying +a proportion of their block rewards. In order to support other tenants more +easily, there should not be a coupling between resource access and billing +enforceable onchain. + +If there were a way for other users to pay the protocol, where these payment +amounts would be determined offchain, network contributors can be rewarded +without any bottlenecks from engineering to build onchain solutions to support +collecting payments for specific use cases. + +Because 2Z is how network contributors are rewarded, there should be a way to +accept direct 2Z payments to the protocol. + +As the protocol refines the use cases it supports on the network, these direct +payments can shift to a more specific payment workflow as soon as it is defined +onchain. And while users migrate from one payment method to another, the end +result to network contributors should not change: they continue to be rewarded +for usage on the network. + +It is important to note that this RFC does not aim to discuss any specific +offchain computation for enforcing payments. Any specific payment scheme for a +new network user should be a separate RFC. + +## New Terminology + +Direct 2Z payments is a new term introduced to the protocol. This type of +payment is neither a resource-scoped mechanism nor tied to any onchain +enforcement. These payments are aggregated into the latest distribution and are +subject to the same rewards deferral period. + +## Alternatives Considered + +As the DoubleZero network supports new use cases, there can always be an +engineering constraint to enforce the payment onchain tied to this use. But not +all use cases can be supported onchain easily. One such example is supporting a +non-crypto user, whose usage will have to be determined offchain in order for +the protocol to invoice this user. + +Support to add data onchain that ties this usage to a particular payment amount +based on a specific fee structure may hurt network contributors if the protocol +does not have everything built to support the user fully (new features on the +physical network in addition to onchain payment support). Introducing these +delays is an inefficient way of onboarding new types of users. + +## Detailed Design + +### Onchain + +The distribution account already supports a field +`collected_prepaid_2z_payments`, which can be used to aggregate all of the +direct 2Z payments to the protocol. + +There should be a token account (specifically an Associated Token Account) that +will act as a deposit address for all direct 2Z payments to the protocol. The +owner will be the Journal PDA. It acts as a destination of 2Z aggregated among +all users without onchain payment enforcement, meaning that it does not encode +attribution to a specific network resource. + +The initialize-distribution instruction should take the Journal’s ATA as an +additional account. This instruction processor should deserialize the token +account in order to transfer its full balance to the latest distribution’s token +account. This balance will be added to the `collected_prepaid_2z_payments` +field. + +The smart contract already factors in this field when calculating the total 2Z +for reward distributions. Up until this proposal, this field was just zero. + +Prior to upgrading the smart contract, the Revenue Distribution program +interface should be updated to add the additional Journal ATA account so that +the debt accountant offchain process can be ready for the onchain change of +using this account when it initializes new distributions. Until then, the extra +account will just be unused. + +### Offchain + +Because the ATA may not be created for the Journal yet, it will need to exist +before the initialize-distribution instruction can use this account. Creating +ATAs is permissionless, so anyone can invoke the create instruction. + +The debt accountant offchain process should integrate with the new interface +prior to the onchain upgrade. + +Because the Journal ATA acts as a deposit address for 2Z, payments can be made +directly by transferring 2Z to this token account (and can be easily derived +knowing that the Journal PDA is its owner). But there should be support in the +CLI to allow users to easily transfer 2Z to this account. + +## Impact + +The only onchain change is how the initialize-distribution instruction will +handle this new token account. Handling the transfer from this new account is a +minimal change. + +The debt accountant change is also minimal since it only needs the latest +interface prior to an upgrade. It is crucial, however, for the updated debt +accountant to be deployed prior to the onchain upgrade. Otherwise, the debt +accountant process will not be able to initialize a new distribution until it +knows about the new interface. + +By adding this new token account to accept 2Z payments, the protocol will be +able to enable more types of paying users ready to join the DoubleZero network +by leveraging offchain computation to validate these payments. + +## Security Considerations + +This change does not introduce new attack surfaces. But it is important to note +that this Journal ATA will be swept of its balance at the time a new +distribution is initialized. Any 2Z inadvertently sent to this account will be +taken to distribute to network contributors. + +## Backward Compatibility + +This change is technically a breaking change to the initialize-distribution +instruction. But if the interface is changed prior to the smart contract +implementing the change to handle this new token account, the rollout will not +impede the protocol from initializing new distributions. + +The interface change only requires a minor version bump if a major version is +established or a patch version bump if zero-versioned. And the smart contract +implementation should bump the patch version. + +## Open Questions + +- Instead of sweeping the balance of the Journal ATA to the latest distribution, + should it be swept to the about-to-be-rewarded distribution instead? diff --git a/solana/docs/rfc/README.md b/solana/docs/rfc/README.md new file mode 100644 index 0000000000..431863223d --- /dev/null +++ b/solana/docs/rfc/README.md @@ -0,0 +1,13 @@ +# Requests for Change + +These documents outline improvements to any of the DoubleZero Solana programs. +PRs that reflect these changes should reference the relevant RFC. + +When drafting a new RFC, please refer to the template found in +[malbeclabs/doublezero] and add the RFC to the table of contents below. + +## Table of Contents + +- Allow Writing Off Debt for Same Distribution + +[malbeclabs/doublezero]: https://github.com/malbeclabs/doublezero/blob/main/rfcs/rfc0-template.md diff --git a/solana/mock/rewards-integration/Cargo.toml b/solana/mock/rewards-integration/Cargo.toml new file mode 100644 index 0000000000..36f9e43050 --- /dev/null +++ b/solana/mock/rewards-integration/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "mock-rewards-integration" +publish = false + +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +version.workspace = true + +[dependencies] +borsh = { workspace = true, features = ["derive"] } +bytemuck = { workspace = true, features = ["derive", "min_const_generics"] } +doublezero-program-tools = { workspace = true, features = ["entrypoint"] } +doublezero-revenue-distribution.workspace = true +solana-account-info.workspace = true +solana-cpi.workspace = true +solana-instruction.workspace = true +solana-msg.workspace = true +solana-program-entrypoint.workspace = true +solana-program-error.workspace = true +solana-program-pack.workspace = true +solana-pubkey = { workspace = true, features = ["borsh"] } +solana-system-interface.workspace = true +solana-sysvar.workspace = true +spl-token-interface.workspace = true + +[features] +default = [] +development = ["doublezero-revenue-distribution/development"] +entrypoint = [] + +[lib] +crate-type = ["cdylib", "lib"] + +[lints.rust] +unexpected_cfgs = { level = "allow", check-cfg = ['cfg(custom_heap)'] } diff --git a/solana/mock/rewards-integration/src/instruction.rs b/solana/mock/rewards-integration/src/instruction.rs new file mode 100644 index 0000000000..79fb9483f3 --- /dev/null +++ b/solana/mock/rewards-integration/src/instruction.rs @@ -0,0 +1,83 @@ +use std::io; + +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_tools::{ + instruction::try_build_instruction, Discriminator, DISCRIMINATOR_LEN, +}; +use doublezero_revenue_distribution::{ + integration::{find_integration_bucket_address, find_integration_distribution_address}, + types::DoubleZeroEpoch, + DOUBLEZERO_MINT_KEY, +}; +use solana_instruction::{AccountMeta, Instruction}; +use solana_pubkey::Pubkey; +use solana_system_interface::program as system_program; + +use crate::ID; + +/// Mock integration instructions. The mock's processor first checks whether +/// incoming data starts with byte 0 (the shared +/// `IntegrationInstructionData::WithdrawIntegrationRewards` discriminator) +/// and routes to the interface handler. Any other first byte is dispatched +/// here. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum MockRewardsIntegrationInstructionData { + /// Create the mock's per-epoch integration distribution PDA. + InitializeIntegrationDistribution { dz_epoch: DoubleZeroEpoch }, +} + +impl MockRewardsIntegrationInstructionData { + pub const INITIALIZE_INTEGRATION_DISTRIBUTION: Discriminator = + Discriminator::new([1, 0, 0, 0, 0, 0, 0, 0]); +} + +impl BorshDeserialize for MockRewardsIntegrationInstructionData { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + match Discriminator::deserialize_reader(reader)? { + Self::INITIALIZE_INTEGRATION_DISTRIBUTION => { + let dz_epoch = BorshDeserialize::deserialize_reader(reader)?; + Ok(Self::InitializeIntegrationDistribution { dz_epoch }) + } + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid discriminator", + )), + } + } +} + +impl BorshSerialize for MockRewardsIntegrationInstructionData { + fn serialize(&self, writer: &mut W) -> io::Result<()> { + match self { + Self::InitializeIntegrationDistribution { dz_epoch } => { + Self::INITIALIZE_INTEGRATION_DISTRIBUTION.serialize(writer)?; + dz_epoch.serialize(writer) + } + } + } +} + +/// Build the instruction for creating the mock's integration distribution +/// PDA along with its 2Z bucket PDA. +pub fn initialize_integration_distribution( + payer_key: &Pubkey, + dz_epoch: DoubleZeroEpoch, +) -> Instruction { + let (integration_distribution_key, _) = find_integration_distribution_address(&ID, dz_epoch); + let (integration_bucket_key, _) = + find_integration_bucket_address(&ID, &integration_distribution_key); + + try_build_instruction( + &ID, + vec![ + AccountMeta::new(*payer_key, true), + AccountMeta::new(integration_distribution_key, false), + AccountMeta::new(integration_bucket_key, false), + AccountMeta::new_readonly(DOUBLEZERO_MINT_KEY, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + AccountMeta::new_readonly(system_program::ID, false), + ], + &MockRewardsIntegrationInstructionData::InitializeIntegrationDistribution { dz_epoch }, + ) + .unwrap() +} diff --git a/solana/mock/rewards-integration/src/lib.rs b/solana/mock/rewards-integration/src/lib.rs new file mode 100644 index 0000000000..a80a5f791e --- /dev/null +++ b/solana/mock/rewards-integration/src/lib.rs @@ -0,0 +1,8 @@ +pub mod instruction; +#[cfg(feature = "entrypoint")] +mod processor; +pub mod state; + +// + +solana_pubkey::declare_id!("mriRBpCwjydsE5ZZpXNnXnELcUhsHZTf1FqEHvUkFWe"); diff --git a/solana/mock/rewards-integration/src/processor.rs b/solana/mock/rewards-integration/src/processor.rs new file mode 100644 index 0000000000..86073560fe --- /dev/null +++ b/solana/mock/rewards-integration/src/processor.rs @@ -0,0 +1,199 @@ +use borsh::BorshDeserialize; +use doublezero_program_tools::{ + account_info::{try_next_enumerated_account, TryNextAccounts}, + recipe::{ + create_account::try_create_account, create_token_account::try_create_token_account, Invoker, + }, + zero_copy::{self, ZeroCopyAccount}, +}; +use doublezero_revenue_distribution::{ + integration::{ + find_integration_bucket_address, find_integration_distribution_address, + IntegrationInstructionData, WithdrawIntegrationRewardsHandlerAccounts, + INTEGRATION_DISTRIBUTION_SEED_PREFIX, + }, + state::TOKEN_2Z_PDA_SEED_PREFIX, + types::DoubleZeroEpoch, +}; +use solana_account_info::AccountInfo; +use solana_cpi::invoke_signed_unchecked; +use solana_msg::msg; +use solana_program_error::{ProgramError, ProgramResult}; +use solana_program_pack::Pack; +use solana_pubkey::Pubkey; +use spl_token_interface::instruction as token_instruction; + +use crate::{ + instruction::MockRewardsIntegrationInstructionData, state::MockIntegrationDistribution, ID, +}; + +solana_program_entrypoint::entrypoint!(try_process_instruction); + +fn try_process_instruction( + program_id: &Pubkey, + accounts: &[AccountInfo], + data: &[u8], +) -> ProgramResult { + if program_id != &ID { + return Err(ProgramError::IncorrectProgramId); + } + + match IntegrationInstructionData::try_from_slice(data) { + Ok(ix) => match ix { + IntegrationInstructionData::WithdrawIntegrationRewards => { + try_withdraw_integration_rewards(accounts) + } + }, + Err(_) => { + let ix = BorshDeserialize::try_from_slice(data) + .map_err(|_| ProgramError::InvalidInstructionData)?; + match ix { + MockRewardsIntegrationInstructionData::InitializeIntegrationDistribution { + dz_epoch, + } => try_initialize_integration_distribution(accounts, dz_epoch), + } + } + } +} + +fn try_initialize_integration_distribution( + accounts: &[AccountInfo], + dz_epoch: DoubleZeroEpoch, +) -> ProgramResult { + msg!("Initialize integration distribution"); + + // We expect the following accounts: + // - 0: Payer (funder for the new PDAs). + // - 1: New integration distribution PDA. + // - 2: New integration 2Z bucket PDA (owned by integration distribution). + // - 3: 2Z mint. + // - 4: SPL Token program. + // - 5: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (_, new_integration_distribution_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_key, bump_seed) = find_integration_distribution_address(&ID, dz_epoch); + if new_integration_distribution_info.key != &expected_key { + msg!("Invalid seeds for integration distribution"); + return Err(ProgramError::InvalidSeeds); + } + + try_create_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: &expected_key, + signer_seeds: &[ + INTEGRATION_DISTRIBUTION_SEED_PREFIX, + &dz_epoch.as_seed(), + &[bump_seed], + ], + }, + new_integration_distribution_info.lamports(), + zero_copy::data_end::(), + &ID, + accounts, + Default::default(), + )?; + + let (mut integration_distribution, _) = zero_copy::try_initialize::( + new_integration_distribution_info, + )?; + integration_distribution.dz_epoch = dz_epoch; + integration_distribution.bump_seed = bump_seed; + drop(integration_distribution); + + // Create the 2Z bucket PDA, owned (token authority) by the integration + // distribution we just created. The derivation matches rev-distr's own + // 2Z PDA convention so off-chain tools can derive any integration's + // bucket from its distribution key alone. + let (_, new_bucket_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (expected_bucket_key, bucket_bump) = find_integration_bucket_address(&ID, &expected_key); + if new_bucket_info.key != &expected_bucket_key { + msg!("Invalid seeds for integration bucket"); + return Err(ProgramError::InvalidSeeds); + } + + try_create_token_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: new_bucket_info.key, + signer_seeds: &[ + TOKEN_2Z_PDA_SEED_PREFIX, + expected_key.as_ref(), + &[bucket_bump], + ], + }, + &doublezero_revenue_distribution::DOUBLEZERO_MINT_KEY, + &expected_key, + new_bucket_info.lamports(), + accounts, + None, + )?; + + Ok(()) +} + +fn try_withdraw_integration_rewards(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Withdraw integration rewards"); + + let mut accounts_iter = accounts.iter().enumerate(); + + // Read the integration's local epoch from slot 0 first so we can pass it + // to the shared helper, which validates it against the parent + // `Distribution`'s `dz_epoch`. + let (integration_distribution_dz_epoch, integration_distribution_bump_seed) = { + let info = accounts.first().ok_or(ProgramError::NotEnoughAccountKeys)?; + let state = ZeroCopyAccount::::try_from_account_info( + 0, + info, + Some(&ID), + )?; + (state.dz_epoch, state.bump_seed) + }; + + let interface = WithdrawIntegrationRewardsHandlerAccounts::try_next_accounts( + &mut accounts_iter, + integration_distribution_dz_epoch, + )?; + + let (_, integration_distribution_info) = interface.integration_distribution_info; + let (_, integration_2z_bucket_info) = interface.integration_2z_bucket_info; + let (_, destination_token_account_info) = interface.destination_token_account_info; + + let bucket_amount = spl_token_interface::state::Account::unpack( + &integration_2z_bucket_info.try_borrow_data()?[..], + ) + .map_err(|_| ProgramError::InvalidAccountData)? + .amount; + + let token_transfer_ix = token_instruction::transfer( + &spl_token_interface::ID, + integration_2z_bucket_info.key, + destination_token_account_info.key, + integration_distribution_info.key, + &[], + bucket_amount, + ) + .unwrap(); + + invoke_signed_unchecked( + &token_transfer_ix, + accounts, + &[&[ + INTEGRATION_DISTRIBUTION_SEED_PREFIX, + &integration_distribution_dz_epoch.as_seed(), + &[integration_distribution_bump_seed], + ]], + )?; + + msg!( + "Integration transferred {} 2Z for DZ epoch {}", + bucket_amount, + integration_distribution_dz_epoch, + ); + + Ok(()) +} diff --git a/solana/mock/rewards-integration/src/state/integration_distribution.rs b/solana/mock/rewards-integration/src/state/integration_distribution.rs new file mode 100644 index 0000000000..3a633ed840 --- /dev/null +++ b/solana/mock/rewards-integration/src/state/integration_distribution.rs @@ -0,0 +1,24 @@ +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{ + types::{Flags, StorageGap}, + Discriminator, PrecomputedDiscriminator, +}; +use doublezero_revenue_distribution::types::DoubleZeroEpoch; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct MockIntegrationDistribution { + pub dz_epoch: DoubleZeroEpoch, + pub bump_seed: u8, + _padding: [u8; 7], + + // Reserved for future flags. + _flags: Flags, + + _storage_gap: StorageGap<4>, +} + +impl PrecomputedDiscriminator for MockIntegrationDistribution { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"mock::account::integration_distribution"); +} diff --git a/solana/mock/rewards-integration/src/state/mod.rs b/solana/mock/rewards-integration/src/state/mod.rs new file mode 100644 index 0000000000..e25c4d4878 --- /dev/null +++ b/solana/mock/rewards-integration/src/state/mod.rs @@ -0,0 +1,3 @@ +mod integration_distribution; + +pub use integration_distribution::*; diff --git a/solana/mock/swap-sol-2z/Cargo.toml b/solana/mock/swap-sol-2z/Cargo.toml new file mode 100644 index 0000000000..374ec00f34 --- /dev/null +++ b/solana/mock/swap-sol-2z/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "mock-swap-sol-2z" +publish = false + +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true +version.workspace = true + +[dependencies] +borsh = { workspace = true, features = ["derive"] } +bytemuck = { workspace = true, features = ["derive", "min_const_generics"] } +doublezero-program-tools = { workspace = true, features = ["entrypoint"] } +doublezero-revenue-distribution.workspace = true +solana-account-info.workspace = true +solana-cpi.workspace = true +solana-instruction.workspace = true +solana-msg.workspace = true +solana-program-entrypoint.workspace = true +solana-program-error.workspace = true +solana-pubkey = { workspace = true, features = ["borsh"] } +solana-system-interface.workspace = true +solana-sysvar.workspace = true +spl-token-interface.workspace = true + +[features] +default = [] +development = ["doublezero-revenue-distribution/development"] +entrypoint = [] + +[lib] +crate-type = ["cdylib", "lib"] + +[lints.rust] +unexpected_cfgs = { level = "allow", check-cfg = ['cfg(custom_heap)'] } diff --git a/solana/mock/swap-sol-2z/src/instruction.rs b/solana/mock/swap-sol-2z/src/instruction.rs new file mode 100644 index 0000000000..278f42167b --- /dev/null +++ b/solana/mock/swap-sol-2z/src/instruction.rs @@ -0,0 +1,142 @@ +use std::io; + +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_tools::{ + instruction::try_build_instruction, zero_copy, Discriminator, DISCRIMINATOR_LEN, +}; +use doublezero_revenue_distribution::instruction::account::WithdrawSolAccounts; +use solana_instruction::{AccountMeta, Instruction}; +use solana_pubkey::Pubkey; +use solana_sysvar::rent::Rent; + +use crate::{state::FillsRegistry, ID}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum MockSwapSol2zInstructionData { + InitializeFillsRegistry, + BuySol { + amount_2z_in: u64, + amount_sol_out: u64, + }, + DequeueFills(u64), +} + +impl MockSwapSol2zInstructionData { + pub const INITIALIZE_FILLS_TRACKER: Discriminator = + Discriminator::new([1, 0, 0, 0, 0, 0, 0, 0]); + pub const BUY_SOL: Discriminator = + Discriminator::new([2, 0, 0, 0, 0, 0, 0, 0]); + pub const DEQUEUE_FILLS: Discriminator = + Discriminator::new([146, 69, 6, 12, 174, 95, 136, 61]); +} + +impl BorshDeserialize for MockSwapSol2zInstructionData { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + match Discriminator::deserialize_reader(reader)? { + Self::INITIALIZE_FILLS_TRACKER => Ok(Self::InitializeFillsRegistry), + Self::BUY_SOL => { + let amount_2z_in = BorshDeserialize::deserialize_reader(reader)?; + let amount_sol_out = BorshDeserialize::deserialize_reader(reader)?; + Ok(Self::BuySol { + amount_2z_in, + amount_sol_out, + }) + } + Self::DEQUEUE_FILLS => { + BorshDeserialize::deserialize_reader(reader).map(Self::DequeueFills) + } + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid discriminator", + )), + } + } +} + +impl BorshSerialize for MockSwapSol2zInstructionData { + fn serialize(&self, writer: &mut W) -> io::Result<()> { + match self { + Self::InitializeFillsRegistry => Self::INITIALIZE_FILLS_TRACKER.serialize(writer), + Self::BuySol { + amount_2z_in, + amount_sol_out, + } => { + Self::BUY_SOL.serialize(writer)?; + amount_2z_in.serialize(writer)?; + amount_sol_out.serialize(writer) + } + Self::DequeueFills(max_sol_amount) => { + Self::DEQUEUE_FILLS.serialize(writer)?; + max_sol_amount.serialize(writer) + } + } + } +} + +pub fn create_and_initialize_fills_tracker( + payer_key: &Pubkey, + new_fills_tracker_key: &Pubkey, +) -> (Instruction, Instruction) { + let size = zero_copy::data_end::(); + let rent_exemption_lamports = Rent::default().minimum_balance(size); + + let create_account_ix = solana_system_interface::instruction::create_account( + payer_key, + new_fills_tracker_key, + rent_exemption_lamports, + size as u64, + &ID, + ); + + let initialize_fills_tracker_ix = try_build_instruction( + &ID, + vec![AccountMeta::new(*new_fills_tracker_key, false)], + &MockSwapSol2zInstructionData::InitializeFillsRegistry, + ) + .unwrap(); + + (create_account_ix, initialize_fills_tracker_ix) +} + +pub fn buy_sol( + fills_tracker_key: &Pubkey, + src_token_key: &Pubkey, + transfer_authority_key: &Pubkey, + sol_destination_key: &Pubkey, + amount_2z_in: u64, + amount_sol_out: u64, +) -> Instruction { + let WithdrawSolAccounts { + program_config_key: rd_program_config_key, + withdraw_sol_authority_key, + journal_key: rd_journal_key, + sol_destination_key, + } = WithdrawSolAccounts::new(&ID, sol_destination_key); + + let rd_swap_authority_key = + doublezero_revenue_distribution::state::find_swap_authority_address().0; + let dst_token_key = + doublezero_revenue_distribution::state::find_2z_token_pda_address(&rd_swap_authority_key).0; + + try_build_instruction( + &ID, + vec![ + AccountMeta::new(*fills_tracker_key, false), + AccountMeta::new(*src_token_key, false), + AccountMeta::new(doublezero_revenue_distribution::DOUBLEZERO_MINT_KEY, false), + AccountMeta::new(dst_token_key, false), + AccountMeta::new(*transfer_authority_key, true), + AccountMeta::new(rd_program_config_key, false), + AccountMeta::new(withdraw_sol_authority_key, false), + AccountMeta::new(rd_journal_key, false), + AccountMeta::new(sol_destination_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + AccountMeta::new_readonly(doublezero_revenue_distribution::ID, false), + ], + &MockSwapSol2zInstructionData::BuySol { + amount_2z_in, + amount_sol_out, + }, + ) + .unwrap() +} diff --git a/solana/mock/swap-sol-2z/src/lib.rs b/solana/mock/swap-sol-2z/src/lib.rs new file mode 100644 index 0000000000..f1c8ce6b23 --- /dev/null +++ b/solana/mock/swap-sol-2z/src/lib.rs @@ -0,0 +1,8 @@ +pub mod instruction; +#[cfg(feature = "entrypoint")] +mod processor; +pub mod state; + +// + +solana_pubkey::declare_id!("ms2ZZhUaXgFW6PQBHK1hxjg1fn8mZejm4zUCtQvHqU2"); diff --git a/solana/mock/swap-sol-2z/src/processor.rs b/solana/mock/swap-sol-2z/src/processor.rs new file mode 100644 index 0000000000..5304329657 --- /dev/null +++ b/solana/mock/swap-sol-2z/src/processor.rs @@ -0,0 +1,213 @@ +use borsh::BorshDeserialize; +use doublezero_program_tools::{ + account_info::{try_next_enumerated_account, NextAccountOptions, TryNextAccounts}, + instruction::try_build_instruction, + zero_copy::{self, ZeroCopyMutAccount}, +}; +use doublezero_revenue_distribution::instruction::{ + account::WithdrawSolAccounts, RevenueDistributionInstructionData, +}; +use solana_account_info::AccountInfo; +use solana_cpi::invoke_signed_unchecked; +use solana_msg::msg; +use solana_program_error::{ProgramError, ProgramResult}; +use solana_pubkey::Pubkey; +use spl_token_interface::instruction as token_instruction; + +use crate::{ + instruction::MockSwapSol2zInstructionData, + state::{Fill, FillsRegistry, FILLS_CAPACITY}, + ID, +}; + +solana_program_entrypoint::entrypoint!(try_process_instruction); + +fn try_process_instruction( + program_id: &Pubkey, + accounts: &[AccountInfo], + data: &[u8], +) -> ProgramResult { + if program_id != &ID { + return Err(ProgramError::IncorrectProgramId); + } + + let ix_data = + BorshDeserialize::try_from_slice(data).map_err(|_| ProgramError::InvalidInstructionData)?; + + match ix_data { + MockSwapSol2zInstructionData::InitializeFillsRegistry => { + try_initialize_fills_registry(accounts) + } + MockSwapSol2zInstructionData::BuySol { + amount_2z_in, + amount_sol_out, + } => try_buy_sol(accounts, amount_2z_in, amount_sol_out), + MockSwapSol2zInstructionData::DequeueFills(max_sol_amount) => { + try_dequeue_fills(accounts, max_sol_amount) + } + } +} + +fn try_initialize_fills_registry(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Initialize fills registry"); + + let mut accounts_iter = accounts.iter().enumerate(); + + let (_, new_fills_registry_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + zero_copy::try_initialize::(new_fills_registry_info)?; + + Ok(()) +} + +fn try_buy_sol(accounts: &[AccountInfo], amount_2z_in: u64, amount_sol_out: u64) -> ProgramResult { + msg!("Buy SOL"); + + let mut accounts_iter = accounts.iter().enumerate(); + + let mut fills_registry = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + if fills_registry.fills_count as usize == FILLS_CAPACITY { + msg!("Fills registry is full"); + return Err(ProgramError::InvalidAccountData); + } + + let fills_count = fills_registry.fills_count; + fills_registry.fills[fills_count as usize] = Fill { + amount_sol_in: amount_sol_out, + amount_2z_out: amount_2z_in, + }; + fills_registry.fills_count = fills_count + 1; + + let (_, src_token_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (_, mint_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (_, dst_token_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (_, transfer_authority_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Transfer 2Z to the swap destination. + let token_transfer_ix = token_instruction::transfer_checked( + &spl_token_interface::ID, + src_token_info.key, + mint_info.key, + dst_token_info.key, + transfer_authority_info.key, + &[], // signer_pubkeys + amount_2z_in, + doublezero_revenue_distribution::DOUBLEZERO_MINT_DECIMALS, + ) + .unwrap(); + + invoke_signed_unchecked(&token_transfer_ix, accounts, &[])?; + + let (_, rd_program_config_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (_, withdraw_authority_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (_, rd_journal_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (_, sol_destination_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let withdraw_sol_ix = try_build_instruction( + &doublezero_revenue_distribution::ID, + WithdrawSolAccounts { + program_config_key: *rd_program_config_info.key, + withdraw_sol_authority_key: *withdraw_authority_info.key, + journal_key: *rd_journal_info.key, + sol_destination_key: *sol_destination_info.key, + }, + &RevenueDistributionInstructionData::WithdrawSol(amount_sol_out), + ) + .unwrap(); + + let (_, withdraw_authority_bump) = + doublezero_revenue_distribution::state::find_withdraw_sol_authority_address(&ID); + + invoke_signed_unchecked( + &withdraw_sol_ix, + accounts, + &[&[ + doublezero_revenue_distribution::state::WITHDRAW_SOL_AUTHORITY_SEED_PREFIX, + &[withdraw_authority_bump], + ]], + )?; + + Ok(()) +} + +fn try_dequeue_fills(accounts: &[AccountInfo], max_sol_amount: u64) -> ProgramResult { + msg!("Dequeue fills"); + + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the configuration registry. + let (account_index, configuration_registry_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_configuration_registry_key, _) = + Pubkey::find_program_address(&[b"system_config"], &ID); + + // Enforce this account location. + if configuration_registry_info.key != &expected_configuration_registry_key { + msg!( + "Invalid address for configuration registry (account {})", + account_index + ); + return Err(ProgramError::InvalidAccountData); + } + + // Account 1 must be the program state. + let (account_index, program_state_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_program_state_key, _) = Pubkey::find_program_address(&[b"state"], &ID); + + // Enforce this account location. + if program_state_info.key != &expected_program_state_key { + msg!( + "Invalid address for program state (account {})", + account_index + ); + return Err(ProgramError::InvalidAccountData); + } + + // Account 2 must be the fills registry. + let mut fills_registry = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + if fills_registry.fills_count == 0 { + msg!("Fills registry is empty"); + return Err(ProgramError::InvalidAccountData); + } + + // Account 3 must be a signer. Enforcing this only to prove out CPI call. + try_next_enumerated_account( + &mut accounts_iter, + NextAccountOptions { + must_be_signer: true, + ..Default::default() + }, + )?; + + let head = fills_registry.head; + let fill = fills_registry.fills[head as usize]; + + if fill.amount_sol_in != max_sol_amount { + msg!("Fill amount SOL in is not equal to max SOL amount"); + return Err(ProgramError::InvalidAccountData); + } + + fills_registry.head = (head + 1) % FILLS_CAPACITY as u32; + fills_registry.fills_count -= 1; + + let mut return_data = [0; 24]; + return_data[..8].copy_from_slice(&max_sol_amount.to_le_bytes()); + return_data[8..16].copy_from_slice(&fill.amount_2z_out.to_le_bytes()); + return_data[16..24].copy_from_slice(&u64::to_le_bytes(1)); + + solana_cpi::set_return_data(&return_data); + + Ok(()) +} diff --git a/solana/mock/swap-sol-2z/src/state/fills_registry.rs b/solana/mock/swap-sol-2z/src/state/fills_registry.rs new file mode 100644 index 0000000000..14d0c3aefb --- /dev/null +++ b/solana/mock/swap-sol-2z/src/state/fills_registry.rs @@ -0,0 +1,25 @@ +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{Discriminator, PrecomputedDiscriminator}; + +pub const FILLS_CAPACITY: usize = 8; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct FillsRegistry { + pub fills_count: u32, + pub head: u32, + + pub fills: [Fill; FILLS_CAPACITY], +} + +impl PrecomputedDiscriminator for FillsRegistry { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"mock::account::fills_registry"); +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct Fill { + pub amount_sol_in: u64, + pub amount_2z_out: u64, +} diff --git a/solana/mock/swap-sol-2z/src/state/mod.rs b/solana/mock/swap-sol-2z/src/state/mod.rs new file mode 100644 index 0000000000..3182cd4c3e --- /dev/null +++ b/solana/mock/swap-sol-2z/src/state/mod.rs @@ -0,0 +1,3 @@ +mod fills_registry; + +pub use fills_registry::*; diff --git a/solana/programs/passport/CHANGELOG.md b/solana/programs/passport/CHANGELOG.md new file mode 100644 index 0000000000..370f58a52e --- /dev/null +++ b/solana/programs/passport/CHANGELOG.md @@ -0,0 +1,57 @@ +# Changelog + +## Unreleased + +- update dependencies ([#92]) +- update Solana crates to v3 ([#94]) +- uptick version to 0.2.0 ([#95]) + +## [v0.1.1] + +- add solana validator with backup ids mode ([#64]) +- separate versions for programs ([#66]) +- add more offchain methods ([#68]) +- disallow empty backup IDs list ([#71]) +- fix `try_initialize` ([#81]) + +## [v0.1.0] + +- add doublezero-passport program scaffolding ([#4]) +- clean up rust deps ([#7]) +- access flow instructions and basic testing ([#16]) +- unhappy tests ([#20]) +- uptick msrv to 1.84 and solana version 2.3.7 ([#32]) +- mirror revenue dist programs processor helpers in passport ([#41]) +- change validator passport signature message to string ([#44]) +- onchain clean up ([#52]) +- check for correct rent beneficiary ([#58]) +- add fee to access request account ([#59]) +- require deposit != 0 ([#60]) +- add pause to everything ([#61]) +- disallow cpi with instructions requiring sentinel observation ([#62]) +- cache access mode ([#63]) + +[#4]: https://github.com/doublezerofoundation/doublezero-solana/pull/4 +[#7]: https://github.com/doublezerofoundation/doublezero-solana/pull/7 +[#16]: https://github.com/doublezerofoundation/doublezero-solana/pull/16 +[#20]: https://github.com/doublezerofoundation/doublezero-solana/pull/20 +[#32]: https://github.com/doublezerofoundation/doublezero-solana/pull/32 +[#41]: https://github.com/doublezerofoundation/doublezero-solana/pull/41 +[#44]: https://github.com/doublezerofoundation/doublezero-solana/pull/44 +[#52]: https://github.com/doublezerofoundation/doublezero-solana/pull/52 +[#58]: https://github.com/doublezerofoundation/doublezero-solana/pull/58 +[#59]: https://github.com/doublezerofoundation/doublezero-solana/pull/59 +[#60]: https://github.com/doublezerofoundation/doublezero-solana/pull/60 +[#61]: https://github.com/doublezerofoundation/doublezero-solana/pull/61 +[#62]: https://github.com/doublezerofoundation/doublezero-solana/pull/62 +[#63]: https://github.com/doublezerofoundation/doublezero-solana/pull/63 +[#64]: https://github.com/doublezerofoundation/doublezero-solana/pull/64 +[#66]: https://github.com/doublezerofoundation/doublezero-solana/pull/66 +[#68]: https://github.com/doublezerofoundation/doublezero-solana/pull/68 +[#71]: https://github.com/doublezerofoundation/doublezero-solana/pull/71 +[#81]: https://github.com/doublezerofoundation/doublezero-solana/pull/81 +[#92]: https://github.com/doublezerofoundation/doublezero-solana/pull/92 +[#94]: https://github.com/doublezerofoundation/doublezero-solana/pull/94 +[#95]: https://github.com/doublezerofoundation/doublezero-solana/pull/95 +[v0.1.0]: https://github.com/doublezerofoundation/doublezero-solana/tree/passport/v0.1.0 +[v0.1.1]: https://github.com/doublezerofoundation/doublezero-solana/tree/passport/v0.1.1 diff --git a/solana/programs/passport/Cargo.toml b/solana/programs/passport/Cargo.toml new file mode 100644 index 0000000000..c9de1a3c97 --- /dev/null +++ b/solana/programs/passport/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "doublezero-passport" +version = "0.2.0" + +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true + +[dependencies] +borsh = { workspace = true, features = ["derive"] } +bytemuck = { workspace = true, features = ["derive", "min_const_generics"] } +doublezero-program-tools = { workspace = true, features = ["entrypoint"] } +itertools.workspace = true +solana-account-info.workspace = true +solana-instruction = { workspace = true, features = ["syscalls"] } +solana-msg.workspace = true +solana-program-entrypoint.workspace = true +solana-program-error.workspace = true +solana-pubkey = { workspace = true, features = ["borsh", "bytemuck"] } +solana-system-interface.workspace = true +solana-sysvar.workspace = true + +[dev-dependencies] +base64.workspace = true +bincode.workspace = true +ctor.workspace = true +env_logger.workspace = true +log.workspace = true +solana-loader-v3-interface.workspace = true +solana-program-test.workspace = true +solana-sdk.workspace = true + +[features] +default = [] +### Build with this feature for Solana devnet and localnet. +development = [] +entrypoint = [] +offchain = [] + +[lib] +crate-type = ["cdylib", "lib"] + +[lints.rust] +unexpected_cfgs = { level = "allow", check-cfg = ['cfg(custom_heap)'] } diff --git a/solana/programs/passport/src/instruction/account.rs b/solana/programs/passport/src/instruction/account.rs new file mode 100644 index 0000000000..150f67c959 --- /dev/null +++ b/solana/programs/passport/src/instruction/account.rs @@ -0,0 +1,207 @@ +use doublezero_program_tools::get_program_data_address; +use solana_instruction::AccountMeta; +use solana_pubkey::Pubkey; + +use crate::state::{AccessRequest, ProgramConfig}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeProgramAccounts { + pub payer_key: Pubkey, + pub new_program_config_key: Pubkey, +} + +impl InitializeProgramAccounts { + pub fn new(payer_key: &Pubkey) -> Self { + let new_program_config_key = ProgramConfig::find_address().0; + + Self { + payer_key: *payer_key, + new_program_config_key, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeProgramAccounts) -> Self { + let InitializeProgramAccounts { + payer_key, + new_program_config_key, + } = accounts; + + vec![ + AccountMeta::new(payer_key, true), + AccountMeta::new(new_program_config_key, false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SetAdminAccounts { + pub program_data_key: Pubkey, + pub owner_key: Pubkey, + pub program_config_key: Pubkey, +} + +impl SetAdminAccounts { + pub fn new(program_id: &Pubkey, owner_key: &Pubkey) -> Self { + Self { + program_data_key: get_program_data_address(program_id).0, + owner_key: *owner_key, + program_config_key: ProgramConfig::find_address().0, + } + } +} + +impl From for Vec { + fn from(accounts: SetAdminAccounts) -> Self { + let SetAdminAccounts { + program_data_key, + owner_key, + program_config_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_data_key, false), + AccountMeta::new_readonly(owner_key, true), + AccountMeta::new(program_config_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ConfigureProgramAccounts { + pub program_config_key: Pubkey, + pub admin_key: Pubkey, +} + +impl ConfigureProgramAccounts { + pub fn new(admin_key: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + admin_key: *admin_key, + } + } +} + +impl From for Vec { + fn from(accounts: ConfigureProgramAccounts) -> Self { + let ConfigureProgramAccounts { + program_config_key, + admin_key, + } = accounts; + + vec![ + AccountMeta::new(program_config_key, false), + AccountMeta::new_readonly(admin_key, true), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RequestAccessAccounts { + pub program_config_key: Pubkey, + pub payer_key: Pubkey, + pub new_access_request_key: Pubkey, +} + +impl RequestAccessAccounts { + pub fn new(payer_key: &Pubkey, service_key: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + payer_key: *payer_key, + new_access_request_key: AccessRequest::find_address(service_key).0, + } + } +} + +impl From for Vec { + fn from(accounts: RequestAccessAccounts) -> Self { + let RequestAccessAccounts { + program_config_key, + payer_key, + new_access_request_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(payer_key, true), + AccountMeta::new(new_access_request_key, false), + AccountMeta::new_readonly(solana_system_interface::program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct GrantAccessAccounts { + pub program_config_key: Pubkey, + pub dz_ledger_sentinel_key: Pubkey, + pub access_request_key: Pubkey, + pub rent_beneficiary_key: Pubkey, +} + +impl GrantAccessAccounts { + pub fn new( + dz_ledger_sentinel_key: &Pubkey, + access_request_key: &Pubkey, + rent_beneficiary_key: &Pubkey, + ) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + dz_ledger_sentinel_key: *dz_ledger_sentinel_key, + access_request_key: *access_request_key, + rent_beneficiary_key: *rent_beneficiary_key, + } + } +} + +impl From for Vec { + fn from(accounts: GrantAccessAccounts) -> Self { + let GrantAccessAccounts { + program_config_key, + dz_ledger_sentinel_key, + access_request_key, + rent_beneficiary_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(dz_ledger_sentinel_key, true), + AccountMeta::new(access_request_key, false), + AccountMeta::new(rent_beneficiary_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct DenyAccessAccounts { + pub program_config_key: Pubkey, + pub dz_ledger_sentinel_key: Pubkey, + pub access_request_key: Pubkey, +} + +impl DenyAccessAccounts { + pub fn new(dz_ledger_sentinel_key: &Pubkey, access_request_key: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + dz_ledger_sentinel_key: *dz_ledger_sentinel_key, + access_request_key: *access_request_key, + } + } +} + +impl From for Vec { + fn from(accounts: DenyAccessAccounts) -> Self { + let DenyAccessAccounts { + program_config_key, + dz_ledger_sentinel_key, + access_request_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(dz_ledger_sentinel_key, true), + AccountMeta::new(access_request_key, false), + ] + } +} diff --git a/solana/programs/passport/src/instruction/mod.rs b/solana/programs/passport/src/instruction/mod.rs new file mode 100644 index 0000000000..1e58dc9cab --- /dev/null +++ b/solana/programs/passport/src/instruction/mod.rs @@ -0,0 +1,120 @@ +pub mod account; + +// + +use std::io; + +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_tools::{Discriminator, DISCRIMINATOR_LEN}; +use solana_pubkey::Pubkey; + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)] +pub enum ProgramConfiguration { + Flag(ProgramFlagConfiguration), + DoubleZeroLedgerSentinel(Pubkey), + AccessRequestDeposit { + request_deposit_lamports: u64, + request_fee_lamports: u64, + }, + SolanaValidatorBackupIdsLimit(u16), +} + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)] +pub enum ProgramFlagConfiguration { + IsPaused(bool), + IsRequestAccessPaused(bool), +} + +#[derive(Debug, BorshSerialize, BorshDeserialize, Clone, Copy, PartialEq, Eq)] +pub struct SolanaValidatorAttestation { + pub validator_id: Pubkey, + pub service_key: Pubkey, + pub ed25519_signature: [u8; 64], +} + +#[derive(Debug, BorshSerialize, BorshDeserialize, Clone, PartialEq, Eq)] +pub enum AccessMode { + SolanaValidator(SolanaValidatorAttestation), + SolanaValidatorWithBackupIds { + attestation: SolanaValidatorAttestation, + backup_ids: Vec, + }, +} + +impl AccessMode { + #[cfg(feature = "offchain")] + pub fn service_key(&self) -> Pubkey { + match self { + Self::SolanaValidator(attestation) => attestation.service_key, + Self::SolanaValidatorWithBackupIds { attestation, .. } => attestation.service_key, + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum PassportInstructionData { + InitializeProgram, + SetAdmin(Pubkey), + ConfigureProgram(ProgramConfiguration), + RequestAccess(AccessMode), + GrantAccess, + DenyAccess, +} + +impl PassportInstructionData { + pub const INITIALIZE_PROGRAM: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_program"); + pub const SET_ADMIN: Discriminator = + Discriminator::new_sha2(b"dz::ix::set_admin"); + pub const CONFIGURE_PROGRAM: Discriminator = + Discriminator::new_sha2(b"dz::ix::configure_program"); + pub const REQUEST_ACCESS: Discriminator = + Discriminator::new_sha2(b"dz::ix::request_access"); + pub const GRANT_ACCESS: Discriminator = + Discriminator::new_sha2(b"dz::ix::grant_access"); + pub const DENY_ACCESS: Discriminator = + Discriminator::new_sha2(b"dz::ix::deny_access"); +} + +impl BorshDeserialize for PassportInstructionData { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + match Discriminator::deserialize_reader(reader)? { + Self::INITIALIZE_PROGRAM => Ok(Self::InitializeProgram), + Self::SET_ADMIN => BorshDeserialize::deserialize_reader(reader).map(Self::SetAdmin), + Self::CONFIGURE_PROGRAM => { + BorshDeserialize::deserialize_reader(reader).map(Self::ConfigureProgram) + } + Self::REQUEST_ACCESS => { + BorshDeserialize::deserialize_reader(reader).map(Self::RequestAccess) + } + Self::GRANT_ACCESS => Ok(Self::GrantAccess), + Self::DENY_ACCESS => Ok(Self::DenyAccess), + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid discriminator", + )), + } + } +} + +impl BorshSerialize for PassportInstructionData { + fn serialize(&self, writer: &mut W) -> io::Result<()> { + match self { + Self::InitializeProgram => Self::INITIALIZE_PROGRAM.serialize(writer), + Self::SetAdmin(key) => { + Self::SET_ADMIN.serialize(writer)?; + key.serialize(writer) + } + Self::ConfigureProgram(setting) => { + Self::CONFIGURE_PROGRAM.serialize(writer)?; + setting.serialize(writer) + } + Self::RequestAccess(access_mode) => { + Self::REQUEST_ACCESS.serialize(writer)?; + access_mode.serialize(writer) + } + Self::GrantAccess => Self::GRANT_ACCESS.serialize(writer), + Self::DenyAccess => Self::DENY_ACCESS.serialize(writer), + } + } +} diff --git a/solana/programs/passport/src/lib.rs b/solana/programs/passport/src/lib.rs new file mode 100644 index 0000000000..97abdfe3dd --- /dev/null +++ b/solana/programs/passport/src/lib.rs @@ -0,0 +1,8 @@ +pub mod instruction; +#[cfg(feature = "entrypoint")] +mod processor; +pub mod state; + +// + +solana_pubkey::declare_id!("dzpt2dM8g9qsLxpdddnVvKfjkCLVXd82jrrQVJigCPV"); diff --git a/solana/programs/passport/src/processor.rs b/solana/programs/passport/src/processor.rs new file mode 100644 index 0000000000..c20ec501da --- /dev/null +++ b/solana/programs/passport/src/processor.rs @@ -0,0 +1,524 @@ +use borsh::BorshDeserialize; +use doublezero_program_tools::{ + account_info::{ + try_next_enumerated_account, EnumeratedAccountInfoIter, NextAccountOptions, + TryNextAccounts, UpgradeAuthority, + }, + recipe::{ + create_account::{try_create_account, CreateAccountOptions}, + Invoker, + }, + zero_copy::{self, ZeroCopyAccount, ZeroCopyMutAccount}, +}; +use solana_account_info::AccountInfo; +use solana_instruction::{syscalls::get_stack_height, TRANSACTION_LEVEL_STACK_HEIGHT}; +use solana_msg::msg; +use solana_program_error::{ProgramError, ProgramResult}; +use solana_pubkey::Pubkey; + +use crate::{ + instruction::{ + AccessMode, PassportInstructionData, ProgramConfiguration, ProgramFlagConfiguration, + }, + state::{AccessRequest, ProgramConfig}, + ID, +}; + +solana_program_entrypoint::entrypoint!(try_process_instruction); + +fn try_process_instruction( + program_id: &Pubkey, + accounts: &[AccountInfo], + data: &[u8], +) -> ProgramResult { + if program_id != &ID { + return Err(ProgramError::IncorrectProgramId); + } + + // NOTE: Instruction data that happens to deserialize to any of the enum + // variants and has trailing data constitutes invalid instruction data. + let ix_data = + BorshDeserialize::try_from_slice(data).map_err(|_| ProgramError::InvalidInstructionData)?; + + match ix_data { + PassportInstructionData::InitializeProgram => try_initialize_program(accounts), + PassportInstructionData::SetAdmin(admin_key) => try_set_admin(accounts, admin_key), + PassportInstructionData::ConfigureProgram(setting) => { + try_configure_program(accounts, setting) + } + PassportInstructionData::RequestAccess(access_mode) => { + try_request_access(accounts, access_mode) + } + PassportInstructionData::GrantAccess => try_grant_access(accounts), + PassportInstructionData::DenyAccess => try_deny_access(accounts), + } +} + +fn try_initialize_program(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Initialize program"); + + // We expect the following accounts for this instruction: + // - 0: Payer (funder for new accounts). + // - 1: New program config. + // - 5: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be a signer and writable (i.e., payer) because it will be + // sending lamports to the new config account when the system program + // allocates data to it. But because the create-program instruction requires + // that this account is a signer and is writable, we do not need to + // explicitly check these fields in its account info. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Account 1 must be the new program config account. This account should + // not exist yet. + let (account_index, new_program_config_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_program_config_key, program_config_bump) = ProgramConfig::find_address(); + + // Enforce this account location. + if new_program_config_info.key != &expected_program_config_key { + msg!( + "Invalid seeds for program config (account {})", + account_index + ); + return Err(ProgramError::InvalidSeeds); + } + + try_create_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: &expected_program_config_key, + signer_seeds: &[ProgramConfig::SEED_PREFIX, &[program_config_bump]], + }, + new_program_config_info.lamports(), + zero_copy::data_end::(), + &ID, + accounts, + Default::default(), + )?; + + // Establish the discriminator. Set other fields using the configure program + // instruction. + zero_copy::try_initialize::(new_program_config_info)?; + + Ok(()) +} + +fn try_set_admin(accounts: &[AccountInfo], admin_key: Pubkey) -> ProgramResult { + msg!("Set admin"); + + // We expect the following accounts for this instruction: + // - 0: This program's program data account (BPF Loader Upgradeable + // program). + // - 1: The program's owner (i.e., upgrade authority). + // - 2: Program config. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program data belonging to this program. + // Account 1 must be the owner of the program data (i.e., the upgrade + // authority). + UpgradeAuthority::try_next_accounts(&mut accounts_iter, &ID)?; + + // Account 2 must be the program config account. + let mut program_config = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + msg!("admin_key: {}", admin_key); + program_config.admin_key = admin_key; + + Ok(()) +} + +fn try_configure_program(accounts: &[AccountInfo], setting: ProgramConfiguration) -> ProgramResult { + msg!("Configure program"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Admin. + let mut accounts_iter = accounts.iter().enumerate(); + + let authorized_use = + VerifiedProgramAuthorityMut::try_next_accounts(&mut accounts_iter, Authority::Admin)?; + let mut program_config = authorized_use.program_config; + + match setting { + ProgramConfiguration::Flag(configure_flag) => { + msg!("Set flag"); + match configure_flag { + ProgramFlagConfiguration::IsPaused(should_pause) => { + msg!("is_paused: {}", should_pause); + program_config.set_is_paused(should_pause); + } + ProgramFlagConfiguration::IsRequestAccessPaused(should_pause) => { + msg!("is_request_access_paused: {}", should_pause); + program_config.set_is_request_access_paused(should_pause); + } + }; + } + ProgramConfiguration::DoubleZeroLedgerSentinel(sentinel_key) => { + msg!("Set sentinel_key: {}", sentinel_key); + program_config.sentinel_key = sentinel_key; + } + ProgramConfiguration::AccessRequestDeposit { + request_deposit_lamports: deposit_lamports, + request_fee_lamports: fee_lamports, + } => { + if deposit_lamports == 0 { + msg!("Deposit lamports must not be zero"); + return Err(ProgramError::InvalidInstructionData); + } else if fee_lamports >= deposit_lamports { + msg!("Request fee must be less than the deposit"); + return Err(ProgramError::InvalidInstructionData); + } + + msg!("Set access_request_deposit_parameters"); + msg!(" request_deposit_lamports: {}", deposit_lamports); + program_config.request_deposit_lamports = deposit_lamports; + + msg!(" request_fee_lamports: {}", fee_lamports); + program_config.request_fee_lamports = fee_lamports; + } + ProgramConfiguration::SolanaValidatorBackupIdsLimit(limit) => { + if limit == 0 { + msg!("Solana validator backup IDs limit must not be zero"); + return Err(ProgramError::InvalidInstructionData); + } + + msg!("Set solana_validator_backup_ids_limit: {}", limit); + program_config.solana_validator_backup_ids_limit = limit; + } + } + + Ok(()) +} + +fn try_request_access(accounts: &[AccountInfo], access_mode: AccessMode) -> ProgramResult { + msg!("Request access"); + + if get_stack_height() != TRANSACTION_LEVEL_STACK_HEIGHT { + msg!("Cannot CPI request access"); + return Err(ProgramError::InvalidInstructionData); + } + + // Instruction accounts are expected in the following order: + // - 0: Program config + // - 1: Payer (funder and rent beneficiary) + // - 2: New access request account + // - 3: System program + + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let program_config = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Make sure program is not paused globally. + program_config.try_require_unpaused()?; + + // Make sure request access is not paused. + if program_config.is_request_access_paused() { + msg!("Request access is paused"); + return Err(ProgramError::InvalidAccountData); + } + + let service_key = match &access_mode { + AccessMode::SolanaValidator(attestation) => { + msg!("Solana validator"); + + attestation.service_key + } + AccessMode::SolanaValidatorWithBackupIds { + attestation, + backup_ids, + } => { + msg!("Solana validator with backup IDs"); + + if backup_ids.is_empty() { + msg!("Must provide at least one backup ID"); + return Err(ProgramError::InvalidInstructionData); + } + + if backup_ids.len() > program_config.solana_validator_backup_ids_limit as usize { + msg!( + "Cannot exceed backup IDs limit {}", + program_config.solana_validator_backup_ids_limit + ); + return Err(ProgramError::InvalidInstructionData); + } + + attestation.service_key + } + }; + + if service_key == Pubkey::default() { + msg!("User service key cannot be zero address"); + return Err(ProgramError::InvalidInstructionData); + } + + let additional_lamports = program_config + .checked_request_deposit_lamports() + .ok_or_else(|| { + msg!("Request deposit lamports not configured"); + ProgramError::InvalidAccountData + })?; + + // Account 1 must be the payer. The system program will automatically ensure + // this account is a signer and writable in order to transfer the lamports + // to create the new account. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Account 2 must be the new access request account. + let (account_index, new_access_request_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_access_request_key, access_request_bump) = + AccessRequest::find_address(&service_key); + + // Enforce the account location and seed validity. + if new_access_request_info.key != &expected_access_request_key { + msg!( + "Invalid seeds for access request (account {})", + account_index + ); + return Err(ProgramError::InvalidSeeds); + } + + try_create_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: &expected_access_request_key, + signer_seeds: &[ + AccessRequest::SEED_PREFIX, + service_key.as_ref(), + &[access_request_bump], + ], + }, + new_access_request_info.lamports(), + zero_copy::data_end::(), + &ID, + accounts, + CreateAccountOptions { + rent_sysvar: None, + additional_lamports: Some(additional_lamports), + }, + )?; + + // Finalize the access request with the user service and beneficiary keys. + let (mut access_request, _) = + zero_copy::try_initialize::(new_access_request_info)?; + access_request.service_key = service_key; + access_request.rent_beneficiary_key = *payer_info.key; + access_request.request_fee_lamports = program_config.request_fee_lamports; + + // Copy the access mode into the access request. + borsh::to_writer(access_request.encoded_access_mode.as_mut(), &access_mode).map_err(|_| { + msg!("Failed to serialize access mode"); + ProgramError::InvalidAccountData + })?; + + // The sentinel service uses this log statement to filter transaction logs + // to successfully submitted access requests when subscribing to program + // logs. + msg!("Initialized user access request {}", service_key); + + Ok(()) +} + +fn try_grant_access(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Grant access request"); + + // Instruction accounts are expected in the following order: + // - 0: Program Config + // - 1: DZ Ledger Sentinel + // - 2: New access request account + // - 3: Rent beneficiary (original payer) + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + // Account 1 must be the DoubleZero Ledger sentinel. + // + // This call ensures that the DoubleZero Ledger sentinel is a signer and is + // the same sentinel encoded in the program config. + let authorized_use = + VerifiedProgramAuthority::try_next_accounts(&mut accounts_iter, Authority::Sentinel)?; + + // Make sure program is not paused globally. + authorized_use.program_config.try_require_unpaused()?; + + // Account 2 must be the new access request account. + let access_request = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + let (_, sentinel_info) = authorized_use.authority; + + let request_fee = access_request.request_fee_lamports; + let mut access_request_lamports = access_request.info.try_borrow_mut_lamports()?; + let request_refund = access_request_lamports.saturating_sub(request_fee); + + **sentinel_info.lamports.borrow_mut() += request_fee; + + // Account 3 must be the rent beneficiary. + let (_, rent_beneficiary_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Cannot use another account as rent beneficiary. + if rent_beneficiary_info.key != &access_request.rent_beneficiary_key { + msg!( + "Expected rent beneficiary key: {}", + access_request.rent_beneficiary_key + ); + return Err(ProgramError::InvalidAccountData); + } + + **rent_beneficiary_info.lamports.borrow_mut() += request_refund; + + // Zero out the access request lamports to close the account. + **access_request_lamports = 0; + + msg!("Grant {} access", access_request.service_key); + msg!( + "Return {} lamports to {}", + request_refund, + rent_beneficiary_info.key, + ); + + Ok(()) +} + +fn try_deny_access(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Deny access request"); + + // Instruction accounts are expected in the following order: + // - 0: Program Config + // - 1: DZ Ledger Sentinel + // - 2: New access request account + let mut accounts_iter = accounts.iter().enumerate(); + + let authorized_use = + VerifiedProgramAuthority::try_next_accounts(&mut accounts_iter, Authority::Sentinel)?; + + // Make sure program is not paused globally. + authorized_use.program_config.try_require_unpaused()?; + + let access_request = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + let (_, sentinel_info) = authorized_use.authority; + + let mut access_request_lamports = access_request.info.try_borrow_mut_lamports()?; + let forfeit_deposit = **access_request_lamports; + + **sentinel_info.lamports.borrow_mut() += forfeit_deposit; + **access_request_lamports = 0; + + msg!("Deny {} access", access_request.service_key); + msg!("Requestor forfeit {} lamports", forfeit_deposit); + + Ok(()) +} + +// +// Account info handling. +// + +enum Authority { + Admin, + Sentinel, +} + +impl Authority { + fn try_next_as_authorized_account<'b, 'c>( + &self, + accounts_iter: &mut EnumeratedAccountInfoIter<'b, 'c>, + program_config: &ProgramConfig, + ) -> Result<(usize, &'b AccountInfo<'c>), ProgramError> { + let (index, authority_info) = try_next_enumerated_account( + accounts_iter, + NextAccountOptions { + must_be_signer: true, + ..Default::default() + }, + )?; + + match self { + Authority::Admin => { + if authority_info.key != &program_config.admin_key { + msg!("Unauthorized admin (account {})", index); + return Err(ProgramError::InvalidAccountData); + } + } + Authority::Sentinel => { + if authority_info.key != &program_config.sentinel_key { + msg!("Unauthorized sentinel (account {})", index); + return Err(ProgramError::InvalidAccountData); + } + } + } + + Ok((index, authority_info)) + } +} + +struct VerifiedProgramAuthority<'a, 'b> { + program_config: ZeroCopyAccount<'a, 'b, ProgramConfig>, + authority: (usize, &'a AccountInfo<'b>), +} + +impl<'a, 'b> TryNextAccounts<'a, 'b, Authority> for VerifiedProgramAuthority<'a, 'b> { + #[inline(always)] + fn try_next_accounts( + accounts_iter: &mut EnumeratedAccountInfoIter<'a, 'b>, + authority: Authority, + ) -> Result { + // Index == 0. + let program_config = ZeroCopyAccount::try_next_accounts(accounts_iter, Some(&ID))?; + + // Index == 1. + let (index, authority_info) = + authority.try_next_as_authorized_account(accounts_iter, &program_config.data)?; + + Ok(Self { + program_config, + authority: (index, authority_info), + }) + } +} + +struct VerifiedProgramAuthorityMut<'a, 'b> { + program_config: ZeroCopyMutAccount<'a, 'b, ProgramConfig>, + _authority: (usize, &'a AccountInfo<'b>), +} + +impl<'a, 'b> TryNextAccounts<'a, 'b, Authority> for VerifiedProgramAuthorityMut<'a, 'b> { + #[inline(always)] + fn try_next_accounts( + accounts_iter: &mut EnumeratedAccountInfoIter<'a, 'b>, + authority: Authority, + ) -> Result { + // Index == 0. + let program_config = ZeroCopyMutAccount::try_next_accounts(accounts_iter, Some(&ID))?; + + // Index == 1. + let (index, authority_info) = + authority.try_next_as_authorized_account(accounts_iter, &program_config.data)?; + + Ok(Self { + program_config, + _authority: (index, authority_info), + }) + } +} + +impl ProgramConfig { + #[inline(always)] + fn try_require_unpaused(&self) -> ProgramResult { + if self.is_paused() { + msg!("Program is paused"); + return Err(ProgramError::InvalidAccountData); + } + + Ok(()) + } +} diff --git a/solana/programs/passport/src/state/access_request.rs b/solana/programs/passport/src/state/access_request.rs new file mode 100644 index 0000000000..cac4e50d63 --- /dev/null +++ b/solana/programs/passport/src/state/access_request.rs @@ -0,0 +1,135 @@ +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{Discriminator, PrecomputedDiscriminator}; +#[cfg(feature = "offchain")] +use itertools::Itertools; +use solana_pubkey::Pubkey; + +#[cfg(feature = "offchain")] +use crate::instruction::AccessMode; + +pub const REQUEST_ACCESS_MAX_DATA_SIZE: usize = 4_096; + +#[derive(Debug, Clone, Copy, PartialEq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct AccessRequest { + pub service_key: Pubkey, + pub rent_beneficiary_key: Pubkey, + + pub request_fee_lamports: u64, + + /// Borsh-serialized access mode. + pub encoded_access_mode: [u8; REQUEST_ACCESS_MAX_DATA_SIZE], +} + +impl Default for AccessRequest { + fn default() -> Self { + Self { + service_key: Default::default(), + rent_beneficiary_key: Default::default(), + request_fee_lamports: Default::default(), + encoded_access_mode: [Default::default(); REQUEST_ACCESS_MAX_DATA_SIZE], + } + } +} + +impl PrecomputedDiscriminator for AccessRequest { + const DISCRIMINATOR: Discriminator<8> = Discriminator::new_sha2(b"dz::account::access_request"); +} + +impl AccessRequest { + pub const SEED_PREFIX: &'static [u8] = b"access_request"; + + pub fn find_address(service_key: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX, service_key.as_ref()], &crate::ID) + } + + #[cfg(feature = "offchain")] + pub fn access_request_message(access_mode: &AccessMode) -> String { + match access_mode { + AccessMode::SolanaValidator(attestation) => { + format!("service_key={}", attestation.service_key) + } + AccessMode::SolanaValidatorWithBackupIds { + attestation, + backup_ids, + } => { + format!( + "service_key={},backup_ids={}", + attestation.service_key, + backup_ids.iter().join(",") + ) + } + } + } + + #[cfg(feature = "offchain")] + pub fn checked_access_mode(&self) -> Option { + borsh::BorshDeserialize::deserialize(&mut &self.encoded_access_mode[..]).ok() + } +} + +const _: () = assert!( + size_of::() == 4_168, + "`AccessRequest` size changed" +); + +#[allow(unused_imports)] +#[cfg(test)] +mod tests { + use borsh::BorshSerialize; + use solana_sdk::signature::Signature; + + use crate::instruction::SolanaValidatorAttestation; + + use super::*; + + #[cfg(feature = "offchain")] + #[test] + fn test_checked_access_mode() { + let access_mode = AccessMode::SolanaValidator(SolanaValidatorAttestation { + validator_id: Pubkey::new_unique(), + service_key: Pubkey::new_unique(), + ed25519_signature: Signature::new_unique().into(), + }); + + let mut encoded_access_mode = [0; REQUEST_ACCESS_MAX_DATA_SIZE]; + access_mode + .serialize(&mut encoded_access_mode.as_mut()) + .unwrap(); + + let access_request = AccessRequest { + encoded_access_mode, + ..Default::default() + }; + assert_eq!(access_request.checked_access_mode().unwrap(), access_mode); + + let access_mode = AccessMode::SolanaValidatorWithBackupIds { + attestation: SolanaValidatorAttestation { + validator_id: Pubkey::new_unique(), + service_key: Pubkey::new_unique(), + ed25519_signature: Signature::new_unique().into(), + }, + backup_ids: vec![ + Pubkey::new_unique(), + Pubkey::new_unique(), + Pubkey::new_unique(), + Pubkey::new_unique(), + Pubkey::new_unique(), + Pubkey::new_unique(), + Pubkey::new_unique(), + Pubkey::new_unique(), + ], + }; + + let mut encoded_access_mode = [0; REQUEST_ACCESS_MAX_DATA_SIZE]; + access_mode + .serialize(&mut encoded_access_mode.as_mut()) + .unwrap(); + + let access_request = AccessRequest { + encoded_access_mode, + ..Default::default() + }; + assert_eq!(access_request.checked_access_mode().unwrap(), access_mode); + } +} diff --git a/solana/programs/passport/src/state/mod.rs b/solana/programs/passport/src/state/mod.rs new file mode 100644 index 0000000000..0bc302e06b --- /dev/null +++ b/solana/programs/passport/src/state/mod.rs @@ -0,0 +1,5 @@ +mod access_request; +mod program_config; + +pub use access_request::*; +pub use program_config::*; diff --git a/solana/programs/passport/src/state/program_config.rs b/solana/programs/passport/src/state/program_config.rs new file mode 100644 index 0000000000..65879121d8 --- /dev/null +++ b/solana/programs/passport/src/state/program_config.rs @@ -0,0 +1,73 @@ +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{ + types::{Flags, StorageGap}, + Discriminator, PrecomputedDiscriminator, +}; +use solana_pubkey::Pubkey; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct ProgramConfig { + pub flags: Flags, + + pub admin_key: Pubkey, + + /// Authority that grants or denies access to the DoubleZero Ledger network. + pub sentinel_key: Pubkey, + + pub request_deposit_lamports: u64, + pub request_fee_lamports: u64, + + pub solana_validator_backup_ids_limit: u16, + _padding: [u8; 30], + + /// 7 * 32 bytes of a storage gap in case more fields need to be added. + _storage_gap: StorageGap<7>, +} + +impl PrecomputedDiscriminator for ProgramConfig { + const DISCRIMINATOR: Discriminator<8> = Discriminator::new_sha2(b"dz::account::program_config"); +} + +impl ProgramConfig { + pub const SEED_PREFIX: &'static [u8] = b"program_config"; + + pub const FLAG_IS_PAUSED_BIT: usize = 0; + pub const FLAG_IS_REQUEST_ACCESS_PAUSED_BIT: usize = 1; + + pub fn find_address() -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX], &crate::ID) + } + + pub fn is_paused(&self) -> bool { + self.flags.bit(Self::FLAG_IS_PAUSED_BIT) + } + + pub fn set_is_paused(&mut self, should_pause: bool) { + self.flags.set_bit(Self::FLAG_IS_PAUSED_BIT, should_pause); + } + + pub fn is_request_access_paused(&self) -> bool { + self.flags.bit(Self::FLAG_IS_REQUEST_ACCESS_PAUSED_BIT) + } + + pub fn set_is_request_access_paused(&mut self, should_pause: bool) { + self.flags + .set_bit(Self::FLAG_IS_REQUEST_ACCESS_PAUSED_BIT, should_pause); + } + + pub fn checked_request_deposit_lamports(&self) -> Option { + let lamports = self.request_deposit_lamports; + + if lamports == 0 { + None + } else { + Some(lamports) + } + } +} + +const _: () = assert!( + size_of::() == 344, + "`ProgramConfig` size changed" +); diff --git a/solana/programs/passport/tests/common/mod.rs b/solana/programs/passport/tests/common/mod.rs new file mode 100644 index 0000000000..b270febcf3 --- /dev/null +++ b/solana/programs/passport/tests/common/mod.rs @@ -0,0 +1,420 @@ +#![allow(dead_code)] + +#[ctor::ctor] +fn init_logger() { + static ONCE: std::sync::Once = std::sync::Once::new(); + ONCE.call_once(|| { + let mut builder = env_logger::builder(); + + // If DEBUG is set, show the Solana program logs. + if std::env::var_os("DEBUG").is_some() { + builder.filter_level(log::LevelFilter::Error); + builder.filter( + Some("solana_runtime::message_processor::stable_log"), + log::LevelFilter::Debug, + ); + } + + let _ = builder.try_init(); + }); +} + +use doublezero_passport::{ + instruction::{ + account::{ + ConfigureProgramAccounts, DenyAccessAccounts, GrantAccessAccounts, + InitializeProgramAccounts, RequestAccessAccounts, SetAdminAccounts, + }, + AccessMode, PassportInstructionData, ProgramConfiguration, ProgramFlagConfiguration, + }, + state::{AccessRequest, ProgramConfig}, + ID, +}; +use doublezero_program_tools::{ + instruction::try_build_instruction, zero_copy::checked_from_bytes_with_discriminator, +}; +use solana_loader_v3_interface::{get_program_data_address, state::UpgradeableLoaderState}; +use solana_program_test::{BanksClient, BanksClientError, ProgramTest, ProgramTestBanksClientExt}; +use solana_pubkey::Pubkey; +use solana_sdk::{ + account::Account, + hash::Hash, + instruction::Instruction, + message::{v0::Message, VersionedMessage}, + signature::{Keypair, Signer}, + transaction::{TransactionError, VersionedTransaction}, +}; + +pub struct TestAccount { + pub key: Pubkey, + pub info: Account, +} + +pub struct ProgramTestWithOwner { + pub banks_client: BanksClient, + pub payer_signer: Keypair, + pub cached_blockhash: Hash, + pub owner_signer: Keypair, +} + +pub struct ConfiguredProgramState { + pub admin_signer: Keypair, + pub sentinel_signer: Keypair, +} + +pub async fn start_test_with_accounts(accounts: Vec) -> ProgramTestWithOwner { + let mut program_test = ProgramTest::new("doublezero_passport", ID, None); + program_test.prefer_bpf(true); + + let owner_signer = Keypair::new(); + + // Fake the BPF Upgradeable Program's program data account for the Passport + // Program. + let program_data_acct = Account { + lamports: 69, + data: bincode::serialize(&UpgradeableLoaderState::ProgramData { + slot: 0, + upgrade_authority_address: Some(owner_signer.pubkey()), + }) + .unwrap(), + ..Default::default() + }; + program_test.add_account(get_program_data_address(&ID), program_data_acct); + + for TestAccount { key, info } in accounts.into_iter() { + program_test.add_account(key, info); + } + + let (banks_client, payer_signer, cached_blockhash) = program_test.start().await; + + ProgramTestWithOwner { + banks_client, + payer_signer, + cached_blockhash, + owner_signer, + } +} + +pub async fn start_test() -> ProgramTestWithOwner { + start_test_with_accounts(Default::default()).await +} + +impl ProgramTestWithOwner { + pub async fn get_latest_blockhash(&mut self) -> Result { + self.banks_client + .get_new_latest_blockhash(&self.cached_blockhash) + .await + .map_err(Into::into) + } + + pub async fn transfer_lamports( + &mut self, + dst_key: &Pubkey, + amount: u64, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.payer_signer; + + let transfer_ix = + solana_system_interface::instruction::transfer(&payer_signer.pubkey(), dst_key, amount); + + self.cached_blockhash = process_instructions_for_test( + &mut self.banks_client, + &self.cached_blockhash, + &[transfer_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn unwrap_simulation_error( + &mut self, + instructions: &[Instruction], + signers: &[&Keypair], + ) -> Result<(TransactionError, Vec), BanksClientError> { + let recent_blockhash = self.get_latest_blockhash().await?; + let payer_signer = &self.payer_signer; + + let mut tx_signers = vec![payer_signer]; + tx_signers.extend_from_slice(signers); + + let transaction = new_transaction(instructions, &tx_signers, recent_blockhash); + + let simulated_tx = self.banks_client.simulate_transaction(transaction).await?; + + let tx_err = simulated_tx + .result + .ok_or(BanksClientError::ClientError( + "simulation returned no result", + ))? + .unwrap_err(); + + self.cached_blockhash = recent_blockhash; + + Ok((tx_err, simulated_tx.simulation_details.unwrap().logs)) + } + + pub async fn setup_configured_program( + &mut self, + ) -> Result { + let admin_signer = Keypair::new(); + let sentinel_signer = Keypair::new(); + + self.transfer_lamports(&sentinel_signer.pubkey(), 128 * 6_960) + .await? + .initialize_program() + .await? + .set_admin(&admin_signer.pubkey()) + .await? + .configure_program( + [ + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + ProgramConfiguration::DoubleZeroLedgerSentinel(sentinel_signer.pubkey()), + ProgramConfiguration::AccessRequestDeposit { + request_deposit_lamports: 10_000_000, + request_fee_lamports: 10_000, + }, + ProgramConfiguration::SolanaValidatorBackupIdsLimit(2), + ], + &admin_signer, + ) + .await?; + + Ok(ConfiguredProgramState { + admin_signer, + sentinel_signer, + }) + } + + pub async fn initialize_program(&mut self) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.payer_signer; + let program_config_key = ProgramConfig::find_address().0; + + let initialize_program_ix = try_build_instruction( + &ID, + InitializeProgramAccounts::new(&payer_signer.pubkey()), + &PassportInstructionData::InitializeProgram, + ) + .unwrap(); + + let remove_me_ix = solana_system_interface::instruction::transfer( + &payer_signer.pubkey(), + &program_config_key, + 1, + ); + + self.cached_blockhash = process_instructions_for_test( + &mut self.banks_client, + &self.cached_blockhash, + &[remove_me_ix, initialize_program_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn set_admin(&mut self, admin_key: &Pubkey) -> Result<&mut Self, BanksClientError> { + let owner_signer = &self.owner_signer; + let payer_signer = &self.payer_signer; + + let set_admin_ix = try_build_instruction( + &ID, + SetAdminAccounts::new(&ID, &owner_signer.pubkey()), + &PassportInstructionData::SetAdmin(*admin_key), + ) + .unwrap(); + + self.cached_blockhash = process_instructions_for_test( + &mut self.banks_client, + &self.cached_blockhash, + &[set_admin_ix], + &[payer_signer, owner_signer], + ) + .await?; + + Ok(self) + } + + pub async fn configure_program( + &mut self, + settings: [ProgramConfiguration; N], + admin_signer: &Keypair, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.payer_signer; + + let configure_program_ixs = settings + .into_iter() + .map(|setting| { + try_build_instruction( + &ID, + ConfigureProgramAccounts::new(&admin_signer.pubkey()), + &PassportInstructionData::ConfigureProgram(setting), + ) + .unwrap() + }) + .collect::>(); + + self.cached_blockhash = process_instructions_for_test( + &mut self.banks_client, + &self.cached_blockhash, + &configure_program_ixs, + &[payer_signer, admin_signer], + ) + .await?; + + Ok(self) + } + + pub async fn request_access( + &mut self, + service_key: &Pubkey, + access_mode: AccessMode, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.payer_signer; + + let request_access_ix = try_build_instruction( + &ID, + RequestAccessAccounts::new(&payer_signer.pubkey(), service_key), + &PassportInstructionData::RequestAccess(access_mode), + ) + .unwrap(); + + self.cached_blockhash = process_instructions_for_test( + &mut self.banks_client, + &self.cached_blockhash, + &[request_access_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn grant_access( + &mut self, + dz_ledger_sentinel: &Keypair, + access_request_key: &Pubkey, + rent_beneficiary_key: &Pubkey, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.payer_signer; + + let grant_access_ix = try_build_instruction( + &ID, + GrantAccessAccounts::new( + &dz_ledger_sentinel.pubkey(), + access_request_key, + rent_beneficiary_key, + ), + &PassportInstructionData::GrantAccess, + ) + .unwrap(); + + self.cached_blockhash = process_instructions_for_test( + &mut self.banks_client, + &self.cached_blockhash, + &[grant_access_ix], + &[payer_signer, dz_ledger_sentinel], + ) + .await?; + + Ok(self) + } + + pub async fn deny_access( + &mut self, + dz_ledger_sentinel: &Keypair, + access_request_key: &Pubkey, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.payer_signer; + + let deny_access_ix = try_build_instruction( + &ID, + DenyAccessAccounts::new(&dz_ledger_sentinel.pubkey(), access_request_key), + &PassportInstructionData::DenyAccess, + ) + .unwrap(); + + self.cached_blockhash = process_instructions_for_test( + &mut self.banks_client, + &self.cached_blockhash, + &[deny_access_ix], + &[payer_signer, dz_ledger_sentinel], + ) + .await?; + + Ok(self) + } + + // + // Account fetchers. + // + + pub async fn fetch_program_config(&self) -> (Pubkey, ProgramConfig) { + let program_config_key = ProgramConfig::find_address().0; + + let program_config_account_data = self + .banks_client + .get_account(program_config_key) + .await + .unwrap() + .unwrap() + .data; + + ( + program_config_key, + *checked_from_bytes_with_discriminator(&program_config_account_data) + .unwrap() + .0, + ) + } + + pub async fn fetch_access_request(&self, service_key: &Pubkey) -> (Pubkey, AccessRequest) { + let access_request_key = AccessRequest::find_address(service_key).0; + + let access_request_account_data = self + .banks_client + .get_account(access_request_key) + .await + .unwrap() + .unwrap() + .data; + + ( + access_request_key, + *checked_from_bytes_with_discriminator(&access_request_account_data) + .unwrap() + .0, + ) + } +} + +pub async fn process_instructions_for_test( + banks_client: &mut BanksClient, + cached_blockhash: &Hash, + instructions: &[Instruction], + signers: &[&Keypair], +) -> Result { + let recent_blockhash = banks_client + .get_new_latest_blockhash(cached_blockhash) + .await + .map_err(|_| BanksClientError::ClientError("failed to get new blockhash"))?; + + let transaction = new_transaction(instructions, signers, recent_blockhash); + + banks_client.process_transaction(transaction).await?; + + Ok(recent_blockhash) +} + +fn new_transaction( + instructions: &[Instruction], + signers: &[&Keypair], + recent_blockhash: Hash, +) -> VersionedTransaction { + let message = + Message::try_compile(&signers[0].pubkey(), instructions, &[], recent_blockhash).unwrap(); + + VersionedTransaction::try_new(VersionedMessage::V0(message), signers).unwrap() +} diff --git a/solana/programs/passport/tests/configure_program_test.rs b/solana/programs/passport/tests/configure_program_test.rs new file mode 100644 index 0000000000..dee52e187d --- /dev/null +++ b/solana/programs/passport/tests/configure_program_test.rs @@ -0,0 +1,95 @@ +mod common; + +// + +use doublezero_passport::{ + instruction::{ProgramConfiguration, ProgramFlagConfiguration}, + state::ProgramConfig, +}; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; +use solana_sdk::signature::{Keypair, Signer}; + +// +// Setup. +// + +struct ConfigureProgramSetup { + test_setup: common::ProgramTestWithOwner, + admin_signer: Keypair, +} + +async fn setup_for_configure_program() -> ConfigureProgramSetup { + let mut test_setup = common::start_test().await; + + let admin_signer = Keypair::new(); + + test_setup + .initialize_program() + .await + .unwrap() + .set_admin(&admin_signer.pubkey()) + .await + .unwrap(); + + ConfigureProgramSetup { + test_setup, + admin_signer, + } +} + +// +// Configure program — happy path. +// + +#[tokio::test] +async fn test_configure_program() { + let ConfigureProgramSetup { + mut test_setup, + admin_signer, + } = setup_for_configure_program().await; + + // Test inputs. + + // Flags. + let should_pause = true; + + // Other settings. + let sentinel_key = Pubkey::new_unique(); + let required_deposit_lamports = 1_000_000; + let fee_lamports = 1_000; + let solana_validator_backup_ids_limit = 10; + + test_setup + .configure_program( + [ + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(should_pause)), + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsRequestAccessPaused( + should_pause, + )), + ProgramConfiguration::DoubleZeroLedgerSentinel(sentinel_key), + ProgramConfiguration::AccessRequestDeposit { + request_deposit_lamports: required_deposit_lamports, + request_fee_lamports: fee_lamports, + }, + ProgramConfiguration::SolanaValidatorBackupIdsLimit( + solana_validator_backup_ids_limit, + ), + ], + &admin_signer, + ) + .await + .unwrap(); + + let (_, program_config) = test_setup.fetch_program_config().await; + + let mut expected_program_config = ProgramConfig::default(); + expected_program_config.admin_key = admin_signer.pubkey(); + expected_program_config.set_is_paused(should_pause); + expected_program_config.set_is_request_access_paused(should_pause); + expected_program_config.sentinel_key = sentinel_key; + expected_program_config.request_deposit_lamports = required_deposit_lamports; + expected_program_config.request_fee_lamports = fee_lamports; + expected_program_config.solana_validator_backup_ids_limit = solana_validator_backup_ids_limit; + assert_eq!(program_config, expected_program_config); +} diff --git a/solana/programs/passport/tests/deny_access_test.rs b/solana/programs/passport/tests/deny_access_test.rs new file mode 100644 index 0000000000..0a956a660a --- /dev/null +++ b/solana/programs/passport/tests/deny_access_test.rs @@ -0,0 +1,189 @@ +mod common; + +// + +use doublezero_passport::{ + instruction::{ + account::DenyAccessAccounts, AccessMode, PassportInstructionData, + SolanaValidatorAttestation, + }, + state::AccessRequest, + ID, +}; +use doublezero_program_tools::{instruction::try_build_instruction, zero_copy}; +use solana_program_test::{tokio, BanksClientError}; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; + +// +// Setup. +// + +struct DenyAccessSetup { + test_setup: common::ProgramTestWithOwner, + sentinel_signer: Keypair, + service_key: Pubkey, + access_deposit: u64, +} + +async fn setup_for_deny_access() -> DenyAccessSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let service_key = Pubkey::new_unique(); + let validator_id = Pubkey::new_unique(); + + let attestation = SolanaValidatorAttestation { + validator_id, + service_key, + ed25519_signature: [1; 64], + }; + + test_setup + .request_access(&service_key, AccessMode::SolanaValidator(attestation)) + .await + .unwrap(); + + DenyAccessSetup { + test_setup, + sentinel_signer: configured.sentinel_signer, + service_key, + access_deposit: 10_000_000, + } +} + +// +// Deny access — happy path. +// + +#[tokio::test] +async fn test_deny_access() { + let DenyAccessSetup { + mut test_setup, + sentinel_signer, + service_key, + access_deposit, + } = setup_for_deny_access().await; + + let sentinel_before_balance = test_setup + .banks_client + .get_balance(sentinel_signer.pubkey()) + .await + .unwrap(); + + let (access_request_key, access_request) = test_setup.fetch_access_request(&service_key).await; + + let access_request_balance = test_setup + .banks_client + .get_balance(access_request_key) + .await + .unwrap(); + + let request_rent = test_setup + .banks_client + .get_rent() + .await + .unwrap() + .minimum_balance(zero_copy::data_end::()); + + assert_eq!(access_request_balance - request_rent, access_deposit); + assert_eq!(access_request.service_key, service_key); + + test_setup + .deny_access(&sentinel_signer, &access_request_key) + .await + .unwrap(); + + let sentinel_after_balance = test_setup + .banks_client + .get_balance(sentinel_signer.pubkey()) + .await + .unwrap(); + + assert_eq!( + sentinel_before_balance + access_deposit + request_rent, + sentinel_after_balance, + ); + + let access_request_info = test_setup + .banks_client + .get_account(access_request_key) + .await + .unwrap(); + assert!(access_request_info.is_none()); +} + +// +// Deny access — unauthorized sentinel. +// + +#[tokio::test] +async fn test_cannot_deny_access_unauthorized_sentinel() { + let DenyAccessSetup { + mut test_setup, + sentinel_signer, + service_key, + .. + } = setup_for_deny_access().await; + + let sentinel_before_balance = test_setup + .banks_client + .get_balance(sentinel_signer.pubkey()) + .await + .unwrap(); + + let (access_request_key, _) = test_setup.fetch_access_request(&service_key).await; + let unauthorized_signer = Keypair::new(); + + let (tx_err, _) = + simulate_deny_access_revert(&mut test_setup, &unauthorized_signer, &access_request_key) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + + // Verify balances unchanged. + let sentinel_after_balance = test_setup + .banks_client + .get_balance(sentinel_signer.pubkey()) + .await + .unwrap(); + assert_eq!(sentinel_before_balance, sentinel_after_balance); + + // Verify access request still exists. + let access_request_info = test_setup + .banks_client + .get_account(access_request_key) + .await + .unwrap(); + assert!(access_request_info.is_some()); +} + +// +// Helpers. +// + +async fn simulate_deny_access_revert( + test_setup: &mut common::ProgramTestWithOwner, + sentinel_signer: &Keypair, + access_request_key: &Pubkey, +) -> Result<(TransactionError, Vec), BanksClientError> { + let deny_access_ix = try_build_instruction( + &ID, + DenyAccessAccounts::new(&sentinel_signer.pubkey(), access_request_key), + &PassportInstructionData::GrantAccess, + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[deny_access_ix], &[sentinel_signer]) + .await +} diff --git a/solana/programs/passport/tests/grant_access_test.rs b/solana/programs/passport/tests/grant_access_test.rs new file mode 100644 index 0000000000..7c01bfa8ba --- /dev/null +++ b/solana/programs/passport/tests/grant_access_test.rs @@ -0,0 +1,232 @@ +mod common; + +// + +use doublezero_passport::{ + instruction::{ + account::GrantAccessAccounts, AccessMode, PassportInstructionData, + SolanaValidatorAttestation, + }, + state::AccessRequest, + ID, +}; +use doublezero_program_tools::{instruction::try_build_instruction, zero_copy}; +use solana_program_test::{tokio, BanksClientError}; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; + +// +// Setup. +// + +struct GrantAccessSetup { + test_setup: common::ProgramTestWithOwner, + sentinel_signer: Keypair, + service_key: Pubkey, + access_deposit: u64, + access_fee: u64, +} + +async fn setup_for_grant_access() -> GrantAccessSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let service_key = Pubkey::new_unique(); + let validator_id = Pubkey::new_unique(); + + let attestation = SolanaValidatorAttestation { + validator_id, + service_key, + ed25519_signature: [1; 64], + }; + + test_setup + .request_access(&service_key, AccessMode::SolanaValidator(attestation)) + .await + .unwrap(); + + GrantAccessSetup { + test_setup, + sentinel_signer: configured.sentinel_signer, + service_key, + access_deposit: 10_000_000, + access_fee: 10_000, + } +} + +// +// Grant access — happy path. +// + +#[tokio::test] +async fn test_grant_access() { + let GrantAccessSetup { + mut test_setup, + sentinel_signer, + service_key, + access_deposit, + access_fee, + } = setup_for_grant_access().await; + + let sentinel_before_balance = test_setup + .banks_client + .get_balance(sentinel_signer.pubkey()) + .await + .unwrap(); + let payer_before_balance = test_setup + .banks_client + .get_balance(test_setup.payer_signer.pubkey()) + .await + .unwrap(); + + let (access_request_key, access_request) = test_setup.fetch_access_request(&service_key).await; + + let request_rent = test_setup + .banks_client + .get_rent() + .await + .unwrap() + .minimum_balance(zero_copy::data_end::()); + + let access_request_balance = test_setup + .banks_client + .get_balance(access_request_key) + .await + .unwrap(); + assert_eq!(access_request_balance, access_deposit + request_rent); + assert_eq!(access_request.service_key, service_key); + + test_setup + .grant_access( + &sentinel_signer, + &access_request_key, + &test_setup.payer_signer.pubkey(), + ) + .await + .unwrap(); + + let sentinel_after_balance = test_setup + .banks_client + .get_balance(sentinel_signer.pubkey()) + .await + .unwrap(); + let payer_after_balance = test_setup + .banks_client + .get_balance(test_setup.payer_signer.pubkey()) + .await + .unwrap(); + + assert_eq!(sentinel_before_balance + access_fee, sentinel_after_balance); + + let txn_signer_cost_adjustment = 10_000; + let expected_payer_balance = payer_before_balance + access_deposit + request_rent + - access_fee + - txn_signer_cost_adjustment; + assert_eq!(expected_payer_balance, payer_after_balance); + + let access_request_info = test_setup + .banks_client + .get_account(access_request_key) + .await + .unwrap(); + assert!(access_request_info.is_none()); +} + +// +// Grant access — unauthorized sentinel. +// + +#[tokio::test] +async fn test_cannot_grant_access_unauthorized_sentinel() { + let GrantAccessSetup { + mut test_setup, + service_key, + .. + } = setup_for_grant_access().await; + + let (access_request_key, _) = test_setup.fetch_access_request(&service_key).await; + let unauthorized_signer = Keypair::new(); + let payer_key = test_setup.payer_signer.pubkey(); + + let (tx_err, _) = simulate_grant_access_revert( + &mut test_setup, + &unauthorized_signer, + &access_request_key, + &payer_key, + ) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); +} + +// +// Grant access — wrong rent beneficiary. +// + +#[tokio::test] +async fn test_cannot_grant_access_wrong_rent_beneficiary() { + let GrantAccessSetup { + mut test_setup, + sentinel_signer, + service_key, + .. + } = setup_for_grant_access().await; + + let (access_request_key, access_request) = test_setup.fetch_access_request(&service_key).await; + + let (tx_err, program_logs) = simulate_grant_access_revert( + &mut test_setup, + &sentinel_signer, + &access_request_key, + &Pubkey::new_unique(), + ) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(2).unwrap(), + &format!( + "Program log: Expected rent beneficiary key: {}", + access_request.rent_beneficiary_key + ) + ); +} + +// +// Helpers. +// + +async fn simulate_grant_access_revert( + test_setup: &mut common::ProgramTestWithOwner, + sentinel_signer: &Keypair, + access_request_key: &Pubkey, + rent_beneficiary_key: &Pubkey, +) -> Result<(TransactionError, Vec), BanksClientError> { + let grant_access_ix = try_build_instruction( + &ID, + GrantAccessAccounts::new( + &sentinel_signer.pubkey(), + access_request_key, + rent_beneficiary_key, + ), + &PassportInstructionData::GrantAccess, + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[grant_access_ix], &[sentinel_signer]) + .await +} diff --git a/solana/programs/passport/tests/initialize_program_test.rs b/solana/programs/passport/tests/initialize_program_test.rs new file mode 100644 index 0000000000..f5ef3017d7 --- /dev/null +++ b/solana/programs/passport/tests/initialize_program_test.rs @@ -0,0 +1,48 @@ +mod common; + +// + +use doublezero_passport::state::ProgramConfig; +use doublezero_program_tools::zero_copy::checked_from_bytes_with_discriminator; +use solana_program_test::tokio; + +// +// Setup. +// + +struct InitializeProgramSetup { + test_setup: common::ProgramTestWithOwner, +} + +async fn setup_for_initialize_program() -> InitializeProgramSetup { + let test_setup = common::start_test().await; + InitializeProgramSetup { test_setup } +} + +// +// Initialize program — happy path. +// + +#[tokio::test] +async fn test_initialize_program() { + let InitializeProgramSetup { mut test_setup } = setup_for_initialize_program().await; + + test_setup.initialize_program().await.unwrap(); + + let (program_config_key, _) = ProgramConfig::find_address(); + + let program_config_account_data = test_setup + .banks_client + .get_account(program_config_key) + .await + .unwrap() + .unwrap() + .data; + + let (program_config, remaining_data) = + checked_from_bytes_with_discriminator::(&program_config_account_data) + .unwrap(); + assert!(remaining_data.is_empty()); + + assert_eq!(program_config, &ProgramConfig::default()); +} diff --git a/solana/programs/passport/tests/request_access_test.rs b/solana/programs/passport/tests/request_access_test.rs new file mode 100644 index 0000000000..58ea17558e --- /dev/null +++ b/solana/programs/passport/tests/request_access_test.rs @@ -0,0 +1,325 @@ +mod common; + +// + +use common::process_instructions_for_test; +use doublezero_passport::{ + instruction::{ + account::RequestAccessAccounts, AccessMode, PassportInstructionData, ProgramConfiguration, + ProgramFlagConfiguration, SolanaValidatorAttestation, + }, + state::{AccessRequest, REQUEST_ACCESS_MAX_DATA_SIZE}, + ID, +}; +use doublezero_program_tools::{instruction::try_build_instruction, zero_copy}; +use solana_program_test::{tokio, BanksClientError}; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; + +// +// Setup. +// + +struct RequestAccessSetup { + test_setup: common::ProgramTestWithOwner, + admin_signer: Keypair, + request_deposit_lamports: u64, + request_fee_lamports: u64, + solana_validator_backup_ids_limit: u16, +} + +async fn setup_for_request_access() -> RequestAccessSetup { + let mut test_setup = common::start_test().await; + + let admin_signer = Keypair::new(); + let request_deposit_lamports = 10_000_000; + let request_fee_lamports = 10_000; + let solana_validator_backup_ids_limit = 2; + + test_setup + .initialize_program() + .await + .unwrap() + .set_admin(&admin_signer.pubkey()) + .await + .unwrap() + .configure_program( + [ + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + ProgramConfiguration::AccessRequestDeposit { + request_deposit_lamports, + request_fee_lamports, + }, + ProgramConfiguration::SolanaValidatorBackupIdsLimit( + solana_validator_backup_ids_limit, + ), + ], + &admin_signer, + ) + .await + .unwrap(); + + RequestAccessSetup { + test_setup, + admin_signer, + request_deposit_lamports, + request_fee_lamports, + solana_validator_backup_ids_limit, + } +} + +// +// Request access — exceeding backup IDs limit. +// + +#[tokio::test] +async fn test_cannot_request_access_exceeding_backup_ids_limit() { + let RequestAccessSetup { + mut test_setup, + solana_validator_backup_ids_limit, + .. + } = setup_for_request_access().await; + + let service_key = Pubkey::new_unique(); + let validator_id = Pubkey::new_unique(); + + let attestation = SolanaValidatorAttestation { + validator_id, + service_key, + ed25519_signature: [1; 64], + }; + + let (tx_err, program_logs) = simulate_request_access_revert( + &mut test_setup, + &service_key, + AccessMode::SolanaValidatorWithBackupIds { + attestation, + backup_ids: vec![ + Pubkey::new_unique(), + Pubkey::new_unique(), + Pubkey::new_unique(), + ], + }, + ) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidInstructionData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + &format!("Program log: Cannot exceed backup IDs limit {solana_validator_backup_ids_limit}",) + ); +} + +// +// Request access — happy path with two access modes. +// + +#[tokio::test] +async fn test_request_access() { + let RequestAccessSetup { + mut test_setup, + request_deposit_lamports, + request_fee_lamports, + .. + } = setup_for_request_access().await; + + let service_key_1 = Pubkey::new_unique(); + let service_key_2 = Pubkey::new_unique(); + let validator_id = Pubkey::new_unique(); + + let attestation_1 = SolanaValidatorAttestation { + validator_id, + service_key: service_key_1, + ed25519_signature: [1; 64], + }; + let attestation_2 = SolanaValidatorAttestation { + validator_id, + service_key: service_key_2, + ed25519_signature: [1; 64], + }; + let backup_ids = vec![Pubkey::new_unique(), Pubkey::new_unique()]; + + let access_mode_1 = AccessMode::SolanaValidator(attestation_1); + let access_mode_2 = AccessMode::SolanaValidatorWithBackupIds { + attestation: attestation_2, + backup_ids: backup_ids.clone(), + }; + + test_setup + .request_access(&service_key_1, access_mode_1.clone()) + .await + .unwrap() + .request_access(&service_key_2, access_mode_2.clone()) + .await + .unwrap(); + + // Verify first access request. + let (access_request_key, access_request) = + test_setup.fetch_access_request(&service_key_1).await; + + let mut encoded_access_mode = [0; REQUEST_ACCESS_MAX_DATA_SIZE]; + borsh::to_writer(encoded_access_mode.as_mut(), &access_mode_1).unwrap(); + + let expected_access_request = AccessRequest { + service_key: service_key_1, + rent_beneficiary_key: test_setup.payer_signer.pubkey(), + request_fee_lamports, + encoded_access_mode, + }; + assert_eq!(access_request, expected_access_request); + + let request_rent = test_setup + .banks_client + .get_rent() + .await + .unwrap() + .minimum_balance(zero_copy::data_end::()); + + let access_request_balance_after = test_setup + .banks_client + .get_balance(access_request_key) + .await + .unwrap(); + assert_eq!( + access_request_balance_after, + request_deposit_lamports + request_rent + ); + + // Verify second access request. + let (access_request_key, access_request) = + test_setup.fetch_access_request(&service_key_2).await; + + let mut encoded_access_mode = [0; REQUEST_ACCESS_MAX_DATA_SIZE]; + borsh::to_writer(encoded_access_mode.as_mut(), &access_mode_2).unwrap(); + + let expected_access_request = AccessRequest { + service_key: service_key_2, + rent_beneficiary_key: test_setup.payer_signer.pubkey(), + request_fee_lamports, + encoded_access_mode, + }; + assert_eq!(access_request, expected_access_request); + + let access_request_balance_after = test_setup + .banks_client + .get_balance(access_request_key) + .await + .unwrap(); + assert_eq!( + access_request_balance_after, + request_deposit_lamports + request_rent + ); + + // Fail on duplicate access request. + let duplicate_ix = try_build_instruction( + &ID, + RequestAccessAccounts::new(&test_setup.payer_signer.pubkey(), &service_key_1), + &PassportInstructionData::RequestAccess(AccessMode::SolanaValidator(attestation_1)), + ) + .unwrap(); + + let recent_blockhash = test_setup.get_latest_blockhash().await.unwrap(); + let result = process_instructions_for_test( + &mut test_setup.banks_client, + &recent_blockhash, + &[duplicate_ix], + &[&test_setup.payer_signer], + ) + .await; + assert!(result.is_err()); + + // Fail on mismatched service key. + let payer_signer = Keypair::new(); + let (tx_err, _) = simulate_request_access_revert_with_payer( + &mut test_setup, + &payer_signer, + &service_key_2, + AccessMode::SolanaValidator(attestation_1), + ) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidSeeds) + ); +} + +// +// Request access — program paused. +// + +#[tokio::test] +async fn test_cannot_request_access_when_paused() { + let RequestAccessSetup { + mut test_setup, + admin_signer, + .. + } = setup_for_request_access().await; + + let service_key = Pubkey::new_unique(); + let validator_id = Pubkey::new_unique(); + + let attestation = SolanaValidatorAttestation { + validator_id, + service_key, + ed25519_signature: [1; 64], + }; + + test_setup + .configure_program( + [ProgramConfiguration::Flag( + ProgramFlagConfiguration::IsPaused(true), + )], + &admin_signer, + ) + .await + .unwrap(); + + let (_, program_config) = test_setup.fetch_program_config().await; + assert!(program_config.is_paused()); + + let result = test_setup + .request_access(&service_key, AccessMode::SolanaValidator(attestation)) + .await; + assert!(result.is_err()); +} + +// +// Helpers. +// + +async fn simulate_request_access_revert( + test_setup: &mut common::ProgramTestWithOwner, + service_key: &Pubkey, + access_mode: AccessMode, +) -> Result<(TransactionError, Vec), BanksClientError> { + let payer_signer = Keypair::new(); + simulate_request_access_revert_with_payer(test_setup, &payer_signer, service_key, access_mode) + .await +} + +async fn simulate_request_access_revert_with_payer( + test_setup: &mut common::ProgramTestWithOwner, + payer_signer: &Keypair, + service_key: &Pubkey, + access_mode: AccessMode, +) -> Result<(TransactionError, Vec), BanksClientError> { + let ix = try_build_instruction( + &ID, + RequestAccessAccounts::new(&payer_signer.pubkey(), service_key), + &PassportInstructionData::RequestAccess(access_mode), + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[ix], &[payer_signer]) + .await +} diff --git a/solana/programs/passport/tests/set_admin_test.rs b/solana/programs/passport/tests/set_admin_test.rs new file mode 100644 index 0000000000..a24f00d327 --- /dev/null +++ b/solana/programs/passport/tests/set_admin_test.rs @@ -0,0 +1,42 @@ +mod common; + +// + +use doublezero_passport::state::ProgramConfig; +use solana_program_test::tokio; +use solana_sdk::{signature::Keypair, signer::Signer}; + +// +// Setup. +// + +struct SetAdminSetup { + test_setup: common::ProgramTestWithOwner, +} + +async fn setup_for_set_admin() -> SetAdminSetup { + let mut test_setup = common::start_test().await; + + test_setup.initialize_program().await.unwrap(); + + SetAdminSetup { test_setup } +} + +// +// Set admin — happy path. +// + +#[tokio::test] +async fn test_set_admin() { + let SetAdminSetup { mut test_setup } = setup_for_set_admin().await; + + let admin_signer = Keypair::new(); + + test_setup.set_admin(&admin_signer.pubkey()).await.unwrap(); + + let (_, program_config) = test_setup.fetch_program_config().await; + + let mut expected_program_config = ProgramConfig::default(); + expected_program_config.admin_key = admin_signer.pubkey(); + assert_eq!(program_config, expected_program_config); +} diff --git a/solana/programs/revenue-distribution/CHANGELOG.md b/solana/programs/revenue-distribution/CHANGELOG.md new file mode 100644 index 0000000000..b22c52634f --- /dev/null +++ b/solana/programs/revenue-distribution/CHANGELOG.md @@ -0,0 +1,113 @@ +# Changelog + +## Unreleased + +- reject null-root rewards finalize while 2Z is owed to contributors (malbeclabs/infra#1868) +- reject collecting an integration registered after a distribution's snapshot (malbeclabs/infra#1868) + +## [v0.3.7] + +- migrate distributions to fix integrations_count_snapshot +- simplify initialize-rewards-integration interface + +## [v0.3.6] + +- validate destination authority in withdraw integration rewards handler (#119) + +## [v0.3.5] + +- register rewards integrations (#113) +- simplify already-registered rejection (#114) +- scaffold integration harvesting (#115) +- track collected integrations via inline bitmap on distribution (#117) +- collect integration rewards (#116) + +## [v0.3.4] +- withdraw deposited SOL (#111) + +## [v0.3.3] + +- set distribution economic burn rate (#109) + +## [v0.3.2] + +- fix zero-fee handling (#107) + +## [v0.3.1] + +- handle direct 2Z payments to Journal's ATA (#106) + +## [v0.3.0] + +- fix initialize-distribution interface (#105) + +## [v0.2.1] + +- debt write off activation (#99) +- uptick version to 0.2.1 (#101) + +## [v0.2.0] + +- add null rewards root protection (#86) +- fix swap balance in journal (#87) +- allow same-distribution debt write-offs (#91) +- update dependencies (#92) +- track debt write-offs in state (#93) +- update Solana crates to v3 (#94) +- uptick version to 0.2.0 (#95) + +## [v0.1.1] + +- uptick svm-hash (#83) +- fix CPI seeds for sweep (#84) + +## [v0.1.0] + +- add reward distribution program (#1) +- add prepaid user handling (#2) +- add development feature (#3) +- clean up rust deps (#7) +- add contributor rewards (#8) +- expand Solana validator fee parameters (#9) +- split accountant key and add finalize instruction args (#10) +- add sentinel to grant/deny prepaid access (#11) +- split initialize-contributor-rewards instruction (#13) +- split distribution configuration (#17) +- add verify distribution merkle root (#19) +- add migrate instruction (#23) +- uptick msrv to 1.84 and solana version 2.3.7 (#32) +- add space for payments and claims (#37) +- pay Solana vlaidator debt (#40) +- fix mainnet 2Z key (#42) +- add reward distribution precursor instructions (#45) +- fixed SOL fee and better debt handling (#46) +- add economic burn rate encoding (#47) +- block setting a new rewards manager (#48) +- add withdraw SOL scaffolding (#49) +- distribute rewards (#50) +- onchain clean up (#52) +- enforce grace period after initializing distribution (#53) +- enforce distribution sweeping in epoch orer (#54) +- fix Solana validator deposit account creation (#55) +- separate versions for programs (#66) +- remove prepaid handling (#69) +- recipient shares cannot be zero (#75) +- fix dequeue fills cpi account meta (#76) +- require recipients be configured (#77) +- add initialize distribution grace period (#78) +- add revert if distribution count == total (#79) +- next_dz_epoch -> next_completed_dz_epoch (#80) +- fix `try_initialize` (#81) + +[v0.1.0]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.1.0 +[v0.1.1]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.1.1 +[v0.2.0]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.2.0 +[v0.2.1]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.2.1 +[v0.3.0]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.3.0 +[v0.3.1]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.3.1 +[v0.3.2]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.3.2 +[v0.3.3]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.3.3 +[v0.3.4]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.3.4 +[v0.3.5]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.3.5 +[v0.3.6]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.3.6 +[v0.3.7]: https://github.com/doublezerofoundation/doublezero-solana/tree/revenue-distribution/v0.3.7 diff --git a/solana/programs/revenue-distribution/Cargo.toml b/solana/programs/revenue-distribution/Cargo.toml new file mode 100644 index 0000000000..6c0ee29317 --- /dev/null +++ b/solana/programs/revenue-distribution/Cargo.toml @@ -0,0 +1,54 @@ +[package] +name = "doublezero-revenue-distribution" +version = "0.3.7" + +edition.workspace = true +homepage.workspace = true +license.workspace = true +repository.workspace = true +rust-version.workspace = true + +[dependencies] +borsh = { workspace = true, features = ["derive"] } +bytemuck = { workspace = true, features = ["derive", "min_const_generics"] } +doublezero-program-tools = { workspace = true, features = ["entrypoint"] } +ruint.workspace = true +solana-account-info.workspace = true +solana-cpi.workspace = true +solana-instruction = { workspace = true, features = ["syscalls"] } +solana-msg.workspace = true +solana-program-entrypoint.workspace = true +solana-program-error.workspace = true +solana-program-memory.workspace = true +solana-program-pack.workspace = true +solana-pubkey = { workspace = true, features = ["borsh", "bytemuck"] } +solana-system-interface.workspace = true +solana-sysvar.workspace = true +spl-associated-token-account-interface.workspace = true +spl-token-interface.workspace = true +svm-hash = { workspace = true, features = ["borsh", "bytemuck"] } + +[dev-dependencies] +bincode.workspace = true +ctor.workspace = true +env_logger.workspace = true +log.workspace = true +mock-rewards-integration.workspace = true +mock-swap-sol-2z.workspace = true +solana-loader-v3-interface.workspace = true +solana-program-test.workspace = true +solana-sdk.workspace = true + +[features] +default = [] +### Build with this feature for Solana devnet and localnet. +development = [] +entrypoint = [] + +[lib] +crate-type = ["cdylib", "lib"] + +[lints.rust] +unexpected_cfgs = { level = "allow", check-cfg = ['cfg(custom_heap)'] } + +### TODO: Add release profile. diff --git a/solana/programs/revenue-distribution/README.md b/solana/programs/revenue-distribution/README.md new file mode 100644 index 0000000000..0eb15d1c22 --- /dev/null +++ b/solana/programs/revenue-distribution/README.md @@ -0,0 +1,27 @@ +# Revenue Distribution Program + +## Operations + +### Finalizing an epoch whose integration cannot be collected + +`FinalizeDistributionRewards` rejects a null rewards merkle root while 2Z is +still owed to contributors: the distribution has nonzero collected 2Z, or a +registered integration has not been collected yet. Finalize is permissionless +and one-way, so this guard is what prevents a premature finalize from +permanently stranding that 2Z. + +An epoch can be structurally uncollectable. Example: a frozen idle epoch with +zero shred distributions, where the shreds integration has nothing to withdraw, +so `CollectIntegrationRewards` for that epoch can never succeed. The guard then +blocks the null-root finalize path for the epoch, and because the offchain +validator-debt worker packs `FinalizeDistributionRewards` for epoch N into the +same transaction as `InitializeDistribution` for epoch N+2, new distributions +stop initializing as well. + +To resolve it, the rewards accountant posts a real (non-null) rewards merkle +root for the stuck epoch via `ConfigureDistributionRewards` (`total_contributors` +plus the root, signed by the rewards accountant in the program config). A +finalize with a real root does not require every integration to be collected, +so the pipeline resumes. This is safe for any 2Z that arrives later: rewards +splitting reads the distribution's collected 2Z total at distribute time, so an +integration collected after a rooted finalize still flows to contributors. diff --git a/solana/programs/revenue-distribution/src/env.rs b/solana/programs/revenue-distribution/src/env.rs new file mode 100644 index 0000000000..947dfe0378 --- /dev/null +++ b/solana/programs/revenue-distribution/src/env.rs @@ -0,0 +1,9 @@ +pub mod mainnet { + pub const DOUBLEZERO_MINT_KEY: solana_pubkey::Pubkey = + solana_pubkey::pubkey!("J6pQQ3FAcJQeWPPGppWRb4nM8jU3wLyYbRrLh7feMfvd"); +} + +pub mod development { + pub const DOUBLEZERO_MINT_KEY: solana_pubkey::Pubkey = + solana_pubkey::pubkey!("devgM7SXHvoHH6jPXRsjn97gygPUo58XEnc9bqY1jpj"); +} diff --git a/solana/programs/revenue-distribution/src/instruction/account.rs b/solana/programs/revenue-distribution/src/instruction/account.rs new file mode 100644 index 0000000000..255f87cf96 --- /dev/null +++ b/solana/programs/revenue-distribution/src/instruction/account.rs @@ -0,0 +1,1197 @@ +use doublezero_program_tools::get_program_data_address; +use solana_instruction::AccountMeta; +use solana_pubkey::Pubkey; +use solana_system_interface::program as system_program; +use spl_associated_token_account_interface::address::get_associated_token_address; + +use crate::{ + state::{ + find_2z_token_pda_address, find_swap_authority_address, + find_withdraw_sol_authority_address, ContributorRewards, Distribution, Journal, + ProgramConfig, RewardsIntegration, SolanaValidatorDeposit, + }, + types::DoubleZeroEpoch, +}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeProgramAccounts { + pub payer_key: Pubkey, + pub new_program_config_key: Pubkey, + pub new_reserve_2z_key: Pubkey, + pub dz_mint_key: Pubkey, +} + +impl InitializeProgramAccounts { + pub fn new(payer_key: &Pubkey, dz_mint_key: &Pubkey) -> Self { + let new_program_config_key = ProgramConfig::find_address().0; + + Self { + payer_key: *payer_key, + new_program_config_key, + new_reserve_2z_key: find_2z_token_pda_address(&new_program_config_key).0, + dz_mint_key: *dz_mint_key, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeProgramAccounts) -> Self { + let InitializeProgramAccounts { + payer_key, + new_program_config_key, + new_reserve_2z_key, + dz_mint_key, + } = accounts; + + vec![ + AccountMeta::new(payer_key, true), + AccountMeta::new(new_program_config_key, false), + AccountMeta::new(new_reserve_2z_key, false), + AccountMeta::new_readonly(dz_mint_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + AccountMeta::new_readonly(system_program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SetAdminAccounts { + pub program_data_key: Pubkey, + pub upgrade_authority_key: Pubkey, + pub program_config_key: Pubkey, +} + +impl SetAdminAccounts { + pub fn new(program_id: &Pubkey, upgrade_authority_key: &Pubkey) -> Self { + Self { + program_data_key: get_program_data_address(program_id).0, + upgrade_authority_key: *upgrade_authority_key, + program_config_key: ProgramConfig::find_address().0, + } + } +} + +impl From for Vec { + fn from(accounts: SetAdminAccounts) -> Self { + let SetAdminAccounts { + program_data_key, + upgrade_authority_key, + program_config_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_data_key, false), + AccountMeta::new_readonly(upgrade_authority_key, true), + AccountMeta::new(program_config_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct MigrateProgramAccountsAccounts { + pub program_data_key: Pubkey, + pub upgrade_authority_key: Pubkey, + pub journal_key: Pubkey, + pub distribution_keys: Vec, +} + +impl MigrateProgramAccountsAccounts { + pub fn new( + program_id: &Pubkey, + upgrade_authority_key: &Pubkey, + dz_epochs: &[DoubleZeroEpoch], + ) -> Self { + Self { + program_data_key: get_program_data_address(program_id).0, + upgrade_authority_key: *upgrade_authority_key, + journal_key: Journal::find_address().0, + distribution_keys: dz_epochs + .iter() + .map(|dz_epoch| Distribution::find_address(*dz_epoch).0) + .collect(), + } + } +} + +impl From for Vec { + fn from(accounts: MigrateProgramAccountsAccounts) -> Self { + let MigrateProgramAccountsAccounts { + program_data_key, + upgrade_authority_key, + journal_key, + distribution_keys, + } = accounts; + + let mut account_metas = vec![ + AccountMeta::new_readonly(program_data_key, false), + AccountMeta::new_readonly(upgrade_authority_key, true), + AccountMeta::new_readonly(journal_key, false), + ]; + + account_metas.extend( + distribution_keys + .into_iter() + .map(|key| AccountMeta::new(key, false)), + ); + + account_metas + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ConfigureProgramAccounts { + pub program_config_key: Pubkey, + pub admin_key: Pubkey, +} + +impl ConfigureProgramAccounts { + pub fn new(admin_key: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + admin_key: *admin_key, + } + } +} + +impl From for Vec { + fn from(accounts: ConfigureProgramAccounts) -> Self { + let ConfigureProgramAccounts { + program_config_key, + admin_key, + } = accounts; + + vec![ + AccountMeta::new(program_config_key, false), + AccountMeta::new_readonly(admin_key, true), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeJournalAccounts { + pub payer_key: Pubkey, + pub new_journal_key: Pubkey, + pub new_journal_2z_token_pda_key: Pubkey, + pub dz_mint_key: Pubkey, +} + +impl InitializeJournalAccounts { + pub fn new(payer_key: &Pubkey, dz_mint_key: &Pubkey) -> Self { + let new_journal_key = Journal::find_address().0; + + Self { + payer_key: *payer_key, + new_journal_key, + new_journal_2z_token_pda_key: find_2z_token_pda_address(&new_journal_key).0, + dz_mint_key: *dz_mint_key, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeJournalAccounts) -> Self { + let InitializeJournalAccounts { + payer_key, + new_journal_key, + new_journal_2z_token_pda_key, + dz_mint_key, + } = accounts; + + vec![ + AccountMeta::new(payer_key, true), + AccountMeta::new(new_journal_key, false), + AccountMeta::new(new_journal_2z_token_pda_key, false), + AccountMeta::new_readonly(dz_mint_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + AccountMeta::new_readonly(system_program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ConfigureJournalAccounts { + pub program_config_key: Pubkey, + pub admin_key: Pubkey, + pub journal_key: Pubkey, +} + +impl ConfigureJournalAccounts { + pub fn new(admin_key: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + admin_key: *admin_key, + journal_key: Journal::find_address().0, + } + } +} + +impl From for Vec { + fn from(accounts: ConfigureJournalAccounts) -> Self { + let ConfigureJournalAccounts { + program_config_key, + admin_key, + journal_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new_readonly(admin_key, true), + AccountMeta::new(journal_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeDistributionAccounts { + pub program_config_key: Pubkey, + pub debt_accountant_key: Pubkey, + pub payer_key: Pubkey, + pub new_distribution_key: Pubkey, + pub new_distribution_2z_token_pda_key: Pubkey, + pub dz_mint_key: Pubkey, + pub journal_key: Pubkey, + pub journal_2z_token_pda_key: Pubkey, + pub journal_ata_key: Pubkey, +} + +impl InitializeDistributionAccounts { + pub fn new( + debt_accountant_key: &Pubkey, + payer_key: &Pubkey, + dz_epoch: DoubleZeroEpoch, + dz_mint_key: &Pubkey, + ) -> Self { + let new_distribution_key = Distribution::find_address(dz_epoch).0; + let journal_key = Journal::find_address().0; + + Self { + program_config_key: ProgramConfig::find_address().0, + debt_accountant_key: *debt_accountant_key, + payer_key: *payer_key, + new_distribution_key, + new_distribution_2z_token_pda_key: find_2z_token_pda_address(&new_distribution_key).0, + dz_mint_key: *dz_mint_key, + journal_key, + journal_2z_token_pda_key: find_2z_token_pda_address(&journal_key).0, + journal_ata_key: get_associated_token_address(&journal_key, dz_mint_key), + } + } +} + +impl From for Vec { + fn from(accounts: InitializeDistributionAccounts) -> Self { + let InitializeDistributionAccounts { + program_config_key, + debt_accountant_key, + payer_key, + new_distribution_key, + new_distribution_2z_token_pda_key, + dz_mint_key, + journal_key, + journal_2z_token_pda_key, + journal_ata_key, + } = accounts; + + vec![ + AccountMeta::new(program_config_key, false), + AccountMeta::new_readonly(debt_accountant_key, true), + AccountMeta::new(payer_key, true), + AccountMeta::new(new_distribution_key, false), + AccountMeta::new(new_distribution_2z_token_pda_key, false), + AccountMeta::new_readonly(dz_mint_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + AccountMeta::new(journal_key, false), + AccountMeta::new(journal_2z_token_pda_key, false), + AccountMeta::new(journal_ata_key, false), + AccountMeta::new_readonly(system_program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ConfigureDistributionDebtAccounts { + pub program_config_key: Pubkey, + pub debt_accountant_key: Pubkey, + pub distribution_key: Pubkey, +} + +impl ConfigureDistributionDebtAccounts { + pub fn new(debt_accountant_key: &Pubkey, dz_epoch: DoubleZeroEpoch) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + debt_accountant_key: *debt_accountant_key, + distribution_key: Distribution::find_address(dz_epoch).0, + } + } +} + +impl From for Vec { + fn from(accounts: ConfigureDistributionDebtAccounts) -> Self { + let ConfigureDistributionDebtAccounts { + program_config_key, + debt_accountant_key, + distribution_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new_readonly(debt_accountant_key, true), + AccountMeta::new(distribution_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct FinalizeDistributionDebtAccounts { + pub program_config_key: Pubkey, + pub debt_accountant_key: Pubkey, + pub distribution_key: Pubkey, + pub payer_key: Pubkey, +} + +impl FinalizeDistributionDebtAccounts { + pub fn new( + debt_accountant_key: &Pubkey, + dz_epoch: DoubleZeroEpoch, + payer_key: &Pubkey, + ) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + debt_accountant_key: *debt_accountant_key, + distribution_key: Distribution::find_address(dz_epoch).0, + payer_key: *payer_key, + } + } +} + +impl From for Vec { + fn from(accounts: FinalizeDistributionDebtAccounts) -> Self { + let FinalizeDistributionDebtAccounts { + program_config_key, + debt_accountant_key, + distribution_key, + payer_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new_readonly(debt_accountant_key, true), + AccountMeta::new(distribution_key, false), + AccountMeta::new(payer_key, true), + AccountMeta::new_readonly(system_program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ConfigureDistributionRewardsAccounts { + pub program_config_key: Pubkey, + pub rewards_accountant_key: Pubkey, + pub distribution_key: Pubkey, +} + +impl ConfigureDistributionRewardsAccounts { + pub fn new(rewards_accountant_key: &Pubkey, dz_epoch: DoubleZeroEpoch) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + rewards_accountant_key: *rewards_accountant_key, + distribution_key: Distribution::find_address(dz_epoch).0, + } + } +} + +impl From for Vec { + fn from(accounts: ConfigureDistributionRewardsAccounts) -> Self { + let ConfigureDistributionRewardsAccounts { + program_config_key, + rewards_accountant_key, + distribution_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new_readonly(rewards_accountant_key, true), + AccountMeta::new(distribution_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct FinalizeDistributionRewardsAccounts { + pub program_config_key: Pubkey, + pub distribution_key: Pubkey, + pub payer_key: Pubkey, +} + +impl FinalizeDistributionRewardsAccounts { + pub fn new(payer_key: &Pubkey, dz_epoch: DoubleZeroEpoch) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + distribution_key: Distribution::find_address(dz_epoch).0, + payer_key: *payer_key, + } + } +} + +impl From for Vec { + fn from(accounts: FinalizeDistributionRewardsAccounts) -> Self { + let FinalizeDistributionRewardsAccounts { + program_config_key, + distribution_key, + payer_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(distribution_key, false), + AccountMeta::new(payer_key, true), + AccountMeta::new_readonly(system_program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct DistributeRewardsAccounts { + pub program_config_key: Pubkey, + pub distribution_key: Pubkey, + pub contributor_rewards_key: Pubkey, + pub distribution_2z_token_pda_key: Pubkey, + pub dz_mint_key: Pubkey, + pub relayer_key: Pubkey, + pub recipient_ata_keys: Vec, +} + +impl DistributeRewardsAccounts { + pub fn new( + dz_epoch: DoubleZeroEpoch, + service_key: &Pubkey, + dz_mint_key: &Pubkey, + relayer_key: &Pubkey, + recipient_keys: &[&Pubkey], + ) -> Self { + let distribution_key = Distribution::find_address(dz_epoch).0; + let recipient_ata_keys = recipient_keys + .iter() + .map(|owner_key| get_associated_token_address(owner_key, dz_mint_key)) + .collect(); + + Self { + program_config_key: ProgramConfig::find_address().0, + distribution_key, + contributor_rewards_key: ContributorRewards::find_address(service_key).0, + distribution_2z_token_pda_key: find_2z_token_pda_address(&distribution_key).0, + dz_mint_key: *dz_mint_key, + relayer_key: *relayer_key, + recipient_ata_keys, + } + } +} + +impl From for Vec { + fn from(accounts: DistributeRewardsAccounts) -> Self { + let DistributeRewardsAccounts { + program_config_key, + distribution_key, + contributor_rewards_key, + distribution_2z_token_pda_key, + dz_mint_key, + relayer_key, + recipient_ata_keys, + } = accounts; + + let mut accounts = vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(distribution_key, false), + AccountMeta::new_readonly(contributor_rewards_key, false), + AccountMeta::new(distribution_2z_token_pda_key, false), + AccountMeta::new(dz_mint_key, false), + AccountMeta::new(relayer_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + ]; + + let recipient_ata_accounts = recipient_ata_keys + .into_iter() + .map(|key| AccountMeta::new(key, false)); + + accounts.extend(recipient_ata_accounts); + + accounts + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeContributorRewardsAccounts { + pub payer_key: Pubkey, + pub new_contributor_rewards_key: Pubkey, +} + +impl InitializeContributorRewardsAccounts { + pub fn new(payer_key: &Pubkey, service_key: &Pubkey) -> Self { + Self { + payer_key: *payer_key, + new_contributor_rewards_key: ContributorRewards::find_address(service_key).0, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeContributorRewardsAccounts) -> Self { + let InitializeContributorRewardsAccounts { + payer_key, + new_contributor_rewards_key, + } = accounts; + + vec![ + AccountMeta::new(payer_key, true), + AccountMeta::new(new_contributor_rewards_key, false), + AccountMeta::new_readonly(system_program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SetRewardsManagerAccounts { + pub program_config_key: Pubkey, + pub contributor_manager_key: Pubkey, + pub contributor_rewards_key: Pubkey, +} + +impl SetRewardsManagerAccounts { + pub fn new(contributor_manager_key: &Pubkey, service_key: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + contributor_manager_key: *contributor_manager_key, + contributor_rewards_key: ContributorRewards::find_address(service_key).0, + } + } +} + +impl From for Vec { + fn from(accounts: SetRewardsManagerAccounts) -> Self { + let SetRewardsManagerAccounts { + program_config_key, + contributor_manager_key, + contributor_rewards_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new_readonly(contributor_manager_key, true), + AccountMeta::new(contributor_rewards_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ConfigureContributorRewardsAccounts { + pub program_config_key: Pubkey, + pub contributor_rewards_key: Pubkey, + pub rewards_manager_key: Pubkey, +} + +impl ConfigureContributorRewardsAccounts { + pub fn new(rewards_manager_key: &Pubkey, service_key: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + contributor_rewards_key: ContributorRewards::find_address(service_key).0, + rewards_manager_key: *rewards_manager_key, + } + } +} + +impl From for Vec { + fn from(accounts: ConfigureContributorRewardsAccounts) -> Self { + let ConfigureContributorRewardsAccounts { + program_config_key, + contributor_rewards_key, + rewards_manager_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(contributor_rewards_key, false), + AccountMeta::new_readonly(rewards_manager_key, true), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct VerifyDistributionMerkleRootAccounts { + pub distribution_key: Pubkey, +} + +impl VerifyDistributionMerkleRootAccounts { + pub fn new(dz_epoch: DoubleZeroEpoch) -> Self { + Self { + distribution_key: Distribution::find_address(dz_epoch).0, + } + } +} + +impl From for Vec { + fn from(accounts: VerifyDistributionMerkleRootAccounts) -> Self { + let VerifyDistributionMerkleRootAccounts { distribution_key } = accounts; + + vec![AccountMeta::new_readonly(distribution_key, false)] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeSolanaValidatorDepositAccounts { + pub new_solana_validator_deposit_key: Pubkey, + pub payer_key: Pubkey, +} + +impl InitializeSolanaValidatorDepositAccounts { + pub fn new(payer_key: &Pubkey, node_id: &Pubkey) -> Self { + Self { + new_solana_validator_deposit_key: SolanaValidatorDeposit::find_address(node_id).0, + payer_key: *payer_key, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeSolanaValidatorDepositAccounts) -> Self { + let InitializeSolanaValidatorDepositAccounts { + new_solana_validator_deposit_key, + payer_key, + } = accounts; + + vec![ + AccountMeta::new(new_solana_validator_deposit_key, false), + AccountMeta::new(payer_key, true), + AccountMeta::new_readonly(system_program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct PaySolanaValidatorDebtAccounts { + pub program_config_key: Pubkey, + pub distribution_key: Pubkey, + pub solana_validator_deposit_key: Pubkey, + pub journal_key: Pubkey, +} + +impl PaySolanaValidatorDebtAccounts { + pub fn new(dz_epoch: DoubleZeroEpoch, node_id: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + distribution_key: Distribution::find_address(dz_epoch).0, + solana_validator_deposit_key: SolanaValidatorDeposit::find_address(node_id).0, + journal_key: Journal::find_address().0, + } + } +} + +impl From for Vec { + fn from(accounts: PaySolanaValidatorDebtAccounts) -> Self { + let PaySolanaValidatorDebtAccounts { + program_config_key, + distribution_key, + solana_validator_deposit_key, + journal_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(distribution_key, false), + AccountMeta::new(solana_validator_deposit_key, false), + AccountMeta::new(journal_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct EnableSolanaValidatorDebtWriteOffAccounts { + pub program_config_key: Pubkey, + pub distribution_key: Pubkey, + pub payer_key: Pubkey, +} + +impl EnableSolanaValidatorDebtWriteOffAccounts { + pub fn new(dz_epoch: DoubleZeroEpoch, payer_key: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + distribution_key: Distribution::find_address(dz_epoch).0, + payer_key: *payer_key, + } + } +} + +impl From for Vec { + fn from(accounts: EnableSolanaValidatorDebtWriteOffAccounts) -> Self { + let EnableSolanaValidatorDebtWriteOffAccounts { + program_config_key, + distribution_key, + payer_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(distribution_key, false), + AccountMeta::new(payer_key, true), + AccountMeta::new_readonly(system_program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct WriteOffSolanaValidatorDebtAccounts { + pub program_config_key: Pubkey, + pub debt_accountant_key: Pubkey, + pub distribution_key: Pubkey, + pub solana_validator_deposit_key: Pubkey, + pub write_off_distribution_key: Pubkey, +} + +impl WriteOffSolanaValidatorDebtAccounts { + pub fn new( + debt_accountant_key: &Pubkey, + dz_epoch: DoubleZeroEpoch, + node_id: &Pubkey, + write_off_dz_epoch: DoubleZeroEpoch, + ) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + debt_accountant_key: *debt_accountant_key, + distribution_key: Distribution::find_address(dz_epoch).0, + solana_validator_deposit_key: SolanaValidatorDeposit::find_address(node_id).0, + write_off_distribution_key: Distribution::find_address(write_off_dz_epoch).0, + } + } +} + +impl From for Vec { + fn from(accounts: WriteOffSolanaValidatorDebtAccounts) -> Self { + let WriteOffSolanaValidatorDebtAccounts { + program_config_key, + debt_accountant_key, + distribution_key, + solana_validator_deposit_key, + write_off_distribution_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new_readonly(debt_accountant_key, true), + AccountMeta::new(distribution_key, false), + AccountMeta::new(solana_validator_deposit_key, false), + AccountMeta::new(write_off_distribution_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeSwapDestinationAccounts { + pub program_config_key: Pubkey, + pub payer_key: Pubkey, + pub swap_authority_key: Pubkey, + pub new_swap_destination_key: Pubkey, + pub mint_key: Pubkey, +} + +impl InitializeSwapDestinationAccounts { + pub fn new(payer_key: &Pubkey, mint_key: &Pubkey) -> Self { + let swap_authority_key = find_swap_authority_address().0; + + Self { + program_config_key: ProgramConfig::find_address().0, + payer_key: *payer_key, + swap_authority_key, + new_swap_destination_key: find_2z_token_pda_address(&swap_authority_key).0, + mint_key: *mint_key, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeSwapDestinationAccounts) -> Self { + let InitializeSwapDestinationAccounts { + program_config_key, + payer_key, + swap_authority_key, + new_swap_destination_key, + mint_key, + } = accounts; + + vec![ + AccountMeta::new(program_config_key, false), + AccountMeta::new(payer_key, true), + AccountMeta::new_readonly(swap_authority_key, false), + AccountMeta::new(new_swap_destination_key, false), + AccountMeta::new_readonly(mint_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + AccountMeta::new_readonly(system_program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct DequeueFillsCpiAccounts { + pub configuration_registry_key: Pubkey, + pub program_state_key: Pubkey, + pub fills_registry_key: Pubkey, + pub journal_key: Pubkey, + pub sol_2z_swap_program_id: Option, +} + +impl DequeueFillsCpiAccounts { + pub fn new(sol_2z_swap_program_id: &Pubkey, fills_registery_key: &Pubkey) -> Self { + Self { + configuration_registry_key: Pubkey::find_program_address( + &[b"system_config"], + sol_2z_swap_program_id, + ) + .0, + program_state_key: Pubkey::find_program_address(&[b"state"], sol_2z_swap_program_id).0, + fills_registry_key: *fills_registery_key, + journal_key: Journal::find_address().0, + sol_2z_swap_program_id: Some(*sol_2z_swap_program_id), + } + } +} + +impl From for Vec { + fn from(accounts: DequeueFillsCpiAccounts) -> Self { + let DequeueFillsCpiAccounts { + configuration_registry_key, + program_state_key, + fills_registry_key, + journal_key, + sol_2z_swap_program_id: _, + } = accounts; + + vec![ + AccountMeta::new_readonly(configuration_registry_key, false), + AccountMeta::new_readonly(program_state_key, false), + AccountMeta::new(fills_registry_key, false), + AccountMeta::new_readonly(journal_key, true), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SweepDistributionTokensAccounts { + pub program_config_key: Pubkey, + pub distribution_key: Pubkey, + pub journal_key: Pubkey, + pub dequeue_fills_cpi_keys: DequeueFillsCpiAccounts, + pub distribution_2z_token_pda_key: Pubkey, + pub swap_authority_key: Pubkey, + pub swap_2z_token_pda_key: Pubkey, +} + +impl SweepDistributionTokensAccounts { + pub fn new( + dz_epoch: DoubleZeroEpoch, + sol_2z_swap_program_id: &Pubkey, + sol_2z_swap_fills_registry_key: &Pubkey, + ) -> Self { + let distribution_key = Distribution::find_address(dz_epoch).0; + let swap_authority_key = find_swap_authority_address().0; + + let dequeue_fills_cpi_keys = + DequeueFillsCpiAccounts::new(sol_2z_swap_program_id, sol_2z_swap_fills_registry_key); + + Self { + program_config_key: ProgramConfig::find_address().0, + distribution_key, + journal_key: Journal::find_address().0, + dequeue_fills_cpi_keys, + distribution_2z_token_pda_key: find_2z_token_pda_address(&distribution_key).0, + swap_authority_key, + swap_2z_token_pda_key: find_2z_token_pda_address(&swap_authority_key).0, + } + } +} + +impl From for Vec { + fn from(accounts: SweepDistributionTokensAccounts) -> Self { + let SweepDistributionTokensAccounts { + program_config_key, + distribution_key, + journal_key, + dequeue_fills_cpi_keys, + distribution_2z_token_pda_key, + swap_authority_key, + swap_2z_token_pda_key, + } = accounts; + + // This method assumes that the dequeue fills CPI accounts were created + // using the `new` method, so this unwrap could fail if the struct were + // created by populating its members directly and the SOL/2Z Swap + // program ID was not provided. + let sol_2z_swap_program_id = dequeue_fills_cpi_keys.sol_2z_swap_program_id.unwrap(); + + let mut dequeue_fills_cpi_accounts = Vec::from(dequeue_fills_cpi_keys); + + // Drop the journal account from the dequeue fills CPI accounts. + dequeue_fills_cpi_accounts.pop().unwrap(); + + let sol_2z_swap_fills_registry_account_meta = dequeue_fills_cpi_accounts.pop().unwrap(); + let sol_2z_swap_program_state_account_meta = dequeue_fills_cpi_accounts.pop().unwrap(); + let sol_2z_swap_configuration_registry_account_meta = + dequeue_fills_cpi_accounts.pop().unwrap(); + debug_assert!(dequeue_fills_cpi_accounts.is_empty()); + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(distribution_key, false), + AccountMeta::new(journal_key, false), + sol_2z_swap_configuration_registry_account_meta, + sol_2z_swap_program_state_account_meta, + sol_2z_swap_fills_registry_account_meta, + AccountMeta::new_readonly(sol_2z_swap_program_id, false), + AccountMeta::new(distribution_2z_token_pda_key, false), + AccountMeta::new_readonly(swap_authority_key, false), + AccountMeta::new(swap_2z_token_pda_key, false), + AccountMeta::new_readonly(spl_token_interface::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct WithdrawSolAccounts { + pub program_config_key: Pubkey, + pub withdraw_sol_authority_key: Pubkey, + pub journal_key: Pubkey, + pub sol_destination_key: Pubkey, +} + +impl WithdrawSolAccounts { + /// NOTE: The swap program should not use this method when invoking the + /// withdraw SOL instruction because the find program address calls cost + /// 1,500 CU per bump iteration. It is recommended to instantiate the + /// struct by defining its members directly. Please only use this method + /// for testing purposes. + pub fn new(sol_2z_swap_program_id: &Pubkey, sol_destination_key: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + withdraw_sol_authority_key: find_withdraw_sol_authority_address(sol_2z_swap_program_id) + .0, + journal_key: Journal::find_address().0, + sol_destination_key: *sol_destination_key, + } + } +} + +impl From for Vec { + fn from(accounts: WithdrawSolAccounts) -> Self { + let WithdrawSolAccounts { + program_config_key, + withdraw_sol_authority_key, + journal_key, + sol_destination_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new_readonly(withdraw_sol_authority_key, true), + AccountMeta::new(journal_key, false), + AccountMeta::new(sol_destination_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SetDistributionEconomicBurnRateAccounts { + pub program_config_key: Pubkey, + pub rewards_accountant_key: Pubkey, + pub distribution_key: Pubkey, +} + +impl SetDistributionEconomicBurnRateAccounts { + pub fn new(rewards_accountant_key: &Pubkey, dz_epoch: DoubleZeroEpoch) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + rewards_accountant_key: *rewards_accountant_key, + distribution_key: Distribution::find_address(dz_epoch).0, + } + } +} + +impl From for Vec { + fn from(accounts: SetDistributionEconomicBurnRateAccounts) -> Self { + let SetDistributionEconomicBurnRateAccounts { + program_config_key, + rewards_accountant_key, + distribution_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new_readonly(rewards_accountant_key, true), + AccountMeta::new(distribution_key, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct WithdrawSolanaValidatorDepositAccounts { + pub program_config_key: Pubkey, + pub solana_validator_deposit_key: Pubkey, + pub validator_node_key: Pubkey, + pub beneficiary_key: Option, +} + +impl WithdrawSolanaValidatorDepositAccounts { + pub fn new(node_id: &Pubkey, beneficiary_key: Option<&Pubkey>) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + solana_validator_deposit_key: SolanaValidatorDeposit::find_address(node_id).0, + validator_node_key: *node_id, + beneficiary_key: beneficiary_key.copied(), + } + } +} + +impl From for Vec { + fn from(accounts: WithdrawSolanaValidatorDepositAccounts) -> Self { + let WithdrawSolanaValidatorDepositAccounts { + program_config_key, + solana_validator_deposit_key, + validator_node_key, + beneficiary_key, + } = accounts; + + let mut account_metas = vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(solana_validator_deposit_key, false), + ]; + + if let Some(beneficiary_key) = beneficiary_key { + account_metas.push(AccountMeta::new_readonly(validator_node_key, true)); + account_metas.push(AccountMeta::new(beneficiary_key, false)); + } else { + account_metas.push(AccountMeta::new(validator_node_key, false)); + } + + account_metas + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InitializeRewardsIntegrationAccounts { + pub program_config_key: Pubkey, + pub admin_key: Pubkey, + pub payer_key: Pubkey, + pub new_rewards_integration_key: Pubkey, + pub integration_program_key: Pubkey, + pub journal_key: Pubkey, +} + +impl InitializeRewardsIntegrationAccounts { + pub fn new(admin_key: &Pubkey, payer_key: &Pubkey, integration_program_id: &Pubkey) -> Self { + Self { + program_config_key: ProgramConfig::find_address().0, + admin_key: *admin_key, + payer_key: *payer_key, + new_rewards_integration_key: RewardsIntegration::find_address(integration_program_id).0, + integration_program_key: *integration_program_id, + journal_key: Journal::find_address().0, + } + } +} + +impl From for Vec { + fn from(accounts: InitializeRewardsIntegrationAccounts) -> Self { + let InitializeRewardsIntegrationAccounts { + program_config_key, + admin_key, + payer_key, + new_rewards_integration_key, + integration_program_key, + journal_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new_readonly(admin_key, true), + AccountMeta::new_readonly(integration_program_key, false), + AccountMeta::new(payer_key, true), + AccountMeta::new(new_rewards_integration_key, false), + AccountMeta::new(journal_key, false), + AccountMeta::new_readonly(system_program::ID, false), + ] + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CollectIntegrationRewardsAccounts { + pub program_config_key: Pubkey, + pub distribution_key: Pubkey, + pub rewards_integration_key: Pubkey, + pub integration_distribution_key: Pubkey, + pub integration_2z_bucket_key: Pubkey, + pub destination_token_account_key: Pubkey, + pub integration_program_key: Pubkey, + pub token_program_key: Pubkey, +} + +impl CollectIntegrationRewardsAccounts { + pub fn new( + dz_epoch: DoubleZeroEpoch, + integration_program_id: &Pubkey, + integration_distribution_key: &Pubkey, + integration_2z_bucket_key: &Pubkey, + ) -> Self { + let distribution_key = Distribution::find_address(dz_epoch).0; + + Self { + program_config_key: ProgramConfig::find_address().0, + distribution_key, + rewards_integration_key: RewardsIntegration::find_address(integration_program_id).0, + integration_distribution_key: *integration_distribution_key, + integration_2z_bucket_key: *integration_2z_bucket_key, + destination_token_account_key: find_2z_token_pda_address(&distribution_key).0, + integration_program_key: *integration_program_id, + token_program_key: spl_token_interface::ID, + } + } +} + +impl From for Vec { + fn from(accounts: CollectIntegrationRewardsAccounts) -> Self { + let CollectIntegrationRewardsAccounts { + program_config_key, + distribution_key, + rewards_integration_key, + integration_distribution_key, + integration_2z_bucket_key, + destination_token_account_key, + integration_program_key, + token_program_key, + } = accounts; + + vec![ + AccountMeta::new_readonly(program_config_key, false), + AccountMeta::new(distribution_key, false), + AccountMeta::new_readonly(rewards_integration_key, false), + AccountMeta::new(integration_distribution_key, false), + AccountMeta::new(integration_2z_bucket_key, false), + AccountMeta::new(destination_token_account_key, false), + AccountMeta::new_readonly(integration_program_key, false), + AccountMeta::new_readonly(token_program_key, false), + ] + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_from_sweep_distribution_tokens() { + let accounts = SweepDistributionTokensAccounts::new( + DoubleZeroEpoch::new(69), + &Pubkey::new_unique(), + &Pubkey::new_unique(), + ); + + // Debug assert should not panic. + let accounts = Vec::from(accounts); + assert_eq!(accounts.len(), 11); + } +} diff --git a/solana/programs/revenue-distribution/src/instruction/mod.rs b/solana/programs/revenue-distribution/src/instruction/mod.rs new file mode 100644 index 0000000000..9c6059d108 --- /dev/null +++ b/solana/programs/revenue-distribution/src/instruction/mod.rs @@ -0,0 +1,390 @@ +pub mod account; + +// + +use std::io; + +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_tools::{Discriminator, DISCRIMINATOR_LEN}; +use solana_pubkey::Pubkey; +use svm_hash::{merkle::MerkleProof, sha2::Hash}; + +use crate::types::{DoubleZeroEpoch, EpochDuration, RewardShare, SolanaValidatorDebt}; + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)] +pub enum ProgramConfiguration { + Flag(ProgramFlagConfiguration), + DebtAccountant(Pubkey), + RewardsAccountant(Pubkey), + ContributorManager(Pubkey), + PlaceholderKey(Pubkey), + Sol2zSwapProgram(Pubkey), + SolanaValidatorFeeParameters { + base_block_rewards_pct: u16, + priority_block_rewards_pct: u16, + inflation_rewards_pct: u16, + jito_tips_pct: u16, + fixed_sol_amount: u32, + _unused: [u8; 28], + }, + CalculationGracePeriodMinutes(u16), + CommunityBurnRateParameters { + limit: u32, + dz_epochs_to_increasing: EpochDuration, + dz_epochs_to_limit: EpochDuration, + initial_rate: Option, + }, + PlaceholderRelayLamports(u32), + DistributeRewardsRelayLamports(u32), + MinimumEpochDurationToFinalizeRewards(u8), + DistributionInitializationGracePeriodMinutes(u16), + FeatureActivation { + feature: ProgramFeatureConfiguration, + activation_epoch: DoubleZeroEpoch, + }, +} + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)] +pub enum ProgramFlagConfiguration { + IsPaused(bool), +} + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, Copy, PartialEq, Eq)] +pub enum ProgramFeatureConfiguration { + SolanaValidatorDebtWriteOff, +} + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)] +pub enum ContributorRewardsConfiguration { + Recipients(Vec<(Pubkey, u16)>), + IsSetRewardsManagerBlocked(bool), +} + +#[derive(Debug, BorshDeserialize, BorshSerialize, Clone, PartialEq, Eq)] +pub enum DistributionMerkleRootKind { + SolanaValidatorDebt(SolanaValidatorDebt), + RewardShare(RewardShare), +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum RevenueDistributionInstructionData { + InitializeProgram, + MigrateProgramAccounts, + SetAdmin(Pubkey), + ConfigureProgram(ProgramConfiguration), + InitializeJournal, + InitializeDistribution, + ConfigureDistributionDebt { + total_validators: u32, + total_debt: u64, + merkle_root: Hash, + }, + FinalizeDistributionDebt, + ConfigureDistributionRewards { + total_contributors: u32, + merkle_root: Hash, + }, + FinalizeDistributionRewards, + DistributeRewards { + unit_share: u32, + economic_burn_rate: u32, + proof: MerkleProof, + }, + InitializeContributorRewards(Pubkey), + SetRewardsManager(Pubkey), + ConfigureContributorRewards(ContributorRewardsConfiguration), + VerifyDistributionMerkleRoot { + kind: DistributionMerkleRootKind, + proof: MerkleProof, + }, + InitializeSolanaValidatorDeposit(Pubkey), + PaySolanaValidatorDebt { + amount: u64, + proof: MerkleProof, + }, + EnableSolanaValidatorDebtWriteOff, + WriteOffSolanaValidatorDebt { + amount: u64, + proof: MerkleProof, + }, + InitializeSwapDestination, + SweepDistributionTokens, + WithdrawSol(u64), + SetDistributionEconomicBurnRate(u32), + WithdrawSolanaValidatorDeposit, + + /// Only the admin can register a program as a rewards integration. The + /// integration program account must be passed in and must be executable. + /// This creates a `RewardsIntegration` PDA that stores the integration's + /// program ID. Registration is a prerequisite for that program to drive + /// `DistributeIntegrationRewards`. + InitializeRewardsIntegration, + + /// CPIs into a whitelisted integration's `WithdrawIntegrationRewards` + /// handler and credits the transferred 2Z into the current epoch's + /// `Distribution`. The target integration is identified by the passed + /// `RewardsIntegration` PDA; rev-distr signs the `Distribution` PDA so + /// the integration can verify the caller. + CollectIntegrationRewards, +} + +impl RevenueDistributionInstructionData { + pub const INITIALIZE_PROGRAM: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_program"); + pub const MIGRATE_PROGRAM_ACCOUNTS: Discriminator = + Discriminator::new_sha2(b"dz::ix::migrate_program_accounts"); + pub const SET_ADMIN: Discriminator = + Discriminator::new_sha2(b"dz::ix::set_admin"); + pub const CONFIGURE_PROGRAM: Discriminator = + Discriminator::new_sha2(b"dz::ix::configure_program"); + pub const INITIALIZE_JOURNAL: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_journal"); + pub const INITIALIZE_DISTRIBUTION: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_distribution"); + pub const CONFIGURE_DISTRIBUTION_DEBT: Discriminator = + Discriminator::new_sha2(b"dz::ix::configure_distribution_debt"); + pub const FINALIZE_DISTRIBUTION_DEBT: Discriminator = + Discriminator::new_sha2(b"dz::ix::finalize_distribution_debt"); + pub const CONFIGURE_DISTRIBUTION_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::ix::configure_distribution_rewards"); + pub const FINALIZE_DISTRIBUTION_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::ix::finalize_distribution_rewards"); + pub const DISTRIBUTE_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::ix::distribute_rewards"); + pub const INITIALIZE_CONTRIBUTOR_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_contributor_rewards"); + pub const SET_REWARDS_MANAGER: Discriminator = + Discriminator::new_sha2(b"dz::ix::set_rewards_manager"); + pub const CONFIGURE_CONTRIBUTOR_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::ix::configure_contributor_rewards"); + pub const VERIFY_DISTRIBUTION_MERKLE_ROOT: Discriminator = + Discriminator::new_sha2(b"dz::ix::verify_distribution_merkle_root"); + pub const INITIALIZE_SOLANA_VALIDATOR_DEPOSIT: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_solana_validator_deposit"); + pub const PAY_SOLANA_VALIDATOR_DEBT: Discriminator = + Discriminator::new_sha2(b"dz::ix::pay_solana_validator_debt"); + pub const ENABLE_SOLANA_VALIDATOR_DEBT_WRITE_OFF: Discriminator = + Discriminator::new_sha2(b"dz::ix::enable_solana_validator_debt_write_off"); + pub const WRITE_OFF_SOLANA_VALIDATOR_DEBT: Discriminator = + Discriminator::new_sha2(b"dz::ix::write_off_solana_validator_debt"); + pub const INITIALIZE_SWAP_DESTINATION: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_swap_destination"); + pub const WITHDRAW_SOL: Discriminator = + Discriminator::new_sha2(b"dz::ix::withdraw_sol"); + pub const SET_DISTRIBUTION_ECONOMIC_BURN_RATE: Discriminator = + Discriminator::new_sha2(b"dz::ix::set_distribution_economic_burn_rate"); + pub const WITHDRAW_SOLANA_VALIDATOR_DEPOSIT: Discriminator = + Discriminator::new_sha2(b"dz::ix::withdraw_solana_validator_deposit"); + pub const INITIALIZE_REWARDS_INTEGRATION: Discriminator = + Discriminator::new_sha2(b"dz::ix::initialize_rewards_integration"); + pub const COLLECT_INTEGRATION_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::ix::collect_integration_rewards"); + + // + // Versioned instruction selectors. + // + + pub const SWEEP_DISTRIBUTION_TOKENS_V1: Discriminator = + Discriminator::new_sha2(b"dz::ix::sweep_distribution_tokens::v1"); +} + +impl BorshDeserialize for RevenueDistributionInstructionData { + fn deserialize_reader(reader: &mut R) -> std::io::Result { + match Discriminator::deserialize_reader(reader)? { + Self::INITIALIZE_PROGRAM => Ok(Self::InitializeProgram), + Self::MIGRATE_PROGRAM_ACCOUNTS => Ok(Self::MigrateProgramAccounts), + Self::SET_ADMIN => BorshDeserialize::deserialize_reader(reader).map(Self::SetAdmin), + Self::CONFIGURE_PROGRAM => { + BorshDeserialize::deserialize_reader(reader).map(Self::ConfigureProgram) + } + Self::INITIALIZE_JOURNAL => Ok(Self::InitializeJournal), + Self::INITIALIZE_DISTRIBUTION => Ok(Self::InitializeDistribution), + Self::CONFIGURE_DISTRIBUTION_DEBT => { + let total_validators = BorshDeserialize::deserialize_reader(reader)?; + let total_debt = BorshDeserialize::deserialize_reader(reader)?; + let merkle_root = BorshDeserialize::deserialize_reader(reader)?; + + Ok(Self::ConfigureDistributionDebt { + total_validators, + total_debt, + merkle_root, + }) + } + Self::FINALIZE_DISTRIBUTION_DEBT => Ok(Self::FinalizeDistributionDebt), + Self::CONFIGURE_DISTRIBUTION_REWARDS => { + let total_contributors = BorshDeserialize::deserialize_reader(reader)?; + let merkle_root = BorshDeserialize::deserialize_reader(reader)?; + + Ok(Self::ConfigureDistributionRewards { + total_contributors, + merkle_root, + }) + } + Self::FINALIZE_DISTRIBUTION_REWARDS => Ok(Self::FinalizeDistributionRewards), + Self::DISTRIBUTE_REWARDS => { + let unit_share = BorshDeserialize::deserialize_reader(reader)?; + let economic_burn_rate = BorshDeserialize::deserialize_reader(reader)?; + let proof = BorshDeserialize::deserialize_reader(reader)?; + + Ok(Self::DistributeRewards { + unit_share, + economic_burn_rate, + proof, + }) + } + Self::INITIALIZE_CONTRIBUTOR_REWARDS => { + BorshDeserialize::deserialize_reader(reader).map(Self::InitializeContributorRewards) + } + Self::SET_REWARDS_MANAGER => { + BorshDeserialize::deserialize_reader(reader).map(Self::SetRewardsManager) + } + Self::CONFIGURE_CONTRIBUTOR_REWARDS => { + ContributorRewardsConfiguration::deserialize_reader(reader) + .map(Self::ConfigureContributorRewards) + } + Self::VERIFY_DISTRIBUTION_MERKLE_ROOT => { + let kind = BorshDeserialize::deserialize_reader(reader)?; + let proof = BorshDeserialize::deserialize_reader(reader)?; + + Ok(Self::VerifyDistributionMerkleRoot { kind, proof }) + } + Self::INITIALIZE_SOLANA_VALIDATOR_DEPOSIT => { + BorshDeserialize::deserialize_reader(reader) + .map(Self::InitializeSolanaValidatorDeposit) + } + Self::PAY_SOLANA_VALIDATOR_DEBT => { + let amount = BorshDeserialize::deserialize_reader(reader)?; + let proof = BorshDeserialize::deserialize_reader(reader)?; + + Ok(Self::PaySolanaValidatorDebt { amount, proof }) + } + Self::ENABLE_SOLANA_VALIDATOR_DEBT_WRITE_OFF => { + Ok(Self::EnableSolanaValidatorDebtWriteOff) + } + Self::WRITE_OFF_SOLANA_VALIDATOR_DEBT => { + let amount = BorshDeserialize::deserialize_reader(reader)?; + let proof = BorshDeserialize::deserialize_reader(reader)?; + + Ok(Self::WriteOffSolanaValidatorDebt { amount, proof }) + } + Self::INITIALIZE_SWAP_DESTINATION => Ok(Self::InitializeSwapDestination), + Self::SWEEP_DISTRIBUTION_TOKENS_V1 => Ok(Self::SweepDistributionTokens), + Self::WITHDRAW_SOL => { + BorshDeserialize::deserialize_reader(reader).map(Self::WithdrawSol) + } + Self::SET_DISTRIBUTION_ECONOMIC_BURN_RATE => { + BorshDeserialize::deserialize_reader(reader) + .map(Self::SetDistributionEconomicBurnRate) + } + Self::WITHDRAW_SOLANA_VALIDATOR_DEPOSIT => Ok(Self::WithdrawSolanaValidatorDeposit), + Self::INITIALIZE_REWARDS_INTEGRATION => Ok(Self::InitializeRewardsIntegration), + Self::COLLECT_INTEGRATION_REWARDS => Ok(Self::CollectIntegrationRewards), + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid discriminator", + )), + } + } +} + +impl BorshSerialize for RevenueDistributionInstructionData { + fn serialize(&self, writer: &mut W) -> io::Result<()> { + match self { + Self::InitializeProgram => Self::INITIALIZE_PROGRAM.serialize(writer), + Self::MigrateProgramAccounts => Self::MIGRATE_PROGRAM_ACCOUNTS.serialize(writer), + Self::SetAdmin(admin_key) => { + Self::SET_ADMIN.serialize(writer)?; + admin_key.serialize(writer) + } + Self::ConfigureProgram(setting) => { + Self::CONFIGURE_PROGRAM.serialize(writer)?; + setting.serialize(writer) + } + Self::InitializeJournal => Self::INITIALIZE_JOURNAL.serialize(writer), + Self::InitializeDistribution => Self::INITIALIZE_DISTRIBUTION.serialize(writer), + Self::ConfigureDistributionDebt { + total_validators, + total_debt, + merkle_root, + } => { + Self::CONFIGURE_DISTRIBUTION_DEBT.serialize(writer)?; + total_validators.serialize(writer)?; + total_debt.serialize(writer)?; + merkle_root.serialize(writer) + } + Self::FinalizeDistributionDebt => Self::FINALIZE_DISTRIBUTION_DEBT.serialize(writer), + Self::ConfigureDistributionRewards { + total_contributors, + merkle_root, + } => { + Self::CONFIGURE_DISTRIBUTION_REWARDS.serialize(writer)?; + total_contributors.serialize(writer)?; + merkle_root.serialize(writer) + } + Self::FinalizeDistributionRewards => { + Self::FINALIZE_DISTRIBUTION_REWARDS.serialize(writer) + } + Self::DistributeRewards { + unit_share, + economic_burn_rate, + proof, + } => { + Self::DISTRIBUTE_REWARDS.serialize(writer)?; + unit_share.serialize(writer)?; + economic_burn_rate.serialize(writer)?; + proof.serialize(writer) + } + Self::InitializeContributorRewards(service_key) => { + Self::INITIALIZE_CONTRIBUTOR_REWARDS.serialize(writer)?; + service_key.serialize(writer) + } + Self::SetRewardsManager(rewards_manager_key) => { + Self::SET_REWARDS_MANAGER.serialize(writer)?; + rewards_manager_key.serialize(writer) + } + Self::ConfigureContributorRewards(setting) => { + Self::CONFIGURE_CONTRIBUTOR_REWARDS.serialize(writer)?; + setting.serialize(writer) + } + Self::VerifyDistributionMerkleRoot { kind, proof } => { + Self::VERIFY_DISTRIBUTION_MERKLE_ROOT.serialize(writer)?; + kind.serialize(writer)?; + proof.serialize(writer) + } + Self::InitializeSolanaValidatorDeposit(solana_validator_deposit_key) => { + Self::INITIALIZE_SOLANA_VALIDATOR_DEPOSIT.serialize(writer)?; + solana_validator_deposit_key.serialize(writer) + } + Self::PaySolanaValidatorDebt { amount, proof } => { + Self::PAY_SOLANA_VALIDATOR_DEBT.serialize(writer)?; + amount.serialize(writer)?; + proof.serialize(writer) + } + Self::EnableSolanaValidatorDebtWriteOff => { + Self::ENABLE_SOLANA_VALIDATOR_DEBT_WRITE_OFF.serialize(writer) + } + Self::WriteOffSolanaValidatorDebt { amount, proof } => { + Self::WRITE_OFF_SOLANA_VALIDATOR_DEBT.serialize(writer)?; + amount.serialize(writer)?; + proof.serialize(writer) + } + Self::InitializeSwapDestination => Self::INITIALIZE_SWAP_DESTINATION.serialize(writer), + Self::SweepDistributionTokens => Self::SWEEP_DISTRIBUTION_TOKENS_V1.serialize(writer), + Self::WithdrawSol(amount) => { + Self::WITHDRAW_SOL.serialize(writer)?; + amount.serialize(writer) + } + Self::SetDistributionEconomicBurnRate(burn_rate_value) => { + Self::SET_DISTRIBUTION_ECONOMIC_BURN_RATE.serialize(writer)?; + burn_rate_value.serialize(writer) + } + Self::WithdrawSolanaValidatorDeposit => { + Self::WITHDRAW_SOLANA_VALIDATOR_DEPOSIT.serialize(writer) + } + Self::InitializeRewardsIntegration => { + Self::INITIALIZE_REWARDS_INTEGRATION.serialize(writer) + } + Self::CollectIntegrationRewards => Self::COLLECT_INTEGRATION_REWARDS.serialize(writer), + } + } +} diff --git a/solana/programs/revenue-distribution/src/integration.rs b/solana/programs/revenue-distribution/src/integration.rs new file mode 100644 index 0000000000..902b660567 --- /dev/null +++ b/solana/programs/revenue-distribution/src/integration.rs @@ -0,0 +1,256 @@ +use std::io; + +use borsh::{BorshDeserialize, BorshSerialize}; +use doublezero_program_tools::{ + account_info::{ + try_next_enumerated_account, EnumeratedAccountInfoIter, NextAccountOptions, TryNextAccounts, + }, + zero_copy::ZeroCopyAccount, + Discriminator, DISCRIMINATOR_LEN, +}; +use solana_account_info::AccountInfo; +use solana_instruction::AccountMeta; +use solana_msg::msg; +use solana_program_error::ProgramError; +use solana_program_pack::Pack; +use solana_pubkey::Pubkey; + +use crate::state::Distribution; + +/// Seed prefix every integration program must use for its per-epoch +/// "integration distribution" PDA (seeded as `[PREFIX, dz_epoch.as_seed()]`). +pub const INTEGRATION_DISTRIBUTION_SEED_PREFIX: &[u8] = b"integration_distribution"; + +/// Derivation of an integration's per-epoch distribution PDA. +pub fn find_integration_distribution_address( + integration_program_id: &Pubkey, + dz_epoch: crate::types::DoubleZeroEpoch, +) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[INTEGRATION_DISTRIBUTION_SEED_PREFIX, &dz_epoch.as_seed()], + integration_program_id, + ) +} + +/// Derivation of an integration's 2Z bucket PDA. +pub fn find_integration_bucket_address( + integration_program_id: &Pubkey, + integration_distribution_key: &Pubkey, +) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + crate::state::TOKEN_2Z_PDA_SEED_PREFIX, + integration_distribution_key.as_ref(), + ], + integration_program_id, + ) +} + +/// Instructions rev-distr CPIs integration programs with. Integration +/// programs deserialize this before their own instruction enum. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum IntegrationInstructionData { + /// Transfer the epoch's contributor-share 2Z from the integration's + /// bucket to the destination. See [`WithdrawIntegrationRewardsAccounts`] + /// for the account list. + /// + /// Admins must register the integration (via + /// `InitializeRewardsIntegration`) **before** the target `Distribution` + /// is initialized. Each `Distribution` snapshots the registry count at + /// creation, so late-registered integrations are skipped for that epoch + /// and any revenue they've already accumulated for it stays with the + /// integration. + WithdrawIntegrationRewards, +} + +impl IntegrationInstructionData { + pub const WITHDRAW_INTEGRATION_REWARDS: Discriminator = + Discriminator::new_sha2(b"dz::integration_ix::withdraw_integration_rewards"); +} + +impl BorshDeserialize for IntegrationInstructionData { + fn deserialize_reader(reader: &mut R) -> io::Result { + match Discriminator::deserialize_reader(reader)? { + Self::WITHDRAW_INTEGRATION_REWARDS => Ok(Self::WithdrawIntegrationRewards), + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid discriminator", + )), + } + } +} + +impl BorshSerialize for IntegrationInstructionData { + fn serialize(&self, writer: &mut W) -> io::Result<()> { + match self { + Self::WithdrawIntegrationRewards => { + Self::WITHDRAW_INTEGRATION_REWARDS.serialize(writer) + } + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct WithdrawIntegrationRewardsAccounts { + pub integration_distribution_key: Pubkey, + pub integration_2z_bucket_key: Pubkey, + pub destination_token_account_key: Pubkey, + pub parent_distribution_key: Pubkey, +} + +impl From for Vec { + fn from(accounts: WithdrawIntegrationRewardsAccounts) -> Self { + let WithdrawIntegrationRewardsAccounts { + integration_distribution_key, + integration_2z_bucket_key, + destination_token_account_key, + parent_distribution_key, + } = accounts; + + vec![ + AccountMeta::new(integration_distribution_key, false), + AccountMeta::new(integration_2z_bucket_key, false), + AccountMeta::new(destination_token_account_key, false), + AccountMeta::new_readonly(parent_distribution_key, true), + AccountMeta::new_readonly(spl_token_interface::ID, false), + ] + } +} + +/// Handler-side view of [`WithdrawIntegrationRewardsAccounts`]. Integration +/// programs peel this out of their `accounts_iter` in one call, which +/// enforces the slot ordering, contract-level writable/signer flags, that +/// the parent `Distribution`'s `dz_epoch` matches the integration's local +/// epoch, and that the destination token account's authority is the parent +/// `Distribution` (so the bucket can only flow back to a token account the +/// parent controls). +pub struct WithdrawIntegrationRewardsHandlerAccounts<'a, 'b> { + pub integration_distribution_info: (usize, &'a AccountInfo<'b>), + pub integration_2z_bucket_info: (usize, &'a AccountInfo<'b>), + pub destination_token_account_info: (usize, &'a AccountInfo<'b>), + pub parent_distribution: ZeroCopyAccount<'a, 'b, Distribution>, +} + +impl<'a, 'b> TryNextAccounts<'a, 'b, crate::types::DoubleZeroEpoch> + for WithdrawIntegrationRewardsHandlerAccounts<'a, 'b> +{ + fn try_next_accounts( + accounts_iter: &mut EnumeratedAccountInfoIter<'a, 'b>, + integration_dz_epoch: crate::types::DoubleZeroEpoch, + ) -> Result { + let integration_distribution_info = try_next_enumerated_account( + accounts_iter, + NextAccountOptions { + must_be_writable: true, + ..Default::default() + }, + )?; + let integration_2z_bucket_info = try_next_enumerated_account( + accounts_iter, + NextAccountOptions { + must_be_writable: true, + ..Default::default() + }, + )?; + let destination_token_account_info = try_next_enumerated_account( + accounts_iter, + NextAccountOptions { + must_be_writable: true, + ..Default::default() + }, + )?; + let parent_distribution = + ZeroCopyAccount::::try_next_accounts(accounts_iter, Some(&crate::ID))?; + if !parent_distribution.info.is_signer { + msg!("Account {} must be signer", parent_distribution.index); + return Err(ProgramError::MissingRequiredSignature); + } + if parent_distribution.dz_epoch != integration_dz_epoch { + msg!( + "DZ epoch mismatch: integration={}, parent={}", + integration_dz_epoch, + parent_distribution.dz_epoch, + ); + return Err(ProgramError::InvalidAccountData); + } + + let destination_token_account = spl_token_interface::state::Account::unpack( + &destination_token_account_info.1.data.borrow()[..], + )?; + if destination_token_account.owner != *parent_distribution.info.key { + msg!( + "Destination token account (account {}) authority must be parent distribution", + destination_token_account_info.0, + ); + return Err(ProgramError::InvalidAccountData); + } + + Ok(Self { + integration_distribution_info, + integration_2z_bucket_info, + destination_token_account_info, + parent_distribution, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn withdraw_integration_rewards_borsh_roundtrip() { + let ix = IntegrationInstructionData::WithdrawIntegrationRewards; + + let serialized = borsh::to_vec(&ix).unwrap(); + let deserialized = IntegrationInstructionData::try_from_slice(&serialized).unwrap(); + assert_eq!(deserialized, ix); + } + + #[test] + fn withdraw_integration_rewards_discriminator_is_stable() { + let serialized = + borsh::to_vec(&IntegrationInstructionData::WithdrawIntegrationRewards).unwrap(); + let expected = + borsh::to_vec(&IntegrationInstructionData::WITHDRAW_INTEGRATION_REWARDS).unwrap(); + assert_eq!(serialized, expected); + assert_eq!(serialized.len(), DISCRIMINATOR_LEN); + } + + #[test] + fn withdraw_integration_rewards_accounts_into_meta_preserves_order_and_flags() { + let accounts = WithdrawIntegrationRewardsAccounts { + integration_distribution_key: Pubkey::new_unique(), + integration_2z_bucket_key: Pubkey::new_unique(), + destination_token_account_key: Pubkey::new_unique(), + parent_distribution_key: Pubkey::new_unique(), + }; + let keys = [ + accounts.integration_distribution_key, + accounts.integration_2z_bucket_key, + accounts.destination_token_account_key, + accounts.parent_distribution_key, + spl_token_interface::ID, + ]; + + let metas: Vec = accounts.into(); + assert_eq!(metas.len(), 5); + for (i, meta) in metas.iter().enumerate() { + assert_eq!(meta.pubkey, keys[i]); + } + + // Slots 0-2 are writable, not signers. + for meta in &metas[..3] { + assert!(meta.is_writable); + assert!(!meta.is_signer); + } + + // Slot 3 (rev-distr Distribution) is read-only signer. + assert!(!metas[3].is_writable); + assert!(metas[3].is_signer); + + // Slot 4 (SPL Token program) is read-only, not signer. + assert!(!metas[4].is_writable); + assert!(!metas[4].is_signer); + } +} diff --git a/solana/programs/revenue-distribution/src/lib.rs b/solana/programs/revenue-distribution/src/lib.rs new file mode 100644 index 0000000000..d653bf3ffb --- /dev/null +++ b/solana/programs/revenue-distribution/src/lib.rs @@ -0,0 +1,18 @@ +pub mod env; +pub mod instruction; +pub mod integration; +#[cfg(feature = "entrypoint")] +mod processor; +pub mod state; +pub mod types; + +// + +solana_pubkey::declare_id!("dzrevZC94tBLwuHw1dyynZxaXTWyp7yocsinyEVPtt4"); + +#[cfg(feature = "development")] +pub use env::development::DOUBLEZERO_MINT_KEY; +#[cfg(not(feature = "development"))] +pub use env::mainnet::DOUBLEZERO_MINT_KEY; + +pub const DOUBLEZERO_MINT_DECIMALS: u8 = 8; diff --git a/solana/programs/revenue-distribution/src/processor.rs b/solana/programs/revenue-distribution/src/processor.rs new file mode 100644 index 0000000000..f87c317524 --- /dev/null +++ b/solana/programs/revenue-distribution/src/processor.rs @@ -0,0 +1,3390 @@ +use borsh::BorshDeserialize; +use doublezero_program_tools::{ + account_info::{ + try_next_enumerated_account, EnumeratedAccountInfoIter, NextAccountOptions, + TryNextAccounts, UpgradeAuthority, + }, + instruction::try_build_instruction, + recipe::{ + create_account::{try_create_account, CreateAccountOptions}, + create_token_account::try_create_token_account, + Invoker, + }, + zero_copy::{self, ZeroCopyAccount, ZeroCopyMutAccount}, +}; +use ruint::Uint; +use solana_account_info::{AccountInfo, MAX_PERMITTED_DATA_INCREASE}; +use solana_cpi::invoke_signed_unchecked; +use solana_msg::msg; +use solana_program_error::{ProgramError, ProgramResult}; +use solana_program_pack::Pack; +use solana_pubkey::Pubkey; +use solana_system_interface::instruction as system_instruction; +use solana_sysvar::{clock::Clock, rent::Rent, Sysvar}; +use spl_associated_token_account_interface::address::get_associated_token_address; +use spl_token_interface::instruction as token_instruction; +use svm_hash::{merkle::MerkleProof, sha2::Hash}; + +use crate::{ + instruction::{ + account::DequeueFillsCpiAccounts, ContributorRewardsConfiguration, + DistributionMerkleRootKind, ProgramConfiguration, ProgramFeatureConfiguration, + ProgramFlagConfiguration, RevenueDistributionInstructionData, + }, + integration::{IntegrationInstructionData, WithdrawIntegrationRewardsAccounts}, + state::{ + self, CommunityBurnRateParameters, ContributorRewards, Distribution, Journal, + ProgramConfig, RecipientShare, RecipientShares, RelayParameters, RewardsIntegration, + SolanaValidatorDeposit, SolanaValidatorFeeParameters, + }, + types::{BurnRate, ByteFlags, DoubleZeroEpoch, RewardShare, SolanaValidatorDebt, ValidatorFee}, + DOUBLEZERO_MINT_KEY, ID, +}; + +// These compile-time checks ensure that if these consts were to change, that it +// would be intentional (and should be associated with a program account +// migration). +// +// Note: We do not need to check the program config or journal because 10kb was +// allocated to each of those accounts. +const _: () = assert!(size_of::() == 600); +const _: () = assert!(size_of::() == 448); +const _: () = assert!(size_of::() == 176); +const _: () = assert!(size_of::() == 96); + +solana_program_entrypoint::entrypoint!(try_process_instruction); + +fn try_process_instruction( + program_id: &Pubkey, + accounts: &[AccountInfo], + data: &[u8], +) -> ProgramResult { + if program_id != &ID { + return Err(ProgramError::IncorrectProgramId); + } + + // NOTE: Instruction data that happens to deserialize to any of the enum + // variants and has trailing data constitutes invalid instruction data. + let ix_data = + BorshDeserialize::try_from_slice(data).map_err(|_| ProgramError::InvalidInstructionData)?; + + match ix_data { + RevenueDistributionInstructionData::InitializeProgram => try_initialize_program(accounts), + RevenueDistributionInstructionData::MigrateProgramAccounts => { + try_migrate_program_accounts(accounts) + } + RevenueDistributionInstructionData::SetAdmin(admin_key) => { + try_set_admin(accounts, admin_key) + } + RevenueDistributionInstructionData::ConfigureProgram(setting) => { + try_configure_program(accounts, setting) + } + RevenueDistributionInstructionData::InitializeJournal => try_initialize_journal(accounts), + RevenueDistributionInstructionData::InitializeDistribution => { + try_initialize_distribution(accounts) + } + RevenueDistributionInstructionData::ConfigureDistributionDebt { + total_validators, + total_debt, + merkle_root, + } => try_configure_distribution_debt(accounts, total_validators, total_debt, merkle_root), + RevenueDistributionInstructionData::FinalizeDistributionDebt => { + try_finalize_distribution_debt(accounts) + } + RevenueDistributionInstructionData::ConfigureDistributionRewards { + total_contributors, + merkle_root, + } => try_configure_distribution_rewards(accounts, total_contributors, merkle_root), + RevenueDistributionInstructionData::FinalizeDistributionRewards => { + try_finalize_distribution_rewards(accounts) + } + RevenueDistributionInstructionData::DistributeRewards { + unit_share, + economic_burn_rate, + proof, + } => try_distribute_rewards(accounts, unit_share, economic_burn_rate, proof), + RevenueDistributionInstructionData::InitializeContributorRewards(service_key) => { + try_initialize_contributor_rewards(accounts, service_key) + } + RevenueDistributionInstructionData::SetRewardsManager(rewards_manager_key) => { + try_set_rewards_manager(accounts, rewards_manager_key) + } + RevenueDistributionInstructionData::ConfigureContributorRewards(setting) => { + try_configure_contributor_rewards(accounts, setting) + } + RevenueDistributionInstructionData::VerifyDistributionMerkleRoot { kind, proof } => { + try_verify_distribution_merkle_root(accounts, kind, proof) + } + RevenueDistributionInstructionData::InitializeSolanaValidatorDeposit(node_id) => { + try_initialize_solana_validator_deposit(accounts, node_id) + } + RevenueDistributionInstructionData::PaySolanaValidatorDebt { amount, proof } => { + try_pay_solana_validator_debt(accounts, amount, proof) + } + RevenueDistributionInstructionData::EnableSolanaValidatorDebtWriteOff => { + try_enable_solana_validator_debt_write_off(accounts) + } + RevenueDistributionInstructionData::WriteOffSolanaValidatorDebt { amount, proof } => { + try_write_off_solana_validator_debt(accounts, amount, proof) + } + RevenueDistributionInstructionData::InitializeSwapDestination => { + try_initialize_swap_destination(accounts) + } + RevenueDistributionInstructionData::SweepDistributionTokens => { + try_sweep_distribution_tokens(accounts) + } + RevenueDistributionInstructionData::WithdrawSol(amount) => { + try_withdraw_sol(accounts, amount) + } + RevenueDistributionInstructionData::SetDistributionEconomicBurnRate(burn_rate_value) => { + try_set_distribution_economic_burn_rate(accounts, burn_rate_value) + } + RevenueDistributionInstructionData::WithdrawSolanaValidatorDeposit => { + try_withdraw_solana_validator_deposit(accounts) + } + RevenueDistributionInstructionData::InitializeRewardsIntegration => { + try_initialize_rewards_integration(accounts) + } + RevenueDistributionInstructionData::CollectIntegrationRewards => { + try_collect_integration_rewards(accounts) + } + } +} + +fn try_initialize_program(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Initialize program"); + + // We expect the following accounts for this instruction: + // - 0: Payer. + // - 1: New program config. + // - 2: New reserve 2Z. + // - 3: SPL 2Z mint. + // - 4: SPL Token program. + // - 5: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be a signer and writable because it will send lamports to + // the new config account and reserve 2Z account. We do not check these + // fields because the create-account workflow requires that this account is + // writable and a signer. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Account 1 must be the new program config account. The create-account + // workflow requires that this account does not exist yet and is writable. + let (account_index, new_program_config_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_program_config_key, program_config_bump) = ProgramConfig::find_address(); + + // Enforce this account location and seed validity. + if new_program_config_info.key != &expected_program_config_key { + msg!( + "Invalid seeds for program config (account {})", + account_index + ); + return Err(ProgramError::InvalidSeeds); + } + + // Rent sysvar will be used to create the new program config account and + // the new reserve 2Z token account. + let rent_sysvar = Rent::get().unwrap(); + + // The program config account is created with the maximum data length + // allowed (10kb) in case other fields are added in the future. + try_create_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: &expected_program_config_key, + signer_seeds: &[ProgramConfig::SEED_PREFIX, &[program_config_bump]], + }, + new_program_config_info.lamports(), + MAX_PERMITTED_DATA_INCREASE, + &ID, + accounts, + CreateAccountOptions { + rent_sysvar: Some(&rent_sysvar), + additional_lamports: None, + }, + )?; + + // Account 2 must be the new reserve 2Z token account. The create-account + // workflow requires that this account does not exist yet and is writable. + let (_, new_reserve_2z_info, reserve_2z_bump) = try_next_2z_token_pda_info( + &mut accounts_iter, + &expected_program_config_key, + "reserve", + None, // bump_seed + )?; + + // Account 3 must be the 2Z mint. We need this account to initialize the new + // reserve 2Z token account. + try_next_2z_mint_info(&mut accounts_iter)?; + + // Account 4 must be the SPL Token program, which will initialize the new + // reserve 2Z token account. + try_next_token_program_info(&mut accounts_iter)?; + + try_create_token_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: new_reserve_2z_info.key, + signer_seeds: &[ + state::TOKEN_2Z_PDA_SEED_PREFIX, + expected_program_config_key.as_ref(), + &[reserve_2z_bump], + ], + }, + &DOUBLEZERO_MINT_KEY, + &expected_program_config_key, + new_reserve_2z_info.lamports(), + accounts, + Some(&rent_sysvar), + )?; + + // Set the bump seeds and pause the program. + let (mut program_config, _) = + zero_copy::try_initialize::(new_program_config_info)?; + program_config.bump_seed = program_config_bump; + program_config.reserve_2z_bump_seed = reserve_2z_bump; + + msg!("Pause program"); + program_config.set_is_paused(true); + + Ok(()) +} + +fn try_set_admin(accounts: &[AccountInfo], admin_key: Pubkey) -> ProgramResult { + msg!("Set admin"); + + // We expect the following accounts for this instruction: + // - 0: Program data. + // - 1: Upgrade authority. + // - 2: Program config. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program data belonging to this program. + // Account 1 must be the upgrade authority. + // + // This call ensures that the upgrade authority is a signer and is the + // same authority encoded in the program data. + UpgradeAuthority::try_next_accounts(&mut accounts_iter, &ID)?; + + // Account 2 must be the program config. Ensure it is writable so we can + // update the admin key. + let mut program_config = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + msg!("admin_key: {}", admin_key); + program_config.admin_key = admin_key; + + Ok(()) +} + +fn try_configure_program(accounts: &[AccountInfo], setting: ProgramConfiguration) -> ProgramResult { + msg!("Configure program"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Admin. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + // Account 1 must be the admin. + // + // This call ensures that the admin is a signer and is the same admin + // encoded in the program config. + let authorized_use = + VerifiedProgramAuthorityMut::try_next_accounts(&mut accounts_iter, Authority::Admin)?; + let mut program_config = authorized_use.program_config; + + match setting { + ProgramConfiguration::Flag(configure_flag) => { + msg!("Set flag"); + match configure_flag { + ProgramFlagConfiguration::IsPaused(should_pause) => { + msg!("is_paused: {}", should_pause); + program_config.set_is_paused(should_pause); + } + }; + } + ProgramConfiguration::DebtAccountant(debt_accountant_key) => { + msg!("Set debt_accountant_key: {}", debt_accountant_key); + program_config.debt_accountant_key = debt_accountant_key; + } + ProgramConfiguration::RewardsAccountant(rewards_accountant_key) => { + msg!("Set rewards_accountant_key: {}", rewards_accountant_key); + program_config.rewards_accountant_key = rewards_accountant_key; + } + ProgramConfiguration::ContributorManager(contributor_manager_key) => { + msg!("Set contributor_manager_key: {}", contributor_manager_key); + program_config.contributor_manager_key = contributor_manager_key; + } + ProgramConfiguration::PlaceholderKey(_) => { + return Err(ProgramError::InvalidInstructionData); + } + ProgramConfiguration::Sol2zSwapProgram(sol_2z_swap_program_id) => { + msg!("Set sol_2z_swap_program_id: {}", sol_2z_swap_program_id); + program_config.sol_2z_swap_program_id = sol_2z_swap_program_id; + + // The SOL/2Z swap program will use its withdraw SOL authority to + // invoke the withdraw SOL instruction. We cache the bump seed for + // the withdraw SOL authority to validate the authority account + // when the withdraw SOL instruction is invoked. + let (withdraw_sol_authority_key, withdraw_sol_authority_bump) = + state::find_withdraw_sol_authority_address(&sol_2z_swap_program_id); + msg!( + "Established withdraw SOL authority: {}", + withdraw_sol_authority_key + ); + program_config.withdraw_sol_authority_bump_seed = withdraw_sol_authority_bump; + } + ProgramConfiguration::SolanaValidatorFeeParameters { + base_block_rewards_pct, + priority_block_rewards_pct, + inflation_rewards_pct, + jito_tips_pct, + fixed_sol_amount, + _unused, + } => { + let base_block_rewards_pct = + ValidatorFee::new(base_block_rewards_pct).ok_or_else(|| { + msg!( + "Invalid Solana validator base block rewards percentage fee parameter: {}", + base_block_rewards_pct + ); + ProgramError::InvalidInstructionData + })?; + + let priority_block_rewards_pct = ValidatorFee::new(priority_block_rewards_pct) + .ok_or_else(|| { + msg!( + "Invalid Solana validator priority block rewards percentage fee parameter: {}", + priority_block_rewards_pct + ); + ProgramError::InvalidInstructionData + })?; + + let inflation_rewards_pct = + ValidatorFee::new(inflation_rewards_pct).ok_or_else(|| { + msg!( + "Invalid Solana validator inflation rewards percentage fee parameter: {}", + inflation_rewards_pct + ); + ProgramError::InvalidInstructionData + })?; + + let jito_tips_pct = ValidatorFee::new(jito_tips_pct).ok_or_else(|| { + msg!( + "Invalid Solana validator Jito tips percentage fee parameter: {}", + jito_tips_pct + ); + ProgramError::InvalidInstructionData + })?; + + msg!("Set distribution_parameters.solana_validator_fee_parameters"); + let fee_params = &mut program_config + .distribution_parameters + .solana_validator_fee_parameters; + + msg!(" base_block_rewards_pct: {}", base_block_rewards_pct); + fee_params.base_block_rewards_pct = base_block_rewards_pct; + + msg!( + " priority_block_rewards_pct: {}", + priority_block_rewards_pct + ); + fee_params.priority_block_rewards_pct = priority_block_rewards_pct; + + msg!(" inflation_rewards_pct: {}", inflation_rewards_pct); + fee_params.inflation_rewards_pct = inflation_rewards_pct; + + msg!(" jito_tips_pct: {}", jito_tips_pct); + fee_params.jito_tips_pct = jito_tips_pct; + + msg!(" fixed_sol_amount: {}", fixed_sol_amount); + fee_params.fixed_sol_amount = fixed_sol_amount; + } + ProgramConfiguration::CalculationGracePeriodMinutes(grace_period_minutes) => { + // If the grace period is zero, we treat this as unset. + if grace_period_minutes == 0 { + msg!("Calculation grace period is zero"); + return Err(ProgramError::InvalidInstructionData); + } + // If the grace period is excessive (>24 hours), revert. + else if grace_period_minutes > 24 * 60 { + msg!("Calculation grace period exceeds 24 hours"); + return Err(ProgramError::InvalidInstructionData); + } + + msg!( + "Set distribution_parameters.calculation_grace_period_minutes: {}", + grace_period_minutes + ); + program_config + .distribution_parameters + .calculation_grace_period_minutes = grace_period_minutes; + } + ProgramConfiguration::CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing, + dz_epochs_to_limit, + initial_rate, + } => { + let limit = BurnRate::new(limit).ok_or_else(|| { + msg!("Invalid community burn rate limit: {}", limit); + ProgramError::InvalidInstructionData + })?; + + match initial_rate { + // We only allow specifying the initial rate if the debt + // accountant has not initialized any distributions yet. + Some(initial_rate) => { + // When the accountant initializes a new distribution, the + // initialize-distribution instruction first checks whether + // the last community burn rate is non-zero. If there is a + // non-zero value, a new community burn rate will be + // calculated for this DZ epoch. + // + // This updated community burn rate will be saved to the + // program config. + if program_config.next_completed_dz_epoch != 0 { + msg!( + "Cannot initialize community burn rate parameters if not zero DZ epoch" + ); + return Err(ProgramError::InvalidInstructionData); + } + + let initial_rate = BurnRate::new(initial_rate).ok_or_else(|| { + msg!("Invalid initial community burn rate: {}", initial_rate); + ProgramError::InvalidInstructionData + })?; + + let cbr_params = CommunityBurnRateParameters::new( + initial_rate, + limit, + dz_epochs_to_increasing, + dz_epochs_to_limit, + ) + .ok_or_else(|| { + msg!("Invalid initial community burn rate parameters"); + msg!(" initial_rate: {}", initial_rate); + msg!(" limit: {}", limit); + msg!(" dz_epochs_to_increasing: {}", dz_epochs_to_increasing); + msg!(" dz_epochs_to_limit: {}", dz_epochs_to_limit); + ProgramError::InvalidInstructionData + })?; + + msg!("Set initial distribution_parameters.community_burn_rate_parameters"); + msg!(" initial_rate: {}", initial_rate); + msg!(" limit: {}", limit); + msg!(" dz_epochs_to_increasing: {}", dz_epochs_to_increasing); + msg!(" dz_epochs_to_limit: {}", dz_epochs_to_limit); + + let (slope_numerator, slope_denominator) = cbr_params.slope(); + msg!(" slope_numerator: {}", slope_numerator); + msg!(" slope_denominator: {}", slope_denominator); + + program_config + .distribution_parameters + .community_burn_rate_parameters = cbr_params; + } + None => { + let cbr_params = &mut program_config + .distribution_parameters + .community_burn_rate_parameters; + + let (new_slope_numerator, new_slope_denominator) = cbr_params + .checked_update(limit, dz_epochs_to_increasing, dz_epochs_to_limit) + .ok_or_else(|| { + msg!("Cannot update community burn rate parameters"); + msg!( + " cached_last_burn_rate: {}", + cbr_params.next_burn_rate().unwrap() + ); + msg!(" new_limit: {}", limit); + msg!(" new_dz_epochs_to_increasing: {}", dz_epochs_to_increasing); + msg!(" new_dz_epochs_to_limit: {}", dz_epochs_to_limit); + ProgramError::InvalidInstructionData + })?; + + msg!("Update distribution_parameters.community_burn_rate_parameters"); + msg!(" limit: {}", limit); + msg!(" dz_epochs_to_increasing: {}", dz_epochs_to_increasing); + msg!(" dz_epochs_to_limit: {}", dz_epochs_to_limit); + msg!(" slope_numerator: {}", new_slope_numerator); + msg!(" slope_denominator: {}", new_slope_denominator); + } + } + } + ProgramConfiguration::PlaceholderRelayLamports(_) => { + return Err(ProgramError::InvalidInstructionData); + } + ProgramConfiguration::DistributeRewardsRelayLamports(relay_lamports) => { + if relay_lamports < RelayParameters::MIN_LAMPORTS { + msg!("Relay lamports must be greater than the cost of a transaction signature"); + return Err(ProgramError::InvalidInstructionData); + } + + msg!( + "Set relay_parameters.distribute_rewards_lamports: {}", + relay_lamports + ); + program_config.relay_parameters.distribute_rewards_lamports = relay_lamports; + } + ProgramConfiguration::MinimumEpochDurationToFinalizeRewards(epoch_duration) => { + // If the epoch duration is zero, we treat this as unset. + if epoch_duration == 0 { + msg!("Minimum epoch duration to finalize rewards is zero"); + return Err(ProgramError::InvalidInstructionData); + } + + msg!( + "Set distribution_parameters.minimum_epoch_duration_to_finalize_rewards: {}", + epoch_duration + ); + program_config + .distribution_parameters + .minimum_epoch_duration_to_finalize_rewards = epoch_duration; + } + ProgramConfiguration::DistributionInitializationGracePeriodMinutes( + grace_period_minutes, + ) => { + // If the grace period is zero, we treat this as unset. + if grace_period_minutes == 0 { + msg!("Distribution initialization grace period is zero"); + return Err(ProgramError::InvalidInstructionData); + } + // If the grace period is excessive (>48 hours), revert. + else if grace_period_minutes > 48 * 60 { + msg!("Distribution initialization grace period exceeds 48 hours"); + return Err(ProgramError::InvalidInstructionData); + } + + msg!( + "Set distribution_parameters.initialization_grace_period_minutes: {}", + grace_period_minutes + ); + program_config + .distribution_parameters + .initialization_grace_period_minutes = grace_period_minutes; + } + ProgramConfiguration::FeatureActivation { + feature, + activation_epoch, + } => { + if activation_epoch == 0 { + msg!("Cannot activate feature at epoch zero"); + return Err(ProgramError::InvalidInstructionData); + } + + match feature { + ProgramFeatureConfiguration::SolanaValidatorDebtWriteOff => { + msg!( + "Set Solana validator debt write-off feature activation epoch: {}", + activation_epoch + ); + program_config.debt_write_off_feature_activation_epoch = activation_epoch; + } + } + } + } + + Ok(()) +} + +fn try_initialize_journal(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Initialize journal"); + + // We expect the following accounts for this instruction: + // - 0: Payer. + // - 1: New journal. + // - 2: New journal's 2Z token account. + // - 3: 2Z mint. + // - 4: SPL Token program. + // - 5: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be a signer and writable because it will send lamports to + // the new journal account and journal's 2Z token account. We do not check + // these fields because the create-account workflow requires that this + // account is writable and a signer. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Account 1 must be the new journal account. The create-account workflow + // requires that this account does not exist yet and is writable. + let (account_index, new_journal_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_journal_key, journal_bump) = Journal::find_address(); + + // Enforce this account location and seed validity. + if new_journal_info.key != &expected_journal_key { + msg!("Invalid seeds for journal (account {})", account_index); + return Err(ProgramError::InvalidSeeds); + } + + // Rent sysvar will be used to create the new journal account and the new + // journal's 2Z token account. + let rent_sysvar = Rent::get().unwrap(); + + // The journal account is created with the maximum data length allowed + // (10kb) in case other fields are added in the future. + try_create_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: &expected_journal_key, + signer_seeds: &[Journal::SEED_PREFIX, &[journal_bump]], + }, + new_journal_info.lamports(), + MAX_PERMITTED_DATA_INCREASE, + &ID, + accounts, + CreateAccountOptions { + rent_sysvar: Some(&rent_sysvar), + additional_lamports: None, + }, + )?; + + // Account 2 must be the new 2Z token account. The create-account workflow + // requires that this account does not exist yet and is writable. + let (_, new_journal_2z_token_pda_info, journal_2z_token_pda_bump) = try_next_2z_token_pda_info( + &mut accounts_iter, + &expected_journal_key, + "journal's", + None, // bump_seed + )?; + + // Account 3 must be the 2Z mint. We need this account to initialize the new + // journal's 2Z token account. + try_next_2z_mint_info(&mut accounts_iter)?; + + // Account 4 must be the SPL Token program, which will initialize the new + // journal's 2Z token account. + try_next_token_program_info(&mut accounts_iter)?; + + try_create_token_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: new_journal_2z_token_pda_info.key, + signer_seeds: &[ + state::TOKEN_2Z_PDA_SEED_PREFIX, + expected_journal_key.as_ref(), + &[journal_2z_token_pda_bump], + ], + }, + &DOUBLEZERO_MINT_KEY, + &expected_journal_key, + new_journal_2z_token_pda_info.lamports(), + accounts, + Some(&rent_sysvar), + )?; + + // Set the bump seeds. + let (mut journal, _) = zero_copy::try_initialize::(new_journal_info)?; + journal.bump_seed = journal_bump; + journal.token_2z_pda_bump_seed = journal_2z_token_pda_bump; + + Ok(()) +} + +fn try_initialize_distribution(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Initialize distribution"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Debt accountant. + // - 2: Payer. + // - 3: New distribution. + // - 4: New distribution's 2Z token account. + // - 5: 2Z mint. + // - 6: SPL Token program. + // - 7: Journal. + // - 8: Journal's 2Z token account. + // - 9: Journal's ATA. + // - 10: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + let authorized_use = VerifiedProgramAuthorityMut::try_next_accounts( + &mut accounts_iter, + Authority::DebtAccountant, + )?; + let mut program_config = authorized_use.program_config; + + // Make sure the program is not paused. + program_config.try_require_unpaused()?; + + // The initialization grace period must have been configured. + let initialization_grace_period_seconds = program_config + .checked_distribution_initialization_grace_period_seconds() + .ok_or_else(|| { + msg!("Initialization grace period has not been configured yet"); + ProgramError::InvalidAccountData + })?; + + let current_timestamp = Clock::get().unwrap().unix_timestamp; + + // We do not expect this operation to fail anytime soon. But we ensure a + // panic just in case. + let initialization_allowed_timestamp = program_config + .last_initialized_distribution_timestamp + .checked_add(initialization_grace_period_seconds) + .unwrap(); + + if current_timestamp < i64::from(initialization_allowed_timestamp) { + let remaining_seconds = i64::from(initialization_allowed_timestamp) - current_timestamp; + msg!( + "Cannot initialize a new distribution until {} seconds", + remaining_seconds + ); + return Err(ProgramError::InvalidAccountData); + } + + // Now reflect when this distribution is initialized. We do not expect this + // conversion to fail anytime soon. But we ensure a panic just in case. + program_config.last_initialized_distribution_timestamp = current_timestamp.try_into().unwrap(); + + // The minimum calculation grace period must have been configured. + let calculation_grace_period_seconds = program_config + .checked_calculation_grace_period_seconds() + .ok_or_else(|| { + msg!("Calculation grace period has not been configured yet"); + ProgramError::InvalidAccountData + })?; + + let solana_validator_fee_params = program_config + .distribution_parameters + .solana_validator_fee_parameters; + + // Calculate the community burn rate for this distribution based on the + // configured parameters (initial rate, limit, slope, etc.) + let community_burn_rate = program_config + .distribution_parameters + .community_burn_rate_parameters + .checked_compute() + .ok_or_else(|| { + msg!("Community burn rate parameters are misconfigured"); + ProgramError::InvalidAccountData + })?; + + // In order to finalize contributor rewards, the program config must have a + // non-zero amount of lamports to pay for each contributor reward + // distribution. By providing these lamports to the distribution account, + // the contributor reward distributions will not cost any gas to the + // invoker of this distribution. + let distribute_rewards_relay_lamports = program_config + .checked_distribute_rewards_relay_lamports() + .ok_or_else(|| { + msg!("Distribute rewards relay lamports not configured"); + ProgramError::InvalidAccountData + })?; + + // Account 2 must be a signer and writable because it will send lamports to + // the new distribution account and distribution's 2Z token account. We do + // not check these fields because the create-account workflow requires that + // this account is writable and a signer. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Account 3 must be the new distribution account. The create-account + // workflow requires that this account does not exist yet and is writable. + let (account_index, new_distribution_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // We will need this DZ epoch for the distribution account. + let dz_epoch = program_config.next_completed_dz_epoch; + let (expected_distribution_key, distribution_bump) = Distribution::find_address(dz_epoch); + + // Enforce this account location and seed validity. + if new_distribution_info.key != &expected_distribution_key { + msg!("Invalid seeds for distribution (account {})", account_index); + return Err(ProgramError::InvalidSeeds); + } + + // Uptick the program config's next epoch. + program_config.next_completed_dz_epoch = dz_epoch.saturating_add_duration(1); + + // We no longer need the program config for anything. + drop(program_config); + + // We declare this because Rent will be used multiple times in this + // instruction. + let rent_sysvar = Rent::get().unwrap(); + + try_create_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: &expected_distribution_key, + signer_seeds: &[ + Distribution::SEED_PREFIX, + &dz_epoch.as_seed(), + &[distribution_bump], + ], + }, + new_distribution_info.lamports(), + zero_copy::data_end::(), + &ID, + accounts, + CreateAccountOptions { + rent_sysvar: Some(&rent_sysvar), + additional_lamports: None, + }, + )?; + + // Account 4 must be the new 2Z token account. The create-account workflow + // requires that this account does not exist yet and is writable. + let (_, new_distribution_2z_token_pda_info, distribution_2z_token_pda_bump) = + try_next_2z_token_pda_info( + &mut accounts_iter, + &expected_distribution_key, + "distribution's", + None, // bump_seed + )?; + + // Account 5 must be the 2Z mint. + try_next_2z_mint_info(&mut accounts_iter)?; + + // Account 6 must be the SPL Token program. + try_next_token_program_info(&mut accounts_iter)?; + + try_create_token_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: new_distribution_2z_token_pda_info.key, + signer_seeds: &[ + state::TOKEN_2Z_PDA_SEED_PREFIX, + expected_distribution_key.as_ref(), + &[distribution_2z_token_pda_bump], + ], + }, + &DOUBLEZERO_MINT_KEY, + &expected_distribution_key, + new_distribution_2z_token_pda_info.lamports(), + accounts, + Some(&rent_sysvar), + )?; + + // Finally, initialize some distribution account fields. + let (mut distribution, _) = zero_copy::try_initialize::(new_distribution_info)?; + + // Set DZ epoch. The DZ epoch should never change with any interaction with + // the epoch distribution account. + distribution.dz_epoch = dz_epoch; + distribution.bump_seed = distribution_bump; + distribution.token_2z_pda_bump_seed = distribution_2z_token_pda_bump; + distribution.community_burn_rate = community_burn_rate; + distribution.solana_validator_fee_parameters = solana_validator_fee_params; + distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + + // We do not expect this operation to fail anytime soon. But we ensure a + // panic just in case. + distribution.calculation_allowed_timestamp = current_timestamp + .checked_add(calculation_grace_period_seconds.into()) + .unwrap() + .try_into() + .unwrap(); + + // Account 7 must be the journal. + let journal = ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Snapshot Journal.integrations_count into the new distribution so + // `DistributeRewards` can later gate on "all of these integrations have + // been collected from". New integrations registered after this point do + // not retroactively block this distribution. + distribution.integrations_count_snapshot = journal.integrations_count; + + // Account 8 must be the journal's 2Z token account. + let (_, _journal_2z_token_pda_info, _) = try_next_2z_token_pda_info( + &mut accounts_iter, + journal.info.key, + "journal's", + Some(journal.token_2z_pda_bump_seed), + )?; + + // Account 9 must be the journal's ATA. Any balance on this ATA will be + // transferred to the distribution's 2Z token account. + let (account_index, journal_ata_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let expected_journal_ata_key = + get_associated_token_address(journal.info.key, &DOUBLEZERO_MINT_KEY); + + // Enforce this account location. + if journal_ata_info.key != &expected_journal_ata_key { + msg!( + "Expected ATA for journal {} (account {})", + journal.info.key, + account_index + ); + return Err(ProgramError::InvalidAccountData); + } + + // Attempt to deserialize ATA to get the balance and transfer it to the + // distribution's 2Z token account. If deserialization fails, the ATA does + // not exist (so there is no balance to transfer). + match spl_token_interface::state::Account::unpack(&journal_ata_info.data.borrow()[..]) { + Ok(journal_ata) if journal_ata.amount != 0 => { + let transfer_amount = journal_ata.amount; + + let token_transfer_ix = token_instruction::transfer( + &spl_token_interface::ID, + &expected_journal_ata_key, + new_distribution_2z_token_pda_info.key, + journal.info.key, + &[], // signer_pubkeys + transfer_amount, + ) + .unwrap(); + + invoke_signed_unchecked( + &token_transfer_ix, + accounts, + &[&[Journal::SEED_PREFIX, &[journal.bump_seed]]], + )?; + + msg!( + "Moved {} 2Z from journal's ATA to distribution", + transfer_amount + ); + distribution.collected_prepaid_2z_payments += transfer_amount; + } + _ => msg!("No balance to transfer from journal's ATA"), + } + + msg!("Initialized distribution for DZ epoch {}", dz_epoch); + + Ok(()) +} + +fn try_configure_distribution_debt( + accounts: &[AccountInfo], + total_validators: u32, + total_debt: u64, + merkle_root: Hash, +) -> ProgramResult { + msg!("Configure distribution debt"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Debt accountant. + // - 2: Distribution. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + // Account 1 must be the debt accountant. + // + // This call ensures that the debt accountant is a signer and is the same + // debt accountant encoded in the program config. + let authorized_use = + VerifiedProgramAuthority::try_next_accounts(&mut accounts_iter, Authority::DebtAccountant)?; + + // Make sure the program is not paused. + authorized_use.program_config.try_require_unpaused()?; + + // Account 2 must be the distribution. + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("DZ epoch: {}", distribution.dz_epoch); + + distribution.try_require_unfinalized_debt_calculation()?; + distribution.try_require_calculation_allowed()?; + + if distribution.solana_validator_fee_parameters == SolanaValidatorFeeParameters::default() { + msg!("Configuring distribution debt disallowed"); + return Err(ProgramError::InvalidAccountData); + } + + msg!("Set total_solana_validators: {}", total_validators); + distribution.total_solana_validators = total_validators; + + msg!("Set total_solana_validator_debt: {}", total_debt); + distribution.total_solana_validator_debt = total_debt; + + msg!("Set solana_validator_debt_merkle_root: {}", merkle_root); + distribution.solana_validator_debt_merkle_root = merkle_root; + + Ok(()) +} + +fn try_finalize_distribution_debt(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Finalize distribution debt"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Debt accountant. + // - 2: Distribution. + // - 3: Payer (funder of realloc lamports). + // - 4: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + // Account 1 must be the debt accountant. + // + // This call ensures that the debt accountant is a signer and is the same + // debt accountant encoded in the program config. + let authorized_use = + VerifiedProgramAuthority::try_next_accounts(&mut accounts_iter, Authority::DebtAccountant)?; + + // Make sure the program is not paused. + authorized_use.program_config.try_require_unpaused()?; + + // Account 2 must be the distribution. + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("DZ epoch: {}", distribution.dz_epoch); + + distribution.try_require_unfinalized_debt_calculation()?; + distribution.try_require_calculation_allowed()?; + distribution.set_is_debt_calculation_finalized(true); + + // If there is no debt accounted for, we can return early. + if distribution.checked_total_sol_debt().unwrap() == 0 { + msg!("Zero SOL debt. No need to increase distribution account size"); + + return Ok(()); + } + + // We need to realloc the distribution account to add the number of bits + // needed to store whether a Solana validator has paid. + let additional_data_len = if distribution.total_solana_validators % 8 == 0 { + distribution.total_solana_validators / 8 + } else { + distribution.total_solana_validators / 8 + 1 + }; + + // Set the index of where to find the bits to indicate which Solana + // validator debt has been processed. + distribution.processed_solana_validator_debt_start_index = + distribution.remaining_data.len() as u32; + distribution.processed_solana_validator_debt_end_index = distribution + .processed_solana_validator_debt_start_index + .saturating_add(additional_data_len); + + // Avoid borrowing while in mutable borrow state. + let distribution_info = distribution.info; + drop(distribution); + + let new_data_len = distribution_info + .data_len() + .saturating_add(additional_data_len as usize); + distribution_info.resize(new_data_len)?; + + let additional_lamports_for_resize = Rent::get() + .unwrap() + .minimum_balance(new_data_len) + .saturating_sub(distribution_info.lamports()); + + // Account 3 must be the payer. In order to transfer lamports from the payer + // to the distribution, this account must be writable. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let transfer_ix = system_instruction::transfer( + payer_info.key, + distribution_info.key, + additional_lamports_for_resize, + ); + + invoke_signed_unchecked(&transfer_ix, accounts, &[])?; + + msg!( + "Increase distribution account size by {} byte{}", + additional_data_len, + if additional_data_len == 1 { "" } else { "s" } + ); + + Ok(()) +} + +fn try_configure_distribution_rewards( + accounts: &[AccountInfo], + total_contributors: u32, + merkle_root: Hash, +) -> ProgramResult { + msg!("Configure distribution rewards"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Rewards accountant. + // - 2: Distribution. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + // Account 1 must be the rewards accountant. + // + // This call ensures that the rewards accountant is a signer and is the same + // rewards accountant encoded in the program config. + let authorized_use = VerifiedProgramAuthority::try_next_accounts( + &mut accounts_iter, + Authority::RewardsAccountant, + )?; + + // Make sure the program is not paused. + authorized_use.program_config.try_require_unpaused()?; + + // Account 2 must be the distribution. + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("DZ epoch: {}", distribution.dz_epoch); + + distribution.try_require_unfinalized_rewards_calculation()?; + distribution.try_require_calculation_allowed()?; + + msg!("Set total_contributors: {}", total_contributors); + distribution.total_contributors = total_contributors; + + msg!("Set rewards_merkle_root: {}", merkle_root); + distribution.rewards_merkle_root = merkle_root; + + Ok(()) +} + +fn try_finalize_distribution_rewards(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Finalize distribution rewards"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Distribution. + // - 2: Payer (to pay for distribute rewards relay lamports). + // - 3: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let program_config = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Make sure the program is not paused. + program_config.try_require_unpaused()?; + + // Account 1 must be the distribution. + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("DZ epoch: {}", distribution.dz_epoch); + + // If the distribution rewards calculation has already been finalized, + // we have nothing to do. + distribution.try_require_unfinalized_rewards_calculation()?; + distribution.try_require_calculation_allowed()?; + distribution.set_is_rewards_calculation_finalized(true); + + // Debt calculation must have been finalized before rewards can be + // finalized. + distribution.try_require_finalized_debt_calculation()?; + + // A null rewards root can only be finalized when provably nothing is owed + // to contributors: no SOL debt (converted to 2Z at sweep), no collected 2Z + // (prepaid payments, integration rewards), and no integration still pending + // collection. Finalize is permissionless and one-way, so this guard is the + // only thing standing between a premature finalize and permanently stranded + // 2Z. + if distribution.rewards_merkle_root == Hash::default() { + if distribution.checked_total_sol_debt().unwrap() != 0 { + msg!("Rewards root cannot be null with calculated debt"); + return Err(ProgramError::InvalidAccountData); + } + if distribution.total_collected_2z_tokens() != 0 { + msg!("Rewards root cannot be null with collected 2Z"); + return Err(ProgramError::InvalidAccountData); + } + if !distribution.are_all_integrations_collected() { + msg!("Rewards root cannot be null with uncollected integrations"); + return Err(ProgramError::InvalidAccountData); + } + } + + // The distribution must have been created at least the minimum number of + // epochs ago. + let minimum_dz_epoch_to_finalize = program_config + .checked_minimum_epoch_duration_to_finalize_rewards() + .map(|duration| distribution.dz_epoch.saturating_add_duration(duration)) + .ok_or_else(|| { + msg!("Minimum epoch duration to finalize rewards is misconfigured"); + ProgramError::InvalidAccountData + })?; + + if minimum_dz_epoch_to_finalize > program_config.next_completed_dz_epoch { + msg!( + "DZ epoch must be at least {} (currently {}) to finalize rewards", + minimum_dz_epoch_to_finalize, + program_config.next_completed_dz_epoch + ); + return Err(ProgramError::InvalidAccountData); + } + + // We need to realloc the distribution account to add the number of bits + // needed to store whether a contributor has distributed rewards. + // Each bit represents one contributor, so we need ceil(contributors/8) + // bytes. + let total_contributors = distribution.total_contributors; + let additional_data_len = if total_contributors % 8 == 0 { + total_contributors / 8 + } else { + // Round up for partial byte. + total_contributors / 8 + 1 + }; + + // Set the index of where to find the bits start to indicate which rewards + // have been distributed. + distribution.processed_rewards_start_index = distribution.remaining_data.len() as u32; + distribution.processed_rewards_end_index = distribution + .processed_rewards_start_index + .saturating_add(additional_data_len); + + let distribute_rewards_relay_lamports = distribution.distribute_rewards_relay_lamports; + + // Avoid borrowing while in mutable borrow state. + let distribution_info = distribution.info; + drop(distribution); + + let new_data_len = distribution_info + .data_len() + .saturating_add(additional_data_len as usize); + distribution_info.resize(new_data_len)?; + + let additional_lamports_for_resize = Rent::get() + .unwrap() + .minimum_balance(new_data_len) + .saturating_sub(distribution_info.lamports()); + + msg!( + "Increase distribution account size by {} byte{}", + additional_data_len, + if additional_data_len == 1 { "" } else { "s" } + ); + + // Account 2 must be the payer. In order to transfer lamports from the payer + // to the distribution, this account must be writable. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let additional_lamports_for_distributing = + u64::from(distribute_rewards_relay_lamports).saturating_mul(total_contributors.into()); + + let transfer_ix = system_instruction::transfer( + payer_info.key, + distribution_info.key, + additional_lamports_for_distributing.saturating_add(additional_lamports_for_resize), + ); + + invoke_signed_unchecked(&transfer_ix, accounts, &[])?; + + msg!( + "Transferred {} lamports to distribution for {} contributors", + additional_lamports_for_distributing, + total_contributors + ); + + Ok(()) +} + +fn try_distribute_rewards( + accounts: &[AccountInfo], + unit_share: u32, + economic_burn_rate: u32, + proof: MerkleProof, +) -> ProgramResult { + msg!("Distribute rewards"); + + // Enforce that the merkle proof uses an indexed tree. This index will be + // referenced later in this instruction processor. + let leaf_index = try_leaf_index(&proof)?; + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Distribution. + // - 2: Contributor rewards. + // - 3: Distribution 2Z token account. + // - 4: 2Z mint. + // - 5: Relayer. + // - 6: SPL Token program. + // + // Remaining accounts are recipient ATAs, whose owners are specified in + // the contributor rewards account. Because this account specifies a + // maximum number of 8 recipients, there will be at most 15 accounts passed + // to this instruction. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let program_config = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Make sure the program is not paused. + program_config.try_require_unpaused()?; + + // Account 1 must be the distribution. + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("DZ epoch: {}", distribution.dz_epoch); + + if distribution.are_all_rewards_distributed() { + msg!("All rewards have already been distributed"); + return Err(ProgramError::InvalidAccountData); + } + + // Make sure 2Z tokens have been swept. + if !distribution.has_swept_2z_tokens() { + msg!("Distribution has not swept 2Z tokens"); + return Err(ProgramError::InvalidAccountData); + } + + // Make sure every integration registered at the time this distribution + // was initialized has had its contributor-share 2Z collected. + if !distribution.are_all_integrations_collected() { + msg!( + "Not all integrations have been collected ({} of {})", + distribution.integrations_collected_count, + distribution.integrations_count_snapshot + ); + return Err(ProgramError::InvalidAccountData); + } + + // Bits indicating whether rewards have been distributed for specific leaf + // indices are stored in the distribution's remaining data as a bitfield. + // Each bit represents one leaf: 1 = distributed, 0 = not yet distributed. + let processed_bitmap_range = distribution.processed_rewards_bitmap_range(); + + try_process_remaining_data_leaf_index( + &mut distribution.remaining_data[processed_bitmap_range], + leaf_index, + ) + .inspect_err(|_| { + msg!("Rewards already distributed"); + })?; + + let contributor_rewards = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("Service key: {}", contributor_rewards.service_key); + + let reward_share = RewardShare::new( + contributor_rewards.service_key, + unit_share, + false, // should_block, + economic_burn_rate, + ) + .ok_or_else(|| { + msg!("Invalid reward share"); + msg!(" unit_share: {}", unit_share); + msg!(" economic_burn_rate: {}", economic_burn_rate); + ProgramError::InvalidInstructionData + })?; + + let computed_merkle_root = + proof.root_from_pod_leaf(&reward_share, Some(RewardShare::LEAF_PREFIX)); + + if computed_merkle_root != distribution.rewards_merkle_root { + msg!("Invalid computed merkle root: {}", computed_merkle_root); + return Err(ProgramError::InvalidInstructionData); + } + + // Account 3 must be the distribution 2Z token account. + let (_, distribution_2z_token_pda_info, _) = try_next_2z_token_pda_info( + &mut accounts_iter, + distribution.info.key, + "distribution's", + Some(distribution.token_2z_pda_bump_seed), + )?; + + // Account 4 must be the 2Z mint. This account needs to be writable because + // the burn instruction will be invoked near the end of this instruction. + try_next_2z_mint_info(&mut accounts_iter)?; + + // Account 5 must be the relayer. This account will receive lamports for + // invoking this instruction. + // + // To avoid a potential lamport accounting issue, moving lamports to this + // account will happen at the end of this instruction. + let (_, relayer_info) = try_next_enumerated_account( + &mut accounts_iter, + NextAccountOptions { + must_be_writable: true, + ..Default::default() + }, + )?; + + // Account 6 must be the SPL Token program. + try_next_token_program_info(&mut accounts_iter)?; + + // Split the reward into two parts: the amount to burn and the amount to + // distribute. This operation is safe to unwrap because under the hood, the + // unit share and economic burn rate are checked, but these values do not + // need to be checked since they were already checked in the + // `RewardShare::new` call. + let (mut burn_share_amount, remaining_share_amount) = + distribution.split_2z_amount(&reward_share).unwrap(); + + let distribution_signer_seeds = &[ + Distribution::SEED_PREFIX, + &distribution.dz_epoch.as_seed(), + &[distribution.bump_seed], + ]; + + let mut total_transferred_share_amount = 0; + let mut transfer_count = 0; + + // Now split up the remaining share amount across the recipient ATAs. For + // each recipient, take the Associated Token Account (ATA) and transfer the + // share of 2Z tokens to it. + for RecipientShare { + recipient_key, + share, + } in contributor_rewards.recipient_shares.active_iter() + { + // Account 7 + i must be the ATA owned by the recipient. This account + // must be writable, but we do not need to check this because the + // transfer CPI call will fail if this account is not. + let (account_index, ata_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let ata_key = get_associated_token_address(recipient_key, &DOUBLEZERO_MINT_KEY); + + // Enforce this account location. + if ata_info.key != &ata_key { + msg!( + "Expected ATA for recipient {} (account {})", + recipient_key, + account_index + ); + return Err(ProgramError::InvalidAccountData); + } + + // Calculate this recipient's portion of the remaining share amount + // based on their proportional share percentage + let recipient_share_amount = share.mul_scalar(remaining_share_amount); + total_transferred_share_amount += recipient_share_amount; + + let token_transfer_ix = token_instruction::transfer( + &spl_token_interface::ID, + distribution_2z_token_pda_info.key, + &ata_key, + distribution.info.key, + &[], // signer_pubkeys + recipient_share_amount, + ) + .unwrap(); + + invoke_signed_unchecked(&token_transfer_ix, accounts, &[distribution_signer_seeds])?; + msg!( + "Transferred {} 2Z tokens to {}", + recipient_share_amount, + recipient_key + ); + + transfer_count += 1; + } + + // There must be at least one recipient. + if transfer_count == 0 { + msg!("Contributor recipients must be configured"); + return Err(ProgramError::InvalidAccountData); + } + + // Add any dust (rounding remainder) to the burn amount to ensure all tokens + // are accounted for. + burn_share_amount += remaining_share_amount - total_transferred_share_amount; + + distribution.distributed_2z_amount += total_transferred_share_amount; + distribution.burned_2z_amount += burn_share_amount; + distribution.distributed_rewards_count += 1; + + let token_burn_ix = token_instruction::burn( + &spl_token_interface::ID, + distribution_2z_token_pda_info.key, + &DOUBLEZERO_MINT_KEY, + distribution.info.key, + &[], + burn_share_amount, + ) + .unwrap(); + + invoke_signed_unchecked(&token_burn_ix, accounts, &[distribution_signer_seeds])?; + msg!("Burned {} 2Z tokens", burn_share_amount); + + // Finally, pay the relayer for invoking this instruction. + + let distribute_rewards_relay_lamports = distribution.distribute_rewards_relay_lamports as u64; + + **relayer_info.lamports.borrow_mut() += distribute_rewards_relay_lamports; + **distribution.info.lamports.borrow_mut() -= distribute_rewards_relay_lamports; + + msg!( + "Moved {} lamports to relayer", + distribute_rewards_relay_lamports + ); + + Ok(()) +} + +fn try_initialize_contributor_rewards( + accounts: &[AccountInfo], + service_key: Pubkey, +) -> ProgramResult { + msg!("Initialize contributor rewards"); + + // We expect the following accounts for this instruction: + // - 0: Payer. + // - 1: New contributor rewards. + // - 2: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be a signer and writable because it will send lamports to + // the new contributor rewards account. We do not check these fields + // because the create-account workflow requires that this account is + // writable and a signer. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Account 1 must be the new contributor rewards account. The create-account + // workflow requires that this account does not exist yet and is writable. + let (account_index, new_contributor_rewards_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_contributor_rewards_key, contributor_rewards_bump) = + ContributorRewards::find_address(&service_key); + + // Enforce this account location and seed validity. + if new_contributor_rewards_info.key != &expected_contributor_rewards_key { + msg!( + "Invalid seeds for contributor rewards (account {})", + account_index + ); + return Err(ProgramError::InvalidSeeds); + } + + try_create_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: &expected_contributor_rewards_key, + signer_seeds: &[ + ContributorRewards::SEED_PREFIX, + service_key.as_ref(), + &[contributor_rewards_bump], + ], + }, + new_contributor_rewards_info.lamports(), + zero_copy::data_end::(), + &ID, + accounts, + Default::default(), + )?; + + // Finally, initialize the contributor rewards with the service key. + let (mut contributor_rewards, _) = + zero_copy::try_initialize::(new_contributor_rewards_info)?; + + contributor_rewards.service_key = service_key; + + Ok(()) +} + +fn try_set_rewards_manager(accounts: &[AccountInfo], rewards_manager_key: Pubkey) -> ProgramResult { + msg!("Set rewards manager"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Contributor manager. + // - 2: Contributor rewards. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + // Account 1 must be the contributor manager. + // + // This call ensures that the contributor manager is a signer and is the + // same contributor manager encoded in the program config. + let authorized_use = VerifiedProgramAuthority::try_next_accounts( + &mut accounts_iter, + Authority::ContributorManager, + )?; + + // Make sure the program is not paused. + authorized_use.program_config.try_require_unpaused()?; + + // Account 2 must be the contributor rewards. + let mut contributor_rewards = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("Service key: {}", contributor_rewards.service_key); + + if contributor_rewards.is_set_rewards_manager_blocked() { + msg!("Blocked"); + return Err(ProgramError::InvalidAccountData); + } + + msg!("rewards_manager_key: {}", rewards_manager_key); + contributor_rewards.rewards_manager_key = rewards_manager_key; + + Ok(()) +} + +fn try_configure_contributor_rewards( + accounts: &[AccountInfo], + setting: ContributorRewardsConfiguration, +) -> Result<(), ProgramError> { + msg!("Configure contributor rewards"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Contributor rewards. + // - 2: Rewards manager. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let program_config = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Make sure the program is not paused. + program_config.try_require_unpaused()?; + + // Account 1 must be the contributor rewards. + let mut contributor_rewards = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("Service key: {}", contributor_rewards.service_key); + + // Account 2 must be the rewards manager. + let (account_index, rewards_manager_info) = try_next_enumerated_account( + &mut accounts_iter, + NextAccountOptions { + must_be_signer: true, + ..Default::default() + }, + )?; + + // The rewards manager must be the one recognized in the contributor rewards + // account. + if rewards_manager_info.key != &contributor_rewards.rewards_manager_key { + msg!("Invalid rewards manager (account {})", account_index); + return Err(ProgramError::InvalidAccountData); + } + + match setting { + ContributorRewardsConfiguration::Recipients(recipients) => { + let recipient_shares = RecipientShares::new(&recipients).ok_or_else(|| { + msg!("Invalid recipients"); + ProgramError::InvalidAccountData + })?; + + msg!("Recipients"); + recipient_shares.active_iter().for_each(|recipient| { + msg!("{}: {}", recipient.recipient_key, recipient.share); + }); + contributor_rewards.recipient_shares = recipient_shares; + } + ContributorRewardsConfiguration::IsSetRewardsManagerBlocked(should_block) => { + msg!("Set flag"); + msg!("is_set_rewards_manager_blocked: {}", should_block); + contributor_rewards.set_is_set_rewards_manager_blocked(should_block); + } + } + + Ok(()) +} + +fn try_verify_distribution_merkle_root( + accounts: &[AccountInfo], + kind: DistributionMerkleRootKind, + proof: MerkleProof, +) -> ProgramResult { + msg!("Verify distribution merkle root"); + + // Enforce that the merkle proof uses an indexed tree. This index will be + // referenced later in this instruction processor. + let leaf_index = try_leaf_index(&proof)?; + + // We expect only the distribution account for this instruction. + let mut accounts_iter = accounts.iter().enumerate(); + + let distribution = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("DZ epoch: {}", distribution.dz_epoch); + + match kind { + DistributionMerkleRootKind::SolanaValidatorDebt(debt) => { + msg!("Solana validator debt {}", leaf_index); + + let computed_merkle_root = + proof.root_from_pod_leaf(&debt, Some(SolanaValidatorDebt::LEAF_PREFIX)); + + if computed_merkle_root != distribution.solana_validator_debt_merkle_root { + msg!("Invalid computed merkle root: {}", computed_merkle_root); + return Err(ProgramError::InvalidInstructionData); + } + + msg!(" node_id: {}", debt.node_id); + msg!(" amount: {}", debt.amount); + } + DistributionMerkleRootKind::RewardShare(reward) => { + msg!("Reward share {}", leaf_index); + + let unit_share = reward.checked_unit_share().ok_or_else(|| { + msg!("Invalid unit share {}", reward.unit_share); + ProgramError::InvalidInstructionData + })?; + + let economic_burn_rate = reward.checked_economic_burn_rate().ok_or_else(|| { + msg!("Invalid economic burn rate {}", reward.economic_burn_rate()); + ProgramError::InvalidInstructionData + })?; + + let computed_merkle_root = + proof.root_from_pod_leaf(&reward, Some(RewardShare::LEAF_PREFIX)); + + if computed_merkle_root != distribution.rewards_merkle_root { + msg!("Invalid computed merkle root: {}", computed_merkle_root); + return Err(ProgramError::InvalidInstructionData); + } + + msg!(" contributor_key: {}", reward.contributor_key); + msg!(" unit_share: {}", unit_share); + msg!(" is_blocked: {}", reward.is_blocked()); + msg!(" economic_burn_rate: {}", economic_burn_rate); + } + } + Ok(()) +} + +fn try_initialize_solana_validator_deposit( + accounts: &[AccountInfo], + node_id: Pubkey, +) -> ProgramResult { + msg!("Initialize Solana validator deposit"); + + // We expect the following accounts for this instruction: + // - 0: Solana validator deposit. + // - 1: Payer (funder for new account). + // - 2: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the new Solana validator deposit. The create-account + // workflow requires that this account does not exist yet and is writable. + let (account_index, new_solana_validator_deposit_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_solana_validator_deposit_key, solana_validator_deposit_bump) = + SolanaValidatorDeposit::find_address(&node_id); + + // Enforce this account location. + if new_solana_validator_deposit_info.key != &expected_solana_validator_deposit_key { + msg!( + "Invalid address for Solana validator deposit (account {})", + account_index + ); + return Err(ProgramError::InvalidAccountData); + } + + // Account 1 must be a signer and writable because it will send lamports to + // the new Solana validator deposit account. We do not check these fields + // because the create-account workflow requires that this account is + // writable and a signer. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Lamports may have already been transferred to this account before its + // creation. We should capture these lamports and add them to the new + // account's lamports. + let additional_lamports = new_solana_validator_deposit_info.lamports(); + + try_create_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: &expected_solana_validator_deposit_key, + signer_seeds: &[ + SolanaValidatorDeposit::SEED_PREFIX, + node_id.as_ref(), + &[solana_validator_deposit_bump], + ], + }, + new_solana_validator_deposit_info.lamports(), + zero_copy::data_end::(), + &ID, + accounts, + CreateAccountOptions { + rent_sysvar: None, + additional_lamports: Some(additional_lamports), + }, + )?; + + // Finally, initialize the solana validator deposit with the node id. + let (mut solana_validator_deposit, _) = + zero_copy::try_initialize::(new_solana_validator_deposit_info)?; + solana_validator_deposit.node_id = node_id; + + Ok(()) +} + +fn try_initialize_rewards_integration(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Initialize rewards integration"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Admin. + // - 2: Integration program (must be executable). + // - 3: Payer (funder for new account). + // - 4: New rewards integration. + // - 5: Journal (writable; its integrations_count gets upticked). + // - 6: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + // Accounts 0 and 1 must be the program config and admin. This call ensures + // that the admin is a signer and is the same admin encoded in the program + // config. + let _authorized_use = + VerifiedProgramAuthority::try_next_accounts(&mut accounts_iter, Authority::Admin)?; + + // Account 2 must be the integration program. It must be executable. Its + // pubkey is the source of truth for the integration's program ID — the + // PDA seeds and the value persisted into RewardsIntegration both come + // from it. + let (_, integration_program_info) = try_next_enumerated_account( + &mut accounts_iter, + NextAccountOptions { + must_be_executable: true, + ..Default::default() + }, + )?; + let integration_program_id = *integration_program_info.key; + + // Account 3 must be a signer and writable because it will send lamports to + // the new rewards integration account. We do not check these fields because + // the create-account workflow requires that this account is writable and a + // signer. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Account 4 must be the new rewards integration account. The create-account + // workflow requires that this account does not exist yet and is writable. + let (account_index, new_rewards_integration_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_rewards_integration_key, rewards_integration_bump) = + RewardsIntegration::find_address(&integration_program_id); + + if new_rewards_integration_info.key != &expected_rewards_integration_key { + msg!( + "Invalid seeds for rewards integration (account {})", + account_index + ); + return Err(ProgramError::InvalidSeeds); + } + + try_create_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: &expected_rewards_integration_key, + signer_seeds: &[ + RewardsIntegration::SEED_PREFIX, + integration_program_id.as_ref(), + &[rewards_integration_bump], + ], + }, + new_rewards_integration_info.lamports(), + zero_copy::data_end::(), + &ID, + accounts, + Default::default(), + )?; + + // Initialize the rewards integration with the bump seed and the + // integration program ID. + let (mut rewards_integration, _) = + zero_copy::try_initialize::(new_rewards_integration_info)?; + rewards_integration.bump_seed = rewards_integration_bump; + rewards_integration.program_id = integration_program_id; + + // Account 5 must be the journal. We uptick its integrations counter so + // that distributions created from here on will snapshot the new total. + let mut journal = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + rewards_integration.registration_index = journal.integrations_count; + journal.integrations_count = journal + .integrations_count + .checked_add(1) + .expect("Journal.integrations_count overflowed"); + + Ok(()) +} + +fn try_collect_integration_rewards(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Collect integration rewards"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Distribution (writable). + // - 2: Rewards integration (whitelist entry for the target integration). + // - 3: Integration's distribution account (writable, opaque to rev-distr). + // - 4: Integration's 2Z bucket (writable). + // - 5: Destination 2Z token account (writable, the distribution's 2Z PDA). + // - 6: Integration program (CPI target; required by the runtime when the + // CPI below runs — no check needed here). + // - 7: SPL Token program (required so the integration's own token CPI + // can resolve). + let mut accounts_iter = accounts.iter().enumerate(); + + let program_config = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + program_config.try_require_unpaused()?; + + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Refuse once every registered integration has already been collected + // for this epoch. + if distribution.are_all_integrations_collected() { + msg!("All integrations already collected for this epoch"); + return Err(ProgramError::InvalidAccountData); + } + + let rewards_integration = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + let registration_index = rewards_integration.registration_index; + + // Only integrations that existed when this distribution was initialized + // belong to its snapshot. Collecting one registered afterward (index at or + // beyond the snapshot) would bump integrations_collected_count toward the + // snapshot without collecting a snapshot integration, letting + // are_all_integrations_collected() report true while a real snapshot + // integration stays pending. Reject it so that gate stays honest. + if registration_index >= distribution.integrations_count_snapshot { + msg!( + "Integration registration index {} is at or beyond this distribution's snapshot count of {}", + registration_index, + distribution.integrations_count_snapshot + ); + return Err(ProgramError::InvalidAccountData); + } + + let already_collected = distribution + .checked_is_integration_collected(registration_index) + .ok_or_else(|| { + msg!( + "Integration registration index {} exceeds bitmap capacity", + registration_index + ); + ProgramError::InvalidAccountData + })?; + if already_collected { + msg!( + "Integration {} already collected this epoch", + rewards_integration.program_id + ); + return Err(ProgramError::InvalidAccountData); + } + + // Accounts 3 and 4 are opaque to rev-distr and forwarded to the CPI. The + // integration enforces its own layout on these slots. + let (_, integration_distribution_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (_, integration_2z_bucket_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Account 5 must be this distribution's 2Z token PDA. + let (_, destination_token_account_info, _) = try_next_2z_token_pda_info( + &mut accounts_iter, + distribution.info.key, + "distribution's", + Some(distribution.token_2z_pda_bump_seed), + )?; + + // Snapshot destination balance pre-CPI so we can measure the transferred + // amount via delta. + let balance_before = try_token_account_amount(destination_token_account_info)?; + + let withdraw_ix = try_build_instruction( + &rewards_integration.program_id, + WithdrawIntegrationRewardsAccounts { + integration_distribution_key: *integration_distribution_info.key, + integration_2z_bucket_key: *integration_2z_bucket_info.key, + destination_token_account_key: *destination_token_account_info.key, + parent_distribution_key: *distribution.info.key, + }, + &IntegrationInstructionData::WithdrawIntegrationRewards, + ) + .unwrap(); + + let distribution_signer_seeds = &[ + Distribution::SEED_PREFIX, + &distribution.dz_epoch.as_seed(), + &[distribution.bump_seed], + ]; + + invoke_signed_unchecked(&withdraw_ix, accounts, &[distribution_signer_seeds])?; + + let balance_after = try_token_account_amount(destination_token_account_info)?; + // No underflow: destination is rev-distr's Distribution 2Z PDA + let collected_amount = balance_after - balance_before; + + distribution.collected_2z_from_integrations = distribution + .collected_2z_from_integrations + .checked_add(collected_amount) + .expect("Distribution.collected_2z_from_integrations overflowed"); + distribution.integrations_collected_count = distribution + .integrations_collected_count + .checked_add(1) + .expect("Distribution.integrations_collected_count overflowed"); + distribution + .checked_set_integration_collected(registration_index) + .ok_or_else(|| { + msg!( + "Integration registration index {} exceeds bitmap capacity", + registration_index + ); + ProgramError::InvalidAccountData + })?; + + msg!( + "Collected {} 2Z from integration {}", + collected_amount, + rewards_integration.program_id + ); + + Ok(()) +} + +fn try_pay_solana_validator_debt( + accounts: &[AccountInfo], + amount: u64, + proof: MerkleProof, +) -> ProgramResult { + msg!("Pay Solana validator debt"); + + // Enforce that the merkle proof uses an indexed tree. This index will be + // referenced later in this instruction processor. + let leaf_index = try_leaf_index(&proof)?; + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Distribution. + // - 2: Solana validator deposit. + // - 3: Journal. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let program_config = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Make sure the program is not paused. + program_config.try_require_unpaused()?; + + // Account 1 must be the distribution. + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("DZ epoch: {}", distribution.dz_epoch); + + // We cannot pay Solana validator debt until the debt accountant has + // finalized the debt calculation. + distribution.try_require_finalized_debt_calculation()?; + + // Update the collected payments amount now to avoid a borrow issue later + // in this instruction. + distribution.collected_solana_validator_payments += amount; + distribution.solana_validator_payments_count += 1; + + // Account 2 must be the Solana validator deposit. + let solana_validator_deposit = ZeroCopyMutAccount::::try_next_accounts( + &mut accounts_iter, + Some(&ID), + )?; + msg!("Node ID: {}", solana_validator_deposit.node_id); + + // Bits indicating whether debt has been paid for specific leaf indices are + // stored in the distribution's remaining data. + let processed_bitmap_range = distribution.processed_solana_validator_debt_bitmap_range(); + + try_process_remaining_data_leaf_index( + &mut distribution.remaining_data[processed_bitmap_range], + leaf_index, + ) + .inspect_err(|_| { + msg!("Solana validator debt already processed"); + })?; + + let debt = SolanaValidatorDebt { + node_id: solana_validator_deposit.node_id, + amount, + }; + + let computed_merkle_root = + proof.root_from_pod_leaf(&debt, Some(SolanaValidatorDebt::LEAF_PREFIX)); + + // This merkle root will be used to verify the debt after we determine + // the debt has not already been paid. + let expected_merkle_root = distribution.solana_validator_debt_merkle_root; + + if computed_merkle_root != expected_merkle_root { + msg!("Invalid computed merkle root: {}", computed_merkle_root); + return Err(ProgramError::InvalidInstructionData); + } + + // Finally, move lamports from the Solana validator deposit to the + // Journal. The journal's lamports will be withdrawn from the registered + // swap program in exchange for 2Z tokens. + let mut solana_validator_deposit_lamports = solana_validator_deposit.info.lamports.borrow_mut(); + + // We cannot remove more lamports than the rent exemption. + let rent_exemption_lamports = Rent::get() + .unwrap() + .minimum_balance(zero_copy::data_end::()); + + if solana_validator_deposit_lamports.saturating_sub(rent_exemption_lamports) < amount { + msg!("Insufficient funds in Solana validator deposit to pay debt"); + return Err(ProgramError::InvalidAccountData); + } + + // Account 3 must be the journal. + let mut journal = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + **solana_validator_deposit_lamports -= amount; + **journal.info.lamports.borrow_mut() += amount; + + journal.total_sol_balance += amount; + msg!( + "Updated journal's SOL balance to {}", + journal.total_sol_balance + ); + + Ok(()) +} + +fn try_enable_solana_validator_debt_write_off(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Enable Solana validator debt write off"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Distribution. + // - 2: Payer. + // - 3: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let program_config = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Make sure the program is not paused. + program_config.try_require_unpaused()?; + + // Cannot enable write-offs before the activation epoch. + if !program_config.is_debt_write_off_feature_activated() { + let activation_epoch = program_config.debt_write_off_feature_activation_epoch; + + if activation_epoch == 0 { + msg!("Debt write-off feature activation epoch not configured"); + } else { + msg!( + "Debt write-off feature activates at epoch {}", + activation_epoch + ); + } + + return Err(ProgramError::InvalidAccountData); + } + + // Account 1 must be the distribution. + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("DZ epoch: {}", distribution.dz_epoch); + + if distribution.is_solana_validator_debt_write_off_enabled() { + msg!("Solana validator debt write off is already enabled"); + return Err(ProgramError::InvalidAccountData); + } + + distribution.set_is_solana_validator_debt_write_off_enabled(true); + + // Debt calculation must have been finalized before write offs can be + // enabled. + distribution.try_require_finalized_debt_calculation()?; + + // We need to realloc the distribution account to add the number of bits + // needed to store whether a Solana validator has written off debt. + let additional_data_len = if distribution.total_solana_validators % 8 == 0 { + distribution.total_solana_validators / 8 + } else { + distribution.total_solana_validators / 8 + 1 + }; + + // Set the index of where to find the bits to indicate which Solana + // validator debt has been written off. + distribution.processed_solana_validator_debt_write_off_start_index = + distribution.remaining_data.len() as u32; + distribution.processed_solana_validator_debt_write_off_end_index = distribution + .processed_solana_validator_debt_write_off_start_index + .saturating_add(additional_data_len); + + // Avoid borrowing while in mutable borrow state. + let distribution_info = distribution.info; + drop(distribution); + + let new_data_len = distribution_info + .data_len() + .saturating_add(additional_data_len as usize); + distribution_info.resize(new_data_len)?; + + let additional_lamports_for_resize = Rent::get() + .unwrap() + .minimum_balance(new_data_len) + .saturating_sub(distribution_info.lamports()); + + // Account 2 must be the payer. In order to transfer lamports from the payer + // to the distribution, this account must be writable. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let transfer_ix = system_instruction::transfer( + payer_info.key, + distribution_info.key, + additional_lamports_for_resize, + ); + + invoke_signed_unchecked(&transfer_ix, accounts, &[])?; + + msg!( + "Increase distribution account size by {} byte{}", + additional_data_len, + if additional_data_len == 1 { "" } else { "s" } + ); + + Ok(()) +} + +fn try_write_off_solana_validator_debt( + accounts: &[AccountInfo], + amount: u64, + proof: MerkleProof, +) -> ProgramResult { + msg!("Write off Solana validator debt"); + + // Enforce that the merkle proof uses an indexed tree. This index will be + // referenced later in this instruction processor. + let leaf_index = try_leaf_index(&proof)?; + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Debt accountant. + // - 2: Distribution. + // - 3: Write-off distribution. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let authorized_use = + VerifiedProgramAuthority::try_next_accounts(&mut accounts_iter, Authority::DebtAccountant)?; + + // Make sure the program is not paused. + authorized_use.program_config.try_require_unpaused()?; + + // Account 2 must be the distribution. + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + let dz_epoch = distribution.dz_epoch; + msg!("DZ epoch: {}", dz_epoch); + + let mut solana_validator_deposit = + ZeroCopyMutAccount::::try_next_accounts( + &mut accounts_iter, + Some(&ID), + )?; + let node_id = solana_validator_deposit.node_id; + msg!("Node ID: {}", node_id); + + // Track the bad debt in the Solana validator deposit account. + solana_validator_deposit.written_off_sol_debt += amount; + + let solana_validator_deposit_info = solana_validator_deposit.info; + drop(solana_validator_deposit); + + // If there are enough lamports to pay debt, revert. + let deposit_lamports = solana_validator_deposit_info.lamports(); + let rent_sysvar = Rent::get().unwrap(); + let rent_exemption_lamports = + rent_sysvar.minimum_balance(solana_validator_deposit_info.data_len()); + let excess_lamports = deposit_lamports.saturating_sub(rent_exemption_lamports); + + if excess_lamports >= amount { + msg!("Lamports balance in deposit account is enough to cover debt amount"); + return Err(ProgramError::InvalidAccountData); + } + + // We cannot write off Solana validator debt until write offs have been + // enabled. This check also ensures that the debt calculation has been + // finalized. + if !distribution.is_solana_validator_debt_write_off_enabled() { + msg!("Solana validator debt write off is not enabled yet"); + return Err(ProgramError::InvalidAccountData); + } + + distribution.solana_validator_write_off_count += 1; + + // Bits indicating whether debt has been written off for specific leaf + // indices are stored in the distribution's remaining data. + let write_off_bitmap_range = + distribution.processed_solana_validator_debt_write_off_bitmap_range(); + + try_process_remaining_data_leaf_index( + &mut distribution.remaining_data[write_off_bitmap_range], + leaf_index, + ) + .inspect_err(|_| { + msg!( + "Solana validator debt already written off for epoch {}", + dz_epoch + ); + })?; + + // Bits indicating whether debt has been processed for specific leaf indices + // are stored in the distribution's remaining data. Any debt (written off or + // not) must be marked as processed. + let processed_bitmap_range = distribution.processed_solana_validator_debt_bitmap_range(); + + try_process_remaining_data_leaf_index( + &mut distribution.remaining_data[processed_bitmap_range], + leaf_index, + ) + .inspect_err(|_| { + msg!( + "Solana validator debt already processed for epoch {}", + dz_epoch + ); + })?; + + let debt = SolanaValidatorDebt { node_id, amount }; + let computed_merkle_root = + proof.root_from_pod_leaf(&debt, Some(SolanaValidatorDebt::LEAF_PREFIX)); + + // This merkle root will be used to verify the debt after we determine + // the debt has not already been processed. + let expected_merkle_root = distribution.solana_validator_debt_merkle_root; + + if computed_merkle_root != expected_merkle_root { + msg!("Invalid computed merkle root: {}", computed_merkle_root); + return Err(ProgramError::InvalidInstructionData); + } + + // We should drop the reference to this account just in case the write-off + // distribution is the same as the distribution above. + drop(distribution); + + // Account 3 must be the same distribution or a distribution reflecting an + // epoch ahead of the current distribution's epoch. + let mut write_off_distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("Write-off DZ epoch: {}", write_off_distribution.dz_epoch); + + if write_off_distribution.dz_epoch < dz_epoch { + msg!( + "Write-off distribution's epoch must be at least the epoch of the current distribution" + ); + return Err(ProgramError::InvalidAccountData); + } + + // We cannot account for uncollectible debt if the write-off distribution + // has already swept 2Z tokens. + write_off_distribution + .try_require_has_not_swept_2z_tokens() + .inspect_err(|_| { + msg!( + "Write-off epoch {} has already swept 2Z tokens", + write_off_distribution.dz_epoch + ); + })?; + + // Out of paranoia, prevent accounting for uncollectible debt if the + // write-off distribution is not finalized. + write_off_distribution + .try_require_finalized_debt_calculation() + .inspect_err(|_| { + msg!( + "Write-off epoch {} has unfinalized debt", + write_off_distribution.dz_epoch + ); + })?; + + // Update the uncollectible SOL debt amount of the write-off distribution. + // + // We make the assumption that with the existence of this distribution, the + // last distribution may have swept 2Z tokens so rewards can be distributed + // for that epoch. + // + // By tracking the uncollectible debt here, the rewards paid to contributors + // will be reduced for this distribution by the amount of SOL debt that was + // written off. + write_off_distribution.uncollectible_sol_debt += debt.amount; + + // Double-check that the uncollectible debt does not exceed the total debt + // for this distribution. + write_off_distribution + .checked_total_sol_debt() + .ok_or_else(|| { + msg!("Uncollectible SOL debt exceeds total debt for write-off epoch"); + ProgramError::ArithmeticOverflow + })?; + + msg!( + "Updated uncollectible SOL debt to {} for distribution epoch {}", + write_off_distribution.uncollectible_sol_debt, + write_off_distribution.dz_epoch + ); + + Ok(()) +} + +fn try_initialize_swap_destination(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Initialize swap destination"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Payer. + // - 2: Swap authority. + // - 3: New swap destination 2Z token account. + // - 4: 2Z mint. + // - 5: SPL Token program. + // - 6: System program. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let mut program_config = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Account 1 must be a signer and writable because it will send lamports to + // the new swap destination 2Z token account. We do not check these fields + // because the create-account workflow requires that this account is + // writable and a signer. + let (_, payer_info) = try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Account 2 must be the swap authority. We do not store any data in this + // account. It is purely used as a signer for token transfers. + let (account_index, swap_authority_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let (expected_swap_authority_key, swap_authority_bump) = state::find_swap_authority_address(); + program_config.swap_authority_bump_seed = swap_authority_bump; + + // Enforce this account location and seed validity. + if swap_authority_info.key != &expected_swap_authority_key { + msg!( + "Invalid seeds for swap authority (account {})", + account_index + ); + return Err(ProgramError::InvalidSeeds); + } + + // Account 3 must be the new swap destination 2Z token account. The + // create-account workflow requires that this account does not exist yet and + // is writable. + let (_, new_swap_destination_2z_info, swap_destination_2z_bump) = try_next_2z_token_pda_info( + &mut accounts_iter, + &expected_swap_authority_key, + "swap destination", + None, // bump_seed + )?; + program_config.swap_destination_2z_bump_seed = swap_destination_2z_bump; + + // Account 4 must be the 2Z mint. + try_next_2z_mint_info(&mut accounts_iter)?; + + // Account 5 must be the SPL Token program. + try_next_token_program_info(&mut accounts_iter)?; + + try_create_token_account( + Invoker::Signer(payer_info.key), + Invoker::Pda { + key: new_swap_destination_2z_info.key, + signer_seeds: &[ + state::TOKEN_2Z_PDA_SEED_PREFIX, + expected_swap_authority_key.as_ref(), + &[swap_destination_2z_bump], + ], + }, + &DOUBLEZERO_MINT_KEY, + &expected_swap_authority_key, + new_swap_destination_2z_info.lamports(), + accounts, + None, // rent_sysvar + )?; + + Ok(()) +} + +fn try_sweep_distribution_tokens(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Sweep distribution tokens"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Distribution. + // - 2: Journal. + // - 3: SOL/2Z Swap configuration registry. + // - 4: SOL/2Z Swap program state. + // - 5: SOL/2Z Swap fills registry. + // - 6: SOL/2Z Swap program. + // - 7: Distribution 2Z token account. + // - 8: Swap authority. + // - 9: Swap 2Z destination account. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let program_config = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Make sure the program is not paused. + program_config.try_require_unpaused()?; + + // Account 1 must be the distribution. + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("DZ epoch: {}", distribution.dz_epoch); + + // Make sure the distribution has not already swept 2Z tokens. + distribution.try_require_has_not_swept_2z_tokens()?; + distribution.set_has_swept_2z_tokens(true); + + // Make sure the distribution rewards calculation is finalized. + if !distribution.is_rewards_calculation_finalized() { + msg!("Distribution rewards have not been finalized"); + return Err(ProgramError::InvalidAccountData); + } + + // Account 2 must be the journal. + let mut journal = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + if journal.next_dz_epoch_to_sweep_tokens != distribution.dz_epoch { + msg!( + "Can only sweep tokens for DZ epoch {}", + journal.next_dz_epoch_to_sweep_tokens + ); + return Err(ProgramError::InvalidAccountData); + } + + // Uptick the next DZ epoch for the next distribution to sweep tokens. + journal.next_dz_epoch_to_sweep_tokens = journal + .next_dz_epoch_to_sweep_tokens + .saturating_add_duration(1); + + // We will attempt to account for the total SOL debt and account for this + // amount by reducing the SOL balance of the journal. The SOL that this + // balance tracks will have already been swapped by the swap program. + let total_sol_debt = distribution.checked_total_sol_debt().unwrap(); + + // If there is no debt, we can return early. + if total_sol_debt == 0 { + msg!("Zero SOL debt. Nothing to sweep"); + + return Ok(()); + } + + if journal.swapped_sol_amount < total_sol_debt { + msg!("Journal does not have enough swapped SOL to cover the SOL debt"); + return Err(ProgramError::InvalidAccountData); + } + + msg!( + "Journal's swapped SOL balance before: {}", + journal.swapped_sol_amount + ); + journal.swapped_sol_amount -= total_sol_debt; + + //////////////////////////////////////////////////////////////////////////// + // + // Integration with SOL/2Z Swap program. We need to dequeue fills from the + // SOL/2Z Swap program to account for the amount of 2Z that corresponds to + // the total SOL debt. + // + // The first three accounts of the CPI call are owned by the SOL/2Z Swap + // program. The fourth account is the journal, which will act as a signer. + // Because we already have the journal account, we only need to take three + // more accounts. + // + // CPI accounts must have the following properties: + // - 0: Read-only. + // - 1: Read-only. + // - 2: Writable. + // - 3: Read-only signer. + // + //////////////////////////////////////////////////////////////////////////// + + let sol_2z_swap_program_id = program_config.sol_2z_swap_program_id; + + let (_, sol_2z_swap_configuration_registry_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (_, sol_2z_swap_program_state_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (_, sol_2z_swap_fills_registry_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + let (account_index, sol_2z_swap_program_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + // Enforce SOL/2Z Swap program's location. + if sol_2z_swap_program_info.key != &sol_2z_swap_program_id { + msg!("Invalid SOL/2Z Swap program (account {})", account_index); + return Err(ProgramError::InvalidAccountData); + } + + const DEQUEUE_FILLS_SELECTOR: [u8; 8] = [146, 69, 6, 12, 174, 95, 136, 61]; + + let mut dequeue_fills_ix_data = [0; 16]; + dequeue_fills_ix_data[..8].copy_from_slice(&DEQUEUE_FILLS_SELECTOR); + dequeue_fills_ix_data[8..16].copy_from_slice(&total_sol_debt.to_le_bytes()); + + let dequeue_fills_ix = try_build_instruction( + &sol_2z_swap_program_id, + DequeueFillsCpiAccounts { + configuration_registry_key: *sol_2z_swap_configuration_registry_info.key, + program_state_key: *sol_2z_swap_program_state_info.key, + fills_registry_key: *sol_2z_swap_fills_registry_info.key, + journal_key: *journal.info.key, + sol_2z_swap_program_id: None, + }, + &dequeue_fills_ix_data, + ) + .unwrap(); + + invoke_signed_unchecked( + &dequeue_fills_ix, + accounts, + &[&[Journal::SEED_PREFIX, &[journal.bump_seed]]], + )?; + + let (return_data_program_id, return_data) = solana_cpi::get_return_data().ok_or_else(|| { + msg!("No return data found after CPI to SOL/2Z Swap program"); + ProgramError::InvalidAccountData + })?; + + // Make sure the SOL/2Z Swap program set the data. + if return_data_program_id != sol_2z_swap_program_id { + msg!("Return data program ID is not the SOL/2Z Swap program"); + return Err(ProgramError::InvalidAccountData); + } + + let (return_sol_amount, token_2z_amount, _) = + <(u64, u64, u64) as BorshDeserialize>::try_from_slice(&return_data).map_err(|_| { + msg!("Failed to deserialize return data from SOL/2Z Swap program"); + ProgramError::InvalidAccountData + })?; + + if return_sol_amount != total_sol_debt { + msg!("SOL amount in return data does not equal total SOL debt"); + return Err(ProgramError::InvalidAccountData); + } + + //////////////////////////////////////////////////////////////////////////// + // + // End integration with SOL/2Z Swap program. + // + //////////////////////////////////////////////////////////////////////////// + + // Record the swept amount to the distribution. This amount will also be + // used to token transfer the 2Z tokens to the distribution. + distribution.collected_2z_converted_from_sol = token_2z_amount; + + // Account 7 must be the distribution's 2Z token account. + let (_, distribution_2z_token_pda_info, _) = try_next_2z_token_pda_info( + &mut accounts_iter, + distribution.info.key, + "distribution's", + Some(distribution.token_2z_pda_bump_seed), + )?; + + // Account 8 must be the swap authority. It is assumed to be a signer + // because it is the authority that will be used to transfer 2Z from its + // token account to the distribution's token account. + let (account_index, swap_authority_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + let expected_swap_authority_key = program_config.checked_swap_authority_address().unwrap(); + + // Enforce this account location and seed validity. + if swap_authority_info.key != &expected_swap_authority_key { + msg!( + "Invalid address for swap authority (account {})", + account_index + ); + return Err(ProgramError::InvalidSeeds); + } + + // Account 9 must be the swap destination 2Z token account. + let (_, swap_destination_2z_info, _) = try_next_2z_token_pda_info( + &mut accounts_iter, + &expected_swap_authority_key, + "swap destination", + None, // bump_seed + )?; + + let token_transfer_ix = token_instruction::transfer( + &spl_token_interface::ID, + swap_destination_2z_info.key, + distribution_2z_token_pda_info.key, + swap_authority_info.key, + &[], // signer_pubkeys + token_2z_amount, + ) + .unwrap(); + + invoke_signed_unchecked( + &token_transfer_ix, + accounts, + &[&[ + state::SWAP_AUTHORITY_SEED_PREFIX, + &[program_config.swap_authority_bump_seed], + ]], + )?; + + msg!("Total SOL debt accounted for: {}", total_sol_debt); + msg!( + "Journal's swapped SOL balance after: {}", + journal.swapped_sol_amount + ); + msg!("Transferred {} 2Z tokens to distribution", token_2z_amount); + + journal.swap_2z_destination_balance -= token_2z_amount; + msg!( + "2Z swap destination balance now {}", + journal.swap_2z_destination_balance + ); + + Ok(()) +} + +fn try_withdraw_sol(accounts: &[AccountInfo], amount: u64) -> ProgramResult { + const MINT_2Z_ACCOUNT_INDEX: usize = 1; + const DESTINATION_ACCOUNT_INDEX: usize = 2; + + msg!("Withdraw SOL"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Withdraw SOL authority. + // - 2: Journal. + // - 3: SOL destination. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let program_config = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Make sure the program is not paused. + program_config.try_require_unpaused()?; + + // Make sure the SOL/2Z swap program ID is set by checking if the bump seed + // for the withdraw SOL authority is set. + if program_config.withdraw_sol_authority_bump_seed == 0 { + msg!("SOL/2Z swap program ID is not set"); + return Err(ProgramError::InvalidAccountData); + } + + // Account 1 must be the withdraw SOL authority. + let (account_index, withdraw_sol_authority_info) = try_next_enumerated_account( + &mut accounts_iter, + NextAccountOptions { + must_be_signer: true, + ..Default::default() + }, + )?; + + let expected_withdraw_sol_authority_key = program_config + .checked_withdraw_sol_authority_address() + .unwrap(); + + // Enforce this account location. + if withdraw_sol_authority_info.key != &expected_withdraw_sol_authority_key { + msg!( + "Invalid address for withdraw SOL authority (account {})", + account_index + ); + return Err(ProgramError::InvalidAccountData); + } + + // Check for a sibling instruction immediately before the invocation of this + // instruction. This ensures that a token transfer happened right before + // this withdraw SOL instruction, implementing atomic swap semantics. + let sibling_ix = solana_instruction::syscalls::get_processed_sibling_instruction(0) + .ok_or_else(|| { + msg!("No processed sibling instruction found"); + ProgramError::InvalidAccountData + })?; + + // We are enforcing that the sibling instruction is an SPL Token transfer + // to the swap destination account. This creates an atomic swap where + // 2Z tokens must be transferred before SOL can be withdrawn. + // + // First, check that the program is the SPL Token program. + if sibling_ix.program_id != spl_token_interface::ID { + msg!("Sibling instruction's program ID is not SPL Token"); + return Err(ProgramError::InvalidInstructionData); + } + + // Next, make sure that the instruction is a transfer checked call. Transfer + // checked requires the mint account, which we will verify is the 2Z mint. + // We will need the transfer amount to update the journal's balance of the + // swap destination account. + let transfer_amount = if let Ok(token_instruction::TokenInstruction::TransferChecked { + amount, + decimals: _, + }) = token_instruction::TokenInstruction::unpack(&sibling_ix.data) + { + amount + } else { + msg!("Sibling instruction is not a token transfer checked call"); + return Err(ProgramError::InvalidInstructionData); + }; + + // Generate the swap destination key so we can validate the destination + // token account in the sibling instruction. Presumably, the swap + // destination account has already been created if the token transfer was + // successful. + let expected_swap_destination_2z_key = program_config + .checked_swap_destination_2z_address() + .unwrap(); + + // Make sure the mint of the transfer checked call is 2Z. + if sibling_ix.accounts[MINT_2Z_ACCOUNT_INDEX].pubkey != DOUBLEZERO_MINT_KEY { + msg!("Sibling transfer checked call is not for 2Z mint"); + return Err(ProgramError::InvalidInstructionData); + } + + // Finally, make sure that the transfer is to the swap destination account. + if sibling_ix.accounts[DESTINATION_ACCOUNT_INDEX].pubkey != expected_swap_destination_2z_key { + msg!("Sibling transfer not for 2Z swap destination"); + return Err(ProgramError::InvalidInstructionData); + } + + // Account 2 must be the journal. We need to update the SOL balance and + // the 2Z swap destination balance. + let mut journal = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Make sure the journal has enough SOL to cover the amount. + if journal.total_sol_balance < amount { + msg!("Journal does not have enough SOL to cover the amount"); + return Err(ProgramError::InvalidAccountData); + } + + // Update balances. + + journal.total_sol_balance -= amount; + msg!("Journal's SOL balance now {}", journal.total_sol_balance); + + journal.swapped_sol_amount += amount; + msg!("Swapped SOL balance now {}", journal.swapped_sol_amount); + + journal.swap_2z_destination_balance += transfer_amount; + msg!( + "2Z swap destination balance now {} after transfer of {}", + journal.swap_2z_destination_balance, + transfer_amount + ); + + journal.lifetime_swapped_2z_amount += Uint::from(transfer_amount); + msg!( + "Lifetime swapped 2Z amount now {}", + journal.lifetime_swapped_2z_amount + ); + + // Move lamports from the journal to the SOL destination. + let (_, sol_destination_info) = try_next_enumerated_account( + &mut accounts_iter, + NextAccountOptions { + must_be_writable: true, + ..Default::default() + }, + )?; + + **journal.info.lamports.borrow_mut() -= amount; + **sol_destination_info.lamports.borrow_mut() += amount; + + Ok(()) +} + +fn try_set_distribution_economic_burn_rate( + accounts: &[AccountInfo], + burn_rate_value: u32, +) -> ProgramResult { + msg!("Set distribution economic burn rate"); + + let burn_rate = BurnRate::new(burn_rate_value).ok_or_else(|| { + msg!("Invalid burn rate value"); + ProgramError::InvalidInstructionData + })?; + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Rewards accountant. + // - 2: Distribution. + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + // Account 1 must be the rewards accountant. + // + // This call ensures that the rewards accountant is a signer and is the same + // rewards accountant encoded in the program config. + let authorized_use = VerifiedProgramAuthority::try_next_accounts( + &mut accounts_iter, + Authority::RewardsAccountant, + )?; + + // Make sure the program is not paused. + authorized_use.program_config.try_require_unpaused()?; + + // Account 2 must be the distribution. + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + msg!("DZ epoch: {}", distribution.dz_epoch); + + // Cannot set an economic burn rate if the rewards calculation has already + // been finalized. + distribution.try_require_unfinalized_rewards_calculation()?; + + distribution.economic_burn_rate = burn_rate; + + msg!("Economic burn rate is now {}", burn_rate); + + Ok(()) +} + +fn try_withdraw_solana_validator_deposit(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Withdraw Solana validator deposit"); + + // We expect the following accounts for this instruction: + // - 0: Program config. + // - 1: Solana validator deposit. + // - 2: Validator node. + // - 3: Beneficiary (optional). + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program config. + let program_config = + ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + // Make sure the program is not paused. + program_config.try_require_unpaused()?; + + // Account 1 must be the Solana validator deposit. + let solana_validator_deposit = ZeroCopyAccount::::try_next_accounts( + &mut accounts_iter, + Some(&ID), + )?; + let node_id = solana_validator_deposit.node_id; + msg!("Node ID: {}", node_id); + + // Account 2 must be the validator node. This account must match the + // node ID encoded in the Solana validator deposit. + let (account_index, validator_node_info) = + try_next_enumerated_account(&mut accounts_iter, Default::default())?; + + if validator_node_info.key != &node_id { + msg!( + "Invalid address for validator node (account {})", + account_index + ); + return Err(ProgramError::InvalidAccountData); + } + + // Account 3 may be the beneficiary of the excess lamports. If provided, the + // validator node must be a signer to act as an authority for the + // beneficiary. Otherwise, the validator node is the destination. + let beneficiary_info = match try_next_enumerated_account(&mut accounts_iter, Default::default()) + { + Ok((_, specified_beneficiary_info)) => { + if !validator_node_info.is_signer { + msg!("Validator node must be a signer when a beneficiary is provided"); + return Err(ProgramError::MissingRequiredSignature); + } + + specified_beneficiary_info + } + Err(_) => validator_node_info, + }; + + let written_off_sol_debt = solana_validator_deposit.written_off_sol_debt; + let solana_validator_deposit_info = solana_validator_deposit.info; + drop(solana_validator_deposit); + + let solana_validator_deposit_lamports = solana_validator_deposit_info.lamports(); + + // Withdraw the excess lamports beyond rent exemption and written-off debt. + let rent_exemption_lamports = Rent::get() + .unwrap() + .minimum_balance(zero_copy::data_end::()); + + let withdrawn_lamports = solana_validator_deposit_lamports + .saturating_sub(rent_exemption_lamports) + .saturating_sub(written_off_sol_debt); + + if withdrawn_lamports == 0 { + msg!( + "No excess lamports to withdraw. Delinquent debt: {}", + written_off_sol_debt + ); + return Err(ProgramError::InvalidAccountData); + } + + **solana_validator_deposit_info.lamports.borrow_mut() -= withdrawn_lamports; + **beneficiary_info.lamports.borrow_mut() += withdrawn_lamports; + + Ok(()) +} + +// +// Account info handling. +// + +/// Represents the different types of authorities that can perform +/// privileged operations in the revenue distribution program. +enum Authority { + /// Configures program settings. + Admin, + /// Initializes distributions, configures and finalizes distribution debt. + DebtAccountant, + /// Configures and finalizes distribution rewards. + RewardsAccountant, + /// Sets reward managers for contributor rewards. + ContributorManager, +} + +impl Authority { + #[inline(always)] + fn try_next_as_authorized_account<'b, 'c>( + &self, + accounts_iter: &mut EnumeratedAccountInfoIter<'b, 'c>, + program_config: &ProgramConfig, + ) -> Result<(usize, &'b AccountInfo<'c>), ProgramError> { + let (index, authority_info) = try_next_enumerated_account( + accounts_iter, + NextAccountOptions { + must_be_signer: true, + ..Default::default() + }, + )?; + + match self { + Authority::Admin => { + if authority_info.key != &program_config.admin_key { + msg!("Unauthorized admin (account {})", index); + return Err(ProgramError::InvalidAccountData); + } + } + Authority::DebtAccountant => { + if authority_info.key != &program_config.debt_accountant_key { + msg!("Unauthorized debt accountant (account {})", index); + return Err(ProgramError::InvalidAccountData); + } + } + Authority::RewardsAccountant => { + if authority_info.key != &program_config.rewards_accountant_key { + msg!("Unauthorized rewards accountant (account {})", index); + return Err(ProgramError::InvalidAccountData); + } + } + Authority::ContributorManager => { + if authority_info.key != &program_config.contributor_manager_key { + msg!("Unauthorized contributor manager (account {})", index); + return Err(ProgramError::InvalidAccountData); + } + } + } + + Ok((index, authority_info)) + } +} + +struct VerifiedProgramAuthority<'a, 'b> { + program_config: ZeroCopyAccount<'a, 'b, ProgramConfig>, + _authority: (usize, &'a AccountInfo<'b>), +} + +impl<'a, 'b> TryNextAccounts<'a, 'b, Authority> for VerifiedProgramAuthority<'a, 'b> { + #[inline(always)] + fn try_next_accounts( + accounts_iter: &mut EnumeratedAccountInfoIter<'a, 'b>, + authority: Authority, + ) -> Result { + // Index == 0. + let program_config = ZeroCopyAccount::try_next_accounts(accounts_iter, Some(&ID))?; + + // Index == 1. + let (index, authority_info) = + authority.try_next_as_authorized_account(accounts_iter, &program_config.data)?; + + Ok(Self { + program_config, + _authority: (index, authority_info), + }) + } +} + +struct VerifiedProgramAuthorityMut<'a, 'b> { + program_config: ZeroCopyMutAccount<'a, 'b, ProgramConfig>, + _authority: (usize, &'a AccountInfo<'b>), +} + +impl<'a, 'b> TryNextAccounts<'a, 'b, Authority> for VerifiedProgramAuthorityMut<'a, 'b> { + #[inline(always)] + fn try_next_accounts( + accounts_iter: &mut EnumeratedAccountInfoIter<'a, 'b>, + authority: Authority, + ) -> Result { + // Index == 0. + let program_config = ZeroCopyMutAccount::try_next_accounts(accounts_iter, Some(&ID))?; + + // Index == 1. + let (index, authority_info) = + authority.try_next_as_authorized_account(accounts_iter, &program_config.data)?; + + Ok(Self { + program_config, + _authority: (index, authority_info), + }) + } +} + +#[inline(always)] +fn try_next_2z_mint_info( + accounts_iter: &mut EnumeratedAccountInfoIter, +) -> Result<(), ProgramError> { + let (account_index, mint_2z_info) = + try_next_enumerated_account(accounts_iter, Default::default())?; + + // Enforce this account location. + if mint_2z_info.key != &DOUBLEZERO_MINT_KEY { + msg!("Invalid address for 2Z mint (account {})", account_index); + return Err(ProgramError::InvalidAccountData); + } + + Ok(()) +} + +#[inline(always)] +fn try_next_2z_token_pda_info<'a, 'b>( + accounts_iter: &mut EnumeratedAccountInfoIter<'a, 'b>, + token_owner: &Pubkey, + token_pda_name: &str, + token_pda_bump: Option, +) -> Result<(usize, &'a AccountInfo<'b>, u8), ProgramError> { + let (account_index, token_pda_info) = + try_next_enumerated_account(accounts_iter, Default::default())?; + + let (expected_token_pda_key, token_pda_bump) = match token_pda_bump { + Some(bump_seed) => { + let expected_pda_key = state::checked_2z_token_pda_address(token_owner, bump_seed) + .ok_or_else(|| { + msg!( + "Failed to create {} 2Z token PDA address with bump seed (account {})", + token_pda_name, + account_index + ); + ProgramError::InvalidSeeds + })?; + + (expected_pda_key, bump_seed) + } + None => state::find_2z_token_pda_address(token_owner), + }; + + // Enforce this account location and seed validity. + if token_pda_info.key != &expected_token_pda_key { + msg!( + "Invalid seeds for {} 2Z token PDA (account {})", + token_pda_name, + account_index + ); + return Err(ProgramError::InvalidSeeds); + } + + Ok((account_index, token_pda_info, token_pda_bump)) +} + +#[inline(always)] +fn try_token_account_amount(info: &AccountInfo) -> Result { + Ok(spl_token_interface::state::Account::unpack(&info.data.borrow()[..])?.amount) +} + +#[inline(always)] +fn try_next_token_program_info(accounts_iter: &mut EnumeratedAccountInfoIter) -> ProgramResult { + let (account_index, token_program_info) = + try_next_enumerated_account(accounts_iter, Default::default())?; + + // Enforce this account location. + if token_program_info.key != &spl_token_interface::ID { + msg!( + "Invalid address for SPL Token program (account {})", + account_index + ); + return Err(ProgramError::InvalidAccountData); + } + + Ok(()) +} + +/// Extracts the leaf index from a merkle proof, ensuring it's from an indexed +/// tree. Indexed trees are required to track which leaves have been processed. +#[inline(always)] +fn try_leaf_index(proof: &MerkleProof) -> Result { + proof.leaf_index.ok_or_else(|| { + msg!("Merkle proof must use an indexed tree"); + ProgramError::InvalidInstructionData + }) +} + +impl ProgramConfig { + #[inline(always)] + fn try_require_unpaused(&self) -> ProgramResult { + if self.is_paused() { + msg!("Program is paused"); + return Err(ProgramError::InvalidAccountData); + } + + Ok(()) + } +} + +impl Distribution { + #[inline(always)] + fn try_require_unfinalized_debt_calculation(&self) -> ProgramResult { + if self.is_debt_calculation_finalized() { + msg!("Distribution debt calculation has already been finalized"); + return Err(ProgramError::InvalidAccountData); + } + + Ok(()) + } + + #[inline(always)] + fn try_require_finalized_debt_calculation(&self) -> ProgramResult { + if !self.is_debt_calculation_finalized() { + msg!("Distribution debt calculation is not finalized yet"); + return Err(ProgramError::InvalidAccountData); + } + + Ok(()) + } + + #[inline(always)] + fn try_require_unfinalized_rewards_calculation(&self) -> ProgramResult { + if self.is_rewards_calculation_finalized() { + msg!("Distribution rewards have already been finalized"); + return Err(ProgramError::InvalidAccountData); + } + + Ok(()) + } + + #[inline(always)] + fn try_require_has_not_swept_2z_tokens(&self) -> ProgramResult { + if self.has_swept_2z_tokens() { + msg!("Distribution has already swept 2Z tokens"); + return Err(ProgramError::InvalidAccountData); + } + + Ok(()) + } + + #[inline(always)] + fn try_require_calculation_allowed(&self) -> ProgramResult { + let current_timestamp = Clock::get().unwrap().unix_timestamp; + + let is_allowed = self + .checked_calculation_allowed_timestamp() + .is_some_and(|allowed_timestamp| current_timestamp >= allowed_timestamp); + + if !is_allowed { + msg!("Distribution calculation is not allowed yet"); + return Err(ProgramError::InvalidAccountData); + } + + Ok(()) + } +} + +/// Marks a merkle leaf as processed by setting its corresponding bit in a byte +/// array. This prevents double-processing of rewards or other merkle-verified +/// operations. +/// +/// The leaf indices are stored as a bitfield where each bit represents whether +/// a leaf at that index has been processed (1 = processed, 0 = not processed). +fn try_process_remaining_data_leaf_index( + processed_leaf_data: &mut [u8], + leaf_index: u32, +) -> ProgramResult { + // Calculate which byte contains the bit for this leaf index + // (8 bits per byte, so divide by 8) + let leaf_byte_index = leaf_index as usize / 8; + + // First, we have to grab the relevant byte from the processed data. + let leaf_byte_ref = processed_leaf_data + .get_mut(leaf_byte_index) + .ok_or_else(|| { + msg!("Invalid leaf index"); + ProgramError::InvalidInstructionData + })?; + + // Create ByteFlags from the byte value to check the bit. + let mut leaf_byte = ByteFlags::new(*leaf_byte_ref); + + // Calculate which bit within the byte corresponds to this leaf + // (modulo 8 gives us the bit position within the byte: 0-7) + let leaf_bit = leaf_index as usize % 8; + + if leaf_byte.bit(leaf_bit) { + msg!( + "Merkle leaf index {} has already been processed", + leaf_index + ); + return Err(ProgramError::InvalidAccountData); + } + + // Set the bit to true to indicate that the leaf has been processed. + // This prevents replay attacks using the same merkle proof. + leaf_byte.set_bit(leaf_bit, true); + *leaf_byte_ref = leaf_byte.into(); + + Ok(()) +} + +// +// Here be dragons. +// + +/// This instruction processor is a special instruction that will not always be +/// used after a program upgrade. This docstring should be updated whenever the +/// upgrade authority must perform a special migration. +/// +/// # Why are we migrating? +/// +/// `Distribution.integrations_count_snapshot` was introduced after some +/// distributions had already been initialized, leaving those accounts stuck +/// at `snapshot = 0`. This instruction overwrites that field with the current +/// `Journal.integrations_count` for each distribution passed in — exactly the +/// value `try_initialize_distribution` would have written had the field been +/// wired correctly at init time. Only distributions whose `dz_epoch` is at or +/// above the floor below are eligible. +fn try_migrate_program_accounts(accounts: &[AccountInfo]) -> ProgramResult { + msg!("Migrate program accounts"); + + // The earliest DZ epoch this migration is allowed to touch. Distributions + // older than this floor are out of scope and reject the migration. + const MIN_DZ_EPOCH: DoubleZeroEpoch = DoubleZeroEpoch::new(140); + + // We expect the following accounts for this instruction: + // - 0: This program's program data account (BPF Loader Upgradeable + // program). + // - 1: The program's owner (i.e., upgrade authority). + // - 2: Journal. + // - 3..N: Distributions to repair (writable). + let mut accounts_iter = accounts.iter().enumerate(); + + // Account 0 must be the program data belonging to this program. + // Account 1 must be the owner of the program data (i.e., the upgrade + // authority). + UpgradeAuthority::try_next_accounts(&mut accounts_iter, &ID)?; + + // Account 2 must be the journal. We only need to read its + // integrations_count to populate the snapshot. + let journal = ZeroCopyAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + let integrations_count_snapshot = journal.integrations_count; + + // Remaining accounts must each be a writable Distribution PDA owned by + // this program. ZeroCopyMutAccount enforces all three. + while accounts_iter.len() != 0 { + let mut distribution = + ZeroCopyMutAccount::::try_next_accounts(&mut accounts_iter, Some(&ID))?; + + if distribution.dz_epoch < MIN_DZ_EPOCH { + msg!( + "DZ epoch {} is below migration floor {}", + distribution.dz_epoch, + MIN_DZ_EPOCH + ); + return Err(ProgramError::InvalidAccountData); + } + + distribution.integrations_count_snapshot = integrations_count_snapshot; + } + + Ok(()) +} diff --git a/solana/programs/revenue-distribution/src/state/contributor_rewards/mod.rs b/solana/programs/revenue-distribution/src/state/contributor_rewards/mod.rs new file mode 100644 index 0000000000..3df00d97a2 --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/contributor_rewards/mod.rs @@ -0,0 +1,51 @@ +mod recipient_shares; + +pub use recipient_shares::*; + +// + +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{ + types::{Flags, StorageGap}, + {Discriminator, PrecomputedDiscriminator}, +}; +use solana_pubkey::Pubkey; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct ContributorRewards { + pub rewards_manager_key: Pubkey, + + pub service_key: Pubkey, + + pub flags: Flags, + + pub recipient_shares: RecipientShares, + + _storage_gap: StorageGap<8>, +} + +impl PrecomputedDiscriminator for ContributorRewards { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"dz::account::contributor_rewards"); +} + +impl ContributorRewards { + pub const SEED_PREFIX: &'static [u8] = b"contributor_rewards"; + + pub const FLAG_IS_SET_REWARDS_MANAGER_BLOCKED_BIT: usize = 0; + + pub fn find_address(service_key: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX, service_key.as_ref()], &crate::ID) + } + + pub fn is_set_rewards_manager_blocked(&self) -> bool { + self.flags + .bit(Self::FLAG_IS_SET_REWARDS_MANAGER_BLOCKED_BIT) + } + + pub fn set_is_set_rewards_manager_blocked(&mut self, should_block: bool) { + self.flags + .set_bit(Self::FLAG_IS_SET_REWARDS_MANAGER_BLOCKED_BIT, should_block); + } +} diff --git a/solana/programs/revenue-distribution/src/state/contributor_rewards/recipient_shares.rs b/solana/programs/revenue-distribution/src/state/contributor_rewards/recipient_shares.rs new file mode 100644 index 0000000000..28cc91e1a6 --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/contributor_rewards/recipient_shares.rs @@ -0,0 +1,175 @@ +use bytemuck::{Pod, Zeroable}; +use solana_pubkey::Pubkey; + +use crate::types::UnitShare16; + +pub const MAX_RECIPIENTS: usize = 8; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Pod, Zeroable)] +#[repr(C, align(2))] +pub struct RecipientShare { + pub recipient_key: Pubkey, + pub share: UnitShare16, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct RecipientShares([RecipientShare; MAX_RECIPIENTS]); + +impl RecipientShares { + pub fn new(recipients: &[(Pubkey, u16)]) -> Option { + if recipients.len() > MAX_RECIPIENTS { + return None; + } + + let mut out = [RecipientShare::default(); MAX_RECIPIENTS]; + + let mut total_share = UnitShare16::MIN; + + for (i, (recipient_key, share)) in recipients.iter().enumerate() { + if recipient_key == &Pubkey::default() { + return None; + } + + let share = UnitShare16::new(*share)?; + + // Cannot have a zero share. + if share == UnitShare16::MIN { + return None; + } + + // Keep track of the running sum of shares to make sure it does not + // exceed 100%. + total_share = total_share.checked_add(share)?; + + out[i] = RecipientShare { + recipient_key: *recipient_key, + share, + }; + } + + if total_share != UnitShare16::MAX { + return None; + } + + Some(Self(out)) + } + + /// Returns an iterator over all recipient shares (including default + /// entries). + pub fn iter(&self) -> impl Iterator { + self.0.iter() + } + + /// Returns an iterator over only the active (non-default) recipient shares. + pub fn active_iter(&self) -> impl Iterator { + self.0 + .iter() + .filter(|share| share.recipient_key != Pubkey::default()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_recipient_shares() { + let recipients = vec![ + (Pubkey::new_unique(), 1_000), + (Pubkey::new_unique(), 2_000), + (Pubkey::new_unique(), 3_000), + (Pubkey::new_unique(), 4_000), + ]; + + let shares = RecipientShares::new(&recipients).unwrap(); + + assert_eq!(shares.0[0].recipient_key, recipients[0].0); + assert_eq!(shares.0[0].share, UnitShare16::new(1_000).unwrap()); + + assert_eq!(shares.0[1].recipient_key, recipients[1].0); + assert_eq!(shares.0[1].share, UnitShare16::new(2_000).unwrap()); + + assert_eq!(shares.0[2].recipient_key, recipients[2].0); + assert_eq!(shares.0[2].share, UnitShare16::new(3_000).unwrap()); + + assert_eq!(shares.0[3].recipient_key, recipients[3].0); + assert_eq!(shares.0[3].share, UnitShare16::new(4_000).unwrap()); + + let recipients = [ + (Pubkey::new_unique(), 1_000), + (Pubkey::new_unique(), 0_000), + (Pubkey::new_unique(), 5_000), + (Pubkey::new_unique(), 4_000), + ]; + + assert!(RecipientShares::new(&recipients).is_none()); + } + + #[test] + fn test_recipient_shares_overflow() { + let recipients = vec![ + (Pubkey::new_unique(), 1_000), + (Pubkey::new_unique(), 2_000), + (Pubkey::new_unique(), 3_000), + (Pubkey::new_unique(), 4_000), + (Pubkey::new_unique(), 5_000), + ]; + + let shares = RecipientShares::new(&recipients); + + assert!(shares.is_none()); + } + + #[test] + fn test_recipient_shares_zero_key() { + let recipients = vec![ + (Pubkey::new_unique(), 1_000), + (Pubkey::default(), 2_000), + (Pubkey::new_unique(), 3_000), + ]; + + let shares = RecipientShares::new(&recipients); + + assert!(shares.is_none()); + } + + #[test] + fn test_iterator() { + let recipients = vec![(Pubkey::new_unique(), 3_000), (Pubkey::new_unique(), 7_000)]; + + let shares = RecipientShares::new(&recipients).unwrap(); + + assert_eq!(shares.iter().count(), MAX_RECIPIENTS); + assert_eq!(shares.active_iter().count(), 2); + } + + #[test] + fn test_iterator_single_recipient() { + let recipients = vec![(Pubkey::new_unique(), 10_000)]; + + let shares = RecipientShares::new(&recipients).unwrap(); + + let active = shares.active_iter().collect::>(); + assert_eq!(active.len(), 1); + assert_eq!(active[0].share, UnitShare16::MAX); + } + + #[test] + fn test_iterator_max_recipients() { + let recipients = vec![ + (Pubkey::new_unique(), 1_250), + (Pubkey::new_unique(), 1_250), + (Pubkey::new_unique(), 1_250), + (Pubkey::new_unique(), 1_250), + (Pubkey::new_unique(), 1_250), + (Pubkey::new_unique(), 1_250), + (Pubkey::new_unique(), 1_250), + (Pubkey::new_unique(), 1_250), + ]; + + let shares = RecipientShares::new(&recipients).unwrap(); + + assert_eq!(shares.iter().count(), shares.active_iter().count()); + } +} diff --git a/solana/programs/revenue-distribution/src/state/distribution.rs b/solana/programs/revenue-distribution/src/state/distribution.rs new file mode 100644 index 0000000000..2db5873ce0 --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/distribution.rs @@ -0,0 +1,711 @@ +use std::ops::Range; + +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{ + types::{Flags, StorageGap}, + {Discriminator, PrecomputedDiscriminator}, +}; +use ruint::Uint; +use solana_pubkey::Pubkey; +use svm_hash::sha2::Hash; + +use crate::{ + state::SolanaValidatorFeeParameters, + types::{BurnRate, DoubleZeroEpoch, RewardShare}, +}; + +/// Account representing distribution information for a given DoubleZero epoch. +#[derive(Debug, Clone, Copy, Default, PartialEq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct Distribution { + /// Taken from the program config account at the time of creation. + pub dz_epoch: DoubleZeroEpoch, + + pub flags: Flags, + + /// The community burn rate, which acts as a lower-bound to burn rewards. + /// This burn rate is computed at the time the new distribution is created + /// via a simple formula configurable by the accountant. + pub community_burn_rate: BurnRate, + + /// This seed will be used to sign for token transfers. + pub bump_seed: u8, + + /// Cache this seed to validate token PDA address. + pub token_2z_pda_bump_seed: u8, + _padding_0: [u8; 2], + + /// Because the validator fee can change between epochs, we will save what + /// it was at the time this account was created. + pub solana_validator_fee_parameters: SolanaValidatorFeeParameters, + + pub solana_validator_debt_merkle_root: Hash, + + pub total_solana_validators: u32, + pub solana_validator_payments_count: u32, + + pub total_solana_validator_debt: u64, + pub collected_solana_validator_payments: u64, + + pub rewards_merkle_root: Hash, + + /// Tracking the total number of contributors. Off-chain processes can + /// monitor how many are left to redeem when comparing to + /// [num_contributors_redeemed]. + /// + /// [num_contributors_redeemed]: Self::num_contributors_redeemed + pub total_contributors: u32, + + /// Tracking how many contributors have had rewards distributed. Offchain + /// processes can monitor how many are left to distribute when comparing to + /// [total_contributors]. + /// + /// [total_contributors]: Self::total_contributors + pub distributed_rewards_count: u32, + + pub collected_prepaid_2z_payments: u64, + pub collected_2z_converted_from_sol: u64, + + /// The amount of SOL that was owed in past distributions. The debt + /// accountant can configure this amount to alleviate the system from + /// carrying bad debt perpetually. This amount is subtracted from the + /// total amount owed to the system. + pub uncollectible_sol_debt: u64, + + pub processed_solana_validator_debt_start_index: u32, + pub processed_solana_validator_debt_end_index: u32, + + pub processed_rewards_start_index: u32, + pub processed_rewards_end_index: u32, + + /// Distribute rewards relay lamports copied from the program config. + pub distribute_rewards_relay_lamports: u32, + + /// The timestamp when the distribution account is allowed to accept + /// calculations. + pub calculation_allowed_timestamp: u32, + + pub distributed_2z_amount: u64, + pub burned_2z_amount: u64, + + pub processed_solana_validator_debt_write_off_start_index: u32, + pub processed_solana_validator_debt_write_off_end_index: u32, + + pub solana_validator_write_off_count: u32, + + pub economic_burn_rate: BurnRate, + + /// Snapshot of `Journal.integrations_count` at init time. + pub integrations_count_snapshot: u16, + + /// Number of integrations already collected this epoch. When equal to + /// `integrations_count_snapshot`, `DistributeRewards` is unblocked. + pub integrations_collected_count: u16, + _padding_1: [u8; 4], + + /// Indexed by `RewardsIntegration.registration_index`. + pub collected_integrations_bitmap: Uint<512, 8>, + + pub collected_2z_from_integrations: u64, + + _storage_gap: StorageGap<4>, +} + +impl PrecomputedDiscriminator for Distribution { + const DISCRIMINATOR: Discriminator<8> = Discriminator::new_sha2(b"dz::account::distribution"); +} + +impl Distribution { + pub const SEED_PREFIX: &'static [u8] = b"distribution"; + + pub const FLAG_RESERVED_BIT: usize = 0; + pub const FLAG_IS_DEBT_CALCULATION_FINALIZED_BIT: usize = 1; + pub const FLAG_IS_REWARDS_CALCULATION_FINALIZED_BIT: usize = 2; + pub const FLAG_HAS_SWEPT_2Z_TOKENS_BIT: usize = 3; + pub const FLAG_IS_SOLANA_VALIDATOR_DEBT_WRITE_OFF_ENABLED_BIT: usize = 4; + + pub fn find_address(dz_epoch: DoubleZeroEpoch) -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX, &dz_epoch.as_seed()], &crate::ID) + } + + #[inline] + pub fn is_debt_calculation_finalized(&self) -> bool { + self.flags.bit(Self::FLAG_IS_DEBT_CALCULATION_FINALIZED_BIT) + } + + pub fn set_is_debt_calculation_finalized(&mut self, should_finalize: bool) { + self.flags.set_bit( + Self::FLAG_IS_DEBT_CALCULATION_FINALIZED_BIT, + should_finalize, + ); + } + + #[inline] + pub fn is_rewards_calculation_finalized(&self) -> bool { + self.flags + .bit(Self::FLAG_IS_REWARDS_CALCULATION_FINALIZED_BIT) + } + + pub fn set_is_rewards_calculation_finalized(&mut self, should_finalize: bool) { + self.flags.set_bit( + Self::FLAG_IS_REWARDS_CALCULATION_FINALIZED_BIT, + should_finalize, + ); + } + + #[inline] + pub fn is_solana_validator_debt_write_off_enabled(&self) -> bool { + self.flags + .bit(Self::FLAG_IS_SOLANA_VALIDATOR_DEBT_WRITE_OFF_ENABLED_BIT) + } + + pub fn set_is_solana_validator_debt_write_off_enabled(&mut self, should_enable: bool) { + self.flags.set_bit( + Self::FLAG_IS_SOLANA_VALIDATOR_DEBT_WRITE_OFF_ENABLED_BIT, + should_enable, + ); + } + + #[inline] + pub fn has_swept_2z_tokens(&self) -> bool { + self.flags.bit(Self::FLAG_HAS_SWEPT_2Z_TOKENS_BIT) + } + + pub fn set_has_swept_2z_tokens(&mut self, has_swept: bool) { + self.flags + .set_bit(Self::FLAG_HAS_SWEPT_2Z_TOKENS_BIT, has_swept); + } + + #[inline] + pub fn checked_total_sol_debt(&self) -> Option { + self.total_solana_validator_debt + .checked_sub(self.uncollectible_sol_debt) + } + + #[inline] + pub fn total_collected_2z_tokens(&self) -> u64 { + // Panic in case something goes horribly wrong. + self.collected_prepaid_2z_payments + .checked_add(self.collected_2z_converted_from_sol) + .unwrap() + .checked_add(self.collected_2z_from_integrations) + .unwrap() + } + + /// Returns true once every integration that was registered at the time + /// this distribution was initialized has had its contributor-share 2Z + /// collected. `DistributeRewards` gates on this. Uses `>=` so the gate + /// can't deadlock if the collected count ever drifts above the snapshot. + #[inline] + pub fn are_all_integrations_collected(&self) -> bool { + self.integrations_collected_count >= self.integrations_count_snapshot + } + + #[inline] + pub fn checked_is_integration_collected(&self, index: u16) -> Option { + let idx = index as usize; + if idx >= Uint::<512, 8>::BITS { + return None; + } + Some(self.collected_integrations_bitmap.bit(idx)) + } + + #[inline] + pub fn checked_set_integration_collected(&mut self, index: u16) -> Option<()> { + let idx = index as usize; + if idx >= Uint::<512, 8>::BITS { + return None; + } + self.collected_integrations_bitmap.set_bit(idx, true); + Some(()) + } + + #[inline] + pub fn burn_rate(&self, contributor_economic_burn_rate: BurnRate) -> BurnRate { + contributor_economic_burn_rate + .max(self.economic_burn_rate) + .max(self.community_burn_rate) + } + + #[inline] + pub fn split_2z_amount(&self, reward_share: &RewardShare) -> Option<(u64, u64)> { + let unit_share = reward_share.checked_unit_share()?; + let contributor_economic_burn_rate = reward_share + .checked_economic_burn_rate() + .unwrap_or_default(); + + // Determine the greater of the economic burn rate and the community + // burn rate. This rate will be the proportion of the total 2Z amount + // that will be burned. + let burn_rate = self.burn_rate(contributor_economic_burn_rate); + + let total_amount = self.total_collected_2z_tokens(); + let share_amount = unit_share.mul_scalar(total_amount); + + let burn_share_amount = burn_rate.mul_scalar(share_amount); + + Some((burn_share_amount, share_amount - burn_share_amount)) + } + + #[inline] + pub fn checked_calculation_allowed_timestamp(&self) -> Option { + let allowed_timestamp = self.calculation_allowed_timestamp; + + if allowed_timestamp == 0 { + None + } else { + Some(i64::from(allowed_timestamp)) + } + } + + #[inline] + pub fn processed_solana_validator_debt_bitmap_range(&self) -> Range { + self.processed_solana_validator_debt_start_index as usize + ..self.processed_solana_validator_debt_end_index as usize + } + + #[inline] + pub fn processed_rewards_bitmap_range(&self) -> Range { + self.processed_rewards_start_index as usize..self.processed_rewards_end_index as usize + } + + #[inline] + pub fn processed_solana_validator_debt_write_off_bitmap_range(&self) -> Range { + self.processed_solana_validator_debt_write_off_start_index as usize + ..self.processed_solana_validator_debt_write_off_end_index as usize + } + + #[inline] + pub fn is_all_solana_validator_debt_processed(&self) -> bool { + self.total_solana_validators + .saturating_sub(self.solana_validator_payments_count) + .saturating_sub(self.solana_validator_write_off_count) + == 0 + } + + #[inline] + pub fn are_all_rewards_distributed(&self) -> bool { + self.total_contributors + .saturating_sub(self.distributed_rewards_count) + == 0 + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::types::{BurnRate, RewardShare}; + use solana_pubkey::Pubkey; + + #[test] + fn test_is_debt_calculation_finalized() { + let mut distribution = Distribution::default(); + assert!(!distribution.is_debt_calculation_finalized()); + + distribution.set_is_debt_calculation_finalized(true); + assert!(distribution.is_debt_calculation_finalized()); + + distribution.set_is_debt_calculation_finalized(false); + assert!(!distribution.is_debt_calculation_finalized()); + } + + #[test] + fn test_is_rewards_calculation_finalized() { + let mut distribution = Distribution::default(); + assert!(!distribution.is_rewards_calculation_finalized()); + + distribution.set_is_rewards_calculation_finalized(true); + assert!(distribution.is_rewards_calculation_finalized()); + + distribution.set_is_rewards_calculation_finalized(false); + assert!(!distribution.is_rewards_calculation_finalized()); + } + + #[test] + fn test_is_solana_validator_debt_write_off_enabled() { + let mut distribution = Distribution::default(); + assert!(!distribution.is_solana_validator_debt_write_off_enabled()); + + distribution.set_is_solana_validator_debt_write_off_enabled(true); + assert!(distribution.is_solana_validator_debt_write_off_enabled()); + + distribution.set_is_solana_validator_debt_write_off_enabled(false); + assert!(!distribution.is_solana_validator_debt_write_off_enabled()); + } + + #[test] + fn test_has_swept_2z_tokens() { + let mut distribution = Distribution::default(); + assert!(!distribution.has_swept_2z_tokens()); + + distribution.set_has_swept_2z_tokens(true); + assert!(distribution.has_swept_2z_tokens()); + + distribution.set_has_swept_2z_tokens(false); + assert!(!distribution.has_swept_2z_tokens()); + } + + #[test] + fn test_checked_total_sol_debt() { + let mut distribution = Distribution::default(); + // When both are 0, checked_sub returns Some(0). + assert_eq!(distribution.checked_total_sol_debt().unwrap(), 0); + + distribution.total_solana_validator_debt = 100; + distribution.uncollectible_sol_debt = 10; + assert_eq!(distribution.checked_total_sol_debt().unwrap(), 90); + + distribution.uncollectible_sol_debt = 100; + assert_eq!(distribution.checked_total_sol_debt().unwrap(), 0); + + distribution.uncollectible_sol_debt = 101; + // When uncollectible exceeds total, checked_sub returns None. + assert!(distribution.checked_total_sol_debt().is_none()); + } + + #[test] + fn test_checked_calculation_allowed_timestamp() { + let mut distribution = Distribution::default(); + assert!(distribution + .checked_calculation_allowed_timestamp() + .is_none()); + + distribution.calculation_allowed_timestamp = 69; + assert_eq!( + distribution + .checked_calculation_allowed_timestamp() + .unwrap(), + 69 + ); + } + + #[test] + fn test_total_collected_2z_tokens() { + let mut distribution = Distribution::default(); + assert_eq!(distribution.total_collected_2z_tokens(), 0); + + distribution.collected_prepaid_2z_payments = 100; + assert_eq!(distribution.total_collected_2z_tokens(), 100); + + distribution.collected_2z_converted_from_sol = 200; + assert_eq!(distribution.total_collected_2z_tokens(), 300); + + distribution.collected_2z_from_integrations = 500; + assert_eq!(distribution.total_collected_2z_tokens(), 800); + + distribution.collected_prepaid_2z_payments = 50; + distribution.collected_2z_converted_from_sol = 75; + distribution.collected_2z_from_integrations = 25; + assert_eq!(distribution.total_collected_2z_tokens(), 150); + } + + #[test] + fn test_are_all_integrations_collected() { + let mut distribution = Distribution::default(); + // Both counters default to 0 → gate open. + assert!(distribution.are_all_integrations_collected()); + + // Snapshot > collected → gate closed. + distribution.integrations_count_snapshot = 2; + assert!(!distribution.are_all_integrations_collected()); + + // Partial progress → still closed. + distribution.integrations_collected_count = 1; + assert!(!distribution.are_all_integrations_collected()); + + // All collected → gate open. + distribution.integrations_collected_count = 2; + assert!(distribution.are_all_integrations_collected()); + } + + #[test] + fn test_integration_bitmap_helpers() { + let mut distribution = Distribution::default(); + + for idx in [0u16, 1, 127, 255, 383, 511] { + assert_eq!( + distribution.checked_is_integration_collected(idx), + Some(false) + ); + } + + for idx in [0u16, 7, 63, 64, 127, 255, 256, 383, 511] { + assert_eq!( + distribution.checked_set_integration_collected(idx), + Some(()) + ); + assert_eq!( + distribution.checked_is_integration_collected(idx), + Some(true) + ); + } + + for idx in [6u16, 62, 65, 126, 257, 382, 510] { + assert_eq!( + distribution.checked_is_integration_collected(idx), + Some(false) + ); + } + + assert_eq!(distribution.checked_is_integration_collected(512), None); + assert_eq!( + distribution.checked_is_integration_collected(u16::MAX), + None + ); + assert_eq!(distribution.checked_set_integration_collected(512), None); + assert_eq!( + distribution.checked_set_integration_collected(u16::MAX), + None + ); + } + + #[test] + fn test_burn_rate() { + let community_burn_rate = BurnRate::new(200_000_000).unwrap(); // 20% + let distribution = Distribution { + community_burn_rate, + ..Default::default() + }; + + let economic_burn_rate = BurnRate::new(100_000_000).unwrap(); // 10% + + // Community burn rate is higher, so it should be used. + assert_eq!( + distribution.burn_rate(economic_burn_rate), + community_burn_rate + ); + + let higher_economic_burn_rate = BurnRate::new(300_000_000).unwrap(); // 30% + + // Contributor economic burn rate is higher, so it should be used. + assert_eq!( + distribution.burn_rate(higher_economic_burn_rate), + higher_economic_burn_rate + ); + + // Equal rates. + let equal_economic_burn_rate = BurnRate::new(200_000_000).unwrap(); // 20% + assert_eq!( + distribution.burn_rate(equal_economic_burn_rate), + community_burn_rate + ); + + // Default (zero) contributor rate: falls back to max of + // economic_burn_rate and community_burn_rate on the distribution. + assert_eq!( + distribution.burn_rate(Default::default()), + community_burn_rate + ); + + // Distribution with economic_burn_rate set higher than community. + let dist_economic_burn_rate = BurnRate::new(400_000_000).unwrap(); // 40% + let distribution_with_economic = Distribution { + community_burn_rate, + economic_burn_rate: dist_economic_burn_rate, + ..Default::default() + }; + + // Default contributor rate: economic_burn_rate (40%) > community (20%). + assert_eq!( + distribution_with_economic.burn_rate(Default::default()), + dist_economic_burn_rate + ); + + // Contributor (10%) < economic (40%), economic wins. + assert_eq!( + distribution_with_economic.burn_rate(economic_burn_rate), + dist_economic_burn_rate + ); + + // Contributor (30%) < economic (40%), economic wins. + assert_eq!( + distribution_with_economic.burn_rate(higher_economic_burn_rate), + dist_economic_burn_rate + ); + + // Contributor higher than all: contributor (50%) > economic (40%) > community (20%). + let highest_contributor = BurnRate::new(500_000_000).unwrap(); // 50% + assert_eq!( + distribution_with_economic.burn_rate(highest_contributor), + highest_contributor + ); + + // Distribution where economic_burn_rate is between community and + // contributor. + let mid_economic = BurnRate::new(250_000_000).unwrap(); // 25% + let distribution_mid = Distribution { + community_burn_rate, + economic_burn_rate: mid_economic, + ..Default::default() + }; + + // Contributor (30%) > economic (25%) > community (20%), contributor + // wins. + assert_eq!( + distribution_mid.burn_rate(higher_economic_burn_rate), + higher_economic_burn_rate + ); + + // Contributor (10%) < economic (25%) > community (20%), economic wins. + assert_eq!(distribution_mid.burn_rate(economic_burn_rate), mid_economic); + + // Default contributor rate: economic (25%) > community (20%). + assert_eq!(distribution_mid.burn_rate(Default::default()), mid_economic); + } + + #[test] + fn test_split_2z_amount() { + let distribution = Distribution { + collected_prepaid_2z_payments: 1_000, + collected_2z_converted_from_sol: 2_000, + community_burn_rate: BurnRate::new(100_000_000).unwrap(), // 10% + ..Default::default() + }; + + let contributor_key = Pubkey::new_unique(); + let unit_share = 100_000_000; // 10% + let economic_burn_rate = 50_000_000; // 5% + + let reward_share = + RewardShare::new(contributor_key, unit_share, false, economic_burn_rate).unwrap(); + + // Total: 3,000, share: 10% = 300. + // Economic burn rate: 5%, but community burn rate is 10%, so use 10%. + // Burn amount: 300 * 10% = 30. + // Distribute amount: 300 - 30 = 270. + let (burn_amount, distribute_amount) = distribution.split_2z_amount(&reward_share).unwrap(); + assert_eq!(burn_amount, 30); + assert_eq!(distribute_amount, 270); + + // Test with economic burn rate higher than community. + let higher_economic_burn_rate = 200_000_000; // 20% + let reward_share_higher = RewardShare::new( + contributor_key, + unit_share, + false, + higher_economic_burn_rate, + ) + .unwrap(); + + // Total: 3,000, share: 10% = 300. + // Economic burn rate: 20% > community 10%, so use 20%. + // Burn amount: 300 * 20% = 60. + // Distribute amount: 300 - 60 = 240. + let (burn_amount, distribute_amount) = + distribution.split_2z_amount(&reward_share_higher).unwrap(); + assert_eq!(burn_amount, 60); + assert_eq!(distribute_amount, 240); + + // Test with distribution's economic_burn_rate as the determining rate. + // economic_burn_rate on distribution (30%) > community (10%) and + // override from reward_share (5%). + let distribution_with_economic = Distribution { + collected_prepaid_2z_payments: 1_000, + collected_2z_converted_from_sol: 2_000, + community_burn_rate: BurnRate::new(100_000_000).unwrap(), // 10% + economic_burn_rate: BurnRate::new(300_000_000).unwrap(), // 30% + ..Default::default() + }; + + // Total: 3,000, share: 10% = 300. + // Override (5%) < distribution economic (30%) > community (10%), so + // distribution economic wins. + // Burn amount: 300 * 30% = 90. + // Distribute amount: 300 - 90 = 210. + let (burn_amount, distribute_amount) = distribution_with_economic + .split_2z_amount(&reward_share) + .unwrap(); + assert_eq!(burn_amount, 90); + assert_eq!(distribute_amount, 210); + + // Test with invalid reward share (unit_share too large). + let invalid_reward_share = RewardShare { + contributor_key, + unit_share: 2_000_000_000, // Invalid: exceeds MAX + remaining_bytes: [0; 4], + }; + assert!(distribution + .split_2z_amount(&invalid_reward_share) + .is_none()); + } + + #[test] + fn test_processed_solana_validator_debt_bitmap_range() { + let mut distribution = Distribution { + processed_solana_validator_debt_end_index: 10, + ..Default::default() + }; + + assert_eq!( + distribution.processed_solana_validator_debt_bitmap_range(), + 0..10 + ); + + distribution.processed_solana_validator_debt_start_index = 5; + distribution.processed_solana_validator_debt_end_index = 15; + assert_eq!( + distribution.processed_solana_validator_debt_bitmap_range(), + 5..15 + ); + } + + #[test] + fn test_processed_rewards_bitmap_range() { + let mut distribution = Distribution { + processed_rewards_end_index: 20, + ..Default::default() + }; + + assert_eq!(distribution.processed_rewards_bitmap_range(), 0..20); + + distribution.processed_rewards_start_index = 10; + distribution.processed_rewards_end_index = 30; + assert_eq!(distribution.processed_rewards_bitmap_range(), 10..30); + } + + #[test] + fn test_processed_solana_validator_debt_write_off_bitmap_range() { + let mut distribution = Distribution { + processed_solana_validator_debt_write_off_end_index: 5, + ..Default::default() + }; + + assert_eq!( + distribution.processed_solana_validator_debt_write_off_bitmap_range(), + 0..5 + ); + + distribution.processed_solana_validator_debt_write_off_start_index = 1; + distribution.processed_solana_validator_debt_write_off_end_index = 2; + assert_eq!( + distribution.processed_solana_validator_debt_write_off_bitmap_range(), + 1..2 + ); + } + + #[test] + fn test_is_all_solana_validator_debt_processed() { + let mut distribution = Distribution::default(); + assert!(distribution.is_all_solana_validator_debt_processed()); + + distribution.total_solana_validators = 10; + distribution.solana_validator_payments_count = 7; + distribution.solana_validator_write_off_count = 3; + + assert!(distribution.is_all_solana_validator_debt_processed()); + + // 10 - 7 - 2 = 1, not all processed. + distribution.solana_validator_write_off_count = 2; + assert!(!distribution.is_all_solana_validator_debt_processed()); + + distribution.solana_validator_payments_count = 8; + distribution.solana_validator_write_off_count = 2; + assert!(distribution.is_all_solana_validator_debt_processed()); + + // Test with overflow protection. + distribution.total_solana_validators = 5; + distribution.solana_validator_payments_count = 10; + distribution.solana_validator_write_off_count = 10; + assert!(distribution.is_all_solana_validator_debt_processed()); + } +} diff --git a/solana/programs/revenue-distribution/src/state/journal.rs b/solana/programs/revenue-distribution/src/state/journal.rs new file mode 100644 index 0000000000..935340130f --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/journal.rs @@ -0,0 +1,69 @@ +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{Discriminator, PrecomputedDiscriminator}; +use ruint::Uint; +use solana_pubkey::Pubkey; + +use crate::types::DoubleZeroEpoch; + +pub const JOURNAL_ENTRIES_ABSOLUTE_MAX_LENGTH: u16 = 256; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct Journal { + /// This seed will be used to sign for token transfers. + pub bump_seed: u8, + + /// Cache this seed to validate token PDA address. + pub token_2z_pda_bump_seed: u8, + + pub integrations_count: u16, + _padding: [u8; 4], + + pub total_sol_balance: u64, + + /// Based on interactions with the program to deposit 2Z, this is our + /// expected balance. This balance may deviate from the actual balance in + /// the 2Z Token account because folks may transfer tokens directly to + /// that account (not intended). So if we wanted any recourse to do + /// something with the excess amount in this token account, we can simply + /// compute the difference between the token account balance and this. + pub total_2z_balance: u64, + + pub swap_2z_destination_balance: u64, + + pub swapped_sol_amount: u64, + + pub next_dz_epoch_to_sweep_tokens: DoubleZeroEpoch, + + pub lifetime_swapped_2z_amount: Uint<128, 2>, +} + +impl PrecomputedDiscriminator for Journal { + const DISCRIMINATOR: Discriminator<8> = Discriminator::new_sha2(b"dz::account::journal"); +} + +impl Journal { + pub const SEED_PREFIX: &'static [u8] = b"journal"; + + pub fn find_address() -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX], &crate::ID) + } + + pub fn lifetime_swapped_2z_amount(&self) -> u128 { + u128::try_from(self.lifetime_swapped_2z_amount).unwrap() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_lifetime_swept_2z_amount() { + let journal = Journal { + lifetime_swapped_2z_amount: Uint::from(69_420), + ..Default::default() + }; + assert_eq!(journal.lifetime_swapped_2z_amount(), 69_420); + } +} diff --git a/solana/programs/revenue-distribution/src/state/mod.rs b/solana/programs/revenue-distribution/src/state/mod.rs new file mode 100644 index 0000000000..5dfe2e8603 --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/mod.rs @@ -0,0 +1,46 @@ +mod contributor_rewards; +mod distribution; +mod journal; +mod program_config; +mod rewards_integration; +mod solana_validator_deposit; + +pub use contributor_rewards::*; +pub use distribution::*; +pub use journal::*; +pub use program_config::*; +pub use rewards_integration::*; +pub use solana_validator_deposit::*; + +// + +use solana_pubkey::Pubkey; + +use crate::ID; + +pub const SWAP_AUTHORITY_SEED_PREFIX: &[u8] = b"swap_authority"; +pub const TOKEN_2Z_PDA_SEED_PREFIX: &[u8] = b"2z_token"; +pub const WITHDRAW_SOL_AUTHORITY_SEED_PREFIX: &[u8] = b"withdraw_sol"; + +pub fn find_2z_token_pda_address(token_owner: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[TOKEN_2Z_PDA_SEED_PREFIX, token_owner.as_ref()], &ID) +} + +pub fn checked_2z_token_pda_address(token_owner: &Pubkey, bump_seed: u8) -> Option { + Pubkey::create_program_address( + &[TOKEN_2Z_PDA_SEED_PREFIX, token_owner.as_ref(), &[bump_seed]], + &ID, + ) + .ok() +} + +pub fn find_swap_authority_address() -> (Pubkey, u8) { + Pubkey::find_program_address(&[SWAP_AUTHORITY_SEED_PREFIX], &ID) +} + +pub fn find_withdraw_sol_authority_address(sol_2z_swap_program_id: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[WITHDRAW_SOL_AUTHORITY_SEED_PREFIX], + sol_2z_swap_program_id, + ) +} diff --git a/solana/programs/revenue-distribution/src/state/program_config/community_burn_rate.rs b/solana/programs/revenue-distribution/src/state/program_config/community_burn_rate.rs new file mode 100644 index 0000000000..c271ca7ba0 --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/program_config/community_burn_rate.rs @@ -0,0 +1,790 @@ +use bytemuck::{Pod, Zeroable}; + +use crate::types::{BurnRate, EpochDuration}; + +/// The community burn rate acts as the lower-bound to determine how many of +/// this epoch's rewards should be burned. If there is no economic burn rate +/// specified for this epoch, the burn rate defaults to the community burn rate. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct CommunityBurnRateParameters { + /// The absolute maximum value for the community burn rate limit. This value + /// is configurable, but it can never be lower than the last community burn + /// rate. + pub limit: BurnRate, + + /// Parameter to determine when the community burn rate's calculation should + /// be determined using the cached slope, which will increase the burn rate + /// linearly with DZ epochs. + pub dz_epochs_to_increasing: EpochDuration, + + /// Parameter to determine when the community burn rate's calculation should + /// reach its maximum value, which will keep every burn rate calculation + /// fixed to the limit. + pub dz_epochs_to_limit: EpochDuration, + + cached_slope_numerator: BurnRate, + cached_slope_denominator: EpochDuration, + cached_next_burn_rate: BurnRate, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum CommunityBurnRateMode { + Static, + Increasing, + Limit, +} + +impl std::fmt::Display for CommunityBurnRateMode { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Static => write!(f, "Static"), + Self::Increasing => write!(f, "Increasing"), + Self::Limit => write!(f, "Limit"), + } + } +} + +impl CommunityBurnRateParameters { + /// Generate new parameters, which will attempt to cache the slope and the + /// last burn rate. + pub fn new( + initial_rate: BurnRate, + limit: BurnRate, + dz_epochs_to_increasing: EpochDuration, + dz_epochs_to_limit: EpochDuration, + ) -> Option { + if initial_rate == BurnRate::MIN { + return None; + } + + let mut params = Self { + cached_next_burn_rate: initial_rate, + ..Default::default() + }; + + if params + .checked_update(limit, dz_epochs_to_increasing, dz_epochs_to_limit) + .is_some() + { + Some(params) + } else { + None + } + } + + #[inline] + pub fn next_burn_rate(&self) -> Option { + if self.cached_next_burn_rate == BurnRate::MIN { + None + } else { + Some(self.cached_next_burn_rate) + } + } + + pub fn slope(&self) -> (BurnRate, EpochDuration) { + (self.cached_slope_numerator, self.cached_slope_denominator) + } + + pub fn mode(&self) -> CommunityBurnRateMode { + if self.dz_epochs_to_increasing != 0 { + CommunityBurnRateMode::Static + } else if self.dz_epochs_to_limit != 0 { + CommunityBurnRateMode::Increasing + } else { + CommunityBurnRateMode::Limit + } + } + + /// Returns the last cached rate after it computes a new cached community + /// burn rate. + /// + /// Even though this operation performs arithmetic with checked math and + /// casting from u64 to [BurnRate], all of the math should be safe. + pub fn checked_compute(&mut self) -> Option { + let next_burn_rate = self.next_burn_rate()?; + + self.dz_epochs_to_limit = self.dz_epochs_to_limit.saturating_sub(1); + self.dz_epochs_to_increasing = self.dz_epochs_to_increasing.saturating_sub(1); + + if self.dz_epochs_to_limit == 0 { + debug_assert_eq!(self.dz_epochs_to_increasing, 0); + self.cached_next_burn_rate = self.limit; + return Some(next_burn_rate); + } + + // We will only recalculate the cached last burn rate only when there + // are no more DZ epochs left to uptick to increasing. + if self.dz_epochs_to_increasing == 0 { + // Calculation: + // + // cached_numerator + // new_rate = last_rate + -------------------- + // cached_denominator + // + // last_rate * cached_denominator + cached_numerator + // = --------------------------------------------------- + // cached_denominator + // + let new_burn_rate = u64::from(self.cached_next_burn_rate) + .saturating_mul(self.cached_slope_denominator.into()) + // This operation should never overflow. + .checked_add(self.cached_slope_numerator.into())? + .saturating_div(self.cached_slope_denominator.into()); + + // Ensure we do not pass the limit. We should not have to do this, + // but we are being extra safe. Subsequent calls to compute should + // bail early above because dz_epochs_to_limit should already be at + // zero. + self.cached_next_burn_rate = BurnRate::try_from(new_burn_rate) + .ok() + .map(|burn_rate| burn_rate.min(self.limit))?; + } + + Some(next_burn_rate) + } + + /// Update the parameters for the community burn rate calculation. + /// + /// If the new configured limit ends up being less than the last cached burn + /// rate, there will be no update. + pub fn checked_update( + &mut self, + new_limit: BurnRate, + new_dz_epochs_to_increasing: EpochDuration, + new_dz_epochs_to_limit: EpochDuration, + ) -> Option<(BurnRate, EpochDuration)> { + // Cached last burn rate cannot be greater than the limit. + if new_limit < self.cached_next_burn_rate { + return None; + } + + // We require that "increasing" mode cannot immediately start. The first + // rate must be calculated before entering this mode. + if new_dz_epochs_to_increasing == 0 { + return None; + } + + // If the DZ epochs to increasing equals the DZ epochs to the limit, we + // do not want to compute the slope. + if new_dz_epochs_to_limit < new_dz_epochs_to_increasing { + return None; + } + + let slope_numerator = new_limit.saturating_sub(self.cached_next_burn_rate); + let slope_denominator = new_dz_epochs_to_limit + .saturating_sub(new_dz_epochs_to_increasing) + .saturating_add(1); + + self.limit = new_limit; + self.dz_epochs_to_increasing = new_dz_epochs_to_increasing; + self.dz_epochs_to_limit = new_dz_epochs_to_limit; + self.cached_slope_numerator = slope_numerator; + self.cached_slope_denominator = slope_denominator; + + Some((slope_numerator, slope_denominator)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + // + // CommunityBurnRateParameters::new + // + + #[test] + fn test_new() { + let initial_rate = BurnRate::new(100_000_000).unwrap(); // 10%. + let limit = BurnRate::new(500_000_000).unwrap(); // 50%. + + let dz_epochs_to_increasing = 100; + let dz_epochs_to_limit = 300; + + let params = CommunityBurnRateParameters::new( + initial_rate, + limit, + dz_epochs_to_increasing, + dz_epochs_to_limit, + ) + .unwrap(); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing, + dz_epochs_to_limit, + cached_slope_numerator: BurnRate::new(400_000_000).unwrap(), + cached_slope_denominator: 201, + cached_next_burn_rate: initial_rate, + }; + assert_eq!(params, expected); + } + + #[test] + fn test_cannot_new_zero_dz_epochs_to_increasing() { + assert!(CommunityBurnRateParameters::new( + BurnRate::default(), + BurnRate::new(1).unwrap(), + 0, + 1, + ) + .is_none()); + } + + #[test] + fn test_cannot_new_dz_epochs_to_limit_lte_dz_epochs_to_increasing() { + assert!(CommunityBurnRateParameters::new( + BurnRate::new(1).unwrap(), + BurnRate::new(2).unwrap(), + 2, + 1, + ) + .is_none()); + } + + #[test] + fn test_cannot_new_zero_initial_rate() { + assert!(CommunityBurnRateParameters::new( + BurnRate::new(0).unwrap(), + BurnRate::new(2).unwrap(), + 1, + 2, + ) + .is_none()); + } + + #[test] + fn test_cannot_new_limit_lt_initial_rate() { + assert!(CommunityBurnRateParameters::new( + BurnRate::new(2).unwrap(), + BurnRate::new(1).unwrap(), + 1, + 2, + ) + .is_none()); + } + + // + // CommunityBurnRateParameters::checked_compute without updates + // + + #[test] + fn test_checked_compute() { + let initial_rate = BurnRate::new(100_000_000).unwrap(); // 10%. + let limit = BurnRate::new(500_000_000).unwrap(); // 50%. + + let dz_epochs_to_increasing = 2; + let dz_epochs_to_limit = 5; + + // 50% - 10% + let expected_cached_slope_numerator = BurnRate::new(400_000_000).unwrap(); + + // 5 - 2 + 1 + let expected_cached_slope_denominator = 4; + + let mut params = CommunityBurnRateParameters::new( + initial_rate, + limit, + dz_epochs_to_increasing, + dz_epochs_to_limit, + ) + .unwrap(); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + // Still static with epochs to increasing == 1. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(100_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 1, + dz_epochs_to_limit: 4, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: initial_rate, + }; + assert_eq!(params, expected); + + // Now increasing with epochs to increasing == 0, epochs to max == 3. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(100_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + // 10% + 40% / 4 = 20%. + let expected_cached_next_burn_rate = BurnRate::new(200_000_000).unwrap(); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 0, + dz_epochs_to_limit: 3, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: expected_cached_next_burn_rate, + }; + assert_eq!(params, expected); + + // Still increasing with epochs to max == 2. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, expected_cached_next_burn_rate); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + // 20% + 40% / 4 = 30%. + let expected_cached_next_burn_rate = BurnRate::new(300_000_000).unwrap(); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 0, + dz_epochs_to_limit: 2, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: expected_cached_next_burn_rate, + }; + assert_eq!(params, expected); + + // Still increasing with epochs to max == 1. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, expected_cached_next_burn_rate); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + // 30% + 40% / 4 = 40%. + let expected_cached_next_burn_rate = BurnRate::new(400_000_000).unwrap(); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 0, + dz_epochs_to_limit: 1, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: expected_cached_next_burn_rate, + }; + assert_eq!(params, expected); + + // No longer increasing. We are at the max. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, expected_cached_next_burn_rate); + assert_eq!(params.mode(), CommunityBurnRateMode::Limit); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 0, + dz_epochs_to_limit: 0, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: limit, + }; + assert_eq!(params, expected); + + // Subsequent calls will result in unchanged params. + + for _ in 0..10 { + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, limit); + assert_eq!(params.mode(), CommunityBurnRateMode::Limit); + assert_eq!(params, expected); + } + } + + #[test] + fn test_checked_compute_immediately_increasing() { + let initial_rate = BurnRate::new(100_000_000).unwrap(); // 10%. + let limit = BurnRate::new(500_000_000).unwrap(); // 50%. + + let dz_epochs_to_increasing = 1; + let dz_epochs_to_limit = 4; + + // 50% - 10% + let expected_cached_slope_numerator = BurnRate::new(400_000_000).unwrap(); + + // 5 - 2 + 1 + let expected_cached_slope_denominator = 4; + + let mut params = CommunityBurnRateParameters::new( + initial_rate, + limit, + dz_epochs_to_increasing, + dz_epochs_to_limit, + ) + .unwrap(); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + // Now increasing with epochs to increasing == 0, epochs to max == 3. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(100_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + // 10% + 40% / 4 = 20%. + let expected_cached_next_burn_rate = BurnRate::new(200_000_000).unwrap(); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 0, + dz_epochs_to_limit: 3, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: expected_cached_next_burn_rate, + }; + assert_eq!(params, expected); + + // Still increasing with epochs to max == 2. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, expected_cached_next_burn_rate); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + // 20% + 40% / 4 = 30%. + let expected_cached_next_burn_rate = BurnRate::new(300_000_000).unwrap(); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 0, + dz_epochs_to_limit: 2, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: expected_cached_next_burn_rate, + }; + assert_eq!(params, expected); + + // Still increasing with epochs to max == 1. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, expected_cached_next_burn_rate); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + // 30% + 40% / 4 = 40%. + let expected_cached_next_burn_rate = BurnRate::new(400_000_000).unwrap(); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 0, + dz_epochs_to_limit: 1, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: expected_cached_next_burn_rate, + }; + assert_eq!(params, expected); + + // No longer increasing. We are at the max. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, expected_cached_next_burn_rate); + assert_eq!(params.mode(), CommunityBurnRateMode::Limit); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 0, + dz_epochs_to_limit: 0, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: limit, + }; + assert_eq!(params, expected); + + // Subsequent calls will result in unchanged params. + + for _ in 0..10 { + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, limit); + assert_eq!(params.mode(), CommunityBurnRateMode::Limit); + assert_eq!(params, expected); + } + } + + #[test] + fn test_checked_compute_immediately_limit() { + let initial_rate = BurnRate::new(100_000_000).unwrap(); // 10%. + let limit = BurnRate::new(500_000_000).unwrap(); // 50%. + + let dz_epochs_to_increasing = 1; + let dz_epochs_to_limit = 1; + + let expected_cached_slope_numerator = BurnRate::new(400_000_000).unwrap(); + let expected_cached_slope_denominator = 1; + + let mut params = CommunityBurnRateParameters::new( + initial_rate, + limit, + dz_epochs_to_increasing, + dz_epochs_to_limit, + ) + .unwrap(); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + // We are at the max. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(100_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Limit); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 0, + dz_epochs_to_limit: 0, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: limit, + }; + assert_eq!(params, expected); + + // Subsequent calls will result in unchanged params. + + for _ in 0..10 { + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, limit); + assert_eq!(params.mode(), CommunityBurnRateMode::Limit); + assert_eq!(params, expected); + } + } + + // + // CommunityBurnRateParameters::checked_update + // + + #[test] + fn checked_update_while_static() { + let initial_rate = BurnRate::new(100_000_000).unwrap(); // 10%. + let limit = BurnRate::new(500_000_000).unwrap(); // 50%. + + let dz_epochs_to_increasing = 2; + let dz_epochs_to_limit = 5; + + let mut params = CommunityBurnRateParameters::new( + initial_rate, + limit, + dz_epochs_to_increasing, + dz_epochs_to_limit, + ) + .unwrap(); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + let new_limit = BurnRate::new(250_000_000).unwrap(); // 25%. + let new_dz_epochs_to_increasing = 3; + let new_dz_epochs_to_limit = 7; + + let (slope_numerator, slope_denominator) = params + .checked_update( + new_limit, + new_dz_epochs_to_increasing, + new_dz_epochs_to_limit, + ) + .unwrap(); + + // 25% - 10% + let expected_cached_slope_numerator = BurnRate::new(150_000_000).unwrap(); + assert_eq!(slope_numerator, expected_cached_slope_numerator); + + // 7 - 3 + 1 + let expected_cached_slope_denominator = 5; + assert_eq!(slope_denominator, expected_cached_slope_denominator); + + let expected = CommunityBurnRateParameters { + limit: new_limit, + dz_epochs_to_increasing: new_dz_epochs_to_increasing, + dz_epochs_to_limit: new_dz_epochs_to_limit, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: initial_rate, + }; + assert_eq!(params, expected); + + // Perform another update after checked compute. + + params.checked_compute().unwrap(); + + let new_limit = BurnRate::new(350_000_000).unwrap(); // 35%. + let new_dz_epochs_to_increasing = 4; + let new_dz_epochs_to_limit = 9; + + let (slope_numerator, slope_denominator) = params + .checked_update( + new_limit, + new_dz_epochs_to_increasing, + new_dz_epochs_to_limit, + ) + .unwrap(); + + // 35% - 10% + let expected_cached_slope_numerator = BurnRate::new(250_000_000).unwrap(); + assert_eq!(slope_numerator, expected_cached_slope_numerator); + + // 9 - 4 + 1 + let expected_cached_slope_denominator = 6; + assert_eq!(slope_denominator, expected_cached_slope_denominator); + + let expected = CommunityBurnRateParameters { + limit: new_limit, + dz_epochs_to_increasing: new_dz_epochs_to_increasing, + dz_epochs_to_limit: new_dz_epochs_to_limit, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: initial_rate, + }; + assert_eq!(params, expected); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + // Perform some updates. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(100_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(100_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(100_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(100_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(141_666_666).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(183_333_332).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(224_999_998).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(266_666_664).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(308_333_330).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Limit); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(350_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Limit); + } + + #[test] + fn checked_update_while_increasing() { + let initial_rate = BurnRate::new(100_000_000).unwrap(); // 10%. + let limit = BurnRate::new(500_000_000).unwrap(); // 50%. + + let dz_epochs_to_increasing = 1; + let dz_epochs_to_limit = 4; + + // 50% - 10% + let expected_cached_slope_numerator = BurnRate::new(400_000_000).unwrap(); + + // 5 - 2 + 1 + let expected_cached_slope_denominator = 4; + + let mut params = CommunityBurnRateParameters::new( + initial_rate, + limit, + dz_epochs_to_increasing, + dz_epochs_to_limit, + ) + .unwrap(); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + // Now increasing with epochs to increasing == 0, epochs to max == 3. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(100_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + // 10% + 40% / 4 = 20%. + let expected_cached_next_burn_rate = BurnRate::new(200_000_000).unwrap(); + + let expected = CommunityBurnRateParameters { + limit, + dz_epochs_to_increasing: 0, + dz_epochs_to_limit: 3, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: expected_cached_next_burn_rate, + }; + assert_eq!(params, expected); + + let new_limit = BurnRate::new(600_000_000).unwrap(); // 60%. + let new_dz_epochs_to_increasing = 2; + let new_dz_epochs_to_limit = 9; + + let (slope_numerator, slope_denominator) = params + .checked_update( + new_limit, + new_dz_epochs_to_increasing, + new_dz_epochs_to_limit, + ) + .unwrap(); + + // 60% - 20% + let expected_cached_slope_numerator = BurnRate::new(400_000_000).unwrap(); + assert_eq!(slope_numerator, expected_cached_slope_numerator); + + // 9 - 2 + 1 + let expected_cached_slope_denominator = 8; + assert_eq!(slope_denominator, expected_cached_slope_denominator); + + let expected = CommunityBurnRateParameters { + limit: new_limit, + dz_epochs_to_increasing: new_dz_epochs_to_increasing, + dz_epochs_to_limit: new_dz_epochs_to_limit, + cached_slope_numerator: expected_cached_slope_numerator, + cached_slope_denominator: expected_cached_slope_denominator, + cached_next_burn_rate: expected_cached_next_burn_rate, + }; + assert_eq!(params, expected); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + // Perform some updates. + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(200_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Static); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(200_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(250_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(300_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(350_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(400_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(450_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(500_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Increasing); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(550_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Limit); + + let next_rate = params.checked_compute().unwrap(); + assert_eq!(next_rate, BurnRate::new(600_000_000).unwrap()); + assert_eq!(params.mode(), CommunityBurnRateMode::Limit); + } +} diff --git a/solana/programs/revenue-distribution/src/state/program_config/distribution.rs b/solana/programs/revenue-distribution/src/state/program_config/distribution.rs new file mode 100644 index 0000000000..702994f9cf --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/program_config/distribution.rs @@ -0,0 +1,71 @@ +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::types::StorageGap; + +use crate::{state::CommunityBurnRateParameters, types::ValidatorFee}; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct DistributionParameters { + /// Time to wait after the turn of the DZ epoch to perform any calculations. + /// + /// This field is not used for anything within the Revenue Distribution + /// program because there is no way to enforce that calculations are + /// performed at a specific time. But this field is stored here to act as a + /// source-of-truth to inform the off-chain process (the accountant) how + /// long it should wait after the new DZ epoch starts. + /// + /// This field also acts as an indication of whether the program config is + /// initialized. If a grace period has not been configured, the program will + /// not allow new Merkle roots (which are necessary for validators to pay + /// their dues and contributors to have rewards distributed). + pub calculation_grace_period_minutes: u16, + + /// Time to wait in between distribution initializations to avoid creating + /// distribution accounts too quickly. + /// + /// This field should be configured in a way that avoids distributions from + /// being created too slowly as well (in case initializing a given + /// distribution takes a long time after the new epoch starts on the + /// DoubleZero Ledger network). + /// + /// For reference, the time between epochs on the DoubleZero Ledger network + /// (at the time of writing this comment) is roughly 45 hours. + pub initialization_grace_period_minutes: u16, + + /// The minimum duration that must pass before rewards can be finalized. + /// This field is used to ensure that rewards are not finalized (and + /// distributed) too early. + pub minimum_epoch_duration_to_finalize_rewards: u8, + _padding: [u8; 3], + + pub community_burn_rate_parameters: CommunityBurnRateParameters, + + /// Proportion of Solana validator revenue DoubleZero collects to pay + /// contributors. These fees are denominated in SOL, so this proportion + /// represents a proportion of SOL rewards. + pub solana_validator_fee_parameters: SolanaValidatorFeeParameters, + + _storage_gap: StorageGap<8>, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct SolanaValidatorFeeParameters { + /// Percentage of rewards from base transaction fees. + pub base_block_rewards_pct: ValidatorFee, + + /// Percentage of rewards from priority transaction fees. + pub priority_block_rewards_pct: ValidatorFee, + + /// Percentage of rewards from inflation. + pub inflation_rewards_pct: ValidatorFee, + + /// Percentage of rewards from Jito tips. + pub jito_tips_pct: ValidatorFee, + + /// Fixed amount of SOL charged to each validator. Maximum configurable + /// amount is the bound of `u32::MAX`, so about 4.2 SOL. + pub fixed_sol_amount: u32, + + _storage_gap: [u32; 7], +} diff --git a/solana/programs/revenue-distribution/src/state/program_config/mod.rs b/solana/programs/revenue-distribution/src/state/program_config/mod.rs new file mode 100644 index 0000000000..c00b741d8a --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/program_config/mod.rs @@ -0,0 +1,394 @@ +mod community_burn_rate; +mod distribution; +mod relay; + +pub use community_burn_rate::*; +pub use distribution::*; +pub use relay::*; + +// + +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{types::Flags, Discriminator, PrecomputedDiscriminator}; +use solana_pubkey::Pubkey; + +use crate::types::{DoubleZeroEpoch, EpochDuration}; + +use super::checked_2z_token_pda_address; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct ProgramConfig { + pub flags: Flags, + + pub next_completed_dz_epoch: DoubleZeroEpoch, + + /// This seed will be used to sign for token transfers. + pub bump_seed: u8, + + /// Cache this seed to validate token PDA address. + pub reserve_2z_bump_seed: u8, + + /// This seed will be used to sign for token transfers from the swap + /// destination token account. + pub swap_authority_bump_seed: u8, + + /// Cache this seed to validate token PDA address. + pub swap_destination_2z_bump_seed: u8, + + /// Cache this seed to validate withdraw SOL authority address, which is + /// the required signer of [Self::sol_2z_swap_program_id] to withdraw SOL. + pub withdraw_sol_authority_bump_seed: u8, + + _padding_0: [u8; 3], + + pub admin_key: Pubkey, + + /// Authority to determine the debt due for distributions. + pub debt_accountant_key: Pubkey, + + /// Authority to determine the rewards for contributors. + pub rewards_accountant_key: Pubkey, + + /// Authority to establish new contributor rewards accounts. + pub contributor_manager_key: Pubkey, + + pub _placeholder_key: Pubkey, + + /// The program allowed to CPI to this program to withdraw SOL to swap for + /// 2Z. The Revenue Distribution program will be verifying that the SOL/2Z + /// Swap program will be transferring 2Z when it withdraws SOL. + pub sol_2z_swap_program_id: Pubkey, + + pub distribution_parameters: DistributionParameters, + + pub relay_parameters: RelayParameters, + + pub last_initialized_distribution_timestamp: u32, + _padding_1: [u8; 4], + + /// DoubleZero epoch when the debt write-off feature activates. For more + /// information, please refer to [RFC-0002]. + /// + /// [RFC-0002]: https://github.com/malbeclabs/doublezero-solana/blob/main/docs/rfc/0002_IMPROVED_DEBT_WRITE_OFF_TRACKING.md + pub debt_write_off_feature_activation_epoch: DoubleZeroEpoch, +} + +impl PrecomputedDiscriminator for ProgramConfig { + const DISCRIMINATOR: Discriminator<8> = Discriminator::new_sha2(b"dz::account::program_config"); +} + +impl ProgramConfig { + pub const SEED_PREFIX: &'static [u8] = b"program_config"; + + pub const FLAG_IS_PAUSED_BIT: usize = 0; + pub const FLAG_IS_MIGRATED_BIT: usize = 1; + + pub fn find_address() -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX], &crate::ID) + } + + pub fn checked_reserve_2z_address(&self) -> Option { + if self.reserve_2z_bump_seed == 0 { + return None; + } + + let key = + Pubkey::create_program_address(&[Self::SEED_PREFIX, &[self.bump_seed]], &crate::ID) + .ok()?; + checked_2z_token_pda_address(&key, self.reserve_2z_bump_seed) + } + + pub fn checked_swap_authority_address(&self) -> Option { + if self.swap_authority_bump_seed == 0 { + return None; + } + + Pubkey::create_program_address( + &[ + super::SWAP_AUTHORITY_SEED_PREFIX, + &[self.swap_authority_bump_seed], + ], + &crate::ID, + ) + .ok() + } + + pub fn checked_swap_destination_2z_address(&self) -> Option { + let swap_authority_key = self.checked_swap_authority_address()?; + checked_2z_token_pda_address(&swap_authority_key, self.swap_destination_2z_bump_seed) + } + + pub fn checked_withdraw_sol_authority_address(&self) -> Option { + if self.sol_2z_swap_program_id == Pubkey::default() { + return None; + } + + Pubkey::create_program_address( + &[ + super::WITHDRAW_SOL_AUTHORITY_SEED_PREFIX, + &[self.withdraw_sol_authority_bump_seed], + ], + &self.sol_2z_swap_program_id, + ) + .ok() + } + + pub fn is_paused(&self) -> bool { + self.flags.bit(Self::FLAG_IS_PAUSED_BIT) + } + + pub fn set_is_paused(&mut self, should_pause: bool) { + self.flags.set_bit(Self::FLAG_IS_PAUSED_BIT, should_pause); + } + + pub fn is_migrated(&self) -> bool { + self.flags.bit(Self::FLAG_IS_MIGRATED_BIT) + } + + pub fn set_is_migrated(&mut self, should_migrate: bool) { + self.flags + .set_bit(Self::FLAG_IS_MIGRATED_BIT, should_migrate); + } + + // TODO: Remove this in the next zero-versioned minor release. + pub fn checked_solana_validator_fee_parameters(&self) -> Option { + Some(self.distribution_parameters.solana_validator_fee_parameters) + } + + pub fn checked_distribute_rewards_relay_lamports(&self) -> Option { + let lamports = self.relay_parameters.distribute_rewards_lamports; + + if lamports == 0 { + None + } else { + Some(lamports) + } + } + + pub fn checked_minimum_epoch_duration_to_finalize_rewards(&self) -> Option { + let duration = self + .distribution_parameters + .minimum_epoch_duration_to_finalize_rewards; + + if duration == 0 { + None + } else { + Some(duration.into()) + } + } + + pub fn checked_calculation_grace_period_seconds(&self) -> Option { + let grace_period = self + .distribution_parameters + .calculation_grace_period_minutes; + + if grace_period == 0 { + None + } else { + Some(u32::from(grace_period) * 60) + } + } + + pub fn checked_distribution_initialization_grace_period_seconds(&self) -> Option { + let grace_period = self + .distribution_parameters + .initialization_grace_period_minutes; + + if grace_period == 0 { + None + } else { + Some(u32::from(grace_period) * 60) + } + } + + pub fn last_completed_epoch(&self) -> Option { + self.next_completed_dz_epoch.checked_sub_duration(1) + } + + pub fn is_debt_write_off_feature_activated(&self) -> bool { + let activation_epoch = self.debt_write_off_feature_activation_epoch; + + activation_epoch != 0 && self.next_completed_dz_epoch >= activation_epoch + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_is_paused() { + let mut program_config = ProgramConfig::default(); + assert!(!program_config.is_paused()); + + program_config.set_is_paused(true); + assert!(program_config.is_paused()); + + program_config.set_is_paused(false); + assert!(!program_config.is_paused()); + } + + #[test] + fn test_is_migrated() { + let mut program_config = ProgramConfig::default(); + assert!(!program_config.is_migrated()); + + program_config.set_is_migrated(true); + assert!(program_config.is_migrated()); + + program_config.set_is_migrated(false); + assert!(!program_config.is_migrated()); + } + + #[test] + fn test_checked_solana_validator_fee_parameters() { + const FIXED_SOL_AMOUNT: u32 = 69; + + let mut program_config = ProgramConfig::default(); + assert_eq!( + program_config + .checked_solana_validator_fee_parameters() + .unwrap(), + SolanaValidatorFeeParameters::default() + ); + + program_config + .distribution_parameters + .solana_validator_fee_parameters + .fixed_sol_amount = FIXED_SOL_AMOUNT; + + let mut expected_params = SolanaValidatorFeeParameters::default(); + expected_params.fixed_sol_amount = FIXED_SOL_AMOUNT; + assert_eq!( + program_config + .checked_solana_validator_fee_parameters() + .unwrap(), + expected_params + ); + } + + #[test] + fn test_checked_distribute_rewards_relay_lamports() { + const DISTRIBUTE_REWARDS_RELAY_LAMPORTS: u32 = 69; + + let mut program_config = ProgramConfig::default(); + assert!(program_config + .checked_distribute_rewards_relay_lamports() + .is_none()); + + program_config.relay_parameters.distribute_rewards_lamports = + DISTRIBUTE_REWARDS_RELAY_LAMPORTS; + assert_eq!( + program_config + .checked_distribute_rewards_relay_lamports() + .unwrap(), + DISTRIBUTE_REWARDS_RELAY_LAMPORTS + ); + } + + #[test] + fn test_checked_minimum_epoch_duration_to_finalize_rewards() { + const MINIMUM_EPOCH_DURATION_TO_FINALIZE_REWARDS: u8 = 69; + + let mut program_config = ProgramConfig::default(); + assert!(program_config + .checked_minimum_epoch_duration_to_finalize_rewards() + .is_none()); + + program_config + .distribution_parameters + .minimum_epoch_duration_to_finalize_rewards = + MINIMUM_EPOCH_DURATION_TO_FINALIZE_REWARDS; + assert_eq!( + program_config + .checked_minimum_epoch_duration_to_finalize_rewards() + .unwrap(), + MINIMUM_EPOCH_DURATION_TO_FINALIZE_REWARDS.into() + ); + } + + #[test] + fn test_checked_calculation_grace_period_seconds() { + const CALCULATION_GRACE_PERIOD_SECONDS: u16 = 69; + + let mut program_config = ProgramConfig::default(); + assert!(program_config + .checked_calculation_grace_period_seconds() + .is_none()); + + program_config + .distribution_parameters + .calculation_grace_period_minutes = CALCULATION_GRACE_PERIOD_SECONDS; + assert_eq!( + program_config + .checked_calculation_grace_period_seconds() + .unwrap(), + u32::from(CALCULATION_GRACE_PERIOD_SECONDS) * 60 + ); + } + + #[test] + fn test_checked_distribution_initialization_grace_period_seconds() { + const DISTRIBUTION_INITIALIZATION_GRACE_PERIOD_SECONDS: u16 = 69; + + let mut program_config = ProgramConfig::default(); + assert!(program_config + .checked_distribution_initialization_grace_period_seconds() + .is_none()); + + program_config + .distribution_parameters + .initialization_grace_period_minutes = DISTRIBUTION_INITIALIZATION_GRACE_PERIOD_SECONDS; + assert_eq!( + program_config + .checked_distribution_initialization_grace_period_seconds() + .unwrap(), + u32::from(DISTRIBUTION_INITIALIZATION_GRACE_PERIOD_SECONDS) * 60 + ); + } + + #[test] + fn test_last_completed_epoch() { + let mut program_config = ProgramConfig::default(); + assert!(program_config.last_completed_epoch().is_none()); + + program_config.next_completed_dz_epoch = program_config + .next_completed_dz_epoch + .saturating_add_duration(1); + assert_eq!( + program_config.last_completed_epoch().unwrap(), + DoubleZeroEpoch::new(0) + ); + + program_config.next_completed_dz_epoch = program_config + .next_completed_dz_epoch + .saturating_add_duration(1); + assert_eq!( + program_config.last_completed_epoch().unwrap(), + DoubleZeroEpoch::new(1) + ); + } + + #[test] + fn test_is_debt_write_off_feature_activated() { + let mut program_config = ProgramConfig { + next_completed_dz_epoch: DoubleZeroEpoch::new(1), + ..Default::default() + }; + assert!(!program_config.is_debt_write_off_feature_activated()); + + program_config.debt_write_off_feature_activation_epoch = DoubleZeroEpoch::new(2); + assert!(!program_config.is_debt_write_off_feature_activated()); + + program_config.next_completed_dz_epoch = program_config + .next_completed_dz_epoch + .saturating_add_duration(1); + assert!(program_config.is_debt_write_off_feature_activated()); + + program_config.next_completed_dz_epoch = program_config + .next_completed_dz_epoch + .saturating_add_duration(1); + assert!(program_config.is_debt_write_off_feature_activated()); + } +} diff --git a/solana/programs/revenue-distribution/src/state/program_config/relay.rs b/solana/programs/revenue-distribution/src/state/program_config/relay.rs new file mode 100644 index 0000000000..d7a55f1afc --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/program_config/relay.rs @@ -0,0 +1,19 @@ +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::types::StorageGap; + +/// Specific amounts to pay actors that execute instructions on behalf of +/// others. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct RelayParameters { + pub _placeholder_lamports: u32, + pub distribute_rewards_lamports: u32, + + _storage_gap: StorageGap<1>, +} + +impl RelayParameters { + /// The base transaction cost per signature is 5,000 lamports, so we set the + /// minimum to one more than that. + pub const MIN_LAMPORTS: u32 = 5_001; +} diff --git a/solana/programs/revenue-distribution/src/state/rewards_integration.rs b/solana/programs/revenue-distribution/src/state/rewards_integration.rs new file mode 100644 index 0000000000..005749dc46 --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/rewards_integration.rs @@ -0,0 +1,37 @@ +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{ + types::{Flags, StorageGap}, + Discriminator, PrecomputedDiscriminator, +}; +use solana_pubkey::Pubkey; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct RewardsIntegration { + pub program_id: Pubkey, + pub bump_seed: u8, + _padding_0: [u8; 1], + + /// Captured from `Journal.integrations_count` at the time this + /// integration was registered. + pub registration_index: u16, + _padding_1: [u8; 4], + + // Reserved for future flags. + _flags: Flags, + + _storage_gap: StorageGap<4>, +} + +impl PrecomputedDiscriminator for RewardsIntegration { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"dz::account::rewards_integration"); +} + +impl RewardsIntegration { + pub const SEED_PREFIX: &'static [u8] = b"rewards_integration"; + + pub fn find_address(program_id: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX, program_id.as_ref()], &crate::ID) + } +} diff --git a/solana/programs/revenue-distribution/src/state/solana_validator_deposit.rs b/solana/programs/revenue-distribution/src/state/solana_validator_deposit.rs new file mode 100644 index 0000000000..0ecec2c1f5 --- /dev/null +++ b/solana/programs/revenue-distribution/src/state/solana_validator_deposit.rs @@ -0,0 +1,27 @@ +use bytemuck::{Pod, Zeroable}; +use doublezero_program_tools::{types::StorageGap, Discriminator, PrecomputedDiscriminator}; +use solana_pubkey::Pubkey; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable)] +#[repr(C, align(8))] +pub struct SolanaValidatorDeposit { + pub node_id: Pubkey, + + pub written_off_sol_debt: u64, + _padding: [u8; 24], + + _storage_gap: StorageGap<1>, +} + +impl PrecomputedDiscriminator for SolanaValidatorDeposit { + const DISCRIMINATOR: Discriminator<8> = + Discriminator::new_sha2(b"dz::account::solana_validator_deposit"); +} + +impl SolanaValidatorDeposit { + pub const SEED_PREFIX: &'static [u8] = b"solana_validator_deposit"; + + pub fn find_address(node_id: &Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address(&[Self::SEED_PREFIX, node_id.as_ref()], &crate::ID) + } +} diff --git a/solana/programs/revenue-distribution/src/types.rs b/solana/programs/revenue-distribution/src/types.rs new file mode 100644 index 0000000000..69c91626ba --- /dev/null +++ b/solana/programs/revenue-distribution/src/types.rs @@ -0,0 +1,601 @@ +use std::fmt::Display; + +use borsh::{BorshDeserialize, BorshSerialize}; +use bytemuck::{Pod, Zeroable}; +use solana_pubkey::Pubkey; + +#[derive( + Debug, + BorshDeserialize, + BorshSerialize, + Clone, + Copy, + Default, + PartialEq, + Eq, + PartialOrd, + Ord, + Pod, + Zeroable, +)] +#[repr(C)] +pub struct DoubleZeroEpoch(u64); + +impl DoubleZeroEpoch { + pub const fn new(epoch: u64) -> Self { + Self(epoch) + } + + pub fn value(&self) -> u64 { + self.0 + } + + pub fn as_seed(&self) -> [u8; 8] { + self.0.to_le_bytes() + } + + pub fn saturating_add_duration(&self, epoch_duration: EpochDuration) -> Self { + Self(self.0.saturating_add(epoch_duration.into())) + } + + pub fn checked_sub_duration(&self, epoch_duration: EpochDuration) -> Option { + let value = self.0.checked_sub(epoch_duration.into())?; + Some(Self(value)) + } +} + +impl Display for DoubleZeroEpoch { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl PartialEq for DoubleZeroEpoch { + fn eq(&self, rhs: &u64) -> bool { + self.0 == *rhs + } +} + +/// Any calculation requiring the passage of time via DoubleZero epochs as an input should use this +/// type. `u32::MAX` is more than enough time for any of these calculations. +pub type EpochDuration = u32; + +pub type ValidatorFee = UnitShare16; +pub type BurnRate = UnitShare32; + +/// Macro to implement common UnitShare functionality for different integer types. +macro_rules! impl_unit_share { + ($name:ident, $inner_type:ty, $max_value:expr, $doc:expr) => { + #[doc = $doc] + #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Pod, Zeroable)] + #[repr(C)] + pub struct $name($inner_type); + + impl Display for $name { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}/{}", self.0, Self::MAX.0) + } + } + + impl $name { + pub const MIN: Self = Self(0); + pub const MAX: Self = Self($max_value); + + pub const fn new(value: $inner_type) -> Option { + if value <= Self::MAX.0 { + Some(Self(value)) + } else { + None + } + } + + pub fn mul_scalar(&self, x: T) -> T + where + T: Into + TryFrom, + >::Error: std::fmt::Debug, + { + let result = u128::from(self.0) + .saturating_mul(x.into()) + .saturating_div(Self::MAX.0.into()); + + result + .try_into() + .expect("mul_scalar result should fit in target type") + } + + pub fn checked_add(&self, other: Self) -> Option { + let value = self.0.checked_add(other.0)?; + + if value <= Self::MAX.0 { + Some(Self(value)) + } else { + None + } + } + + pub fn checked_sub(&self, other: Self) -> Option { + let value = self.0.checked_sub(other.0)?; + // Value is guaranteed to be <= self.0 <= Self::MAX.0, so no bounds check needed. + Some(Self(value)) + } + + pub fn saturating_add(&self, other: Self) -> Self { + Self(self.0.saturating_add(other.0)).min(Self::MAX) + } + + pub fn saturating_sub(&self, other: Self) -> Self { + Self(self.0.saturating_sub(other.0)) + } + } + + impl From<$name> for $inner_type { + fn from(value: $name) -> Self { + value.0 + } + } + + impl From<$name> for u64 { + fn from(value: $name) -> Self { + u64::from(value.0) + } + } + + impl TryFrom for $name { + type Error = &'static str; + + fn try_from(value: u64) -> Result { + let inner_value: $inner_type = value + .try_into() + .map_err(|_| "Value too large for inner type")?; + Self::new(inner_value).ok_or("Value exceeds maximum allowed") + } + } + }; +} + +impl_unit_share!( + UnitShare16, + u16, + 10_000, + "A 16-bit unit share type with maximum value 10,000 (e.g., 420 is 4.20%)." +); + +impl_unit_share!( + UnitShare32, + u32, + 1_000_000_000, + "A 32-bit unit share type with maximum value 1,000,000,000 (e.g., 420,000,069 is 42.0000069%)." +); + +#[derive( + Debug, BorshDeserialize, BorshSerialize, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable, +)] +#[repr(C)] +pub struct SolanaValidatorDebt { + pub node_id: Pubkey, + pub amount: u64, +} + +impl SolanaValidatorDebt { + pub const LEAF_PREFIX: &'static [u8] = b"solana_validator_debt"; +} + +#[derive( + Debug, BorshDeserialize, BorshSerialize, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable, +)] +#[repr(C)] +pub struct RewardShare { + pub contributor_key: Pubkey, + pub unit_share: u32, + pub remaining_bytes: [u8; 4], +} + +impl RewardShare { + pub const LEAF_PREFIX: &'static [u8] = b"reward_share"; + + pub const FLAG_IS_BLOCKED_BIT: usize = 31; + pub const FLAG_IS_BLOCKED_MASK: u32 = 1 << Self::FLAG_IS_BLOCKED_BIT; + pub const ECONOMIC_BURN_RATE_MASK: u32 = 0x3FFFFFFF; + + pub fn new( + contributor_key: Pubkey, + unit_share: u32, + should_block: bool, + economic_burn_rate: u32, + ) -> Option { + // Check that the rates are valid. + let unit_share = UnitShare32::new(unit_share)?; + let economic_burn_rate = UnitShare32::new(economic_burn_rate)?; + + // Start with the economic burn rate (first 30 bits). + let mut combined_value = economic_burn_rate.0; + + // Set the blocked flag. + if should_block { + combined_value |= Self::FLAG_IS_BLOCKED_MASK; + } + + Some(Self { + contributor_key, + unit_share: unit_share.0, + remaining_bytes: combined_value.to_le_bytes(), + }) + } + + pub fn checked_unit_share(&self) -> Option { + UnitShare32::new(self.unit_share) + } + + pub fn is_blocked(&self) -> bool { + let combined_value = u32::from_le_bytes(self.remaining_bytes); + combined_value & Self::FLAG_IS_BLOCKED_MASK != 0 + } + + pub fn set_is_blocked(&mut self, should_block: bool) { + let mut combined_value = u32::from_le_bytes(self.remaining_bytes); + if should_block { + combined_value |= Self::FLAG_IS_BLOCKED_MASK; + } else { + combined_value &= !Self::FLAG_IS_BLOCKED_MASK; + } + self.remaining_bytes = combined_value.to_le_bytes(); + } + + pub fn economic_burn_rate(&self) -> u32 { + let combined_value = u32::from_le_bytes(self.remaining_bytes); + combined_value & Self::ECONOMIC_BURN_RATE_MASK + } + + pub fn checked_economic_burn_rate(&self) -> Option { + UnitShare32::new(self.economic_burn_rate()) + } + + pub fn set_economic_burn_rate(&mut self, economic_burn_rate: UnitShare32) { + let mut combined_value = u32::from_le_bytes(self.remaining_bytes); + combined_value &= !Self::ECONOMIC_BURN_RATE_MASK; + combined_value |= economic_burn_rate.0; + self.remaining_bytes = combined_value.to_le_bytes(); + } +} + +/// A byte wrapper for bit flag operations. Each bit can be individually set or +/// checked. This type can be used for both flags and replay protection. +#[derive( + Debug, BorshDeserialize, BorshSerialize, Clone, Copy, Default, PartialEq, Eq, Pod, Zeroable, +)] +#[repr(C)] +pub struct ByteFlags(u8); + +impl ByteFlags { + pub const fn new(value: u8) -> Self { + Self(value) + } + + pub const fn bit(&self, index: usize) -> bool { + if index >= 8 { + false + } else { + (self.0 & (1 << index)) != 0 + } + } + + pub fn set_bit(&mut self, index: usize, value: bool) { + if index < 8 { + if value { + self.0 |= 1 << index; + } else { + self.0 &= !(1 << index); + } + } + } +} + +impl From for u8 { + fn from(value: ByteFlags) -> Self { + value.0 + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_unit_share16_constants() { + assert_eq!(UnitShare16::MIN.0, 0); + assert_eq!(UnitShare16::MAX.0, 10_000); + } + + #[test] + fn test_unit_share32_constants() { + assert_eq!(UnitShare32::MIN.0, 0); + assert_eq!(UnitShare32::MAX.0, 1_000_000_000); + } + + #[test] + fn test_unit_share16_new() { + assert_eq!(UnitShare16::new(0).unwrap(), UnitShare16::MIN); + assert_eq!(UnitShare16::new(5_000).unwrap(), UnitShare16(5_000)); + assert_eq!(UnitShare16::new(10_000).unwrap(), UnitShare16::MAX); + assert!(UnitShare16::new(10_001).is_none()); + assert!(UnitShare16::new(u16::MAX).is_none()); + } + + #[test] + fn test_unit_share32_new() { + assert_eq!(UnitShare32::new(0).unwrap(), UnitShare32::MIN); + assert_eq!( + UnitShare32::new(500_000_000).unwrap(), + UnitShare32(500_000_000) + ); + assert_eq!(UnitShare32::new(1_000_000_000).unwrap(), UnitShare32::MAX); + assert!(UnitShare32::new(1_000_000_001).is_none()); + assert!(UnitShare32::new(u32::MAX).is_none()); + } + + #[test] + fn test_unit_share16_display() { + assert_eq!(format!("{}", UnitShare16(0)), "0/10000"); + assert_eq!(format!("{}", UnitShare16(5_000)), "5000/10000"); + assert_eq!(format!("{}", UnitShare16::MAX), "10000/10000"); + } + + #[test] + fn test_unit_share32_display() { + assert_eq!(format!("{}", UnitShare32(0)), "0/1000000000"); + assert_eq!( + format!("{}", UnitShare32(500_000_000)), + "500000000/1000000000" + ); + assert_eq!(format!("{}", UnitShare32::MAX), "1000000000/1000000000"); + } + + #[test] + fn test_unit_share16_checked_add() { + let a = UnitShare16(3_000); + let b = UnitShare16(2_000); + let c = UnitShare16(8_000); + + assert_eq!(a.checked_add(b).unwrap(), UnitShare16(5_000)); + assert!(a.checked_add(c).is_none()); // 3000 + 8000 = 11000 > MAX. + assert!(UnitShare16::MAX.checked_add(UnitShare16(1)).is_none()); + assert_eq!( + UnitShare16::MIN.checked_add(UnitShare16::MAX).unwrap(), + UnitShare16::MAX + ); + } + + #[test] + fn test_unit_share32_checked_add() { + let a = UnitShare32(300_000_000); + let b = UnitShare32(200_000_000); + let c = UnitShare32(800_000_000); + + assert_eq!(a.checked_add(b).unwrap(), UnitShare32(500_000_000)); + assert!(a.checked_add(c).is_none()); // Would exceed MAX. + assert!(UnitShare32::MAX.checked_add(UnitShare32(1)).is_none()); + assert_eq!( + UnitShare32::MIN.checked_add(UnitShare32::MAX).unwrap(), + UnitShare32::MAX + ); + } + + #[test] + fn test_unit_share16_checked_sub() { + let a = UnitShare16(5_000); + let b = UnitShare16(2_000); + let c = UnitShare16(8_000); + + assert_eq!(a.checked_sub(b).unwrap(), UnitShare16(3_000)); + assert!(a.checked_sub(c).is_none()); // 5000 - 8000 would underflow. + assert!(UnitShare16::MIN.checked_sub(UnitShare16(1)).is_none()); + assert_eq!( + UnitShare16::MAX.checked_sub(UnitShare16::MIN).unwrap(), + UnitShare16::MAX + ); + } + + #[test] + fn test_unit_share32_checked_sub() { + let a = UnitShare32(500_000_000); + let b = UnitShare32(200_000_000); + let c = UnitShare32(800_000_000); + + assert_eq!(a.checked_sub(b).unwrap(), UnitShare32(300_000_000)); + assert!(a.checked_sub(c).is_none()); // Would underflow. + assert!(UnitShare32::MIN.checked_sub(UnitShare32(1)).is_none()); + assert_eq!( + UnitShare32::MAX.checked_sub(UnitShare32::MIN).unwrap(), + UnitShare32::MAX + ); + } + + #[test] + fn test_unit_share16_saturating_add() { + let a = UnitShare16(3_000); + let b = UnitShare16(2_000); + let c = UnitShare16(8_000); + + assert_eq!(a.saturating_add(b), UnitShare16(5_000)); + assert_eq!(a.saturating_add(c), UnitShare16::MAX); // Saturates at MAX. + assert_eq!( + UnitShare16::MAX.saturating_add(UnitShare16(1_000)), + UnitShare16::MAX + ); + } + + #[test] + fn test_unit_share32_saturating_add() { + let a = UnitShare32(300_000_000); + let b = UnitShare32(200_000_000); + let c = UnitShare32(800_000_000); + + assert_eq!(a.saturating_add(b), UnitShare32(500_000_000)); + assert_eq!(a.saturating_add(c), UnitShare32::MAX); // Saturates at MAX. + assert_eq!( + UnitShare32::MAX.saturating_add(UnitShare32(1_000)), + UnitShare32::MAX + ); + } + + #[test] + fn test_unit_share16_saturating_sub() { + let a = UnitShare16(5_000); + let b = UnitShare16(2_000); + let c = UnitShare16(8_000); + + assert_eq!(a.saturating_sub(b), UnitShare16(3_000)); + assert_eq!(a.saturating_sub(c), UnitShare16::MIN); // Saturates at MIN. + assert_eq!( + UnitShare16::MIN.saturating_sub(UnitShare16(1_000)), + UnitShare16::MIN + ); + } + + #[test] + fn test_unit_share32_saturating_sub() { + let a = UnitShare32(500_000_000); + let b = UnitShare32(200_000_000); + let c = UnitShare32(800_000_000); + + assert_eq!(a.saturating_sub(b), UnitShare32(300_000_000)); + assert_eq!(a.saturating_sub(c), UnitShare32::MIN); // Saturates at MIN. + assert_eq!( + UnitShare32::MIN.saturating_sub(UnitShare32(1_000)), + UnitShare32::MIN + ); + } + + #[test] + fn test_unit_share16_mul_scalar() { + let half = UnitShare16(5_000); // 50%. + let quarter = UnitShare16(2_500); // 25%. + + assert_eq!(half.mul_scalar(100_u64), 50_u64); + assert_eq!(quarter.mul_scalar(100_u64), 25_u64); + assert_eq!(UnitShare16::MAX.mul_scalar(100_u64), 100_u64); + assert_eq!(UnitShare16::MIN.mul_scalar(100_u64), 0_u64); + + // Test precision. + assert_eq!(UnitShare16(1).mul_scalar(10_000_u64), 1_u64); // 0.01% of 10000 = 1. + } + + #[test] + fn test_unit_share32_mul_scalar() { + let half = UnitShare32(500_000_000); // 50%. + let quarter = UnitShare32(250_000_000); // 25%. + + assert_eq!(half.mul_scalar(100_u64), 50_u64); + assert_eq!(quarter.mul_scalar(100_u64), 25_u64); + assert_eq!(UnitShare32::MAX.mul_scalar(100_u64), 100_u64); + assert_eq!(UnitShare32::MIN.mul_scalar(100_u64), 0_u64); + + // Test high precision. + assert_eq!(UnitShare32(1).mul_scalar(1_000_000_000_u64), 1_u64); // 0.0000001% of 1B = 1. + } + + #[test] + fn test_unit_share16_from_u64() { + assert_eq!(u64::from(UnitShare16(0)), 0_u64); + assert_eq!(u64::from(UnitShare16(5_000)), 5_000_u64); + assert_eq!(u64::from(UnitShare16::MAX), 10_000_u64); + } + + #[test] + fn test_unit_share32_from_u64() { + assert_eq!(u64::from(UnitShare32(0)), 0_u64); + assert_eq!(u64::from(UnitShare32(500_000_000)), 500_000_000_u64); + assert_eq!(u64::from(UnitShare32::MAX), 1_000_000_000_u64); + } + + #[test] + fn test_unit_share16_try_from_u64() { + assert_eq!(UnitShare16::try_from(0_u64).unwrap(), UnitShare16::MIN); + assert_eq!( + UnitShare16::try_from(5_000_u64).unwrap(), + UnitShare16(5_000) + ); + assert_eq!(UnitShare16::try_from(10_000_u64).unwrap(), UnitShare16::MAX); + + // Test error cases. + assert!(UnitShare16::try_from(10_001_u64).is_err()); + } + + #[test] + fn test_unit_share32_try_from_u64() { + assert_eq!(UnitShare32::try_from(0_u64).unwrap(), UnitShare32::MIN); + assert_eq!( + UnitShare32::try_from(500_000_000_u64).unwrap(), + UnitShare32(500_000_000) + ); + assert_eq!( + UnitShare32::try_from(1_000_000_000_u64).unwrap(), + UnitShare32::MAX + ); + + // Test error cases. + assert!(UnitShare32::try_from(1_000_000_001_u64).is_err()); + } + + #[test] + fn test_unit_share16_edge_cases() { + // Test with maximum possible values that do not overflow u16. + let max_minus_one = UnitShare16(9_999); + let one = UnitShare16(1); + + assert_eq!(max_minus_one.checked_add(one).unwrap(), UnitShare16::MAX); + assert!(max_minus_one.checked_add(UnitShare16(2)).is_none()); + + // Test multiplication edge cases. + assert_eq!(UnitShare16::MAX.mul_scalar(u64::MAX), u64::MAX); + assert_eq!(UnitShare16::MIN.mul_scalar(u64::MAX), 0_u64); + } + + #[test] + fn test_unit_share32_edge_cases() { + // Test with maximum possible values that do not overflow u32. + let max_minus_one = UnitShare32(999_999_999); + let one = UnitShare32(1); + + assert_eq!(max_minus_one.checked_add(one).unwrap(), UnitShare32::MAX); + assert!(max_minus_one.checked_add(UnitShare32(2)).is_none()); + + // Test multiplication edge cases. + assert_eq!(UnitShare32::MAX.mul_scalar(u64::MAX), u64::MAX); + assert_eq!(UnitShare32::MIN.mul_scalar(u64::MAX), 0_u64); + } + + #[test] + fn test_reward_share_new() { + let contributor_key = Pubkey::new_unique(); + let unit_share = UnitShare32(500_000_000); + let should_block = true; + let economic_burn_rate = 100_000_000; + + let mut reward_share = RewardShare::new( + contributor_key, + unit_share.0, + should_block, + economic_burn_rate, + ) + .unwrap(); + + assert_eq!(reward_share.contributor_key, contributor_key); + assert_eq!(reward_share.checked_unit_share().unwrap(), unit_share); + assert_eq!( + reward_share.checked_economic_burn_rate().unwrap(), + UnitShare32(100_000_000) + ); + assert!(reward_share.is_blocked()); + + // Test setters. + reward_share.set_is_blocked(false); + assert!(!reward_share.is_blocked()); + + reward_share.set_economic_burn_rate(UnitShare32(200_000_000)); + assert_eq!( + reward_share.checked_economic_burn_rate().unwrap(), + UnitShare32(200_000_000) + ); + } +} diff --git a/solana/programs/revenue-distribution/tests/collect_integration_rewards_test.rs b/solana/programs/revenue-distribution/tests/collect_integration_rewards_test.rs new file mode 100644 index 0000000000..e636210fa0 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/collect_integration_rewards_test.rs @@ -0,0 +1,372 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::CollectIntegrationRewardsAccounts, ProgramConfiguration, ProgramFlagConfiguration, + RevenueDistributionInstructionData, + }, + integration::{find_integration_bucket_address, find_integration_distribution_address}, + types::DoubleZeroEpoch, +}; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, signature::Keypair, transaction::TransactionError, +}; + +// +// Setup. +// + +const SEEDED_BUCKET_AMOUNT: u64 = 100_000_000; + +struct CollectIntegrationRewardsSetup { + test_setup: common::ProgramTestWithOwner, + admin_signer: Keypair, + dz_epoch: DoubleZeroEpoch, + integration_distribution_key: Pubkey, + integration_2z_bucket_key: Pubkey, +} + +async fn setup_for_collect_integration_rewards() -> CollectIntegrationRewardsSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + test_setup + .initialize_rewards_integration(&configured.admin_signer, &mock_rewards_integration::ID) + .await + .unwrap(); + + // Snapshot the epoch this distribution will occupy. + let (_, program_config, _) = test_setup.fetch_program_config().await; + let dz_epoch = program_config.next_completed_dz_epoch; + + test_setup + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap(); + + // Initialize the mock's per-epoch integration distribution PDA. The mock + // also creates the 2Z bucket PDA as part of this instruction. + let (integration_distribution_key, _) = + find_integration_distribution_address(&mock_rewards_integration::ID, dz_epoch); + let (integration_2z_bucket_key, _) = find_integration_bucket_address( + &mock_rewards_integration::ID, + &integration_distribution_key, + ); + test_setup + .mock_initialize_integration_distribution(dz_epoch) + .await + .unwrap(); + + // Seed the bucket with 2Z. + test_setup + .transfer_2z(&integration_2z_bucket_key, SEEDED_BUCKET_AMOUNT) + .await + .unwrap(); + + CollectIntegrationRewardsSetup { + test_setup, + admin_signer: configured.admin_signer, + dz_epoch, + integration_distribution_key, + integration_2z_bucket_key, + } +} + +// +// Happy path. +// + +#[tokio::test] +async fn test_collect_integration_rewards() { + let CollectIntegrationRewardsSetup { + mut test_setup, + dz_epoch, + integration_distribution_key, + integration_2z_bucket_key, + .. + } = setup_for_collect_integration_rewards().await; + + let (_, distribution_before, _, _, destination_before) = + test_setup.fetch_distribution(dz_epoch).await; + + test_setup + .collect_integration_rewards( + dz_epoch, + &mock_rewards_integration::ID, + &integration_distribution_key, + &integration_2z_bucket_key, + ) + .await + .unwrap(); + + let (_, distribution_after, _, _, destination_after) = + test_setup.fetch_distribution(dz_epoch).await; + + assert_eq!( + distribution_after.collected_2z_from_integrations, + distribution_before.collected_2z_from_integrations + SEEDED_BUCKET_AMOUNT, + ); + assert_eq!( + distribution_after.integrations_collected_count, + distribution_before.integrations_collected_count + 1, + ); + assert_eq!( + destination_after.amount, + destination_before.amount + SEEDED_BUCKET_AMOUNT, + ); + + let bucket_after = test_setup + .fetch_token_account(&integration_2z_bucket_key) + .await + .unwrap(); + assert_eq!(bucket_after.amount, 0); +} + +// +// Unregistered integration is rejected before the CPI. +// + +#[tokio::test] +async fn test_cannot_collect_integration_rewards_when_unregistered() { + let CollectIntegrationRewardsSetup { + mut test_setup, + dz_epoch, + integration_distribution_key, + integration_2z_bucket_key, + .. + } = setup_for_collect_integration_rewards().await; + + // A program ID that was never registered as a rewards integration. + let unregistered_program_id = Pubkey::new_unique(); + + let ix = try_build_instruction( + &doublezero_revenue_distribution::ID, + CollectIntegrationRewardsAccounts::new( + dz_epoch, + &unregistered_program_id, + &integration_distribution_key, + &integration_2z_bucket_key, + ), + &RevenueDistributionInstructionData::CollectIntegrationRewards, + ) + .unwrap(); + + // The PDA derived from an unregistered program ID has no on-chain data; + // its owner defaults to the system program, so the `ZeroCopyAccount` + // owner check fires before the discriminator check. + let (tx_err, _) = test_setup + .unwrap_simulation_error(&[ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountOwner) + ); +} + +// +// Epoch mismatch — the integration's handler refuses and the error bubbles up. +// + +#[tokio::test] +async fn test_cannot_collect_integration_rewards_when_epoch_mismatched() { + let CollectIntegrationRewardsSetup { + mut test_setup, + dz_epoch, + integration_2z_bucket_key, + .. + } = setup_for_collect_integration_rewards().await; + + // Initialize a second mock integration distribution for a different epoch + // and point the instruction at it. + let wrong_dz_epoch = DoubleZeroEpoch::new(dz_epoch.value() + 1); + let (wrong_integration_distribution_key, _) = + find_integration_distribution_address(&mock_rewards_integration::ID, wrong_dz_epoch); + + test_setup + .mock_initialize_integration_distribution(wrong_dz_epoch) + .await + .unwrap(); + + let ix = try_build_instruction( + &doublezero_revenue_distribution::ID, + CollectIntegrationRewardsAccounts::new( + dz_epoch, + &mock_rewards_integration::ID, + &wrong_integration_distribution_key, + &integration_2z_bucket_key, + ), + &RevenueDistributionInstructionData::CollectIntegrationRewards, + ) + .unwrap(); + + let (tx_err, _) = test_setup + .unwrap_simulation_error(&[ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); +} + +// +// Second collect for the same (epoch, integration) is rejected by rev-distr's +// bitmap check. +// + +#[tokio::test] +async fn test_cannot_collect_integration_rewards_twice() { + let CollectIntegrationRewardsSetup { + mut test_setup, + dz_epoch, + integration_distribution_key, + integration_2z_bucket_key, + .. + } = setup_for_collect_integration_rewards().await; + + test_setup + .collect_integration_rewards( + dz_epoch, + &mock_rewards_integration::ID, + &integration_distribution_key, + &integration_2z_bucket_key, + ) + .await + .unwrap(); + + let ix = try_build_instruction( + &doublezero_revenue_distribution::ID, + CollectIntegrationRewardsAccounts::new( + dz_epoch, + &mock_rewards_integration::ID, + &integration_distribution_key, + &integration_2z_bucket_key, + ), + &RevenueDistributionInstructionData::CollectIntegrationRewards, + ) + .unwrap(); + + let (tx_err, _) = test_setup + .unwrap_simulation_error(&[ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); +} + +// +// Paused program refuses to run. +// + +#[tokio::test] +async fn test_cannot_collect_integration_rewards_when_paused() { + let CollectIntegrationRewardsSetup { + mut test_setup, + admin_signer, + dz_epoch, + integration_distribution_key, + integration_2z_bucket_key, + } = setup_for_collect_integration_rewards().await; + + test_setup + .configure_program( + &admin_signer, + [ProgramConfiguration::Flag( + ProgramFlagConfiguration::IsPaused(true), + )], + ) + .await + .unwrap(); + + let ix = try_build_instruction( + &doublezero_revenue_distribution::ID, + CollectIntegrationRewardsAccounts::new( + dz_epoch, + &mock_rewards_integration::ID, + &integration_distribution_key, + &integration_2z_bucket_key, + ), + &RevenueDistributionInstructionData::CollectIntegrationRewards, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(2).unwrap(), + "Program log: Program is paused" + ); +} + +// +// An integration registered after this distribution was initialized is outside +// its snapshot and cannot be collected into it. +// + +#[tokio::test] +async fn test_cannot_collect_integration_rewards_registered_after_initialization() { + let CollectIntegrationRewardsSetup { + mut test_setup, + admin_signer, + dz_epoch, + .. + } = setup_for_collect_integration_rewards().await; + + // The setup registered one integration before initializing the distribution, + // so the snapshot is 1 (indices 0..=0). Registering a second integration now + // gives it registration index 1, outside this distribution's snapshot. + // `mock_swap_sol_2z` is already loaded as an executable program by the test + // harness, satisfying registration's must-be-executable check. + let late_integration_program_id = mock_swap_sol_2z::ID; + test_setup + .initialize_rewards_integration(&admin_signer, &late_integration_program_id) + .await + .unwrap(); + + let (late_integration_distribution_key, _) = + find_integration_distribution_address(&late_integration_program_id, dz_epoch); + let (late_integration_2z_bucket_key, _) = find_integration_bucket_address( + &late_integration_program_id, + &late_integration_distribution_key, + ); + + let ix = try_build_instruction( + &doublezero_revenue_distribution::ID, + CollectIntegrationRewardsAccounts::new( + dz_epoch, + &late_integration_program_id, + &late_integration_distribution_key, + &late_integration_2z_bucket_key, + ), + &RevenueDistributionInstructionData::CollectIntegrationRewards, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(2).unwrap(), + "Program log: Integration registration index 1 is at or beyond this distribution's snapshot count of 1" + ); +} diff --git a/solana/programs/revenue-distribution/tests/common/mod.rs b/solana/programs/revenue-distribution/tests/common/mod.rs new file mode 100644 index 0000000000..5178ea22fb --- /dev/null +++ b/solana/programs/revenue-distribution/tests/common/mod.rs @@ -0,0 +1,1388 @@ +#![allow(dead_code)] + +#[ctor::ctor] +fn init_logger() { + static ONCE: std::sync::Once = std::sync::Once::new(); + ONCE.call_once(|| { + let mut builder = env_logger::builder(); + + // If DEBUG is set, show the Solana program logs. + if std::env::var_os("DEBUG").is_some() { + builder.filter_level(log::LevelFilter::Error); + builder.filter( + Some("solana_runtime::message_processor::stable_log"), + log::LevelFilter::Debug, + ); + } + + let _ = builder.try_init(); + }); +} + +use doublezero_program_tools::{ + instruction::try_build_instruction, zero_copy::checked_from_bytes_with_discriminator, +}; +use doublezero_revenue_distribution::{ + instruction::{ + account::{ + CollectIntegrationRewardsAccounts, ConfigureContributorRewardsAccounts, + ConfigureDistributionDebtAccounts, ConfigureDistributionRewardsAccounts, + ConfigureProgramAccounts, DistributeRewardsAccounts, + EnableSolanaValidatorDebtWriteOffAccounts, FinalizeDistributionDebtAccounts, + FinalizeDistributionRewardsAccounts, InitializeContributorRewardsAccounts, + InitializeDistributionAccounts, InitializeJournalAccounts, InitializeProgramAccounts, + InitializeRewardsIntegrationAccounts, InitializeSolanaValidatorDepositAccounts, + InitializeSwapDestinationAccounts, PaySolanaValidatorDebtAccounts, SetAdminAccounts, + SetDistributionEconomicBurnRateAccounts, SetRewardsManagerAccounts, + SweepDistributionTokensAccounts, VerifyDistributionMerkleRootAccounts, + WithdrawSolanaValidatorDepositAccounts, WriteOffSolanaValidatorDebtAccounts, + }, + ContributorRewardsConfiguration, DistributionMerkleRootKind, ProgramConfiguration, + ProgramFlagConfiguration, RevenueDistributionInstructionData, + }, + state::{ + self, ContributorRewards, Distribution, Journal, ProgramConfig, RewardsIntegration, + SolanaValidatorDeposit, + }, + types::{DoubleZeroEpoch, RewardShare, SolanaValidatorDebt}, + DOUBLEZERO_MINT_KEY, ID, +}; +use solana_loader_v3_interface::{get_program_data_address, state::UpgradeableLoaderState}; +use solana_program_pack::Pack; +use solana_program_test::{ + BanksClient, BanksClientError, ProgramTest, ProgramTestBanksClientExt, ProgramTestContext, +}; +use solana_pubkey::Pubkey; +use solana_sdk::{ + account::Account, + clock::Clock, + hash::Hash, + instruction::Instruction, + message::{v0::Message, VersionedMessage}, + signature::{Keypair, Signer}, + transaction::{TransactionError, VersionedTransaction}, +}; +use spl_token_interface::{ + instruction as token_instruction, + state::{Account as TokenAccount, AccountState as SplTokenAccountState, Mint}, +}; +use svm_hash::merkle::MerkleProof; +pub const TOTAL_2Z_SUPPLY: u64 = 10_000_000_000 * u64::pow(10, 8); + +pub struct TestAccount { + pub key: Pubkey, + pub info: Account, +} + +pub struct ProgramTestWithOwner { + pub context: ProgramTestContext, + pub owner_signer: Keypair, + pub treasury_2z_key: Pubkey, + pub sol_2z_swap_fills_registry_key: Pubkey, +} + +pub async fn start_test_with_accounts(accounts: Vec) -> ProgramTestWithOwner { + let mut program_test = ProgramTest::new("doublezero_revenue_distribution", ID, None); + program_test.prefer_bpf(true); + + program_test.add_program("mock_swap_sol_2z", mock_swap_sol_2z::ID, None); + program_test.add_program( + "mock_rewards_integration", + mock_rewards_integration::ID, + None, + ); + + let owner_signer = Keypair::new(); + + // Fake the BPF Upgradeable Program's program data account for the Revenue Distribution Program. + let program_data_acct = Account { + lamports: 69, + data: bincode::serialize(&UpgradeableLoaderState::ProgramData { + slot: 0, + upgrade_authority_address: Some(owner_signer.pubkey()), + }) + .unwrap(), + ..Default::default() + }; + program_test.add_account(get_program_data_address(&ID), program_data_acct); + + let mint_data = Mint { + mint_authority: owner_signer.pubkey().into(), + supply: TOTAL_2Z_SUPPLY, + decimals: 8, + is_initialized: true, + freeze_authority: owner_signer.pubkey().into(), + }; + + let mut mint_account_data = vec![0; Mint::LEN]; + mint_data.pack_into_slice(&mut mint_account_data); + + // Add the 2Z mint. + let mint_acct = Account { + lamports: 69, + owner: spl_token_interface::ID, + data: mint_account_data, + ..Default::default() + }; + program_test.add_account(DOUBLEZERO_MINT_KEY, mint_acct); + + let treasury_token_account_data = TokenAccount { + mint: DOUBLEZERO_MINT_KEY, + owner: owner_signer.pubkey(), + amount: TOTAL_2Z_SUPPLY, + state: SplTokenAccountState::Initialized, + ..Default::default() + }; + + let mut treasury_account_data = vec![0; TokenAccount::LEN]; + treasury_token_account_data.pack_into_slice(&mut treasury_account_data); + + let treasury_2z_key = Pubkey::new_unique(); + + // Add 2Z test treasury. + let treasury_token_acct = Account { + lamports: 69, + owner: spl_token_interface::ID, + data: treasury_account_data, + ..Default::default() + }; + program_test.add_account(treasury_2z_key, treasury_token_acct); + + for TestAccount { key, info } in accounts.into_iter() { + program_test.add_account(key, info); + } + + let mut context = program_test.start_with_context().await; + + let banks_client = &mut context.banks_client; + let payer_signer = &context.payer; + let cached_blockhash = &context.last_blockhash; + + let sol_2z_swap_fills_registry_signer = Keypair::new(); + let sol_2z_swap_fills_registry_key = sol_2z_swap_fills_registry_signer.pubkey(); + + // Initialize the mock swap sol 2z program's fills tracker. + let cached_blockhash = { + let (create_account_ix, initialize_fills_tracker_ix) = + mock_swap_sol_2z::instruction::create_and_initialize_fills_tracker( + &payer_signer.pubkey(), + &sol_2z_swap_fills_registry_key, + ); + + process_instructions_for_test( + banks_client, + cached_blockhash, + &[create_account_ix, initialize_fills_tracker_ix], + &[payer_signer, &sol_2z_swap_fills_registry_signer], + ) + .await + .unwrap() + }; + + context.last_blockhash = cached_blockhash; + + ProgramTestWithOwner { + context, + owner_signer, + treasury_2z_key, + sol_2z_swap_fills_registry_key, + } +} + +pub async fn start_test() -> ProgramTestWithOwner { + start_test_with_accounts(Default::default()).await +} + +pub fn generate_token_accounts_for_test(mint_key: &Pubkey, owners: &[Pubkey]) -> Vec { + owners + .iter() + .map(|&owner| { + let token_account = TokenAccount { + mint: *mint_key, + owner, + state: SplTokenAccountState::Initialized, + ..Default::default() + }; + + let mut token_account_data = vec![0; TokenAccount::LEN]; + token_account.pack_into_slice(&mut token_account_data); + + TestAccount { + key: Pubkey::new_unique(), + info: Account { + lamports: 69, + owner: spl_token_interface::ID, + data: token_account_data, + ..Default::default() + }, + } + }) + .collect() +} + +pub struct ConfiguredProgramState { + pub admin_signer: Keypair, + pub debt_accountant_signer: Keypair, + pub rewards_accountant_signer: Keypair, +} + +pub struct IndexedProgramLog<'a> { + pub index: usize, + pub message: &'a str, +} + +impl ProgramTestWithOwner { + pub async fn setup_configured_program( + &mut self, + ) -> Result { + let admin_signer = Keypair::new(); + let debt_accountant_signer = Keypair::new(); + let rewards_accountant_signer = Keypair::new(); + + self.initialize_program() + .await? + .initialize_journal() + .await? + .set_admin(&admin_signer.pubkey()) + .await? + .configure_program( + &admin_signer, + [ + ProgramConfiguration::DebtAccountant(debt_accountant_signer.pubkey()), + ProgramConfiguration::RewardsAccountant(rewards_accountant_signer.pubkey()), + ProgramConfiguration::SolanaValidatorFeeParameters { + base_block_rewards_pct: 500, + priority_block_rewards_pct: 0, + inflation_rewards_pct: 0, + jito_tips_pct: 0, + fixed_sol_amount: 0, + _unused: Default::default(), + }, + ProgramConfiguration::CommunityBurnRateParameters { + limit: 500_000_000, + dz_epochs_to_increasing: 10, + dz_epochs_to_limit: 20, + initial_rate: Some(100_000_000), + }, + ProgramConfiguration::DistributeRewardsRelayLamports(10_000), + ProgramConfiguration::CalculationGracePeriodMinutes(1), + ProgramConfiguration::DistributionInitializationGracePeriodMinutes(1), + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + ], + ) + .await?; + + Ok(ConfiguredProgramState { + admin_signer, + debt_accountant_signer, + rewards_accountant_signer, + }) + } + + pub fn payer_signer(&self) -> &Keypair { + &self.context.payer + } + + pub async fn get_clock(&self) -> Clock { + self.context + .banks_client + .get_sysvar::() + .await + .unwrap() + } + + pub async fn warp_timestamp_by(&mut self, seconds: u32) -> Result<&mut Self, BanksClientError> { + let mut clock = self.get_clock().await; + clock.unix_timestamp += i64::from(seconds); + self.context.set_sysvar::(&clock); + + Ok(self) + } + + pub async fn get_latest_blockhash(&mut self) -> Result { + self.context + .get_new_latest_blockhash() + .await + .map_err(Into::into) + } + + pub async fn unwrap_simulation_error( + &mut self, + instructions: &[Instruction], + signers: &[&Keypair], + ) -> Result<(TransactionError, Vec), BanksClientError> { + let recent_blockhash = self.get_latest_blockhash().await?; + + let payer_signer = &self.context.payer; + + let mut tx_signers = vec![payer_signer]; + tx_signers.extend_from_slice(signers); + + let transaction = new_transaction(instructions, &tx_signers, recent_blockhash); + + let simulated_tx = self + .context + .banks_client + .simulate_transaction(transaction) + .await?; + + let tx_err = simulated_tx + .result + .ok_or(BanksClientError::ClientError( + "simulation returned no result", + ))? + .unwrap_err(); + + self.context.last_blockhash = recent_blockhash; + + Ok((tx_err, simulated_tx.simulation_details.unwrap().logs)) + } + + pub async fn transfer_lamports( + &mut self, + dst_key: &Pubkey, + amount: u64, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let transfer_ix = + solana_system_interface::instruction::transfer(&payer_signer.pubkey(), dst_key, amount); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[transfer_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn create_2z_ata( + &mut self, + owner_key: &Pubkey, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + let payer_key = payer_signer.pubkey(); + + // No consequence if the ATA already exists. + let create_ix = spl_associated_token_account_interface::instruction::create_associated_token_account_idempotent( + &payer_key, + owner_key, + &DOUBLEZERO_MINT_KEY, + &spl_token_interface::ID, + ); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[create_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn transfer_2z( + &mut self, + dst_token_account_key: &Pubkey, + amount: u64, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + let owner_signer = &self.owner_signer; + + let token_transfer_ix = token_instruction::transfer( + &spl_token_interface::ID, + &self.treasury_2z_key, + dst_token_account_key, + &owner_signer.pubkey(), + &[], + amount, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[token_transfer_ix], + &[payer_signer, owner_signer], + ) + .await?; + + Ok(self) + } + + pub async fn initialize_program(&mut self) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + let program_config_key = ProgramConfig::find_address().0; + + let initialize_program_ix = try_build_instruction( + &ID, + InitializeProgramAccounts::new(&payer_signer.pubkey(), &DOUBLEZERO_MINT_KEY), + &RevenueDistributionInstructionData::InitializeProgram, + ) + .unwrap(); + + let remove_me_ix = solana_system_interface::instruction::transfer( + &payer_signer.pubkey(), + &program_config_key, + 1, + ); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[remove_me_ix, initialize_program_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn set_admin(&mut self, admin_key: &Pubkey) -> Result<&mut Self, BanksClientError> { + let owner_signer = &self.owner_signer; + let payer_signer = &self.context.payer; + + let set_admin_ix = try_build_instruction( + &ID, + SetAdminAccounts::new(&ID, &owner_signer.pubkey()), + &RevenueDistributionInstructionData::SetAdmin(*admin_key), + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[set_admin_ix], + &[payer_signer, owner_signer], + ) + .await?; + + Ok(self) + } + + pub async fn configure_program( + &mut self, + admin_signer: &Keypair, + settings: [ProgramConfiguration; N], + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let configure_program_ixs = settings + .into_iter() + .map(|setting| { + try_build_instruction( + &ID, + ConfigureProgramAccounts::new(&admin_signer.pubkey()), + &RevenueDistributionInstructionData::ConfigureProgram(setting), + ) + .unwrap() + }) + .collect::>(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &configure_program_ixs, + &[payer_signer, admin_signer], + ) + .await?; + + Ok(self) + } + + pub async fn initialize_journal(&mut self) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + let journal_key = Journal::find_address().0; + + let initialize_journal_ix = try_build_instruction( + &ID, + InitializeJournalAccounts::new(&payer_signer.pubkey(), &DOUBLEZERO_MINT_KEY), + &RevenueDistributionInstructionData::InitializeJournal, + ) + .unwrap(); + + let remove_me_ix = + solana_system_interface::instruction::transfer(&payer_signer.pubkey(), &journal_key, 1); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[remove_me_ix, initialize_journal_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn initialize_distribution( + &mut self, + accountant_signer: &Keypair, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let (_, program_config, _) = self.fetch_program_config().await; + + let initialize_distribution_ix = try_build_instruction( + &ID, + InitializeDistributionAccounts::new( + &accountant_signer.pubkey(), + &payer_signer.pubkey(), + program_config.next_completed_dz_epoch, + &DOUBLEZERO_MINT_KEY, + ), + &RevenueDistributionInstructionData::InitializeDistribution, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[initialize_distribution_ix], + &[payer_signer, accountant_signer], + ) + .await?; + + Ok(self) + } + + pub async fn configure_distribution_debt( + &mut self, + dz_epoch: DoubleZeroEpoch, + debt_accountant_signer: &Keypair, + total_validators: u32, + total_debt: u64, + merkle_root: Hash, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let configure_distribution_debt_ix = try_build_instruction( + &ID, + ConfigureDistributionDebtAccounts::new(&debt_accountant_signer.pubkey(), dz_epoch), + &RevenueDistributionInstructionData::ConfigureDistributionDebt { + total_validators, + total_debt, + merkle_root, + }, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[configure_distribution_debt_ix], + &[payer_signer, debt_accountant_signer], + ) + .await?; + + Ok(self) + } + + pub async fn finalize_distribution_debt( + &mut self, + dz_epoch: DoubleZeroEpoch, + debt_accountant_signer: &Keypair, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let finalize_distribution_debt_ix = try_build_instruction( + &ID, + FinalizeDistributionDebtAccounts::new( + &debt_accountant_signer.pubkey(), + dz_epoch, + &payer_signer.pubkey(), + ), + &RevenueDistributionInstructionData::FinalizeDistributionDebt, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[finalize_distribution_debt_ix], + &[payer_signer, debt_accountant_signer], + ) + .await?; + + Ok(self) + } + + pub async fn configure_distribution_rewards( + &mut self, + dz_epoch: DoubleZeroEpoch, + accountant_signer: &Keypair, + total_contributors: u32, + merkle_root: Hash, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let configure_distribution_rewards_ix = try_build_instruction( + &ID, + ConfigureDistributionRewardsAccounts::new(&accountant_signer.pubkey(), dz_epoch), + &RevenueDistributionInstructionData::ConfigureDistributionRewards { + total_contributors, + merkle_root, + }, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[configure_distribution_rewards_ix], + &[payer_signer, accountant_signer], + ) + .await?; + + Ok(self) + } + + pub async fn set_distribution_economic_burn_rate( + &mut self, + dz_epoch: DoubleZeroEpoch, + accountant_signer: &Keypair, + burn_rate_value: u32, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let set_distribution_economic_burn_rate_ix = try_build_instruction( + &ID, + SetDistributionEconomicBurnRateAccounts::new(&accountant_signer.pubkey(), dz_epoch), + &RevenueDistributionInstructionData::SetDistributionEconomicBurnRate(burn_rate_value), + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[set_distribution_economic_burn_rate_ix], + &[payer_signer, accountant_signer], + ) + .await?; + + Ok(self) + } + + pub async fn finalize_distribution_rewards( + &mut self, + dz_epoch: DoubleZeroEpoch, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let finalize_distribution_rewards_ix = try_build_instruction( + &ID, + FinalizeDistributionRewardsAccounts::new(&payer_signer.pubkey(), dz_epoch), + &RevenueDistributionInstructionData::FinalizeDistributionRewards, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[finalize_distribution_rewards_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn distribute_rewards( + &mut self, + dz_epoch: DoubleZeroEpoch, + reward_share: &RewardShare, + dz_mint_key: &Pubkey, + relayer_key: &Pubkey, + recipient_keys: &[&Pubkey], + proof: MerkleProof, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let contributor_key = &reward_share.contributor_key; + let unit_share = reward_share.unit_share; + let economic_burn_rate = reward_share.economic_burn_rate(); + + let distribute_rewards_ix = try_build_instruction( + &ID, + DistributeRewardsAccounts::new( + dz_epoch, + contributor_key, + dz_mint_key, + relayer_key, + recipient_keys, + ), + &RevenueDistributionInstructionData::DistributeRewards { + unit_share, + economic_burn_rate, + proof, + }, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[distribute_rewards_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn initialize_contributor_rewards( + &mut self, + service_key: &Pubkey, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let initialize_contributor_rewards_ix = try_build_instruction( + &ID, + InitializeContributorRewardsAccounts::new(&payer_signer.pubkey(), service_key), + &RevenueDistributionInstructionData::InitializeContributorRewards(*service_key), + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[initialize_contributor_rewards_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn set_rewards_manager( + &mut self, + service_key: &Pubkey, + contributor_manager_signer: &Keypair, + rewards_manager_key: &Pubkey, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let set_rewards_manager_ix = try_build_instruction( + &ID, + SetRewardsManagerAccounts::new(&contributor_manager_signer.pubkey(), service_key), + &RevenueDistributionInstructionData::SetRewardsManager(*rewards_manager_key), + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[set_rewards_manager_ix], + &[payer_signer, contributor_manager_signer], + ) + .await?; + + Ok(self) + } + + pub async fn configure_contributor_rewards( + &mut self, + service_key: &Pubkey, + rewards_manager_signer: &Keypair, + setting: [ContributorRewardsConfiguration; N], + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let configure_contributor_rewards_ixs = setting + .into_iter() + .map(|setting| { + try_build_instruction( + &ID, + ConfigureContributorRewardsAccounts::new( + &rewards_manager_signer.pubkey(), + service_key, + ), + &RevenueDistributionInstructionData::ConfigureContributorRewards(setting), + ) + .unwrap() + }) + .collect::>(); + + process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &configure_contributor_rewards_ixs, + &[payer_signer, rewards_manager_signer], + ) + .await?; + + Ok(self) + } + + pub async fn verify_distribution_merkle_root( + &mut self, + dz_epoch: DoubleZeroEpoch, + distribution_merkle_root_kinds_and_proofs: Vec<(DistributionMerkleRootKind, MerkleProof)>, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let verify_distribution_merkle_root_ixs = distribution_merkle_root_kinds_and_proofs + .into_iter() + .map(|(kind, proof)| { + try_build_instruction( + &ID, + VerifyDistributionMerkleRootAccounts::new(dz_epoch), + &RevenueDistributionInstructionData::VerifyDistributionMerkleRoot { + kind, + proof, + }, + ) + .unwrap() + }) + .collect::>(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &verify_distribution_merkle_root_ixs, + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn initialize_solana_validator_deposit( + &mut self, + node_id: &Pubkey, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let initialize_solana_validator_deposit_ix = try_build_instruction( + &ID, + InitializeSolanaValidatorDepositAccounts::new(&payer_signer.pubkey(), node_id), + &RevenueDistributionInstructionData::InitializeSolanaValidatorDeposit(*node_id), + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[initialize_solana_validator_deposit_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn initialize_rewards_integration( + &mut self, + admin_signer: &Keypair, + integration_program_id: &Pubkey, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let initialize_rewards_integration_ix = try_build_instruction( + &ID, + InitializeRewardsIntegrationAccounts::new( + &admin_signer.pubkey(), + &payer_signer.pubkey(), + integration_program_id, + ), + &RevenueDistributionInstructionData::InitializeRewardsIntegration, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[initialize_rewards_integration_ix], + &[payer_signer, admin_signer], + ) + .await?; + + Ok(self) + } + + pub async fn collect_integration_rewards( + &mut self, + dz_epoch: DoubleZeroEpoch, + integration_program_id: &Pubkey, + integration_distribution_key: &Pubkey, + integration_2z_bucket_key: &Pubkey, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let collect_integration_rewards_ix = try_build_instruction( + &ID, + CollectIntegrationRewardsAccounts::new( + dz_epoch, + integration_program_id, + integration_distribution_key, + integration_2z_bucket_key, + ), + &RevenueDistributionInstructionData::CollectIntegrationRewards, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[collect_integration_rewards_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn pay_solana_validator_debt( + &mut self, + dz_epoch: DoubleZeroEpoch, + debt: &SolanaValidatorDebt, + proof: MerkleProof, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let pay_solana_validator_debt_ix = try_build_instruction( + &ID, + PaySolanaValidatorDebtAccounts::new(dz_epoch, &debt.node_id), + &RevenueDistributionInstructionData::PaySolanaValidatorDebt { + amount: debt.amount, + proof, + }, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[pay_solana_validator_debt_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn enable_solana_validator_debt_write_off( + &mut self, + dz_epoch: DoubleZeroEpoch, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let enable_solana_validator_debt_write_off_ix = try_build_instruction( + &ID, + EnableSolanaValidatorDebtWriteOffAccounts::new(dz_epoch, &payer_signer.pubkey()), + &RevenueDistributionInstructionData::EnableSolanaValidatorDebtWriteOff, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[enable_solana_validator_debt_write_off_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn write_off_solana_validator_debt( + &mut self, + dz_epoch: DoubleZeroEpoch, + write_off_dz_epoch: DoubleZeroEpoch, + debt_accountant_signer: &Keypair, + debt: &SolanaValidatorDebt, + proof: MerkleProof, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let write_off_solana_validator_debt_ix = try_build_instruction( + &ID, + WriteOffSolanaValidatorDebtAccounts::new( + &debt_accountant_signer.pubkey(), + dz_epoch, + &debt.node_id, + write_off_dz_epoch, + ), + &RevenueDistributionInstructionData::WriteOffSolanaValidatorDebt { + amount: debt.amount, + proof, + }, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[write_off_solana_validator_debt_ix], + &[payer_signer, debt_accountant_signer], + ) + .await?; + + Ok(self) + } + + pub async fn withdraw_solana_validator_deposit( + &mut self, + node_signer: &Keypair, + beneficiary_key: Option<&Pubkey>, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + let node_id = node_signer.pubkey(); + + let withdraw_solana_validator_deposit_ix = try_build_instruction( + &ID, + WithdrawSolanaValidatorDepositAccounts::new(&node_id, beneficiary_key), + &RevenueDistributionInstructionData::WithdrawSolanaValidatorDeposit, + ) + .unwrap(); + + let signers = if beneficiary_key.is_some() { + vec![payer_signer, node_signer] + } else { + vec![payer_signer] + }; + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[withdraw_solana_validator_deposit_ix], + &signers, + ) + .await?; + + Ok(self) + } + + pub async fn initialize_swap_destination( + &mut self, + mint_key: &Pubkey, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let initialize_swap_destination_ix = try_build_instruction( + &ID, + InitializeSwapDestinationAccounts::new(&payer_signer.pubkey(), mint_key), + &RevenueDistributionInstructionData::InitializeSwapDestination, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[initialize_swap_destination_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn sweep_distribution_tokens( + &mut self, + dz_epoch: DoubleZeroEpoch, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + let sol_2z_swap_fills_registry_key = self.sol_2z_swap_fills_registry_key; + + let sweep_distribution_tokens_ix = try_build_instruction( + &ID, + SweepDistributionTokensAccounts::new( + dz_epoch, + &mock_swap_sol_2z::ID, + &sol_2z_swap_fills_registry_key, + ), + &RevenueDistributionInstructionData::SweepDistributionTokens, + ) + .unwrap(); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[sweep_distribution_tokens_ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + // + // Mock Swap SOL/2Z integration. + // + + pub async fn mock_initialize_integration_distribution( + &mut self, + dz_epoch: DoubleZeroEpoch, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + + let ix = mock_rewards_integration::instruction::initialize_integration_distribution( + &payer_signer.pubkey(), + dz_epoch, + ); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[ix], + &[payer_signer], + ) + .await?; + + Ok(self) + } + + pub async fn mock_buy_sol( + &mut self, + source_2z_token_account_key: &Pubkey, + transfer_authority_signer: &Keypair, + sol_destination_key: &Pubkey, + amount_2z_in: u64, + amount_sol_out: u64, + ) -> Result<&mut Self, BanksClientError> { + let payer_signer = &self.context.payer; + let fills_tracker_key = self.sol_2z_swap_fills_registry_key; + + let buy_sol_ix = mock_swap_sol_2z::instruction::buy_sol( + &fills_tracker_key, + source_2z_token_account_key, + &transfer_authority_signer.pubkey(), + sol_destination_key, + amount_2z_in, + amount_sol_out, + ); + + self.context.last_blockhash = process_instructions_for_test( + &mut self.context.banks_client, + &self.context.last_blockhash, + &[buy_sol_ix], + &[payer_signer, transfer_authority_signer], + ) + .await?; + + Ok(self) + } + + // + // Account fetchers. + // + + pub async fn fetch_token_account( + &self, + token_account_key: &Pubkey, + ) -> Result { + let token_account_data = self + .context + .banks_client + .get_account(*token_account_key) + .await? + .unwrap_or_default() + .data; + + TokenAccount::unpack(&token_account_data) + .map_err(|_| BanksClientError::ClientError("not SPL token account")) + } + + pub async fn fetch_program_config(&self) -> (Pubkey, ProgramConfig, TokenAccount) { + let program_config_key = ProgramConfig::find_address().0; + + let program_config_account_data = self + .context + .banks_client + .get_account(program_config_key) + .await + .unwrap() + .unwrap() + .data; + + let token_pda_key = state::find_2z_token_pda_address(&program_config_key).0; + let reserve_2z_data = self + .context + .banks_client + .get_account(token_pda_key) + .await + .unwrap() + .unwrap() + .data; + + let token_pda = TokenAccount::unpack(&reserve_2z_data).unwrap(); + + ( + program_config_key, + *checked_from_bytes_with_discriminator(&program_config_account_data) + .unwrap() + .0, + token_pda, + ) + } + + pub async fn fetch_journal(&self) -> (Pubkey, Journal, TokenAccount) { + let journal_key = Journal::find_address().0; + + let program_config_account_data = self + .context + .banks_client + .get_account(journal_key) + .await + .unwrap() + .unwrap() + .data; + + let (journal, _) = + checked_from_bytes_with_discriminator(&program_config_account_data).unwrap(); + + let token_pda_key = state::find_2z_token_pda_address(&journal_key).0; + let journal_2z_token_pda_data = self + .context + .banks_client + .get_account(token_pda_key) + .await + .unwrap() + .unwrap() + .data; + + let token_pda = TokenAccount::unpack(&journal_2z_token_pda_data).unwrap(); + + (journal_key, *journal, token_pda) + } + + pub async fn fetch_distribution( + &self, + dz_epoch: DoubleZeroEpoch, + ) -> (Pubkey, Distribution, Vec, u64, TokenAccount) { + let distribution_key = Distribution::find_address(dz_epoch).0; + + let distribution_account_info = self + .context + .banks_client + .get_account(distribution_key) + .await + .unwrap() + .unwrap(); + + let (distribution, distribution_remaining_data) = + checked_from_bytes_with_discriminator(&distribution_account_info.data).unwrap(); + + let token_pda_key = state::find_2z_token_pda_address(&distribution_key).0; + let distribution_2z_token_pda_data = self + .context + .banks_client + .get_account(token_pda_key) + .await + .unwrap() + .unwrap() + .data; + + let token_pda = TokenAccount::unpack(&distribution_2z_token_pda_data).unwrap(); + + ( + distribution_key, + *distribution, + distribution_remaining_data.to_vec(), + distribution_account_info.lamports, + token_pda, + ) + } + + pub async fn fetch_contributor_rewards( + &self, + service_key: &Pubkey, + ) -> (Pubkey, ContributorRewards) { + let contributor_rewards_key = ContributorRewards::find_address(service_key).0; + + let contributor_rewards_account_data = self + .context + .banks_client + .get_account(contributor_rewards_key) + .await + .unwrap() + .unwrap() + .data; + + let contributor_rewards = + *checked_from_bytes_with_discriminator(&contributor_rewards_account_data) + .unwrap() + .0; + + (contributor_rewards_key, contributor_rewards) + } + + pub async fn fetch_rewards_integration( + &self, + integration_program_id: &Pubkey, + ) -> (Pubkey, RewardsIntegration) { + let rewards_integration_key = RewardsIntegration::find_address(integration_program_id).0; + + let rewards_integration_account_data = self + .context + .banks_client + .get_account(rewards_integration_key) + .await + .unwrap() + .unwrap() + .data; + + ( + rewards_integration_key, + *checked_from_bytes_with_discriminator(&rewards_integration_account_data) + .unwrap() + .0, + ) + } + + pub async fn fetch_solana_validator_deposit( + &self, + node_id: &Pubkey, + ) -> (Pubkey, SolanaValidatorDeposit) { + let solana_validator_deposit_key = SolanaValidatorDeposit::find_address(node_id).0; + + let solana_validator_deposit_account_data = self + .context + .banks_client + .get_account(solana_validator_deposit_key) + .await + .unwrap() + .unwrap() + .data; + + ( + solana_validator_deposit_key, + *checked_from_bytes_with_discriminator(&solana_validator_deposit_account_data) + .unwrap() + .0, + ) + } +} + +pub async fn process_instructions_for_test( + banks_client: &mut BanksClient, + cached_blockhash: &Hash, + instructions: &[Instruction], + signers: &[&Keypair], +) -> Result { + let recent_blockhash = banks_client + .get_new_latest_blockhash(cached_blockhash) + .await + .map_err(|_| BanksClientError::ClientError("failed to get new blockhash"))?; + + let transaction = new_transaction(instructions, signers, recent_blockhash); + + banks_client.process_transaction(transaction).await?; + + Ok(recent_blockhash) +} + +fn new_transaction( + instructions: &[Instruction], + signers: &[&Keypair], + recent_blockhash: Hash, +) -> VersionedTransaction { + let message = + Message::try_compile(&signers[0].pubkey(), instructions, &[], recent_blockhash).unwrap(); + + VersionedTransaction::try_new(VersionedMessage::V0(message), signers).unwrap() +} diff --git a/solana/programs/revenue-distribution/tests/configure_contributor_rewards_test.rs b/solana/programs/revenue-distribution/tests/configure_contributor_rewards_test.rs new file mode 100644 index 0000000000..012a123c54 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/configure_contributor_rewards_test.rs @@ -0,0 +1,109 @@ +mod common; + +// + +use doublezero_revenue_distribution::{ + instruction::{ + ContributorRewardsConfiguration, ProgramConfiguration, ProgramFlagConfiguration, + }, + state::{ContributorRewards, RecipientShares}, +}; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; +use solana_sdk::signature::{Keypair, Signer}; + +// +// Setup. +// + +struct ConfigureContributorRewardsSetup { + test_setup: common::ProgramTestWithOwner, + rewards_manager_signer: Keypair, + service_key: Pubkey, +} + +async fn setup_for_configure_contributor_rewards() -> ConfigureContributorRewardsSetup { + let mut test_setup = common::start_test().await; + + let admin_signer = Keypair::new(); + let contributor_manager_signer = Keypair::new(); + let rewards_manager_signer = Keypair::new(); + let service_key = Pubkey::new_unique(); + + test_setup + .initialize_program() + .await + .unwrap() + .initialize_journal() + .await + .unwrap() + .set_admin(&admin_signer.pubkey()) + .await + .unwrap() + .configure_program( + &admin_signer, + [ + ProgramConfiguration::ContributorManager(contributor_manager_signer.pubkey()), + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + ], + ) + .await + .unwrap() + .initialize_contributor_rewards(&service_key) + .await + .unwrap() + .set_rewards_manager( + &service_key, + &contributor_manager_signer, + &rewards_manager_signer.pubkey(), + ) + .await + .unwrap(); + + ConfigureContributorRewardsSetup { + test_setup, + rewards_manager_signer, + service_key, + } +} + +// +// Configure contributor rewards — happy path. +// + +#[tokio::test] +async fn test_initialize_contributor_rewards() { + let ConfigureContributorRewardsSetup { + mut test_setup, + rewards_manager_signer, + service_key, + } = setup_for_configure_contributor_rewards().await; + + let recipients = [ + (Pubkey::new_unique(), 1_000), + (Pubkey::new_unique(), 2_000), + (Pubkey::new_unique(), 3_000), + (Pubkey::new_unique(), 4_000), + ]; + + test_setup + .configure_contributor_rewards( + &service_key, + &rewards_manager_signer, + [ + ContributorRewardsConfiguration::Recipients(recipients.to_vec()), + ContributorRewardsConfiguration::IsSetRewardsManagerBlocked(true), + ], + ) + .await + .unwrap(); + + let (_, contributor_rewards) = test_setup.fetch_contributor_rewards(&service_key).await; + + let mut expected_contributor_rewards = ContributorRewards::default(); + expected_contributor_rewards.set_is_set_rewards_manager_blocked(true); + expected_contributor_rewards.service_key = service_key; + expected_contributor_rewards.rewards_manager_key = rewards_manager_signer.pubkey(); + expected_contributor_rewards.recipient_shares = RecipientShares::new(&recipients).unwrap(); + assert_eq!(contributor_rewards, expected_contributor_rewards); +} diff --git a/solana/programs/revenue-distribution/tests/configure_distribution_debt_test.rs b/solana/programs/revenue-distribution/tests/configure_distribution_debt_test.rs new file mode 100644 index 0000000000..1426d6d71e --- /dev/null +++ b/solana/programs/revenue-distribution/tests/configure_distribution_debt_test.rs @@ -0,0 +1,254 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::ConfigureDistributionDebtAccounts, ProgramConfiguration, ProgramFlagConfiguration, + RevenueDistributionInstructionData, + }, + state::{self, Distribution}, + types::{BurnRate, DoubleZeroEpoch, SolanaValidatorDebt, ValidatorFee}, + ID, +}; +use solana_program_test::{tokio, BanksClientError}; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; +use svm_hash::{merkle::merkle_root_from_indexed_pod_leaves, sha2::Hash}; + +// +// Setup. +// + +struct ConfigureDistributionDebtSetup { + test_setup: common::ProgramTestWithOwner, + admin_signer: Keypair, + debt_accountant_signer: Keypair, +} + +/// Set up a configured program with two distributions (epoch 0 and 1), +/// but WITHOUT validator fee parameters set. This allows testing the +/// zero-fee rejection path. +async fn setup_for_configure_distribution_debt() -> ConfigureDistributionDebtSetup { + let mut test_setup = common::start_test().await; + + let admin_signer = Keypair::new(); + let debt_accountant_signer = Keypair::new(); + let rewards_accountant_signer = Keypair::new(); + + let calculation_grace_period_minutes = 60; + let initialization_grace_period_minutes = 1; + + test_setup + .initialize_program() + .await + .unwrap() + .initialize_journal() + .await + .unwrap() + .set_admin(&admin_signer.pubkey()) + .await + .unwrap() + .configure_program( + &admin_signer, + [ + ProgramConfiguration::DebtAccountant(debt_accountant_signer.pubkey()), + ProgramConfiguration::RewardsAccountant(rewards_accountant_signer.pubkey()), + ProgramConfiguration::CommunityBurnRateParameters { + limit: 500_000_000, + dz_epochs_to_increasing: 10, + dz_epochs_to_limit: 20, + initial_rate: Some(100_000_000), + }, + ProgramConfiguration::DistributeRewardsRelayLamports(10_000), + ProgramConfiguration::CalculationGracePeriodMinutes( + calculation_grace_period_minutes, + ), + ProgramConfiguration::DistributionInitializationGracePeriodMinutes( + initialization_grace_period_minutes, + ), + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + ], + ) + .await + .unwrap() + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(u32::from(initialization_grace_period_minutes) * 60) + .await + .unwrap() + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(u32::from(calculation_grace_period_minutes) * 60) + .await + .unwrap(); + + ConfigureDistributionDebtSetup { + test_setup, + admin_signer, + debt_accountant_signer, + } +} + +// +// Configure distribution debt — cannot configure with zero fees. +// + +#[tokio::test] +async fn test_cannot_configure_distribution_debt_with_zero_fees() { + let ConfigureDistributionDebtSetup { + mut test_setup, + debt_accountant_signer, + .. + } = setup_for_configure_distribution_debt().await; + + let dz_epoch = DoubleZeroEpoch::new(1); + + let (tx_err, program_logs) = simulate_program_revert( + &mut test_setup, + &debt_accountant_signer, + dz_epoch, + 3, + 69, + Hash::new_unique(), + ) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Configuring distribution debt disallowed" + ); +} + +// +// Configure distribution debt — happy path. +// + +#[tokio::test] +async fn test_configure_distribution_debt() { + let ConfigureDistributionDebtSetup { + mut test_setup, + admin_signer, + debt_accountant_signer, + } = setup_for_configure_distribution_debt().await; + + let solana_validator_base_block_rewards_pct_fee = 500; // 5%. + let dz_epoch = DoubleZeroEpoch::new(2); + + test_setup + .configure_program( + &admin_signer, + [ProgramConfiguration::SolanaValidatorFeeParameters { + base_block_rewards_pct: solana_validator_base_block_rewards_pct_fee, + priority_block_rewards_pct: 0, + inflation_rewards_pct: 0, + jito_tips_pct: 0, + fixed_sol_amount: 0, + _unused: Default::default(), + }], + ) + .await + .unwrap() + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60 * 60) + .await + .unwrap(); + + let debt_data = (0..3) + .map(|i| SolanaValidatorDebt { + node_id: Pubkey::new_unique(), + amount: 10_000_000_000 * (i + 1), + }) + .collect::>(); + + let total_solana_validators = debt_data.len() as u32; + let total_solana_validator_debt = debt_data.iter().map(|debt| debt.amount).sum(); + let solana_validator_debt_merkle_root = + merkle_root_from_indexed_pod_leaves(&debt_data, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + + test_setup + .configure_distribution_debt( + dz_epoch, + &debt_accountant_signer, + 3, + total_solana_validator_debt + 1, + Hash::new_unique(), + ) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap(); + + let (distribution_key, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + + let initial_cbr = 100_000_000; + let distribute_rewards_relay_lamports = 10_000; + + let mut expected_distribution = Distribution::default(); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + assert_eq!(distribution, expected_distribution); +} + +// +// Helpers. +// + +async fn simulate_program_revert( + test_setup: &mut common::ProgramTestWithOwner, + debt_accountant_signer: &Keypair, + dz_epoch: DoubleZeroEpoch, + total_validators: u32, + total_debt: u64, + merkle_root: Hash, +) -> Result<(TransactionError, Vec), BanksClientError> { + let configure_distribution_debt_ix = try_build_instruction( + &ID, + ConfigureDistributionDebtAccounts::new(&debt_accountant_signer.pubkey(), dz_epoch), + &RevenueDistributionInstructionData::ConfigureDistributionDebt { + total_validators, + total_debt, + merkle_root, + }, + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[configure_distribution_debt_ix], &[debt_accountant_signer]) + .await +} diff --git a/solana/programs/revenue-distribution/tests/configure_distribution_rewards_test.rs b/solana/programs/revenue-distribution/tests/configure_distribution_rewards_test.rs new file mode 100644 index 0000000000..49ef8cfc9e --- /dev/null +++ b/solana/programs/revenue-distribution/tests/configure_distribution_rewards_test.rs @@ -0,0 +1,101 @@ +mod common; + +// + +use doublezero_revenue_distribution::{ + state::{self, Distribution}, + types::{BurnRate, DoubleZeroEpoch, ValidatorFee}, +}; +use solana_program_test::tokio; +use solana_sdk::signature::Keypair; +use svm_hash::sha2::Hash; + +// +// Setup. +// + +struct ConfigureDistributionRewardsSetup { + test_setup: common::ProgramTestWithOwner, + rewards_accountant_signer: Keypair, + dz_epoch: DoubleZeroEpoch, +} + +/// Set up a configured program with two distributions (epoch 0 and 1). +/// Epoch 1 is ready for rewards configuration. +async fn setup_for_configure_distribution_rewards() -> ConfigureDistributionRewardsSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + test_setup + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + + ConfigureDistributionRewardsSetup { + test_setup, + rewards_accountant_signer: configured.rewards_accountant_signer, + dz_epoch, + } +} + +// +// Configure distribution rewards — happy path. +// + +#[tokio::test] +async fn test_configure_distribution_rewards() { + let ConfigureDistributionRewardsSetup { + mut test_setup, + rewards_accountant_signer, + dz_epoch, + .. + } = setup_for_configure_distribution_rewards().await; + + let total_contributors = 69; + let rewards_merkle_root = Hash::new_unique(); + + test_setup + .configure_distribution_rewards( + dz_epoch, + &rewards_accountant_signer, + total_contributors, + rewards_merkle_root, + ) + .await + .unwrap(); + + let initial_cbr = 100_000_000; + let solana_validator_base_block_rewards_pct_fee = 500; + let distribute_rewards_relay_lamports = 10_000; + + let (distribution_key, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.total_contributors = total_contributors; + expected_distribution.rewards_merkle_root = rewards_merkle_root; + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + assert_eq!(distribution, expected_distribution); +} diff --git a/solana/programs/revenue-distribution/tests/configure_program_test.rs b/solana/programs/revenue-distribution/tests/configure_program_test.rs new file mode 100644 index 0000000000..93c913a5df --- /dev/null +++ b/solana/programs/revenue-distribution/tests/configure_program_test.rs @@ -0,0 +1,177 @@ +mod common; + +// + +use doublezero_revenue_distribution::{ + instruction::{ProgramConfiguration, ProgramFeatureConfiguration, ProgramFlagConfiguration}, + state::{ + self, find_withdraw_sol_authority_address, CommunityBurnRateParameters, ProgramConfig, + }, + types::{BurnRate, DoubleZeroEpoch, ValidatorFee}, +}; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; +use solana_sdk::signature::{Keypair, Signer}; + +// +// Setup. +// + +struct ConfigureProgramSetup { + test_setup: common::ProgramTestWithOwner, + admin_signer: Keypair, +} + +async fn setup_for_configure_program() -> ConfigureProgramSetup { + let mut test_setup = common::start_test().await; + + let admin_signer = Keypair::new(); + + test_setup + .initialize_program() + .await + .unwrap() + .set_admin(&admin_signer.pubkey()) + .await + .unwrap(); + + ConfigureProgramSetup { + test_setup, + admin_signer, + } +} + +// +// Configure program — happy path. +// + +#[tokio::test] +async fn test_configure_program() { + let ConfigureProgramSetup { + mut test_setup, + admin_signer, + } = setup_for_configure_program().await; + + // Test inputs. + + // Flags. + let should_pause = false; + + // Other settings. + let debt_accountant_key = Pubkey::new_unique(); + let rewards_accountant_key = Pubkey::new_unique(); + let contributor_manager_key = Pubkey::new_unique(); + let sol_2z_swap_program_id = Pubkey::new_unique(); + + // Distribution settings. + let calculation_grace_period_minutes = 6 * 60; + let minimum_epoch_duration_to_finalize_rewards = 10; + + // -- Solana validator fee parameters. + let base_block_rewards_pct = 500; // 5% + let priority_block_rewards_pct = 69; // 0.69% + let inflation_rewards_pct = 420; // 4.2% + let jito_tips_pct = 20; // 0.2% + let fixed_sol_amount = u32::checked_pow(10, 9).unwrap(); // 1 SOL + + // -- Community burn rate. + let initial_cbr = 100_000_000; // 10%. + let cbr_limit = 500_000_000; // 50%. + let dz_epochs_to_increasing_cbr = 10; + let dz_epochs_to_cbr_limit = 20; + + // Relay settings. + let distribute_rewards_relay_lamports = 10_000; + + // Feature activation. + let debt_write_off_feature_activation_epoch = DoubleZeroEpoch::new(1); + + test_setup + .configure_program( + &admin_signer, + [ + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(should_pause)), + ProgramConfiguration::DebtAccountant(debt_accountant_key), + ProgramConfiguration::RewardsAccountant(rewards_accountant_key), + ProgramConfiguration::ContributorManager(contributor_manager_key), + ProgramConfiguration::CalculationGracePeriodMinutes( + calculation_grace_period_minutes, + ), + ProgramConfiguration::Sol2zSwapProgram(sol_2z_swap_program_id), + ProgramConfiguration::SolanaValidatorFeeParameters { + base_block_rewards_pct, + priority_block_rewards_pct, + inflation_rewards_pct, + jito_tips_pct, + fixed_sol_amount, + _unused: Default::default(), + }, + ProgramConfiguration::CommunityBurnRateParameters { + limit: cbr_limit, + dz_epochs_to_increasing: dz_epochs_to_increasing_cbr, + dz_epochs_to_limit: dz_epochs_to_cbr_limit, + initial_rate: Some(initial_cbr), + }, + ProgramConfiguration::DistributeRewardsRelayLamports( + distribute_rewards_relay_lamports, + ), + ProgramConfiguration::MinimumEpochDurationToFinalizeRewards( + minimum_epoch_duration_to_finalize_rewards, + ), + ProgramConfiguration::FeatureActivation { + feature: ProgramFeatureConfiguration::SolanaValidatorDebtWriteOff, + activation_epoch: debt_write_off_feature_activation_epoch, + }, + ], + ) + .await + .unwrap(); + + let (_, withdraw_sol_authority_bump) = + find_withdraw_sol_authority_address(&sol_2z_swap_program_id); + + let (program_config_key, program_config, _) = test_setup.fetch_program_config().await; + + let mut expected_program_config = ProgramConfig::default(); + expected_program_config.bump_seed = ProgramConfig::find_address().1; + expected_program_config.reserve_2z_bump_seed = + state::find_2z_token_pda_address(&program_config_key).1; + expected_program_config.withdraw_sol_authority_bump_seed = withdraw_sol_authority_bump; + expected_program_config.admin_key = admin_signer.pubkey(); + expected_program_config.contributor_manager_key = contributor_manager_key; + expected_program_config.set_is_paused(should_pause); + expected_program_config.debt_accountant_key = debt_accountant_key; + expected_program_config.rewards_accountant_key = rewards_accountant_key; + expected_program_config.sol_2z_swap_program_id = sol_2z_swap_program_id; + expected_program_config.debt_write_off_feature_activation_epoch = + debt_write_off_feature_activation_epoch; + + let expected_distribution_params = &mut expected_program_config.distribution_parameters; + expected_distribution_params.calculation_grace_period_minutes = + calculation_grace_period_minutes; + expected_distribution_params.minimum_epoch_duration_to_finalize_rewards = + minimum_epoch_duration_to_finalize_rewards; + + let expected_solana_validator_fee_params = + &mut expected_distribution_params.solana_validator_fee_parameters; + expected_solana_validator_fee_params.base_block_rewards_pct = + ValidatorFee::new(base_block_rewards_pct).unwrap(); + expected_solana_validator_fee_params.priority_block_rewards_pct = + ValidatorFee::new(priority_block_rewards_pct).unwrap(); + expected_solana_validator_fee_params.inflation_rewards_pct = + ValidatorFee::new(inflation_rewards_pct).unwrap(); + expected_solana_validator_fee_params.jito_tips_pct = ValidatorFee::new(jito_tips_pct).unwrap(); + expected_solana_validator_fee_params.fixed_sol_amount = fixed_sol_amount; + + expected_distribution_params.community_burn_rate_parameters = CommunityBurnRateParameters::new( + BurnRate::new(initial_cbr).unwrap(), + BurnRate::new(cbr_limit).unwrap(), + dz_epochs_to_increasing_cbr, + dz_epochs_to_cbr_limit, + ) + .unwrap(); + + let expected_relay_params = &mut expected_program_config.relay_parameters; + expected_relay_params.distribute_rewards_lamports = distribute_rewards_relay_lamports; + assert_eq!(program_config, expected_program_config); +} diff --git a/solana/programs/revenue-distribution/tests/distribute_rewards_test.rs b/solana/programs/revenue-distribution/tests/distribute_rewards_test.rs new file mode 100644 index 0000000000..e6b3bc3218 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/distribute_rewards_test.rs @@ -0,0 +1,976 @@ +mod common; + +// + +use std::collections::HashMap; + +use doublezero_program_tools::{instruction::try_build_instruction, zero_copy}; +use doublezero_revenue_distribution::{ + instruction::{ + account::DistributeRewardsAccounts, ContributorRewardsConfiguration, + DistributionMerkleRootKind, ProgramConfiguration, ProgramFeatureConfiguration, + ProgramFlagConfiguration, RevenueDistributionInstructionData, + }, + state::{self, Distribution, Journal, SolanaValidatorDeposit}, + types::{BurnRate, DoubleZeroEpoch, RewardShare, SolanaValidatorDebt, ValidatorFee}, + DOUBLEZERO_MINT_KEY, ID, +}; +use solana_program_test::{tokio, BanksClientError}; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; +use spl_associated_token_account_interface::address::get_associated_token_address; +use svm_hash::merkle::{merkle_root_from_indexed_pod_leaves, MerkleProof}; + +// +// Constants (round numbers to avoid rounding issues). +// + +const INITIAL_CBR: u32 = 100_000_000; // 10%. +const CBR_LIMIT: u32 = 500_000_000; // 50%. +const SOLANA_VALIDATOR_BASE_BLOCK_REWARDS_PCT_FEE: u16 = 500; // 5%. +const DISTRIBUTE_REWARDS_RELAY_LAMPORTS: u32 = 128 * 6_960; +const DIRECT_2Z_PAYMENT_AMOUNT: u64 = 1_000 * 100_000_000; // 1,000 2Z. +const SWEPT_2Z_AMOUNT_1: u64 = 9_000 * 100_000_000; // 9,000 2Z (for dz_epoch). +const SWEPT_2Z_AMOUNT_2: u64 = 5_000 * 100_000_000; // 5,000 2Z (for next_dz_epoch). + +// dz_epoch total pool: SWEPT_2Z_AMOUNT_1 + DIRECT_2Z = 10,000 2Z = 1_000_000_000_000. +// With 10% CBR: burned = 100_000_000_000, distributed = 900_000_000_000. +// With 25% economic burn: burned = 250_000_000_000, distributed = 750_000_000_000. +// next_dz_epoch total pool: SWEPT_2Z_AMOUNT_2 = 5,000 2Z = 500_000_000_000. +// With 10% CBR: burned = 50_000_000_000, distributed = 450_000_000_000. + +// +// Setup — Layer 1: Distributions with debt paid and tokens swept. +// + +struct DistributeRewardsBaseSetup { + test_setup: common::ProgramTestWithOwner, + contributor_manager_signer: Keypair, + debt_accountant_signer: Keypair, + rewards_accountant_signer: Keypair, + total_solana_validators: u32, + total_solana_validator_debt: u64, + solana_validator_debt_merkle_root: svm_hash::sha2::Hash, + uncollectible_debt: SolanaValidatorDebt, + dz_epoch: DoubleZeroEpoch, + next_dz_epoch: DoubleZeroEpoch, +} + +/// Set up a fully configured program with: +/// - Two distributions (dz_epoch=1, next_dz_epoch=2) +/// - Debt configured, finalized, and paid (with one uncollectible validator) +/// - Write-offs processed for the uncollectible validator +/// - SOL swaps completed +/// - Direct 2Z payments funded to journal ATA +/// - Distribution 0 finalized and swept (prerequisite) +/// +/// Stops BEFORE contributor rewards setup and rewards finalization. +async fn setup_distributions_with_debt() -> DistributeRewardsBaseSetup { + let transfer_authority_signer = Keypair::new(); + + let bootstrapped_accounts = common::generate_token_accounts_for_test( + &DOUBLEZERO_MINT_KEY, + &[transfer_authority_signer.pubkey()], + ); + let src_token_account_key = bootstrapped_accounts.first().unwrap().key; + + let mut test_setup = common::start_test_with_accounts(bootstrapped_accounts).await; + + let admin_signer = Keypair::new(); + let contributor_manager_signer = Keypair::new(); + let debt_accountant_signer = Keypair::new(); + let rewards_accountant_signer = Keypair::new(); + + let dz_epoch = DoubleZeroEpoch::new(1); + let next_dz_epoch = dz_epoch.saturating_add_duration(1); + + // Debt data: 8 validators with round amounts. + let debt_data = (0..8) + .map(|i| SolanaValidatorDebt { + node_id: Pubkey::new_unique(), + amount: 10_000_000_000 * (i + 1), + }) + .collect::>(); + + let total_solana_validators = debt_data.len() as u32; + let total_solana_validator_debt = debt_data.iter().map(|debt| debt.amount).sum(); + let solana_validator_debt_merkle_root = + merkle_root_from_indexed_pod_leaves(&debt_data, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + + let uncollectible_index = 2; + let uncollectible_debt = debt_data[uncollectible_index]; + + let (journal_key, _) = Journal::find_address(); + let journal_ata_key = get_associated_token_address(&journal_key, &DOUBLEZERO_MINT_KEY); + + // Configure program and initialize distributions. + test_setup + .transfer_2z( + &src_token_account_key, + SWEPT_2Z_AMOUNT_1 + SWEPT_2Z_AMOUNT_2, + ) + .await + .unwrap() + .initialize_program() + .await + .unwrap() + .initialize_journal() + .await + .unwrap() + .create_2z_ata(&journal_key) + .await + .unwrap() + .initialize_swap_destination(&DOUBLEZERO_MINT_KEY) + .await + .unwrap() + .set_admin(&admin_signer.pubkey()) + .await + .unwrap() + .configure_program( + &admin_signer, + [ + ProgramConfiguration::Sol2zSwapProgram(mock_swap_sol_2z::ID), + ProgramConfiguration::ContributorManager(contributor_manager_signer.pubkey()), + ProgramConfiguration::DebtAccountant(debt_accountant_signer.pubkey()), + ProgramConfiguration::RewardsAccountant(rewards_accountant_signer.pubkey()), + ProgramConfiguration::SolanaValidatorFeeParameters { + base_block_rewards_pct: SOLANA_VALIDATOR_BASE_BLOCK_REWARDS_PCT_FEE, + priority_block_rewards_pct: 0, + inflation_rewards_pct: 0, + jito_tips_pct: 0, + fixed_sol_amount: 0, + _unused: Default::default(), + }, + ProgramConfiguration::CommunityBurnRateParameters { + limit: CBR_LIMIT, + dz_epochs_to_increasing: 10, + dz_epochs_to_limit: 20, + initial_rate: Some(INITIAL_CBR), + }, + ProgramConfiguration::DistributeRewardsRelayLamports( + DISTRIBUTE_REWARDS_RELAY_LAMPORTS, + ), + ProgramConfiguration::MinimumEpochDurationToFinalizeRewards(1), + ProgramConfiguration::CalculationGracePeriodMinutes(1), + ProgramConfiguration::DistributionInitializationGracePeriodMinutes(1), + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + ProgramConfiguration::FeatureActivation { + feature: ProgramFeatureConfiguration::SolanaValidatorDebtWriteOff, + activation_epoch: dz_epoch, + }, + ], + ) + .await + .unwrap() + // Distribution 0. + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .transfer_2z(&journal_ata_key, DIRECT_2Z_PAYMENT_AMOUNT) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + // Distribution 1 (dz_epoch). + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .finalize_distribution_debt(DoubleZeroEpoch::default(), &debt_accountant_signer) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap() + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap() + // Distribution 2 (next_dz_epoch). + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + next_dz_epoch, + &debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap() + .finalize_distribution_debt(next_dz_epoch, &debt_accountant_signer) + .await + .unwrap() + .finalize_distribution_rewards(Default::default()) + .await + .unwrap() + .sweep_distribution_tokens(Default::default()) + .await + .unwrap() + .enable_solana_validator_debt_write_off(dz_epoch) + .await + .unwrap(); + + // Pay debt for all validators. The uncollectible one only pays for + // next_dz_epoch and gets written off for dz_epoch. + for (i, debt) in debt_data.iter().enumerate() { + let node_id = &debt.node_id; + let amount = debt.amount; + let (deposit_key, _) = SolanaValidatorDeposit::find_address(node_id); + + let proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + i.try_into().unwrap(), + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + if i == uncollectible_index { + test_setup + .initialize_solana_validator_deposit(node_id) + .await + .unwrap() + .transfer_lamports(&deposit_key, amount) + .await + .unwrap() + .pay_solana_validator_debt(next_dz_epoch, debt, proof.clone()) + .await + .unwrap() + .write_off_solana_validator_debt( + dz_epoch, + next_dz_epoch, + &debt_accountant_signer, + &uncollectible_debt, + proof, + ) + .await + .unwrap(); + } else { + test_setup + .initialize_solana_validator_deposit(node_id) + .await + .unwrap() + .transfer_lamports(&deposit_key, 2 * amount) + .await + .unwrap() + .pay_solana_validator_debt(dz_epoch, debt, proof.clone()) + .await + .unwrap() + .pay_solana_validator_debt(next_dz_epoch, debt, proof) + .await + .unwrap(); + } + } + + // SOL swaps — one per distribution. + let sol_destination_key = Pubkey::new_unique(); + + test_setup + .mock_buy_sol( + &src_token_account_key, + &transfer_authority_signer, + &sol_destination_key, + SWEPT_2Z_AMOUNT_1, + total_solana_validator_debt, + ) + .await + .unwrap() + .mock_buy_sol( + &src_token_account_key, + &transfer_authority_signer, + &sol_destination_key, + SWEPT_2Z_AMOUNT_2, + total_solana_validator_debt - uncollectible_debt.amount, + ) + .await + .unwrap(); + + DistributeRewardsBaseSetup { + test_setup, + contributor_manager_signer, + debt_accountant_signer, + rewards_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + uncollectible_debt, + dz_epoch, + next_dz_epoch, + } +} + +// +// Setup — Layer 2: Contributor rewards configured and rewards merkle root posted. +// Stops BEFORE finalize_distribution_rewards and sweep_distribution_tokens. +// + +struct DistributeRewardsReadySetup { + test_setup: common::ProgramTestWithOwner, + debt_accountant_signer: Keypair, + rewards_accountant_signer: Keypair, + total_solana_validators: u32, + total_solana_validator_debt: u64, + solana_validator_debt_merkle_root: svm_hash::sha2::Hash, + uncollectible_debt: SolanaValidatorDebt, + dz_epoch: DoubleZeroEpoch, + next_dz_epoch: DoubleZeroEpoch, + rewards_data: Vec, + proofs: Vec, + total_contributors: u32, + rewards_merkle_root: svm_hash::sha2::Hash, + recipient_shares: HashMap>, +} + +/// Build on layer 1: configure contributor rewards with 5 contributors +/// (clean proportions: 40%, 25%, 20%, 10%, 5%), post + verify rewards +/// merkle root for both epochs. +/// +/// Stops BEFORE finalize/sweep so the caller can optionally set +/// economic burn rate before finalizing. +async fn setup_ready_to_distribute() -> DistributeRewardsReadySetup { + let DistributeRewardsBaseSetup { + mut test_setup, + contributor_manager_signer, + debt_accountant_signer, + rewards_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + uncollectible_debt, + dz_epoch, + next_dz_epoch, + } = setup_distributions_with_debt().await; + + // 5 contributors with clean proportions (no rounding issues). + let rewards_data = vec![ + RewardShare::new(Pubkey::new_unique(), 400_000_000, false, 0).unwrap(), // 40% + RewardShare::new(Pubkey::new_unique(), 250_000_000, false, 0).unwrap(), // 25% + RewardShare::new(Pubkey::new_unique(), 200_000_000, false, 0).unwrap(), // 20% + RewardShare::new(Pubkey::new_unique(), 100_000_000, false, 0).unwrap(), // 10% + RewardShare::new(Pubkey::new_unique(), 50_000_000, false, 0).unwrap(), // 5% + ]; + assert_eq!( + rewards_data.iter().map(|r| r.unit_share).sum::(), + 1_000_000_000 + ); + + let total_contributors = rewards_data.len() as u32; + let rewards_merkle_root = + merkle_root_from_indexed_pod_leaves(&rewards_data, Some(RewardShare::LEAF_PREFIX)).unwrap(); + + let rewards_manager_signer = Keypair::new(); + let mut recipient_shares = HashMap::new(); + + // Each contributor has a single recipient at 100% share. + for RewardShare { + contributor_key, .. + } in rewards_data.iter() + { + let recipient_key = Pubkey::new_unique(); + let recipients = vec![(recipient_key, 10_000)]; // 100% + + recipient_shares.insert(*contributor_key, recipients.clone()); + + test_setup + .create_2z_ata(&recipient_key) + .await + .unwrap() + .initialize_contributor_rewards(contributor_key) + .await + .unwrap() + .set_rewards_manager( + contributor_key, + &contributor_manager_signer, + &rewards_manager_signer.pubkey(), + ) + .await + .unwrap() + .configure_contributor_rewards( + contributor_key, + &rewards_manager_signer, + [ContributorRewardsConfiguration::Recipients(recipients)], + ) + .await + .unwrap(); + } + + // Build proofs. + let proofs = rewards_data + .iter() + .enumerate() + .map(|(i, _)| { + MerkleProof::from_indexed_pod_leaves( + &rewards_data, + i.try_into().unwrap(), + Some(RewardShare::LEAF_PREFIX), + ) + .unwrap() + }) + .collect::>(); + + // Post rewards merkle root and verify for both epochs. + let kinds_and_proofs = rewards_data + .iter() + .copied() + .zip(proofs.iter()) + .map(|(reward_share, proof)| { + ( + DistributionMerkleRootKind::RewardShare(reward_share), + proof.clone(), + ) + }) + .collect::>(); + + test_setup + .configure_distribution_rewards( + dz_epoch, + &rewards_accountant_signer, + total_contributors, + rewards_merkle_root, + ) + .await + .unwrap() + .configure_distribution_rewards( + next_dz_epoch, + &rewards_accountant_signer, + total_contributors, + rewards_merkle_root, + ) + .await + .unwrap() + .verify_distribution_merkle_root(dz_epoch, kinds_and_proofs.clone()) + .await + .unwrap() + .verify_distribution_merkle_root(next_dz_epoch, kinds_and_proofs) + .await + .unwrap(); + + DistributeRewardsReadySetup { + test_setup, + debt_accountant_signer, + rewards_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + uncollectible_debt, + dz_epoch, + next_dz_epoch, + rewards_data, + proofs, + total_contributors, + rewards_merkle_root, + recipient_shares, + } +} + +// +// Distribute rewards — happy path. +// + +#[tokio::test] +async fn test_distribute_rewards() { + let DistributeRewardsReadySetup { + mut test_setup, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + uncollectible_debt, + dz_epoch, + next_dz_epoch, + rewards_data, + proofs, + total_contributors, + rewards_merkle_root, + recipient_shares, + .. + } = setup_ready_to_distribute().await; + + // Finalize and sweep both epochs. + test_setup + .finalize_distribution_rewards(dz_epoch) + .await + .unwrap() + .finalize_distribution_rewards(next_dz_epoch) + .await + .unwrap() + .sweep_distribution_tokens(dz_epoch) + .await + .unwrap() + .sweep_distribution_tokens(next_dz_epoch) + .await + .unwrap(); + + // Distribute rewards for both epochs. + let mut first_epoch_processed_rewards_count = 0; + for (share, proof) in rewards_data.iter().copied().zip(proofs.iter()) { + first_epoch_processed_rewards_count += 1; + + let contributor_key = &share.contributor_key; + let recipient_keys = recipient_shares[contributor_key] + .iter() + .map(|(key, _)| key) + .collect::>(); + + let relayer_key = Pubkey::new_unique(); + + // Distribute for the first epoch. + test_setup + .distribute_rewards( + dz_epoch, + &share, + &DOUBLEZERO_MINT_KEY, + &relayer_key, + &recipient_keys, + proof.clone(), + ) + .await + .unwrap(); + + let relayer_balance = test_setup + .context + .banks_client + .get_balance(relayer_key) + .await + .unwrap(); + assert_eq!(relayer_balance, DISTRIBUTE_REWARDS_RELAY_LAMPORTS as u64); + + // Cannot distribute rewards again for the same contributor. + let (tx_err, program_logs) = simulate_distribute_rewards_revert( + &mut test_setup, + dz_epoch, + &share, + &relayer_key, + &recipient_keys, + proof.clone(), + ) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + if first_epoch_processed_rewards_count == rewards_data.len() { + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: All rewards have already been distributed" + ); + } else { + assert_eq!( + program_logs.get(3).unwrap(), + &format!( + "Program log: Merkle leaf index {} has already been processed", + proof.leaf_index.unwrap() + ) + ); + } + + // Distribute for the second epoch. + test_setup + .distribute_rewards( + next_dz_epoch, + &share, + &DOUBLEZERO_MINT_KEY, + &relayer_key, + &recipient_keys, + proof.clone(), + ) + .await + .unwrap(); + + let relayer_balance = test_setup + .context + .banks_client + .get_balance(relayer_key) + .await + .unwrap(); + assert_eq!( + relayer_balance, + 2 * DISTRIBUTE_REWARDS_RELAY_LAMPORTS as u64 + ); + } + + // Check the first distribution (dz_epoch). + // Total pool: SWEPT_2Z_AMOUNT_1 + DIRECT_2Z_PAYMENT_AMOUNT = 1_000_000_000_000. + // CBR 10%: burned = 100_000_000_000, distributed = 900_000_000_000. + + let ( + distribution_key, + distribution, + remaining_distribution_data, + distribution_lamports, + distribution_2z_token_pda, + ) = test_setup.fetch_distribution(dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.set_is_rewards_calculation_finalized(true); + expected_distribution.set_has_swept_2z_tokens(true); + expected_distribution.set_is_solana_validator_debt_write_off_enabled(true); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(INITIAL_CBR).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(SOLANA_VALIDATOR_BASE_BLOCK_REWARDS_PCT_FEE).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.solana_validator_payments_count = total_solana_validators - 1; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.collected_solana_validator_payments = + total_solana_validator_debt - uncollectible_debt.amount; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.collected_2z_converted_from_sol = SWEPT_2Z_AMOUNT_1; + expected_distribution.collected_prepaid_2z_payments = DIRECT_2Z_PAYMENT_AMOUNT; + expected_distribution.total_contributors = total_contributors; + expected_distribution.rewards_merkle_root = rewards_merkle_root; + expected_distribution.distributed_rewards_count = total_contributors; + expected_distribution.distributed_2z_amount = 900_000_000_000; + expected_distribution.burned_2z_amount = 100_000_000_000; + expected_distribution.processed_solana_validator_debt_end_index = total_solana_validators / 8; + expected_distribution.processed_solana_validator_debt_write_off_start_index = + total_solana_validators / 8; + expected_distribution.processed_solana_validator_debt_write_off_end_index = + 2 * (total_solana_validators / 8); + expected_distribution.processed_rewards_start_index = 2 * (total_solana_validators / 8); + expected_distribution.processed_rewards_end_index = + 2 * (total_solana_validators / 8) + (total_contributors / 8 + 1); + expected_distribution.distribute_rewards_relay_lamports = DISTRIBUTE_REWARDS_RELAY_LAMPORTS; + expected_distribution.calculation_allowed_timestamp = test_setup + .get_clock() + .await + .unix_timestamp + .saturating_sub(60) as u32; + expected_distribution.solana_validator_write_off_count = 1; + assert_eq!(distribution, expected_distribution); + assert_eq!( + distribution.distributed_2z_amount + distribution.burned_2z_amount, + SWEPT_2Z_AMOUNT_1 + DIRECT_2Z_PAYMENT_AMOUNT + ); + + // First byte reflects debt tracking. + let processed_debt_bitmap = + &remaining_distribution_data[distribution.processed_solana_validator_debt_bitmap_range()]; + assert_eq!(processed_debt_bitmap, [0b11111111]); + + // Second byte reflects write off tracking. + let write_off_bitmap = &remaining_distribution_data + [distribution.processed_solana_validator_debt_write_off_bitmap_range()]; + assert_eq!(write_off_bitmap, [0b00000100]); + + // Third byte reflects rewards tracking. + let rewards_bitmap = + &remaining_distribution_data[distribution.processed_rewards_bitmap_range()]; + assert_eq!(rewards_bitmap, [0b00011111]); + + // All relay lamports should have been paid, leaving only the rent exemption. + let distribution_rent_exemption = test_setup + .context + .banks_client + .get_rent() + .await + .unwrap() + .minimum_balance(zero_copy::data_end::() + remaining_distribution_data.len()); + assert_eq!(distribution_lamports, distribution_rent_exemption); + + // All tokens should have been transferred to all recipients. + assert_eq!(distribution_2z_token_pda.amount, 0); + + // Verify the journal's ATA was fully drained. + let journal_ata_key = + get_associated_token_address(&Journal::find_address().0, &DOUBLEZERO_MINT_KEY); + let journal_ata_after = test_setup + .fetch_token_account(&journal_ata_key) + .await + .unwrap(); + assert_eq!(journal_ata_after.amount, 0); + + // Check the second distribution (next_dz_epoch). + // Total pool: SWEPT_2Z_AMOUNT_2 = 5,000 2Z = 500_000_000_000. + // CBR 10%: burned = 50_000_000_000, distributed = 450_000_000_000. + + let ( + distribution_key, + distribution, + remaining_distribution_data, + distribution_lamports, + distribution_2z_token_pda, + ) = test_setup.fetch_distribution(next_dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.set_is_rewards_calculation_finalized(true); + expected_distribution.set_has_swept_2z_tokens(true); + expected_distribution.bump_seed = Distribution::find_address(next_dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = next_dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(INITIAL_CBR).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(SOLANA_VALIDATOR_BASE_BLOCK_REWARDS_PCT_FEE).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.solana_validator_payments_count = total_solana_validators; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.collected_solana_validator_payments = total_solana_validator_debt; + expected_distribution.uncollectible_sol_debt = uncollectible_debt.amount; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.collected_2z_converted_from_sol = SWEPT_2Z_AMOUNT_2; + expected_distribution.total_contributors = total_contributors; + expected_distribution.rewards_merkle_root = rewards_merkle_root; + expected_distribution.distributed_rewards_count = total_contributors; + expected_distribution.distributed_2z_amount = 450_000_000_000; + expected_distribution.burned_2z_amount = 50_000_000_000; + expected_distribution.processed_solana_validator_debt_end_index = total_solana_validators / 8; + expected_distribution.processed_rewards_start_index = total_solana_validators / 8; + expected_distribution.processed_rewards_end_index = + (total_solana_validators / 8) + (total_contributors / 8 + 1); + expected_distribution.distribute_rewards_relay_lamports = DISTRIBUTE_REWARDS_RELAY_LAMPORTS; + expected_distribution.calculation_allowed_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + assert_eq!(distribution, expected_distribution); + assert_eq!( + distribution.distributed_2z_amount + distribution.burned_2z_amount, + SWEPT_2Z_AMOUNT_2 + ); + + // Debt + rewards tracking. + assert_eq!(remaining_distribution_data, vec![0b11111111, 0b00011111]); + + let distribution_rent_exemption = test_setup + .context + .banks_client + .get_rent() + .await + .unwrap() + .minimum_balance(zero_copy::data_end::() + remaining_distribution_data.len()); + assert_eq!(distribution_lamports, distribution_rent_exemption); + + assert_eq!(distribution_2z_token_pda.amount, 0); + + // Cannot distribute rewards again for either epoch. + for (share, proof) in rewards_data.iter().copied().zip(proofs.iter()) { + let contributor_key = &share.contributor_key; + let recipient_keys = recipient_shares[contributor_key] + .iter() + .map(|(key, _)| key) + .collect::>(); + let relayer_key = Pubkey::new_unique(); + + for epoch in [dz_epoch, next_dz_epoch] { + let (tx_err, program_logs) = simulate_distribute_rewards_revert( + &mut test_setup, + epoch, + &share, + &relayer_key, + &recipient_keys, + proof.clone(), + ) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: All rewards have already been distributed" + ); + } + } +} + +// +// Distribute rewards with economic burn rate. +// +// Verifies that the economic burn rate on a distribution correctly overrides +// the community burn rate when higher. Uses the same full setup (SOL debt + +// swaps + direct 2Z payments) to test the aggregate pool. +// + +#[tokio::test] +async fn test_distribute_rewards_with_economic_burn_rate() { + let DistributeRewardsReadySetup { + mut test_setup, + debt_accountant_signer, + rewards_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + uncollectible_debt, + dz_epoch, + rewards_data, + proofs, + total_contributors, + rewards_merkle_root, + recipient_shares, + .. + } = setup_ready_to_distribute().await; + + let distribution_economic_burn_rate = 250_000_000; // 25%. + + // Set economic burn rate before finalizing rewards. + test_setup + .set_distribution_economic_burn_rate( + dz_epoch, + &rewards_accountant_signer, + distribution_economic_burn_rate, + ) + .await + .unwrap(); + + // Finalize and sweep only dz_epoch. + test_setup + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .finalize_distribution_rewards(dz_epoch) + .await + .unwrap() + .sweep_distribution_tokens(dz_epoch) + .await + .unwrap(); + + // Distribute rewards. + for (share, proof) in rewards_data.iter().copied().zip(proofs.iter()) { + let contributor_key = &share.contributor_key; + let recipient_keys = recipient_shares[contributor_key] + .iter() + .map(|(key, _)| key) + .collect::>(); + let relayer_key = Pubkey::new_unique(); + + test_setup + .distribute_rewards( + dz_epoch, + &share, + &DOUBLEZERO_MINT_KEY, + &relayer_key, + &recipient_keys, + proof.clone(), + ) + .await + .unwrap(); + } + + // Check the distribution. + // Total pool: SWEPT_2Z_AMOUNT_1 + DIRECT_2Z_PAYMENT_AMOUNT = 1_000_000_000_000. + // Economic burn rate 25% (overrides 10% CBR): + // burned = 250_000_000_000, distributed = 750_000_000_000. + + let ( + distribution_key, + distribution, + _remaining_distribution_data, + _distribution_lamports, + distribution_2z_token_pda, + ) = test_setup.fetch_distribution(dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.set_is_rewards_calculation_finalized(true); + expected_distribution.set_has_swept_2z_tokens(true); + expected_distribution.set_is_solana_validator_debt_write_off_enabled(true); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(INITIAL_CBR).unwrap(); + expected_distribution.economic_burn_rate = + BurnRate::new(distribution_economic_burn_rate).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(SOLANA_VALIDATOR_BASE_BLOCK_REWARDS_PCT_FEE).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.solana_validator_payments_count = total_solana_validators - 1; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.collected_solana_validator_payments = + total_solana_validator_debt - uncollectible_debt.amount; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.collected_2z_converted_from_sol = SWEPT_2Z_AMOUNT_1; + expected_distribution.collected_prepaid_2z_payments = DIRECT_2Z_PAYMENT_AMOUNT; + expected_distribution.total_contributors = total_contributors; + expected_distribution.rewards_merkle_root = rewards_merkle_root; + expected_distribution.distributed_rewards_count = total_contributors; + expected_distribution.distributed_2z_amount = 750_000_000_000; + expected_distribution.burned_2z_amount = 250_000_000_000; + expected_distribution.processed_solana_validator_debt_end_index = total_solana_validators / 8; + expected_distribution.processed_solana_validator_debt_write_off_start_index = + total_solana_validators / 8; + expected_distribution.processed_solana_validator_debt_write_off_end_index = + 2 * (total_solana_validators / 8); + expected_distribution.processed_rewards_start_index = 2 * (total_solana_validators / 8); + expected_distribution.processed_rewards_end_index = + 2 * (total_solana_validators / 8) + (total_contributors / 8 + 1); + expected_distribution.distribute_rewards_relay_lamports = DISTRIBUTE_REWARDS_RELAY_LAMPORTS; + expected_distribution.calculation_allowed_timestamp = test_setup + .get_clock() + .await + .unix_timestamp + .saturating_sub(60) as u32; + expected_distribution.solana_validator_write_off_count = 1; + assert_eq!(distribution, expected_distribution); + assert_eq!( + distribution.distributed_2z_amount + distribution.burned_2z_amount, + SWEPT_2Z_AMOUNT_1 + DIRECT_2Z_PAYMENT_AMOUNT + ); + + // All tokens should have been transferred to all recipients. + assert_eq!(distribution_2z_token_pda.amount, 0); +} + +// +// Helpers. +// + +async fn simulate_distribute_rewards_revert( + test_setup: &mut common::ProgramTestWithOwner, + dz_epoch: DoubleZeroEpoch, + share: &RewardShare, + relayer_key: &Pubkey, + recipient_keys: &[&Pubkey], + proof: MerkleProof, +) -> Result<(TransactionError, Vec), BanksClientError> { + let distribute_rewards_ix = try_build_instruction( + &ID, + DistributeRewardsAccounts::new( + dz_epoch, + &share.contributor_key, + &DOUBLEZERO_MINT_KEY, + relayer_key, + recipient_keys, + ), + &RevenueDistributionInstructionData::DistributeRewards { + unit_share: share.unit_share, + economic_burn_rate: share.economic_burn_rate(), + proof, + }, + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[distribute_rewards_ix], &[]) + .await +} diff --git a/solana/programs/revenue-distribution/tests/enable_solana_validator_debt_write_off_test.rs b/solana/programs/revenue-distribution/tests/enable_solana_validator_debt_write_off_test.rs new file mode 100644 index 0000000000..33cc3c47d2 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/enable_solana_validator_debt_write_off_test.rs @@ -0,0 +1,264 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::EnableSolanaValidatorDebtWriteOffAccounts, ProgramConfiguration, + ProgramFeatureConfiguration, RevenueDistributionInstructionData, + }, + state::{self, Distribution}, + types::{BurnRate, DoubleZeroEpoch, ValidatorFee}, + ID, +}; +use solana_program_test::{tokio, BanksClientError}; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; +use svm_hash::sha2::Hash; + +// +// Setup. +// + +struct EnableSolanaValidatorDebtWriteOffSetup { + test_setup: common::ProgramTestWithOwner, + admin_signer: Keypair, + debt_accountant_signer: Keypair, + dz_epoch: DoubleZeroEpoch, + activation_epoch: DoubleZeroEpoch, + total_solana_validators: u32, + total_solana_validator_debt: u64, + solana_validator_debt_merkle_root: Hash, +} + +/// Set up a configured program with distribution debt configured on epoch 1, +/// ready to test enabling debt write-off. The feature activation epoch is NOT +/// yet configured — tests do that as needed. +async fn setup_for_enable_solana_validator_debt_write_off() -> EnableSolanaValidatorDebtWriteOffSetup +{ + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + let activation_epoch = dz_epoch.saturating_add_duration(2); + let total_solana_validators = 2; + let total_solana_validator_debt = 100 * u64::pow(10, 9); + let solana_validator_debt_merkle_root = Hash::new_unique(); + + test_setup + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &configured.debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap(); + + EnableSolanaValidatorDebtWriteOffSetup { + test_setup, + admin_signer: configured.admin_signer, + debt_accountant_signer: configured.debt_accountant_signer, + dz_epoch, + activation_epoch, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + } +} + +// +// Enable Solana validator debt write off — happy path with sequential error checks. +// + +#[tokio::test] +async fn test_enable_solana_validator_debt_write_off() { + let EnableSolanaValidatorDebtWriteOffSetup { + mut test_setup, + admin_signer, + debt_accountant_signer, + dz_epoch, + activation_epoch, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + } = setup_for_enable_solana_validator_debt_write_off().await; + + let initial_cbr = 100_000_000; + let solana_validator_base_block_rewards_pct_fee = 500; + let distribute_rewards_relay_lamports = 10_000; + + let payer_key = test_setup.payer_signer().pubkey(); + + let enable_ix = try_build_instruction( + &ID, + EnableSolanaValidatorDebtWriteOffAccounts::new(dz_epoch, &payer_key), + &RevenueDistributionInstructionData::EnableSolanaValidatorDebtWriteOff, + ) + .unwrap(); + + // Cannot enable write-offs before the feature is activated. + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(std::slice::from_ref(&enable_ix), &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(2).unwrap(), + "Program log: Debt write-off feature activation epoch not configured" + ); + + test_setup + .configure_program( + &admin_signer, + [ProgramConfiguration::FeatureActivation { + feature: ProgramFeatureConfiguration::SolanaValidatorDebtWriteOff, + activation_epoch, + }], + ) + .await + .unwrap(); + + // Cannot enable write-offs before the activation epoch. + let program_config = test_setup.fetch_program_config().await.1; + assert!(!program_config.is_debt_write_off_feature_activated()); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(std::slice::from_ref(&enable_ix), &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(2).unwrap(), + &format!( + "Program log: Debt write-off feature activates at epoch {}", + activation_epoch + ) + ); + + test_setup + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap(); + + let program_config = test_setup.fetch_program_config().await.1; + assert!(program_config.is_debt_write_off_feature_activated()); + + // Cannot enable write offs before debt calculation is finalized. + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(std::slice::from_ref(&enable_ix), &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Distribution debt calculation is not finalized yet" + ); + + test_setup + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap() + .enable_solana_validator_debt_write_off(dz_epoch) + .await + .unwrap(); + + let (distribution_key, distribution, remaining_distribution_data, _, _) = + test_setup.fetch_distribution(dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.set_is_solana_validator_debt_write_off_enabled(true); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.processed_solana_validator_debt_end_index = + total_solana_validators / 8 + 1; + expected_distribution.processed_solana_validator_debt_write_off_start_index = + total_solana_validators / 8 + 1; + expected_distribution.processed_solana_validator_debt_write_off_end_index = + 2 * (total_solana_validators / 8 + 1); + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + assert_eq!(distribution, expected_distribution); + + let expected_remaining_distribution_data_len = 2; + assert_eq!( + expected_remaining_distribution_data_len, + 2 * (total_solana_validators as usize / 8 + 1) + ); + assert_eq!( + remaining_distribution_data, + vec![0; expected_remaining_distribution_data_len] + ); + + // Cannot enable write offs again. + let (tx_err, program_logs) = simulate_program_revert(&mut test_setup, dz_epoch) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Solana validator debt write off is already enabled" + ); +} + +// +// Helpers. +// + +async fn simulate_program_revert( + test_setup: &mut common::ProgramTestWithOwner, + dz_epoch: DoubleZeroEpoch, +) -> Result<(TransactionError, Vec), BanksClientError> { + let payer_key = test_setup.payer_signer().pubkey(); + + let enable_ix = try_build_instruction( + &ID, + EnableSolanaValidatorDebtWriteOffAccounts::new(dz_epoch, &payer_key), + &RevenueDistributionInstructionData::EnableSolanaValidatorDebtWriteOff, + ) + .unwrap(); + + test_setup.unwrap_simulation_error(&[enable_ix], &[]).await +} diff --git a/solana/programs/revenue-distribution/tests/finalize_distribution_debt_test.rs b/solana/programs/revenue-distribution/tests/finalize_distribution_debt_test.rs new file mode 100644 index 0000000000..6a0b24ba4e --- /dev/null +++ b/solana/programs/revenue-distribution/tests/finalize_distribution_debt_test.rs @@ -0,0 +1,252 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::{ConfigureDistributionDebtAccounts, FinalizeDistributionDebtAccounts}, + RevenueDistributionInstructionData, + }, + state::{self, Distribution}, + types::{BurnRate, DoubleZeroEpoch, ValidatorFee}, + ID, +}; +use solana_program_test::{tokio, BanksClientError}; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; +use svm_hash::sha2::Hash; + +// +// Setup. +// + +struct FinalizeDistributionDebtSetup { + test_setup: common::ProgramTestWithOwner, + debt_accountant_signer: Keypair, + dz_epoch: DoubleZeroEpoch, + total_solana_validators: u32, + total_solana_validator_debt: u64, + solana_validator_debt_merkle_root: Hash, +} + +/// Set up a configured program with distribution debt configured on epoch 1, +/// ready for finalization. +async fn setup_for_finalize_distribution_debt() -> FinalizeDistributionDebtSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + let total_solana_validators = 2; + let total_solana_validator_debt = 100 * u64::pow(10, 9); + let solana_validator_debt_merkle_root = Hash::new_unique(); + + test_setup + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &configured.debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap(); + + FinalizeDistributionDebtSetup { + test_setup, + debt_accountant_signer: configured.debt_accountant_signer, + dz_epoch, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + } +} + +// +// Finalize distribution debt — happy path. +// + +#[tokio::test] +async fn test_finalize_distribution_debt() { + let FinalizeDistributionDebtSetup { + mut test_setup, + debt_accountant_signer, + dz_epoch, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + } = setup_for_finalize_distribution_debt().await; + + test_setup + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap(); + + let initial_cbr = 100_000_000; + let solana_validator_base_block_rewards_pct_fee = 500; + let distribute_rewards_relay_lamports = 10_000; + + let (distribution_key, distribution, remaining_distribution_data, _, _) = + test_setup.fetch_distribution(dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.processed_solana_validator_debt_end_index = + total_solana_validators / 8 + 1; + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + assert_eq!(distribution, expected_distribution); + + let expected_remaining_distribution_data_len = 1; + assert_eq!( + expected_remaining_distribution_data_len, + total_solana_validators as usize / 8 + 1 + ); + assert_eq!( + remaining_distribution_data, + vec![0; expected_remaining_distribution_data_len] + ); +} + +// +// Finalize distribution debt — cannot configure debt after finalization. +// + +#[tokio::test] +async fn test_cannot_configure_debt_after_finalization() { + let FinalizeDistributionDebtSetup { + mut test_setup, + debt_accountant_signer, + dz_epoch, + .. + } = setup_for_finalize_distribution_debt().await; + + test_setup + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap(); + + let (tx_err, program_logs) = + simulate_configure_debt_revert(&mut test_setup, &debt_accountant_signer, dz_epoch) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Distribution debt calculation has already been finalized" + ); +} + +// +// Finalize distribution debt — cannot finalize twice. +// + +#[tokio::test] +async fn test_cannot_finalize_distribution_debt_twice() { + let FinalizeDistributionDebtSetup { + mut test_setup, + debt_accountant_signer, + dz_epoch, + .. + } = setup_for_finalize_distribution_debt().await; + + test_setup + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap(); + + let (tx_err, program_logs) = + simulate_finalize_debt_revert(&mut test_setup, &debt_accountant_signer, dz_epoch) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Distribution debt calculation has already been finalized" + ); +} + +// +// Helpers. +// + +async fn simulate_configure_debt_revert( + test_setup: &mut common::ProgramTestWithOwner, + debt_accountant_signer: &Keypair, + dz_epoch: DoubleZeroEpoch, +) -> Result<(TransactionError, Vec), BanksClientError> { + let configure_distribution_debt_ix = try_build_instruction( + &ID, + ConfigureDistributionDebtAccounts::new(&debt_accountant_signer.pubkey(), dz_epoch), + &RevenueDistributionInstructionData::ConfigureDistributionDebt { + total_validators: 3, + total_debt: 1, + merkle_root: Hash::new_unique(), + }, + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[configure_distribution_debt_ix], &[debt_accountant_signer]) + .await +} + +async fn simulate_finalize_debt_revert( + test_setup: &mut common::ProgramTestWithOwner, + debt_accountant_signer: &Keypair, + dz_epoch: DoubleZeroEpoch, +) -> Result<(TransactionError, Vec), BanksClientError> { + let payer_key = test_setup.payer_signer().pubkey(); + + let finalize_distribution_debt_ix = try_build_instruction( + &ID, + FinalizeDistributionDebtAccounts::new( + &debt_accountant_signer.pubkey(), + dz_epoch, + &payer_key, + ), + &RevenueDistributionInstructionData::FinalizeDistributionDebt, + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[finalize_distribution_debt_ix], &[debt_accountant_signer]) + .await +} diff --git a/solana/programs/revenue-distribution/tests/finalize_distribution_rewards_test.rs b/solana/programs/revenue-distribution/tests/finalize_distribution_rewards_test.rs new file mode 100644 index 0000000000..4a0f06570b --- /dev/null +++ b/solana/programs/revenue-distribution/tests/finalize_distribution_rewards_test.rs @@ -0,0 +1,756 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::{ConfigureDistributionRewardsAccounts, FinalizeDistributionRewardsAccounts}, + ProgramConfiguration, RevenueDistributionInstructionData, + }, + integration::{find_integration_bucket_address, find_integration_distribution_address}, + state::{self, Distribution, Journal}, + types::{BurnRate, DoubleZeroEpoch, ValidatorFee}, + DOUBLEZERO_MINT_KEY, ID, +}; +use solana_program_test::{tokio, BanksClientError}; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; +use spl_associated_token_account_interface::address::get_associated_token_address; +use svm_hash::sha2::Hash; + +// +// Setup. +// + +struct FinalizeDistributionRewardsSetup { + test_setup: common::ProgramTestWithOwner, + admin_signer: Keypair, + debt_accountant_signer: Keypair, + rewards_accountant_signer: Keypair, + dz_epoch: DoubleZeroEpoch, + total_solana_validators: u32, + total_solana_validator_debt: u64, + solana_validator_debt_merkle_root: Hash, + total_contributors: u32, + rewards_merkle_root: Hash, +} + +/// Set up a configured program with distribution debt configured on epoch 1. +async fn setup_for_finalize_distribution_rewards() -> FinalizeDistributionRewardsSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + let total_solana_validators = 2_048; + let total_solana_validator_debt = 69; + let solana_validator_debt_merkle_root = Hash::new_unique(); + let total_contributors = 69; + let rewards_merkle_root = Hash::new_unique(); + + test_setup + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &configured.debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap(); + + FinalizeDistributionRewardsSetup { + test_setup, + admin_signer: configured.admin_signer, + debt_accountant_signer: configured.debt_accountant_signer, + rewards_accountant_signer: configured.rewards_accountant_signer, + dz_epoch, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + total_contributors, + rewards_merkle_root, + } +} + +// +// Finalize distribution rewards — happy path with sequential error checks. +// + +#[tokio::test] +async fn test_finalize_distribution_rewards() { + let FinalizeDistributionRewardsSetup { + mut test_setup, + admin_signer, + debt_accountant_signer, + rewards_accountant_signer, + dz_epoch, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + total_contributors, + rewards_merkle_root, + } = setup_for_finalize_distribution_rewards().await; + + let initial_cbr = 100_000_000; + let solana_validator_base_block_rewards_pct_fee = 500; + let distribute_rewards_relay_lamports = 10_000; + + // Cannot finalize rewards until debt has been finalized. + let (tx_err, program_logs) = simulate_finalize_revert(&mut test_setup, dz_epoch) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Distribution debt calculation is not finalized yet" + ); + + test_setup + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap(); + + // Cannot finalize if the rewards root is null. + let (tx_err, program_logs) = simulate_finalize_revert(&mut test_setup, dz_epoch) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Rewards root cannot be null with calculated debt" + ); + + test_setup + .configure_distribution_rewards( + dz_epoch, + &rewards_accountant_signer, + total_contributors, + rewards_merkle_root, + ) + .await + .unwrap(); + + // Cannot finalize until the minimum number of epochs has been configured. + let (tx_err, program_logs) = simulate_finalize_revert(&mut test_setup, dz_epoch) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Minimum epoch duration to finalize rewards is misconfigured" + ); + + let minimum_epoch_duration_to_finalize_rewards = 2; + + test_setup + .configure_program( + &admin_signer, + [ProgramConfiguration::MinimumEpochDurationToFinalizeRewards( + minimum_epoch_duration_to_finalize_rewards, + )], + ) + .await + .unwrap(); + + let (_, program_config, _) = test_setup.fetch_program_config().await; + + let minimum_dz_epoch_to_finalize = + dz_epoch.saturating_add_duration(minimum_epoch_duration_to_finalize_rewards.into()); + + // Cannot finalize until the minimum number of epochs have passed. + let (tx_err, program_logs) = simulate_finalize_revert(&mut test_setup, dz_epoch) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + &format!( + "Program log: DZ epoch must be at least {} (currently {}) to finalize rewards", + minimum_dz_epoch_to_finalize, program_config.next_completed_dz_epoch + ) + ); + + // Initialize another distribution to move next DZ epoch to allow rewards to + // be finalized. + test_setup + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap(); + + let (_, program_config, _) = test_setup.fetch_program_config().await; + assert_eq!( + program_config.next_completed_dz_epoch, + minimum_dz_epoch_to_finalize + ); + + let (_, _, remaining_distribution_data_before, distribution_lamports_balance_before, _) = + test_setup.fetch_distribution(dz_epoch).await; + let remaining_distribution_data_len_before = remaining_distribution_data_before.len(); + + test_setup + .finalize_distribution_rewards(dz_epoch) + .await + .unwrap(); + + let ( + distribution_key, + distribution, + distribution_remaining_data, + distribution_lamports_balance_after, + _, + ) = test_setup.fetch_distribution(dz_epoch).await; + + let expected_additional_data_len = 9; + assert_eq!(total_contributors / 8 + 1, expected_additional_data_len); + assert_eq!( + distribution_lamports_balance_after, + distribution_lamports_balance_before + + 690_000 + + 6_960 * expected_additional_data_len as u64 + ); + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.set_is_rewards_calculation_finalized(true); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.total_contributors = total_contributors; + expected_distribution.rewards_merkle_root = rewards_merkle_root; + expected_distribution.processed_solana_validator_debt_end_index = total_solana_validators / 8; + expected_distribution.processed_rewards_start_index = total_solana_validators / 8; + expected_distribution.processed_rewards_end_index = + (total_solana_validators / 8) + (total_contributors / 8 + 1); + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + assert_eq!(distribution, expected_distribution); + + let expected_distribution_remaining_data_len = + remaining_distribution_data_len_before + expected_additional_data_len as usize; + assert_eq!( + distribution_remaining_data, + vec![0; expected_distribution_remaining_data_len] + ); + + // Cannot configure distribution rewards after finalization. + let (tx_err, program_logs) = + simulate_configure_rewards_revert(&mut test_setup, &rewards_accountant_signer, dz_epoch) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Distribution rewards have already been finalized" + ); + + // Cannot finalize again. + let (tx_err, program_logs) = simulate_finalize_revert(&mut test_setup, dz_epoch) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Distribution rewards have already been finalized" + ); +} + +// +// Null-root guard — collected prepaid 2Z blocks finalize. +// + +#[tokio::test] +async fn test_cannot_finalize_null_root_with_collected_prepaid_2z() { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + + let journal_key = Journal::find_address().0; + let journal_ata_key = get_associated_token_address(&journal_key, &DOUBLEZERO_MINT_KEY); + let prepaid_2z_amount = 100_000_000; + + // The first initialize_distribution creates epoch 0; the tested epoch 1 is + // created by the second one. Fund the journal's 2Z ATA between the two so it + // is the epoch-1 distribution that sweeps the prepaid 2Z. + test_setup + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .create_2z_ata(&journal_key) + .await + .unwrap() + .transfer_2z(&journal_ata_key, prepaid_2z_amount) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &configured.debt_accountant_signer, + 0, + 0, + Hash::default(), + ) + .await + .unwrap() + .finalize_distribution_debt(dz_epoch, &configured.debt_accountant_signer) + .await + .unwrap() + .configure_program( + &configured.admin_signer, + [ProgramConfiguration::MinimumEpochDurationToFinalizeRewards( + 2, + )], + ) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap(); + + let (_, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + assert_eq!( + distribution.collected_prepaid_2z_payments, + prepaid_2z_amount + ); + assert_eq!(distribution.checked_total_sol_debt().unwrap(), 0); + + // Zero SOL debt but collected prepaid 2Z means the null root is rejected by + // the collected-2Z check. + let (tx_err, program_logs) = simulate_finalize_revert(&mut test_setup, dz_epoch) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Rewards root cannot be null with collected 2Z" + ); + + // Posting a real root unblocks finalize. + test_setup + .configure_distribution_rewards( + dz_epoch, + &configured.rewards_accountant_signer, + 69, + Hash::new_unique(), + ) + .await + .unwrap() + .finalize_distribution_rewards(dz_epoch) + .await + .unwrap(); + + let (_, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + assert!(distribution.is_rewards_calculation_finalized()); +} + +// +// Null-root guard — collected integration 2Z blocks finalize. +// + +#[tokio::test] +async fn test_cannot_finalize_null_root_with_collected_integration_2z() { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + + // Register the integration before the target distribution is initialized so + // its snapshot captures the one registered integration. + test_setup + .initialize_rewards_integration(&configured.admin_signer, &mock_rewards_integration::ID) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap(); + + let (integration_distribution_key, _) = + find_integration_distribution_address(&mock_rewards_integration::ID, dz_epoch); + let (integration_2z_bucket_key, _) = find_integration_bucket_address( + &mock_rewards_integration::ID, + &integration_distribution_key, + ); + + let collected_integration_2z_amount = 100_000_000; + + // Epoch 1 (the tested epoch) is created by the second initialize_distribution + // below; collect only after its distribution PDA exists. + test_setup + .mock_initialize_integration_distribution(dz_epoch) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .transfer_2z(&integration_2z_bucket_key, collected_integration_2z_amount) + .await + .unwrap() + .collect_integration_rewards( + dz_epoch, + &mock_rewards_integration::ID, + &integration_distribution_key, + &integration_2z_bucket_key, + ) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &configured.debt_accountant_signer, + 0, + 0, + Hash::default(), + ) + .await + .unwrap() + .finalize_distribution_debt(dz_epoch, &configured.debt_accountant_signer) + .await + .unwrap() + .configure_program( + &configured.admin_signer, + [ProgramConfiguration::MinimumEpochDurationToFinalizeRewards( + 2, + )], + ) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap(); + + let (_, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + assert_eq!( + distribution.collected_2z_from_integrations, + collected_integration_2z_amount + ); + assert!(distribution.are_all_integrations_collected()); + assert_eq!(distribution.checked_total_sol_debt().unwrap(), 0); + + // Nonzero collected integration 2Z rejects the null root via the + // collected-2Z check (integrations are also fully collected here). + let (tx_err, program_logs) = simulate_finalize_revert(&mut test_setup, dz_epoch) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Rewards root cannot be null with collected 2Z" + ); + + // Posting a real root unblocks finalize. + test_setup + .configure_distribution_rewards( + dz_epoch, + &configured.rewards_accountant_signer, + 69, + Hash::new_unique(), + ) + .await + .unwrap() + .finalize_distribution_rewards(dz_epoch) + .await + .unwrap(); + + let (_, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + assert!(distribution.is_rewards_calculation_finalized()); +} + +// +// Null-root guard — uncollected integration blocks finalize, zero-value collect +// then unblocks it. +// + +#[tokio::test] +async fn test_cannot_finalize_null_root_with_uncollected_integration() { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + + test_setup + .initialize_rewards_integration(&configured.admin_signer, &mock_rewards_integration::ID) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap(); + + let (integration_distribution_key, _) = + find_integration_distribution_address(&mock_rewards_integration::ID, dz_epoch); + let (integration_2z_bucket_key, _) = find_integration_bucket_address( + &mock_rewards_integration::ID, + &integration_distribution_key, + ); + + // Initialize the integration distribution but leave its bucket empty and do + // not collect, so the integration stays pending. + test_setup + .mock_initialize_integration_distribution(dz_epoch) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &configured.debt_accountant_signer, + 0, + 0, + Hash::default(), + ) + .await + .unwrap() + .finalize_distribution_debt(dz_epoch, &configured.debt_accountant_signer) + .await + .unwrap() + .configure_program( + &configured.admin_signer, + [ProgramConfiguration::MinimumEpochDurationToFinalizeRewards( + 2, + )], + ) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap(); + + let (_, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + assert_eq!(distribution.checked_total_sol_debt().unwrap(), 0); + assert_eq!(distribution.total_collected_2z_tokens(), 0); + assert!(!distribution.are_all_integrations_collected()); + + // Zero debt and zero collected 2Z, but the pending integration blocks the + // null root. + let (tx_err, program_logs) = simulate_finalize_revert(&mut test_setup, dz_epoch) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Rewards root cannot be null with uncollected integrations" + ); + + // Collecting against the empty bucket adds no 2Z but marks the integration + // collected, so the null-root finalize now succeeds. + test_setup + .collect_integration_rewards( + dz_epoch, + &mock_rewards_integration::ID, + &integration_distribution_key, + &integration_2z_bucket_key, + ) + .await + .unwrap(); + + let (_, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + assert_eq!(distribution.total_collected_2z_tokens(), 0); + assert!(distribution.are_all_integrations_collected()); + + test_setup + .finalize_distribution_rewards(dz_epoch) + .await + .unwrap(); + + let (_, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + assert!(distribution.is_rewards_calculation_finalized()); +} + +// +// Rooted path is unaffected by an uncollected integration. +// + +#[tokio::test] +async fn test_finalize_rooted_with_uncollected_integration() { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + + test_setup + .initialize_rewards_integration(&configured.admin_signer, &mock_rewards_integration::ID) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .mock_initialize_integration_distribution(dz_epoch) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &configured.debt_accountant_signer, + 0, + 0, + Hash::default(), + ) + .await + .unwrap() + .finalize_distribution_debt(dz_epoch, &configured.debt_accountant_signer) + .await + .unwrap() + .configure_distribution_rewards( + dz_epoch, + &configured.rewards_accountant_signer, + 69, + Hash::new_unique(), + ) + .await + .unwrap() + .configure_program( + &configured.admin_signer, + [ProgramConfiguration::MinimumEpochDurationToFinalizeRewards( + 2, + )], + ) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap(); + + let (_, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + assert!(!distribution.are_all_integrations_collected()); + assert_ne!(distribution.rewards_merkle_root, Hash::default()); + + // A non-null root skips the entire null-root guard block, so the pending + // integration does not block finalize. + test_setup + .finalize_distribution_rewards(dz_epoch) + .await + .unwrap(); + + let (_, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + assert!(distribution.is_rewards_calculation_finalized()); +} + +// +// Helpers. +// + +async fn simulate_finalize_revert( + test_setup: &mut common::ProgramTestWithOwner, + dz_epoch: DoubleZeroEpoch, +) -> Result<(TransactionError, Vec), BanksClientError> { + let payer_key = test_setup.payer_signer().pubkey(); + + let finalize_distribution_rewards_ix = try_build_instruction( + &ID, + FinalizeDistributionRewardsAccounts::new(&payer_key, dz_epoch), + &RevenueDistributionInstructionData::FinalizeDistributionRewards, + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[finalize_distribution_rewards_ix], &[]) + .await +} + +async fn simulate_configure_rewards_revert( + test_setup: &mut common::ProgramTestWithOwner, + rewards_accountant_signer: &Keypair, + dz_epoch: DoubleZeroEpoch, +) -> Result<(TransactionError, Vec), BanksClientError> { + let configure_distribution_rewards_ix = try_build_instruction( + &ID, + ConfigureDistributionRewardsAccounts::new(&rewards_accountant_signer.pubkey(), dz_epoch), + &RevenueDistributionInstructionData::ConfigureDistributionRewards { + total_contributors: 69, + merkle_root: Hash::new_unique(), + }, + ) + .unwrap(); + + test_setup + .unwrap_simulation_error( + &[configure_distribution_rewards_ix], + &[rewards_accountant_signer], + ) + .await +} diff --git a/solana/programs/revenue-distribution/tests/initialize_contributor_rewards_test.rs b/solana/programs/revenue-distribution/tests/initialize_contributor_rewards_test.rs new file mode 100644 index 0000000000..958bc30247 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/initialize_contributor_rewards_test.rs @@ -0,0 +1,46 @@ +mod common; + +// + +use doublezero_revenue_distribution::state::ContributorRewards; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; + +// +// Setup. +// + +struct InitializeContributorRewardsSetup { + test_setup: common::ProgramTestWithOwner, +} + +async fn setup_for_initialize_contributor_rewards() -> InitializeContributorRewardsSetup { + let mut test_setup = common::start_test().await; + + test_setup.setup_configured_program().await.unwrap(); + + InitializeContributorRewardsSetup { test_setup } +} + +// +// Initialize contributor rewards — happy path. +// + +#[tokio::test] +async fn test_initialize_contributor_rewards() { + let InitializeContributorRewardsSetup { mut test_setup } = + setup_for_initialize_contributor_rewards().await; + + let service_key = Pubkey::new_unique(); + + test_setup + .initialize_contributor_rewards(&service_key) + .await + .unwrap(); + + let (_, contributor_rewards) = test_setup.fetch_contributor_rewards(&service_key).await; + + let mut expected_contributor_rewards = ContributorRewards::default(); + expected_contributor_rewards.service_key = service_key; + assert_eq!(contributor_rewards, expected_contributor_rewards); +} diff --git a/solana/programs/revenue-distribution/tests/initialize_distribution_test.rs b/solana/programs/revenue-distribution/tests/initialize_distribution_test.rs new file mode 100644 index 0000000000..01b86a628f --- /dev/null +++ b/solana/programs/revenue-distribution/tests/initialize_distribution_test.rs @@ -0,0 +1,345 @@ +mod common; + +// + +use doublezero_revenue_distribution::DOUBLEZERO_MINT_KEY; +use doublezero_revenue_distribution::{ + instruction::{ProgramConfiguration, ProgramFlagConfiguration}, + state::{self, CommunityBurnRateParameters, Distribution, Journal, ProgramConfig}, + types::ValidatorFee, + types::{BurnRate, DoubleZeroEpoch}, +}; +use solana_program_test::tokio; +use solana_sdk::signature::{Keypair, Signer}; +use spl_associated_token_account_interface::address::get_associated_token_address; + +// +// Setup. +// + +struct InitializeDistributionSetup { + test_setup: common::ProgramTestWithOwner, + admin_signer: Keypair, + debt_accountant_signer: Keypair, + calculation_grace_period_minutes: u16, + initialization_grace_period_minutes: u16, +} + +/// Set up a configured program ready for distribution initialization. +/// Uses specific CBR params (`dz_epochs_to_increasing = 1`) to test the +/// community burn rate progression. +async fn setup_for_initialize_distribution() -> InitializeDistributionSetup { + let mut test_setup = common::start_test().await; + + let admin_signer = Keypair::new(); + let debt_accountant_signer = Keypair::new(); + + let solana_validator_base_block_rewards_pct_fee = 0; + let calculation_grace_period_minutes = 69; + let initialization_grace_period_minutes = 420; + let distribute_rewards_relay_lamports = 10_000; + + // Community burn rate — uses dz_epochs_to_increasing = 1 + // to test rate progression across multiple distributions. + let initial_cbr = 100_000_000; + let cbr_limit = 500_000_000; + let dz_epochs_to_increasing_cbr = 1; + let dz_epochs_to_cbr_limit = 20; + + test_setup + .initialize_program() + .await + .unwrap() + .initialize_journal() + .await + .unwrap() + .set_admin(&admin_signer.pubkey()) + .await + .unwrap() + .configure_program( + &admin_signer, + [ + ProgramConfiguration::DebtAccountant(debt_accountant_signer.pubkey()), + ProgramConfiguration::SolanaValidatorFeeParameters { + base_block_rewards_pct: solana_validator_base_block_rewards_pct_fee, + priority_block_rewards_pct: 0, + inflation_rewards_pct: 0, + jito_tips_pct: 0, + fixed_sol_amount: 0, + _unused: Default::default(), + }, + ProgramConfiguration::CommunityBurnRateParameters { + limit: cbr_limit, + dz_epochs_to_increasing: dz_epochs_to_increasing_cbr, + dz_epochs_to_limit: dz_epochs_to_cbr_limit, + initial_rate: Some(initial_cbr), + }, + ProgramConfiguration::DistributeRewardsRelayLamports( + distribute_rewards_relay_lamports, + ), + ProgramConfiguration::CalculationGracePeriodMinutes( + calculation_grace_period_minutes, + ), + ProgramConfiguration::DistributionInitializationGracePeriodMinutes( + initialization_grace_period_minutes, + ), + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + ], + ) + .await + .unwrap(); + + InitializeDistributionSetup { + test_setup, + admin_signer, + debt_accountant_signer, + calculation_grace_period_minutes, + initialization_grace_period_minutes, + } +} + +// +// Initialize distribution — happy path. +// + +#[tokio::test] +async fn test_initialize_distribution() { + let InitializeDistributionSetup { + mut test_setup, + admin_signer: _, + debt_accountant_signer, + calculation_grace_period_minutes, + initialization_grace_period_minutes, + } = setup_for_initialize_distribution().await; + + let solana_validator_base_block_rewards_pct_fee = 0; + let initial_cbr = 100_000_000; + let cbr_limit = 500_000_000; + let dz_epochs_to_increasing_cbr = 1; + let dz_epochs_to_cbr_limit = 20; + let distribute_rewards_relay_lamports = 10_000; + + test_setup + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap(); + + let mut cbr_params = CommunityBurnRateParameters::new( + BurnRate::new(initial_cbr).unwrap(), + BurnRate::new(cbr_limit).unwrap(), + dz_epochs_to_increasing_cbr, + dz_epochs_to_cbr_limit, + ) + .unwrap(); + + // Sync community burn rate. + let expected_cbr = cbr_params.checked_compute().unwrap(); + assert_eq!(expected_cbr, BurnRate::new(100_000_000).unwrap()); + assert_eq!( + cbr_params.next_burn_rate().unwrap(), + BurnRate::new(120_000_000).unwrap() + ); + + let dz_epoch = DoubleZeroEpoch::new(0); + let (distribution_key, distribution, _, _, distribution_custody) = + test_setup.fetch_distribution(dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = expected_cbr; + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = test_setup + .get_clock() + .await + .unix_timestamp + .saturating_add(i64::from(calculation_grace_period_minutes) * 60) + as u32; + assert_eq!(distribution, expected_distribution); + assert_eq!(distribution_custody.amount, 0); + + let (program_config_key, program_config, _) = test_setup.fetch_program_config().await; + + let mut expected_program_config = ProgramConfig::default(); + expected_program_config.bump_seed = ProgramConfig::find_address().1; + expected_program_config.reserve_2z_bump_seed = + state::find_2z_token_pda_address(&program_config_key).1; + expected_program_config.admin_key = program_config.admin_key; + expected_program_config.next_completed_dz_epoch = DoubleZeroEpoch::new(1); + expected_program_config.debt_accountant_key = debt_accountant_signer.pubkey(); + expected_program_config.last_initialized_distribution_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + + let expected_distribution_params = &mut expected_program_config.distribution_parameters; + expected_distribution_params.calculation_grace_period_minutes = + calculation_grace_period_minutes; + expected_distribution_params.initialization_grace_period_minutes = + initialization_grace_period_minutes; + expected_distribution_params + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution_params.community_burn_rate_parameters = cbr_params; + + let expected_relay_params = &mut expected_program_config.relay_parameters; + expected_relay_params.distribute_rewards_lamports = distribute_rewards_relay_lamports; + assert_eq!(program_config, expected_program_config); + + // Fund the journal's ATA so `initialize_distribution` will sweep it. + let direct_2z_payment_amount_1: u64 = 69_000 * u64::pow(10, 8); + let direct_2z_payment_amount_2: u64 = 420 * u64::pow(10, 8); + let (journal_key, _) = Journal::find_address(); + let journal_ata_key = get_associated_token_address(&journal_key, &DOUBLEZERO_MINT_KEY); + + test_setup + .create_2z_ata(&journal_key) + .await + .unwrap() + .transfer_2z(&journal_ata_key, direct_2z_payment_amount_1) + .await + .unwrap() + .transfer_2z(&journal_ata_key, direct_2z_payment_amount_2) + .await + .unwrap(); + + // Create another distribution. + + test_setup + .warp_timestamp_by(u32::from(initialization_grace_period_minutes) * 60) + .await + .unwrap() + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap(); + + // Sync community burn rate. + let expected_cbr = cbr_params.checked_compute().unwrap(); + assert_eq!(expected_cbr, BurnRate::new(120_000_000).unwrap()); + assert_eq!( + cbr_params.next_burn_rate().unwrap(), + BurnRate::new(140_000_000).unwrap() + ); + + let dz_epoch = DoubleZeroEpoch::new(1); + let (distribution_key, distribution, _, _, distribution_custody) = + test_setup.fetch_distribution(dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = expected_cbr; + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.collected_prepaid_2z_payments = + direct_2z_payment_amount_1 + direct_2z_payment_amount_2; + expected_distribution.calculation_allowed_timestamp = test_setup + .get_clock() + .await + .unix_timestamp + .saturating_add(i64::from(calculation_grace_period_minutes) * 60) + as u32; + assert_eq!(distribution, expected_distribution); + assert_eq!( + distribution_custody.amount, + direct_2z_payment_amount_1 + direct_2z_payment_amount_2 + ); + + // Verify the journal's ATA was fully drained. + let journal_ata_after = test_setup + .fetch_token_account(&journal_ata_key) + .await + .unwrap(); + assert_eq!(journal_ata_after.amount, 0); + + let (program_config_key, program_config, _) = test_setup.fetch_program_config().await; + + let mut expected_program_config = ProgramConfig::default(); + expected_program_config.bump_seed = ProgramConfig::find_address().1; + expected_program_config.reserve_2z_bump_seed = + state::find_2z_token_pda_address(&program_config_key).1; + expected_program_config.admin_key = program_config.admin_key; + expected_program_config.next_completed_dz_epoch = DoubleZeroEpoch::new(2); + expected_program_config.debt_accountant_key = debt_accountant_signer.pubkey(); + expected_program_config.last_initialized_distribution_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + + let expected_distribution_params = &mut expected_program_config.distribution_parameters; + expected_distribution_params.calculation_grace_period_minutes = + calculation_grace_period_minutes; + expected_distribution_params.initialization_grace_period_minutes = + initialization_grace_period_minutes; + expected_distribution_params + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution_params.community_burn_rate_parameters = cbr_params; + + let expected_relay_params = &mut expected_program_config.relay_parameters; + expected_relay_params.distribute_rewards_lamports = distribute_rewards_relay_lamports; + assert_eq!(program_config, expected_program_config); +} + +// +// Initialize distribution — snapshots Journal.integrations_count into the +// new distribution's state. +// + +#[tokio::test] +async fn test_initialize_distribution_snapshots_integrations_count() { + let InitializeDistributionSetup { + mut test_setup, + admin_signer, + debt_accountant_signer, + initialization_grace_period_minutes, + .. + } = setup_for_initialize_distribution().await; + + // Distribution created before any integration is registered: snapshot 0. + test_setup + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap(); + + let (_, distribution_zero, _, _, _) = + test_setup.fetch_distribution(DoubleZeroEpoch::new(0)).await; + assert_eq!(distribution_zero.integrations_count_snapshot, 0); + assert_eq!(distribution_zero.integrations_collected_count, 0); + + // Register an integration. Journal counter becomes 1. + test_setup + .initialize_rewards_integration(&admin_signer, &mock_swap_sol_2z::ID) + .await + .unwrap(); + let (_, journal, _) = test_setup.fetch_journal().await; + assert_eq!(journal.integrations_count, 1); + + // Initialize a second distribution. Its snapshot should be 1. + test_setup + .warp_timestamp_by(u32::from(initialization_grace_period_minutes) * 60) + .await + .unwrap() + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap(); + + let (_, distribution_one, _, _, _) = + test_setup.fetch_distribution(DoubleZeroEpoch::new(1)).await; + assert_eq!(distribution_one.integrations_count_snapshot, 1); + assert_eq!(distribution_one.integrations_collected_count, 0); + + // The earlier distribution's snapshot is not retroactively affected. + let (_, distribution_zero_again, _, _, _) = + test_setup.fetch_distribution(DoubleZeroEpoch::new(0)).await; + assert_eq!(distribution_zero_again.integrations_count_snapshot, 0); +} diff --git a/solana/programs/revenue-distribution/tests/initialize_journal_test.rs b/solana/programs/revenue-distribution/tests/initialize_journal_test.rs new file mode 100644 index 0000000000..b564be2c30 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/initialize_journal_test.rs @@ -0,0 +1,77 @@ +mod common; + +// + +use doublezero_program_tools::zero_copy::checked_from_bytes_with_discriminator; +use doublezero_revenue_distribution::{ + state::{self, Journal}, + DOUBLEZERO_MINT_KEY, +}; +use solana_program_pack::Pack; +use solana_program_test::tokio; +use spl_token_interface::state::{Account as TokenAccount, AccountState as SplTokenAccountState}; + +// +// Setup. +// + +struct InitializeJournalSetup { + test_setup: common::ProgramTestWithOwner, +} + +async fn setup_for_initialize_journal() -> InitializeJournalSetup { + let test_setup = common::start_test().await; + InitializeJournalSetup { test_setup } +} + +// +// Initialize journal — happy path. +// + +#[tokio::test] +async fn test_initialize_journal() { + let InitializeJournalSetup { mut test_setup } = setup_for_initialize_journal().await; + + test_setup.initialize_journal().await.unwrap(); + + let journal_key = Journal::find_address().0; + let journal_account_data = test_setup + .context + .banks_client + .get_account(journal_key) + .await + .unwrap() + .unwrap() + .data; + + let (journal, _) = + checked_from_bytes_with_discriminator::(&journal_account_data).unwrap(); + + let (journal_key, journal_bump) = Journal::find_address(); + + let mut expected_journal = Journal::default(); + expected_journal.bump_seed = journal_bump; + expected_journal.token_2z_pda_bump_seed = state::find_2z_token_pda_address(&journal_key).1; + assert_eq!(journal, &expected_journal); + + let custodied_2z_token_account_data = test_setup + .context + .banks_client + .get_account(state::find_2z_token_pda_address(&journal_key).0) + .await + .unwrap() + .unwrap() + .data; + let custodied_2z_token_account = + TokenAccount::unpack(&custodied_2z_token_account_data).unwrap(); + let expected_custodied_2z_token_account = TokenAccount { + mint: DOUBLEZERO_MINT_KEY, + owner: journal_key, + state: SplTokenAccountState::Initialized, + ..Default::default() + }; + assert_eq!( + custodied_2z_token_account, + expected_custodied_2z_token_account + ); +} diff --git a/solana/programs/revenue-distribution/tests/initialize_program_test.rs b/solana/programs/revenue-distribution/tests/initialize_program_test.rs new file mode 100644 index 0000000000..efb80c5bb2 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/initialize_program_test.rs @@ -0,0 +1,57 @@ +mod common; + +// + +use doublezero_program_tools::zero_copy::checked_from_bytes_with_discriminator; +use doublezero_revenue_distribution::state::{self, ProgramConfig}; +use solana_program_test::tokio; + +// +// Setup. +// + +struct InitializeProgramSetup { + test_setup: common::ProgramTestWithOwner, +} + +async fn setup_for_initialize_program() -> InitializeProgramSetup { + let test_setup = common::start_test().await; + InitializeProgramSetup { test_setup } +} + +// +// Initialize program — happy path. +// + +#[tokio::test] +async fn test_initialize_program() { + let InitializeProgramSetup { mut test_setup } = setup_for_initialize_program().await; + + test_setup.initialize_program().await.unwrap(); + + let (program_config_key, program_config_bump) = ProgramConfig::find_address(); + + let program_config_account_data = test_setup + .context + .banks_client + .get_account(program_config_key) + .await + .unwrap() + .unwrap() + .data; + + let (program_config, remaining_data) = + checked_from_bytes_with_discriminator::(&program_config_account_data) + .unwrap(); + assert_eq!( + remaining_data.len(), + 10_240 - doublezero_program_tools::zero_copy::data_end::() + ); + + let mut expected_program_config = ProgramConfig::default(); + expected_program_config.bump_seed = program_config_bump; + expected_program_config.reserve_2z_bump_seed = + state::find_2z_token_pda_address(&program_config_key).1; + expected_program_config.set_is_paused(true); + assert_eq!(program_config, &expected_program_config); +} diff --git a/solana/programs/revenue-distribution/tests/initialize_rewards_integration_test.rs b/solana/programs/revenue-distribution/tests/initialize_rewards_integration_test.rs new file mode 100644 index 0000000000..d0b3d557da --- /dev/null +++ b/solana/programs/revenue-distribution/tests/initialize_rewards_integration_test.rs @@ -0,0 +1,220 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::InitializeRewardsIntegrationAccounts, RevenueDistributionInstructionData, + }, + state::RewardsIntegration, + DOUBLEZERO_MINT_KEY, ID, +}; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, signature::Keypair, signer::Signer, + transaction::TransactionError, +}; + +// +// Setup. +// + +struct InitializeRewardsIntegrationSetup { + test_setup: common::ProgramTestWithOwner, + admin_signer: Keypair, + integration_program_id: Pubkey, +} + +async fn setup_for_initialize_rewards_integration() -> InitializeRewardsIntegrationSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + InitializeRewardsIntegrationSetup { + test_setup, + admin_signer: configured.admin_signer, + // Any program loaded by `common::start_test` will do as a stand-in for + // a real integration. `mock_swap_sol_2z` is already loaded by the test + // harness. + integration_program_id: mock_swap_sol_2z::ID, + } +} + +fn build_initialize_rewards_integration_ix( + accounts: InitializeRewardsIntegrationAccounts, +) -> solana_sdk::instruction::Instruction { + try_build_instruction( + &ID, + accounts, + &RevenueDistributionInstructionData::InitializeRewardsIntegration, + ) + .unwrap() +} + +// +// Initialize rewards integration — happy path. +// + +#[tokio::test] +async fn test_initialize_rewards_integration() { + let InitializeRewardsIntegrationSetup { + mut test_setup, + admin_signer, + integration_program_id, + } = setup_for_initialize_rewards_integration().await; + + let (_, journal_before, _) = test_setup.fetch_journal().await; + let count_before = journal_before.integrations_count; + + test_setup + .initialize_rewards_integration(&admin_signer, &integration_program_id) + .await + .unwrap(); + + let (_, rewards_integration) = test_setup + .fetch_rewards_integration(&integration_program_id) + .await; + + let mut expected = RewardsIntegration::default(); + expected.bump_seed = RewardsIntegration::find_address(&integration_program_id).1; + expected.program_id = integration_program_id; + // Registration index is the pre-uptick journal count. + expected.registration_index = count_before; + assert_eq!(rewards_integration, expected); + + // Journal integrations_count upticked by exactly one. + let (_, journal_after, _) = test_setup.fetch_journal().await; + assert_eq!(journal_after.integrations_count, count_before + 1); +} + +// +// Initialize rewards integration — unauthorized signer cannot register. +// + +#[tokio::test] +async fn test_initialize_rewards_integration_unauthorized() { + let InitializeRewardsIntegrationSetup { + mut test_setup, + integration_program_id, + .. + } = setup_for_initialize_rewards_integration().await; + + let impostor_signer = Keypair::new(); + let payer_key = test_setup.payer_signer().pubkey(); + + let ix = build_initialize_rewards_integration_ix(InitializeRewardsIntegrationAccounts::new( + &impostor_signer.pubkey(), + &payer_key, + &integration_program_id, + )); + + let (tx_err, _) = test_setup + .unwrap_simulation_error(&[ix], &[&impostor_signer]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); +} + +// +// Initialize rewards integration — non-executable integration program is rejected. +// + +#[tokio::test] +async fn test_initialize_rewards_integration_not_executable() { + let InitializeRewardsIntegrationSetup { + mut test_setup, + admin_signer, + .. + } = setup_for_initialize_rewards_integration().await; + + // The 2Z mint exists in the test bank but is not executable. + let non_executable_program_id = DOUBLEZERO_MINT_KEY; + let payer_key = test_setup.payer_signer().pubkey(); + + let ix = build_initialize_rewards_integration_ix(InitializeRewardsIntegrationAccounts::new( + &admin_signer.pubkey(), + &payer_key, + &non_executable_program_id, + )); + + let (tx_err, _) = test_setup + .unwrap_simulation_error(&[ix], &[&admin_signer]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); +} + +// +// Initialize rewards integration — wrong PDA seeds are rejected. +// + +#[tokio::test] +async fn test_initialize_rewards_integration_wrong_seeds() { + let InitializeRewardsIntegrationSetup { + mut test_setup, + admin_signer, + integration_program_id, + } = setup_for_initialize_rewards_integration().await; + + // Overwrite the computed PDA with a random key. + let payer_key = test_setup.payer_signer().pubkey(); + let mut accounts = InitializeRewardsIntegrationAccounts::new( + &admin_signer.pubkey(), + &payer_key, + &integration_program_id, + ); + accounts.new_rewards_integration_key = Pubkey::new_unique(); + + let ix = build_initialize_rewards_integration_ix(accounts); + + let (tx_err, _) = test_setup + .unwrap_simulation_error(&[ix], &[&admin_signer]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidSeeds) + ); +} + +// +// Initialize rewards integration — cannot re-register the same program. +// + +#[tokio::test] +async fn test_initialize_rewards_integration_already_registered() { + let InitializeRewardsIntegrationSetup { + mut test_setup, + admin_signer, + integration_program_id, + } = setup_for_initialize_rewards_integration().await; + + test_setup + .initialize_rewards_integration(&admin_signer, &integration_program_id) + .await + .unwrap(); + + let payer_key = test_setup.payer_signer().pubkey(); + let ix = build_initialize_rewards_integration_ix(InitializeRewardsIntegrationAccounts::new( + &admin_signer.pubkey(), + &payer_key, + &integration_program_id, + )); + + let (tx_err, _) = test_setup + .unwrap_simulation_error(&[ix], &[&admin_signer]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::Custom(0)) + ); +} diff --git a/solana/programs/revenue-distribution/tests/initialize_solana_validator_deposit_test.rs b/solana/programs/revenue-distribution/tests/initialize_solana_validator_deposit_test.rs new file mode 100644 index 0000000000..010b5484f2 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/initialize_solana_validator_deposit_test.rs @@ -0,0 +1,43 @@ +mod common; + +// + +use doublezero_revenue_distribution::state::SolanaValidatorDeposit; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; + +// +// Setup. +// + +struct InitializeSolanaValidatorDepositSetup { + test_setup: common::ProgramTestWithOwner, +} + +async fn setup_for_initialize_solana_validator_deposit() -> InitializeSolanaValidatorDepositSetup { + let test_setup = common::start_test().await; + InitializeSolanaValidatorDepositSetup { test_setup } +} + +// +// Initialize Solana validator deposit — happy path. +// + +#[tokio::test] +async fn test_initialize_solana_validator_deposit() { + let InitializeSolanaValidatorDepositSetup { mut test_setup } = + setup_for_initialize_solana_validator_deposit().await; + + let node_id = Pubkey::new_unique(); + + test_setup + .initialize_solana_validator_deposit(&node_id) + .await + .unwrap(); + + let (_, solana_validator_deposit) = test_setup.fetch_solana_validator_deposit(&node_id).await; + + let mut expected_solana_validator_deposit = SolanaValidatorDeposit::default(); + expected_solana_validator_deposit.node_id = node_id; + assert_eq!(solana_validator_deposit, expected_solana_validator_deposit); +} diff --git a/solana/programs/revenue-distribution/tests/initialize_swap_destination_test.rs b/solana/programs/revenue-distribution/tests/initialize_swap_destination_test.rs new file mode 100644 index 0000000000..a82829aa97 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/initialize_swap_destination_test.rs @@ -0,0 +1,75 @@ +mod common; + +// + +use doublezero_revenue_distribution::{ + state::{find_2z_token_pda_address, find_swap_authority_address}, + DOUBLEZERO_MINT_KEY, +}; +use solana_program_pack::Pack; +use solana_program_test::tokio; +use spl_token_interface::state::{Account as TokenAccount, AccountState as SplTokenAccountState}; + +// +// Setup. +// + +struct InitializeSwapDestinationSetup { + test_setup: common::ProgramTestWithOwner, +} + +async fn setup_for_initialize_swap_destination() -> InitializeSwapDestinationSetup { + let mut test_setup = common::start_test().await; + + test_setup.initialize_program().await.unwrap(); + + InitializeSwapDestinationSetup { test_setup } +} + +// +// Initialize swap destination — happy path. +// + +#[tokio::test] +async fn test_initialize_swap_destination() { + let InitializeSwapDestinationSetup { mut test_setup } = + setup_for_initialize_swap_destination().await; + + test_setup + .initialize_swap_destination(&DOUBLEZERO_MINT_KEY) + .await + .unwrap(); + + let (swap_authority_key, swap_authority_bump) = find_swap_authority_address(); + let (swap_destination_key, swap_dst_2z_token_pda_bump) = + find_2z_token_pda_address(&swap_authority_key); + let swap_destination_account_data = test_setup + .context + .banks_client + .get_account(swap_destination_key) + .await + .unwrap() + .unwrap() + .data; + + let swap_destination_token_account = + TokenAccount::unpack(&swap_destination_account_data).unwrap(); + let expected_swap_destination_token_account = TokenAccount { + mint: DOUBLEZERO_MINT_KEY, + owner: swap_authority_key, + state: SplTokenAccountState::Initialized, + ..Default::default() + }; + assert_eq!( + swap_destination_token_account, + expected_swap_destination_token_account + ); + + // Just check the new bump seeds. + let (_, program_config, _) = test_setup.fetch_program_config().await; + assert_eq!(program_config.swap_authority_bump_seed, swap_authority_bump); + assert_eq!( + program_config.swap_destination_2z_bump_seed, + swap_dst_2z_token_pda_bump + ); +} diff --git a/solana/programs/revenue-distribution/tests/migrate_program_accounts_test.rs b/solana/programs/revenue-distribution/tests/migrate_program_accounts_test.rs new file mode 100644 index 0000000000..5573f6e2ac --- /dev/null +++ b/solana/programs/revenue-distribution/tests/migrate_program_accounts_test.rs @@ -0,0 +1,230 @@ +mod common; + +// + +use doublezero_program_tools::{ + instruction::try_build_instruction, zero_copy, PrecomputedDiscriminator, DISCRIMINATOR_LEN, +}; +use doublezero_revenue_distribution::{ + instruction::{account::MigrateProgramAccountsAccounts, RevenueDistributionInstructionData}, + state::{self, Distribution}, + types::DoubleZeroEpoch, + DOUBLEZERO_MINT_KEY, ID, +}; +use solana_program_pack::Pack; +use solana_program_test::tokio; +use solana_sdk::{ + account::Account, + instruction::InstructionError, + rent::Rent, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; +use spl_token_interface::state::{Account as TokenAccount, AccountState as SplTokenAccountState}; + +// +// Setup. +// + +struct MigrateProgramAccountsSetup { + test_setup: common::ProgramTestWithOwner, + journal_integrations_count: u16, +} + +async fn setup_for_migrate_program_accounts() -> MigrateProgramAccountsSetup { + let mut test_setup = common::start_test().await; + let configured = test_setup.setup_configured_program().await.unwrap(); + + // Register one integration so the journal's integrations_count is non-zero + // and the migration's effect is observable. + let integration_program_id = mock_swap_sol_2z::ID; + test_setup + .initialize_rewards_integration(&configured.admin_signer, &integration_program_id) + .await + .unwrap(); + + let (_, journal, _) = test_setup.fetch_journal().await; + + MigrateProgramAccountsSetup { + test_setup, + journal_integrations_count: journal.integrations_count, + } +} + +async fn migrate_program_accounts( + test_setup: &mut common::ProgramTestWithOwner, + dz_epochs: &[DoubleZeroEpoch], +) { + let owner_signer = &test_setup.owner_signer; + let payer_signer = &test_setup.context.payer; + + let migrate_ix = try_build_instruction( + &ID, + MigrateProgramAccountsAccounts::new(&ID, &owner_signer.pubkey(), dz_epochs), + &RevenueDistributionInstructionData::MigrateProgramAccounts, + ) + .unwrap(); + + test_setup.context.last_blockhash = common::process_instructions_for_test( + &mut test_setup.context.banks_client, + &test_setup.context.last_blockhash, + &[migrate_ix], + &[payer_signer, owner_signer], + ) + .await + .unwrap(); +} + +/// Inject a `Distribution` account at the canonical PDA for `dz_epoch`, +/// simulating one initialized before `integrations_count_snapshot` was wired +/// up correctly (snapshot stays at zero). The matching 2Z token PDA is also +/// seeded so `fetch_distribution` can read both sides. +fn inject_distribution(test_setup: &mut common::ProgramTestWithOwner, dz_epoch: DoubleZeroEpoch) { + let (key, bump_seed) = Distribution::find_address(dz_epoch); + let (token_pda_key, token_2z_pda_bump_seed) = state::find_2z_token_pda_address(&key); + + let data_len = zero_copy::data_end::(); + let mut data = vec![0; data_len]; + data[..DISCRIMINATOR_LEN].copy_from_slice(Distribution::discriminator_slice()); + + let distribution = bytemuck::from_bytes_mut::( + &mut data[zero_copy::data_range::()], + ); + distribution.dz_epoch = dz_epoch; + distribution.bump_seed = bump_seed; + distribution.token_2z_pda_bump_seed = token_2z_pda_bump_seed; + + let rent = Rent::default(); + let distribution_account = Account { + lamports: rent.minimum_balance(data_len), + data, + owner: ID, + executable: false, + rent_epoch: 0, + }; + + let token_pda = TokenAccount { + mint: DOUBLEZERO_MINT_KEY, + owner: key, + state: SplTokenAccountState::Initialized, + ..Default::default() + }; + let mut token_pda_data = vec![0; TokenAccount::LEN]; + token_pda.pack_into_slice(&mut token_pda_data); + let token_pda_account = Account { + lamports: rent.minimum_balance(TokenAccount::LEN), + data: token_pda_data, + owner: spl_token_interface::ID, + executable: false, + rent_epoch: 0, + }; + + test_setup + .context + .set_account(&key, &distribution_account.into()); + test_setup + .context + .set_account(&token_pda_key, &token_pda_account.into()); +} + +// +// Migrate program accounts — happy path. +// + +#[tokio::test] +async fn test_migrate_program_accounts() { + let MigrateProgramAccountsSetup { + mut test_setup, + journal_integrations_count, + } = setup_for_migrate_program_accounts().await; + + let dz_epochs = [DoubleZeroEpoch::new(140), DoubleZeroEpoch::new(141)]; + for dz_epoch in dz_epochs { + inject_distribution(&mut test_setup, dz_epoch); + } + + migrate_program_accounts(&mut test_setup, &dz_epochs).await; + + for dz_epoch in dz_epochs { + let (distribution_key, distribution, _, _, _) = + test_setup.fetch_distribution(dz_epoch).await; + + let mut expected = Distribution::default(); + expected.dz_epoch = dz_epoch; + expected.bump_seed = Distribution::find_address(dz_epoch).1; + expected.token_2z_pda_bump_seed = state::find_2z_token_pda_address(&distribution_key).1; + expected.integrations_count_snapshot = journal_integrations_count; + assert_eq!(distribution, expected); + } +} + +// +// Migrate program accounts — reverts when any distribution is below the +// MIN_DZ_EPOCH floor. +// + +#[tokio::test] +async fn test_cannot_migrate_program_accounts_below_min_dz_epoch() { + let MigrateProgramAccountsSetup { mut test_setup, .. } = + setup_for_migrate_program_accounts().await; + + let dz_epochs = [DoubleZeroEpoch::new(140), DoubleZeroEpoch::new(139)]; + for dz_epoch in dz_epochs { + inject_distribution(&mut test_setup, dz_epoch); + } + + let owner_signer = test_setup.owner_signer.insecure_clone(); + let migrate_ix = try_build_instruction( + &ID, + MigrateProgramAccountsAccounts::new(&ID, &owner_signer.pubkey(), &dz_epochs), + &RevenueDistributionInstructionData::MigrateProgramAccounts, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[migrate_ix], &[&owner_signer]) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(2).unwrap(), + "Program log: DZ epoch 139 is below migration floor 140" + ); +} + +// +// Migrate program accounts — reverts when the signer is not the upgrade +// authority. +// + +#[tokio::test] +async fn test_cannot_migrate_program_accounts_with_wrong_signer() { + let MigrateProgramAccountsSetup { mut test_setup, .. } = + setup_for_migrate_program_accounts().await; + + let impostor_signer = Keypair::new(); + let migrate_ix = try_build_instruction( + &ID, + MigrateProgramAccountsAccounts::new(&ID, &impostor_signer.pubkey(), &[]), + &RevenueDistributionInstructionData::MigrateProgramAccounts, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[migrate_ix], &[&impostor_signer]) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(2).unwrap(), + "Program log: Owner (account 1) must match upgrade authority from program data (account 0)" + ); +} diff --git a/solana/programs/revenue-distribution/tests/pay_solana_validator_debt_test.rs b/solana/programs/revenue-distribution/tests/pay_solana_validator_debt_test.rs new file mode 100644 index 0000000000..6e414c8f85 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/pay_solana_validator_debt_test.rs @@ -0,0 +1,323 @@ +mod common; + +// + +use doublezero_program_tools::{instruction::try_build_instruction, zero_copy}; +use doublezero_revenue_distribution::{ + instruction::{ + account::PaySolanaValidatorDebtAccounts, DistributionMerkleRootKind, + RevenueDistributionInstructionData, + }, + state::{self, Distribution, SolanaValidatorDeposit}, + types::{BurnRate, DoubleZeroEpoch, SolanaValidatorDebt, ValidatorFee}, + ID, +}; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; +use solana_sdk::{instruction::InstructionError, transaction::TransactionError}; +use svm_hash::merkle::{merkle_root_from_indexed_pod_leaves, MerkleProof}; + +// +// Setup. +// + +struct PaySolanaValidatorDebtSetup { + test_setup: common::ProgramTestWithOwner, + dz_epoch: DoubleZeroEpoch, + debt_data: Vec, + total_solana_validators: u32, + total_solana_validator_debt: u64, + solana_validator_debt_merkle_root: svm_hash::sha2::Hash, +} + +/// Set up a configured program with 16 validators' debt configured and +/// finalized on epoch 1, ready for debt payment. +async fn setup_for_pay_solana_validator_debt() -> PaySolanaValidatorDebtSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + + let debt_data = (0..16) + .map(|i| SolanaValidatorDebt { + node_id: Pubkey::new_unique(), + amount: 10_000_000_000 * (i + 1), + }) + .collect::>(); + + let total_solana_validators = debt_data.len() as u32; + let total_solana_validator_debt = debt_data.iter().map(|debt| debt.amount).sum(); + let solana_validator_debt_merkle_root = + merkle_root_from_indexed_pod_leaves(&debt_data, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + + test_setup + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &configured.debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap() + .finalize_distribution_debt(dz_epoch, &configured.debt_accountant_signer) + .await + .unwrap(); + + PaySolanaValidatorDebtSetup { + test_setup, + dz_epoch, + debt_data, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + } +} + +// +// Pay Solana validator debt — happy path with sequential error checks. +// + +#[tokio::test] +async fn test_pay_solana_validator_debt() { + let PaySolanaValidatorDebtSetup { + mut test_setup, + dz_epoch, + debt_data, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + } = setup_for_pay_solana_validator_debt().await; + + let initial_cbr = 100_000_000; + let solana_validator_base_block_rewards_pct_fee = 500; + let distribute_rewards_relay_lamports = 10_000; + + // Show that verification passes. + let kinds_and_proofs = debt_data + .iter() + .enumerate() + .map(|(i, debt)| { + let kind = DistributionMerkleRootKind::SolanaValidatorDebt(*debt); + let proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + i.try_into().unwrap(), + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + (kind, proof) + }) + .collect::>(); + + // Clone proofs to pay after verification. + let proofs = kinds_and_proofs + .iter() + .map(|(_, proof)| proof.clone()) + .collect::>(); + + let deposit_rent_exemption = + (128 + zero_copy::data_end::() as u64) * 6_960; + + // Initialize Solana validator deposit accounts and transfer an amount one + // less than the debt amount. + for SolanaValidatorDebt { node_id, amount } in debt_data.iter() { + let (deposit_key, _) = SolanaValidatorDeposit::find_address(node_id); + + test_setup + .transfer_lamports(&deposit_key, amount - 1) + .await + .unwrap() + .initialize_solana_validator_deposit(node_id) + .await + .unwrap(); + } + + for (debt, proof) in debt_data.iter().zip(proofs.clone()) { + // Cannot pay any amount except the exact debt amount. + + let invalid_merkle_root = proof.root_from_pod_leaf( + &SolanaValidatorDebt { + node_id: debt.node_id, + amount: debt.amount - 1, + }, + Some(SolanaValidatorDebt::LEAF_PREFIX), + ); + + let pay_solana_validator_debt_ix = try_build_instruction( + &ID, + PaySolanaValidatorDebtAccounts::new(dz_epoch, &debt.node_id), + &RevenueDistributionInstructionData::PaySolanaValidatorDebt { + amount: debt.amount - 1, + proof: proof.clone(), + }, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[pay_solana_validator_debt_ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidInstructionData) + ); + assert_eq!( + program_logs.get(4).unwrap(), + &format!("Program log: Invalid computed merkle root: {invalid_merkle_root}") + ); + + // Cannot pay debt with insufficient funds. + + let pay_solana_validator_debt_ix = try_build_instruction( + &ID, + PaySolanaValidatorDebtAccounts::new(dz_epoch, &debt.node_id), + &RevenueDistributionInstructionData::PaySolanaValidatorDebt { + amount: debt.amount, + proof, + }, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[pay_solana_validator_debt_ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(4).unwrap(), + "Program log: Insufficient funds in Solana validator deposit to pay debt" + ); + } + + // Set up Solana validator deposit accounts with lamports to satisfy debt. + let mut balances_before = vec![0; debt_data.len()]; + + // Send last lamport to each deposit account to satisfy debt. + for (SolanaValidatorDebt { node_id, amount }, balance_before) in + debt_data.iter().zip(balances_before.iter_mut()) + { + let (deposit_key, _) = SolanaValidatorDeposit::find_address(node_id); + + test_setup.transfer_lamports(&deposit_key, 1).await.unwrap(); + + let balance = test_setup + .context + .banks_client + .get_balance(deposit_key) + .await + .unwrap(); + + // Balance must include rent. + assert_eq!(balance, amount + deposit_rent_exemption); + + // Store balance before paying debt. + *balance_before = balance; + } + + test_setup + .verify_distribution_merkle_root(dz_epoch, kinds_and_proofs) + .await + .unwrap(); + + let (_, journal, _) = test_setup.fetch_journal().await; + assert_eq!(journal.total_sol_balance, 0); + + // Pay debt. + for ((debt, balance_before), proof) in debt_data.iter().zip(balances_before).zip(proofs.clone()) + { + test_setup + .pay_solana_validator_debt(dz_epoch, debt, proof) + .await + .unwrap(); + + let balance_after = test_setup + .context + .banks_client + .get_balance(SolanaValidatorDeposit::find_address(&debt.node_id).0) + .await + .unwrap(); + + assert_eq!(balance_before - balance_after, debt.amount); + } + + let (distribution_key, distribution, remaining_distribution_data, _, _) = + test_setup.fetch_distribution(dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.solana_validator_payments_count = total_solana_validators; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.collected_solana_validator_payments = total_solana_validator_debt; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.processed_solana_validator_debt_end_index = total_solana_validators / 8; + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + assert_eq!(distribution, expected_distribution); + + let processed_debt_bitmap = + &remaining_distribution_data[distribution.processed_solana_validator_debt_bitmap_range()]; + assert_eq!(processed_debt_bitmap, [0b11111111, 0b11111111]); + + let (_, journal, _) = test_setup.fetch_journal().await; + assert_eq!(journal.total_sol_balance, total_solana_validator_debt); + + // Cannot pay debt again. + for (debt, proof) in debt_data.iter().zip(proofs) { + let leaf_index = proof.leaf_index.unwrap(); + + let pay_solana_validator_debt_ix = try_build_instruction( + &ID, + PaySolanaValidatorDebtAccounts::new(dz_epoch, &debt.node_id), + &RevenueDistributionInstructionData::PaySolanaValidatorDebt { + amount: debt.amount, + proof, + }, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[pay_solana_validator_debt_ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(4).unwrap(), + &format!("Program log: Merkle leaf index {leaf_index} has already been processed") + ); + assert_eq!( + program_logs.get(5).unwrap(), + "Program log: Solana validator debt already processed" + ) + } +} diff --git a/solana/programs/revenue-distribution/tests/set_admin_test.rs b/solana/programs/revenue-distribution/tests/set_admin_test.rs new file mode 100644 index 0000000000..e28275e44f --- /dev/null +++ b/solana/programs/revenue-distribution/tests/set_admin_test.rs @@ -0,0 +1,46 @@ +mod common; + +// + +use doublezero_revenue_distribution::state::{self, ProgramConfig}; +use solana_program_test::tokio; +use solana_sdk::{signature::Keypair, signer::Signer}; + +// +// Setup. +// + +struct SetAdminSetup { + test_setup: common::ProgramTestWithOwner, +} + +async fn setup_for_set_admin() -> SetAdminSetup { + let mut test_setup = common::start_test().await; + + test_setup.initialize_program().await.unwrap(); + + SetAdminSetup { test_setup } +} + +// +// Set admin — happy path. +// + +#[tokio::test] +async fn test_set_admin() { + let SetAdminSetup { mut test_setup } = setup_for_set_admin().await; + + let admin_signer = Keypair::new(); + + test_setup.set_admin(&admin_signer.pubkey()).await.unwrap(); + + let (program_config_key, program_config, _) = test_setup.fetch_program_config().await; + + let mut expected_program_config = ProgramConfig::default(); + expected_program_config.bump_seed = ProgramConfig::find_address().1; + expected_program_config.reserve_2z_bump_seed = + state::find_2z_token_pda_address(&program_config_key).1; + expected_program_config.set_is_paused(true); + expected_program_config.admin_key = admin_signer.pubkey(); + assert_eq!(program_config, expected_program_config); +} diff --git a/solana/programs/revenue-distribution/tests/set_distribution_economic_burn_rate_test.rs b/solana/programs/revenue-distribution/tests/set_distribution_economic_burn_rate_test.rs new file mode 100644 index 0000000000..1e8dd096c0 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/set_distribution_economic_burn_rate_test.rs @@ -0,0 +1,212 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::SetDistributionEconomicBurnRateAccounts, ProgramConfiguration, + RevenueDistributionInstructionData, + }, + state::{self, Distribution}, + types::{BurnRate, DoubleZeroEpoch, ValidatorFee}, + ID, +}; +use solana_program_test::{tokio, BanksClientError}; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; +use svm_hash::sha2::Hash; + +// +// Setup. +// + +struct SetDistributionEconomicBurnRateSetup { + test_setup: common::ProgramTestWithOwner, + debt_accountant_signer: Keypair, + rewards_accountant_signer: Keypair, + dz_epoch: DoubleZeroEpoch, +} + +/// Set up a configured program with two distributions (epoch 0 and 1). +/// Epoch 1 is ready for economic burn rate configuration. +async fn setup_for_set_distribution_economic_burn_rate() -> SetDistributionEconomicBurnRateSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let minimum_epoch_duration_to_finalize_rewards = 2; + + test_setup + .configure_program( + &configured.admin_signer, + [ProgramConfiguration::MinimumEpochDurationToFinalizeRewards( + minimum_epoch_duration_to_finalize_rewards, + )], + ) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + + SetDistributionEconomicBurnRateSetup { + test_setup, + debt_accountant_signer: configured.debt_accountant_signer, + rewards_accountant_signer: configured.rewards_accountant_signer, + dz_epoch, + } +} + +// +// Set distribution economic burn rate — happy path. +// + +#[tokio::test] +async fn test_set_distribution_economic_burn_rate() { + let SetDistributionEconomicBurnRateSetup { + mut test_setup, + rewards_accountant_signer, + dz_epoch, + .. + } = setup_for_set_distribution_economic_burn_rate().await; + + let initial_cbr = 100_000_000; + let distribute_rewards_relay_lamports = 10_000; + + // Set economic burn rate. + + let economic_burn_rate_value = 200_000_000; // 20%. + + test_setup + .set_distribution_economic_burn_rate( + dz_epoch, + &rewards_accountant_signer, + economic_burn_rate_value, + ) + .await + .unwrap(); + + let (distribution_key, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = ValidatorFee::new(500).unwrap(); + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + expected_distribution.economic_burn_rate = BurnRate::new(economic_burn_rate_value).unwrap(); + assert_eq!(distribution, expected_distribution); + + // Update economic burn rate to a different value. + + let updated_burn_rate_value = 350_000_000; // 35%. + + test_setup + .set_distribution_economic_burn_rate( + dz_epoch, + &rewards_accountant_signer, + updated_burn_rate_value, + ) + .await + .unwrap(); + + let (_, distribution, _, _, _) = test_setup.fetch_distribution(dz_epoch).await; + + expected_distribution.economic_burn_rate = BurnRate::new(updated_burn_rate_value).unwrap(); + assert_eq!(distribution, expected_distribution); +} + +// +// Set distribution economic burn rate — cannot set after rewards finalized. +// + +#[tokio::test] +async fn test_cannot_set_distribution_economic_burn_rate_after_rewards_finalized() { + let SetDistributionEconomicBurnRateSetup { + mut test_setup, + debt_accountant_signer, + rewards_accountant_signer, + dz_epoch, + } = setup_for_set_distribution_economic_burn_rate().await; + + let total_contributors = 69; + let rewards_merkle_root = Hash::new_unique(); + + test_setup + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap() + .configure_distribution_rewards( + dz_epoch, + &rewards_accountant_signer, + total_contributors, + rewards_merkle_root, + ) + .await + .unwrap() + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .finalize_distribution_rewards(dz_epoch) + .await + .unwrap(); + + let (tx_err, program_logs) = + simulate_program_revert(&mut test_setup, &rewards_accountant_signer, dz_epoch) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Distribution rewards have already been finalized" + ); +} + +// +// Helpers. +// + +async fn simulate_program_revert( + test_setup: &mut common::ProgramTestWithOwner, + rewards_accountant_signer: &Keypair, + dz_epoch: DoubleZeroEpoch, +) -> Result<(TransactionError, Vec), BanksClientError> { + let set_distribution_economic_burn_rate_ix = try_build_instruction( + &ID, + SetDistributionEconomicBurnRateAccounts::new(&rewards_accountant_signer.pubkey(), dz_epoch), + &RevenueDistributionInstructionData::SetDistributionEconomicBurnRate(Default::default()), + ) + .unwrap(); + + test_setup + .unwrap_simulation_error( + &[set_distribution_economic_burn_rate_ix], + &[rewards_accountant_signer], + ) + .await +} diff --git a/solana/programs/revenue-distribution/tests/set_rewards_manager_test.rs b/solana/programs/revenue-distribution/tests/set_rewards_manager_test.rs new file mode 100644 index 0000000000..335131eba6 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/set_rewards_manager_test.rs @@ -0,0 +1,214 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::SetRewardsManagerAccounts, ContributorRewardsConfiguration, ProgramConfiguration, + ProgramFlagConfiguration, RevenueDistributionInstructionData, + }, + state::ContributorRewards, + ID, +}; +use solana_program_test::{tokio, BanksClientError}; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; + +// +// Setup. +// + +struct SetRewardsManagerSetup { + test_setup: common::ProgramTestWithOwner, + contributor_manager_signer: Keypair, + service_key: Pubkey, +} + +async fn setup_for_set_rewards_manager() -> SetRewardsManagerSetup { + let mut test_setup = common::start_test().await; + + let admin_signer = Keypair::new(); + let contributor_manager_signer = Keypair::new(); + let service_key = Pubkey::new_unique(); + + test_setup + .initialize_program() + .await + .unwrap() + .initialize_journal() + .await + .unwrap() + .set_admin(&admin_signer.pubkey()) + .await + .unwrap() + .initialize_contributor_rewards(&service_key) + .await + .unwrap() + .configure_program( + &admin_signer, + [ + ProgramConfiguration::ContributorManager(contributor_manager_signer.pubkey()), + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + ], + ) + .await + .unwrap(); + + SetRewardsManagerSetup { + test_setup, + contributor_manager_signer, + service_key, + } +} + +// +// Set rewards manager — happy path. +// + +#[tokio::test] +async fn test_set_rewards_manager() { + let SetRewardsManagerSetup { + mut test_setup, + contributor_manager_signer, + service_key, + } = setup_for_set_rewards_manager().await; + + let rewards_manager_signer = Keypair::new(); + let rewards_manager_key = rewards_manager_signer.pubkey(); + + test_setup + .set_rewards_manager( + &service_key, + &contributor_manager_signer, + &rewards_manager_key, + ) + .await + .unwrap(); + + let (_, contributor_rewards) = test_setup.fetch_contributor_rewards(&service_key).await; + + let mut expected_contributor_rewards = ContributorRewards::default(); + expected_contributor_rewards.service_key = service_key; + expected_contributor_rewards.rewards_manager_key = rewards_manager_key; + assert_eq!(contributor_rewards, expected_contributor_rewards); +} + +// +// Set rewards manager — cannot set when blocked. +// + +#[tokio::test] +async fn test_cannot_set_rewards_manager_when_blocked() { + let SetRewardsManagerSetup { + mut test_setup, + contributor_manager_signer, + service_key, + } = setup_for_set_rewards_manager().await; + + let rewards_manager_signer = Keypair::new(); + + test_setup + .set_rewards_manager( + &service_key, + &contributor_manager_signer, + &rewards_manager_signer.pubkey(), + ) + .await + .unwrap() + .configure_contributor_rewards( + &service_key, + &rewards_manager_signer, + [ContributorRewardsConfiguration::IsSetRewardsManagerBlocked( + true, + )], + ) + .await + .unwrap(); + + let (tx_err, program_logs) = + simulate_program_revert(&mut test_setup, &contributor_manager_signer, &service_key) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!(program_logs.get(3).unwrap(), "Program log: Blocked"); +} + +// +// Set rewards manager — can set after unblocking. +// + +#[tokio::test] +async fn test_set_rewards_manager_after_unblocking() { + let SetRewardsManagerSetup { + mut test_setup, + contributor_manager_signer, + service_key, + } = setup_for_set_rewards_manager().await; + + let rewards_manager_signer = Keypair::new(); + let rewards_manager_key = rewards_manager_signer.pubkey(); + + test_setup + .set_rewards_manager( + &service_key, + &contributor_manager_signer, + &rewards_manager_key, + ) + .await + .unwrap() + .configure_contributor_rewards( + &service_key, + &rewards_manager_signer, + [ContributorRewardsConfiguration::IsSetRewardsManagerBlocked( + true, + )], + ) + .await + .unwrap() + .configure_contributor_rewards( + &service_key, + &rewards_manager_signer, + [ContributorRewardsConfiguration::IsSetRewardsManagerBlocked( + false, + )], + ) + .await + .unwrap() + .set_rewards_manager( + &service_key, + &contributor_manager_signer, + &rewards_manager_key, + ) + .await + .unwrap(); +} + +// +// Helpers. +// + +async fn simulate_program_revert( + test_setup: &mut common::ProgramTestWithOwner, + contributor_manager_signer: &Keypair, + service_key: &Pubkey, +) -> Result<(TransactionError, Vec), BanksClientError> { + let set_rewards_manager_ix = try_build_instruction( + &ID, + SetRewardsManagerAccounts::new(&contributor_manager_signer.pubkey(), service_key), + &RevenueDistributionInstructionData::SetRewardsManager(Pubkey::new_unique()), + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[set_rewards_manager_ix], &[contributor_manager_signer]) + .await +} diff --git a/solana/programs/revenue-distribution/tests/sweep_distribution_tokens_test.rs b/solana/programs/revenue-distribution/tests/sweep_distribution_tokens_test.rs new file mode 100644 index 0000000000..25f333dee7 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/sweep_distribution_tokens_test.rs @@ -0,0 +1,676 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::SweepDistributionTokensAccounts, ProgramConfiguration, + ProgramFeatureConfiguration, ProgramFlagConfiguration, RevenueDistributionInstructionData, + }, + state::{ + self, find_2z_token_pda_address, find_swap_authority_address, Distribution, + SolanaValidatorDeposit, + }, + types::{BurnRate, DoubleZeroEpoch, SolanaValidatorDebt, ValidatorFee}, + DOUBLEZERO_MINT_KEY, ID, +}; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; +use svm_hash::{ + merkle::{merkle_root_from_indexed_pod_leaves, MerkleProof}, + sha2::Hash, +}; + +// +// Setup. +// + +struct SweepDistributionTokensSetup { + test_setup: common::ProgramTestWithOwner, + debt_accountant_signer: Keypair, + rewards_accountant_signer: Keypair, + src_token_account_key: Pubkey, + transfer_authority_signer: Keypair, + debt_data: Vec, + total_solana_validators: u32, + total_solana_validator_debt: u64, + solana_validator_debt_merkle_root: Hash, + uncollectible_debt: SolanaValidatorDebt, + expected_swept_2z_amount_1: u64, + expected_swept_2z_amount_2: u64, + total_contributors: u32, + rewards_merkle_root: Hash, + dz_epoch: DoubleZeroEpoch, + next_dz_epoch: DoubleZeroEpoch, + and_another_dz_epoch: DoubleZeroEpoch, +} + +/// Set up a configured program with two distributions, debt paid (except one +/// uncollectible validator), rewards configured, and swap destination ready. +/// Uses custom setup because it needs `start_test_with_accounts` for +/// pre-bootstrapped token accounts and extra config (`Sol2zSwapProgram`, +/// `FeatureActivation`, `MinimumEpochDurationToFinalizeRewards`). +async fn setup_for_sweep_distribution_tokens() -> SweepDistributionTokensSetup { + let transfer_authority_signer = Keypair::new(); + + let bootstrapped_accounts = common::generate_token_accounts_for_test( + &DOUBLEZERO_MINT_KEY, + &[transfer_authority_signer.pubkey()], + ); + let src_token_account_key = bootstrapped_accounts.first().unwrap().key; + + let mut test_setup = common::start_test_with_accounts(bootstrapped_accounts).await; + + let admin_signer = Keypair::new(); + let debt_accountant_signer = Keypair::new(); + let rewards_accountant_signer = Keypair::new(); + + let initial_cbr = 100_000_000; + let cbr_limit = 500_000_000; + let solana_validator_base_block_rewards_pct_fee = 500; + let distribute_rewards_relay_lamports = 10_000; + let minimum_epoch_duration_to_finalize_rewards = 1; + + let debt_data = (0..8) + .map(|i| SolanaValidatorDebt { + node_id: Pubkey::new_unique(), + amount: 10_000_000_000 * (i + 1), + }) + .collect::>(); + + let total_solana_validators = debt_data.len() as u32; + let total_solana_validator_debt = debt_data.iter().map(|debt| debt.amount).sum(); + let solana_validator_debt_merkle_root = + merkle_root_from_indexed_pod_leaves(&debt_data, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + + let uncollectible_index = 2; + let uncollectible_debt = debt_data[uncollectible_index]; + + let expected_swept_2z_amount_1 = 69 * u64::pow(10, 8); + let expected_swept_2z_amount_2 = 420 * u64::pow(10, 8); + + let total_contributors = 2; + let rewards_merkle_root = Hash::new_unique(); + + let dz_epoch = DoubleZeroEpoch::new(0); + let next_dz_epoch = dz_epoch.saturating_add_duration(1); + + test_setup + .transfer_2z( + &src_token_account_key, + expected_swept_2z_amount_1 + expected_swept_2z_amount_2, + ) + .await + .unwrap() + .initialize_program() + .await + .unwrap() + .initialize_journal() + .await + .unwrap() + .set_admin(&admin_signer.pubkey()) + .await + .unwrap() + .configure_program( + &admin_signer, + [ + ProgramConfiguration::Sol2zSwapProgram(mock_swap_sol_2z::ID), + ProgramConfiguration::DebtAccountant(debt_accountant_signer.pubkey()), + ProgramConfiguration::RewardsAccountant(rewards_accountant_signer.pubkey()), + ProgramConfiguration::SolanaValidatorFeeParameters { + base_block_rewards_pct: solana_validator_base_block_rewards_pct_fee, + priority_block_rewards_pct: 0, + inflation_rewards_pct: 0, + jito_tips_pct: 0, + fixed_sol_amount: 0, + _unused: Default::default(), + }, + ProgramConfiguration::CommunityBurnRateParameters { + limit: cbr_limit, + dz_epochs_to_increasing: 10, + dz_epochs_to_limit: 20, + initial_rate: Some(initial_cbr), + }, + ProgramConfiguration::DistributeRewardsRelayLamports( + distribute_rewards_relay_lamports, + ), + ProgramConfiguration::CalculationGracePeriodMinutes(1), + ProgramConfiguration::DistributionInitializationGracePeriodMinutes(1), + ProgramConfiguration::MinimumEpochDurationToFinalizeRewards( + minimum_epoch_duration_to_finalize_rewards, + ), + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + ProgramConfiguration::FeatureActivation { + feature: ProgramFeatureConfiguration::SolanaValidatorDebtWriteOff, + activation_epoch: DoubleZeroEpoch::new(1), + }, + ], + ) + .await + .unwrap() + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + next_dz_epoch, + &debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap() + .finalize_distribution_debt(next_dz_epoch, &debt_accountant_signer) + .await + .unwrap() + .enable_solana_validator_debt_write_off(next_dz_epoch) + .await + .unwrap() + .configure_distribution_rewards( + next_dz_epoch, + &rewards_accountant_signer, + total_contributors, + rewards_merkle_root, + ) + .await + .unwrap() + .initialize_swap_destination(&DOUBLEZERO_MINT_KEY) + .await + .unwrap(); + + // Pay all validators except the uncollectible one. + for (i, debt) in debt_data.iter().enumerate() { + let node_id = &debt.node_id; + + if i == uncollectible_index { + test_setup + .initialize_solana_validator_deposit(node_id) + .await + .unwrap(); + continue; + } + + let proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + i.try_into().unwrap(), + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + let (deposit_key, _) = SolanaValidatorDeposit::find_address(node_id); + + test_setup + .initialize_solana_validator_deposit(node_id) + .await + .unwrap() + .transfer_lamports(&deposit_key, debt.amount) + .await + .unwrap() + .pay_solana_validator_debt(next_dz_epoch, debt, proof) + .await + .unwrap(); + } + + let and_another_dz_epoch = next_dz_epoch.saturating_add_duration(1); + + SweepDistributionTokensSetup { + test_setup, + debt_accountant_signer, + rewards_accountant_signer, + src_token_account_key, + transfer_authority_signer, + debt_data, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + uncollectible_debt, + expected_swept_2z_amount_1, + expected_swept_2z_amount_2, + total_contributors, + rewards_merkle_root, + dz_epoch, + next_dz_epoch, + and_another_dz_epoch, + } +} + +// +// Sweep distribution tokens — happy path with sequential error checks. +// + +#[tokio::test] +async fn test_sweep_distribution_tokens() { + let SweepDistributionTokensSetup { + mut test_setup, + debt_accountant_signer, + rewards_accountant_signer, + src_token_account_key, + transfer_authority_signer, + debt_data, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + uncollectible_debt, + expected_swept_2z_amount_1, + expected_swept_2z_amount_2, + total_contributors, + rewards_merkle_root, + dz_epoch, + next_dz_epoch, + and_another_dz_epoch, + .. + } = setup_for_sweep_distribution_tokens().await; + + let initial_cbr = 100_000_000; + let solana_validator_base_block_rewards_pct_fee = 500; + let distribute_rewards_relay_lamports = 10_000; + + // Cannot sweep until distribution 0 is finalized. + let sweep_distribution_tokens_ix = try_build_instruction( + &ID, + SweepDistributionTokensAccounts::new( + dz_epoch, + &Pubkey::new_unique(), + &Pubkey::new_unique(), + ), + &RevenueDistributionInstructionData::SweepDistributionTokens, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[sweep_distribution_tokens_ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Distribution rewards have not been finalized" + ); + + test_setup + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap() + .finalize_distribution_rewards(dz_epoch) + .await + .unwrap() + .finalize_distribution_rewards(next_dz_epoch) + .await + .unwrap(); + + // Cannot sweep until distribution 0 is swept. + let sweep_distribution_tokens_ix = try_build_instruction( + &ID, + SweepDistributionTokensAccounts::new( + next_dz_epoch, + &Pubkey::new_unique(), + &Pubkey::new_unique(), + ), + &RevenueDistributionInstructionData::SweepDistributionTokens, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[sweep_distribution_tokens_ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Can only sweep tokens for DZ epoch 0" + ); + + test_setup + .sweep_distribution_tokens(dz_epoch) + .await + .unwrap(); + + // Cannot sweep if there is not enough swapped SOL to cover the debt. + let sol_2z_swap_fills_registry_key = test_setup.sol_2z_swap_fills_registry_key; + + let sweep_distribution_tokens_ix = try_build_instruction( + &ID, + SweepDistributionTokensAccounts::new( + next_dz_epoch, + &mock_swap_sol_2z::ID, + &sol_2z_swap_fills_registry_key, + ), + &RevenueDistributionInstructionData::SweepDistributionTokens, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[sweep_distribution_tokens_ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Journal does not have enough swapped SOL to cover the SOL debt" + ); + + // Initialize another distribution. Out of convenience, use the same debt + // calculations. + test_setup + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + and_another_dz_epoch, + &debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap() + .finalize_distribution_debt(and_another_dz_epoch, &debt_accountant_signer) + .await + .unwrap() + .configure_distribution_rewards( + and_another_dz_epoch, + &rewards_accountant_signer, + total_contributors, + rewards_merkle_root, + ) + .await + .unwrap() + .finalize_distribution_rewards(and_another_dz_epoch) + .await + .unwrap(); + + // Pay all validators' debt for the new distribution. + for (i, debt) in debt_data.iter().enumerate() { + let proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + i.try_into().unwrap(), + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + let (deposit_key, _) = SolanaValidatorDeposit::find_address(&debt.node_id); + + test_setup + .transfer_lamports(&deposit_key, debt.amount) + .await + .unwrap() + .pay_solana_validator_debt(and_another_dz_epoch, debt, proof) + .await + .unwrap(); + } + + let sol_destination_key = Pubkey::new_unique(); + + // Swap twice to satisfy both distributions. + test_setup + .mock_buy_sol( + &src_token_account_key, + &transfer_authority_signer, + &sol_destination_key, + expected_swept_2z_amount_1, + total_solana_validator_debt, + ) + .await + .unwrap() + .mock_buy_sol( + &src_token_account_key, + &transfer_authority_signer, + &sol_destination_key, + expected_swept_2z_amount_2, + total_solana_validator_debt - uncollectible_debt.amount, + ) + .await + .unwrap(); + + // Test. + + let swap_authority_key = find_swap_authority_address().0; + let swap_destination_key = find_2z_token_pda_address(&swap_authority_key).0; + + let swap_destination_balance_before = test_setup + .fetch_token_account(&swap_destination_key) + .await + .unwrap() + .amount; + + let (_, journal, _) = test_setup.fetch_journal().await; + let journal_sol_balance_before = journal.swapped_sol_amount; + + test_setup + .sweep_distribution_tokens(next_dz_epoch) + .await + .unwrap(); + + let (_, journal, _) = test_setup.fetch_journal().await; + assert_eq!( + journal_sol_balance_before - journal.swapped_sol_amount, + total_solana_validator_debt + ); + + let swap_destination_balance_after = test_setup + .fetch_token_account(&swap_destination_key) + .await + .unwrap() + .amount; + assert_eq!( + swap_destination_balance_before - swap_destination_balance_after, + expected_swept_2z_amount_1 + ); + assert_eq!( + swap_destination_balance_after, + journal.swap_2z_destination_balance + ); + assert_eq!( + journal.lifetime_swapped_2z_amount(), + u128::from(expected_swept_2z_amount_1 + expected_swept_2z_amount_2) + ); + + let (distribution_key, distribution, remaining_distribution_data, _, distribution_2z_token_pda) = + test_setup.fetch_distribution(next_dz_epoch).await; + + assert_eq!(distribution_2z_token_pda.amount, expected_swept_2z_amount_1); + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.set_is_rewards_calculation_finalized(true); + expected_distribution.set_has_swept_2z_tokens(true); + expected_distribution.set_is_solana_validator_debt_write_off_enabled(true); + expected_distribution.bump_seed = Distribution::find_address(next_dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = next_dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.solana_validator_payments_count = total_solana_validators - 1; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.collected_solana_validator_payments = + total_solana_validator_debt - uncollectible_debt.amount; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.total_contributors = total_contributors; + expected_distribution.rewards_merkle_root = rewards_merkle_root; + expected_distribution.collected_2z_converted_from_sol = expected_swept_2z_amount_1; + expected_distribution.processed_solana_validator_debt_end_index = total_solana_validators / 8; + expected_distribution.processed_solana_validator_debt_write_off_start_index = + total_solana_validators / 8; + expected_distribution.processed_solana_validator_debt_write_off_end_index = + 2 * (total_solana_validators / 8); + expected_distribution.processed_rewards_start_index = 2 * (total_solana_validators / 8); + expected_distribution.processed_rewards_end_index = + 2 * (total_solana_validators / 8) + (total_contributors / 8 + 1); + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = test_setup + .get_clock() + .await + .unix_timestamp + .saturating_sub(60) as u32; + assert_eq!(distribution, expected_distribution); + + // First byte reflects debt tracking. + let processed_debt_bitmap = + &remaining_distribution_data[distribution.processed_solana_validator_debt_bitmap_range()]; + assert_eq!(processed_debt_bitmap, [0b11111011]); + + // Second byte reflects write off tracking. + let write_off_bitmap = &remaining_distribution_data + [distribution.processed_solana_validator_debt_write_off_bitmap_range()]; + assert_eq!(write_off_bitmap, [0]); + + // Third byte reflects rewards tracking. + let rewards_bitmap = + &remaining_distribution_data[distribution.processed_rewards_bitmap_range()]; + assert_eq!(rewards_bitmap, [0]); + + // Write off debt for the uncollectible validator. + let uncollectible_index = 2; + let proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + uncollectible_index, + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + test_setup + .write_off_solana_validator_debt( + next_dz_epoch, + and_another_dz_epoch, + &debt_accountant_signer, + &uncollectible_debt, + proof, + ) + .await + .unwrap(); + + // Sweep next distribution. + test_setup + .sweep_distribution_tokens(and_another_dz_epoch) + .await + .unwrap(); + + let (_, journal, _) = test_setup.fetch_journal().await; + assert_eq!(journal.total_sol_balance, 0); + + let swap_destination_balance_before = swap_destination_balance_after; + + let swap_destination_balance_after = test_setup + .fetch_token_account(&swap_destination_key) + .await + .unwrap() + .amount; + assert_eq!( + swap_destination_balance_before - swap_destination_balance_after, + expected_swept_2z_amount_2 + ); + assert_eq!( + swap_destination_balance_after, + journal.swap_2z_destination_balance + ); + assert_eq!(journal.swap_2z_destination_balance, 0); + assert_eq!( + journal.lifetime_swapped_2z_amount(), + u128::from(expected_swept_2z_amount_1 + expected_swept_2z_amount_2) + ); + + // No data in the distribution changes except for the bit reflecting the + // uncollectible debt. + let (_, distribution, remaining_distribution_data, _, _) = + test_setup.fetch_distribution(next_dz_epoch).await; + + expected_distribution.solana_validator_write_off_count = 1; + assert_eq!(distribution, expected_distribution); + + // First byte reflects debt tracking. + let processed_debt_bitmap = + &remaining_distribution_data[distribution.processed_solana_validator_debt_bitmap_range()]; + assert_eq!(processed_debt_bitmap, [0b11111111]); + + // Second byte reflects write off tracking. + let write_off_bitmap = &remaining_distribution_data + [distribution.processed_solana_validator_debt_write_off_bitmap_range()]; + assert_eq!(write_off_bitmap, [0b00000100]); + + // Third byte reflects rewards tracking. + let rewards_bitmap = + &remaining_distribution_data[distribution.processed_rewards_bitmap_range()]; + assert_eq!(rewards_bitmap, [0]); + + let ( + distribution_key, + distribution, + remaining_distribution_data, + _, + _distribution_2z_token_pda, + ) = test_setup.fetch_distribution(and_another_dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.set_is_rewards_calculation_finalized(true); + expected_distribution.set_has_swept_2z_tokens(true); + expected_distribution.bump_seed = Distribution::find_address(and_another_dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = and_another_dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.solana_validator_payments_count = total_solana_validators; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.collected_solana_validator_payments = total_solana_validator_debt; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.total_contributors = total_contributors; + expected_distribution.rewards_merkle_root = rewards_merkle_root; + expected_distribution.collected_2z_converted_from_sol = expected_swept_2z_amount_2; + expected_distribution.uncollectible_sol_debt = uncollectible_debt.amount; + expected_distribution.processed_solana_validator_debt_end_index = total_solana_validators / 8; + expected_distribution.processed_rewards_start_index = total_solana_validators / 8; + expected_distribution.processed_rewards_end_index = + (total_solana_validators / 8) + (total_contributors / 8 + 1); + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + assert_eq!(distribution, expected_distribution); + + // First byte reflects debt tracking. + let processed_debt_bitmap = + &remaining_distribution_data[distribution.processed_solana_validator_debt_bitmap_range()]; + assert_eq!(processed_debt_bitmap, [0b11111111]); + + // Second byte reflects rewards tracking. + let rewards_bitmap = + &remaining_distribution_data[distribution.processed_rewards_bitmap_range()]; + assert_eq!(rewards_bitmap, [0]); +} diff --git a/solana/programs/revenue-distribution/tests/verify_distribution_merkle_root_test.rs b/solana/programs/revenue-distribution/tests/verify_distribution_merkle_root_test.rs new file mode 100644 index 0000000000..7a4b66fcfd --- /dev/null +++ b/solana/programs/revenue-distribution/tests/verify_distribution_merkle_root_test.rs @@ -0,0 +1,231 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::VerifyDistributionMerkleRootAccounts, DistributionMerkleRootKind, + RevenueDistributionInstructionData, + }, + types::{DoubleZeroEpoch, RewardShare, SolanaValidatorDebt}, + ID, +}; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, signature::Keypair, transaction::TransactionError, +}; +use svm_hash::merkle::{merkle_root_from_indexed_pod_leaves, MerkleProof}; + +// +// Setup. +// + +struct VerifyDistributionMerkleRootSetup { + test_setup: common::ProgramTestWithOwner, + debt_accountant_signer: Keypair, + rewards_accountant_signer: Keypair, + dz_epoch: DoubleZeroEpoch, + debt_data: Vec, + solana_validator_debt_merkle_root: svm_hash::sha2::Hash, +} + +/// Set up a configured program with distribution debt configured on epoch 1, +/// ready for merkle root verification. +async fn setup_for_verify_distribution_merkle_root() -> VerifyDistributionMerkleRootSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + + // Odd-leaf merkle tree. + let debt_data = (0..511) + .map(|i| SolanaValidatorDebt { + node_id: Pubkey::new_unique(), + amount: 100_000_000_000 * (i + 1), + }) + .collect::>(); + assert_eq!(debt_data.len() % 2, 1); + + let solana_validator_debt_merkle_root = + merkle_root_from_indexed_pod_leaves(&debt_data, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + + let total_debt = debt_data.iter().map(|debt| debt.amount).sum(); + + test_setup + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &configured.debt_accountant_signer, + debt_data.len() as u32, + total_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap(); + + VerifyDistributionMerkleRootSetup { + test_setup, + debt_accountant_signer: configured.debt_accountant_signer, + rewards_accountant_signer: configured.rewards_accountant_signer, + dz_epoch, + debt_data, + solana_validator_debt_merkle_root, + } +} + +// +// Verify distribution merkle root — happy path with replay attack check. +// + +#[tokio::test] +async fn test_verify_distribution_merkle_root() { + let VerifyDistributionMerkleRootSetup { + mut test_setup, + debt_accountant_signer, + rewards_accountant_signer, + dz_epoch, + mut debt_data, + solana_validator_debt_merkle_root, + } = setup_for_verify_distribution_merkle_root().await; + + // Chunk into 64 instructions. + let mut chunk = Vec::with_capacity(64); + let last_index = debt_data.len() - 1; + + for (i, debt) in debt_data.iter().copied().enumerate() { + let kind = DistributionMerkleRootKind::SolanaValidatorDebt(debt); + let proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + i.try_into().unwrap(), + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + chunk.push((kind, proof)); + + if chunk.len() == 64 || i == last_index { + test_setup + .verify_distribution_merkle_root(dz_epoch, chunk.clone()) + .await + .unwrap(); + chunk.clear(); + } + } + + // Attempt to spoof a replay attack with the last leaf of the odd-leaf + // Merkle tree by duplicating the last leaf. + let last_leaf = *debt_data.last().unwrap(); + debt_data.push(last_leaf); + + let invalid_merkle_root = + merkle_root_from_indexed_pod_leaves(&debt_data, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + assert_ne!(solana_validator_debt_merkle_root, invalid_merkle_root); + + let spoofed_proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + debt_data.len() as u32 - 1, + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + let verify_distribution_merkle_root_ix = try_build_instruction( + &ID, + VerifyDistributionMerkleRootAccounts::new(dz_epoch), + &RevenueDistributionInstructionData::VerifyDistributionMerkleRoot { + kind: DistributionMerkleRootKind::SolanaValidatorDebt(last_leaf), + proof: spoofed_proof, + }, + ) + .unwrap(); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[verify_distribution_merkle_root_ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidInstructionData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Solana validator debt 511" + ); + assert_eq!( + program_logs.get(4).unwrap(), + &format!("Program log: Invalid computed merkle root: {invalid_merkle_root}") + ); + + // Distribution rewards. + + // Arbitrarily set one of the rewards to be blocked. + let rewards_data = [ + RewardShare::new(Pubkey::new_unique(), 100_000_000, false, 0).unwrap(), + RewardShare::new(Pubkey::new_unique(), 200_000_000, false, 0).unwrap(), + RewardShare::new(Pubkey::new_unique(), 300_000_000, true, 0).unwrap(), + RewardShare::new(Pubkey::new_unique(), 150_000_000, false, 0).unwrap(), + RewardShare::new(Pubkey::new_unique(), 250_000_000, false, 0).unwrap(), + ]; + assert_eq!( + rewards_data + .iter() + .map(|rewards| rewards.unit_share) + .sum::(), + 1_000_000_000 + ); + + let total_contributors = rewards_data.len() as u32; + let rewards_merkle_root = + merkle_root_from_indexed_pod_leaves(&rewards_data, Some(RewardShare::LEAF_PREFIX)).unwrap(); + + // Finalize distribution debt so we can post the rewards merkle root. + test_setup + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap() + .configure_distribution_rewards( + dz_epoch, + &rewards_accountant_signer, + total_contributors, + rewards_merkle_root, + ) + .await + .unwrap(); + + let kinds_and_proofs = rewards_data + .iter() + .copied() + .enumerate() + .map(|(i, reward_share)| { + let kind = DistributionMerkleRootKind::RewardShare(reward_share); + let proof = MerkleProof::from_indexed_pod_leaves( + &rewards_data, + i.try_into().unwrap(), + Some(RewardShare::LEAF_PREFIX), + ) + .unwrap(); + + (kind, proof) + }) + .collect::>(); + + test_setup + .verify_distribution_merkle_root(dz_epoch, kinds_and_proofs) + .await + .unwrap(); +} diff --git a/solana/programs/revenue-distribution/tests/withdraw_sol_test.rs b/solana/programs/revenue-distribution/tests/withdraw_sol_test.rs new file mode 100644 index 0000000000..e3299d6a5c --- /dev/null +++ b/solana/programs/revenue-distribution/tests/withdraw_sol_test.rs @@ -0,0 +1,230 @@ +mod common; + +// + +use doublezero_revenue_distribution::{ + instruction::{ProgramConfiguration, ProgramFlagConfiguration}, + state::SolanaValidatorDeposit, + types::{DoubleZeroEpoch, SolanaValidatorDebt}, + DOUBLEZERO_MINT_KEY, +}; +use solana_program_test::tokio; +use solana_pubkey::Pubkey; +use solana_sdk::signature::{Keypair, Signer}; +use svm_hash::merkle::{merkle_root_from_indexed_pod_leaves, MerkleProof}; + +// +// Setup. +// + +struct WithdrawSolSetup { + test_setup: common::ProgramTestWithOwner, + src_token_account_key: Pubkey, + transfer_authority_signer: Keypair, + total_solana_validator_debt: u64, +} + +/// Set up the program with a paid validator debt, ready for SOL withdrawal +/// via the mock swap program. Uses custom setup (not `setup_configured_program`) +/// because it needs `start_test_with_accounts` for pre-bootstrapped token accounts +/// and `Sol2zSwapProgram` configuration. +async fn setup_for_withdraw_sol() -> WithdrawSolSetup { + let transfer_authority_signer = Keypair::new(); + + let bootstrapped_accounts = common::generate_token_accounts_for_test( + &DOUBLEZERO_MINT_KEY, + &[transfer_authority_signer.pubkey()], + ); + let src_token_account_key = bootstrapped_accounts.first().unwrap().key; + + let mut test_setup = common::start_test_with_accounts(bootstrapped_accounts).await; + + let admin_signer = Keypair::new(); + + let dz_epoch = DoubleZeroEpoch::new(0); + let node_id = Pubkey::new_unique(); + let total_solana_validator_debt = 10 * u64::pow(10, 9); // 10 SOL. + + let debt = SolanaValidatorDebt { + node_id, + amount: total_solana_validator_debt, + }; + let debt_data = vec![debt]; + + let total_solana_validators = debt_data.len() as u32; + let solana_validator_debt_merkle_root = + merkle_root_from_indexed_pod_leaves(&debt_data, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + + let proof = + MerkleProof::from_indexed_pod_leaves(&debt_data, 0, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + + test_setup + .initialize_program() + .await + .unwrap() + .set_admin(&admin_signer.pubkey()) + .await + .unwrap() + .initialize_journal() + .await + .unwrap() + .initialize_swap_destination(&DOUBLEZERO_MINT_KEY) + .await + .unwrap() + .configure_program( + &admin_signer, + [ + ProgramConfiguration::DebtAccountant(admin_signer.pubkey()), + ProgramConfiguration::SolanaValidatorFeeParameters { + base_block_rewards_pct: 500, + priority_block_rewards_pct: 0, + inflation_rewards_pct: 0, + jito_tips_pct: 0, + fixed_sol_amount: 0, + _unused: Default::default(), + }, + ProgramConfiguration::CommunityBurnRateParameters { + limit: 500_000_000, + dz_epochs_to_increasing: 10, + dz_epochs_to_limit: 20, + initial_rate: Some(100_000_000), + }, + ProgramConfiguration::DistributeRewardsRelayLamports(10_000), + ProgramConfiguration::CalculationGracePeriodMinutes(1), + ProgramConfiguration::DistributionInitializationGracePeriodMinutes(1), + ProgramConfiguration::Sol2zSwapProgram(mock_swap_sol_2z::ID), + ProgramConfiguration::Flag(ProgramFlagConfiguration::IsPaused(false)), + ], + ) + .await + .unwrap() + .initialize_distribution(&admin_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &admin_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap() + .finalize_distribution_debt(dz_epoch, &admin_signer) + .await + .unwrap() + .initialize_solana_validator_deposit(&node_id) + .await + .unwrap() + .transfer_lamports( + &SolanaValidatorDeposit::find_address(&node_id).0, + total_solana_validator_debt, + ) + .await + .unwrap() + .pay_solana_validator_debt(dz_epoch, &debt, proof) + .await + .unwrap(); + + WithdrawSolSetup { + test_setup, + src_token_account_key, + transfer_authority_signer, + total_solana_validator_debt, + } +} + +// +// Withdraw SOL — happy path. +// +// This test uses the mock SOL/2Z Swap program. +// + +#[tokio::test] +async fn test_withdraw_sol() { + let WithdrawSolSetup { + mut test_setup, + src_token_account_key, + transfer_authority_signer, + total_solana_validator_debt, + } = setup_for_withdraw_sol().await; + + let amount_2z_in = 2_500 * u64::pow(10, 8); // 2,500 2Z. + let amount_sol_out = 2 * u64::pow(10, 9); // 2 SOL. + + let sol_destination_key = Pubkey::new_unique(); + + test_setup + .transfer_2z(&src_token_account_key, 2 * amount_2z_in) + .await + .unwrap(); + + // First swap. + + test_setup + .mock_buy_sol( + &src_token_account_key, + &transfer_authority_signer, + &sol_destination_key, + amount_2z_in, + amount_sol_out, + ) + .await + .unwrap(); + + let (_, journal, _) = test_setup.fetch_journal().await; + assert_eq!( + journal.total_sol_balance, + total_solana_validator_debt - amount_sol_out + ); + assert_eq!(journal.swap_2z_destination_balance, amount_2z_in); + assert_eq!(journal.lifetime_swapped_2z_amount(), amount_2z_in as u128); + + let sol_destination_balance = test_setup + .context + .banks_client + .get_balance(sol_destination_key) + .await + .unwrap(); + assert_eq!(sol_destination_balance, amount_sol_out); + + let (_, program_config, _) = test_setup.fetch_program_config().await; + let swap_destination_key = program_config + .checked_swap_destination_2z_address() + .unwrap(); + let swap_destination_balance = test_setup + .fetch_token_account(&swap_destination_key) + .await + .unwrap() + .amount; + assert_eq!(swap_destination_balance, amount_2z_in); + + // Second swap. + + test_setup + .mock_buy_sol( + &src_token_account_key, + &transfer_authority_signer, + &sol_destination_key, + amount_2z_in, + amount_sol_out, + ) + .await + .unwrap(); + + let (_, journal, _) = test_setup.fetch_journal().await; + assert_eq!( + journal.total_sol_balance, + total_solana_validator_debt - 2 * amount_sol_out + ); + assert_eq!(journal.swap_2z_destination_balance, 2 * amount_2z_in); + assert_eq!( + journal.lifetime_swapped_2z_amount(), + 2 * amount_2z_in as u128 + ); +} diff --git a/solana/programs/revenue-distribution/tests/withdraw_solana_validator_deposit_test.rs b/solana/programs/revenue-distribution/tests/withdraw_solana_validator_deposit_test.rs new file mode 100644 index 0000000000..819f89dc44 --- /dev/null +++ b/solana/programs/revenue-distribution/tests/withdraw_solana_validator_deposit_test.rs @@ -0,0 +1,597 @@ +mod common; + +// + +use doublezero_program_tools::{instruction::try_build_instruction, zero_copy}; +use doublezero_revenue_distribution::{ + instruction::{ + account::WithdrawSolanaValidatorDepositAccounts, ProgramConfiguration, + ProgramFeatureConfiguration, ProgramFlagConfiguration, RevenueDistributionInstructionData, + }, + state::SolanaValidatorDeposit, + types::{DoubleZeroEpoch, SolanaValidatorDebt}, + ID, +}; +use solana_program_test::{tokio, BanksClientError}; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; +use svm_hash::merkle::{merkle_root_from_indexed_pod_leaves, MerkleProof}; + +// +// Setup. +// + +struct WithdrawSolanaValidatorDepositSetup { + test_setup: common::ProgramTestWithOwner, + admin_signer: Keypair, + debt_accountant_signer: Keypair, + node_signer: Keypair, + deposit_key: Pubkey, + deposit_rent_exemption: u64, +} + +/// Set up a configured program with a single validator deposit account +/// initialized. No debt has been configured. +async fn setup_for_withdraw_solana_validator_deposit() -> WithdrawSolanaValidatorDepositSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let node_signer = Keypair::new(); + let node_id = node_signer.pubkey(); + let deposit_key = SolanaValidatorDeposit::find_address(&node_id).0; + + test_setup + .initialize_solana_validator_deposit(&node_id) + .await + .unwrap(); + + let deposit_rent_exemption = + (128 + zero_copy::data_end::() as u64) * 6_960; + + WithdrawSolanaValidatorDepositSetup { + test_setup, + admin_signer: configured.admin_signer, + debt_accountant_signer: configured.debt_accountant_signer, + node_signer, + deposit_key, + deposit_rent_exemption, + } +} + +struct WithdrawDelinquentDepositSetup { + test_setup: common::ProgramTestWithOwner, + node_signer: Keypair, + deposit_key: Pubkey, + deposit_rent_exemption: u64, + debt_amount: u64, +} + +/// Set up a configured program with a single validator whose debt has been +/// written off. The deposit account has only rent-exemption lamports. +async fn setup_with_written_off_debt() -> WithdrawDelinquentDepositSetup { + let WithdrawSolanaValidatorDepositSetup { + mut test_setup, + admin_signer, + debt_accountant_signer, + node_signer, + deposit_key, + deposit_rent_exemption, + } = setup_for_withdraw_solana_validator_deposit().await; + + let node_id = node_signer.pubkey(); + let dz_epoch = DoubleZeroEpoch::new(1); + + let debt_amount = 2_000_000_000; + let debt_data = vec![SolanaValidatorDebt { + node_id, + amount: debt_amount, + }]; + let merkle_root = + merkle_root_from_indexed_pod_leaves(&debt_data, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + + test_setup + .configure_program( + &admin_signer, + [ProgramConfiguration::FeatureActivation { + feature: ProgramFeatureConfiguration::SolanaValidatorDebtWriteOff, + activation_epoch: DoubleZeroEpoch::new(1), + }], + ) + .await + .unwrap() + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .initialize_distribution(&debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &debt_accountant_signer, + 1, + debt_amount, + merkle_root, + ) + .await + .unwrap() + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap() + .enable_solana_validator_debt_write_off(dz_epoch) + .await + .unwrap(); + + let proof = + MerkleProof::from_indexed_pod_leaves(&debt_data, 0, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + + test_setup + .write_off_solana_validator_debt( + dz_epoch, + dz_epoch, + &debt_accountant_signer, + &debt_data[0], + proof, + ) + .await + .unwrap(); + + WithdrawDelinquentDepositSetup { + test_setup, + node_signer, + deposit_key, + deposit_rent_exemption, + debt_amount, + } +} + +// +// Withdraw Solana validator deposit — error scenarios. +// + +#[tokio::test] +async fn test_cannot_withdraw_solana_validator_deposit_with_wrong_node() { + let WithdrawSolanaValidatorDepositSetup { + mut test_setup, + deposit_key, + .. + } = setup_for_withdraw_solana_validator_deposit().await; + + let wrong_node_id = Pubkey::new_unique(); + let (tx_err, program_logs) = + simulate_program_revert(&mut test_setup, &wrong_node_id, Some(&deposit_key), None) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Invalid address for validator node (account 2)" + ); +} + +#[tokio::test] +async fn test_cannot_withdraw_solana_validator_deposit_when_paused() { + let WithdrawSolanaValidatorDepositSetup { + mut test_setup, + admin_signer, + node_signer, + .. + } = setup_for_withdraw_solana_validator_deposit().await; + + test_setup + .configure_program( + &admin_signer, + [ProgramConfiguration::Flag( + ProgramFlagConfiguration::IsPaused(true), + )], + ) + .await + .unwrap(); + + let (tx_err, program_logs) = + simulate_program_revert(&mut test_setup, &node_signer.pubkey(), None, None) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(2).unwrap(), + "Program log: Program is paused" + ); +} + +#[tokio::test] +async fn test_cannot_withdraw_solana_validator_deposit_with_delinquent_debt() { + let WithdrawDelinquentDepositSetup { + mut test_setup, + node_signer, + debt_amount, + .. + } = setup_with_written_off_debt().await; + + let node_id = node_signer.pubkey(); + + // Verify written_off_sol_debt is set. + let (_, deposit) = test_setup.fetch_solana_validator_deposit(&node_id).await; + assert_eq!(deposit.written_off_sol_debt, debt_amount); + + // Cannot withdraw when there are no excess lamports (only rent exemption + // with delinquent debt). + let (tx_err, program_logs) = simulate_program_revert(&mut test_setup, &node_id, None, None) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + &format!( + "Program log: No excess lamports to withdraw. Delinquent debt: {}", + debt_amount + ) + ); +} + +#[tokio::test] +async fn test_cannot_withdraw_solana_validator_deposit_without_excess() { + let WithdrawSolanaValidatorDepositSetup { + mut test_setup, + node_signer, + .. + } = setup_for_withdraw_solana_validator_deposit().await; + + let node_id = node_signer.pubkey(); + + // Cannot withdraw when there are no excess lamports (only rent exemption). + let (tx_err, program_logs) = simulate_program_revert(&mut test_setup, &node_id, None, None) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: No excess lamports to withdraw. Delinquent debt: 0" + ); +} + +#[tokio::test] +async fn test_cannot_withdraw_solana_validator_deposit_to_beneficiary_without_signer() { + let WithdrawSolanaValidatorDepositSetup { + mut test_setup, + node_signer, + deposit_key, + .. + } = setup_for_withdraw_solana_validator_deposit().await; + + let extra_lamports = 5_000_000_000; + test_setup + .transfer_lamports(&deposit_key, extra_lamports) + .await + .unwrap(); + + // Provide a beneficiary but do not sign with the node key. Build the + // instruction manually to avoid the automatic signer marking that the + // From impl applies when beneficiary_key is set. + let node_id = node_signer.pubkey(); + let accounts = WithdrawSolanaValidatorDepositAccounts::new(&node_id, None); + let mut withdraw_ix = try_build_instruction( + &ID, + accounts, + &RevenueDistributionInstructionData::WithdrawSolanaValidatorDeposit, + ) + .unwrap(); + withdraw_ix + .accounts + .push(solana_sdk::instruction::AccountMeta::new( + Pubkey::new_unique(), + false, + )); + + let (tx_err, program_logs) = test_setup + .unwrap_simulation_error(&[withdraw_ix], &[]) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::MissingRequiredSignature) + ); + assert_eq!( + program_logs.get(3).unwrap(), + "Program log: Validator node must be a signer when a beneficiary is provided" + ); +} + +// +// Withdraw Solana validator deposit — happy paths. +// + +#[tokio::test] +async fn test_withdraw_solana_validator_deposit() { + let WithdrawSolanaValidatorDepositSetup { + mut test_setup, + node_signer, + deposit_key, + deposit_rent_exemption, + .. + } = setup_for_withdraw_solana_validator_deposit().await; + + let node_id = node_signer.pubkey(); + + // Fund the deposit account with extra lamports. + let extra_lamports = 5_000_000_000; + test_setup + .transfer_lamports(&deposit_key, extra_lamports) + .await + .unwrap(); + + // Withdraw with written_off_sol_debt == 0: only excess lamports beyond + // rent exemption should be transferred to the node. + let node_balance_before = test_setup + .context + .banks_client + .get_balance(node_id) + .await + .unwrap(); + + test_setup + .withdraw_solana_validator_deposit(&node_signer, None) + .await + .unwrap(); + + let node_balance_after = test_setup + .context + .banks_client + .get_balance(node_id) + .await + .unwrap(); + + assert_eq!(node_balance_after - node_balance_before, extra_lamports); + + // Account should still exist with rent-exemption lamports. + let deposit_account = test_setup + .context + .banks_client + .get_account(deposit_key) + .await + .unwrap() + .unwrap(); + assert_eq!(deposit_account.lamports, deposit_rent_exemption); +} + +#[tokio::test] +async fn test_withdraw_solana_validator_deposit_to_beneficiary() { + let WithdrawSolanaValidatorDepositSetup { + mut test_setup, + node_signer, + deposit_key, + deposit_rent_exemption, + .. + } = setup_for_withdraw_solana_validator_deposit().await; + + let beneficiary_key = Pubkey::new_unique(); + + // Fund the deposit account with extra lamports. + let extra_lamports = 5_000_000_000; + test_setup + .transfer_lamports(&deposit_key, extra_lamports) + .await + .unwrap(); + + // Withdraw to beneficiary with written_off_sol_debt == 0: only excess + // lamports beyond rent exemption should be transferred to the beneficiary. + let beneficiary_balance_before = test_setup + .context + .banks_client + .get_balance(beneficiary_key) + .await + .unwrap(); + + test_setup + .withdraw_solana_validator_deposit(&node_signer, Some(&beneficiary_key)) + .await + .unwrap(); + + let beneficiary_balance_after = test_setup + .context + .banks_client + .get_balance(beneficiary_key) + .await + .unwrap(); + + assert_eq!( + beneficiary_balance_after - beneficiary_balance_before, + extra_lamports + ); + + // Account should still exist with rent-exemption lamports. + let deposit_account = test_setup + .context + .banks_client + .get_account(deposit_key) + .await + .unwrap() + .unwrap(); + assert_eq!(deposit_account.lamports, deposit_rent_exemption); +} + +#[tokio::test] +async fn test_withdraw_solana_validator_deposit_with_written_off_debt() { + let WithdrawDelinquentDepositSetup { + mut test_setup, + node_signer, + deposit_key, + deposit_rent_exemption, + debt_amount, + } = setup_with_written_off_debt().await; + + let node_id = node_signer.pubkey(); + + // Fund extra lamports beyond rent + written_off_sol_debt. + let extra_lamports = 3_000_000_000; + test_setup + .transfer_lamports(&deposit_key, extra_lamports) + .await + .unwrap(); + + // Withdraw: should only get extra_lamports - written_off_sol_debt. + let node_balance_before = test_setup + .context + .banks_client + .get_balance(node_id) + .await + .unwrap(); + + test_setup + .withdraw_solana_validator_deposit(&node_signer, None) + .await + .unwrap(); + + let node_balance_after = test_setup + .context + .banks_client + .get_balance(node_id) + .await + .unwrap(); + + let expected_withdrawal = extra_lamports - debt_amount; + assert_eq!( + node_balance_after - node_balance_before, + expected_withdrawal + ); + + // Account should still exist. + let deposit_account = test_setup + .context + .banks_client + .get_account(deposit_key) + .await + .unwrap(); + assert!(deposit_account.is_some()); + + // Remaining lamports = rent_exemption + written_off_sol_debt. + let remaining_lamports = deposit_account.unwrap().lamports; + assert_eq!(remaining_lamports, deposit_rent_exemption + debt_amount); + + // Cannot withdraw again (nothing left beyond rent + debt). + let (tx_err, program_logs) = simulate_program_revert(&mut test_setup, &node_id, None, None) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(3).unwrap(), + &format!( + "Program log: No excess lamports to withdraw. Delinquent debt: {}", + debt_amount + ) + ); +} + +#[tokio::test] +async fn test_withdraw_solana_validator_deposit_with_written_off_debt_to_beneficiary() { + let WithdrawDelinquentDepositSetup { + mut test_setup, + node_signer, + deposit_key, + deposit_rent_exemption, + debt_amount, + } = setup_with_written_off_debt().await; + + let beneficiary_key = Pubkey::new_unique(); + + // Fund extra lamports beyond rent + written_off_sol_debt. + let extra_lamports = 3_000_000_000; + test_setup + .transfer_lamports(&deposit_key, extra_lamports) + .await + .unwrap(); + + // Withdraw to beneficiary: should only get extra_lamports - written_off_sol_debt. + let beneficiary_balance_before = test_setup + .context + .banks_client + .get_balance(beneficiary_key) + .await + .unwrap(); + + test_setup + .withdraw_solana_validator_deposit(&node_signer, Some(&beneficiary_key)) + .await + .unwrap(); + + let beneficiary_balance_after = test_setup + .context + .banks_client + .get_balance(beneficiary_key) + .await + .unwrap(); + + let expected_withdrawal = extra_lamports - debt_amount; + assert_eq!( + beneficiary_balance_after - beneficiary_balance_before, + expected_withdrawal + ); + + // Remaining lamports = rent_exemption + written_off_sol_debt. + let deposit_account = test_setup + .context + .banks_client + .get_account(deposit_key) + .await + .unwrap() + .unwrap(); + assert_eq!( + deposit_account.lamports, + deposit_rent_exemption + debt_amount + ); +} + +// +// Helpers. +// + +async fn simulate_program_revert( + test_setup: &mut common::ProgramTestWithOwner, + node_id: &Pubkey, + deposit_key: Option<&Pubkey>, + beneficiary_key: Option<&Pubkey>, +) -> Result<(TransactionError, Vec), BanksClientError> { + let mut accounts = WithdrawSolanaValidatorDepositAccounts::new(node_id, beneficiary_key); + + if let Some(deposit_key) = deposit_key { + accounts.solana_validator_deposit_key = *deposit_key; + } + + let withdraw_ix = try_build_instruction( + &ID, + accounts, + &RevenueDistributionInstructionData::WithdrawSolanaValidatorDeposit, + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[withdraw_ix], &[]) + .await +} diff --git a/solana/programs/revenue-distribution/tests/write_off_solana_validator_debt_test.rs b/solana/programs/revenue-distribution/tests/write_off_solana_validator_debt_test.rs new file mode 100644 index 0000000000..1e7df154cb --- /dev/null +++ b/solana/programs/revenue-distribution/tests/write_off_solana_validator_debt_test.rs @@ -0,0 +1,523 @@ +mod common; + +// + +use doublezero_program_tools::instruction::try_build_instruction; +use doublezero_revenue_distribution::{ + instruction::{ + account::WriteOffSolanaValidatorDebtAccounts, ProgramConfiguration, + ProgramFeatureConfiguration, RevenueDistributionInstructionData, + }, + state::{self, Distribution, SolanaValidatorDeposit}, + types::{BurnRate, DoubleZeroEpoch, SolanaValidatorDebt, ValidatorFee}, + ID, +}; +use solana_program_test::{tokio, BanksClientError}; +use solana_pubkey::Pubkey; +use solana_sdk::{ + instruction::InstructionError, + signature::{Keypair, Signer}, + transaction::TransactionError, +}; +use svm_hash::merkle::{merkle_root_from_indexed_pod_leaves, MerkleProof}; + +// +// Setup. +// + +struct WriteOffSolanaValidatorDebtSetup { + test_setup: common::ProgramTestWithOwner, + debt_accountant_signer: Keypair, + dz_epoch: DoubleZeroEpoch, + next_dz_epoch: DoubleZeroEpoch, + debt_data: Vec, + total_solana_validators: u32, + total_solana_validator_debt: u64, + solana_validator_debt_merkle_root: svm_hash::sha2::Hash, +} + +/// Set up a configured program with: +/// - Three distributions (epoch 0, 1, 2) — debt configured on epochs 1 and 2 +/// - Write-off feature activated and enabled on epoch 1 +/// - Validator deposit accounts initialized (but no debt paid yet) +/// +/// Stops BEFORE any debt payment or write-off so the test can exercise +/// the full write-off lifecycle with sequential error checks. +async fn setup_for_write_off_solana_validator_debt() -> WriteOffSolanaValidatorDebtSetup { + let mut test_setup = common::start_test().await; + + let configured = test_setup.setup_configured_program().await.unwrap(); + + let dz_epoch = DoubleZeroEpoch::new(1); + let next_dz_epoch = dz_epoch.saturating_add_duration(1); + + let debt_data = (0..16) + .map(|i| SolanaValidatorDebt { + node_id: Pubkey::new_unique(), + amount: 10_000_000_000 * (i + 1), + }) + .collect::>(); + + let total_solana_validators = debt_data.len() as u32; + let total_solana_validator_debt = debt_data.iter().map(|debt| debt.amount).sum(); + let solana_validator_debt_merkle_root = + merkle_root_from_indexed_pod_leaves(&debt_data, Some(SolanaValidatorDebt::LEAF_PREFIX)) + .unwrap(); + + test_setup + .configure_program( + &configured.admin_signer, + [ProgramConfiguration::FeatureActivation { + feature: ProgramFeatureConfiguration::SolanaValidatorDebtWriteOff, + activation_epoch: DoubleZeroEpoch::new(1), + }], + ) + .await + .unwrap() + // Distribution 0. + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + // Distribution 1 (dz_epoch). + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + // Distribution 2 (next_dz_epoch). + .initialize_distribution(&configured.debt_accountant_signer) + .await + .unwrap() + .warp_timestamp_by(60) + .await + .unwrap() + .configure_distribution_debt( + dz_epoch, + &configured.debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap() + .configure_distribution_debt( + next_dz_epoch, + &configured.debt_accountant_signer, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + ) + .await + .unwrap(); + + // Initialize all validator deposit accounts. + for debt in debt_data.iter() { + test_setup + .initialize_solana_validator_deposit(&debt.node_id) + .await + .unwrap(); + } + + WriteOffSolanaValidatorDebtSetup { + test_setup, + debt_accountant_signer: configured.debt_accountant_signer, + dz_epoch, + next_dz_epoch, + debt_data, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + } +} + +// +// Write off Solana validator debt — happy path with sequential error checks. +// + +#[tokio::test] +async fn test_write_off_solana_validator_debt() { + let WriteOffSolanaValidatorDebtSetup { + mut test_setup, + debt_accountant_signer, + dz_epoch, + next_dz_epoch, + debt_data, + total_solana_validators, + total_solana_validator_debt, + solana_validator_debt_merkle_root, + } = setup_for_write_off_solana_validator_debt().await; + + let initial_cbr = 100_000_000; + let solana_validator_base_block_rewards_pct_fee = 500; + let distribute_rewards_relay_lamports = 10_000; + + let split_write_off_index = 8; + let debt_write_off_first = debt_data + .iter() + .skip(split_write_off_index) + .map(|debt| debt.amount) + .sum::(); + let debt_write_off_remaining = debt_data + .iter() + .take(split_write_off_index) + .map(|debt| debt.amount) + .sum::(); + + // Pick an arbitrary validator to test error scenarios. + let arbitrary_bad_debt_index = 2; + let arbitrary_bad_debt = debt_data[arbitrary_bad_debt_index]; + let proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + arbitrary_bad_debt_index.try_into().unwrap(), + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + // Cannot write off debt before enabling write-off. + let (tx_err, program_logs) = simulate_write_off_revert( + &mut test_setup, + &debt_accountant_signer, + dz_epoch, + &arbitrary_bad_debt, + next_dz_epoch, + proof.clone(), + ) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(4).unwrap(), + "Program log: Solana validator debt write off is not enabled yet" + ); + + test_setup + .finalize_distribution_debt(dz_epoch, &debt_accountant_signer) + .await + .unwrap() + .enable_solana_validator_debt_write_off(dz_epoch) + .await + .unwrap(); + + // Cannot write off debt for distribution with unfinalized debt. + let (tx_err, program_logs) = simulate_write_off_revert( + &mut test_setup, + &debt_accountant_signer, + dz_epoch, + &arbitrary_bad_debt, + next_dz_epoch, + proof.clone(), + ) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(5).unwrap(), + "Program log: Distribution debt calculation is not finalized yet" + ); + assert_eq!( + program_logs.get(6).unwrap(), + &format!("Program log: Write-off epoch {next_dz_epoch} has unfinalized debt") + ); + + test_setup + .finalize_distribution_debt(next_dz_epoch, &debt_accountant_signer) + .await + .unwrap(); + + // Cannot write off debt using an epoch that is below the current epoch. + let (tx_err, program_logs) = simulate_write_off_revert( + &mut test_setup, + &debt_accountant_signer, + dz_epoch, + &arbitrary_bad_debt, + DoubleZeroEpoch::new(0), + proof.clone(), + ) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(5).unwrap(), + "Program log: Write-off distribution's epoch must be at least the epoch of the current distribution" + ); + + // Pay debt for one upstanding citizen. + let upstanding_citizen_index = 3; + let paid_debt = debt_data[upstanding_citizen_index]; + let paid_proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + upstanding_citizen_index.try_into().unwrap(), + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + test_setup + .transfer_lamports( + &SolanaValidatorDeposit::find_address(&paid_debt.node_id).0, + paid_debt.amount, + ) + .await + .unwrap(); + + // Cannot write off debt for a deposit that has enough lamports. + let (tx_err, program_logs) = simulate_write_off_revert( + &mut test_setup, + &debt_accountant_signer, + dz_epoch, + &paid_debt, + dz_epoch, + paid_proof.clone(), + ) + .await + .unwrap(); + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(4).unwrap(), + "Program log: Lamports balance in deposit account is enough to cover debt amount" + ); + + test_setup + .pay_solana_validator_debt(dz_epoch, &paid_debt, paid_proof) + .await + .unwrap(); + + // Write off some debt at epoch 1 (validators 8..16). + for (i, debt) in debt_data.iter().enumerate().skip(split_write_off_index) { + assert_ne!(i, arbitrary_bad_debt_index); + assert_ne!(i, upstanding_citizen_index); + + let proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + i.try_into().unwrap(), + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + test_setup + .write_off_solana_validator_debt( + dz_epoch, + dz_epoch, + &debt_accountant_signer, + debt, + proof, + ) + .await + .unwrap(); + } + + // Write off remaining debt at epoch 2 (validators 0..8 except paid). + for (i, debt) in debt_data.iter().enumerate().take(split_write_off_index) { + if i == upstanding_citizen_index { + continue; + } + + let proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + i.try_into().unwrap(), + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + test_setup + .write_off_solana_validator_debt( + dz_epoch, + next_dz_epoch, + &debt_accountant_signer, + debt, + proof, + ) + .await + .unwrap(); + } + + // Verify dz_epoch distribution state. + let (distribution_key, distribution, remaining_distribution_data, _, _) = + test_setup.fetch_distribution(dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.set_is_solana_validator_debt_write_off_enabled(true); + expected_distribution.bump_seed = Distribution::find_address(dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.solana_validator_payments_count = 1; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.uncollectible_sol_debt = debt_write_off_first; + expected_distribution.collected_solana_validator_payments = paid_debt.amount; + expected_distribution.processed_solana_validator_debt_end_index = total_solana_validators / 8; + expected_distribution.processed_solana_validator_debt_write_off_start_index = + total_solana_validators / 8; + expected_distribution.processed_solana_validator_debt_write_off_end_index = + 2 * (total_solana_validators / 8); + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = test_setup + .get_clock() + .await + .unix_timestamp + .saturating_sub(60) as u32; + expected_distribution.solana_validator_write_off_count = total_solana_validators - 1; + assert_eq!(distribution, expected_distribution); + + // First two bytes reflect debt tracking. + let processed_bitmap = + &remaining_distribution_data[distribution.processed_solana_validator_debt_bitmap_range()]; + assert_eq!(processed_bitmap, [0b11111111, 0b11111111]); + + // Third and fourth bytes reflect write off tracking. + let write_off_bitmap = &remaining_distribution_data + [distribution.processed_solana_validator_debt_write_off_bitmap_range()]; + assert_eq!(write_off_bitmap, [0b11110111, 0b11111111]); + + // Verify next_dz_epoch distribution state. + let (distribution_key, distribution, remaining_distribution_data, _, _) = + test_setup.fetch_distribution(next_dz_epoch).await; + + let mut expected_distribution = Distribution::default(); + expected_distribution.set_is_debt_calculation_finalized(true); + expected_distribution.bump_seed = Distribution::find_address(next_dz_epoch).1; + expected_distribution.token_2z_pda_bump_seed = + state::find_2z_token_pda_address(&distribution_key).1; + expected_distribution.dz_epoch = next_dz_epoch; + expected_distribution.community_burn_rate = BurnRate::new(initial_cbr).unwrap(); + expected_distribution + .solana_validator_fee_parameters + .base_block_rewards_pct = + ValidatorFee::new(solana_validator_base_block_rewards_pct_fee).unwrap(); + expected_distribution.total_solana_validators = total_solana_validators; + expected_distribution.total_solana_validator_debt = total_solana_validator_debt; + expected_distribution.solana_validator_debt_merkle_root = solana_validator_debt_merkle_root; + expected_distribution.uncollectible_sol_debt = debt_write_off_remaining - paid_debt.amount; + expected_distribution.processed_solana_validator_debt_end_index = total_solana_validators / 8; + expected_distribution.distribute_rewards_relay_lamports = distribute_rewards_relay_lamports; + expected_distribution.calculation_allowed_timestamp = + test_setup.get_clock().await.unix_timestamp as u32; + assert_eq!(distribution, expected_distribution); + + // First two bytes reflect debt tracking. + let processed_bitmap = + &remaining_distribution_data[distribution.processed_solana_validator_debt_bitmap_range()]; + assert_eq!(processed_bitmap, [0; 2]); + + let write_off_bitmap = &remaining_distribution_data + [distribution.processed_solana_validator_debt_write_off_bitmap_range()]; + assert!(write_off_bitmap.is_empty()); + + let (_, journal, _) = test_setup.fetch_journal().await; + assert_eq!(journal.total_sol_balance, paid_debt.amount); + + // Verify deposit accounts have written off debt updated. + for (i, debt) in debt_data.iter().enumerate() { + let (_, solana_validator_deposit) = test_setup + .fetch_solana_validator_deposit(&debt.node_id) + .await; + + if i == upstanding_citizen_index { + assert_eq!(solana_validator_deposit.written_off_sol_debt, 0); + } else { + assert_eq!(solana_validator_deposit.written_off_sol_debt, debt.amount); + } + } + + // Cannot write off debt again for any validator (including the paid one). + for (i, debt) in debt_data.iter().enumerate() { + let leaf_index = u32::try_from(i).unwrap(); + + let proof = MerkleProof::from_indexed_pod_leaves( + &debt_data, + leaf_index, + Some(SolanaValidatorDebt::LEAF_PREFIX), + ) + .unwrap(); + + let (tx_err, program_logs) = simulate_write_off_revert( + &mut test_setup, + &debt_accountant_signer, + dz_epoch, + debt, + next_dz_epoch, + proof, + ) + .await + .unwrap(); + + assert_eq!( + tx_err, + TransactionError::InstructionError(0, InstructionError::InvalidAccountData) + ); + assert_eq!( + program_logs.get(4).unwrap(), + &format!("Program log: Merkle leaf index {leaf_index} has already been processed") + ); + if i == upstanding_citizen_index { + assert_eq!( + program_logs.get(5).unwrap(), + &format!( + "Program log: Solana validator debt already processed for epoch {dz_epoch}" + ) + ) + } else { + assert_eq!( + program_logs.get(5).unwrap(), + &format!( + "Program log: Solana validator debt already written off for epoch {dz_epoch}" + ) + ) + } + } +} + +// +// Helpers. +// + +async fn simulate_write_off_revert( + test_setup: &mut common::ProgramTestWithOwner, + debt_accountant_signer: &Keypair, + dz_epoch: DoubleZeroEpoch, + debt: &SolanaValidatorDebt, + write_off_dz_epoch: DoubleZeroEpoch, + proof: MerkleProof, +) -> Result<(TransactionError, Vec), BanksClientError> { + let write_off_ix = try_build_instruction( + &ID, + WriteOffSolanaValidatorDebtAccounts::new( + &debt_accountant_signer.pubkey(), + dz_epoch, + &debt.node_id, + write_off_dz_epoch, + ), + &RevenueDistributionInstructionData::WriteOffSolanaValidatorDebt { + amount: debt.amount, + proof, + }, + ) + .unwrap(); + + test_setup + .unwrap_simulation_error(&[write_off_ix], &[debt_accountant_signer]) + .await +} diff --git a/solana/programs/sha256sums_development.txt b/solana/programs/sha256sums_development.txt new file mode 100644 index 0000000000..445a301b50 --- /dev/null +++ b/solana/programs/sha256sums_development.txt @@ -0,0 +1,2 @@ +ebfa651fc897ab8b5f9d4aa135fdd9e88db94dea08803e233ddb367e9314307c artifacts-development/doublezero_passport.so +ec0407be6c5fa00ced5963d7d03a7a8e0f4e75fed6330261b318997112e8cb8c artifacts-development/doublezero_revenue_distribution.so diff --git a/solana/programs/sha256sums_mainnet_beta.txt b/solana/programs/sha256sums_mainnet_beta.txt new file mode 100644 index 0000000000..1ba1dd93ef --- /dev/null +++ b/solana/programs/sha256sums_mainnet_beta.txt @@ -0,0 +1,2 @@ +d7c9e08b0c50970a9ffdaca384969758ec974a4768c98208f83c0f32de3dd016 artifacts-mainnet-beta/doublezero_passport.so +99d4b7fd904adcd0ef028cbdc99f6b1e693d8f8f4121b4d75fe101a6fbde5c1a artifacts-mainnet-beta/doublezero_revenue_distribution.so diff --git a/solana/rust-toolchain.toml b/solana/rust-toolchain.toml new file mode 100644 index 0000000000..e9b2a9a9ba --- /dev/null +++ b/solana/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "1.91" +components = ["rustfmt", "clippy"] +profile = "minimal" diff --git a/solana/rustfmt.toml b/solana/rustfmt.toml new file mode 100644 index 0000000000..3a26366d4d --- /dev/null +++ b/solana/rustfmt.toml @@ -0,0 +1 @@ +edition = "2021"